Skip to contentSkip to conversation

ASoC: mcasp: don't override bclk divider if it was provided by the machine

PATCH Applied Daniel Mack 4 participants 4 messages Jul 16, 2014

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ASoC: mcasp: don't override bclk divider if it was provided by the machine

If a machine driver provides an BCLK divider to the McASP driver, skip the automatic calculation.

This fixes machines on which the physical sample transport always works in 32 bits, even though not all of them are actually used. snd_soc_params_to_bclk() will fail to address such cases properly.

---
 sound/soc/davinci/davinci-mcasp.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)
sound/soc/davinci/davinci-mcasp.c +7 -2
index 0518f27..dbeb4fd 100644
@@ -64,6 +64,7 @@ struct davinci_mcasp {
 	u8	num_serializer;
 	u8	*serial_dir;
 	u8	version;
+	u8	bclk_div;
 	u16	bclk_lrclk_ratio;
 	int	streams;
 
@@ -420,6 +421,7 @@ static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div
 			       ACLKXDIV(div - 1), ACLKXDIV_MASK);
 		mcasp_mod_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG,
 			       ACLKRDIV(div - 1), ACLKRDIV_MASK);
+		mcasp->bclk_div = div;
 		break;
 
 	case 2:		/* BCLK/LRCLK ratio */
@@ -722,8 +724,11 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
 	int period_size = params_period_size(params);
 	int ret;
 
-	/* If mcasp is BCLK master we need to set BCLK divider */
-	if (mcasp->bclk_master) {
+	/*
+	 * If mcasp is BCLK master, and a BCLK divider was not provided by
+	 * the machine driver, we need to calculate the ratio.
+	 */
+	if (mcasp->bclk_master && mcasp->bclk_div == 0) {
 		unsigned int bclk_freq = snd_soc_params_to_bclk(params);
 		if (mcasp->sysclk_freq % bclk_freq != 0) {
 			dev_err(mcasp->dev, "Can't produce required BCLK\n");
Signature · 1 line
1.9.3
Acked-by on v1 1/1
#1 lore raw
Quoted 6 lines · Daniel Mack

If a machine driver provides an BCLK divider to the McASP driver, skip the automatic calculation.

This fixes machines on which the physical sample transport always works in 32 bits, even though not all of them are actually used. snd_soc_params_to_bclk() will fail to address such cases properly.

Quoted 41 lines
---
 sound/soc/davinci/davinci-mcasp.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)
sound/soc/davinci/davinci-mcasp.c +7 -2
index 0518f27..dbeb4fd 100644
@@ -64,6 +64,7 @@ struct davinci_mcasp {
 	u8	num_serializer;
 	u8	*serial_dir;
 	u8	version;
+	u8	bclk_div;
 	u16	bclk_lrclk_ratio;
 	int	streams;
 
@@ -420,6 +421,7 @@ static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div
 			       ACLKXDIV(div - 1), ACLKXDIV_MASK);
 		mcasp_mod_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG,
 			       ACLKRDIV(div - 1), ACLKRDIV_MASK);
+		mcasp->bclk_div = div;
 		break;
 
 	case 2:		/* BCLK/LRCLK ratio */
@@ -722,8 +724,11 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
 	int period_size = params_period_size(params);
 	int ret;
 
-	/* If mcasp is BCLK master we need to set BCLK divider */
-	if (mcasp->bclk_master) {
+	/*
+	 * If mcasp is BCLK master, and a BCLK divider was not provided by
+	 * the machine driver, we need to calculate the ratio.
+	 */
+	if (mcasp->bclk_master && mcasp->bclk_div == 0) {
 		unsigned int bclk_freq = snd_soc_params_to_bclk(params);
 		if (mcasp->sysclk_freq % bclk_freq != 0) {
 			dev_err(mcasp->dev, "Can't produce required BCLK\n");
Signature · 1 line
Péter
maintainer Applied
#2 lore raw
In reply to Daniel Mack
Quoted 2 lines · Daniel Mack

If a machine driver provides an BCLK divider to the McASP driver, skip the automatic calculation.

Applied, thanks. I had to merge with Peter's changes for the DMA but the resolution looked straightforward so hopefully it's OK - you probably want to check though.

#3 lore raw
Quoted 7 lines · Mark Brown
Quoted 2 lines · Daniel Mack

If a machine driver provides an BCLK divider to the McASP driver, skip the automatic calculation.

Applied, thanks. I had to merge with Peter's changes for the DMA but the resolution looked straightforward so hopefully it's OK - you probably want to check though.

Looking good, thanks!