[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