Merge pull request #580 from wigyori/cc-libpcap
[15.05/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