Skip to content

Commit 09c6855

Browse files
committed
ASoC: sdw_utils: add rt1320 dmic dai in codec_info_list
Add 'rt1320-aif2' dai info for rt1320 dmic function. Signed-off-by: Derek Fang <derek.fang@realtek.com>
1 parent 75c6e8c commit 09c6855

File tree

2 files changed

+51
-4
lines changed

2 files changed

+51
-4
lines changed

sound/soc/sdw_utils/soc_sdw_rt_dmic.c

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,20 @@
99

1010
#include <linux/device.h>
1111
#include <linux/errno.h>
12+
#include <linux/soundwire/sdw_type.h>
1213
#include <sound/soc.h>
1314
#include <sound/soc-acpi.h>
1415
#include <sound/soc_sdw_utils.h>
16+
#include <sound/sdca_function.h>
1517

1618
int asoc_sdw_rt_dmic_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai)
1719
{
1820
struct snd_soc_card *card = rtd->card;
1921
struct snd_soc_component *component;
22+
struct sdw_slave *sdw_peripheral;
23+
struct asoc_sdw_codec_info *codec_info;
2024
char *mic_name;
25+
int rt1320_dmic_num = 0, part_id, i;
2126

2227
component = dai->component;
2328

@@ -32,9 +37,40 @@ int asoc_sdw_rt_dmic_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_da
3237
if (!mic_name)
3338
return -ENOMEM;
3439

35-
card->components = devm_kasprintf(card->dev, GFP_KERNEL,
36-
"%s mic:%s", card->components,
37-
mic_name);
40+
/*
41+
* If there is any rt1320 DMIC belonging to this card, try to count the `cfg-mics` to be
42+
* used in card->components.
43+
*/
44+
if (!strcmp(dai->name, "rt1320-aif2")) {
45+
codec_info = asoc_sdw_find_codec_info_dai(dai->name, &i);
46+
if (!codec_info)
47+
return -EINVAL;
48+
part_id = codec_info->part_id;
49+
50+
/* count the rt1320 with SDCA function SmartMic type in this card */
51+
for_each_card_components(card, component) {
52+
if (!is_sdw_slave(component->dev))
53+
continue;
54+
sdw_peripheral = dev_to_sdw_dev(component->dev);
55+
if (sdw_peripheral->id.part_id != part_id)
56+
continue;
57+
for (i = 0; i < sdw_peripheral->sdca_data.num_functions; i++) {
58+
if (sdw_peripheral->sdca_data.function[i].type ==
59+
SDCA_FUNCTION_TYPE_SMART_MIC) {
60+
rt1320_dmic_num++;
61+
break;
62+
}
63+
}
64+
}
65+
card->components = devm_kasprintf(card->dev, GFP_KERNEL,
66+
"%s mic:%s cfg-mics:%d", card->components,
67+
mic_name, rt1320_dmic_num);
68+
} else {
69+
card->components = devm_kasprintf(card->dev, GFP_KERNEL,
70+
"%s mic:%s", card->components,
71+
mic_name);
72+
}
73+
3874
if (!card->components)
3975
return -ENOMEM;
4076

sound/soc/sdw_utils/soc_sdw_utils.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
319319
{
320320
.part_id = 0x1320,
321321
.name_prefix = "rt1320",
322+
.is_amp = true,
322323
.dais = {
323324
{
324325
.direction = {true, false},
@@ -334,8 +335,18 @@ struct asoc_sdw_codec_info codec_info_list[] = {
334335
.widgets = generic_spk_widgets,
335336
.num_widgets = ARRAY_SIZE(generic_spk_widgets),
336337
},
338+
{
339+
.direction = {false, true},
340+
.dai_name = "rt1320-aif2",
341+
.component_name = "rt1320",
342+
.dai_type = SOC_SDW_DAI_TYPE_MIC,
343+
.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
344+
.rtd_init = asoc_sdw_rt_dmic_rtd_init,
345+
.widgets = generic_dmic_widgets,
346+
.num_widgets = ARRAY_SIZE(generic_dmic_widgets),
347+
},
337348
},
338-
.dai_num = 1,
349+
.dai_num = 2,
339350
},
340351
{
341352
.part_id = 0x1321,

0 commit comments

Comments
 (0)