+static int max98520_dai_tdm_slot(struct snd_soc_dai *dai,
unsigned int tx_mask, unsigned int rx_mask,
int slots, int slot_width) {
struct snd_soc_component *component = dai->component;
struct max98520_priv *max98520 =
snd_soc_component_get_drvdata(component);
int bsel = 0;
nit-pick: useless initialization....
It will be removed useless initialization for bsel.
unsigned int chan_sz = 0;
if (!tx_mask && !rx_mask && !slots && !slot_width)
max98520->tdm_mode = false;
else
max98520->tdm_mode = true;
/* BCLK configuration */
bsel = max98520_get_bclk_sel(slots * slot_width);
... it's overridden here.
OK.
if (bsel == 0) {
dev_err(component->dev, "BCLK %d not supported\n",
slots * slot_width);
return -EINVAL;
}
regmap_update_bits(max98520->regmap,
MAX98520_R2041_PCM_CLK_SETUP,
MAX98520_PCM_CLK_SETUP_BSEL_MASK,
bsel);
/* Channel size configuration */
switch (slot_width) {
case 16:
chan_sz = MAX98520_PCM_MODE_CFG_CHANSZ_16;
break;
case 24:
chan_sz = MAX98520_PCM_MODE_CFG_CHANSZ_24;
break;
case 32:
chan_sz = MAX98520_PCM_MODE_CFG_CHANSZ_32;
break;
default:
dev_err(component->dev, "format unsupported %d\n",
slot_width);
return -EINVAL;
}
regmap_update_bits(max98520->regmap,
MAX98520_R2040_PCM_MODE_CFG,
MAX98520_PCM_MODE_CFG_CHANSZ_MASK, chan_sz);
/* Rx slot configuration */
regmap_update_bits(max98520->regmap,
MAX98520_R2044_PCM_RX_SRC2,
MAX98520_PCM_DMIX_CH0_SRC_MASK,
rx_mask);
regmap_update_bits(max98520->regmap,
MAX98520_R2044_PCM_RX_SRC2,
MAX98520_PCM_DMIX_CH1_SRC_MASK,
rx_mask << MAX98520_PCM_DMIX_CH1_SHIFT);
return 0;
+}
+#define MAX98520_RATES SNDRV_PCM_RATE_8000_192000
+#define MAX98520_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
+static const struct snd_soc_dai_ops max98520_dai_ops = {
.set_fmt = max98520_dai_set_fmt,
.hw_params = max98520_dai_hw_params,
.set_tdm_slot = max98520_dai_tdm_slot, };
+static int max98520_dac_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event)
+{
struct snd_soc_component *component =
snd_soc_dapm_to_component(w->dapm);
struct max98520_priv *max98520 =
snd_soc_component_get_drvdata(component);
switch (event) {
case SND_SOC_DAPM_POST_PMU:
is it intentional that you use POST_PMU here? for symmetry with POST_PMD below, should this be PRE_PMU?
I`ve checked with modified PRE_PMU, but it`s no sound on my test environment. It`s worked with POST_PMU for AMP on.
dev_dbg(component->dev, " AMP ON\n");
regmap_write(max98520->regmap, MAX98520_R209F_AMP_EN,
1);
regmap_write(max98520->regmap, MAX98520_R210F_GLOBAL_EN,
1);
usleep_range(30000, 31000);
break;
case SND_SOC_DAPM_POST_PMD:
dev_dbg(component->dev, " AMP OFF\n");
regmap_write(max98520->regmap, MAX98520_R210F_GLOBAL_EN,
0);
regmap_write(max98520->regmap, MAX98520_R209F_AMP_EN,
0);
usleep_range(30000, 31000);
break;
default:
return 0;
}
return 0;
+}
+static void max98520_reset(struct max98520_priv *max98520, struct +device *dev) {
int ret, reg, count;
/* Software Reset */
ret = regmap_write(max98520->regmap, MAX98520_R2000_SW_RESET,
1);
if (ret)
dev_err(dev, "Reset command failed. (ret:%d)\n", ret);
return; ?
Trying to verify if the reset worked is the reset command failed seems unnecessary?
This function will be removed and added just regmap_write for SW_RESET register in proper places.
count = 0;
while (count < 3) {
usleep_range(10000, 11000);
/* Software Reset Verification */
ret = regmap_read(max98520->regmap,
MAX98520_R21FF_REVISION_ID, ®);
if (!ret)
return;
count++;
}
dev_err(dev, "Reset failed. (ret:%d)\n", ret); }
+#ifdef CONFIG_PM_SLEEP
the recommendation is to remove these ifdefs and use __maybe_unused for pm functions.
It will be added __maybe_unused on them.
+static int max98520_suspend(struct device *dev) {
struct max98520_priv *max98520 = dev_get_drvdata(dev);
regcache_cache_only(max98520->regmap, true);
regcache_mark_dirty(max98520->regmap);
return 0;
+}
+static int max98520_resume(struct device *dev) {
struct max98520_priv *max98520 = dev_get_drvdata(dev);
regcache_cache_only(max98520->regmap, false);
max98520_reset(max98520, dev);
regcache_sync(max98520->regmap);
return 0;
+} +#endif
+static const struct dev_pm_ops max98520_pm = {
SET_SYSTEM_SLEEP_PM_OPS(max98520_suspend, max98520_resume) };
+static const struct snd_soc_component_driver
soc_codec_dev_max98520 = {
.probe = max98520_probe,
.controls = max98520_snd_controls,
.num_controls = ARRAY_SIZE(max98520_snd_controls),
.dapm_widgets = max98520_dapm_widgets,
.num_dapm_widgets = ARRAY_SIZE(max98520_dapm_widgets),
.dapm_routes = max98520_audio_map,
.num_dapm_routes = ARRAY_SIZE(max98520_audio_map),
.idle_bias_on = 1,
.use_pmdown_time = 1,
.endianness = 1,
.non_legacy_dai_naming = 1,
+};
+static const struct regmap_config max98520_regmap = {
.reg_bits = 16,
.val_bits = 8,
.max_register = MAX98520_R21FF_REVISION_ID,
.reg_defaults = max98520_reg,
.num_reg_defaults = ARRAY_SIZE(max98520_reg),
.readable_reg = max98520_readable_register,
.volatile_reg = max98520_volatile_reg,
.cache_type = REGCACHE_RBTREE,
+};
+static void max98520_power_on(struct max98520_priv *max98520,
bool
+poweron) {
if (max98520->reset_gpio)
gpiod_set_value_cansleep(max98520->reset_gpio,
+!poweron); }
+static int max98520_i2c_probe(struct i2c_client *i2c, const
struct
+i2c_device_id *id) {
int ret = 0;
useless init
It will be removed useless initialization for bret.
int reg = 0;
struct max98520_priv *max98520 = NULL;
useless init
It will be removed useless initialization for max98520.
struct i2c_adapter *adapter = to_i2c_adapter(i2c->dev.parent);
ret = i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE |
I2C_FUNC_SMBUS_BYTE_DATA);
if (!ret) {
dev_err(&i2c->dev, "I2C check functionality failed\n");
return -ENXIO;
}
max98520 = devm_kzalloc(&i2c->dev, sizeof(*max98520),
- GFP_KERNEL);
if (!max98520) {
ret = -ENOMEM;
return ret;
return -ENOMEM;
It will be modified return -ENOMEM; instead of ret = -ENOMEM;
}
i2c_set_clientdata(i2c, max98520);
/* regmap initialization */
max98520->regmap =
devm_regmap_init_i2c(i2c, &max98520_regmap);
one line?
It will be modified by one line for it.
if (IS_ERR(max98520->regmap)) {
ret = PTR_ERR(max98520->regmap);
dev_err(&i2c->dev,
"Failed to allocate regmap: %d\n", ret);
one line?
It will be modified by one line for it.
return ret;
}
/* Power on device */
max98520->reset_gpio = devm_gpiod_get_optional(&i2c->dev,
"reset", GPIOD_OUT_HIGH);
if (max98520->reset_gpio) {
if (IS_ERR(max98520->reset_gpio)) {
ret = PTR_ERR(max98520->reset_gpio);
dev_err(&i2c->dev, "Unable to request GPIO
pin: %d.\n", ret);
return ret;
}
max98520_power_on(max98520, 1);
}
/* Check Revision ID */
ret = regmap_read(max98520->regmap,
MAX98520_R21FF_REVISION_ID, ®);
if (ret < 0) {
dev_err(&i2c->dev,
"Failed to read: 0x%02X\n",
MAX98520_R21FF_REVISION_ID);
return ret;
}
dev_info(&i2c->dev, "MAX98520 revisionID: 0x%02X\n", reg);
/* codec registration */
ret = devm_snd_soc_register_component(&i2c->dev,
&soc_codec_dev_max98520,
max98520_dai, ARRAY_SIZE(max98520_dai));
alignment?
It will be set alignment properly.
if (ret < 0)
dev_err(&i2c->dev, "Failed to register codec: %d\n",
- ret);
return ret;
+}
+#ifdef CONFIG_ACPI +static const struct acpi_device_id max98520_acpi_match[] = {
{ "MX98520", 0 },
MX is not a valid ACPI/PNP vendor identifier but I suppose it's been used by Maxim for all products...
It will be removed them ACPI featuring code.