From 2f7c68cb55ecb7331f2381deb497c27155f32faf Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Wed, 03 Jan 2024 09:43:39 +0000 Subject: [PATCH] update kernel to 5.10.198 --- kernel/sound/soc/rockchip/rockchip_multi_dais.c | 74 ++++++++++++++++++++++++++++++------ 1 files changed, 61 insertions(+), 13 deletions(-) diff --git a/kernel/sound/soc/rockchip/rockchip_multi_dais.c b/kernel/sound/soc/rockchip/rockchip_multi_dais.c index d4994f6..4b9bb34 100644 --- a/kernel/sound/soc/rockchip/rockchip_multi_dais.c +++ b/kernel/sound/soc/rockchip/rockchip_multi_dais.c @@ -30,6 +30,13 @@ return snd_soc_dai_get_drvdata(dai); } +static inline unsigned int *mdais_channel_maps(struct rk_mdais_dev *mdais, + struct snd_pcm_substream *substream) +{ + return substream->stream ? mdais->capture_channel_maps : + mdais->playback_channel_maps; +} + static void hw_refine_channels(struct snd_pcm_hw_params *params, unsigned int channel) { @@ -54,26 +61,51 @@ if (IS_ERR(cparams)) return PTR_ERR(cparams); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - channel_maps = mdais->playback_channel_maps; - else - channel_maps = mdais->capture_channel_maps; + channel_maps = mdais_channel_maps(mdais, substream); for (i = 0; i < mdais->num_dais; i++) { child = mdais->dais[i].dai; - if (channel_maps[i]) - hw_refine_channels(cparams, channel_maps[i]); + if (!channel_maps[i]) + continue; + + hw_refine_channels(cparams, channel_maps[i]); if (child->driver->ops && child->driver->ops->hw_params) { ret = child->driver->ops->hw_params(substream, cparams, child); if (ret < 0) { - dev_err(dai->dev, "ASoC: can't set %s hw params: %d\n", + dev_err(dai->dev, "Failed to set %s hw params: %d\n", dai->name, ret); - return ret; + break; } } } kfree(cparams); + + return ret; +} + +static int rockchip_mdais_hw_free(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct rk_mdais_dev *mdais = to_info(dai); + struct snd_soc_dai *child; + unsigned int *channel_maps; + int ret = 0, i = 0; + + channel_maps = mdais_channel_maps(mdais, substream); + + for (i = 0; i < mdais->num_dais; i++) { + child = mdais->dais[i].dai; + if (!channel_maps[i]) + continue; + + if (child->driver->ops && child->driver->ops->hw_free) { + ret = child->driver->ops->hw_free(substream, child); + if (ret < 0) + return ret; + } + } + return 0; } @@ -85,10 +117,7 @@ unsigned int *channel_maps; int ret = 0, i = 0; - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - channel_maps = mdais->playback_channel_maps; - else - channel_maps = mdais->capture_channel_maps; + channel_maps = mdais_channel_maps(mdais, substream); for (i = 0; i < mdais->num_dais; i++) { /* skip DAIs which have no channel mapping */ @@ -112,9 +141,15 @@ { struct rk_mdais_dev *mdais = to_info(dai); struct snd_soc_dai *child; + unsigned int *channel_maps; int ret = 0, i = 0; + channel_maps = mdais_channel_maps(mdais, substream); + for (i = 0; i < mdais->num_dais; i++) { + if (!channel_maps[i]) + continue; + child = mdais->dais[i].dai; if (child->driver->ops && child->driver->ops->startup) { ret = child->driver->ops->startup(substream, child); @@ -131,9 +166,15 @@ { struct rk_mdais_dev *mdais = to_info(dai); struct snd_soc_dai *child; + unsigned int *channel_maps; int i = 0; + channel_maps = mdais_channel_maps(mdais, substream); + for (i = 0; i < mdais->num_dais; i++) { + if (!channel_maps[i]) + continue; + child = mdais->dais[i].dai; if (child->driver->ops && child->driver->ops->shutdown) { child->driver->ops->shutdown(substream, child); @@ -146,9 +187,15 @@ { struct rk_mdais_dev *mdais = to_info(dai); struct snd_soc_dai *child; + unsigned int *channel_maps; int ret = 0, i = 0; + channel_maps = mdais_channel_maps(mdais, substream); + for (i = 0; i < mdais->num_dais; i++) { + if (!channel_maps[i]) + continue; + child = mdais->dais[i].dai; if (child->driver->ops && child->driver->ops->prepare) { ret = child->driver->ops->prepare(substream, child); @@ -242,7 +289,7 @@ ret = child->driver->probe(child); if (ret < 0) { dev_err(child->dev, - "ASoC: failed to probe DAI %s: %d\n", + "Failed to probe DAI %s: %d\n", child->name, ret); return ret; } @@ -263,6 +310,7 @@ static const struct snd_soc_dai_ops rockchip_mdais_dai_ops = { .hw_params = rockchip_mdais_hw_params, + .hw_free = rockchip_mdais_hw_free, .set_sysclk = rockchip_mdais_set_sysclk, .set_fmt = rockchip_mdais_set_fmt, .set_tdm_slot = rockchip_mdais_tdm_slot, -- Gitblit v1.6.2