From 1f93a7dfd1f8d5ff7a5c53246c7534fe2332d6f4 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 11 Dec 2023 02:46:07 +0000
Subject: [PATCH] add audio

---
 kernel/sound/soc/rockchip/rockchip_vad.c |   39 +++++++++++++++++++++++++++++----------
 1 files changed, 29 insertions(+), 10 deletions(-)

diff --git a/kernel/sound/soc/rockchip/rockchip_vad.c b/kernel/sound/soc/rockchip/rockchip_vad.c
index 4d8db9e..7ed19d4 100644
--- a/kernel/sound/soc/rockchip/rockchip_vad.c
+++ b/kernel/sound/soc/rockchip/rockchip_vad.c
@@ -252,13 +252,11 @@
 	struct rockchip_vad *vad = NULL;
 	unsigned int i;
 
-	if (PCM_RUNTIME_CHECK(substream))
-		return NULL;
 	if (!rtd)
 		return NULL;
 
 	for (i = 0; i < rtd->num_codecs; i++) {
-		struct snd_soc_dai *codec_dai = rtd->codec_dais[i];
+		struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, i);
 
 		if (strstr(codec_dai->name, "vad"))
 			vad = snd_soc_component_get_drvdata(codec_dai->component);
@@ -624,6 +622,12 @@
 	{ /* sentinel */ },
 };
 
+static const struct audio_src_addr_map rk3588_addr_map[] = {
+	{ 0, RK3588_PDM0 },
+	{ 1, RK3588_I2S1_8CH },
+	{ /* sentinel */ },
+};
+
 static const struct vad_soc_data rk1808es_soc_data = {
 	.version = VAD_RK1808ES,
 	.map = rk1808_addr_map,
@@ -644,13 +648,18 @@
 	.map = rk3568_addr_map,
 };
 
+static const struct vad_soc_data rk3588_soc_data = {
+	.version = VAD_RK1808,
+	.map = rk3588_addr_map,
+};
+
 static int rockchip_vad_get_audio_src_address(struct rockchip_vad *vad,
 					      u32 addr)
 {
 	const struct audio_src_addr_map *map = vad->soc_data->map;
 
 	for (; map->addr; map++) {
-		if ((addr & map->addr) == addr) {
+		if ((map->addr & 0xffff0000) == addr) {
 			vad->audio_src = map->id;
 			vad->audio_src_addr = map->addr;
 			return 0;
@@ -720,7 +729,7 @@
 
 	dai_component.of_node = np;
 
-	return snd_soc_find_dai(&dai_component);
+	return snd_soc_find_dai_with_mutex(&dai_component);
 }
 
 static void hw_refine_channels(struct snd_pcm_hw_params *params,
@@ -745,7 +754,7 @@
 	unsigned int *channel_maps;
 	int i;
 
-	cpu_dai = rtd->cpu_dai;
+	cpu_dai = asoc_rtd_to_cpu(rtd, 0);
 	vad->cpu_dai = cpu_dai;
 	vad->substream = substream;
 	np = cpu_dai->dev->of_node;
@@ -863,11 +872,20 @@
 		return 0;
 
 	pm_runtime_get_sync(cpu_dai->dev);
+	if (cpu_dai->driver->ops) {
+		if (cpu_dai->driver->ops->startup)
+			ret = cpu_dai->driver->ops->startup(substream,
+							    cpu_dai);
 
-	if (cpu_dai->driver->ops && cpu_dai->driver->ops->trigger)
-		ret = cpu_dai->driver->ops->trigger(substream,
-						    SNDRV_PCM_TRIGGER_START,
-						    cpu_dai);
+		if (cpu_dai->driver->ops->prepare)
+			ret |= cpu_dai->driver->ops->prepare(substream,
+							    cpu_dai);
+
+		if (cpu_dai->driver->ops->trigger)
+			ret |= cpu_dai->driver->ops->trigger(substream,
+							    SNDRV_PCM_TRIGGER_START,
+							    cpu_dai);
+	}
 
 	return ret;
 }
@@ -1130,6 +1148,7 @@
 	{ .compatible = "rockchip,rk1808-vad", .data = &rk1808_soc_data },
 	{ .compatible = "rockchip,rk3308-vad", .data = &rk3308_soc_data },
 	{ .compatible = "rockchip,rk3568-vad", .data = &rk3568_soc_data },
+	{ .compatible = "rockchip,rk3588-vad", .data = &rk3588_soc_data },
 	{},
 };
 

--
Gitblit v1.6.2