Re: [PATCH v3] ASoC: Intel: kbl_rt5663_rt5514_max98927: Split be_hw_params_fixup function

From: Pierre-Louis Bossart
Date: Wed Jul 01 2020 - 12:48:23 EST




On 7/1/20 11:37 AM, N, Harshapriya wrote:

For speakers and headsets its 48Khz, 2 ch and 24 bit and this
setting is done based on the front-end dai For speakers, however
support only
16 bit, so we set it back to 16 bit If the front end dai is dmic,
then the channel
is set to either 2 or 4 dmic_constraints. No other formats need to be set.

All the SSP1 usages do not have the same parameters (as dmic is on
SSP1 and its different as given above) Most parameters are same for
speakers and headset which are on different SSP. This is the reason we
had a single fixup function.
On SSP1, for dmic we need to fix the channels which is derived from dmic_num
of the snd_soc_acpi_mach structure based on the number of dmic on the
board.
The channel is something that might be different from speakers.
We might not want to constraint the dmic capture to always be 48Khz as well.
Given this, there seems to me, 2 ways to set it:
1. Derive if the fixup is being called for dmic or speaker 2. Having a new dailink

If #2 is not preferred (going by Pierre's comments), can we use rtd-
cpu_dai/codec_dai->name to figure out if its for dmic or speaker?
I can test this and get back to you.
Tested and the following is something we can use without creating a new dailink.
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
if (!strcmp(codec_dai->name, KBL_REALTEK_DMIC_CODEC_DAI)) {
if (params_channels(params) == 2 || DMIC_CH(dmic_constraints) == 2)
channels->min = channels->max = 2;
else
channels->min = channels->max = 4;
} else {
rate->min = rate->max = 48000;
channels->min = channels->max = 2;
snd_mask_none(fmt);
snd_mask_set_format(fmt, pcm_fmt);
}

Pierre, thoughts?

thanks Harsha, that looks like what I had in mind, but my earlier question was why we deal with the rates and formats only in the last case?