static int adau1701_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_codec *codec = rtd->codec; snd_pcm_format_t format; unsigned int val; switch (params_rate(params)) { case 192000: val = ADAU1701_DSPCTRL_SR_192; break; case 96000: val = ADAU1701_DSPCTRL_SR_96; break; case 48000: val = ADAU1701_DSPCTRL_SR_48; break; default: return -EINVAL; } snd_soc_update_bits(codec, ADAU1701_DSPCTRL, ADAU1701_DSPCTRL_SR_MASK, val); format = params_format(params); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) return adau1701_set_playback_pcm_format(codec, format); else return adau1701_set_capture_pcm_format(codec, format); }
static int adau1701_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { struct snd_soc_codec *codec = dai->codec; struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec); unsigned int clkdiv = adau1701->sysclk / params_rate(params); snd_pcm_format_t format; unsigned int val; int ret; /* * If the mclk/lrclk ratio changes, the chip needs updated PLL * mode GPIO settings, and a full reset cycle, including a new * firmware upload. */ if (clkdiv != adau1701->pll_clkdiv) { ret = adau1701_reset(codec, clkdiv); if (ret < 0) return ret; } switch (params_rate(params)) { case 192000: val = ADAU1701_DSPCTRL_SR_192; break; case 96000: val = ADAU1701_DSPCTRL_SR_96; break; case 48000: val = ADAU1701_DSPCTRL_SR_48; break; default: return -EINVAL; } regmap_update_bits(adau1701->regmap, ADAU1701_DSPCTRL, ADAU1701_DSPCTRL_SR_MASK, val); format = params_format(params); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) return adau1701_set_playback_pcm_format(codec, format); else return adau1701_set_capture_pcm_format(codec, format); }