• Home
  • Raw
  • Download

Lines Matching full:i2s

1 /* sound/soc/samsung/i2s.c
3 * ALSA SoC Audio Layer - Samsung I2S Controller driver
13 #include <dt-bindings/sound/samsung-i2s.h>
32 #include "i2s.h"
33 #include "i2s-regs.h"
71 /* I2S Controller's core clock */
73 /* Clock for generating I2S signals */
108 static inline bool is_secondary(struct i2s_dai *i2s) in is_secondary() argument
110 return i2s->pri_dai ? true : false; in is_secondary()
114 static inline bool is_slave(struct i2s_dai *i2s) in is_slave() argument
116 u32 mod = readl(i2s->addr + I2SMOD); in is_slave()
117 return (mod & (1 << i2s->variant_regs->mss_off)) ? true : false; in is_slave()
121 static inline bool tx_active(struct i2s_dai *i2s) in tx_active() argument
125 if (!i2s) in tx_active()
128 active = readl(i2s->addr + I2SCON); in tx_active()
130 if (is_secondary(i2s)) in tx_active()
139 static inline struct i2s_dai *get_other_dai(struct i2s_dai *i2s) in get_other_dai() argument
141 return i2s->pri_dai ? : i2s->sec_dai; in get_other_dai()
145 static inline bool other_tx_active(struct i2s_dai *i2s) in other_tx_active() argument
147 struct i2s_dai *other = get_other_dai(i2s); in other_tx_active()
153 static inline bool any_tx_active(struct i2s_dai *i2s) in any_tx_active() argument
155 return tx_active(i2s) || other_tx_active(i2s); in any_tx_active()
159 static inline bool rx_active(struct i2s_dai *i2s) in rx_active() argument
163 if (!i2s) in rx_active()
166 active = readl(i2s->addr + I2SCON) & CON_RXDMA_ACTIVE; in rx_active()
172 static inline bool other_rx_active(struct i2s_dai *i2s) in other_rx_active() argument
174 struct i2s_dai *other = get_other_dai(i2s); in other_rx_active()
180 static inline bool any_rx_active(struct i2s_dai *i2s) in any_rx_active() argument
182 return rx_active(i2s) || other_rx_active(i2s); in any_rx_active()
186 static inline bool other_active(struct i2s_dai *i2s) in other_active() argument
188 return other_rx_active(i2s) || other_tx_active(i2s); in other_active()
192 static inline bool this_active(struct i2s_dai *i2s) in this_active() argument
194 return tx_active(i2s) || rx_active(i2s); in this_active()
198 static inline bool any_active(struct i2s_dai *i2s) in any_active() argument
200 return this_active(i2s) || other_active(i2s); in any_active()
208 static inline bool is_opened(struct i2s_dai *i2s) in is_opened() argument
210 if (i2s && (i2s->mode & DAI_OPENED)) in is_opened()
216 static inline bool is_manager(struct i2s_dai *i2s) in is_manager() argument
218 if (is_opened(i2s) && (i2s->mode & DAI_MANAGER)) in is_manager()
224 /* Read RCLK of I2S (in multiples of LRCLK) */
225 static inline unsigned get_rfs(struct i2s_dai *i2s) in get_rfs() argument
228 rfs = readl(i2s->addr + I2SMOD) >> i2s->variant_regs->rfs_off; in get_rfs()
229 rfs &= i2s->variant_regs->rfs_mask; in get_rfs()
243 /* Write RCLK of I2S (in multiples of LRCLK) */
244 static inline void set_rfs(struct i2s_dai *i2s, unsigned rfs) in set_rfs() argument
246 u32 mod = readl(i2s->addr + I2SMOD); in set_rfs()
247 int rfs_shift = i2s->variant_regs->rfs_off; in set_rfs()
249 mod &= ~(i2s->variant_regs->rfs_mask << rfs_shift); in set_rfs()
278 writel(mod, i2s->addr + I2SMOD); in set_rfs()
281 /* Read Bit-Clock of I2S (in multiples of LRCLK) */
282 static inline unsigned get_bfs(struct i2s_dai *i2s) in get_bfs() argument
285 bfs = readl(i2s->addr + I2SMOD) >> i2s->variant_regs->bfs_off; in get_bfs()
286 bfs &= i2s->variant_regs->bfs_mask; in get_bfs()
301 /* Write Bit-Clock of I2S (in multiples of LRCLK) */
302 static inline void set_bfs(struct i2s_dai *i2s, unsigned bfs) in set_bfs() argument
304 u32 mod = readl(i2s->addr + I2SMOD); in set_bfs()
305 int tdm = i2s->quirks & QUIRK_SUPPORTS_TDM; in set_bfs()
306 int bfs_shift = i2s->variant_regs->bfs_off; in set_bfs()
308 /* Non-TDM I2S controllers do not support BCLK > 48 * FS */ in set_bfs()
310 dev_err(&i2s->pdev->dev, "Unsupported BCLK divider\n"); in set_bfs()
314 mod &= ~(i2s->variant_regs->bfs_mask << bfs_shift); in set_bfs()
345 dev_err(&i2s->pdev->dev, "Wrong BCLK Divider!\n"); in set_bfs()
349 writel(mod, i2s->addr + I2SMOD); in set_bfs()
353 static inline int get_blc(struct i2s_dai *i2s) in get_blc() argument
355 int blc = readl(i2s->addr + I2SMOD); in get_blc()
367 static void i2s_txctrl(struct i2s_dai *i2s, int on) in i2s_txctrl() argument
369 void __iomem *addr = i2s->addr; in i2s_txctrl()
370 int txr_off = i2s->variant_regs->txr_off; in i2s_txctrl()
378 if (is_secondary(i2s)) { in i2s_txctrl()
386 if (any_rx_active(i2s)) in i2s_txctrl()
391 if (is_secondary(i2s)) { in i2s_txctrl()
399 if (other_tx_active(i2s)) { in i2s_txctrl()
406 if (any_rx_active(i2s)) in i2s_txctrl()
417 static void i2s_rxctrl(struct i2s_dai *i2s, int on) in i2s_rxctrl() argument
419 void __iomem *addr = i2s->addr; in i2s_rxctrl()
420 int txr_off = i2s->variant_regs->txr_off; in i2s_rxctrl()
428 if (any_tx_active(i2s)) in i2s_rxctrl()
436 if (any_tx_active(i2s)) in i2s_rxctrl()
447 static inline void i2s_fifo(struct i2s_dai *i2s, u32 flush) in i2s_fifo() argument
452 if (!i2s) in i2s_fifo()
455 if (is_secondary(i2s)) in i2s_fifo()
456 fic = i2s->addr + I2SFICS; in i2s_fifo()
458 fic = i2s->addr + I2SFIC; in i2s_fifo()
474 struct i2s_dai *i2s = to_info(dai); in i2s_set_sysclk() local
475 struct i2s_dai *other = get_other_dai(i2s); in i2s_set_sysclk()
476 const struct samsung_i2s_variant_regs *i2s_regs = i2s->variant_regs; in i2s_set_sysclk()
485 spin_lock_irqsave(i2s->lock, flags); in i2s_set_sysclk()
486 mod = readl(i2s->addr + I2SMOD); in i2s_set_sysclk()
487 spin_unlock_irqrestore(i2s->lock, flags); in i2s_set_sysclk()
501 (any_active(i2s) && in i2s_set_sysclk()
506 dev_err(&i2s->pdev->dev, in i2s_set_sysclk()
515 i2s->rfs = rfs; in i2s_set_sysclk()
522 if ((i2s->quirks & QUIRK_NO_MUXPSR) in i2s_set_sysclk()
528 if (!any_active(i2s)) { in i2s_set_sysclk()
529 if (i2s->op_clk && !IS_ERR(i2s->op_clk)) { in i2s_set_sysclk()
532 clk_disable_unprepare(i2s->op_clk); in i2s_set_sysclk()
533 clk_put(i2s->op_clk); in i2s_set_sysclk()
535 i2s->rclk_srcrate = in i2s_set_sysclk()
536 clk_get_rate(i2s->op_clk); in i2s_set_sysclk()
542 i2s->op_clk = clk_get(&i2s->pdev->dev, in i2s_set_sysclk()
545 i2s->op_clk = clk_get(&i2s->pdev->dev, in i2s_set_sysclk()
548 if (WARN_ON(IS_ERR(i2s->op_clk))) { in i2s_set_sysclk()
549 ret = PTR_ERR(i2s->op_clk); in i2s_set_sysclk()
550 i2s->op_clk = NULL; in i2s_set_sysclk()
554 ret = clk_prepare_enable(i2s->op_clk); in i2s_set_sysclk()
556 clk_put(i2s->op_clk); in i2s_set_sysclk()
557 i2s->op_clk = NULL; in i2s_set_sysclk()
560 i2s->rclk_srcrate = clk_get_rate(i2s->op_clk); in i2s_set_sysclk()
564 other->op_clk = i2s->op_clk; in i2s_set_sysclk()
565 other->rclk_srcrate = i2s->rclk_srcrate; in i2s_set_sysclk()
569 dev_err(&i2s->pdev->dev, in i2s_set_sysclk()
575 i2s->op_clk = other->op_clk; in i2s_set_sysclk()
576 i2s->rclk_srcrate = other->rclk_srcrate; in i2s_set_sysclk()
584 dev_err(&i2s->pdev->dev, "We don't serve that!\n"); in i2s_set_sysclk()
589 spin_lock_irqsave(i2s->lock, flags); in i2s_set_sysclk()
590 mod = readl(i2s->addr + I2SMOD); in i2s_set_sysclk()
592 writel(mod, i2s->addr + I2SMOD); in i2s_set_sysclk()
593 spin_unlock_irqrestore(i2s->lock, flags); in i2s_set_sysclk()
606 struct i2s_dai *i2s = to_info(dai); in i2s_set_fmt() local
607 struct i2s_dai *other = get_other_dai(i2s); in i2s_set_fmt()
612 lrp_shift = i2s->variant_regs->lrp_off; in i2s_set_fmt()
613 sdf_shift = i2s->variant_regs->sdf_off; in i2s_set_fmt()
614 mod_slave = 1 << i2s->variant_regs->mss_off; in i2s_set_fmt()
633 dev_err(&i2s->pdev->dev, "Format not supported\n"); in i2s_set_fmt()
651 dev_err(&i2s->pdev->dev, "Polarity not supported\n"); in i2s_set_fmt()
665 if (i2s->rclk_srcrate == 0 && i2s->clk_data.clks == NULL && in i2s_set_fmt()
671 dev_err(&i2s->pdev->dev, "master/slave format not supported\n"); in i2s_set_fmt()
676 spin_lock_irqsave(i2s->lock, flags); in i2s_set_fmt()
677 mod = readl(i2s->addr + I2SMOD); in i2s_set_fmt()
679 * Don't change the I2S mode if any controller is active on this in i2s_set_fmt()
682 if (any_active(i2s) && in i2s_set_fmt()
684 spin_unlock_irqrestore(i2s->lock, flags); in i2s_set_fmt()
686 dev_err(&i2s->pdev->dev, in i2s_set_fmt()
693 writel(mod, i2s->addr + I2SMOD); in i2s_set_fmt()
694 spin_unlock_irqrestore(i2s->lock, flags); in i2s_set_fmt()
703 struct i2s_dai *i2s = to_info(dai); in i2s_hw_params() local
704 struct i2s_dai *other = get_other_dai(i2s); in i2s_hw_params()
711 if (!is_secondary(i2s)) in i2s_hw_params()
723 i2s->dma_playback.addr_width = 4; in i2s_hw_params()
725 i2s->dma_capture.addr_width = 4; in i2s_hw_params()
729 i2s->dma_playback.addr_width = 2; in i2s_hw_params()
731 i2s->dma_capture.addr_width = 2; in i2s_hw_params()
735 dev_err(&i2s->pdev->dev, "%d channels not supported\n", in i2s_hw_params()
740 if (is_secondary(i2s)) in i2s_hw_params()
745 if (is_manager(i2s)) in i2s_hw_params()
750 if (is_secondary(i2s)) in i2s_hw_params()
754 if (is_manager(i2s)) in i2s_hw_params()
758 if (is_secondary(i2s)) in i2s_hw_params()
762 if (is_manager(i2s)) in i2s_hw_params()
766 if (is_secondary(i2s)) in i2s_hw_params()
770 if (is_manager(i2s)) in i2s_hw_params()
774 dev_err(&i2s->pdev->dev, "Format(%d) not supported\n", in i2s_hw_params()
779 spin_lock_irqsave(i2s->lock, flags); in i2s_hw_params()
780 mod = readl(i2s->addr + I2SMOD); in i2s_hw_params()
782 writel(mod, i2s->addr + I2SMOD); in i2s_hw_params()
783 spin_unlock_irqrestore(i2s->lock, flags); in i2s_hw_params()
785 snd_soc_dai_init_dma_data(dai, &i2s->dma_playback, &i2s->dma_capture); in i2s_hw_params()
787 i2s->frmclk = params_rate(params); in i2s_hw_params()
789 rclksrc = i2s->clk_table[CLK_I2S_RCLK_SRC]; in i2s_hw_params()
794 i2s->rclk_srcrate = clk_get_rate(rclksrc); in i2s_hw_params()
799 /* We set constraints on the substream acc to the version of I2S */
803 struct i2s_dai *i2s = to_info(dai); in i2s_startup() local
804 struct i2s_dai *other = get_other_dai(i2s); in i2s_startup()
811 i2s->mode |= DAI_OPENED; in i2s_startup()
814 i2s->mode &= ~DAI_MANAGER; in i2s_startup()
816 i2s->mode |= DAI_MANAGER; in i2s_startup()
818 if (!any_active(i2s) && (i2s->quirks & QUIRK_NEED_RSTCLR)) in i2s_startup()
819 writel(CON_RSTCLR, i2s->addr + I2SCON); in i2s_startup()
829 struct i2s_dai *i2s = to_info(dai); in i2s_shutdown() local
830 struct i2s_dai *other = get_other_dai(i2s); in i2s_shutdown()
835 i2s->mode &= ~DAI_OPENED; in i2s_shutdown()
836 i2s->mode &= ~DAI_MANAGER; in i2s_shutdown()
842 i2s->rfs = 0; in i2s_shutdown()
843 i2s->bfs = 0; in i2s_shutdown()
850 static int config_setup(struct i2s_dai *i2s) in config_setup() argument
852 struct i2s_dai *other = get_other_dai(i2s); in config_setup()
856 blc = get_blc(i2s); in config_setup()
858 bfs = i2s->bfs; in config_setup()
867 rfs = i2s->rfs; in config_setup()
873 dev_err(&i2s->pdev->dev, in config_setup()
886 if (any_active(i2s) && (get_rfs(i2s) != rfs || get_bfs(i2s) != bfs)) { in config_setup()
887 dev_err(&i2s->pdev->dev, in config_setup()
892 set_bfs(i2s, bfs); in config_setup()
893 set_rfs(i2s, rfs); in config_setup()
896 if (is_slave(i2s)) in config_setup()
899 if (!(i2s->quirks & QUIRK_NO_MUXPSR)) { in config_setup()
900 psr = i2s->rclk_srcrate / i2s->frmclk / rfs; in config_setup()
901 writel(((psr - 1) << 8) | PSR_PSREN, i2s->addr + I2SPSR); in config_setup()
902 dev_dbg(&i2s->pdev->dev, in config_setup()
904 i2s->rclk_srcrate, psr, rfs, bfs); in config_setup()
915 struct i2s_dai *i2s = to_info(rtd->cpu_dai); in i2s_trigger() local
923 spin_lock_irqsave(i2s->lock, flags); in i2s_trigger()
925 if (config_setup(i2s)) { in i2s_trigger()
926 spin_unlock_irqrestore(i2s->lock, flags); in i2s_trigger()
931 i2s_rxctrl(i2s, 1); in i2s_trigger()
933 i2s_txctrl(i2s, 1); in i2s_trigger()
935 spin_unlock_irqrestore(i2s->lock, flags); in i2s_trigger()
940 spin_lock_irqsave(i2s->lock, flags); in i2s_trigger()
943 i2s_rxctrl(i2s, 0); in i2s_trigger()
944 i2s_fifo(i2s, FIC_RXFLUSH); in i2s_trigger()
946 i2s_txctrl(i2s, 0); in i2s_trigger()
947 i2s_fifo(i2s, FIC_TXFLUSH); in i2s_trigger()
950 spin_unlock_irqrestore(i2s->lock, flags); in i2s_trigger()
961 struct i2s_dai *i2s = to_info(dai); in i2s_set_clkdiv() local
962 struct i2s_dai *other = get_other_dai(i2s); in i2s_set_clkdiv()
967 if ((any_active(i2s) && div && (get_bfs(i2s) != div)) in i2s_set_clkdiv()
970 dev_err(&i2s->pdev->dev, in i2s_set_clkdiv()
974 i2s->bfs = div; in i2s_set_clkdiv()
978 dev_err(&i2s->pdev->dev, in i2s_set_clkdiv()
989 struct i2s_dai *i2s = to_info(dai); in i2s_delay() local
990 u32 reg = readl(i2s->addr + I2SFIC); in i2s_delay()
992 const struct samsung_i2s_variant_regs *i2s_regs = i2s->variant_regs; in i2s_delay()
998 else if (is_secondary(i2s)) in i2s_delay()
999 delay = FICS_TXCOUNT(readl(i2s->addr + I2SFICS)); in i2s_delay()
1023 struct i2s_dai *i2s = to_info(dai); in samsung_i2s_dai_probe() local
1024 struct i2s_dai *other = get_other_dai(i2s); in samsung_i2s_dai_probe()
1029 if (is_secondary(i2s)) { /* If this is probe on the secondary DAI */ in samsung_i2s_dai_probe()
1033 snd_soc_dai_init_dma_data(dai, &i2s->dma_playback, in samsung_i2s_dai_probe()
1034 &i2s->dma_capture); in samsung_i2s_dai_probe()
1036 if (i2s->quirks & QUIRK_NEED_RSTCLR) in samsung_i2s_dai_probe()
1037 writel(CON_RSTCLR, i2s->addr + I2SCON); in samsung_i2s_dai_probe()
1039 if (i2s->quirks & QUIRK_SUPPORTS_IDMA) in samsung_i2s_dai_probe()
1040 idma_reg_addr_init(i2s->addr, in samsung_i2s_dai_probe()
1041 i2s->sec_dai->idma_playback.addr); in samsung_i2s_dai_probe()
1045 i2s->rfs = 0; in samsung_i2s_dai_probe()
1046 i2s->bfs = 0; in samsung_i2s_dai_probe()
1047 i2s->rclk_srcrate = 0; in samsung_i2s_dai_probe()
1049 spin_lock_irqsave(i2s->lock, flags); in samsung_i2s_dai_probe()
1050 i2s_txctrl(i2s, 0); in samsung_i2s_dai_probe()
1051 i2s_rxctrl(i2s, 0); in samsung_i2s_dai_probe()
1052 i2s_fifo(i2s, FIC_TXFLUSH); in samsung_i2s_dai_probe()
1054 i2s_fifo(i2s, FIC_RXFLUSH); in samsung_i2s_dai_probe()
1055 spin_unlock_irqrestore(i2s->lock, flags); in samsung_i2s_dai_probe()
1068 struct i2s_dai *i2s = snd_soc_dai_get_drvdata(dai); in samsung_i2s_dai_remove() local
1073 if (!is_secondary(i2s)) { in samsung_i2s_dai_remove()
1074 if (i2s->quirks & QUIRK_NEED_RSTCLR) { in samsung_i2s_dai_remove()
1075 spin_lock_irqsave(i2s->lock, flags); in samsung_i2s_dai_remove()
1076 writel(0, i2s->addr + I2SCON); in samsung_i2s_dai_remove()
1077 spin_unlock_irqrestore(i2s->lock, flags); in samsung_i2s_dai_remove()
1098 .name = "samsung-i2s",
1109 struct i2s_dai *i2s; in i2s_alloc_dai() local
1111 i2s = devm_kzalloc(&pdev->dev, sizeof(struct i2s_dai), GFP_KERNEL); in i2s_alloc_dai()
1112 if (i2s == NULL) in i2s_alloc_dai()
1115 i2s->pdev = pdev; in i2s_alloc_dai()
1116 i2s->pri_dai = NULL; in i2s_alloc_dai()
1117 i2s->sec_dai = NULL; in i2s_alloc_dai()
1118 i2s->i2s_dai_drv.id = 1; in i2s_alloc_dai()
1119 i2s->i2s_dai_drv.symmetric_rates = 1; in i2s_alloc_dai()
1120 i2s->i2s_dai_drv.probe = samsung_i2s_dai_probe; in i2s_alloc_dai()
1121 i2s->i2s_dai_drv.remove = samsung_i2s_dai_remove; in i2s_alloc_dai()
1122 i2s->i2s_dai_drv.ops = &samsung_i2s_dai_ops; in i2s_alloc_dai()
1123 i2s->i2s_dai_drv.suspend = i2s_suspend; in i2s_alloc_dai()
1124 i2s->i2s_dai_drv.resume = i2s_resume; in i2s_alloc_dai()
1125 i2s->i2s_dai_drv.playback.channels_min = 1; in i2s_alloc_dai()
1126 i2s->i2s_dai_drv.playback.channels_max = 2; in i2s_alloc_dai()
1127 i2s->i2s_dai_drv.playback.rates = i2s_dai_data->pcm_rates; in i2s_alloc_dai()
1128 i2s->i2s_dai_drv.playback.formats = SAMSUNG_I2S_FMTS; in i2s_alloc_dai()
1131 i2s->i2s_dai_drv.name = SAMSUNG_I2S_DAI; in i2s_alloc_dai()
1132 i2s->i2s_dai_drv.capture.channels_min = 1; in i2s_alloc_dai()
1133 i2s->i2s_dai_drv.capture.channels_max = 2; in i2s_alloc_dai()
1134 i2s->i2s_dai_drv.capture.rates = i2s_dai_data->pcm_rates; in i2s_alloc_dai()
1135 i2s->i2s_dai_drv.capture.formats = SAMSUNG_I2S_FMTS; in i2s_alloc_dai()
1137 i2s->i2s_dai_drv.name = SAMSUNG_I2S_DAI_SEC; in i2s_alloc_dai()
1139 return i2s; in i2s_alloc_dai()
1145 struct i2s_dai *i2s = dev_get_drvdata(dev); in i2s_runtime_suspend() local
1147 i2s->suspend_i2smod = readl(i2s->addr + I2SMOD); in i2s_runtime_suspend()
1148 i2s->suspend_i2scon = readl(i2s->addr + I2SCON); in i2s_runtime_suspend()
1149 i2s->suspend_i2spsr = readl(i2s->addr + I2SPSR); in i2s_runtime_suspend()
1151 if (i2s->op_clk) in i2s_runtime_suspend()
1152 clk_disable_unprepare(i2s->op_clk); in i2s_runtime_suspend()
1153 clk_disable_unprepare(i2s->clk); in i2s_runtime_suspend()
1160 struct i2s_dai *i2s = dev_get_drvdata(dev); in i2s_runtime_resume() local
1163 ret = clk_prepare_enable(i2s->clk); in i2s_runtime_resume()
1167 if (i2s->op_clk) { in i2s_runtime_resume()
1168 ret = clk_prepare_enable(i2s->op_clk); in i2s_runtime_resume()
1170 clk_disable_unprepare(i2s->clk); in i2s_runtime_resume()
1175 writel(i2s->suspend_i2scon, i2s->addr + I2SCON); in i2s_runtime_resume()
1176 writel(i2s->suspend_i2smod, i2s->addr + I2SMOD); in i2s_runtime_resume()
1177 writel(i2s->suspend_i2spsr, i2s->addr + I2SPSR); in i2s_runtime_resume()
1183 static void i2s_unregister_clocks(struct i2s_dai *i2s) in i2s_unregister_clocks() argument
1187 for (i = 0; i < i2s->clk_data.clk_num; i++) { in i2s_unregister_clocks()
1188 if (!IS_ERR(i2s->clk_table[i])) in i2s_unregister_clocks()
1189 clk_unregister(i2s->clk_table[i]); in i2s_unregister_clocks()
1195 struct i2s_dai *i2s = dev_get_drvdata(&pdev->dev); in i2s_unregister_clock_provider() local
1198 i2s_unregister_clocks(i2s); in i2s_unregister_clock_provider()
1207 struct i2s_dai *i2s = dev_get_drvdata(dev); in i2s_register_clock_provider() local
1208 const struct samsung_i2s_variant_regs *reg_info = i2s->variant_regs; in i2s_register_clock_provider()
1233 if (!(i2s->quirks & QUIRK_NO_MUXPSR)) { in i2s_register_clock_provider()
1235 u32 val = readl(i2s->addr + I2SPSR); in i2s_register_clock_provider()
1236 writel(val | PSR_PSREN, i2s->addr + I2SPSR); in i2s_register_clock_provider()
1238 i2s->clk_table[CLK_I2S_RCLK_SRC] = clk_register_mux(dev, in i2s_register_clock_provider()
1242 i2s->addr + I2SMOD, reg_info->rclksrc_off, in i2s_register_clock_provider()
1243 1, 0, i2s->lock); in i2s_register_clock_provider()
1245 i2s->clk_table[CLK_I2S_RCLK_PSR] = clk_register_divider(dev, in i2s_register_clock_provider()
1249 i2s->addr + I2SPSR, 8, 6, 0, i2s->lock); in i2s_register_clock_provider()
1252 i2s->clk_data.clk_num = 2; in i2s_register_clock_provider()
1255 i2s->clk_table[CLK_I2S_CDCLK] = clk_register_gate(dev, in i2s_register_clock_provider()
1258 i2s->addr + I2SMOD, reg_info->cdclkcon_off, in i2s_register_clock_provider()
1259 CLK_GATE_SET_TO_DISABLE, i2s->lock); in i2s_register_clock_provider()
1261 i2s->clk_data.clk_num += 1; in i2s_register_clock_provider()
1262 i2s->clk_data.clks = i2s->clk_table; in i2s_register_clock_provider()
1265 &i2s->clk_data); in i2s_register_clock_provider()
1268 i2s_unregister_clocks(i2s); in i2s_register_clock_provider()
1535 .name = "samsung-i2s",
1545 .compatible = "samsung,s3c6410-i2s",
1548 .compatible = "samsung,s5pv210-i2s",
1551 .compatible = "samsung,exynos5420-i2s",
1554 .compatible = "samsung,exynos7-i2s",
1577 .name = "samsung-i2s",
1587 MODULE_DESCRIPTION("Samsung I2S Interface");
1588 MODULE_ALIAS("platform:samsung-i2s");