ASoC: Adds support for TAS575x to the pcm512x driver
[platform/kernel/linux-rpi.git] / sound / soc / codecs / pcm512x.c
index ad2866e..6fb35e6 100644 (file)
@@ -48,6 +48,7 @@ struct pcm512x_priv {
        int mute;
        struct mutex mutex;
        unsigned int bclk_ratio;
+       int force_pll_on;
 };
 
 /*
@@ -1258,10 +1259,34 @@ static int pcm512x_hw_params(struct snd_pcm_substream *substream,
                        return ret;
                }
 
-               ret = regmap_update_bits(pcm512x->regmap, PCM512x_PLL_EN,
-                                        PCM512x_PLLE, 0);
+               if (!pcm512x->force_pll_on) {
+                       ret = regmap_update_bits(pcm512x->regmap,
+                                                PCM512x_PLL_EN, PCM512x_PLLE, 0);
+               } else {
+                       /* provide minimum PLL config for TAS575x clocking
+                        * and leave PLL enabled
+                        */
+                       ret = regmap_write(pcm512x->regmap,
+                                          PCM512x_PLL_COEFF_0, 0x01);
+                       if (ret != 0) {
+                               dev_err(component->dev,
+                                       "Failed to set pll coefficient: %d\n", ret);
+                               return ret;
+                       }
+                       ret = regmap_write(pcm512x->regmap,
+                                          PCM512x_PLL_COEFF_1, 0x04);
+                       if (ret != 0) {
+                               dev_err(component->dev,
+                                       "Failed to set pll coefficient: %d\n", ret);
+                               return ret;
+                       }
+                       ret = regmap_write(pcm512x->regmap,
+                                          PCM512x_PLL_EN, 0x01);
+                       dev_dbg(component->dev, "Enabling PLL for TAS575x\n");
+               }
+
                if (ret != 0) {
-                       dev_err(component->dev, "Failed to disable pll: %d\n", ret);
+                       dev_err(component->dev, "Failed to set pll mode: %d\n", ret);
                        return ret;
                }
        }
@@ -1659,6 +1684,11 @@ int pcm512x_probe(struct device *dev, struct regmap *regmap)
                        ret = -EINVAL;
                        goto err_pm;
                }
+
+               if (!strcmp(np->name, "tas5756") ||
+                   !strcmp(np->name, "tas5754"))
+                       pcm512x->force_pll_on = 1;
+               dev_dbg(dev, "Device ID: %s\n", np->name);
        }
 #endif