Lines Matching defs:i2s

69 	struct img_i2s_out *i2s = dev_get_drvdata(dev);
71 clk_disable_unprepare(i2s->clk_ref);
72 clk_disable_unprepare(i2s->clk_sys);
79 struct img_i2s_out *i2s = dev_get_drvdata(dev);
82 ret = clk_prepare_enable(i2s->clk_sys);
88 ret = clk_prepare_enable(i2s->clk_ref);
91 clk_disable_unprepare(i2s->clk_sys);
98 static inline void img_i2s_out_writel(struct img_i2s_out *i2s, u32 val,
101 writel(val, i2s->base + reg);
104 static inline u32 img_i2s_out_readl(struct img_i2s_out *i2s, u32 reg)
106 return readl(i2s->base + reg);
109 static inline void img_i2s_out_ch_writel(struct img_i2s_out *i2s,
112 writel(val, i2s->channel_base + (chan * IMG_I2S_OUT_CH_STRIDE) + reg);
115 static inline u32 img_i2s_out_ch_readl(struct img_i2s_out *i2s, u32 chan,
118 return readl(i2s->channel_base + (chan * IMG_I2S_OUT_CH_STRIDE) + reg);
121 static inline void img_i2s_out_ch_disable(struct img_i2s_out *i2s, u32 chan)
125 reg = img_i2s_out_ch_readl(i2s, chan, IMG_I2S_OUT_CH_CTL);
127 img_i2s_out_ch_writel(i2s, chan, reg, IMG_I2S_OUT_CH_CTL);
130 static inline void img_i2s_out_ch_enable(struct img_i2s_out *i2s, u32 chan)
134 reg = img_i2s_out_ch_readl(i2s, chan, IMG_I2S_OUT_CH_CTL);
136 img_i2s_out_ch_writel(i2s, chan, reg, IMG_I2S_OUT_CH_CTL);
139 static inline void img_i2s_out_disable(struct img_i2s_out *i2s)
143 reg = img_i2s_out_readl(i2s, IMG_I2S_OUT_CTL);
145 img_i2s_out_writel(i2s, reg, IMG_I2S_OUT_CTL);
148 static inline void img_i2s_out_enable(struct img_i2s_out *i2s)
152 reg = img_i2s_out_readl(i2s, IMG_I2S_OUT_CTL);
154 img_i2s_out_writel(i2s, reg, IMG_I2S_OUT_CTL);
157 static void img_i2s_out_reset(struct img_i2s_out *i2s)
162 core_ctl = img_i2s_out_readl(i2s, IMG_I2S_OUT_CTL) &
166 if (!i2s->force_clk_active)
169 chan_ctl = img_i2s_out_ch_readl(i2s, 0, IMG_I2S_OUT_CH_CTL) &
172 reset_control_assert(i2s->rst);
173 reset_control_deassert(i2s->rst);
175 for (i = 0; i < i2s->max_i2s_chan; i++)
176 img_i2s_out_ch_writel(i2s, i, chan_ctl, IMG_I2S_OUT_CH_CTL);
178 for (i = 0; i < i2s->active_channels; i++)
179 img_i2s_out_ch_enable(i2s, i);
181 img_i2s_out_writel(i2s, core_ctl, IMG_I2S_OUT_CTL);
182 img_i2s_out_enable(i2s);
188 struct img_i2s_out *i2s = snd_soc_dai_get_drvdata(dai);
195 reg = img_i2s_out_readl(i2s, IMG_I2S_OUT_CTL);
196 if (!i2s->force_clk_active)
199 img_i2s_out_writel(i2s, reg, IMG_I2S_OUT_CTL);
204 img_i2s_out_reset(i2s);
216 struct img_i2s_out *i2s = snd_soc_dai_get_drvdata(dai);
232 (channels > (i2s->max_i2s_chan * 2)) ||
236 pre_div_a = clk_round_rate(i2s->clk_ref, rate * 256);
239 pre_div_b = clk_round_rate(i2s->clk_ref, rate * 384);
248 clk_set_rate(i2s->clk_ref, pre_div_b);
250 clk_set_rate(i2s->clk_ref, pre_div_a);
257 clk_rate = clk_get_rate(i2s->clk_ref);
272 img_i2s_out_disable(i2s);
274 reg = img_i2s_out_readl(i2s, IMG_I2S_OUT_CTL);
276 img_i2s_out_writel(i2s, reg, IMG_I2S_OUT_CTL);
279 img_i2s_out_ch_enable(i2s, i);
281 for (; i < i2s->max_i2s_chan; i++)
282 img_i2s_out_ch_disable(i2s, i);
284 img_i2s_out_enable(i2s);
286 i2s->active_channels = i2s_channels;
293 struct img_i2s_out *i2s = snd_soc_dai_get_drvdata(dai);
349 ret = pm_runtime_resume_and_get(i2s->dev);
353 img_i2s_out_disable(i2s);
355 reg = img_i2s_out_readl(i2s, IMG_I2S_OUT_CTL);
357 img_i2s_out_writel(i2s, reg, IMG_I2S_OUT_CTL);
359 for (i = 0; i < i2s->active_channels; i++)
360 img_i2s_out_ch_disable(i2s, i);
362 for (i = 0; i < i2s->max_i2s_chan; i++) {
363 reg = img_i2s_out_ch_readl(i2s, i, IMG_I2S_OUT_CH_CTL);
365 img_i2s_out_ch_writel(i2s, i, reg, IMG_I2S_OUT_CH_CTL);
368 for (i = 0; i < i2s->active_channels; i++)
369 img_i2s_out_ch_enable(i2s, i);
371 img_i2s_out_enable(i2s);
372 pm_runtime_put(i2s->dev);
374 i2s->force_clk_active = force_clk_active;
381 struct img_i2s_out *i2s = snd_soc_dai_get_drvdata(dai);
383 snd_soc_dai_init_dma_data(dai, &i2s->dma_data, NULL);
396 .name = "img-i2s-out",
427 struct img_i2s_out *i2s;
435 i2s = devm_kzalloc(&pdev->dev, sizeof(*i2s), GFP_KERNEL);
436 if (!i2s)
439 platform_set_drvdata(pdev, i2s);
441 i2s->dev = &pdev->dev;
447 i2s->base = base;
449 if (of_property_read_u32(pdev->dev.of_node, "img,i2s-channels",
450 &i2s->max_i2s_chan)) {
451 dev_err(&pdev->dev, "No img,i2s-channels property\n");
455 max_i2s_chan_pow_2 = 1 << get_count_order(i2s->max_i2s_chan);
457 i2s->channel_base = base + (max_i2s_chan_pow_2 * 0x20);
459 i2s->rst = devm_reset_control_get_exclusive(&pdev->dev, "rst");
460 if (IS_ERR(i2s->rst))
461 return dev_err_probe(&pdev->dev, PTR_ERR(i2s->rst),
464 i2s->clk_sys = devm_clk_get(&pdev->dev, "sys");
465 if (IS_ERR(i2s->clk_sys))
466 return dev_err_probe(dev, PTR_ERR(i2s->clk_sys),
469 i2s->clk_ref = devm_clk_get(&pdev->dev, "ref");
470 if (IS_ERR(i2s->clk_ref))
471 return dev_err_probe(dev, PTR_ERR(i2s->clk_ref),
474 i2s->suspend_ch_ctl = devm_kcalloc(dev,
475 i2s->max_i2s_chan, sizeof(*i2s->suspend_ch_ctl), GFP_KERNEL);
476 if (!i2s->suspend_ch_ctl)
490 img_i2s_out_writel(i2s, reg, IMG_I2S_OUT_CTL);
497 for (i = 0; i < i2s->max_i2s_chan; i++)
498 img_i2s_out_ch_writel(i2s, i, reg, IMG_I2S_OUT_CH_CTL);
500 img_i2s_out_reset(i2s);
503 i2s->active_channels = 1;
504 i2s->dma_data.addr = res->start + IMG_I2S_OUT_TX_FIFO;
505 i2s->dma_data.addr_width = 4;
506 i2s->dma_data.maxburst = 4;
508 i2s->dai_driver.playback.channels_min = 2;
509 i2s->dai_driver.playback.channels_max = i2s->max_i2s_chan * 2;
510 i2s->dai_driver.playback.rates = SNDRV_PCM_RATE_8000_192000;
511 i2s->dai_driver.playback.formats = SNDRV_PCM_FMTBIT_S32_LE;
512 i2s->dai_driver.ops = &img_i2s_out_dai_ops;
515 &img_i2s_out_component, &i2s->dai_driver, 1);
545 struct img_i2s_out *i2s = dev_get_drvdata(dev);
555 for (i = 0; i < i2s->max_i2s_chan; i++) {
556 reg = img_i2s_out_ch_readl(i2s, i, IMG_I2S_OUT_CH_CTL);
557 i2s->suspend_ch_ctl[i] = reg;
560 i2s->suspend_ctl = img_i2s_out_readl(i2s, IMG_I2S_OUT_CTL);
569 struct img_i2s_out *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_out_ch_writel(i2s, i, reg, IMG_I2S_OUT_CH_CTL);
582 img_i2s_out_writel(i2s, i2s->suspend_ctl, IMG_I2S_OUT_CTL);
592 { .compatible = "img,i2s-out" },
605 .name = "img-i2s-out",