Lines Matching refs:ssi_private

316 static bool fsl_ssi_is_ac97(struct fsl_ssi_private *ssi_private)  in fsl_ssi_is_ac97()  argument
318 return (ssi_private->dai_fmt & SND_SOC_DAIFMT_FORMAT_MASK) == in fsl_ssi_is_ac97()
322 static bool fsl_ssi_is_i2s_master(struct fsl_ssi_private *ssi_private) in fsl_ssi_is_i2s_master() argument
324 return (ssi_private->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) == in fsl_ssi_is_i2s_master()
328 static bool fsl_ssi_is_i2s_cbm_cfs(struct fsl_ssi_private *ssi_private) in fsl_ssi_is_i2s_cbm_cfs() argument
330 return (ssi_private->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) == in fsl_ssi_is_i2s_cbm_cfs()
347 struct fsl_ssi_private *ssi_private = dev_id; in fsl_ssi_isr() local
348 struct regmap *regs = ssi_private->regs; in fsl_ssi_isr()
358 sisr2 = sisr & ssi_private->soc->sisr_write_mask; in fsl_ssi_isr()
363 fsl_ssi_dbg_isr(&ssi_private->dbg_stats, sisr); in fsl_ssi_isr()
371 static void fsl_ssi_rxtx_config(struct fsl_ssi_private *ssi_private, in fsl_ssi_rxtx_config() argument
374 struct regmap *regs = ssi_private->regs; in fsl_ssi_rxtx_config()
375 struct fsl_ssi_rxtx_reg_val *vals = &ssi_private->rxtx_reg_val; in fsl_ssi_rxtx_config()
421 static void fsl_ssi_config(struct fsl_ssi_private *ssi_private, bool enable, in fsl_ssi_config() argument
424 struct regmap *regs = ssi_private->regs; in fsl_ssi_config()
442 if (&ssi_private->rxtx_reg_val.rx == vals) in fsl_ssi_config()
443 avals = &ssi_private->rxtx_reg_val.tx; in fsl_ssi_config()
445 avals = &ssi_private->rxtx_reg_val.rx; in fsl_ssi_config()
459 if (ssi_private->soc->offline_config) { in fsl_ssi_config()
462 fsl_ssi_rxtx_config(ssi_private, enable); in fsl_ssi_config()
509 static void fsl_ssi_rx_config(struct fsl_ssi_private *ssi_private, bool enable) in fsl_ssi_rx_config() argument
511 fsl_ssi_config(ssi_private, enable, &ssi_private->rxtx_reg_val.rx); in fsl_ssi_rx_config()
514 static void fsl_ssi_tx_config(struct fsl_ssi_private *ssi_private, bool enable) in fsl_ssi_tx_config() argument
516 fsl_ssi_config(ssi_private, enable, &ssi_private->rxtx_reg_val.tx); in fsl_ssi_tx_config()
524 static void fsl_ssi_setup_reg_vals(struct fsl_ssi_private *ssi_private) in fsl_ssi_setup_reg_vals() argument
526 struct fsl_ssi_rxtx_reg_val *reg = &ssi_private->rxtx_reg_val; in fsl_ssi_setup_reg_vals()
535 if (!fsl_ssi_is_ac97(ssi_private)) { in fsl_ssi_setup_reg_vals()
542 if (ssi_private->use_dma) { in fsl_ssi_setup_reg_vals()
554 static void fsl_ssi_setup_ac97(struct fsl_ssi_private *ssi_private) in fsl_ssi_setup_ac97() argument
556 struct regmap *regs = ssi_private->regs; in fsl_ssi_setup_ac97()
597 struct fsl_ssi_private *ssi_private = in fsl_ssi_startup() local
601 ret = clk_prepare_enable(ssi_private->clk); in fsl_ssi_startup()
610 if (ssi_private->use_dual_fifo) in fsl_ssi_startup()
625 struct fsl_ssi_private *ssi_private = in fsl_ssi_shutdown() local
628 clk_disable_unprepare(ssi_private->clk); in fsl_ssi_shutdown()
645 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai); in fsl_ssi_set_bclk() local
646 struct regmap *regs = ssi_private->regs; in fsl_ssi_set_bclk()
647 int synchronous = ssi_private->cpu_dai_drv.symmetric_rates, ret; in fsl_ssi_set_bclk()
655 if (ssi_private->bitclk_freq) in fsl_ssi_set_bclk()
656 freq = ssi_private->bitclk_freq; in fsl_ssi_set_bclk()
661 if (IS_ERR(ssi_private->baudclk)) in fsl_ssi_set_bclk()
664 baudclk_is_used = ssi_private->baudclk_streams & ~(BIT(substream->stream)); in fsl_ssi_set_bclk()
676 clkrate = clk_get_rate(ssi_private->baudclk); in fsl_ssi_set_bclk()
678 clkrate = clk_round_rate(ssi_private->baudclk, tmprate); in fsl_ssi_set_bclk()
684 if (clkrate * 5 > clk_get_rate(ssi_private->clk)) in fsl_ssi_set_bclk()
731 ret = clk_set_rate(ssi_private->baudclk, baudrate); in fsl_ssi_set_bclk()
744 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai); in fsl_ssi_set_dai_sysclk() local
746 ssi_private->bitclk_freq = freq; in fsl_ssi_set_dai_sysclk()
767 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai); in fsl_ssi_hw_params() local
768 struct regmap *regs = ssi_private->regs; in fsl_ssi_hw_params()
784 if (enabled && ssi_private->cpu_dai_drv.symmetric_rates) in fsl_ssi_hw_params()
787 if (fsl_ssi_is_i2s_master(ssi_private)) { in fsl_ssi_hw_params()
793 if (!(ssi_private->baudclk_streams & BIT(substream->stream))) { in fsl_ssi_hw_params()
794 ret = clk_prepare_enable(ssi_private->baudclk); in fsl_ssi_hw_params()
798 ssi_private->baudclk_streams |= BIT(substream->stream); in fsl_ssi_hw_params()
802 if (!fsl_ssi_is_ac97(ssi_private)) { in fsl_ssi_hw_params()
808 if (fsl_ssi_is_i2s_cbm_cfs(ssi_private) && sample_size == 16) in fsl_ssi_hw_params()
812 i2smode = ssi_private->i2s_mode; in fsl_ssi_hw_params()
831 ssi_private->cpu_dai_drv.symmetric_rates) in fsl_ssi_hw_params()
845 struct fsl_ssi_private *ssi_private = in fsl_ssi_hw_free() local
848 if (fsl_ssi_is_i2s_master(ssi_private) && in fsl_ssi_hw_free()
849 ssi_private->baudclk_streams & BIT(substream->stream)) { in fsl_ssi_hw_free()
850 clk_disable_unprepare(ssi_private->baudclk); in fsl_ssi_hw_free()
851 ssi_private->baudclk_streams &= ~BIT(substream->stream); in fsl_ssi_hw_free()
858 struct fsl_ssi_private *ssi_private, in _fsl_ssi_set_dai_fmt() argument
861 struct regmap *regs = ssi_private->regs; in _fsl_ssi_set_dai_fmt()
865 ssi_private->dai_fmt = fmt; in _fsl_ssi_set_dai_fmt()
867 if (fsl_ssi_is_i2s_master(ssi_private) && IS_ERR(ssi_private->baudclk)) { in _fsl_ssi_set_dai_fmt()
872 fsl_ssi_setup_reg_vals(ssi_private); in _fsl_ssi_set_dai_fmt()
886 ssi_private->i2s_mode = CCSR_SSI_SCR_NET; in _fsl_ssi_set_dai_fmt()
892 ssi_private->i2s_mode |= CCSR_SSI_SCR_I2S_MODE_MASTER; in _fsl_ssi_set_dai_fmt()
901 ssi_private->i2s_mode |= CCSR_SSI_SCR_I2S_MODE_SLAVE; in _fsl_ssi_set_dai_fmt()
926 ssi_private->i2s_mode |= CCSR_SSI_SCR_I2S_MODE_NORMAL; in _fsl_ssi_set_dai_fmt()
931 scr |= ssi_private->i2s_mode; in _fsl_ssi_set_dai_fmt()
970 if (!fsl_ssi_is_ac97(ssi_private)) in _fsl_ssi_set_dai_fmt()
977 if (ssi_private->cpu_dai_drv.symmetric_rates in _fsl_ssi_set_dai_fmt()
978 || fsl_ssi_is_ac97(ssi_private)) { in _fsl_ssi_set_dai_fmt()
999 if (ssi_private->use_dma) in _fsl_ssi_set_dai_fmt()
1000 wm = ssi_private->fifo_depth - 2; in _fsl_ssi_set_dai_fmt()
1002 wm = ssi_private->fifo_depth; in _fsl_ssi_set_dai_fmt()
1008 if (ssi_private->use_dual_fifo) { in _fsl_ssi_set_dai_fmt()
1018 fsl_ssi_setup_ac97(ssi_private); in _fsl_ssi_set_dai_fmt()
1029 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai); in fsl_ssi_set_dai_fmt() local
1031 return _fsl_ssi_set_dai_fmt(cpu_dai->dev, ssi_private, fmt); in fsl_ssi_set_dai_fmt()
1042 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai); in fsl_ssi_set_dai_tdm_slot() local
1043 struct regmap *regs = ssi_private->regs; in fsl_ssi_set_dai_tdm_slot()
1088 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(rtd->cpu_dai); in fsl_ssi_trigger() local
1089 struct regmap *regs = ssi_private->regs; in fsl_ssi_trigger()
1096 fsl_ssi_tx_config(ssi_private, true); in fsl_ssi_trigger()
1098 fsl_ssi_rx_config(ssi_private, true); in fsl_ssi_trigger()
1105 fsl_ssi_tx_config(ssi_private, false); in fsl_ssi_trigger()
1107 fsl_ssi_rx_config(ssi_private, false); in fsl_ssi_trigger()
1114 if (fsl_ssi_is_ac97(ssi_private)) { in fsl_ssi_trigger()
1126 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(dai); in fsl_ssi_dai_probe() local
1128 if (ssi_private->soc->imx && ssi_private->use_dma) { in fsl_ssi_dai_probe()
1129 dai->playback_dma_data = &ssi_private->dma_params_tx; in fsl_ssi_dai_probe()
1130 dai->capture_dma_data = &ssi_private->dma_params_rx; in fsl_ssi_dai_probe()
1278 struct fsl_ssi_private *ssi_private, void __iomem *iomem) in fsl_ssi_imx_probe() argument
1284 if (ssi_private->has_ipg_clk_name) in fsl_ssi_imx_probe()
1285 ssi_private->clk = devm_clk_get(&pdev->dev, "ipg"); in fsl_ssi_imx_probe()
1287 ssi_private->clk = devm_clk_get(&pdev->dev, NULL); in fsl_ssi_imx_probe()
1288 if (IS_ERR(ssi_private->clk)) { in fsl_ssi_imx_probe()
1289 ret = PTR_ERR(ssi_private->clk); in fsl_ssi_imx_probe()
1294 if (!ssi_private->has_ipg_clk_name) { in fsl_ssi_imx_probe()
1295 ret = clk_prepare_enable(ssi_private->clk); in fsl_ssi_imx_probe()
1305 ssi_private->baudclk = devm_clk_get(&pdev->dev, "baud"); in fsl_ssi_imx_probe()
1306 if (IS_ERR(ssi_private->baudclk)) in fsl_ssi_imx_probe()
1308 PTR_ERR(ssi_private->baudclk)); in fsl_ssi_imx_probe()
1314 ssi_private->dma_params_tx.maxburst = ssi_private->fifo_depth - 2; in fsl_ssi_imx_probe()
1315 ssi_private->dma_params_rx.maxburst = ssi_private->fifo_depth - 2; in fsl_ssi_imx_probe()
1316 ssi_private->dma_params_tx.addr = ssi_private->ssi_phys + CCSR_SSI_STX0; in fsl_ssi_imx_probe()
1317 ssi_private->dma_params_rx.addr = ssi_private->ssi_phys + CCSR_SSI_SRX0; in fsl_ssi_imx_probe()
1320 if (ssi_private->use_dma && !ret && dmas[2] == IMX_DMATYPE_SSI_DUAL) { in fsl_ssi_imx_probe()
1321 ssi_private->use_dual_fifo = true; in fsl_ssi_imx_probe()
1325 ssi_private->dma_params_tx.maxburst &= ~0x1; in fsl_ssi_imx_probe()
1326 ssi_private->dma_params_rx.maxburst &= ~0x1; in fsl_ssi_imx_probe()
1329 if (!ssi_private->use_dma) { in fsl_ssi_imx_probe()
1338 ssi_private->fiq_params.irq = ssi_private->irq; in fsl_ssi_imx_probe()
1339 ssi_private->fiq_params.base = iomem; in fsl_ssi_imx_probe()
1340 ssi_private->fiq_params.dma_params_rx = in fsl_ssi_imx_probe()
1341 &ssi_private->dma_params_rx; in fsl_ssi_imx_probe()
1342 ssi_private->fiq_params.dma_params_tx = in fsl_ssi_imx_probe()
1343 &ssi_private->dma_params_tx; in fsl_ssi_imx_probe()
1345 ret = imx_pcm_fiq_init(pdev, &ssi_private->fiq_params); in fsl_ssi_imx_probe()
1358 if (!ssi_private->has_ipg_clk_name) in fsl_ssi_imx_probe()
1359 clk_disable_unprepare(ssi_private->clk); in fsl_ssi_imx_probe()
1364 struct fsl_ssi_private *ssi_private) in fsl_ssi_imx_clean() argument
1366 if (!ssi_private->use_dma) in fsl_ssi_imx_clean()
1368 if (!ssi_private->has_ipg_clk_name) in fsl_ssi_imx_clean()
1369 clk_disable_unprepare(ssi_private->clk); in fsl_ssi_imx_clean()
1374 struct fsl_ssi_private *ssi_private; in fsl_ssi_probe() local
1388 ssi_private = devm_kzalloc(&pdev->dev, sizeof(*ssi_private), in fsl_ssi_probe()
1390 if (!ssi_private) { in fsl_ssi_probe()
1395 ssi_private->soc = of_id->data; in fsl_ssi_probe()
1400 ssi_private->dai_fmt = SND_SOC_DAIFMT_AC97; in fsl_ssi_probe()
1403 ssi_private->use_dma = !of_property_read_bool(np, in fsl_ssi_probe()
1406 if (fsl_ssi_is_ac97(ssi_private)) { in fsl_ssi_probe()
1407 memcpy(&ssi_private->cpu_dai_drv, &fsl_ssi_ac97_dai, in fsl_ssi_probe()
1410 fsl_ac97_data = ssi_private; in fsl_ssi_probe()
1419 memcpy(&ssi_private->cpu_dai_drv, &fsl_ssi_dai_template, in fsl_ssi_probe()
1422 ssi_private->cpu_dai_drv.name = dev_name(&pdev->dev); in fsl_ssi_probe()
1428 ssi_private->ssi_phys = res->start; in fsl_ssi_probe()
1432 ssi_private->has_ipg_clk_name = false; in fsl_ssi_probe()
1433 ssi_private->regs = devm_regmap_init_mmio(&pdev->dev, iomem, in fsl_ssi_probe()
1436 ssi_private->has_ipg_clk_name = true; in fsl_ssi_probe()
1437 ssi_private->regs = devm_regmap_init_mmio_clk(&pdev->dev, in fsl_ssi_probe()
1440 if (IS_ERR(ssi_private->regs)) { in fsl_ssi_probe()
1442 return PTR_ERR(ssi_private->regs); in fsl_ssi_probe()
1445 ssi_private->irq = platform_get_irq(pdev, 0); in fsl_ssi_probe()
1446 if (ssi_private->irq < 0) { in fsl_ssi_probe()
1448 return ssi_private->irq; in fsl_ssi_probe()
1453 if (!fsl_ssi_is_ac97(ssi_private)) in fsl_ssi_probe()
1454 ssi_private->cpu_dai_drv.symmetric_rates = 1; in fsl_ssi_probe()
1456 ssi_private->cpu_dai_drv.symmetric_channels = 1; in fsl_ssi_probe()
1457 ssi_private->cpu_dai_drv.symmetric_samplebits = 1; in fsl_ssi_probe()
1463 ssi_private->fifo_depth = be32_to_cpup(iprop); in fsl_ssi_probe()
1466 ssi_private->fifo_depth = 8; in fsl_ssi_probe()
1468 dev_set_drvdata(&pdev->dev, ssi_private); in fsl_ssi_probe()
1470 if (ssi_private->soc->imx) { in fsl_ssi_probe()
1471 ret = fsl_ssi_imx_probe(pdev, ssi_private, iomem); in fsl_ssi_probe()
1477 &ssi_private->cpu_dai_drv, 1); in fsl_ssi_probe()
1483 if (ssi_private->use_dma) { in fsl_ssi_probe()
1484 ret = devm_request_irq(&pdev->dev, ssi_private->irq, in fsl_ssi_probe()
1486 ssi_private); in fsl_ssi_probe()
1489 ssi_private->irq); in fsl_ssi_probe()
1494 ret = fsl_ssi_debugfs_create(&ssi_private->dbg_stats, &pdev->dev); in fsl_ssi_probe()
1519 ssi_private->pdev = in fsl_ssi_probe()
1521 if (IS_ERR(ssi_private->pdev)) { in fsl_ssi_probe()
1522 ret = PTR_ERR(ssi_private->pdev); in fsl_ssi_probe()
1528 if (ssi_private->dai_fmt) in fsl_ssi_probe()
1529 _fsl_ssi_set_dai_fmt(&pdev->dev, ssi_private, in fsl_ssi_probe()
1530 ssi_private->dai_fmt); in fsl_ssi_probe()
1532 if (fsl_ssi_is_ac97(ssi_private)) { in fsl_ssi_probe()
1541 ssi_private->pdev = in fsl_ssi_probe()
1544 if (IS_ERR(ssi_private->pdev)) { in fsl_ssi_probe()
1545 ret = PTR_ERR(ssi_private->pdev); in fsl_ssi_probe()
1556 fsl_ssi_debugfs_remove(&ssi_private->dbg_stats); in fsl_ssi_probe()
1559 if (ssi_private->soc->imx) in fsl_ssi_probe()
1560 fsl_ssi_imx_clean(pdev, ssi_private); in fsl_ssi_probe()
1567 struct fsl_ssi_private *ssi_private = dev_get_drvdata(&pdev->dev); in fsl_ssi_remove() local
1569 fsl_ssi_debugfs_remove(&ssi_private->dbg_stats); in fsl_ssi_remove()
1571 if (ssi_private->pdev) in fsl_ssi_remove()
1572 platform_device_unregister(ssi_private->pdev); in fsl_ssi_remove()
1574 if (ssi_private->soc->imx) in fsl_ssi_remove()
1575 fsl_ssi_imx_clean(pdev, ssi_private); in fsl_ssi_remove()
1577 if (fsl_ssi_is_ac97(ssi_private)) in fsl_ssi_remove()
1586 struct fsl_ssi_private *ssi_private = dev_get_drvdata(dev); in fsl_ssi_suspend() local
1587 struct regmap *regs = ssi_private->regs; in fsl_ssi_suspend()
1590 &ssi_private->regcache_sfcsr); in fsl_ssi_suspend()
1600 struct fsl_ssi_private *ssi_private = dev_get_drvdata(dev); in fsl_ssi_resume() local
1601 struct regmap *regs = ssi_private->regs; in fsl_ssi_resume()
1608 ssi_private->regcache_sfcsr); in fsl_ssi_resume()