ASoC: wm8962: No need to call wm8962_configure_bclk() multiple times
Subsystems (3)
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
@@ -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
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.
Mark Brown
maintainerQuoted 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_bclkonly once insidewm8962_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().