Add CTS/RTS gpio support to STM32 UART
Subsystems (3)
v3 cover Add CTS/RTS gpio support to STM32 UART
From: Manivannan Sadhasivam <[email protected]>
Hello,
This patchset adds CTS/RTS gpio support to STM32 UART controller. Eventhough the UART controller supports using dedicated CTS/RTS gpios, sometimes we need to use different set of gpios for flow control.
This is necessary for the upcoming STM32MP1 based board called Stinger96 IoT-Box. On that board, a bluetooth chip is connected to one of the UART controller but the CTS/RTS lines got swapped mistakenly. So this patchset serves as a workaround for that hardware bug and also supports the usecase of using any gpio for CTS/RTS functionality. As per the sugggestion provided by Andy for v1, I've now switched to mctrl_gpio driver.
This patchset has been validated with Stinger96 IoT-Box connected to Murata WiFi-BT combo chip.
Thanks,
Mani
Changes in v3:
* Added Andy's reviewed-by tag
* Fixed minor issues spotted by Fabrice
Changes in v2:
As per the review by Andy:
* Switched to mctrl_gpio driver instead of using custom CTS/RTS implementation
* Removed the use of software flow control terminology.
Manivannan Sadhasivam (2):
dt-bindings: serial: Document CTS/RTS gpios in STM32 UART
tty: serial: Add modem control gpio support for STM32 UART
.../bindings/serial/st,stm32-uart.yaml | 14 +++++ drivers/tty/serial/Kconfig | 1 + drivers/tty/serial/stm32-usart.c | 53 ++++++++++++++++++- drivers/tty/serial/stm32-usart.h | 1 + 4 files changed, 67 insertions(+), 2 deletions(-)
Signature · 1 line
2.17.1
PATCH v3 1/2 dt-bindings: serial: Document CTS/RTS gpios in STM32 UART
From: Manivannan Sadhasivam <[email protected]>
Document the use of CTS/RTS gpios for flow control in STM32 UART controller. These properties can be used instead of 'st,hw-flow-ctrl' for making use of any gpio pins for flow control instead of dedicated pins. It should be noted that both CTS/RTS and 'st,hw-flow-ctrl' properties cannot co-exist in a design.
--- .../devicetree/bindings/serial/st,stm32-uart.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
Documentation/devicetree/bindings/serial/st,stm32-uart.yaml +14 -0
@@ -48,6 +48,12 @@ properties: minItems: 1 maxItems: 2 + cts-gpios: + maxItems: 1 + + rts-gpios: + maxItems: 1 + wakeup-source: true rs485-rts-delay: true
@@ -55,6 +61,14 @@ properties: linux,rs485-enabled-at-boot-time: true rs485-rx-during-tx: true +if: + required: + - st,hw-flow-ctrl +then: + properties: + cts-gpios: false + rts-gpios: false + required: - compatible - reg
Signature · 1 line
2.17.1
Re: [PATCH v3 1/2] dt-bindings: serial: Document CTS/RTS gpios in STM32 UART
Quoted 8 lines · On Mon, 20 Apr 2020 22:32:03 +0530, [email protected] wrote:
From: Manivannan Sadhasivam <[email protected]>
Document the use of CTS/RTS gpios for flow control in STM32 UART controller. These properties can be used instead of 'st,hw-flow-ctrl' for making use of any gpio pins for flow control instead of dedicated pins. It should be noted that both CTS/RTS and 'st,hw-flow-ctrl' properties cannot co-exist in a design.
Quoted 6 lines
Reviewed-by Andy Shevchenko <[email protected]>Signed-off-by Manivannan Sadhasivam <[email protected]>--- .../devicetree/bindings/serial/st,stm32-uart.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
Re: [PATCH v3 1/2] dt-bindings: serial: Document CTS/RTS gpios in STM32 UART
In reply to [email protected]Hi Mani,
Quoted 15 lines · On Mon, Apr 20, 2020 at 7:02 PM <[email protected]> wrote:
From: Manivannan Sadhasivam <[email protected]>
Document the use of CTS/RTS gpios for flow control in STM32 UART controller. These properties can be used instead of 'st,hw-flow-ctrl' for making use of any gpio pins for flow control instead of dedicated pins. It should be noted that both CTS/RTS and 'st,hw-flow-ctrl' properties cannot co-exist in a design.
Reviewed-by Andy Shevchenko <[email protected]>Signed-off-by Manivannan Sadhasivam <[email protected]>
Documentation/devicetree/bindings/serial/st,stm32-uart.yaml properties: · line 66
Quoted 6 lines
Documentation/devicetree/bindings/serial/st,stm32-uart.yaml +3
-0@@ -55,6 +61,14 @@ properties: linux,rs485-enabled-at-boot-time: true rs485-rx-during-tx: true +if: + required: + - st,hw-flow-ctrl
Perhaps "st,hw-flow-ctrl" should be deprecated, in favor of the standard "uart-has-rtscts" property?
Of course the driver needs to gain support for the latter first.
Documentation/devicetree/bindings/serial/st,stm32-uart.yaml properties: · line 74
Quoted 8 lines
Documentation/devicetree/bindings/serial/st,stm32-uart.yaml +5
-0+then: + properties: + cts-gpios: false + rts-gpios: false + required: - compatible - reg
Gr{oetje,eeting}s,
Geert
Signature · 5 lines
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected] In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds
Re: [Linux-stm32] [PATCH v3 1/2] dt-bindings: serial: Document CTS/RTS gpios in STM32 UART
Hi Geert,
Quoted 19 lines · Geert Uytterhoeven
Hi Mani,
Quoted 16 lines · On Mon, Apr 20, 2020 at 7:02 PM <[email protected]> wrote:
From: Manivannan Sadhasivam <[email protected]>
Document the use of CTS/RTS gpios for flow control in STM32 UART controller. These properties can be used instead of 'st,hw-flow-ctrl' for making use of any gpio pins for flow control instead of dedicated pins. It should be noted that both CTS/RTS and 'st,hw-flow-ctrl' properties cannot co-exist in a design.
Reviewed-by Andy Shevchenko <[email protected]>Signed-off-by Manivannan Sadhasivam <[email protected]>Documentation/devicetree/bindings/serial/st,stm32-uart.yaml +0
-0@@ -55,6 +61,14 @@ properties: linux,rs485-enabled-at-boot-time: true rs485-rx-during-tx: true
Quoted 6 lines
Documentation/devicetree/bindings/serial/st,stm32-uart.yaml properties: · line 66
Quoted 3 lines
Documentation/devicetree/bindings/serial/st,stm32-uart.yaml +3
-0+if: + required: + - st,hw-flow-ctrlPerhaps "st,hw-flow-ctrl" should be deprecated, in favor of the standard "uart-has-rtscts" property?
Of course the driver needs to gain support for the latter first.
You're fully right, the patch to deprecate "st, hw-flow-ctrl" and introduce generic "uart-has-rtscts" property in the driver is ready and will be sent this week on top of Mani patch.
Quoted 11 lines
Documentation/devicetree/bindings/serial/st,stm32-uart.yaml properties: · line 74
Quoted 9 lines
Documentation/devicetree/bindings/serial/st,stm32-uart.yaml +5
-0+then: + properties: + cts-gpios: false + rts-gpios: false + required: - compatible - regGr{oetje,eeting}s,
Quoted 2 lines
Geert
_______________________________________________
linux-arm-kernel mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
PATCH v3 2/2 tty: serial: Add modem control gpio support for STM32 UART
In reply to [email protected]From: Manivannan Sadhasivam <[email protected]>
STM32 UART controllers have the built in modem control support using dedicated gpios which can be enabled using 'st,hw-flow-ctrl' flag in DT. But there might be cases where the board design need to use different gpios for modem control.
For supporting such cases, this commit adds modem control gpio support to STM32 UART controller using mctrl_gpio driver.
--- drivers/tty/serial/Kconfig | 1 + drivers/tty/serial/stm32-usart.c | 53 ++++++++++++++++++++++++++++++-- drivers/tty/serial/stm32-usart.h | 1 + 3 files changed, 53 insertions(+), 2 deletions(-)
drivers/tty/serial/Kconfig +1 -0
@@ -1462,6 +1462,7 @@ config SERIAL_STM32 tristate "STMicroelectronics STM32 serial port support" select SERIAL_CORE depends on ARCH_STM32 || COMPILE_TEST + select SERIAL_MCTRL_GPIO if GPIOLIB help This driver is for the on-chip Serial Controller on STMicroelectronics STM32 MCUs.
drivers/tty/serial/stm32-usart.c +51 -2
97 lines not on this page · raw message
drivers/tty/serial/stm32-usart.h +1 -0
@@ -274,6 +274,7 @@ struct stm32_port {bool fifoen;int wakeirq;int rdr_mask;/* receive data register mask */ +struct mctrl_gpios *gpios;/* modem control gpios */ };static struct stm32_port stm32_ports[STM32_MAX_PORTS ];
Signature · 1 line
2.17.1
Re: [PATCH v3 2/2] tty: serial: Add modem control gpio support for STM32 UART
Quoted 10 lines · On 4/20/20 7:02 PM, [email protected] wrote:
From: Manivannan Sadhasivam <[email protected]>
STM32 UART controllers have the built in modem control support using dedicated gpios which can be enabled using 'st,hw-flow-ctrl' flag in DT. But there might be cases where the board design need to use different gpios for modem control.
For supporting such cases, this commit adds modem control gpio support to STM32 UART controller using
mctrl_gpiodriver.
Quoted 7 lines
Reviewed-by Andy Shevchenko <[email protected]>Signed-off-by Manivannan Sadhasivam <[email protected]>--- drivers/tty/serial/Kconfig | 1 + drivers/tty/serial/stm32-usart.c | 53 ++++++++++++++++++++++++++++++-- drivers/tty/serial/stm32-usart.h | 1 + 3 files changed, 53 insertions(+), 2 deletions(-)
Hi Mani,
You can add my:
Thanks,
Fabrice
Quoted 126 lines
drivers/tty/serial/Kconfig +1
-0@@ -1462,6 +1462,7 @@ config SERIAL_STM32 tristate "STMicroelectronics STM32 serial port support" select SERIAL_CORE depends on ARCH_STM32 || COMPILE_TEST + select SERIAL_MCTRL_GPIO if GPIOLIB help This driver is for the on-chip Serial Controller on STMicroelectronics STM32 MCUs.drivers/tty/serial/stm32-usart.c +51
-2@@ -31,6 +31,7 @@#include <linux/tty_flip.h> #include <linux/tty.h> +#include "serial_mctrl_gpio.h" #include "stm32-usart.h" static void stm32_stop_tx (struct uart_port *port);@@ -510,12 +511,29 @@ static void stm32_set_mctrl(struct uart_port *port, unsigned int mctrl)stm32_set_bits (port, ofs->cr3,USART_CR3_RTSE ); else stm32_clr_bits(port, ofs->cr3, USART_CR3_RTSE); + +mctrl_gpio_set (stm32_port->gpios, mctrl); }static unsigned int stm32_get_mctrl (struct uart_port *port) { +struct stm32_port *stm32_port =to_stm32_port (port); +unsigned int ret; +/* This routine is used to get signals of: DCD, DSR, RI, and CTS */ -return TIOCM_CAR |TIOCM_DSR |TIOCM_CTS ; + ret =TIOCM_CAR |TIOCM_DSR |TIOCM_CTS ; + +return mctrl_gpio_get (stm32_port->gpios, &ret); +} + +static void stm32_enable_ms (struct uart_port *port) +{ +mctrl_gpio_enable_ms (to_stm32_port (port)->gpios); +} + +static void stm32_disable_ms (struct uart_port *port) +{ +mctrl_gpio_disable_ms (to_stm32_port (port)->gpios); }/* Transmit stop */ @@ -626,6 +644,9 @@ static void stm32_shutdown(struct uart_port *port)u32 val, isr;int ret; +/* Disable modem control interrupts */ +stm32_disable_ms (port); + val =USART_CR1_TXEIE |USART_CR1_TE ; val |= stm32_port->cr1_irq |USART_CR1_RE ; val |=BIT (cfg->uart_enable_bit);@@ -764,6 +785,12 @@ static void stm32_set_termios(struct uart_port *port, struct ktermios *termios, cr3 |=USART_CR3_CTSE |USART_CR3_RTSE ; } +/* Handle modem control interrupts */ +if (UART_ENABLE_MS (port, termios->c_cflag)) +stm32_enable_ms (port); +else +stm32_disable_ms (port); + usartdiv =DIV_ROUND_CLOSEST (port->uartclk, baud);/* @@ -898,6 +925,7 @@ static const struct uart_ops stm32_uart_ops = { .throttle = stm32_throttle, .unthrottle = stm32_unthrottle, .stop_rx = stm32_stop_rx, + .enable_ms = stm32_enable_ms, .break_ctl = stm32_break_ctl, .startup = stm32_startup, .shutdown = stm32_shutdown,@@ -960,10 +988,31 @@ static int stm32_init_port(struct stm32_port *stm32port, stm32port->port.uartclk =clk_get_rate (stm32port->clk);if (!stm32port->port.uartclk) { -clk_disable_unprepare (stm32port->clk); ret = -EINVAL ; + goto err_clk; + } + + stm32port->gpios =mctrl_gpio_init (&stm32port->port,0 ); +if (IS_ERR (stm32port->gpios)) { + ret =PTR_ERR (stm32port->gpios); + goto err_clk; } +/* Both CTS/RTS gpios and "st,hw-flow-ctrl" should not be specified */ +if (stm32port->hw_flow_control) { +if (mctrl_gpio_to_gpiod (stm32port->gpios,UART_GPIO_CTS ) || +mctrl_gpio_to_gpiod (stm32port->gpios,UART_GPIO_RTS )) { +dev_err (&pdev->dev,"Conflicting RTS/CTS config\n" ); + ret = -EINVAL ; + goto err_clk; + } + } + +return ret; + +err_clk: +clk_disable_unprepare (stm32port->clk); +return ret; }drivers/tty/serial/stm32-usart.h +0
-0
drivers/tty/serial/stm32-usart.h struct stm32_port { · line 280
Quoted 7 lines
drivers/tty/serial/stm32-usart.h +1
-0@@ -274,6 +274,7 @@ struct stm32_port {bool fifoen;int wakeirq;int rdr_mask;/* receive data register mask */ +struct mctrl_gpios *gpios;/* modem control gpios */ };static struct stm32_port stm32_ports[STM32_MAX_PORTS ];
_______________________________________________
linux-arm-kernel mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Hi Greg,
Quoted 15 lines · On Mon, Apr 20, 2020 at 10:32:02PM +0530, [email protected] wrote:
From: Manivannan Sadhasivam <[email protected]>
Hello,
This patchset adds CTS/RTS gpio support to STM32 UART controller. Eventhough the UART controller supports using dedicated CTS/RTS gpios, sometimes we need to use different set of gpios for flow control.
This is necessary for the upcoming STM32MP1 based board called Stinger96 IoT-Box. On that board, a bluetooth chip is connected to one of the UART controller but the CTS/RTS lines got swapped mistakenly. So this patchset serves as a workaround for that hardware bug and also supports the usecase of using any gpio for CTS/RTS functionality. As per the sugggestion provided by Andy for v1, I've now switched to
mctrl_gpiodriver.
Quoted 3 lines
This patchset has been validated with Stinger96 IoT-Box connected to Murata WiFi-BT combo chip.
Are you planning to take this series for 5.8?
Thanks,
Mani
Quoted 29 lines
Thanks,
ManiChanges in v3:
* Added Andy's reviewed-by tag
* Fixed minor issues spotted by FabriceChanges in v2:
As per the review by Andy:
* Switched to
mctrl_gpiodriver instead of using custom CTS/RTS implementation
* Removed the use of software flow control terminology.Manivannan Sadhasivam (2):
dt-bindings: serial: Document CTS/RTS gpios in STM32 UART
tty: serial: Add modem control gpio support for STM32 UART.../bindings/serial/st,stm32-uart.yaml | 14 +++++ drivers/tty/serial/Kconfig | 1 + drivers/tty/serial/stm32-usart.c | 53 ++++++++++++++++++- drivers/tty/serial/stm32-usart.h | 1 + 4 files changed, 67 insertions(+), 2 deletions(-)Signature · 1 line
2.17.1
Greg KH
maintainerQuoted 18 lines · Manivannan Sadhasivam
Hi Greg,
Quoted 15 lines · On Mon, Apr 20, 2020 at 10:32:02PM +0530, [email protected] wrote:
From: Manivannan Sadhasivam <[email protected]>
Hello,
This patchset adds CTS/RTS gpio support to STM32 UART controller. Eventhough the UART controller supports using dedicated CTS/RTS gpios, sometimes we need to use different set of gpios for flow control.
This is necessary for the upcoming STM32MP1 based board called Stinger96 IoT-Box. On that board, a bluetooth chip is connected to one of the UART controller but the CTS/RTS lines got swapped mistakenly. So this patchset serves as a workaround for that hardware bug and also supports the usecase of using any gpio for CTS/RTS functionality. As per the sugggestion provided by Andy for v1, I've now switched to
mctrl_gpiodriver.
Quoted 5 lines
Quoted 3 lines
This patchset has been validated with Stinger96 IoT-Box connected to Murata WiFi-BT combo chip.
Are you planning to take this series for 5.8?
I had to wait for the DT protion to be reviewed before I could do anything. Give me some time, if it looks ok, it will go into 5.8.
thanks,
greg k-h