static int adau1977_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct adau1977 *adau1977 = snd_soc_codec_get_drvdata(dai->codec); u64 formats = 0; if (adau1977->slot_width == 16) formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE; else if (adau1977->right_j || adau1977->slot_width == 24) formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE | SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_BE; snd_pcm_hw_constraint_list(substream->runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &adau1977->constraints); if (adau1977->master) snd_pcm_hw_constraint_minmax(substream->runtime, SNDRV_PCM_HW_PARAM_RATE, 8000, adau1977->max_master_fs); if (formats != 0) snd_pcm_hw_constraint_mask64(substream->runtime, SNDRV_PCM_HW_PARAM_FORMAT, formats); return 0; }
static int hdac_hdmi_eld_limit_formats(struct snd_pcm_runtime *runtime, void *eld) { u64 formats = SNDRV_PCM_FMTBIT_S16; int i; const u8 *sad, *eld_buf = eld; sad = drm_eld_sad(eld_buf); if (!sad) goto format_constraint; for (i = drm_eld_sad_count(eld_buf); i > 0; i--, sad += 3) { if (sad_format(sad) == 1) { /* AUDIO_CODING_TYPE_LPCM */ /* * the controller support 20 and 24 bits in 32 bit * container so we set S32 */ if (sad_sample_bits_lpcm(sad) & 0x6) formats |= SNDRV_PCM_FMTBIT_S32; } } format_constraint: return snd_pcm_hw_constraint_mask64(runtime, SNDRV_PCM_HW_PARAM_FORMAT, formats); }