brcm2708: refresh patches
[openwrt/openwrt.git] / target / linux / brcm2708 / patches-3.18 / 0064-Adding-Device-Tree-support-for-some-RPi-audio-cards.patch
1 From 5f17e24bea60b696815d2c6cb578e1e23f61cd57 Mon Sep 17 00:00:00 2001
2 From: Phil Elwell <phil@raspberrypi.org>
3 Date: Wed, 12 Nov 2014 17:07:02 +0000
4 Subject: [PATCH 064/114] Adding Device Tree support for some RPi audio cards
5
6 ---
7 arch/arm/boot/dts/Makefile | 2 +
8 arch/arm/boot/dts/bcm2708-rpi-b-plus.dts | 81 +++++++++++++++++++++++++
9 arch/arm/boot/dts/bcm2708-rpi-b.dts | 19 +++++-
10 arch/arm/boot/dts/bcm2708.dtsi | 18 ++++--
11 arch/arm/boot/dts/hifiberry-dac-overlay.dts | 34 +++++++++++
12 arch/arm/boot/dts/hifiberry-dacplus-overlay.dts | 39 ++++++++++++
13 arch/arm/boot/dts/hifiberry-digi-overlay.dts | 39 ++++++++++++
14 arch/arm/boot/dts/iqaudio-dac-overlay.dts | 39 ++++++++++++
15 arch/arm/boot/dts/iqaudio-dacplus-overlay.dts | 39 ++++++++++++
16 sound/soc/bcm/hifiberry_dac.c | 22 +++++++
17 sound/soc/bcm/hifiberry_dacplus.c | 22 +++++++
18 sound/soc/bcm/hifiberry_digi.c | 22 +++++++
19 sound/soc/bcm/iqaudio-dac.c | 16 +++++
20 sound/soc/codecs/pcm5102a.c | 7 +++
21 14 files changed, 393 insertions(+), 6 deletions(-)
22 create mode 100644 arch/arm/boot/dts/bcm2708-rpi-b-plus.dts
23 create mode 100644 arch/arm/boot/dts/hifiberry-dac-overlay.dts
24 create mode 100644 arch/arm/boot/dts/hifiberry-dacplus-overlay.dts
25 create mode 100644 arch/arm/boot/dts/hifiberry-digi-overlay.dts
26 create mode 100644 arch/arm/boot/dts/iqaudio-dac-overlay.dts
27 create mode 100644 arch/arm/boot/dts/iqaudio-dacplus-overlay.dts
28
29 --- a/arch/arm/boot/dts/Makefile
30 +++ b/arch/arm/boot/dts/Makefile
31 @@ -54,6 +54,7 @@ dtb-$(CONFIG_ARCH_AT91) += at91-sama5d4e
32 dtb-$(CONFIG_ARCH_ATLAS6) += atlas6-evb.dtb
33 dtb-$(CONFIG_ARCH_AXXIA) += axm5516-amarillo.dtb
34 dtb-$(CONFIG_BCM2708_DT) += bcm2708-rpi-b.dtb
35 +dtb-$(CONFIG_BCM2708_DT) += bcm2708-rpi-b-plus.dtb
36 dtb-$(CONFIG_ARCH_BCM2835) += bcm2835-rpi-b.dtb
37 dtb-$(CONFIG_ARCH_BCM_5301X) += bcm4708-netgear-r6250.dtb
38 dtb-$(CONFIG_ARCH_BCM_63XX) += bcm963138dvt.dtb
39 @@ -520,6 +521,7 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += mt6589-aq
40
41 targets += dtbs dtbs_install
42 targets += $(dtb-y)
43 +
44 endif
45
46 # *.dtb used to be generated in the directory above. Clean out the
47 --- /dev/null
48 +++ b/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts
49 @@ -0,0 +1,81 @@
50 +/dts-v1/;
51 +
52 +/include/ "bcm2708.dtsi"
53 +
54 +/ {
55 + compatible = "brcm,bcm2708";
56 + model = "Raspberry Pi Model B+";
57 +
58 + aliases {
59 + spi0 = &spi0;
60 + i2c0 = &i2c0;
61 + i2c1 = &i2c1;
62 + i2s = &i2s;
63 + gpio = &gpio;
64 + sound = &sound;
65 + };
66 +
67 + sound: sound {
68 + };
69 +};
70 +
71 +&gpio {
72 + spi0_pins: spi0_pins {
73 + brcm,pins = <7 8 9 10 11>;
74 + brcm,function = <4>; /* alt0 */
75 + };
76 +
77 + i2c0_pins: i2c0 {
78 + brcm,pins = <0 1>;
79 + brcm,function = <4>;
80 + };
81 +
82 + i2c1_pins: i2c1 {
83 + brcm,pins = <2 3>;
84 + brcm,function = <4>;
85 + };
86 +
87 + i2s_pins: i2s {
88 + brcm,pins = <18 19 20 21>;
89 + brcm,function = <4>; /* alt0 */
90 + };
91 +};
92 +
93 +&spi0 {
94 + pinctrl-names = "default";
95 + pinctrl-0 = <&spi0_pins>;
96 +
97 + spidev@0{
98 + compatible = "spidev";
99 + reg = <0>; /* CE0 */
100 + #address-cells = <1>;
101 + #size-cells = <0>;
102 + spi-max-frequency = <500000>;
103 + };
104 +
105 + spidev@1{
106 + compatible = "spidev";
107 + reg = <1>; /* CE1 */
108 + #address-cells = <1>;
109 + #size-cells = <0>;
110 + spi-max-frequency = <500000>;
111 + };
112 +};
113 +
114 +&i2c0 {
115 + pinctrl-names = "default";
116 + pinctrl-0 = <&i2c0_pins>;
117 + clock-frequency = <100000>;
118 +};
119 +
120 +&i2c1 {
121 + pinctrl-names = "default";
122 + pinctrl-0 = <&i2c1_pins>;
123 + clock-frequency = <100000>;
124 +};
125 +
126 +&i2s {
127 + #sound-dai-cells = <0>;
128 + pinctrl-names = "default";
129 + pinctrl-0 = <&i2s_pins>;
130 +};
131 --- a/arch/arm/boot/dts/bcm2708-rpi-b.dts
132 +++ b/arch/arm/boot/dts/bcm2708-rpi-b.dts
133 @@ -4,12 +4,18 @@
134
135 / {
136 compatible = "brcm,bcm2708";
137 - model = "Raspberry Pi";
138 + model = "Raspberry Pi Model B";
139
140 aliases {
141 spi0 = &spi0;
142 i2c0 = &i2c0;
143 i2c1 = &i2c1;
144 + i2s = &i2s;
145 + gpio = &gpio;
146 + sound = &sound;
147 + };
148 +
149 + sound: sound {
150 };
151 };
152
153 @@ -28,6 +34,11 @@
154 brcm,pins = <2 3>;
155 brcm,function = <4>;
156 };
157 +
158 + i2s_pins: i2s {
159 + brcm,pins = <28 29 30 31>;
160 + brcm,function = <4>; /* alt0 */
161 + };
162 };
163
164 &spi0 {
165 @@ -62,3 +73,9 @@
166 pinctrl-0 = <&i2c1_pins>;
167 clock-frequency = <100000>;
168 };
169 +
170 +&i2s {
171 + #sound-dai-cells = <0>;
172 + pinctrl-names = "default";
173 + pinctrl-0 = <&i2s_pins>;
174 +};
175 --- a/arch/arm/boot/dts/bcm2708.dtsi
176 +++ b/arch/arm/boot/dts/bcm2708.dtsi
177 @@ -7,11 +7,8 @@
178 interrupt-parent = <&intc>;
179
180 chosen {
181 - /*
182 - bootargs must be 1024 characters long because the
183 - VC bootloader can't expand it
184 - */
185 - bootargs = "console=ttyAMA0 ";
186 + /* No padding required - the boot loader can do that. */
187 + bootargs = "";
188 };
189
190 soc {
191 @@ -39,6 +36,17 @@
192 #interrupt-cells = <2>;
193 };
194
195 + i2s: i2s@7e203000 {
196 + compatible = "brcm,bcm2708-i2s";
197 + reg = <0x7e203000 0x20>,
198 + <0x7e101098 0x02>;
199 +
200 + //dmas = <&dma 2>,
201 + // <&dma 3>;
202 + dma-names = "tx", "rx";
203 + status = "disabled";
204 + };
205 +
206 spi0: spi@7e204000 {
207 compatible = "brcm,bcm2708-spi";
208 reg = <0x7e204000 0x1000>;
209 --- /dev/null
210 +++ b/arch/arm/boot/dts/hifiberry-dac-overlay.dts
211 @@ -0,0 +1,34 @@
212 +// Definitions for HiFiBerry DAC
213 +/dts-v1/;
214 +/plugin/;
215 +
216 +/ {
217 + compatible = "brcm,bcm2708";
218 +
219 + fragment@0 {
220 + target = <&sound>;
221 + __overlay__ {
222 + compatible = "hifiberry,hifiberry-dac";
223 + i2s-controller = <&i2s>;
224 + status = "okay";
225 + };
226 + };
227 +
228 + fragment@1 {
229 + target = <&i2s>;
230 + __overlay__ {
231 + status = "okay";
232 + };
233 + };
234 +
235 + fragment@2 {
236 + target-path = "/";
237 + __overlay__ {
238 + pcm5102a-codec {
239 + #sound-dai-cells = <0>;
240 + compatible = "ti,pcm5102a";
241 + status = "okay";
242 + };
243 + };
244 + };
245 +};
246 --- /dev/null
247 +++ b/arch/arm/boot/dts/hifiberry-dacplus-overlay.dts
248 @@ -0,0 +1,39 @@
249 +// Definitions for HiFiBerry DAC+
250 +/dts-v1/;
251 +/plugin/;
252 +
253 +/ {
254 + compatible = "brcm,bcm2708";
255 +
256 + fragment@0 {
257 + target = <&sound>;
258 + __overlay__ {
259 + compatible = "hifiberry,hifiberry-dacplus";
260 + i2s-controller = <&i2s>;
261 + status = "okay";
262 + };
263 + };
264 +
265 + fragment@1 {
266 + target = <&i2s>;
267 + __overlay__ {
268 + status = "okay";
269 + };
270 + };
271 +
272 + fragment@2 {
273 + target = <&i2c1>;
274 + __overlay__ {
275 + #address-cells = <1>;
276 + #size-cells = <0>;
277 + status = "okay";
278 +
279 + pcm5122@4d {
280 + #sound-dai-cells = <0>;
281 + compatible = "ti,pcm5122";
282 + reg = <0x4d>;
283 + status = "okay";
284 + };
285 + };
286 + };
287 +};
288 --- /dev/null
289 +++ b/arch/arm/boot/dts/hifiberry-digi-overlay.dts
290 @@ -0,0 +1,39 @@
291 +// Definitions for HiFiBerry Digi
292 +/dts-v1/;
293 +/plugin/;
294 +
295 +/ {
296 + compatible = "brcm,bcm2708";
297 +
298 + fragment@0 {
299 + target = <&sound>;
300 + __overlay__ {
301 + compatible = "hifiberry,hifiberry-digi";
302 + i2s-controller = <&i2s>;
303 + status = "okay";
304 + };
305 + };
306 +
307 + fragment@1 {
308 + target = <&i2s>;
309 + __overlay__ {
310 + status = "okay";
311 + };
312 + };
313 +
314 + fragment@2 {
315 + target = <&i2c1>;
316 + __overlay__ {
317 + #address-cells = <1>;
318 + #size-cells = <0>;
319 + status = "okay";
320 +
321 + wm8804@3b {
322 + #sound-dai-cells = <0>;
323 + compatible = "wlf,wm8804";
324 + reg = <0x3b>;
325 + status = "okay";
326 + };
327 + };
328 + };
329 +};
330 --- /dev/null
331 +++ b/arch/arm/boot/dts/iqaudio-dac-overlay.dts
332 @@ -0,0 +1,39 @@
333 +// Definitions for IQaudIO DAC
334 +/dts-v1/;
335 +/plugin/;
336 +
337 +/ {
338 + compatible = "brcm,bcm2708";
339 +
340 + fragment@0 {
341 + target = <&sound>;
342 + __overlay__ {
343 + compatible = "iqaudio,iqaudio-dac";
344 + i2s-controller = <&i2s>;
345 + status = "okay";
346 + };
347 + };
348 +
349 + fragment@1 {
350 + target = <&i2s>;
351 + __overlay__ {
352 + status = "okay";
353 + };
354 + };
355 +
356 + fragment@2 {
357 + target = <&i2c1>;
358 + __overlay__ {
359 + #address-cells = <1>;
360 + #size-cells = <0>;
361 + status = "okay";
362 +
363 + pcm5122@4c {
364 + #sound-dai-cells = <0>;
365 + compatible = "ti,pcm5122";
366 + reg = <0x4c>;
367 + status = "okay";
368 + };
369 + };
370 + };
371 +};
372 --- /dev/null
373 +++ b/arch/arm/boot/dts/iqaudio-dacplus-overlay.dts
374 @@ -0,0 +1,39 @@
375 +// Definitions for IQaudIO DAC+
376 +/dts-v1/;
377 +/plugin/;
378 +
379 +/ {
380 + compatible = "brcm,bcm2708";
381 +
382 + fragment@0 {
383 + target = <&sound>;
384 + __overlay__ {
385 + compatible = "iqaudio,iqaudio-dac";
386 + i2s-controller = <&i2s>;
387 + status = "okay";
388 + };
389 + };
390 +
391 + fragment@1 {
392 + target = <&i2s>;
393 + __overlay__ {
394 + status = "okay";
395 + };
396 + };
397 +
398 + fragment@2 {
399 + target = <&i2c1>;
400 + __overlay__ {
401 + #address-cells = <1>;
402 + #size-cells = <0>;
403 + status = "okay";
404 +
405 + pcm5122@4c {
406 + #sound-dai-cells = <0>;
407 + compatible = "ti,pcm5122";
408 + reg = <0x4c>;
409 + status = "okay";
410 + };
411 + };
412 + };
413 +};
414 --- a/sound/soc/bcm/hifiberry_dac.c
415 +++ b/sound/soc/bcm/hifiberry_dac.c
416 @@ -72,6 +72,21 @@ static int snd_rpi_hifiberry_dac_probe(s
417 int ret = 0;
418
419 snd_rpi_hifiberry_dac.dev = &pdev->dev;
420 +
421 + if (pdev->dev.of_node) {
422 + struct device_node *i2s_node;
423 + struct snd_soc_dai_link *dai = &snd_rpi_hifiberry_dac_dai[0];
424 + i2s_node = of_parse_phandle(pdev->dev.of_node,
425 + "i2s-controller", 0);
426 +
427 + if (i2s_node) {
428 + dai->cpu_dai_name = NULL;
429 + dai->cpu_of_node = i2s_node;
430 + dai->platform_name = NULL;
431 + dai->platform_of_node = i2s_node;
432 + }
433 + }
434 +
435 ret = snd_soc_register_card(&snd_rpi_hifiberry_dac);
436 if (ret)
437 dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ret);
438 @@ -84,10 +99,17 @@ static int snd_rpi_hifiberry_dac_remove(
439 return snd_soc_unregister_card(&snd_rpi_hifiberry_dac);
440 }
441
442 +static const struct of_device_id snd_rpi_hifiberry_dac_of_match[] = {
443 + { .compatible = "hifiberry,hifiberry-dac", },
444 + {},
445 +};
446 +MODULE_DEVICE_TABLE(of, snd_rpi_hifiberry_dac_of_match);
447 +
448 static struct platform_driver snd_rpi_hifiberry_dac_driver = {
449 .driver = {
450 .name = "snd-hifiberry-dac",
451 .owner = THIS_MODULE,
452 + .of_match_table = snd_rpi_hifiberry_dac_of_match,
453 },
454 .probe = snd_rpi_hifiberry_dac_probe,
455 .remove = snd_rpi_hifiberry_dac_remove,
456 --- a/sound/soc/bcm/hifiberry_dacplus.c
457 +++ b/sound/soc/bcm/hifiberry_dacplus.c
458 @@ -90,6 +90,21 @@ static int snd_rpi_hifiberry_dacplus_pro
459 int ret = 0;
460
461 snd_rpi_hifiberry_dacplus.dev = &pdev->dev;
462 +
463 + if (pdev->dev.of_node) {
464 + struct device_node *i2s_node;
465 + struct snd_soc_dai_link *dai = &snd_rpi_hifiberry_dacplus_dai[0];
466 + i2s_node = of_parse_phandle(pdev->dev.of_node,
467 + "i2s-controller", 0);
468 +
469 + if (i2s_node) {
470 + dai->cpu_dai_name = NULL;
471 + dai->cpu_of_node = i2s_node;
472 + dai->platform_name = NULL;
473 + dai->platform_of_node = i2s_node;
474 + }
475 + }
476 +
477 ret = snd_soc_register_card(&snd_rpi_hifiberry_dacplus);
478 if (ret)
479 dev_err(&pdev->dev,
480 @@ -103,10 +118,17 @@ static int snd_rpi_hifiberry_dacplus_rem
481 return snd_soc_unregister_card(&snd_rpi_hifiberry_dacplus);
482 }
483
484 +static const struct of_device_id snd_rpi_hifiberry_dacplus_of_match[] = {
485 + { .compatible = "hifiberry,hifiberry-dacplus", },
486 + {},
487 +};
488 +MODULE_DEVICE_TABLE(of, snd_rpi_hifiberry_dacplus_of_match);
489 +
490 static struct platform_driver snd_rpi_hifiberry_dacplus_driver = {
491 .driver = {
492 .name = "snd-rpi-hifiberry-dacplus",
493 .owner = THIS_MODULE,
494 + .of_match_table = snd_rpi_hifiberry_dacplus_of_match,
495 },
496 .probe = snd_rpi_hifiberry_dacplus_probe,
497 .remove = snd_rpi_hifiberry_dacplus_remove,
498 --- a/sound/soc/bcm/hifiberry_digi.c
499 +++ b/sound/soc/bcm/hifiberry_digi.c
500 @@ -125,6 +125,21 @@ static int snd_rpi_hifiberry_digi_probe(
501 int ret = 0;
502
503 snd_rpi_hifiberry_digi.dev = &pdev->dev;
504 +
505 + if (pdev->dev.of_node) {
506 + struct device_node *i2s_node;
507 + struct snd_soc_dai_link *dai = &snd_rpi_hifiberry_digi_dai[0];
508 + i2s_node = of_parse_phandle(pdev->dev.of_node,
509 + "i2s-controller", 0);
510 +
511 + if (i2s_node) {
512 + dai->cpu_dai_name = NULL;
513 + dai->cpu_of_node = i2s_node;
514 + dai->platform_name = NULL;
515 + dai->platform_of_node = i2s_node;
516 + }
517 + }
518 +
519 ret = snd_soc_register_card(&snd_rpi_hifiberry_digi);
520 if (ret)
521 dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ret);
522 @@ -137,10 +152,17 @@ static int snd_rpi_hifiberry_digi_remove
523 return snd_soc_unregister_card(&snd_rpi_hifiberry_digi);
524 }
525
526 +static const struct of_device_id snd_rpi_hifiberry_digi_of_match[] = {
527 + { .compatible = "hifiberry,hifiberry-digi", },
528 + {},
529 +};
530 +MODULE_DEVICE_TABLE(of, snd_rpi_hifiberry_digi_of_match);
531 +
532 static struct platform_driver snd_rpi_hifiberry_digi_driver = {
533 .driver = {
534 .name = "snd-hifiberry-digi",
535 .owner = THIS_MODULE,
536 + .of_match_table = snd_rpi_hifiberry_digi_of_match,
537 },
538 .probe = snd_rpi_hifiberry_digi_probe,
539 .remove = snd_rpi_hifiberry_digi_remove,
540 --- a/sound/soc/bcm/iqaudio-dac.c
541 +++ b/sound/soc/bcm/iqaudio-dac.c
542 @@ -76,6 +76,21 @@ static int snd_rpi_iqaudio_dac_probe(str
543 int ret = 0;
544
545 snd_rpi_iqaudio_dac.dev = &pdev->dev;
546 +
547 + if (pdev->dev.of_node) {
548 + struct device_node *i2s_node;
549 + struct snd_soc_dai_link *dai = &snd_rpi_iqaudio_dac_dai[0];
550 + i2s_node = of_parse_phandle(pdev->dev.of_node,
551 + "i2s-controller", 0);
552 +
553 + if (i2s_node) {
554 + dai->cpu_dai_name = NULL;
555 + dai->cpu_of_node = i2s_node;
556 + dai->platform_name = NULL;
557 + dai->platform_of_node = i2s_node;
558 + }
559 + }
560 +
561 ret = snd_soc_register_card(&snd_rpi_iqaudio_dac);
562 if (ret)
563 dev_err(&pdev->dev,
564 @@ -93,6 +108,7 @@ static const struct of_device_id iqaudio
565 { .compatible = "iqaudio,iqaudio-dac", },
566 {},
567 };
568 +MODULE_DEVICE_TABLE(of, iqaudio_of_match);
569
570 static struct platform_driver snd_rpi_iqaudio_dac_driver = {
571 .driver = {
572 --- a/sound/soc/codecs/pcm5102a.c
573 +++ b/sound/soc/codecs/pcm5102a.c
574 @@ -47,12 +47,19 @@ static int pcm5102a_remove(struct platfo
575 return 0;
576 }
577
578 +static const struct of_device_id pcm5102a_of_match[] = {
579 + { .compatible = "ti,pcm5102a", },
580 + { }
581 +};
582 +MODULE_DEVICE_TABLE(of, pcm5102a_of_match);
583 +
584 static struct platform_driver pcm5102a_codec_driver = {
585 .probe = pcm5102a_probe,
586 .remove = pcm5102a_remove,
587 .driver = {
588 .name = "pcm5102a-codec",
589 .owner = THIS_MODULE,
590 + .of_match_table = pcm5102a_of_match,
591 },
592 };
593