diff options
Diffstat (limited to 'sound/soc/bcm/bcm2835-i2s.c')
-rw-r--r-- | sound/soc/bcm/bcm2835-i2s.c | 284 |
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 | |||
68 | enum { | ||
69 | BCM2835_CLK_MASH_0 = 0, | ||
70 | BCM2835_CLK_MASH_1, | ||
71 | BCM2835_CLK_MASH_2, | ||
72 | BCM2835_CLK_MASH_3, | ||
73 | }; | ||
74 | |||
75 | enum { | ||
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) */ | ||
87 | static 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 */ |
166 | struct bcm2835_i2s_dev { | 114 | struct 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 | ||
176 | static void bcm2835_i2s_start_clock(struct bcm2835_i2s_dev *dev) | 125 | static 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 | ||
193 | static void bcm2835_i2s_stop_clock(struct bcm2835_i2s_dev *dev) | 143 | static 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 | ||
219 | static void bcm2835_i2s_clear_fifos(struct bcm2835_i2s_dev *dev, | 150 | static 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 | ||
698 | static int bcm2835_i2s_dai_probe(struct snd_soc_dai *dai) | 554 | static 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 | ||
753 | static bool bcm2835_clk_volatile_reg(struct device *dev, unsigned int reg) | 609 | static 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 | |||
763 | static 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 | ||
783 | static const struct snd_soc_component_driver bcm2835_i2s_component = { | 619 | static const struct snd_soc_component_driver bcm2835_i2s_component = { |
@@ -787,42 +623,50 @@ static const struct snd_soc_component_driver bcm2835_i2s_component = { | |||
787 | static int bcm2835_i2s_probe(struct platform_device *pdev) | 623 | static 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 = |