Skip to contentSkip to conversation

ASoC: wm8962: No need to call wm8962_configure_bclk() multiple times

PATCH In review Fabio Estevam 3 participants 3 messages Jul 19, 2013

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

PATCH 1/1 ASoC: wm8962: No need to call wm8962_configure_bclk() multiple times

From: Fabio Estevam <[email protected]>

Currently after playing any audio file, we get the following error message:

$ aplay clarinet.wav 
Playing WAVE 'clarinet.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo
$ wm8962 0-001a: Unsupported sysclk ratio 544

This error message appears about 5 seconds after the audio playback has finished.

There is no need to re-calculate the bit clock after the playback has finished, so call wm8962_configure_bclk only once inside wm8962_hw_params().

---
 sound/soc/codecs/wm8962.c | 4 ----
 1 file changed, 4 deletions(-)
sound/soc/codecs/wm8962.c +0 -4
index 6a5066c..1bf79dc 100644
@@ -2497,8 +2497,6 @@ static int wm8962_set_bias_level(struct snd_soc_codec *codec,
 		/* VMID 2*50k */
 		snd_soc_update_bits(codec, WM8962_PWR_MGMT_1,
 				    WM8962_VMID_SEL_MASK, 0x80);
-
-		wm8962_configure_bclk(codec);
 		break;
 
 	case SND_SOC_BIAS_STANDBY:
@@ -2621,8 +2619,6 @@ static int wm8962_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id,
 
 	wm8962->sysclk_rate = freq;
 
-	wm8962_configure_bclk(codec);
-
 	return 0;
 }
 
Signature · 1 line
1.8.1.2
#1 lore raw

Hi Fabio,

sound/soc/codecs/wm8962.c static int wm8962_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, · line 2625

Quoted 11 lines · Fabio Estevam
sound/soc/codecs/wm8962.c +0 -4
-
-		wm8962_configure_bclk(codec);
 		break;
 
 	case SND_SOC_BIAS_STANDBY:
@@ -2621,8 +2619,6 @@ static int wm8962_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id,
 
 	wm8962->sysclk_rate = freq;
 
-	wm8962_configure_bclk(codec);
-

Although I know this modification should be okay on i.MX SabreSD, yet I'm not sure if won't break other usage on other platforms.

And the problem here is because wm8962->bclk and wm8962->lrclk are updated in hw_params() but be remained after playback's done. So there might be a least risky way to fix it just by adding this:

+static int wm8962_hw_free(struct snd_pcm_substream *substream,
+ struct snd_soc_dai *dai)
+{
+ struct snd_soc_codec *codec = dai->codec;
+ struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
+
+ wm8962->lrclk = 0;
+ wm8962->bclk = 0;
+
+ return 0;
+}

Surely If Mark say okay to Fabio's patch, I'll be totally okay with it too. I just want to this wm8962 driver can work perfectly on all the platforms.

maintainer
#2 lore raw
In reply to Fabio Estevam
Quoted 8 lines · Fabio Estevam

From: Fabio Estevam <[email protected]>

Currently after playing any audio file, we get the following error message:

$ aplay clarinet.wav 
Playing WAVE 'clarinet.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo
$ wm8962 0-001a: Unsupported sysclk ratio 544
Quoted 5 lines

This error message appears about 5 seconds after the audio playback has finished.

There is no need to re-calculate the bit clock after the playback has finished, so call wm8962_configure_bclk only once inside wm8962_hw_params().

No, you do end up needing to call it in multiple places - there's other configuration going on there that is needed by bypass paths which won't use the audio interface and hence won't call hw_params().