OSDN Git Service

ASoC: rt1015: Add condition to prevent SoC providing bclk in ratio of 50 times of...
authorJack Yu <jack.yu@realtek.com>
Mon, 4 May 2020 11:20:13 +0000 (19:20 +0800)
committerMark Brown <broonie@kernel.org>
Mon, 4 May 2020 15:23:24 +0000 (16:23 +0100)
Add condition to prevent SoC providing bclk in ratio of 50 times of sample rate.

Signed-off-by: Jack Yu <jack.yu@realtek.com>
Link: https://lore.kernel.org/r/20200504112013.2499-1-jack.yu@realtek.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/rt1015.c
sound/soc/codecs/rt1015.h

index bb310bc..5eb07a4 100644 (file)
@@ -780,6 +780,14 @@ static int rt1015_set_component_pll(struct snd_soc_component *component,
                freq_out == rt1015->pll_out)
                return 0;
 
+       if (source == RT1015_PLL_S_BCLK) {
+               if (rt1015->bclk_ratio == 0) {
+                       dev_err(component->dev,
+                               "Can not support bclk ratio as 0.\n");
+                       return -EINVAL;
+               }
+       }
+
        switch (source) {
        case RT1015_PLL_S_MCLK:
                snd_soc_component_update_bits(component, RT1015_CLK2,
@@ -819,12 +827,30 @@ static int rt1015_set_component_pll(struct snd_soc_component *component,
        return 0;
 }
 
+static int rt1015_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio)
+{
+       struct snd_soc_component *component = dai->component;
+       struct rt1015_priv *rt1015 = snd_soc_component_get_drvdata(component);
+
+       dev_dbg(component->dev, "%s ratio=%d\n", __func__, ratio);
+
+       rt1015->bclk_ratio = ratio;
+
+       if (ratio == 50) {
+               dev_dbg(component->dev, "Unsupport bclk ratio\n");
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
 static int rt1015_probe(struct snd_soc_component *component)
 {
        struct rt1015_priv *rt1015 =
                snd_soc_component_get_drvdata(component);
 
        rt1015->component = component;
+       rt1015->bclk_ratio = 0;
        snd_soc_component_write(component, RT1015_BAT_RPO_STEP1, 0x061c);
 
        return 0;
@@ -844,6 +870,7 @@ static void rt1015_remove(struct snd_soc_component *component)
 static struct snd_soc_dai_ops rt1015_aif_dai_ops = {
        .hw_params = rt1015_hw_params,
        .set_fmt = rt1015_set_dai_fmt,
+       .set_bclk_ratio = rt1015_set_bclk_ratio,
 };
 
 static struct snd_soc_dai_driver rt1015_dai[] = {
index ef3745a..6fbe802 100644 (file)
@@ -362,6 +362,7 @@ struct rt1015_priv {
        int sysclk_src;
        int lrck;
        int bclk;
+       int bclk_ratio;
        int id;
        int pll_src;
        int pll_in;