blob: 7fd192e1e15d900285b340e62a6488dc1aa59cab [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 Ray33bb2f62021-10-20 17:03:31 +0200213static void 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;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200218 u32 sr;
219 char flag;
220
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200221 while (stm32_usart_pending_rx_pio(port, &sr)) {
Maxime Coquelin48a60922015-06-10 21:19:36 +0200222 sr |= USART_SR_DUMMY_RX;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200223 flag = TTY_NORMAL;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200224
Erwan Le Ray4f01d832019-05-21 17:45:42 +0200225 /*
226 * Status bits has to be cleared before reading the RDR:
227 * In FIFO mode, reading the RDR will pop the next data
228 * (if any) along with its status bits into the SR.
229 * Not doing so leads to misalignement between RDR and SR,
230 * and clear status bits of the next rx data.
231 *
232 * Clear errors flags for stm32f7 and stm32h7 compatible
233 * devices. On stm32f4 compatible devices, the error bit is
234 * cleared by the sequence [read SR - read DR].
235 */
236 if ((sr & USART_SR_ERR_MASK) && ofs->icr != UNDEF_REG)
Fabrice Gasnier1250ed72019-11-21 09:10:49 +0100237 writel_relaxed(sr & USART_SR_ERR_MASK,
238 port->membase + ofs->icr);
Erwan Le Ray4f01d832019-05-21 17:45:42 +0200239
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200240 c = stm32_usart_get_char_pio(port);
Erwan Le Ray4f01d832019-05-21 17:45:42 +0200241 port->icount.rx++;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200242 if (sr & USART_SR_ERR_MASK) {
Erwan Le Ray4f01d832019-05-21 17:45:42 +0200243 if (sr & USART_SR_ORE) {
Maxime Coquelin48a60922015-06-10 21:19:36 +0200244 port->icount.overrun++;
245 } else if (sr & USART_SR_PE) {
246 port->icount.parity++;
247 } else if (sr & USART_SR_FE) {
Erwan Le Ray4f01d832019-05-21 17:45:42 +0200248 /* Break detection if character is null */
249 if (!c) {
250 port->icount.brk++;
251 if (uart_handle_break(port))
252 continue;
253 } else {
254 port->icount.frame++;
255 }
Maxime Coquelin48a60922015-06-10 21:19:36 +0200256 }
257
258 sr &= port->read_status_mask;
259
Erwan Le Ray4f01d832019-05-21 17:45:42 +0200260 if (sr & USART_SR_PE) {
Maxime Coquelin48a60922015-06-10 21:19:36 +0200261 flag = TTY_PARITY;
Erwan Le Ray4f01d832019-05-21 17:45:42 +0200262 } else if (sr & USART_SR_FE) {
263 if (!c)
264 flag = TTY_BREAK;
265 else
266 flag = TTY_FRAME;
267 }
Maxime Coquelin48a60922015-06-10 21:19:36 +0200268 }
269
Johan Hovoldcea37af2021-04-16 16:05:57 +0200270 if (uart_prepare_sysrq_char(port, c))
Maxime Coquelin48a60922015-06-10 21:19:36 +0200271 continue;
272 uart_insert_char(port, sr, USART_SR_ORE, c, flag);
273 }
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200274}
275
276static void stm32_usart_push_buffer_dma(struct uart_port *port, unsigned int dma_size)
277{
278 struct stm32_port *stm32_port = to_stm32_port(port);
279 struct tty_port *ttyport = &stm32_port->port.state->port;
280 unsigned char *dma_start;
281 int dma_count, i;
282
283 dma_start = stm32_port->rx_buf + (RX_BUF_L - stm32_port->last_res);
284
285 /*
286 * Apply rdr_mask on buffer in order to mask parity bit.
287 * This loop is useless in cs8 mode because DMA copies only
288 * 8 bits and already ignores parity bit.
289 */
290 if (!(stm32_port->rdr_mask == (BIT(8) - 1)))
291 for (i = 0; i < dma_size; i++)
292 *(dma_start + i) &= stm32_port->rdr_mask;
293
294 dma_count = tty_insert_flip_string(ttyport, dma_start, dma_size);
295 port->icount.rx += dma_count;
296 if (dma_count != dma_size)
297 port->icount.buf_overrun++;
298 stm32_port->last_res -= dma_count;
299 if (stm32_port->last_res == 0)
300 stm32_port->last_res = RX_BUF_L;
301}
302
303static void stm32_usart_receive_chars_dma(struct uart_port *port)
304{
305 struct stm32_port *stm32_port = to_stm32_port(port);
306 unsigned int dma_size;
307
308 /* DMA buffer is configured in cyclic mode and handles the rollback of the buffer. */
309 if (stm32_port->rx_dma_state.residue > stm32_port->last_res) {
310 /* Conditional first part: from last_res to end of DMA buffer */
311 dma_size = stm32_port->last_res;
312 stm32_usart_push_buffer_dma(port, dma_size);
313 }
314
315 dma_size = stm32_port->last_res - stm32_port->rx_dma_state.residue;
316 stm32_usart_push_buffer_dma(port, dma_size);
317}
318
319static void stm32_usart_receive_chars(struct uart_port *port, bool irqflag)
320{
321 struct tty_port *tport = &port->state->port;
322 struct stm32_port *stm32_port = to_stm32_port(port);
323 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
324 enum dma_status rx_dma_status;
325 unsigned long flags;
326 u32 sr;
327
328 if (irqflag)
329 spin_lock_irqsave(&port->lock, flags);
330 else
331 spin_lock(&port->lock);
332
333 if (stm32_usart_rx_dma_enabled(port)) {
334 rx_dma_status = dmaengine_tx_status(stm32_port->rx_ch,
335 stm32_port->rx_ch->cookie,
336 &stm32_port->rx_dma_state);
337 if (rx_dma_status == DMA_IN_PROGRESS) {
338 /* Empty DMA buffer */
339 stm32_usart_receive_chars_dma(port);
340 sr = readl_relaxed(port->membase + ofs->isr);
341 if (sr & USART_SR_ERR_MASK) {
342 /* Disable DMA request line */
343 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAR);
344
345 /* Switch to PIO mode to handle the errors */
346 stm32_usart_receive_chars_pio(port);
347
348 /* Switch back to DMA mode */
349 stm32_usart_set_bits(port, ofs->cr3, USART_CR3_DMAR);
350 }
351 } else {
352 /* Disable RX DMA */
353 dmaengine_terminate_async(stm32_port->rx_ch);
354 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAR);
355 /* Fall back to interrupt mode */
356 dev_dbg(port->dev, "DMA error, fallback to irq mode\n");
357 stm32_usart_receive_chars_pio(port);
358 }
359 } else {
360 stm32_usart_receive_chars_pio(port);
361 }
Maxime Coquelin48a60922015-06-10 21:19:36 +0200362
Erwan Le Raycc58d0a2021-10-20 17:03:30 +0200363 if (irqflag)
364 uart_unlock_and_check_sysrq_irqrestore(port, irqflag);
365 else
366 uart_unlock_and_check_sysrq(port);
Erwan Le Rayad767682021-03-04 17:23:00 +0100367
Maxime Coquelin48a60922015-06-10 21:19:36 +0200368 tty_flip_buffer_push(tport);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200369}
370
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100371static void stm32_usart_tx_dma_complete(void *arg)
Alexandre TORGUE34891872016-09-15 18:42:40 +0200372{
373 struct uart_port *port = arg;
374 struct stm32_port *stm32port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800375 const struct stm32_usart_offsets *ofs = &stm32port->info->ofs;
Erwan Le Rayf16b90c2021-03-04 17:23:04 +0100376 unsigned long flags;
Alexandre TORGUE34891872016-09-15 18:42:40 +0200377
Erwan Le Rayfb4f2e02021-03-04 17:23:03 +0100378 dmaengine_terminate_async(stm32port->tx_ch);
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100379 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT);
Alexandre TORGUE34891872016-09-15 18:42:40 +0200380 stm32port->tx_dma_busy = false;
381
382 /* Let's see if we have pending data to send */
Erwan Le Rayf16b90c2021-03-04 17:23:04 +0100383 spin_lock_irqsave(&port->lock, flags);
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100384 stm32_usart_transmit_chars(port);
Erwan Le Rayf16b90c2021-03-04 17:23:04 +0100385 spin_unlock_irqrestore(&port->lock, flags);
Alexandre TORGUE34891872016-09-15 18:42:40 +0200386}
387
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100388static void stm32_usart_tx_interrupt_enable(struct uart_port *port)
Erwan Le Rayd0757192019-06-18 12:02:24 +0200389{
390 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800391 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Erwan Le Rayd0757192019-06-18 12:02:24 +0200392
393 /*
394 * Enables TX FIFO threashold irq when FIFO is enabled,
395 * or TX empty irq when FIFO is disabled
396 */
Fabrice Gasnier2aa1bbb2021-04-13 19:40:15 +0200397 if (stm32_port->fifoen && stm32_port->txftcfg >= 0)
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100398 stm32_usart_set_bits(port, ofs->cr3, USART_CR3_TXFTIE);
Erwan Le Rayd0757192019-06-18 12:02:24 +0200399 else
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100400 stm32_usart_set_bits(port, ofs->cr1, USART_CR1_TXEIE);
Erwan Le Rayd0757192019-06-18 12:02:24 +0200401}
402
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200403static void stm32_usart_rx_dma_complete(void *arg)
404{
405 struct uart_port *port = arg;
406
407 stm32_usart_receive_chars(port, true);
408}
409
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100410static void stm32_usart_tx_interrupt_disable(struct uart_port *port)
Erwan Le Rayd0757192019-06-18 12:02:24 +0200411{
412 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800413 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Erwan Le Rayd0757192019-06-18 12:02:24 +0200414
Fabrice Gasnier2aa1bbb2021-04-13 19:40:15 +0200415 if (stm32_port->fifoen && stm32_port->txftcfg >= 0)
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100416 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_TXFTIE);
Erwan Le Rayd0757192019-06-18 12:02:24 +0200417 else
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100418 stm32_usart_clr_bits(port, ofs->cr1, USART_CR1_TXEIE);
Erwan Le Rayd0757192019-06-18 12:02:24 +0200419}
420
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100421static void stm32_usart_transmit_chars_pio(struct uart_port *port)
Alexandre TORGUE34891872016-09-15 18:42:40 +0200422{
423 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800424 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Alexandre TORGUE34891872016-09-15 18:42:40 +0200425 struct circ_buf *xmit = &port->state->xmit;
Alexandre TORGUE34891872016-09-15 18:42:40 +0200426
427 if (stm32_port->tx_dma_busy) {
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100428 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT);
Alexandre TORGUE34891872016-09-15 18:42:40 +0200429 stm32_port->tx_dma_busy = false;
430 }
431
Erwan Le Ray5d9176e2019-06-18 12:02:23 +0200432 while (!uart_circ_empty(xmit)) {
433 /* Check that TDR is empty before filling FIFO */
434 if (!(readl_relaxed(port->membase + ofs->isr) & USART_SR_TXE))
435 break;
436 writel_relaxed(xmit->buf[xmit->tail], port->membase + ofs->tdr);
437 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
438 port->icount.tx++;
439 }
Alexandre TORGUE34891872016-09-15 18:42:40 +0200440
Erwan Le Ray5d9176e2019-06-18 12:02:23 +0200441 /* rely on TXE irq (mask or unmask) for sending remaining data */
442 if (uart_circ_empty(xmit))
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100443 stm32_usart_tx_interrupt_disable(port);
Erwan Le Ray5d9176e2019-06-18 12:02:23 +0200444 else
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100445 stm32_usart_tx_interrupt_enable(port);
Alexandre TORGUE34891872016-09-15 18:42:40 +0200446}
447
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100448static void stm32_usart_transmit_chars_dma(struct uart_port *port)
Alexandre TORGUE34891872016-09-15 18:42:40 +0200449{
450 struct stm32_port *stm32port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800451 const struct stm32_usart_offsets *ofs = &stm32port->info->ofs;
Alexandre TORGUE34891872016-09-15 18:42:40 +0200452 struct circ_buf *xmit = &port->state->xmit;
453 struct dma_async_tx_descriptor *desc = NULL;
Alexandre TORGUE34891872016-09-15 18:42:40 +0200454 unsigned int count, i;
455
456 if (stm32port->tx_dma_busy)
457 return;
458
459 stm32port->tx_dma_busy = true;
460
461 count = uart_circ_chars_pending(xmit);
462
463 if (count > TX_BUF_L)
464 count = TX_BUF_L;
465
466 if (xmit->tail < xmit->head) {
467 memcpy(&stm32port->tx_buf[0], &xmit->buf[xmit->tail], count);
468 } else {
469 size_t one = UART_XMIT_SIZE - xmit->tail;
470 size_t two;
471
472 if (one > count)
473 one = count;
474 two = count - one;
475
476 memcpy(&stm32port->tx_buf[0], &xmit->buf[xmit->tail], one);
477 if (two)
478 memcpy(&stm32port->tx_buf[one], &xmit->buf[0], two);
479 }
480
481 desc = dmaengine_prep_slave_single(stm32port->tx_ch,
482 stm32port->tx_dma_buf,
483 count,
484 DMA_MEM_TO_DEV,
485 DMA_PREP_INTERRUPT);
486
Erwan Le Raye7997f72021-01-06 17:21:56 +0100487 if (!desc)
488 goto fallback_err;
Alexandre TORGUE34891872016-09-15 18:42:40 +0200489
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100490 desc->callback = stm32_usart_tx_dma_complete;
Alexandre TORGUE34891872016-09-15 18:42:40 +0200491 desc->callback_param = port;
492
493 /* Push current DMA TX transaction in the pending queue */
Erwan Le Raye7997f72021-01-06 17:21:56 +0100494 if (dma_submit_error(dmaengine_submit(desc))) {
495 /* dma no yet started, safe to free resources */
496 dmaengine_terminate_async(stm32port->tx_ch);
497 goto fallback_err;
498 }
Alexandre TORGUE34891872016-09-15 18:42:40 +0200499
500 /* Issue pending DMA TX requests */
501 dma_async_issue_pending(stm32port->tx_ch);
502
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100503 stm32_usart_set_bits(port, ofs->cr3, USART_CR3_DMAT);
Alexandre TORGUE34891872016-09-15 18:42:40 +0200504
505 xmit->tail = (xmit->tail + count) & (UART_XMIT_SIZE - 1);
506 port->icount.tx += count;
Erwan Le Raye7997f72021-01-06 17:21:56 +0100507 return;
508
509fallback_err:
510 for (i = count; i > 0; i--)
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100511 stm32_usart_transmit_chars_pio(port);
Alexandre TORGUE34891872016-09-15 18:42:40 +0200512}
513
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100514static void stm32_usart_transmit_chars(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200515{
Alexandre TORGUEada86182016-09-15 18:42:33 +0200516 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800517 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200518 struct circ_buf *xmit = &port->state->xmit;
519
520 if (port->x_char) {
Alexandre TORGUE34891872016-09-15 18:42:40 +0200521 if (stm32_port->tx_dma_busy)
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100522 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT);
Alexandre TORGUEada86182016-09-15 18:42:33 +0200523 writel_relaxed(port->x_char, port->membase + ofs->tdr);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200524 port->x_char = 0;
525 port->icount.tx++;
Alexandre TORGUE34891872016-09-15 18:42:40 +0200526 if (stm32_port->tx_dma_busy)
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100527 stm32_usart_set_bits(port, ofs->cr3, USART_CR3_DMAT);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200528 return;
529 }
530
Erwan Le Rayb83b9572019-05-21 17:45:44 +0200531 if (uart_circ_empty(xmit) || uart_tx_stopped(port)) {
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100532 stm32_usart_tx_interrupt_disable(port);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200533 return;
534 }
535
Erwan Le Ray64c32ea2019-05-21 17:45:45 +0200536 if (ofs->icr == UNDEF_REG)
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100537 stm32_usart_clr_bits(port, ofs->isr, USART_SR_TC);
Erwan Le Ray64c32ea2019-05-21 17:45:45 +0200538 else
Fabrice Gasnier1250ed72019-11-21 09:10:49 +0100539 writel_relaxed(USART_ICR_TCCF, port->membase + ofs->icr);
Erwan Le Ray64c32ea2019-05-21 17:45:45 +0200540
Alexandre TORGUE34891872016-09-15 18:42:40 +0200541 if (stm32_port->tx_ch)
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100542 stm32_usart_transmit_chars_dma(port);
Alexandre TORGUE34891872016-09-15 18:42:40 +0200543 else
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100544 stm32_usart_transmit_chars_pio(port);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200545
546 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
547 uart_write_wakeup(port);
548
549 if (uart_circ_empty(xmit))
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100550 stm32_usart_tx_interrupt_disable(port);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200551}
552
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100553static irqreturn_t stm32_usart_interrupt(int irq, void *ptr)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200554{
555 struct uart_port *port = ptr;
Erwan Le Ray12761862021-03-04 17:23:01 +0100556 struct tty_port *tport = &port->state->port;
Alexandre TORGUEada86182016-09-15 18:42:33 +0200557 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800558 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200559 u32 sr;
560
Alexandre TORGUEada86182016-09-15 18:42:33 +0200561 sr = readl_relaxed(port->membase + ofs->isr);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200562
Erwan Le Ray4cc0ed62019-06-18 12:02:22 +0200563 if ((sr & USART_SR_RTOF) && ofs->icr != UNDEF_REG)
564 writel_relaxed(USART_ICR_RTOCF,
565 port->membase + ofs->icr);
566
Erwan Le Ray12761862021-03-04 17:23:01 +0100567 if ((sr & USART_SR_WUF) && ofs->icr != UNDEF_REG) {
568 /* Clear wake up flag and disable wake up interrupt */
Fabrice Gasnier270e5a72017-07-13 15:08:30 +0000569 writel_relaxed(USART_ICR_WUCF,
570 port->membase + ofs->icr);
Erwan Le Ray12761862021-03-04 17:23:01 +0100571 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_WUFIE);
572 if (irqd_is_wakeup_set(irq_get_irq_data(port->irq)))
573 pm_wakeup_event(tport->tty->dev, 0);
574 }
Fabrice Gasnier270e5a72017-07-13 15:08:30 +0000575
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200576 /*
577 * rx errors in dma mode has to be handled ASAP to avoid overrun as the DMA request
578 * line has been masked by HW and rx data are stacking in FIFO.
579 */
Erwan Le Rayd1ec8a22021-10-20 17:03:32 +0200580 if (!stm32_port->throttled) {
581 if (((sr & USART_SR_RXNE) && !stm32_usart_rx_dma_enabled(port)) ||
582 ((sr & USART_SR_ERR_MASK) && stm32_usart_rx_dma_enabled(port))) {
583 stm32_usart_receive_chars(port, false);
584 }
585 }
Maxime Coquelin48a60922015-06-10 21:19:36 +0200586
Erwan Le Rayad767682021-03-04 17:23:00 +0100587 if ((sr & USART_SR_TXE) && !(stm32_port->tx_ch)) {
588 spin_lock(&port->lock);
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100589 stm32_usart_transmit_chars(port);
Erwan Le Rayad767682021-03-04 17:23:00 +0100590 spin_unlock(&port->lock);
591 }
Alexandre TORGUE01d32d72016-09-15 18:42:41 +0200592
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200593 if (stm32_usart_rx_dma_enabled(port))
Alexandre TORGUE34891872016-09-15 18:42:40 +0200594 return IRQ_WAKE_THREAD;
595 else
596 return IRQ_HANDLED;
597}
598
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100599static irqreturn_t stm32_usart_threaded_interrupt(int irq, void *ptr)
Alexandre TORGUE34891872016-09-15 18:42:40 +0200600{
601 struct uart_port *port = ptr;
Erwan Le Rayd1ec8a22021-10-20 17:03:32 +0200602 struct stm32_port *stm32_port = to_stm32_port(port);
Alexandre TORGUE34891872016-09-15 18:42:40 +0200603
Erwan Le Raycc58d0a2021-10-20 17:03:30 +0200604 /* Receiver timeout irq for DMA RX */
Erwan Le Rayd1ec8a22021-10-20 17:03:32 +0200605 if (!stm32_port->throttled)
606 stm32_usart_receive_chars(port, false);
Alexandre TORGUE34891872016-09-15 18:42:40 +0200607
Maxime Coquelin48a60922015-06-10 21:19:36 +0200608 return IRQ_HANDLED;
609}
610
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100611static unsigned int stm32_usart_tx_empty(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200612{
Alexandre TORGUEada86182016-09-15 18:42:33 +0200613 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800614 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Alexandre TORGUEada86182016-09-15 18:42:33 +0200615
Erwan Le Ray3db1d522021-03-04 17:23:07 +0100616 if (readl_relaxed(port->membase + ofs->isr) & USART_SR_TC)
617 return TIOCSER_TEMT;
618
619 return 0;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200620}
621
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100622static void stm32_usart_set_mctrl(struct uart_port *port, unsigned int mctrl)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200623{
Alexandre TORGUEada86182016-09-15 18:42:33 +0200624 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800625 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Alexandre TORGUEada86182016-09-15 18:42:33 +0200626
Maxime Coquelin48a60922015-06-10 21:19:36 +0200627 if ((mctrl & TIOCM_RTS) && (port->status & UPSTAT_AUTORTS))
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100628 stm32_usart_set_bits(port, ofs->cr3, USART_CR3_RTSE);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200629 else
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100630 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_RTSE);
Manivannan Sadhasivam6cf61b92020-04-20 22:32:04 +0530631
632 mctrl_gpio_set(stm32_port->gpios, mctrl);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200633}
634
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100635static unsigned int stm32_usart_get_mctrl(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200636{
Manivannan Sadhasivam6cf61b92020-04-20 22:32:04 +0530637 struct stm32_port *stm32_port = to_stm32_port(port);
638 unsigned int ret;
639
Maxime Coquelin48a60922015-06-10 21:19:36 +0200640 /* This routine is used to get signals of: DCD, DSR, RI, and CTS */
Manivannan Sadhasivam6cf61b92020-04-20 22:32:04 +0530641 ret = TIOCM_CAR | TIOCM_DSR | TIOCM_CTS;
642
643 return mctrl_gpio_get(stm32_port->gpios, &ret);
644}
645
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100646static void stm32_usart_enable_ms(struct uart_port *port)
Manivannan Sadhasivam6cf61b92020-04-20 22:32:04 +0530647{
648 mctrl_gpio_enable_ms(to_stm32_port(port)->gpios);
649}
650
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100651static void stm32_usart_disable_ms(struct uart_port *port)
Manivannan Sadhasivam6cf61b92020-04-20 22:32:04 +0530652{
653 mctrl_gpio_disable_ms(to_stm32_port(port)->gpios);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200654}
655
656/* Transmit stop */
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100657static void stm32_usart_stop_tx(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200658{
Marek Vasutad0c2742020-08-31 19:10:45 +0200659 struct stm32_port *stm32_port = to_stm32_port(port);
660 struct serial_rs485 *rs485conf = &port->rs485;
661
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100662 stm32_usart_tx_interrupt_disable(port);
Marek Vasutad0c2742020-08-31 19:10:45 +0200663
664 if (rs485conf->flags & SER_RS485_ENABLED) {
665 if (rs485conf->flags & SER_RS485_RTS_ON_SEND) {
666 mctrl_gpio_set(stm32_port->gpios,
667 stm32_port->port.mctrl & ~TIOCM_RTS);
668 } else {
669 mctrl_gpio_set(stm32_port->gpios,
670 stm32_port->port.mctrl | TIOCM_RTS);
671 }
672 }
Maxime Coquelin48a60922015-06-10 21:19:36 +0200673}
674
675/* There are probably characters waiting to be transmitted. */
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100676static void stm32_usart_start_tx(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200677{
Marek Vasutad0c2742020-08-31 19:10:45 +0200678 struct stm32_port *stm32_port = to_stm32_port(port);
679 struct serial_rs485 *rs485conf = &port->rs485;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200680 struct circ_buf *xmit = &port->state->xmit;
681
682 if (uart_circ_empty(xmit))
683 return;
684
Marek Vasutad0c2742020-08-31 19:10:45 +0200685 if (rs485conf->flags & SER_RS485_ENABLED) {
686 if (rs485conf->flags & SER_RS485_RTS_ON_SEND) {
687 mctrl_gpio_set(stm32_port->gpios,
688 stm32_port->port.mctrl | TIOCM_RTS);
689 } else {
690 mctrl_gpio_set(stm32_port->gpios,
691 stm32_port->port.mctrl & ~TIOCM_RTS);
692 }
693 }
694
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100695 stm32_usart_transmit_chars(port);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200696}
697
Erwan Le Ray3d82be82021-03-04 17:23:08 +0100698/* Flush the transmit buffer. */
699static void stm32_usart_flush_buffer(struct uart_port *port)
700{
701 struct stm32_port *stm32_port = to_stm32_port(port);
702 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
703
704 if (stm32_port->tx_ch) {
705 dmaengine_terminate_async(stm32_port->tx_ch);
706 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT);
707 stm32_port->tx_dma_busy = false;
708 }
709}
710
Maxime Coquelin48a60922015-06-10 21:19:36 +0200711/* Throttle the remote when input buffer is about to overflow. */
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100712static void stm32_usart_throttle(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200713{
Alexandre TORGUEada86182016-09-15 18:42:33 +0200714 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800715 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200716 unsigned long flags;
717
718 spin_lock_irqsave(&port->lock, flags);
Erwan Le Rayd1ec8a22021-10-20 17:03:32 +0200719
720 /*
721 * Disable DMA request line if enabled, so the RX data gets queued into the FIFO.
722 * Hardware flow control is triggered when RX FIFO is full.
723 */
724 if (stm32_usart_rx_dma_enabled(port))
725 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAR);
726
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100727 stm32_usart_clr_bits(port, ofs->cr1, stm32_port->cr1_irq);
Erwan Le Rayd0a6a7b2019-06-18 12:02:25 +0200728 if (stm32_port->cr3_irq)
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100729 stm32_usart_clr_bits(port, ofs->cr3, stm32_port->cr3_irq);
Erwan Le Rayd0a6a7b2019-06-18 12:02:25 +0200730
Erwan Le Rayd1ec8a22021-10-20 17:03:32 +0200731 stm32_port->throttled = true;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200732 spin_unlock_irqrestore(&port->lock, flags);
733}
734
735/* Unthrottle the remote, the input buffer can now accept data. */
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100736static void stm32_usart_unthrottle(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200737{
Alexandre TORGUEada86182016-09-15 18:42:33 +0200738 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800739 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200740 unsigned long flags;
741
742 spin_lock_irqsave(&port->lock, flags);
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100743 stm32_usart_set_bits(port, ofs->cr1, stm32_port->cr1_irq);
Erwan Le Rayd0a6a7b2019-06-18 12:02:25 +0200744 if (stm32_port->cr3_irq)
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100745 stm32_usart_set_bits(port, ofs->cr3, stm32_port->cr3_irq);
Erwan Le Rayd0a6a7b2019-06-18 12:02:25 +0200746
Erwan Le Rayd1ec8a22021-10-20 17:03:32 +0200747 /*
748 * Switch back to DMA mode (re-enable DMA request line).
749 * Hardware flow control is stopped when FIFO is not full any more.
750 */
751 if (stm32_port->rx_ch)
752 stm32_usart_set_bits(port, ofs->cr3, USART_CR3_DMAR);
753
754 stm32_port->throttled = false;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200755 spin_unlock_irqrestore(&port->lock, flags);
756}
757
758/* Receive stop */
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100759static void stm32_usart_stop_rx(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200760{
Alexandre TORGUEada86182016-09-15 18:42:33 +0200761 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800762 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Alexandre TORGUEada86182016-09-15 18:42:33 +0200763
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100764 stm32_usart_clr_bits(port, ofs->cr1, stm32_port->cr1_irq);
Erwan Le Rayd0a6a7b2019-06-18 12:02:25 +0200765 if (stm32_port->cr3_irq)
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100766 stm32_usart_clr_bits(port, ofs->cr3, stm32_port->cr3_irq);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200767}
768
769/* Handle breaks - ignored by us */
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100770static void stm32_usart_break_ctl(struct uart_port *port, int break_state)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200771{
772}
773
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100774static int stm32_usart_startup(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200775{
Alexandre TORGUEada86182016-09-15 18:42:33 +0200776 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800777 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Erwan Le Rayf4518a82021-03-04 17:22:57 +0100778 const struct stm32_usart_config *cfg = &stm32_port->info->cfg;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200779 const char *name = to_platform_device(port->dev)->name;
780 u32 val;
781 int ret;
782
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100783 ret = request_threaded_irq(port->irq, stm32_usart_interrupt,
784 stm32_usart_threaded_interrupt,
Johan Hovolde359b442021-04-16 16:05:56 +0200785 IRQF_ONESHOT | IRQF_NO_SUSPEND,
786 name, port);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200787 if (ret)
788 return ret;
789
Martin Devera3cd66592021-03-28 17:43:06 +0200790 if (stm32_port->swap) {
791 val = readl_relaxed(port->membase + ofs->cr2);
792 val |= USART_CR2_SWAP;
793 writel_relaxed(val, port->membase + ofs->cr2);
794 }
795
Erwan Le Ray84872dc2019-06-18 12:02:26 +0200796 /* RX FIFO Flush */
797 if (ofs->rqr != UNDEF_REG)
Erwan Le Ray315e2d82021-03-04 17:23:05 +0100798 writel_relaxed(USART_RQR_RXFRQ, port->membase + ofs->rqr);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200799
Erwan Le Rayd1ec8a22021-10-20 17:03:32 +0200800 /*
801 * DMA request line not re-enabled at resume when port is throttled.
802 * It will be re-enabled by unthrottle ops.
803 */
804 if (!stm32_port->throttled)
805 stm32_usart_set_bits(port, ofs->cr3, USART_CR3_DMAR);
806
Erwan Le Ray25a8e762021-03-04 17:22:59 +0100807 /* RX enabling */
Erwan Le Rayf4518a82021-03-04 17:22:57 +0100808 val = stm32_port->cr1_irq | USART_CR1_RE | BIT(cfg->uart_enable_bit);
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100809 stm32_usart_set_bits(port, ofs->cr1, val);
Erwan Le Ray84872dc2019-06-18 12:02:26 +0200810
Maxime Coquelin48a60922015-06-10 21:19:36 +0200811 return 0;
812}
813
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100814static void stm32_usart_shutdown(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200815{
Alexandre TORGUEada86182016-09-15 18:42:33 +0200816 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800817 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
818 const struct stm32_usart_config *cfg = &stm32_port->info->cfg;
Erwan Le Ray64c32ea2019-05-21 17:45:45 +0200819 u32 val, isr;
820 int ret;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200821
Manivannan Sadhasivam6cf61b92020-04-20 22:32:04 +0530822 /* Disable modem control interrupts */
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100823 stm32_usart_disable_ms(port);
Manivannan Sadhasivam6cf61b92020-04-20 22:32:04 +0530824
Erwan Le Ray4cc0ed62019-06-18 12:02:22 +0200825 val = USART_CR1_TXEIE | USART_CR1_TE;
826 val |= stm32_port->cr1_irq | USART_CR1_RE;
Alexandre TORGUE87f1f802016-09-15 18:42:42 +0200827 val |= BIT(cfg->uart_enable_bit);
Gerald Baeza351a7622017-07-13 15:08:30 +0000828 if (stm32_port->fifoen)
829 val |= USART_CR1_FIFOEN;
Erwan Le Ray64c32ea2019-05-21 17:45:45 +0200830
831 ret = readl_relaxed_poll_timeout(port->membase + ofs->isr,
832 isr, (isr & USART_SR_TC),
833 10, 100000);
834
Erwan Le Rayc31c3ea2021-01-06 17:22:03 +0100835 /* Send the TC error message only when ISR_TC is not set */
Erwan Le Ray64c32ea2019-05-21 17:45:45 +0200836 if (ret)
Erwan Le Rayc31c3ea2021-01-06 17:22:03 +0100837 dev_err(port->dev, "Transmission is not complete\n");
Erwan Le Ray64c32ea2019-05-21 17:45:45 +0200838
Erwan Le Ray9f77d192021-03-04 17:23:06 +0100839 /* flush RX & TX FIFO */
840 if (ofs->rqr != UNDEF_REG)
841 writel_relaxed(USART_RQR_TXFRQ | USART_RQR_RXFRQ,
842 port->membase + ofs->rqr);
843
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100844 stm32_usart_clr_bits(port, ofs->cr1, val);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200845
846 free_irq(port->irq, port);
847}
848
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100849static void stm32_usart_set_termios(struct uart_port *port,
850 struct ktermios *termios,
851 struct ktermios *old)
Maxime Coquelin48a60922015-06-10 21:19:36 +0200852{
853 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -0800854 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
855 const struct stm32_usart_config *cfg = &stm32_port->info->cfg;
Bich HEMON1bcda092018-03-12 09:50:05 +0000856 struct serial_rs485 *rs485conf = &port->rs485;
Erwan Le Rayc8a9d042019-05-21 17:45:41 +0200857 unsigned int baud, bits;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200858 u32 usartdiv, mantissa, fraction, oversampling;
859 tcflag_t cflag = termios->c_cflag;
Erwan Le Rayf264c6f2021-03-04 17:22:58 +0100860 u32 cr1, cr2, cr3, isr;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200861 unsigned long flags;
Erwan Le Rayf264c6f2021-03-04 17:22:58 +0100862 int ret;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200863
864 if (!stm32_port->hw_flow_control)
865 cflag &= ~CRTSCTS;
866
867 baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 8);
868
869 spin_lock_irqsave(&port->lock, flags);
870
Erwan Le Rayf264c6f2021-03-04 17:22:58 +0100871 ret = readl_relaxed_poll_timeout_atomic(port->membase + ofs->isr,
872 isr,
873 (isr & USART_SR_TC),
874 10, 100000);
875
876 /* Send the TC error message only when ISR_TC is not set. */
877 if (ret)
878 dev_err(port->dev, "Transmission is not complete\n");
879
Maxime Coquelin48a60922015-06-10 21:19:36 +0200880 /* Stop serial port and reset value */
Alexandre TORGUEada86182016-09-15 18:42:33 +0200881 writel_relaxed(0, port->membase + ofs->cr1);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200882
Erwan Le Ray84872dc2019-06-18 12:02:26 +0200883 /* flush RX & TX FIFO */
884 if (ofs->rqr != UNDEF_REG)
Erwan Le Ray315e2d82021-03-04 17:23:05 +0100885 writel_relaxed(USART_RQR_TXFRQ | USART_RQR_RXFRQ,
886 port->membase + ofs->rqr);
Bich HEMON1bcda092018-03-12 09:50:05 +0000887
Erwan Le Ray84872dc2019-06-18 12:02:26 +0200888 cr1 = USART_CR1_TE | USART_CR1_RE;
Gerald Baeza351a7622017-07-13 15:08:30 +0000889 if (stm32_port->fifoen)
890 cr1 |= USART_CR1_FIFOEN;
Martin Devera3cd66592021-03-28 17:43:06 +0200891 cr2 = stm32_port->swap ? USART_CR2_SWAP : 0;
Erwan Le Ray25a8e762021-03-04 17:22:59 +0100892
893 /* Tx and RX FIFO configuration */
Erwan Le Rayd0757192019-06-18 12:02:24 +0200894 cr3 = readl_relaxed(port->membase + ofs->cr3);
Erwan Le Ray25a8e762021-03-04 17:22:59 +0100895 cr3 &= USART_CR3_TXFTIE | USART_CR3_RXFTIE;
896 if (stm32_port->fifoen) {
Fabrice Gasnier2aa1bbb2021-04-13 19:40:15 +0200897 if (stm32_port->txftcfg >= 0)
898 cr3 |= stm32_port->txftcfg << USART_CR3_TXFTCFG_SHIFT;
899 if (stm32_port->rxftcfg >= 0)
900 cr3 |= stm32_port->rxftcfg << USART_CR3_RXFTCFG_SHIFT;
Erwan Le Ray25a8e762021-03-04 17:22:59 +0100901 }
Maxime Coquelin48a60922015-06-10 21:19:36 +0200902
903 if (cflag & CSTOPB)
904 cr2 |= USART_CR2_STOP_2B;
905
Jiri Slaby3ec2ff32021-06-10 11:02:47 +0200906 bits = tty_get_char_size(cflag);
Erwan Le Ray6c5962f2019-05-21 17:45:43 +0200907 stm32_port->rdr_mask = (BIT(bits) - 1);
Erwan Le Rayc8a9d042019-05-21 17:45:41 +0200908
Maxime Coquelin48a60922015-06-10 21:19:36 +0200909 if (cflag & PARENB) {
Erwan Le Rayc8a9d042019-05-21 17:45:41 +0200910 bits++;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200911 cr1 |= USART_CR1_PCE;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200912 }
913
Erwan Le Rayc8a9d042019-05-21 17:45:41 +0200914 /*
915 * Word length configuration:
916 * CS8 + parity, 9 bits word aka [M1:M0] = 0b01
917 * CS7 or (CS6 + parity), 7 bits word aka [M1:M0] = 0b10
918 * CS8 or (CS7 + parity), 8 bits word aka [M1:M0] = 0b00
919 * M0 and M1 already cleared by cr1 initialization.
920 */
921 if (bits == 9)
922 cr1 |= USART_CR1_M0;
923 else if ((bits == 7) && cfg->has_7bits_data)
924 cr1 |= USART_CR1_M1;
925 else if (bits != 8)
926 dev_dbg(port->dev, "Unsupported data bits config: %u bits\n"
927 , bits);
928
Erwan Le Ray4cc0ed62019-06-18 12:02:22 +0200929 if (ofs->rtor != UNDEF_REG && (stm32_port->rx_ch ||
Fabrice Gasnier2aa1bbb2021-04-13 19:40:15 +0200930 (stm32_port->fifoen &&
931 stm32_port->rxftcfg >= 0))) {
Erwan Le Ray4cc0ed62019-06-18 12:02:22 +0200932 if (cflag & CSTOPB)
933 bits = bits + 3; /* 1 start bit + 2 stop bits */
934 else
935 bits = bits + 2; /* 1 start bit + 1 stop bit */
936
937 /* RX timeout irq to occur after last stop bit + bits */
938 stm32_port->cr1_irq = USART_CR1_RTOIE;
939 writel_relaxed(bits, port->membase + ofs->rtor);
940 cr2 |= USART_CR2_RTOEN;
Erwan Le Ray33bb2f62021-10-20 17:03:31 +0200941 /*
942 * Enable fifo threshold irq in two cases, either when there is no DMA, or when
943 * wake up over usart, from low power until the DMA gets re-enabled by resume.
944 */
945 stm32_port->cr3_irq = USART_CR3_RXFTIE;
Erwan Le Ray4cc0ed62019-06-18 12:02:22 +0200946 }
947
Erwan Le Rayd0a6a7b2019-06-18 12:02:25 +0200948 cr1 |= stm32_port->cr1_irq;
949 cr3 |= stm32_port->cr3_irq;
950
Maxime Coquelin48a60922015-06-10 21:19:36 +0200951 if (cflag & PARODD)
952 cr1 |= USART_CR1_PS;
953
954 port->status &= ~(UPSTAT_AUTOCTS | UPSTAT_AUTORTS);
955 if (cflag & CRTSCTS) {
956 port->status |= UPSTAT_AUTOCTS | UPSTAT_AUTORTS;
Bich HEMON35abe982017-07-13 15:08:28 +0000957 cr3 |= USART_CR3_CTSE | USART_CR3_RTSE;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200958 }
959
960 usartdiv = DIV_ROUND_CLOSEST(port->uartclk, baud);
961
962 /*
963 * The USART supports 16 or 8 times oversampling.
964 * By default we prefer 16 times oversampling, so that the receiver
965 * has a better tolerance to clock deviations.
966 * 8 times oversampling is only used to achieve higher speeds.
967 */
968 if (usartdiv < 16) {
969 oversampling = 8;
Bich HEMON1bcda092018-03-12 09:50:05 +0000970 cr1 |= USART_CR1_OVER8;
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100971 stm32_usart_set_bits(port, ofs->cr1, USART_CR1_OVER8);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200972 } else {
973 oversampling = 16;
Bich HEMON1bcda092018-03-12 09:50:05 +0000974 cr1 &= ~USART_CR1_OVER8;
Erwan Le Ray56f9a762021-01-06 17:21:58 +0100975 stm32_usart_clr_bits(port, ofs->cr1, USART_CR1_OVER8);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200976 }
977
978 mantissa = (usartdiv / oversampling) << USART_BRR_DIV_M_SHIFT;
979 fraction = usartdiv % oversampling;
Alexandre TORGUEada86182016-09-15 18:42:33 +0200980 writel_relaxed(mantissa | fraction, port->membase + ofs->brr);
Maxime Coquelin48a60922015-06-10 21:19:36 +0200981
982 uart_update_timeout(port, cflag, baud);
983
984 port->read_status_mask = USART_SR_ORE;
985 if (termios->c_iflag & INPCK)
986 port->read_status_mask |= USART_SR_PE | USART_SR_FE;
987 if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
Erwan Le Ray4f01d832019-05-21 17:45:42 +0200988 port->read_status_mask |= USART_SR_FE;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200989
990 /* Characters to ignore */
991 port->ignore_status_mask = 0;
992 if (termios->c_iflag & IGNPAR)
993 port->ignore_status_mask = USART_SR_PE | USART_SR_FE;
994 if (termios->c_iflag & IGNBRK) {
Erwan Le Ray4f01d832019-05-21 17:45:42 +0200995 port->ignore_status_mask |= USART_SR_FE;
Maxime Coquelin48a60922015-06-10 21:19:36 +0200996 /*
997 * If we're ignoring parity and break indicators,
998 * ignore overruns too (for real raw support).
999 */
1000 if (termios->c_iflag & IGNPAR)
1001 port->ignore_status_mask |= USART_SR_ORE;
1002 }
1003
1004 /* Ignore all characters if CREAD is not set */
1005 if ((termios->c_cflag & CREAD) == 0)
1006 port->ignore_status_mask |= USART_SR_DUMMY_RX;
1007
Erwan Le Ray33bb2f62021-10-20 17:03:31 +02001008 if (stm32_port->rx_ch) {
1009 /*
1010 * Setup DMA to collect only valid data and enable error irqs.
1011 * This also enables break reception when using DMA.
1012 */
1013 cr1 |= USART_CR1_PEIE;
1014 cr3 |= USART_CR3_EIE;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001015 cr3 |= USART_CR3_DMAR;
Erwan Le Ray33bb2f62021-10-20 17:03:31 +02001016 cr3 |= USART_CR3_DDRE;
1017 }
Alexandre TORGUE34891872016-09-15 18:42:40 +02001018
Bich HEMON1bcda092018-03-12 09:50:05 +00001019 if (rs485conf->flags & SER_RS485_ENABLED) {
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001020 stm32_usart_config_reg_rs485(&cr1, &cr3,
1021 rs485conf->delay_rts_before_send,
1022 rs485conf->delay_rts_after_send,
1023 baud);
Bich HEMON1bcda092018-03-12 09:50:05 +00001024 if (rs485conf->flags & SER_RS485_RTS_ON_SEND) {
1025 cr3 &= ~USART_CR3_DEP;
1026 rs485conf->flags &= ~SER_RS485_RTS_AFTER_SEND;
1027 } else {
1028 cr3 |= USART_CR3_DEP;
1029 rs485conf->flags |= SER_RS485_RTS_AFTER_SEND;
1030 }
1031
1032 } else {
1033 cr3 &= ~(USART_CR3_DEM | USART_CR3_DEP);
1034 cr1 &= ~(USART_CR1_DEDT_MASK | USART_CR1_DEAT_MASK);
1035 }
1036
Erwan Le Ray12761862021-03-04 17:23:01 +01001037 /* Configure wake up from low power on start bit detection */
Alexandre Torgue3d530012021-03-19 19:42:52 +01001038 if (stm32_port->wakeup_src) {
Erwan Le Ray12761862021-03-04 17:23:01 +01001039 cr3 &= ~USART_CR3_WUS_MASK;
1040 cr3 |= USART_CR3_WUS_START_BIT;
1041 }
1042
Alexandre TORGUEada86182016-09-15 18:42:33 +02001043 writel_relaxed(cr3, port->membase + ofs->cr3);
1044 writel_relaxed(cr2, port->membase + ofs->cr2);
1045 writel_relaxed(cr1, port->membase + ofs->cr1);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001046
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001047 stm32_usart_set_bits(port, ofs->cr1, BIT(cfg->uart_enable_bit));
Maxime Coquelin48a60922015-06-10 21:19:36 +02001048 spin_unlock_irqrestore(&port->lock, flags);
Erwan Le Ray436c9792021-03-04 17:23:02 +01001049
1050 /* Handle modem control interrupts */
1051 if (UART_ENABLE_MS(port, termios->c_cflag))
1052 stm32_usart_enable_ms(port);
1053 else
1054 stm32_usart_disable_ms(port);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001055}
1056
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001057static const char *stm32_usart_type(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001058{
1059 return (port->type == PORT_STM32) ? DRIVER_NAME : NULL;
1060}
1061
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001062static void stm32_usart_release_port(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001063{
1064}
1065
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001066static int stm32_usart_request_port(struct uart_port *port)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001067{
1068 return 0;
1069}
1070
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001071static void stm32_usart_config_port(struct uart_port *port, int flags)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001072{
1073 if (flags & UART_CONFIG_TYPE)
1074 port->type = PORT_STM32;
1075}
1076
1077static int
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001078stm32_usart_verify_port(struct uart_port *port, struct serial_struct *ser)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001079{
1080 /* No user changeable parameters */
1081 return -EINVAL;
1082}
1083
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001084static void stm32_usart_pm(struct uart_port *port, unsigned int state,
1085 unsigned int oldstate)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001086{
1087 struct stm32_port *stm32port = container_of(port,
1088 struct stm32_port, port);
Stephen Boydd825f0b2021-01-22 19:44:25 -08001089 const struct stm32_usart_offsets *ofs = &stm32port->info->ofs;
1090 const struct stm32_usart_config *cfg = &stm32port->info->cfg;
Johan Hovold18ee37e2021-05-19 11:25:41 +02001091 unsigned long flags;
Maxime Coquelin48a60922015-06-10 21:19:36 +02001092
1093 switch (state) {
1094 case UART_PM_STATE_ON:
Erwan Le Rayfb6dcef2019-06-13 15:49:54 +02001095 pm_runtime_get_sync(port->dev);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001096 break;
1097 case UART_PM_STATE_OFF:
1098 spin_lock_irqsave(&port->lock, flags);
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001099 stm32_usart_clr_bits(port, ofs->cr1, BIT(cfg->uart_enable_bit));
Maxime Coquelin48a60922015-06-10 21:19:36 +02001100 spin_unlock_irqrestore(&port->lock, flags);
Erwan Le Rayfb6dcef2019-06-13 15:49:54 +02001101 pm_runtime_put_sync(port->dev);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001102 break;
1103 }
1104}
1105
1106static const struct uart_ops stm32_uart_ops = {
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001107 .tx_empty = stm32_usart_tx_empty,
1108 .set_mctrl = stm32_usart_set_mctrl,
1109 .get_mctrl = stm32_usart_get_mctrl,
1110 .stop_tx = stm32_usart_stop_tx,
1111 .start_tx = stm32_usart_start_tx,
1112 .throttle = stm32_usart_throttle,
1113 .unthrottle = stm32_usart_unthrottle,
1114 .stop_rx = stm32_usart_stop_rx,
1115 .enable_ms = stm32_usart_enable_ms,
1116 .break_ctl = stm32_usart_break_ctl,
1117 .startup = stm32_usart_startup,
1118 .shutdown = stm32_usart_shutdown,
Erwan Le Ray3d82be82021-03-04 17:23:08 +01001119 .flush_buffer = stm32_usart_flush_buffer,
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001120 .set_termios = stm32_usart_set_termios,
1121 .pm = stm32_usart_pm,
1122 .type = stm32_usart_type,
1123 .release_port = stm32_usart_release_port,
1124 .request_port = stm32_usart_request_port,
1125 .config_port = stm32_usart_config_port,
1126 .verify_port = stm32_usart_verify_port,
Maxime Coquelin48a60922015-06-10 21:19:36 +02001127};
1128
Fabrice Gasnier2aa1bbb2021-04-13 19:40:15 +02001129/*
1130 * STM32H7 RX & TX FIFO threshold configuration (CR3 RXFTCFG / TXFTCFG)
1131 * Note: 1 isn't a valid value in RXFTCFG / TXFTCFG. In this case,
1132 * RXNEIE / TXEIE can be used instead of threshold irqs: RXFTIE / TXFTIE.
1133 * So, RXFTCFG / TXFTCFG bitfields values are encoded as array index + 1.
1134 */
1135static const u32 stm32h7_usart_fifo_thresh_cfg[] = { 1, 2, 4, 8, 12, 14, 16 };
1136
1137static void stm32_usart_get_ftcfg(struct platform_device *pdev, const char *p,
1138 int *ftcfg)
1139{
1140 u32 bytes, i;
1141
1142 /* DT option to get RX & TX FIFO threshold (default to 8 bytes) */
1143 if (of_property_read_u32(pdev->dev.of_node, p, &bytes))
1144 bytes = 8;
1145
1146 for (i = 0; i < ARRAY_SIZE(stm32h7_usart_fifo_thresh_cfg); i++)
1147 if (stm32h7_usart_fifo_thresh_cfg[i] >= bytes)
1148 break;
1149 if (i >= ARRAY_SIZE(stm32h7_usart_fifo_thresh_cfg))
1150 i = ARRAY_SIZE(stm32h7_usart_fifo_thresh_cfg) - 1;
1151
1152 dev_dbg(&pdev->dev, "%s set to %d bytes\n", p,
1153 stm32h7_usart_fifo_thresh_cfg[i]);
1154
1155 /* Provide FIFO threshold ftcfg (1 is invalid: threshold irq unused) */
1156 if (i)
1157 *ftcfg = i - 1;
1158 else
1159 *ftcfg = -EINVAL;
1160}
1161
Erwan Le Ray97f3a082021-01-06 17:22:02 +01001162static void stm32_usart_deinit_port(struct stm32_port *stm32port)
1163{
1164 clk_disable_unprepare(stm32port->clk);
1165}
1166
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001167static int stm32_usart_init_port(struct stm32_port *stm32port,
1168 struct platform_device *pdev)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001169{
1170 struct uart_port *port = &stm32port->port;
1171 struct resource *res;
Erwan Le Raye0f2a902021-01-21 15:23:09 +01001172 int ret, irq;
Maxime Coquelin48a60922015-06-10 21:19:36 +02001173
Erwan Le Raye0f2a902021-01-21 15:23:09 +01001174 irq = platform_get_irq(pdev, 0);
Tang Bin217b04c2021-08-11 18:51:36 +08001175 if (irq < 0)
1176 return irq;
Erwan Le Ray92fc0022021-01-06 17:21:57 +01001177
Maxime Coquelin48a60922015-06-10 21:19:36 +02001178 port->iotype = UPIO_MEM;
1179 port->flags = UPF_BOOT_AUTOCONF;
1180 port->ops = &stm32_uart_ops;
1181 port->dev = &pdev->dev;
Erwan Le Rayd0757192019-06-18 12:02:24 +02001182 port->fifosize = stm32port->info->cfg.fifosize;
Dmitry Safonov9feedaa2019-12-13 00:06:43 +00001183 port->has_sysrq = IS_ENABLED(CONFIG_SERIAL_STM32_CONSOLE);
Erwan Le Raye0f2a902021-01-21 15:23:09 +01001184 port->irq = irq;
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001185 port->rs485_config = stm32_usart_config_rs485;
Bich HEMON7d8f6862018-03-15 08:44:46 +00001186
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001187 ret = stm32_usart_init_rs485(port, pdev);
Lukas Wunnerc150c0f2020-05-12 14:40:02 +02001188 if (ret)
1189 return ret;
Bich HEMON7d8f6862018-03-15 08:44:46 +00001190
Alexandre Torgue3d530012021-03-19 19:42:52 +01001191 stm32port->wakeup_src = stm32port->info->cfg.has_wakeup &&
1192 of_property_read_bool(pdev->dev.of_node, "wakeup-source");
Erwan Le Ray2c58e562019-05-21 17:45:47 +02001193
Martin Devera3cd66592021-03-28 17:43:06 +02001194 stm32port->swap = stm32port->info->cfg.has_swap &&
1195 of_property_read_bool(pdev->dev.of_node, "rx-tx-swap");
1196
Gerald Baeza351a7622017-07-13 15:08:30 +00001197 stm32port->fifoen = stm32port->info->cfg.has_fifo;
Fabrice Gasnier2aa1bbb2021-04-13 19:40:15 +02001198 if (stm32port->fifoen) {
1199 stm32_usart_get_ftcfg(pdev, "rx-threshold",
1200 &stm32port->rxftcfg);
1201 stm32_usart_get_ftcfg(pdev, "tx-threshold",
1202 &stm32port->txftcfg);
1203 }
Maxime Coquelin48a60922015-06-10 21:19:36 +02001204
Tang Bin3d881e32021-08-14 21:14:18 +08001205 port->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001206 if (IS_ERR(port->membase))
1207 return PTR_ERR(port->membase);
1208 port->mapbase = res->start;
1209
1210 spin_lock_init(&port->lock);
1211
1212 stm32port->clk = devm_clk_get(&pdev->dev, NULL);
1213 if (IS_ERR(stm32port->clk))
1214 return PTR_ERR(stm32port->clk);
1215
1216 /* Ensure that clk rate is correct by enabling the clk */
1217 ret = clk_prepare_enable(stm32port->clk);
1218 if (ret)
1219 return ret;
1220
1221 stm32port->port.uartclk = clk_get_rate(stm32port->clk);
Fabrice Gasnierada80042017-07-13 15:08:29 +00001222 if (!stm32port->port.uartclk) {
Maxime Coquelin48a60922015-06-10 21:19:36 +02001223 ret = -EINVAL;
Manivannan Sadhasivam6cf61b92020-04-20 22:32:04 +05301224 goto err_clk;
Fabrice Gasnierada80042017-07-13 15:08:29 +00001225 }
Maxime Coquelin48a60922015-06-10 21:19:36 +02001226
Manivannan Sadhasivam6cf61b92020-04-20 22:32:04 +05301227 stm32port->gpios = mctrl_gpio_init(&stm32port->port, 0);
1228 if (IS_ERR(stm32port->gpios)) {
1229 ret = PTR_ERR(stm32port->gpios);
1230 goto err_clk;
1231 }
1232
Erwan Le Ray93593692021-01-06 17:22:01 +01001233 /*
1234 * Both CTS/RTS gpios and "st,hw-flow-ctrl" (deprecated) or "uart-has-rtscts"
1235 * properties should not be specified.
1236 */
Manivannan Sadhasivam6cf61b92020-04-20 22:32:04 +05301237 if (stm32port->hw_flow_control) {
1238 if (mctrl_gpio_to_gpiod(stm32port->gpios, UART_GPIO_CTS) ||
1239 mctrl_gpio_to_gpiod(stm32port->gpios, UART_GPIO_RTS)) {
1240 dev_err(&pdev->dev, "Conflicting RTS/CTS config\n");
1241 ret = -EINVAL;
1242 goto err_clk;
1243 }
1244 }
1245
1246 return ret;
1247
1248err_clk:
1249 clk_disable_unprepare(stm32port->clk);
1250
Maxime Coquelin48a60922015-06-10 21:19:36 +02001251 return ret;
1252}
1253
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001254static struct stm32_port *stm32_usart_of_get_port(struct platform_device *pdev)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001255{
1256 struct device_node *np = pdev->dev.of_node;
1257 int id;
1258
1259 if (!np)
1260 return NULL;
1261
1262 id = of_alias_get_id(np, "serial");
Gerald Baezae5707912017-07-13 15:08:27 +00001263 if (id < 0) {
1264 dev_err(&pdev->dev, "failed to get alias id, errno %d\n", id);
1265 return NULL;
1266 }
Maxime Coquelin48a60922015-06-10 21:19:36 +02001267
1268 if (WARN_ON(id >= STM32_MAX_PORTS))
1269 return NULL;
1270
Erwan Le Ray6fd9fff2020-05-20 15:39:32 +02001271 stm32_ports[id].hw_flow_control =
1272 of_property_read_bool (np, "st,hw-flow-ctrl") /*deprecated*/ ||
1273 of_property_read_bool (np, "uart-has-rtscts");
Maxime Coquelin48a60922015-06-10 21:19:36 +02001274 stm32_ports[id].port.line = id;
Erwan Le Ray4cc0ed62019-06-18 12:02:22 +02001275 stm32_ports[id].cr1_irq = USART_CR1_RXNEIE;
Erwan Le Rayd0a6a7b2019-06-18 12:02:25 +02001276 stm32_ports[id].cr3_irq = 0;
Gerald Baezae5707912017-07-13 15:08:27 +00001277 stm32_ports[id].last_res = RX_BUF_L;
Maxime Coquelin48a60922015-06-10 21:19:36 +02001278 return &stm32_ports[id];
1279}
1280
1281#ifdef CONFIG_OF
1282static const struct of_device_id stm32_match[] = {
Alexandre TORGUEada86182016-09-15 18:42:33 +02001283 { .compatible = "st,stm32-uart", .data = &stm32f4_info},
Alexandre TORGUEada86182016-09-15 18:42:33 +02001284 { .compatible = "st,stm32f7-uart", .data = &stm32f7_info},
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001285 { .compatible = "st,stm32h7-uart", .data = &stm32h7_info},
Maxime Coquelin48a60922015-06-10 21:19:36 +02001286 {},
1287};
1288
1289MODULE_DEVICE_TABLE(of, stm32_match);
1290#endif
1291
Erwan Le Raya7770a42021-06-10 12:00:20 +02001292static void stm32_usart_of_dma_rx_remove(struct stm32_port *stm32port,
1293 struct platform_device *pdev)
1294{
1295 if (stm32port->rx_buf)
1296 dma_free_coherent(&pdev->dev, RX_BUF_L, stm32port->rx_buf,
1297 stm32port->rx_dma_buf);
1298}
1299
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001300static int stm32_usart_of_dma_rx_probe(struct stm32_port *stm32port,
1301 struct platform_device *pdev)
Alexandre TORGUE34891872016-09-15 18:42:40 +02001302{
Stephen Boydd825f0b2021-01-22 19:44:25 -08001303 const struct stm32_usart_offsets *ofs = &stm32port->info->ofs;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001304 struct uart_port *port = &stm32port->port;
1305 struct device *dev = &pdev->dev;
1306 struct dma_slave_config config;
1307 struct dma_async_tx_descriptor *desc = NULL;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001308 int ret;
1309
Johan Hovolde359b442021-04-16 16:05:56 +02001310 /*
1311 * Using DMA and threaded handler for the console could lead to
1312 * deadlocks.
1313 */
1314 if (uart_console(port))
1315 return -ENODEV;
1316
Tang Bin59bd4ee2021-08-14 20:49:51 +08001317 stm32port->rx_buf = dma_alloc_coherent(dev, RX_BUF_L,
Erwan Le Ray92fc0022021-01-06 17:21:57 +01001318 &stm32port->rx_dma_buf,
1319 GFP_KERNEL);
Erwan Le Raya7770a42021-06-10 12:00:20 +02001320 if (!stm32port->rx_buf)
1321 return -ENOMEM;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001322
1323 /* Configure DMA channel */
1324 memset(&config, 0, sizeof(config));
Arnd Bergmann8e5481d2016-09-23 21:38:51 +02001325 config.src_addr = port->mapbase + ofs->rdr;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001326 config.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
1327
1328 ret = dmaengine_slave_config(stm32port->rx_ch, &config);
1329 if (ret < 0) {
1330 dev_err(dev, "rx dma channel config failed\n");
Erwan Le Raya7770a42021-06-10 12:00:20 +02001331 stm32_usart_of_dma_rx_remove(stm32port, pdev);
1332 return ret;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001333 }
1334
1335 /* Prepare a DMA cyclic transaction */
1336 desc = dmaengine_prep_dma_cyclic(stm32port->rx_ch,
1337 stm32port->rx_dma_buf,
1338 RX_BUF_L, RX_BUF_P, DMA_DEV_TO_MEM,
1339 DMA_PREP_INTERRUPT);
1340 if (!desc) {
1341 dev_err(dev, "rx dma prep cyclic failed\n");
Erwan Le Raya7770a42021-06-10 12:00:20 +02001342 stm32_usart_of_dma_rx_remove(stm32port, pdev);
1343 return -ENODEV;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001344 }
1345
Erwan Le Ray33bb2f62021-10-20 17:03:31 +02001346 /* Set DMA callback */
1347 desc->callback = stm32_usart_rx_dma_complete;
1348 desc->callback_param = port;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001349
1350 /* Push current DMA transaction in the pending queue */
Erwan Le Raye7997f72021-01-06 17:21:56 +01001351 ret = dma_submit_error(dmaengine_submit(desc));
1352 if (ret) {
1353 dmaengine_terminate_sync(stm32port->rx_ch);
Erwan Le Raya7770a42021-06-10 12:00:20 +02001354 stm32_usart_of_dma_rx_remove(stm32port, pdev);
1355 return ret;
Erwan Le Raye7997f72021-01-06 17:21:56 +01001356 }
Alexandre TORGUE34891872016-09-15 18:42:40 +02001357
1358 /* Issue pending DMA requests */
1359 dma_async_issue_pending(stm32port->rx_ch);
1360
1361 return 0;
Erwan Le Raya7770a42021-06-10 12:00:20 +02001362}
Alexandre TORGUE34891872016-09-15 18:42:40 +02001363
Erwan Le Raya7770a42021-06-10 12:00:20 +02001364static void stm32_usart_of_dma_tx_remove(struct stm32_port *stm32port,
1365 struct platform_device *pdev)
1366{
1367 if (stm32port->tx_buf)
1368 dma_free_coherent(&pdev->dev, TX_BUF_L, stm32port->tx_buf,
1369 stm32port->tx_dma_buf);
Alexandre TORGUE34891872016-09-15 18:42:40 +02001370}
1371
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001372static int stm32_usart_of_dma_tx_probe(struct stm32_port *stm32port,
1373 struct platform_device *pdev)
Alexandre TORGUE34891872016-09-15 18:42:40 +02001374{
Stephen Boydd825f0b2021-01-22 19:44:25 -08001375 const struct stm32_usart_offsets *ofs = &stm32port->info->ofs;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001376 struct uart_port *port = &stm32port->port;
1377 struct device *dev = &pdev->dev;
1378 struct dma_slave_config config;
1379 int ret;
1380
1381 stm32port->tx_dma_busy = false;
1382
Tang Bin59bd4ee2021-08-14 20:49:51 +08001383 stm32port->tx_buf = dma_alloc_coherent(dev, TX_BUF_L,
Erwan Le Ray92fc0022021-01-06 17:21:57 +01001384 &stm32port->tx_dma_buf,
1385 GFP_KERNEL);
Erwan Le Raya7770a42021-06-10 12:00:20 +02001386 if (!stm32port->tx_buf)
1387 return -ENOMEM;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001388
1389 /* Configure DMA channel */
1390 memset(&config, 0, sizeof(config));
Arnd Bergmann8e5481d2016-09-23 21:38:51 +02001391 config.dst_addr = port->mapbase + ofs->tdr;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001392 config.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
1393
1394 ret = dmaengine_slave_config(stm32port->tx_ch, &config);
1395 if (ret < 0) {
1396 dev_err(dev, "tx dma channel config failed\n");
Erwan Le Raya7770a42021-06-10 12:00:20 +02001397 stm32_usart_of_dma_tx_remove(stm32port, pdev);
1398 return ret;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001399 }
1400
1401 return 0;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001402}
1403
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001404static int stm32_usart_serial_probe(struct platform_device *pdev)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001405{
Maxime Coquelin48a60922015-06-10 21:19:36 +02001406 struct stm32_port *stm32port;
Alexandre TORGUEada86182016-09-15 18:42:33 +02001407 int ret;
Maxime Coquelin48a60922015-06-10 21:19:36 +02001408
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001409 stm32port = stm32_usart_of_get_port(pdev);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001410 if (!stm32port)
1411 return -ENODEV;
1412
Stephen Boydd825f0b2021-01-22 19:44:25 -08001413 stm32port->info = of_device_get_match_data(&pdev->dev);
1414 if (!stm32port->info)
Alexandre TORGUEada86182016-09-15 18:42:33 +02001415 return -EINVAL;
1416
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001417 ret = stm32_usart_init_port(stm32port, pdev);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001418 if (ret)
1419 return ret;
1420
Alexandre Torgue3d530012021-03-19 19:42:52 +01001421 if (stm32port->wakeup_src) {
1422 device_set_wakeup_capable(&pdev->dev, true);
1423 ret = dev_pm_set_wake_irq(&pdev->dev, stm32port->port.irq);
Erwan Le Ray5297f272019-05-21 17:45:46 +02001424 if (ret)
Erwan Le Raya7770a42021-06-10 12:00:20 +02001425 goto err_deinit_port;
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001426 }
1427
Erwan Le Raya7770a42021-06-10 12:00:20 +02001428 stm32port->rx_ch = dma_request_chan(&pdev->dev, "rx");
1429 if (PTR_ERR(stm32port->rx_ch) == -EPROBE_DEFER) {
1430 ret = -EPROBE_DEFER;
1431 goto err_wakeirq;
1432 }
1433 /* Fall back in interrupt mode for any non-deferral error */
1434 if (IS_ERR(stm32port->rx_ch))
1435 stm32port->rx_ch = NULL;
Alexandre TORGUE34891872016-09-15 18:42:40 +02001436
Erwan Le Raya7770a42021-06-10 12:00:20 +02001437 stm32port->tx_ch = dma_request_chan(&pdev->dev, "tx");
1438 if (PTR_ERR(stm32port->tx_ch) == -EPROBE_DEFER) {
1439 ret = -EPROBE_DEFER;
1440 goto err_dma_rx;
1441 }
1442 /* Fall back in interrupt mode for any non-deferral error */
1443 if (IS_ERR(stm32port->tx_ch))
1444 stm32port->tx_ch = NULL;
1445
1446 if (stm32port->rx_ch && stm32_usart_of_dma_rx_probe(stm32port, pdev)) {
1447 /* Fall back in interrupt mode */
1448 dma_release_channel(stm32port->rx_ch);
1449 stm32port->rx_ch = NULL;
1450 }
1451
1452 if (stm32port->tx_ch && stm32_usart_of_dma_tx_probe(stm32port, pdev)) {
1453 /* Fall back in interrupt mode */
1454 dma_release_channel(stm32port->tx_ch);
1455 stm32port->tx_ch = NULL;
1456 }
1457
1458 if (!stm32port->rx_ch)
1459 dev_info(&pdev->dev, "interrupt mode for rx (no dma)\n");
1460 if (!stm32port->tx_ch)
1461 dev_info(&pdev->dev, "interrupt mode for tx (no dma)\n");
Alexandre TORGUE34891872016-09-15 18:42:40 +02001462
Maxime Coquelin48a60922015-06-10 21:19:36 +02001463 platform_set_drvdata(pdev, &stm32port->port);
1464
Erwan Le Rayfb6dcef2019-06-13 15:49:54 +02001465 pm_runtime_get_noresume(&pdev->dev);
1466 pm_runtime_set_active(&pdev->dev);
1467 pm_runtime_enable(&pdev->dev);
Erwan Le Ray87fd0742021-03-04 17:22:56 +01001468
1469 ret = uart_add_one_port(&stm32_usart_driver, &stm32port->port);
1470 if (ret)
1471 goto err_port;
1472
Erwan Le Rayfb6dcef2019-06-13 15:49:54 +02001473 pm_runtime_put_sync(&pdev->dev);
1474
Maxime Coquelin48a60922015-06-10 21:19:36 +02001475 return 0;
Fabrice Gasnierada80042017-07-13 15:08:29 +00001476
Erwan Le Ray87fd0742021-03-04 17:22:56 +01001477err_port:
1478 pm_runtime_disable(&pdev->dev);
1479 pm_runtime_set_suspended(&pdev->dev);
1480 pm_runtime_put_noidle(&pdev->dev);
1481
Erwan Le Ray87fd0742021-03-04 17:22:56 +01001482 if (stm32port->tx_ch) {
Erwan Le Raya7770a42021-06-10 12:00:20 +02001483 stm32_usart_of_dma_tx_remove(stm32port, pdev);
Erwan Le Ray87fd0742021-03-04 17:22:56 +01001484 dma_release_channel(stm32port->tx_ch);
1485 }
1486
Erwan Le Raya7770a42021-06-10 12:00:20 +02001487 if (stm32port->rx_ch)
1488 stm32_usart_of_dma_rx_remove(stm32port, pdev);
Erwan Le Ray87fd0742021-03-04 17:22:56 +01001489
Erwan Le Raya7770a42021-06-10 12:00:20 +02001490err_dma_rx:
1491 if (stm32port->rx_ch)
1492 dma_release_channel(stm32port->rx_ch);
1493
1494err_wakeirq:
Alexandre Torgue3d530012021-03-19 19:42:52 +01001495 if (stm32port->wakeup_src)
Erwan Le Ray5297f272019-05-21 17:45:46 +02001496 dev_pm_clear_wake_irq(&pdev->dev);
1497
Erwan Le Raya7770a42021-06-10 12:00:20 +02001498err_deinit_port:
Alexandre Torgue3d530012021-03-19 19:42:52 +01001499 if (stm32port->wakeup_src)
1500 device_set_wakeup_capable(&pdev->dev, false);
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001501
Erwan Le Ray97f3a082021-01-06 17:22:02 +01001502 stm32_usart_deinit_port(stm32port);
Fabrice Gasnierada80042017-07-13 15:08:29 +00001503
1504 return ret;
Maxime Coquelin48a60922015-06-10 21:19:36 +02001505}
1506
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001507static int stm32_usart_serial_remove(struct platform_device *pdev)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001508{
1509 struct uart_port *port = platform_get_drvdata(pdev);
Alexandre TORGUE511c7b12016-09-15 18:42:38 +02001510 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -08001511 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Erwan Le Rayfb6dcef2019-06-13 15:49:54 +02001512 int err;
Erwan Le Ray33bb2f62021-10-20 17:03:31 +02001513 u32 cr3;
Erwan Le Rayfb6dcef2019-06-13 15:49:54 +02001514
1515 pm_runtime_get_sync(&pdev->dev);
Erwan Le Ray87fd0742021-03-04 17:22:56 +01001516 err = uart_remove_one_port(&stm32_usart_driver, port);
1517 if (err)
1518 return(err);
1519
1520 pm_runtime_disable(&pdev->dev);
1521 pm_runtime_set_suspended(&pdev->dev);
1522 pm_runtime_put_noidle(&pdev->dev);
Alexandre TORGUE34891872016-09-15 18:42:40 +02001523
Erwan Le Ray33bb2f62021-10-20 17:03:31 +02001524 stm32_usart_clr_bits(port, ofs->cr1, USART_CR1_PEIE);
1525 cr3 = readl_relaxed(port->membase + ofs->cr3);
1526 cr3 &= ~USART_CR3_EIE;
1527 cr3 &= ~USART_CR3_DMAR;
1528 cr3 &= ~USART_CR3_DDRE;
1529 writel_relaxed(cr3, port->membase + ofs->cr3);
Alexandre TORGUE34891872016-09-15 18:42:40 +02001530
Erwan Le Ray87fd0742021-03-04 17:22:56 +01001531 if (stm32_port->tx_ch) {
1532 dmaengine_terminate_async(stm32_port->tx_ch);
Erwan Le Raya7770a42021-06-10 12:00:20 +02001533 stm32_usart_of_dma_tx_remove(stm32_port, pdev);
Alexandre TORGUE34891872016-09-15 18:42:40 +02001534 dma_release_channel(stm32_port->tx_ch);
Erwan Le Ray87fd0742021-03-04 17:22:56 +01001535 }
Alexandre TORGUE34891872016-09-15 18:42:40 +02001536
Erwan Le Raya7770a42021-06-10 12:00:20 +02001537 if (stm32_port->rx_ch) {
1538 dmaengine_terminate_async(stm32_port->rx_ch);
1539 stm32_usart_of_dma_rx_remove(stm32_port, pdev);
1540 dma_release_channel(stm32_port->rx_ch);
1541 }
1542
1543 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_DMAT);
Alexandre TORGUE511c7b12016-09-15 18:42:38 +02001544
Alexandre Torgue3d530012021-03-19 19:42:52 +01001545 if (stm32_port->wakeup_src) {
Erwan Le Ray5297f272019-05-21 17:45:46 +02001546 dev_pm_clear_wake_irq(&pdev->dev);
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001547 device_init_wakeup(&pdev->dev, false);
Erwan Le Ray5297f272019-05-21 17:45:46 +02001548 }
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001549
Erwan Le Ray97f3a082021-01-06 17:22:02 +01001550 stm32_usart_deinit_port(stm32_port);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001551
Erwan Le Ray87fd0742021-03-04 17:22:56 +01001552 return 0;
Maxime Coquelin48a60922015-06-10 21:19:36 +02001553}
1554
Maxime Coquelin48a60922015-06-10 21:19:36 +02001555#ifdef CONFIG_SERIAL_STM32_CONSOLE
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001556static void stm32_usart_console_putchar(struct uart_port *port, int ch)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001557{
Alexandre TORGUEada86182016-09-15 18:42:33 +02001558 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -08001559 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Alexandre TORGUEada86182016-09-15 18:42:33 +02001560
1561 while (!(readl_relaxed(port->membase + ofs->isr) & USART_SR_TXE))
Maxime Coquelin48a60922015-06-10 21:19:36 +02001562 cpu_relax();
1563
Alexandre TORGUEada86182016-09-15 18:42:33 +02001564 writel_relaxed(ch, port->membase + ofs->tdr);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001565}
1566
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001567static void stm32_usart_console_write(struct console *co, const char *s,
1568 unsigned int cnt)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001569{
1570 struct uart_port *port = &stm32_ports[co->index].port;
Alexandre TORGUEada86182016-09-15 18:42:33 +02001571 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -08001572 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
1573 const struct stm32_usart_config *cfg = &stm32_port->info->cfg;
Maxime Coquelin48a60922015-06-10 21:19:36 +02001574 unsigned long flags;
1575 u32 old_cr1, new_cr1;
1576 int locked = 1;
1577
Johan Hovoldcea37af2021-04-16 16:05:57 +02001578 if (oops_in_progress)
1579 locked = spin_trylock_irqsave(&port->lock, flags);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001580 else
Johan Hovoldcea37af2021-04-16 16:05:57 +02001581 spin_lock_irqsave(&port->lock, flags);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001582
Alexandre TORGUE87f1f802016-09-15 18:42:42 +02001583 /* Save and disable interrupts, enable the transmitter */
Alexandre TORGUEada86182016-09-15 18:42:33 +02001584 old_cr1 = readl_relaxed(port->membase + ofs->cr1);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001585 new_cr1 = old_cr1 & ~USART_CR1_IE_MASK;
Alexandre TORGUE87f1f802016-09-15 18:42:42 +02001586 new_cr1 |= USART_CR1_TE | BIT(cfg->uart_enable_bit);
Alexandre TORGUEada86182016-09-15 18:42:33 +02001587 writel_relaxed(new_cr1, port->membase + ofs->cr1);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001588
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001589 uart_console_write(port, s, cnt, stm32_usart_console_putchar);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001590
1591 /* Restore interrupt state */
Alexandre TORGUEada86182016-09-15 18:42:33 +02001592 writel_relaxed(old_cr1, port->membase + ofs->cr1);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001593
1594 if (locked)
Johan Hovoldcea37af2021-04-16 16:05:57 +02001595 spin_unlock_irqrestore(&port->lock, flags);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001596}
1597
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001598static int stm32_usart_console_setup(struct console *co, char *options)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001599{
1600 struct stm32_port *stm32port;
1601 int baud = 9600;
1602 int bits = 8;
1603 int parity = 'n';
1604 int flow = 'n';
1605
1606 if (co->index >= STM32_MAX_PORTS)
1607 return -ENODEV;
1608
1609 stm32port = &stm32_ports[co->index];
1610
1611 /*
1612 * This driver does not support early console initialization
1613 * (use ARM early printk support instead), so we only expect
1614 * this to be called during the uart port registration when the
1615 * driver gets probed and the port should be mapped at that point.
1616 */
Erwan Le Ray92fc0022021-01-06 17:21:57 +01001617 if (stm32port->port.mapbase == 0 || !stm32port->port.membase)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001618 return -ENXIO;
1619
1620 if (options)
1621 uart_parse_options(options, &baud, &parity, &bits, &flow);
1622
1623 return uart_set_options(&stm32port->port, co, baud, parity, bits, flow);
1624}
1625
1626static struct console stm32_console = {
1627 .name = STM32_SERIAL_NAME,
1628 .device = uart_console_device,
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001629 .write = stm32_usart_console_write,
1630 .setup = stm32_usart_console_setup,
Maxime Coquelin48a60922015-06-10 21:19:36 +02001631 .flags = CON_PRINTBUFFER,
1632 .index = -1,
1633 .data = &stm32_usart_driver,
1634};
1635
1636#define STM32_SERIAL_CONSOLE (&stm32_console)
1637
1638#else
1639#define STM32_SERIAL_CONSOLE NULL
1640#endif /* CONFIG_SERIAL_STM32_CONSOLE */
1641
1642static struct uart_driver stm32_usart_driver = {
1643 .driver_name = DRIVER_NAME,
1644 .dev_name = STM32_SERIAL_NAME,
1645 .major = 0,
1646 .minor = 0,
1647 .nr = STM32_MAX_PORTS,
1648 .cons = STM32_SERIAL_CONSOLE,
1649};
1650
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001651static void __maybe_unused stm32_usart_serial_en_wakeup(struct uart_port *port,
1652 bool enable)
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001653{
1654 struct stm32_port *stm32_port = to_stm32_port(port);
Stephen Boydd825f0b2021-01-22 19:44:25 -08001655 const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001656
Alexandre Torgue3d530012021-03-19 19:42:52 +01001657 if (!stm32_port->wakeup_src)
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001658 return;
1659
Erwan Le Ray12761862021-03-04 17:23:01 +01001660 /*
1661 * Enable low-power wake-up and wake-up irq if argument is set to
1662 * "enable", disable low-power wake-up and wake-up irq otherwise
1663 */
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001664 if (enable) {
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001665 stm32_usart_set_bits(port, ofs->cr1, USART_CR1_UESM);
Erwan Le Ray12761862021-03-04 17:23:01 +01001666 stm32_usart_set_bits(port, ofs->cr3, USART_CR3_WUFIE);
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001667 } else {
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001668 stm32_usart_clr_bits(port, ofs->cr1, USART_CR1_UESM);
Erwan Le Ray12761862021-03-04 17:23:01 +01001669 stm32_usart_clr_bits(port, ofs->cr3, USART_CR3_WUFIE);
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001670 }
1671}
1672
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001673static int __maybe_unused stm32_usart_serial_suspend(struct device *dev)
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001674{
1675 struct uart_port *port = dev_get_drvdata(dev);
1676
1677 uart_suspend_port(&stm32_usart_driver, port);
1678
Erwan Le Ray1631eee2021-03-19 19:42:49 +01001679 if (device_may_wakeup(dev) || device_wakeup_path(dev))
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001680 stm32_usart_serial_en_wakeup(port, true);
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001681
Erwan Le Ray55484fc2020-05-19 11:41:04 +02001682 /*
1683 * When "no_console_suspend" is enabled, keep the pinctrl default state
1684 * and rely on bootloader stage to restore this state upon resume.
1685 * Otherwise, apply the idle or sleep states depending on wakeup
1686 * capabilities.
1687 */
1688 if (console_suspend_enabled || !uart_console(port)) {
Erwan Le Ray1631eee2021-03-19 19:42:49 +01001689 if (device_may_wakeup(dev) || device_wakeup_path(dev))
Erwan Le Ray55484fc2020-05-19 11:41:04 +02001690 pinctrl_pm_select_idle_state(dev);
1691 else
1692 pinctrl_pm_select_sleep_state(dev);
1693 }
Erwan Le Ray94616d92019-06-13 15:49:53 +02001694
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001695 return 0;
1696}
1697
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001698static int __maybe_unused stm32_usart_serial_resume(struct device *dev)
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001699{
1700 struct uart_port *port = dev_get_drvdata(dev);
1701
Erwan Le Ray94616d92019-06-13 15:49:53 +02001702 pinctrl_pm_select_default_state(dev);
1703
Erwan Le Ray1631eee2021-03-19 19:42:49 +01001704 if (device_may_wakeup(dev) || device_wakeup_path(dev))
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001705 stm32_usart_serial_en_wakeup(port, false);
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001706
1707 return uart_resume_port(&stm32_usart_driver, port);
1708}
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001709
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001710static int __maybe_unused stm32_usart_runtime_suspend(struct device *dev)
Erwan Le Rayfb6dcef2019-06-13 15:49:54 +02001711{
1712 struct uart_port *port = dev_get_drvdata(dev);
1713 struct stm32_port *stm32port = container_of(port,
1714 struct stm32_port, port);
1715
1716 clk_disable_unprepare(stm32port->clk);
1717
1718 return 0;
1719}
1720
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001721static int __maybe_unused stm32_usart_runtime_resume(struct device *dev)
Erwan Le Rayfb6dcef2019-06-13 15:49:54 +02001722{
1723 struct uart_port *port = dev_get_drvdata(dev);
1724 struct stm32_port *stm32port = container_of(port,
1725 struct stm32_port, port);
1726
1727 return clk_prepare_enable(stm32port->clk);
1728}
1729
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001730static const struct dev_pm_ops stm32_serial_pm_ops = {
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001731 SET_RUNTIME_PM_OPS(stm32_usart_runtime_suspend,
1732 stm32_usart_runtime_resume, NULL)
1733 SET_SYSTEM_SLEEP_PM_OPS(stm32_usart_serial_suspend,
1734 stm32_usart_serial_resume)
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001735};
1736
Maxime Coquelin48a60922015-06-10 21:19:36 +02001737static struct platform_driver stm32_serial_driver = {
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001738 .probe = stm32_usart_serial_probe,
1739 .remove = stm32_usart_serial_remove,
Maxime Coquelin48a60922015-06-10 21:19:36 +02001740 .driver = {
1741 .name = DRIVER_NAME,
Fabrice Gasnier270e5a72017-07-13 15:08:30 +00001742 .pm = &stm32_serial_pm_ops,
Maxime Coquelin48a60922015-06-10 21:19:36 +02001743 .of_match_table = of_match_ptr(stm32_match),
1744 },
1745};
1746
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001747static int __init stm32_usart_init(void)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001748{
1749 static char banner[] __initdata = "STM32 USART driver initialized";
1750 int ret;
1751
1752 pr_info("%s\n", banner);
1753
1754 ret = uart_register_driver(&stm32_usart_driver);
1755 if (ret)
1756 return ret;
1757
1758 ret = platform_driver_register(&stm32_serial_driver);
1759 if (ret)
1760 uart_unregister_driver(&stm32_usart_driver);
1761
1762 return ret;
1763}
1764
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001765static void __exit stm32_usart_exit(void)
Maxime Coquelin48a60922015-06-10 21:19:36 +02001766{
1767 platform_driver_unregister(&stm32_serial_driver);
1768 uart_unregister_driver(&stm32_usart_driver);
1769}
1770
Erwan Le Ray56f9a762021-01-06 17:21:58 +01001771module_init(stm32_usart_init);
1772module_exit(stm32_usart_exit);
Maxime Coquelin48a60922015-06-10 21:19:36 +02001773
1774MODULE_ALIAS("platform:" DRIVER_NAME);
1775MODULE_DESCRIPTION("STMicroelectronics STM32 serial port driver");
1776MODULE_LICENSE("GPL v2");