Skip to contentSkip to conversation

Add wakeup support over UART RX

PATCH In review satya priya 4 participants 10 messages Sep 14, 2020 – Sep 15, 2020

Subsystems (5)
lore
Share & tools
lore
#0 lore raw

v6 cover Add wakeup support over UART RX

Changes in V2:
- As per Matthias's comment added wakeup support for all the UARTs of SC7180.
- Added sleep state in sc7180-idp.dts file.
- Modify the if check in set_mctrl API in serial driver to avoid making RFR high during suspend.

Changes in V3:
- As per Matthias's comments modify the idp dts pin config to keep only the required pin settings.
- Remove the extra parentheses from serial driver patch.

Changes in V4:
- As per Matthias's comments, change the commit text to mention why GPIO function needs to be selected in sleep.
- Add separate patch for improvements made in pin conf settings.

Changes in V5:
- Moved pinctrl and interrupt configuration to board specific files.
- Added new patch for trogdor board specific changes.

Changes in V6:
- As per Doug's comments, fixed nits in patch 2 and 3.
- As per Bjorn's comments changed the commit text and rationale for rts, tx and rx in patch 2 and 3.

satya priya (4):
arm64: dts: qcom: sc7180: Improve the uart3 pin config for sc7180-idp
arm64: dts: qcom: sc7180: Add wakeup support for BT UART on sc7180-idp
arm64: dts: qcom: sc7180-trogdor: Add wakeup support for BT UART
tty: serial: qcom_geni_serial: Fix the UART wakeup issue

 arch/arm64/boot/dts/qcom/sc7180-idp.dts      | 65 +++++++++++++++++++++++++---
 arch/arm64/boot/dts/qcom/sc7180-trogdor.dtsi | 54 +++++++++++++++++++++++
 drivers/tty/serial/qcom_geni_serial.c        |  2 +-
 3 files changed, 114 insertions(+), 7 deletions(-)
Signature · 2 lines
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member 
of Code Aurora Forum, hosted by The Linux Foundation
#1 lore raw

PATCH v6 1/4 arm64: dts: qcom: sc7180: Improve the uart3 pin config for sc7180-idp

Remove output-high from CTS and TX as this is not really required. During bringup to fix transfer failures this was added to match with console uart settings. Probably some boot loader config was missing then. As it is working fine now, remove it.

---
Changes in V4:
- This is newly added in V4 to separate the improvements in pin settings and wakeup related changes.

Changes in V5:
- As per Doug's comment configured pull-down for CTS pin as earlier.

Changes in V6:
- As per Doug's comment changed the subjet of the patch.

 arch/arm64/boot/dts/qcom/sc7180-idp.dts | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)
arch/arm64/boot/dts/qcom/sc7180-idp.dts +4 -6
index d8b5507..04888df 100644
@@ -474,32 +474,30 @@
 &qup_uart3_default {
 	pinconf-cts {
 		/*
-		 * Configure a pull-down on 38 (CTS) to match the pull of
+		 * Configure a pull-down on CTS to match the pull of
 		 * the Bluetooth module.
 		 */
 		pins = "gpio38";
 		bias-pull-down;
-		output-high;
 	};
 
 	pinconf-rts {
-		/* We'll drive 39 (RTS), so no pull */
+		/* We'll drive RTS, so no pull */
 		pins = "gpio39";
 		drive-strength = <2>;
 		bias-disable;
 	};
 
 	pinconf-tx {
-		/* We'll drive 40 (TX), so no pull */
+		/* We'll drive TX, so no pull */
 		pins = "gpio40";
 		drive-strength = <2>;
 		bias-disable;
-		output-high;
 	};
 
 	pinconf-rx {
 		/*
-		 * Configure a pull-up on 41 (RX). This is needed to avoid
+		 * Configure a pull-up on RX. This is needed to avoid
 		 * garbage data when the TX pin of the Bluetooth module is
 		 * in tri-state (module powered off or not driving the
 		 * signal yet).
Signature · 2 lines
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member 
of Code Aurora Forum, hosted by The Linux Foundation
#2 lore raw

PATCH v6 2/4 arm64: dts: qcom: sc7180: Add wakeup support for BT UART on sc7180-idp

In reply to satya priya

Add the necessary pinctrl, interrupt property and a suitable sleep config to support Bluetooth wakeup feature.

GPIO mode is configured in sleep state to drive the RTS/RFR line low. If QUP function is selected in sleep state, UART RTS/RFR is pulled high during suspend and BT SoC not able to send wakeup bytes.

---
Changes in V2:
- This patch adds sleep state for BT UART. Newly added in V2.

Changes in V3:
- Remove "output-high" for TX from both sleep and default states as it is not required. Configure pull-up for TX in sleep state.

Changes in V4:
- As per Matthias's comment, removed drive-strength for sleep state and fixed nit-pick.

Changes in V5:
- As per Matthias's comments, moved pinmux change for sleep state, pinctrl and interrupt config to the board specific file.

Changes in V6:
- As per Doug's comments changed subject, deleted interrupts property.
- As per Bjorn's comments changed commit text and rationale for RTS, TX and RX.

 arch/arm64/boot/dts/qcom/sc7180-idp.dts | 55 +++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)
arch/arm64/boot/dts/qcom/sc7180-idp.dts +55 -0
index 04888df..e416409 100644
@@ -346,6 +346,13 @@
 &uart3 {
 	status = "okay";
 
+	/delete-property/interrupts;
+	interrupts-extended = <&intc GIC_SPI 604 IRQ_TYPE_LEVEL_HIGH>,
+				<&tlmm 41 IRQ_TYPE_EDGE_FALLING>;
+
+	pinctrl-names = "default", "sleep";
+	pinctrl-1 = <&qup_uart3_sleep>;
+
 	bluetooth: wcn3990-bt {
 		compatible = "qcom,wcn3990-bt";
 		vddio-supply = <&vreg_l10a_1p8>;
@@ -545,3 +552,51 @@
 	};
 };
 
+&tlmm {
+	qup_uart3_sleep: qup-uart3-sleep {
+		pinmux {
+			pins = "gpio38", "gpio39",
+			       "gpio40", "gpio41";
+			function = "gpio";
+		};
+
+		pinconf-cts {
+			/*
+			 * Configure a pull-down on CTS to match the pull of
+			 * the Bluetooth module.
+			 */
+			pins = "gpio38";
+			bias-pull-down;
+		};
+
+		pinconf-rts {
+			/*
+			 * Configure pull-down on RTS. As RTS is active low
+			 * signal, pull it low to indicate the BT SoC that it
+			 * can wakeup the system anytime from suspend state by
+			 * pulling RX low (by sending wakeup bytes).
+			 */
+			 pins = "gpio39";
+			 bias-pull-down;
+		};
+
+		pinconf-tx {
+			/*
+			 * Configure pull-up on TX when it isn't actively driven
+			 * to prevent BT SoC from receiving garbage during sleep.
+			 */
+			pins = "gpio40";
+			bias-pull-up;
+		};
+
+		pinconf-rx {
+			/*
+			 * Configure a pull-up on RX. This is needed to avoid
+			 * garbage data when the TX pin of the Bluetooth module
+			 * is floating which may cause spurious wakeups.
+			 */
+			pins = "gpio41";
+			bias-pull-up;
+		};
+	};
+};
Signature · 2 lines
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member 
of Code Aurora Forum, hosted by The Linux Foundation
Reviewed-by on v6 2/4
#3 lore raw

Re: [PATCH V6 2/4] arm64: dts: qcom: sc7180: Add wakeup support for BT UART on sc7180-idp

Quoted 8 lines · satya priya

Add the necessary pinctrl, interrupt property and a suitable sleep config to support Bluetooth wakeup feature.

GPIO mode is configured in sleep state to drive the RTS/RFR line low. If QUP function is selected in sleep state, UART RTS/RFR is pulled high during suspend and BT SoC not able to send wakeup bytes.

Reviewed-by on v6 2/4
#4 lore raw

Re: [PATCH V6 2/4] arm64: dts: qcom: sc7180: Add wakeup support for BT UART on sc7180-idp

In reply to satya priya

Hi,

Quoted 25 lines · satya priya

Add the necessary pinctrl, interrupt property and a suitable sleep config to support Bluetooth wakeup feature.

GPIO mode is configured in sleep state to drive the RTS/RFR line low. If QUP function is selected in sleep state, UART RTS/RFR is pulled high during suspend and BT SoC not able to send wakeup bytes.

---
Changes in V2:
- This patch adds sleep state for BT UART. Newly added in V2.

Changes in V3:
- Remove "output-high" for TX from both sleep and default states as it is not required. Configure pull-up for TX in sleep state.

Changes in V4:
- As per Matthias's comment, removed drive-strength for sleep state and fixed nit-pick.

Changes in V5:
- As per Matthias's comments, moved pinmux change for sleep state, pinctrl and interrupt config to the board specific file.

Quoted 7 lines

Changes in V6:
- As per Doug's comments changed subject, deleted interrupts property.
- As per Bjorn's comments changed commit text and rationale for RTS, TX and RX.

 arch/arm64/boot/dts/qcom/sc7180-idp.dts | 55 +++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)
#5 lore raw

PATCH v6 3/4 arm64: dts: qcom: sc7180-trogdor: Add wakeup support for BT UART

In reply to satya priya

Add the necessary pinctrl, interrupt property and a suitable sleep config to support Bluetooth wakeup feature.

GPIO mode is configured in sleep state to drive the RTS/RFR line low. If QUP function is selected in sleep state, UART RTS/RFR is pulled high during suspend and BT SoC not able to send wakeup bytes.

---
Changes in V5:
- Newly added in V5. This patch adds wakeup support for trogdor board files.

Changes in V6:
- As per Doug's comment deleted interrupts property and sorted the qup sleep state before trackpad.
- As per Bjorn's comment canged the commit text, rationale for RTS, TX, RX.

 arch/arm64/boot/dts/qcom/sc7180-trogdor.dtsi | 54 ++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)
arch/arm64/boot/dts/qcom/sc7180-trogdor.dtsi +54 -0
index a6b9beb..6629df9 100644
@@ -794,6 +794,13 @@ ap_spi_fp: &spi10 {
 &uart3 {
 	status = "okay";
 
+	/delete-property/interrupts;
+	interrupts-extended = <&intc GIC_SPI 604 IRQ_TYPE_LEVEL_HIGH>,
+				<&tlmm 41 IRQ_TYPE_EDGE_FALLING>;
+
+	pinctrl-names = "default", "sleep";
+	pinctrl-1 = <&qup_uart3_sleep>;
+
 	bluetooth: bluetooth {
 		compatible = "qcom,wcn3991-bt";
 		vddio-supply = <&pp1800_l10a>;
@@ -1307,6 +1314,53 @@ ap_spi_fp: &spi10 {
 		};
 	};
 
+	qup_uart3_sleep: qup-uart3-sleep {
+		pinmux {
+			pins = "gpio38", "gpio39",
+			       "gpio40", "gpio41";
+			function = "gpio";
+		};
+
+		pinconf-cts {
+			/*
+			 * Configure a pull-down on CTS to match the pull of
+			 * the Bluetooth module.
+			 */
+			pins = "gpio38";
+			bias-pull-down;
+		};
+
+		pinconf-rts {
+			/*
+			 * Configure pull-down on RTS. As RTS is active low
+			 * signal, pull it low to indicate the BT SoC that it
+			 * can wakeup the system anytime from suspend state by
+			 * pulling RX low (by sending wakeup bytes).
+			 */
+			 pins = "gpio39";
+			 bias-pull-down;
+		};
+
+		pinconf-tx {
+			/*
+			 * Configure pull-up on TX when it isn't actively driven
+			 * to prevent BT SoC from receiving garbage during sleep.
+			 */
+			pins = "gpio40";
+			bias-pull-up;
+		};
+
+		pinconf-rx {
+			/*
+			 * Configure a pull-up on RX. This is needed to avoid
+			 * garbage data when the TX pin of the Bluetooth module
+			 * is floating which may cause spurious wakeups.
+			 */
+			pins = "gpio41";
+			bias-pull-up;
+		};
+	};
+
 	trackpad_int_1v8_odl: trackpad-int-1v8-odl {
 		pinmux {
 			pins = "gpio58";
Signature · 2 lines
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member 
of Code Aurora Forum, hosted by The Linux Foundation
Reviewed-by Tested-by on v6 3/4
#6 lore raw

Re: [PATCH V6 3/4] arm64: dts: qcom: sc7180-trogdor: Add wakeup support for BT UART

Quoted 8 lines · satya priya

Add the necessary pinctrl, interrupt property and a suitable sleep config to support Bluetooth wakeup feature.

GPIO mode is configured in sleep state to drive the RTS/RFR line low. If QUP function is selected in sleep state, UART RTS/RFR is pulled high during suspend and BT SoC not able to send wakeup bytes.

Reviewed-by on v6 3/4
#7 lore raw

Re: [PATCH V6 3/4] arm64: dts: qcom: sc7180-trogdor: Add wakeup support for BT UART

In reply to satya priya

Hi,

Quoted 13 lines · satya priya

Add the necessary pinctrl, interrupt property and a suitable sleep config to support Bluetooth wakeup feature.

GPIO mode is configured in sleep state to drive the RTS/RFR line low. If QUP function is selected in sleep state, UART RTS/RFR is pulled high during suspend and BT SoC not able to send wakeup bytes.

---
Changes in V5:
- Newly added in V5. This patch adds wakeup support for trogdor board files.

Quoted 7 lines

Changes in V6:
- As per Doug's comment deleted interrupts property and sorted the qup sleep state before trackpad.
- As per Bjorn's comment canged the commit text, rationale for RTS, TX, RX.

 arch/arm64/boot/dts/qcom/sc7180-trogdor.dtsi | 54 ++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)
#8 lore raw

PATCH v6 4/4 tty: serial: qcom_geni_serial: Fix the UART wakeup issue

In reply to satya priya

As a part of system suspend uart_port_suspend is called from the Serial driver, which calls set_mctrl passing mctrl as 0. This makes RFR high(NOT_READY) during suspend.

Due to this BT SoC is not able to send wakeup bytes to UART during suspend. Include if check for non-suspend case to keep RFR low during suspend.

---
Changes in V2:
- This patch fixes the UART flow control issue during suspend. Newly added in V2.

Changes in V3:
- As per Matthias's comment removed the extra parentheses.

Changes in V4:
- No change.

Changes in V5:
- As per Matthias comment, fixed nit-pick in commit text.

Changes in V6:
- No change.

 drivers/tty/serial/qcom_geni_serial.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/qcom_geni_serial.c +1 -1
index 3aa29d2..bc63c54 100644
@@ -242,7 +242,7 @@ static void qcom_geni_serial_set_mctrl(struct uart_port *uport,
 	if (mctrl & TIOCM_LOOP)
 		port->loopback = RX_TX_CTS_RTS_SORTED;
 
-	if (!(mctrl & TIOCM_RTS))
+	if (!(mctrl & TIOCM_RTS) && !uport->suspended)
 		uart_manual_rfr = UART_MANUAL_RFR_EN | UART_RFR_NOT_READY;
 	writel(uart_manual_rfr, uport->membase + SE_UART_MANUAL_RFR);
 }
Signature · 2 lines
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member 
of Code Aurora Forum, hosted by The Linux Foundation
#9 lore raw
In reply to satya priya
Quoted 26 lines · satya priya

Changes in V2:
- As per Matthias's comment added wakeup support for all the UARTs of SC7180.
- Added sleep state in sc7180-idp.dts file.
- Modify the if check in set_mctrl API in serial driver to avoid making RFR high during suspend.

Changes in V3:
- As per Matthias's comments modify the idp dts pin config to keep only the required pin settings.
- Remove the extra parentheses from serial driver patch.

Changes in V4:
- As per Matthias's comments, change the commit text to mention why GPIO function needs to be selected in sleep.
- Add separate patch for improvements made in pin conf settings.

Changes in V5:
- Moved pinctrl and interrupt configuration to board specific files.
- Added new patch for trogdor board specific changes.

Changes in V6:
- As per Doug's comments, fixed nits in patch 2 and 3.
- As per Bjorn's comments changed the commit text and rationale for rts, tx and rx in patch 2 and 3.

Quoted 4 lines

satya priya (4):
arm64: dts: qcom: sc7180: Improve the uart3 pin config for sc7180-idp
arm64: dts: qcom: sc7180: Add wakeup support for BT UART on sc7180-idp
arm64: dts: qcom: sc7180-trogdor: Add wakeup support for BT UART

Applied these...

Quoted 1 line

tty: serial: qcom_geni_serial: Fix the UART wakeup issue

...expecting Greg to pick this one up.

Thanks,
Bjorn

Quoted 10 lines
 arch/arm64/boot/dts/qcom/sc7180-idp.dts      | 65 +++++++++++++++++++++++++---
 arch/arm64/boot/dts/qcom/sc7180-trogdor.dtsi | 54 +++++++++++++++++++++++
 drivers/tty/serial/qcom_geni_serial.c        |  2 +-
 3 files changed, 114 insertions(+), 7 deletions(-)
Signature · 2 lines
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member 
of Code Aurora Forum, hosted by The Linux Foundation