diff mbox series

[v5,4/4] arm64: dts: qcom: thinkpad-x13s: Add bluetooth

Message ID 20230209020916.6475-5-steev@kali.org
State New
Headers show
Series Add WCN6855 Bluetooth support | expand

Commit Message

Steev Klimaszewski Feb. 9, 2023, 2:09 a.m. UTC
The Lenovo Thinkpad X13s has a WCN6855 Bluetooth controller on uart2,
add this.

Signed-off-by: Steev Klimaszewski <steev@kali.org>
Link: https://lore.kernel.org/r/20230207052829.3996-5-steev@kali.org
---
Changes since v4:
 * Address Konrad's review comments.

Changes since v3:
 * Add vreg_s1c
 * Add regulators and not dead code
 * Fix commit message changelog

Changes since v2:
 * Remove dead code and add TODO comment
 * Make dtbs_check happy with the pin definitions
 .../qcom/sc8280xp-lenovo-thinkpad-x13s.dts    | 76 +++++++++++++++++++
 1 file changed, 76 insertions(+)

Comments

Johan Hovold March 9, 2023, 5:25 p.m. UTC | #1
On Wed, Feb 08, 2023 at 08:09:16PM -0600, Steev Klimaszewski wrote:
> The Lenovo Thinkpad X13s has a WCN6855 Bluetooth controller on uart2,
> add this.
> 
> Signed-off-by: Steev Klimaszewski <steev@kali.org>
> Link: https://lore.kernel.org/r/20230207052829.3996-5-steev@kali.org

This link should not be needed.

Also, please update the patch Subject to use the following prefix:

	arm64: dts: qcom: sc8280xp-x13s: ...

> ---
> Changes since v4:
>  * Address Konrad's review comments.
> 
> Changes since v3:
>  * Add vreg_s1c
>  * Add regulators and not dead code
>  * Fix commit message changelog
> 
> Changes since v2:
>  * Remove dead code and add TODO comment
>  * Make dtbs_check happy with the pin definitions
>  .../qcom/sc8280xp-lenovo-thinkpad-x13s.dts    | 76 +++++++++++++++++++
>  1 file changed, 76 insertions(+)
> 
> diff --git a/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts b/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts
> index f936b020a71d..ad20cfb3a830 100644
> --- a/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts
> +++ b/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts
> @@ -24,6 +24,8 @@ / {
>  	aliases {
>  		i2c4 = &i2c4;
>  		i2c21 = &i2c21;
> +		serial0 = &uart17;

This is an unrelated change that does not belong in this patch.

> +		serial1 = &uart2;
>  	};
>  
>  	wcd938x: audio-codec {
> @@ -297,6 +299,15 @@ pmc8280c-rpmh-regulators {
>  		qcom,pmic-id = "c";
>  		vdd-bob-supply = <&vreg_vph_pwr>;
>  
> +		vreg_s1c: smps1 {
> +			regulator-name = "vreg_s1c";
> +			regulator-min-microvolt = <1880000>;
> +			regulator-max-microvolt = <1900000>;
> +			regulator-allowed-modes = <RPMH_REGULATOR_MODE_AUTO>,
> +						  <RPMH_REGULATOR_MODE_RET>;
> +			regulator-allow-set-load;

Don't you need to specify initial-mode as well?

> +		};
> +
>  		vreg_l1c: ldo1 {
>  			regulator-name = "vreg_l1c";
>  			regulator-min-microvolt = <1800000>;
> @@ -712,6 +723,32 @@ &qup0 {
>  	status = "okay";
>  };
>  
> +&uart2 {
> +	pinctrl-0 = <&uart2_state>;
> +	pinctrl-names = "default";
> +
> +	status = "okay";
> +
> +	bluetooth {
> +		compatible = "qcom,wcn6855-bt";
> +
> +		vddio-supply = <&vreg_s10b>;
> +		vddbtcxmx-supply = <&vreg_s12b>;
> +		vddrfacmn-supply = <&vreg_s12b>;
> +		vddrfa0p8-supply = <&vreg_s12b>;
> +		vddrfa1p2-supply = <&vreg_s11b>;
> +		vddrfa1p7-supply = <&vreg_s1c>;
> +
> +		max-speed = <3200000>;
> +
> +		enable-gpios = <&tlmm 133 GPIO_ACTIVE_HIGH>;
> +		swctrl-gpios = <&tlmm 132 GPIO_ACTIVE_HIGH>;
> +
> +		pinctrl-0 = <&bt_en>;
> +		pinctrl-names = "default";
> +	};
> +};
> +
>  &qup1 {
>  	status = "okay";
>  };
> @@ -720,6 +757,11 @@ &qup2 {
>  	status = "okay";
>  };
>  
> +&uart17 {
> +	compatible = "qcom,geni-debug-uart";
> +	status = "okay";
> +};

This bit does not belong here either. We don't have any means of
accessing the debug uart on the X13s so we should probably just leave it
disabled.

> +
>  &remoteproc_adsp {
>  	firmware-name = "qcom/sc8280xp/LENOVO/21BX/qcadsp8280.mbn";
>  
> @@ -980,6 +1022,19 @@ hastings_reg_en: hastings-reg-en-state {
>  &tlmm {
>  	gpio-reserved-ranges = <70 2>, <74 6>, <83 4>, <125 2>, <128 2>, <154 7>;
>  
> +	bt_en: bt-en-state {

As you are configuring more than one pin, please rename this as:

	bt_default: bt-default-state

> +		hstp-sw-ctrl-pins {
> +			pins = "gpio132";
> +			function = "gpio";

You should define the bias configuration as well. I guess we need to
keep the default pull-down enabled.

> +		};
> +
> +		hstp-bt-en-pins {
> +			pins = "gpio133";
> +			function = "gpio";
> +			drive-strength = <16>;

bias-disable?

> +		};
> +	};
> +
>  	edp_reg_en: edp-reg-en-state {
>  		pins = "gpio25";
>  		function = "gpio";
> @@ -1001,6 +1056,27 @@ i2c4_default: i2c4-default-state {
>  		bias-disable;
>  	};
>  
> +	uart2_state: uart2-state {

Rename this one too:

	uart2_default: uart2-default-state

> +		cts-pins {
> +			pins = "gpio122";

This should be gpio121 (gpio122 is rts).

> +			function = "qup2";
> +			bias-disable;

Don't we need a pull-down on this one to avoid a floating input when the
module is powered down?

> +		};
> +
> +		rts-tx-pins {

Please split this in two nodes.

> +			pins = "gpio122", "gpio123";
> +			function = "qup2";
> +			drive-strength = <2>;
> +			bias-disable;
> +		};
> +
> +		rx-pins {
> +			pins = "gpio124";
> +			function = "qup2";
> +			bias-pull-up;
> +		};
> +	};
> +
>  	i2c21_default: i2c21-default-state {
>  		pins = "gpio81", "gpio82";
>  		function = "qup21";

Johan
Steev Klimaszewski March 9, 2023, 8:07 p.m. UTC | #2
On Thu, Mar 9, 2023 at 11:24 AM Johan Hovold <johan@kernel.org> wrote:
>
> On Wed, Feb 08, 2023 at 08:09:16PM -0600, Steev Klimaszewski wrote:
> > The Lenovo Thinkpad X13s has a WCN6855 Bluetooth controller on uart2,
> > add this.
> >
> > Signed-off-by: Steev Klimaszewski <steev@kali.org>
> > Link: https://lore.kernel.org/r/20230207052829.3996-5-steev@kali.org
>
> This link should not be needed.
>
> Also, please update the patch Subject to use the following prefix:
>
>         arm64: dts: qcom: sc8280xp-x13s: ...
>

Yeah, that was me screwing up my  patch, will make those changes for v6

> > ---
> > Changes since v4:
> >  * Address Konrad's review comments.
> >
> > Changes since v3:
> >  * Add vreg_s1c
> >  * Add regulators and not dead code
> >  * Fix commit message changelog
> >
> > Changes since v2:
> >  * Remove dead code and add TODO comment
> >  * Make dtbs_check happy with the pin definitions
> >  .../qcom/sc8280xp-lenovo-thinkpad-x13s.dts    | 76 +++++++++++++++++++
> >  1 file changed, 76 insertions(+)
> >
> > diff --git a/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts b/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts
> > index f936b020a71d..ad20cfb3a830 100644
> > --- a/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts
> > +++ b/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts
> > @@ -24,6 +24,8 @@ / {
> >       aliases {
> >               i2c4 = &i2c4;
> >               i2c21 = &i2c21;
> > +             serial0 = &uart17;
>
> This is an unrelated change that does not belong in this patch.
>
> > +             serial1 = &uart2;
> >       };
> >
> >       wcd938x: audio-codec {
> > @@ -297,6 +299,15 @@ pmc8280c-rpmh-regulators {
> >               qcom,pmic-id = "c";
> >               vdd-bob-supply = <&vreg_vph_pwr>;
> >
> > +             vreg_s1c: smps1 {
> > +                     regulator-name = "vreg_s1c";
> > +                     regulator-min-microvolt = <1880000>;
> > +                     regulator-max-microvolt = <1900000>;
> > +                     regulator-allowed-modes = <RPMH_REGULATOR_MODE_AUTO>,
> > +                                               <RPMH_REGULATOR_MODE_RET>;
> > +                     regulator-allow-set-load;
>
> Don't you need to specify initial-mode as well?
>
> > +             };
> > +
> >               vreg_l1c: ldo1 {
> >                       regulator-name = "vreg_l1c";
> >                       regulator-min-microvolt = <1800000>;
> > @@ -712,6 +723,32 @@ &qup0 {
> >       status = "okay";
> >  };
> >
> > +&uart2 {
> > +     pinctrl-0 = <&uart2_state>;
> > +     pinctrl-names = "default";
> > +
> > +     status = "okay";
> > +
> > +     bluetooth {
> > +             compatible = "qcom,wcn6855-bt";
> > +
> > +             vddio-supply = <&vreg_s10b>;
> > +             vddbtcxmx-supply = <&vreg_s12b>;
> > +             vddrfacmn-supply = <&vreg_s12b>;
> > +             vddrfa0p8-supply = <&vreg_s12b>;
> > +             vddrfa1p2-supply = <&vreg_s11b>;
> > +             vddrfa1p7-supply = <&vreg_s1c>;
> > +
> > +             max-speed = <3200000>;
> > +
> > +             enable-gpios = <&tlmm 133 GPIO_ACTIVE_HIGH>;
> > +             swctrl-gpios = <&tlmm 132 GPIO_ACTIVE_HIGH>;
> > +
> > +             pinctrl-0 = <&bt_en>;
> > +             pinctrl-names = "default";
> > +     };
> > +};
> > +
> >  &qup1 {
> >       status = "okay";
> >  };
> > @@ -720,6 +757,11 @@ &qup2 {
> >       status = "okay";
> >  };
> >
> > +&uart17 {
> > +     compatible = "qcom,geni-debug-uart";
> > +     status = "okay";
> > +};
>
> This bit does not belong here either. We don't have any means of
> accessing the debug uart on the X13s so we should probably just leave it
> disabled.
>

Will drop it (and the above one as well)

> > +
> >  &remoteproc_adsp {
> >       firmware-name = "qcom/sc8280xp/LENOVO/21BX/qcadsp8280.mbn";
> >
> > @@ -980,6 +1022,19 @@ hastings_reg_en: hastings-reg-en-state {
> >  &tlmm {
> >       gpio-reserved-ranges = <70 2>, <74 6>, <83 4>, <125 2>, <128 2>, <154 7>;
> >
> > +     bt_en: bt-en-state {
>
> As you are configuring more than one pin, please rename this as:
>
>         bt_default: bt-default-state
>
> > +             hstp-sw-ctrl-pins {
> > +                     pins = "gpio132";
> > +                     function = "gpio";
>
> You should define the bias configuration as well. I guess we need to
> keep the default pull-down enabled.
>
> > +             };
> > +
> > +             hstp-bt-en-pins {
> > +                     pins = "gpio133";
> > +                     function = "gpio";
> > +                     drive-strength = <16>;
>
> bias-disable?
>
> > +             };
> > +     };
> > +
> >       edp_reg_en: edp-reg-en-state {
> >               pins = "gpio25";
> >               function = "gpio";
> > @@ -1001,6 +1056,27 @@ i2c4_default: i2c4-default-state {
> >               bias-disable;
> >       };
> >
> > +     uart2_state: uart2-state {
>
> Rename this one too:
>
>         uart2_default: uart2-default-state
>
> > +             cts-pins {
> > +                     pins = "gpio122";
>
> This should be gpio121 (gpio122 is rts).
>

You are right that it should be... however... if I actually set it to
be 121.... bluetooth doesn't actually come up/work?

> > +                     function = "qup2";
> > +                     bias-disable;
>
> Don't we need a pull-down on this one to avoid a floating input when the
> module is powered down?
>
Maybe?  I don't have access to the schematics or anything so I was
going with the best guess based on what worked by poking and prodding.
Will try this.


> > +             };
> > +
> > +             rts-tx-pins {
>
> Please split this in two nodes.
>
> > +                     pins = "gpio122", "gpio123";
> > +                     function = "qup2";
> > +                     drive-strength = <2>;
> > +                     bias-disable;
> > +             };
> > +
> > +             rx-pins {
> > +                     pins = "gpio124";
> > +                     function = "qup2";
> > +                     bias-pull-up;
> > +             };
> > +     };
> > +
> >       i2c21_default: i2c21-default-state {
> >               pins = "gpio81", "gpio82";
> >               function = "qup21";
>
> Johan
Johan Hovold March 10, 2023, 7:09 a.m. UTC | #3
On Thu, Mar 09, 2023 at 02:07:58PM -0600, Steev Klimaszewski wrote:
> On Thu, Mar 9, 2023 at 11:24 AM Johan Hovold <johan@kernel.org> wrote:
> > On Wed, Feb 08, 2023 at 08:09:16PM -0600, Steev Klimaszewski wrote:

> > > +     uart2_state: uart2-state {
> >
> > Rename this one too:
> >
> >         uart2_default: uart2-default-state
> >
> > > +             cts-pins {
> > > +                     pins = "gpio122";
> >
> > This should be gpio121 (gpio122 is rts).
> >
> 
> You are right that it should be... however... if I actually set it to
> be 121.... bluetooth doesn't actually come up/work?

I'm running with this fixed locally and it's working here.

Not muxing the cts-pin should break flow control (e.g. the host will
send data regardless of if the device signals that it's ready to receive
it).

> > > +                     function = "qup2";
> > > +                     bias-disable;
> >
> > Don't we need a pull-down on this one to avoid a floating input when the
> > module is powered down?
>
> Maybe?  I don't have access to the schematics or anything so I was
> going with the best guess based on what worked by poking and prodding.
> Will try this.

There are no external resistors and most of the Qualcomm boards with
these Bluetooth modules appear to enable the internal pull-down on cts.

But there are also two boards that recently switched to bias-bus-hold:

	3d0e375bae55 ("arm64: dts: qcom: sc7280-qcard: Configure CTS pin to bias-bus-hold for bluetooth")

to avoid leakage. Perhaps that's what we want here too.

Johan
diff mbox series

Patch

diff --git a/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts b/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts
index f936b020a71d..ad20cfb3a830 100644
--- a/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts
+++ b/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts
@@ -24,6 +24,8 @@  / {
 	aliases {
 		i2c4 = &i2c4;
 		i2c21 = &i2c21;
+		serial0 = &uart17;
+		serial1 = &uart2;
 	};
 
 	wcd938x: audio-codec {
@@ -297,6 +299,15 @@  pmc8280c-rpmh-regulators {
 		qcom,pmic-id = "c";
 		vdd-bob-supply = <&vreg_vph_pwr>;
 
+		vreg_s1c: smps1 {
+			regulator-name = "vreg_s1c";
+			regulator-min-microvolt = <1880000>;
+			regulator-max-microvolt = <1900000>;
+			regulator-allowed-modes = <RPMH_REGULATOR_MODE_AUTO>,
+						  <RPMH_REGULATOR_MODE_RET>;
+			regulator-allow-set-load;
+		};
+
 		vreg_l1c: ldo1 {
 			regulator-name = "vreg_l1c";
 			regulator-min-microvolt = <1800000>;
@@ -712,6 +723,32 @@  &qup0 {
 	status = "okay";
 };
 
+&uart2 {
+	pinctrl-0 = <&uart2_state>;
+	pinctrl-names = "default";
+
+	status = "okay";
+
+	bluetooth {
+		compatible = "qcom,wcn6855-bt";
+
+		vddio-supply = <&vreg_s10b>;
+		vddbtcxmx-supply = <&vreg_s12b>;
+		vddrfacmn-supply = <&vreg_s12b>;
+		vddrfa0p8-supply = <&vreg_s12b>;
+		vddrfa1p2-supply = <&vreg_s11b>;
+		vddrfa1p7-supply = <&vreg_s1c>;
+
+		max-speed = <3200000>;
+
+		enable-gpios = <&tlmm 133 GPIO_ACTIVE_HIGH>;
+		swctrl-gpios = <&tlmm 132 GPIO_ACTIVE_HIGH>;
+
+		pinctrl-0 = <&bt_en>;
+		pinctrl-names = "default";
+	};
+};
+
 &qup1 {
 	status = "okay";
 };
@@ -720,6 +757,11 @@  &qup2 {
 	status = "okay";
 };
 
+&uart17 {
+	compatible = "qcom,geni-debug-uart";
+	status = "okay";
+};
+
 &remoteproc_adsp {
 	firmware-name = "qcom/sc8280xp/LENOVO/21BX/qcadsp8280.mbn";
 
@@ -980,6 +1022,19 @@  hastings_reg_en: hastings-reg-en-state {
 &tlmm {
 	gpio-reserved-ranges = <70 2>, <74 6>, <83 4>, <125 2>, <128 2>, <154 7>;
 
+	bt_en: bt-en-state {
+		hstp-sw-ctrl-pins {
+			pins = "gpio132";
+			function = "gpio";
+		};
+
+		hstp-bt-en-pins {
+			pins = "gpio133";
+			function = "gpio";
+			drive-strength = <16>;
+		};
+	};
+
 	edp_reg_en: edp-reg-en-state {
 		pins = "gpio25";
 		function = "gpio";
@@ -1001,6 +1056,27 @@  i2c4_default: i2c4-default-state {
 		bias-disable;
 	};
 
+	uart2_state: uart2-state {
+		cts-pins {
+			pins = "gpio122";
+			function = "qup2";
+			bias-disable;
+		};
+
+		rts-tx-pins {
+			pins = "gpio122", "gpio123";
+			function = "qup2";
+			drive-strength = <2>;
+			bias-disable;
+		};
+
+		rx-pins {
+			pins = "gpio124";
+			function = "qup2";
+			bias-pull-up;
+		};
+	};
+
 	i2c21_default: i2c21-default-state {
 		pins = "gpio81", "gpio82";
 		function = "qup21";