[alsa-devel] [PATCH] ASoC: tlv320aic3x: add input clock selection
Prchal Jiří
jiri.prchal at aksignal.cz
Tue Jun 26 13:47:35 CEST 2012
Hi Mark,
Dne 26.6.2012 12:26, Mark Brown napsal(a):
> On Tue, Jun 26, 2012 at 12:21:28PM +0200, Prchal Jiří wrote:
>
>> + /* set clock on MCLK or GPIO2 or BCLK */
>> + snd_soc_update_bits(codec, AIC3X_CLKGEN_CTRL_REG, PLLCLK_IN_MASK, clk_id);
>> + snd_soc_update_bits(codec, AIC3X_CLKGEN_CTRL_REG, CLKDIV_IN_MASK, clk_id);
>
> Normally it's possible to set these separately. Is there a reason why
> they have to be the same (and if so why has the chip got separate
> registers)?
It could be set separately but in my opinion that doesn't make sense. Codec has one inner clock which is from divider or
pll. In one time is used only one clock source so it doesn't matter how is set the other. And the other must be set to
someone, cannot be switched off.
Normally board design contain one clock connected to one of tree input pins. This is to select pin.
Selection of input divider or pll is done somewhere else depended on frequency and sampling rate.
Can someone from TI approve or disapprove this?
>
>> +#define PLLCLK_IN_MASK 0x30
>> +#define CLKDIV_IN_MASK 0xc0
>> +/* clock in source */
>> +#define CLKIN_MCLK 0
>> +#define CLKIN_GPIO2 1
>> +#define CLKIN_BCLK 2
>
> This doesn't look right - you use the clock source values directly above
> but they need shifting to be used as if they're used directly they'll
> always come out as zero. It'd also be better to have some bounds
> checking on the values.
You are right, my mistake. Below is corrected patch.
Thanks.
--- /home/prchal/arm/fw-cdu/linux/linux-3.5-rc3/sound/soc/codecs/tlv320aic3x.c.orig
+++ /home/prchal/arm/fw-cdu/linux/linux-3.5-rc3/sound/soc/codecs/tlv320aic3x.c
@@ -972,6 +972,12 @@
struct snd_soc_codec *codec = codec_dai->codec;
struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec);
+ /* set clock on MCLK or GPIO2 or BCLK */
+ snd_soc_update_bits(codec, AIC3X_CLKGEN_CTRL_REG, PLLCLK_IN_MASK,
+ clk_id << PLLCLK_IN_SHIFT);
+ snd_soc_update_bits(codec, AIC3X_CLKGEN_CTRL_REG, CLKDIV_IN_MASK,
+ clk_id << CLKDIV_IN_SHIFT);
+
aic3x->sysclk = freq;
return 0;
}
--- /home/prchal/arm/fw-cdu/linux/linux-3.5-rc3/sound/soc/codecs/tlv320aic3x.h.orig
+++ /home/prchal/arm/fw-cdu/linux/linux-3.5-rc3/sound/soc/codecs/tlv320aic3x.h
@@ -178,6 +178,15 @@
#define PLL_CLKIN_SHIFT 4
#define MCLK_SOURCE 0x0
#define PLL_CLKDIV_SHIFT 0
+#define PLLCLK_IN_MASK 0x30
+#define PLLCLK_IN_SHIFT 4
+#define CLKDIV_IN_MASK 0xc0
+#define CLKDIV_IN_SHIFT 6
+/* clock in source */
+#define CLKIN_MCLK 0
+#define CLKIN_GPIO2 1
+#define CLKIN_BCLK 2
+
/* Software reset register bits */
#define SOFT_RESET 0x80
More information about the Alsa-devel
mailing list