Lines Matching defs:ssi
54 /* Define RX and TX to index ssi->regvals array; Can be 0 or 1 only */
339 { .compatible = "fsl,mpc8610-ssi", .data = &fsl_ssi_mpc8610 },
340 { .compatible = "fsl,imx51-ssi", .data = &fsl_ssi_imx51 },
341 { .compatible = "fsl,imx35-ssi", .data = &fsl_ssi_imx35 },
342 { .compatible = "fsl,imx21-ssi", .data = &fsl_ssi_imx21 },
347 static bool fsl_ssi_is_ac97(struct fsl_ssi *ssi)
349 return (ssi->dai_fmt & SND_SOC_DAIFMT_FORMAT_MASK) ==
353 static bool fsl_ssi_is_i2s_master(struct fsl_ssi *ssi)
355 return (ssi->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) ==
359 static bool fsl_ssi_is_i2s_cbm_cfs(struct fsl_ssi *ssi)
361 return (ssi->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) ==
372 struct fsl_ssi *ssi = dev_id;
373 struct regmap *regs = ssi->regs;
378 sisr2 = sisr & ssi->soc->sisr_write_mask;
383 fsl_ssi_dbg_isr(&ssi->dbg_stats, sisr);
391 * @ssi: SSI context
399 static void fsl_ssi_config_enable(struct fsl_ssi *ssi, bool tx)
401 struct fsl_ssi_regvals *vals = ssi->regvals;
406 regmap_update_bits(ssi->regs, REG_SSI_SOR,
414 if (ssi->soc->offline_config && ssi->streams)
417 if (ssi->soc->offline_config) {
433 regmap_update_bits(ssi->regs, REG_SSI_SRCR, srcr, srcr);
434 regmap_update_bits(ssi->regs, REG_SSI_STCR, stcr, stcr);
435 regmap_update_bits(ssi->regs, REG_SSI_SIER, sier, sier);
444 if (ssi->use_dma && tx) {
449 regmap_update_bits(ssi->regs, REG_SSI_SCR,
454 regmap_read(ssi->regs, REG_SSI_SFCSR, &sfcsr);
461 dev_warn(ssi->dev, "Timeout waiting TX FIFO filling\n");
464 regmap_update_bits(ssi->regs, REG_SSI_SCR,
468 ssi->streams |= BIT(dir);
494 * @ssi: SSI context
502 static void fsl_ssi_config_disable(struct fsl_ssi *ssi, bool tx)
511 aactive = ssi->streams & BIT(adir);
513 vals = &ssi->regvals[dir];
516 avals = &ssi->regvals[adir];
525 regmap_update_bits(ssi->regs, REG_SSI_SCR, scr, 0);
528 ssi->streams &= ~BIT(dir);
534 if (ssi->soc->offline_config && aactive)
537 if (ssi->soc->offline_config) {
553 regmap_update_bits(ssi->regs, REG_SSI_SRCR, srcr, 0);
554 regmap_update_bits(ssi->regs, REG_SSI_STCR, stcr, 0);
555 regmap_update_bits(ssi->regs, REG_SSI_SIER, sier, 0);
559 regmap_update_bits(ssi->regs, REG_SSI_SOR,
563 static void fsl_ssi_tx_ac97_saccst_setup(struct fsl_ssi *ssi)
565 struct regmap *regs = ssi->regs;
568 if (!ssi->soc->imx21regs) {
579 * @ssi: SSI context
581 static void fsl_ssi_setup_regvals(struct fsl_ssi *ssi)
583 struct fsl_ssi_regvals *vals = ssi->regvals;
593 if (fsl_ssi_is_ac97(ssi))
596 if (ssi->use_dual_fifo) {
601 if (ssi->use_dma) {
610 static void fsl_ssi_setup_ac97(struct fsl_ssi *ssi)
612 struct regmap *regs = ssi->regs;
633 struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0));
636 ret = clk_prepare_enable(ssi->clk);
646 if (ssi->use_dual_fifo)
657 struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0));
659 clk_disable_unprepare(ssi->clk);
679 struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
680 struct regmap *regs = ssi->regs;
692 if (ssi->slots)
693 slots = ssi->slots;
694 if (ssi->slot_width)
695 slot_width = ssi->slot_width;
699 (ssi->i2s_net & SSI_SCR_I2S_MODE_MASK) == SSI_SCR_I2S_MODE_MASTER)
706 if (IS_ERR(ssi->baudclk))
713 if (freq * 5 > clk_get_rate(ssi->clk)) {
718 baudclk_is_used = ssi->baudclk_streams & ~(BIT(substream->stream));
730 clkrate = clk_get_rate(ssi->baudclk);
732 clkrate = clk_round_rate(ssi->baudclk, tmprate);
772 tx2 = tx || ssi->synchronous;
776 ret = clk_set_rate(ssi->baudclk, baudrate);
805 struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
806 struct regmap *regs = ssi->regs;
812 if (fsl_ssi_is_i2s_master(ssi)) {
818 if (!(ssi->baudclk_streams & BIT(substream->stream))) {
819 ret = clk_prepare_enable(ssi->baudclk);
823 ssi->baudclk_streams |= BIT(substream->stream);
833 if (ssi->streams && ssi->synchronous)
836 if (!fsl_ssi_is_ac97(ssi)) {
838 * Keep the ssi->i2s_net intact while having a local variable
840 * ssi->i2s_net will lose the settings for regular use cases.
842 u8 i2s_net = ssi->i2s_net;
845 if (fsl_ssi_is_i2s_cbm_cfs(ssi) && sample_size == 16)
857 tx2 = tx || ssi->synchronous;
867 struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0));
869 if (fsl_ssi_is_i2s_master(ssi) &&
870 ssi->baudclk_streams & BIT(substream->stream)) {
871 clk_disable_unprepare(ssi->baudclk);
872 ssi->baudclk_streams &= ~BIT(substream->stream);
878 static int _fsl_ssi_set_dai_fmt(struct fsl_ssi *ssi, unsigned int fmt)
883 ssi->dai_fmt = fmt;
892 ssi->i2s_net = SSI_SCR_NET;
897 if (IS_ERR(ssi->baudclk)) {
898 dev_err(ssi->dev,
904 ssi->i2s_net |= SSI_SCR_I2S_MODE_MASTER;
907 ssi->i2s_net |= SSI_SCR_I2S_MODE_SLAVE;
913 slots = ssi->slots ? : 2;
914 regmap_update_bits(ssi->regs, REG_SSI_STCCR,
916 regmap_update_bits(ssi->regs, REG_SSI_SRCCR,
942 scr |= ssi->i2s_net;
988 if (ssi->synchronous || fsl_ssi_is_ac97(ssi)) {
996 regmap_update_bits(ssi->regs, REG_SSI_STCR, mask, stcr);
997 regmap_update_bits(ssi->regs, REG_SSI_SRCR, mask, srcr);
1001 regmap_update_bits(ssi->regs, REG_SSI_SCR, mask, scr);
1013 struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
1016 if (fsl_ssi_is_ac97(ssi))
1019 return _fsl_ssi_set_dai_fmt(ssi, fmt);
1033 struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
1034 struct regmap *regs = ssi->regs;
1044 if (ssi->i2s_net && slots < 2) {
1065 ssi->slot_width = slot_width;
1066 ssi->slots = slots;
1084 struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0));
1098 if (tx && fsl_ssi_is_ac97(ssi))
1099 fsl_ssi_tx_ac97_saccst_setup(ssi);
1100 fsl_ssi_config_enable(ssi, tx);
1106 fsl_ssi_config_disable(ssi, tx);
1118 struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
1120 if (ssi->soc->imx && ssi->use_dma)
1121 snd_soc_dai_init_dma_data(dai, &ssi->dma_params_tx,
1122 &ssi->dma_params_rx);
1157 .name = "fsl-ssi",
1260 * @ssi: SSI context
1262 static int fsl_ssi_hw_init(struct fsl_ssi *ssi)
1264 u32 wm = ssi->fifo_watermark;
1267 fsl_ssi_setup_regvals(ssi);
1270 regmap_write(ssi->regs, REG_SSI_SFCSR,
1275 if (ssi->use_dual_fifo)
1276 regmap_update_bits(ssi->regs, REG_SSI_SCR,
1280 if (fsl_ssi_is_ac97(ssi)) {
1281 _fsl_ssi_set_dai_fmt(ssi, ssi->dai_fmt);
1282 fsl_ssi_setup_ac97(ssi);
1290 * @ssi: SSI context
1292 static void fsl_ssi_hw_clean(struct fsl_ssi *ssi)
1295 if (fsl_ssi_is_ac97(ssi)) {
1297 regmap_update_bits(ssi->regs, REG_SSI_SCR,
1300 regmap_write(ssi->regs, REG_SSI_SACNT, 0);
1302 regmap_write(ssi->regs, REG_SSI_SOR, 0);
1304 regmap_update_bits(ssi->regs, REG_SSI_SCR, SSI_SCR_SSIEN, 0);
1320 struct fsl_ssi *ssi, void __iomem *iomem)
1326 if (ssi->has_ipg_clk_name)
1327 ssi->clk = devm_clk_get(dev, "ipg");
1329 ssi->clk = devm_clk_get(dev, NULL);
1330 if (IS_ERR(ssi->clk)) {
1331 ret = PTR_ERR(ssi->clk);
1337 if (!ssi->has_ipg_clk_name) {
1338 ret = clk_prepare_enable(ssi->clk);
1346 ssi->baudclk = devm_clk_get(dev, "baud");
1347 if (IS_ERR(ssi->baudclk))
1349 PTR_ERR(ssi->baudclk));
1351 ssi->dma_params_tx.maxburst = ssi->dma_maxburst;
1352 ssi->dma_params_rx.maxburst = ssi->dma_maxburst;
1353 ssi->dma_params_tx.addr = ssi->ssi_phys + REG_SSI_STX0;
1354 ssi->dma_params_rx.addr = ssi->ssi_phys + REG_SSI_SRX0;
1357 if (ssi->use_dual_fifo) {
1358 ssi->dma_params_tx.maxburst &= ~0x1;
1359 ssi->dma_params_rx.maxburst &= ~0x1;
1362 if (!ssi->use_dma) {
1367 ssi->fiq_params.irq = ssi->irq;
1368 ssi->fiq_params.base = iomem;
1369 ssi->fiq_params.dma_params_rx = &ssi->dma_params_rx;
1370 ssi->fiq_params.dma_params_tx = &ssi->dma_params_tx;
1372 ret = imx_pcm_fiq_init(pdev, &ssi->fiq_params);
1384 if (!ssi->has_ipg_clk_name)
1385 clk_disable_unprepare(ssi->clk);
1390 static void fsl_ssi_imx_clean(struct platform_device *pdev, struct fsl_ssi *ssi)
1392 if (!ssi->use_dma)
1394 if (!ssi->has_ipg_clk_name)
1395 clk_disable_unprepare(ssi->clk);
1398 static int fsl_ssi_probe_from_dt(struct fsl_ssi *ssi)
1400 struct device *dev = ssi->dev;
1412 ssi->soc = of_id->data;
1416 ssi->has_ipg_clk_name = ret >= 0;
1421 ssi->dai_fmt = FSLSSI_AC97_DAIFMT;
1423 ret = of_property_read_u32(np, "cell-index", &ssi->card_idx);
1428 strcpy(ssi->card_name, "ac97-codec");
1429 } else if (!of_find_property(np, "fsl,ssi-asynchronous", NULL)) {
1439 ssi->synchronous = true;
1443 ssi->use_dma = !of_property_read_bool(np, "fsl,fiq-stream-filter");
1448 ssi->fifo_depth = be32_to_cpup(iprop);
1450 ssi->fifo_depth = 8;
1454 if (ssi->use_dma && !ret && dmas[2] == IMX_DMATYPE_SSI_DUAL)
1455 ssi->use_dual_fifo = true;
1465 if (!ssi->card_name[0] && of_get_property(np, "codec-handle", NULL)) {
1474 snprintf(ssi->card_name, sizeof(ssi->card_name),
1476 make_lowercase(ssi->card_name);
1477 ssi->card_idx = 0;
1487 struct fsl_ssi *ssi;
1492 ssi = devm_kzalloc(dev, sizeof(*ssi), GFP_KERNEL);
1493 if (!ssi)
1496 ssi->dev = dev;
1499 ret = fsl_ssi_probe_from_dt(ssi);
1503 if (fsl_ssi_is_ac97(ssi)) {
1504 memcpy(&ssi->cpu_dai_drv, &fsl_ssi_ac97_dai,
1506 fsl_ac97_data = ssi;
1508 memcpy(&ssi->cpu_dai_drv, &fsl_ssi_dai_template,
1511 ssi->cpu_dai_drv.name = dev_name(dev);
1517 ssi->ssi_phys = res->start;
1519 if (ssi->soc->imx21regs) {
1526 if (ssi->has_ipg_clk_name)
1527 ssi->regs = devm_regmap_init_mmio_clk(dev, "ipg", iomem,
1530 ssi->regs = devm_regmap_init_mmio(dev, iomem, ®config);
1531 if (IS_ERR(ssi->regs)) {
1533 return PTR_ERR(ssi->regs);
1536 ssi->irq = platform_get_irq(pdev, 0);
1537 if (ssi->irq < 0)
1538 return ssi->irq;
1541 if (ssi->synchronous && !fsl_ssi_is_ac97(ssi)) {
1542 ssi->cpu_dai_drv.symmetric_rates = 1;
1543 ssi->cpu_dai_drv.symmetric_channels = 1;
1544 ssi->cpu_dai_drv.symmetric_samplebits = 1;
1553 switch (ssi->fifo_depth) {
1563 ssi->fifo_watermark = 8;
1564 ssi->dma_maxburst = 8;
1569 ssi->fifo_watermark = ssi->fifo_depth - 2;
1570 ssi->dma_maxburst = ssi->fifo_depth - 2;
1574 dev_set_drvdata(dev, ssi);
1576 if (ssi->soc->imx) {
1577 ret = fsl_ssi_imx_probe(pdev, ssi, iomem);
1582 if (fsl_ssi_is_ac97(ssi)) {
1583 mutex_init(&ssi->ac97_reg_lock);
1592 &ssi->cpu_dai_drv, 1);
1598 if (ssi->use_dma) {
1599 ret = devm_request_irq(dev, ssi->irq, fsl_ssi_isr, 0,
1600 dev_name(dev), ssi);
1602 dev_err(dev, "failed to claim irq %u\n", ssi->irq);
1607 fsl_ssi_debugfs_create(&ssi->dbg_stats, dev);
1610 fsl_ssi_hw_init(ssi);
1613 if (ssi->card_name[0]) {
1621 if (fsl_ssi_is_ac97(ssi))
1624 ssi->card_pdev = platform_device_register_data(parent,
1625 ssi->card_name, ssi->card_idx, NULL, 0);
1626 if (IS_ERR(ssi->card_pdev)) {
1627 ret = PTR_ERR(ssi->card_pdev);
1629 ssi->card_name, ret);
1637 fsl_ssi_debugfs_remove(&ssi->dbg_stats);
1639 if (fsl_ssi_is_ac97(ssi))
1642 if (fsl_ssi_is_ac97(ssi))
1643 mutex_destroy(&ssi->ac97_reg_lock);
1645 if (ssi->soc->imx)
1646 fsl_ssi_imx_clean(pdev, ssi);
1653 struct fsl_ssi *ssi = dev_get_drvdata(&pdev->dev);
1655 fsl_ssi_debugfs_remove(&ssi->dbg_stats);
1657 if (ssi->card_pdev)
1658 platform_device_unregister(ssi->card_pdev);
1661 fsl_ssi_hw_clean(ssi);
1663 if (ssi->soc->imx)
1664 fsl_ssi_imx_clean(pdev, ssi);
1666 if (fsl_ssi_is_ac97(ssi)) {
1668 mutex_destroy(&ssi->ac97_reg_lock);
1677 struct fsl_ssi *ssi = dev_get_drvdata(dev);
1678 struct regmap *regs = ssi->regs;
1680 regmap_read(regs, REG_SSI_SFCSR, &ssi->regcache_sfcsr);
1681 regmap_read(regs, REG_SSI_SACNT, &ssi->regcache_sacnt);
1691 struct fsl_ssi *ssi = dev_get_drvdata(dev);
1692 struct regmap *regs = ssi->regs;
1699 ssi->regcache_sfcsr);
1700 regmap_write(regs, REG_SSI_SACNT, ssi->regcache_sacnt);
1712 .name = "fsl-ssi-dai",
1722 MODULE_ALIAS("platform:fsl-ssi-dai");