Merge remote-tracking branches 'asoc/topic/cs35l30', 'asoc/topic/cs42l73', 'asoc...
authorMark Brown <broonie@kernel.org>
Thu, 29 Sep 2016 19:44:16 +0000 (12:44 -0700)
committerMark Brown <broonie@kernel.org>
Thu, 29 Sep 2016 19:44:16 +0000 (12:44 -0700)
1  2  3  4  5 
sound/soc/codecs/cs42l73.c
sound/soc/codecs/cs53l30.c
sound/soc/codecs/da7213.c

@@@@@@ -794,7 -794,7 -794,7 -794,7 -794,7 +794,7 @@@@@@ struct cs42l73_mclk_div 
        u8 mmcc;
     };
     
-- --static struct cs42l73_mclk_div cs42l73_mclk_coeffs[] = {
++ ++static const struct cs42l73_mclk_div cs42l73_mclk_coeffs[] = {
        /* MCLK, Sample Rate, xMMCC[5:0] */
        {5644800, 11025, 0x30},
        {5644800, 22050, 0x20},
@@@@@@ -844,7 -844,7 -844,7 -844,7 -844,7 +844,7 @@@@@@ struct cs42l73_mclkx_div 
        u8 mclkdiv;
     };
     
-- --static struct cs42l73_mclkx_div cs42l73_mclkx_coeffs[] = {
++ ++static const struct cs42l73_mclkx_div cs42l73_mclkx_coeffs[] = {
        {5644800,  1, 0},       /* 5644800 */
        {6000000,  1, 0},       /* 6000000 */
        {6144000,  1, 0},       /* 6144000 */
@@@@@@ -1257,14 -1257,13 -1257,13 -1257,13 -1257,13 +1257,14 @@@@@@ static const struct snd_soc_codec_drive
        .set_bias_level = cs42l73_set_bias_level,
        .suspend_bias_off = true,
     
 ----   .dapm_widgets = cs42l73_dapm_widgets,
 ----   .num_dapm_widgets = ARRAY_SIZE(cs42l73_dapm_widgets),
 ----   .dapm_routes = cs42l73_audio_map,
 ----   .num_dapm_routes = ARRAY_SIZE(cs42l73_audio_map),
 ----
 ----   .controls = cs42l73_snd_controls,
 ----   .num_controls = ARRAY_SIZE(cs42l73_snd_controls),
 ++++   .component_driver = {
 ++++           .controls               = cs42l73_snd_controls,
 ++++           .num_controls           = ARRAY_SIZE(cs42l73_snd_controls),
 ++++           .dapm_widgets           = cs42l73_dapm_widgets,
 ++++           .num_dapm_widgets       = ARRAY_SIZE(cs42l73_dapm_widgets),
 ++++           .dapm_routes            = cs42l73_audio_map,
 ++++           .num_dapm_routes        = ARRAY_SIZE(cs42l73_audio_map),
 ++++   },
     };
     
     static const struct regmap_config cs42l73_regmap = {
@@@@@@ -466,7 -466,7 -466,7 -466,7 -466,7 +466,7 @@@@@@ struct cs53l30_mclk_div 
        u8 mclk_int_scale;
     };
     
-  --static struct cs53l30_mclk_div cs53l30_mclk_coeffs[] = {
+  ++static const struct cs53l30_mclk_div cs53l30_mclk_coeffs[] = {
        /* NOTE: Enable MCLK_INT_SCALE to save power. */
     
        /* MCLK, Sample Rate, asp_rate, internal_fs_ratio, mclk_int_scale */
@@@@@@ -511,7 -511,7 -511,7 -511,7 -511,7 +511,7 @@@@@@ struct cs53l30_mclkx_div 
        u8 mclkdiv;
     };
     
-  --static struct cs53l30_mclkx_div cs53l30_mclkx_coeffs[] = {
+  ++static const struct cs53l30_mclkx_div cs53l30_mclkx_coeffs[] = {
        {5644800,  1, CS53L30_MCLK_DIV_BY_1},
        {6000000,  1, CS53L30_MCLK_DIV_BY_1},
        {6144000,  1, CS53L30_MCLK_DIV_BY_1},
@@@@@@ -897,14 -897,13 -897,13 -897,13 -897,13 +897,14 @@@@@@ static struct snd_soc_codec_driver cs53
        .set_bias_level = cs53l30_set_bias_level,
        .idle_bias_off = true,
     
 ----   .dapm_widgets = cs53l30_dapm_widgets,
 ----   .num_dapm_widgets = ARRAY_SIZE(cs53l30_dapm_widgets),
 ----   .dapm_routes = cs53l30_dapm_routes,
 ----   .num_dapm_routes = ARRAY_SIZE(cs53l30_dapm_routes),
 ----
 ----   .controls = cs53l30_snd_controls,
 ----   .num_controls = ARRAY_SIZE(cs53l30_snd_controls),
 ++++   .component_driver = {
 ++++           .controls               = cs53l30_snd_controls,
 ++++           .num_controls           = ARRAY_SIZE(cs53l30_snd_controls),
 ++++           .dapm_widgets           = cs53l30_dapm_widgets,
 ++++           .num_dapm_widgets       = ARRAY_SIZE(cs53l30_dapm_widgets),
 ++++           .dapm_routes            = cs53l30_dapm_routes,
 ++++           .num_dapm_routes        = ARRAY_SIZE(cs53l30_dapm_routes),
 ++++   },
     };
     
     static struct regmap_config cs53l30_regmap = {
@@@@@@ -1000,8 -999,8 -999,8 -999,8 -999,8 +1000,8 @@@@@@ static int cs53l30_i2c_probe(struct i2c
        /* Check if MCLK provided */
        cs53l30->mclk = devm_clk_get(dev, "mclk");
        if (IS_ERR(cs53l30->mclk)) {
--- -           if (PTR_ERR(cs53l30->mclk) == -EPROBE_DEFER) {
--- -                   ret = -EPROBE_DEFER;
+++ +           if (PTR_ERR(cs53l30->mclk) != -ENOENT) {
+++ +                   ret = PTR_ERR(cs53l30->mclk);
                        goto error;
                }
                /* Otherwise mark the mclk pointer to NULL */
@@@@@@ -750,11 -750,11 -750,11 -750,11 -750,18 +750,18 @@@@@@ static int da7213_dai_event(struct snd_
                snd_soc_update_bits(codec, DA7213_PC_COUNT,
                                    DA7213_PC_FREERUN_MASK, 0);
     
----            /* Slave mode, if SRM not enabled no need for status checks */
++++            /* If SRM not enabled then nothing more to do */
                pll_ctrl = snd_soc_read(codec, DA7213_PLL_CTRL);
                if (!(pll_ctrl & DA7213_PLL_SRM_EN))
                        return 0;
     
++++            /* Assist 32KHz mode PLL lock */
++++            if (pll_ctrl & DA7213_PLL_32K_MODE) {
++++                    snd_soc_write(codec, 0xF0, 0x8B);
++++                    snd_soc_write(codec, 0xF2, 0x03);
++++                    snd_soc_write(codec, 0xF0, 0x00);
++++            }
++++ 
                /* Check SRM has locked */
                do {
                        pll_status = snd_soc_read(codec, DA7213_PLL_STATUS);
     
                return 0;
        case SND_SOC_DAPM_POST_PMD:
++++            /* Revert 32KHz PLL lock udpates if applied previously */
++++            pll_ctrl = snd_soc_read(codec, DA7213_PLL_CTRL);
++++            if (pll_ctrl & DA7213_PLL_32K_MODE) {
++++                    snd_soc_write(codec, 0xF0, 0x8B);
++++                    snd_soc_write(codec, 0xF2, 0x01);
++++                    snd_soc_write(codec, 0xF0, 0x00);
++++            }
++++ 
                /* PC free-running */
                snd_soc_update_bits(codec, DA7213_PC_COUNT,
                                    DA7213_PC_FREERUN_MASK,
@@@@@@ -1247,8 -1247,8 -1247,8 -1247,8 -1262,8 +1262,8 @@@@@@ static int da7213_set_dai_fmt(struct sn
                return -EINVAL;
        }
     
 ----   /* By default only 32 BCLK per WCLK is supported */
 ----   dai_clk_mode |= DA7213_DAI_BCLKS_PER_WCLK_32;
 ++++   /* By default only 64 BCLK per WCLK is supported */
 ++++   dai_clk_mode |= DA7213_DAI_BCLKS_PER_WCLK_64;
     
        snd_soc_write(codec, DA7213_DAI_CLK_MODE, dai_clk_mode);
        snd_soc_update_bits(codec, DA7213_DAI_CTRL, DA7213_DAI_FORMAT_MASK,
@@@@@@ -1297,10 -1297,10 -1297,10 -1297,10 -1312,13 +1312,13 @@@@@@ static int da7213_set_dai_sysclk(struc
     
        switch (clk_id) {
        case DA7213_CLKSRC_MCLK:
----            da7213->mclk_squarer_en = false;
++++            snd_soc_update_bits(codec, DA7213_PLL_CTRL,
++++                                DA7213_PLL_MCLK_SQR_EN, 0);
                break;
        case DA7213_CLKSRC_MCLK_SQR:
----            da7213->mclk_squarer_en = true;
++++            snd_soc_update_bits(codec, DA7213_PLL_CTRL,
++++                                DA7213_PLL_MCLK_SQR_EN,
++++                                DA7213_PLL_MCLK_SQR_EN);
                break;
        default:
                dev_err(codec_dai->dev, "Unknown clock source %d\n", clk_id);
        return 0;
     }
     
---- /* Supported PLL input frequencies are 5MHz - 54MHz. */
++++ /* Supported PLL input frequencies are 32KHz, 5MHz - 54MHz. */
     static int da7213_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id,
                              int source, unsigned int fref, unsigned int fout)
     {
        u32 freq_ref;
        u64 frac_div;
     
----    /* Reset PLL configuration */
----    snd_soc_write(codec, DA7213_PLL_CTRL, 0);
---- 
----    pll_ctrl = 0;
---- 
        /* Workout input divider based on MCLK rate */
        if (da7213->mclk_rate == 32768) {
++++            if (!da7213->master) {
++++                    dev_err(codec->dev,
++++                            "32KHz only valid if codec is clock master\n");
++++                    return -EINVAL;
++++            }
++++ 
                /* 32KHz PLL Mode */
                indiv_bits = DA7213_PLL_INDIV_9_TO_18_MHZ;
                indiv = DA7213_PLL_INDIV_9_TO_18_MHZ_VAL;
++++            source = DA7213_SYSCLK_PLL_32KHZ;
                freq_ref = 3750000;
----            pll_ctrl |= DA7213_PLL_32K_MODE;
++++ 
        } else {
----            /* 5 - 54MHz MCLK */
                if (da7213->mclk_rate < 5000000) {
----                    goto pll_err;
++++                    dev_err(codec->dev,
++++                            "PLL input clock %d below valid range\n",
++++                            da7213->mclk_rate);
++++                    return -EINVAL;
                } else if (da7213->mclk_rate <= 9000000) {
                        indiv_bits = DA7213_PLL_INDIV_5_TO_9_MHZ;
                        indiv = DA7213_PLL_INDIV_5_TO_9_MHZ_VAL;
                        indiv_bits = DA7213_PLL_INDIV_36_TO_54_MHZ;
                        indiv = DA7213_PLL_INDIV_36_TO_54_MHZ_VAL;
                } else {
----                    goto pll_err;
++++                    dev_err(codec->dev,
++++                            "PLL input clock %d above valid range\n",
++++                            da7213->mclk_rate);
++++                    return -EINVAL;
                }
                freq_ref = (da7213->mclk_rate / indiv);
        }
     
----    pll_ctrl |= indiv_bits;
++++    pll_ctrl = indiv_bits;
     
----    /* PLL Bypass mode */
----    if (source == DA7213_SYSCLK_MCLK) {
----            snd_soc_write(codec, DA7213_PLL_CTRL, pll_ctrl);
++++    /* Configure PLL */
++++    switch (source) {
++++    case DA7213_SYSCLK_MCLK:
++++            snd_soc_update_bits(codec, DA7213_PLL_CTRL,
++++                                DA7213_PLL_INDIV_MASK |
++++                                DA7213_PLL_MODE_MASK, pll_ctrl);
                return 0;
----    }
++++    case DA7213_SYSCLK_PLL:
++++            break;
++++    case DA7213_SYSCLK_PLL_SRM:
++++            pll_ctrl |= DA7213_PLL_SRM_EN;
++++            fout = DA7213_PLL_FREQ_OUT_94310400;
++++            break;
++++    case DA7213_SYSCLK_PLL_32KHZ:
++++            if (da7213->mclk_rate != 32768) {
++++                    dev_err(codec->dev,
++++                            "32KHz mode only valid with 32KHz MCLK\n");
++++                    return -EINVAL;
++++            }
     
----    /*
----     * If Codec is slave and SRM enabled,
----     * freq_out is (98304000 + 90316800)/2 = 94310400
----     */
----    if (!da7213->master && da7213->srm_en) {
++++            pll_ctrl |= DA7213_PLL_32K_MODE | DA7213_PLL_SRM_EN;
                fout = DA7213_PLL_FREQ_OUT_94310400;
----            pll_ctrl |= DA7213_PLL_SRM_EN;
++++            break;
++++    default:
++++            dev_err(codec->dev, "Invalid PLL config\n");
++++            return -EINVAL;
        }
     
----    /* Enable MCLK squarer if required */
----    if (da7213->mclk_squarer_en)
----            pll_ctrl |= DA7213_PLL_MCLK_SQR_EN;
---- 
        /* Calculate dividers for PLL */
        pll_integer = fout / freq_ref;
        frac_div = (u64)(fout % freq_ref) * 8192ULL;
     
        /* Enable PLL */
        pll_ctrl |= DA7213_PLL_EN;
----    snd_soc_write(codec, DA7213_PLL_CTRL, pll_ctrl);
++++    snd_soc_update_bits(codec, DA7213_PLL_CTRL,
++++                        DA7213_PLL_INDIV_MASK | DA7213_PLL_MODE_MASK,
++++                        pll_ctrl);
++++ 
++++    /* Assist 32KHz mode PLL lock */
++++    if (source == DA7213_SYSCLK_PLL_32KHZ) {
++++            snd_soc_write(codec, 0xF0, 0x8B);
++++            snd_soc_write(codec, 0xF1, 0x03);
++++            snd_soc_write(codec, 0xF1, 0x01);
++++            snd_soc_write(codec, 0xF0, 0x00);
++++    }
     
        return 0;
---- 
---- pll_err:
----    dev_err(codec_dai->dev, "Unsupported PLL input frequency %d\n",
----            da7213->mclk_rate);
----    return -EINVAL;
     }
     
     /* DAI operations */
@@@@@@ -1454,11 -1454,11 -1454,11 -1454,11 -1493,10 +1493,10 @@@@@@ static int da7213_set_bias_level(struc
     
        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 (da7213->mclk) {
                                ret = clk_prepare_enable(da7213->mclk);
                                if (ret) {
                                        return ret;
                                }
                        }
---- 
++++            }
++++            break;
++++    case SND_SOC_BIAS_STANDBY:
++++            if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) {
                        /* Enable VMID reference & master bias */
                        snd_soc_update_bits(codec, DA7213_REFERENCES,
                                            DA7213_VMID_EN | DA7213_BIAS_EN,
                                            DA7213_VMID_EN | DA7213_BIAS_EN);
++++            } else {
++++                    /* Remove MCLK */
++++                    if (da7213->mclk)
++++                            clk_disable_unprepare(da7213->mclk);
                }
                break;
        case SND_SOC_BIAS_OFF:
                /* Disable VMID reference & master bias */
                snd_soc_update_bits(codec, DA7213_REFERENCES,
                                    DA7213_VMID_EN | DA7213_BIAS_EN, 0);
---- 
----            /* MCLK */
----            if (da7213->mclk)
----                    clk_disable_unprepare(da7213->mclk);
                break;
        }
        return 0;
@@@@@@ -1605,9 -1605,9 -1605,9 -1605,9 -1646,6 +1646,6 @@@@@@ static int da7213_probe(struct snd_soc_
                            DA7213_ALC_CALIB_MODE_MAN, 0);
        da7213->alc_calib_auto = true;
     
----    /* Default to using SRM for slave mode */
----    da7213->srm_en = true;
---- 
        /* Default PC counter to free-running */
        snd_soc_update_bits(codec, DA7213_PC_COUNT, DA7213_PC_FREERUN_MASK,
                            DA7213_PC_FREERUN_MASK);
@@@@@@ -1740,14 -1740,13 -1740,13 -1740,13 -1778,13 +1778,14 @@@@@@ static struct snd_soc_codec_driver soc_
        .probe                  = da7213_probe,
        .set_bias_level         = da7213_set_bias_level,
     
 ----   .controls               = da7213_snd_controls,
 ----   .num_controls           = ARRAY_SIZE(da7213_snd_controls),
 ----
 ----   .dapm_widgets           = da7213_dapm_widgets,
 ----   .num_dapm_widgets       = ARRAY_SIZE(da7213_dapm_widgets),
 ----   .dapm_routes            = da7213_audio_map,
 ----   .num_dapm_routes        = ARRAY_SIZE(da7213_audio_map),
 ++++   .component_driver = {
 ++++           .controls               = da7213_snd_controls,
 ++++           .num_controls           = ARRAY_SIZE(da7213_snd_controls),
 ++++           .dapm_widgets           = da7213_dapm_widgets,
 ++++           .num_dapm_widgets       = ARRAY_SIZE(da7213_dapm_widgets),
 ++++           .dapm_routes            = da7213_audio_map,
 ++++           .num_dapm_routes        = ARRAY_SIZE(da7213_audio_map),
 ++++   },
     };
     
     static const struct regmap_config da7213_regmap_config = {