diff options
| -rw-r--r-- | sound/soc/codecs/tas2552.c | 11 |
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 | ||
| 202 | recalc: | 202 | recalc: |
| 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) { |
