aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/bcm/bcm2835-i2s.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/bcm/bcm2835-i2s.c')
-rw-r--r--sound/soc/bcm/bcm2835-i2s.c284
1 files changed, 64 insertions, 220 deletions
diff --git a/sound/soc/bcm/bcm2835-i2s.c b/sound/soc/bcm/bcm2835-i2s.c
index 3303d5f58082..1c1f2210387b 100644
--- a/sound/soc/bcm/bcm2835-i2s.c
+++ b/sound/soc/bcm/bcm2835-i2s.c
@@ -37,6 +37,7 @@
37#include <linux/init.h> 37#include <linux/init.h>
38#include <linux/io.h> 38#include <linux/io.h>
39#include <linux/module.h> 39#include <linux/module.h>
40#include <linux/of_address.h>
40#include <linux/slab.h> 41#include <linux/slab.h>
41 42
42#include <sound/core.h> 43#include <sound/core.h>
@@ -46,55 +47,6 @@
46#include <sound/pcm_params.h> 47#include <sound/pcm_params.h>
47#include <sound/soc.h> 48#include <sound/soc.h>
48 49
49/* Clock registers */
50#define BCM2835_CLK_PCMCTL_REG 0x00
51#define BCM2835_CLK_PCMDIV_REG 0x04
52
53/* Clock register settings */
54#define BCM2835_CLK_PASSWD (0x5a000000)
55#define BCM2835_CLK_PASSWD_MASK (0xff000000)
56#define BCM2835_CLK_MASH(v) ((v) << 9)
57#define BCM2835_CLK_FLIP BIT(8)
58#define BCM2835_CLK_BUSY BIT(7)
59#define BCM2835_CLK_KILL BIT(5)
60#define BCM2835_CLK_ENAB BIT(4)
61#define BCM2835_CLK_SRC(v) (v)
62
63#define BCM2835_CLK_SHIFT (12)
64#define BCM2835_CLK_DIVI(v) ((v) << BCM2835_CLK_SHIFT)
65#define BCM2835_CLK_DIVF(v) (v)
66#define BCM2835_CLK_DIVF_MASK (0xFFF)
67
68enum {
69 BCM2835_CLK_MASH_0 = 0,
70 BCM2835_CLK_MASH_1,
71 BCM2835_CLK_MASH_2,
72 BCM2835_CLK_MASH_3,
73};
74
75enum {
76 BCM2835_CLK_SRC_GND = 0,
77 BCM2835_CLK_SRC_OSC,
78 BCM2835_CLK_SRC_DBG0,
79 BCM2835_CLK_SRC_DBG1,
80 BCM2835_CLK_SRC_PLLA,
81 BCM2835_CLK_SRC_PLLC,
82 BCM2835_CLK_SRC_PLLD,
83 BCM2835_CLK_SRC_HDMI,
84};
85
86/* Most clocks are not useable (freq = 0) */
87static const unsigned int bcm2835_clk_freq[BCM2835_CLK_SRC_HDMI+1] = {
88 [BCM2835_CLK_SRC_GND] = 0,
89 [BCM2835_CLK_SRC_OSC] = 19200000,
90 [BCM2835_CLK_SRC_DBG0] = 0,
91 [BCM2835_CLK_SRC_DBG1] = 0,
92 [BCM2835_CLK_SRC_PLLA] = 0,
93 [BCM2835_CLK_SRC_PLLC] = 0,
94 [BCM2835_CLK_SRC_PLLD] = 500000000,
95 [BCM2835_CLK_SRC_HDMI] = 0,
96};
97
98/* I2S registers */ 50/* I2S registers */
99#define BCM2835_I2S_CS_A_REG 0x00 51#define BCM2835_I2S_CS_A_REG 0x00
100#define BCM2835_I2S_FIFO_A_REG 0x04 52#define BCM2835_I2S_FIFO_A_REG 0x04
@@ -158,10 +110,6 @@ static const unsigned int bcm2835_clk_freq[BCM2835_CLK_SRC_HDMI+1] = {
158#define BCM2835_I2S_INT_RXR BIT(1) 110#define BCM2835_I2S_INT_RXR BIT(1)
159#define BCM2835_I2S_INT_TXW BIT(0) 111#define BCM2835_I2S_INT_TXW BIT(0)
160 112
161/* I2S DMA interface */
162/* FIXME: Needs IOMMU support */
163#define BCM2835_VCMMU_SHIFT (0x7E000000 - 0x20000000)
164
165/* General device struct */ 113/* General device struct */
166struct bcm2835_i2s_dev { 114struct bcm2835_i2s_dev {
167 struct device *dev; 115 struct device *dev;
@@ -169,21 +117,23 @@ struct bcm2835_i2s_dev {
169 unsigned int fmt; 117 unsigned int fmt;
170 unsigned int bclk_ratio; 118 unsigned int bclk_ratio;
171 119
172 struct regmap *i2s_regmap; 120 struct regmap *i2s_regmap;
173 struct regmap *clk_regmap; 121 struct clk *clk;
122 bool clk_prepared;
174}; 123};
175 124
176static void bcm2835_i2s_start_clock(struct bcm2835_i2s_dev *dev) 125static void bcm2835_i2s_start_clock(struct bcm2835_i2s_dev *dev)
177{ 126{
178 /* Start the clock if in master mode */
179 unsigned int master = dev->fmt & SND_SOC_DAIFMT_MASTER_MASK; 127 unsigned int master = dev->fmt & SND_SOC_DAIFMT_MASTER_MASK;
180 128
129 if (dev->clk_prepared)
130 return;
131
181 switch (master) { 132 switch (master) {
182 case SND_SOC_DAIFMT_CBS_CFS: 133 case SND_SOC_DAIFMT_CBS_CFS:
183 case SND_SOC_DAIFMT_CBS_CFM: 134 case SND_SOC_DAIFMT_CBS_CFM:
184 regmap_update_bits(dev->clk_regmap, BCM2835_CLK_PCMCTL_REG, 135 clk_prepare_enable(dev->clk);
185 BCM2835_CLK_PASSWD_MASK | BCM2835_CLK_ENAB, 136 dev->clk_prepared = true;
186 BCM2835_CLK_PASSWD | BCM2835_CLK_ENAB);
187 break; 137 break;
188 default: 138 default:
189 break; 139 break;
@@ -192,28 +142,9 @@ static void bcm2835_i2s_start_clock(struct bcm2835_i2s_dev *dev)
192 142
193static void bcm2835_i2s_stop_clock(struct bcm2835_i2s_dev *dev) 143static void bcm2835_i2s_stop_clock(struct bcm2835_i2s_dev *dev)
194{ 144{
195 uint32_t clkreg; 145 if (dev->clk_prepared)
196 int timeout = 1000; 146 clk_disable_unprepare(dev->clk);
197 147 dev->clk_prepared = false;
198 /* Stop clock */
199 regmap_update_bits(dev->clk_regmap, BCM2835_CLK_PCMCTL_REG,
200 BCM2835_CLK_PASSWD_MASK | BCM2835_CLK_ENAB,
201 BCM2835_CLK_PASSWD);
202
203 /* Wait for the BUSY flag going down */
204 while (--timeout) {
205 regmap_read(dev->clk_regmap, BCM2835_CLK_PCMCTL_REG, &clkreg);
206 if (!(clkreg & BCM2835_CLK_BUSY))
207 break;
208 }
209
210 if (!timeout) {
211 /* KILL the clock */
212 dev_err(dev->dev, "I2S clock didn't stop. Kill the clock!\n");
213 regmap_update_bits(dev->clk_regmap, BCM2835_CLK_PCMCTL_REG,
214 BCM2835_CLK_KILL | BCM2835_CLK_PASSWD_MASK,
215 BCM2835_CLK_KILL | BCM2835_CLK_PASSWD);
216 }
217} 148}
218 149
219static void bcm2835_i2s_clear_fifos(struct bcm2835_i2s_dev *dev, 150static void bcm2835_i2s_clear_fifos(struct bcm2835_i2s_dev *dev,
@@ -223,8 +154,7 @@ static void bcm2835_i2s_clear_fifos(struct bcm2835_i2s_dev *dev,
223 uint32_t syncval; 154 uint32_t syncval;
224 uint32_t csreg; 155 uint32_t csreg;
225 uint32_t i2s_active_state; 156 uint32_t i2s_active_state;
226 uint32_t clkreg; 157 bool clk_was_prepared;
227 uint32_t clk_active_state;
228 uint32_t off; 158 uint32_t off;
229 uint32_t clr; 159 uint32_t clr;
230 160
@@ -238,15 +168,10 @@ static void bcm2835_i2s_clear_fifos(struct bcm2835_i2s_dev *dev,
238 regmap_read(dev->i2s_regmap, BCM2835_I2S_CS_A_REG, &csreg); 168 regmap_read(dev->i2s_regmap, BCM2835_I2S_CS_A_REG, &csreg);
239 i2s_active_state = csreg & (BCM2835_I2S_RXON | BCM2835_I2S_TXON); 169 i2s_active_state = csreg & (BCM2835_I2S_RXON | BCM2835_I2S_TXON);
240 170
241 regmap_read(dev->clk_regmap, BCM2835_CLK_PCMCTL_REG, &clkreg);
242 clk_active_state = clkreg & BCM2835_CLK_ENAB;
243
244 /* Start clock if not running */ 171 /* Start clock if not running */
245 if (!clk_active_state) { 172 clk_was_prepared = dev->clk_prepared;
246 regmap_update_bits(dev->clk_regmap, BCM2835_CLK_PCMCTL_REG, 173 if (!clk_was_prepared)
247 BCM2835_CLK_PASSWD_MASK | BCM2835_CLK_ENAB, 174 bcm2835_i2s_start_clock(dev);
248 BCM2835_CLK_PASSWD | BCM2835_CLK_ENAB);
249 }
250 175
251 /* Stop I2S module */ 176 /* Stop I2S module */
252 regmap_update_bits(dev->i2s_regmap, BCM2835_I2S_CS_A_REG, off, 0); 177 regmap_update_bits(dev->i2s_regmap, BCM2835_I2S_CS_A_REG, off, 0);
@@ -280,7 +205,7 @@ static void bcm2835_i2s_clear_fifos(struct bcm2835_i2s_dev *dev,
280 dev_err(dev->dev, "I2S SYNC error!\n"); 205 dev_err(dev->dev, "I2S SYNC error!\n");
281 206
282 /* Stop clock if it was not running before */ 207 /* Stop clock if it was not running before */
283 if (!clk_active_state) 208 if (!clk_was_prepared)
284 bcm2835_i2s_stop_clock(dev); 209 bcm2835_i2s_stop_clock(dev);
285 210
286 /* Restore I2S state */ 211 /* Restore I2S state */
@@ -309,19 +234,9 @@ static int bcm2835_i2s_hw_params(struct snd_pcm_substream *substream,
309 struct snd_soc_dai *dai) 234 struct snd_soc_dai *dai)
310{ 235{
311 struct bcm2835_i2s_dev *dev = snd_soc_dai_get_drvdata(dai); 236 struct bcm2835_i2s_dev *dev = snd_soc_dai_get_drvdata(dai);
312
313 unsigned int sampling_rate = params_rate(params); 237 unsigned int sampling_rate = params_rate(params);
314 unsigned int data_length, data_delay, bclk_ratio; 238 unsigned int data_length, data_delay, bclk_ratio;
315 unsigned int ch1pos, ch2pos, mode, format; 239 unsigned int ch1pos, ch2pos, mode, format;
316 unsigned int mash = BCM2835_CLK_MASH_1;
317 unsigned int divi, divf, target_frequency;
318 int clk_src = -1;
319 unsigned int master = dev->fmt & SND_SOC_DAIFMT_MASTER_MASK;
320 bool bit_master = (master == SND_SOC_DAIFMT_CBS_CFS
321 || master == SND_SOC_DAIFMT_CBS_CFM);
322
323 bool frame_master = (master == SND_SOC_DAIFMT_CBS_CFS
324 || master == SND_SOC_DAIFMT_CBM_CFS);
325 uint32_t csreg; 240 uint32_t csreg;
326 241
327 /* 242 /*
@@ -343,11 +258,9 @@ static int bcm2835_i2s_hw_params(struct snd_pcm_substream *substream,
343 switch (params_format(params)) { 258 switch (params_format(params)) {
344 case SNDRV_PCM_FORMAT_S16_LE: 259 case SNDRV_PCM_FORMAT_S16_LE:
345 data_length = 16; 260 data_length = 16;
346 bclk_ratio = 40;
347 break; 261 break;
348 case SNDRV_PCM_FORMAT_S32_LE: 262 case SNDRV_PCM_FORMAT_S32_LE:
349 data_length = 32; 263 data_length = 32;
350 bclk_ratio = 80;
351 break; 264 break;
352 default: 265 default:
353 return -EINVAL; 266 return -EINVAL;
@@ -356,69 +269,12 @@ static int bcm2835_i2s_hw_params(struct snd_pcm_substream *substream,
356 /* If bclk_ratio already set, use that one. */ 269 /* If bclk_ratio already set, use that one. */
357 if (dev->bclk_ratio) 270 if (dev->bclk_ratio)
358 bclk_ratio = dev->bclk_ratio; 271 bclk_ratio = dev->bclk_ratio;
272 else
273 /* otherwise calculate a fitting block ratio */
274 bclk_ratio = 2 * data_length;
359 275
360 /* 276 /* set target clock rate*/
361 * Clock Settings 277 clk_set_rate(dev->clk, sampling_rate * bclk_ratio);
362 *
363 * The target frequency of the bit clock is
364 * sampling rate * frame length
365 *
366 * Integer mode:
367 * Sampling rates that are multiples of 8000 kHz
368 * can be driven by the oscillator of 19.2 MHz
369 * with an integer divider as long as the frame length
370 * is an integer divider of 19200000/8000=2400 as set up above.
371 * This is no longer possible if the sampling rate
372 * is too high (e.g. 192 kHz), because the oscillator is too slow.
373 *
374 * MASH mode:
375 * For all other sampling rates, it is not possible to
376 * have an integer divider. Approximate the clock
377 * with the MASH module that induces a slight frequency
378 * variance. To minimize that it is best to have the fastest
379 * clock here. That is PLLD with 500 MHz.
380 */
381 target_frequency = sampling_rate * bclk_ratio;
382 clk_src = BCM2835_CLK_SRC_OSC;
383 mash = BCM2835_CLK_MASH_0;
384
385 if (bcm2835_clk_freq[clk_src] % target_frequency == 0
386 && bit_master && frame_master) {
387 divi = bcm2835_clk_freq[clk_src] / target_frequency;
388 divf = 0;
389 } else {
390 uint64_t dividend;
391
392 if (!dev->bclk_ratio) {
393 /*
394 * Overwrite bclk_ratio, because the
395 * above trick is not needed or can
396 * not be used.
397 */
398 bclk_ratio = 2 * data_length;
399 }
400
401 target_frequency = sampling_rate * bclk_ratio;
402
403 clk_src = BCM2835_CLK_SRC_PLLD;
404 mash = BCM2835_CLK_MASH_1;
405
406 dividend = bcm2835_clk_freq[clk_src];
407 dividend <<= BCM2835_CLK_SHIFT;
408 do_div(dividend, target_frequency);
409 divi = dividend >> BCM2835_CLK_SHIFT;
410 divf = dividend & BCM2835_CLK_DIVF_MASK;
411 }
412
413 /* Set clock divider */
414 regmap_write(dev->clk_regmap, BCM2835_CLK_PCMDIV_REG, BCM2835_CLK_PASSWD
415 | BCM2835_CLK_DIVI(divi)
416 | BCM2835_CLK_DIVF(divf));
417
418 /* Setup clock, but don't start it yet */
419 regmap_write(dev->clk_regmap, BCM2835_CLK_PCMCTL_REG, BCM2835_CLK_PASSWD
420 | BCM2835_CLK_MASH(mash)
421 | BCM2835_CLK_SRC(clk_src));
422 278
423 /* Setup the frame format */ 279 /* Setup the frame format */
424 format = BCM2835_I2S_CHEN; 280 format = BCM2835_I2S_CHEN;
@@ -692,7 +548,7 @@ static const struct snd_soc_dai_ops bcm2835_i2s_dai_ops = {
692 .trigger = bcm2835_i2s_trigger, 548 .trigger = bcm2835_i2s_trigger,
693 .hw_params = bcm2835_i2s_hw_params, 549 .hw_params = bcm2835_i2s_hw_params,
694 .set_fmt = bcm2835_i2s_set_dai_fmt, 550 .set_fmt = bcm2835_i2s_set_dai_fmt,
695 .set_bclk_ratio = bcm2835_i2s_set_dai_bclk_ratio 551 .set_bclk_ratio = bcm2835_i2s_set_dai_bclk_ratio,
696}; 552};
697 553
698static int bcm2835_i2s_dai_probe(struct snd_soc_dai *dai) 554static int bcm2835_i2s_dai_probe(struct snd_soc_dai *dai)
@@ -750,34 +606,14 @@ static bool bcm2835_i2s_precious_reg(struct device *dev, unsigned int reg)
750 }; 606 };
751} 607}
752 608
753static bool bcm2835_clk_volatile_reg(struct device *dev, unsigned int reg) 609static const struct regmap_config bcm2835_regmap_config = {
754{ 610 .reg_bits = 32,
755 switch (reg) { 611 .reg_stride = 4,
756 case BCM2835_CLK_PCMCTL_REG: 612 .val_bits = 32,
757 return true; 613 .max_register = BCM2835_I2S_GRAY_REG,
758 default: 614 .precious_reg = bcm2835_i2s_precious_reg,
759 return false; 615 .volatile_reg = bcm2835_i2s_volatile_reg,
760 }; 616 .cache_type = REGCACHE_RBTREE,
761}
762
763static const struct regmap_config bcm2835_regmap_config[] = {
764 {
765 .reg_bits = 32,
766 .reg_stride = 4,
767 .val_bits = 32,
768 .max_register = BCM2835_I2S_GRAY_REG,
769 .precious_reg = bcm2835_i2s_precious_reg,
770 .volatile_reg = bcm2835_i2s_volatile_reg,
771 .cache_type = REGCACHE_RBTREE,
772 },
773 {
774 .reg_bits = 32,
775 .reg_stride = 4,
776 .val_bits = 32,
777 .max_register = BCM2835_CLK_PCMDIV_REG,
778 .volatile_reg = bcm2835_clk_volatile_reg,
779 .cache_type = REGCACHE_RBTREE,
780 },
781}; 617};
782 618
783static const struct snd_soc_component_driver bcm2835_i2s_component = { 619static const struct snd_soc_component_driver bcm2835_i2s_component = {
@@ -787,42 +623,50 @@ static const struct snd_soc_component_driver bcm2835_i2s_component = {
787static int bcm2835_i2s_probe(struct platform_device *pdev) 623static int bcm2835_i2s_probe(struct platform_device *pdev)
788{ 624{
789 struct bcm2835_i2s_dev *dev; 625 struct bcm2835_i2s_dev *dev;
790 int i;
791 int ret; 626 int ret;
792 struct regmap *regmap[2]; 627 struct resource *mem;
793 struct resource *mem[2]; 628 void __iomem *base;
794 629 const __be32 *addr;
795 /* Request both ioareas */ 630 dma_addr_t dma_base;
796 for (i = 0; i <= 1; i++) {
797 void __iomem *base;
798
799 mem[i] = platform_get_resource(pdev, IORESOURCE_MEM, i);
800 base = devm_ioremap_resource(&pdev->dev, mem[i]);
801 if (IS_ERR(base))
802 return PTR_ERR(base);
803
804 regmap[i] = devm_regmap_init_mmio(&pdev->dev, base,
805 &bcm2835_regmap_config[i]);
806 if (IS_ERR(regmap[i]))
807 return PTR_ERR(regmap[i]);
808 }
809 631
810 dev = devm_kzalloc(&pdev->dev, sizeof(*dev), 632 dev = devm_kzalloc(&pdev->dev, sizeof(*dev),
811 GFP_KERNEL); 633 GFP_KERNEL);
812 if (!dev) 634 if (!dev)
813 return -ENOMEM; 635 return -ENOMEM;
814 636
815 dev->i2s_regmap = regmap[0]; 637 /* get the clock */
816 dev->clk_regmap = regmap[1]; 638 dev->clk_prepared = false;
639 dev->clk = devm_clk_get(&pdev->dev, NULL);
640 if (IS_ERR(dev->clk)) {
641 dev_err(&pdev->dev, "could not get clk: %ld\n",
642 PTR_ERR(dev->clk));
643 return PTR_ERR(dev->clk);
644 }
645
646 /* Request ioarea */
647 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
648 base = devm_ioremap_resource(&pdev->dev, mem);
649 if (IS_ERR(base))
650 return PTR_ERR(base);
651
652 dev->i2s_regmap = devm_regmap_init_mmio(&pdev->dev, base,
653 &bcm2835_regmap_config);
654 if (IS_ERR(dev->i2s_regmap))
655 return PTR_ERR(dev->i2s_regmap);
656
657 /* Set the DMA address - we have to parse DT ourselves */
658 addr = of_get_address(pdev->dev.of_node, 0, NULL, NULL);
659 if (!addr) {
660 dev_err(&pdev->dev, "could not get DMA-register address\n");
661 return -EINVAL;
662 }
663 dma_base = be32_to_cpup(addr);
817 664
818 /* Set the DMA address */
819 dev->dma_data[SNDRV_PCM_STREAM_PLAYBACK].addr = 665 dev->dma_data[SNDRV_PCM_STREAM_PLAYBACK].addr =
820 (dma_addr_t)mem[0]->start + BCM2835_I2S_FIFO_A_REG 666 dma_base + BCM2835_I2S_FIFO_A_REG;
821 + BCM2835_VCMMU_SHIFT;
822 667
823 dev->dma_data[SNDRV_PCM_STREAM_CAPTURE].addr = 668 dev->dma_data[SNDRV_PCM_STREAM_CAPTURE].addr =
824 (dma_addr_t)mem[0]->start + BCM2835_I2S_FIFO_A_REG 669 dma_base + BCM2835_I2S_FIFO_A_REG;
825 + BCM2835_VCMMU_SHIFT;
826 670
827 /* Set the bus width */ 671 /* Set the bus width */
828 dev->dma_data[SNDRV_PCM_STREAM_PLAYBACK].addr_width = 672 dev->dma_data[SNDRV_PCM_STREAM_PLAYBACK].addr_width =