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
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
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
41 targets += dtbs dtbs_install
46 # *.dtb used to be generated in the directory above. Clean out the
48 +++ b/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts
52 +/include/ "bcm2708.dtsi"
55 + compatible = "brcm,bcm2708";
56 + model = "Raspberry Pi Model B+";
72 + spi0_pins: spi0_pins {
73 + brcm,pins = <7 8 9 10 11>;
74 + brcm,function = <4>; /* alt0 */
79 + brcm,function = <4>;
84 + brcm,function = <4>;
88 + brcm,pins = <18 19 20 21>;
89 + brcm,function = <4>; /* alt0 */
94 + pinctrl-names = "default";
95 + pinctrl-0 = <&spi0_pins>;
98 + compatible = "spidev";
99 + reg = <0>; /* CE0 */
100 + #address-cells = <1>;
102 + spi-max-frequency = <500000>;
106 + compatible = "spidev";
107 + reg = <1>; /* CE1 */
108 + #address-cells = <1>;
110 + spi-max-frequency = <500000>;
115 + pinctrl-names = "default";
116 + pinctrl-0 = <&i2c0_pins>;
117 + clock-frequency = <100000>;
121 + pinctrl-names = "default";
122 + pinctrl-0 = <&i2c1_pins>;
123 + clock-frequency = <100000>;
127 + #sound-dai-cells = <0>;
128 + pinctrl-names = "default";
129 + pinctrl-0 = <&i2s_pins>;
131 --- a/arch/arm/boot/dts/bcm2708-rpi-b.dts
132 +++ b/arch/arm/boot/dts/bcm2708-rpi-b.dts
136 compatible = "brcm,bcm2708";
137 - model = "Raspberry Pi";
138 + model = "Raspberry Pi Model B";
159 + brcm,pins = <28 29 30 31>;
160 + brcm,function = <4>; /* alt0 */
166 pinctrl-0 = <&i2c1_pins>;
167 clock-frequency = <100000>;
171 + #sound-dai-cells = <0>;
172 + pinctrl-names = "default";
173 + pinctrl-0 = <&i2s_pins>;
175 --- a/arch/arm/boot/dts/bcm2708.dtsi
176 +++ b/arch/arm/boot/dts/bcm2708.dtsi
178 interrupt-parent = <&intc>;
182 - bootargs must be 1024 characters long because the
183 - VC bootloader can't expand it
185 - bootargs = "console=ttyAMA0 ";
186 + /* No padding required - the boot loader can do that. */
192 #interrupt-cells = <2>;
195 + i2s: i2s@7e203000 {
196 + compatible = "brcm,bcm2708-i2s";
197 + reg = <0x7e203000 0x20>,
202 + dma-names = "tx", "rx";
203 + status = "disabled";
207 compatible = "brcm,bcm2708-spi";
208 reg = <0x7e204000 0x1000>;
210 +++ b/arch/arm/boot/dts/hifiberry-dac-overlay.dts
212 +// Definitions for HiFiBerry DAC
217 + compatible = "brcm,bcm2708";
222 + compatible = "hifiberry,hifiberry-dac";
223 + i2s-controller = <&i2s>;
239 + #sound-dai-cells = <0>;
240 + compatible = "ti,pcm5102a";
247 +++ b/arch/arm/boot/dts/hifiberry-dacplus-overlay.dts
249 +// Definitions for HiFiBerry DAC+
254 + compatible = "brcm,bcm2708";
259 + compatible = "hifiberry,hifiberry-dacplus";
260 + i2s-controller = <&i2s>;
275 + #address-cells = <1>;
280 + #sound-dai-cells = <0>;
281 + compatible = "ti,pcm5122";
289 +++ b/arch/arm/boot/dts/hifiberry-digi-overlay.dts
291 +// Definitions for HiFiBerry Digi
296 + compatible = "brcm,bcm2708";
301 + compatible = "hifiberry,hifiberry-digi";
302 + i2s-controller = <&i2s>;
317 + #address-cells = <1>;
322 + #sound-dai-cells = <0>;
323 + compatible = "wlf,wm8804";
331 +++ b/arch/arm/boot/dts/iqaudio-dac-overlay.dts
333 +// Definitions for IQaudIO DAC
338 + compatible = "brcm,bcm2708";
343 + compatible = "iqaudio,iqaudio-dac";
344 + i2s-controller = <&i2s>;
359 + #address-cells = <1>;
364 + #sound-dai-cells = <0>;
365 + compatible = "ti,pcm5122";
373 +++ b/arch/arm/boot/dts/iqaudio-dacplus-overlay.dts
375 +// Definitions for IQaudIO DAC+
380 + compatible = "brcm,bcm2708";
385 + compatible = "iqaudio,iqaudio-dac";
386 + i2s-controller = <&i2s>;
401 + #address-cells = <1>;
406 + #sound-dai-cells = <0>;
407 + compatible = "ti,pcm5122";
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
419 snd_rpi_hifiberry_dac.dev = &pdev->dev;
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);
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;
435 ret = snd_soc_register_card(&snd_rpi_hifiberry_dac);
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);
442 +static const struct of_device_id snd_rpi_hifiberry_dac_of_match[] = {
443 + { .compatible = "hifiberry,hifiberry-dac", },
446 +MODULE_DEVICE_TABLE(of, snd_rpi_hifiberry_dac_of_match);
448 static struct platform_driver snd_rpi_hifiberry_dac_driver = {
450 .name = "snd-hifiberry-dac",
451 .owner = THIS_MODULE,
452 + .of_match_table = snd_rpi_hifiberry_dac_of_match,
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
461 snd_rpi_hifiberry_dacplus.dev = &pdev->dev;
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);
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;
477 ret = snd_soc_register_card(&snd_rpi_hifiberry_dacplus);
480 @@ -103,10 +118,17 @@ static int snd_rpi_hifiberry_dacplus_rem
481 return snd_soc_unregister_card(&snd_rpi_hifiberry_dacplus);
484 +static const struct of_device_id snd_rpi_hifiberry_dacplus_of_match[] = {
485 + { .compatible = "hifiberry,hifiberry-dacplus", },
488 +MODULE_DEVICE_TABLE(of, snd_rpi_hifiberry_dacplus_of_match);
490 static struct platform_driver snd_rpi_hifiberry_dacplus_driver = {
492 .name = "snd-rpi-hifiberry-dacplus",
493 .owner = THIS_MODULE,
494 + .of_match_table = snd_rpi_hifiberry_dacplus_of_match,
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(
503 snd_rpi_hifiberry_digi.dev = &pdev->dev;
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);
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;
519 ret = snd_soc_register_card(&snd_rpi_hifiberry_digi);
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);
526 +static const struct of_device_id snd_rpi_hifiberry_digi_of_match[] = {
527 + { .compatible = "hifiberry,hifiberry-digi", },
530 +MODULE_DEVICE_TABLE(of, snd_rpi_hifiberry_digi_of_match);
532 static struct platform_driver snd_rpi_hifiberry_digi_driver = {
534 .name = "snd-hifiberry-digi",
535 .owner = THIS_MODULE,
536 + .of_match_table = snd_rpi_hifiberry_digi_of_match,
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
545 snd_rpi_iqaudio_dac.dev = &pdev->dev;
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);
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;
561 ret = snd_soc_register_card(&snd_rpi_iqaudio_dac);
564 @@ -93,6 +108,7 @@ static const struct of_device_id iqaudio
565 { .compatible = "iqaudio,iqaudio-dac", },
568 +MODULE_DEVICE_TABLE(of, iqaudio_of_match);
570 static struct platform_driver snd_rpi_iqaudio_dac_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
578 +static const struct of_device_id pcm5102a_of_match[] = {
579 + { .compatible = "ti,pcm5102a", },
582 +MODULE_DEVICE_TABLE(of, pcm5102a_of_match);
584 static struct platform_driver pcm5102a_codec_driver = {
585 .probe = pcm5102a_probe,
586 .remove = pcm5102a_remove,
588 .name = "pcm5102a-codec",
589 .owner = THIS_MODULE,
590 + .of_match_table = pcm5102a_of_match,