Lines Matching defs:i2s
67 struct img_i2s_in *i2s = dev_get_drvdata(dev);
69 clk_disable_unprepare(i2s->clk_sys);
76 struct img_i2s_in *i2s = dev_get_drvdata(dev);
79 ret = clk_prepare_enable(i2s->clk_sys);
88 static inline void img_i2s_in_writel(struct img_i2s_in *i2s, u32 val, u32 reg)
90 writel(val, i2s->base + reg);
93 static inline u32 img_i2s_in_readl(struct img_i2s_in *i2s, u32 reg)
95 return readl(i2s->base + reg);
98 static inline void img_i2s_in_ch_writel(struct img_i2s_in *i2s, u32 chan,
101 writel(val, i2s->channel_base + (chan * IMG_I2S_IN_CH_STRIDE) + reg);
104 static inline u32 img_i2s_in_ch_readl(struct img_i2s_in *i2s, u32 chan,
107 return readl(i2s->channel_base + (chan * IMG_I2S_IN_CH_STRIDE) + reg);
110 static inline void img_i2s_in_ch_disable(struct img_i2s_in *i2s, u32 chan)
114 reg = img_i2s_in_ch_readl(i2s, chan, IMG_I2S_IN_CH_CTL);
116 img_i2s_in_ch_writel(i2s, chan, reg, IMG_I2S_IN_CH_CTL);
119 static inline void img_i2s_in_ch_enable(struct img_i2s_in *i2s, u32 chan)
123 reg = img_i2s_in_ch_readl(i2s, chan, IMG_I2S_IN_CH_CTL);
125 img_i2s_in_ch_writel(i2s, chan, reg, IMG_I2S_IN_CH_CTL);
128 static inline void img_i2s_in_disable(struct img_i2s_in *i2s)
132 reg = img_i2s_in_readl(i2s, IMG_I2S_IN_CTL);
134 img_i2s_in_writel(i2s, reg, IMG_I2S_IN_CTL);
137 static inline void img_i2s_in_enable(struct img_i2s_in *i2s)
141 reg = img_i2s_in_readl(i2s, IMG_I2S_IN_CTL);
143 img_i2s_in_writel(i2s, reg, IMG_I2S_IN_CTL);
146 static inline void img_i2s_in_flush(struct img_i2s_in *i2s)
151 for (i = 0; i < i2s->active_channels; i++) {
152 reg = img_i2s_in_ch_readl(i2s, i, IMG_I2S_IN_CH_CTL);
154 img_i2s_in_ch_writel(i2s, i, reg, IMG_I2S_IN_CH_CTL);
156 img_i2s_in_ch_writel(i2s, i, reg, IMG_I2S_IN_CH_CTL);
163 struct img_i2s_in *i2s = snd_soc_dai_get_drvdata(dai);
169 img_i2s_in_enable(i2s);
175 img_i2s_in_disable(i2s);
184 static int img_i2s_in_check_rate(struct img_i2s_in *i2s,
193 cur_freq = clk_get_rate(i2s->clk_sys);
205 dev_err(i2s->dev,
217 struct img_i2s_in *i2s = snd_soc_dai_get_drvdata(dai);
252 (channels > (i2s->max_i2s_chan * 2)) ||
258 ret = img_i2s_in_check_rate(i2s, rate, frame_size,
279 reg = img_i2s_in_readl(i2s, IMG_I2S_IN_CTL);
281 img_i2s_in_writel(i2s, reg, IMG_I2S_IN_CTL);
283 for (i = 0; i < i2s->active_channels; i++)
284 img_i2s_in_ch_disable(i2s, i);
286 for (i = 0; i < i2s->max_i2s_chan; i++) {
287 reg = img_i2s_in_ch_readl(i2s, i, IMG_I2S_IN_CH_CTL);
289 img_i2s_in_ch_writel(i2s, i, reg, IMG_I2S_IN_CH_CTL);
292 i2s->active_channels = i2s_channels;
294 img_i2s_in_flush(i2s);
296 for (i = 0; i < i2s->active_channels; i++)
297 img_i2s_in_ch_enable(i2s, i);
304 struct img_i2s_in *i2s = snd_soc_dai_get_drvdata(dai);
345 ret = pm_runtime_resume_and_get(i2s->dev);
349 for (i = 0; i < i2s->active_channels; i++)
350 img_i2s_in_ch_disable(i2s, i);
355 for (i = 0; i < i2s->max_i2s_chan; i++) {
356 reg = img_i2s_in_ch_readl(i2s, i, IMG_I2S_IN_CH_CTL);
358 img_i2s_in_ch_writel(i2s, i, reg, IMG_I2S_IN_CH_CTL);
360 img_i2s_in_ch_writel(i2s, i, reg, IMG_I2S_IN_CH_CTL);
362 img_i2s_in_ch_writel(i2s, i, reg, IMG_I2S_IN_CH_CTL);
365 for (i = 0; i < i2s->active_channels; i++)
366 img_i2s_in_ch_enable(i2s, i);
368 pm_runtime_put(i2s->dev);
375 struct img_i2s_in *i2s = snd_soc_dai_get_drvdata(dai);
377 snd_soc_dai_init_dma_data(dai, NULL, &i2s->dma_data);
390 .name = "img-i2s-in",
421 struct img_i2s_in *i2s;
429 i2s = devm_kzalloc(dev, sizeof(*i2s), GFP_KERNEL);
430 if (!i2s)
433 platform_set_drvdata(pdev, i2s);
435 i2s->dev = dev;
441 i2s->base = base;
443 if (of_property_read_u32(pdev->dev.of_node, "img,i2s-channels",
444 &i2s->max_i2s_chan)) {
445 dev_err(dev, "No img,i2s-channels property\n");
449 max_i2s_chan_pow_2 = 1 << get_count_order(i2s->max_i2s_chan);
451 i2s->channel_base = base + (max_i2s_chan_pow_2 * 0x20);
453 i2s->clk_sys = devm_clk_get(dev, "sys");
454 if (IS_ERR(i2s->clk_sys))
455 return dev_err_probe(dev, PTR_ERR(i2s->clk_sys),
468 i2s->active_channels = 1;
469 i2s->dma_data.addr = res->start + IMG_I2S_IN_RX_FIFO;
470 i2s->dma_data.addr_width = 4;
472 i2s->dai_driver.capture.channels_min = 2;
473 i2s->dai_driver.capture.channels_max = i2s->max_i2s_chan * 2;
474 i2s->dai_driver.capture.rates = SNDRV_PCM_RATE_8000_192000;
475 i2s->dai_driver.capture.formats = SNDRV_PCM_FMTBIT_S32_LE |
477 i2s->dai_driver.ops = &img_i2s_in_dai_ops;
489 img_i2s_in_disable(i2s);
491 for (i = 0; i < i2s->max_i2s_chan; i++)
492 img_i2s_in_ch_disable(i2s, i);
498 img_i2s_in_writel(i2s, 0, IMG_I2S_IN_CTL);
500 for (i = 0; i < i2s->max_i2s_chan; i++)
501 img_i2s_in_ch_writel(i2s, i,
508 i2s->suspend_ch_ctl = devm_kcalloc(dev,
509 i2s->max_i2s_chan, sizeof(*i2s->suspend_ch_ctl), GFP_KERNEL);
510 if (!i2s->suspend_ch_ctl) {
516 &i2s->dai_driver, 1);
545 struct img_i2s_in *i2s = dev_get_drvdata(dev);
555 for (i = 0; i < i2s->max_i2s_chan; i++) {
556 reg = img_i2s_in_ch_readl(i2s, i, IMG_I2S_IN_CH_CTL);
557 i2s->suspend_ch_ctl[i] = reg;
560 i2s->suspend_ctl = img_i2s_in_readl(i2s, IMG_I2S_IN_CTL);
569 struct img_i2s_in *i2s = dev_get_drvdata(dev);
577 for (i = 0; i < i2s->max_i2s_chan; i++) {
578 reg = i2s->suspend_ch_ctl[i];
579 img_i2s_in_ch_writel(i2s, i, reg, IMG_I2S_IN_CH_CTL);
582 img_i2s_in_writel(i2s, i2s->suspend_ctl, IMG_I2S_IN_CTL);
592 { .compatible = "img,i2s-in" },
605 .name = "img-i2s-in",