Lines Matching refs:spdif_priv

222 static void spdif_irq_dpll_lock(struct fsl_spdif_priv *spdif_priv)  in spdif_irq_dpll_lock()  argument
224 struct regmap *regmap = spdif_priv->regmap; in spdif_irq_dpll_lock()
225 struct platform_device *pdev = spdif_priv->pdev; in spdif_irq_dpll_lock()
234 spdif_priv->dpll_locked = locked ? true : false; in spdif_irq_dpll_lock()
236 if (spdif_priv->snd_card && spdif_priv->rxrate_kcontrol) { in spdif_irq_dpll_lock()
237 snd_ctl_notify(spdif_priv->snd_card, in spdif_irq_dpll_lock()
239 &spdif_priv->rxrate_kcontrol->id); in spdif_irq_dpll_lock()
244 static void spdif_irq_sym_error(struct fsl_spdif_priv *spdif_priv) in spdif_irq_sym_error() argument
246 struct regmap *regmap = spdif_priv->regmap; in spdif_irq_sym_error()
247 struct platform_device *pdev = spdif_priv->pdev; in spdif_irq_sym_error()
252 if (!spdif_priv->dpll_locked) in spdif_irq_sym_error()
257 static void spdif_irq_uqrx_full(struct fsl_spdif_priv *spdif_priv, char name) in spdif_irq_uqrx_full() argument
259 struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control; in spdif_irq_uqrx_full()
260 struct regmap *regmap = spdif_priv->regmap; in spdif_irq_uqrx_full()
261 struct platform_device *pdev = spdif_priv->pdev; in spdif_irq_uqrx_full()
296 static void spdif_irq_uq_sync(struct fsl_spdif_priv *spdif_priv) in spdif_irq_uq_sync() argument
298 struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control; in spdif_irq_uq_sync()
299 struct platform_device *pdev = spdif_priv->pdev; in spdif_irq_uq_sync()
312 static void spdif_irq_uq_err(struct fsl_spdif_priv *spdif_priv) in spdif_irq_uq_err() argument
314 struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control; in spdif_irq_uq_err()
315 struct regmap *regmap = spdif_priv->regmap; in spdif_irq_uq_err()
316 struct platform_device *pdev = spdif_priv->pdev; in spdif_irq_uq_err()
332 static u32 spdif_intr_status_clear(struct fsl_spdif_priv *spdif_priv) in spdif_intr_status_clear() argument
334 struct regmap *regmap = spdif_priv->regmap; in spdif_intr_status_clear()
347 struct fsl_spdif_priv *spdif_priv = (struct fsl_spdif_priv *)devid; in spdif_isr() local
348 struct platform_device *pdev = spdif_priv->pdev; in spdif_isr()
351 sis = spdif_intr_status_clear(spdif_priv); in spdif_isr()
354 spdif_irq_dpll_lock(spdif_priv); in spdif_isr()
369 spdif_irq_sym_error(spdif_priv); in spdif_isr()
375 spdif_irq_uqrx_full(spdif_priv, 'U'); in spdif_isr()
381 spdif_irq_uqrx_full(spdif_priv, 'Q'); in spdif_isr()
387 spdif_irq_uq_sync(spdif_priv); in spdif_isr()
390 spdif_irq_uq_err(spdif_priv); in spdif_isr()
399 spdif_irq_dpll_lock(spdif_priv); in spdif_isr()
412 static int spdif_softreset(struct fsl_spdif_priv *spdif_priv) in spdif_softreset() argument
414 struct regmap *regmap = spdif_priv->regmap; in spdif_softreset()
446 static void spdif_write_channel_status(struct fsl_spdif_priv *spdif_priv) in spdif_write_channel_status() argument
448 struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control; in spdif_write_channel_status()
449 struct regmap *regmap = spdif_priv->regmap; in spdif_write_channel_status()
450 struct platform_device *pdev = spdif_priv->pdev; in spdif_write_channel_status()
465 if (spdif_priv->soc->cchannel_192b) { in spdif_write_channel_status()
484 static int spdif_set_rx_clksrc(struct fsl_spdif_priv *spdif_priv, in spdif_set_rx_clksrc() argument
487 struct regmap *regmap = spdif_priv->regmap; in spdif_set_rx_clksrc()
488 u8 clksrc = spdif_priv->rxclk_src; in spdif_set_rx_clksrc()
500 static int fsl_spdif_probe_txclk(struct fsl_spdif_priv *spdif_priv, enum spdif_txrate index);
506 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0)); in spdif_set_sample_rate() local
507 struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control; in spdif_set_sample_rate()
508 struct regmap *regmap = spdif_priv->regmap; in spdif_set_sample_rate()
509 struct platform_device *pdev = spdif_priv->pdev; in spdif_set_sample_rate()
554 ret = fsl_spdif_probe_txclk(spdif_priv, rate); in spdif_set_sample_rate()
558 clk = spdif_priv->txclk_src[rate]; in spdif_set_sample_rate()
564 txclk_df = spdif_priv->txclk_df[rate]; in spdif_set_sample_rate()
570 sysclk_df = spdif_priv->sysclk_df[rate]; in spdif_set_sample_rate()
572 if (!fsl_spdif_can_set_clk_rate(spdif_priv, clk)) in spdif_set_sample_rate()
576 ret = clk_set_rate(spdif_priv->txclk[clk], in spdif_set_sample_rate()
587 clk_get_rate(spdif_priv->txclk[clk])); in spdif_set_sample_rate()
600 spdif_priv->txrate[rate], sample_rate); in spdif_set_sample_rate()
609 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0)); in fsl_spdif_startup() local
610 struct platform_device *pdev = spdif_priv->pdev; in fsl_spdif_startup()
611 struct regmap *regmap = spdif_priv->regmap; in fsl_spdif_startup()
617 ret = spdif_softreset(spdif_priv); in fsl_spdif_startup()
651 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0)); in fsl_spdif_shutdown() local
652 struct regmap *regmap = spdif_priv->regmap; in fsl_spdif_shutdown()
671 spdif_intr_status_clear(spdif_priv); in fsl_spdif_shutdown()
677 static int spdif_reparent_rootclk(struct fsl_spdif_priv *spdif_priv, unsigned int sample_rate) in spdif_reparent_rootclk() argument
679 struct platform_device *pdev = spdif_priv->pdev; in spdif_reparent_rootclk()
684 if (!fsl_spdif_can_set_clk_rate(spdif_priv, STC_TXCLK_SPDIF_ROOT)) in spdif_reparent_rootclk()
688 clk = spdif_priv->txclk[STC_TXCLK_SPDIF_ROOT]; in spdif_reparent_rootclk()
692 fsl_asoc_reparent_pll_clocks(&pdev->dev, clk, spdif_priv->pll8k_clk, in spdif_reparent_rootclk()
693 spdif_priv->pll11k_clk, sample_rate); in spdif_reparent_rootclk()
705 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0)); in fsl_spdif_hw_params() local
706 struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control; in fsl_spdif_hw_params()
707 struct platform_device *pdev = spdif_priv->pdev; in fsl_spdif_hw_params()
712 ret = spdif_reparent_rootclk(spdif_priv, sample_rate); in fsl_spdif_hw_params()
727 spdif_write_channel_status(spdif_priv); in fsl_spdif_hw_params()
730 ret = spdif_set_rx_clksrc(spdif_priv, SPDIF_DEFAULT_GAINSEL, 1); in fsl_spdif_hw_params()
740 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0)); in fsl_spdif_trigger() local
741 struct regmap *regmap = spdif_priv->regmap; in fsl_spdif_trigger()
791 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_pb_get() local
792 struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control; in fsl_spdif_pb_get()
806 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_pb_put() local
807 struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control; in fsl_spdif_pb_put()
814 spdif_write_channel_status(spdif_priv); in fsl_spdif_pb_put()
824 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_capture_get() local
825 struct regmap *regmap = spdif_priv->regmap; in fsl_spdif_capture_get()
856 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_subcode_get() local
857 struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control; in fsl_spdif_subcode_get()
888 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_qget() local
889 struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control; in fsl_spdif_qget()
910 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_rx_vbit_get() local
911 struct regmap *regmap = spdif_priv->regmap; in fsl_spdif_rx_vbit_get()
925 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_tx_vbit_get() local
926 struct regmap *regmap = spdif_priv->regmap; in fsl_spdif_tx_vbit_get()
941 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_tx_vbit_put() local
942 struct regmap *regmap = spdif_priv->regmap; in fsl_spdif_tx_vbit_put()
954 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_rx_rcm_get() local
955 struct regmap *regmap = spdif_priv->regmap; in fsl_spdif_rx_rcm_get()
969 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_rx_rcm_put() local
970 struct regmap *regmap = spdif_priv->regmap; in fsl_spdif_rx_rcm_put()
1063 static int spdif_get_rxclk_rate(struct fsl_spdif_priv *spdif_priv, in spdif_get_rxclk_rate() argument
1066 struct regmap *regmap = spdif_priv->regmap; in spdif_get_rxclk_rate()
1067 struct platform_device *pdev = spdif_priv->pdev; in spdif_get_rxclk_rate()
1079 busclk_freq = clk_get_rate(spdif_priv->sysclk); in spdif_get_rxclk_rate()
1102 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_rxrate_get() local
1105 if (spdif_priv->dpll_locked) in fsl_spdif_rxrate_get()
1106 rate = spdif_get_rxclk_rate(spdif_priv, SPDIF_DEFAULT_GAINSEL); in fsl_spdif_rxrate_get()
1122 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_usync_get() local
1123 struct regmap *regmap = spdif_priv->regmap; in fsl_spdif_usync_get()
1141 struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai); in fsl_spdif_usync_put() local
1142 struct regmap *regmap = spdif_priv->regmap; in fsl_spdif_usync_put()
1426 static u32 fsl_spdif_txclk_caldiv(struct fsl_spdif_priv *spdif_priv, in fsl_spdif_txclk_caldiv() argument
1432 bool is_sysclk = clk_is_match(clk, spdif_priv->sysclk); in fsl_spdif_txclk_caldiv()
1456 spdif_priv->txclk_df[index] = txclk_df; in fsl_spdif_txclk_caldiv()
1457 spdif_priv->sysclk_df[index] = sysclk_df; in fsl_spdif_txclk_caldiv()
1458 spdif_priv->txrate[index] = arate; in fsl_spdif_txclk_caldiv()
1467 spdif_priv->txclk_df[index] = txclk_df; in fsl_spdif_txclk_caldiv()
1468 spdif_priv->sysclk_df[index] = sysclk_df; in fsl_spdif_txclk_caldiv()
1469 spdif_priv->txrate[index] = arate; in fsl_spdif_txclk_caldiv()
1477 spdif_priv->txclk_df[index] = txclk_df; in fsl_spdif_txclk_caldiv()
1478 spdif_priv->sysclk_df[index] = sysclk_df; in fsl_spdif_txclk_caldiv()
1479 spdif_priv->txrate[index] = arate; in fsl_spdif_txclk_caldiv()
1488 static int fsl_spdif_probe_txclk(struct fsl_spdif_priv *spdif_priv, in fsl_spdif_probe_txclk() argument
1493 struct platform_device *pdev = spdif_priv->pdev; in fsl_spdif_probe_txclk()
1500 clk = spdif_priv->txclk[i]; in fsl_spdif_probe_txclk()
1508 ret = fsl_spdif_txclk_caldiv(spdif_priv, clk, savesub, index, in fsl_spdif_probe_txclk()
1509 fsl_spdif_can_set_clk_rate(spdif_priv, i)); in fsl_spdif_probe_txclk()
1514 spdif_priv->txclk_src[index] = i; in fsl_spdif_probe_txclk()
1522 spdif_priv->txclk_src[index], rate[index]); in fsl_spdif_probe_txclk()
1524 spdif_priv->txclk_df[index], rate[index]); in fsl_spdif_probe_txclk()
1525 if (clk_is_match(spdif_priv->txclk[spdif_priv->txclk_src[index]], spdif_priv->sysclk)) in fsl_spdif_probe_txclk()
1527 spdif_priv->sysclk_df[index], rate[index]); in fsl_spdif_probe_txclk()
1529 rate[index], spdif_priv->txrate[index]); in fsl_spdif_probe_txclk()
1536 struct fsl_spdif_priv *spdif_priv; in fsl_spdif_probe() local
1543 spdif_priv = devm_kzalloc(&pdev->dev, sizeof(*spdif_priv), GFP_KERNEL); in fsl_spdif_probe()
1544 if (!spdif_priv) in fsl_spdif_probe()
1547 spdif_priv->pdev = pdev; in fsl_spdif_probe()
1549 spdif_priv->soc = of_device_get_match_data(&pdev->dev); in fsl_spdif_probe()
1552 memcpy(&spdif_priv->cpu_dai_drv, &fsl_spdif_dai, sizeof(fsl_spdif_dai)); in fsl_spdif_probe()
1553 spdif_priv->cpu_dai_drv.name = dev_name(&pdev->dev); in fsl_spdif_probe()
1554 spdif_priv->cpu_dai_drv.playback.formats = in fsl_spdif_probe()
1555 spdif_priv->soc->tx_formats; in fsl_spdif_probe()
1562 spdif_priv->regmap = devm_regmap_init_mmio(&pdev->dev, regs, &fsl_spdif_regmap_config); in fsl_spdif_probe()
1563 if (IS_ERR(spdif_priv->regmap)) { in fsl_spdif_probe()
1565 return PTR_ERR(spdif_priv->regmap); in fsl_spdif_probe()
1568 for (i = 0; i < spdif_priv->soc->interrupts; i++) { in fsl_spdif_probe()
1574 dev_name(&pdev->dev), spdif_priv); in fsl_spdif_probe()
1583 spdif_priv->txclk[i] = devm_clk_get(&pdev->dev, tmp); in fsl_spdif_probe()
1584 if (IS_ERR(spdif_priv->txclk[i])) { in fsl_spdif_probe()
1586 return PTR_ERR(spdif_priv->txclk[i]); in fsl_spdif_probe()
1591 spdif_priv->sysclk = spdif_priv->txclk[5]; in fsl_spdif_probe()
1592 if (IS_ERR(spdif_priv->sysclk)) { in fsl_spdif_probe()
1594 return PTR_ERR(spdif_priv->sysclk); in fsl_spdif_probe()
1598 spdif_priv->coreclk = devm_clk_get(&pdev->dev, "core"); in fsl_spdif_probe()
1599 if (IS_ERR(spdif_priv->coreclk)) { in fsl_spdif_probe()
1601 return PTR_ERR(spdif_priv->coreclk); in fsl_spdif_probe()
1604 spdif_priv->spbaclk = devm_clk_get(&pdev->dev, "spba"); in fsl_spdif_probe()
1605 if (IS_ERR(spdif_priv->spbaclk)) in fsl_spdif_probe()
1609 spdif_priv->rxclk = spdif_priv->txclk[1]; in fsl_spdif_probe()
1610 if (IS_ERR(spdif_priv->rxclk)) { in fsl_spdif_probe()
1612 return PTR_ERR(spdif_priv->rxclk); in fsl_spdif_probe()
1614 spdif_priv->rxclk_src = DEFAULT_RXCLK_SRC; in fsl_spdif_probe()
1616 fsl_asoc_get_pll_clocks(&pdev->dev, &spdif_priv->pll8k_clk, in fsl_spdif_probe()
1617 &spdif_priv->pll11k_clk); in fsl_spdif_probe()
1620 ctrl = &spdif_priv->fsl_spdif_control; in fsl_spdif_probe()
1631 spdif_priv->dpll_locked = false; in fsl_spdif_probe()
1633 spdif_priv->dma_params_tx.maxburst = spdif_priv->soc->tx_burst; in fsl_spdif_probe()
1634 spdif_priv->dma_params_rx.maxburst = spdif_priv->soc->rx_burst; in fsl_spdif_probe()
1635 spdif_priv->dma_params_tx.addr = res->start + REG_SPDIF_STL; in fsl_spdif_probe()
1636 spdif_priv->dma_params_rx.addr = res->start + REG_SPDIF_SRL; in fsl_spdif_probe()
1639 dev_set_drvdata(&pdev->dev, spdif_priv); in fsl_spdif_probe()
1641 regcache_cache_only(spdif_priv->regmap, true); in fsl_spdif_probe()
1654 &spdif_priv->cpu_dai_drv, 1); in fsl_spdif_probe()
1675 struct fsl_spdif_priv *spdif_priv = dev_get_drvdata(dev); in fsl_spdif_runtime_suspend() local
1679 regmap_update_bits(spdif_priv->regmap, REG_SPDIF_SIE, 0xffffff, 0); in fsl_spdif_runtime_suspend()
1681 regmap_read(spdif_priv->regmap, REG_SPDIF_SRPC, in fsl_spdif_runtime_suspend()
1682 &spdif_priv->regcache_srpc); in fsl_spdif_runtime_suspend()
1683 regcache_cache_only(spdif_priv->regmap, true); in fsl_spdif_runtime_suspend()
1686 clk_disable_unprepare(spdif_priv->txclk[i]); in fsl_spdif_runtime_suspend()
1688 if (!IS_ERR(spdif_priv->spbaclk)) in fsl_spdif_runtime_suspend()
1689 clk_disable_unprepare(spdif_priv->spbaclk); in fsl_spdif_runtime_suspend()
1690 clk_disable_unprepare(spdif_priv->coreclk); in fsl_spdif_runtime_suspend()
1697 struct fsl_spdif_priv *spdif_priv = dev_get_drvdata(dev); in fsl_spdif_runtime_resume() local
1701 ret = clk_prepare_enable(spdif_priv->coreclk); in fsl_spdif_runtime_resume()
1707 if (!IS_ERR(spdif_priv->spbaclk)) { in fsl_spdif_runtime_resume()
1708 ret = clk_prepare_enable(spdif_priv->spbaclk); in fsl_spdif_runtime_resume()
1716 ret = clk_prepare_enable(spdif_priv->txclk[i]); in fsl_spdif_runtime_resume()
1721 regcache_cache_only(spdif_priv->regmap, false); in fsl_spdif_runtime_resume()
1722 regcache_mark_dirty(spdif_priv->regmap); in fsl_spdif_runtime_resume()
1724 regmap_update_bits(spdif_priv->regmap, REG_SPDIF_SRPC, in fsl_spdif_runtime_resume()
1726 spdif_priv->regcache_srpc); in fsl_spdif_runtime_resume()
1728 ret = regcache_sync(spdif_priv->regmap); in fsl_spdif_runtime_resume()
1736 clk_disable_unprepare(spdif_priv->txclk[i]); in fsl_spdif_runtime_resume()
1737 if (!IS_ERR(spdif_priv->spbaclk)) in fsl_spdif_runtime_resume()
1738 clk_disable_unprepare(spdif_priv->spbaclk); in fsl_spdif_runtime_resume()
1740 clk_disable_unprepare(spdif_priv->coreclk); in fsl_spdif_runtime_resume()