Lines Matching +full:i2s +full:- +full:regs
1 // SPDX-License-Identifier: GPL-2.0+
3 // ALSA Soc Audio Layer - I2S core for newer Samsung SoCs.
9 // Copyright (c) 2008, 2007, 2004-2005 Simtec Electronics
21 #include "regs-i2s-v2.h"
22 #include "s3c-i2s-v2.h"
72 static void s3c2412_snd_txctrl(struct s3c_i2sv2_info *i2s, int on) in s3c2412_snd_txctrl() argument
74 void __iomem *regs = i2s->regs; in s3c2412_snd_txctrl() local
79 fic = readl(regs + S3C2412_IISFIC); in s3c2412_snd_txctrl()
80 con = readl(regs + S3C2412_IISCON); in s3c2412_snd_txctrl()
81 mod = readl(regs + S3C2412_IISMOD); in s3c2412_snd_txctrl()
102 dev_err(i2s->dev, "TXEN: Invalid MODE %x in IISMOD\n", in s3c2412_snd_txctrl()
107 writel(con, regs + S3C2412_IISCON); in s3c2412_snd_txctrl()
108 writel(mod, regs + S3C2412_IISMOD); in s3c2412_snd_txctrl()
131 dev_err(i2s->dev, "TXDIS: Invalid MODE %x in IISMOD\n", in s3c2412_snd_txctrl()
136 writel(mod, regs + S3C2412_IISMOD); in s3c2412_snd_txctrl()
137 writel(con, regs + S3C2412_IISCON); in s3c2412_snd_txctrl()
140 fic = readl(regs + S3C2412_IISFIC); in s3c2412_snd_txctrl()
145 static void s3c2412_snd_rxctrl(struct s3c_i2sv2_info *i2s, int on) in s3c2412_snd_rxctrl() argument
147 void __iomem *regs = i2s->regs; in s3c2412_snd_rxctrl() local
152 fic = readl(regs + S3C2412_IISFIC); in s3c2412_snd_rxctrl()
153 con = readl(regs + S3C2412_IISCON); in s3c2412_snd_rxctrl()
154 mod = readl(regs + S3C2412_IISMOD); in s3c2412_snd_rxctrl()
175 dev_err(i2s->dev, "RXEN: Invalid MODE %x in IISMOD\n", in s3c2412_snd_rxctrl()
179 writel(mod, regs + S3C2412_IISMOD); in s3c2412_snd_rxctrl()
180 writel(con, regs + S3C2412_IISCON); in s3c2412_snd_rxctrl()
200 dev_err(i2s->dev, "RXDIS: Invalid MODE %x in IISMOD\n", in s3c2412_snd_rxctrl()
204 writel(con, regs + S3C2412_IISCON); in s3c2412_snd_rxctrl()
205 writel(mod, regs + S3C2412_IISMOD); in s3c2412_snd_rxctrl()
208 fic = readl(regs + S3C2412_IISFIC); in s3c2412_snd_rxctrl()
218 static int s3c2412_snd_lrsync(struct s3c_i2sv2_info *i2s) in s3c2412_snd_lrsync() argument
225 while (--loops) { in s3c2412_snd_lrsync()
226 iiscon = readl(i2s->regs + S3C2412_IISCON); in s3c2412_snd_lrsync()
235 return -ETIMEDOUT; in s3c2412_snd_lrsync()
242 * Set S3C2412 I2S DAI format
247 struct s3c_i2sv2_info *i2s = to_info(cpu_dai); in s3c2412_i2s_set_fmt() local
252 iismod = readl(i2s->regs + S3C2412_IISMOD); in s3c2412_i2s_set_fmt()
257 i2s->master = 0; in s3c2412_i2s_set_fmt()
261 i2s->master = 1; in s3c2412_i2s_set_fmt()
266 return -EINVAL; in s3c2412_i2s_set_fmt()
286 return -EINVAL; in s3c2412_i2s_set_fmt()
289 writel(iismod, i2s->regs + S3C2412_IISMOD); in s3c2412_i2s_set_fmt()
298 struct s3c_i2sv2_info *i2s = to_info(dai); in s3c_i2sv2_hw_params() local
304 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in s3c_i2sv2_hw_params()
305 dma_data = i2s->dma_playback; in s3c_i2sv2_hw_params()
307 dma_data = i2s->dma_capture; in s3c_i2sv2_hw_params()
312 iismod = readl(i2s->regs + S3C2412_IISMOD); in s3c_i2sv2_hw_params()
328 writel(iismod, i2s->regs + S3C2412_IISMOD); in s3c_i2sv2_hw_params()
337 struct s3c_i2sv2_info *i2s = to_info(cpu_dai); in s3c_i2sv2_set_sysclk() local
338 u32 iismod = readl(i2s->regs + S3C2412_IISMOD); in s3c_i2sv2_set_sysclk()
354 if (!(i2s->feature & S3C_FEATURE_CDCLKCON)) in s3c_i2sv2_set_sysclk()
355 return -EINVAL; in s3c_i2sv2_set_sysclk()
365 return -EINVAL; in s3c_i2sv2_set_sysclk()
370 return -EINVAL; in s3c_i2sv2_set_sysclk()
373 writel(iismod, i2s->regs + S3C2412_IISMOD); in s3c_i2sv2_set_sysclk()
383 struct s3c_i2sv2_info *i2s = to_info(asoc_rtd_to_cpu(rtd, 0)); in s3c2412_i2s_trigger() local
384 int capture = (substream->stream == SNDRV_PCM_STREAM_CAPTURE); in s3c2412_i2s_trigger()
395 i2s->regs + S3C2412_IISFIC); in s3c2412_i2s_trigger()
398 writel(0x0, i2s->regs + S3C2412_IISFIC); in s3c2412_i2s_trigger()
402 if (!i2s->master) { in s3c2412_i2s_trigger()
403 ret = s3c2412_snd_lrsync(i2s); in s3c2412_i2s_trigger()
411 s3c2412_snd_rxctrl(i2s, 1); in s3c2412_i2s_trigger()
413 s3c2412_snd_txctrl(i2s, 1); in s3c2412_i2s_trigger()
425 s3c2412_snd_rxctrl(i2s, 0); in s3c2412_i2s_trigger()
427 s3c2412_snd_txctrl(i2s, 0); in s3c2412_i2s_trigger()
432 ret = -EINVAL; in s3c2412_i2s_trigger()
446 struct s3c_i2sv2_info *i2s = to_info(cpu_dai); in s3c2412_i2s_set_clkdiv() local
471 return -EINVAL; in s3c2412_i2s_set_clkdiv()
474 reg = readl(i2s->regs + S3C2412_IISMOD); in s3c2412_i2s_set_clkdiv()
476 writel(reg | div, i2s->regs + S3C2412_IISMOD); in s3c2412_i2s_set_clkdiv()
478 pr_debug("%s: MOD=%08x\n", __func__, readl(i2s->regs + S3C2412_IISMOD)); in s3c2412_i2s_set_clkdiv()
500 return -EINVAL; in s3c2412_i2s_set_clkdiv()
503 reg = readl(i2s->regs + S3C2412_IISMOD); in s3c2412_i2s_set_clkdiv()
505 writel(reg | div, i2s->regs + S3C2412_IISMOD); in s3c2412_i2s_set_clkdiv()
506 pr_debug("%s: MOD=%08x\n", __func__, readl(i2s->regs + S3C2412_IISMOD)); in s3c2412_i2s_set_clkdiv()
512 i2s->regs + S3C2412_IISPSR); in s3c2412_i2s_set_clkdiv()
514 writel(0x0, i2s->regs + S3C2412_IISPSR); in s3c2412_i2s_set_clkdiv()
516 pr_debug("%s: PSR=%08x\n", __func__, readl(i2s->regs + S3C2412_IISPSR)); in s3c2412_i2s_set_clkdiv()
520 return -EINVAL; in s3c2412_i2s_set_clkdiv()
529 struct s3c_i2sv2_info *i2s = to_info(dai); in s3c2412_i2s_delay() local
530 u32 reg = readl(i2s->regs + S3C2412_IISFIC); in s3c2412_i2s_delay()
533 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in s3c2412_i2s_delay()
543 struct s3c_i2sv2_info *i2s = to_info(cpu_dai); in s3c_i2sv2_get_clock() local
544 u32 iismod = readl(i2s->regs + S3C2412_IISMOD); in s3c_i2sv2_get_clock()
547 return i2s->iis_cclk; in s3c_i2sv2_get_clock()
549 return i2s->iis_pclk; in s3c_i2sv2_get_clock()
590 deviation = actual - rate; in s3c_i2sv2_iis_calc_rate()
611 info->fs_div = best_fs; in s3c_i2sv2_iis_calc_rate()
612 info->clk_div = best_div; in s3c_i2sv2_iis_calc_rate()
619 struct s3c_i2sv2_info *i2s) in s3c_i2sv2_probe() argument
621 struct device *dev = dai->dev; in s3c_i2sv2_probe()
624 i2s->dev = dev; in s3c_i2sv2_probe()
626 /* record our i2s structure for later use in the callbacks */ in s3c_i2sv2_probe()
627 snd_soc_dai_set_drvdata(dai, i2s); in s3c_i2sv2_probe()
629 i2s->iis_pclk = clk_get(dev, "iis"); in s3c_i2sv2_probe()
630 if (IS_ERR(i2s->iis_pclk)) { in s3c_i2sv2_probe()
632 return -ENOENT; in s3c_i2sv2_probe()
635 clk_prepare_enable(i2s->iis_pclk); in s3c_i2sv2_probe()
639 iismod = readl(i2s->regs + S3C2412_IISMOD); in s3c_i2sv2_probe()
641 writel(iismod, i2s->regs + S3C2412_IISMOD); in s3c_i2sv2_probe()
642 s3c2412_snd_txctrl(i2s, 0); in s3c_i2sv2_probe()
643 s3c2412_snd_rxctrl(i2s, 0); in s3c_i2sv2_probe()
650 struct s3c_i2sv2_info *i2s) in s3c_i2sv2_cleanup() argument
652 clk_disable_unprepare(i2s->iis_pclk); in s3c_i2sv2_cleanup()
653 clk_put(i2s->iis_pclk); in s3c_i2sv2_cleanup()
654 i2s->iis_pclk = NULL; in s3c_i2sv2_cleanup()
662 struct snd_soc_dai_ops *ops = (struct snd_soc_dai_ops *)dai_drv->ops; in s3c_i2sv2_register_component()
664 ops->trigger = s3c2412_i2s_trigger; in s3c_i2sv2_register_component()
665 if (!ops->hw_params) in s3c_i2sv2_register_component()
666 ops->hw_params = s3c_i2sv2_hw_params; in s3c_i2sv2_register_component()
667 ops->set_fmt = s3c2412_i2s_set_fmt; in s3c_i2sv2_register_component()
668 ops->set_clkdiv = s3c2412_i2s_set_clkdiv; in s3c_i2sv2_register_component()
669 ops->set_sysclk = s3c_i2sv2_set_sysclk; in s3c_i2sv2_register_component()
672 if (!ops->delay) in s3c_i2sv2_register_component()
673 ops->delay = s3c2412_i2s_delay; in s3c_i2sv2_register_component()