diff mbox series

[v4,5/5] arm64: dts: qcom: Add Lenovo ThinkBook 16 G7 QOY device tree

Message ID 20250524-tb16-dt-v4-5-2c1e6018d3f0@oldschoolsolutions.biz
State Superseded
Headers show
Series arm64: dts: qcom: Add Lenovo ThinkBook 16 device tree | expand

Commit Message

Jens Glathe via B4 Relay May 24, 2025, 11:48 a.m. UTC
From: Jens Glathe <jens.glathe@oldschoolsolutions.biz>

Device tree for the Lenovo Thinkbook 16 G7 QOY

The Laptop is a Snapdragon X1 / X1 Plus (Purwa) based device [1].

Supported features:

- USB type-c and type-a ports
- Keyboard
- Touchpad (all that are described in the dsdt)
- Touchscreen (described in the dsdt, no known SKUss)
- Display including PWM backlight control
- PCIe devices
- nvme
- SDHC card reader
- ath12k WCN7850 Wifi and Bluetooth
- ADSP and CDSP
- GPIO keys (Lid switch)
- Sound via internal speakers / DMIC / USB / headphone jack
- DP Altmode with 2 lanes (as all of these still do)
- Integrated fingerprint reader (FPC)
- Integrated UVC camera

Not supported yet:

- HDMI port.
- EC and some fn hotkeys.

Limited support yet:

- SDHC card reader is based on the on-chip sdhc_2 controller, but the driver from
the Snapdragon Dev Kit is only a partial match. It can do normal slow sd cards,
but not UHS-I (SD104) and UHS-II.

- The GPU is not yet supported. Graphics is only software rendered.

This work was done without any schematics or non-public knowledge of the device.
So, it is based on the existing x1e device trees, dsdt analysis, using HWInfo
ARM64, and pure guesswork. It has been confirmed, however, that the device really
has 4 NXP PTN3222 eUSB2 repeaters, one of which doesn't have a reset GPIO (eusb5
@43).

Signed-off-by: Jens Glathe <jens.glathe@oldschoolsolutions.biz>
Co-developed by: Aleksandrs Vinarskis <alex.vinarskis@gmail.com>
---
 arch/arm64/boot/dts/qcom/Makefile                  |    3 +
 arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi       |    2 +-
 .../boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts | 1655 ++++++++++++++++++++
 3 files changed, 1659 insertions(+), 1 deletion(-)

Comments

Dmitry Baryshkov May 24, 2025, 3:33 p.m. UTC | #1
On Sat, May 24, 2025 at 01:48:40PM +0200, Jens Glathe via B4 Relay wrote:
> From: Jens Glathe <jens.glathe@oldschoolsolutions.biz>
> 
> Device tree for the Lenovo Thinkbook 16 G7 QOY
> 
> The Laptop is a Snapdragon X1 / X1 Plus (Purwa) based device [1].
> 
> Supported features:
> 
> - USB type-c and type-a ports
> - Keyboard
> - Touchpad (all that are described in the dsdt)
> - Touchscreen (described in the dsdt, no known SKUss)
> - Display including PWM backlight control
> - PCIe devices
> - nvme
> - SDHC card reader
> - ath12k WCN7850 Wifi and Bluetooth
> - ADSP and CDSP
> - GPIO keys (Lid switch)
> - Sound via internal speakers / DMIC / USB / headphone jack
> - DP Altmode with 2 lanes (as all of these still do)
> - Integrated fingerprint reader (FPC)
> - Integrated UVC camera
> 
> Not supported yet:
> 
> - HDMI port.
> - EC and some fn hotkeys.
> 
> Limited support yet:
> 
> - SDHC card reader is based on the on-chip sdhc_2 controller, but the driver from
> the Snapdragon Dev Kit is only a partial match. It can do normal slow sd cards,
> but not UHS-I (SD104) and UHS-II.
> 
> - The GPU is not yet supported. Graphics is only software rendered.
> 
> This work was done without any schematics or non-public knowledge of the device.
> So, it is based on the existing x1e device trees, dsdt analysis, using HWInfo
> ARM64, and pure guesswork. It has been confirmed, however, that the device really
> has 4 NXP PTN3222 eUSB2 repeaters, one of which doesn't have a reset GPIO (eusb5
> @43).
> 
> Signed-off-by: Jens Glathe <jens.glathe@oldschoolsolutions.biz>
> Co-developed by: Aleksandrs Vinarskis <alex.vinarskis@gmail.com>
> ---
>  arch/arm64/boot/dts/qcom/Makefile                  |    3 +
>  arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi       |    2 +-
>  .../boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts | 1655 ++++++++++++++++++++
>  3 files changed, 1659 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile
> index 669b888b27a1daa93ac15f47e8b9a302bb0922c2..aff4fe3e81ec0d6f6d52e2aa0da327b7576632d8 100644
> --- a/arch/arm64/boot/dts/qcom/Makefile
> +++ b/arch/arm64/boot/dts/qcom/Makefile
> @@ -327,3 +327,6 @@ x1e80100-qcp-el2-dtbs	:= x1e80100-qcp.dtb x1-el2.dtbo
>  dtb-$(CONFIG_ARCH_QCOM)	+= x1e80100-qcp.dtb x1e80100-qcp-el2.dtb
>  x1p42100-crd-el2-dtbs	:= x1p42100-crd.dtb x1-el2.dtbo
>  dtb-$(CONFIG_ARCH_QCOM)	+= x1p42100-crd.dtb x1p42100-crd-el2.dtb
> +x1p42100-lenovo-thinkbook-16-el2-dtbs	:= x1p42100-lenovo-thinkbook-16.dtb x1-el2.dtbo
> +dtb-$(CONFIG_ARCH_QCOM)	+= x1p42100-lenovo-thinkbook-16.dtb x1p42100-lenovo-thinkbook-16-el2.dtb
> +

No need for an extra empty line.

> diff --git a/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi b/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi
> index c02fd4d15c9649c222caaafa5ed2c777a10fb4f5..551b392eca4ef3b6041e03ad1385fef11cec1690 100644
> --- a/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi
> +++ b/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi
> @@ -170,7 +170,7 @@ trip1 {
>  			};
>  		};
>  
> -		pm8010-thermal {
> +		pm8010_thermal: pm8010-thermal {
>  			polling-delay-passive = <100>;
>  
>  			thermal-sensors = <&pm8010_temp_alarm>;
> diff --git a/arch/arm64/boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts b/arch/arm64/boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts
> new file mode 100644
> index 0000000000000000000000000000000000000000..7089219ed08c1c4a60cc007f9d043a34a8071b4f
> --- /dev/null
> +++ b/arch/arm64/boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts
> @@ -0,0 +1,1655 @@
> +// SPDX-License-Identifier: BSD-3-Clause
> +/*
> + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
> + * Copyright (c) 2024, Linaro Limited
> + * Copyright (c) 2025, Jens Glathe
> + */
> +
> +/dts-v1/;
> +
> +#include <dt-bindings/gpio/gpio.h>
> +#include <dt-bindings/input/gpio-keys.h>
> +#include <dt-bindings/input/input.h>
> +#include <dt-bindings/pinctrl/qcom,pmic-gpio.h>
> +#include <dt-bindings/regulator/qcom,rpmh-regulator.h>
> +
> +#include "x1p42100.dtsi"
> +#include "x1e80100-pmics.dtsi"
> +
> +/delete-node/ &pmc8380_6;
> +/delete-node/ &pmc8380_6_thermal;
> +/delete-node/ &pm8010;
> +/delete-node/ &pm8010_thermal;
> +
> +/ {
> +	model = "Lenovo ThinkBook 16 Gen 7 QOY";
> +	compatible = "lenovo,thinkbook-16", "qcom,x1p42100";
> +	chassis-type = "laptop";
> +
> +	aliases {
> +		serial0 = &uart21;
> +		serial1 = &uart14;
> +	};
> +
> +	wcd938x: audio-codec {
> +		compatible = "qcom,wcd9385-codec";
> +
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&wcd_default>;
> +
> +		qcom,micbias1-microvolt = <1800000>;
> +		qcom,micbias2-microvolt = <1800000>;
> +		qcom,micbias3-microvolt = <1800000>;
> +		qcom,micbias4-microvolt = <1800000>;
> +		qcom,mbhc-buttons-vthreshold-microvolt = <75000 150000 237000 500000 500000 500000 500000 500000>;
> +		qcom,mbhc-headset-vthreshold-microvolt = <1700000>;
> +		qcom,mbhc-headphone-vthreshold-microvolt = <50000>;
> +		qcom,rx-device = <&wcd_rx>;
> +		qcom,tx-device = <&wcd_tx>;
> +
> +		reset-gpios = <&tlmm 191 GPIO_ACTIVE_LOW>;
> +
> +		vdd-buck-supply = <&vreg_l15b_1p8>;
> +		vdd-rxtx-supply = <&vreg_l15b_1p8>;
> +		vdd-io-supply = <&vreg_l15b_1p8>;
> +		vdd-mic-bias-supply = <&vreg_bob1>;
> +
> +		#sound-dai-cells = <1>;
> +	};
> +
> +	backlight: backlight {
> +		compatible = "pwm-backlight";
> +		pwms = <&pm8550_pwm 3 500000>;
> +
> +		power-supply = <&vreg_edp_bl>;
> +	};
> +
> +	camera {
> +		compatible = "usb5986,1198";
> +
> +		vdd-supply = <&vreg_cam_5p0>;
> +
> +		status = "okay";

This is default, please drop.

> +	};

Camera isn't randomly wire to the board, it is on the USB bus. Please
follow DT bindings and put it accordingly, describing topology of the
bus.

> +
> +	gpio-keys {
> +		compatible = "gpio-keys";
> +
> +		pinctrl-0 = <&hall_int_n_default>;
> +		pinctrl-names = "default";
> +
> +		switch-lid {
> +			gpios = <&tlmm 92 GPIO_ACTIVE_LOW>;
> +			linux,input-type = <EV_SW>;
> +			linux,code = <SW_LID>;
> +			wakeup-source;
> +			wakeup-event-action = <EV_ACT_DEASSERTED>;
> +		};
> +	};
> +
> +	pmic-glink {
> +		compatible = "qcom,x1e80100-pmic-glink",
> +				"qcom,sm8550-pmic-glink",
> +				"qcom,pmic-glink";

Align vertically on the double-quote

> +		#address-cells = <1>;
> +		#size-cells = <0>;
> +		orientation-gpios = <&tlmm 121 GPIO_ACTIVE_HIGH>,
> +				<&tlmm 123 GPIO_ACTIVE_HIGH>;

And such lists should be aligned on the opening angle bracket.

> +
> +		/* Display-adjacent port */
> +		connector@0 {
> +			compatible = "usb-c-connector";
> +			reg = <0>;
> +			power-role = "dual";
> +			data-role = "dual";

Is it actually dual-role? What does UCSI report for it?

> +
> +			ports {
> +				#address-cells = <1>;
> +				#size-cells = <0>;
> +
> +				port@0 {
> +					reg = <0>;
> +
> +					pmic_glink_ss0_hs_in: endpoint {
> +						remote-endpoint = <&usb_1_ss0_dwc3_hs>;
> +					};
> +				};
> +
> +				port@1 {
> +					reg = <1>;
> +
> +					pmic_glink_ss0_ss_in: endpoint {
> +						remote-endpoint = <&usb_1_ss0_qmpphy_out>;
> +					};
> +				};
> +
> +				port@2 {
> +					reg = <2>;
> +
> +					pmic_glink_ss0_sbu: endpoint {
> +						remote-endpoint = <&usb_1_ss0_sbu_mux>;
> +					};
> +				};
> +			};
> +		};
> +
> +		/* User-adjacent port */
> +		connector@1 {
> +			compatible = "usb-c-connector";
> +			reg = <1>;
> +			power-role = "dual";
> +			data-role = "dual";
> +
> +			ports {
> +				#address-cells = <1>;
> +				#size-cells = <0>;
> +
> +				port@0 {
> +					reg = <0>;
> +
> +					pmic_glink_ss1_hs_in: endpoint {
> +						remote-endpoint = <&usb_1_ss1_dwc3_hs>;
> +					};
> +				};
> +
> +				port@1 {
> +					reg = <1>;
> +
> +					pmic_glink_ss1_ss_in: endpoint {
> +						remote-endpoint = <&usb_1_ss1_qmpphy_out>;
> +					};
> +				};
> +
> +				port@2 {
> +					reg = <2>;
> +
> +					pmic_glink_ss1_sbu: endpoint {
> +						remote-endpoint = <&usb_1_ss1_sbu_mux>;
> +					};
> +				};
> +			};
> +		};
> +	};
> +
> +	reserved-memory {
> +		linux,cma {

What for?

> +			compatible = "shared-dma-pool";
> +			size = <0x0 0x8000000>;
> +			reusable;
> +			linux,cma-default;
> +		};
> +	};
> +

[...]

> +
> +&gpu {
> +	status = "okay";

I think that you wrote that GPU isn't supported (yet).

> +
> +	zap-shader {
> +		firmware-name = "qcom/x1e80100/LENOVO/21NH/qcdxkmsucpurwa.mbn";
> +	};
> +};
> +
> +&i2c2 {
> +	clock-frequency = <400000>;
> +
> +	pinctrl-0 = <&qup_i2c2_data_clk>, <&tpad_default>, <&kybd_default>;

If keyboard doesn't share pinctrl with other devices, you can move it to the keyboard DT node.

> +	pinctrl-names = "default";
> +	status = "okay";
> +
> +	/* ELAN06FA */
> +	touchpad@15 {
> +		compatible = "hid-over-i2c";
> +		reg = <0x15>;
> +
> +		hid-descr-addr = <0x1>;
> +		interrupts-extended = <&tlmm 3 IRQ_TYPE_LEVEL_LOW>;
> +
> +		vdd-supply = <&vreg_misc_3p3>;
> +		vddl-supply = <&vreg_l12b_1p2>;
> +
> +		wakeup-source;
> +	};
> +
> +	/* CIRQ1080 or SYNA2BA6 */
> +	touchpad@2c {
> +		compatible = "hid-over-i2c";
> +		reg = <0x2c>;
> +
> +		hid-descr-addr = <0x20>;
> +		interrupts-extended = <&tlmm 3 IRQ_TYPE_LEVEL_LOW>;
> +
> +		vdd-supply = <&vreg_misc_3p3>;
> +		vddl-supply = <&vreg_l12b_1p2>;
> +
> +		wakeup-source;
> +	};
> +
> +	/* FTCS0038 */
> +	touchpad@38 {
> +		compatible = "hid-over-i2c";
> +		reg = <0x38>;
> +
> +		hid-descr-addr = <0x1>;
> +		interrupts-extended = <&tlmm 3 IRQ_TYPE_LEVEL_LOW>;
> +
> +		vdd-supply = <&vreg_misc_3p3>;
> +		vddl-supply = <&vreg_l12b_1p2>;
> +
> +		wakeup-source;
> +	};
> +
> +	keyboard@3a {
> +		compatible = "hid-over-i2c";
> +		reg = <0x3a>;
> +
> +		hid-descr-addr = <0x1>;
> +		interrupts-extended = <&tlmm 67 IRQ_TYPE_LEVEL_LOW>;
> +
> +		vdd-supply = <&vreg_misc_3p3>;
> +		vddl-supply = <&vreg_l12b_1p2>;
> +
> +		wakeup-source;
> +	};
> +
> +	/* GXTP5100 */
> +	touchpad@5d {
> +		compatible = "hid-over-i2c";
> +		reg = <0x5d>;
> +
> +		hid-descr-addr = <0x1>;
> +		interrupts-extended = <&tlmm 3 IRQ_TYPE_LEVEL_LOW>;
> +
> +		vdd-supply = <&vreg_misc_3p3>;
> +		vddl-supply = <&vreg_l12b_1p2>;
> +
> +		wakeup-source;
> +	};
> +};
> +
> +&i2c5 {
> +	clock-frequency = <400000>;
> +
> +	status = "okay";
> +
> +	eusb5_repeater: redriver@43 {
> +		compatible = "nxp,ptn3222";
> +		reg = <0x43>;
> +		#phy-cells = <0>;
> +
> +		vdd3v3-supply = <&vreg_l13b_3p0>;
> +		vdd1v8-supply = <&vreg_l4b_1p8>;
> +	};
> +
> +	eusb3_repeater: redriver@47 {
> +		compatible = "nxp,ptn3222";
> +		reg = <0x47>;
> +		#phy-cells = <0>;
> +
> +		vdd3v3-supply = <&vreg_l13b_3p0>;
> +		vdd1v8-supply = <&vreg_l4b_1p8>;
> +
> +		reset-gpios = <&tlmm 6 GPIO_ACTIVE_LOW>;
> +
> +		pinctrl-0 = <&eusb3_reset_n>;
> +		pinctrl-names = "default";
> +	};
> +
> +	eusb9_repeater: redriver@4b {
> +		compatible = "nxp,ptn3222";
> +		reg = <0x4b>;
> +		#phy-cells = <0>;
> +
> +		vdd3v3-supply = <&vreg_l13b_3p0>;
> +		vdd1v8-supply = <&vreg_l4b_1p8>;
> +
> +		reset-gpios = <&tlmm 7 GPIO_ACTIVE_LOW>;
> +
> +		pinctrl-0 = <&eusb9_reset_n>;
> +		pinctrl-names = "default";
> +	};
> +
> +	eusb6_repeater: redriver@4f {
> +		compatible = "nxp,ptn3222";
> +		reg = <0x4f>;
> +		#phy-cells = <0>;
> +
> +		vdd3v3-supply = <&vreg_l13b_3p0>;
> +		vdd1v8-supply = <&vreg_l4b_1p8>;
> +
> +		reset-gpios = <&tlmm 184 GPIO_ACTIVE_LOW>;
> +
> +		pinctrl-0 = <&eusb6_reset_n>;
> +		pinctrl-names = "default";
> +	};
> +};
> +
> +&i2c8 {
> +	clock-frequency = <400000>;
> +
> +	status = "okay";
> +
> +	/* ILIT2911 or GTCH1563 */
> +	touchscreen@10 {
> +		compatible = "hid-over-i2c";
> +		reg = <0x10>;
> +
> +		hid-descr-addr = <0x1>;
> +		interrupts-extended = <&tlmm 51 IRQ_TYPE_LEVEL_LOW>;
> +
> +		vdd-supply = <&vreg_misc_3p3>;
> +		vddl-supply = <&vreg_l15b_1p8>;
> +
> +		pinctrl-0 = <&ts0_default>;
> +		pinctrl-names = "default";
> +	};
> +};
> +
> +&lpass_tlmm {
> +	spkr_01_sd_n_active: spkr-01-sd-n-active-state {
> +		pins = "gpio12";
> +		function = "gpio";
> +		drive-strength = <16>;
> +		bias-disable;
> +		output-low;
> +	};
> +};
> +
> +&lpass_vamacro {
> +	pinctrl-0 = <&dmic01_default>, <&dmic23_default>;
> +	pinctrl-names = "default";
> +
> +	vdd-micb-supply = <&vreg_l1b_1p8>;
> +	qcom,dmic-sample-rate = <4800000>;
> +};
> +
> +&mdss {
> +	status = "okay";
> +};
> +
> +&mdss_dp0 {
> +	status = "okay";
> +};
> +
> +&mdss_dp0_out {
> +	data-lanes = <0 1>;
> +	link-frequencies = /bits/ 64 <1620000000 2700000000 5400000000 8100000000>;
> +};
> +
> +&mdss_dp1 {
> +	status = "okay";
> +};
> +
> +&mdss_dp1_out {
> +	data-lanes = <0 1>;
> +	link-frequencies = /bits/ 64 <1620000000 2700000000 5400000000 8100000000>;
> +};
> +
> +&mdss_dp3 {
> +	/delete-property/ #sound-dai-cells;
> +
> +	status = "okay";
> +
> +	aux-bus {
> +		panel {
> +			compatible = "edp-panel";
> +
> +			backlight = <&backlight>;
> +
> +			enable-gpios = <&pmc8380_3_gpios 4 GPIO_ACTIVE_HIGH>;
> +			pinctrl-0 = <&edp_bl_en>;
> +			pinctrl-names = "default";
> +
> +			power-supply = <&vreg_edp_3p3>;
> +
> +			port {
> +				edp_panel_in: endpoint {
> +					remote-endpoint = <&mdss_dp3_out>;
> +				};
> +			};
> +		};
> +	};
> +
> +	ports {
> +		port@1 {
> +			reg = <1>;
> +
> +			mdss_dp3_out: endpoint {
> +				data-lanes = <0 1 2 3>;
> +				link-frequencies = /bits/ 64 <1620000000 2700000000 5400000000 8100000000>;
> +
> +				remote-endpoint = <&edp_panel_in>;
> +			};
> +		};
> +	};
> +};
> +
> +&mdss_dp3_phy {

What about DP0 / DP1 PHYs?

> +	vdda-phy-supply = <&vreg_l3j_0p8>;
> +	vdda-pll-supply = <&vreg_l2j_1p2>;
> +
> +	status = "okay";
> +};
> +

[...]

> +
> +&qupv3_0 {
> +	status = "okay";
> +};
> +
> +&qupv3_1 {
> +	status = "okay";
> +};
> +
> +&qupv3_2 {
> +	status = "okay";
> +};

Don't you also wan to enable corresponding GPI DMA devices?

> +
> +&remoteproc_adsp {
> +	firmware-name = "qcom/x1e80100/LENOVO/21NH/qcadsp8380.mbn",
> +			"qcom/x1e80100/LENOVO/21NH/adsp_dtbs.elf";
> +
> +	status = "okay";
> +};
> +
> +&remoteproc_cdsp {
> +	firmware-name = "qcom/x1e80100/LENOVO/21NH/qccdsp8380.mbn",
> +			"qcom/x1e80100/LENOVO/21NH/cdsp_dtbs.elf";
> +
> +	status = "okay";
> +};
> +
> +&sdhc_2 {
> +	cd-gpios = <&tlmm 71 GPIO_ACTIVE_LOW>;
> +	pinctrl-0 = <&sdc2_default &sdc2_card_det_n>;
> +	pinctrl-1 = <&sdc2_sleep &sdc2_card_det_n>;
> +	pinctrl-names = "default", "sleep";
> +	vmmc-supply = <&vreg_l9b_2p9>;
> +	vqmmc-supply = <&vreg_l6b_1p8>;
> +	status = "okay";
> +};
> +
> +&smb2360_0 {
> +	status = "okay";
> +};
> +
> +&smb2360_0_eusb2_repeater {
> +	vdd18-supply = <&vreg_l3d_1p8>;
> +	vdd3-supply = <&vreg_l2b_3p0>;
> +};
> +
> +&smb2360_1 {
> +	status = "okay";
> +};
> +
> +&smb2360_1_eusb2_repeater {
> +	vdd18-supply = <&vreg_l3d_1p8>;
> +	vdd3-supply = <&vreg_l14b_3p0>;
> +};
> +
> +&swr0 {
> +	status = "okay";
> +
> +	pinctrl-0 = <&wsa_swr_active>, <&spkr_01_sd_n_active>;
> +	pinctrl-names = "default";
> +
> +	/* WSA8845, Left Speaker */
> +	left_spkr: speaker@0,0 {
> +		compatible = "sdw20217020400";
> +		reg = <0 0>;
> +		reset-gpios = <&lpass_tlmm 12 GPIO_ACTIVE_LOW>;
> +		#sound-dai-cells = <0>;
> +		sound-name-prefix = "SpkrLeft";
> +		vdd-1p8-supply = <&vreg_l15b_1p8>;
> +		vdd-io-supply = <&vreg_l12b_1p2>;
> +		qcom,port-mapping = <1 2 3 7 10 13>;
> +	};
> +
> +	/* WSA8845, Right Speaker */
> +	right_spkr: speaker@0,1 {
> +		compatible = "sdw20217020400";
> +		reg = <0 1>;
> +		reset-gpios = <&lpass_tlmm 12 GPIO_ACTIVE_LOW>;
> +		#sound-dai-cells = <0>;
> +		sound-name-prefix = "SpkrRight";
> +		vdd-1p8-supply = <&vreg_l15b_1p8>;
> +		vdd-io-supply = <&vreg_l12b_1p2>;
> +		qcom,port-mapping = <4 5 6 7 11 13>;
> +	};
> +};
> +
> +&swr1 {
> +	status = "okay";
> +
> +	/* WCD9385 RX */
> +	wcd_rx: codec@0,4 {
> +		compatible = "sdw20217010d00";
> +		reg = <0 4>;
> +		qcom,rx-port-mapping = <1 2 3 4 5>;
> +	};
> +};
> +
> +&swr2 {
> +	status = "okay";
> +
> +	/* WCD9385 TX */
> +	wcd_tx: codec@0,3 {
> +		compatible = "sdw20217010d00";
> +		reg = <0 3>;
> +		qcom,tx-port-mapping = <2 2 3 4>;
> +	};
> +};
> +
> +&tlmm {
> +	gpio-reserved-ranges = <34 2>, /* Unused */
> +		<72 2>, /* Secure EC I2C connection (?) */
> +		<238 1>; /* UFS Reset */
> +
> +	cam_reg_en: cam-reg-en-state {
> +		pins = "gpio44";
> +		function = "gpio";
> +		drive-strength = <16>;
> +		bias-disable;
> +	};
> +
> +	eusb3_reset_n: eusb3-reset-n-state {
> +		pins = "gpio6";
> +		function = "gpio";
> +		drive-strength = <2>;
> +		bias-disable;
> +		output-low;
> +	};
> +
> +	eusb6_reset_n: eusb6-reset-n-state {
> +		pins = "gpio184";
> +		function = "gpio";
> +		drive-strength = <2>;
> +		bias-disable;
> +		output-low;
> +	};
> +
> +	eusb9_reset_n: eusb9-reset-n-state {
> +		pins = "gpio7";
> +		function = "gpio";
> +		drive-strength = <2>;
> +		bias-disable;
> +		output-low;
> +	};
> +
> +	edp_reg_en: edp-reg-en-state {
> +		pins = "gpio70";
> +		function = "gpio";
> +		drive-strength = <16>;
> +		bias-disable;
> +	};
> +
> +	hall_int_n_default: hall-int-n-state {
> +		pins = "gpio92";
> +		function = "gpio";
> +		bias-disable;
> +	};
> +
> +	kybd_default: kybd-default-state {
> +		pins = "gpio67";
> +		function = "gpio";
> +		bias-disable;
> +	};
> +
> +	nvme_reg_en: nvme-reg-en-state {
> +		pins = "gpio18";
> +		function = "gpio";
> +		drive-strength = <2>;
> +		bias-disable;
> +	};
> +
> +	pcie4_default: pcie4-default-state {
> +		clkreq-n-pins {
> +			pins = "gpio147";
> +			function = "pcie4_clk";
> +			drive-strength = <2>;
> +			bias-pull-up;
> +		};
> +
> +		perst-n-pins {
> +			pins = "gpio146";
> +			function = "gpio";
> +			drive-strength = <2>;
> +			bias-disable;
> +		};
> +
> +		wake-n-pins {
> +			pins = "gpio148";
> +			function = "gpio";
> +			drive-strength = <2>;
> +			bias-pull-up;
> +		};
> +	};
> +
> +	pcie6a_default: pcie6a-default-state {
> +		clkreq-n-pins {
> +			pins = "gpio153";
> +			function = "pcie6a_clk";
> +			drive-strength = <2>;
> +			bias-pull-up;
> +		};
> +
> +		perst-n-pins {
> +			pins = "gpio152";
> +			function = "gpio";
> +			drive-strength = <2>;
> +			bias-disable;
> +		};
> +
> +		wake-n-pins {
> +			pins = "gpio154";
> +			function = "gpio";
> +			drive-strength = <2>;
> +			bias-pull-up;
> +		};
> +	};
> +
> +	sdc2_card_det_n: sdc2-card-det-state {
> +		pins = "gpio71";
> +		function = "gpio";
> +		drive-strength = <2>;
> +		bias-pull-up;
> +	};
> +
> +	tpad_default: tpad-default-state {
> +		pins = "gpio3";
> +		function = "gpio";
> +		bias-pull-up;
> +	};
> +
> +	ts0_default: ts0-default-state {
> +		int-n-pins {
> +			pins = "gpio51";
> +			function = "gpio";
> +			bias-disable;
> +		};
> +
> +		reset-n-pins {
> +			pins = "gpio48";
> +			function = "gpio";
> +			output-high;
> +			drive-strength = <16>;
> +		};
> +	};
> +
> +	usb_1_ss0_sbu_default: usb-1-ss0-sbu-state {
> +		mode-pins {
> +			pins = "gpio166";
> +			function = "gpio";
> +			bias-disable;
> +			drive-strength = <2>;
> +			output-high;
> +		};
> +
> +		oe-n-pins {
> +			pins = "gpio168";
> +			function = "gpio";
> +			bias-disable;
> +			drive-strength = <2>;
> +		};
> +
> +		sel-pins {
> +			pins = "gpio167";
> +			function = "gpio";
> +			bias-disable;
> +			drive-strength = <2>;
> +		};
> +
> +	};
> +
> +	usb_1_ss1_sbu_default: usb-1-ss1-sbu-state {
> +		mode-pins {
> +			pins = "gpio177";
> +			function = "gpio";
> +			bias-disable;
> +			drive-strength = <2>;
> +			output-high;
> +		};
> +
> +		oe-n-pins {
> +			pins = "gpio179";
> +			function = "gpio";
> +			bias-disable;
> +			drive-strength = <2>;
> +		};
> +
> +		sel-pins {
> +			pins = "gpio178";
> +			function = "gpio";
> +			bias-disable;
> +			drive-strength = <2>;
> +		};
> +	};
> +
> +	wcd_default: wcd-reset-n-active-state {
> +		pins = "gpio191";
> +		function = "gpio";
> +		drive-strength = <16>;
> +		bias-disable;
> +		output-low;
> +	};
> +
> +	wcn_bt_en: wcn-bt-en-state {
> +		pins = "gpio116";
> +		function = "gpio";
> +		drive-strength = <16>;
> +		output-low;
> +		bias-pull-down;
> +	};
> +
> +	wcn_sw_en: wcn-sw-en-state {
> +		pins = "gpio214";
> +		function = "gpio";
> +		drive-strength = <16>;
> +		bias-disable;
> +	};
> +
> +	wcn_wlan_en: wcn-wlan-en-state {
> +		pins = "gpio117";
> +		function = "gpio";
> +		drive-strength = <16>;
> +		bias-disable;
> +	};
> +};
> +
> +&uart14 {
> +	status = "okay";
> +
> +	bluetooth {
> +		compatible = "qcom,wcn7850-bt";
> +		max-speed = <3200000>;
> +
> +		vddaon-supply = <&vreg_pmu_aon_0p59>;
> +		vddwlcx-supply = <&vreg_pmu_wlcx_0p8>;
> +		vddwlmx-supply = <&vreg_pmu_wlmx_0p85>;
> +		vddrfacmn-supply = <&vreg_pmu_rfa_cmn>;
> +		vddrfa0p8-supply = <&vreg_pmu_rfa_0p8>;
> +		vddrfa1p2-supply = <&vreg_pmu_rfa_1p2>;
> +		vddrfa1p8-supply = <&vreg_pmu_rfa_1p8>;
> +	};
> +};
> +
> +&usb_1_ss0_hsphy {
> +	vdd-supply = <&vreg_l3j_0p8>;
> +	vdda12-supply = <&vreg_l2j_1p2>;
> +
> +	phys = <&smb2360_0_eusb2_repeater>;
> +
> +	status = "okay";
> +};
> +
> +&usb_1_ss0_qmpphy {
> +	vdda-phy-supply = <&vreg_l3e_1p2>;
> +	vdda-pll-supply = <&vreg_l1j_0p8>;
> +
> +	status = "okay";
> +};
> +
> +&usb_1_ss0 {
> +	status = "okay";
> +};
> +
> +&usb_1_ss0_dwc3 {
> +	dr_mode = "host";

So pmic-glink declares corresponding port as dual-role, but USB
controller is host-only?

> +};
> +
> +&usb_1_ss0_dwc3_hs {
> +	remote-endpoint = <&pmic_glink_ss0_hs_in>;
> +};
> +
> +&usb_1_ss0_qmpphy_out {
> +	remote-endpoint = <&pmic_glink_ss0_ss_in>;
> +};
> +
> +&usb_1_ss1_hsphy {
> +	vdd-supply = <&vreg_l3j_0p8>;
> +	vdda12-supply = <&vreg_l2j_1p2>;
> +
> +	phys = <&smb2360_1_eusb2_repeater>;
> +
> +	status = "okay";
> +};
> +
> +&usb_1_ss1_qmpphy {
> +	vdda-phy-supply = <&vreg_l2j_1p2>;
> +	vdda-pll-supply = <&vreg_l2d_0p9>;
> +
> +	status = "okay";
> +};
> +
> +&usb_1_ss1 {
> +	status = "okay";
> +};
> +
> +&usb_1_ss1_dwc3 {
> +	dr_mode = "host";

And this one...

> +};
> +
> +&usb_1_ss1_dwc3_hs {
> +	remote-endpoint = <&pmic_glink_ss1_hs_in>;
> +};
> +
> +&usb_1_ss1_qmpphy_out {
> +	remote-endpoint = <&pmic_glink_ss1_ss_in>;
> +};
> +
> +&usb_1_ss2 {
> +	status = "okay";
> +};
> +
> +&usb_1_ss2_dwc3 {
> +	dr_mode = "host";
> +	maximum-speed = "high-speed";
> +	phys = <&usb_1_ss2_hsphy>;
> +	phy-names = "usb2-phy";
> +};
> +
> +&usb_1_ss2_hsphy {
> +	vdd-supply = <&vreg_l3j_0p8>;
> +	vdda12-supply = <&vreg_l2j_1p2>;
> +
> +	phys = <&eusb5_repeater>;
> +
> +	status = "okay";
> +};
> +
> +&usb_2 {
> +	status = "okay";
> +};
> +
> +&usb_2_dwc3 {
> +	dr_mode = "host";
> +};
> +
> +&usb_2_hsphy {
> +	vdd-supply = <&vreg_l2e_0p8>;
> +	vdda12-supply = <&vreg_l3e_1p2>;
> +
> +	phys = <&eusb9_repeater>;
> +
> +	status = "okay";
> +};
> +
> +&usb_mp {
> +	status = "okay";
> +};
> +
> +&usb_mp_hsphy0 {
> +	vdd-supply = <&vreg_l2e_0p8>;
> +	vdda12-supply = <&vreg_l3e_1p2>;
> +
> +	phys = <&eusb6_repeater>;
> +
> +	status = "okay";
> +};
> +
> +&usb_mp_qmpphy0 {
> +	vdda-phy-supply = <&vreg_l3e_1p2>;
> +	vdda-pll-supply = <&vreg_l3c_0p8>;
> +
> +	status = "okay";
> +};
> +
> +&usb_mp_hsphy1 {
> +	vdd-supply = <&vreg_l2e_0p8>;
> +	vdda12-supply = <&vreg_l3e_1p2>;
> +
> +	phys = <&eusb3_repeater>;
> +
> +	status = "okay";
> +};
> +
> +&usb_mp_qmpphy1 {
> +	vdda-phy-supply = <&vreg_l3e_1p2>;
> +	vdda-pll-supply = <&vreg_l3c_0p8>;
> +
> +	status = "okay";
> +};
> 
> -- 
> 2.48.1
> 
>
Aleksandrs Vinarskis May 24, 2025, 5:58 p.m. UTC | #2
On Sat, 24 May 2025 at 17:33, Dmitry Baryshkov
<dmitry.baryshkov@oss.qualcomm.com> wrote:
>
> On Sat, May 24, 2025 at 01:48:40PM +0200, Jens Glathe via B4 Relay wrote:
> > From: Jens Glathe <jens.glathe@oldschoolsolutions.biz>
> >
> > Device tree for the Lenovo Thinkbook 16 G7 QOY
> >
> > The Laptop is a Snapdragon X1 / X1 Plus (Purwa) based device [1].
> >
> > Supported features:
> >
> > - USB type-c and type-a ports
> > - Keyboard
> > - Touchpad (all that are described in the dsdt)
> > - Touchscreen (described in the dsdt, no known SKUss)
> > - Display including PWM backlight control
> > - PCIe devices
> > - nvme
> > - SDHC card reader
> > - ath12k WCN7850 Wifi and Bluetooth
> > - ADSP and CDSP
> > - GPIO keys (Lid switch)
> > - Sound via internal speakers / DMIC / USB / headphone jack
> > - DP Altmode with 2 lanes (as all of these still do)
> > - Integrated fingerprint reader (FPC)
> > - Integrated UVC camera
> >
> > Not supported yet:
> >
> > - HDMI port.
> > - EC and some fn hotkeys.
> >
> > Limited support yet:
> >
> > - SDHC card reader is based on the on-chip sdhc_2 controller, but the driver from
> > the Snapdragon Dev Kit is only a partial match. It can do normal slow sd cards,
> > but not UHS-I (SD104) and UHS-II.
> >
> > - The GPU is not yet supported. Graphics is only software rendered.
> >
> > This work was done without any schematics or non-public knowledge of the device.
> > So, it is based on the existing x1e device trees, dsdt analysis, using HWInfo
> > ARM64, and pure guesswork. It has been confirmed, however, that the device really
> > has 4 NXP PTN3222 eUSB2 repeaters, one of which doesn't have a reset GPIO (eusb5
> > @43).
> >
> > Signed-off-by: Jens Glathe <jens.glathe@oldschoolsolutions.biz>
> > Co-developed by: Aleksandrs Vinarskis <alex.vinarskis@gmail.com>
> > ---
> >  arch/arm64/boot/dts/qcom/Makefile                  |    3 +
> >  arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi       |    2 +-
> >  .../boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts | 1655 ++++++++++++++++++++
> >  3 files changed, 1659 insertions(+), 1 deletion(-)
> >
> > diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile
> > index 669b888b27a1daa93ac15f47e8b9a302bb0922c2..aff4fe3e81ec0d6f6d52e2aa0da327b7576632d8 100644
> > --- a/arch/arm64/boot/dts/qcom/Makefile
> > +++ b/arch/arm64/boot/dts/qcom/Makefile
> > @@ -327,3 +327,6 @@ x1e80100-qcp-el2-dtbs     := x1e80100-qcp.dtb x1-el2.dtbo
> >  dtb-$(CONFIG_ARCH_QCOM)      += x1e80100-qcp.dtb x1e80100-qcp-el2.dtb
> >  x1p42100-crd-el2-dtbs        := x1p42100-crd.dtb x1-el2.dtbo
> >  dtb-$(CONFIG_ARCH_QCOM)      += x1p42100-crd.dtb x1p42100-crd-el2.dtb
> > +x1p42100-lenovo-thinkbook-16-el2-dtbs        := x1p42100-lenovo-thinkbook-16.dtb x1-el2.dtbo
> > +dtb-$(CONFIG_ARCH_QCOM)      += x1p42100-lenovo-thinkbook-16.dtb x1p42100-lenovo-thinkbook-16-el2.dtb
> > +
>
> No need for an extra empty line.
>
> > diff --git a/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi b/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi
> > index c02fd4d15c9649c222caaafa5ed2c777a10fb4f5..551b392eca4ef3b6041e03ad1385fef11cec1690 100644
> > --- a/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi
> > +++ b/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi
> > @@ -170,7 +170,7 @@ trip1 {
> >                       };
> >               };
> >
> > -             pm8010-thermal {
> > +             pm8010_thermal: pm8010-thermal {
> >                       polling-delay-passive = <100>;
> >
> >                       thermal-sensors = <&pm8010_temp_alarm>;
> > diff --git a/arch/arm64/boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts b/arch/arm64/boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts
> > new file mode 100644
> > index 0000000000000000000000000000000000000000..7089219ed08c1c4a60cc007f9d043a34a8071b4f
> > --- /dev/null
> > +++ b/arch/arm64/boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts
> > @@ -0,0 +1,1655 @@
> > +// SPDX-License-Identifier: BSD-3-Clause
> > +/*
> > + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
> > + * Copyright (c) 2024, Linaro Limited
> > + * Copyright (c) 2025, Jens Glathe
> > + */
> > +
> > +/dts-v1/;
> > +
> > +#include <dt-bindings/gpio/gpio.h>
> > +#include <dt-bindings/input/gpio-keys.h>
> > +#include <dt-bindings/input/input.h>
> > +#include <dt-bindings/pinctrl/qcom,pmic-gpio.h>
> > +#include <dt-bindings/regulator/qcom,rpmh-regulator.h>
> > +
> > +#include "x1p42100.dtsi"
> > +#include "x1e80100-pmics.dtsi"
> > +
> > +/delete-node/ &pmc8380_6;
> > +/delete-node/ &pmc8380_6_thermal;
> > +/delete-node/ &pm8010;
> > +/delete-node/ &pm8010_thermal;
> > +
> > +/ {
> > +     model = "Lenovo ThinkBook 16 Gen 7 QOY";
> > +     compatible = "lenovo,thinkbook-16", "qcom,x1p42100";
> > +     chassis-type = "laptop";
> > +
> > +     aliases {
> > +             serial0 = &uart21;
> > +             serial1 = &uart14;
> > +     };
> > +
> > +     wcd938x: audio-codec {
> > +             compatible = "qcom,wcd9385-codec";
> > +
> > +             pinctrl-names = "default";
> > +             pinctrl-0 = <&wcd_default>;
> > +
> > +             qcom,micbias1-microvolt = <1800000>;
> > +             qcom,micbias2-microvolt = <1800000>;
> > +             qcom,micbias3-microvolt = <1800000>;
> > +             qcom,micbias4-microvolt = <1800000>;
> > +             qcom,mbhc-buttons-vthreshold-microvolt = <75000 150000 237000 500000 500000 500000 500000 500000>;
> > +             qcom,mbhc-headset-vthreshold-microvolt = <1700000>;
> > +             qcom,mbhc-headphone-vthreshold-microvolt = <50000>;
> > +             qcom,rx-device = <&wcd_rx>;
> > +             qcom,tx-device = <&wcd_tx>;
> > +
> > +             reset-gpios = <&tlmm 191 GPIO_ACTIVE_LOW>;
> > +
> > +             vdd-buck-supply = <&vreg_l15b_1p8>;
> > +             vdd-rxtx-supply = <&vreg_l15b_1p8>;
> > +             vdd-io-supply = <&vreg_l15b_1p8>;
> > +             vdd-mic-bias-supply = <&vreg_bob1>;
> > +
> > +             #sound-dai-cells = <1>;
> > +     };
> > +
> > +     backlight: backlight {
> > +             compatible = "pwm-backlight";
> > +             pwms = <&pm8550_pwm 3 500000>;
> > +
> > +             power-supply = <&vreg_edp_bl>;
> > +     };
> > +
> > +     camera {
> > +             compatible = "usb5986,1198";
> > +
> > +             vdd-supply = <&vreg_cam_5p0>;
> > +
> > +             status = "okay";
>
> This is default, please drop.
>
> > +     };
>
> Camera isn't randomly wire to the board, it is on the USB bus. Please
> follow DT bindings and put it accordingly, describing topology of the
> bus.
>
> > +
> > +     gpio-keys {
> > +             compatible = "gpio-keys";
> > +
> > +             pinctrl-0 = <&hall_int_n_default>;
> > +             pinctrl-names = "default";
> > +
> > +             switch-lid {
> > +                     gpios = <&tlmm 92 GPIO_ACTIVE_LOW>;
> > +                     linux,input-type = <EV_SW>;
> > +                     linux,code = <SW_LID>;
> > +                     wakeup-source;
> > +                     wakeup-event-action = <EV_ACT_DEASSERTED>;
> > +             };
> > +     };
> > +
> > +     pmic-glink {
> > +             compatible = "qcom,x1e80100-pmic-glink",
> > +                             "qcom,sm8550-pmic-glink",
> > +                             "qcom,pmic-glink";
>
> Align vertically on the double-quote
>
> > +             #address-cells = <1>;
> > +             #size-cells = <0>;
> > +             orientation-gpios = <&tlmm 121 GPIO_ACTIVE_HIGH>,
> > +                             <&tlmm 123 GPIO_ACTIVE_HIGH>;
>
> And such lists should be aligned on the opening angle bracket.
>
> > +
> > +             /* Display-adjacent port */
> > +             connector@0 {
> > +                     compatible = "usb-c-connector";
> > +                     reg = <0>;
> > +                     power-role = "dual";
> > +                     data-role = "dual";
>
> Is it actually dual-role? What does UCSI report for it?
>
> > +
> > +                     ports {
> > +                             #address-cells = <1>;
> > +                             #size-cells = <0>;
> > +
> > +                             port@0 {
> > +                                     reg = <0>;
> > +
> > +                                     pmic_glink_ss0_hs_in: endpoint {
> > +                                             remote-endpoint = <&usb_1_ss0_dwc3_hs>;
> > +                                     };
> > +                             };
> > +
> > +                             port@1 {
> > +                                     reg = <1>;
> > +
> > +                                     pmic_glink_ss0_ss_in: endpoint {
> > +                                             remote-endpoint = <&usb_1_ss0_qmpphy_out>;
> > +                                     };
> > +                             };
> > +
> > +                             port@2 {
> > +                                     reg = <2>;
> > +
> > +                                     pmic_glink_ss0_sbu: endpoint {
> > +                                             remote-endpoint = <&usb_1_ss0_sbu_mux>;
> > +                                     };
> > +                             };
> > +                     };
> > +             };
> > +
> > +             /* User-adjacent port */
> > +             connector@1 {
> > +                     compatible = "usb-c-connector";
> > +                     reg = <1>;
> > +                     power-role = "dual";
> > +                     data-role = "dual";
> > +
> > +                     ports {
> > +                             #address-cells = <1>;
> > +                             #size-cells = <0>;
> > +
> > +                             port@0 {
> > +                                     reg = <0>;
> > +
> > +                                     pmic_glink_ss1_hs_in: endpoint {
> > +                                             remote-endpoint = <&usb_1_ss1_dwc3_hs>;
> > +                                     };
> > +                             };
> > +
> > +                             port@1 {
> > +                                     reg = <1>;
> > +
> > +                                     pmic_glink_ss1_ss_in: endpoint {
> > +                                             remote-endpoint = <&usb_1_ss1_qmpphy_out>;
> > +                                     };
> > +                             };
> > +
> > +                             port@2 {
> > +                                     reg = <2>;
> > +
> > +                                     pmic_glink_ss1_sbu: endpoint {
> > +                                             remote-endpoint = <&usb_1_ss1_sbu_mux>;
> > +                                     };
> > +                             };
> > +                     };
> > +             };
> > +     };
> > +
> > +     reserved-memory {
> > +             linux,cma {
>
> What for?
>
> > +                     compatible = "shared-dma-pool";
> > +                     size = <0x0 0x8000000>;
> > +                     reusable;
> > +                     linux,cma-default;
> > +             };
> > +     };
> > +
>
> [...]
>
> > +
> > +&gpu {
> > +     status = "okay";
>
> I think that you wrote that GPU isn't supported (yet).

GPU is not supported on SoC level (x1p42100/purwa), not device
specific. The idea I suggested to Jens was to mimic Asus Zenbook A14
as per discussion abou purwa GPU and purwa firmware in general [1]: to
already include correct filename and firmware path (since these are
known) such that once SoC lands the GPU support laptops with that SoC
will gain GPU support 'automatically'. As nothing consumes this
property (on purwa) just yet, adding it already does not cause any
harm.

Jens, as per the same discussion [1] the path is wrong here,
s/x1e80100/x1p42100/ for all purwa-specifc firmware. Unless the
decision about firmware paths was re-evaluated in Linaro/Qcom?

>
> > +
> > +     zap-shader {
> > +             firmware-name = "qcom/x1e80100/LENOVO/21NH/qcdxkmsucpurwa.mbn";
> > +     };
> > +};
> > +
> > +&i2c2 {
> > +     clock-frequency = <400000>;
> > +
> > +     pinctrl-0 = <&qup_i2c2_data_clk>, <&tpad_default>, <&kybd_default>;
>
> If keyboard doesn't share pinctrl with other devices, you can move it to the keyboard DT node.
>
> > +     pinctrl-names = "default";
> > +     status = "okay";
> > +
> > +     /* ELAN06FA */
> > +     touchpad@15 {
> > +             compatible = "hid-over-i2c";
> > +             reg = <0x15>;
> > +
> > +             hid-descr-addr = <0x1>;
> > +             interrupts-extended = <&tlmm 3 IRQ_TYPE_LEVEL_LOW>;
> > +
> > +             vdd-supply = <&vreg_misc_3p3>;
> > +             vddl-supply = <&vreg_l12b_1p2>;
> > +
> > +             wakeup-source;
> > +     };
> > +
> > +     /* CIRQ1080 or SYNA2BA6 */
> > +     touchpad@2c {
> > +             compatible = "hid-over-i2c";
> > +             reg = <0x2c>;
> > +
> > +             hid-descr-addr = <0x20>;
> > +             interrupts-extended = <&tlmm 3 IRQ_TYPE_LEVEL_LOW>;
> > +
> > +             vdd-supply = <&vreg_misc_3p3>;
> > +             vddl-supply = <&vreg_l12b_1p2>;
> > +
> > +             wakeup-source;
> > +     };
> > +
> > +     /* FTCS0038 */
> > +     touchpad@38 {
> > +             compatible = "hid-over-i2c";
> > +             reg = <0x38>;
> > +
> > +             hid-descr-addr = <0x1>;
> > +             interrupts-extended = <&tlmm 3 IRQ_TYPE_LEVEL_LOW>;
> > +
> > +             vdd-supply = <&vreg_misc_3p3>;
> > +             vddl-supply = <&vreg_l12b_1p2>;
> > +
> > +             wakeup-source;
> > +     };
> > +
> > +     keyboard@3a {
> > +             compatible = "hid-over-i2c";
> > +             reg = <0x3a>;
> > +
> > +             hid-descr-addr = <0x1>;
> > +             interrupts-extended = <&tlmm 67 IRQ_TYPE_LEVEL_LOW>;
> > +
> > +             vdd-supply = <&vreg_misc_3p3>;
> > +             vddl-supply = <&vreg_l12b_1p2>;
> > +
> > +             wakeup-source;
> > +     };
> > +
> > +     /* GXTP5100 */
> > +     touchpad@5d {
> > +             compatible = "hid-over-i2c";
> > +             reg = <0x5d>;
> > +
> > +             hid-descr-addr = <0x1>;
> > +             interrupts-extended = <&tlmm 3 IRQ_TYPE_LEVEL_LOW>;
> > +
> > +             vdd-supply = <&vreg_misc_3p3>;
> > +             vddl-supply = <&vreg_l12b_1p2>;
> > +
> > +             wakeup-source;
> > +     };
> > +};
> > +
> > +&i2c5 {
> > +     clock-frequency = <400000>;
> > +
> > +     status = "okay";
> > +
> > +     eusb5_repeater: redriver@43 {
> > +             compatible = "nxp,ptn3222";
> > +             reg = <0x43>;
> > +             #phy-cells = <0>;
> > +
> > +             vdd3v3-supply = <&vreg_l13b_3p0>;
> > +             vdd1v8-supply = <&vreg_l4b_1p8>;
> > +     };
> > +
> > +     eusb3_repeater: redriver@47 {
> > +             compatible = "nxp,ptn3222";
> > +             reg = <0x47>;
> > +             #phy-cells = <0>;
> > +
> > +             vdd3v3-supply = <&vreg_l13b_3p0>;
> > +             vdd1v8-supply = <&vreg_l4b_1p8>;
> > +
> > +             reset-gpios = <&tlmm 6 GPIO_ACTIVE_LOW>;
> > +
> > +             pinctrl-0 = <&eusb3_reset_n>;
> > +             pinctrl-names = "default";
> > +     };
> > +
> > +     eusb9_repeater: redriver@4b {
> > +             compatible = "nxp,ptn3222";
> > +             reg = <0x4b>;
> > +             #phy-cells = <0>;
> > +
> > +             vdd3v3-supply = <&vreg_l13b_3p0>;
> > +             vdd1v8-supply = <&vreg_l4b_1p8>;
> > +
> > +             reset-gpios = <&tlmm 7 GPIO_ACTIVE_LOW>;
> > +
> > +             pinctrl-0 = <&eusb9_reset_n>;
> > +             pinctrl-names = "default";
> > +     };
> > +
> > +     eusb6_repeater: redriver@4f {
> > +             compatible = "nxp,ptn3222";
> > +             reg = <0x4f>;
> > +             #phy-cells = <0>;
> > +
> > +             vdd3v3-supply = <&vreg_l13b_3p0>;
> > +             vdd1v8-supply = <&vreg_l4b_1p8>;
> > +
> > +             reset-gpios = <&tlmm 184 GPIO_ACTIVE_LOW>;
> > +
> > +             pinctrl-0 = <&eusb6_reset_n>;
> > +             pinctrl-names = "default";
> > +     };
> > +};
> > +
> > +&i2c8 {
> > +     clock-frequency = <400000>;
> > +
> > +     status = "okay";
> > +
> > +     /* ILIT2911 or GTCH1563 */
> > +     touchscreen@10 {
> > +             compatible = "hid-over-i2c";
> > +             reg = <0x10>;
> > +
> > +             hid-descr-addr = <0x1>;
> > +             interrupts-extended = <&tlmm 51 IRQ_TYPE_LEVEL_LOW>;
> > +
> > +             vdd-supply = <&vreg_misc_3p3>;
> > +             vddl-supply = <&vreg_l15b_1p8>;
> > +
> > +             pinctrl-0 = <&ts0_default>;
> > +             pinctrl-names = "default";
> > +     };
> > +};
> > +
> > +&lpass_tlmm {
> > +     spkr_01_sd_n_active: spkr-01-sd-n-active-state {
> > +             pins = "gpio12";
> > +             function = "gpio";
> > +             drive-strength = <16>;
> > +             bias-disable;
> > +             output-low;
> > +     };
> > +};
> > +
> > +&lpass_vamacro {
> > +     pinctrl-0 = <&dmic01_default>, <&dmic23_default>;
> > +     pinctrl-names = "default";
> > +
> > +     vdd-micb-supply = <&vreg_l1b_1p8>;
> > +     qcom,dmic-sample-rate = <4800000>;
> > +};
> > +
> > +&mdss {
> > +     status = "okay";
> > +};
> > +
> > +&mdss_dp0 {
> > +     status = "okay";
> > +};
> > +
> > +&mdss_dp0_out {
> > +     data-lanes = <0 1>;
> > +     link-frequencies = /bits/ 64 <1620000000 2700000000 5400000000 8100000000>;
> > +};
> > +
> > +&mdss_dp1 {
> > +     status = "okay";
> > +};
> > +
> > +&mdss_dp1_out {
> > +     data-lanes = <0 1>;
> > +     link-frequencies = /bits/ 64 <1620000000 2700000000 5400000000 8100000000>;
> > +};
> > +
> > +&mdss_dp3 {
> > +     /delete-property/ #sound-dai-cells;
> > +
> > +     status = "okay";
> > +
> > +     aux-bus {
> > +             panel {
> > +                     compatible = "edp-panel";
> > +
> > +                     backlight = <&backlight>;
> > +
> > +                     enable-gpios = <&pmc8380_3_gpios 4 GPIO_ACTIVE_HIGH>;
> > +                     pinctrl-0 = <&edp_bl_en>;
> > +                     pinctrl-names = "default";
> > +
> > +                     power-supply = <&vreg_edp_3p3>;
> > +
> > +                     port {
> > +                             edp_panel_in: endpoint {
> > +                                     remote-endpoint = <&mdss_dp3_out>;
> > +                             };
> > +                     };
> > +             };
> > +     };
> > +
> > +     ports {
> > +             port@1 {
> > +                     reg = <1>;
> > +
> > +                     mdss_dp3_out: endpoint {
> > +                             data-lanes = <0 1 2 3>;
> > +                             link-frequencies = /bits/ 64 <1620000000 2700000000 5400000000 8100000000>;
> > +
> > +                             remote-endpoint = <&edp_panel_in>;
> > +                     };
> > +             };
> > +     };
> > +};
> > +
> > +&mdss_dp3_phy {
>
> What about DP0 / DP1 PHYs?
>
> > +     vdda-phy-supply = <&vreg_l3j_0p8>;
> > +     vdda-pll-supply = <&vreg_l2j_1p2>;
> > +
> > +     status = "okay";
> > +};
> > +
>
> [...]
>
> > +
> > +&qupv3_0 {
> > +     status = "okay";
> > +};
> > +
> > +&qupv3_1 {
> > +     status = "okay";
> > +};
> > +
> > +&qupv3_2 {
> > +     status = "okay";
> > +};
>
> Don't you also wan to enable corresponding GPI DMA devices?
>
> > +
> > +&remoteproc_adsp {
> > +     firmware-name = "qcom/x1e80100/LENOVO/21NH/qcadsp8380.mbn",
> > +                     "qcom/x1e80100/LENOVO/21NH/adsp_dtbs.elf";
> > +
> > +     status = "okay";
> > +};

And here, s/x1e80100/x1p42100/

> > +
> > +&remoteproc_cdsp {
> > +     firmware-name = "qcom/x1e80100/LENOVO/21NH/qccdsp8380.mbn",
> > +                     "qcom/x1e80100/LENOVO/21NH/cdsp_dtbs.elf";
> > +
> > +     status = "okay";
> > +};

And here, s/x1e80100/x1p42100/

Regards,
Alex

[1] https://lore.kernel.org/all/93f916d1-83b9-41c0-bb05-a785fb730088@oss.qualcomm.com/

> > +
> > +&sdhc_2 {
> > +     cd-gpios = <&tlmm 71 GPIO_ACTIVE_LOW>;
> > +     pinctrl-0 = <&sdc2_default &sdc2_card_det_n>;
> > +     pinctrl-1 = <&sdc2_sleep &sdc2_card_det_n>;
> > +     pinctrl-names = "default", "sleep";
> > +     vmmc-supply = <&vreg_l9b_2p9>;
> > +     vqmmc-supply = <&vreg_l6b_1p8>;
> > +     status = "okay";
> > +};
> > +
> > +&smb2360_0 {
> > +     status = "okay";
> > +};
> > +
> > +&smb2360_0_eusb2_repeater {
> > +     vdd18-supply = <&vreg_l3d_1p8>;
> > +     vdd3-supply = <&vreg_l2b_3p0>;
> > +};
> > +
> > +&smb2360_1 {
> > +     status = "okay";
> > +};
> > +
> > +&smb2360_1_eusb2_repeater {
> > +     vdd18-supply = <&vreg_l3d_1p8>;
> > +     vdd3-supply = <&vreg_l14b_3p0>;
> > +};
> > +
> > +&swr0 {
> > +     status = "okay";
> > +
> > +     pinctrl-0 = <&wsa_swr_active>, <&spkr_01_sd_n_active>;
> > +     pinctrl-names = "default";
> > +
> > +     /* WSA8845, Left Speaker */
> > +     left_spkr: speaker@0,0 {
> > +             compatible = "sdw20217020400";
> > +             reg = <0 0>;
> > +             reset-gpios = <&lpass_tlmm 12 GPIO_ACTIVE_LOW>;
> > +             #sound-dai-cells = <0>;
> > +             sound-name-prefix = "SpkrLeft";
> > +             vdd-1p8-supply = <&vreg_l15b_1p8>;
> > +             vdd-io-supply = <&vreg_l12b_1p2>;
> > +             qcom,port-mapping = <1 2 3 7 10 13>;
> > +     };
> > +
> > +     /* WSA8845, Right Speaker */
> > +     right_spkr: speaker@0,1 {
> > +             compatible = "sdw20217020400";
> > +             reg = <0 1>;
> > +             reset-gpios = <&lpass_tlmm 12 GPIO_ACTIVE_LOW>;
> > +             #sound-dai-cells = <0>;
> > +             sound-name-prefix = "SpkrRight";
> > +             vdd-1p8-supply = <&vreg_l15b_1p8>;
> > +             vdd-io-supply = <&vreg_l12b_1p2>;
> > +             qcom,port-mapping = <4 5 6 7 11 13>;
> > +     };
> > +};
> > +
> > +&swr1 {
> > +     status = "okay";
> > +
> > +     /* WCD9385 RX */
> > +     wcd_rx: codec@0,4 {
> > +             compatible = "sdw20217010d00";
> > +             reg = <0 4>;
> > +             qcom,rx-port-mapping = <1 2 3 4 5>;
> > +     };
> > +};
> > +
> > +&swr2 {
> > +     status = "okay";
> > +
> > +     /* WCD9385 TX */
> > +     wcd_tx: codec@0,3 {
> > +             compatible = "sdw20217010d00";
> > +             reg = <0 3>;
> > +             qcom,tx-port-mapping = <2 2 3 4>;
> > +     };
> > +};
> > +
> > +&tlmm {
> > +     gpio-reserved-ranges = <34 2>, /* Unused */
> > +             <72 2>, /* Secure EC I2C connection (?) */
> > +             <238 1>; /* UFS Reset */
> > +
> > +     cam_reg_en: cam-reg-en-state {
> > +             pins = "gpio44";
> > +             function = "gpio";
> > +             drive-strength = <16>;
> > +             bias-disable;
> > +     };
> > +
> > +     eusb3_reset_n: eusb3-reset-n-state {
> > +             pins = "gpio6";
> > +             function = "gpio";
> > +             drive-strength = <2>;
> > +             bias-disable;
> > +             output-low;
> > +     };
> > +
> > +     eusb6_reset_n: eusb6-reset-n-state {
> > +             pins = "gpio184";
> > +             function = "gpio";
> > +             drive-strength = <2>;
> > +             bias-disable;
> > +             output-low;
> > +     };
> > +
> > +     eusb9_reset_n: eusb9-reset-n-state {
> > +             pins = "gpio7";
> > +             function = "gpio";
> > +             drive-strength = <2>;
> > +             bias-disable;
> > +             output-low;
> > +     };
> > +
> > +     edp_reg_en: edp-reg-en-state {
> > +             pins = "gpio70";
> > +             function = "gpio";
> > +             drive-strength = <16>;
> > +             bias-disable;
> > +     };
> > +
> > +     hall_int_n_default: hall-int-n-state {
> > +             pins = "gpio92";
> > +             function = "gpio";
> > +             bias-disable;
> > +     };
> > +
> > +     kybd_default: kybd-default-state {
> > +             pins = "gpio67";
> > +             function = "gpio";
> > +             bias-disable;
> > +     };
> > +
> > +     nvme_reg_en: nvme-reg-en-state {
> > +             pins = "gpio18";
> > +             function = "gpio";
> > +             drive-strength = <2>;
> > +             bias-disable;
> > +     };
> > +
> > +     pcie4_default: pcie4-default-state {
> > +             clkreq-n-pins {
> > +                     pins = "gpio147";
> > +                     function = "pcie4_clk";
> > +                     drive-strength = <2>;
> > +                     bias-pull-up;
> > +             };
> > +
> > +             perst-n-pins {
> > +                     pins = "gpio146";
> > +                     function = "gpio";
> > +                     drive-strength = <2>;
> > +                     bias-disable;
> > +             };
> > +
> > +             wake-n-pins {
> > +                     pins = "gpio148";
> > +                     function = "gpio";
> > +                     drive-strength = <2>;
> > +                     bias-pull-up;
> > +             };
> > +     };
> > +
> > +     pcie6a_default: pcie6a-default-state {
> > +             clkreq-n-pins {
> > +                     pins = "gpio153";
> > +                     function = "pcie6a_clk";
> > +                     drive-strength = <2>;
> > +                     bias-pull-up;
> > +             };
> > +
> > +             perst-n-pins {
> > +                     pins = "gpio152";
> > +                     function = "gpio";
> > +                     drive-strength = <2>;
> > +                     bias-disable;
> > +             };
> > +
> > +             wake-n-pins {
> > +                     pins = "gpio154";
> > +                     function = "gpio";
> > +                     drive-strength = <2>;
> > +                     bias-pull-up;
> > +             };
> > +     };
> > +
> > +     sdc2_card_det_n: sdc2-card-det-state {
> > +             pins = "gpio71";
> > +             function = "gpio";
> > +             drive-strength = <2>;
> > +             bias-pull-up;
> > +     };
> > +
> > +     tpad_default: tpad-default-state {
> > +             pins = "gpio3";
> > +             function = "gpio";
> > +             bias-pull-up;
> > +     };
> > +
> > +     ts0_default: ts0-default-state {
> > +             int-n-pins {
> > +                     pins = "gpio51";
> > +                     function = "gpio";
> > +                     bias-disable;
> > +             };
> > +
> > +             reset-n-pins {
> > +                     pins = "gpio48";
> > +                     function = "gpio";
> > +                     output-high;
> > +                     drive-strength = <16>;
> > +             };
> > +     };
> > +
> > +     usb_1_ss0_sbu_default: usb-1-ss0-sbu-state {
> > +             mode-pins {
> > +                     pins = "gpio166";
> > +                     function = "gpio";
> > +                     bias-disable;
> > +                     drive-strength = <2>;
> > +                     output-high;
> > +             };
> > +
> > +             oe-n-pins {
> > +                     pins = "gpio168";
> > +                     function = "gpio";
> > +                     bias-disable;
> > +                     drive-strength = <2>;
> > +             };
> > +
> > +             sel-pins {
> > +                     pins = "gpio167";
> > +                     function = "gpio";
> > +                     bias-disable;
> > +                     drive-strength = <2>;
> > +             };
> > +
> > +     };
> > +
> > +     usb_1_ss1_sbu_default: usb-1-ss1-sbu-state {
> > +             mode-pins {
> > +                     pins = "gpio177";
> > +                     function = "gpio";
> > +                     bias-disable;
> > +                     drive-strength = <2>;
> > +                     output-high;
> > +             };
> > +
> > +             oe-n-pins {
> > +                     pins = "gpio179";
> > +                     function = "gpio";
> > +                     bias-disable;
> > +                     drive-strength = <2>;
> > +             };
> > +
> > +             sel-pins {
> > +                     pins = "gpio178";
> > +                     function = "gpio";
> > +                     bias-disable;
> > +                     drive-strength = <2>;
> > +             };
> > +     };
> > +
> > +     wcd_default: wcd-reset-n-active-state {
> > +             pins = "gpio191";
> > +             function = "gpio";
> > +             drive-strength = <16>;
> > +             bias-disable;
> > +             output-low;
> > +     };
> > +
> > +     wcn_bt_en: wcn-bt-en-state {
> > +             pins = "gpio116";
> > +             function = "gpio";
> > +             drive-strength = <16>;
> > +             output-low;
> > +             bias-pull-down;
> > +     };
> > +
> > +     wcn_sw_en: wcn-sw-en-state {
> > +             pins = "gpio214";
> > +             function = "gpio";
> > +             drive-strength = <16>;
> > +             bias-disable;
> > +     };
> > +
> > +     wcn_wlan_en: wcn-wlan-en-state {
> > +             pins = "gpio117";
> > +             function = "gpio";
> > +             drive-strength = <16>;
> > +             bias-disable;
> > +     };
> > +};
> > +
> > +&uart14 {
> > +     status = "okay";
> > +
> > +     bluetooth {
> > +             compatible = "qcom,wcn7850-bt";
> > +             max-speed = <3200000>;
> > +
> > +             vddaon-supply = <&vreg_pmu_aon_0p59>;
> > +             vddwlcx-supply = <&vreg_pmu_wlcx_0p8>;
> > +             vddwlmx-supply = <&vreg_pmu_wlmx_0p85>;
> > +             vddrfacmn-supply = <&vreg_pmu_rfa_cmn>;
> > +             vddrfa0p8-supply = <&vreg_pmu_rfa_0p8>;
> > +             vddrfa1p2-supply = <&vreg_pmu_rfa_1p2>;
> > +             vddrfa1p8-supply = <&vreg_pmu_rfa_1p8>;
> > +     };
> > +};
> > +
> > +&usb_1_ss0_hsphy {
> > +     vdd-supply = <&vreg_l3j_0p8>;
> > +     vdda12-supply = <&vreg_l2j_1p2>;
> > +
> > +     phys = <&smb2360_0_eusb2_repeater>;
> > +
> > +     status = "okay";
> > +};
> > +
> > +&usb_1_ss0_qmpphy {
> > +     vdda-phy-supply = <&vreg_l3e_1p2>;
> > +     vdda-pll-supply = <&vreg_l1j_0p8>;
> > +
> > +     status = "okay";
> > +};
> > +
> > +&usb_1_ss0 {
> > +     status = "okay";
> > +};
> > +
> > +&usb_1_ss0_dwc3 {
> > +     dr_mode = "host";
>
> So pmic-glink declares corresponding port as dual-role, but USB
> controller is host-only?
>
> > +};
> > +
> > +&usb_1_ss0_dwc3_hs {
> > +     remote-endpoint = <&pmic_glink_ss0_hs_in>;
> > +};
> > +
> > +&usb_1_ss0_qmpphy_out {
> > +     remote-endpoint = <&pmic_glink_ss0_ss_in>;
> > +};
> > +
> > +&usb_1_ss1_hsphy {
> > +     vdd-supply = <&vreg_l3j_0p8>;
> > +     vdda12-supply = <&vreg_l2j_1p2>;
> > +
> > +     phys = <&smb2360_1_eusb2_repeater>;
> > +
> > +     status = "okay";
> > +};
> > +
> > +&usb_1_ss1_qmpphy {
> > +     vdda-phy-supply = <&vreg_l2j_1p2>;
> > +     vdda-pll-supply = <&vreg_l2d_0p9>;
> > +
> > +     status = "okay";
> > +};
> > +
> > +&usb_1_ss1 {
> > +     status = "okay";
> > +};
> > +
> > +&usb_1_ss1_dwc3 {
> > +     dr_mode = "host";
>
> And this one...
>
> > +};
> > +
> > +&usb_1_ss1_dwc3_hs {
> > +     remote-endpoint = <&pmic_glink_ss1_hs_in>;
> > +};
> > +
> > +&usb_1_ss1_qmpphy_out {
> > +     remote-endpoint = <&pmic_glink_ss1_ss_in>;
> > +};
> > +
> > +&usb_1_ss2 {
> > +     status = "okay";
> > +};
> > +
> > +&usb_1_ss2_dwc3 {
> > +     dr_mode = "host";
> > +     maximum-speed = "high-speed";
> > +     phys = <&usb_1_ss2_hsphy>;
> > +     phy-names = "usb2-phy";
> > +};
> > +
> > +&usb_1_ss2_hsphy {
> > +     vdd-supply = <&vreg_l3j_0p8>;
> > +     vdda12-supply = <&vreg_l2j_1p2>;
> > +
> > +     phys = <&eusb5_repeater>;
> > +
> > +     status = "okay";
> > +};
> > +
> > +&usb_2 {
> > +     status = "okay";
> > +};
> > +
> > +&usb_2_dwc3 {
> > +     dr_mode = "host";
> > +};
> > +
> > +&usb_2_hsphy {
> > +     vdd-supply = <&vreg_l2e_0p8>;
> > +     vdda12-supply = <&vreg_l3e_1p2>;
> > +
> > +     phys = <&eusb9_repeater>;
> > +
> > +     status = "okay";
> > +};
> > +
> > +&usb_mp {
> > +     status = "okay";
> > +};
> > +
> > +&usb_mp_hsphy0 {
> > +     vdd-supply = <&vreg_l2e_0p8>;
> > +     vdda12-supply = <&vreg_l3e_1p2>;
> > +
> > +     phys = <&eusb6_repeater>;
> > +
> > +     status = "okay";
> > +};
> > +
> > +&usb_mp_qmpphy0 {
> > +     vdda-phy-supply = <&vreg_l3e_1p2>;
> > +     vdda-pll-supply = <&vreg_l3c_0p8>;
> > +
> > +     status = "okay";
> > +};
> > +
> > +&usb_mp_hsphy1 {
> > +     vdd-supply = <&vreg_l2e_0p8>;
> > +     vdda12-supply = <&vreg_l3e_1p2>;
> > +
> > +     phys = <&eusb3_repeater>;
> > +
> > +     status = "okay";
> > +};
> > +
> > +&usb_mp_qmpphy1 {
> > +     vdda-phy-supply = <&vreg_l3e_1p2>;
> > +     vdda-pll-supply = <&vreg_l3c_0p8>;
> > +
> > +     status = "okay";
> > +};
> >
> > --
> > 2.48.1
> >
> >
>
> --
> With best wishes
> Dmitry
Dmitry Baryshkov May 25, 2025, 1:33 p.m. UTC | #3
On Sat, May 24, 2025 at 07:58:13PM +0200, Aleksandrs Vinarskis wrote:
> On Sat, 24 May 2025 at 17:33, Dmitry Baryshkov
> <dmitry.baryshkov@oss.qualcomm.com> wrote:
> >
> > On Sat, May 24, 2025 at 01:48:40PM +0200, Jens Glathe via B4 Relay wrote:
> > > From: Jens Glathe <jens.glathe@oldschoolsolutions.biz>
> > >
> > > Device tree for the Lenovo Thinkbook 16 G7 QOY
> > >
> > > The Laptop is a Snapdragon X1 / X1 Plus (Purwa) based device [1].
> > >
> > > Supported features:
> > >
> > > - USB type-c and type-a ports
> > > - Keyboard
> > > - Touchpad (all that are described in the dsdt)
> > > - Touchscreen (described in the dsdt, no known SKUss)
> > > - Display including PWM backlight control
> > > - PCIe devices
> > > - nvme
> > > - SDHC card reader
> > > - ath12k WCN7850 Wifi and Bluetooth
> > > - ADSP and CDSP
> > > - GPIO keys (Lid switch)
> > > - Sound via internal speakers / DMIC / USB / headphone jack
> > > - DP Altmode with 2 lanes (as all of these still do)
> > > - Integrated fingerprint reader (FPC)
> > > - Integrated UVC camera
> > >
> > > Not supported yet:
> > >
> > > - HDMI port.
> > > - EC and some fn hotkeys.
> > >
> > > Limited support yet:
> > >
> > > - SDHC card reader is based on the on-chip sdhc_2 controller, but the driver from
> > > the Snapdragon Dev Kit is only a partial match. It can do normal slow sd cards,
> > > but not UHS-I (SD104) and UHS-II.
> > >
> > > - The GPU is not yet supported. Graphics is only software rendered.
> > >
> > > This work was done without any schematics or non-public knowledge of the device.
> > > So, it is based on the existing x1e device trees, dsdt analysis, using HWInfo
> > > ARM64, and pure guesswork. It has been confirmed, however, that the device really
> > > has 4 NXP PTN3222 eUSB2 repeaters, one of which doesn't have a reset GPIO (eusb5
> > > @43).
> > >
> > > Signed-off-by: Jens Glathe <jens.glathe@oldschoolsolutions.biz>
> > > Co-developed by: Aleksandrs Vinarskis <alex.vinarskis@gmail.com>
> > > ---
> > >  arch/arm64/boot/dts/qcom/Makefile                  |    3 +
> > >  arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi       |    2 +-
> > >  .../boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts | 1655 ++++++++++++++++++++
> > >  3 files changed, 1659 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile
> > > index 669b888b27a1daa93ac15f47e8b9a302bb0922c2..aff4fe3e81ec0d6f6d52e2aa0da327b7576632d8 100644
> > > --- a/arch/arm64/boot/dts/qcom/Makefile
> > > +++ b/arch/arm64/boot/dts/qcom/Makefile
> > > @@ -327,3 +327,6 @@ x1e80100-qcp-el2-dtbs     := x1e80100-qcp.dtb x1-el2.dtbo
> > >  dtb-$(CONFIG_ARCH_QCOM)      += x1e80100-qcp.dtb x1e80100-qcp-el2.dtb
> > >  x1p42100-crd-el2-dtbs        := x1p42100-crd.dtb x1-el2.dtbo
> > >  dtb-$(CONFIG_ARCH_QCOM)      += x1p42100-crd.dtb x1p42100-crd-el2.dtb
> > > +x1p42100-lenovo-thinkbook-16-el2-dtbs        := x1p42100-lenovo-thinkbook-16.dtb x1-el2.dtbo
> > > +dtb-$(CONFIG_ARCH_QCOM)      += x1p42100-lenovo-thinkbook-16.dtb x1p42100-lenovo-thinkbook-16-el2.dtb
> > > +
> >
> > No need for an extra empty line.
> >
> > > diff --git a/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi b/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi
> > > index c02fd4d15c9649c222caaafa5ed2c777a10fb4f5..551b392eca4ef3b6041e03ad1385fef11cec1690 100644
> > > --- a/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi
> > > +++ b/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi
> > > @@ -170,7 +170,7 @@ trip1 {
> > >                       };
> > >               };
> > >
> > > -             pm8010-thermal {
> > > +             pm8010_thermal: pm8010-thermal {
> > >                       polling-delay-passive = <100>;
> > >
> > >                       thermal-sensors = <&pm8010_temp_alarm>;
> > > diff --git a/arch/arm64/boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts b/arch/arm64/boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts
> > > new file mode 100644
> > > index 0000000000000000000000000000000000000000..7089219ed08c1c4a60cc007f9d043a34a8071b4f
> > > --- /dev/null
> > > +++ b/arch/arm64/boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts
> > > @@ -0,0 +1,1655 @@
> > > +// SPDX-License-Identifier: BSD-3-Clause
> > > +/*
> > > + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
> > > + * Copyright (c) 2024, Linaro Limited
> > > + * Copyright (c) 2025, Jens Glathe
> > > + */
> > > +
> > > +/dts-v1/;
> > > +
> > > +#include <dt-bindings/gpio/gpio.h>
> > > +#include <dt-bindings/input/gpio-keys.h>
> > > +#include <dt-bindings/input/input.h>
> > > +#include <dt-bindings/pinctrl/qcom,pmic-gpio.h>
> > > +#include <dt-bindings/regulator/qcom,rpmh-regulator.h>
> > > +
> > > +#include "x1p42100.dtsi"
> > > +#include "x1e80100-pmics.dtsi"
> > > +
> > > +/delete-node/ &pmc8380_6;
> > > +/delete-node/ &pmc8380_6_thermal;
> > > +/delete-node/ &pm8010;
> > > +/delete-node/ &pm8010_thermal;
> > > +
> > > +/ {
> > > +     model = "Lenovo ThinkBook 16 Gen 7 QOY";
> > > +     compatible = "lenovo,thinkbook-16", "qcom,x1p42100";
> > > +     chassis-type = "laptop";
> > > +
> > > +     aliases {
> > > +             serial0 = &uart21;
> > > +             serial1 = &uart14;
> > > +     };
> > > +
> > > +     wcd938x: audio-codec {
> > > +             compatible = "qcom,wcd9385-codec";
> > > +
> > > +             pinctrl-names = "default";
> > > +             pinctrl-0 = <&wcd_default>;
> > > +
> > > +             qcom,micbias1-microvolt = <1800000>;
> > > +             qcom,micbias2-microvolt = <1800000>;
> > > +             qcom,micbias3-microvolt = <1800000>;
> > > +             qcom,micbias4-microvolt = <1800000>;
> > > +             qcom,mbhc-buttons-vthreshold-microvolt = <75000 150000 237000 500000 500000 500000 500000 500000>;
> > > +             qcom,mbhc-headset-vthreshold-microvolt = <1700000>;
> > > +             qcom,mbhc-headphone-vthreshold-microvolt = <50000>;
> > > +             qcom,rx-device = <&wcd_rx>;
> > > +             qcom,tx-device = <&wcd_tx>;
> > > +
> > > +             reset-gpios = <&tlmm 191 GPIO_ACTIVE_LOW>;
> > > +
> > > +             vdd-buck-supply = <&vreg_l15b_1p8>;
> > > +             vdd-rxtx-supply = <&vreg_l15b_1p8>;
> > > +             vdd-io-supply = <&vreg_l15b_1p8>;
> > > +             vdd-mic-bias-supply = <&vreg_bob1>;
> > > +
> > > +             #sound-dai-cells = <1>;
> > > +     };
> > > +
> > > +     backlight: backlight {
> > > +             compatible = "pwm-backlight";
> > > +             pwms = <&pm8550_pwm 3 500000>;
> > > +
> > > +             power-supply = <&vreg_edp_bl>;
> > > +     };
> > > +
> > > +     camera {
> > > +             compatible = "usb5986,1198";
> > > +
> > > +             vdd-supply = <&vreg_cam_5p0>;
> > > +
> > > +             status = "okay";
> >
> > This is default, please drop.
> >
> > > +     };
> >
> > Camera isn't randomly wire to the board, it is on the USB bus. Please
> > follow DT bindings and put it accordingly, describing topology of the
> > bus.
> >
> > > +
> > > +     gpio-keys {
> > > +             compatible = "gpio-keys";
> > > +
> > > +             pinctrl-0 = <&hall_int_n_default>;
> > > +             pinctrl-names = "default";
> > > +
> > > +             switch-lid {
> > > +                     gpios = <&tlmm 92 GPIO_ACTIVE_LOW>;
> > > +                     linux,input-type = <EV_SW>;
> > > +                     linux,code = <SW_LID>;
> > > +                     wakeup-source;
> > > +                     wakeup-event-action = <EV_ACT_DEASSERTED>;
> > > +             };
> > > +     };
> > > +
> > > +     pmic-glink {
> > > +             compatible = "qcom,x1e80100-pmic-glink",
> > > +                             "qcom,sm8550-pmic-glink",
> > > +                             "qcom,pmic-glink";
> >
> > Align vertically on the double-quote
> >
> > > +             #address-cells = <1>;
> > > +             #size-cells = <0>;
> > > +             orientation-gpios = <&tlmm 121 GPIO_ACTIVE_HIGH>,
> > > +                             <&tlmm 123 GPIO_ACTIVE_HIGH>;
> >
> > And such lists should be aligned on the opening angle bracket.
> >
> > > +
> > > +             /* Display-adjacent port */
> > > +             connector@0 {
> > > +                     compatible = "usb-c-connector";
> > > +                     reg = <0>;
> > > +                     power-role = "dual";
> > > +                     data-role = "dual";
> >
> > Is it actually dual-role? What does UCSI report for it?
> >
> > > +
> > > +                     ports {
> > > +                             #address-cells = <1>;
> > > +                             #size-cells = <0>;
> > > +
> > > +                             port@0 {
> > > +                                     reg = <0>;
> > > +
> > > +                                     pmic_glink_ss0_hs_in: endpoint {
> > > +                                             remote-endpoint = <&usb_1_ss0_dwc3_hs>;
> > > +                                     };
> > > +                             };
> > > +
> > > +                             port@1 {
> > > +                                     reg = <1>;
> > > +
> > > +                                     pmic_glink_ss0_ss_in: endpoint {
> > > +                                             remote-endpoint = <&usb_1_ss0_qmpphy_out>;
> > > +                                     };
> > > +                             };
> > > +
> > > +                             port@2 {
> > > +                                     reg = <2>;
> > > +
> > > +                                     pmic_glink_ss0_sbu: endpoint {
> > > +                                             remote-endpoint = <&usb_1_ss0_sbu_mux>;
> > > +                                     };
> > > +                             };
> > > +                     };
> > > +             };
> > > +
> > > +             /* User-adjacent port */
> > > +             connector@1 {
> > > +                     compatible = "usb-c-connector";
> > > +                     reg = <1>;
> > > +                     power-role = "dual";
> > > +                     data-role = "dual";
> > > +
> > > +                     ports {
> > > +                             #address-cells = <1>;
> > > +                             #size-cells = <0>;
> > > +
> > > +                             port@0 {
> > > +                                     reg = <0>;
> > > +
> > > +                                     pmic_glink_ss1_hs_in: endpoint {
> > > +                                             remote-endpoint = <&usb_1_ss1_dwc3_hs>;
> > > +                                     };
> > > +                             };
> > > +
> > > +                             port@1 {
> > > +                                     reg = <1>;
> > > +
> > > +                                     pmic_glink_ss1_ss_in: endpoint {
> > > +                                             remote-endpoint = <&usb_1_ss1_qmpphy_out>;
> > > +                                     };
> > > +                             };
> > > +
> > > +                             port@2 {
> > > +                                     reg = <2>;
> > > +
> > > +                                     pmic_glink_ss1_sbu: endpoint {
> > > +                                             remote-endpoint = <&usb_1_ss1_sbu_mux>;
> > > +                                     };
> > > +                             };
> > > +                     };
> > > +             };
> > > +     };
> > > +
> > > +     reserved-memory {
> > > +             linux,cma {
> >
> > What for?
> >
> > > +                     compatible = "shared-dma-pool";
> > > +                     size = <0x0 0x8000000>;
> > > +                     reusable;
> > > +                     linux,cma-default;
> > > +             };
> > > +     };
> > > +
> >
> > [...]
> >
> > > +
> > > +&gpu {
> > > +     status = "okay";
> >
> > I think that you wrote that GPU isn't supported (yet).
> 
> GPU is not supported on SoC level (x1p42100/purwa), not device
> specific. The idea I suggested to Jens was to mimic Asus Zenbook A14
> as per discussion abou purwa GPU and purwa firmware in general [1]: to
> already include correct filename and firmware path (since these are
> known) such that once SoC lands the GPU support laptops with that SoC
> will gain GPU support 'automatically'. As nothing consumes this
> property (on purwa) just yet, adding it already does not cause any
> harm.


Not quite. A14 specified the firmware name, but didn't enable the GPU.
This patch actually enables the GPU device. Which means, that we are
going to probe a driver on an unsupported device, using invalid GPU ids.

> 
> Jens, as per the same discussion [1] the path is wrong here,
> s/x1e80100/x1p42100/ for all purwa-specifc firmware. Unless the
> decision about firmware paths was re-evaluated in Linaro/Qcom?
> 
> >
> > > +
> > > +     zap-shader {

Please use &gpu_zap_shader {} instead.

> > > +             firmware-name = "qcom/x1e80100/LENOVO/21NH/qcdxkmsucpurwa.mbn";
> > > +     };
> > > +};
> > > +
> > Dmitry
Aleksandrs Vinarskis May 25, 2025, 7:43 p.m. UTC | #4
On Sun, 25 May 2025 at 15:33, Dmitry Baryshkov
<dmitry.baryshkov@oss.qualcomm.com> wrote:
>
> On Sat, May 24, 2025 at 07:58:13PM +0200, Aleksandrs Vinarskis wrote:
> > On Sat, 24 May 2025 at 17:33, Dmitry Baryshkov
> > <dmitry.baryshkov@oss.qualcomm.com> wrote:
> > >
> > > On Sat, May 24, 2025 at 01:48:40PM +0200, Jens Glathe via B4 Relay wrote:
> > > > From: Jens Glathe <jens.glathe@oldschoolsolutions.biz>
> > > >
> > > > Device tree for the Lenovo Thinkbook 16 G7 QOY
> > > >
> > > > The Laptop is a Snapdragon X1 / X1 Plus (Purwa) based device [1].
> > > >
> > > > Supported features:
> > > >
> > > > - USB type-c and type-a ports
> > > > - Keyboard
> > > > - Touchpad (all that are described in the dsdt)
> > > > - Touchscreen (described in the dsdt, no known SKUss)
> > > > - Display including PWM backlight control
> > > > - PCIe devices
> > > > - nvme
> > > > - SDHC card reader
> > > > - ath12k WCN7850 Wifi and Bluetooth
> > > > - ADSP and CDSP
> > > > - GPIO keys (Lid switch)
> > > > - Sound via internal speakers / DMIC / USB / headphone jack
> > > > - DP Altmode with 2 lanes (as all of these still do)
> > > > - Integrated fingerprint reader (FPC)
> > > > - Integrated UVC camera
> > > >
> > > > Not supported yet:
> > > >
> > > > - HDMI port.
> > > > - EC and some fn hotkeys.
> > > >
> > > > Limited support yet:
> > > >
> > > > - SDHC card reader is based on the on-chip sdhc_2 controller, but the driver from
> > > > the Snapdragon Dev Kit is only a partial match. It can do normal slow sd cards,
> > > > but not UHS-I (SD104) and UHS-II.
> > > >
> > > > - The GPU is not yet supported. Graphics is only software rendered.
> > > >
> > > > This work was done without any schematics or non-public knowledge of the device.
> > > > So, it is based on the existing x1e device trees, dsdt analysis, using HWInfo
> > > > ARM64, and pure guesswork. It has been confirmed, however, that the device really
> > > > has 4 NXP PTN3222 eUSB2 repeaters, one of which doesn't have a reset GPIO (eusb5
> > > > @43).
> > > >
> > > > Signed-off-by: Jens Glathe <jens.glathe@oldschoolsolutions.biz>
> > > > Co-developed by: Aleksandrs Vinarskis <alex.vinarskis@gmail.com>
> > > > ---
> > > >  arch/arm64/boot/dts/qcom/Makefile                  |    3 +
> > > >  arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi       |    2 +-
> > > >  .../boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts | 1655 ++++++++++++++++++++
> > > >  3 files changed, 1659 insertions(+), 1 deletion(-)
> > > >
> > > > diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile
> > > > index 669b888b27a1daa93ac15f47e8b9a302bb0922c2..aff4fe3e81ec0d6f6d52e2aa0da327b7576632d8 100644
> > > > --- a/arch/arm64/boot/dts/qcom/Makefile
> > > > +++ b/arch/arm64/boot/dts/qcom/Makefile
> > > > @@ -327,3 +327,6 @@ x1e80100-qcp-el2-dtbs     := x1e80100-qcp.dtb x1-el2.dtbo
> > > >  dtb-$(CONFIG_ARCH_QCOM)      += x1e80100-qcp.dtb x1e80100-qcp-el2.dtb
> > > >  x1p42100-crd-el2-dtbs        := x1p42100-crd.dtb x1-el2.dtbo
> > > >  dtb-$(CONFIG_ARCH_QCOM)      += x1p42100-crd.dtb x1p42100-crd-el2.dtb
> > > > +x1p42100-lenovo-thinkbook-16-el2-dtbs        := x1p42100-lenovo-thinkbook-16.dtb x1-el2.dtbo
> > > > +dtb-$(CONFIG_ARCH_QCOM)      += x1p42100-lenovo-thinkbook-16.dtb x1p42100-lenovo-thinkbook-16-el2.dtb
> > > > +
> > >
> > > No need for an extra empty line.
> > >
> > > > diff --git a/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi b/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi
> > > > index c02fd4d15c9649c222caaafa5ed2c777a10fb4f5..551b392eca4ef3b6041e03ad1385fef11cec1690 100644
> > > > --- a/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi
> > > > +++ b/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi
> > > > @@ -170,7 +170,7 @@ trip1 {
> > > >                       };
> > > >               };
> > > >
> > > > -             pm8010-thermal {
> > > > +             pm8010_thermal: pm8010-thermal {
> > > >                       polling-delay-passive = <100>;
> > > >
> > > >                       thermal-sensors = <&pm8010_temp_alarm>;
> > > > diff --git a/arch/arm64/boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts b/arch/arm64/boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts
> > > > new file mode 100644
> > > > index 0000000000000000000000000000000000000000..7089219ed08c1c4a60cc007f9d043a34a8071b4f
> > > > --- /dev/null
> > > > +++ b/arch/arm64/boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts
> > > > @@ -0,0 +1,1655 @@
> > > > +// SPDX-License-Identifier: BSD-3-Clause
> > > > +/*
> > > > + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
> > > > + * Copyright (c) 2024, Linaro Limited
> > > > + * Copyright (c) 2025, Jens Glathe
> > > > + */
> > > > +
> > > > +/dts-v1/;
> > > > +
> > > > +#include <dt-bindings/gpio/gpio.h>
> > > > +#include <dt-bindings/input/gpio-keys.h>
> > > > +#include <dt-bindings/input/input.h>
> > > > +#include <dt-bindings/pinctrl/qcom,pmic-gpio.h>
> > > > +#include <dt-bindings/regulator/qcom,rpmh-regulator.h>
> > > > +
> > > > +#include "x1p42100.dtsi"
> > > > +#include "x1e80100-pmics.dtsi"
> > > > +
> > > > +/delete-node/ &pmc8380_6;
> > > > +/delete-node/ &pmc8380_6_thermal;
> > > > +/delete-node/ &pm8010;
> > > > +/delete-node/ &pm8010_thermal;
> > > > +
> > > > +/ {
> > > > +     model = "Lenovo ThinkBook 16 Gen 7 QOY";
> > > > +     compatible = "lenovo,thinkbook-16", "qcom,x1p42100";
> > > > +     chassis-type = "laptop";
> > > > +
> > > > +     aliases {
> > > > +             serial0 = &uart21;
> > > > +             serial1 = &uart14;
> > > > +     };
> > > > +
> > > > +     wcd938x: audio-codec {
> > > > +             compatible = "qcom,wcd9385-codec";
> > > > +
> > > > +             pinctrl-names = "default";
> > > > +             pinctrl-0 = <&wcd_default>;
> > > > +
> > > > +             qcom,micbias1-microvolt = <1800000>;
> > > > +             qcom,micbias2-microvolt = <1800000>;
> > > > +             qcom,micbias3-microvolt = <1800000>;
> > > > +             qcom,micbias4-microvolt = <1800000>;
> > > > +             qcom,mbhc-buttons-vthreshold-microvolt = <75000 150000 237000 500000 500000 500000 500000 500000>;
> > > > +             qcom,mbhc-headset-vthreshold-microvolt = <1700000>;
> > > > +             qcom,mbhc-headphone-vthreshold-microvolt = <50000>;
> > > > +             qcom,rx-device = <&wcd_rx>;
> > > > +             qcom,tx-device = <&wcd_tx>;
> > > > +
> > > > +             reset-gpios = <&tlmm 191 GPIO_ACTIVE_LOW>;
> > > > +
> > > > +             vdd-buck-supply = <&vreg_l15b_1p8>;
> > > > +             vdd-rxtx-supply = <&vreg_l15b_1p8>;
> > > > +             vdd-io-supply = <&vreg_l15b_1p8>;
> > > > +             vdd-mic-bias-supply = <&vreg_bob1>;
> > > > +
> > > > +             #sound-dai-cells = <1>;
> > > > +     };
> > > > +
> > > > +     backlight: backlight {
> > > > +             compatible = "pwm-backlight";
> > > > +             pwms = <&pm8550_pwm 3 500000>;
> > > > +
> > > > +             power-supply = <&vreg_edp_bl>;
> > > > +     };
> > > > +
> > > > +     camera {
> > > > +             compatible = "usb5986,1198";
> > > > +
> > > > +             vdd-supply = <&vreg_cam_5p0>;
> > > > +
> > > > +             status = "okay";
> > >
> > > This is default, please drop.
> > >
> > > > +     };
> > >
> > > Camera isn't randomly wire to the board, it is on the USB bus. Please
> > > follow DT bindings and put it accordingly, describing topology of the
> > > bus.
> > >
> > > > +
> > > > +     gpio-keys {
> > > > +             compatible = "gpio-keys";
> > > > +
> > > > +             pinctrl-0 = <&hall_int_n_default>;
> > > > +             pinctrl-names = "default";
> > > > +
> > > > +             switch-lid {
> > > > +                     gpios = <&tlmm 92 GPIO_ACTIVE_LOW>;
> > > > +                     linux,input-type = <EV_SW>;
> > > > +                     linux,code = <SW_LID>;
> > > > +                     wakeup-source;
> > > > +                     wakeup-event-action = <EV_ACT_DEASSERTED>;
> > > > +             };
> > > > +     };
> > > > +
> > > > +     pmic-glink {
> > > > +             compatible = "qcom,x1e80100-pmic-glink",
> > > > +                             "qcom,sm8550-pmic-glink",
> > > > +                             "qcom,pmic-glink";
> > >
> > > Align vertically on the double-quote
> > >
> > > > +             #address-cells = <1>;
> > > > +             #size-cells = <0>;
> > > > +             orientation-gpios = <&tlmm 121 GPIO_ACTIVE_HIGH>,
> > > > +                             <&tlmm 123 GPIO_ACTIVE_HIGH>;
> > >
> > > And such lists should be aligned on the opening angle bracket.
> > >
> > > > +
> > > > +             /* Display-adjacent port */
> > > > +             connector@0 {
> > > > +                     compatible = "usb-c-connector";
> > > > +                     reg = <0>;
> > > > +                     power-role = "dual";
> > > > +                     data-role = "dual";
> > >
> > > Is it actually dual-role? What does UCSI report for it?
> > >
> > > > +
> > > > +                     ports {
> > > > +                             #address-cells = <1>;
> > > > +                             #size-cells = <0>;
> > > > +
> > > > +                             port@0 {
> > > > +                                     reg = <0>;
> > > > +
> > > > +                                     pmic_glink_ss0_hs_in: endpoint {
> > > > +                                             remote-endpoint = <&usb_1_ss0_dwc3_hs>;
> > > > +                                     };
> > > > +                             };
> > > > +
> > > > +                             port@1 {
> > > > +                                     reg = <1>;
> > > > +
> > > > +                                     pmic_glink_ss0_ss_in: endpoint {
> > > > +                                             remote-endpoint = <&usb_1_ss0_qmpphy_out>;
> > > > +                                     };
> > > > +                             };
> > > > +
> > > > +                             port@2 {
> > > > +                                     reg = <2>;
> > > > +
> > > > +                                     pmic_glink_ss0_sbu: endpoint {
> > > > +                                             remote-endpoint = <&usb_1_ss0_sbu_mux>;
> > > > +                                     };
> > > > +                             };
> > > > +                     };
> > > > +             };
> > > > +
> > > > +             /* User-adjacent port */
> > > > +             connector@1 {
> > > > +                     compatible = "usb-c-connector";
> > > > +                     reg = <1>;
> > > > +                     power-role = "dual";
> > > > +                     data-role = "dual";
> > > > +
> > > > +                     ports {
> > > > +                             #address-cells = <1>;
> > > > +                             #size-cells = <0>;
> > > > +
> > > > +                             port@0 {
> > > > +                                     reg = <0>;
> > > > +
> > > > +                                     pmic_glink_ss1_hs_in: endpoint {
> > > > +                                             remote-endpoint = <&usb_1_ss1_dwc3_hs>;
> > > > +                                     };
> > > > +                             };
> > > > +
> > > > +                             port@1 {
> > > > +                                     reg = <1>;
> > > > +
> > > > +                                     pmic_glink_ss1_ss_in: endpoint {
> > > > +                                             remote-endpoint = <&usb_1_ss1_qmpphy_out>;
> > > > +                                     };
> > > > +                             };
> > > > +
> > > > +                             port@2 {
> > > > +                                     reg = <2>;
> > > > +
> > > > +                                     pmic_glink_ss1_sbu: endpoint {
> > > > +                                             remote-endpoint = <&usb_1_ss1_sbu_mux>;
> > > > +                                     };
> > > > +                             };
> > > > +                     };
> > > > +             };
> > > > +     };
> > > > +
> > > > +     reserved-memory {
> > > > +             linux,cma {
> > >
> > > What for?
> > >
> > > > +                     compatible = "shared-dma-pool";
> > > > +                     size = <0x0 0x8000000>;
> > > > +                     reusable;
> > > > +                     linux,cma-default;
> > > > +             };
> > > > +     };
> > > > +
> > >
> > > [...]
> > >
> > > > +
> > > > +&gpu {
> > > > +     status = "okay";
> > >
> > > I think that you wrote that GPU isn't supported (yet).
> >
> > GPU is not supported on SoC level (x1p42100/purwa), not device
> > specific. The idea I suggested to Jens was to mimic Asus Zenbook A14
> > as per discussion abou purwa GPU and purwa firmware in general [1]: to
> > already include correct filename and firmware path (since these are
> > known) such that once SoC lands the GPU support laptops with that SoC
> > will gain GPU support 'automatically'. As nothing consumes this
> > property (on purwa) just yet, adding it already does not cause any
> > harm.
>
>
> Not quite. A14 specified the firmware name, but didn't enable the GPU.
> This patch actually enables the GPU device. Which means, that we are
> going to probe a driver on an unsupported device, using invalid GPU ids.
>

A14 also enables the GPU, just in the .dsti, not in the purwa .dts.
Though now looking at it, perhaps it's a bit misleading.
Yes you are right, it does give GPU-related error in dmesg, which
appear to be otherwise harmless. Perhaps because `x1p42100.dtsi`
deletes the compatible of the GPU, hence no driver is probing it?

```
[    3.085697] msm_dpu ae01000.display-controller: no GPU device was found
```

Otherwise, if you still say GPU should be disabled regardless, shall I
also disable it on A14's purwa variant?

Alex


> >
> > Jens, as per the same discussion [1] the path is wrong here,
> > s/x1e80100/x1p42100/ for all purwa-specifc firmware. Unless the
> > decision about firmware paths was re-evaluated in Linaro/Qcom?
> >
> > >
> > > > +
> > > > +     zap-shader {
>
> Please use &gpu_zap_shader {} instead.
>
> > > > +             firmware-name = "qcom/x1e80100/LENOVO/21NH/qcdxkmsucpurwa.mbn";
> > > > +     };
> > > > +};
> > > > +
> > > Dmitry
>
> --
> With best wishes
> Dmitry
Dmitry Baryshkov May 26, 2025, 8:36 a.m. UTC | #5
On Sun, May 25, 2025 at 09:43:36PM +0200, Aleksandrs Vinarskis wrote:
> On Sun, 25 May 2025 at 15:33, Dmitry Baryshkov
> <dmitry.baryshkov@oss.qualcomm.com> wrote:
> >
> > On Sat, May 24, 2025 at 07:58:13PM +0200, Aleksandrs Vinarskis wrote:
> > > On Sat, 24 May 2025 at 17:33, Dmitry Baryshkov
> > > <dmitry.baryshkov@oss.qualcomm.com> wrote:
> > > >
> > > > On Sat, May 24, 2025 at 01:48:40PM +0200, Jens Glathe via B4 Relay wrote:
> > > > > From: Jens Glathe <jens.glathe@oldschoolsolutions.biz>
> > > > >
> > > > > Device tree for the Lenovo Thinkbook 16 G7 QOY
> > > > >
> > > > > The Laptop is a Snapdragon X1 / X1 Plus (Purwa) based device [1].
> > > > >
> > > > > Supported features:
> > > > >
> > > > > - USB type-c and type-a ports
> > > > > - Keyboard
> > > > > - Touchpad (all that are described in the dsdt)
> > > > > - Touchscreen (described in the dsdt, no known SKUss)
> > > > > - Display including PWM backlight control
> > > > > - PCIe devices
> > > > > - nvme
> > > > > - SDHC card reader
> > > > > - ath12k WCN7850 Wifi and Bluetooth
> > > > > - ADSP and CDSP
> > > > > - GPIO keys (Lid switch)
> > > > > - Sound via internal speakers / DMIC / USB / headphone jack
> > > > > - DP Altmode with 2 lanes (as all of these still do)
> > > > > - Integrated fingerprint reader (FPC)
> > > > > - Integrated UVC camera
> > > > >
> > > > > Not supported yet:
> > > > >
> > > > > - HDMI port.
> > > > > - EC and some fn hotkeys.
> > > > >
> > > > > Limited support yet:
> > > > >
> > > > > - SDHC card reader is based on the on-chip sdhc_2 controller, but the driver from
> > > > > the Snapdragon Dev Kit is only a partial match. It can do normal slow sd cards,
> > > > > but not UHS-I (SD104) and UHS-II.
> > > > >
> > > > > - The GPU is not yet supported. Graphics is only software rendered.
> > > > >
> > > > > This work was done without any schematics or non-public knowledge of the device.
> > > > > So, it is based on the existing x1e device trees, dsdt analysis, using HWInfo
> > > > > ARM64, and pure guesswork. It has been confirmed, however, that the device really
> > > > > has 4 NXP PTN3222 eUSB2 repeaters, one of which doesn't have a reset GPIO (eusb5
> > > > > @43).
> > > > >
> > > > > Signed-off-by: Jens Glathe <jens.glathe@oldschoolsolutions.biz>
> > > > > Co-developed by: Aleksandrs Vinarskis <alex.vinarskis@gmail.com>
> > > > > ---
> > > > >  arch/arm64/boot/dts/qcom/Makefile                  |    3 +
> > > > >  arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi       |    2 +-
> > > > >  .../boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts | 1655 ++++++++++++++++++++
> > > > >  3 files changed, 1659 insertions(+), 1 deletion(-)
> > > > >
> > > > > diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile
> > > > > index 669b888b27a1daa93ac15f47e8b9a302bb0922c2..aff4fe3e81ec0d6f6d52e2aa0da327b7576632d8 100644
> > > > > --- a/arch/arm64/boot/dts/qcom/Makefile
> > > > > +++ b/arch/arm64/boot/dts/qcom/Makefile
> > > > > @@ -327,3 +327,6 @@ x1e80100-qcp-el2-dtbs     := x1e80100-qcp.dtb x1-el2.dtbo
> > > > >  dtb-$(CONFIG_ARCH_QCOM)      += x1e80100-qcp.dtb x1e80100-qcp-el2.dtb
> > > > >  x1p42100-crd-el2-dtbs        := x1p42100-crd.dtb x1-el2.dtbo
> > > > >  dtb-$(CONFIG_ARCH_QCOM)      += x1p42100-crd.dtb x1p42100-crd-el2.dtb
> > > > > +x1p42100-lenovo-thinkbook-16-el2-dtbs        := x1p42100-lenovo-thinkbook-16.dtb x1-el2.dtbo
> > > > > +dtb-$(CONFIG_ARCH_QCOM)      += x1p42100-lenovo-thinkbook-16.dtb x1p42100-lenovo-thinkbook-16-el2.dtb
> > > > > +
> > > >
> > > > No need for an extra empty line.
> > > >
> > > > > diff --git a/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi b/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi
> > > > > index c02fd4d15c9649c222caaafa5ed2c777a10fb4f5..551b392eca4ef3b6041e03ad1385fef11cec1690 100644
> > > > > --- a/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi
> > > > > +++ b/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi
> > > > > @@ -170,7 +170,7 @@ trip1 {
> > > > >                       };
> > > > >               };
> > > > >
> > > > > -             pm8010-thermal {
> > > > > +             pm8010_thermal: pm8010-thermal {
> > > > >                       polling-delay-passive = <100>;
> > > > >
> > > > >                       thermal-sensors = <&pm8010_temp_alarm>;
> > > > > diff --git a/arch/arm64/boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts b/arch/arm64/boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts
> > > > > new file mode 100644
> > > > > index 0000000000000000000000000000000000000000..7089219ed08c1c4a60cc007f9d043a34a8071b4f
> > > > > --- /dev/null
> > > > > +++ b/arch/arm64/boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts
> > > > > @@ -0,0 +1,1655 @@
> > > > > +// SPDX-License-Identifier: BSD-3-Clause
> > > > > +/*
> > > > > + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
> > > > > + * Copyright (c) 2024, Linaro Limited
> > > > > + * Copyright (c) 2025, Jens Glathe
> > > > > + */
> > > > > +
> > > > > +/dts-v1/;
> > > > > +
> > > > > +#include <dt-bindings/gpio/gpio.h>
> > > > > +#include <dt-bindings/input/gpio-keys.h>
> > > > > +#include <dt-bindings/input/input.h>
> > > > > +#include <dt-bindings/pinctrl/qcom,pmic-gpio.h>
> > > > > +#include <dt-bindings/regulator/qcom,rpmh-regulator.h>
> > > > > +
> > > > > +#include "x1p42100.dtsi"
> > > > > +#include "x1e80100-pmics.dtsi"
> > > > > +
> > > > > +/delete-node/ &pmc8380_6;
> > > > > +/delete-node/ &pmc8380_6_thermal;
> > > > > +/delete-node/ &pm8010;
> > > > > +/delete-node/ &pm8010_thermal;
> > > > > +
> > > > > +/ {
> > > > > +     model = "Lenovo ThinkBook 16 Gen 7 QOY";
> > > > > +     compatible = "lenovo,thinkbook-16", "qcom,x1p42100";
> > > > > +     chassis-type = "laptop";
> > > > > +
> > > > > +     aliases {
> > > > > +             serial0 = &uart21;
> > > > > +             serial1 = &uart14;
> > > > > +     };
> > > > > +
> > > > > +     wcd938x: audio-codec {
> > > > > +             compatible = "qcom,wcd9385-codec";
> > > > > +
> > > > > +             pinctrl-names = "default";
> > > > > +             pinctrl-0 = <&wcd_default>;
> > > > > +
> > > > > +             qcom,micbias1-microvolt = <1800000>;
> > > > > +             qcom,micbias2-microvolt = <1800000>;
> > > > > +             qcom,micbias3-microvolt = <1800000>;
> > > > > +             qcom,micbias4-microvolt = <1800000>;
> > > > > +             qcom,mbhc-buttons-vthreshold-microvolt = <75000 150000 237000 500000 500000 500000 500000 500000>;
> > > > > +             qcom,mbhc-headset-vthreshold-microvolt = <1700000>;
> > > > > +             qcom,mbhc-headphone-vthreshold-microvolt = <50000>;
> > > > > +             qcom,rx-device = <&wcd_rx>;
> > > > > +             qcom,tx-device = <&wcd_tx>;
> > > > > +
> > > > > +             reset-gpios = <&tlmm 191 GPIO_ACTIVE_LOW>;
> > > > > +
> > > > > +             vdd-buck-supply = <&vreg_l15b_1p8>;
> > > > > +             vdd-rxtx-supply = <&vreg_l15b_1p8>;
> > > > > +             vdd-io-supply = <&vreg_l15b_1p8>;
> > > > > +             vdd-mic-bias-supply = <&vreg_bob1>;
> > > > > +
> > > > > +             #sound-dai-cells = <1>;
> > > > > +     };
> > > > > +
> > > > > +     backlight: backlight {
> > > > > +             compatible = "pwm-backlight";
> > > > > +             pwms = <&pm8550_pwm 3 500000>;
> > > > > +
> > > > > +             power-supply = <&vreg_edp_bl>;
> > > > > +     };
> > > > > +
> > > > > +     camera {
> > > > > +             compatible = "usb5986,1198";
> > > > > +
> > > > > +             vdd-supply = <&vreg_cam_5p0>;
> > > > > +
> > > > > +             status = "okay";
> > > >
> > > > This is default, please drop.
> > > >
> > > > > +     };
> > > >
> > > > Camera isn't randomly wire to the board, it is on the USB bus. Please
> > > > follow DT bindings and put it accordingly, describing topology of the
> > > > bus.
> > > >
> > > > > +
> > > > > +     gpio-keys {
> > > > > +             compatible = "gpio-keys";
> > > > > +
> > > > > +             pinctrl-0 = <&hall_int_n_default>;
> > > > > +             pinctrl-names = "default";
> > > > > +
> > > > > +             switch-lid {
> > > > > +                     gpios = <&tlmm 92 GPIO_ACTIVE_LOW>;
> > > > > +                     linux,input-type = <EV_SW>;
> > > > > +                     linux,code = <SW_LID>;
> > > > > +                     wakeup-source;
> > > > > +                     wakeup-event-action = <EV_ACT_DEASSERTED>;
> > > > > +             };
> > > > > +     };
> > > > > +
> > > > > +     pmic-glink {
> > > > > +             compatible = "qcom,x1e80100-pmic-glink",
> > > > > +                             "qcom,sm8550-pmic-glink",
> > > > > +                             "qcom,pmic-glink";
> > > >
> > > > Align vertically on the double-quote
> > > >
> > > > > +             #address-cells = <1>;
> > > > > +             #size-cells = <0>;
> > > > > +             orientation-gpios = <&tlmm 121 GPIO_ACTIVE_HIGH>,
> > > > > +                             <&tlmm 123 GPIO_ACTIVE_HIGH>;
> > > >
> > > > And such lists should be aligned on the opening angle bracket.
> > > >
> > > > > +
> > > > > +             /* Display-adjacent port */
> > > > > +             connector@0 {
> > > > > +                     compatible = "usb-c-connector";
> > > > > +                     reg = <0>;
> > > > > +                     power-role = "dual";
> > > > > +                     data-role = "dual";
> > > >
> > > > Is it actually dual-role? What does UCSI report for it?
> > > >
> > > > > +
> > > > > +                     ports {
> > > > > +                             #address-cells = <1>;
> > > > > +                             #size-cells = <0>;
> > > > > +
> > > > > +                             port@0 {
> > > > > +                                     reg = <0>;
> > > > > +
> > > > > +                                     pmic_glink_ss0_hs_in: endpoint {
> > > > > +                                             remote-endpoint = <&usb_1_ss0_dwc3_hs>;
> > > > > +                                     };
> > > > > +                             };
> > > > > +
> > > > > +                             port@1 {
> > > > > +                                     reg = <1>;
> > > > > +
> > > > > +                                     pmic_glink_ss0_ss_in: endpoint {
> > > > > +                                             remote-endpoint = <&usb_1_ss0_qmpphy_out>;
> > > > > +                                     };
> > > > > +                             };
> > > > > +
> > > > > +                             port@2 {
> > > > > +                                     reg = <2>;
> > > > > +
> > > > > +                                     pmic_glink_ss0_sbu: endpoint {
> > > > > +                                             remote-endpoint = <&usb_1_ss0_sbu_mux>;
> > > > > +                                     };
> > > > > +                             };
> > > > > +                     };
> > > > > +             };
> > > > > +
> > > > > +             /* User-adjacent port */
> > > > > +             connector@1 {
> > > > > +                     compatible = "usb-c-connector";
> > > > > +                     reg = <1>;
> > > > > +                     power-role = "dual";
> > > > > +                     data-role = "dual";
> > > > > +
> > > > > +                     ports {
> > > > > +                             #address-cells = <1>;
> > > > > +                             #size-cells = <0>;
> > > > > +
> > > > > +                             port@0 {
> > > > > +                                     reg = <0>;
> > > > > +
> > > > > +                                     pmic_glink_ss1_hs_in: endpoint {
> > > > > +                                             remote-endpoint = <&usb_1_ss1_dwc3_hs>;
> > > > > +                                     };
> > > > > +                             };
> > > > > +
> > > > > +                             port@1 {
> > > > > +                                     reg = <1>;
> > > > > +
> > > > > +                                     pmic_glink_ss1_ss_in: endpoint {
> > > > > +                                             remote-endpoint = <&usb_1_ss1_qmpphy_out>;
> > > > > +                                     };
> > > > > +                             };
> > > > > +
> > > > > +                             port@2 {
> > > > > +                                     reg = <2>;
> > > > > +
> > > > > +                                     pmic_glink_ss1_sbu: endpoint {
> > > > > +                                             remote-endpoint = <&usb_1_ss1_sbu_mux>;
> > > > > +                                     };
> > > > > +                             };
> > > > > +                     };
> > > > > +             };
> > > > > +     };
> > > > > +
> > > > > +     reserved-memory {
> > > > > +             linux,cma {
> > > >
> > > > What for?
> > > >
> > > > > +                     compatible = "shared-dma-pool";
> > > > > +                     size = <0x0 0x8000000>;
> > > > > +                     reusable;
> > > > > +                     linux,cma-default;
> > > > > +             };
> > > > > +     };
> > > > > +
> > > >
> > > > [...]
> > > >
> > > > > +
> > > > > +&gpu {
> > > > > +     status = "okay";
> > > >
> > > > I think that you wrote that GPU isn't supported (yet).
> > >
> > > GPU is not supported on SoC level (x1p42100/purwa), not device
> > > specific. The idea I suggested to Jens was to mimic Asus Zenbook A14
> > > as per discussion abou purwa GPU and purwa firmware in general [1]: to
> > > already include correct filename and firmware path (since these are
> > > known) such that once SoC lands the GPU support laptops with that SoC
> > > will gain GPU support 'automatically'. As nothing consumes this
> > > property (on purwa) just yet, adding it already does not cause any
> > > harm.
> >
> >
> > Not quite. A14 specified the firmware name, but didn't enable the GPU.
> > This patch actually enables the GPU device. Which means, that we are
> > going to probe a driver on an unsupported device, using invalid GPU ids.
> >
> 
> A14 also enables the GPU, just in the .dsti, not in the purwa .dts.
> Though now looking at it, perhaps it's a bit misleading.

It should be enabled in the board.dts, not in the interim dtsi.

> Yes you are right, it does give GPU-related error in dmesg, which
> appear to be otherwise harmless. Perhaps because `x1p42100.dtsi`
> deletes the compatible of the GPU, hence no driver is probing it?
> 
> ```
> [    3.085697] msm_dpu ae01000.display-controller: no GPU device was found
> ```
> 
> Otherwise, if you still say GPU should be disabled regardless, shall I
> also disable it on A14's purwa variant?

Yes, please. Don't set okay status for the GPU until it gets enabled.
Rob Clark May 26, 2025, 3:28 p.m. UTC | #6
On Mon, May 26, 2025 at 1:36 AM Dmitry Baryshkov
<dmitry.baryshkov@oss.qualcomm.com> wrote:
>
> On Sun, May 25, 2025 at 09:43:36PM +0200, Aleksandrs Vinarskis wrote:
> > On Sun, 25 May 2025 at 15:33, Dmitry Baryshkov
> > <dmitry.baryshkov@oss.qualcomm.com> wrote:
> > >
> > > On Sat, May 24, 2025 at 07:58:13PM +0200, Aleksandrs Vinarskis wrote:
> > > > On Sat, 24 May 2025 at 17:33, Dmitry Baryshkov
> > > > <dmitry.baryshkov@oss.qualcomm.com> wrote:
> > > > >
> > > > > On Sat, May 24, 2025 at 01:48:40PM +0200, Jens Glathe via B4 Relay wrote:
> > > > > > From: Jens Glathe <jens.glathe@oldschoolsolutions.biz>
> > > > > >
> > > > > > Device tree for the Lenovo Thinkbook 16 G7 QOY
> > > > > >
> > > > > > The Laptop is a Snapdragon X1 / X1 Plus (Purwa) based device [1].
> > > > > >
> > > > > > Supported features:
> > > > > >
> > > > > > - USB type-c and type-a ports
> > > > > > - Keyboard
> > > > > > - Touchpad (all that are described in the dsdt)
> > > > > > - Touchscreen (described in the dsdt, no known SKUss)
> > > > > > - Display including PWM backlight control
> > > > > > - PCIe devices
> > > > > > - nvme
> > > > > > - SDHC card reader
> > > > > > - ath12k WCN7850 Wifi and Bluetooth
> > > > > > - ADSP and CDSP
> > > > > > - GPIO keys (Lid switch)
> > > > > > - Sound via internal speakers / DMIC / USB / headphone jack
> > > > > > - DP Altmode with 2 lanes (as all of these still do)
> > > > > > - Integrated fingerprint reader (FPC)
> > > > > > - Integrated UVC camera
> > > > > >
> > > > > > Not supported yet:
> > > > > >
> > > > > > - HDMI port.
> > > > > > - EC and some fn hotkeys.
> > > > > >
> > > > > > Limited support yet:
> > > > > >
> > > > > > - SDHC card reader is based on the on-chip sdhc_2 controller, but the driver from
> > > > > > the Snapdragon Dev Kit is only a partial match. It can do normal slow sd cards,
> > > > > > but not UHS-I (SD104) and UHS-II.
> > > > > >
> > > > > > - The GPU is not yet supported. Graphics is only software rendered.
> > > > > >
> > > > > > This work was done without any schematics or non-public knowledge of the device.
> > > > > > So, it is based on the existing x1e device trees, dsdt analysis, using HWInfo
> > > > > > ARM64, and pure guesswork. It has been confirmed, however, that the device really
> > > > > > has 4 NXP PTN3222 eUSB2 repeaters, one of which doesn't have a reset GPIO (eusb5
> > > > > > @43).
> > > > > >
> > > > > > Signed-off-by: Jens Glathe <jens.glathe@oldschoolsolutions.biz>
> > > > > > Co-developed by: Aleksandrs Vinarskis <alex.vinarskis@gmail.com>
> > > > > > ---

[snip]

> > > > > I think that you wrote that GPU isn't supported (yet).
> > > >
> > > > GPU is not supported on SoC level (x1p42100/purwa), not device
> > > > specific. The idea I suggested to Jens was to mimic Asus Zenbook A14
> > > > as per discussion abou purwa GPU and purwa firmware in general [1]: to
> > > > already include correct filename and firmware path (since these are
> > > > known) such that once SoC lands the GPU support laptops with that SoC
> > > > will gain GPU support 'automatically'. As nothing consumes this
> > > > property (on purwa) just yet, adding it already does not cause any
> > > > harm.
> > >
> > >
> > > Not quite. A14 specified the firmware name, but didn't enable the GPU.
> > > This patch actually enables the GPU device. Which means, that we are
> > > going to probe a driver on an unsupported device, using invalid GPU ids.
> > >
> >
> > A14 also enables the GPU, just in the .dsti, not in the purwa .dts.
> > Though now looking at it, perhaps it's a bit misleading.
>
> It should be enabled in the board.dts, not in the interim dtsi.
>
> > Yes you are right, it does give GPU-related error in dmesg, which
> > appear to be otherwise harmless. Perhaps because `x1p42100.dtsi`
> > deletes the compatible of the GPU, hence no driver is probing it?
> >
> > ```
> > [    3.085697] msm_dpu ae01000.display-controller: no GPU device was found
> > ```
> >
> > Otherwise, if you still say GPU should be disabled regardless, shall I
> > also disable it on A14's purwa variant?
>
> Yes, please. Don't set okay status for the GPU until it gets enabled.

Drive-by: Shouldn't the dtb describe the hw and not the state of the
linux kernel's support for the hw?  Ie. if bad things happen if we
describe hw which is missing driver support, shouldn't we fix that in
the driver.

(In the case of the GPU there is the slight wrinkle that we don't have
a gpu-id yet so there is no compatible in the dtb yet.)

BR,
-R
Konrad Dybcio May 27, 2025, 10:55 a.m. UTC | #7
On 5/26/25 5:28 PM, Rob Clark wrote:
> On Mon, May 26, 2025 at 1:36 AM Dmitry Baryshkov
> <dmitry.baryshkov@oss.qualcomm.com> wrote:
>>
>> On Sun, May 25, 2025 at 09:43:36PM +0200, Aleksandrs Vinarskis wrote:
>>> On Sun, 25 May 2025 at 15:33, Dmitry Baryshkov
>>> <dmitry.baryshkov@oss.qualcomm.com> wrote:
>>>>

[...]

>> Yes, please. Don't set okay status for the GPU until it gets enabled.
> 
> Drive-by: Shouldn't the dtb describe the hw and not the state of the
> linux kernel's support for the hw?  Ie. if bad things happen if we
> describe hw which is missing driver support, shouldn't we fix that in
> the driver.
> 
> (In the case of the GPU there is the slight wrinkle that we don't have
> a gpu-id yet so there is no compatible in the dtb yet.)

My two cents are that it's okay to enable it, at least in this case..

Konrad
Dmitry Baryshkov May 27, 2025, 6:18 p.m. UTC | #8
On Tue, May 27, 2025 at 12:55:06PM +0200, Konrad Dybcio wrote:
> On 5/26/25 5:28 PM, Rob Clark wrote:
> > On Mon, May 26, 2025 at 1:36 AM Dmitry Baryshkov
> > <dmitry.baryshkov@oss.qualcomm.com> wrote:
> >>
> >> On Sun, May 25, 2025 at 09:43:36PM +0200, Aleksandrs Vinarskis wrote:
> >>> On Sun, 25 May 2025 at 15:33, Dmitry Baryshkov
> >>> <dmitry.baryshkov@oss.qualcomm.com> wrote:
> >>>>
> 
> [...]
> 
> >> Yes, please. Don't set okay status for the GPU until it gets enabled.
> > 
> > Drive-by: Shouldn't the dtb describe the hw and not the state of the
> > linux kernel's support for the hw?  Ie. if bad things happen if we
> > describe hw which is missing driver support, shouldn't we fix that in
> > the driver.
> > 
> > (In the case of the GPU there is the slight wrinkle that we don't have
> > a gpu-id yet so there is no compatible in the dtb yet.)
> 
> My two cents are that it's okay to enable it, at least in this case..

That would most likely make display unavailable as DPU driver uses GPU
as one of the components.
diff mbox series

Patch

diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile
index 669b888b27a1daa93ac15f47e8b9a302bb0922c2..aff4fe3e81ec0d6f6d52e2aa0da327b7576632d8 100644
--- a/arch/arm64/boot/dts/qcom/Makefile
+++ b/arch/arm64/boot/dts/qcom/Makefile
@@ -327,3 +327,6 @@  x1e80100-qcp-el2-dtbs	:= x1e80100-qcp.dtb x1-el2.dtbo
 dtb-$(CONFIG_ARCH_QCOM)	+= x1e80100-qcp.dtb x1e80100-qcp-el2.dtb
 x1p42100-crd-el2-dtbs	:= x1p42100-crd.dtb x1-el2.dtbo
 dtb-$(CONFIG_ARCH_QCOM)	+= x1p42100-crd.dtb x1p42100-crd-el2.dtb
+x1p42100-lenovo-thinkbook-16-el2-dtbs	:= x1p42100-lenovo-thinkbook-16.dtb x1-el2.dtbo
+dtb-$(CONFIG_ARCH_QCOM)	+= x1p42100-lenovo-thinkbook-16.dtb x1p42100-lenovo-thinkbook-16-el2.dtb
+
diff --git a/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi b/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi
index c02fd4d15c9649c222caaafa5ed2c777a10fb4f5..551b392eca4ef3b6041e03ad1385fef11cec1690 100644
--- a/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi
+++ b/arch/arm64/boot/dts/qcom/x1e80100-pmics.dtsi
@@ -170,7 +170,7 @@  trip1 {
 			};
 		};
 
-		pm8010-thermal {
+		pm8010_thermal: pm8010-thermal {
 			polling-delay-passive = <100>;
 
 			thermal-sensors = <&pm8010_temp_alarm>;
diff --git a/arch/arm64/boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts b/arch/arm64/boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts
new file mode 100644
index 0000000000000000000000000000000000000000..7089219ed08c1c4a60cc007f9d043a34a8071b4f
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/x1p42100-lenovo-thinkbook-16.dts
@@ -0,0 +1,1655 @@ 
+// SPDX-License-Identifier: BSD-3-Clause
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2024, Linaro Limited
+ * Copyright (c) 2025, Jens Glathe
+ */
+
+/dts-v1/;
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/gpio-keys.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/pinctrl/qcom,pmic-gpio.h>
+#include <dt-bindings/regulator/qcom,rpmh-regulator.h>
+
+#include "x1p42100.dtsi"
+#include "x1e80100-pmics.dtsi"
+
+/delete-node/ &pmc8380_6;
+/delete-node/ &pmc8380_6_thermal;
+/delete-node/ &pm8010;
+/delete-node/ &pm8010_thermal;
+
+/ {
+	model = "Lenovo ThinkBook 16 Gen 7 QOY";
+	compatible = "lenovo,thinkbook-16", "qcom,x1p42100";
+	chassis-type = "laptop";
+
+	aliases {
+		serial0 = &uart21;
+		serial1 = &uart14;
+	};
+
+	wcd938x: audio-codec {
+		compatible = "qcom,wcd9385-codec";
+
+		pinctrl-names = "default";
+		pinctrl-0 = <&wcd_default>;
+
+		qcom,micbias1-microvolt = <1800000>;
+		qcom,micbias2-microvolt = <1800000>;
+		qcom,micbias3-microvolt = <1800000>;
+		qcom,micbias4-microvolt = <1800000>;
+		qcom,mbhc-buttons-vthreshold-microvolt = <75000 150000 237000 500000 500000 500000 500000 500000>;
+		qcom,mbhc-headset-vthreshold-microvolt = <1700000>;
+		qcom,mbhc-headphone-vthreshold-microvolt = <50000>;
+		qcom,rx-device = <&wcd_rx>;
+		qcom,tx-device = <&wcd_tx>;
+
+		reset-gpios = <&tlmm 191 GPIO_ACTIVE_LOW>;
+
+		vdd-buck-supply = <&vreg_l15b_1p8>;
+		vdd-rxtx-supply = <&vreg_l15b_1p8>;
+		vdd-io-supply = <&vreg_l15b_1p8>;
+		vdd-mic-bias-supply = <&vreg_bob1>;
+
+		#sound-dai-cells = <1>;
+	};
+
+	backlight: backlight {
+		compatible = "pwm-backlight";
+		pwms = <&pm8550_pwm 3 500000>;
+
+		power-supply = <&vreg_edp_bl>;
+	};
+
+	camera {
+		compatible = "usb5986,1198";
+
+		vdd-supply = <&vreg_cam_5p0>;
+
+		status = "okay";
+	};
+
+	gpio-keys {
+		compatible = "gpio-keys";
+
+		pinctrl-0 = <&hall_int_n_default>;
+		pinctrl-names = "default";
+
+		switch-lid {
+			gpios = <&tlmm 92 GPIO_ACTIVE_LOW>;
+			linux,input-type = <EV_SW>;
+			linux,code = <SW_LID>;
+			wakeup-source;
+			wakeup-event-action = <EV_ACT_DEASSERTED>;
+		};
+	};
+
+	pmic-glink {
+		compatible = "qcom,x1e80100-pmic-glink",
+				"qcom,sm8550-pmic-glink",
+				"qcom,pmic-glink";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		orientation-gpios = <&tlmm 121 GPIO_ACTIVE_HIGH>,
+				<&tlmm 123 GPIO_ACTIVE_HIGH>;
+
+		/* Display-adjacent port */
+		connector@0 {
+			compatible = "usb-c-connector";
+			reg = <0>;
+			power-role = "dual";
+			data-role = "dual";
+
+			ports {
+				#address-cells = <1>;
+				#size-cells = <0>;
+
+				port@0 {
+					reg = <0>;
+
+					pmic_glink_ss0_hs_in: endpoint {
+						remote-endpoint = <&usb_1_ss0_dwc3_hs>;
+					};
+				};
+
+				port@1 {
+					reg = <1>;
+
+					pmic_glink_ss0_ss_in: endpoint {
+						remote-endpoint = <&usb_1_ss0_qmpphy_out>;
+					};
+				};
+
+				port@2 {
+					reg = <2>;
+
+					pmic_glink_ss0_sbu: endpoint {
+						remote-endpoint = <&usb_1_ss0_sbu_mux>;
+					};
+				};
+			};
+		};
+
+		/* User-adjacent port */
+		connector@1 {
+			compatible = "usb-c-connector";
+			reg = <1>;
+			power-role = "dual";
+			data-role = "dual";
+
+			ports {
+				#address-cells = <1>;
+				#size-cells = <0>;
+
+				port@0 {
+					reg = <0>;
+
+					pmic_glink_ss1_hs_in: endpoint {
+						remote-endpoint = <&usb_1_ss1_dwc3_hs>;
+					};
+				};
+
+				port@1 {
+					reg = <1>;
+
+					pmic_glink_ss1_ss_in: endpoint {
+						remote-endpoint = <&usb_1_ss1_qmpphy_out>;
+					};
+				};
+
+				port@2 {
+					reg = <2>;
+
+					pmic_glink_ss1_sbu: endpoint {
+						remote-endpoint = <&usb_1_ss1_sbu_mux>;
+					};
+				};
+			};
+		};
+	};
+
+	reserved-memory {
+		linux,cma {
+			compatible = "shared-dma-pool";
+			size = <0x0 0x8000000>;
+			reusable;
+			linux,cma-default;
+		};
+	};
+
+	sound {
+		compatible = "qcom,x1e80100-sndcard";
+		model = "X1E80100-LENOVO-ThinkBook-16";
+		audio-routing = "SpkrLeft IN", "WSA WSA_SPK1 OUT",
+				"SpkrRight IN", "WSA WSA_SPK2 OUT",
+				"IN1_HPHL", "HPHL_OUT",
+				"IN2_HPHR", "HPHR_OUT",
+				"AMIC2", "MIC BIAS2",
+				"VA DMIC0", "MIC BIAS3",
+				"VA DMIC1", "MIC BIAS3",
+				"VA DMIC2", "MIC BIAS1",
+				"VA DMIC3", "MIC BIAS1",
+				"VA DMIC0", "VA MIC BIAS3",
+				"VA DMIC1", "VA MIC BIAS3",
+				"VA DMIC2", "VA MIC BIAS1",
+				"VA DMIC3", "VA MIC BIAS1",
+				"TX SWR_INPUT1", "ADC2_OUTPUT";
+
+		wcd-playback-dai-link {
+			link-name = "WCD Playback";
+
+			cpu {
+				sound-dai = <&q6apmbedai RX_CODEC_DMA_RX_0>;
+			};
+
+			codec {
+				sound-dai = <&wcd938x 0>, <&swr1 0>, <&lpass_rxmacro 0>;
+			};
+
+			platform {
+				sound-dai = <&q6apm>;
+			};
+		};
+
+		wcd-capture-dai-link {
+			link-name = "WCD Capture";
+
+			cpu {
+				sound-dai = <&q6apmbedai TX_CODEC_DMA_TX_3>;
+			};
+
+			codec {
+				sound-dai = <&wcd938x 1>, <&swr2 1>, <&lpass_txmacro 0>;
+			};
+
+			platform {
+				sound-dai = <&q6apm>;
+			};
+		};
+
+		wsa-dai-link {
+			link-name = "WSA Playback";
+
+			codec {
+				sound-dai = <&left_spkr>, <&right_spkr>, <&swr0 0>, <&lpass_wsamacro 0>;
+			};
+
+			cpu {
+				sound-dai = <&q6apmbedai WSA_CODEC_DMA_RX_0>;
+			};
+
+			platform {
+				sound-dai = <&q6apm>;
+			};
+		};
+
+		va-dai-link {
+			link-name = "VA Capture";
+
+			codec {
+				sound-dai = <&lpass_vamacro 0>;
+			};
+
+			cpu {
+				sound-dai = <&q6apmbedai VA_CODEC_DMA_TX_0>;
+			};
+
+			platform {
+				sound-dai = <&q6apm>;
+			};
+		};
+	};
+
+	usb-1-ss0-sbu-mux {
+		compatible = "onnn,fsusb42", "gpio-sbu-mux";
+
+		enable-gpios = <&tlmm 168 GPIO_ACTIVE_LOW>;
+		select-gpios = <&tlmm 167 GPIO_ACTIVE_HIGH>;
+
+		pinctrl-0 = <&usb_1_ss0_sbu_default>;
+		pinctrl-names = "default";
+
+		mode-switch;
+		orientation-switch;
+
+		port {
+			usb_1_ss0_sbu_mux: endpoint {
+				remote-endpoint = <&pmic_glink_ss0_sbu>;
+			};
+		};
+	};
+
+	usb-1-ss1-sbu-mux {
+		compatible = "onnn,fsusb42", "gpio-sbu-mux";
+
+		enable-gpios = <&tlmm 179 GPIO_ACTIVE_LOW>;
+		select-gpios = <&tlmm 178 GPIO_ACTIVE_HIGH>;
+
+		pinctrl-0 = <&usb_1_ss1_sbu_default>;
+		pinctrl-names = "default";
+
+		mode-switch;
+		orientation-switch;
+
+		port {
+			usb_1_ss1_sbu_mux: endpoint {
+				remote-endpoint = <&pmic_glink_ss1_sbu>;
+			};
+		};
+	};
+
+	vreg_cam_5p0: regulator-cam-5p0 {
+		compatible = "regulator-fixed";
+
+		regulator-name = "VREG_CAM_5P0";
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+
+		gpio = <&tlmm 44 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+
+		pinctrl-0 = <&cam_reg_en>;
+		pinctrl-names = "default";
+
+		regulator-boot-on;
+	};
+
+	vreg_edp_3p3: regulator-edp-3p3 {
+		compatible = "regulator-fixed";
+
+		regulator-name = "VREG_EDP_3P3";
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+
+		gpio = <&tlmm 70 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+
+		pinctrl-0 = <&edp_reg_en>;
+		pinctrl-names = "default";
+
+		regulator-boot-on;
+	};
+
+	vreg_edp_bl: regulator-edp-bl {
+		compatible = "regulator-fixed";
+
+		regulator-name = "VBL9";
+		regulator-min-microvolt = <3600000>;
+		regulator-max-microvolt = <3600000>;
+
+		gpio = <&pmc8380_3_gpios 10 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+
+		pinctrl-names = "default";
+		pinctrl-0 = <&edp_bl_reg_en>;
+
+		regulator-boot-on;
+	};
+
+	vreg_misc_3p3: regulator-misc-3p3 {
+		compatible = "regulator-fixed";
+
+		regulator-name = "VREG_MISC_3P3";
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+
+		gpio = <&pm8550ve_8_gpios 6 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+
+		pinctrl-names = "default";
+		pinctrl-0 = <&misc_3p3_reg_en>;
+
+		regulator-boot-on;
+		regulator-always-on;
+	};
+
+	vreg_nvme: regulator-nvme {
+		compatible = "regulator-fixed";
+
+		regulator-name = "VREG_NVME_3P3";
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+
+		gpio = <&tlmm 18 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+
+		pinctrl-0 = <&nvme_reg_en>;
+		pinctrl-names = "default";
+
+		regulator-boot-on;
+	};
+
+	vreg_wcn_0p95: regulator-wcn-0p95 {
+		compatible = "regulator-fixed";
+
+		regulator-name = "VREG_WCN_0P95";
+		regulator-min-microvolt = <950000>;
+		regulator-max-microvolt = <950000>;
+
+		vin-supply = <&vreg_wcn_3p3>;
+	};
+
+	vreg_wcn_1p9: regulator-wcn-1p9 {
+		compatible = "regulator-fixed";
+
+		regulator-name = "VREG_WCN_1P9";
+		regulator-min-microvolt = <1900000>;
+		regulator-max-microvolt = <1900000>;
+
+		vin-supply = <&vreg_wcn_3p3>;
+	};
+
+	vreg_wcn_3p3: regulator-wcn-3p3 {
+		compatible = "regulator-fixed";
+
+		regulator-name = "VREG_WCN_3P3";
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+
+		gpio = <&tlmm 214 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+
+		pinctrl-0 = <&wcn_sw_en>;
+		pinctrl-names = "default";
+
+		regulator-boot-on;
+	};
+
+	vph_pwr: regulator-vph-pwr {
+		compatible = "regulator-fixed";
+
+		regulator-name = "vph_pwr";
+		regulator-min-microvolt = <3700000>;
+		regulator-max-microvolt = <3700000>;
+
+		regulator-always-on;
+		regulator-boot-on;
+	};
+
+	wcn7850-pmu {
+		compatible = "qcom,wcn7850-pmu";
+
+		vdd-supply = <&vreg_wcn_0p95>;
+		vddio-supply = <&vreg_l15b_1p8>;
+		vddaon-supply = <&vreg_wcn_0p95>;
+		vdddig-supply = <&vreg_wcn_0p95>;
+		vddrfa1p2-supply = <&vreg_wcn_1p9>;
+		vddrfa1p8-supply = <&vreg_wcn_1p9>;
+
+		wlan-enable-gpios = <&tlmm 117 GPIO_ACTIVE_HIGH>;
+		bt-enable-gpios = <&tlmm 116 GPIO_ACTIVE_HIGH>;
+
+		pinctrl-0 = <&wcn_wlan_en>;
+		pinctrl-1 = <&wcn_bt_en>;
+		pinctrl-names = "default";
+
+		regulators {
+			vreg_pmu_rfa_cmn: ldo0 {
+				regulator-name = "vreg_pmu_rfa_cmn";
+			};
+
+			vreg_pmu_aon_0p59: ldo1 {
+				regulator-name = "vreg_pmu_aon_0p59";
+			};
+
+			vreg_pmu_wlcx_0p8: ldo2 {
+				regulator-name = "vreg_pmu_wlcx_0p8";
+			};
+
+			vreg_pmu_wlmx_0p85: ldo3 {
+				regulator-name = "vreg_pmu_wlmx_0p85";
+			};
+
+			vreg_pmu_btcmx_0p85: ldo4 {
+				regulator-name = "vreg_pmu_btcmx_0p85";
+			};
+
+			vreg_pmu_rfa_0p8: ldo5 {
+				regulator-name = "vreg_pmu_rfa_0p8";
+			};
+
+			vreg_pmu_rfa_1p2: ldo6 {
+				regulator-name = "vreg_pmu_rfa_1p2";
+			};
+
+			vreg_pmu_rfa_1p8: ldo7 {
+				regulator-name = "vreg_pmu_rfa_1p8";
+			};
+
+			vreg_pmu_pcie_0p9: ldo8 {
+				regulator-name = "vreg_pmu_pcie_0p9";
+			};
+
+			vreg_pmu_pcie_1p8: ldo9 {
+				regulator-name = "vreg_pmu_pcie_1p8";
+			};
+		};
+	};
+};
+
+&apps_rsc {
+	regulators-0 {
+		compatible = "qcom,pm8550-rpmh-regulators";
+		qcom,pmic-id = "b";
+
+		vdd-bob1-supply = <&vph_pwr>;
+		vdd-bob2-supply = <&vph_pwr>;
+		vdd-l1-l4-l10-supply = <&vreg_s4c_1p8>;
+		vdd-l2-l13-l14-supply = <&vreg_bob1>;
+		vdd-l5-l16-supply = <&vreg_bob1>;
+		vdd-l6-l7-supply = <&vreg_bob2>;
+		vdd-l8-l9-supply = <&vreg_bob1>;
+		vdd-l12-supply = <&vreg_s5j_1p2>;
+		vdd-l15-supply = <&vreg_s4c_1p8>;
+		vdd-l17-supply = <&vreg_bob2>;
+
+		vreg_bob1: bob1 {
+			regulator-name = "vreg_bob1";
+			regulator-min-microvolt = <3008000>;
+			regulator-max-microvolt = <3960000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_bob2: bob2 {
+			regulator-name = "vreg_bob2";
+			regulator-min-microvolt = <2504000>;
+			regulator-max-microvolt = <3008000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l1b_1p8: ldo1 {
+			regulator-name = "vreg_l1b_1p8";
+			regulator-min-microvolt = <1800000>;
+			regulator-max-microvolt = <1800000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l2b_3p0: ldo2 {
+			regulator-name = "vreg_l2b_3p0";
+			regulator-min-microvolt = <3072000>;
+			regulator-max-microvolt = <3072000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l4b_1p8: ldo4 {
+			regulator-name = "vreg_l4b_1p8";
+			regulator-min-microvolt = <1800000>;
+			regulator-max-microvolt = <1800000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l5b_3p0: ldo5 {
+			regulator-name = "vreg_l5b_3p0";
+			regulator-min-microvolt = <3000000>;
+			regulator-max-microvolt = <3000000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l6b_1p8: ldo6 {
+			regulator-name = "vreg_l6b_1p8";
+			regulator-min-microvolt = <1800000>;
+			regulator-max-microvolt = <2960000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l7b_2p8: ldo7 {
+			regulator-name = "vreg_l7b_2p8";
+			regulator-min-microvolt = <2800000>;
+			regulator-max-microvolt = <2800000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l8b_3p0: ldo8 {
+			regulator-name = "vreg_l8b_3p0";
+			regulator-min-microvolt = <3072000>;
+			regulator-max-microvolt = <3072000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l9b_2p9: ldo9 {
+			regulator-name = "vreg_l9b_2p9";
+			regulator-min-microvolt = <2960000>;
+			regulator-max-microvolt = <2960000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l10b_1p8: ldo10 {
+			regulator-name = "vreg_l10b_1p8";
+			regulator-min-microvolt = <1800000>;
+			regulator-max-microvolt = <1800000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l12b_1p2: ldo12 {
+			regulator-name = "vreg_l12b_1p2";
+			regulator-min-microvolt = <1200000>;
+			regulator-max-microvolt = <1200000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+			regulator-always-on;
+		};
+
+		vreg_l13b_3p0: ldo13 {
+			regulator-name = "vreg_l13b_3p0";
+			regulator-min-microvolt = <3072000>;
+			regulator-max-microvolt = <3072000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l14b_3p0: ldo14 {
+			regulator-name = "vreg_l14b_3p0";
+			regulator-min-microvolt = <3072000>;
+			regulator-max-microvolt = <3072000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l15b_1p8: ldo15 {
+			regulator-name = "vreg_l15b_1p8";
+			regulator-min-microvolt = <1800000>;
+			regulator-max-microvolt = <1800000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+			regulator-always-on;
+		};
+
+		vreg_l16b_2p9: ldo16 {
+			regulator-name = "vreg_l16b_2p9";
+			regulator-min-microvolt = <2912000>;
+			regulator-max-microvolt = <2912000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l17b_2p5: ldo17 {
+			regulator-name = "vreg_l17b_2p5";
+			regulator-min-microvolt = <2504000>;
+			regulator-max-microvolt = <2504000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+	};
+
+	regulators-1 {
+		compatible = "qcom,pm8550ve-rpmh-regulators";
+		qcom,pmic-id = "c";
+
+		vdd-l1-supply = <&vreg_s5j_1p2>;
+		vdd-l2-supply = <&vreg_s1f_0p7>;
+		vdd-l3-supply = <&vreg_s1f_0p7>;
+		vdd-s4-supply = <&vph_pwr>;
+
+		vreg_s4c_1p8: smps4 {
+			regulator-name = "vreg_s4c_1p8";
+			regulator-min-microvolt = <1856000>;
+			regulator-max-microvolt = <2000000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l1c_1p2: ldo1 {
+			regulator-name = "vreg_l1c_1p2";
+			regulator-min-microvolt = <1200000>;
+			regulator-max-microvolt = <1200000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l2c_0p8: ldo2 {
+			regulator-name = "vreg_l2c_0p8";
+			regulator-min-microvolt = <880000>;
+			regulator-max-microvolt = <880000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l3c_0p8: ldo3 {
+			regulator-name = "vreg_l3c_0p8";
+			regulator-min-microvolt = <912000>;
+			regulator-max-microvolt = <912000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+	};
+
+	regulators-2 {
+		compatible = "qcom,pmc8380-rpmh-regulators";
+		qcom,pmic-id = "d";
+
+		vdd-l1-supply = <&vreg_s1f_0p7>;
+		vdd-l2-supply = <&vreg_s1f_0p7>;
+		vdd-l3-supply = <&vreg_s4c_1p8>;
+		vdd-s1-supply = <&vph_pwr>;
+
+		vreg_l1d_0p8: ldo1 {
+			regulator-name = "vreg_l1d_0p8";
+			regulator-min-microvolt = <880000>;
+			regulator-max-microvolt = <880000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l2d_0p9: ldo2 {
+			regulator-name = "vreg_l2d_0p9";
+			regulator-min-microvolt = <912000>;
+			regulator-max-microvolt = <912000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l3d_1p8: ldo3 {
+			regulator-name = "vreg_l3d_1p8";
+			regulator-min-microvolt = <1800000>;
+			regulator-max-microvolt = <1800000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+	};
+
+	regulators-3 {
+		compatible = "qcom,pmc8380-rpmh-regulators";
+		qcom,pmic-id = "e";
+
+		vdd-l2-supply = <&vreg_s1f_0p7>;
+		vdd-l3-supply = <&vreg_s5j_1p2>;
+
+		vreg_l2e_0p8: ldo2 {
+			regulator-name = "vreg_l2e_0p8";
+			regulator-min-microvolt = <880000>;
+			regulator-max-microvolt = <880000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l3e_1p2: ldo3 {
+			regulator-name = "vreg_l3e_1p2";
+			regulator-min-microvolt = <1200000>;
+			regulator-max-microvolt = <1200000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+	};
+
+	regulators-4 {
+		compatible = "qcom,pmc8380-rpmh-regulators";
+		qcom,pmic-id = "f";
+
+		vdd-l1-supply = <&vreg_s5j_1p2>;
+		vdd-l2-supply = <&vreg_s5j_1p2>;
+		vdd-l3-supply = <&vreg_s5j_1p2>;
+		vdd-s1-supply = <&vph_pwr>;
+
+		vreg_s1f_0p7: smps1 {
+			regulator-name = "vreg_s1f_0p7";
+			regulator-min-microvolt = <700000>;
+			regulator-max-microvolt = <1100000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l1f_1p0: ldo1 {
+			regulator-name = "vreg_l1f_1p0";
+			regulator-min-microvolt = <1024000>;
+			regulator-max-microvolt = <1024000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l2f_1p0: ldo2 {
+			regulator-name = "vreg_l2f_1p0";
+			regulator-min-microvolt = <1024000>;
+			regulator-max-microvolt = <1024000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l3f_1p0: ldo3 {
+			regulator-name = "vreg_l3f_1p0";
+			regulator-min-microvolt = <1024000>;
+			regulator-max-microvolt = <1024000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+	};
+
+	regulators-6 {
+		compatible = "qcom,pm8550ve-rpmh-regulators";
+		qcom,pmic-id = "i";
+
+		vdd-l1-supply = <&vreg_s4c_1p8>;
+		vdd-l2-supply = <&vreg_s5j_1p2>;
+		vdd-l3-supply = <&vreg_s1f_0p7>;
+		vdd-s1-supply = <&vph_pwr>;
+		vdd-s2-supply = <&vph_pwr>;
+
+		vreg_l1i_1p8: ldo1 {
+			regulator-name = "vreg_l1i_1p8";
+			regulator-min-microvolt = <1800000>;
+			regulator-max-microvolt = <1800000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+			regulator-always-on;
+		};
+
+		vreg_l2i_1p2: ldo2 {
+			regulator-name = "vreg_l2i_1p2";
+			regulator-min-microvolt = <1200000>;
+			regulator-max-microvolt = <1200000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l3i_0p8: ldo3 {
+			regulator-name = "vreg_l3i_0p8";
+			regulator-min-microvolt = <880000>;
+			regulator-max-microvolt = <880000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_s1i_0p9: smps1 {
+			regulator-name = "vreg_s1i_0p9";
+			regulator-min-microvolt = <900000>;
+			regulator-max-microvolt = <920000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_s2i_1p0: smps2 {
+			regulator-name = "vreg_s2i_1p0";
+			regulator-min-microvolt = <1000000>;
+			regulator-max-microvolt = <1100000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+	};
+
+	regulators-7 {
+		compatible = "qcom,pm8550ve-rpmh-regulators";
+		qcom,pmic-id = "j";
+
+		vdd-l1-supply = <&vreg_s1f_0p7>;
+		vdd-l2-supply = <&vreg_s5j_1p2>;
+		vdd-l3-supply = <&vreg_s1f_0p7>;
+		vdd-s5-supply = <&vph_pwr>;
+
+		vreg_s5j_1p2: smps5 {
+			regulator-name = "vreg_s5j_1p2";
+			regulator-min-microvolt = <1256000>;
+			regulator-max-microvolt = <1304000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l1j_0p8: ldo1 {
+			regulator-name = "vreg_l1j_0p8";
+			regulator-min-microvolt = <912000>;
+			regulator-max-microvolt = <912000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l2j_1p2: ldo2 {
+			regulator-name = "vreg_l2j_1p2";
+			regulator-min-microvolt = <1256000>;
+			regulator-max-microvolt = <1256000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+
+		vreg_l3j_0p8: ldo3 {
+			regulator-name = "vreg_l3j_0p8";
+			regulator-min-microvolt = <880000>;
+			regulator-max-microvolt = <880000>;
+			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+		};
+	};
+};
+
+&gpu {
+	status = "okay";
+
+	zap-shader {
+		firmware-name = "qcom/x1e80100/LENOVO/21NH/qcdxkmsucpurwa.mbn";
+	};
+};
+
+&i2c2 {
+	clock-frequency = <400000>;
+
+	pinctrl-0 = <&qup_i2c2_data_clk>, <&tpad_default>, <&kybd_default>;
+	pinctrl-names = "default";
+	status = "okay";
+
+	/* ELAN06FA */
+	touchpad@15 {
+		compatible = "hid-over-i2c";
+		reg = <0x15>;
+
+		hid-descr-addr = <0x1>;
+		interrupts-extended = <&tlmm 3 IRQ_TYPE_LEVEL_LOW>;
+
+		vdd-supply = <&vreg_misc_3p3>;
+		vddl-supply = <&vreg_l12b_1p2>;
+
+		wakeup-source;
+	};
+
+	/* CIRQ1080 or SYNA2BA6 */
+	touchpad@2c {
+		compatible = "hid-over-i2c";
+		reg = <0x2c>;
+
+		hid-descr-addr = <0x20>;
+		interrupts-extended = <&tlmm 3 IRQ_TYPE_LEVEL_LOW>;
+
+		vdd-supply = <&vreg_misc_3p3>;
+		vddl-supply = <&vreg_l12b_1p2>;
+
+		wakeup-source;
+	};
+
+	/* FTCS0038 */
+	touchpad@38 {
+		compatible = "hid-over-i2c";
+		reg = <0x38>;
+
+		hid-descr-addr = <0x1>;
+		interrupts-extended = <&tlmm 3 IRQ_TYPE_LEVEL_LOW>;
+
+		vdd-supply = <&vreg_misc_3p3>;
+		vddl-supply = <&vreg_l12b_1p2>;
+
+		wakeup-source;
+	};
+
+	keyboard@3a {
+		compatible = "hid-over-i2c";
+		reg = <0x3a>;
+
+		hid-descr-addr = <0x1>;
+		interrupts-extended = <&tlmm 67 IRQ_TYPE_LEVEL_LOW>;
+
+		vdd-supply = <&vreg_misc_3p3>;
+		vddl-supply = <&vreg_l12b_1p2>;
+
+		wakeup-source;
+	};
+
+	/* GXTP5100 */
+	touchpad@5d {
+		compatible = "hid-over-i2c";
+		reg = <0x5d>;
+
+		hid-descr-addr = <0x1>;
+		interrupts-extended = <&tlmm 3 IRQ_TYPE_LEVEL_LOW>;
+
+		vdd-supply = <&vreg_misc_3p3>;
+		vddl-supply = <&vreg_l12b_1p2>;
+
+		wakeup-source;
+	};
+};
+
+&i2c5 {
+	clock-frequency = <400000>;
+
+	status = "okay";
+
+	eusb5_repeater: redriver@43 {
+		compatible = "nxp,ptn3222";
+		reg = <0x43>;
+		#phy-cells = <0>;
+
+		vdd3v3-supply = <&vreg_l13b_3p0>;
+		vdd1v8-supply = <&vreg_l4b_1p8>;
+	};
+
+	eusb3_repeater: redriver@47 {
+		compatible = "nxp,ptn3222";
+		reg = <0x47>;
+		#phy-cells = <0>;
+
+		vdd3v3-supply = <&vreg_l13b_3p0>;
+		vdd1v8-supply = <&vreg_l4b_1p8>;
+
+		reset-gpios = <&tlmm 6 GPIO_ACTIVE_LOW>;
+
+		pinctrl-0 = <&eusb3_reset_n>;
+		pinctrl-names = "default";
+	};
+
+	eusb9_repeater: redriver@4b {
+		compatible = "nxp,ptn3222";
+		reg = <0x4b>;
+		#phy-cells = <0>;
+
+		vdd3v3-supply = <&vreg_l13b_3p0>;
+		vdd1v8-supply = <&vreg_l4b_1p8>;
+
+		reset-gpios = <&tlmm 7 GPIO_ACTIVE_LOW>;
+
+		pinctrl-0 = <&eusb9_reset_n>;
+		pinctrl-names = "default";
+	};
+
+	eusb6_repeater: redriver@4f {
+		compatible = "nxp,ptn3222";
+		reg = <0x4f>;
+		#phy-cells = <0>;
+
+		vdd3v3-supply = <&vreg_l13b_3p0>;
+		vdd1v8-supply = <&vreg_l4b_1p8>;
+
+		reset-gpios = <&tlmm 184 GPIO_ACTIVE_LOW>;
+
+		pinctrl-0 = <&eusb6_reset_n>;
+		pinctrl-names = "default";
+	};
+};
+
+&i2c8 {
+	clock-frequency = <400000>;
+
+	status = "okay";
+
+	/* ILIT2911 or GTCH1563 */
+	touchscreen@10 {
+		compatible = "hid-over-i2c";
+		reg = <0x10>;
+
+		hid-descr-addr = <0x1>;
+		interrupts-extended = <&tlmm 51 IRQ_TYPE_LEVEL_LOW>;
+
+		vdd-supply = <&vreg_misc_3p3>;
+		vddl-supply = <&vreg_l15b_1p8>;
+
+		pinctrl-0 = <&ts0_default>;
+		pinctrl-names = "default";
+	};
+};
+
+&lpass_tlmm {
+	spkr_01_sd_n_active: spkr-01-sd-n-active-state {
+		pins = "gpio12";
+		function = "gpio";
+		drive-strength = <16>;
+		bias-disable;
+		output-low;
+	};
+};
+
+&lpass_vamacro {
+	pinctrl-0 = <&dmic01_default>, <&dmic23_default>;
+	pinctrl-names = "default";
+
+	vdd-micb-supply = <&vreg_l1b_1p8>;
+	qcom,dmic-sample-rate = <4800000>;
+};
+
+&mdss {
+	status = "okay";
+};
+
+&mdss_dp0 {
+	status = "okay";
+};
+
+&mdss_dp0_out {
+	data-lanes = <0 1>;
+	link-frequencies = /bits/ 64 <1620000000 2700000000 5400000000 8100000000>;
+};
+
+&mdss_dp1 {
+	status = "okay";
+};
+
+&mdss_dp1_out {
+	data-lanes = <0 1>;
+	link-frequencies = /bits/ 64 <1620000000 2700000000 5400000000 8100000000>;
+};
+
+&mdss_dp3 {
+	/delete-property/ #sound-dai-cells;
+
+	status = "okay";
+
+	aux-bus {
+		panel {
+			compatible = "edp-panel";
+
+			backlight = <&backlight>;
+
+			enable-gpios = <&pmc8380_3_gpios 4 GPIO_ACTIVE_HIGH>;
+			pinctrl-0 = <&edp_bl_en>;
+			pinctrl-names = "default";
+
+			power-supply = <&vreg_edp_3p3>;
+
+			port {
+				edp_panel_in: endpoint {
+					remote-endpoint = <&mdss_dp3_out>;
+				};
+			};
+		};
+	};
+
+	ports {
+		port@1 {
+			reg = <1>;
+
+			mdss_dp3_out: endpoint {
+				data-lanes = <0 1 2 3>;
+				link-frequencies = /bits/ 64 <1620000000 2700000000 5400000000 8100000000>;
+
+				remote-endpoint = <&edp_panel_in>;
+			};
+		};
+	};
+};
+
+&mdss_dp3_phy {
+	vdda-phy-supply = <&vreg_l3j_0p8>;
+	vdda-pll-supply = <&vreg_l2j_1p2>;
+
+	status = "okay";
+};
+
+&pcie4 {
+	perst-gpios = <&tlmm 146 GPIO_ACTIVE_LOW>;
+	wake-gpios = <&tlmm 148 GPIO_ACTIVE_LOW>;
+
+	pinctrl-0 = <&pcie4_default>;
+	pinctrl-names = "default";
+
+	status = "okay";
+};
+
+&pcie4_phy {
+	vdda-phy-supply = <&vreg_l3i_0p8>;
+	vdda-pll-supply = <&vreg_l3e_1p2>;
+
+	status = "okay";
+};
+
+&pcie4_port0 {
+	wifi@0 {
+		compatible = "pci17cb,1107";
+		reg = <0x10000 0x0 0x0 0x0 0x0>;
+
+		vddaon-supply = <&vreg_pmu_aon_0p59>;
+		vddwlcx-supply = <&vreg_pmu_wlcx_0p8>;
+		vddwlmx-supply = <&vreg_pmu_wlmx_0p85>;
+		vddrfacmn-supply = <&vreg_pmu_rfa_cmn>;
+		vddrfa0p8-supply = <&vreg_pmu_rfa_0p8>;
+		vddrfa1p2-supply = <&vreg_pmu_rfa_1p2>;
+		vddrfa1p8-supply = <&vreg_pmu_rfa_1p8>;
+		vddpcie0p9-supply = <&vreg_pmu_pcie_0p9>;
+		vddpcie1p8-supply = <&vreg_pmu_pcie_1p8>;
+	};
+};
+
+&pcie6a {
+	perst-gpios = <&tlmm 152 GPIO_ACTIVE_LOW>;
+	wake-gpios = <&tlmm 154 GPIO_ACTIVE_LOW>;
+
+	vddpe-3v3-supply = <&vreg_nvme>;
+
+	pinctrl-0 = <&pcie6a_default>;
+	pinctrl-names = "default";
+
+	status = "okay";
+};
+
+&pcie6a_phy {
+	vdda-phy-supply = <&vreg_l1d_0p8>;
+	vdda-pll-supply = <&vreg_l2j_1p2>;
+
+	status = "okay";
+};
+
+&pm8550_pwm {
+	status = "okay";
+};
+
+&pm8550ve_8_gpios {
+	misc_3p3_reg_en: misc-3p3-reg-en-state {
+		pins = "gpio6";
+		function = "normal";
+		bias-disable;
+		input-disable;
+		output-enable;
+		drive-push-pull;
+		power-source = <1>; /* 1.8 V */
+		qcom,drive-strength = <PMIC_GPIO_STRENGTH_LOW>;
+	};
+};
+
+&pmc8380_3_gpios {
+	edp_bl_en: edp-bl-en-state {
+		pins = "gpio4";
+		function = "normal";
+		power-source = <1>; /* 1.8V */
+		input-disable;
+		output-enable;
+	};
+
+	edp_bl_reg_en: edp-bl-reg-en-state {
+		pins = "gpio10";
+		function = "normal";
+	};
+};
+
+&qupv3_0 {
+	status = "okay";
+};
+
+&qupv3_1 {
+	status = "okay";
+};
+
+&qupv3_2 {
+	status = "okay";
+};
+
+&remoteproc_adsp {
+	firmware-name = "qcom/x1e80100/LENOVO/21NH/qcadsp8380.mbn",
+			"qcom/x1e80100/LENOVO/21NH/adsp_dtbs.elf";
+
+	status = "okay";
+};
+
+&remoteproc_cdsp {
+	firmware-name = "qcom/x1e80100/LENOVO/21NH/qccdsp8380.mbn",
+			"qcom/x1e80100/LENOVO/21NH/cdsp_dtbs.elf";
+
+	status = "okay";
+};
+
+&sdhc_2 {
+	cd-gpios = <&tlmm 71 GPIO_ACTIVE_LOW>;
+	pinctrl-0 = <&sdc2_default &sdc2_card_det_n>;
+	pinctrl-1 = <&sdc2_sleep &sdc2_card_det_n>;
+	pinctrl-names = "default", "sleep";
+	vmmc-supply = <&vreg_l9b_2p9>;
+	vqmmc-supply = <&vreg_l6b_1p8>;
+	status = "okay";
+};
+
+&smb2360_0 {
+	status = "okay";
+};
+
+&smb2360_0_eusb2_repeater {
+	vdd18-supply = <&vreg_l3d_1p8>;
+	vdd3-supply = <&vreg_l2b_3p0>;
+};
+
+&smb2360_1 {
+	status = "okay";
+};
+
+&smb2360_1_eusb2_repeater {
+	vdd18-supply = <&vreg_l3d_1p8>;
+	vdd3-supply = <&vreg_l14b_3p0>;
+};
+
+&swr0 {
+	status = "okay";
+
+	pinctrl-0 = <&wsa_swr_active>, <&spkr_01_sd_n_active>;
+	pinctrl-names = "default";
+
+	/* WSA8845, Left Speaker */
+	left_spkr: speaker@0,0 {
+		compatible = "sdw20217020400";
+		reg = <0 0>;
+		reset-gpios = <&lpass_tlmm 12 GPIO_ACTIVE_LOW>;
+		#sound-dai-cells = <0>;
+		sound-name-prefix = "SpkrLeft";
+		vdd-1p8-supply = <&vreg_l15b_1p8>;
+		vdd-io-supply = <&vreg_l12b_1p2>;
+		qcom,port-mapping = <1 2 3 7 10 13>;
+	};
+
+	/* WSA8845, Right Speaker */
+	right_spkr: speaker@0,1 {
+		compatible = "sdw20217020400";
+		reg = <0 1>;
+		reset-gpios = <&lpass_tlmm 12 GPIO_ACTIVE_LOW>;
+		#sound-dai-cells = <0>;
+		sound-name-prefix = "SpkrRight";
+		vdd-1p8-supply = <&vreg_l15b_1p8>;
+		vdd-io-supply = <&vreg_l12b_1p2>;
+		qcom,port-mapping = <4 5 6 7 11 13>;
+	};
+};
+
+&swr1 {
+	status = "okay";
+
+	/* WCD9385 RX */
+	wcd_rx: codec@0,4 {
+		compatible = "sdw20217010d00";
+		reg = <0 4>;
+		qcom,rx-port-mapping = <1 2 3 4 5>;
+	};
+};
+
+&swr2 {
+	status = "okay";
+
+	/* WCD9385 TX */
+	wcd_tx: codec@0,3 {
+		compatible = "sdw20217010d00";
+		reg = <0 3>;
+		qcom,tx-port-mapping = <2 2 3 4>;
+	};
+};
+
+&tlmm {
+	gpio-reserved-ranges = <34 2>, /* Unused */
+		<72 2>, /* Secure EC I2C connection (?) */
+		<238 1>; /* UFS Reset */
+
+	cam_reg_en: cam-reg-en-state {
+		pins = "gpio44";
+		function = "gpio";
+		drive-strength = <16>;
+		bias-disable;
+	};
+
+	eusb3_reset_n: eusb3-reset-n-state {
+		pins = "gpio6";
+		function = "gpio";
+		drive-strength = <2>;
+		bias-disable;
+		output-low;
+	};
+
+	eusb6_reset_n: eusb6-reset-n-state {
+		pins = "gpio184";
+		function = "gpio";
+		drive-strength = <2>;
+		bias-disable;
+		output-low;
+	};
+
+	eusb9_reset_n: eusb9-reset-n-state {
+		pins = "gpio7";
+		function = "gpio";
+		drive-strength = <2>;
+		bias-disable;
+		output-low;
+	};
+
+	edp_reg_en: edp-reg-en-state {
+		pins = "gpio70";
+		function = "gpio";
+		drive-strength = <16>;
+		bias-disable;
+	};
+
+	hall_int_n_default: hall-int-n-state {
+		pins = "gpio92";
+		function = "gpio";
+		bias-disable;
+	};
+
+	kybd_default: kybd-default-state {
+		pins = "gpio67";
+		function = "gpio";
+		bias-disable;
+	};
+
+	nvme_reg_en: nvme-reg-en-state {
+		pins = "gpio18";
+		function = "gpio";
+		drive-strength = <2>;
+		bias-disable;
+	};
+
+	pcie4_default: pcie4-default-state {
+		clkreq-n-pins {
+			pins = "gpio147";
+			function = "pcie4_clk";
+			drive-strength = <2>;
+			bias-pull-up;
+		};
+
+		perst-n-pins {
+			pins = "gpio146";
+			function = "gpio";
+			drive-strength = <2>;
+			bias-disable;
+		};
+
+		wake-n-pins {
+			pins = "gpio148";
+			function = "gpio";
+			drive-strength = <2>;
+			bias-pull-up;
+		};
+	};
+
+	pcie6a_default: pcie6a-default-state {
+		clkreq-n-pins {
+			pins = "gpio153";
+			function = "pcie6a_clk";
+			drive-strength = <2>;
+			bias-pull-up;
+		};
+
+		perst-n-pins {
+			pins = "gpio152";
+			function = "gpio";
+			drive-strength = <2>;
+			bias-disable;
+		};
+
+		wake-n-pins {
+			pins = "gpio154";
+			function = "gpio";
+			drive-strength = <2>;
+			bias-pull-up;
+		};
+	};
+
+	sdc2_card_det_n: sdc2-card-det-state {
+		pins = "gpio71";
+		function = "gpio";
+		drive-strength = <2>;
+		bias-pull-up;
+	};
+
+	tpad_default: tpad-default-state {
+		pins = "gpio3";
+		function = "gpio";
+		bias-pull-up;
+	};
+
+	ts0_default: ts0-default-state {
+		int-n-pins {
+			pins = "gpio51";
+			function = "gpio";
+			bias-disable;
+		};
+
+		reset-n-pins {
+			pins = "gpio48";
+			function = "gpio";
+			output-high;
+			drive-strength = <16>;
+		};
+	};
+
+	usb_1_ss0_sbu_default: usb-1-ss0-sbu-state {
+		mode-pins {
+			pins = "gpio166";
+			function = "gpio";
+			bias-disable;
+			drive-strength = <2>;
+			output-high;
+		};
+
+		oe-n-pins {
+			pins = "gpio168";
+			function = "gpio";
+			bias-disable;
+			drive-strength = <2>;
+		};
+
+		sel-pins {
+			pins = "gpio167";
+			function = "gpio";
+			bias-disable;
+			drive-strength = <2>;
+		};
+
+	};
+
+	usb_1_ss1_sbu_default: usb-1-ss1-sbu-state {
+		mode-pins {
+			pins = "gpio177";
+			function = "gpio";
+			bias-disable;
+			drive-strength = <2>;
+			output-high;
+		};
+
+		oe-n-pins {
+			pins = "gpio179";
+			function = "gpio";
+			bias-disable;
+			drive-strength = <2>;
+		};
+
+		sel-pins {
+			pins = "gpio178";
+			function = "gpio";
+			bias-disable;
+			drive-strength = <2>;
+		};
+	};
+
+	wcd_default: wcd-reset-n-active-state {
+		pins = "gpio191";
+		function = "gpio";
+		drive-strength = <16>;
+		bias-disable;
+		output-low;
+	};
+
+	wcn_bt_en: wcn-bt-en-state {
+		pins = "gpio116";
+		function = "gpio";
+		drive-strength = <16>;
+		output-low;
+		bias-pull-down;
+	};
+
+	wcn_sw_en: wcn-sw-en-state {
+		pins = "gpio214";
+		function = "gpio";
+		drive-strength = <16>;
+		bias-disable;
+	};
+
+	wcn_wlan_en: wcn-wlan-en-state {
+		pins = "gpio117";
+		function = "gpio";
+		drive-strength = <16>;
+		bias-disable;
+	};
+};
+
+&uart14 {
+	status = "okay";
+
+	bluetooth {
+		compatible = "qcom,wcn7850-bt";
+		max-speed = <3200000>;
+
+		vddaon-supply = <&vreg_pmu_aon_0p59>;
+		vddwlcx-supply = <&vreg_pmu_wlcx_0p8>;
+		vddwlmx-supply = <&vreg_pmu_wlmx_0p85>;
+		vddrfacmn-supply = <&vreg_pmu_rfa_cmn>;
+		vddrfa0p8-supply = <&vreg_pmu_rfa_0p8>;
+		vddrfa1p2-supply = <&vreg_pmu_rfa_1p2>;
+		vddrfa1p8-supply = <&vreg_pmu_rfa_1p8>;
+	};
+};
+
+&usb_1_ss0_hsphy {
+	vdd-supply = <&vreg_l3j_0p8>;
+	vdda12-supply = <&vreg_l2j_1p2>;
+
+	phys = <&smb2360_0_eusb2_repeater>;
+
+	status = "okay";
+};
+
+&usb_1_ss0_qmpphy {
+	vdda-phy-supply = <&vreg_l3e_1p2>;
+	vdda-pll-supply = <&vreg_l1j_0p8>;
+
+	status = "okay";
+};
+
+&usb_1_ss0 {
+	status = "okay";
+};
+
+&usb_1_ss0_dwc3 {
+	dr_mode = "host";
+};
+
+&usb_1_ss0_dwc3_hs {
+	remote-endpoint = <&pmic_glink_ss0_hs_in>;
+};
+
+&usb_1_ss0_qmpphy_out {
+	remote-endpoint = <&pmic_glink_ss0_ss_in>;
+};
+
+&usb_1_ss1_hsphy {
+	vdd-supply = <&vreg_l3j_0p8>;
+	vdda12-supply = <&vreg_l2j_1p2>;
+
+	phys = <&smb2360_1_eusb2_repeater>;
+
+	status = "okay";
+};
+
+&usb_1_ss1_qmpphy {
+	vdda-phy-supply = <&vreg_l2j_1p2>;
+	vdda-pll-supply = <&vreg_l2d_0p9>;
+
+	status = "okay";
+};
+
+&usb_1_ss1 {
+	status = "okay";
+};
+
+&usb_1_ss1_dwc3 {
+	dr_mode = "host";
+};
+
+&usb_1_ss1_dwc3_hs {
+	remote-endpoint = <&pmic_glink_ss1_hs_in>;
+};
+
+&usb_1_ss1_qmpphy_out {
+	remote-endpoint = <&pmic_glink_ss1_ss_in>;
+};
+
+&usb_1_ss2 {
+	status = "okay";
+};
+
+&usb_1_ss2_dwc3 {
+	dr_mode = "host";
+	maximum-speed = "high-speed";
+	phys = <&usb_1_ss2_hsphy>;
+	phy-names = "usb2-phy";
+};
+
+&usb_1_ss2_hsphy {
+	vdd-supply = <&vreg_l3j_0p8>;
+	vdda12-supply = <&vreg_l2j_1p2>;
+
+	phys = <&eusb5_repeater>;
+
+	status = "okay";
+};
+
+&usb_2 {
+	status = "okay";
+};
+
+&usb_2_dwc3 {
+	dr_mode = "host";
+};
+
+&usb_2_hsphy {
+	vdd-supply = <&vreg_l2e_0p8>;
+	vdda12-supply = <&vreg_l3e_1p2>;
+
+	phys = <&eusb9_repeater>;
+
+	status = "okay";
+};
+
+&usb_mp {
+	status = "okay";
+};
+
+&usb_mp_hsphy0 {
+	vdd-supply = <&vreg_l2e_0p8>;
+	vdda12-supply = <&vreg_l3e_1p2>;
+
+	phys = <&eusb6_repeater>;
+
+	status = "okay";
+};
+
+&usb_mp_qmpphy0 {
+	vdda-phy-supply = <&vreg_l3e_1p2>;
+	vdda-pll-supply = <&vreg_l3c_0p8>;
+
+	status = "okay";
+};
+
+&usb_mp_hsphy1 {
+	vdd-supply = <&vreg_l2e_0p8>;
+	vdda12-supply = <&vreg_l3e_1p2>;
+
+	phys = <&eusb3_repeater>;
+
+	status = "okay";
+};
+
+&usb_mp_qmpphy1 {
+	vdda-phy-supply = <&vreg_l3e_1p2>;
+	vdda-pll-supply = <&vreg_l3c_0p8>;
+
+	status = "okay";
+};