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 diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
30 index c727f71..adaebbb 100644
31 --- a/arch/arm/boot/dts/Makefile
32 +++ b/arch/arm/boot/dts/Makefile
33 @@ -54,6 +54,7 @@ dtb-$(CONFIG_ARCH_AT91) += at91-sama5d4ek.dtb
34 dtb-$(CONFIG_ARCH_ATLAS6) += atlas6-evb.dtb
35 dtb-$(CONFIG_ARCH_AXXIA) += axm5516-amarillo.dtb
36 dtb-$(CONFIG_BCM2708_DT) += bcm2708-rpi-b.dtb
37 +dtb-$(CONFIG_BCM2708_DT) += bcm2708-rpi-b-plus.dtb
38 dtb-$(CONFIG_ARCH_BCM2835) += bcm2835-rpi-b.dtb
39 dtb-$(CONFIG_ARCH_BCM_5301X) += bcm4708-netgear-r6250.dtb
40 dtb-$(CONFIG_ARCH_BCM_63XX) += bcm963138dvt.dtb
41 @@ -520,6 +521,7 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += mt6589-aquaris5.dtb
43 targets += dtbs dtbs_install
48 # *.dtb used to be generated in the directory above. Clean out the
49 diff --git a/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts b/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts
51 index 0000000..983c23f
53 +++ b/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts
57 +/include/ "bcm2708.dtsi"
60 + compatible = "brcm,bcm2708";
61 + model = "Raspberry Pi Model B+";
77 + spi0_pins: spi0_pins {
78 + brcm,pins = <7 8 9 10 11>;
79 + brcm,function = <4>; /* alt0 */
84 + brcm,function = <4>;
89 + brcm,function = <4>;
93 + brcm,pins = <18 19 20 21>;
94 + brcm,function = <4>; /* alt0 */
99 + pinctrl-names = "default";
100 + pinctrl-0 = <&spi0_pins>;
103 + compatible = "spidev";
104 + reg = <0>; /* CE0 */
105 + #address-cells = <1>;
107 + spi-max-frequency = <500000>;
111 + compatible = "spidev";
112 + reg = <1>; /* CE1 */
113 + #address-cells = <1>;
115 + spi-max-frequency = <500000>;
120 + pinctrl-names = "default";
121 + pinctrl-0 = <&i2c0_pins>;
122 + clock-frequency = <100000>;
126 + pinctrl-names = "default";
127 + pinctrl-0 = <&i2c1_pins>;
128 + clock-frequency = <100000>;
132 + #sound-dai-cells = <0>;
133 + pinctrl-names = "default";
134 + pinctrl-0 = <&i2s_pins>;
136 diff --git a/arch/arm/boot/dts/bcm2708-rpi-b.dts b/arch/arm/boot/dts/bcm2708-rpi-b.dts
137 index 5893122..d8c6d15 100644
138 --- a/arch/arm/boot/dts/bcm2708-rpi-b.dts
139 +++ b/arch/arm/boot/dts/bcm2708-rpi-b.dts
143 compatible = "brcm,bcm2708";
144 - model = "Raspberry Pi";
145 + model = "Raspberry Pi Model B";
166 + brcm,pins = <28 29 30 31>;
167 + brcm,function = <4>; /* alt0 */
173 pinctrl-0 = <&i2c1_pins>;
174 clock-frequency = <100000>;
178 + #sound-dai-cells = <0>;
179 + pinctrl-names = "default";
180 + pinctrl-0 = <&i2s_pins>;
182 diff --git a/arch/arm/boot/dts/bcm2708.dtsi b/arch/arm/boot/dts/bcm2708.dtsi
183 index 2ca6d63..6b36128 100644
184 --- a/arch/arm/boot/dts/bcm2708.dtsi
185 +++ b/arch/arm/boot/dts/bcm2708.dtsi
187 interrupt-parent = <&intc>;
191 - bootargs must be 1024 characters long because the
192 - VC bootloader can't expand it
194 - bootargs = "console=ttyAMA0 ";
195 + /* No padding required - the boot loader can do that. */
201 #interrupt-cells = <2>;
204 + i2s: i2s@7e203000 {
205 + compatible = "brcm,bcm2708-i2s";
206 + reg = <0x7e203000 0x20>,
211 + dma-names = "tx", "rx";
212 + status = "disabled";
216 compatible = "brcm,bcm2708-spi";
217 reg = <0x7e204000 0x1000>;
218 diff --git a/arch/arm/boot/dts/hifiberry-dac-overlay.dts b/arch/arm/boot/dts/hifiberry-dac-overlay.dts
220 index 0000000..5e7633a
222 +++ b/arch/arm/boot/dts/hifiberry-dac-overlay.dts
224 +// Definitions for HiFiBerry DAC
229 + compatible = "brcm,bcm2708";
234 + compatible = "hifiberry,hifiberry-dac";
235 + i2s-controller = <&i2s>;
251 + #sound-dai-cells = <0>;
252 + compatible = "ti,pcm5102a";
258 diff --git a/arch/arm/boot/dts/hifiberry-dacplus-overlay.dts b/arch/arm/boot/dts/hifiberry-dacplus-overlay.dts
260 index 0000000..deb9c62
262 +++ b/arch/arm/boot/dts/hifiberry-dacplus-overlay.dts
264 +// Definitions for HiFiBerry DAC+
269 + compatible = "brcm,bcm2708";
274 + compatible = "hifiberry,hifiberry-dacplus";
275 + i2s-controller = <&i2s>;
290 + #address-cells = <1>;
295 + #sound-dai-cells = <0>;
296 + compatible = "ti,pcm5122";
303 diff --git a/arch/arm/boot/dts/hifiberry-digi-overlay.dts b/arch/arm/boot/dts/hifiberry-digi-overlay.dts
305 index 0000000..d0e0d8a
307 +++ b/arch/arm/boot/dts/hifiberry-digi-overlay.dts
309 +// Definitions for HiFiBerry Digi
314 + compatible = "brcm,bcm2708";
319 + compatible = "hifiberry,hifiberry-digi";
320 + i2s-controller = <&i2s>;
335 + #address-cells = <1>;
340 + #sound-dai-cells = <0>;
341 + compatible = "wlf,wm8804";
348 diff --git a/arch/arm/boot/dts/iqaudio-dac-overlay.dts b/arch/arm/boot/dts/iqaudio-dac-overlay.dts
350 index 0000000..ea8173e
352 +++ b/arch/arm/boot/dts/iqaudio-dac-overlay.dts
354 +// Definitions for IQaudIO DAC
359 + compatible = "brcm,bcm2708";
364 + compatible = "iqaudio,iqaudio-dac";
365 + i2s-controller = <&i2s>;
380 + #address-cells = <1>;
385 + #sound-dai-cells = <0>;
386 + compatible = "ti,pcm5122";
393 diff --git a/arch/arm/boot/dts/iqaudio-dacplus-overlay.dts b/arch/arm/boot/dts/iqaudio-dacplus-overlay.dts
395 index 0000000..735d8ab
397 +++ b/arch/arm/boot/dts/iqaudio-dacplus-overlay.dts
399 +// Definitions for IQaudIO DAC+
404 + compatible = "brcm,bcm2708";
409 + compatible = "iqaudio,iqaudio-dac";
410 + i2s-controller = <&i2s>;
425 + #address-cells = <1>;
430 + #sound-dai-cells = <0>;
431 + compatible = "ti,pcm5122";
438 diff --git a/sound/soc/bcm/hifiberry_dac.c b/sound/soc/bcm/hifiberry_dac.c
439 index 4b70b45..3ab0f47 100644
440 --- a/sound/soc/bcm/hifiberry_dac.c
441 +++ b/sound/soc/bcm/hifiberry_dac.c
442 @@ -72,6 +72,21 @@ static int snd_rpi_hifiberry_dac_probe(struct platform_device *pdev)
445 snd_rpi_hifiberry_dac.dev = &pdev->dev;
447 + if (pdev->dev.of_node) {
448 + struct device_node *i2s_node;
449 + struct snd_soc_dai_link *dai = &snd_rpi_hifiberry_dac_dai[0];
450 + i2s_node = of_parse_phandle(pdev->dev.of_node,
451 + "i2s-controller", 0);
454 + dai->cpu_dai_name = NULL;
455 + dai->cpu_of_node = i2s_node;
456 + dai->platform_name = NULL;
457 + dai->platform_of_node = i2s_node;
461 ret = snd_soc_register_card(&snd_rpi_hifiberry_dac);
463 dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ret);
464 @@ -84,10 +99,17 @@ static int snd_rpi_hifiberry_dac_remove(struct platform_device *pdev)
465 return snd_soc_unregister_card(&snd_rpi_hifiberry_dac);
468 +static const struct of_device_id snd_rpi_hifiberry_dac_of_match[] = {
469 + { .compatible = "hifiberry,hifiberry-dac", },
472 +MODULE_DEVICE_TABLE(of, snd_rpi_hifiberry_dac_of_match);
474 static struct platform_driver snd_rpi_hifiberry_dac_driver = {
476 .name = "snd-hifiberry-dac",
477 .owner = THIS_MODULE,
478 + .of_match_table = snd_rpi_hifiberry_dac_of_match,
480 .probe = snd_rpi_hifiberry_dac_probe,
481 .remove = snd_rpi_hifiberry_dac_remove,
482 diff --git a/sound/soc/bcm/hifiberry_dacplus.c b/sound/soc/bcm/hifiberry_dacplus.c
483 index c63387b..11e4f39 100644
484 --- a/sound/soc/bcm/hifiberry_dacplus.c
485 +++ b/sound/soc/bcm/hifiberry_dacplus.c
486 @@ -90,6 +90,21 @@ static int snd_rpi_hifiberry_dacplus_probe(struct platform_device *pdev)
489 snd_rpi_hifiberry_dacplus.dev = &pdev->dev;
491 + if (pdev->dev.of_node) {
492 + struct device_node *i2s_node;
493 + struct snd_soc_dai_link *dai = &snd_rpi_hifiberry_dacplus_dai[0];
494 + i2s_node = of_parse_phandle(pdev->dev.of_node,
495 + "i2s-controller", 0);
498 + dai->cpu_dai_name = NULL;
499 + dai->cpu_of_node = i2s_node;
500 + dai->platform_name = NULL;
501 + dai->platform_of_node = i2s_node;
505 ret = snd_soc_register_card(&snd_rpi_hifiberry_dacplus);
508 @@ -103,10 +118,17 @@ static int snd_rpi_hifiberry_dacplus_remove(struct platform_device *pdev)
509 return snd_soc_unregister_card(&snd_rpi_hifiberry_dacplus);
512 +static const struct of_device_id snd_rpi_hifiberry_dacplus_of_match[] = {
513 + { .compatible = "hifiberry,hifiberry-dacplus", },
516 +MODULE_DEVICE_TABLE(of, snd_rpi_hifiberry_dacplus_of_match);
518 static struct platform_driver snd_rpi_hifiberry_dacplus_driver = {
520 .name = "snd-rpi-hifiberry-dacplus",
521 .owner = THIS_MODULE,
522 + .of_match_table = snd_rpi_hifiberry_dacplus_of_match,
524 .probe = snd_rpi_hifiberry_dacplus_probe,
525 .remove = snd_rpi_hifiberry_dacplus_remove,
526 diff --git a/sound/soc/bcm/hifiberry_digi.c b/sound/soc/bcm/hifiberry_digi.c
527 index e4f769d..76af8a6 100644
528 --- a/sound/soc/bcm/hifiberry_digi.c
529 +++ b/sound/soc/bcm/hifiberry_digi.c
530 @@ -125,6 +125,21 @@ static int snd_rpi_hifiberry_digi_probe(struct platform_device *pdev)
533 snd_rpi_hifiberry_digi.dev = &pdev->dev;
535 + if (pdev->dev.of_node) {
536 + struct device_node *i2s_node;
537 + struct snd_soc_dai_link *dai = &snd_rpi_hifiberry_digi_dai[0];
538 + i2s_node = of_parse_phandle(pdev->dev.of_node,
539 + "i2s-controller", 0);
542 + dai->cpu_dai_name = NULL;
543 + dai->cpu_of_node = i2s_node;
544 + dai->platform_name = NULL;
545 + dai->platform_of_node = i2s_node;
549 ret = snd_soc_register_card(&snd_rpi_hifiberry_digi);
551 dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ret);
552 @@ -137,10 +152,17 @@ static int snd_rpi_hifiberry_digi_remove(struct platform_device *pdev)
553 return snd_soc_unregister_card(&snd_rpi_hifiberry_digi);
556 +static const struct of_device_id snd_rpi_hifiberry_digi_of_match[] = {
557 + { .compatible = "hifiberry,hifiberry-digi", },
560 +MODULE_DEVICE_TABLE(of, snd_rpi_hifiberry_digi_of_match);
562 static struct platform_driver snd_rpi_hifiberry_digi_driver = {
564 .name = "snd-hifiberry-digi",
565 .owner = THIS_MODULE,
566 + .of_match_table = snd_rpi_hifiberry_digi_of_match,
568 .probe = snd_rpi_hifiberry_digi_probe,
569 .remove = snd_rpi_hifiberry_digi_remove,
570 diff --git a/sound/soc/bcm/iqaudio-dac.c b/sound/soc/bcm/iqaudio-dac.c
571 index 8d0e2ae..ee8cd6e 100644
572 --- a/sound/soc/bcm/iqaudio-dac.c
573 +++ b/sound/soc/bcm/iqaudio-dac.c
574 @@ -76,6 +76,21 @@ static int snd_rpi_iqaudio_dac_probe(struct platform_device *pdev)
577 snd_rpi_iqaudio_dac.dev = &pdev->dev;
579 + if (pdev->dev.of_node) {
580 + struct device_node *i2s_node;
581 + struct snd_soc_dai_link *dai = &snd_rpi_iqaudio_dac_dai[0];
582 + i2s_node = of_parse_phandle(pdev->dev.of_node,
583 + "i2s-controller", 0);
586 + dai->cpu_dai_name = NULL;
587 + dai->cpu_of_node = i2s_node;
588 + dai->platform_name = NULL;
589 + dai->platform_of_node = i2s_node;
593 ret = snd_soc_register_card(&snd_rpi_iqaudio_dac);
596 @@ -93,6 +108,7 @@ static const struct of_device_id iqaudio_of_match[] = {
597 { .compatible = "iqaudio,iqaudio-dac", },
600 +MODULE_DEVICE_TABLE(of, iqaudio_of_match);
602 static struct platform_driver snd_rpi_iqaudio_dac_driver = {
604 diff --git a/sound/soc/codecs/pcm5102a.c b/sound/soc/codecs/pcm5102a.c
605 index 126f1e9..7c6598e 100644
606 --- a/sound/soc/codecs/pcm5102a.c
607 +++ b/sound/soc/codecs/pcm5102a.c
608 @@ -47,12 +47,19 @@ static int pcm5102a_remove(struct platform_device *pdev)
612 +static const struct of_device_id pcm5102a_of_match[] = {
613 + { .compatible = "ti,pcm5102a", },
616 +MODULE_DEVICE_TABLE(of, pcm5102a_of_match);
618 static struct platform_driver pcm5102a_codec_driver = {
619 .probe = pcm5102a_probe,
620 .remove = pcm5102a_remove,
622 .name = "pcm5102a-codec",
623 .owner = THIS_MODULE,
624 + .of_match_table = pcm5102a_of_match,