static int tas571x_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { struct tas571x_private *priv = snd_soc_component_get_drvdata(dai->component); u32 val; switch (priv->format & SND_SOC_DAIFMT_FORMAT_MASK) { case SND_SOC_DAIFMT_RIGHT_J: val = 0x00; break; case SND_SOC_DAIFMT_I2S: val = 0x03; break; case SND_SOC_DAIFMT_LEFT_J: val = 0x06; break; default: return -EINVAL; } if (params_width(params) >= 24) val += 2; else if (params_width(params) >= 20) val += 1; return regmap_update_bits(priv->regmap, TAS571X_SDI_REG, TAS571X_SDI_FMT_MASK, val); }
static int cs35l33_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { struct snd_soc_component *component = dai->component; struct cs35l33_private *priv = snd_soc_component_get_drvdata(component); int sample_size = params_width(params); int coeff = cs35l33_get_mclk_coeff(priv->mclk_int, params_rate(params)); if (coeff < 0) return coeff; regmap_update_bits(priv->regmap, CS35L33_CLK_CTL, CS35L33_ADSP_FS | CS35L33_INT_FS_RATE, cs35l33_mclk_coeffs[coeff].int_fs_ratio | cs35l33_mclk_coeffs[coeff].adsp_rate); if (priv->is_tdm_mode) { sample_size = (sample_size / 8) - 1; if (sample_size > 2) sample_size = 2; regmap_update_bits(priv->regmap, CS35L33_RX_AUD, CS35L33_AUDIN_RX_DEPTH, sample_size << CS35L33_AUDIN_RX_DEPTH_SHIFT); } dev_dbg(component->dev, "sample rate=%d, bits per sample=%d\n", params_rate(params), params_width(params)); return 0; }
static int wl1273_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { struct wl1273_priv *wl1273 = snd_soc_codec_get_drvdata(dai->codec); struct wl1273_core *core = wl1273->core; unsigned int rate, width, r; if (params_width(params) != 16) { dev_err(dai->dev, "%d bits/sample not supported\n", params_width(params)); return -EINVAL; } rate = params_rate(params); width = hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS)->min; if (wl1273->mode == WL1273_MODE_BT) { if (rate != 8000) { pr_err("Rate %d not supported.\n", params_rate(params)); return -EINVAL; } if (params_channels(params) != 1) { pr_err("Only mono supported.\n"); return -EINVAL; } return 0; } if (wl1273->mode == WL1273_MODE_FM_TX && substream->stream == SNDRV_PCM_STREAM_CAPTURE) { pr_err("Only playback supported with TX.\n"); return -EINVAL; } if (wl1273->mode == WL1273_MODE_FM_RX && substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { pr_err("Only capture supported with RX.\n"); return -EINVAL; } if (wl1273->mode != WL1273_MODE_FM_RX && wl1273->mode != WL1273_MODE_FM_TX) { pr_err("Unexpected mode: %d.\n", wl1273->mode); return -EINVAL; } r = snd_wl1273_fm_set_i2s_mode(core, rate, width); if (r) return r; wl1273->channels = params_channels(params); r = snd_wl1273_fm_set_channel_number(core, wl1273->channels); if (r) return r; return 0; }
static int wm8804_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { struct snd_soc_codec *codec; u16 blen; codec = dai->codec; switch (params_width(params)) { case 16: blen = 0x0; break; case 20: blen = 0x1; break; case 24: blen = 0x2; break; default: dev_err(dai->dev, "Unsupported word length: %u\n", params_width(params)); return -EINVAL; } /* set word length */ snd_soc_update_bits(codec, WM8804_AIFTX, 0xc, blen << 2); snd_soc_update_bits(codec, WM8804_AIFRX, 0xc, blen << 2); return 0; }
static int wm8960_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; // u16 iface = snd_soc_read(codec, WM8960_IFACE1) & 0xfff3; int i; /* bit size */ switch (params_width(params)) { case 16: break; case 20: // iface |= 0x0004; break; case 24: // iface |= 0x0008; break; default: dev_err(codec->dev, "unsupported width %d\n", params_width(params)); return -EINVAL; } /* Update filters for the new rate */ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { } /* set iface */ // snd_soc_write(codec, WM8960_IFACE1, iface); return 0; }
static int wm8741_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 wm8741_priv *wm8741 = snd_soc_codec_get_drvdata(codec); unsigned int iface; int i; /* The set of sample rates that can be supported depends on the * MCLK supplied to the CODEC - enforce this. */ if (!wm8741->sysclk) { dev_err(codec->dev, "No MCLK configured, call set_sysclk() on init or in hw_params\n"); return -EINVAL; } /* Find a supported LRCLK rate */ for (i = 0; i < wm8741->sysclk_constraints->count; i++) { if (wm8741->sysclk_constraints->list[i] == params_rate(params)) break; } if (i == wm8741->sysclk_constraints->count) { dev_err(codec->dev, "LRCLK %d unsupported with MCLK %d\n", params_rate(params), wm8741->sysclk); return -EINVAL; } /* bit size */ switch (params_width(params)) { case 16: iface = 0x0; break; case 20: iface = 0x1; break; case 24: iface = 0x2; break; case 32: iface = 0x3; break; default: dev_dbg(codec->dev, "wm8741_hw_params: Unsupported bit size param = %d", params_width(params)); return -EINVAL; } dev_dbg(codec->dev, "wm8741_hw_params: bit size param = %d, rate param = %d", params_width(params), params_rate(params)); snd_soc_update_bits(codec, WM8741_FORMAT_CONTROL, WM8741_IWL_MASK, iface); return 0; }
static int pcm1789_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *codec_dai) { struct snd_soc_component *component = codec_dai->component; struct pcm1789_private *priv = snd_soc_component_get_drvdata(component); int val = 0, ret; priv->rate = params_rate(params); switch (priv->format & SND_SOC_DAIFMT_FORMAT_MASK) { case SND_SOC_DAIFMT_RIGHT_J: switch (params_width(params)) { case 24: val = 2; break; case 16: val = 3; break; default: return -EINVAL; } break; case SND_SOC_DAIFMT_I2S: switch (params_width(params)) { case 16: case 24: case 32: val = 0; break; default: return -EINVAL; } break; case SND_SOC_DAIFMT_LEFT_J: switch (params_width(params)) { case 16: case 24: case 32: val = 1; break; default: return -EINVAL; } break; default: dev_err(component->dev, "Invalid DAI format\n"); return -EINVAL; } ret = regmap_update_bits(priv->regmap, PCM1789_FMT_CONTROL, PCM1789_FMT_MASK, val); if (ret < 0) return ret; return 0; }
static int pcm179x_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 pcm179x_private *priv = snd_soc_codec_get_drvdata(codec); int val = 0, ret; priv->rate = params_rate(params); switch (priv->format & SND_SOC_DAIFMT_FORMAT_MASK) { case SND_SOC_DAIFMT_RIGHT_J: switch (params_width(params)) { case 24: case 32: val = 2; break; case 16: val = 0; break; default: return -EINVAL; } break; case SND_SOC_DAIFMT_I2S: switch (params_width(params)) { case 24: case 32: val = 5; break; case 16: val = 4; break; default: return -EINVAL; } break; default: dev_err(codec->dev, "Invalid DAI format\n"); return -EINVAL; } val = val << PCM179X_FMT_SHIFT | PCM179X_ATLD_ENABLE; ret = regmap_update_bits(priv->regmap, PCM179X_FMT_CONTROL, PCM179X_FMT_MASK | PCM179X_ATLD_ENABLE, val); if (ret < 0) return ret; return 0; }
static int max98925_dai_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 max98925_priv *max98925 = snd_soc_codec_get_drvdata(codec); switch (params_width(params)) { case 16: regmap_update_bits(max98925->regmap, MAX98925_FORMAT, M98925_DAI_CHANSZ_MASK, M98925_DAI_CHANSZ_16); max98925->ch_size = 16; break; case 24: regmap_update_bits(max98925->regmap, MAX98925_FORMAT, M98925_DAI_CHANSZ_MASK, M98925_DAI_CHANSZ_24); max98925->ch_size = 24; break; case 32: regmap_update_bits(max98925->regmap, MAX98925_FORMAT, M98925_DAI_CHANSZ_MASK, M98925_DAI_CHANSZ_32); max98925->ch_size = 32; break; default: pr_err("%s: format unsupported %d", __func__, params_format(params)); return -EINVAL; } dev_dbg(codec->dev, "%s: format supported %d", __func__, params_format(params)); return max98925_set_clock(max98925, params); }
static int isabelle_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; u16 aif = 0; unsigned int fs_val = 0; switch (params_rate(params)) { case 8000: fs_val = ISABELLE_FS_RATE_8; break; case 11025: fs_val = ISABELLE_FS_RATE_11; break; case 12000: fs_val = ISABELLE_FS_RATE_12; break; case 16000: fs_val = ISABELLE_FS_RATE_16; break; case 22050: fs_val = ISABELLE_FS_RATE_22; break; case 24000: fs_val = ISABELLE_FS_RATE_24; break; case 32000: fs_val = ISABELLE_FS_RATE_32; break; case 44100: fs_val = ISABELLE_FS_RATE_44; break; case 48000: fs_val = ISABELLE_FS_RATE_48; break; default: return -EINVAL; } snd_soc_update_bits(codec, ISABELLE_FS_RATE_CFG_REG, ISABELLE_FS_RATE_MASK, fs_val); /* bit size */ switch (params_width(params)) { case 20: aif |= ISABELLE_AIF_LENGTH_20; break; case 32: aif |= ISABELLE_AIF_LENGTH_32; break; default: return -EINVAL; } snd_soc_update_bits(codec, ISABELLE_INTF_CFG_REG, ISABELLE_AIF_LENGTH_MASK, aif); return 0; }
static int adav80x_set_playback_pcm_format(struct snd_soc_codec *codec, struct snd_soc_dai *dai, struct snd_pcm_hw_params *params) { struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); unsigned int val; if (adav80x->dai_fmt[dai->id] != SND_SOC_DAIFMT_RIGHT_J) return 0; switch (params_width(params)) { case 16: val = ADAV80X_PLAYBACK_MODE_RIGHT_J_16; break; case 18: val = ADAV80X_PLAYBACK_MODE_RIGHT_J_18; break; case 20: val = ADAV80X_PLAYBACK_MODE_RIGHT_J_20; break; case 24: val = ADAV80X_PLAYBACK_MODE_RIGHT_J_24; break; default: return -EINVAL; } regmap_update_bits(adav80x->regmap, adav80x_port_ctrl_regs[dai->id][1], ADAV80X_PLAYBACK_MODE_MASK, val); return 0; }
static int adav80x_set_capture_pcm_format(struct snd_soc_codec *codec, struct snd_soc_dai *dai, struct snd_pcm_hw_params *params) { struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); unsigned int val; switch (params_width(params)) { case 16: val = ADAV80X_CAPTURE_WORD_LEN16; break; case 18: val = ADAV80X_CAPTRUE_WORD_LEN18; break; case 20: val = ADAV80X_CAPTURE_WORD_LEN20; break; case 24: val = ADAV80X_CAPTURE_WORD_LEN24; break; default: return -EINVAL; } regmap_update_bits(adav80x->regmap, adav80x_port_ctrl_regs[dai->id][0], ADAV80X_CAPTURE_WORD_LEN_MASK, val); return 0; }
static int s3c24xx_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { struct snd_dmaengine_dai_dma_data *dma_data; u32 iismod; pr_debug("Entered %s\n", __func__); dma_data = snd_soc_dai_get_dma_data(dai, substream); /* Working copies of register */ iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD); pr_debug("hw_params r: IISMOD: %x\n", iismod); switch (params_width(params)) { case 8: iismod &= ~S3C2410_IISMOD_16BIT; dma_data->addr_width = 1; break; case 16: iismod |= S3C2410_IISMOD_16BIT; dma_data->addr_width = 2; break; default: return -EINVAL; } writel(iismod, s3c24xx_i2s.regs + S3C2410_IISMOD); pr_debug("hw_params w: IISMOD: %x\n", iismod); return 0; }
static int stm32_spdifrx_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *cpu_dai) { struct stm32_spdifrx_data *spdifrx = snd_soc_dai_get_drvdata(cpu_dai); int data_size = params_width(params); int fmt; switch (data_size) { case 16: fmt = SPDIFRX_DRFMT_PACKED; spdifrx->dma_params.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; break; case 32: fmt = SPDIFRX_DRFMT_LEFT; spdifrx->dma_params.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; break; default: dev_err(&spdifrx->pdev->dev, "Unexpected data format\n"); return -EINVAL; } snd_soc_dai_init_dma_data(cpu_dai, NULL, &spdifrx->dma_params); return regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR, SPDIFRX_CR_DRFMT_MASK, SPDIFRX_CR_DRFMTSET(fmt)); }
static int s3c2412_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *cpu_dai) { struct s3c_i2sv2_info *i2s = snd_soc_dai_get_drvdata(cpu_dai); struct s3c_dma_params *dma_data; u32 iismod; pr_debug("Entered %s\n", __func__); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) dma_data = i2s->dma_playback; else dma_data = i2s->dma_capture; snd_soc_dai_set_dma_data(cpu_dai, substream, dma_data); iismod = readl(i2s->regs + S3C2412_IISMOD); pr_debug("%s: r: IISMOD: %x\n", __func__, iismod); switch (params_width(params)) { case 8: iismod |= S3C2412_IISMOD_8BIT; break; case 16: iismod &= ~S3C2412_IISMOD_8BIT; break; } writel(iismod, i2s->regs + S3C2412_IISMOD); pr_debug("%s: w: IISMOD: %x\n", __func__, iismod); 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 (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 wm8750_pcm_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 wm8750_priv *wm8750 = snd_soc_codec_get_drvdata(codec); u16 iface = snd_soc_read(codec, WM8750_IFACE) & 0x1f3; u16 srate = snd_soc_read(codec, WM8750_SRATE) & 0x1c0; int coeff = get_coeff(wm8750->sysclk, params_rate(params)); /* bit size */ switch (params_width(params)) { case 16: break; case 20: iface |= 0x0004; break; case 24: iface |= 0x0008; break; case 32: iface |= 0x000c; break; } /* set iface & srate */ snd_soc_write(codec, WM8750_IFACE, iface); if (coeff >= 0) snd_soc_write(codec, WM8750_SRATE, srate | (coeff_div[coeff].sr << 1) | coeff_div[coeff].usb); return 0; }
static int wm8711_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { struct snd_soc_component *component = dai->component; struct wm8711_priv *wm8711 = snd_soc_component_get_drvdata(component); u16 iface = snd_soc_component_read32(component, WM8711_IFACE) & 0xfff3; int i = get_coeff(wm8711->sysclk, params_rate(params)); u16 srate = (coeff_div[i].sr << 2) | (coeff_div[i].bosr << 1) | coeff_div[i].usb; snd_soc_component_write(component, WM8711_SRATE, srate); /* bit size */ switch (params_width(params)) { case 16: break; case 20: iface |= 0x0004; break; case 24: iface |= 0x0008; break; } snd_soc_component_write(component, WM8711_IFACE, iface); return 0; }
static int wm8728_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; u16 dac = snd_soc_read(codec, WM8728_DACCTL); dac &= ~0x18; switch (params_width(params)) { case 16: break; case 20: dac |= 0x10; break; case 24: dac |= 0x08; break; default: return -EINVAL; } snd_soc_write(codec, WM8728_DACCTL, dac); return 0; }
static int s3c2412_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *cpu_dai) { struct s3c_i2sv2_info *i2s = snd_soc_dai_get_drvdata(cpu_dai); u32 iismod; pr_debug("Entered %s\n", __func__); iismod = readl(i2s->regs + S3C2412_IISMOD); pr_debug("%s: r: IISMOD: %x\n", __func__, iismod); switch (params_width(params)) { case 8: iismod |= S3C2412_IISMOD_8BIT; break; case 16: iismod &= ~S3C2412_IISMOD_8BIT; break; } writel(iismod, i2s->regs + S3C2412_IISMOD); pr_debug("%s: w: IISMOD: %x\n", __func__, iismod); return 0; }
static int adau1701_set_playback_pcm_format(struct snd_soc_codec *codec, struct snd_pcm_hw_params *params) { struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec); unsigned int val; if (adau1701->dai_fmt != SND_SOC_DAIFMT_RIGHT_J) return 0; switch (params_width(params)) { case 16: val = ADAU1701_SERICTL_RIGHTJ_16; break; case 20: val = ADAU1701_SERICTL_RIGHTJ_20; break; case 24: val = ADAU1701_SERICTL_RIGHTJ_24; break; default: return -EINVAL; } regmap_update_bits(adau1701->regmap, ADAU1701_SERICTL, ADAU1701_SERICTL_MODE_MASK, val); return 0; }
static int wm8731_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 wm8731_priv *wm8731 = snd_soc_codec_get_drvdata(codec); u16 iface = snd_soc_read(codec, WM8731_IFACE) & 0xfff3; int i = get_coeff(wm8731->sysclk, params_rate(params)); u16 srate = (coeff_div[i].sr << 2) | (coeff_div[i].bosr << 1) | coeff_div[i].usb; wm8731->playback_fs = params_rate(params); snd_soc_write(codec, WM8731_SRATE, srate); /* bit size */ switch (params_width(params)) { case 16: break; case 20: iface |= 0x0004; break; case 24: iface |= 0x0008; break; } wm8731_set_deemph(codec); snd_soc_write(codec, WM8731_IFACE, iface); return 0; }
static int ad1836_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { struct ad1836_priv *ad1836 = snd_soc_codec_get_drvdata(dai->codec); int word_len = 0; /* bit size */ switch (params_width(params)) { case 16: word_len = AD1836_WORD_LEN_16; break; case 20: word_len = AD1836_WORD_LEN_20; break; case 24: case 32: word_len = AD1836_WORD_LEN_24; break; default: return -EINVAL; } regmap_update_bits(ad1836->regmap, AD1836_DAC_CTRL1, AD1836_DAC_WORD_LEN_MASK, word_len << AD1836_DAC_WORD_LEN_OFFSET); regmap_update_bits(ad1836->regmap, AD1836_ADC_CTRL2, AD1836_ADC_WORD_LEN_MASK, word_len << AD1836_ADC_WORD_OFFSET); return 0; }
static int wm8737_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 wm8737_priv *wm8737 = snd_soc_codec_get_drvdata(codec); int i; u16 clocking = 0; u16 af = 0; for (i = 0; i < ARRAY_SIZE(coeff_div); i++) { if (coeff_div[i].rate != params_rate(params)) continue; if (coeff_div[i].mclk == wm8737->mclk) break; if (coeff_div[i].mclk == wm8737->mclk * 2) { clocking |= WM8737_CLKDIV2; break; } } if (i == ARRAY_SIZE(coeff_div)) { dev_err(codec->dev, "%dHz MCLK can't support %dHz\n", wm8737->mclk, params_rate(params)); return -EINVAL; } clocking |= coeff_div[i].usb | (coeff_div[i].sr << WM8737_SR_SHIFT); switch (params_width(params)) { case 16: break; case 20: af |= 0x8; break; case 24: af |= 0x10; break; case 32: af |= 0x18; break; default: return -EINVAL; } snd_soc_update_bits(codec, WM8737_AUDIO_FORMAT, WM8737_WL_MASK, af); snd_soc_update_bits(codec, WM8737_CLOCKING, WM8737_USB_MODE | WM8737_CLKDIV2 | WM8737_SR_MASK, clocking); return 0; }
static int stm32_i2s_configure(struct snd_soc_dai *cpu_dai, struct snd_pcm_hw_params *params, struct snd_pcm_substream *substream) { struct stm32_i2s_data *i2s = snd_soc_dai_get_drvdata(cpu_dai); int format = params_width(params); u32 cfgr, cfgr_mask, cfg1; unsigned int fthlv; int ret; if ((params_channels(params) == 1) && ((i2s->fmt & SND_SOC_DAIFMT_FORMAT_MASK) != SND_SOC_DAIFMT_DSP_A)) { dev_err(cpu_dai->dev, "Mono mode supported only by DSP_A\n"); return -EINVAL; } switch (format) { case 16: cfgr = I2S_CGFR_DATLEN_SET(I2S_I2SMOD_DATLEN_16); cfgr_mask = I2S_CGFR_DATLEN_MASK | I2S_CGFR_CHLEN; break; case 32: cfgr = I2S_CGFR_DATLEN_SET(I2S_I2SMOD_DATLEN_32) | I2S_CGFR_CHLEN; cfgr_mask = I2S_CGFR_DATLEN_MASK | I2S_CGFR_CHLEN; break; default: dev_err(cpu_dai->dev, "Unexpected format %d", format); return -EINVAL; } if (STM32_I2S_IS_SLAVE(i2s)) { cfgr |= I2S_CGFR_I2SCFG_SET(I2S_I2SMOD_FD_SLAVE); /* As data length is either 16 or 32 bits, fixch always set */ cfgr |= I2S_CGFR_FIXCH; cfgr_mask |= I2S_CGFR_FIXCH; } else { cfgr |= I2S_CGFR_I2SCFG_SET(I2S_I2SMOD_FD_MASTER); } cfgr_mask |= I2S_CGFR_I2SCFG_MASK; ret = regmap_update_bits(i2s->regmap, STM32_I2S_CGFR_REG, cfgr_mask, cfgr); if (ret < 0) return ret; fthlv = STM32_I2S_FIFO_SIZE * I2S_FIFO_TH_ONE_QUARTER / 4; cfg1 = I2S_CFG1_FTHVL_SET(fthlv - 1); return regmap_update_bits(i2s->regmap, STM32_I2S_CFG1_REG, I2S_CFG1_FTHVL_MASK, cfg1); }
static int si476x_codec_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { struct si476x_core *core = i2c_mfd_cell_to_core(dai->dev); int rate, width, err; rate = params_rate(params); if (rate < 32000 || rate > 48000) { dev_err(dai->codec->dev, "Rate: %d is not supported\n", rate); return -EINVAL; } switch (params_width(params)) { case 8: width = SI476X_PCM_FORMAT_S8; break; case 16: width = SI476X_PCM_FORMAT_S16_LE; break; case 20: width = SI476X_PCM_FORMAT_S20_3LE; break; case 24: width = SI476X_PCM_FORMAT_S24_LE; break; default: return -EINVAL; } si476x_core_lock(core); err = snd_soc_write(dai->codec, SI476X_DIGITAL_IO_OUTPUT_SAMPLE_RATE, rate); if (err < 0) { dev_err(dai->codec->dev, "Failed to set sample rate\n"); goto out; } err = snd_soc_update_bits(dai->codec, SI476X_DIGITAL_IO_OUTPUT_FORMAT, SI476X_DIGITAL_IO_OUTPUT_WIDTH_MASK, (width << SI476X_DIGITAL_IO_SLOT_SIZE_SHIFT) | (width << SI476X_DIGITAL_IO_SAMPLE_SIZE_SHIFT)); if (err < 0) { dev_err(dai->codec->dev, "Failed to set output width\n"); goto out; } out: si476x_core_unlock(core); return err; }
static int adau1701_set_capture_pcm_format(struct snd_soc_codec *codec, struct snd_pcm_hw_params *params) { struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec); unsigned int mask = ADAU1701_SEROCTL_WORD_LEN_MASK; unsigned int val; switch (params_width(params)) { case 16: val = ADAU1701_SEROCTL_WORD_LEN_16; break; case 20: val = ADAU1701_SEROCTL_WORD_LEN_20; break; case 24: val = ADAU1701_SEROCTL_WORD_LEN_24; break; default: return -EINVAL; } if (adau1701->dai_fmt == SND_SOC_DAIFMT_RIGHT_J) { switch (params_width(params)) { case 16: val |= ADAU1701_SEROCTL_MSB_DEALY16; break; case 20: val |= ADAU1701_SEROCTL_MSB_DEALY12; break; case 24: val |= ADAU1701_SEROCTL_MSB_DEALY8; break; } mask |= ADAU1701_SEROCTL_MSB_DEALY_MASK; } regmap_update_bits(adau1701->regmap, ADAU1701_SEROCTL, mask, val); return 0; }
static int aic31xx_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *tmp) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_codec *codec = rtd->codec; u8 data = 0; dev_dbg(codec->dev, "## %s: format %d width %d rate %d\n", __func__, params_format(params), params_width(params), params_rate(params)); switch (params_width(params)) { case 16: break; case 20: data = (AIC31XX_WORD_LEN_20BITS << AIC31XX_IFACE1_DATALEN_SHIFT); break; case 24: data = (AIC31XX_WORD_LEN_24BITS << AIC31XX_IFACE1_DATALEN_SHIFT); break; case 32: data = (AIC31XX_WORD_LEN_32BITS << AIC31XX_IFACE1_DATALEN_SHIFT); break; default: dev_err(codec->dev, "%s: Unsupported format %d\n", __func__, params_format(params)); return -EINVAL; } snd_soc_update_bits(codec, AIC31XX_IFACE1, AIC31XX_IFACE1_DATALEN_MASK, data); return aic31xx_setup_pll(codec, params); }
static int ad193x_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { int word_len = 0, master_rate = 0; struct snd_soc_codec *codec = dai->codec; struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec); /* bit size */ switch (params_width(params)) { case 16: word_len = 3; break; case 20: word_len = 1; break; case 24: case 32: word_len = 0; break; } switch (ad193x->sysclk) { case 12288000: master_rate = AD193X_PLL_INPUT_256; break; case 18432000: master_rate = AD193X_PLL_INPUT_384; break; case 24576000: master_rate = AD193X_PLL_INPUT_512; break; case 36864000: master_rate = AD193X_PLL_INPUT_768; break; } regmap_update_bits(ad193x->regmap, AD193X_PLL_CLK_CTRL0, AD193X_PLL_INPUT_MASK, master_rate); regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL2, AD193X_DAC_WORD_LEN_MASK, word_len << AD193X_DAC_WORD_LEN_SHFT); if (ad193x_has_adc(ad193x)) regmap_update_bits(ad193x->regmap, AD193X_ADC_CTRL1, AD193X_ADC_WORD_LEN_MASK, word_len); return 0; }
static int fsl_esai_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { struct fsl_esai *esai_priv = snd_soc_dai_get_drvdata(dai); bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; u32 width = params_width(params); u32 channels = params_channels(params); u32 pins = DIV_ROUND_UP(channels, esai_priv->slots); u32 slot_width = width; u32 bclk, mask, val; int ret; /* Override slot_width if being specifically set */ if (esai_priv->slot_width) slot_width = esai_priv->slot_width; bclk = params_rate(params) * slot_width * esai_priv->slots; ret = fsl_esai_set_bclk(dai, tx, bclk); if (ret) return ret; /* Use Normal mode to support monaural audio */ regmap_update_bits(esai_priv->regmap, REG_ESAI_xCR(tx), ESAI_xCR_xMOD_MASK, params_channels(params) > 1 ? ESAI_xCR_xMOD_NETWORK : 0); regmap_update_bits(esai_priv->regmap, REG_ESAI_xFCR(tx), ESAI_xFCR_xFR_MASK, ESAI_xFCR_xFR); mask = ESAI_xFCR_xFR_MASK | ESAI_xFCR_xWA_MASK | ESAI_xFCR_xFWM_MASK | (tx ? ESAI_xFCR_TE_MASK | ESAI_xFCR_TIEN : ESAI_xFCR_RE_MASK); val = ESAI_xFCR_xWA(width) | ESAI_xFCR_xFWM(esai_priv->fifo_depth) | (tx ? ESAI_xFCR_TE(pins) | ESAI_xFCR_TIEN : ESAI_xFCR_RE(pins)); regmap_update_bits(esai_priv->regmap, REG_ESAI_xFCR(tx), mask, val); mask = ESAI_xCR_xSWS_MASK | (tx ? ESAI_xCR_PADC : 0); val = ESAI_xCR_xSWS(slot_width, width) | (tx ? ESAI_xCR_PADC : 0); regmap_update_bits(esai_priv->regmap, REG_ESAI_xCR(tx), mask, val); /* Remove ESAI personal reset by configuring ESAI_PCRC and ESAI_PRRC */ regmap_update_bits(esai_priv->regmap, REG_ESAI_PRRC, ESAI_PRRC_PDC_MASK, ESAI_PRRC_PDC(ESAI_GPIO)); regmap_update_bits(esai_priv->regmap, REG_ESAI_PCRC, ESAI_PCRC_PC_MASK, ESAI_PCRC_PC(ESAI_GPIO)); return 0; }