diff --git a/sound/soc/rockchip/rockchip_multicodecs.c b/sound/soc/rockchip/rockchip_multicodecs.c index 0b182191f72d..8c3bb17f2056 100644 --- a/sound/soc/rockchip/rockchip_multicodecs.c +++ b/sound/soc/rockchip/rockchip_multicodecs.c @@ -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;