aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/soc/codecs/tas2552.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/sound/soc/codecs/tas2552.c b/sound/soc/codecs/tas2552.c
index 8840f72f3c4a..10116169a239 100644
--- a/sound/soc/codecs/tas2552.c
+++ b/sound/soc/codecs/tas2552.c
@@ -192,7 +192,7 @@ static int tas2552_setup_pll(struct snd_soc_codec *codec,
192 * pll_clk = (.5 * pll_clkin * J.D) / 2^p 192 * pll_clk = (.5 * pll_clkin * J.D) / 2^p
193 * Need to fill in J and D here based on incoming freq 193 * Need to fill in J and D here based on incoming freq
194 */ 194 */
195 unsigned int d; 195 unsigned int d, q, t;
196 u8 j; 196 u8 j;
197 u8 pll_sel = (tas2552->pll_clk_id << 3) & TAS2552_PLL_SRC_MASK; 197 u8 pll_sel = (tas2552->pll_clk_id << 3) & TAS2552_PLL_SRC_MASK;
198 u8 p = snd_soc_read(codec, TAS2552_PLL_CTRL_1); 198 u8 p = snd_soc_read(codec, TAS2552_PLL_CTRL_1);
@@ -200,9 +200,12 @@ static int tas2552_setup_pll(struct snd_soc_codec *codec,
200 p = (p >> 7); 200 p = (p >> 7);
201 201
202recalc: 202recalc:
203 j = (pll_clk * 2 * (1 << p)) / pll_clkin; 203 t = (pll_clk * 2) << p;
204 d = (pll_clk * 2 * (1 << p)) % pll_clkin; 204 j = t / pll_clkin;
205 d /= (pll_clkin / 10000); 205 d = t % pll_clkin;
206 t = pll_clkin / 10000;
207 q = d / (t + 1);
208 d = q + ((9999 - pll_clkin % 10000) * (d / t - q)) / 10000;
206 209
207 if (d && (pll_clkin < 512000 || pll_clkin > 9200000)) { 210 if (d && (pll_clkin < 512000 || pll_clkin > 9200000)) {
208 if (tas2552->pll_clk_id == TAS2552_PLL_CLKIN_BCLK) { 211 if (tas2552->pll_clk_id == TAS2552_PLL_CLKIN_BCLK) {