static int pcm1681_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 pcm1681_private *priv = snd_soc_codec_get_drvdata(codec); int val = 0, ret; int pcm_format = params_format(params); priv->rate = params_rate(params); switch (priv->format & SND_SOC_DAIFMT_FORMAT_MASK) { case SND_SOC_DAIFMT_RIGHT_J: if (pcm_format == SNDRV_PCM_FORMAT_S24_LE) val = 0x00; else if (pcm_format == SNDRV_PCM_FORMAT_S16_LE) val = 0x03; break; case SND_SOC_DAIFMT_I2S: val = 0x04; break; case SND_SOC_DAIFMT_LEFT_J: val = 0x05; break; default: dev_err(codec->dev, "Invalid DAI format\n"); return -EINVAL; } ret = regmap_update_bits(priv->regmap, PCM1681_FMT_CONTROL, 0x0f, val); if (ret < 0) return ret; return pcm1681_set_deemph(codec); }
static int pcm1681_put_deemph(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); struct pcm1681_private *priv = snd_soc_codec_get_drvdata(codec); priv->deemph = ucontrol->value.integer.value[0]; return pcm1681_set_deemph(codec); }