@@ -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
100101static 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
13551365static 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