Skip to content

Commit 53689f7

Browse files
CounterPillowbroonie
authored andcommitted
ASoC: rockchip: i2s_tdm: Dup static DAI template
Previously, the DAI template was used directly, which lead to fun bugs such as "why is my channels_max changing?" when one instantiated more than one i2s_tdm IP block in a device tree. This change makes it so that we instead duplicate the template struct, and then use that. Fixes: 081068f ("ASoC: rockchip: add support for i2s-tdm controller") Signed-off-by: Nicolas Frattaroli <frattaroli.nicolas@gmail.com> Link: https://lore.kernel.org/r/20211125084900.417102-1-frattaroli.nicolas@gmail.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 8a724d5 commit 53689f7

1 file changed

Lines changed: 31 additions & 21 deletions

File tree

sound/soc/rockchip/rockchip_i2s_tdm.c

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ struct rk_i2s_tdm_dev {
9595
spinlock_t lock; /* xfer lock */
9696
bool has_playback;
9797
bool has_capture;
98+
struct snd_soc_dai_driver *dai;
9899
};
99100

100101
static int to_ch_num(unsigned int val)
@@ -1310,19 +1311,14 @@ static const struct of_device_id rockchip_i2s_tdm_match[] = {
13101311
{},
13111312
};
13121313

1313-
static struct snd_soc_dai_driver i2s_tdm_dai = {
1314+
static const struct snd_soc_dai_driver i2s_tdm_dai = {
13141315
.probe = rockchip_i2s_tdm_dai_probe,
1315-
.playback = {
1316-
.stream_name = "Playback",
1317-
},
1318-
.capture = {
1319-
.stream_name = "Capture",
1320-
},
13211316
.ops = &rockchip_i2s_tdm_dai_ops,
13221317
};
13231318

1324-
static void rockchip_i2s_tdm_init_dai(struct rk_i2s_tdm_dev *i2s_tdm)
1319+
static int rockchip_i2s_tdm_init_dai(struct rk_i2s_tdm_dev *i2s_tdm)
13251320
{
1321+
struct snd_soc_dai_driver *dai;
13261322
struct property *dma_names;
13271323
const char *dma_name;
13281324
u64 formats = (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE |
@@ -1337,19 +1333,33 @@ static void rockchip_i2s_tdm_init_dai(struct rk_i2s_tdm_dev *i2s_tdm)
13371333
i2s_tdm->has_capture = true;
13381334
}
13391335

1336+
dai = devm_kmemdup(i2s_tdm->dev, &i2s_tdm_dai,
1337+
sizeof(*dai), GFP_KERNEL);
1338+
if (!dai)
1339+
return -ENOMEM;
1340+
13401341
if (i2s_tdm->has_playback) {
1341-
i2s_tdm_dai.playback.channels_min = 2;
1342-
i2s_tdm_dai.playback.channels_max = 8;
1343-
i2s_tdm_dai.playback.rates = SNDRV_PCM_RATE_8000_192000;
1344-
i2s_tdm_dai.playback.formats = formats;
1342+
dai->playback.stream_name = "Playback";
1343+
dai->playback.channels_min = 2;
1344+
dai->playback.channels_max = 8;
1345+
dai->playback.rates = SNDRV_PCM_RATE_8000_192000;
1346+
dai->playback.formats = formats;
13451347
}
13461348

13471349
if (i2s_tdm->has_capture) {
1348-
i2s_tdm_dai.capture.channels_min = 2;
1349-
i2s_tdm_dai.capture.channels_max = 8;
1350-
i2s_tdm_dai.capture.rates = SNDRV_PCM_RATE_8000_192000;
1351-
i2s_tdm_dai.capture.formats = formats;
1350+
dai->capture.stream_name = "Capture";
1351+
dai->capture.channels_min = 2;
1352+
dai->capture.channels_max = 8;
1353+
dai->capture.rates = SNDRV_PCM_RATE_8000_192000;
1354+
dai->capture.formats = formats;
13521355
}
1356+
1357+
if (i2s_tdm->clk_trcm != TRCM_TXRX)
1358+
dai->symmetric_rate = 1;
1359+
1360+
i2s_tdm->dai = dai;
1361+
1362+
return 0;
13531363
}
13541364

13551365
static int rockchip_i2s_tdm_path_check(struct rk_i2s_tdm_dev *i2s_tdm,
@@ -1541,8 +1551,6 @@ static int rockchip_i2s_tdm_probe(struct platform_device *pdev)
15411551
spin_lock_init(&i2s_tdm->lock);
15421552
i2s_tdm->soc_data = (struct rk_i2s_soc_data *)of_id->data;
15431553

1544-
rockchip_i2s_tdm_init_dai(i2s_tdm);
1545-
15461554
i2s_tdm->frame_width = 64;
15471555

15481556
i2s_tdm->clk_trcm = TRCM_TXRX;
@@ -1555,8 +1563,10 @@ static int rockchip_i2s_tdm_probe(struct platform_device *pdev)
15551563
}
15561564
i2s_tdm->clk_trcm = TRCM_RX;
15571565
}
1558-
if (i2s_tdm->clk_trcm != TRCM_TXRX)
1559-
i2s_tdm_dai.symmetric_rate = 1;
1566+
1567+
ret = rockchip_i2s_tdm_init_dai(i2s_tdm);
1568+
if (ret)
1569+
return ret;
15601570

15611571
i2s_tdm->grf = syscon_regmap_lookup_by_phandle(node, "rockchip,grf");
15621572
if (IS_ERR(i2s_tdm->grf))
@@ -1678,7 +1688,7 @@ static int rockchip_i2s_tdm_probe(struct platform_device *pdev)
16781688

16791689
ret = devm_snd_soc_register_component(&pdev->dev,
16801690
&rockchip_i2s_tdm_component,
1681-
&i2s_tdm_dai, 1);
1691+
i2s_tdm->dai, 1);
16821692

16831693
if (ret) {
16841694
dev_err(&pdev->dev, "Could not register DAI\n");

0 commit comments

Comments
 (0)