[alsa-devel] [PATCH 3/5] ASoC: Intel: bytcr_rt5651: add MCLK support and fix quirks
Andy Shevchenko
andriy.shevchenko at linux.intel.com
Mon Sep 18 09:10:45 CEST 2017
On Fri, 2017-09-08 at 12:43 -0500, Pierre-Louis Bossart wrote:
> Same as for other codecs, enable MCLK by default. When it is not
> present, e.g. on MinnowBoard B3 since it's not routed on the LSE
> connector, we fall back to blck-based clocking.
>
> The DMIC quirks are also fixed, there is a single DMIC input of the
> codec
> #include <linux/device.h>
> #include <linux/dmi.h>
> #include <linux/slab.h>
> +#include <asm/cpu_device_id.h>
> +#include <asm/platform_sst_audio.h>
> +#include <linux/clk.h>
Just a nit: I would rather squeeze this to somewhere above device
(alphabetical ordering)
> #include <sound/pcm.h>
> #include <sound/pcm_params.h>
> #include <sound/soc.h>
> +#define BYT_RT5651_MAP(quirk) ((quirk) & 0xff)
GENMASK(7, 0) ?
> +#define BYT_RT5651_DMIC_EN BIT(16)
> +#define BYT_RT5651_MCLK_EN BIT(17)
> +#define BYT_RT5651_MCLK_25MHZ BIT(18)
> +static void log_quirks(struct device *dev)
> +{
> + if (BYT_RT5651_MAP(byt_rt5651_quirk) == BYT_RT5651_DMIC_MAP)
> + dev_info(dev, "quirk DMIC_MAP enabled");
> + if (BYT_RT5651_MAP(byt_rt5651_quirk) == BYT_RT5651_IN1_MAP)
> + dev_info(dev, "quirk IN1_MAP enabled");
> + if (byt_rt5651_quirk & BYT_RT5651_DMIC_EN)
> + dev_info(dev, "quirk DMIC enabled");
> + if (byt_rt5651_quirk & BYT_RT5651_MCLK_EN)
> + dev_info(dev, "quirk MCLK_EN enabled");
> + if (byt_rt5651_quirk & BYT_RT5651_MCLK_25MHZ)
> + dev_info(dev, "quirk MCLK_25MHZ enabled");
> +}
> +
> +#define BYT_CODEC_DAI1 "rt5651-aif1"
> +
> +static inline struct snd_soc_dai *byt_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, BYT_CODEC_DAI1,
> + strlen(BYT_CODEC_DAI1)))
Still same comment about str_n_cmp vs. strcmp() in this case.
(strlen() also can be calculated once size_t dai1_len = strlen(...); )
> + return rtd->codec_dai;
> + }
> + return NULL;
> + if (SND_SOC_DAPM_EVENT_ON(event)) {
> + if (priv->mclk) {
Do we need this check?
I'm not sure I have read a comment why this is left as in initial
series.
> SND_SOC_CLOCK_IN);
> + if (!ret)
> + if (priv->mclk)
Ditto ?
> + clk_disable_unprepare(priv->mclk);
> + }
>
> static const struct dmi_system_id byt_rt5651_quirk_table[] = {
> + {
> + .callback = byt_rt5651_quirk_cb,
> + .matches = {
> + DMI_MATCH(DMI_SYS_VENDOR, "Circuitco"),
> + DMI_MATCH(DMI_PRODUCT_NAME, "Minnowboard Max
> B3 PLATFORM"),
> + },
> + .driver_data = (unsigned long *)(BYT_RT5651_DMIC_MAP
> |
Shouldn't be just (void *) [and maybe fit one line]?
> + BYT_RT5651_DMIC_EN),
>
> + if (priv->mclk) {
Same question as above.
> + /*
> + * The firmware might enable the clock at
> + * boot (this information may or may not
> + * be reflected in the enable clock register).
> + * To change the rate we must disable the clock
> + * first to cover these cases. Due to common
> + * clock framework restrictions that do not allow
> + * to disable a clock that has not been enabled,
> + * we need to enable the clock first.
> + */
> + ret = clk_prepare_enable(priv->mclk);
> + if (!ret)
> + clk_disable_unprepare(priv->mclk);
> +
> + if (byt_rt5651_quirk & BYT_RT5651_MCLK_25MHZ)
> + ret = clk_set_rate(priv->mclk, 25000000);
> + else
> + ret = clk_set_rate(priv->mclk, 19200000);
> +
> + if (ret)
> + dev_err(card->dev, "unable to set MCLK
> rate\n");
> + }
>
--
Andy Shevchenko <andriy.shevchenko at linux.intel.com>
Intel Finland Oy
More information about the Alsa-devel
mailing list