This adds a devicetree configuration for Raspberry Pi 4b connected to
Cirrus Logic Lochnagar 2 audio development board and CS47L15 codec.

The common (codec-independent) Lochnagar 2 configuration is separated
into a dtsi to simplify re-using it for other codecs.

Signed-off-by: Richard Fitzgerald <r...@opensource.cirrus.com>
---
 MAINTAINERS                                   |   1 +
 arch/arm/boot/dts/Makefile                    |   1 +
 .../dts/bcm2711-rpi-4-b-lochnagar-cs47l15.dts | 186 ++++++++++++++++
 .../boot/dts/bcm2711-rpi-4-b-lochnagar.dtsi   | 201 ++++++++++++++++++
 4 files changed, 389 insertions(+)
 create mode 100644 arch/arm/boot/dts/bcm2711-rpi-4-b-lochnagar-cs47l15.dts
 create mode 100644 arch/arm/boot/dts/bcm2711-rpi-4-b-lochnagar.dtsi

diff --git a/MAINTAINERS b/MAINTAINERS
index 9407dd55673b..c61d522838ee 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -4233,6 +4233,7 @@ M:        Charles Keepax <ckee...@opensource.cirrus.com>
 M:     Richard Fitzgerald <r...@opensource.cirrus.com>
 L:     patc...@opensource.cirrus.com
 S:     Supported
+F:     arch/arm/boot/dts/bcm2711-rpi-4-b-lochnagar*
 F:     Documentation/devicetree/bindings/clock/cirrus,lochnagar.yaml
 F:     Documentation/devicetree/bindings/hwmon/cirrus,lochnagar.yaml
 F:     Documentation/devicetree/bindings/mfd/cirrus,lochnagar.yaml
diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
index 3d1ea0b25168..87230f81aa7a 100644
--- a/arch/arm/boot/dts/Makefile
+++ b/arch/arm/boot/dts/Makefile
@@ -93,6 +93,7 @@ dtb-$(CONFIG_ARCH_BCM2835) += \
        bcm2837-rpi-3-b-plus.dtb \
        bcm2837-rpi-cm3-io3.dtb \
        bcm2711-rpi-4-b.dtb \
+       bcm2711-rpi-4-b-lochnagar-cs47l15.dtb \
        bcm2835-rpi-zero.dtb \
        bcm2835-rpi-zero-w.dtb
 dtb-$(CONFIG_ARCH_BCM_5301X) += \
diff --git a/arch/arm/boot/dts/bcm2711-rpi-4-b-lochnagar-cs47l15.dts 
b/arch/arm/boot/dts/bcm2711-rpi-4-b-lochnagar-cs47l15.dts
new file mode 100644
index 000000000000..7b516b3d7af1
--- /dev/null
+++ b/arch/arm/boot/dts/bcm2711-rpi-4-b-lochnagar-cs47l15.dts
@@ -0,0 +1,186 @@
+// SPDX-License-Identifier: GPL-2.0
+/dts-v1/;
+#include "bcm2711-rpi-4-b-lochnagar.dtsi"
+#include <dt-bindings/sound/madera.h>
+
+/ {
+       sound {
+               status = "okay";
+
+               compatible = "audio-graph-card";
+               label = "sound-card-cs47l15";
+
+               clocks = <&clk_24m>, <&fll1_out>, <&fll1_dsp>;
+               clock-names = "ln-clk-24m", "fll1-out", "fll1-dsp";
+
+               plls = <
+                       &cs47l15 MADERA_FLL1_REFCLK MADERA_FLL_SRC_MCLK1 
98304000
+               >;
+               plls-clocks = "ln-clk-24m";
+
+               sysclks = <
+                       &cs47l15 MADERA_CLK_SYSCLK_1 MADERA_CLK_SRC_FLL1 0
+                       &cs47l15 MADERA_CLK_DSPCLK   MADERA_CLK_SRC_FLL1 0
+               >;
+               sysclks-clocks = "fll1-out", "fll1-dsp";
+
+               widgets = "Microphone", "Microphone Jack",
+                         "Headphone", "Headphone Jack";
+
+               routing = "Microphone Jack", "MICBIAS1A",
+                         "IN1BRN", "Microphone Jack",
+                         "IN1BRP", "Microphone Jack",
+                         "Headphone Jack", "HPOUTL",
+                         "Headphone Jack", "HPOUTR";
+
+               dais = <&cpu_i2s_port &cs47l15_trace_port>;
+
+               /* Main output from FLL1 */
+               fll1_out: fll1_out {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <98304000>;
+               };
+
+               /* x1.5 DSP output from FLL1 */
+               fll1_dsp: fll1_dsp {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <147456000>;
+               };
+       };
+};
+
+&i2s {
+       ports {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               cpu_i2s_port: port@0 {
+                       reg = <0>;
+                       cpu_i2s_ep: endpoint {
+                               remote-endpoint = <&cs47l15_aif1>;
+                               dai-format = "i2s";
+                       };
+               };
+       };
+};
+
+&spi {
+       status = "okay";
+
+       cs47l15: cs47l15@1 {
+               status = "okay";
+
+               compatible = "cirrus,cs47l15";
+               reg = <0x1>;
+
+               spi-max-frequency = <11000000>;
+
+               interrupts = <27 8>;
+               interrupt-controller;
+               #interrupt-cells = <2>;
+               interrupt-parent = <&gpio>;
+               gpio-controller;
+               #gpio-cells = <2>;
+               #sound-dai-cells = <1>;
+
+               AVDD-supply = <&lochnagar_vdd1v8>;
+               DCVDD-supply = <&lochnagar_vddcore>;
+               DBVDD1-supply = <&lochnagar_vdd1v8>;
+               CPVDD1-supply = <&lochnagar_vdd1v8>;
+               SPKVDD-supply = <&wallvdd>;
+               MICVDD-supply = <&lochnagar_micvdd>;
+
+               reset-gpios = <&lochnagar_pin 0 0>;
+
+               cirrus,dmic-ref = <
+                       MADERA_DMIC_REF_MICBIAS1
+               >;
+               cirrus,inmode = <
+                       MADERA_INMODE_SE   MADERA_INMODE_SE   /* IN1A */
+                       MADERA_INMODE_DIFF MADERA_INMODE_DIFF /* IN1B */
+                       MADERA_INMODE_SE   MADERA_INMODE_SE   /* IN2A */
+                       MADERA_INMODE_DIFF MADERA_INMODE_DIFF /* IN2B */
+               >;
+
+               clocks = <&lochnagar_clk LOCHNAGAR_CDC_MCLK1>,
+                        <&lochnagar_clk LOCHNAGAR_CDC_MCLK2>;
+               clock-names = "mclk1", "mclk2";
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&cdc_irq &cs47l15_defaults>;
+
+               cs47l15_defaults: cs47l15-gpio-defaults {
+                       aif1 {
+                               groups = "aif1";
+                               function = "aif1";
+                               bias-bus-hold;
+                       };
+                       aif2 {
+                               groups = "aif2";
+                               function = "aif2";
+                               bias-bus-hold;
+                       };
+                       aif3 {
+                               groups = "aif3";
+                               function = "aif3";
+                               bias-bus-hold;
+                       };
+                       pdmspk1 {
+                               groups = "pdmspk1";
+                               function = "pdmspk1";
+                       };
+               };
+
+               micvdd {
+                       regulator-min-microvolt = <3000000>;
+                       regulator-max-microvolt = <3000000>;
+               };
+
+               MICBIAS1 {
+                       regulator-min-microvolt = <2800000>;
+                       regulator-max-microvolt = <2800000>;
+               };
+               MICBIAS1A {
+                       regulator-active-discharge = <1>;
+               };
+               MICBIAS1B {
+                       regulator-active-discharge = <1>;
+               };
+               MICBIAS1C {
+                       regulator-active-discharge = <1>;
+               };
+
+               ports {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cs47l15_aif1_port: port@0 {
+                               reg = <0>;
+                               cs47l15_aif1: endpoint {
+                                       remote-endpoint = <&cpu_i2s_ep>;
+                                       bitclock-master;
+                                       frame-master;
+                                       system-clock-frequency = <0>;
+                                       mclk-fs = <0>;
+                               };
+                       };
+                       /* Debug trace compressed stream */
+                       cs47l15_trace_port: port@3 {
+                               reg = <3>;
+                               cs47l15_trace_cpu: endpoint {
+                                       remote-endpoint = 
<&cs47l15_trace_codec>;
+                                       system-clock-frequency = <0>;
+                                       mclk-fs = <0>;
+                               };
+                       };
+                       port@4 {
+                               reg = <4>;
+                               cs47l15_trace_codec: endpoint {
+                                       remote-endpoint = <&cs47l15_trace_cpu>;
+                                       system-clock-frequency = <0>;
+                                       mclk-fs = <0>;
+                               };
+                       };
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/bcm2711-rpi-4-b-lochnagar.dtsi 
b/arch/arm/boot/dts/bcm2711-rpi-4-b-lochnagar.dtsi
new file mode 100644
index 000000000000..af498d7ad18a
--- /dev/null
+++ b/arch/arm/boot/dts/bcm2711-rpi-4-b-lochnagar.dtsi
@@ -0,0 +1,201 @@
+// SPDX-License-Identifier: GPL-2.0
+/dts-v1/;
+#include "bcm2711-rpi-4-b.dts"
+#include <dt-bindings/clk/lochnagar.h>
+#include <dt-bindings/pinctrl/bcm2835.h>
+#include <dt-bindings/pinctrl/lochnagar.h>
+
+/ {
+       wallvdd: wallvdd@0 {
+               compatible = "regulator-fixed";
+
+               regulator-name = "WALL_VDD_5V";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               regulator-boot-on;
+               regulator-always-on;
+       };
+
+};
+
+&gpio {
+       lochnagar_present: lochnagar_present {
+               brcm,pins = <22>;
+               brcm,function = <BCM2835_FSEL_GPIO_OUT>;
+       };
+
+       lochnagar_reset: lochnagar_reset {
+               brcm,pins = <24>;
+               brcm,function = <BCM2835_FSEL_GPIO_OUT>;
+       };
+
+       cdc_irq: cdc_irq {
+               brcm,pins = <27>;
+               brcm,function = <BCM2835_FSEL_GPIO_IN>;
+       };
+
+       spi_pins: spi_pins {
+               brcm,pins = <9 10 11>;
+               brcm,function = <BCM2835_FSEL_ALT0>;
+       };
+
+       spi_cs: spi_cs {
+               brcm,pins = <7 8>;
+               brcm,function = <BCM2835_FSEL_GPIO_OUT>;
+       };
+
+       i2s_pins: i2s_pins {
+               brcm,pins = <18 19 20 21>;
+               brcm,function = <BCM2835_FSEL_ALT0>;
+       };
+};
+
+&i2s {
+       status = "okay";
+       #sound-dai-cells = <1>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2s_pins>;
+       dmas = <&dma 2>, <&dma 3>;
+       dma-names = "tx", "rx";
+};
+
+&i2c1 {
+       status = "okay";
+
+       lochnagar: lochnagar@22 {
+               status = "okay";
+
+               compatible = "cirrus,lochnagar2";
+               reg = <0x22>;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&lochnagar_present &lochnagar_reset>;
+
+               reset-gpio = <&gpio 24 0>;
+               present-gpio = <&gpio 22 0>;
+
+               lochnagar_vdd1v8: VDD1V8 {
+                       compatible = "regulator-fixed";
+
+                       regulator-name = "VDD1V8";
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       regulator-boot-on;
+                       regulator-always-on;
+
+                       vin-supply = <&wallvdd>;
+               };
+
+               clk_pmic: clk_pmic {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <32768>;
+               };
+               clk_24m: clk_24m {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <24576000>;
+               };
+
+               lochnagar_clk: clk {
+                       compatible = "cirrus,lochnagar2-clk";
+
+                       #clock-cells = <1>;
+
+                       clocks = <&clk_pmic>, <&clk_24m>;
+                       clock-names = "ln-pmic-32k", "ln-clk-24m";
+
+                       assigned-clocks = <&lochnagar_clk LOCHNAGAR_CDC_MCLK1>,
+                                         <&lochnagar_clk LOCHNAGAR_CDC_MCLK2>,
+                                         <&lochnagar_clk 
LOCHNAGAR_SOUNDCARD_MCLK>;
+                       assigned-clock-parents = <&clk_24m>,
+                                                <&clk_pmic>,
+                                                <&clk_24m>;
+               };
+
+               lochnagar_pin: pin {
+                       compatible = "cirrus,lochnagar-pinctrl";
+
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       gpio-ranges = <&lochnagar_pin 0 0 
LOCHNAGAR2_PIN_NUM_GPIOS>;
+
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pin_settings>;
+
+                       pin_settings: pin_settings {
+                               rpi_aif {
+                                       input-enable;
+                                       groups = "gf-aif1";
+                                       function = "codec-aif1";
+                               };
+                               codec_aif1 {
+                                       output-master;
+                                       groups = "codec-aif1";
+                                       function = "gf-aif1";
+                               };
+                               sc_codec_aif {
+                                       output-enable;
+                                       groups = "codec-aif2";
+                                       function = "soundcard-aif";
+                               };
+                               sc_lochnagar_aif {
+                                       input-enable;
+                                       groups = "soundcard-aif";
+                                       function = "codec-aif2";
+                               };
+                       };
+               };
+
+               lochnagar_hwmon: hwmon {
+                       compatible = "cirrus,lochnagar2-hwmon";
+               };
+
+               lochnagar_micvdd: MICVDD {
+                       compatible = "cirrus,lochnagar2-micvdd";
+
+                       SYSVDD-supply = <&wallvdd>;
+
+                       regulator-min-microvolt = <3000000>;
+                       regulator-max-microvolt = <3000000>;
+               };
+
+               MIC1VDD {
+                       compatible = "cirrus,lochnagar2-mic1vdd";
+
+                       regulator-always-on;
+                       cirrus,micbias-input = <2>;
+               };
+
+               MIC2VDD {
+                       compatible = "cirrus,lochnagar2-mic2vdd";
+
+                       regulator-always-on;
+                       cirrus,micbias-input = <3>;
+               };
+
+               lochnagar_vddcore: VDDCORE {
+                       compatible = "cirrus,lochnagar2-vddcore";
+
+                       SYSVDD-supply = <&wallvdd>;
+
+                       regulator-min-microvolt = <1200000>;
+                       regulator-max-microvolt = <1200000>;
+               };
+
+               lochnagar_sc: soundcard {
+                       compatible = "cirrus,lochnagar2-soundcard";
+
+                       #sound-dai-cells = <1>;
+
+                       clocks = <&lochnagar_clk LOCHNAGAR_SOUNDCARD_MCLK>;
+                       clock-names = "mclk";
+               };
+       };
+};
+
+&spi {
+       pinctrl-names = "default";
+       pinctrl-0 = <&spi_pins &spi_cs>;
+       cs-gpios = <&gpio 8 1>, <&gpio 7 1>;
+};
-- 
2.20.1

Reply via email to