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