ASoC: ak4458: fix various issues
authorViorel Suman <viorel.suman@nxp.com>
Thu, 4 Apr 2019 11:51:25 +0000 (14:51 +0300)
committerLeonard Crestez <leonard.crestez@nxp.com>
Wed, 17 Apr 2019 23:51:34 +0000 (02:51 +0300)
Fix various issues keeping the code as close
as possible to upstream version.

Signed-off-by: Viorel Suman <viorel.suman@nxp.com>
sound/soc/codecs/ak4458.c
sound/soc/fsl/Kconfig
sound/soc/fsl/imx-ak4458.c

index 9145f41..a8ad8ec 100644 (file)
@@ -284,19 +284,13 @@ static int ak4458_get_tdm_mode(struct ak4458_priv *ak4458)
 
 static int ak4458_rstn_control(struct snd_soc_component *component, int bit)
 {
-       int ret;
+       int ret, val;
 
-       if (bit)
-               ret = snd_soc_component_update_bits(component,
-                                         AK4458_00_CONTROL1,
-                                         AK4458_RSTN_MASK,
-                                         0x1);
-       else
-               ret = snd_soc_component_update_bits(component,
-                                         AK4458_00_CONTROL1,
-                                         AK4458_RSTN_MASK,
-                                         0x0);
-       return ret;
+       val = bit ? AK4458_RSTN_MASK : 0;
+       ret = snd_soc_component_update_bits(component, AK4458_00_CONTROL1,
+                                           AK4458_RSTN_MASK, val);
+       /* Return a negative error code only. */
+       return (ret < 0 ? ret : 0);
 }
 
 static int ak4458_hw_params(struct snd_pcm_substream *substream,
@@ -308,7 +302,7 @@ static int ak4458_hw_params(struct snd_pcm_substream *substream,
        int pcm_width = max(params_physical_width(params), ak4458->slot_width);
        int nfs1;
        u8 format, dsdsel0, dsdsel1, dchn;
-       int ret, dsd_bclk, channels, channels_max;
+       int dsd_bclk, channels, channels_max;
        bool is_dsd = false;
 
        channels = params_channels(params);
@@ -402,13 +396,8 @@ static int ak4458_hw_params(struct snd_pcm_substream *substream,
        snd_soc_component_update_bits(component, AK4458_0B_CONTROL7,
                                AK4458_DCHAIN_MASK, dchn);
 
-       ret = ak4458_rstn_control(component, 0);
-       if (ret)
-               return ret;
-
-       ret = ak4458_rstn_control(component, 1);
-       if (ret)
-               return ret;
+       ak4458_rstn_control(component, 0);
+       ak4458_rstn_control(component, 1);
 
        return 0;
 }
@@ -417,8 +406,7 @@ static int ak4458_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
 {
        struct snd_soc_component *component = dai->component;
        struct ak4458_priv *ak4458 = snd_soc_component_get_drvdata(component);
-       u8 format, dp = 0;
-       int ret;
+       u8 dp;
 
        switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
        case SND_SOC_DAIFMT_CBS_CFS: /* Slave Mode */
@@ -436,11 +424,8 @@ static int ak4458_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
        case SND_SOC_DAIFMT_LEFT_J:
        case SND_SOC_DAIFMT_RIGHT_J:
        case SND_SOC_DAIFMT_DSP_B:
-               ak4458->fmt = fmt & SND_SOC_DAIFMT_FORMAT_MASK;
-               break;
        case SND_SOC_DAIFMT_PDM:
                ak4458->fmt = fmt & SND_SOC_DAIFMT_FORMAT_MASK;
-               dp = AK4458_DP_MASK; /* DSD mode */;
                break;
        default:
                dev_err(component->dev, "Audio format 0x%02X unsupported\n",
@@ -448,6 +433,8 @@ static int ak4458_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
                return -EINVAL;
        }
 
+       /* DSD mode */
+       dp = ak4458->fmt == SND_SOC_DAIFMT_PDM ? AK4458_DP_MASK : 0;
        snd_soc_component_update_bits(component, AK4458_02_CONTROL3,
                                      AK4458_DP_MASK, dp);
 
@@ -493,15 +480,16 @@ static int ak4458_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
 {
        struct snd_soc_component *component = dai->component;
        struct ak4458_priv *ak4458 = snd_soc_component_get_drvdata(component);
-       int reg;
+       int mode;
 
        ak4458->slots = slots;
        ak4458->slot_width = slot_width;
 
-       reg = snd_soc_read(codec, AK4458_0A_CONTROL6);
-       reg &= ~(0x3 << 6);
-       reg |= ak4458_get_tdm_mode(ak4458) << 6;
-       snd_soc_write(codec, AK4458_0A_CONTROL6, reg);
+       mode = ak4458_get_tdm_mode(ak4458) << AK4458_MODE_SHIFT;
+
+       snd_soc_component_update_bits(component, AK4458_0A_CONTROL6,
+                           AK4458_MODE_MASK,
+                           mode);
 
        return 0;
 }
@@ -538,7 +526,7 @@ static int ak4458_startup(struct snd_pcm_substream *substream,
        return ret;
 }
 
-static struct snd_soc_dai_ops ak4458_dai_ops = {
+static const struct snd_soc_dai_ops ak4458_dai_ops = {
        .startup        = ak4458_startup,
        .hw_params      = ak4458_hw_params,
        .set_fmt        = ak4458_set_dai_fmt,
@@ -701,17 +689,17 @@ static int ak4458_i2c_probe(struct i2c_client *i2c)
        for (i = 0; i < ARRAY_SIZE(ak4458->supplies); i++)
                ak4458->supplies[i].supply = ak4458_supply_names[i];
 
-       ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(ak4458->supplies),
+       ret = devm_regulator_bulk_get(ak4458->dev, ARRAY_SIZE(ak4458->supplies),
                                 ak4458->supplies);
        if (ret != 0) {
-               dev_err(dev, "Failed to request supplies: %d\n", ret);
+               dev_err(ak4458->dev, "Failed to request supplies: %d\n", ret);
                return ret;
        }
 
        ret = regulator_bulk_enable(ARRAY_SIZE(ak4458->supplies),
                                    ak4458->supplies);
        if (ret != 0) {
-               dev_err(dev, "Failed to enable supplies: %d\n", ret);
+               dev_err(ak4458->dev, "Failed to enable supplies: %d\n", ret);
                return ret;
        }
 
index 4a96c4f..c78c4be 100644 (file)
@@ -291,7 +291,7 @@ config SND_SOC_EUKREA_TLV320
 config SND_SOC_IMX_AK4458
        tristate "SoC Audio support for i.MX boards with AK4458"
        depends on OF && I2C
-       select SND_SOC_AK4458_I2C
+       select SND_SOC_AK4458
        select SND_SOC_IMX_PCM_DMA
        select SND_SOC_FSL_SAI
        select SND_SOC_FSL_UTILS
index 6f5fd19..bbc0d19 100644 (file)
@@ -31,7 +31,7 @@ struct imx_ak4458_data {
        int num_codec_conf;
        struct snd_soc_codec_conf *codec_conf;
        bool tdm_mode;
-       int pdn_gpio;
+       struct gpio_desc *reset_gpiod;
        unsigned int slots;
        unsigned int slot_width;
        bool one2one_ratio;
@@ -345,19 +345,15 @@ static int imx_ak4458_probe(struct platform_device *pdev)
        priv->one2one_ratio = !of_device_is_compatible(pdev->dev.of_node,
                                        "fsl,imx-audio-ak4458-mq");
 
-       priv->pdn_gpio = of_get_named_gpio(pdev->dev.of_node,
-                       "ak4458,pdn-gpio", 0);
-       if (gpio_is_valid(priv->pdn_gpio)) {
-               ret = devm_gpio_request_one(&pdev->dev, priv->pdn_gpio,
-                               GPIOF_OUT_INIT_LOW, "ak4458,pdn");
-               if (ret) {
-                       dev_err(&pdev->dev, "unable to get pdn gpio\n");
-                       goto fail;
-               }
+       priv->reset_gpiod = devm_gpiod_get_optional(&pdev->dev, "ak4458,pdn",
+                                                   GPIOD_OUT_LOW);
+       if (IS_ERR(priv->reset_gpiod))
+               return PTR_ERR(priv->reset_gpiod);
 
-               gpio_set_value_cansleep(priv->pdn_gpio, 0);
+       if (priv->reset_gpiod) {
+               gpiod_set_value_cansleep(priv->reset_gpiod, 0);
                usleep_range(1000, 2000);
-               gpio_set_value_cansleep(priv->pdn_gpio, 1);
+               gpiod_set_value_cansleep(priv->reset_gpiod, 1);
                usleep_range(1000, 2000);
        }