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 |
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 > >
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
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
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
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.
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
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
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 --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"; +};