Lines Matching refs:spdif_priv

150 static void spdif_irq_dpll_lock(struct fsl_spdif_priv *spdif_priv)  in spdif_irq_dpll_lock()  argument
152 struct regmap *regmap = spdif_priv->regmap; in spdif_irq_dpll_lock()
153 struct platform_device *pdev = spdif_priv->pdev; in spdif_irq_dpll_lock()
162 spdif_priv->dpll_locked = locked ? true : false; in spdif_irq_dpll_lock()
166 static void spdif_irq_sym_error(struct fsl_spdif_priv *spdif_priv) in spdif_irq_sym_error() argument
168 struct regmap *regmap = spdif_priv->regmap; in spdif_irq_sym_error()
169 struct platform_device *pdev = spdif_priv->pdev; in spdif_irq_sym_error()
174 if (!spdif_priv->dpll_locked) in spdif_irq_sym_error()
179 static void spdif_irq_uqrx_full(struct fsl_spdif_priv *spdif_priv, char name) in spdif_irq_uqrx_full() argument
181 struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control; in spdif_irq_uqrx_full()
182 struct regmap *regmap = spdif_priv->regmap; in spdif_irq_uqrx_full()
183 struct platform_device *pdev = spdif_priv->pdev; in spdif_irq_uqrx_full()
218 static void spdif_irq_uq_sync(struct fsl_spdif_priv *spdif_priv) in spdif_irq_uq_sync() argument
220 struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control; in spdif_irq_uq_sync()
221 struct platform_device *pdev = spdif_priv->pdev; in spdif_irq_uq_sync()
234 static void spdif_irq_uq_err(struct fsl_spdif_priv *spdif_priv) in spdif_irq_uq_err() argument
236 struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control; in spdif_irq_uq_err()
237 struct regmap *regmap = spdif_priv->regmap; in spdif_irq_uq_err()
238 struct platform_device *pdev = spdif_priv->pdev; in spdif_irq_uq_err()
254 static u32 spdif_intr_status_clear(struct fsl_spdif_priv *spdif_priv) in spdif_intr_status_clear() argument
256 struct regmap *regmap = spdif_priv->regmap; in spdif_intr_status_clear()
269 struct fsl_spdif_priv *spdif_priv = (struct fsl_spdif_priv *)devid; in spdif_isr() local
270 struct platform_device *pdev = spdif_priv->pdev; in spdif_isr()
273 sis = spdif_intr_status_clear(spdif_priv); in spdif_isr()
276 spdif_irq_dpll_lock(spdif_priv); in spdif_isr()
291 spdif_irq_sym_error(spdif_priv); in spdif_isr()
297 spdif_irq_uqrx_full(spdif_priv, 'U'); in spdif_isr()
303 spdif_irq_uqrx_full(spdif_priv, 'Q'); in spdif_isr()
309 spdif_irq_uq_sync(spdif_priv); in spdif_isr()
312 spdif_irq_uq_err(spdif_priv); in spdif_isr()
321 spdif_irq_dpll_lock(spdif_priv); in spdif_isr()
334 static int spdif_softreset(struct fsl_spdif_priv *spdif_priv) in spdif_softreset() argument
336 struct regmap *regmap = spdif_priv->regmap; in spdif_softreset()
368 static void spdif_write_channel_status(struct fsl_spdif_priv *spdif_priv) in spdif_write_channel_status() argument
370 struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control; in spdif_write_channel_status()
371 struct regmap *regmap = spdif_priv->regmap; in spdif_write_channel_status()
372 struct platform_device *pdev = spdif_priv->pdev; in spdif_write_channel_status()
389 static int spdif_set_rx_clksrc(struct fsl_spdif_priv *spdif_priv, in spdif_set_rx_clksrc() argument
392 struct regmap *regmap = spdif_priv->regmap; in spdif_set_rx_clksrc()
393 u8 clksrc = spdif_priv->rxclk_src; in spdif_set_rx_clksrc()
409 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0)); in spdif_set_sample_rate() local
410 struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control; in spdif_set_sample_rate()
411 struct regmap *regmap = spdif_priv->regmap; in spdif_set_sample_rate()
412 struct platform_device *pdev = spdif_priv->pdev; in spdif_set_sample_rate()
445 clk = spdif_priv->txclk_src[rate]; in spdif_set_sample_rate()
451 txclk_df = spdif_priv->txclk_df[rate]; in spdif_set_sample_rate()
457 sysclk_df = spdif_priv->sysclk_df[rate]; in spdif_set_sample_rate()
459 if (!fsl_spdif_can_set_clk_rate(spdif_priv, clk)) in spdif_set_sample_rate()
463 ret = clk_set_rate(spdif_priv->txclk[rate], in spdif_set_sample_rate()
474 clk_get_rate(spdif_priv->txclk[rate])); in spdif_set_sample_rate()
487 spdif_priv->txrate[rate], sample_rate); in spdif_set_sample_rate()
496 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0)); in fsl_spdif_startup() local
497 struct platform_device *pdev = spdif_priv->pdev; in fsl_spdif_startup()
498 struct regmap *regmap = spdif_priv->regmap; in fsl_spdif_startup()
504 ret = spdif_softreset(spdif_priv); in fsl_spdif_startup()
538 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0)); in fsl_spdif_shutdown() local
539 struct regmap *regmap = spdif_priv->regmap; in fsl_spdif_shutdown()
558 spdif_intr_status_clear(spdif_priv); in fsl_spdif_shutdown()
569 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0)); in fsl_spdif_hw_params() local
570 struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control; in fsl_spdif_hw_params()
571 struct platform_device *pdev = spdif_priv->pdev; in fsl_spdif_hw_params()
584 spdif_write_channel_status(spdif_priv); in fsl_spdif_hw_params()
587 ret = spdif_set_rx_clksrc(spdif_priv, SPDIF_DEFAULT_GAINSEL, 1); in fsl_spdif_hw_params()
597 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0)); in fsl_spdif_trigger() local
598 struct regmap *regmap = spdif_priv->regmap; in fsl_spdif_trigger()
654 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_pb_get() local
655 struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control; in fsl_spdif_pb_get()
669 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_pb_put() local
670 struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control; in fsl_spdif_pb_put()
677 spdif_write_channel_status(spdif_priv); in fsl_spdif_pb_put()
687 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_capture_get() local
688 struct regmap *regmap = spdif_priv->regmap; in fsl_spdif_capture_get()
719 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_subcode_get() local
720 struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control; in fsl_spdif_subcode_get()
751 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_qget() local
752 struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control; in fsl_spdif_qget()
785 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_rx_vbit_get() local
786 struct regmap *regmap = spdif_priv->regmap; in fsl_spdif_rx_vbit_get()
800 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_tx_vbit_get() local
801 struct regmap *regmap = spdif_priv->regmap; in fsl_spdif_tx_vbit_get()
816 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_tx_vbit_put() local
817 struct regmap *regmap = spdif_priv->regmap; in fsl_spdif_tx_vbit_put()
842 static int spdif_get_rxclk_rate(struct fsl_spdif_priv *spdif_priv, in spdif_get_rxclk_rate() argument
845 struct regmap *regmap = spdif_priv->regmap; in spdif_get_rxclk_rate()
846 struct platform_device *pdev = spdif_priv->pdev; in spdif_get_rxclk_rate()
858 busclk_freq = clk_get_rate(spdif_priv->sysclk); in spdif_get_rxclk_rate()
881 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_rxrate_get() local
884 if (spdif_priv->dpll_locked) in fsl_spdif_rxrate_get()
885 rate = spdif_get_rxclk_rate(spdif_priv, SPDIF_DEFAULT_GAINSEL); in fsl_spdif_rxrate_get()
913 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_usync_get() local
914 struct regmap *regmap = spdif_priv->regmap; in fsl_spdif_usync_get()
932 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_usync_put() local
933 struct regmap *regmap = spdif_priv->regmap; in fsl_spdif_usync_put()
1146 static u32 fsl_spdif_txclk_caldiv(struct fsl_spdif_priv *spdif_priv, in fsl_spdif_txclk_caldiv() argument
1151 bool is_sysclk = clk_is_match(clk, spdif_priv->sysclk); in fsl_spdif_txclk_caldiv()
1175 spdif_priv->txclk_df[index] = txclk_df; in fsl_spdif_txclk_caldiv()
1176 spdif_priv->sysclk_df[index] = sysclk_df; in fsl_spdif_txclk_caldiv()
1177 spdif_priv->txrate[index] = arate; in fsl_spdif_txclk_caldiv()
1186 spdif_priv->txclk_df[index] = txclk_df; in fsl_spdif_txclk_caldiv()
1187 spdif_priv->sysclk_df[index] = sysclk_df; in fsl_spdif_txclk_caldiv()
1188 spdif_priv->txrate[index] = arate; in fsl_spdif_txclk_caldiv()
1196 spdif_priv->txclk_df[index] = txclk_df; in fsl_spdif_txclk_caldiv()
1197 spdif_priv->sysclk_df[index] = sysclk_df; in fsl_spdif_txclk_caldiv()
1198 spdif_priv->txrate[index] = arate; in fsl_spdif_txclk_caldiv()
1207 static int fsl_spdif_probe_txclk(struct fsl_spdif_priv *spdif_priv, in fsl_spdif_probe_txclk() argument
1211 struct platform_device *pdev = spdif_priv->pdev; in fsl_spdif_probe_txclk()
1228 ret = fsl_spdif_txclk_caldiv(spdif_priv, clk, savesub, index, in fsl_spdif_probe_txclk()
1229 fsl_spdif_can_set_clk_rate(spdif_priv, i)); in fsl_spdif_probe_txclk()
1234 spdif_priv->txclk[index] = clk; in fsl_spdif_probe_txclk()
1235 spdif_priv->txclk_src[index] = i; in fsl_spdif_probe_txclk()
1243 spdif_priv->txclk_src[index], rate[index]); in fsl_spdif_probe_txclk()
1245 spdif_priv->txclk_df[index], rate[index]); in fsl_spdif_probe_txclk()
1246 if (clk_is_match(spdif_priv->txclk[index], spdif_priv->sysclk)) in fsl_spdif_probe_txclk()
1248 spdif_priv->sysclk_df[index], rate[index]); in fsl_spdif_probe_txclk()
1250 rate[index], spdif_priv->txrate[index]); in fsl_spdif_probe_txclk()
1257 struct fsl_spdif_priv *spdif_priv; in fsl_spdif_probe() local
1263 spdif_priv = devm_kzalloc(&pdev->dev, sizeof(*spdif_priv), GFP_KERNEL); in fsl_spdif_probe()
1264 if (!spdif_priv) in fsl_spdif_probe()
1267 spdif_priv->pdev = pdev; in fsl_spdif_probe()
1269 spdif_priv->soc = of_device_get_match_data(&pdev->dev); in fsl_spdif_probe()
1270 if (!spdif_priv->soc) { in fsl_spdif_probe()
1276 memcpy(&spdif_priv->cpu_dai_drv, &fsl_spdif_dai, sizeof(fsl_spdif_dai)); in fsl_spdif_probe()
1277 spdif_priv->cpu_dai_drv.name = dev_name(&pdev->dev); in fsl_spdif_probe()
1285 spdif_priv->regmap = devm_regmap_init_mmio_clk(&pdev->dev, in fsl_spdif_probe()
1287 if (IS_ERR(spdif_priv->regmap)) { in fsl_spdif_probe()
1289 return PTR_ERR(spdif_priv->regmap); in fsl_spdif_probe()
1297 dev_name(&pdev->dev), spdif_priv); in fsl_spdif_probe()
1304 spdif_priv->sysclk = devm_clk_get(&pdev->dev, "rxtx5"); in fsl_spdif_probe()
1305 if (IS_ERR(spdif_priv->sysclk)) { in fsl_spdif_probe()
1307 return PTR_ERR(spdif_priv->sysclk); in fsl_spdif_probe()
1311 spdif_priv->coreclk = devm_clk_get(&pdev->dev, "core"); in fsl_spdif_probe()
1312 if (IS_ERR(spdif_priv->coreclk)) { in fsl_spdif_probe()
1314 return PTR_ERR(spdif_priv->coreclk); in fsl_spdif_probe()
1317 spdif_priv->spbaclk = devm_clk_get(&pdev->dev, "spba"); in fsl_spdif_probe()
1318 if (IS_ERR(spdif_priv->spbaclk)) in fsl_spdif_probe()
1322 spdif_priv->rxclk = devm_clk_get(&pdev->dev, "rxtx1"); in fsl_spdif_probe()
1323 if (IS_ERR(spdif_priv->rxclk)) { in fsl_spdif_probe()
1325 return PTR_ERR(spdif_priv->rxclk); in fsl_spdif_probe()
1327 spdif_priv->rxclk_src = DEFAULT_RXCLK_SRC; in fsl_spdif_probe()
1330 ret = fsl_spdif_probe_txclk(spdif_priv, i); in fsl_spdif_probe()
1336 ctrl = &spdif_priv->fsl_spdif_control; in fsl_spdif_probe()
1347 spdif_priv->dpll_locked = false; in fsl_spdif_probe()
1349 spdif_priv->dma_params_tx.maxburst = FSL_SPDIF_TXFIFO_WML; in fsl_spdif_probe()
1350 spdif_priv->dma_params_rx.maxburst = FSL_SPDIF_RXFIFO_WML; in fsl_spdif_probe()
1351 spdif_priv->dma_params_tx.addr = res->start + REG_SPDIF_STL; in fsl_spdif_probe()
1352 spdif_priv->dma_params_rx.addr = res->start + REG_SPDIF_SRL; in fsl_spdif_probe()
1355 dev_set_drvdata(&pdev->dev, spdif_priv); in fsl_spdif_probe()
1357 regcache_cache_only(spdif_priv->regmap, true); in fsl_spdif_probe()
1360 &spdif_priv->cpu_dai_drv, 1); in fsl_spdif_probe()
1389 struct fsl_spdif_priv *spdif_priv = dev_get_drvdata(dev); in fsl_spdif_runtime_suspend() local
1393 regmap_update_bits(spdif_priv->regmap, REG_SPDIF_SIE, 0xffffff, 0); in fsl_spdif_runtime_suspend()
1395 regmap_read(spdif_priv->regmap, REG_SPDIF_SRPC, in fsl_spdif_runtime_suspend()
1396 &spdif_priv->regcache_srpc); in fsl_spdif_runtime_suspend()
1397 regcache_cache_only(spdif_priv->regmap, true); in fsl_spdif_runtime_suspend()
1399 clk_disable_unprepare(spdif_priv->rxclk); in fsl_spdif_runtime_suspend()
1402 clk_disable_unprepare(spdif_priv->txclk[i]); in fsl_spdif_runtime_suspend()
1404 if (!IS_ERR(spdif_priv->spbaclk)) in fsl_spdif_runtime_suspend()
1405 clk_disable_unprepare(spdif_priv->spbaclk); in fsl_spdif_runtime_suspend()
1406 clk_disable_unprepare(spdif_priv->coreclk); in fsl_spdif_runtime_suspend()
1413 struct fsl_spdif_priv *spdif_priv = dev_get_drvdata(dev); in fsl_spdif_runtime_resume() local
1417 ret = clk_prepare_enable(spdif_priv->coreclk); in fsl_spdif_runtime_resume()
1423 if (!IS_ERR(spdif_priv->spbaclk)) { in fsl_spdif_runtime_resume()
1424 ret = clk_prepare_enable(spdif_priv->spbaclk); in fsl_spdif_runtime_resume()
1432 ret = clk_prepare_enable(spdif_priv->txclk[i]); in fsl_spdif_runtime_resume()
1437 ret = clk_prepare_enable(spdif_priv->rxclk); in fsl_spdif_runtime_resume()
1441 regcache_cache_only(spdif_priv->regmap, false); in fsl_spdif_runtime_resume()
1442 regcache_mark_dirty(spdif_priv->regmap); in fsl_spdif_runtime_resume()
1444 regmap_update_bits(spdif_priv->regmap, REG_SPDIF_SRPC, in fsl_spdif_runtime_resume()
1446 spdif_priv->regcache_srpc); in fsl_spdif_runtime_resume()
1448 ret = regcache_sync(spdif_priv->regmap); in fsl_spdif_runtime_resume()
1455 clk_disable_unprepare(spdif_priv->rxclk); in fsl_spdif_runtime_resume()
1458 clk_disable_unprepare(spdif_priv->txclk[i]); in fsl_spdif_runtime_resume()
1459 if (!IS_ERR(spdif_priv->spbaclk)) in fsl_spdif_runtime_resume()
1460 clk_disable_unprepare(spdif_priv->spbaclk); in fsl_spdif_runtime_resume()
1462 clk_disable_unprepare(spdif_priv->coreclk); in fsl_spdif_runtime_resume()