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