[alsa-devel] [PATCH] ASoC: Intel: use 19.2 MCLK instead of the bit clock for bytcr_rt5651.c machine driver
Pierre-Louis Bossart
pierre-louis.bossart at linux.intel.com
Fri Jun 3 18:15:00 CEST 2016
On 6/3/16 10:33 AM, Pietro Di Costanzo wrote:
> Use the MCLK to solve audio quality issues found on some Cherryview-based platforms
>
> Signed-off-by: Pietro Di Costanzo <pxpert at gmail.com>
Thanks Pietro.
this can't be merged as is as it wouldn't work on Baytrail platforms. I
will merge it with the clock driver we are working to have a single
driver that works for both cases.
> ---
> sound/soc/intel/boards/bytcr_rt5651.c | 84 +++++++++++++++++++++++++++++++----
> 1 file changed, 75 insertions(+), 9 deletions(-)
>
> diff --git a/sound/soc/intel/boards/bytcr_rt5651.c b/sound/soc/intel/boards/bytcr_rt5651.c
> index 35f591e..e51ea5b 100644
> --- a/sound/soc/intel/boards/bytcr_rt5651.c
> +++ b/sound/soc/intel/boards/bytcr_rt5651.c
> @@ -31,11 +31,76 @@
> #include "../../codecs/rt5651.h"
> #include "../atom/sst-atom-controls.h"
>
> +#define CHT_PLAT_CLK_3_HZ 19200000
> +#define CHT_CODEC_DAI_5651 "rt5651-aif1"
> +
> +struct cht_acpi_card {
> + char *codec_id;
> + int codec_type;
> + struct snd_soc_card *soc_card;
> +};
> +
> +struct cht_mc_private {
> + struct snd_soc_jack jack;
> + struct cht_acpi_card *acpi_card;
> +};
> +
> +
> +static inline struct snd_soc_dai *cht_get_codec_dai(struct snd_soc_card *card)
> +{
> + struct snd_soc_pcm_runtime *rtd;
> +
> + list_for_each_entry(rtd, &card->rtd_list, list) {
> + if (!strncmp(rtd->codec_dai->name, CHT_CODEC_DAI_5651,
> + strlen(CHT_CODEC_DAI_5651)))
> + return rtd->codec_dai;
> + }
> + return NULL;
> +}
> +
> +static int platform_clock_control(struct snd_soc_dapm_widget *w,
> + struct snd_kcontrol *k, int event)
> +{
> + struct snd_soc_dapm_context *dapm = w->dapm;
> + struct snd_soc_card *card = dapm->card;
> + struct snd_soc_dai *codec_dai;
> + int ret;
> +
> + codec_dai = cht_get_codec_dai(card);
> + if (!codec_dai) {
> + dev_err(card->dev, "Codec dai not found; Unable to set platform clock\n");
> + return -EIO;
> + }
> +
> + if (!SND_SOC_DAPM_EVENT_OFF(event))
> + return 0;
> +
> + /* Set codec sysclk source to its internal clock because codec PLL will
> + * be off when idle and MCLK will also be off by ACPI when codec is
> + * runtime suspended. Codec needs clock for jack detection and button
> + * press.
> + */
> + ret = snd_soc_dai_set_sysclk(codec_dai, RT5651_SCLK_S_RCCLK,
> + 0, SND_SOC_CLOCK_IN);
> + if (ret < 0) {
> + dev_err(card->dev, "can't set codec sysclk: %d\n", ret);
> + return ret;
> + }
> +
> + return 0;
> +}
> +
> +
> +
> +
> static const struct snd_soc_dapm_widget byt_rt5651_widgets[] = {
> SND_SOC_DAPM_HP("Headphone", NULL),
> SND_SOC_DAPM_MIC("Headset Mic", NULL),
> SND_SOC_DAPM_MIC("Internal Mic", NULL),
> SND_SOC_DAPM_SPK("Speaker", NULL),
> + SND_SOC_DAPM_SUPPLY("Platform Clock", SND_SOC_NOPM, 0, 0,
> + platform_clock_control, SND_SOC_DAPM_POST_PMD),
> +
> };
>
> static const struct snd_soc_dapm_route byt_rt5651_audio_map[] = {
> @@ -52,6 +117,9 @@ static const struct snd_soc_dapm_route byt_rt5651_audio_map[] = {
> {"Headphone", NULL, "HPOR"},
> {"Speaker", NULL, "LOUTL"},
> {"Speaker", NULL, "LOUTR"},
> + {"Headphone", NULL, "Platform Clock"},
> + {"Speaker", NULL, "Platform Clock"},
> +
> };
>
> static const struct snd_soc_dapm_route byt_rt5651_intmic_dmic1_map[] = {
> @@ -93,7 +161,13 @@ static int byt_rt5651_aif1_hw_params(struct snd_pcm_substream *substream,
> struct snd_soc_dai *codec_dai = rtd->codec_dai;
> int ret;
>
> - snd_soc_dai_set_bclk_ratio(codec_dai, 50);
> + /* set codec PLL source to the 19.2MHz platform clock (MCLK) */
> + ret = snd_soc_dai_set_pll(codec_dai, 0, RT5651_PLL1_S_MCLK,
> + CHT_PLAT_CLK_3_HZ, params_rate(params) * 512);
> + if (ret < 0) {
> + dev_err(rtd->dev, "can't set codec pll: %d\n", ret);
> + return ret;
> + }
>
> ret = snd_soc_dai_set_sysclk(codec_dai, RT5651_SCLK_S_PLL1,
> params_rate(params) * 512,
> @@ -103,14 +177,6 @@ static int byt_rt5651_aif1_hw_params(struct snd_pcm_substream *substream,
> return ret;
> }
>
> - ret = snd_soc_dai_set_pll(codec_dai, 0, RT5651_PLL1_S_BCLK1,
> - params_rate(params) * 50,
> - params_rate(params) * 512);
> - if (ret < 0) {
> - dev_err(rtd->dev, "can't set codec pll: %d\n", ret);
> - return ret;
> - }
> -
> return 0;
> }
>
>
More information about the Alsa-devel
mailing list