Original patch: https://github.com/PotatoMania/uconsole-cm3/blob/dev/PKGBUILDs/linux-uconsole-cm3-rpi64/0004-arm-dts-overlays-add-uconsole.patch Adapted from Raspberry Pi CM3 to Raspberry Pi CM4 diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile index 04a9c9a8ab90..ddd90f3f087d 100644 --- a/arch/arm/boot/dts/overlays/Makefile +++ b/arch/arm/boot/dts/overlays/Makefile @@ -284,6 +284,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \ uart4.dtbo \ uart4-pi5.dtbo \ uart5.dtbo \ + uconsole.dtbo \ udrc.dtbo \ ugreen-dabboard.dtbo \ upstream.dtbo \ diff --git a/arch/arm/boot/dts/overlays/uconsole.dts b/arch/arm/boot/dts/overlays/uconsole.dts new file mode 100644 index 000000000000..bfc12f7a029b --- /dev/null +++ b/arch/arm/boot/dts/overlays/uconsole.dts @@ -0,0 +1,233 @@ +/dts-v1/; +/plugin/; + +#include + +/* uConsole All In One */ + +/ { + compatible = "brcm,bcm2835"; + + fragment@70 { + target-path = "/aliases"; + __overlay__ { + i2c_uconsole = "/i2c@0"; + }; + }; + + fragment@71 { + target-path = "/__symbols__"; + __overlay__ { + i2c_uconsole = "/i2c@0"; + }; + }; + + fragment@80 { + target-path = "/chosen"; + __overlay__ { + bootargs = "snd_bcm2835.enable_headphones=1"; + }; + }; + + fragment@90 { + target-path = "/"; + __overlay__ { + audio_amplifier: audio-amplifier { + compatible = "simple-amplifier-switch"; + sw-gpios = <&gpio 10 1>; /* GPIO10, GPIO_ACTIVE_LOW */ + outputs-gpios = <&gpio 11 0>; /* GPIO11, GPIO_ACTIVE_HIGH */ + // vdd-supply = <&uc_reg_5v0>; + }; + + ocp8178_backlight: backlight@0 { + compatible = "ocp8178-backlight"; + backlight-control-gpios = <&gpio 9 0>; /* GPIO9 ACTIVE HIGH */ + default-brightness = <5>; + // vdd-supply = <&uc_reg_5v0>; + }; + + battery: battery@0 { + compatible = "simple-battery"; + constant-charge-current-max-microamp = <2100000>; + voltage-min-design-microvolt = <3300000>; + voltage-max-design-microvolt = <4200000>; + }; + + i2c_uconsole: i2c@0 { + reg = <3>; + compatible = "i2c-gpio"; + gpios = <&gpio 0 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN) /* sda */ + &gpio 1 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN) /* scl */ + >; + i2c-gpio,delay-us = <2>; /* ~100 kHz */ + #address-cells = <1>; + #size-cells = <0>; + }; + + /* TPS61178, the supply for 5V bus, including USB, backlight + */ + // uc_reg_5v0: uc-reg-5v0 { + // compatible = "fixed-regulator"; + // regulator-name = "sys-5v0"; + // regulator-boot-on; + // regulator-always-on; /* cannot be turned off anyway */ + // vin-supply = <&usb_power_supply>; + // }; + }; + }; +}; + +&leds { + /delete-node/ led-act; + + /* This is the green LED under the power button, + * However this is not usable without a hardware modification(move R117 to R116) + */ + // act_led: led-act { + // linux,default-trigger = "default-on"; + // gpios = <&axp_gpio 0 1>; /* gpio0 on pmu, low active */ + // // function = "activity"; + // }; + + /* This is the orange charging LED under the power button. + * Requires a patch to the pinctrl-axp209 driver, because + * charge led is not a gpio thus not supported. + */ + // chg_led: led-chg { + // linux,default-trigger = "axp20x-battery-charging-blink-full-solid"; + // gpios = <&axp_gpio 99 1>; /* CHGLED on pmu, low active */ + // }; +}; + +/* PMU */ +&i2c_uconsole { + + axp22x: pmic@34 { + interrupt-controller; + #interrupt-cells = <1>; + compatible = "x-powers,axp228", "x-powers,axp223", "x-powers,axp221"; + reg = <0x34>; /* i2c address */ + interrupt-parent = <&gpio>; + interrupts = <2 8>; /* IRQ_TYPE_LEVEL_LOW */ + irq-gpios = <&gpio 2 0>; + + /* TODO: figure out the initial output states */ + regulators { + + x-powers,dcdc-freq = <3000>; + + reg_dcdc1: dcdc1 { + regulator-name = "sys-3v3"; + regulator-always-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + }; + + reg_dcdc3: dcdc3 { + regulator-name = "sys-1v8"; + regulator-always-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + }; + + /* TODO: switch this on demand? */ + reg_aldo1: aldo1 { + regulator-name = "aud-3v3"; + regulator-always-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + }; + + reg_aldo2: aldo2 { + regulator-name = "disp-3v3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + }; + + /* DLDO2-DLDO4 are connected in parallel. + * They seem not necessary, BUT they are connected to the TPS2553's enable pin! + * Disable them will shutdown the USB 5V line. + */ + reg_dldo2: dldo2 { + regulator-name = "vcc-3v3-ext-a"; + regulator-always-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + }; + + reg_dldo3: dldo3 { + regulator-name = "vcc-3v3-ext-b"; + regulator-always-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + }; + + reg_dldo4: dldo4 { + regulator-name = "vcc-3v3-ext-c"; + regulator-always-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + }; + }; + + battery_power_supply: battery-power-supply { + compatible = "x-powers,axp221-battery-power-supply"; + monitored-battery = <&battery>; + }; + + ac_power_supply: ac_power_supply { + compatible = "x-powers,axp221-ac-power-supply"; + }; + + axp_adc: adc { + compatible = "x-powers,axp221-adc"; + #io-channel-cells = <1>; + }; + + axp_gpio: gpio { + compatible = "x-powers,axp221-gpio"; + gpio-controller; + #gpio-cells = <2>; + status = "disabled"; + + gpio0_out: gpio0-out-pin { + pins = "GPIO0"; + function = "gpio_out"; + }; + }; + + /* IPSOUT, feed to on-board buck to get 5V output */ + /* TODO: figure out how to configure it properly */ + usb_power_supply: usb-power { + compatible = "x-powers,axp221-usb-power-supply"; + }; + }; +}; + +&dsi1 { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + + port { + dsi_out_port: endpoint { + remote-endpoint = <&panel_dsi_port>; + }; + }; + + panel_cwu50: panel@0 { + compatible = "clockwork,cwu50"; + reg = <0>; + reset-gpio = <&gpio 8 1>; /* GPIO8 ACTIVE LOW */ + backlight = <&ocp8178_backlight>; + rotation = <90>; + iovcc-supply = <®_dcdc3>; + vci-supply = <®_aldo2>; + + port { + panel_dsi_port: endpoint { + remote-endpoint = <&dsi_out_port>; + }; + }; + }; +};