9595struct zx_i2s_info {
9696 struct snd_dmaengine_dai_dma_data dma_playback ;
9797 struct snd_dmaengine_dai_dma_data dma_capture ;
98- struct clk * dai_clk ;
98+ struct clk * dai_wclk ;
99+ struct clk * dai_pclk ;
99100 void __iomem * reg_base ;
100101 int master ;
101102 resource_size_t mapbase ;
@@ -225,7 +226,7 @@ static int zx_i2s_hw_params(struct snd_pcm_substream *substream,
225226 struct zx_i2s_info * i2s = snd_soc_dai_get_drvdata (socdai );
226227 struct snd_dmaengine_dai_dma_data * dma_data ;
227228 unsigned int lane , ch_num , len , ret = 0 ;
228- unsigned long val , format ;
229+ unsigned long val ;
229230 unsigned long chn_cfg ;
230231
231232 dma_data = snd_soc_dai_get_dma_data (socdai , substream );
@@ -238,15 +239,12 @@ static int zx_i2s_hw_params(struct snd_pcm_substream *substream,
238239
239240 switch (params_format (params )) {
240241 case SNDRV_PCM_FORMAT_S16_LE :
241- format = 0 ;
242242 len = 16 ;
243243 break ;
244244 case SNDRV_PCM_FORMAT_S24_LE :
245- format = 1 ;
246245 len = 24 ;
247246 break ;
248247 case SNDRV_PCM_FORMAT_S32_LE :
249- format = 2 ;
250248 len = 32 ;
251249 break ;
252250 default :
@@ -278,8 +276,9 @@ static int zx_i2s_hw_params(struct snd_pcm_substream *substream,
278276 writel_relaxed (val , i2s -> reg_base + ZX_I2S_TIMING_CTRL );
279277
280278 if (i2s -> master )
281- ret = clk_set_rate (i2s -> dai_clk ,
282- params_rate (params ) * ch_num * CLK_RAT );
279+ ret = clk_set_rate (i2s -> dai_wclk ,
280+ params_rate (params ) * ch_num * CLK_RAT );
281+
283282 return ret ;
284283}
285284
@@ -331,16 +330,28 @@ static int zx_i2s_startup(struct snd_pcm_substream *substream,
331330 struct snd_soc_dai * dai )
332331{
333332 struct zx_i2s_info * zx_i2s = dev_get_drvdata (dai -> dev );
333+ int ret ;
334334
335- return clk_prepare_enable (zx_i2s -> dai_clk );
335+ ret = clk_prepare_enable (zx_i2s -> dai_wclk );
336+ if (ret )
337+ return ret ;
338+
339+ ret = clk_prepare_enable (zx_i2s -> dai_pclk );
340+ if (ret ) {
341+ clk_disable_unprepare (zx_i2s -> dai_wclk );
342+ return ret ;
343+ }
344+
345+ return ret ;
336346}
337347
338348static void zx_i2s_shutdown (struct snd_pcm_substream * substream ,
339349 struct snd_soc_dai * dai )
340350{
341351 struct zx_i2s_info * zx_i2s = dev_get_drvdata (dai -> dev );
342352
343- clk_disable_unprepare (zx_i2s -> dai_clk );
353+ clk_disable_unprepare (zx_i2s -> dai_wclk );
354+ clk_disable_unprepare (zx_i2s -> dai_pclk );
344355}
345356
346357static struct snd_soc_dai_ops zx_i2s_dai_ops = {
@@ -384,10 +395,16 @@ static int zx_i2s_probe(struct platform_device *pdev)
384395 if (!zx_i2s )
385396 return - ENOMEM ;
386397
387- zx_i2s -> dai_clk = devm_clk_get (& pdev -> dev , "tx" );
388- if (IS_ERR (zx_i2s -> dai_clk )) {
389- dev_err (& pdev -> dev , "Fail to get clk\n" );
390- return PTR_ERR (zx_i2s -> dai_clk );
398+ zx_i2s -> dai_wclk = devm_clk_get (& pdev -> dev , "wclk" );
399+ if (IS_ERR (zx_i2s -> dai_wclk )) {
400+ dev_err (& pdev -> dev , "Fail to get wclk\n" );
401+ return PTR_ERR (zx_i2s -> dai_wclk );
402+ }
403+
404+ zx_i2s -> dai_pclk = devm_clk_get (& pdev -> dev , "pclk" );
405+ if (IS_ERR (zx_i2s -> dai_pclk )) {
406+ dev_err (& pdev -> dev , "Fail to get pclk\n" );
407+ return PTR_ERR (zx_i2s -> dai_pclk );
391408 }
392409
393410 res = platform_get_resource (pdev , IORESOURCE_MEM , 0 );
0 commit comments