ASoC: rockchip: multicodecs: add tdm support

Signed-off-by: XiaoTan Luo <lxt@rock-chips.com>
Change-Id: I7fccc0ad5214399b0354899f2a5f81b2f16161b7
This commit is contained in:
XiaoTan Luo
2024-08-23 15:19:56 +08:00
committed by Tao Huang
parent 6732e1af29
commit 818669da27

View File

@@ -76,6 +76,10 @@ struct multicodecs_data {
const struct adc_keys_button *map;
struct input_dev *input;
struct input_dev_poller *poller;
int slots;
int slot_width;
unsigned int tx_slot_mask;
unsigned int rx_slot_mask;
};
static const unsigned int headset_extcon_cable[] = {
@@ -399,7 +403,9 @@ static int rk_dailink_init(struct snd_soc_pcm_runtime *rtd)
struct multicodecs_data *mc_data = snd_soc_card_get_drvdata(rtd->card);
struct snd_soc_card *card = rtd->card;
struct snd_soc_jack *jack_headset;
int ret, irq;
struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
struct snd_soc_dai *codec_dai;
int ret, irq, i;
struct snd_soc_jack_pin *pins;
struct snd_soc_jack_zone *zones;
struct snd_soc_jack_pin jack_pins[] = {
@@ -427,6 +433,30 @@ static int rk_dailink_init(struct snd_soc_pcm_runtime *rtd)
}
};
if (mc_data->slots) {
ret = snd_soc_dai_set_tdm_slot(cpu_dai,
mc_data->tx_slot_mask,
mc_data->rx_slot_mask,
mc_data->slots,
mc_data->slot_width);
if (ret && ret != -EOPNOTSUPP) {
dev_err(card->dev, "cpu_dai: set_tdm_slot error\n");
return ret;
}
for_each_rtd_codec_dais(rtd, i, codec_dai) {
ret = snd_soc_dai_set_tdm_slot(codec_dai,
mc_data->tx_slot_mask,
mc_data->rx_slot_mask,
mc_data->slots,
mc_data->slot_width);
if (ret && ret != -EOPNOTSUPP) {
dev_err(card->dev, "codec_dai: set_tdm_slot error\n");
return ret;
}
}
}
if ((!mc_data->codec_hp_det) && (gpiod_to_irq(mc_data->hp_det_gpio) < 0)) {
dev_info(card->dev, "Don't need to map headset detect gpio to irq\n");
return 0;
@@ -804,6 +834,15 @@ static int rk_multicodecs_probe(struct platform_device *pdev)
mc_data->dai_link[0].platforms->of_node = mc_data->dai_link[0].cpus->of_node;
ret = snd_soc_of_parse_tdm_slot(np,
&mc_data->tx_slot_mask,
&mc_data->rx_slot_mask,
&mc_data->slots,
&mc_data->slot_width);
if (ret < 0) {
dev_err(&pdev->dev, "snd_soc_of_parse_tdm_slot failed: %d\n", ret);
return ret;
}
asrc_np = of_parse_phandle(np, "rockchip,asrc", 0);
if (asrc_np) {
mc_data->dai_link[1].cpus->of_node = asrc_np;