[alsa-devel] [RFC] [PATCH] asoc tlv320aic3x: revisit clocking setup
Jarkko Nikula
jarkko.nikula at nokia.com
Fri Apr 25 09:44:08 CEST 2008
On Thu, 24 Apr 2008 17:21:36 +0200
"ext Daniel Mack" <daniel at caiaq.org> wrote:
> On Thu, Apr 24, 2008 at 04:54:37PM +0200, Daniel Mack wrote:
> > attached is a patch that reworks the clocking setup for the aic3x
> > codec. It drops the dividers table and calculates the values
> > instead. When simulated, this code does the right thing for all the
> > examples described in the datasheet. Please review and let me know
> > about any concerns.
>
> Same thing again, but some more comments.
>
Hi
This is great work, calculates correct PLL values for my platform when
using 12/19.2 MHz @ 44.1 and 48 kHz and takes into account issues we've
been discussing before.
Here are my review comments:
+ if (bypass_pll) {
+ pll_q &= 0xf;
+ aic3x_write(codec, AIC3X_SAMPLE_RATE_SEL_REG, 0);
This is redundant write since register is updated below.
+ if (params_rate(params) >= 88200)
+ data |= DUAL_RATE_MODE;
aic3x_write(codec, AIC3X_CODEC_DATAPATH_REG, data);
Dual rate mode should be set when rate is >= 64000 kHz.
/* codec sample rate select */
- data = aic3x_divs[i].sr_reg;
+ data = (fsref * 10) / params_rate(params);
+ data /= 5;
+ data -= 2;
data |= (data << 4);
aic3x_write(codec, AIC3X_SAMPLE_RATE_SEL_REG, data);
Note result here is 0xFF if rate is >= 64000 kHz. Will calculate
correctly if fsref is doubled for those cases.
+ codec_clk = (2048 * fsref) / (aic3x->sysclk / 1000);
+
+ if (params_rate(params) >= 88200)
+ fsref *= 2;
Here also 64000. Remember to take into account doubled fsref when
calculating codec_clk if you move it before sample rate selection.
Otherwise patch looks good to me.
Jarkko
More information about the Alsa-devel
mailing list