1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Freescale LINFlexD UART serial port driver
5 * Copyright 2012-2016 Freescale Semiconductor, Inc.
6 * Copyright 2017-2019 NXP
9 #include <linux/console.h>
11 #include <linux/irq.h>
12 #include <linux/module.h>
14 #include <linux/of_device.h>
15 #include <linux/serial_core.h>
16 #include <linux/slab.h>
17 #include <linux/tty_flip.h>
18 #include <linux/delay.h>
20 /* All registers are 32-bit width */
22 #define LINCR1 0x0000 /* LIN control register */
23 #define LINIER 0x0004 /* LIN interrupt enable register */
24 #define LINSR 0x0008 /* LIN status register */
25 #define LINESR 0x000C /* LIN error status register */
26 #define UARTCR 0x0010 /* UART mode control register */
27 #define UARTSR 0x0014 /* UART mode status register */
28 #define LINTCSR 0x0018 /* LIN timeout control status register */
29 #define LINOCR 0x001C /* LIN output compare register */
30 #define LINTOCR 0x0020 /* LIN timeout control register */
31 #define LINFBRR 0x0024 /* LIN fractional baud rate register */
32 #define LINIBRR 0x0028 /* LIN integer baud rate register */
33 #define LINCFR 0x002C /* LIN checksum field register */
34 #define LINCR2 0x0030 /* LIN control register 2 */
35 #define BIDR 0x0034 /* Buffer identifier register */
36 #define BDRL 0x0038 /* Buffer data register least significant */
37 #define BDRM 0x003C /* Buffer data register most significant */
38 #define IFER 0x0040 /* Identifier filter enable register */
39 #define IFMI 0x0044 /* Identifier filter match index */
40 #define IFMR 0x0048 /* Identifier filter mode register */
41 #define GCR 0x004C /* Global control register */
42 #define UARTPTO 0x0050 /* UART preset timeout register */
43 #define UARTCTO 0x0054 /* UART current timeout register */
46 * Register field definitions
49 #define LINFLEXD_LINCR1_INIT BIT(0)
50 #define LINFLEXD_LINCR1_MME BIT(4)
51 #define LINFLEXD_LINCR1_BF BIT(7)
53 #define LINFLEXD_LINSR_LINS_INITMODE BIT(12)
54 #define LINFLEXD_LINSR_LINS_MASK (0xF << 12)
56 #define LINFLEXD_LINIER_SZIE BIT(15)
57 #define LINFLEXD_LINIER_OCIE BIT(14)
58 #define LINFLEXD_LINIER_BEIE BIT(13)
59 #define LINFLEXD_LINIER_CEIE BIT(12)
60 #define LINFLEXD_LINIER_HEIE BIT(11)
61 #define LINFLEXD_LINIER_FEIE BIT(8)
62 #define LINFLEXD_LINIER_BOIE BIT(7)
63 #define LINFLEXD_LINIER_LSIE BIT(6)
64 #define LINFLEXD_LINIER_WUIE BIT(5)
65 #define LINFLEXD_LINIER_DBFIE BIT(4)
66 #define LINFLEXD_LINIER_DBEIETOIE BIT(3)
67 #define LINFLEXD_LINIER_DRIE BIT(2)
68 #define LINFLEXD_LINIER_DTIE BIT(1)
69 #define LINFLEXD_LINIER_HRIE BIT(0)
71 #define LINFLEXD_UARTCR_OSR_MASK (0xF << 24)
72 #define LINFLEXD_UARTCR_OSR(uartcr) (((uartcr) \
73 & LINFLEXD_UARTCR_OSR_MASK) >> 24)
75 #define LINFLEXD_UARTCR_ROSE BIT(23)
77 #define LINFLEXD_UARTCR_RFBM BIT(9)
78 #define LINFLEXD_UARTCR_TFBM BIT(8)
79 #define LINFLEXD_UARTCR_WL1 BIT(7)
80 #define LINFLEXD_UARTCR_PC1 BIT(6)
82 #define LINFLEXD_UARTCR_RXEN BIT(5)
83 #define LINFLEXD_UARTCR_TXEN BIT(4)
84 #define LINFLEXD_UARTCR_PC0 BIT(3)
86 #define LINFLEXD_UARTCR_PCE BIT(2)
87 #define LINFLEXD_UARTCR_WL0 BIT(1)
88 #define LINFLEXD_UARTCR_UART BIT(0)
90 #define LINFLEXD_UARTSR_SZF BIT(15)
91 #define LINFLEXD_UARTSR_OCF BIT(14)
92 #define LINFLEXD_UARTSR_PE3 BIT(13)
93 #define LINFLEXD_UARTSR_PE2 BIT(12)
94 #define LINFLEXD_UARTSR_PE1 BIT(11)
95 #define LINFLEXD_UARTSR_PE0 BIT(10)
96 #define LINFLEXD_UARTSR_RMB BIT(9)
97 #define LINFLEXD_UARTSR_FEF BIT(8)
98 #define LINFLEXD_UARTSR_BOF BIT(7)
99 #define LINFLEXD_UARTSR_RPS BIT(6)
100 #define LINFLEXD_UARTSR_WUF BIT(5)
101 #define LINFLEXD_UARTSR_4 BIT(4)
103 #define LINFLEXD_UARTSR_TO BIT(3)
105 #define LINFLEXD_UARTSR_DRFRFE BIT(2)
106 #define LINFLEXD_UARTSR_DTFTFF BIT(1)
107 #define LINFLEXD_UARTSR_NF BIT(0)
108 #define LINFLEXD_UARTSR_PE (LINFLEXD_UARTSR_PE0 |\
109 LINFLEXD_UARTSR_PE1 |\
110 LINFLEXD_UARTSR_PE2 |\
113 #define LINFLEX_LDIV_MULTIPLIER (16)
115 #define DRIVER_NAME "fsl-linflexuart"
116 #define DEV_NAME "ttyLF"
119 #define EARLYCON_BUFFER_INITIAL_CAP 8
121 #define PREINIT_DELAY 2000 /* us */
123 static const struct of_device_id linflex_dt_ids
[] = {
125 .compatible
= "fsl,s32v234-linflexuart",
129 MODULE_DEVICE_TABLE(of
, linflex_dt_ids
);
131 #ifdef CONFIG_SERIAL_FSL_LINFLEXUART_CONSOLE
132 static struct uart_port
*earlycon_port
;
133 static bool linflex_earlycon_same_instance
;
134 static DEFINE_SPINLOCK(init_lock
);
135 static bool during_init
;
139 unsigned int len
, cap
;
143 static void linflex_stop_tx(struct uart_port
*port
)
147 ier
= readl(port
->membase
+ LINIER
);
148 ier
&= ~(LINFLEXD_LINIER_DTIE
);
149 writel(ier
, port
->membase
+ LINIER
);
152 static void linflex_stop_rx(struct uart_port
*port
)
156 ier
= readl(port
->membase
+ LINIER
);
157 writel(ier
& ~LINFLEXD_LINIER_DRIE
, port
->membase
+ LINIER
);
160 static inline void linflex_transmit_buffer(struct uart_port
*sport
)
162 struct circ_buf
*xmit
= &sport
->state
->xmit
;
164 unsigned long status
;
166 while (!uart_circ_empty(xmit
)) {
167 c
= xmit
->buf
[xmit
->tail
];
168 writeb(c
, sport
->membase
+ BDRL
);
170 /* Waiting for data transmission completed. */
171 while (((status
= readl(sport
->membase
+ UARTSR
)) &
172 LINFLEXD_UARTSR_DTFTFF
) !=
173 LINFLEXD_UARTSR_DTFTFF
)
176 xmit
->tail
= (xmit
->tail
+ 1) & (UART_XMIT_SIZE
- 1);
179 writel(status
| LINFLEXD_UARTSR_DTFTFF
,
180 sport
->membase
+ UARTSR
);
183 if (uart_circ_chars_pending(xmit
) < WAKEUP_CHARS
)
184 uart_write_wakeup(sport
);
186 if (uart_circ_empty(xmit
))
187 linflex_stop_tx(sport
);
190 static void linflex_start_tx(struct uart_port
*port
)
194 linflex_transmit_buffer(port
);
195 ier
= readl(port
->membase
+ LINIER
);
196 writel(ier
| LINFLEXD_LINIER_DTIE
, port
->membase
+ LINIER
);
199 static irqreturn_t
linflex_txint(int irq
, void *dev_id
)
201 struct uart_port
*sport
= dev_id
;
202 struct circ_buf
*xmit
= &sport
->state
->xmit
;
204 unsigned long status
;
206 spin_lock_irqsave(&sport
->lock
, flags
);
209 writeb(sport
->x_char
, sport
->membase
+ BDRL
);
211 /* waiting for data transmission completed */
212 while (((status
= readl(sport
->membase
+ UARTSR
)) &
213 LINFLEXD_UARTSR_DTFTFF
) != LINFLEXD_UARTSR_DTFTFF
)
216 writel(status
| LINFLEXD_UARTSR_DTFTFF
,
217 sport
->membase
+ UARTSR
);
222 if (uart_circ_empty(xmit
) || uart_tx_stopped(sport
)) {
223 linflex_stop_tx(sport
);
227 linflex_transmit_buffer(sport
);
229 if (uart_circ_chars_pending(xmit
) < WAKEUP_CHARS
)
230 uart_write_wakeup(sport
);
233 spin_unlock_irqrestore(&sport
->lock
, flags
);
237 static irqreturn_t
linflex_rxint(int irq
, void *dev_id
)
239 struct uart_port
*sport
= dev_id
;
241 struct tty_port
*port
= &sport
->state
->port
;
242 unsigned long flags
, status
;
246 spin_lock_irqsave(&sport
->lock
, flags
);
248 status
= readl(sport
->membase
+ UARTSR
);
249 while (status
& LINFLEXD_UARTSR_RMB
) {
250 rx
= readb(sport
->membase
+ BDRM
);
255 if (status
& (LINFLEXD_UARTSR_BOF
| LINFLEXD_UARTSR_FEF
|
256 LINFLEXD_UARTSR_PE
)) {
257 if (status
& LINFLEXD_UARTSR_BOF
)
258 sport
->icount
.overrun
++;
259 if (status
& LINFLEXD_UARTSR_FEF
) {
264 sport
->icount
.frame
++;
266 if (status
& LINFLEXD_UARTSR_PE
)
267 sport
->icount
.parity
++;
270 writel(status
, sport
->membase
+ UARTSR
);
271 status
= readl(sport
->membase
+ UARTSR
);
274 uart_handle_break(sport
);
276 if (uart_handle_sysrq_char(sport
, (unsigned char)rx
))
278 tty_insert_flip_char(port
, rx
, flg
);
282 spin_unlock_irqrestore(&sport
->lock
, flags
);
284 tty_flip_buffer_push(port
);
289 static irqreturn_t
linflex_int(int irq
, void *dev_id
)
291 struct uart_port
*sport
= dev_id
;
292 unsigned long status
;
294 status
= readl(sport
->membase
+ UARTSR
);
296 if (status
& LINFLEXD_UARTSR_DRFRFE
)
297 linflex_rxint(irq
, dev_id
);
298 if (status
& LINFLEXD_UARTSR_DTFTFF
)
299 linflex_txint(irq
, dev_id
);
304 /* return TIOCSER_TEMT when transmitter is not busy */
305 static unsigned int linflex_tx_empty(struct uart_port
*port
)
307 unsigned long status
;
309 status
= readl(port
->membase
+ UARTSR
) & LINFLEXD_UARTSR_DTFTFF
;
311 return status
? TIOCSER_TEMT
: 0;
314 static unsigned int linflex_get_mctrl(struct uart_port
*port
)
319 static void linflex_set_mctrl(struct uart_port
*port
, unsigned int mctrl
)
323 static void linflex_break_ctl(struct uart_port
*port
, int break_state
)
327 static void linflex_setup_watermark(struct uart_port
*sport
)
329 unsigned long cr
, ier
, cr1
;
331 /* Disable transmission/reception */
332 ier
= readl(sport
->membase
+ LINIER
);
333 ier
&= ~(LINFLEXD_LINIER_DRIE
| LINFLEXD_LINIER_DTIE
);
334 writel(ier
, sport
->membase
+ LINIER
);
336 cr
= readl(sport
->membase
+ UARTCR
);
337 cr
&= ~(LINFLEXD_UARTCR_RXEN
| LINFLEXD_UARTCR_TXEN
);
338 writel(cr
, sport
->membase
+ UARTCR
);
340 /* Enter initialization mode by setting INIT bit */
342 /* set the Linflex in master mode and activate by-pass filter */
343 cr1
= LINFLEXD_LINCR1_BF
| LINFLEXD_LINCR1_MME
344 | LINFLEXD_LINCR1_INIT
;
345 writel(cr1
, sport
->membase
+ LINCR1
);
347 /* wait for init mode entry */
348 while ((readl(sport
->membase
+ LINSR
)
349 & LINFLEXD_LINSR_LINS_MASK
)
350 != LINFLEXD_LINSR_LINS_INITMODE
)
354 * UART = 0x1; - Linflex working in UART mode
355 * TXEN = 0x1; - Enable transmission of data now
356 * RXEn = 0x1; - Receiver enabled
357 * WL0 = 0x1; - 8 bit data
358 * PCE = 0x0; - No parity
361 /* set UART bit to allow writing other bits */
362 writel(LINFLEXD_UARTCR_UART
, sport
->membase
+ UARTCR
);
364 cr
= (LINFLEXD_UARTCR_RXEN
| LINFLEXD_UARTCR_TXEN
|
365 LINFLEXD_UARTCR_WL0
| LINFLEXD_UARTCR_UART
);
367 writel(cr
, sport
->membase
+ UARTCR
);
369 cr1
&= ~(LINFLEXD_LINCR1_INIT
);
371 writel(cr1
, sport
->membase
+ LINCR1
);
373 ier
= readl(sport
->membase
+ LINIER
);
374 ier
|= LINFLEXD_LINIER_DRIE
;
375 ier
|= LINFLEXD_LINIER_DTIE
;
377 writel(ier
, sport
->membase
+ LINIER
);
380 static int linflex_startup(struct uart_port
*port
)
385 spin_lock_irqsave(&port
->lock
, flags
);
387 linflex_setup_watermark(port
);
389 spin_unlock_irqrestore(&port
->lock
, flags
);
391 ret
= devm_request_irq(port
->dev
, port
->irq
, linflex_int
, 0,
397 static void linflex_shutdown(struct uart_port
*port
)
402 spin_lock_irqsave(&port
->lock
, flags
);
404 /* disable interrupts */
405 ier
= readl(port
->membase
+ LINIER
);
406 ier
&= ~(LINFLEXD_LINIER_DRIE
| LINFLEXD_LINIER_DTIE
);
407 writel(ier
, port
->membase
+ LINIER
);
409 spin_unlock_irqrestore(&port
->lock
, flags
);
411 devm_free_irq(port
->dev
, port
->irq
, port
);
415 linflex_set_termios(struct uart_port
*port
, struct ktermios
*termios
,
416 struct ktermios
*old
)
419 unsigned long cr
, old_cr
, cr1
;
420 unsigned int old_csize
= old
? old
->c_cflag
& CSIZE
: CS8
;
422 cr
= readl(port
->membase
+ UARTCR
);
425 /* Enter initialization mode by setting INIT bit */
426 cr1
= readl(port
->membase
+ LINCR1
);
427 cr1
|= LINFLEXD_LINCR1_INIT
;
428 writel(cr1
, port
->membase
+ LINCR1
);
430 /* wait for init mode entry */
431 while ((readl(port
->membase
+ LINSR
)
432 & LINFLEXD_LINSR_LINS_MASK
)
433 != LINFLEXD_LINSR_LINS_INITMODE
)
437 * only support CS8 and CS7, and for CS7 must enable PE.
443 /* enter the UART into configuration mode */
445 while ((termios
->c_cflag
& CSIZE
) != CS8
&&
446 (termios
->c_cflag
& CSIZE
) != CS7
) {
447 termios
->c_cflag
&= ~CSIZE
;
448 termios
->c_cflag
|= old_csize
;
452 if ((termios
->c_cflag
& CSIZE
) == CS7
) {
453 /* Word length: WL1WL0:00 */
454 cr
= old_cr
& ~LINFLEXD_UARTCR_WL1
& ~LINFLEXD_UARTCR_WL0
;
457 if ((termios
->c_cflag
& CSIZE
) == CS8
) {
458 /* Word length: WL1WL0:01 */
459 cr
= (old_cr
| LINFLEXD_UARTCR_WL0
) & ~LINFLEXD_UARTCR_WL1
;
462 if (termios
->c_cflag
& CMSPAR
) {
463 if ((termios
->c_cflag
& CSIZE
) != CS8
) {
464 termios
->c_cflag
&= ~CSIZE
;
465 termios
->c_cflag
|= CS8
;
467 /* has a space/sticky bit */
468 cr
|= LINFLEXD_UARTCR_WL0
;
471 if (termios
->c_cflag
& CSTOPB
)
472 termios
->c_cflag
&= ~CSTOPB
;
474 /* parity must be enabled when CS7 to match 8-bits format */
475 if ((termios
->c_cflag
& CSIZE
) == CS7
)
476 termios
->c_cflag
|= PARENB
;
478 if ((termios
->c_cflag
& PARENB
)) {
479 cr
|= LINFLEXD_UARTCR_PCE
;
480 if (termios
->c_cflag
& PARODD
)
481 cr
= (cr
| LINFLEXD_UARTCR_PC0
) &
482 (~LINFLEXD_UARTCR_PC1
);
484 cr
= cr
& (~LINFLEXD_UARTCR_PC1
&
485 ~LINFLEXD_UARTCR_PC0
);
487 cr
&= ~LINFLEXD_UARTCR_PCE
;
490 spin_lock_irqsave(&port
->lock
, flags
);
492 port
->read_status_mask
= 0;
494 if (termios
->c_iflag
& INPCK
)
495 port
->read_status_mask
|= (LINFLEXD_UARTSR_FEF
|
496 LINFLEXD_UARTSR_PE0
|
497 LINFLEXD_UARTSR_PE1
|
498 LINFLEXD_UARTSR_PE2
|
499 LINFLEXD_UARTSR_PE3
);
500 if (termios
->c_iflag
& (IGNBRK
| BRKINT
| PARMRK
))
501 port
->read_status_mask
|= LINFLEXD_UARTSR_FEF
;
503 /* characters to ignore */
504 port
->ignore_status_mask
= 0;
505 if (termios
->c_iflag
& IGNPAR
)
506 port
->ignore_status_mask
|= LINFLEXD_UARTSR_PE
;
507 if (termios
->c_iflag
& IGNBRK
) {
508 port
->ignore_status_mask
|= LINFLEXD_UARTSR_PE
;
510 * if we're ignoring parity and break indicators,
511 * ignore overruns too (for real raw support).
513 if (termios
->c_iflag
& IGNPAR
)
514 port
->ignore_status_mask
|= LINFLEXD_UARTSR_BOF
;
517 writel(cr
, port
->membase
+ UARTCR
);
519 cr1
&= ~(LINFLEXD_LINCR1_INIT
);
521 writel(cr1
, port
->membase
+ LINCR1
);
523 spin_unlock_irqrestore(&port
->lock
, flags
);
526 static const char *linflex_type(struct uart_port
*port
)
528 return "FSL_LINFLEX";
531 static void linflex_release_port(struct uart_port
*port
)
536 static int linflex_request_port(struct uart_port
*port
)
541 /* configure/auto-configure the port */
542 static void linflex_config_port(struct uart_port
*port
, int flags
)
544 if (flags
& UART_CONFIG_TYPE
)
545 port
->type
= PORT_LINFLEXUART
;
548 static const struct uart_ops linflex_pops
= {
549 .tx_empty
= linflex_tx_empty
,
550 .set_mctrl
= linflex_set_mctrl
,
551 .get_mctrl
= linflex_get_mctrl
,
552 .stop_tx
= linflex_stop_tx
,
553 .start_tx
= linflex_start_tx
,
554 .stop_rx
= linflex_stop_rx
,
555 .break_ctl
= linflex_break_ctl
,
556 .startup
= linflex_startup
,
557 .shutdown
= linflex_shutdown
,
558 .set_termios
= linflex_set_termios
,
559 .type
= linflex_type
,
560 .request_port
= linflex_request_port
,
561 .release_port
= linflex_release_port
,
562 .config_port
= linflex_config_port
,
565 static struct uart_port
*linflex_ports
[UART_NR
];
567 #ifdef CONFIG_SERIAL_FSL_LINFLEXUART_CONSOLE
568 static void linflex_console_putchar(struct uart_port
*port
, int ch
)
572 cr
= readl(port
->membase
+ UARTCR
);
574 writeb(ch
, port
->membase
+ BDRL
);
576 if (!(cr
& LINFLEXD_UARTCR_TFBM
))
577 while ((readl(port
->membase
+ UARTSR
) &
578 LINFLEXD_UARTSR_DTFTFF
)
579 != LINFLEXD_UARTSR_DTFTFF
)
582 while (readl(port
->membase
+ UARTSR
) &
583 LINFLEXD_UARTSR_DTFTFF
)
586 if (!(cr
& LINFLEXD_UARTCR_TFBM
)) {
587 writel((readl(port
->membase
+ UARTSR
) |
588 LINFLEXD_UARTSR_DTFTFF
),
589 port
->membase
+ UARTSR
);
593 static void linflex_earlycon_putchar(struct uart_port
*port
, int ch
)
598 if (!linflex_earlycon_same_instance
) {
599 linflex_console_putchar(port
, ch
);
603 spin_lock_irqsave(&init_lock
, flags
);
607 if (earlycon_buf
.len
>= 1 << CONFIG_LOG_BUF_SHIFT
)
610 if (!earlycon_buf
.cap
) {
611 earlycon_buf
.content
= kmalloc(EARLYCON_BUFFER_INITIAL_CAP
,
613 earlycon_buf
.cap
= earlycon_buf
.content
?
614 EARLYCON_BUFFER_INITIAL_CAP
: 0;
615 } else if (earlycon_buf
.len
== earlycon_buf
.cap
) {
616 ret
= krealloc(earlycon_buf
.content
, earlycon_buf
.cap
<< 1,
619 earlycon_buf
.content
= ret
;
620 earlycon_buf
.cap
<<= 1;
624 if (earlycon_buf
.len
< earlycon_buf
.cap
)
625 earlycon_buf
.content
[earlycon_buf
.len
++] = ch
;
630 linflex_console_putchar(port
, ch
);
632 spin_unlock_irqrestore(&init_lock
, flags
);
635 static void linflex_string_write(struct uart_port
*sport
, const char *s
,
638 unsigned long cr
, ier
= 0;
640 ier
= readl(sport
->membase
+ LINIER
);
641 linflex_stop_tx(sport
);
643 cr
= readl(sport
->membase
+ UARTCR
);
644 cr
|= (LINFLEXD_UARTCR_TXEN
);
645 writel(cr
, sport
->membase
+ UARTCR
);
647 uart_console_write(sport
, s
, count
, linflex_console_putchar
);
649 writel(ier
, sport
->membase
+ LINIER
);
653 linflex_console_write(struct console
*co
, const char *s
, unsigned int count
)
655 struct uart_port
*sport
= linflex_ports
[co
->index
];
661 else if (oops_in_progress
)
662 locked
= spin_trylock_irqsave(&sport
->lock
, flags
);
664 spin_lock_irqsave(&sport
->lock
, flags
);
666 linflex_string_write(sport
, s
, count
);
669 spin_unlock_irqrestore(&sport
->lock
, flags
);
673 * if the port was already initialised (eg, by a boot loader),
674 * try to determine the current setup.
677 linflex_console_get_options(struct uart_port
*sport
, int *parity
, int *bits
)
681 cr
= readl(sport
->membase
+ UARTCR
);
682 cr
&= LINFLEXD_UARTCR_RXEN
| LINFLEXD_UARTCR_TXEN
;
687 /* ok, the port was enabled */
690 if (cr
& LINFLEXD_UARTCR_PCE
) {
691 if (cr
& LINFLEXD_UARTCR_PC0
)
697 if ((cr
& LINFLEXD_UARTCR_WL0
) && ((cr
& LINFLEXD_UARTCR_WL1
) == 0)) {
698 if (cr
& LINFLEXD_UARTCR_PCE
)
705 static int __init
linflex_console_setup(struct console
*co
, char *options
)
707 struct uart_port
*sport
;
716 * check whether an invalid uart number has been specified, and
717 * if so, search for the first available port that does have
720 if (co
->index
== -1 || co
->index
>= ARRAY_SIZE(linflex_ports
))
723 sport
= linflex_ports
[co
->index
];
728 uart_parse_options(options
, &baud
, &parity
, &bits
, &flow
);
730 linflex_console_get_options(sport
, &parity
, &bits
);
732 if (earlycon_port
&& sport
->mapbase
== earlycon_port
->mapbase
) {
733 linflex_earlycon_same_instance
= true;
735 spin_lock_irqsave(&init_lock
, flags
);
737 spin_unlock_irqrestore(&init_lock
, flags
);
739 /* Workaround for character loss or output of many invalid
740 * characters, when INIT mode is entered shortly after a
741 * character has just been printed.
743 udelay(PREINIT_DELAY
);
746 linflex_setup_watermark(sport
);
748 ret
= uart_set_options(sport
, co
, baud
, parity
, bits
, flow
);
750 if (!linflex_earlycon_same_instance
)
753 spin_lock_irqsave(&init_lock
, flags
);
755 /* Emptying buffer */
756 if (earlycon_buf
.len
) {
757 for (i
= 0; i
< earlycon_buf
.len
; i
++)
758 linflex_console_putchar(earlycon_port
,
759 earlycon_buf
.content
[i
]);
761 kfree(earlycon_buf
.content
);
762 earlycon_buf
.len
= 0;
766 spin_unlock_irqrestore(&init_lock
, flags
);
772 static struct uart_driver linflex_reg
;
773 static struct console linflex_console
= {
775 .write
= linflex_console_write
,
776 .device
= uart_console_device
,
777 .setup
= linflex_console_setup
,
778 .flags
= CON_PRINTBUFFER
,
780 .data
= &linflex_reg
,
783 static void linflex_earlycon_write(struct console
*con
, const char *s
,
786 struct earlycon_device
*dev
= con
->data
;
788 uart_console_write(&dev
->port
, s
, n
, linflex_earlycon_putchar
);
791 static int __init
linflex_early_console_setup(struct earlycon_device
*device
,
794 if (!device
->port
.membase
)
797 device
->con
->write
= linflex_earlycon_write
;
798 earlycon_port
= &device
->port
;
803 OF_EARLYCON_DECLARE(linflex
, "fsl,s32v234-linflexuart",
804 linflex_early_console_setup
);
806 #define LINFLEX_CONSOLE (&linflex_console)
808 #define LINFLEX_CONSOLE NULL
811 static struct uart_driver linflex_reg
= {
812 .owner
= THIS_MODULE
,
813 .driver_name
= DRIVER_NAME
,
814 .dev_name
= DEV_NAME
,
815 .nr
= ARRAY_SIZE(linflex_ports
),
816 .cons
= LINFLEX_CONSOLE
,
819 static int linflex_probe(struct platform_device
*pdev
)
821 struct device_node
*np
= pdev
->dev
.of_node
;
822 struct uart_port
*sport
;
823 struct resource
*res
;
826 sport
= devm_kzalloc(&pdev
->dev
, sizeof(*sport
), GFP_KERNEL
);
830 ret
= of_alias_get_id(np
, "serial");
832 dev_err(&pdev
->dev
, "failed to get alias id, errno %d\n", ret
);
835 if (ret
>= UART_NR
) {
836 dev_err(&pdev
->dev
, "driver limited to %d serial ports\n",
843 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
847 sport
->mapbase
= res
->start
;
848 sport
->membase
= devm_ioremap_resource(&pdev
->dev
, res
);
849 if (IS_ERR(sport
->membase
))
850 return PTR_ERR(sport
->membase
);
852 sport
->dev
= &pdev
->dev
;
853 sport
->type
= PORT_LINFLEXUART
;
854 sport
->iotype
= UPIO_MEM
;
855 sport
->irq
= platform_get_irq(pdev
, 0);
856 sport
->ops
= &linflex_pops
;
857 sport
->flags
= UPF_BOOT_AUTOCONF
;
858 sport
->has_sysrq
= IS_ENABLED(CONFIG_SERIAL_FSL_LINFLEXUART_CONSOLE
);
860 linflex_ports
[sport
->line
] = sport
;
862 platform_set_drvdata(pdev
, sport
);
864 ret
= uart_add_one_port(&linflex_reg
, sport
);
871 static int linflex_remove(struct platform_device
*pdev
)
873 struct uart_port
*sport
= platform_get_drvdata(pdev
);
875 uart_remove_one_port(&linflex_reg
, sport
);
880 #ifdef CONFIG_PM_SLEEP
881 static int linflex_suspend(struct device
*dev
)
883 struct uart_port
*sport
= dev_get_drvdata(dev
);
885 uart_suspend_port(&linflex_reg
, sport
);
890 static int linflex_resume(struct device
*dev
)
892 struct uart_port
*sport
= dev_get_drvdata(dev
);
894 uart_resume_port(&linflex_reg
, sport
);
900 static SIMPLE_DEV_PM_OPS(linflex_pm_ops
, linflex_suspend
, linflex_resume
);
902 static struct platform_driver linflex_driver
= {
903 .probe
= linflex_probe
,
904 .remove
= linflex_remove
,
907 .of_match_table
= linflex_dt_ids
,
908 .pm
= &linflex_pm_ops
,
912 static int __init
linflex_serial_init(void)
916 ret
= uart_register_driver(&linflex_reg
);
920 ret
= platform_driver_register(&linflex_driver
);
922 uart_unregister_driver(&linflex_reg
);
927 static void __exit
linflex_serial_exit(void)
929 platform_driver_unregister(&linflex_driver
);
930 uart_unregister_driver(&linflex_reg
);
933 module_init(linflex_serial_init
);
934 module_exit(linflex_serial_exit
);
936 MODULE_DESCRIPTION("Freescale LINFlexD serial port driver");
937 MODULE_LICENSE("GPL v2");