[PATCH v3 6/6] ARM: dts: Add dts for RPi4b + Cirrus Logic Lochnagar2 + CS47L15

From: Richard Fitzgerald
Date: Thu Dec 17 2020 - 10:43:04 EST


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 <rf@xxxxxxxxxxxxxxxxxxxxx>
---
MAINTAINERS | 1 +
arch/arm/boot/dts/Makefile | 1 +
...bcm2711-rpi4b-cirrus-lochnagar-cs47l15.dts | 186 ++++++++++++++++
.../dts/bcm2711-rpi4b-cirrus-lochnagar.dtsi | 201 ++++++++++++++++++
4 files changed, 389 insertions(+)
create mode 100644 arch/arm/boot/dts/bcm2711-rpi4b-cirrus-lochnagar-cs47l15.dts
create mode 100644 arch/arm/boot/dts/bcm2711-rpi4b-cirrus-lochnagar.dtsi

diff --git a/MAINTAINERS b/MAINTAINERS
index 5cc595ac7b28..7dca1db52144 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -4193,6 +4193,7 @@ M: Charles Keepax <ckeepax@xxxxxxxxxxxxxxxxxxxxx>
M: Richard Fitzgerald <rf@xxxxxxxxxxxxxxxxxxxxx>
L: patches@xxxxxxxxxxxxxxxxxxxxx
S: Supported
+F: arch/arm/boot/dts/bcm2711-rpi4b-cirrus-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 ce66ffd5a1bb..240cc58fd954 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-rpi4b-cirrus-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-rpi4b-cirrus-lochnagar-cs47l15.dts b/arch/arm/boot/dts/bcm2711-rpi4b-cirrus-lochnagar-cs47l15.dts
new file mode 100644
index 000000000000..b6b91289bc6f
--- /dev/null
+++ b/arch/arm/boot/dts/bcm2711-rpi4b-cirrus-lochnagar-cs47l15.dts
@@ -0,0 +1,186 @@
+// SPDX-License-Identifier: GPL-2.0
+/dts-v1/;
+#include "bcm2711-rpi4b-cirrus-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-rpi4b-cirrus-lochnagar.dtsi b/arch/arm/boot/dts/bcm2711-rpi4b-cirrus-lochnagar.dtsi
new file mode 100644
index 000000000000..af498d7ad18a
--- /dev/null
+++ b/arch/arm/boot/dts/bcm2711-rpi4b-cirrus-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