1 // SPDX-License-Identifier: GPL-2.0
3 * Derived from many drivers using generic_serial interface.
5 * Copyright (C) 2008 Maxime Bizon <mbizon@freebox.fr>
7 * Serial driver for BCM63xx integrated UART.
9 * Hardware flow control was _not_ tested since I only have RX/TX on
13 #include <linux/kernel.h>
14 #include <linux/platform_device.h>
15 #include <linux/init.h>
16 #include <linux/delay.h>
17 #include <linux/module.h>
18 #include <linux/console.h>
19 #include <linux/clk.h>
20 #include <linux/tty.h>
21 #include <linux/tty_flip.h>
22 #include <linux/sysrq.h>
23 #include <linux/serial.h>
24 #include <linux/serial_core.h>
25 #include <linux/serial_bcm63xx.h>
29 #define BCM63XX_NR_UARTS 2
31 static struct uart_port ports
[BCM63XX_NR_UARTS
];
34 * rx interrupt mask / stat
38 * - rx fifo above threshold
39 * - rx fifo not empty for too long
41 #define UART_RX_INT_MASK (UART_IR_MASK(UART_IR_RXOVER) | \
42 UART_IR_MASK(UART_IR_RXTHRESH) | \
43 UART_IR_MASK(UART_IR_RXTIMEOUT))
45 #define UART_RX_INT_STAT (UART_IR_STAT(UART_IR_RXOVER) | \
46 UART_IR_STAT(UART_IR_RXTHRESH) | \
47 UART_IR_STAT(UART_IR_RXTIMEOUT))
50 * tx interrupt mask / stat
54 * - tx fifo below threshold
56 #define UART_TX_INT_MASK (UART_IR_MASK(UART_IR_TXEMPTY) | \
57 UART_IR_MASK(UART_IR_TXTRESH))
59 #define UART_TX_INT_STAT (UART_IR_STAT(UART_IR_TXEMPTY) | \
60 UART_IR_STAT(UART_IR_TXTRESH))
63 * external input interrupt
65 * mask: any edge on CTS, DCD
67 #define UART_EXTINP_INT_MASK (UART_EXTINP_IRMASK(UART_EXTINP_IR_CTS) | \
68 UART_EXTINP_IRMASK(UART_EXTINP_IR_DCD))
71 * handy uart register accessor
73 static inline unsigned int bcm_uart_readl(struct uart_port
*port
,
76 return __raw_readl(port
->membase
+ offset
);
79 static inline void bcm_uart_writel(struct uart_port
*port
,
80 unsigned int value
, unsigned int offset
)
82 __raw_writel(value
, port
->membase
+ offset
);
86 * serial core request to check if uart tx fifo is empty
88 static unsigned int bcm_uart_tx_empty(struct uart_port
*port
)
92 val
= bcm_uart_readl(port
, UART_IR_REG
);
93 return (val
& UART_IR_STAT(UART_IR_TXEMPTY
)) ? 1 : 0;
97 * serial core request to set RTS and DTR pin state and loopback mode
99 static void bcm_uart_set_mctrl(struct uart_port
*port
, unsigned int mctrl
)
103 val
= bcm_uart_readl(port
, UART_MCTL_REG
);
104 val
&= ~(UART_MCTL_DTR_MASK
| UART_MCTL_RTS_MASK
);
105 /* invert of written value is reflected on the pin */
106 if (!(mctrl
& TIOCM_DTR
))
107 val
|= UART_MCTL_DTR_MASK
;
108 if (!(mctrl
& TIOCM_RTS
))
109 val
|= UART_MCTL_RTS_MASK
;
110 bcm_uart_writel(port
, val
, UART_MCTL_REG
);
112 val
= bcm_uart_readl(port
, UART_CTL_REG
);
113 if (mctrl
& TIOCM_LOOP
)
114 val
|= UART_CTL_LOOPBACK_MASK
;
116 val
&= ~UART_CTL_LOOPBACK_MASK
;
117 bcm_uart_writel(port
, val
, UART_CTL_REG
);
121 * serial core request to return RI, CTS, DCD and DSR pin state
123 static unsigned int bcm_uart_get_mctrl(struct uart_port
*port
)
125 unsigned int val
, mctrl
;
128 val
= bcm_uart_readl(port
, UART_EXTINP_REG
);
129 if (val
& UART_EXTINP_RI_MASK
)
131 if (val
& UART_EXTINP_CTS_MASK
)
133 if (val
& UART_EXTINP_DCD_MASK
)
135 if (val
& UART_EXTINP_DSR_MASK
)
141 * serial core request to disable tx ASAP (used for flow control)
143 static void bcm_uart_stop_tx(struct uart_port
*port
)
147 val
= bcm_uart_readl(port
, UART_CTL_REG
);
148 val
&= ~(UART_CTL_TXEN_MASK
);
149 bcm_uart_writel(port
, val
, UART_CTL_REG
);
151 val
= bcm_uart_readl(port
, UART_IR_REG
);
152 val
&= ~UART_TX_INT_MASK
;
153 bcm_uart_writel(port
, val
, UART_IR_REG
);
157 * serial core request to (re)enable tx
159 static void bcm_uart_start_tx(struct uart_port
*port
)
163 val
= bcm_uart_readl(port
, UART_IR_REG
);
164 val
|= UART_TX_INT_MASK
;
165 bcm_uart_writel(port
, val
, UART_IR_REG
);
167 val
= bcm_uart_readl(port
, UART_CTL_REG
);
168 val
|= UART_CTL_TXEN_MASK
;
169 bcm_uart_writel(port
, val
, UART_CTL_REG
);
173 * serial core request to stop rx, called before port shutdown
175 static void bcm_uart_stop_rx(struct uart_port
*port
)
179 val
= bcm_uart_readl(port
, UART_IR_REG
);
180 val
&= ~UART_RX_INT_MASK
;
181 bcm_uart_writel(port
, val
, UART_IR_REG
);
185 * serial core request to enable modem status interrupt reporting
187 static void bcm_uart_enable_ms(struct uart_port
*port
)
191 val
= bcm_uart_readl(port
, UART_IR_REG
);
192 val
|= UART_IR_MASK(UART_IR_EXTIP
);
193 bcm_uart_writel(port
, val
, UART_IR_REG
);
197 * serial core request to start/stop emitting break char
199 static void bcm_uart_break_ctl(struct uart_port
*port
, int ctl
)
204 spin_lock_irqsave(&port
->lock
, flags
);
206 val
= bcm_uart_readl(port
, UART_CTL_REG
);
208 val
|= UART_CTL_XMITBRK_MASK
;
210 val
&= ~UART_CTL_XMITBRK_MASK
;
211 bcm_uart_writel(port
, val
, UART_CTL_REG
);
213 spin_unlock_irqrestore(&port
->lock
, flags
);
217 * return port type in string format
219 static const char *bcm_uart_type(struct uart_port
*port
)
221 return (port
->type
== PORT_BCM63XX
) ? "bcm63xx_uart" : NULL
;
225 * read all chars in rx fifo and send them to core
227 static void bcm_uart_do_rx(struct uart_port
*port
)
229 struct tty_port
*tty_port
= &port
->state
->port
;
230 unsigned int max_count
;
232 /* limit number of char read in interrupt, should not be
233 * higher than fifo size anyway since we're much faster than
237 unsigned int iestat
, c
, cstat
;
240 /* get overrun/fifo empty information from ier
242 iestat
= bcm_uart_readl(port
, UART_IR_REG
);
244 if (unlikely(iestat
& UART_IR_STAT(UART_IR_RXOVER
))) {
247 /* fifo reset is required to clear
249 val
= bcm_uart_readl(port
, UART_CTL_REG
);
250 val
|= UART_CTL_RSTRXFIFO_MASK
;
251 bcm_uart_writel(port
, val
, UART_CTL_REG
);
253 port
->icount
.overrun
++;
254 tty_insert_flip_char(tty_port
, 0, TTY_OVERRUN
);
257 if (!(iestat
& UART_IR_STAT(UART_IR_RXNOTEMPTY
)))
260 cstat
= c
= bcm_uart_readl(port
, UART_FIFO_REG
);
265 if (unlikely((cstat
& UART_FIFO_ANYERR_MASK
))) {
267 if (cstat
& UART_FIFO_BRKDET_MASK
) {
269 if (uart_handle_break(port
))
273 if (cstat
& UART_FIFO_PARERR_MASK
)
274 port
->icount
.parity
++;
275 if (cstat
& UART_FIFO_FRAMEERR_MASK
)
276 port
->icount
.frame
++;
278 /* update flag wrt read_status_mask */
279 cstat
&= port
->read_status_mask
;
280 if (cstat
& UART_FIFO_BRKDET_MASK
)
282 if (cstat
& UART_FIFO_FRAMEERR_MASK
)
284 if (cstat
& UART_FIFO_PARERR_MASK
)
288 if (uart_handle_sysrq_char(port
, c
))
292 if ((cstat
& port
->ignore_status_mask
) == 0)
293 tty_insert_flip_char(tty_port
, c
, flag
);
295 } while (--max_count
);
297 spin_unlock(&port
->lock
);
298 tty_flip_buffer_push(tty_port
);
299 spin_lock(&port
->lock
);
303 * fill tx fifo with chars to send, stop when fifo is about to be full
304 * or when all chars have been sent.
306 static void bcm_uart_do_tx(struct uart_port
*port
)
308 struct circ_buf
*xmit
;
309 unsigned int val
, max_count
;
312 bcm_uart_writel(port
, port
->x_char
, UART_FIFO_REG
);
318 if (uart_tx_stopped(port
)) {
319 bcm_uart_stop_tx(port
);
323 xmit
= &port
->state
->xmit
;
324 if (uart_circ_empty(xmit
))
327 val
= bcm_uart_readl(port
, UART_MCTL_REG
);
328 val
= (val
& UART_MCTL_TXFIFOFILL_MASK
) >> UART_MCTL_TXFIFOFILL_SHIFT
;
329 max_count
= port
->fifosize
- val
;
331 while (max_count
--) {
334 c
= xmit
->buf
[xmit
->tail
];
335 bcm_uart_writel(port
, c
, UART_FIFO_REG
);
336 xmit
->tail
= (xmit
->tail
+ 1) & (UART_XMIT_SIZE
- 1);
338 if (uart_circ_empty(xmit
))
342 if (uart_circ_chars_pending(xmit
) < WAKEUP_CHARS
)
343 uart_write_wakeup(port
);
345 if (uart_circ_empty(xmit
))
350 /* nothing to send, disable transmit interrupt */
351 val
= bcm_uart_readl(port
, UART_IR_REG
);
352 val
&= ~UART_TX_INT_MASK
;
353 bcm_uart_writel(port
, val
, UART_IR_REG
);
358 * process uart interrupt
360 static irqreturn_t
bcm_uart_interrupt(int irq
, void *dev_id
)
362 struct uart_port
*port
;
363 unsigned int irqstat
;
366 spin_lock(&port
->lock
);
368 irqstat
= bcm_uart_readl(port
, UART_IR_REG
);
369 if (irqstat
& UART_RX_INT_STAT
)
370 bcm_uart_do_rx(port
);
372 if (irqstat
& UART_TX_INT_STAT
)
373 bcm_uart_do_tx(port
);
375 if (irqstat
& UART_IR_MASK(UART_IR_EXTIP
)) {
378 estat
= bcm_uart_readl(port
, UART_EXTINP_REG
);
379 if (estat
& UART_EXTINP_IRSTAT(UART_EXTINP_IR_CTS
))
380 uart_handle_cts_change(port
,
381 estat
& UART_EXTINP_CTS_MASK
);
382 if (estat
& UART_EXTINP_IRSTAT(UART_EXTINP_IR_DCD
))
383 uart_handle_dcd_change(port
,
384 estat
& UART_EXTINP_DCD_MASK
);
387 spin_unlock(&port
->lock
);
392 * enable rx & tx operation on uart
394 static void bcm_uart_enable(struct uart_port
*port
)
398 val
= bcm_uart_readl(port
, UART_CTL_REG
);
399 val
|= (UART_CTL_BRGEN_MASK
| UART_CTL_TXEN_MASK
| UART_CTL_RXEN_MASK
);
400 bcm_uart_writel(port
, val
, UART_CTL_REG
);
404 * disable rx & tx operation on uart
406 static void bcm_uart_disable(struct uart_port
*port
)
410 val
= bcm_uart_readl(port
, UART_CTL_REG
);
411 val
&= ~(UART_CTL_BRGEN_MASK
| UART_CTL_TXEN_MASK
|
413 bcm_uart_writel(port
, val
, UART_CTL_REG
);
417 * clear all unread data in rx fifo and unsent data in tx fifo
419 static void bcm_uart_flush(struct uart_port
*port
)
423 /* empty rx and tx fifo */
424 val
= bcm_uart_readl(port
, UART_CTL_REG
);
425 val
|= UART_CTL_RSTRXFIFO_MASK
| UART_CTL_RSTTXFIFO_MASK
;
426 bcm_uart_writel(port
, val
, UART_CTL_REG
);
428 /* read any pending char to make sure all irq status are
430 (void)bcm_uart_readl(port
, UART_FIFO_REG
);
434 * serial core request to initialize uart and start rx operation
436 static int bcm_uart_startup(struct uart_port
*port
)
441 /* mask all irq and flush port */
442 bcm_uart_disable(port
);
443 bcm_uart_writel(port
, 0, UART_IR_REG
);
444 bcm_uart_flush(port
);
446 /* clear any pending external input interrupt */
447 (void)bcm_uart_readl(port
, UART_EXTINP_REG
);
449 /* set rx/tx fifo thresh to fifo half size */
450 val
= bcm_uart_readl(port
, UART_MCTL_REG
);
451 val
&= ~(UART_MCTL_RXFIFOTHRESH_MASK
| UART_MCTL_TXFIFOTHRESH_MASK
);
452 val
|= (port
->fifosize
/ 2) << UART_MCTL_RXFIFOTHRESH_SHIFT
;
453 val
|= (port
->fifosize
/ 2) << UART_MCTL_TXFIFOTHRESH_SHIFT
;
454 bcm_uart_writel(port
, val
, UART_MCTL_REG
);
456 /* set rx fifo timeout to 1 char time */
457 val
= bcm_uart_readl(port
, UART_CTL_REG
);
458 val
&= ~UART_CTL_RXTMOUTCNT_MASK
;
459 val
|= 1 << UART_CTL_RXTMOUTCNT_SHIFT
;
460 bcm_uart_writel(port
, val
, UART_CTL_REG
);
462 /* report any edge on dcd and cts */
463 val
= UART_EXTINP_INT_MASK
;
464 val
|= UART_EXTINP_DCD_NOSENSE_MASK
;
465 val
|= UART_EXTINP_CTS_NOSENSE_MASK
;
466 bcm_uart_writel(port
, val
, UART_EXTINP_REG
);
468 /* register irq and enable rx interrupts */
469 ret
= request_irq(port
->irq
, bcm_uart_interrupt
, 0,
470 dev_name(port
->dev
), port
);
473 bcm_uart_writel(port
, UART_RX_INT_MASK
, UART_IR_REG
);
474 bcm_uart_enable(port
);
479 * serial core request to flush & disable uart
481 static void bcm_uart_shutdown(struct uart_port
*port
)
485 spin_lock_irqsave(&port
->lock
, flags
);
486 bcm_uart_writel(port
, 0, UART_IR_REG
);
487 spin_unlock_irqrestore(&port
->lock
, flags
);
489 bcm_uart_disable(port
);
490 bcm_uart_flush(port
);
491 free_irq(port
->irq
, port
);
495 * serial core request to change current uart setting
497 static void bcm_uart_set_termios(struct uart_port
*port
,
498 struct ktermios
*new,
499 struct ktermios
*old
)
501 unsigned int ctl
, baud
, quot
, ier
;
505 spin_lock_irqsave(&port
->lock
, flags
);
507 /* Drain the hot tub fully before we power it off for the winter. */
508 for (tries
= 3; !bcm_uart_tx_empty(port
) && tries
; tries
--)
511 /* disable uart while changing speed */
512 bcm_uart_disable(port
);
513 bcm_uart_flush(port
);
515 /* update Control register */
516 ctl
= bcm_uart_readl(port
, UART_CTL_REG
);
517 ctl
&= ~UART_CTL_BITSPERSYM_MASK
;
519 switch (new->c_cflag
& CSIZE
) {
521 ctl
|= (0 << UART_CTL_BITSPERSYM_SHIFT
);
524 ctl
|= (1 << UART_CTL_BITSPERSYM_SHIFT
);
527 ctl
|= (2 << UART_CTL_BITSPERSYM_SHIFT
);
530 ctl
|= (3 << UART_CTL_BITSPERSYM_SHIFT
);
534 ctl
&= ~UART_CTL_STOPBITS_MASK
;
535 if (new->c_cflag
& CSTOPB
)
536 ctl
|= UART_CTL_STOPBITS_2
;
538 ctl
|= UART_CTL_STOPBITS_1
;
540 ctl
&= ~(UART_CTL_RXPAREN_MASK
| UART_CTL_TXPAREN_MASK
);
541 if (new->c_cflag
& PARENB
)
542 ctl
|= (UART_CTL_RXPAREN_MASK
| UART_CTL_TXPAREN_MASK
);
543 ctl
&= ~(UART_CTL_RXPAREVEN_MASK
| UART_CTL_TXPAREVEN_MASK
);
544 if (new->c_cflag
& PARODD
)
545 ctl
|= (UART_CTL_RXPAREVEN_MASK
| UART_CTL_TXPAREVEN_MASK
);
546 bcm_uart_writel(port
, ctl
, UART_CTL_REG
);
548 /* update Baudword register */
549 baud
= uart_get_baud_rate(port
, new, old
, 0, port
->uartclk
/ 16);
550 quot
= uart_get_divisor(port
, baud
) - 1;
551 bcm_uart_writel(port
, quot
, UART_BAUD_REG
);
553 /* update Interrupt register */
554 ier
= bcm_uart_readl(port
, UART_IR_REG
);
556 ier
&= ~UART_IR_MASK(UART_IR_EXTIP
);
557 if (UART_ENABLE_MS(port
, new->c_cflag
))
558 ier
|= UART_IR_MASK(UART_IR_EXTIP
);
560 bcm_uart_writel(port
, ier
, UART_IR_REG
);
562 /* update read/ignore mask */
563 port
->read_status_mask
= UART_FIFO_VALID_MASK
;
564 if (new->c_iflag
& INPCK
) {
565 port
->read_status_mask
|= UART_FIFO_FRAMEERR_MASK
;
566 port
->read_status_mask
|= UART_FIFO_PARERR_MASK
;
568 if (new->c_iflag
& (IGNBRK
| BRKINT
))
569 port
->read_status_mask
|= UART_FIFO_BRKDET_MASK
;
571 port
->ignore_status_mask
= 0;
572 if (new->c_iflag
& IGNPAR
)
573 port
->ignore_status_mask
|= UART_FIFO_PARERR_MASK
;
574 if (new->c_iflag
& IGNBRK
)
575 port
->ignore_status_mask
|= UART_FIFO_BRKDET_MASK
;
576 if (!(new->c_cflag
& CREAD
))
577 port
->ignore_status_mask
|= UART_FIFO_VALID_MASK
;
579 uart_update_timeout(port
, new->c_cflag
, baud
);
580 bcm_uart_enable(port
);
581 spin_unlock_irqrestore(&port
->lock
, flags
);
585 * serial core request to claim uart iomem
587 static int bcm_uart_request_port(struct uart_port
*port
)
589 /* UARTs always present */
594 * serial core request to release uart iomem
596 static void bcm_uart_release_port(struct uart_port
*port
)
598 /* Nothing to release ... */
602 * serial core request to do any port required autoconfiguration
604 static void bcm_uart_config_port(struct uart_port
*port
, int flags
)
606 if (flags
& UART_CONFIG_TYPE
) {
607 if (bcm_uart_request_port(port
))
609 port
->type
= PORT_BCM63XX
;
614 * serial core request to check that port information in serinfo are
617 static int bcm_uart_verify_port(struct uart_port
*port
,
618 struct serial_struct
*serinfo
)
620 if (port
->type
!= PORT_BCM63XX
)
622 if (port
->irq
!= serinfo
->irq
)
624 if (port
->iotype
!= serinfo
->io_type
)
626 if (port
->mapbase
!= (unsigned long)serinfo
->iomem_base
)
631 /* serial core callbacks */
632 static const struct uart_ops bcm_uart_ops
= {
633 .tx_empty
= bcm_uart_tx_empty
,
634 .get_mctrl
= bcm_uart_get_mctrl
,
635 .set_mctrl
= bcm_uart_set_mctrl
,
636 .start_tx
= bcm_uart_start_tx
,
637 .stop_tx
= bcm_uart_stop_tx
,
638 .stop_rx
= bcm_uart_stop_rx
,
639 .enable_ms
= bcm_uart_enable_ms
,
640 .break_ctl
= bcm_uart_break_ctl
,
641 .startup
= bcm_uart_startup
,
642 .shutdown
= bcm_uart_shutdown
,
643 .set_termios
= bcm_uart_set_termios
,
644 .type
= bcm_uart_type
,
645 .release_port
= bcm_uart_release_port
,
646 .request_port
= bcm_uart_request_port
,
647 .config_port
= bcm_uart_config_port
,
648 .verify_port
= bcm_uart_verify_port
,
653 #ifdef CONFIG_SERIAL_BCM63XX_CONSOLE
654 static void wait_for_xmitr(struct uart_port
*port
)
658 /* Wait up to 10ms for the character(s) to be sent. */
663 val
= bcm_uart_readl(port
, UART_IR_REG
);
664 if (val
& UART_IR_STAT(UART_IR_TXEMPTY
))
669 /* Wait up to 1s for flow control if necessary */
670 if (port
->flags
& UPF_CONS_FLOW
) {
675 val
= bcm_uart_readl(port
, UART_EXTINP_REG
);
676 if (val
& UART_EXTINP_CTS_MASK
)
686 static void bcm_console_putchar(struct uart_port
*port
, int ch
)
688 wait_for_xmitr(port
);
689 bcm_uart_writel(port
, ch
, UART_FIFO_REG
);
693 * console core request to output given string
695 static void bcm_console_write(struct console
*co
, const char *s
,
698 struct uart_port
*port
;
702 port
= &ports
[co
->index
];
704 local_irq_save(flags
);
706 /* bcm_uart_interrupt() already took the lock */
708 } else if (oops_in_progress
) {
709 locked
= spin_trylock(&port
->lock
);
711 spin_lock(&port
->lock
);
715 /* call helper to deal with \r\n */
716 uart_console_write(port
, s
, count
, bcm_console_putchar
);
718 /* and wait for char to be transmitted */
719 wait_for_xmitr(port
);
722 spin_unlock(&port
->lock
);
723 local_irq_restore(flags
);
727 * console core request to setup given console, find matching uart
730 static int bcm_console_setup(struct console
*co
, char *options
)
732 struct uart_port
*port
;
738 if (co
->index
< 0 || co
->index
>= BCM63XX_NR_UARTS
)
740 port
= &ports
[co
->index
];
744 uart_parse_options(options
, &baud
, &parity
, &bits
, &flow
);
746 return uart_set_options(port
, co
, baud
, parity
, bits
, flow
);
749 static struct uart_driver bcm_uart_driver
;
751 static struct console bcm63xx_console
= {
753 .write
= bcm_console_write
,
754 .device
= uart_console_device
,
755 .setup
= bcm_console_setup
,
756 .flags
= CON_PRINTBUFFER
,
758 .data
= &bcm_uart_driver
,
761 static int __init
bcm63xx_console_init(void)
763 register_console(&bcm63xx_console
);
767 console_initcall(bcm63xx_console_init
);
769 static void bcm_early_write(struct console
*con
, const char *s
, unsigned n
)
771 struct earlycon_device
*dev
= con
->data
;
773 uart_console_write(&dev
->port
, s
, n
, bcm_console_putchar
);
774 wait_for_xmitr(&dev
->port
);
777 static int __init
bcm_early_console_setup(struct earlycon_device
*device
,
780 if (!device
->port
.membase
)
783 device
->con
->write
= bcm_early_write
;
787 OF_EARLYCON_DECLARE(bcm63xx_uart
, "brcm,bcm6345-uart", bcm_early_console_setup
);
789 #define BCM63XX_CONSOLE (&bcm63xx_console)
791 #define BCM63XX_CONSOLE NULL
792 #endif /* CONFIG_SERIAL_BCM63XX_CONSOLE */
794 static struct uart_driver bcm_uart_driver
= {
795 .owner
= THIS_MODULE
,
796 .driver_name
= "bcm63xx_uart",
800 .nr
= BCM63XX_NR_UARTS
,
801 .cons
= BCM63XX_CONSOLE
,
805 * platform driver probe/remove callback
807 static int bcm_uart_probe(struct platform_device
*pdev
)
809 struct resource
*res_mem
, *res_irq
;
810 struct uart_port
*port
;
814 if (pdev
->dev
.of_node
) {
815 pdev
->id
= of_alias_get_id(pdev
->dev
.of_node
, "serial");
818 pdev
->id
= of_alias_get_id(pdev
->dev
.of_node
, "uart");
821 if (pdev
->id
< 0 || pdev
->id
>= BCM63XX_NR_UARTS
)
824 port
= &ports
[pdev
->id
];
827 memset(port
, 0, sizeof(*port
));
829 res_mem
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
833 port
->mapbase
= res_mem
->start
;
834 port
->membase
= devm_ioremap_resource(&pdev
->dev
, res_mem
);
835 if (IS_ERR(port
->membase
))
836 return PTR_ERR(port
->membase
);
838 res_irq
= platform_get_resource(pdev
, IORESOURCE_IRQ
, 0);
842 clk
= clk_get(&pdev
->dev
, "refclk");
843 if (IS_ERR(clk
) && pdev
->dev
.of_node
)
844 clk
= of_clk_get(pdev
->dev
.of_node
, 0);
849 port
->iotype
= UPIO_MEM
;
850 port
->irq
= res_irq
->start
;
851 port
->ops
= &bcm_uart_ops
;
852 port
->flags
= UPF_BOOT_AUTOCONF
;
853 port
->dev
= &pdev
->dev
;
855 port
->uartclk
= clk_get_rate(clk
) / 2;
856 port
->line
= pdev
->id
;
857 port
->has_sysrq
= IS_ENABLED(CONFIG_SERIAL_BCM63XX_CONSOLE
);
860 ret
= uart_add_one_port(&bcm_uart_driver
, port
);
862 ports
[pdev
->id
].membase
= NULL
;
865 platform_set_drvdata(pdev
, port
);
869 static int bcm_uart_remove(struct platform_device
*pdev
)
871 struct uart_port
*port
;
873 port
= platform_get_drvdata(pdev
);
874 uart_remove_one_port(&bcm_uart_driver
, port
);
875 /* mark port as free */
876 ports
[pdev
->id
].membase
= NULL
;
880 static const struct of_device_id bcm63xx_of_match
[] = {
881 { .compatible
= "brcm,bcm6345-uart" },
884 MODULE_DEVICE_TABLE(of
, bcm63xx_of_match
);
887 * platform driver stuff
889 static struct platform_driver bcm_uart_platform_driver
= {
890 .probe
= bcm_uart_probe
,
891 .remove
= bcm_uart_remove
,
893 .name
= "bcm63xx_uart",
894 .of_match_table
= bcm63xx_of_match
,
898 static int __init
bcm_uart_init(void)
902 ret
= uart_register_driver(&bcm_uart_driver
);
906 ret
= platform_driver_register(&bcm_uart_platform_driver
);
908 uart_unregister_driver(&bcm_uart_driver
);
913 static void __exit
bcm_uart_exit(void)
915 platform_driver_unregister(&bcm_uart_platform_driver
);
916 uart_unregister_driver(&bcm_uart_driver
);
919 module_init(bcm_uart_init
);
920 module_exit(bcm_uart_exit
);
922 MODULE_AUTHOR("Maxime Bizon <mbizon@freebox.fr>");
923 MODULE_DESCRIPTION("Broadcom 63xx integrated uart driver");
924 MODULE_LICENSE("GPL");