static int ssm2602_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 ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec); int srate = ssm2602_get_coeff(ssm2602->sysclk, params_rate(params)); unsigned int iface; if (srate < 0) return srate; regmap_write(ssm2602->regmap, SSM2602_SRATE, srate); /* bit size */ switch (params_width(params)) { case 16: iface = 0x0; break; case 20: iface = 0x4; break; case 24: iface = 0x8; break; case 32: iface = 0xc; break; default: return -EINVAL; } regmap_update_bits(ssm2602->regmap, SSM2602_IFACE, IFACE_AUDIO_DATA_LEN, iface); return 0; }
static int ssm2602_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 ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec); int srate = ssm2602_get_coeff(ssm2602->sysclk, params_rate(params)); unsigned int iface; if (substream == ssm2602->slave_substream) { dev_dbg(codec->dev, "Ignoring hw_params for slave substream\n"); return 0; } if (srate < 0) return srate; regmap_write(ssm2602->regmap, SSM2602_SRATE, srate); /* bit size */ switch (params_format(params)) { case SNDRV_PCM_FORMAT_S16_LE: iface = 0x0; break; case SNDRV_PCM_FORMAT_S20_3LE: iface = 0x4; break; case SNDRV_PCM_FORMAT_S24_LE: iface = 0x8; break; case SNDRV_PCM_FORMAT_S32_LE: iface = 0xc; break; default: return -EINVAL; } regmap_update_bits(ssm2602->regmap, SSM2602_IFACE, IFACE_AUDIO_DATA_LEN, iface); return 0; }
static int ssm2602_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; struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec); u16 iface = snd_soc_read(codec, SSM2602_IFACE) & 0xfff3; int srate = ssm2602_get_coeff(ssm2602->sysclk, params_rate(params)); if (substream == ssm2602->slave_substream) { dev_dbg(codec->dev, "Ignoring hw_params for slave substream\n"); return 0; } if (srate < 0) return srate; snd_soc_write(codec, SSM2602_SRATE, srate); /* bit size */ switch (params_format(params)) { case SNDRV_PCM_FORMAT_S16_LE: break; case SNDRV_PCM_FORMAT_S20_3LE: iface |= 0x0004; break; case SNDRV_PCM_FORMAT_S24_LE: iface |= 0x0008; break; case SNDRV_PCM_FORMAT_S32_LE: iface |= 0x000c; break; } snd_soc_write(codec, SSM2602_IFACE, iface); return 0; }