ASoC: wm8962: Provide a .hw_free function
Subsystems (3)
PATCH 1/1 ASoC: wm8962: Provide a .hw_free function
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.
In order to avoid such error message, let's add a .hw_free function which will zero out wm8962->lrclk and wm8962->bclk, which according to the code below:
if (!wm8962->bclk || !wm8962->lrclk) {
dev_dbg(codec->dev, "No audio clocks configured\n");
return;
},will cause the wm8962_configure_bclk() function not to search a valid sysclk ratio after playback has finished.
--- sound/soc/codecs/wm8962.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
sound/soc/codecs/wm8962.c +13 -0
@@ -2914,6 +2914,18 @@ static int wm8962_mute(struct snd_soc_dai *dai, int mute) WM8962_DAC_MUTE, val); } +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 ; +} +#define WM8962_RATES SNDRV_PCM_RATE_8000_96000#define WM8962_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
@@ -2921,6 +2933,7 @@ static int wm8962_mute(struct snd_soc_dai *dai, int mute)static const struct snd_soc_dai_ops wm8962_dai_ops = { .hw_params = wm8962_hw_params, + .hw_free = wm8962_hw_free, .set_sysclk = wm8962_set_dai_sysclk, .set_fmt = wm8962_set_dai_fmt, .digital_mute = wm8962_mute,
Signature · 1 line
1.8.1.2
Mark Brown
maintainerQuoted 14 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 544This error message appears about 5 seconds after the audio playback has finished.
In order to avoid such error message, let's add a .hw_free function which will zero out
wm8962->lrclkandwm8962->bclk, which according to the code below:
Quoted 7 lines
if (!wm8962->bclk || !wm8962->lrclk) { dev_dbg(codec->dev, "No audio clocks configured\n"); return; },will cause the
wm8962_configure_bclk()function not to search a valid sysclk ratio after playback has finished.
This means that if we start a bypass path the driver won't remember the last sample rate setting so there's zero chance that we'll come up with something useful by default. The issue here is triggered by the machine switching from the FLL to direct MCLK usage where the MCLK isn't generating a useful ratio.
I suspect we should just kill the configure_bclk() in set_sysclk(), that one isn't safe as we can't reconfigure a live SYSCLK and it's probably the one that generates your warnings.