blob: 3244e7f6818caea21bf9d8b86a32b3abb37565f4 [file] [log] [blame]
Greg Kroah-Hartmane3b3d0f2017-11-06 18:11:51 +01001// SPDX-License-Identifier: GPL-2.0
Maxime Coquelin48a60922015-06-10 21:19:36 +02002/*
3 * Copyright (C) Maxime Coquelin 2015
Bich HEMON3e5fcba2017-07-13 15:08:26 +00004 * Copyright (C) STMicroelectronics SA 2017
Alexandre TORGUEada86182016-09-15 18:42:33 +02005 * Authors: Maxime Coquelin <mcoquelin.stm32@gmail.com>
Erwan Le Ray8ebd9662021-01-06 17:21:59 +01006 * Gerald Baeza <gerald.baeza@foss.st.com>
7 * Erwan Le Ray <erwan.leray@foss.st.com>
Maxime Coquelin48a60922015-06-10 21:19:36 +02008 *
9 * Inspired by st-asc.c from STMicroelectronics (c)
10 */
11
Alexandre TORGUE34891872016-09-15 18:42:40 +020012#include <linux/clk.h>
Maxime Coquelin48a60922015-06-10 21:19:36 +020013#include <linux/console.h>
Maxime Coquelin48a60922015-06-10 21:19:36 +020014#include <linux/delay.h>
Alexandre TORGUE34891872016-09-15 18:42:40 +020015#include <linux/dma-direction.h>
16#include <linux/dmaengine.h>
17#include <linux/dma-mapping.h>
18#include <linux/io.h>
19#include <linux/iopoll.h>
20#include <linux/irq.h>
21#include <linux/module.h>
Maxime Coquelin48a60922015-06-10 21:19:36 +020022#include <linux/of.h>
23#include <linux/of_platform.h>
Erwan Le Ray94616d92019-06-13 15:49:53 +020024#include <linux/pinctrl/consumer.h>
Alexandre TORGUE34891872016-09-15 18:42:40 +020025#include <linux/platform_device.h>
26#include <linux/pm_runtime.h>
Fabrice Gasnier270e5a72017-07-13 15:08:30 +000027#include <linux/pm_wakeirq.h>
Maxime Coquelin48a60922015-06-10 21:19:36 +020028#include <linux/serial_core.h>
Alexandre TORGUE34891872016-09-15 18:42:40 +020029#include <linux/serial.h>
30#include <linux/spinlock.h>
31#include <linux/sysrq.h>
32#include <linux/tty_flip.h>
33#include <linux/tty.h>
Maxime Coquelin48a60922015-06-10 21:19:36 +020034
Manivannan Sadhasivam6cf61b92020-04-20 22:32:04 +053035#include "serial_mctrl_gpio.h"
Alexandre TORGUEbc5a0b52016-09-15 18:42:35 +020036#include "stm32-usart.h"
Maxime Coquelin48a60922015-06-10 21:19:36 +020037
Erwan Le Ray56f9a762021-01-06 17:21:58 +010038static void stm32_usart_stop_tx(struct uart_port *port);
39static void stm32_usart_transmit_chars(struct uart_port *port);
Maxime Coquelin48a60922015-06-10 21:19:36 +020040
41static inline struct stm32_port *to_stm32_port(struct uart_port *port)
42{
43 return container_of(port, struct stm32_port, port);
44}
45
Erwan Le Ray56f9a762021-01-06 17:21:58 +010046static void stm32_usart_set_bits(struct uart_port *port, u32 reg, u32 bits)
Maxime Coquelin48a60922015-06-10 21:19:36 +020047{
48 u32 val;
49
50 val = readl_relaxed(port->membase + reg);
51 val |= bits;
52 writel_relaxed(val, port->membase + reg);
53}
54
Erwan Le Ray56f9a762021-01-06 17:21:58 +010055static void stm32_usart_clr_bits(struct uart_port *port, u32 reg, u32 bits)
Maxime Coquelin48a60922015-06-10 21:19:36 +020056{
57 u32 val;
58
59 val = readl_relaxed(port->membase + reg);
60 val &= ~bits;
61 writel_relaxed(val, port->membase + reg);
62}
63
Erwan Le Ray56f9a762021-01-06 17:21:58 +010064static void stm32_usart_config_reg_rs485(u32 *cr1, u32 *cr3, u32 delay_ADE,
65 u32 delay_DDE, u32 baud)
Bich HEMON1bcda092018-03-12 09:50:05 +000066{
67 u32 rs485_deat_dedt;
68 u32 rs485_deat_dedt_max = (USART_CR1_DEAT_MASK >> USART_CR1_DEAT_SHIFT);
69 bool over8;
70
71 *cr3 |= USART_CR3_DEM;
72 over8 = *cr1 & USART_CR1_OVER8;
73
74 if (over8)
75 rs485_deat_dedt = delay_ADE * baud * 8;
76 else
77 rs485_deat_dedt = delay_ADE * baud * 16;
78
79 rs485_deat_dedt = DIV_ROUND_CLOSEST(rs485_deat_dedt, 1000);
80 rs485_deat_dedt = rs485_deat_dedt > rs485_deat_dedt_max ?
81 rs485_deat_dedt_max : rs485_deat_dedt;
82 rs485_deat_dedt = (rs485_deat_dedt << USART_CR1_DEAT_SHIFT) &
83 USART_CR1_DEAT_MASK;
84 *cr1 |= rs485_deat_dedt;
85
86 if (over8)
87 rs485_deat_dedt = delay_DDE * baud * 8;
88 else
89 rs485_deat_dedt = delay_DDE * baud * 16;
90
91 rs485_deat_dedt = DIV_ROUND_CLOSEST(rs485_deat_dedt, 1000);
92 rs485_deat_dedt = rs485_deat_dedt > rs485_deat_dedt_max ?
93 rs485_deat_dedt_max : rs485_deat_dedt;
94 rs485_deat_dedt = (rs485_deat_dedt << USART_CR1_DEDT_SHIFT) &
95 USART_CR1_DEDT_MASK;
96 *cr1 |= rs485_deat_dedt;
97}
98
Erwan Le Ray56f9a762021-01-06 17:21:58 +010099static int stm32_usart_config_rs485(struct uart_port *port,
100 struct serial_rs485 *rs485conf)
Bich HEMON1bcda092018-03-12 09:50:05 +0000101{
102 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800103 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
104 const struct stm32_usart_config *cfg = &stm32_port->info->cfg;
Bich HEMON1bcda092018-03-12 09:50:05 +0000105 u32 usartdiv, baud, cr1, cr3;
106 bool over8;
Bich HEMON1bcda092018-03-12 09:50:05 +0000107
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100108 stm32_usart_clr_bits(port, ofs->cr1, BIT(cfg->uart_enable_bit));
Bich HEMON1bcda092018-03-12 09:50:05 +0000109
110 port->rs485 = *rs485conf;
111
112 rs485conf->flags |= SER_RS485_RX_DURING_TX;
113
114 if (rs485conf->flags & SER_RS485_ENABLED) {
115 cr1 = readl_relaxed(port->membase + ofs->cr1);
116 cr3 = readl_relaxed(port->membase + ofs->cr3);
117 usartdiv = readl_relaxed(port->membase + ofs->brr);
118 usartdiv = usartdiv & GENMASK(15, 0);
119 over8 = cr1 & USART_CR1_OVER8;
120
121 if (over8)
122 usartdiv = usartdiv | (usartdiv & GENMASK(4, 0))
123 << USART_BRR_04_R_SHIFT;
124
125 baud = DIV_ROUND_CLOSEST(port->uartclk, usartdiv);
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100126 stm32_usart_config_reg_rs485(&cr1, &cr3,
127 rs485conf->delay_rts_before_send,
128 rs485conf->delay_rts_after_send,
129 baud);
Bich HEMON1bcda092018-03-12 09:50:05 +0000130
131 if (rs485conf->flags & SER_RS485_RTS_ON_SEND) {
132 cr3 &= ~USART_CR3_DEP;
133 rs485conf->flags &= ~SER_RS485_RTS_AFTER_SEND;
134 } else {
135 cr3 |= USART_CR3_DEP;
136 rs485conf->flags |= SER_RS485_RTS_AFTER_SEND;
137 }
138
139 writel_relaxed(cr3, port->membase + ofs->cr3);
140 writel_relaxed(cr1, port->membase + ofs->cr1);
141 } else {
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100142 stm32_usart_clr_bits(port, ofs->cr3,
143 USART_CR3_DEM | USART_CR3_DEP);
144 stm32_usart_clr_bits(port, ofs->cr1,
145 USART_CR1_DEDT_MASK | USART_CR1_DEAT_MASK);
Bich HEMON1bcda092018-03-12 09:50:05 +0000146 }
147
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100148 stm32_usart_set_bits(port, ofs->cr1, BIT(cfg->uart_enable_bit));
Bich HEMON1bcda092018-03-12 09:50:05 +0000149
150 return 0;
151}
152
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100153static int stm32_usart_init_rs485(struct uart_port *port,
154 struct platform_device *pdev)
Bich HEMON1bcda092018-03-12 09:50:05 +0000155{
156 struct serial_rs485 *rs485conf = &port->rs485;
157
158 rs485conf->flags = 0;
159 rs485conf->delay_rts_before_send = 0;
160 rs485conf->delay_rts_after_send = 0;
161
162 if (!pdev->dev.of_node)
163 return -ENODEV;
164
Lukas Wunnerc150c0f2020-05-12 14:40:02 +0200165 return uart_get_rs485_mode(port);
Bich HEMON1bcda092018-03-12 09:50:05 +0000166}
167
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200168static bool stm32_usart_rx_dma_enabled(struct uart_port *port)
Alexandre TORGUE34891872016-09-15 18:42:40 +0200169{
170 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800171 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Alexandre TORGUE34891872016-09-15 18:42:40 +0200172
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200173 if (!stm32_port->rx_ch)
174 return false;
Alexandre TORGUE34891872016-09-15 18:42:40 +0200175
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200176 return !!(readl_relaxed(port->membase + ofs->cr3) & USART_CR3_DMAR);
Alexandre TORGUE34891872016-09-15 18:42:40 +0200177}
178
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200179/* Return true when data is pending (in pio mode), and false when no data is pending. */
180static bool stm32_usart_pending_rx_pio(struct uart_port *port, u32 *sr)
181{
182 struct stm32_port *stm32_port = to_stm32_port(port);
183 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
184
185 *sr = readl_relaxed(port->membase + ofs->isr);
186 /* Get pending characters in RDR or FIFO */
187 if (*sr & USART_SR_RXNE) {
188 /* Get all pending characters from the RDR or the FIFO when using interrupts */
189 if (!stm32_usart_rx_dma_enabled(port))
190 return true;
191
192 /* Handle only RX data errors when using DMA */
193 if (*sr & USART_SR_ERR_MASK)
194 return true;
195 }
196
197 return false;
198}
199
200static unsigned long stm32_usart_get_char_pio(struct uart_port *port)
Alexandre TORGUE34891872016-09-15 18:42:40 +0200201{
202 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800203 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Alexandre TORGUE34891872016-09-15 18:42:40 +0200204 unsigned long c;
205
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200206 c = readl_relaxed(port->membase + ofs->rdr);
207 /* Apply RDR data mask */
208 c &= stm32_port->rdr_mask;
Erwan Le Ray6c5962f2019-05-21 17:45:43 +0200209
210 return c;
Alexandre TORGUE34891872016-09-15 18:42:40 +0200211}
212
Erwan Le Ray6333a482021-10-25 15:42:29 +0200213static unsigned int stm32_usart_receive_chars_pio(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200214{
Alexandre TORGUEada86182016-09-15 18:42:33 +0200215 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800216 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200217 unsigned long c;
Erwan Le Ray6333a482021-10-25 15:42:29 +0200218 unsigned int size = 0;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200219 u32 sr;
220 char flag;
221
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200222 while (stm32_usart_pending_rx_pio(port, &sr)) {
Maxime Coquelin48a60922015-06-10 21:19:36 +0200223 sr |= USART_SR_DUMMY_RX;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200224 flag = TTY_NORMAL;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200225
Erwan Le Ray4f01d832019-05-21 17:45:42 +0200226 /*
227 * Status bits has to be cleared before reading the RDR:
228 * In FIFO mode, reading the RDR will pop the next data
229 * (if any) along with its status bits into the SR.
230 * Not doing so leads to misalignement between RDR and SR,
231 * and clear status bits of the next rx data.
232 *
233 * Clear errors flags for stm32f7 and stm32h7 compatible
234 * devices. On stm32f4 compatible devices, the error bit is
235 * cleared by the sequence [read SR - read DR].
236 */
237 if ((sr & USART_SR_ERR_MASK) && ofs->icr != UNDEF_REG)
Fabrice Gasnier1250ed72019-11-21 09:10:49 +0100238 writel_relaxed(sr & USART_SR_ERR_MASK,
239 port->membase + ofs->icr);
Erwan Le Ray4f01d832019-05-21 17:45:42 +0200240
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200241 c = stm32_usart_get_char_pio(port);
Erwan Le Ray4f01d832019-05-21 17:45:42 +0200242 port->icount.rx++;
Erwan Le Ray6333a482021-10-25 15:42:29 +0200243 size++;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200244 if (sr & USART_SR_ERR_MASK) {
Erwan Le Ray4f01d832019-05-21 17:45:42 +0200245 if (sr & USART_SR_ORE) {
Maxime Coquelin48a60922015-06-10 21:19:36 +0200246 port->icount.overrun++;
247 } else if (sr & USART_SR_PE) {
248 port->icount.parity++;
249 } else if (sr & USART_SR_FE) {
Erwan Le Ray4f01d832019-05-21 17:45:42 +0200250 /* Break detection if character is null */
251 if (!c) {
252 port->icount.brk++;
253 if (uart_handle_break(port))
254 continue;
255 } else {
256 port->icount.frame++;
257 }
Maxime Coquelin48a60922015-06-10 21:19:36 +0200258 }
259
260 sr &= port->read_status_mask;
261
Erwan Le Ray4f01d832019-05-21 17:45:42 +0200262 if (sr & USART_SR_PE) {
Maxime Coquelin48a60922015-06-10 21:19:36 +0200263 flag = TTY_PARITY;
Erwan Le Ray4f01d832019-05-21 17:45:42 +0200264 } else if (sr & USART_SR_FE) {
265 if (!c)
266 flag = TTY_BREAK;
267 else
268 flag = TTY_FRAME;
269 }
Maxime Coquelin48a60922015-06-10 21:19:36 +0200270 }
271
Johan Hovoldcea37af2021-04-16 16:05:57 +0200272 if (uart_prepare_sysrq_char(port, c))
Maxime Coquelin48a60922015-06-10 21:19:36 +0200273 continue;
274 uart_insert_char(port, sr, USART_SR_ORE, c, flag);
275 }
Erwan Le Ray6333a482021-10-25 15:42:29 +0200276
277 return size;
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200278}
279
280static void stm32_usart_push_buffer_dma(struct uart_port *port, unsigned int dma_size)
281{
282 struct stm32_port *stm32_port = to_stm32_port(port);
283 struct tty_port *ttyport = &stm32_port->port.state->port;
284 unsigned char *dma_start;
285 int dma_count, i;
286
287 dma_start = stm32_port->rx_buf + (RX_BUF_L - stm32_port->last_res);
288
289 /*
290 * Apply rdr_mask on buffer in order to mask parity bit.
291 * This loop is useless in cs8 mode because DMA copies only
292 * 8 bits and already ignores parity bit.
293 */
294 if (!(stm32_port->rdr_mask == (BIT(8) - 1)))
295 for (i = 0; i < dma_size; i++)
296 *(dma_start + i) &= stm32_port->rdr_mask;
297
298 dma_count = tty_insert_flip_string(ttyport, dma_start, dma_size);
299 port->icount.rx += dma_count;
300 if (dma_count != dma_size)
301 port->icount.buf_overrun++;
302 stm32_port->last_res -= dma_count;
303 if (stm32_port->last_res == 0)
304 stm32_port->last_res = RX_BUF_L;
305}
306
Erwan Le Ray6333a482021-10-25 15:42:29 +0200307static unsigned int stm32_usart_receive_chars_dma(struct uart_port *port)
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200308{
309 struct stm32_port *stm32_port = to_stm32_port(port);
Erwan Le Ray6333a482021-10-25 15:42:29 +0200310 unsigned int dma_size, size = 0;
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200311
312 /* DMA buffer is configured in cyclic mode and handles the rollback of the buffer. */
313 if (stm32_port->rx_dma_state.residue > stm32_port->last_res) {
314 /* Conditional first part: from last_res to end of DMA buffer */
315 dma_size = stm32_port->last_res;
316 stm32_usart_push_buffer_dma(port, dma_size);
Erwan Le Ray6333a482021-10-25 15:42:29 +0200317 size = dma_size;
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200318 }
319
320 dma_size = stm32_port->last_res - stm32_port->rx_dma_state.residue;
321 stm32_usart_push_buffer_dma(port, dma_size);
Erwan Le Ray6333a482021-10-25 15:42:29 +0200322 size += dma_size;
323
324 return size;
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200325}
326
Erwan Le Ray6333a482021-10-25 15:42:29 +0200327static unsigned int stm32_usart_receive_chars(struct uart_port *port, bool force_dma_flush)
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200328{
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200329 struct stm32_port *stm32_port = to_stm32_port(port);
330 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
331 enum dma_status rx_dma_status;
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200332 u32 sr;
Erwan Le Ray6333a482021-10-25 15:42:29 +0200333 unsigned int size = 0;
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200334
Erwan Le Ray6333a482021-10-25 15:42:29 +0200335 if (stm32_usart_rx_dma_enabled(port) || force_dma_flush) {
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200336 rx_dma_status = dmaengine_tx_status(stm32_port->rx_ch,
337 stm32_port->rx_ch->cookie,
338 &stm32_port->rx_dma_state);
339 if (rx_dma_status == DMA_IN_PROGRESS) {
340 /* Empty DMA buffer */
Erwan Le Ray6333a482021-10-25 15:42:29 +0200341 size = stm32_usart_receive_chars_dma(port);
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200342 sr = readl_relaxed(port->membase + ofs->isr);
343 if (sr & USART_SR_ERR_MASK) {
344 /* Disable DMA request line */
345 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAR);
346
347 /* Switch to PIO mode to handle the errors */
Erwan Le Ray6333a482021-10-25 15:42:29 +0200348 size += stm32_usart_receive_chars_pio(port);
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200349
350 /* Switch back to DMA mode */
351 stm32_usart_set_bits(port, ofs->cr3, USART_CR3_DMAR);
352 }
353 } else {
354 /* Disable RX DMA */
355 dmaengine_terminate_async(stm32_port->rx_ch);
356 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAR);
357 /* Fall back to interrupt mode */
358 dev_dbg(port->dev, "DMA error, fallback to irq mode\n");
Erwan Le Ray6333a482021-10-25 15:42:29 +0200359 size = stm32_usart_receive_chars_pio(port);
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200360 }
361 } else {
Erwan Le Ray6333a482021-10-25 15:42:29 +0200362 size = stm32_usart_receive_chars_pio(port);
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200363 }
Maxime Coquelin48a60922015-06-10 21:19:36 +0200364
Erwan Le Ray6333a482021-10-25 15:42:29 +0200365 return size;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200366}
367
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100368static void stm32_usart_tx_dma_complete(void *arg)
Alexandre TORGUE34891872016-09-15 18:42:40 +0200369{
370 struct uart_port *port = arg;
371 struct stm32_port *stm32port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800372 const struct stm32_usart_offsets *ofs = &stm32port->info->ofs;
Erwan Le Rayf16b90c2021-03-04 17:23:04 +0100373 unsigned long flags;
Alexandre TORGUE34891872016-09-15 18:42:40 +0200374
Erwan Le Rayfb4f2e02021-03-04 17:23:03 +0100375 dmaengine_terminate_async(stm32port->tx_ch);
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100376 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT);
Alexandre TORGUE34891872016-09-15 18:42:40 +0200377 stm32port->tx_dma_busy = false;
378
379 /* Let's see if we have pending data to send */
Erwan Le Rayf16b90c2021-03-04 17:23:04 +0100380 spin_lock_irqsave(&port->lock, flags);
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100381 stm32_usart_transmit_chars(port);
Erwan Le Rayf16b90c2021-03-04 17:23:04 +0100382 spin_unlock_irqrestore(&port->lock, flags);
Alexandre TORGUE34891872016-09-15 18:42:40 +0200383}
384
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100385static void stm32_usart_tx_interrupt_enable(struct uart_port *port)
Erwan Le Rayd0757192019-06-18 12:02:24 +0200386{
387 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800388 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Erwan Le Rayd0757192019-06-18 12:02:24 +0200389
390 /*
391 * Enables TX FIFO threashold irq when FIFO is enabled,
392 * or TX empty irq when FIFO is disabled
393 */
Fabrice Gasnier2aa1bbb2021-04-13 19:40:15 +0200394 if (stm32_port->fifoen && stm32_port->txftcfg >= 0)
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100395 stm32_usart_set_bits(port, ofs->cr3, USART_CR3_TXFTIE);
Erwan Le Rayd0757192019-06-18 12:02:24 +0200396 else
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100397 stm32_usart_set_bits(port, ofs->cr1, USART_CR1_TXEIE);
Erwan Le Rayd0757192019-06-18 12:02:24 +0200398}
399
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200400static void stm32_usart_rx_dma_complete(void *arg)
401{
402 struct uart_port *port = arg;
Erwan Le Ray6333a482021-10-25 15:42:29 +0200403 struct tty_port *tport = &port->state->port;
404 unsigned int size;
405 unsigned long flags;
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200406
Erwan Le Ray6333a482021-10-25 15:42:29 +0200407 spin_lock_irqsave(&port->lock, flags);
408 size = stm32_usart_receive_chars(port, false);
409 uart_unlock_and_check_sysrq_irqrestore(port, flags);
410 if (size)
411 tty_flip_buffer_push(tport);
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200412}
413
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100414static void stm32_usart_tx_interrupt_disable(struct uart_port *port)
Erwan Le Rayd0757192019-06-18 12:02:24 +0200415{
416 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800417 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Erwan Le Rayd0757192019-06-18 12:02:24 +0200418
Fabrice Gasnier2aa1bbb2021-04-13 19:40:15 +0200419 if (stm32_port->fifoen && stm32_port->txftcfg >= 0)
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100420 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_TXFTIE);
Erwan Le Rayd0757192019-06-18 12:02:24 +0200421 else
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100422 stm32_usart_clr_bits(port, ofs->cr1, USART_CR1_TXEIE);
Erwan Le Rayd0757192019-06-18 12:02:24 +0200423}
424
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100425static void stm32_usart_transmit_chars_pio(struct uart_port *port)
Alexandre TORGUE34891872016-09-15 18:42:40 +0200426{
427 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800428 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Alexandre TORGUE34891872016-09-15 18:42:40 +0200429 struct circ_buf *xmit = &port->state->xmit;
Alexandre TORGUE34891872016-09-15 18:42:40 +0200430
431 if (stm32_port->tx_dma_busy) {
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100432 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT);
Alexandre TORGUE34891872016-09-15 18:42:40 +0200433 stm32_port->tx_dma_busy = false;
434 }
435
Erwan Le Ray5d9176e2019-06-18 12:02:23 +0200436 while (!uart_circ_empty(xmit)) {
437 /* Check that TDR is empty before filling FIFO */
438 if (!(readl_relaxed(port->membase + ofs->isr) & USART_SR_TXE))
439 break;
440 writel_relaxed(xmit->buf[xmit->tail], port->membase + ofs->tdr);
441 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
442 port->icount.tx++;
443 }
Alexandre TORGUE34891872016-09-15 18:42:40 +0200444
Erwan Le Ray5d9176e2019-06-18 12:02:23 +0200445 /* rely on TXE irq (mask or unmask) for sending remaining data */
446 if (uart_circ_empty(xmit))
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100447 stm32_usart_tx_interrupt_disable(port);
Erwan Le Ray5d9176e2019-06-18 12:02:23 +0200448 else
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100449 stm32_usart_tx_interrupt_enable(port);
Alexandre TORGUE34891872016-09-15 18:42:40 +0200450}
451
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100452static void stm32_usart_transmit_chars_dma(struct uart_port *port)
Alexandre TORGUE34891872016-09-15 18:42:40 +0200453{
454 struct stm32_port *stm32port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800455 const struct stm32_usart_offsets *ofs = &stm32port->info->ofs;
Alexandre TORGUE34891872016-09-15 18:42:40 +0200456 struct circ_buf *xmit = &port->state->xmit;
457 struct dma_async_tx_descriptor *desc = NULL;
Alexandre TORGUE34891872016-09-15 18:42:40 +0200458 unsigned int count, i;
459
460 if (stm32port->tx_dma_busy)
461 return;
462
463 stm32port->tx_dma_busy = true;
464
465 count = uart_circ_chars_pending(xmit);
466
467 if (count > TX_BUF_L)
468 count = TX_BUF_L;
469
470 if (xmit->tail < xmit->head) {
471 memcpy(&stm32port->tx_buf[0], &xmit->buf[xmit->tail], count);
472 } else {
473 size_t one = UART_XMIT_SIZE - xmit->tail;
474 size_t two;
475
476 if (one > count)
477 one = count;
478 two = count - one;
479
480 memcpy(&stm32port->tx_buf[0], &xmit->buf[xmit->tail], one);
481 if (two)
482 memcpy(&stm32port->tx_buf[one], &xmit->buf[0], two);
483 }
484
485 desc = dmaengine_prep_slave_single(stm32port->tx_ch,
486 stm32port->tx_dma_buf,
487 count,
488 DMA_MEM_TO_DEV,
489 DMA_PREP_INTERRUPT);
490
Erwan Le Raye7997f72021-01-06 17:21:56 +0100491 if (!desc)
492 goto fallback_err;
Alexandre TORGUE34891872016-09-15 18:42:40 +0200493
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100494 desc->callback = stm32_usart_tx_dma_complete;
Alexandre TORGUE34891872016-09-15 18:42:40 +0200495 desc->callback_param = port;
496
497 /* Push current DMA TX transaction in the pending queue */
Erwan Le Raye7997f72021-01-06 17:21:56 +0100498 if (dma_submit_error(dmaengine_submit(desc))) {
499 /* dma no yet started, safe to free resources */
500 dmaengine_terminate_async(stm32port->tx_ch);
501 goto fallback_err;
502 }
Alexandre TORGUE34891872016-09-15 18:42:40 +0200503
504 /* Issue pending DMA TX requests */
505 dma_async_issue_pending(stm32port->tx_ch);
506
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100507 stm32_usart_set_bits(port, ofs->cr3, USART_CR3_DMAT);
Alexandre TORGUE34891872016-09-15 18:42:40 +0200508
509 xmit->tail = (xmit->tail + count) & (UART_XMIT_SIZE - 1);
510 port->icount.tx += count;
Erwan Le Raye7997f72021-01-06 17:21:56 +0100511 return;
512
513fallback_err:
514 for (i = count; i > 0; i--)
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100515 stm32_usart_transmit_chars_pio(port);
Alexandre TORGUE34891872016-09-15 18:42:40 +0200516}
517
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100518static void stm32_usart_transmit_chars(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200519{
Alexandre TORGUEada86182016-09-15 18:42:33 +0200520 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800521 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200522 struct circ_buf *xmit = &port->state->xmit;
523
524 if (port->x_char) {
Alexandre TORGUE34891872016-09-15 18:42:40 +0200525 if (stm32_port->tx_dma_busy)
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100526 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT);
Alexandre TORGUEada86182016-09-15 18:42:33 +0200527 writel_relaxed(port->x_char, port->membase + ofs->tdr);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200528 port->x_char = 0;
529 port->icount.tx++;
Alexandre TORGUE34891872016-09-15 18:42:40 +0200530 if (stm32_port->tx_dma_busy)
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100531 stm32_usart_set_bits(port, ofs->cr3, USART_CR3_DMAT);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200532 return;
533 }
534
Erwan Le Rayb83b9572019-05-21 17:45:44 +0200535 if (uart_circ_empty(xmit) || uart_tx_stopped(port)) {
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100536 stm32_usart_tx_interrupt_disable(port);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200537 return;
538 }
539
Erwan Le Ray64c32ea2019-05-21 17:45:45 +0200540 if (ofs->icr == UNDEF_REG)
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100541 stm32_usart_clr_bits(port, ofs->isr, USART_SR_TC);
Erwan Le Ray64c32ea2019-05-21 17:45:45 +0200542 else
Fabrice Gasnier1250ed72019-11-21 09:10:49 +0100543 writel_relaxed(USART_ICR_TCCF, port->membase + ofs->icr);
Erwan Le Ray64c32ea2019-05-21 17:45:45 +0200544
Alexandre TORGUE34891872016-09-15 18:42:40 +0200545 if (stm32_port->tx_ch)
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100546 stm32_usart_transmit_chars_dma(port);
Alexandre TORGUE34891872016-09-15 18:42:40 +0200547 else
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100548 stm32_usart_transmit_chars_pio(port);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200549
550 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
551 uart_write_wakeup(port);
552
553 if (uart_circ_empty(xmit))
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100554 stm32_usart_tx_interrupt_disable(port);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200555}
556
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100557static irqreturn_t stm32_usart_interrupt(int irq, void *ptr)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200558{
559 struct uart_port *port = ptr;
Erwan Le Ray12761862021-03-04 17:23:01 +0100560 struct tty_port *tport = &port->state->port;
Alexandre TORGUEada86182016-09-15 18:42:33 +0200561 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800562 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200563 u32 sr;
Erwan Le Ray6333a482021-10-25 15:42:29 +0200564 unsigned int size;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200565
Alexandre TORGUEada86182016-09-15 18:42:33 +0200566 sr = readl_relaxed(port->membase + ofs->isr);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200567
Erwan Le Ray4cc0ed62019-06-18 12:02:22 +0200568 if ((sr & USART_SR_RTOF) && ofs->icr != UNDEF_REG)
569 writel_relaxed(USART_ICR_RTOCF,
570 port->membase + ofs->icr);
571
Erwan Le Ray12761862021-03-04 17:23:01 +0100572 if ((sr & USART_SR_WUF) && ofs->icr != UNDEF_REG) {
573 /* Clear wake up flag and disable wake up interrupt */
Fabrice Gasnier270e5a72017-07-13 15:08:30 +0000574 writel_relaxed(USART_ICR_WUCF,
575 port->membase + ofs->icr);
Erwan Le Ray12761862021-03-04 17:23:01 +0100576 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_WUFIE);
577 if (irqd_is_wakeup_set(irq_get_irq_data(port->irq)))
578 pm_wakeup_event(tport->tty->dev, 0);
579 }
Fabrice Gasnier270e5a72017-07-13 15:08:30 +0000580
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200581 /*
582 * rx errors in dma mode has to be handled ASAP to avoid overrun as the DMA request
583 * line has been masked by HW and rx data are stacking in FIFO.
584 */
Erwan Le Rayd1ec8a22021-10-20 17:03:32 +0200585 if (!stm32_port->throttled) {
586 if (((sr & USART_SR_RXNE) && !stm32_usart_rx_dma_enabled(port)) ||
587 ((sr & USART_SR_ERR_MASK) && stm32_usart_rx_dma_enabled(port))) {
Erwan Le Ray6333a482021-10-25 15:42:29 +0200588 spin_lock(&port->lock);
589 size = stm32_usart_receive_chars(port, false);
590 uart_unlock_and_check_sysrq(port);
591 if (size)
592 tty_flip_buffer_push(tport);
Erwan Le Rayd1ec8a22021-10-20 17:03:32 +0200593 }
594 }
Maxime Coquelin48a60922015-06-10 21:19:36 +0200595
Erwan Le Rayad767682021-03-04 17:23:00 +0100596 if ((sr & USART_SR_TXE) && !(stm32_port->tx_ch)) {
597 spin_lock(&port->lock);
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100598 stm32_usart_transmit_chars(port);
Erwan Le Rayad767682021-03-04 17:23:00 +0100599 spin_unlock(&port->lock);
600 }
Alexandre TORGUE01d32d72016-09-15 18:42:41 +0200601
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200602 if (stm32_usart_rx_dma_enabled(port))
Alexandre TORGUE34891872016-09-15 18:42:40 +0200603 return IRQ_WAKE_THREAD;
604 else
605 return IRQ_HANDLED;
606}
607
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100608static irqreturn_t stm32_usart_threaded_interrupt(int irq, void *ptr)
Alexandre TORGUE34891872016-09-15 18:42:40 +0200609{
610 struct uart_port *port = ptr;
Erwan Le Ray6333a482021-10-25 15:42:29 +0200611 struct tty_port *tport = &port->state->port;
Erwan Le Rayd1ec8a22021-10-20 17:03:32 +0200612 struct stm32_port *stm32_port = to_stm32_port(port);
Erwan Le Ray6333a482021-10-25 15:42:29 +0200613 unsigned int size;
614 unsigned long flags;
Alexandre TORGUE34891872016-09-15 18:42:40 +0200615
Erwan Le Raycc58d0a2021-10-20 17:03:30 +0200616 /* Receiver timeout irq for DMA RX */
Erwan Le Ray6333a482021-10-25 15:42:29 +0200617 if (!stm32_port->throttled) {
618 spin_lock_irqsave(&port->lock, flags);
619 size = stm32_usart_receive_chars(port, false);
620 uart_unlock_and_check_sysrq_irqrestore(port, flags);
621 if (size)
622 tty_flip_buffer_push(tport);
623 }
Alexandre TORGUE34891872016-09-15 18:42:40 +0200624
Maxime Coquelin48a60922015-06-10 21:19:36 +0200625 return IRQ_HANDLED;
626}
627
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100628static unsigned int stm32_usart_tx_empty(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200629{
Alexandre TORGUEada86182016-09-15 18:42:33 +0200630 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800631 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Alexandre TORGUEada86182016-09-15 18:42:33 +0200632
Erwan Le Ray3db1d522021-03-04 17:23:07 +0100633 if (readl_relaxed(port->membase + ofs->isr) & USART_SR_TC)
634 return TIOCSER_TEMT;
635
636 return 0;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200637}
638
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100639static void stm32_usart_set_mctrl(struct uart_port *port, unsigned int mctrl)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200640{
Alexandre TORGUEada86182016-09-15 18:42:33 +0200641 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800642 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Alexandre TORGUEada86182016-09-15 18:42:33 +0200643
Maxime Coquelin48a60922015-06-10 21:19:36 +0200644 if ((mctrl & TIOCM_RTS) && (port->status & UPSTAT_AUTORTS))
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100645 stm32_usart_set_bits(port, ofs->cr3, USART_CR3_RTSE);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200646 else
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100647 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_RTSE);
Manivannan Sadhasivam6cf61b92020-04-20 22:32:04 +0530648
649 mctrl_gpio_set(stm32_port->gpios, mctrl);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200650}
651
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100652static unsigned int stm32_usart_get_mctrl(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200653{
Manivannan Sadhasivam6cf61b92020-04-20 22:32:04 +0530654 struct stm32_port *stm32_port = to_stm32_port(port);
655 unsigned int ret;
656
Maxime Coquelin48a60922015-06-10 21:19:36 +0200657 /* This routine is used to get signals of: DCD, DSR, RI, and CTS */
Manivannan Sadhasivam6cf61b92020-04-20 22:32:04 +0530658 ret = TIOCM_CAR | TIOCM_DSR | TIOCM_CTS;
659
660 return mctrl_gpio_get(stm32_port->gpios, &ret);
661}
662
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100663static void stm32_usart_enable_ms(struct uart_port *port)
Manivannan Sadhasivam6cf61b92020-04-20 22:32:04 +0530664{
665 mctrl_gpio_enable_ms(to_stm32_port(port)->gpios);
666}
667
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100668static void stm32_usart_disable_ms(struct uart_port *port)
Manivannan Sadhasivam6cf61b92020-04-20 22:32:04 +0530669{
670 mctrl_gpio_disable_ms(to_stm32_port(port)->gpios);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200671}
672
673/* Transmit stop */
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100674static void stm32_usart_stop_tx(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200675{
Marek Vasutad0c2742020-08-31 19:10:45 +0200676 struct stm32_port *stm32_port = to_stm32_port(port);
677 struct serial_rs485 *rs485conf = &port->rs485;
678
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100679 stm32_usart_tx_interrupt_disable(port);
Marek Vasutad0c2742020-08-31 19:10:45 +0200680
681 if (rs485conf->flags & SER_RS485_ENABLED) {
682 if (rs485conf->flags & SER_RS485_RTS_ON_SEND) {
683 mctrl_gpio_set(stm32_port->gpios,
684 stm32_port->port.mctrl & ~TIOCM_RTS);
685 } else {
686 mctrl_gpio_set(stm32_port->gpios,
687 stm32_port->port.mctrl | TIOCM_RTS);
688 }
689 }
Maxime Coquelin48a60922015-06-10 21:19:36 +0200690}
691
692/* There are probably characters waiting to be transmitted. */
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100693static void stm32_usart_start_tx(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200694{
Marek Vasutad0c2742020-08-31 19:10:45 +0200695 struct stm32_port *stm32_port = to_stm32_port(port);
696 struct serial_rs485 *rs485conf = &port->rs485;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200697 struct circ_buf *xmit = &port->state->xmit;
698
699 if (uart_circ_empty(xmit))
700 return;
701
Marek Vasutad0c2742020-08-31 19:10:45 +0200702 if (rs485conf->flags & SER_RS485_ENABLED) {
703 if (rs485conf->flags & SER_RS485_RTS_ON_SEND) {
704 mctrl_gpio_set(stm32_port->gpios,
705 stm32_port->port.mctrl | TIOCM_RTS);
706 } else {
707 mctrl_gpio_set(stm32_port->gpios,
708 stm32_port->port.mctrl & ~TIOCM_RTS);
709 }
710 }
711
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100712 stm32_usart_transmit_chars(port);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200713}
714
Erwan Le Ray3d82be82021-03-04 17:23:08 +0100715/* Flush the transmit buffer. */
716static void stm32_usart_flush_buffer(struct uart_port *port)
717{
718 struct stm32_port *stm32_port = to_stm32_port(port);
719 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
720
721 if (stm32_port->tx_ch) {
722 dmaengine_terminate_async(stm32_port->tx_ch);
723 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT);
724 stm32_port->tx_dma_busy = false;
725 }
726}
727
Maxime Coquelin48a60922015-06-10 21:19:36 +0200728/* Throttle the remote when input buffer is about to overflow. */
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100729static void stm32_usart_throttle(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200730{
Alexandre TORGUEada86182016-09-15 18:42:33 +0200731 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800732 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200733 unsigned long flags;
734
735 spin_lock_irqsave(&port->lock, flags);
Erwan Le Rayd1ec8a22021-10-20 17:03:32 +0200736
737 /*
738 * Disable DMA request line if enabled, so the RX data gets queued into the FIFO.
739 * Hardware flow control is triggered when RX FIFO is full.
740 */
741 if (stm32_usart_rx_dma_enabled(port))
742 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAR);
743
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100744 stm32_usart_clr_bits(port, ofs->cr1, stm32_port->cr1_irq);
Erwan Le Rayd0a6a7b2019-06-18 12:02:25 +0200745 if (stm32_port->cr3_irq)
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100746 stm32_usart_clr_bits(port, ofs->cr3, stm32_port->cr3_irq);
Erwan Le Rayd0a6a7b2019-06-18 12:02:25 +0200747
Erwan Le Rayd1ec8a22021-10-20 17:03:32 +0200748 stm32_port->throttled = true;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200749 spin_unlock_irqrestore(&port->lock, flags);
750}
751
752/* Unthrottle the remote, the input buffer can now accept data. */
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100753static void stm32_usart_unthrottle(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200754{
Alexandre TORGUEada86182016-09-15 18:42:33 +0200755 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800756 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200757 unsigned long flags;
758
759 spin_lock_irqsave(&port->lock, flags);
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100760 stm32_usart_set_bits(port, ofs->cr1, stm32_port->cr1_irq);
Erwan Le Rayd0a6a7b2019-06-18 12:02:25 +0200761 if (stm32_port->cr3_irq)
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100762 stm32_usart_set_bits(port, ofs->cr3, stm32_port->cr3_irq);
Erwan Le Rayd0a6a7b2019-06-18 12:02:25 +0200763
Erwan Le Rayd1ec8a22021-10-20 17:03:32 +0200764 /*
765 * Switch back to DMA mode (re-enable DMA request line).
766 * Hardware flow control is stopped when FIFO is not full any more.
767 */
768 if (stm32_port->rx_ch)
769 stm32_usart_set_bits(port, ofs->cr3, USART_CR3_DMAR);
770
771 stm32_port->throttled = false;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200772 spin_unlock_irqrestore(&port->lock, flags);
773}
774
775/* Receive stop */
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100776static void stm32_usart_stop_rx(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200777{
Alexandre TORGUEada86182016-09-15 18:42:33 +0200778 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800779 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Alexandre TORGUEada86182016-09-15 18:42:33 +0200780
Erwan Le Raye0abc902021-10-25 15:42:27 +0200781 /* Disable DMA request line. */
782 if (stm32_port->rx_ch)
783 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAR);
784
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100785 stm32_usart_clr_bits(port, ofs->cr1, stm32_port->cr1_irq);
Erwan Le Rayd0a6a7b2019-06-18 12:02:25 +0200786 if (stm32_port->cr3_irq)
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100787 stm32_usart_clr_bits(port, ofs->cr3, stm32_port->cr3_irq);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200788}
789
790/* Handle breaks - ignored by us */
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100791static void stm32_usart_break_ctl(struct uart_port *port, int break_state)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200792{
793}
794
Erwan Le Ray6eeb3482021-10-25 15:42:28 +0200795static int stm32_usart_start_rx_dma_cyclic(struct uart_port *port)
796{
797 struct stm32_port *stm32_port = to_stm32_port(port);
798 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
799 struct dma_async_tx_descriptor *desc;
800 int ret;
801
802 stm32_port->last_res = RX_BUF_L;
803 /* Prepare a DMA cyclic transaction */
804 desc = dmaengine_prep_dma_cyclic(stm32_port->rx_ch,
805 stm32_port->rx_dma_buf,
806 RX_BUF_L, RX_BUF_P,
807 DMA_DEV_TO_MEM,
808 DMA_PREP_INTERRUPT);
809 if (!desc) {
810 dev_err(port->dev, "rx dma prep cyclic failed\n");
811 return -ENODEV;
812 }
813
814 desc->callback = stm32_usart_rx_dma_complete;
815 desc->callback_param = port;
816
817 /* Push current DMA transaction in the pending queue */
818 ret = dma_submit_error(dmaengine_submit(desc));
819 if (ret) {
820 dmaengine_terminate_sync(stm32_port->rx_ch);
821 return ret;
822 }
823
824 /* Issue pending DMA requests */
825 dma_async_issue_pending(stm32_port->rx_ch);
826
827 /*
828 * DMA request line not re-enabled at resume when port is throttled.
829 * It will be re-enabled by unthrottle ops.
830 */
831 if (!stm32_port->throttled)
832 stm32_usart_set_bits(port, ofs->cr3, USART_CR3_DMAR);
833
834 return 0;
835}
836
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100837static int stm32_usart_startup(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200838{
Alexandre TORGUEada86182016-09-15 18:42:33 +0200839 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800840 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Erwan Le Rayf4518a82021-03-04 17:22:57 +0100841 const struct stm32_usart_config *cfg = &stm32_port->info->cfg;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200842 const char *name = to_platform_device(port->dev)->name;
843 u32 val;
844 int ret;
845
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100846 ret = request_threaded_irq(port->irq, stm32_usart_interrupt,
847 stm32_usart_threaded_interrupt,
Johan Hovolde359b442021-04-16 16:05:56 +0200848 IRQF_ONESHOT | IRQF_NO_SUSPEND,
849 name, port);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200850 if (ret)
851 return ret;
852
Martin Devera3cd66592021-03-28 17:43:06 +0200853 if (stm32_port->swap) {
854 val = readl_relaxed(port->membase + ofs->cr2);
855 val |= USART_CR2_SWAP;
856 writel_relaxed(val, port->membase + ofs->cr2);
857 }
858
Erwan Le Ray84872dc2019-06-18 12:02:26 +0200859 /* RX FIFO Flush */
860 if (ofs->rqr != UNDEF_REG)
Erwan Le Ray315e2d82021-03-04 17:23:05 +0100861 writel_relaxed(USART_RQR_RXFRQ, port->membase + ofs->rqr);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200862
Erwan Le Raye0abc902021-10-25 15:42:27 +0200863 if (stm32_port->rx_ch) {
Erwan Le Ray6eeb3482021-10-25 15:42:28 +0200864 ret = stm32_usart_start_rx_dma_cyclic(port);
Erwan Le Raye0abc902021-10-25 15:42:27 +0200865 if (ret) {
Erwan Le Ray6eeb3482021-10-25 15:42:28 +0200866 free_irq(port->irq, port);
867 return ret;
Erwan Le Raye0abc902021-10-25 15:42:27 +0200868 }
Erwan Le Raye0abc902021-10-25 15:42:27 +0200869 }
Erwan Le Rayd1ec8a22021-10-20 17:03:32 +0200870
Erwan Le Ray25a8e762021-03-04 17:22:59 +0100871 /* RX enabling */
Erwan Le Rayf4518a82021-03-04 17:22:57 +0100872 val = stm32_port->cr1_irq | USART_CR1_RE | BIT(cfg->uart_enable_bit);
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100873 stm32_usart_set_bits(port, ofs->cr1, val);
Erwan Le Ray84872dc2019-06-18 12:02:26 +0200874
Maxime Coquelin48a60922015-06-10 21:19:36 +0200875 return 0;
876}
877
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100878static void stm32_usart_shutdown(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200879{
Alexandre TORGUEada86182016-09-15 18:42:33 +0200880 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800881 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
882 const struct stm32_usart_config *cfg = &stm32_port->info->cfg;
Erwan Le Ray64c32ea2019-05-21 17:45:45 +0200883 u32 val, isr;
884 int ret;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200885
Manivannan Sadhasivam6cf61b92020-04-20 22:32:04 +0530886 /* Disable modem control interrupts */
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100887 stm32_usart_disable_ms(port);
Manivannan Sadhasivam6cf61b92020-04-20 22:32:04 +0530888
Erwan Le Ray4cc0ed62019-06-18 12:02:22 +0200889 val = USART_CR1_TXEIE | USART_CR1_TE;
890 val |= stm32_port->cr1_irq | USART_CR1_RE;
Alexandre TORGUE87f1f802016-09-15 18:42:42 +0200891 val |= BIT(cfg->uart_enable_bit);
Gerald Baeza351a7622017-07-13 15:08:30 +0000892 if (stm32_port->fifoen)
893 val |= USART_CR1_FIFOEN;
Erwan Le Ray64c32ea2019-05-21 17:45:45 +0200894
895 ret = readl_relaxed_poll_timeout(port->membase + ofs->isr,
896 isr, (isr & USART_SR_TC),
897 10, 100000);
898
Erwan Le Rayc31c3ea2021-01-06 17:22:03 +0100899 /* Send the TC error message only when ISR_TC is not set */
Erwan Le Ray64c32ea2019-05-21 17:45:45 +0200900 if (ret)
Erwan Le Rayc31c3ea2021-01-06 17:22:03 +0100901 dev_err(port->dev, "Transmission is not complete\n");
Erwan Le Ray64c32ea2019-05-21 17:45:45 +0200902
Erwan Le Raye0abc902021-10-25 15:42:27 +0200903 /* Disable RX DMA. */
904 if (stm32_port->rx_ch)
905 dmaengine_terminate_async(stm32_port->rx_ch);
906
Erwan Le Ray9f77d192021-03-04 17:23:06 +0100907 /* flush RX & TX FIFO */
908 if (ofs->rqr != UNDEF_REG)
909 writel_relaxed(USART_RQR_TXFRQ | USART_RQR_RXFRQ,
910 port->membase + ofs->rqr);
911
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100912 stm32_usart_clr_bits(port, ofs->cr1, val);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200913
914 free_irq(port->irq, port);
915}
916
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100917static void stm32_usart_set_termios(struct uart_port *port,
918 struct ktermios *termios,
919 struct ktermios *old)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200920{
921 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800922 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
923 const struct stm32_usart_config *cfg = &stm32_port->info->cfg;
Bich HEMON1bcda092018-03-12 09:50:05 +0000924 struct serial_rs485 *rs485conf = &port->rs485;
Erwan Le Rayc8a9d042019-05-21 17:45:41 +0200925 unsigned int baud, bits;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200926 u32 usartdiv, mantissa, fraction, oversampling;
927 tcflag_t cflag = termios->c_cflag;
Erwan Le Rayf264c6f2021-03-04 17:22:58 +0100928 u32 cr1, cr2, cr3, isr;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200929 unsigned long flags;
Erwan Le Rayf264c6f2021-03-04 17:22:58 +0100930 int ret;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200931
932 if (!stm32_port->hw_flow_control)
933 cflag &= ~CRTSCTS;
934
935 baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 8);
936
937 spin_lock_irqsave(&port->lock, flags);
938
Erwan Le Rayf264c6f2021-03-04 17:22:58 +0100939 ret = readl_relaxed_poll_timeout_atomic(port->membase + ofs->isr,
940 isr,
941 (isr & USART_SR_TC),
942 10, 100000);
943
944 /* Send the TC error message only when ISR_TC is not set. */
945 if (ret)
946 dev_err(port->dev, "Transmission is not complete\n");
947
Maxime Coquelin48a60922015-06-10 21:19:36 +0200948 /* Stop serial port and reset value */
Alexandre TORGUEada86182016-09-15 18:42:33 +0200949 writel_relaxed(0, port->membase + ofs->cr1);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200950
Erwan Le Ray84872dc2019-06-18 12:02:26 +0200951 /* flush RX & TX FIFO */
952 if (ofs->rqr != UNDEF_REG)
Erwan Le Ray315e2d82021-03-04 17:23:05 +0100953 writel_relaxed(USART_RQR_TXFRQ | USART_RQR_RXFRQ,
954 port->membase + ofs->rqr);
Bich HEMON1bcda092018-03-12 09:50:05 +0000955
Erwan Le Ray84872dc2019-06-18 12:02:26 +0200956 cr1 = USART_CR1_TE | USART_CR1_RE;
Gerald Baeza351a7622017-07-13 15:08:30 +0000957 if (stm32_port->fifoen)
958 cr1 |= USART_CR1_FIFOEN;
Martin Devera3cd66592021-03-28 17:43:06 +0200959 cr2 = stm32_port->swap ? USART_CR2_SWAP : 0;
Erwan Le Ray25a8e762021-03-04 17:22:59 +0100960
961 /* Tx and RX FIFO configuration */
Erwan Le Rayd0757192019-06-18 12:02:24 +0200962 cr3 = readl_relaxed(port->membase + ofs->cr3);
Erwan Le Ray25a8e762021-03-04 17:22:59 +0100963 cr3 &= USART_CR3_TXFTIE | USART_CR3_RXFTIE;
964 if (stm32_port->fifoen) {
Fabrice Gasnier2aa1bbb2021-04-13 19:40:15 +0200965 if (stm32_port->txftcfg >= 0)
966 cr3 |= stm32_port->txftcfg << USART_CR3_TXFTCFG_SHIFT;
967 if (stm32_port->rxftcfg >= 0)
968 cr3 |= stm32_port->rxftcfg << USART_CR3_RXFTCFG_SHIFT;
Erwan Le Ray25a8e762021-03-04 17:22:59 +0100969 }
Maxime Coquelin48a60922015-06-10 21:19:36 +0200970
971 if (cflag & CSTOPB)
972 cr2 |= USART_CR2_STOP_2B;
973
Jiri Slaby3ec2ff32021-06-10 11:02:47 +0200974 bits = tty_get_char_size(cflag);
Erwan Le Ray6c5962f2019-05-21 17:45:43 +0200975 stm32_port->rdr_mask = (BIT(bits) - 1);
Erwan Le Rayc8a9d042019-05-21 17:45:41 +0200976
Maxime Coquelin48a60922015-06-10 21:19:36 +0200977 if (cflag & PARENB) {
Erwan Le Rayc8a9d042019-05-21 17:45:41 +0200978 bits++;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200979 cr1 |= USART_CR1_PCE;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200980 }
981
Erwan Le Rayc8a9d042019-05-21 17:45:41 +0200982 /*
983 * Word length configuration:
984 * CS8 + parity, 9 bits word aka [M1:M0] = 0b01
985 * CS7 or (CS6 + parity), 7 bits word aka [M1:M0] = 0b10
986 * CS8 or (CS7 + parity), 8 bits word aka [M1:M0] = 0b00
987 * M0 and M1 already cleared by cr1 initialization.
988 */
989 if (bits == 9)
990 cr1 |= USART_CR1_M0;
991 else if ((bits == 7) && cfg->has_7bits_data)
992 cr1 |= USART_CR1_M1;
993 else if (bits != 8)
994 dev_dbg(port->dev, "Unsupported data bits config: %u bits\n"
995 , bits);
996
Erwan Le Ray4cc0ed62019-06-18 12:02:22 +0200997 if (ofs->rtor != UNDEF_REG && (stm32_port->rx_ch ||
Fabrice Gasnier2aa1bbb2021-04-13 19:40:15 +0200998 (stm32_port->fifoen &&
999 stm32_port->rxftcfg >= 0))) {
Erwan Le Ray4cc0ed62019-06-18 12:02:22 +02001000 if (cflag & CSTOPB)
1001 bits = bits + 3; /* 1 start bit + 2 stop bits */
1002 else
1003 bits = bits + 2; /* 1 start bit + 1 stop bit */
1004
1005 /* RX timeout irq to occur after last stop bit + bits */
1006 stm32_port->cr1_irq = USART_CR1_RTOIE;
1007 writel_relaxed(bits, port->membase + ofs->rtor);
1008 cr2 |= USART_CR2_RTOEN;
Erwan Le Ray33bb2f62021-10-20 17:03:31 +02001009 /*
1010 * Enable fifo threshold irq in two cases, either when there is no DMA, or when
1011 * wake up over usart, from low power until the DMA gets re-enabled by resume.
1012 */
1013 stm32_port->cr3_irq = USART_CR3_RXFTIE;
Erwan Le Ray4cc0ed62019-06-18 12:02:22 +02001014 }
1015
Erwan Le Rayd0a6a7b2019-06-18 12:02:25 +02001016 cr1 |= stm32_port->cr1_irq;
1017 cr3 |= stm32_port->cr3_irq;
1018
Maxime Coquelin48a60922015-06-10 21:19:36 +02001019 if (cflag & PARODD)
1020 cr1 |= USART_CR1_PS;
1021
1022 port->status &= ~(UPSTAT_AUTOCTS | UPSTAT_AUTORTS);
1023 if (cflag & CRTSCTS) {
1024 port->status |= UPSTAT_AUTOCTS | UPSTAT_AUTORTS;
Bich HEMON35abe982017-07-13 15:08:28 +00001025 cr3 |= USART_CR3_CTSE | USART_CR3_RTSE;
Maxime Coquelin48a60922015-06-10 21:19:36 +02001026 }
1027
1028 usartdiv = DIV_ROUND_CLOSEST(port->uartclk, baud);
1029
1030 /*
1031 * The USART supports 16 or 8 times oversampling.
1032 * By default we prefer 16 times oversampling, so that the receiver
1033 * has a better tolerance to clock deviations.
1034 * 8 times oversampling is only used to achieve higher speeds.
1035 */
1036 if (usartdiv < 16) {
1037 oversampling = 8;
Bich HEMON1bcda092018-03-12 09:50:05 +00001038 cr1 |= USART_CR1_OVER8;
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001039 stm32_usart_set_bits(port, ofs->cr1, USART_CR1_OVER8);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001040 } else {
1041 oversampling = 16;
Bich HEMON1bcda092018-03-12 09:50:05 +00001042 cr1 &= ~USART_CR1_OVER8;
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001043 stm32_usart_clr_bits(port, ofs->cr1, USART_CR1_OVER8);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001044 }
1045
1046 mantissa = (usartdiv / oversampling) << USART_BRR_DIV_M_SHIFT;
1047 fraction = usartdiv % oversampling;
Alexandre TORGUEada86182016-09-15 18:42:33 +02001048 writel_relaxed(mantissa | fraction, port->membase + ofs->brr);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001049
1050 uart_update_timeout(port, cflag, baud);
1051
1052 port->read_status_mask = USART_SR_ORE;
1053 if (termios->c_iflag & INPCK)
1054 port->read_status_mask |= USART_SR_PE | USART_SR_FE;
1055 if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
Erwan Le Ray4f01d832019-05-21 17:45:42 +02001056 port->read_status_mask |= USART_SR_FE;
Maxime Coquelin48a60922015-06-10 21:19:36 +02001057
1058 /* Characters to ignore */
1059 port->ignore_status_mask = 0;
1060 if (termios->c_iflag & IGNPAR)
1061 port->ignore_status_mask = USART_SR_PE | USART_SR_FE;
1062 if (termios->c_iflag & IGNBRK) {
Erwan Le Ray4f01d832019-05-21 17:45:42 +02001063 port->ignore_status_mask |= USART_SR_FE;
Maxime Coquelin48a60922015-06-10 21:19:36 +02001064 /*
1065 * If we're ignoring parity and break indicators,
1066 * ignore overruns too (for real raw support).
1067 */
1068 if (termios->c_iflag & IGNPAR)
1069 port->ignore_status_mask |= USART_SR_ORE;
1070 }
1071
1072 /* Ignore all characters if CREAD is not set */
1073 if ((termios->c_cflag & CREAD) == 0)
1074 port->ignore_status_mask |= USART_SR_DUMMY_RX;
1075
Erwan Le Ray33bb2f62021-10-20 17:03:31 +02001076 if (stm32_port->rx_ch) {
1077 /*
1078 * Setup DMA to collect only valid data and enable error irqs.
1079 * This also enables break reception when using DMA.
1080 */
1081 cr1 |= USART_CR1_PEIE;
1082 cr3 |= USART_CR3_EIE;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001083 cr3 |= USART_CR3_DMAR;
Erwan Le Ray33bb2f62021-10-20 17:03:31 +02001084 cr3 |= USART_CR3_DDRE;
1085 }
Alexandre TORGUE34891872016-09-15 18:42:40 +02001086
Bich HEMON1bcda092018-03-12 09:50:05 +00001087 if (rs485conf->flags & SER_RS485_ENABLED) {
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001088 stm32_usart_config_reg_rs485(&cr1, &cr3,
1089 rs485conf->delay_rts_before_send,
1090 rs485conf->delay_rts_after_send,
1091 baud);
Bich HEMON1bcda092018-03-12 09:50:05 +00001092 if (rs485conf->flags & SER_RS485_RTS_ON_SEND) {
1093 cr3 &= ~USART_CR3_DEP;
1094 rs485conf->flags &= ~SER_RS485_RTS_AFTER_SEND;
1095 } else {
1096 cr3 |= USART_CR3_DEP;
1097 rs485conf->flags |= SER_RS485_RTS_AFTER_SEND;
1098 }
1099
1100 } else {
1101 cr3 &= ~(USART_CR3_DEM | USART_CR3_DEP);
1102 cr1 &= ~(USART_CR1_DEDT_MASK | USART_CR1_DEAT_MASK);
1103 }
1104
Erwan Le Ray12761862021-03-04 17:23:01 +01001105 /* Configure wake up from low power on start bit detection */
Alexandre Torgue3d530012021-03-19 19:42:52 +01001106 if (stm32_port->wakeup_src) {
Erwan Le Ray12761862021-03-04 17:23:01 +01001107 cr3 &= ~USART_CR3_WUS_MASK;
1108 cr3 |= USART_CR3_WUS_START_BIT;
1109 }
1110
Alexandre TORGUEada86182016-09-15 18:42:33 +02001111 writel_relaxed(cr3, port->membase + ofs->cr3);
1112 writel_relaxed(cr2, port->membase + ofs->cr2);
1113 writel_relaxed(cr1, port->membase + ofs->cr1);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001114
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001115 stm32_usart_set_bits(port, ofs->cr1, BIT(cfg->uart_enable_bit));
Maxime Coquelin48a60922015-06-10 21:19:36 +02001116 spin_unlock_irqrestore(&port->lock, flags);
Erwan Le Ray436c9792021-03-04 17:23:02 +01001117
1118 /* Handle modem control interrupts */
1119 if (UART_ENABLE_MS(port, termios->c_cflag))
1120 stm32_usart_enable_ms(port);
1121 else
1122 stm32_usart_disable_ms(port);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001123}
1124
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001125static const char *stm32_usart_type(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001126{
1127 return (port->type == PORT_STM32) ? DRIVER_NAME : NULL;
1128}
1129
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001130static void stm32_usart_release_port(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001131{
1132}
1133
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001134static int stm32_usart_request_port(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001135{
1136 return 0;
1137}
1138
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001139static void stm32_usart_config_port(struct uart_port *port, int flags)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001140{
1141 if (flags & UART_CONFIG_TYPE)
1142 port->type = PORT_STM32;
1143}
1144
1145static int
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001146stm32_usart_verify_port(struct uart_port *port, struct serial_struct *ser)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001147{
1148 /* No user changeable parameters */
1149 return -EINVAL;
1150}
1151
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001152static void stm32_usart_pm(struct uart_port *port, unsigned int state,
1153 unsigned int oldstate)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001154{
1155 struct stm32_port *stm32port = container_of(port,
1156 struct stm32_port, port);
Stephen Boydd825f0b2021-01-22 19:44:25 -08001157 const struct stm32_usart_offsets *ofs = &stm32port->info->ofs;
1158 const struct stm32_usart_config *cfg = &stm32port->info->cfg;
Johan Hovold18ee37e2021-05-19 11:25:41 +02001159 unsigned long flags;
Maxime Coquelin48a60922015-06-10 21:19:36 +02001160
1161 switch (state) {
1162 case UART_PM_STATE_ON:
Erwan Le Rayfb6dcef2019-06-13 15:49:54 +02001163 pm_runtime_get_sync(port->dev);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001164 break;
1165 case UART_PM_STATE_OFF:
1166 spin_lock_irqsave(&port->lock, flags);
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001167 stm32_usart_clr_bits(port, ofs->cr1, BIT(cfg->uart_enable_bit));
Maxime Coquelin48a60922015-06-10 21:19:36 +02001168 spin_unlock_irqrestore(&port->lock, flags);
Erwan Le Rayfb6dcef2019-06-13 15:49:54 +02001169 pm_runtime_put_sync(port->dev);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001170 break;
1171 }
1172}
1173
1174static const struct uart_ops stm32_uart_ops = {
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001175 .tx_empty = stm32_usart_tx_empty,
1176 .set_mctrl = stm32_usart_set_mctrl,
1177 .get_mctrl = stm32_usart_get_mctrl,
1178 .stop_tx = stm32_usart_stop_tx,
1179 .start_tx = stm32_usart_start_tx,
1180 .throttle = stm32_usart_throttle,
1181 .unthrottle = stm32_usart_unthrottle,
1182 .stop_rx = stm32_usart_stop_rx,
1183 .enable_ms = stm32_usart_enable_ms,
1184 .break_ctl = stm32_usart_break_ctl,
1185 .startup = stm32_usart_startup,
1186 .shutdown = stm32_usart_shutdown,
Erwan Le Ray3d82be82021-03-04 17:23:08 +01001187 .flush_buffer = stm32_usart_flush_buffer,
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001188 .set_termios = stm32_usart_set_termios,
1189 .pm = stm32_usart_pm,
1190 .type = stm32_usart_type,
1191 .release_port = stm32_usart_release_port,
1192 .request_port = stm32_usart_request_port,
1193 .config_port = stm32_usart_config_port,
1194 .verify_port = stm32_usart_verify_port,
Maxime Coquelin48a60922015-06-10 21:19:36 +02001195};
1196
Fabrice Gasnier2aa1bbb2021-04-13 19:40:15 +02001197/*
1198 * STM32H7 RX & TX FIFO threshold configuration (CR3 RXFTCFG / TXFTCFG)
1199 * Note: 1 isn't a valid value in RXFTCFG / TXFTCFG. In this case,
1200 * RXNEIE / TXEIE can be used instead of threshold irqs: RXFTIE / TXFTIE.
1201 * So, RXFTCFG / TXFTCFG bitfields values are encoded as array index + 1.
1202 */
1203static const u32 stm32h7_usart_fifo_thresh_cfg[] = { 1, 2, 4, 8, 12, 14, 16 };
1204
1205static void stm32_usart_get_ftcfg(struct platform_device *pdev, const char *p,
1206 int *ftcfg)
1207{
1208 u32 bytes, i;
1209
1210 /* DT option to get RX & TX FIFO threshold (default to 8 bytes) */
1211 if (of_property_read_u32(pdev->dev.of_node, p, &bytes))
1212 bytes = 8;
1213
1214 for (i = 0; i < ARRAY_SIZE(stm32h7_usart_fifo_thresh_cfg); i++)
1215 if (stm32h7_usart_fifo_thresh_cfg[i] >= bytes)
1216 break;
1217 if (i >= ARRAY_SIZE(stm32h7_usart_fifo_thresh_cfg))
1218 i = ARRAY_SIZE(stm32h7_usart_fifo_thresh_cfg) - 1;
1219
1220 dev_dbg(&pdev->dev, "%s set to %d bytes\n", p,
1221 stm32h7_usart_fifo_thresh_cfg[i]);
1222
1223 /* Provide FIFO threshold ftcfg (1 is invalid: threshold irq unused) */
1224 if (i)
1225 *ftcfg = i - 1;
1226 else
1227 *ftcfg = -EINVAL;
1228}
1229
Erwan Le Ray97f3a082021-01-06 17:22:02 +01001230static void stm32_usart_deinit_port(struct stm32_port *stm32port)
1231{
1232 clk_disable_unprepare(stm32port->clk);
1233}
1234
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001235static int stm32_usart_init_port(struct stm32_port *stm32port,
1236 struct platform_device *pdev)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001237{
1238 struct uart_port *port = &stm32port->port;
1239 struct resource *res;
Erwan Le Raye0f2a902021-01-21 15:23:09 +01001240 int ret, irq;
Maxime Coquelin48a60922015-06-10 21:19:36 +02001241
Erwan Le Raye0f2a902021-01-21 15:23:09 +01001242 irq = platform_get_irq(pdev, 0);
Tang Bin217b04c2021-08-11 18:51:36 +08001243 if (irq < 0)
1244 return irq;
Erwan Le Ray92fc0022021-01-06 17:21:57 +01001245
Maxime Coquelin48a60922015-06-10 21:19:36 +02001246 port->iotype = UPIO_MEM;
1247 port->flags = UPF_BOOT_AUTOCONF;
1248 port->ops = &stm32_uart_ops;
1249 port->dev = &pdev->dev;
Erwan Le Rayd0757192019-06-18 12:02:24 +02001250 port->fifosize = stm32port->info->cfg.fifosize;
Dmitry Safonov9feedaa2019-12-13 00:06:43 +00001251 port->has_sysrq = IS_ENABLED(CONFIG_SERIAL_STM32_CONSOLE);
Erwan Le Raye0f2a902021-01-21 15:23:09 +01001252 port->irq = irq;
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001253 port->rs485_config = stm32_usart_config_rs485;
Bich HEMON7d8f6862018-03-15 08:44:46 +00001254
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001255 ret = stm32_usart_init_rs485(port, pdev);
Lukas Wunnerc150c0f2020-05-12 14:40:02 +02001256 if (ret)
1257 return ret;
Bich HEMON7d8f6862018-03-15 08:44:46 +00001258
Alexandre Torgue3d530012021-03-19 19:42:52 +01001259 stm32port->wakeup_src = stm32port->info->cfg.has_wakeup &&
1260 of_property_read_bool(pdev->dev.of_node, "wakeup-source");
Erwan Le Ray2c58e562019-05-21 17:45:47 +02001261
Martin Devera3cd66592021-03-28 17:43:06 +02001262 stm32port->swap = stm32port->info->cfg.has_swap &&
1263 of_property_read_bool(pdev->dev.of_node, "rx-tx-swap");
1264
Gerald Baeza351a7622017-07-13 15:08:30 +00001265 stm32port->fifoen = stm32port->info->cfg.has_fifo;
Fabrice Gasnier2aa1bbb2021-04-13 19:40:15 +02001266 if (stm32port->fifoen) {
1267 stm32_usart_get_ftcfg(pdev, "rx-threshold",
1268 &stm32port->rxftcfg);
1269 stm32_usart_get_ftcfg(pdev, "tx-threshold",
1270 &stm32port->txftcfg);
1271 }
Maxime Coquelin48a60922015-06-10 21:19:36 +02001272
Tang Bin3d881e32021-08-14 21:14:18 +08001273 port->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001274 if (IS_ERR(port->membase))
1275 return PTR_ERR(port->membase);
1276 port->mapbase = res->start;
1277
1278 spin_lock_init(&port->lock);
1279
1280 stm32port->clk = devm_clk_get(&pdev->dev, NULL);
1281 if (IS_ERR(stm32port->clk))
1282 return PTR_ERR(stm32port->clk);
1283
1284 /* Ensure that clk rate is correct by enabling the clk */
1285 ret = clk_prepare_enable(stm32port->clk);
1286 if (ret)
1287 return ret;
1288
1289 stm32port->port.uartclk = clk_get_rate(stm32port->clk);
Fabrice Gasnierada80042017-07-13 15:08:29 +00001290 if (!stm32port->port.uartclk) {
Maxime Coquelin48a60922015-06-10 21:19:36 +02001291 ret = -EINVAL;
Manivannan Sadhasivam6cf61b92020-04-20 22:32:04 +05301292 goto err_clk;
Fabrice Gasnierada80042017-07-13 15:08:29 +00001293 }
Maxime Coquelin48a60922015-06-10 21:19:36 +02001294
Manivannan Sadhasivam6cf61b92020-04-20 22:32:04 +05301295 stm32port->gpios = mctrl_gpio_init(&stm32port->port, 0);
1296 if (IS_ERR(stm32port->gpios)) {
1297 ret = PTR_ERR(stm32port->gpios);
1298 goto err_clk;
1299 }
1300
Erwan Le Ray93593692021-01-06 17:22:01 +01001301 /*
1302 * Both CTS/RTS gpios and "st,hw-flow-ctrl" (deprecated) or "uart-has-rtscts"
1303 * properties should not be specified.
1304 */
Manivannan Sadhasivam6cf61b92020-04-20 22:32:04 +05301305 if (stm32port->hw_flow_control) {
1306 if (mctrl_gpio_to_gpiod(stm32port->gpios, UART_GPIO_CTS) ||
1307 mctrl_gpio_to_gpiod(stm32port->gpios, UART_GPIO_RTS)) {
1308 dev_err(&pdev->dev, "Conflicting RTS/CTS config\n");
1309 ret = -EINVAL;
1310 goto err_clk;
1311 }
1312 }
1313
1314 return ret;
1315
1316err_clk:
1317 clk_disable_unprepare(stm32port->clk);
1318
Maxime Coquelin48a60922015-06-10 21:19:36 +02001319 return ret;
1320}
1321
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001322static struct stm32_port *stm32_usart_of_get_port(struct platform_device *pdev)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001323{
1324 struct device_node *np = pdev->dev.of_node;
1325 int id;
1326
1327 if (!np)
1328 return NULL;
1329
1330 id = of_alias_get_id(np, "serial");
Gerald Baezae5707912017-07-13 15:08:27 +00001331 if (id < 0) {
1332 dev_err(&pdev->dev, "failed to get alias id, errno %d\n", id);
1333 return NULL;
1334 }
Maxime Coquelin48a60922015-06-10 21:19:36 +02001335
1336 if (WARN_ON(id >= STM32_MAX_PORTS))
1337 return NULL;
1338
Erwan Le Ray6fd9fff2020-05-20 15:39:32 +02001339 stm32_ports[id].hw_flow_control =
1340 of_property_read_bool (np, "st,hw-flow-ctrl") /*deprecated*/ ||
1341 of_property_read_bool (np, "uart-has-rtscts");
Maxime Coquelin48a60922015-06-10 21:19:36 +02001342 stm32_ports[id].port.line = id;
Erwan Le Ray4cc0ed62019-06-18 12:02:22 +02001343 stm32_ports[id].cr1_irq = USART_CR1_RXNEIE;
Erwan Le Rayd0a6a7b2019-06-18 12:02:25 +02001344 stm32_ports[id].cr3_irq = 0;
Gerald Baezae5707912017-07-13 15:08:27 +00001345 stm32_ports[id].last_res = RX_BUF_L;
Maxime Coquelin48a60922015-06-10 21:19:36 +02001346 return &stm32_ports[id];
1347}
1348
1349#ifdef CONFIG_OF
1350static const struct of_device_id stm32_match[] = {
Alexandre TORGUEada86182016-09-15 18:42:33 +02001351 { .compatible = "st,stm32-uart", .data = &stm32f4_info},
Alexandre TORGUEada86182016-09-15 18:42:33 +02001352 { .compatible = "st,stm32f7-uart", .data = &stm32f7_info},
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001353 { .compatible = "st,stm32h7-uart", .data = &stm32h7_info},
Maxime Coquelin48a60922015-06-10 21:19:36 +02001354 {},
1355};
1356
1357MODULE_DEVICE_TABLE(of, stm32_match);
1358#endif
1359
Erwan Le Raya7770a42021-06-10 12:00:20 +02001360static void stm32_usart_of_dma_rx_remove(struct stm32_port *stm32port,
1361 struct platform_device *pdev)
1362{
1363 if (stm32port->rx_buf)
1364 dma_free_coherent(&pdev->dev, RX_BUF_L, stm32port->rx_buf,
1365 stm32port->rx_dma_buf);
1366}
1367
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001368static int stm32_usart_of_dma_rx_probe(struct stm32_port *stm32port,
1369 struct platform_device *pdev)
Alexandre TORGUE34891872016-09-15 18:42:40 +02001370{
Stephen Boydd825f0b2021-01-22 19:44:25 -08001371 const struct stm32_usart_offsets *ofs = &stm32port->info->ofs;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001372 struct uart_port *port = &stm32port->port;
1373 struct device *dev = &pdev->dev;
1374 struct dma_slave_config config;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001375 int ret;
1376
Johan Hovolde359b442021-04-16 16:05:56 +02001377 /*
1378 * Using DMA and threaded handler for the console could lead to
1379 * deadlocks.
1380 */
1381 if (uart_console(port))
1382 return -ENODEV;
1383
Tang Bin59bd4ee2021-08-14 20:49:51 +08001384 stm32port->rx_buf = dma_alloc_coherent(dev, RX_BUF_L,
Erwan Le Ray92fc0022021-01-06 17:21:57 +01001385 &stm32port->rx_dma_buf,
1386 GFP_KERNEL);
Erwan Le Raya7770a42021-06-10 12:00:20 +02001387 if (!stm32port->rx_buf)
1388 return -ENOMEM;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001389
1390 /* Configure DMA channel */
1391 memset(&config, 0, sizeof(config));
Arnd Bergmann8e5481d2016-09-23 21:38:51 +02001392 config.src_addr = port->mapbase + ofs->rdr;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001393 config.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
1394
1395 ret = dmaengine_slave_config(stm32port->rx_ch, &config);
1396 if (ret < 0) {
1397 dev_err(dev, "rx dma channel config failed\n");
Erwan Le Raya7770a42021-06-10 12:00:20 +02001398 stm32_usart_of_dma_rx_remove(stm32port, pdev);
1399 return ret;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001400 }
1401
Alexandre TORGUE34891872016-09-15 18:42:40 +02001402 return 0;
Erwan Le Raya7770a42021-06-10 12:00:20 +02001403}
Alexandre TORGUE34891872016-09-15 18:42:40 +02001404
Erwan Le Raya7770a42021-06-10 12:00:20 +02001405static void stm32_usart_of_dma_tx_remove(struct stm32_port *stm32port,
1406 struct platform_device *pdev)
1407{
1408 if (stm32port->tx_buf)
1409 dma_free_coherent(&pdev->dev, TX_BUF_L, stm32port->tx_buf,
1410 stm32port->tx_dma_buf);
Alexandre TORGUE34891872016-09-15 18:42:40 +02001411}
1412
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001413static int stm32_usart_of_dma_tx_probe(struct stm32_port *stm32port,
1414 struct platform_device *pdev)
Alexandre TORGUE34891872016-09-15 18:42:40 +02001415{
Stephen Boydd825f0b2021-01-22 19:44:25 -08001416 const struct stm32_usart_offsets *ofs = &stm32port->info->ofs;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001417 struct uart_port *port = &stm32port->port;
1418 struct device *dev = &pdev->dev;
1419 struct dma_slave_config config;
1420 int ret;
1421
1422 stm32port->tx_dma_busy = false;
1423
Tang Bin59bd4ee2021-08-14 20:49:51 +08001424 stm32port->tx_buf = dma_alloc_coherent(dev, TX_BUF_L,
Erwan Le Ray92fc0022021-01-06 17:21:57 +01001425 &stm32port->tx_dma_buf,
1426 GFP_KERNEL);
Erwan Le Raya7770a42021-06-10 12:00:20 +02001427 if (!stm32port->tx_buf)
1428 return -ENOMEM;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001429
1430 /* Configure DMA channel */
1431 memset(&config, 0, sizeof(config));
Arnd Bergmann8e5481d2016-09-23 21:38:51 +02001432 config.dst_addr = port->mapbase + ofs->tdr;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001433 config.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
1434
1435 ret = dmaengine_slave_config(stm32port->tx_ch, &config);
1436 if (ret < 0) {
1437 dev_err(dev, "tx dma channel config failed\n");
Erwan Le Raya7770a42021-06-10 12:00:20 +02001438 stm32_usart_of_dma_tx_remove(stm32port, pdev);
1439 return ret;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001440 }
1441
1442 return 0;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001443}
1444
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001445static int stm32_usart_serial_probe(struct platform_device *pdev)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001446{
Maxime Coquelin48a60922015-06-10 21:19:36 +02001447 struct stm32_port *stm32port;
Alexandre TORGUEada86182016-09-15 18:42:33 +02001448 int ret;
Maxime Coquelin48a60922015-06-10 21:19:36 +02001449
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001450 stm32port = stm32_usart_of_get_port(pdev);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001451 if (!stm32port)
1452 return -ENODEV;
1453
Stephen Boydd825f0b2021-01-22 19:44:25 -08001454 stm32port->info = of_device_get_match_data(&pdev->dev);
1455 if (!stm32port->info)
Alexandre TORGUEada86182016-09-15 18:42:33 +02001456 return -EINVAL;
1457
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001458 ret = stm32_usart_init_port(stm32port, pdev);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001459 if (ret)
1460 return ret;
1461
Alexandre Torgue3d530012021-03-19 19:42:52 +01001462 if (stm32port->wakeup_src) {
1463 device_set_wakeup_capable(&pdev->dev, true);
1464 ret = dev_pm_set_wake_irq(&pdev->dev, stm32port->port.irq);
Erwan Le Ray5297f272019-05-21 17:45:46 +02001465 if (ret)
Erwan Le Raya7770a42021-06-10 12:00:20 +02001466 goto err_deinit_port;
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001467 }
1468
Erwan Le Raya7770a42021-06-10 12:00:20 +02001469 stm32port->rx_ch = dma_request_chan(&pdev->dev, "rx");
1470 if (PTR_ERR(stm32port->rx_ch) == -EPROBE_DEFER) {
1471 ret = -EPROBE_DEFER;
1472 goto err_wakeirq;
1473 }
1474 /* Fall back in interrupt mode for any non-deferral error */
1475 if (IS_ERR(stm32port->rx_ch))
1476 stm32port->rx_ch = NULL;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001477
Erwan Le Raya7770a42021-06-10 12:00:20 +02001478 stm32port->tx_ch = dma_request_chan(&pdev->dev, "tx");
1479 if (PTR_ERR(stm32port->tx_ch) == -EPROBE_DEFER) {
1480 ret = -EPROBE_DEFER;
1481 goto err_dma_rx;
1482 }
1483 /* Fall back in interrupt mode for any non-deferral error */
1484 if (IS_ERR(stm32port->tx_ch))
1485 stm32port->tx_ch = NULL;
1486
1487 if (stm32port->rx_ch && stm32_usart_of_dma_rx_probe(stm32port, pdev)) {
1488 /* Fall back in interrupt mode */
1489 dma_release_channel(stm32port->rx_ch);
1490 stm32port->rx_ch = NULL;
1491 }
1492
1493 if (stm32port->tx_ch && stm32_usart_of_dma_tx_probe(stm32port, pdev)) {
1494 /* Fall back in interrupt mode */
1495 dma_release_channel(stm32port->tx_ch);
1496 stm32port->tx_ch = NULL;
1497 }
1498
1499 if (!stm32port->rx_ch)
1500 dev_info(&pdev->dev, "interrupt mode for rx (no dma)\n");
1501 if (!stm32port->tx_ch)
1502 dev_info(&pdev->dev, "interrupt mode for tx (no dma)\n");
Alexandre TORGUE34891872016-09-15 18:42:40 +02001503
Maxime Coquelin48a60922015-06-10 21:19:36 +02001504 platform_set_drvdata(pdev, &stm32port->port);
1505
Erwan Le Rayfb6dcef2019-06-13 15:49:54 +02001506 pm_runtime_get_noresume(&pdev->dev);
1507 pm_runtime_set_active(&pdev->dev);
1508 pm_runtime_enable(&pdev->dev);
Erwan Le Ray87fd0742021-03-04 17:22:56 +01001509
1510 ret = uart_add_one_port(&stm32_usart_driver, &stm32port->port);
1511 if (ret)
1512 goto err_port;
1513
Erwan Le Rayfb6dcef2019-06-13 15:49:54 +02001514 pm_runtime_put_sync(&pdev->dev);
1515
Maxime Coquelin48a60922015-06-10 21:19:36 +02001516 return 0;
Fabrice Gasnierada80042017-07-13 15:08:29 +00001517
Erwan Le Ray87fd0742021-03-04 17:22:56 +01001518err_port:
1519 pm_runtime_disable(&pdev->dev);
1520 pm_runtime_set_suspended(&pdev->dev);
1521 pm_runtime_put_noidle(&pdev->dev);
1522
Erwan Le Ray87fd0742021-03-04 17:22:56 +01001523 if (stm32port->tx_ch) {
Erwan Le Raya7770a42021-06-10 12:00:20 +02001524 stm32_usart_of_dma_tx_remove(stm32port, pdev);
Erwan Le Ray87fd0742021-03-04 17:22:56 +01001525 dma_release_channel(stm32port->tx_ch);
1526 }
1527
Erwan Le Raya7770a42021-06-10 12:00:20 +02001528 if (stm32port->rx_ch)
1529 stm32_usart_of_dma_rx_remove(stm32port, pdev);
Erwan Le Ray87fd0742021-03-04 17:22:56 +01001530
Erwan Le Raya7770a42021-06-10 12:00:20 +02001531err_dma_rx:
1532 if (stm32port->rx_ch)
1533 dma_release_channel(stm32port->rx_ch);
1534
1535err_wakeirq:
Alexandre Torgue3d530012021-03-19 19:42:52 +01001536 if (stm32port->wakeup_src)
Erwan Le Ray5297f272019-05-21 17:45:46 +02001537 dev_pm_clear_wake_irq(&pdev->dev);
1538
Erwan Le Raya7770a42021-06-10 12:00:20 +02001539err_deinit_port:
Alexandre Torgue3d530012021-03-19 19:42:52 +01001540 if (stm32port->wakeup_src)
1541 device_set_wakeup_capable(&pdev->dev, false);
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001542
Erwan Le Ray97f3a082021-01-06 17:22:02 +01001543 stm32_usart_deinit_port(stm32port);
Fabrice Gasnierada80042017-07-13 15:08:29 +00001544
1545 return ret;
Maxime Coquelin48a60922015-06-10 21:19:36 +02001546}
1547
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001548static int stm32_usart_serial_remove(struct platform_device *pdev)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001549{
1550 struct uart_port *port = platform_get_drvdata(pdev);
Alexandre TORGUE511c7b12016-09-15 18:42:38 +02001551 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -08001552 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Erwan Le Rayfb6dcef2019-06-13 15:49:54 +02001553 int err;
Erwan Le Ray33bb2f62021-10-20 17:03:31 +02001554 u32 cr3;
Erwan Le Rayfb6dcef2019-06-13 15:49:54 +02001555
1556 pm_runtime_get_sync(&pdev->dev);
Erwan Le Ray87fd0742021-03-04 17:22:56 +01001557 err = uart_remove_one_port(&stm32_usart_driver, port);
1558 if (err)
1559 return(err);
1560
1561 pm_runtime_disable(&pdev->dev);
1562 pm_runtime_set_suspended(&pdev->dev);
1563 pm_runtime_put_noidle(&pdev->dev);
Alexandre TORGUE34891872016-09-15 18:42:40 +02001564
Erwan Le Ray33bb2f62021-10-20 17:03:31 +02001565 stm32_usart_clr_bits(port, ofs->cr1, USART_CR1_PEIE);
1566 cr3 = readl_relaxed(port->membase + ofs->cr3);
1567 cr3 &= ~USART_CR3_EIE;
1568 cr3 &= ~USART_CR3_DMAR;
1569 cr3 &= ~USART_CR3_DDRE;
1570 writel_relaxed(cr3, port->membase + ofs->cr3);
Alexandre TORGUE34891872016-09-15 18:42:40 +02001571
Erwan Le Ray87fd0742021-03-04 17:22:56 +01001572 if (stm32_port->tx_ch) {
1573 dmaengine_terminate_async(stm32_port->tx_ch);
Erwan Le Raya7770a42021-06-10 12:00:20 +02001574 stm32_usart_of_dma_tx_remove(stm32_port, pdev);
Alexandre TORGUE34891872016-09-15 18:42:40 +02001575 dma_release_channel(stm32_port->tx_ch);
Erwan Le Ray87fd0742021-03-04 17:22:56 +01001576 }
Alexandre TORGUE34891872016-09-15 18:42:40 +02001577
Erwan Le Raya7770a42021-06-10 12:00:20 +02001578 if (stm32_port->rx_ch) {
Erwan Le Raya7770a42021-06-10 12:00:20 +02001579 stm32_usart_of_dma_rx_remove(stm32_port, pdev);
1580 dma_release_channel(stm32_port->rx_ch);
1581 }
1582
1583 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT);
Alexandre TORGUE511c7b12016-09-15 18:42:38 +02001584
Alexandre Torgue3d530012021-03-19 19:42:52 +01001585 if (stm32_port->wakeup_src) {
Erwan Le Ray5297f272019-05-21 17:45:46 +02001586 dev_pm_clear_wake_irq(&pdev->dev);
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001587 device_init_wakeup(&pdev->dev, false);
Erwan Le Ray5297f272019-05-21 17:45:46 +02001588 }
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001589
Erwan Le Ray97f3a082021-01-06 17:22:02 +01001590 stm32_usart_deinit_port(stm32_port);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001591
Erwan Le Ray87fd0742021-03-04 17:22:56 +01001592 return 0;
Maxime Coquelin48a60922015-06-10 21:19:36 +02001593}
1594
Maxime Coquelin48a60922015-06-10 21:19:36 +02001595#ifdef CONFIG_SERIAL_STM32_CONSOLE
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001596static void stm32_usart_console_putchar(struct uart_port *port, int ch)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001597{
Alexandre TORGUEada86182016-09-15 18:42:33 +02001598 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -08001599 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Alexandre TORGUEada86182016-09-15 18:42:33 +02001600
1601 while (!(readl_relaxed(port->membase + ofs->isr) & USART_SR_TXE))
Maxime Coquelin48a60922015-06-10 21:19:36 +02001602 cpu_relax();
1603
Alexandre TORGUEada86182016-09-15 18:42:33 +02001604 writel_relaxed(ch, port->membase + ofs->tdr);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001605}
1606
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001607static void stm32_usart_console_write(struct console *co, const char *s,
1608 unsigned int cnt)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001609{
1610 struct uart_port *port = &stm32_ports[co->index].port;
Alexandre TORGUEada86182016-09-15 18:42:33 +02001611 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -08001612 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
1613 const struct stm32_usart_config *cfg = &stm32_port->info->cfg;
Maxime Coquelin48a60922015-06-10 21:19:36 +02001614 unsigned long flags;
1615 u32 old_cr1, new_cr1;
1616 int locked = 1;
1617
Johan Hovoldcea37af2021-04-16 16:05:57 +02001618 if (oops_in_progress)
1619 locked = spin_trylock_irqsave(&port->lock, flags);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001620 else
Johan Hovoldcea37af2021-04-16 16:05:57 +02001621 spin_lock_irqsave(&port->lock, flags);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001622
Alexandre TORGUE87f1f802016-09-15 18:42:42 +02001623 /* Save and disable interrupts, enable the transmitter */
Alexandre TORGUEada86182016-09-15 18:42:33 +02001624 old_cr1 = readl_relaxed(port->membase + ofs->cr1);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001625 new_cr1 = old_cr1 & ~USART_CR1_IE_MASK;
Alexandre TORGUE87f1f802016-09-15 18:42:42 +02001626 new_cr1 |= USART_CR1_TE | BIT(cfg->uart_enable_bit);
Alexandre TORGUEada86182016-09-15 18:42:33 +02001627 writel_relaxed(new_cr1, port->membase + ofs->cr1);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001628
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001629 uart_console_write(port, s, cnt, stm32_usart_console_putchar);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001630
1631 /* Restore interrupt state */
Alexandre TORGUEada86182016-09-15 18:42:33 +02001632 writel_relaxed(old_cr1, port->membase + ofs->cr1);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001633
1634 if (locked)
Johan Hovoldcea37af2021-04-16 16:05:57 +02001635 spin_unlock_irqrestore(&port->lock, flags);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001636}
1637
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001638static int stm32_usart_console_setup(struct console *co, char *options)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001639{
1640 struct stm32_port *stm32port;
1641 int baud = 9600;
1642 int bits = 8;
1643 int parity = 'n';
1644 int flow = 'n';
1645
1646 if (co->index >= STM32_MAX_PORTS)
1647 return -ENODEV;
1648
1649 stm32port = &stm32_ports[co->index];
1650
1651 /*
1652 * This driver does not support early console initialization
1653 * (use ARM early printk support instead), so we only expect
1654 * this to be called during the uart port registration when the
1655 * driver gets probed and the port should be mapped at that point.
1656 */
Erwan Le Ray92fc0022021-01-06 17:21:57 +01001657 if (stm32port->port.mapbase == 0 || !stm32port->port.membase)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001658 return -ENXIO;
1659
1660 if (options)
1661 uart_parse_options(options, &baud, &parity, &bits, &flow);
1662
1663 return uart_set_options(&stm32port->port, co, baud, parity, bits, flow);
1664}
1665
1666static struct console stm32_console = {
1667 .name = STM32_SERIAL_NAME,
1668 .device = uart_console_device,
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001669 .write = stm32_usart_console_write,
1670 .setup = stm32_usart_console_setup,
Maxime Coquelin48a60922015-06-10 21:19:36 +02001671 .flags = CON_PRINTBUFFER,
1672 .index = -1,
1673 .data = &stm32_usart_driver,
1674};
1675
1676#define STM32_SERIAL_CONSOLE (&stm32_console)
1677
1678#else
1679#define STM32_SERIAL_CONSOLE NULL
1680#endif /* CONFIG_SERIAL_STM32_CONSOLE */
1681
1682static struct uart_driver stm32_usart_driver = {
1683 .driver_name = DRIVER_NAME,
1684 .dev_name = STM32_SERIAL_NAME,
1685 .major = 0,
1686 .minor = 0,
1687 .nr = STM32_MAX_PORTS,
1688 .cons = STM32_SERIAL_CONSOLE,
1689};
1690
Erwan Le Ray6eeb3482021-10-25 15:42:28 +02001691static int __maybe_unused stm32_usart_serial_en_wakeup(struct uart_port *port,
1692 bool enable)
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001693{
1694 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -08001695 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Erwan Le Ray6eeb3482021-10-25 15:42:28 +02001696 struct tty_port *tport = &port->state->port;
1697 int ret;
Erwan Le Ray6333a482021-10-25 15:42:29 +02001698 unsigned int size;
1699 unsigned long flags;
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001700
Erwan Le Ray6eeb3482021-10-25 15:42:28 +02001701 if (!stm32_port->wakeup_src || !tty_port_initialized(tport))
1702 return 0;
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001703
Erwan Le Ray12761862021-03-04 17:23:01 +01001704 /*
1705 * Enable low-power wake-up and wake-up irq if argument is set to
1706 * "enable", disable low-power wake-up and wake-up irq otherwise
1707 */
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001708 if (enable) {
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001709 stm32_usart_set_bits(port, ofs->cr1, USART_CR1_UESM);
Erwan Le Ray12761862021-03-04 17:23:01 +01001710 stm32_usart_set_bits(port, ofs->cr3, USART_CR3_WUFIE);
Erwan Le Ray6eeb3482021-10-25 15:42:28 +02001711
1712 /*
1713 * When DMA is used for reception, it must be disabled before
1714 * entering low-power mode and re-enabled when exiting from
1715 * low-power mode.
1716 */
1717 if (stm32_port->rx_ch) {
Erwan Le Ray6333a482021-10-25 15:42:29 +02001718 spin_lock_irqsave(&port->lock, flags);
1719 /* Avoid race with RX IRQ when DMAR is cleared */
Erwan Le Ray6eeb3482021-10-25 15:42:28 +02001720 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAR);
Erwan Le Ray6333a482021-10-25 15:42:29 +02001721 /* Poll data from DMA RX buffer if any */
1722 size = stm32_usart_receive_chars(port, true);
1723 dmaengine_terminate_async(stm32_port->rx_ch);
1724 uart_unlock_and_check_sysrq_irqrestore(port, flags);
1725 if (size)
1726 tty_flip_buffer_push(tport);
Erwan Le Ray6eeb3482021-10-25 15:42:28 +02001727 }
1728
1729 /* Poll data from RX FIFO if any */
1730 stm32_usart_receive_chars(port, false);
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001731 } else {
Erwan Le Ray6eeb3482021-10-25 15:42:28 +02001732 if (stm32_port->rx_ch) {
1733 ret = stm32_usart_start_rx_dma_cyclic(port);
1734 if (ret)
1735 return ret;
1736 }
1737
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001738 stm32_usart_clr_bits(port, ofs->cr1, USART_CR1_UESM);
Erwan Le Ray12761862021-03-04 17:23:01 +01001739 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_WUFIE);
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001740 }
Erwan Le Ray6eeb3482021-10-25 15:42:28 +02001741
1742 return 0;
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001743}
1744
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001745static int __maybe_unused stm32_usart_serial_suspend(struct device *dev)
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001746{
1747 struct uart_port *port = dev_get_drvdata(dev);
Erwan Le Ray6eeb3482021-10-25 15:42:28 +02001748 int ret;
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001749
1750 uart_suspend_port(&stm32_usart_driver, port);
1751
Erwan Le Ray6eeb3482021-10-25 15:42:28 +02001752 if (device_may_wakeup(dev) || device_wakeup_path(dev)) {
1753 ret = stm32_usart_serial_en_wakeup(port, true);
1754 if (ret)
1755 return ret;
1756 }
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001757
Erwan Le Ray55484fc2020-05-19 11:41:04 +02001758 /*
1759 * When "no_console_suspend" is enabled, keep the pinctrl default state
1760 * and rely on bootloader stage to restore this state upon resume.
1761 * Otherwise, apply the idle or sleep states depending on wakeup
1762 * capabilities.
1763 */
1764 if (console_suspend_enabled || !uart_console(port)) {
Erwan Le Ray1631eee2021-03-19 19:42:49 +01001765 if (device_may_wakeup(dev) || device_wakeup_path(dev))
Erwan Le Ray55484fc2020-05-19 11:41:04 +02001766 pinctrl_pm_select_idle_state(dev);
1767 else
1768 pinctrl_pm_select_sleep_state(dev);
1769 }
Erwan Le Ray94616d92019-06-13 15:49:53 +02001770
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001771 return 0;
1772}
1773
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001774static int __maybe_unused stm32_usart_serial_resume(struct device *dev)
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001775{
1776 struct uart_port *port = dev_get_drvdata(dev);
Erwan Le Ray6eeb3482021-10-25 15:42:28 +02001777 int ret;
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001778
Erwan Le Ray94616d92019-06-13 15:49:53 +02001779 pinctrl_pm_select_default_state(dev);
1780
Erwan Le Ray6eeb3482021-10-25 15:42:28 +02001781 if (device_may_wakeup(dev) || device_wakeup_path(dev)) {
1782 ret = stm32_usart_serial_en_wakeup(port, false);
1783 if (ret)
1784 return ret;
1785 }
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001786
1787 return uart_resume_port(&stm32_usart_driver, port);
1788}
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001789
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001790static int __maybe_unused stm32_usart_runtime_suspend(struct device *dev)
Erwan Le Rayfb6dcef2019-06-13 15:49:54 +02001791{
1792 struct uart_port *port = dev_get_drvdata(dev);
1793 struct stm32_port *stm32port = container_of(port,
1794 struct stm32_port, port);
1795
1796 clk_disable_unprepare(stm32port->clk);
1797
1798 return 0;
1799}
1800
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001801static int __maybe_unused stm32_usart_runtime_resume(struct device *dev)
Erwan Le Rayfb6dcef2019-06-13 15:49:54 +02001802{
1803 struct uart_port *port = dev_get_drvdata(dev);
1804 struct stm32_port *stm32port = container_of(port,
1805 struct stm32_port, port);
1806
1807 return clk_prepare_enable(stm32port->clk);
1808}
1809
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001810static const struct dev_pm_ops stm32_serial_pm_ops = {
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001811 SET_RUNTIME_PM_OPS(stm32_usart_runtime_suspend,
1812 stm32_usart_runtime_resume, NULL)
1813 SET_SYSTEM_SLEEP_PM_OPS(stm32_usart_serial_suspend,
1814 stm32_usart_serial_resume)
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001815};
1816
Maxime Coquelin48a60922015-06-10 21:19:36 +02001817static struct platform_driver stm32_serial_driver = {
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001818 .probe = stm32_usart_serial_probe,
1819 .remove = stm32_usart_serial_remove,
Maxime Coquelin48a60922015-06-10 21:19:36 +02001820 .driver = {
1821 .name = DRIVER_NAME,
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001822 .pm = &stm32_serial_pm_ops,
Maxime Coquelin48a60922015-06-10 21:19:36 +02001823 .of_match_table = of_match_ptr(stm32_match),
1824 },
1825};
1826
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001827static int __init stm32_usart_init(void)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001828{
1829 static char banner[] __initdata = "STM32 USART driver initialized";
1830 int ret;
1831
1832 pr_info("%s\n", banner);
1833
1834 ret = uart_register_driver(&stm32_usart_driver);
1835 if (ret)
1836 return ret;
1837
1838 ret = platform_driver_register(&stm32_serial_driver);
1839 if (ret)
1840 uart_unregister_driver(&stm32_usart_driver);
1841
1842 return ret;
1843}
1844
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001845static void __exit stm32_usart_exit(void)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001846{
1847 platform_driver_unregister(&stm32_serial_driver);
1848 uart_unregister_driver(&stm32_usart_driver);
1849}
1850
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001851module_init(stm32_usart_init);
1852module_exit(stm32_usart_exit);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001853
1854MODULE_ALIAS("platform:" DRIVER_NAME);
1855MODULE_DESCRIPTION("STMicroelectronics STM32 serial port driver");
1856MODULE_LICENSE("GPL v2");