ASoC: apple: mca: Constrain channels according to TDM mask
[ Upstream commit e717c661e2d1a660e96c40b0fe9933e23a1d7747 ]
We don't (and can't) configure the hardware correctly if the number of
channels exceeds the weight of the TDM mask. Report that constraint in
startup of FE.
Fixes: 3df5d0d972
("ASoC: apple: mca: Start new platform driver")
Signed-off-by: Martin Povišer <povik+lin@cutebit.org>
Signed-off-by: James Calligeros <jcalligeros99@gmail.com>
Link: https://patch.msgid.link/20250518-mca-fixes-v1-1-ee1015a695f6@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
42f7dd4bf5
commit
8b263e8ab2
@@ -464,6 +464,28 @@ err:
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int mca_fe_startup(struct snd_pcm_substream *substream,
|
||||||
|
struct snd_soc_dai *dai)
|
||||||
|
{
|
||||||
|
struct mca_cluster *cl = mca_dai_to_cluster(dai);
|
||||||
|
unsigned int mask, nchannels;
|
||||||
|
|
||||||
|
if (cl->tdm_slots) {
|
||||||
|
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||||
|
mask = cl->tdm_tx_mask;
|
||||||
|
else
|
||||||
|
mask = cl->tdm_rx_mask;
|
||||||
|
|
||||||
|
nchannels = hweight32(mask);
|
||||||
|
} else {
|
||||||
|
nchannels = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return snd_pcm_hw_constraint_minmax(substream->runtime,
|
||||||
|
SNDRV_PCM_HW_PARAM_CHANNELS,
|
||||||
|
1, nchannels);
|
||||||
|
}
|
||||||
|
|
||||||
static int mca_fe_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
|
static int mca_fe_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
|
||||||
unsigned int rx_mask, int slots, int slot_width)
|
unsigned int rx_mask, int slots, int slot_width)
|
||||||
{
|
{
|
||||||
@@ -680,6 +702,7 @@ static int mca_fe_hw_params(struct snd_pcm_substream *substream,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static const struct snd_soc_dai_ops mca_fe_ops = {
|
static const struct snd_soc_dai_ops mca_fe_ops = {
|
||||||
|
.startup = mca_fe_startup,
|
||||||
.set_fmt = mca_fe_set_fmt,
|
.set_fmt = mca_fe_set_fmt,
|
||||||
.set_bclk_ratio = mca_set_bclk_ratio,
|
.set_bclk_ratio = mca_set_bclk_ratio,
|
||||||
.set_tdm_slot = mca_fe_set_tdm_slot,
|
.set_tdm_slot = mca_fe_set_tdm_slot,
|
||||||
|
Reference in New Issue
Block a user