Lines Matching refs:ssi_private
250 static bool fsl_ssi_is_ac97(struct fsl_ssi_private *ssi_private) in fsl_ssi_is_ac97() argument
252 return !!(ssi_private->dai_fmt & SND_SOC_DAIFMT_AC97); in fsl_ssi_is_ac97()
255 static bool fsl_ssi_is_i2s_master(struct fsl_ssi_private *ssi_private) in fsl_ssi_is_i2s_master() argument
257 return (ssi_private->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) == in fsl_ssi_is_i2s_master()
261 static bool fsl_ssi_is_i2s_cbm_cfs(struct fsl_ssi_private *ssi_private) in fsl_ssi_is_i2s_cbm_cfs() argument
263 return (ssi_private->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) == in fsl_ssi_is_i2s_cbm_cfs()
280 struct fsl_ssi_private *ssi_private = dev_id; in fsl_ssi_isr() local
281 struct regmap *regs = ssi_private->regs; in fsl_ssi_isr()
291 sisr2 = sisr & ssi_private->soc->sisr_write_mask; in fsl_ssi_isr()
296 fsl_ssi_dbg_isr(&ssi_private->dbg_stats, sisr); in fsl_ssi_isr()
304 static void fsl_ssi_rxtx_config(struct fsl_ssi_private *ssi_private, in fsl_ssi_rxtx_config() argument
307 struct regmap *regs = ssi_private->regs; in fsl_ssi_rxtx_config()
308 struct fsl_ssi_rxtx_reg_val *vals = &ssi_private->rxtx_reg_val; in fsl_ssi_rxtx_config()
354 static void fsl_ssi_config(struct fsl_ssi_private *ssi_private, bool enable, in fsl_ssi_config() argument
357 struct regmap *regs = ssi_private->regs; in fsl_ssi_config()
375 if (&ssi_private->rxtx_reg_val.rx == vals) in fsl_ssi_config()
376 avals = &ssi_private->rxtx_reg_val.tx; in fsl_ssi_config()
378 avals = &ssi_private->rxtx_reg_val.rx; in fsl_ssi_config()
392 if (ssi_private->soc->offline_config) { in fsl_ssi_config()
395 fsl_ssi_rxtx_config(ssi_private, enable); in fsl_ssi_config()
442 static void fsl_ssi_rx_config(struct fsl_ssi_private *ssi_private, bool enable) in fsl_ssi_rx_config() argument
444 fsl_ssi_config(ssi_private, enable, &ssi_private->rxtx_reg_val.rx); in fsl_ssi_rx_config()
447 static void fsl_ssi_tx_config(struct fsl_ssi_private *ssi_private, bool enable) in fsl_ssi_tx_config() argument
449 fsl_ssi_config(ssi_private, enable, &ssi_private->rxtx_reg_val.tx); in fsl_ssi_tx_config()
457 static void fsl_ssi_setup_reg_vals(struct fsl_ssi_private *ssi_private) in fsl_ssi_setup_reg_vals() argument
459 struct fsl_ssi_rxtx_reg_val *reg = &ssi_private->rxtx_reg_val; in fsl_ssi_setup_reg_vals()
468 if (!fsl_ssi_is_ac97(ssi_private)) { in fsl_ssi_setup_reg_vals()
475 if (ssi_private->use_dma) { in fsl_ssi_setup_reg_vals()
487 static void fsl_ssi_setup_ac97(struct fsl_ssi_private *ssi_private) in fsl_ssi_setup_ac97() argument
489 struct regmap *regs = ssi_private->regs; in fsl_ssi_setup_ac97()
530 struct fsl_ssi_private *ssi_private = in fsl_ssi_startup() local
534 ret = clk_prepare_enable(ssi_private->clk); in fsl_ssi_startup()
543 if (ssi_private->use_dual_fifo) in fsl_ssi_startup()
558 struct fsl_ssi_private *ssi_private = in fsl_ssi_shutdown() local
561 clk_disable_unprepare(ssi_private->clk); in fsl_ssi_shutdown()
578 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai); in fsl_ssi_set_bclk() local
579 struct regmap *regs = ssi_private->regs; in fsl_ssi_set_bclk()
580 int synchronous = ssi_private->cpu_dai_drv.symmetric_rates, ret; in fsl_ssi_set_bclk()
588 if (ssi_private->bitclk_freq) in fsl_ssi_set_bclk()
589 freq = ssi_private->bitclk_freq; in fsl_ssi_set_bclk()
594 if (IS_ERR(ssi_private->baudclk)) in fsl_ssi_set_bclk()
597 baudclk_is_used = ssi_private->baudclk_streams & ~(BIT(substream->stream)); in fsl_ssi_set_bclk()
609 clkrate = clk_get_rate(ssi_private->baudclk); in fsl_ssi_set_bclk()
611 clkrate = clk_round_rate(ssi_private->baudclk, tmprate); in fsl_ssi_set_bclk()
617 if (clkrate * 5 > clk_get_rate(ssi_private->clk)) in fsl_ssi_set_bclk()
664 ret = clk_set_rate(ssi_private->baudclk, baudrate); in fsl_ssi_set_bclk()
677 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai); in fsl_ssi_set_dai_sysclk() local
679 ssi_private->bitclk_freq = freq; in fsl_ssi_set_dai_sysclk()
700 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai); in fsl_ssi_hw_params() local
701 struct regmap *regs = ssi_private->regs; in fsl_ssi_hw_params()
717 if (enabled && ssi_private->cpu_dai_drv.symmetric_rates) in fsl_ssi_hw_params()
720 if (fsl_ssi_is_i2s_master(ssi_private)) { in fsl_ssi_hw_params()
726 if (!(ssi_private->baudclk_streams & BIT(substream->stream))) { in fsl_ssi_hw_params()
727 ret = clk_prepare_enable(ssi_private->baudclk); in fsl_ssi_hw_params()
731 ssi_private->baudclk_streams |= BIT(substream->stream); in fsl_ssi_hw_params()
735 if (!fsl_ssi_is_ac97(ssi_private)) { in fsl_ssi_hw_params()
741 if (fsl_ssi_is_i2s_cbm_cfs(ssi_private) && sample_size == 16) in fsl_ssi_hw_params()
745 i2smode = ssi_private->i2s_mode; in fsl_ssi_hw_params()
764 ssi_private->cpu_dai_drv.symmetric_rates) in fsl_ssi_hw_params()
778 struct fsl_ssi_private *ssi_private = in fsl_ssi_hw_free() local
781 if (fsl_ssi_is_i2s_master(ssi_private) && in fsl_ssi_hw_free()
782 ssi_private->baudclk_streams & BIT(substream->stream)) { in fsl_ssi_hw_free()
783 clk_disable_unprepare(ssi_private->baudclk); in fsl_ssi_hw_free()
784 ssi_private->baudclk_streams &= ~BIT(substream->stream); in fsl_ssi_hw_free()
791 struct fsl_ssi_private *ssi_private, in _fsl_ssi_set_dai_fmt() argument
794 struct regmap *regs = ssi_private->regs; in _fsl_ssi_set_dai_fmt()
798 ssi_private->dai_fmt = fmt; in _fsl_ssi_set_dai_fmt()
800 if (fsl_ssi_is_i2s_master(ssi_private) && IS_ERR(ssi_private->baudclk)) { in _fsl_ssi_set_dai_fmt()
805 fsl_ssi_setup_reg_vals(ssi_private); in _fsl_ssi_set_dai_fmt()
819 ssi_private->i2s_mode = CCSR_SSI_SCR_NET; in _fsl_ssi_set_dai_fmt()
825 ssi_private->i2s_mode |= CCSR_SSI_SCR_I2S_MODE_MASTER; in _fsl_ssi_set_dai_fmt()
834 ssi_private->i2s_mode |= CCSR_SSI_SCR_I2S_MODE_SLAVE; in _fsl_ssi_set_dai_fmt()
859 ssi_private->i2s_mode |= CCSR_SSI_SCR_I2S_MODE_NORMAL; in _fsl_ssi_set_dai_fmt()
864 scr |= ssi_private->i2s_mode; in _fsl_ssi_set_dai_fmt()
909 if (ssi_private->cpu_dai_drv.symmetric_rates) { in _fsl_ssi_set_dai_fmt()
930 if (ssi_private->use_dma) in _fsl_ssi_set_dai_fmt()
931 wm = ssi_private->fifo_depth - 2; in _fsl_ssi_set_dai_fmt()
933 wm = ssi_private->fifo_depth; in _fsl_ssi_set_dai_fmt()
939 if (ssi_private->use_dual_fifo) { in _fsl_ssi_set_dai_fmt()
949 fsl_ssi_setup_ac97(ssi_private); in _fsl_ssi_set_dai_fmt()
960 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai); in fsl_ssi_set_dai_fmt() local
962 return _fsl_ssi_set_dai_fmt(cpu_dai->dev, ssi_private, fmt); in fsl_ssi_set_dai_fmt()
973 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai); in fsl_ssi_set_dai_tdm_slot() local
974 struct regmap *regs = ssi_private->regs; in fsl_ssi_set_dai_tdm_slot()
1019 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(rtd->cpu_dai); in fsl_ssi_trigger() local
1020 struct regmap *regs = ssi_private->regs; in fsl_ssi_trigger()
1027 fsl_ssi_tx_config(ssi_private, true); in fsl_ssi_trigger()
1029 fsl_ssi_rx_config(ssi_private, true); in fsl_ssi_trigger()
1036 fsl_ssi_tx_config(ssi_private, false); in fsl_ssi_trigger()
1038 fsl_ssi_rx_config(ssi_private, false); in fsl_ssi_trigger()
1045 if (fsl_ssi_is_ac97(ssi_private)) { in fsl_ssi_trigger()
1057 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(dai); in fsl_ssi_dai_probe() local
1059 if (ssi_private->soc->imx && ssi_private->use_dma) { in fsl_ssi_dai_probe()
1060 dai->playback_dma_data = &ssi_private->dma_params_tx; in fsl_ssi_dai_probe()
1061 dai->capture_dma_data = &ssi_private->dma_params_rx; in fsl_ssi_dai_probe()
1189 struct fsl_ssi_private *ssi_private, void __iomem *iomem) in fsl_ssi_imx_probe() argument
1195 if (ssi_private->has_ipg_clk_name) in fsl_ssi_imx_probe()
1196 ssi_private->clk = devm_clk_get(&pdev->dev, "ipg"); in fsl_ssi_imx_probe()
1198 ssi_private->clk = devm_clk_get(&pdev->dev, NULL); in fsl_ssi_imx_probe()
1199 if (IS_ERR(ssi_private->clk)) { in fsl_ssi_imx_probe()
1200 ret = PTR_ERR(ssi_private->clk); in fsl_ssi_imx_probe()
1205 if (!ssi_private->has_ipg_clk_name) { in fsl_ssi_imx_probe()
1206 ret = clk_prepare_enable(ssi_private->clk); in fsl_ssi_imx_probe()
1216 ssi_private->baudclk = devm_clk_get(&pdev->dev, "baud"); in fsl_ssi_imx_probe()
1217 if (IS_ERR(ssi_private->baudclk)) in fsl_ssi_imx_probe()
1219 PTR_ERR(ssi_private->baudclk)); in fsl_ssi_imx_probe()
1225 ssi_private->dma_params_tx.maxburst = ssi_private->fifo_depth - 2; in fsl_ssi_imx_probe()
1226 ssi_private->dma_params_rx.maxburst = ssi_private->fifo_depth - 2; in fsl_ssi_imx_probe()
1227 ssi_private->dma_params_tx.addr = ssi_private->ssi_phys + CCSR_SSI_STX0; in fsl_ssi_imx_probe()
1228 ssi_private->dma_params_rx.addr = ssi_private->ssi_phys + CCSR_SSI_SRX0; in fsl_ssi_imx_probe()
1231 if (ssi_private->use_dma && !ret && dmas[2] == IMX_DMATYPE_SSI_DUAL) { in fsl_ssi_imx_probe()
1232 ssi_private->use_dual_fifo = true; in fsl_ssi_imx_probe()
1236 ssi_private->dma_params_tx.maxburst &= ~0x1; in fsl_ssi_imx_probe()
1237 ssi_private->dma_params_rx.maxburst &= ~0x1; in fsl_ssi_imx_probe()
1240 if (!ssi_private->use_dma) { in fsl_ssi_imx_probe()
1249 ssi_private->fiq_params.irq = ssi_private->irq; in fsl_ssi_imx_probe()
1250 ssi_private->fiq_params.base = iomem; in fsl_ssi_imx_probe()
1251 ssi_private->fiq_params.dma_params_rx = in fsl_ssi_imx_probe()
1252 &ssi_private->dma_params_rx; in fsl_ssi_imx_probe()
1253 ssi_private->fiq_params.dma_params_tx = in fsl_ssi_imx_probe()
1254 &ssi_private->dma_params_tx; in fsl_ssi_imx_probe()
1256 ret = imx_pcm_fiq_init(pdev, &ssi_private->fiq_params); in fsl_ssi_imx_probe()
1269 if (!ssi_private->has_ipg_clk_name) in fsl_ssi_imx_probe()
1270 clk_disable_unprepare(ssi_private->clk); in fsl_ssi_imx_probe()
1275 struct fsl_ssi_private *ssi_private) in fsl_ssi_imx_clean() argument
1277 if (!ssi_private->use_dma) in fsl_ssi_imx_clean()
1279 if (!ssi_private->has_ipg_clk_name) in fsl_ssi_imx_clean()
1280 clk_disable_unprepare(ssi_private->clk); in fsl_ssi_imx_clean()
1285 struct fsl_ssi_private *ssi_private; in fsl_ssi_probe() local
1306 ssi_private = devm_kzalloc(&pdev->dev, sizeof(*ssi_private), in fsl_ssi_probe()
1308 if (!ssi_private) { in fsl_ssi_probe()
1313 ssi_private->soc = of_id->data; in fsl_ssi_probe()
1318 ssi_private->dai_fmt = SND_SOC_DAIFMT_AC97; in fsl_ssi_probe()
1321 ssi_private->use_dma = !of_property_read_bool(np, in fsl_ssi_probe()
1324 if (fsl_ssi_is_ac97(ssi_private)) { in fsl_ssi_probe()
1325 memcpy(&ssi_private->cpu_dai_drv, &fsl_ssi_ac97_dai, in fsl_ssi_probe()
1328 fsl_ac97_data = ssi_private; in fsl_ssi_probe()
1333 memcpy(&ssi_private->cpu_dai_drv, &fsl_ssi_dai_template, in fsl_ssi_probe()
1336 ssi_private->cpu_dai_drv.name = dev_name(&pdev->dev); in fsl_ssi_probe()
1342 ssi_private->ssi_phys = res->start; in fsl_ssi_probe()
1346 ssi_private->has_ipg_clk_name = false; in fsl_ssi_probe()
1347 ssi_private->regs = devm_regmap_init_mmio(&pdev->dev, iomem, in fsl_ssi_probe()
1350 ssi_private->has_ipg_clk_name = true; in fsl_ssi_probe()
1351 ssi_private->regs = devm_regmap_init_mmio_clk(&pdev->dev, in fsl_ssi_probe()
1354 if (IS_ERR(ssi_private->regs)) { in fsl_ssi_probe()
1356 return PTR_ERR(ssi_private->regs); in fsl_ssi_probe()
1359 ssi_private->irq = platform_get_irq(pdev, 0); in fsl_ssi_probe()
1360 if (ssi_private->irq < 0) { in fsl_ssi_probe()
1362 return ssi_private->irq; in fsl_ssi_probe()
1367 ssi_private->cpu_dai_drv.symmetric_rates = 1; in fsl_ssi_probe()
1368 ssi_private->cpu_dai_drv.symmetric_channels = 1; in fsl_ssi_probe()
1369 ssi_private->cpu_dai_drv.symmetric_samplebits = 1; in fsl_ssi_probe()
1375 ssi_private->fifo_depth = be32_to_cpup(iprop); in fsl_ssi_probe()
1378 ssi_private->fifo_depth = 8; in fsl_ssi_probe()
1380 dev_set_drvdata(&pdev->dev, ssi_private); in fsl_ssi_probe()
1382 if (ssi_private->soc->imx) { in fsl_ssi_probe()
1383 ret = fsl_ssi_imx_probe(pdev, ssi_private, iomem); in fsl_ssi_probe()
1389 &ssi_private->cpu_dai_drv, 1); in fsl_ssi_probe()
1395 if (ssi_private->use_dma) { in fsl_ssi_probe()
1396 ret = devm_request_irq(&pdev->dev, ssi_private->irq, in fsl_ssi_probe()
1398 ssi_private); in fsl_ssi_probe()
1401 ssi_private->irq); in fsl_ssi_probe()
1406 ret = fsl_ssi_debugfs_create(&ssi_private->dbg_stats, &pdev->dev); in fsl_ssi_probe()
1431 ssi_private->pdev = in fsl_ssi_probe()
1433 if (IS_ERR(ssi_private->pdev)) { in fsl_ssi_probe()
1434 ret = PTR_ERR(ssi_private->pdev); in fsl_ssi_probe()
1440 if (ssi_private->dai_fmt) in fsl_ssi_probe()
1441 _fsl_ssi_set_dai_fmt(&pdev->dev, ssi_private, in fsl_ssi_probe()
1442 ssi_private->dai_fmt); in fsl_ssi_probe()
1447 fsl_ssi_debugfs_remove(&ssi_private->dbg_stats); in fsl_ssi_probe()
1450 if (ssi_private->soc->imx) in fsl_ssi_probe()
1451 fsl_ssi_imx_clean(pdev, ssi_private); in fsl_ssi_probe()
1458 struct fsl_ssi_private *ssi_private = dev_get_drvdata(&pdev->dev); in fsl_ssi_remove() local
1460 fsl_ssi_debugfs_remove(&ssi_private->dbg_stats); in fsl_ssi_remove()
1462 if (ssi_private->pdev) in fsl_ssi_remove()
1463 platform_device_unregister(ssi_private->pdev); in fsl_ssi_remove()
1465 if (ssi_private->soc->imx) in fsl_ssi_remove()
1466 fsl_ssi_imx_clean(pdev, ssi_private); in fsl_ssi_remove()