Merge tag 'asoc-v4.9' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound...
[cascardo/linux.git] / sound / soc / codecs / da7218.c
index 99ce23e..c69e976 100644 (file)
@@ -1819,7 +1819,7 @@ static int da7218_set_dai_sysclk(struct snd_soc_dai *codec_dai,
        if (da7218->mclk_rate == freq)
                return 0;
 
-       if (((freq < 2000000) && (freq != 32768)) || (freq > 54000000)) {
+       if ((freq < 2000000) || (freq > 54000000)) {
                dev_err(codec_dai->dev, "Unsupported MCLK value %d\n",
                        freq);
                return -EINVAL;
@@ -1866,11 +1866,8 @@ static int da7218_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id,
        u32 freq_ref;
        u64 frac_div;
 
-       /* Verify 32KHz, 2MHz - 54MHz MCLK provided, and set input divider */
-       if (da7218->mclk_rate == 32768) {
-               indiv_bits = DA7218_PLL_INDIV_9_TO_18_MHZ;
-               indiv = DA7218_PLL_INDIV_9_TO_18_MHZ_VAL;
-       } else if (da7218->mclk_rate < 2000000) {
+       /* Verify 2MHz - 54MHz MCLK provided, and set input divider */
+       if (da7218->mclk_rate < 2000000) {
                dev_err(codec->dev, "PLL input clock %d below valid range\n",
                        da7218->mclk_rate);
                return -EINVAL;
@@ -1911,9 +1908,6 @@ static int da7218_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id,
        case DA7218_SYSCLK_PLL_SRM:
                pll_ctrl |= DA7218_PLL_MODE_SRM;
                break;
-       case DA7218_SYSCLK_PLL_32KHZ:
-               pll_ctrl |= DA7218_PLL_MODE_32KHZ;
-               break;
        default:
                dev_err(codec->dev, "Invalid PLL config\n");
                return -EINVAL;
@@ -2589,20 +2583,22 @@ static int da7218_set_bias_level(struct snd_soc_codec *codec,
 
        switch (level) {
        case SND_SOC_BIAS_ON:
-       case SND_SOC_BIAS_PREPARE:
                break;
-       case SND_SOC_BIAS_STANDBY:
-               if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) {
-                       /* MCLK */
+       case SND_SOC_BIAS_PREPARE:
+               /* Enable MCLK for transition to ON state */
+               if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_STANDBY) {
                        if (da7218->mclk) {
                                ret = clk_prepare_enable(da7218->mclk);
                                if (ret) {
-                                       dev_err(codec->dev,
-                                               "Failed to enable mclk\n");
+                                       dev_err(codec->dev, "Failed to enable mclk\n");
                                        return ret;
                                }
                        }
+               }
 
+               break;
+       case SND_SOC_BIAS_STANDBY:
+               if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) {
                        /* Master bias */
                        snd_soc_update_bits(codec, DA7218_REFERENCES,
                                            DA7218_BIAS_EN_MASK,
@@ -2612,6 +2608,10 @@ static int da7218_set_bias_level(struct snd_soc_codec *codec,
                        snd_soc_update_bits(codec, DA7218_LDO_CTRL,
                                            DA7218_LDO_EN_MASK,
                                            DA7218_LDO_EN_MASK);
+               } else {
+                       /* Remove MCLK */
+                       if (da7218->mclk)
+                               clk_disable_unprepare(da7218->mclk);
                }
                break;
        case SND_SOC_BIAS_OFF:
@@ -2625,10 +2625,6 @@ static int da7218_set_bias_level(struct snd_soc_codec *codec,
                        snd_soc_update_bits(codec, DA7218_REFERENCES,
                                            DA7218_BIAS_EN_MASK, 0);
                }
-
-               /* MCLK */
-               if (da7218->mclk)
-                       clk_disable_unprepare(da7218->mclk);
                break;
        }
 
@@ -3045,13 +3041,14 @@ static struct snd_soc_codec_driver soc_codec_dev_da7218 = {
        .resume                 = da7218_resume,
        .set_bias_level         = da7218_set_bias_level,
 
-       .controls               = da7218_snd_controls,
-       .num_controls           = ARRAY_SIZE(da7218_snd_controls),
-
-       .dapm_widgets           = da7218_dapm_widgets,
-       .num_dapm_widgets       = ARRAY_SIZE(da7218_dapm_widgets),
-       .dapm_routes            = da7218_audio_map,
-       .num_dapm_routes        = ARRAY_SIZE(da7218_audio_map),
+       .component_driver = {
+               .controls               = da7218_snd_controls,
+               .num_controls           = ARRAY_SIZE(da7218_snd_controls),
+               .dapm_widgets           = da7218_dapm_widgets,
+               .num_dapm_widgets       = ARRAY_SIZE(da7218_dapm_widgets),
+               .dapm_routes            = da7218_audio_map,
+               .num_dapm_routes        = ARRAY_SIZE(da7218_audio_map),
+       },
 };