2 * ALSA SoC Synopsys I2S Audio Layer
4 * sound/soc/dwc/designware_i2s.c
6 * Copyright (C) 2010 ST Microelectronics
7 * Rajeev Kumar <rajeevkumar.linux@gmail.com>
9 * This file is licensed under the terms of the GNU General Public
10 * License version 2. This program is licensed "as is" without any
11 * warranty of any kind, whether express or implied.
14 #include <linux/clk.h>
15 #include <linux/device.h>
16 #include <linux/init.h>
18 #include <linux/interrupt.h>
19 #include <linux/module.h>
20 #include <linux/slab.h>
21 #include <linux/pm_runtime.h>
22 #include <sound/designware_i2s.h>
23 #include <sound/pcm.h>
24 #include <sound/pcm_params.h>
25 #include <sound/soc.h>
26 #include <sound/dmaengine_pcm.h>
27 #include <linux/mfd/syscon.h>
28 #include <linux/regmap.h>
29 #include <linux/reset.h>
32 #define CLOCK_BASE 0x13020000UL
34 static inline void i2s_write_reg(void __iomem *io_base, int reg, u32 val)
36 writel(val, io_base + reg);
39 static inline u32 i2s_read_reg(void __iomem *io_base, int reg)
41 return readl(io_base + reg);
44 static inline void i2s_disable_channels(struct dw_i2s_dev *dev, u32 stream)
48 if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
49 for (i = 0; i < 4; i++)
50 i2s_write_reg(dev->i2s_base, TER(i), 0);
52 for (i = 0; i < 4; i++)
53 i2s_write_reg(dev->i2s_base, RER(i), 0);
57 static inline void i2s_clear_irqs(struct dw_i2s_dev *dev, u32 stream)
61 if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
62 for (i = 0; i < 4; i++)
63 i2s_read_reg(dev->i2s_base, TOR(i));
65 for (i = 0; i < 4; i++)
66 i2s_read_reg(dev->i2s_base, ROR(i));
70 static inline void i2s_disable_irqs(struct dw_i2s_dev *dev, u32 stream,
75 if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
76 for (i = 0; i <= ((chan_nr + 1) / 2); i++) {
77 irq = i2s_read_reg(dev->i2s_base, IMR(i));
78 i2s_write_reg(dev->i2s_base, IMR(i), irq | 0x30);
81 for (i = 0; i <= ((chan_nr + 1) / 2); i++) {
82 irq = i2s_read_reg(dev->i2s_base, IMR(i));
83 i2s_write_reg(dev->i2s_base, IMR(i), irq | 0x03);
88 static inline void i2s_enable_irqs(struct dw_i2s_dev *dev, u32 stream,
93 if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
94 for (i = 0; i < ((chan_nr + 1) / 2); i++) {
95 irq = i2s_read_reg(dev->i2s_base, IMR(i));
96 i2s_write_reg(dev->i2s_base, IMR(i), irq & ~0x30);
99 for (i = 0; i < ((chan_nr + 1) / 2); i++) {
100 irq = i2s_read_reg(dev->i2s_base, IMR(i));
101 i2s_write_reg(dev->i2s_base, IMR(i), irq & ~0x03);
106 static irqreturn_t i2s_irq_handler(int irq, void *dev_id)
108 struct dw_i2s_dev *dev = dev_id;
109 bool irq_valid = false;
113 for (i = 0; i < 4; i++)
114 isr[i] = i2s_read_reg(dev->i2s_base, ISR(i));
116 i2s_clear_irqs(dev, SNDRV_PCM_STREAM_PLAYBACK);
117 i2s_clear_irqs(dev, SNDRV_PCM_STREAM_CAPTURE);
119 for (i = 0; i < 4; i++) {
121 * Check if TX fifo is empty. If empty fill FIFO with samples
122 * NOTE: Only two channels supported
124 if ((isr[i] & ISR_TXFE) && (i == 0) && dev->use_pio) {
130 * Data available. Retrieve samples from FIFO
131 * NOTE: Only two channels supported
133 if ((isr[i] & ISR_RXDA) && (i == 0) && dev->use_pio) {
138 /* Error Handling: TX */
139 if (isr[i] & ISR_TXFO) {
140 dev_err(dev->dev, "TX overrun (ch_id=%d)\n", i);
144 /* Error Handling: TX */
145 if (isr[i] & ISR_RXFO) {
146 dev_err(dev->dev, "RX overrun (ch_id=%d)\n", i);
157 static void i2s_start(struct dw_i2s_dev *dev,
158 struct snd_pcm_substream *substream)
160 struct i2s_clk_config_data *config = &dev->config;
162 i2s_write_reg(dev->i2s_base, IER, 1);
163 i2s_enable_irqs(dev, substream->stream, config->chan_nr);
165 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
166 i2s_write_reg(dev->i2s_base, ITER, 1);
168 i2s_write_reg(dev->i2s_base, IRER, 1);
170 i2s_write_reg(dev->i2s_base, CER, 1);
173 static void i2s_stop(struct dw_i2s_dev *dev,
174 struct snd_pcm_substream *substream)
177 i2s_clear_irqs(dev, substream->stream);
178 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
179 i2s_write_reg(dev->i2s_base, ITER, 0);
181 i2s_write_reg(dev->i2s_base, IRER, 0);
183 i2s_disable_irqs(dev, substream->stream, 8);
186 i2s_write_reg(dev->i2s_base, CER, 0);
187 i2s_write_reg(dev->i2s_base, IER, 0);
191 static int dw_i2s_startup(struct snd_pcm_substream *substream,
192 struct snd_soc_dai *cpu_dai)
194 struct dw_i2s_dev *dev = snd_soc_dai_get_drvdata(cpu_dai);
195 #ifndef CONFIG_SND_DESIGNWARE_I2S_STARFIVE_JH7110
196 union dw_i2s_snd_dma_data *dma_data = NULL;
199 if (!(dev->capability & DWC_I2S_RECORD) &&
200 (substream->stream == SNDRV_PCM_STREAM_CAPTURE))
203 if (!(dev->capability & DWC_I2S_PLAY) &&
204 (substream->stream == SNDRV_PCM_STREAM_PLAYBACK))
207 #ifndef CONFIG_SND_DESIGNWARE_I2S_STARFIVE_JH7110
208 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
209 dma_data = &dev->play_dma_data;
210 else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
211 dma_data = &dev->capture_dma_data;
213 snd_soc_dai_set_dma_data(cpu_dai, substream, (void *)dma_data);
218 static void dw_i2s_config(struct dw_i2s_dev *dev, int stream)
221 struct i2s_clk_config_data *config = &dev->config;
224 i2s_disable_channels(dev, stream);
225 for (ch_reg = 0; ch_reg < ((config->chan_nr + 1) / 2); ch_reg++) {
226 if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
227 i2s_write_reg(dev->i2s_base, TCR(ch_reg),
228 dev->xfer_resolution);
229 i2s_write_reg(dev->i2s_base, TFCR(ch_reg),
231 i2s_write_reg(dev->i2s_base, TER(ch_reg), 1);
233 i2s_write_reg(dev->i2s_base, RCR(ch_reg),
234 dev->xfer_resolution);
235 i2s_write_reg(dev->i2s_base, RFCR(ch_reg),
237 i2s_write_reg(dev->i2s_base, RER(ch_reg), 1);
243 static int dw_i2s_hw_params(struct snd_pcm_substream *substream,
244 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
246 struct dw_i2s_dev *dev = snd_soc_dai_get_drvdata(dai);
247 struct i2s_clk_config_data *config = &dev->config;
249 unsigned int txrx = substream->stream;
250 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
251 struct snd_soc_dai_link *dai_link = rtd->dai_link;
253 dai_link->stop_dma_first = 1;
254 config->chan_nr = params_channels(params);
255 config->sample_rate = params_rate(params);
257 switch (params_format(params)) {
258 case SNDRV_PCM_FORMAT_S16_LE:
259 if (config->sample_rate == 8000) {
260 dev_err(dev->dev, "I2S: unsupported 8000 rate with S16_LE, Stereo.\n");
264 if (txrx == SNDRV_PCM_STREAM_PLAYBACK)
265 dev->play_dma_data.dt.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
267 dev->capture_dma_data.dt.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
268 config->data_width = 16;
270 dev->xfer_resolution = 0x02;
273 case SNDRV_PCM_FORMAT_S24_LE:
274 config->data_width = 24;
276 dev->xfer_resolution = 0x04;
279 case SNDRV_PCM_FORMAT_S32_LE:
280 if ((config->sample_rate == 16000) && (config->chan_nr == 1)) {
281 dev_err(dev->dev, "I2S: unsupported 16000 rate with S32_LE, Mono.\n");
284 if (txrx == SNDRV_PCM_STREAM_PLAYBACK)
285 dev->play_dma_data.dt.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
287 dev->capture_dma_data.dt.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
289 config->data_width = 32;
291 dev->xfer_resolution = 0x05;
295 dev_err(dev->dev, "designware-i2s: unsupported PCM fmt");
298 snd_soc_dai_set_drvdata(dai, dev);
300 switch (config->chan_nr) {
301 case EIGHT_CHANNEL_SUPPORT:
302 case SIX_CHANNEL_SUPPORT:
303 case FOUR_CHANNEL_SUPPORT:
304 case TWO_CHANNEL_SUPPORT:
305 case ONE_CHANNEL_SUPPORT:
308 dev_err(dev->dev, "channel not supported\n");
312 if (txrx == SNDRV_PCM_STREAM_PLAYBACK) {
313 ret = clk_prepare_enable(dev->clks_dac_bclk);
315 dev_err(dev->dev, "%s: failed to enable clks_dac_bclk\n", __func__);
319 ret = clk_set_parent(dev->clks_bclk, dev->clks_dac_bclk);
321 dev_err(dev->dev, "Can't set clock source for clks_bclk: %d\n", ret);
325 ret = clk_prepare_enable(dev->clks_dac_lrck);
327 dev_err(dev->dev, "%s: failed to enable clks_dac_lrck\n", __func__);
331 ret = clk_set_parent(dev->clks_lrclk, dev->clks_dac_lrck);
333 dev_err(dev->dev, "Can't set clock source for clks_lrclk: %d\n", ret);
336 } else if (txrx == SNDRV_PCM_STREAM_CAPTURE) {
337 ret = clk_prepare_enable(dev->clks[CLK_ADC_BCLK_EXT]);
339 dev_err(dev->dev, "%s: failed to enable CLK_ADC_BCLK_EXT\n", __func__);
343 ret = clk_set_parent(dev->clks[CLK_ADC_RX_BCLK], dev->clks[CLK_ADC_BCLK_EXT]);
345 dev_err(dev->dev, "Can't set clock source for CLK_ADC_RX_BCLK: %d\n", ret);
349 ret = clk_prepare_enable(dev->clks[CLK_ADC_LRCK_EXT]);
351 dev_err(dev->dev, "%s: failed to enable CLK_ADC_LRCK_EXT\n", __func__);
355 ret = clk_set_parent(dev->clks[CLK_ADC_RX_LRCK], dev->clks[CLK_ADC_LRCK_EXT]);
357 dev_err(dev->dev, "Can't set clock source for CLK_ADC_RX_LRCK: %d\n", ret);
362 dw_i2s_config(dev, substream->stream);
364 i2s_write_reg(dev->i2s_base, CCR, dev->ccr);
366 if (dev->capability & DW_I2S_MASTER) {
367 if (dev->i2s_clk_cfg) {
368 ret = dev->i2s_clk_cfg(config);
370 dev_err(dev->dev, "runtime audio clk config fail\n");
374 u32 bitclk = config->sample_rate *
375 config->data_width * 2;
377 ret = clk_set_rate(dev->clk, bitclk);
379 dev_err(dev->dev, "Can't set I2S clock rate: %d\n",
388 static void dw_i2s_shutdown(struct snd_pcm_substream *substream,
389 struct snd_soc_dai *dai)
391 #ifndef CONFIG_SND_DESIGNWARE_I2S_STARFIVE_JH7110
392 snd_soc_dai_set_dma_data(dai, substream, NULL);
396 static int dw_i2s_prepare(struct snd_pcm_substream *substream,
397 struct snd_soc_dai *dai)
399 struct dw_i2s_dev *dev = snd_soc_dai_get_drvdata(dai);
401 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
402 i2s_write_reg(dev->i2s_base, TXFFR, 1);
404 i2s_write_reg(dev->i2s_base, RXFFR, 1);
409 static int dw_i2s_trigger(struct snd_pcm_substream *substream,
410 int cmd, struct snd_soc_dai *dai)
412 struct dw_i2s_dev *dev = snd_soc_dai_get_drvdata(dai);
416 case SNDRV_PCM_TRIGGER_START:
417 case SNDRV_PCM_TRIGGER_RESUME:
418 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
420 i2s_start(dev, substream);
423 case SNDRV_PCM_TRIGGER_STOP:
424 case SNDRV_PCM_TRIGGER_SUSPEND:
425 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
427 i2s_stop(dev, substream);
436 static int dw_i2s_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
438 struct dw_i2s_dev *dev = snd_soc_dai_get_drvdata(cpu_dai);
441 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
442 case SND_SOC_DAIFMT_CBM_CFM:
443 if (dev->capability & DW_I2S_SLAVE)
448 case SND_SOC_DAIFMT_CBS_CFS:
449 if (dev->capability & DW_I2S_MASTER)
454 case SND_SOC_DAIFMT_CBM_CFS:
455 case SND_SOC_DAIFMT_CBS_CFM:
459 dev_dbg(dev->dev, "dwc : Invalid master/slave format\n");
466 static const struct snd_soc_dai_ops dw_i2s_dai_ops = {
467 .startup = dw_i2s_startup,
468 .shutdown = dw_i2s_shutdown,
469 .hw_params = dw_i2s_hw_params,
470 .prepare = dw_i2s_prepare,
471 .trigger = dw_i2s_trigger,
472 .set_fmt = dw_i2s_set_fmt,
476 static int dw_i2s_runtime_suspend(struct device *dev)
478 struct dw_i2s_dev *dw_dev = dev_get_drvdata(dev);
480 if (dw_dev->capability & DW_I2S_MASTER)
481 clk_disable(dw_dev->clk);
485 static int dw_i2s_runtime_resume(struct device *dev)
487 struct dw_i2s_dev *dw_dev = dev_get_drvdata(dev);
489 if (dw_dev->capability & DW_I2S_MASTER)
490 clk_enable(dw_dev->clk);
494 static int dw_i2s_suspend(struct snd_soc_component *component)
496 struct dw_i2s_dev *dev = snd_soc_component_get_drvdata(component);
498 if (dev->capability & DW_I2S_MASTER)
499 clk_disable(dev->clk);
503 static int dw_i2s_resume(struct snd_soc_component *component)
505 struct dw_i2s_dev *dev = snd_soc_component_get_drvdata(component);
506 struct snd_soc_dai *dai;
509 if (dev->capability & DW_I2S_MASTER)
510 clk_enable(dev->clk);
512 for_each_component_dais(component, dai) {
513 for_each_pcm_streams(stream)
514 if (snd_soc_dai_stream_active(dai, stream))
515 dw_i2s_config(dev, stream);
522 #define dw_i2s_suspend NULL
523 #define dw_i2s_resume NULL
526 static const struct snd_soc_component_driver dw_i2s_component = {
528 .suspend = dw_i2s_suspend,
529 .resume = dw_i2s_resume,
532 static int dw_i2srx_clk_init(struct platform_device *pdev, struct dw_i2s_dev *dev)
536 static struct clk_bulk_data clks[] = {
539 { .id = "audioroot" },
540 { .id = "mclk-inner" },
541 { .id = "bclk_mst" },
542 { .id = "3ch-lrck" },
546 { .id = "bclk-ext" },
547 { .id = "lrck-ext" },
550 ret = devm_clk_bulk_get(&pdev->dev, ARRAY_SIZE(clks), clks);
552 dev_err(&pdev->dev, "%s: failed to get audio_subsys clocks\n", __func__);
555 dev->clks[CLK_ADC_APB0] = clks[0].clk;
556 dev->clks[CLK_ADC_APB] = clks[1].clk;
557 dev->clks[CLK_ADC_AUDROOT] = clks[2].clk;
558 dev->clks[CLK_ADC_MCLK_INNER] = clks[3].clk;
559 dev->clks[CLK_ADC_BCLK] = clks[4].clk;
560 dev->clks[CLK_ADC_LRCLK] = clks[5].clk;
561 dev->clks[CLK_ADC_RX_BCLK] = clks[6].clk;
562 dev->clks[CLK_ADC_RX_LRCK] = clks[7].clk;
563 dev->clks[CLK_ADC_MCLK] = clks[8].clk;
564 dev->clks[CLK_ADC_BCLK_EXT] = clks[9].clk;
565 dev->clks[CLK_ADC_LRCK_EXT] = clks[10].clk;
567 ret = clk_prepare_enable(dev->clks[CLK_ADC_APB0]);
569 dev_err(&pdev->dev, "%s: failed to enable CLK_ADC_APB0\n", __func__);
570 goto disable_APB0_clk;
573 ret = clk_prepare_enable(dev->clks[CLK_ADC_APB]);
575 dev_err(&pdev->dev, "%s: failed to enable CLK_ADC_APB\n", __func__);
576 goto disable_APB_clk;
579 ret = clk_prepare_enable(dev->clks[CLK_ADC_AUDROOT]);
581 dev_err(&pdev->dev, "%s: failed to enable CLK_ADC_AUDROOT\n", __func__);
582 goto disable_audroot_clk;
585 ret = clk_set_rate(dev->clks[CLK_ADC_AUDROOT], 204800000);
587 dev_err(&pdev->dev, "failed to set rate for CLK_ADC_MCLK \n");
588 goto disable_audroot_clk;
591 ret = clk_prepare_enable(dev->clks[CLK_ADC_MCLK_INNER]);
593 dev_err(&pdev->dev, "%s: failed to enable CLK_ADC_MCLK_INNER\n", __func__);
594 goto disable_inner_clk;
597 ret = clk_set_rate(dev->clks[CLK_ADC_MCLK_INNER], 4096000);
599 dev_err(&pdev->dev, "failed to set rate for CLK_ADC_MCLK \n");
600 goto disable_inner_clk;
603 ret = clk_prepare_enable(dev->clks[CLK_ADC_BCLK]);
605 dev_err(&pdev->dev, "%s: failed to enable CLK_ADC_BCLK\n", __func__);
609 ret = clk_prepare_enable(dev->clks[CLK_ADC_LRCLK]);
611 dev_err(&pdev->dev, "%s: failed to enable CLK_ADC_LRCLK\n", __func__);
615 ret = clk_prepare_enable(dev->clks[CLK_ADC_RX_BCLK]);
617 dev_err(&pdev->dev, "%s: failed to enable CLK_ADC_RX_BCLK\n", __func__);
618 goto disable_rx_bclk;
621 ret = clk_prepare_enable(dev->clks[CLK_ADC_RX_LRCK]);
623 dev_err(&pdev->dev, "%s: failed to enable CLK_ADC_RX_LRCK\n", __func__);
624 goto disable_rx_lrclk;
626 dev_dbg(&pdev->dev, "dev->clks[CLK_ADC_APB0] = %lu \n", clk_get_rate(dev->clks[CLK_ADC_APB0]));
627 dev_dbg(&pdev->dev, "dev->clks[CLK_ADC_APB] = %lu \n", clk_get_rate(dev->clks[CLK_ADC_APB]));
628 dev_dbg(&pdev->dev, "dev->clks[CLK_ADC_BCLK] = %lu \n", clk_get_rate(dev->clks[CLK_ADC_BCLK]));
629 dev_dbg(&pdev->dev, "dev->clks[CLK_ADC_LRCLK] = %lu \n", clk_get_rate(dev->clks[CLK_ADC_LRCLK]));
630 dev_dbg(&pdev->dev, "dev->clks[CLK_ADC_RX_BCLK] = %lu \n", clk_get_rate(dev->clks[CLK_ADC_RX_BCLK]));
631 dev_dbg(&pdev->dev, "dev->clks[CLK_ADC_RX_LRCK] = %lu \n", clk_get_rate(dev->clks[CLK_ADC_RX_LRCK]));
633 dev->rstc_rx = devm_reset_control_array_get_exclusive(&pdev->dev);
634 if (IS_ERR(dev->rstc_rx)) {
635 dev_err(&pdev->dev, "%s: failed to get rstc_rx reset control\n", __func__);
636 goto disable_rx_lrclk;
639 ret = reset_control_assert(dev->rstc_rx);
641 dev_err(&pdev->dev, "%s: failed to reset control assert rstc_rx\n", __func__);
642 goto disable_rx_lrclk;
645 ret = reset_control_deassert(dev->rstc_rx);
647 dev_err(&pdev->dev, "%s: failed to reset control deassert rstc_rx\n", __func__);
648 goto disable_rx_lrclk;
651 /*i2srx_3ch_adc_enable*/
652 regmap_update_bits(dev->syscon_base, dev->syscon_offset_18,
656 regmap_update_bits(dev->syscon_base, dev->syscon_offset_34,
657 (0x1 << 10) | (0x1 << 14) | (0x1<<17), (0x0<<10) | (0x0<<14) | (0x0<<17));
662 clk_disable_unprepare(dev->clks[CLK_ADC_RX_LRCK]);
664 clk_disable_unprepare(dev->clks[CLK_ADC_RX_BCLK]);
666 clk_disable_unprepare(dev->clks[CLK_ADC_LRCLK]);
668 clk_disable_unprepare(dev->clks[CLK_ADC_BCLK]);
670 clk_disable_unprepare(dev->clks[CLK_ADC_MCLK_INNER]);
672 clk_disable_unprepare(dev->clks[CLK_ADC_AUDROOT]);
674 clk_disable_unprepare(dev->clks[CLK_ADC_APB]);
676 clk_disable_unprepare(dev->clks[CLK_ADC_APB0]);
681 static int dw_i2stx_4ch0_clk_init(struct platform_device *pdev, struct dw_i2s_dev *dev)
683 static struct clk_bulk_data i2sclk[] = {
684 { .id = "inner" }, //clock-names in dts file
685 { .id = "bclk-mst" },
686 { .id = "lrck-mst" },
694 ret = devm_clk_bulk_get(&pdev->dev, ARRAY_SIZE(i2sclk), i2sclk);
696 printk(KERN_INFO "%s: failed to get i2stx 4ch0 clocks\n", __func__);
700 dev->clks[CLK_DAC_INNER] = i2sclk[0].clk;
701 dev->clks[CLK_DAC_BCLK_MST] = i2sclk[1].clk;
702 dev->clks[CLK_DAC_LRCLK_MST] = i2sclk[2].clk;
703 dev->clks[CLK_MCLK] = i2sclk[3].clk;
704 dev->clks[CLK_DAC_BCLK0] = i2sclk[4].clk;
705 dev->clks[CLK_DAC_LRCLK0] = i2sclk[5].clk;
707 ret = clk_prepare_enable(dev->clks[CLK_DAC_INNER]);
709 dev_err(&pdev->dev, "%s: failed to enable CLK_DAC_INNER\n", __func__);
710 goto disable_inner_clk;
713 ret = clk_prepare_enable(dev->clks[CLK_DAC_BCLK_MST]);
715 dev_err(&pdev->dev, "%s: failed to enable CLK_DAC_BCLK_MST\n", __func__);
716 goto disable_bclk_mst;
719 ret = clk_prepare_enable(dev->clks[CLK_DAC_LRCLK_MST]);
721 dev_err(&pdev->dev, "%s: failed to enable CLK_DAC_LRCLK_MST\n", __func__);
722 goto disable_lrclk_mst;
725 ret = clk_prepare_enable(dev->clks[CLK_MCLK]);
727 dev_err(&pdev->dev, "%s: failed to enable CLK_MCLK\n", __func__);
731 ret = clk_prepare_enable(dev->clks[CLK_DAC_BCLK0]);
733 dev_err(&pdev->dev, "%s: failed to enable CLK_DAC_BCLK0\n", __func__);
737 ret = clk_prepare_enable(dev->clks[CLK_DAC_LRCLK0]);
739 dev_err(&pdev->dev, "%s: failed to enable CLK_DAC_LRCLK0\n", __func__);
743 dev->rstc_ch0 = devm_reset_control_array_get_exclusive(&pdev->dev);
744 if (IS_ERR(dev->rstc_ch0)) {
745 dev_err(&pdev->dev, "%s: failed to get rstc_ch0 reset control\n", __func__);
749 ret = reset_control_deassert(dev->rstc_ch0);
751 dev_err(&pdev->dev, "%s: failed to reset control deassert rstc_ch0\n", __func__);
758 clk_disable_unprepare(dev->clks[CLK_DAC_LRCLK0]);
760 clk_disable_unprepare(dev->clks[CLK_DAC_BCLK0]);
762 clk_disable_unprepare(dev->clks[CLK_MCLK]);
764 clk_disable_unprepare(dev->clks[CLK_DAC_LRCLK_MST]);
766 clk_disable_unprepare(dev->clks[CLK_DAC_BCLK_MST]);
768 clk_disable_unprepare(dev->clks[CLK_DAC_INNER]);
773 static int dw_i2stx_4ch1_clk_init(struct platform_device *pdev, struct dw_i2s_dev *dev)
777 dev->clks_audroot = devm_clk_get(&pdev->dev, "audroot");
778 if (IS_ERR(dev->clks_audroot))
779 return PTR_ERR(dev->clks_audroot);
781 dev->clks_inner = devm_clk_get(&pdev->dev, "mclk_inner");
782 if (IS_ERR(dev->clks_inner))
783 return PTR_ERR(dev->clks_inner);
785 dev->clks_bclk_mst = devm_clk_get(&pdev->dev, "bclk_mst");
786 if (IS_ERR(dev->clks_bclk_mst))
787 return PTR_ERR(dev->clks_bclk_mst);
789 dev->clks_lrclk_mst = devm_clk_get(&pdev->dev, "lrck_mst");
790 if (IS_ERR(dev->clks_lrclk_mst))
791 return PTR_ERR(dev->clks_lrclk_mst);
793 dev->clks_mclk = devm_clk_get(&pdev->dev, "mclk");
794 if (IS_ERR(dev->clks_mclk))
795 return PTR_ERR(dev->clks_mclk);
797 dev->clks_bclk = devm_clk_get(&pdev->dev, "4chbclk");
798 if (IS_ERR(dev->clks_bclk))
799 return PTR_ERR(dev->clks_bclk);
801 dev->clks_lrclk = devm_clk_get(&pdev->dev, "4chlrck");
802 if (IS_ERR(dev->clks_lrclk))
803 return PTR_ERR(dev->clks_lrclk);
805 dev->clks_mclk_out = devm_clk_get(&pdev->dev, "mclk_out");
806 if (IS_ERR(dev->clks_mclk_out))
807 return PTR_ERR(dev->clks_mclk_out);
809 dev->clks_apb0 = devm_clk_get(&pdev->dev, "apb0");
810 if (IS_ERR(dev->clks_apb0))
811 return PTR_ERR(dev->clks_apb0);
813 dev->clks_4ch_apb = devm_clk_get(&pdev->dev, "clk_apb");
814 if (IS_ERR(dev->clks_4ch_apb))
815 return PTR_ERR(dev->clks_4ch_apb);
817 dev->clks_dac_bclk = devm_clk_get(&pdev->dev, "bclk_ext");
818 if (IS_ERR(dev->clks_dac_bclk))
819 return PTR_ERR(dev->clks_dac_bclk);
821 dev->clks_dac_lrck = devm_clk_get(&pdev->dev, "lrck_ext");
822 if (IS_ERR(dev->clks_dac_lrck))
823 return PTR_ERR(dev->clks_dac_lrck);
825 ret = clk_prepare_enable(dev->clks_audroot);
827 dev_err(&pdev->dev, "%s: failed to enable clks_audroot\n", __func__);
828 goto disable_audioroot_clk;
830 ret = clk_set_rate(dev->clks_audroot, 204800000);
832 dev_err(&pdev->dev, "failed to set rate for clks_audroot ret=%d\n", ret);
833 goto disable_audioroot_clk;
836 ret = clk_prepare_enable(dev->clks_inner);
838 dev_err(&pdev->dev, "%s: failed to enable clks_inner\n", __func__);
839 goto disable_audinner_clk;
842 ret = clk_set_rate(dev->clks_inner, 4096000);
844 dev_err(&pdev->dev, "failed to set rate for clks_inner ret=%d\n", ret);
845 goto disable_audinner_clk;
848 ret = clk_prepare_enable(dev->clks_bclk_mst);
850 dev_err(&pdev->dev, "%s: failed to enable clks_bclk_mst\n", __func__);
851 goto disable_mst_bclk;
854 ret = clk_set_rate(dev->clks_bclk_mst, 1024000);
856 dev_err(&pdev->dev, "failed to set rate for clks_bclk_mst ret=%d\n", ret);
857 goto disable_mst_bclk;
860 ret = clk_prepare_enable(dev->clks_lrclk_mst);
862 dev_err(&pdev->dev, "%s: failed to enable clks_lrclk_mst\n", __func__);
863 goto disable_mst_lrclk;
866 ret = clk_prepare_enable(dev->clks_mclk);
868 dev_err(&pdev->dev, "%s: failed to enable clks_mclk\n", __func__);
872 ret = clk_prepare_enable(dev->clks_bclk);
874 dev_err(&pdev->dev, "%s: failed to enable clks_bclk\n", __func__);
878 ret = clk_prepare_enable(dev->clks_lrclk);
880 dev_err(&pdev->dev, "%s: failed to enable clks_lrclk\n", __func__);
884 ret = clk_prepare_enable(dev->clks_mclk_out);
886 dev_err(&pdev->dev, "%s: failed to enable clks_mclk_out\n", __func__);
887 goto disable_mclk_out;
890 ret = clk_prepare_enable(dev->clks_apb0);
892 dev_err(&pdev->dev, "%s: failed to enable clks_apb0\n", __func__);
896 ret = clk_prepare_enable(dev->clks_4ch_apb);
898 dev_err(&pdev->dev, "%s: failed to enable clks_4ch_apb\n", __func__);
899 goto disable_4ch_apb;
903 dev_dbg(&pdev->dev, "dev->clks_inner = %lu \n", clk_get_rate(dev->clks_inner));
904 dev_dbg(&pdev->dev, "dev->clks_bclk_mst = %lu \n", clk_get_rate(dev->clks_bclk_mst));
905 dev_dbg(&pdev->dev, "dev->clks_lrclk_mst = %lu \n", clk_get_rate(dev->clks_lrclk_mst));
906 dev_dbg(&pdev->dev, "dev->clks_mclk = %lu \n", clk_get_rate(dev->clks_mclk));
907 dev_dbg(&pdev->dev, "dev->clks_bclk = %lu \n", clk_get_rate(dev->clks_bclk));
908 dev_dbg(&pdev->dev, "dev->clks_lrclk = %lu \n", clk_get_rate(dev->clks_lrclk));
909 dev_dbg(&pdev->dev, "dev->clks_mclk_out = %lu \n", clk_get_rate(dev->clks_mclk_out));
910 dev_dbg(&pdev->dev, "dev->clks_apb0 = %lu \n", clk_get_rate(dev->clks_apb0));
911 dev_dbg(&pdev->dev, "dev->clks_4ch_apb = %lu \n", clk_get_rate(dev->clks_4ch_apb));
913 dev->rstc_ch1 = devm_reset_control_array_get_exclusive(&pdev->dev);
914 if (IS_ERR(dev->rstc_ch1)) {
915 dev_err(&pdev->dev, "%s: failed to get rstc_ch1 reset control\n", __func__);
916 goto disable_4ch_apb;
919 ret = reset_control_assert(dev->rstc_ch1);
921 dev_err(&pdev->dev, "%s: failed to reset control assert rstc_ch1\n", __func__);
922 goto disable_4ch_apb;
925 ret = reset_control_deassert(dev->rstc_ch1);
927 dev_err(&pdev->dev, "%s: failed to reset control deassert rstc_ch1\n", __func__);
928 goto disable_4ch_apb;
934 clk_disable_unprepare(dev->clks_4ch_apb);
936 clk_disable_unprepare(dev->clks_apb0);
938 clk_disable_unprepare(dev->clks_mclk_out);
940 clk_disable_unprepare(dev->clks_lrclk);
942 clk_disable_unprepare(dev->clks_bclk);
944 clk_disable_unprepare(dev->clks_mclk);
946 clk_disable_unprepare(dev->clks_lrclk_mst);
948 clk_disable_unprepare(dev->clks_bclk_mst);
949 disable_audinner_clk:
950 clk_disable_unprepare(dev->clks_inner);
951 disable_audioroot_clk:
952 clk_disable_unprepare(dev->clks_audroot);
958 * The following tables allow a direct lookup of various parameters
959 * defined in the I2S block's configuration in terms of sound system
960 * parameters. Each table is sized to the number of entries possible
961 * according to the number of configuration bits describing an I2S
965 /* Maximum bit resolution of a channel - not uniformly spaced */
966 static const u32 fifo_width[COMP_MAX_WORDSIZE] = {
967 12, 16, 20, 24, 32, 0, 0, 0
970 /* Width of (DMA) bus */
971 static const u32 bus_widths[COMP_MAX_DATA_WIDTH] = {
972 DMA_SLAVE_BUSWIDTH_1_BYTE,
973 DMA_SLAVE_BUSWIDTH_2_BYTES,
974 DMA_SLAVE_BUSWIDTH_4_BYTES,
975 DMA_SLAVE_BUSWIDTH_UNDEFINED
978 /* PCM format to support channel resolution */
979 static const u32 formats[COMP_MAX_WORDSIZE] = {
980 SNDRV_PCM_FMTBIT_S16_LE,
981 SNDRV_PCM_FMTBIT_S16_LE,
982 SNDRV_PCM_FMTBIT_S24_LE,
983 SNDRV_PCM_FMTBIT_S24_LE,
984 SNDRV_PCM_FMTBIT_S32_LE,
990 static int dw_configure_dai(struct dw_i2s_dev *dev,
991 struct snd_soc_dai_driver *dw_i2s_dai,
995 * Read component parameter registers to extract
996 * the I2S block's configuration.
998 u32 comp1 = i2s_read_reg(dev->i2s_base, dev->i2s_reg_comp1);
999 u32 comp2 = i2s_read_reg(dev->i2s_base, dev->i2s_reg_comp2);
1000 u32 fifo_depth = 1 << (1 + COMP1_FIFO_DEPTH_GLOBAL(comp1));
1003 if (dev->capability & DWC_I2S_RECORD &&
1004 dev->quirks & DW_I2S_QUIRK_COMP_PARAM1)
1005 comp1 = comp1 & ~BIT(5);
1007 if (dev->capability & DWC_I2S_PLAY &&
1008 dev->quirks & DW_I2S_QUIRK_COMP_PARAM1)
1009 comp1 = comp1 & ~BIT(6);
1011 if (COMP1_TX_ENABLED(comp1)) {
1012 dev_err(dev->dev, " designware: play supported\n");
1013 idx = COMP1_TX_WORDSIZE_0(comp1);
1014 if (WARN_ON(idx >= ARRAY_SIZE(formats)))
1016 if (dev->quirks & DW_I2S_QUIRK_16BIT_IDX_OVERRIDE)
1018 dw_i2s_dai->playback.channels_min = MIN_CHANNEL_NUM;
1019 dw_i2s_dai->playback.channels_max =
1020 1 << (COMP1_TX_CHANNELS(comp1) + 1);
1021 dw_i2s_dai->playback.formats = formats[idx];
1022 for (;idx > 0; idx--)
1023 dw_i2s_dai->playback.formats |= formats[idx - 1];
1025 dw_i2s_dai->playback.rates = rates;
1028 if (COMP1_RX_ENABLED(comp1)) {
1029 dev_err(dev->dev, "designware: record supported\n");
1030 idx = COMP2_RX_WORDSIZE_0(comp2);
1031 if (WARN_ON(idx >= ARRAY_SIZE(formats)))
1033 if (dev->quirks & DW_I2S_QUIRK_16BIT_IDX_OVERRIDE)
1035 dw_i2s_dai->capture.channels_min = MIN_CHANNEL_NUM;
1036 dw_i2s_dai->capture.channels_max =
1037 1 << (COMP1_RX_CHANNELS(comp1) + 1);
1038 dw_i2s_dai->capture.formats = formats[idx];
1039 for (;idx > 0; idx--)
1040 dw_i2s_dai->capture.formats |= formats[idx - 1];
1042 dw_i2s_dai->capture.rates = rates;
1045 if (COMP1_MODE_EN(comp1)) {
1046 dev_err(dev->dev, "designware: i2s master mode supported\n");
1047 dev->capability |= DW_I2S_MASTER;
1049 dev_err(dev->dev, "designware: i2s slave mode supported\n");
1050 dev->capability |= DW_I2S_SLAVE;
1053 dev->fifo_th = fifo_depth / 2;
1057 static int dw_configure_dai_by_pd(struct dw_i2s_dev *dev,
1058 struct snd_soc_dai_driver *dw_i2s_dai,
1059 struct resource *res,
1060 const struct i2s_platform_data *pdata)
1062 u32 comp1 = i2s_read_reg(dev->i2s_base, dev->i2s_reg_comp1);
1063 u32 idx = COMP1_APB_DATA_WIDTH(comp1);
1066 if (WARN_ON(idx >= ARRAY_SIZE(bus_widths)))
1069 ret = dw_configure_dai(dev, dw_i2s_dai, pdata->snd_rates);
1073 if (dev->quirks & DW_I2S_QUIRK_16BIT_IDX_OVERRIDE)
1075 /* Set DMA slaves info */
1076 dev->play_dma_data.pd.data = pdata->play_dma_data;
1077 dev->capture_dma_data.pd.data = pdata->capture_dma_data;
1078 dev->play_dma_data.pd.addr = res->start + I2S_TXDMA;
1079 dev->capture_dma_data.pd.addr = res->start + I2S_RXDMA;
1080 dev->play_dma_data.pd.max_burst = 16;
1081 dev->capture_dma_data.pd.max_burst = 16;
1082 dev->play_dma_data.pd.addr_width = bus_widths[idx];
1083 dev->capture_dma_data.pd.addr_width = bus_widths[idx];
1084 dev->play_dma_data.pd.filter = pdata->filter;
1085 dev->capture_dma_data.pd.filter = pdata->filter;
1090 static int dw_configure_dai_by_dt(struct dw_i2s_dev *dev,
1091 struct snd_soc_dai_driver *dw_i2s_dai,
1092 struct resource *res)
1094 u32 comp1 = i2s_read_reg(dev->i2s_base, I2S_COMP_PARAM_1);
1095 u32 comp2 = i2s_read_reg(dev->i2s_base, I2S_COMP_PARAM_2);
1096 u32 fifo_depth = 1 << (1 + COMP1_FIFO_DEPTH_GLOBAL(comp1));
1097 u32 idx = COMP1_APB_DATA_WIDTH(comp1);
1101 if (WARN_ON(idx >= ARRAY_SIZE(bus_widths)))
1104 ret = dw_configure_dai(dev, dw_i2s_dai, SNDRV_PCM_RATE_8000_192000);
1108 if (COMP1_TX_ENABLED(comp1)) {
1109 idx2 = COMP1_TX_WORDSIZE_0(comp1);
1111 dev->capability |= DWC_I2S_PLAY;
1112 dev->play_dma_data.dt.addr = res->start + I2S_TXDMA;
1113 dev->play_dma_data.dt.addr_width = bus_widths[idx];
1114 dev->play_dma_data.dt.fifo_size = fifo_depth *
1115 (fifo_width[idx2]) >> 8;
1116 dev->play_dma_data.dt.maxburst = 16;
1118 if (COMP1_RX_ENABLED(comp1)) {
1119 idx2 = COMP2_RX_WORDSIZE_0(comp2);
1121 dev->capability |= DWC_I2S_RECORD;
1122 dev->capture_dma_data.dt.addr = res->start + I2S_RXDMA;
1123 dev->capture_dma_data.dt.addr_width = bus_widths[idx];
1124 dev->capture_dma_data.dt.fifo_size = fifo_depth *
1125 (fifo_width[idx2] >> 8);
1126 dev->capture_dma_data.dt.maxburst = 16;
1133 #ifdef CONFIG_SND_DESIGNWARE_I2S_STARFIVE_JH7110
1134 static int dw_i2s_dai_probe(struct snd_soc_dai *dai)
1136 struct dw_i2s_dev *dev = snd_soc_dai_get_drvdata(dai);
1138 snd_soc_dai_init_dma_data(dai, &dev->play_dma_data, &dev->capture_dma_data);
1143 static int dw_i2s_probe(struct platform_device *pdev)
1145 const struct i2s_platform_data *pdata = pdev->dev.platform_data;
1146 struct device_node *np = pdev->dev.of_node;
1147 struct of_phandle_args args;
1148 struct dw_i2s_dev *dev;
1149 struct resource *res;
1151 struct snd_soc_dai_driver *dw_i2s_dai;
1154 dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
1158 dw_i2s_dai = devm_kzalloc(&pdev->dev, sizeof(*dw_i2s_dai), GFP_KERNEL);
1162 dw_i2s_dai->ops = &dw_i2s_dai_ops;
1163 #ifdef CONFIG_SND_DESIGNWARE_I2S_STARFIVE_JH7110
1164 dw_i2s_dai->probe = dw_i2s_dai_probe;
1167 dev->i2s_base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
1168 if (IS_ERR(dev->i2s_base))
1169 return PTR_ERR(dev->i2s_base);
1171 dev->clk_base = ioremap(CLOCK_BASE, 0x300);
1172 if (IS_ERR(dev->clk_base)) {
1173 printk(KERN_INFO "%s: failed to alloc memory for clk_base\n", __func__);
1174 return PTR_ERR(dev->clk_base);
1177 dev->dev = &pdev->dev;
1179 irq = platform_get_irq_optional(pdev, 0);
1181 ret = devm_request_irq(&pdev->dev, irq, i2s_irq_handler, 0,
1184 dev_err(&pdev->dev, "failed to request irq\n");
1189 if (of_device_is_compatible(np, "snps,designware-i2srx")) { //record
1190 ret = of_parse_phandle_with_fixed_args(dev->dev->of_node,
1191 "starfive,sys-syscon", 2, 0, &args);
1193 dev_err(dev->dev, "Failed to parse starfive,sys-syscon\n");
1196 dev->syscon_base = syscon_node_to_regmap(args.np);
1197 of_node_put(args.np);
1198 if (IS_ERR(dev->syscon_base))
1199 return PTR_ERR(dev->syscon_base);
1201 dev->syscon_offset_18 = args.args[0];
1202 dev->syscon_offset_34 = args.args[1];
1203 ret = dw_i2srx_clk_init(pdev, dev);
1205 goto err_clk_disable;
1206 } else if (of_device_is_compatible(np, "snps,designware-i2stx-4ch0")) { //playback
1207 ret = dw_i2stx_4ch0_clk_init(pdev, dev);
1209 goto err_clk_disable;
1210 } else if (of_device_is_compatible(np, "snps,designware-i2stx-4ch1")) { //playback
1211 ret = dw_i2stx_4ch1_clk_init(pdev, dev);
1213 goto err_clk_disable;
1216 dev->i2s_reg_comp1 = I2S_COMP_PARAM_1;
1217 dev->i2s_reg_comp2 = I2S_COMP_PARAM_2;
1219 dev->capability = pdata->cap;
1221 dev->quirks = pdata->quirks;
1222 if (dev->quirks & DW_I2S_QUIRK_COMP_REG_OFFSET) {
1223 dev->i2s_reg_comp1 = pdata->i2s_reg_comp1;
1224 dev->i2s_reg_comp2 = pdata->i2s_reg_comp2;
1226 ret = dw_configure_dai_by_pd(dev, dw_i2s_dai, res, pdata);
1228 clk_id = "bclk_mst";
1229 ret = dw_configure_dai_by_dt(dev, dw_i2s_dai, res);
1234 if (dev->capability & DW_I2S_MASTER) {
1236 dev->i2s_clk_cfg = pdata->i2s_clk_cfg;
1237 if (!dev->i2s_clk_cfg) {
1238 dev_err(&pdev->dev, "no clock configure method\n");
1242 dev->clk = devm_clk_get(&pdev->dev, clk_id);
1244 if (IS_ERR(dev->clk))
1245 return PTR_ERR(dev->clk);
1247 ret = clk_prepare_enable(dev->clk);
1252 dev_set_drvdata(&pdev->dev, dev);
1253 ret = devm_snd_soc_register_component(&pdev->dev, &dw_i2s_component,
1256 dev_err(&pdev->dev, "not able to register dai\n");
1257 goto err_clk_disable;
1262 ret = dw_pcm_register(pdev);
1263 dev->use_pio = true;
1265 ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL,
1267 dev->use_pio = false;
1271 dev_err(&pdev->dev, "could not register pcm: %d\n",
1273 goto err_clk_disable;
1277 pm_runtime_enable(&pdev->dev);
1278 clk_disable_unprepare(dev->clks_mclk_out);
1279 clk_disable_unprepare(dev->clks_bclk_mst);
1280 clk_disable_unprepare(dev->clks_lrclk_mst);
1284 if (dev->capability & DW_I2S_MASTER)
1285 clk_disable_unprepare(dev->clk);
1289 static int dw_i2s_remove(struct platform_device *pdev)
1291 struct dw_i2s_dev *dev = dev_get_drvdata(&pdev->dev);
1293 if (dev->capability & DW_I2S_MASTER)
1294 clk_disable_unprepare(dev->clk);
1296 pm_runtime_disable(&pdev->dev);
1301 static const struct of_device_id dw_i2s_of_match[] = {
1302 { .compatible = "snps,designware-i2stx-4ch1", },
1303 { .compatible = "snps,designware-i2srx", },
1304 { .compatible = "snps,designware-i2stx-4ch0", },
1308 MODULE_DEVICE_TABLE(of, dw_i2s_of_match);
1311 static const struct dev_pm_ops dwc_pm_ops = {
1312 SET_RUNTIME_PM_OPS(dw_i2s_runtime_suspend, dw_i2s_runtime_resume, NULL)
1315 static struct platform_driver dw_i2s_driver = {
1316 .probe = dw_i2s_probe,
1317 .remove = dw_i2s_remove,
1319 .name = "designware-i2s",
1320 .of_match_table = of_match_ptr(dw_i2s_of_match),
1325 static int __init dwci2s_driver_init(void)
1327 return platform_driver_register(&dw_i2s_driver);
1330 static void dwci2s_driver_exit(void)
1332 platform_driver_unregister(&dw_i2s_driver);
1335 late_initcall(dwci2s_driver_init);
1336 module_exit(dwci2s_driver_exit);
1339 MODULE_AUTHOR("Rajeev Kumar <rajeevkumar.linux@gmail.com>");
1340 MODULE_DESCRIPTION("DESIGNWARE I2S SoC Interface");
1341 MODULE_LICENSE("GPL");
1342 MODULE_ALIAS("platform:designware_i2s");