From e92cb0063f23404249b9ded866f62f9fb48d8a4b Mon Sep 17 00:00:00 2001 From: Sugar Zhang Date: Thu, 14 Sep 2023 09:18:47 +0800 Subject: [PATCH] ASoC: rockchip: multi-dais: Add support controls for sub dais This patch add controls for all sub-dai component to allow user set/get each dai's controls. if no name_prefix specified in driver, user should confirm that the dai node of DT has assigned the property 'sound-name-prefix'. e.g. SAI0 + SAI1 combo &sai0 { sound-name-prefix = "SAI0"; }; &sai1 { sound-name-prefix = "SAI1"; }; amixer scontrols ... Simple mixer control 'SAI0 SDI0 Loopback',0 Simple mixer control 'SAI0 SDI0 Loopback Src Select',0 Simple mixer control 'SAI1 SDI0 Loopback',0 Simple mixer control 'SAI1 SDI0 Loopback Src Select',0 Signed-off-by: Sugar Zhang Change-Id: I9c3c56fe21e71afb26ad103f947b3dbfe1ccff11 --- sound/soc/rockchip/rockchip_multi_dais.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/sound/soc/rockchip/rockchip_multi_dais.c b/sound/soc/rockchip/rockchip_multi_dais.c index e52be215dab1..e44f061a7f3a 100644 --- a/sound/soc/rockchip/rockchip_multi_dais.c +++ b/sound/soc/rockchip/rockchip_multi_dais.c @@ -23,6 +23,8 @@ #define DAIS_DRV_NAME "rockchip-mdais" #define RK3308_GRF_SOC_CON2 0x308 +#define SOUND_NAME_PREFIX "sound-name-prefix" + static inline struct rk_mdais_dev *to_info(struct snd_soc_dai *dai) { return snd_soc_dai_get_drvdata(dai); @@ -220,13 +222,16 @@ static int rockchip_mdais_tdm_slot(struct snd_soc_dai *dai, static int rockchip_mdais_dai_probe(struct snd_soc_dai *dai) { struct rk_mdais_dev *mdais = to_info(dai); + struct snd_soc_component *comp; struct snd_soc_dai *child; + const char *str; int ret, i = 0; for (i = 0; i < mdais->num_dais; i++) { child = mdais->dais[i].dai; + comp = child->component; if (!child->probed && child->driver->probe) { - child->component->card = dai->component->card; + comp->card = dai->component->card; ret = child->driver->probe(child); if (ret < 0) { dev_err(child->dev, @@ -234,6 +239,21 @@ static int rockchip_mdais_dai_probe(struct snd_soc_dai *dai) child->name, ret); return ret; } + + if (!comp->name_prefix) { + ret = device_property_read_string(child->dev, + SOUND_NAME_PREFIX, &str); + if (!ret) + comp->name_prefix = str; + } + + ret = snd_soc_add_component_controls(comp, + comp->driver->controls, + comp->driver->num_controls); + if (ret) + dev_err(dai->dev, "%s: Failed to add controls, should add '%s' in DT\n", + dev_name(child->dev), SOUND_NAME_PREFIX); + dai->probed = 1; } }