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 #if defined(CONFIG_SERIAL_BCM63XX_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
17 #include <linux/kernel.h>
18 #include <linux/platform_device.h>
19 #include <linux/init.h>
20 #include <linux/delay.h>
21 #include <linux/module.h>
22 #include <linux/console.h>
23 #include <linux/clk.h>
24 #include <linux/tty.h>
25 #include <linux/tty_flip.h>
26 #include <linux/sysrq.h>
27 #include <linux/serial.h>
28 #include <linux/serial_core.h>
29 #include <linux/serial_bcm63xx.h>
33 #define BCM63XX_NR_UARTS 2
35 static struct uart_port ports
[BCM63XX_NR_UARTS
];
38 * rx interrupt mask / stat
42 * - rx fifo above threshold
43 * - rx fifo not empty for too long
45 #define UART_RX_INT_MASK (UART_IR_MASK(UART_IR_RXOVER) | \
46 UART_IR_MASK(UART_IR_RXTHRESH) | \
47 UART_IR_MASK(UART_IR_RXTIMEOUT))
49 #define UART_RX_INT_STAT (UART_IR_STAT(UART_IR_RXOVER) | \
50 UART_IR_STAT(UART_IR_RXTHRESH) | \
51 UART_IR_STAT(UART_IR_RXTIMEOUT))
54 * tx interrupt mask / stat
58 * - tx fifo below threshold
60 #define UART_TX_INT_MASK (UART_IR_MASK(UART_IR_TXEMPTY) | \
61 UART_IR_MASK(UART_IR_TXTRESH))
63 #define UART_TX_INT_STAT (UART_IR_STAT(UART_IR_TXEMPTY) | \
64 UART_IR_STAT(UART_IR_TXTRESH))
67 * external input interrupt
69 * mask: any edge on CTS, DCD
71 #define UART_EXTINP_INT_MASK (UART_EXTINP_IRMASK(UART_EXTINP_IR_CTS) | \
72 UART_EXTINP_IRMASK(UART_EXTINP_IR_DCD))
75 * handy uart register accessor
77 static inline unsigned int bcm_uart_readl(struct uart_port
*port
,
80 return __raw_readl(port
->membase
+ offset
);
83 static inline void bcm_uart_writel(struct uart_port
*port
,
84 unsigned int value
, unsigned int offset
)
86 __raw_writel(value
, port
->membase
+ offset
);
90 * serial core request to check if uart tx fifo is empty
92 static unsigned int bcm_uart_tx_empty(struct uart_port
*port
)
96 val
= bcm_uart_readl(port
, UART_IR_REG
);
97 return (val
& UART_IR_STAT(UART_IR_TXEMPTY
)) ? 1 : 0;
101 * serial core request to set RTS and DTR pin state and loopback mode
103 static void bcm_uart_set_mctrl(struct uart_port
*port
, unsigned int mctrl
)
107 val
= bcm_uart_readl(port
, UART_MCTL_REG
);
108 val
&= ~(UART_MCTL_DTR_MASK
| UART_MCTL_RTS_MASK
);
109 /* invert of written value is reflected on the pin */
110 if (!(mctrl
& TIOCM_DTR
))
111 val
|= UART_MCTL_DTR_MASK
;
112 if (!(mctrl
& TIOCM_RTS
))
113 val
|= UART_MCTL_RTS_MASK
;
114 bcm_uart_writel(port
, val
, UART_MCTL_REG
);
116 val
= bcm_uart_readl(port
, UART_CTL_REG
);
117 if (mctrl
& TIOCM_LOOP
)
118 val
|= UART_CTL_LOOPBACK_MASK
;
120 val
&= ~UART_CTL_LOOPBACK_MASK
;
121 bcm_uart_writel(port
, val
, UART_CTL_REG
);
125 * serial core request to return RI, CTS, DCD and DSR pin state
127 static unsigned int bcm_uart_get_mctrl(struct uart_port
*port
)
129 unsigned int val
, mctrl
;
132 val
= bcm_uart_readl(port
, UART_EXTINP_REG
);
133 if (val
& UART_EXTINP_RI_MASK
)
135 if (val
& UART_EXTINP_CTS_MASK
)
137 if (val
& UART_EXTINP_DCD_MASK
)
139 if (val
& UART_EXTINP_DSR_MASK
)
145 * serial core request to disable tx ASAP (used for flow control)
147 static void bcm_uart_stop_tx(struct uart_port
*port
)
151 val
= bcm_uart_readl(port
, UART_CTL_REG
);
152 val
&= ~(UART_CTL_TXEN_MASK
);
153 bcm_uart_writel(port
, val
, UART_CTL_REG
);
155 val
= bcm_uart_readl(port
, UART_IR_REG
);
156 val
&= ~UART_TX_INT_MASK
;
157 bcm_uart_writel(port
, val
, UART_IR_REG
);
161 * serial core request to (re)enable tx
163 static void bcm_uart_start_tx(struct uart_port
*port
)
167 val
= bcm_uart_readl(port
, UART_IR_REG
);
168 val
|= UART_TX_INT_MASK
;
169 bcm_uart_writel(port
, val
, UART_IR_REG
);
171 val
= bcm_uart_readl(port
, UART_CTL_REG
);
172 val
|= UART_CTL_TXEN_MASK
;
173 bcm_uart_writel(port
, val
, UART_CTL_REG
);
177 * serial core request to stop rx, called before port shutdown
179 static void bcm_uart_stop_rx(struct uart_port
*port
)
183 val
= bcm_uart_readl(port
, UART_IR_REG
);
184 val
&= ~UART_RX_INT_MASK
;
185 bcm_uart_writel(port
, val
, UART_IR_REG
);
189 * serial core request to enable modem status interrupt reporting
191 static void bcm_uart_enable_ms(struct uart_port
*port
)
195 val
= bcm_uart_readl(port
, UART_IR_REG
);
196 val
|= UART_IR_MASK(UART_IR_EXTIP
);
197 bcm_uart_writel(port
, val
, UART_IR_REG
);
201 * serial core request to start/stop emitting break char
203 static void bcm_uart_break_ctl(struct uart_port
*port
, int ctl
)
208 spin_lock_irqsave(&port
->lock
, flags
);
210 val
= bcm_uart_readl(port
, UART_CTL_REG
);
212 val
|= UART_CTL_XMITBRK_MASK
;
214 val
&= ~UART_CTL_XMITBRK_MASK
;
215 bcm_uart_writel(port
, val
, UART_CTL_REG
);
217 spin_unlock_irqrestore(&port
->lock
, flags
);
221 * return port type in string format
223 static const char *bcm_uart_type(struct uart_port
*port
)
225 return (port
->type
== PORT_BCM63XX
) ? "bcm63xx_uart" : NULL
;
229 * read all chars in rx fifo and send them to core
231 static void bcm_uart_do_rx(struct uart_port
*port
)
233 struct tty_port
*tty_port
= &port
->state
->port
;
234 unsigned int max_count
;
236 /* limit number of char read in interrupt, should not be
237 * higher than fifo size anyway since we're much faster than
241 unsigned int iestat
, c
, cstat
;
244 /* get overrun/fifo empty information from ier
246 iestat
= bcm_uart_readl(port
, UART_IR_REG
);
248 if (unlikely(iestat
& UART_IR_STAT(UART_IR_RXOVER
))) {
251 /* fifo reset is required to clear
253 val
= bcm_uart_readl(port
, UART_CTL_REG
);
254 val
|= UART_CTL_RSTRXFIFO_MASK
;
255 bcm_uart_writel(port
, val
, UART_CTL_REG
);
257 port
->icount
.overrun
++;
258 tty_insert_flip_char(tty_port
, 0, TTY_OVERRUN
);
261 if (!(iestat
& UART_IR_STAT(UART_IR_RXNOTEMPTY
)))
264 cstat
= c
= bcm_uart_readl(port
, UART_FIFO_REG
);
269 if (unlikely((cstat
& UART_FIFO_ANYERR_MASK
))) {
271 if (cstat
& UART_FIFO_BRKDET_MASK
) {
273 if (uart_handle_break(port
))
277 if (cstat
& UART_FIFO_PARERR_MASK
)
278 port
->icount
.parity
++;
279 if (cstat
& UART_FIFO_FRAMEERR_MASK
)
280 port
->icount
.frame
++;
282 /* update flag wrt read_status_mask */
283 cstat
&= port
->read_status_mask
;
284 if (cstat
& UART_FIFO_BRKDET_MASK
)
286 if (cstat
& UART_FIFO_FRAMEERR_MASK
)
288 if (cstat
& UART_FIFO_PARERR_MASK
)
292 if (uart_handle_sysrq_char(port
, c
))
296 if ((cstat
& port
->ignore_status_mask
) == 0)
297 tty_insert_flip_char(tty_port
, c
, flag
);
299 } while (--max_count
);
301 spin_unlock(&port
->lock
);
302 tty_flip_buffer_push(tty_port
);
303 spin_lock(&port
->lock
);
307 * fill tx fifo with chars to send, stop when fifo is about to be full
308 * or when all chars have been sent.
310 static void bcm_uart_do_tx(struct uart_port
*port
)
312 struct circ_buf
*xmit
;
313 unsigned int val
, max_count
;
316 bcm_uart_writel(port
, port
->x_char
, UART_FIFO_REG
);
322 if (uart_tx_stopped(port
)) {
323 bcm_uart_stop_tx(port
);
327 xmit
= &port
->state
->xmit
;
328 if (uart_circ_empty(xmit
))
331 val
= bcm_uart_readl(port
, UART_MCTL_REG
);
332 val
= (val
& UART_MCTL_TXFIFOFILL_MASK
) >> UART_MCTL_TXFIFOFILL_SHIFT
;
333 max_count
= port
->fifosize
- val
;
335 while (max_count
--) {
338 c
= xmit
->buf
[xmit
->tail
];
339 bcm_uart_writel(port
, c
, UART_FIFO_REG
);
340 xmit
->tail
= (xmit
->tail
+ 1) & (UART_XMIT_SIZE
- 1);
342 if (uart_circ_empty(xmit
))
346 if (uart_circ_chars_pending(xmit
) < WAKEUP_CHARS
)
347 uart_write_wakeup(port
);
349 if (uart_circ_empty(xmit
))
354 /* nothing to send, disable transmit interrupt */
355 val
= bcm_uart_readl(port
, UART_IR_REG
);
356 val
&= ~UART_TX_INT_MASK
;
357 bcm_uart_writel(port
, val
, UART_IR_REG
);
362 * process uart interrupt
364 static irqreturn_t
bcm_uart_interrupt(int irq
, void *dev_id
)
366 struct uart_port
*port
;
367 unsigned int irqstat
;
370 spin_lock(&port
->lock
);
372 irqstat
= bcm_uart_readl(port
, UART_IR_REG
);
373 if (irqstat
& UART_RX_INT_STAT
)
374 bcm_uart_do_rx(port
);
376 if (irqstat
& UART_TX_INT_STAT
)
377 bcm_uart_do_tx(port
);
379 if (irqstat
& UART_IR_MASK(UART_IR_EXTIP
)) {
382 estat
= bcm_uart_readl(port
, UART_EXTINP_REG
);
383 if (estat
& UART_EXTINP_IRSTAT(UART_EXTINP_IR_CTS
))
384 uart_handle_cts_change(port
,
385 estat
& UART_EXTINP_CTS_MASK
);
386 if (estat
& UART_EXTINP_IRSTAT(UART_EXTINP_IR_DCD
))
387 uart_handle_dcd_change(port
,
388 estat
& UART_EXTINP_DCD_MASK
);
391 spin_unlock(&port
->lock
);
396 * enable rx & tx operation on uart
398 static void bcm_uart_enable(struct uart_port
*port
)
402 val
= bcm_uart_readl(port
, UART_CTL_REG
);
403 val
|= (UART_CTL_BRGEN_MASK
| UART_CTL_TXEN_MASK
| UART_CTL_RXEN_MASK
);
404 bcm_uart_writel(port
, val
, UART_CTL_REG
);
408 * disable rx & tx operation on uart
410 static void bcm_uart_disable(struct uart_port
*port
)
414 val
= bcm_uart_readl(port
, UART_CTL_REG
);
415 val
&= ~(UART_CTL_BRGEN_MASK
| UART_CTL_TXEN_MASK
|
417 bcm_uart_writel(port
, val
, UART_CTL_REG
);
421 * clear all unread data in rx fifo and unsent data in tx fifo
423 static void bcm_uart_flush(struct uart_port
*port
)
427 /* empty rx and tx fifo */
428 val
= bcm_uart_readl(port
, UART_CTL_REG
);
429 val
|= UART_CTL_RSTRXFIFO_MASK
| UART_CTL_RSTTXFIFO_MASK
;
430 bcm_uart_writel(port
, val
, UART_CTL_REG
);
432 /* read any pending char to make sure all irq status are
434 (void)bcm_uart_readl(port
, UART_FIFO_REG
);
438 * serial core request to initialize uart and start rx operation
440 static int bcm_uart_startup(struct uart_port
*port
)
445 /* mask all irq and flush port */
446 bcm_uart_disable(port
);
447 bcm_uart_writel(port
, 0, UART_IR_REG
);
448 bcm_uart_flush(port
);
450 /* clear any pending external input interrupt */
451 (void)bcm_uart_readl(port
, UART_EXTINP_REG
);
453 /* set rx/tx fifo thresh to fifo half size */
454 val
= bcm_uart_readl(port
, UART_MCTL_REG
);
455 val
&= ~(UART_MCTL_RXFIFOTHRESH_MASK
| UART_MCTL_TXFIFOTHRESH_MASK
);
456 val
|= (port
->fifosize
/ 2) << UART_MCTL_RXFIFOTHRESH_SHIFT
;
457 val
|= (port
->fifosize
/ 2) << UART_MCTL_TXFIFOTHRESH_SHIFT
;
458 bcm_uart_writel(port
, val
, UART_MCTL_REG
);
460 /* set rx fifo timeout to 1 char time */
461 val
= bcm_uart_readl(port
, UART_CTL_REG
);
462 val
&= ~UART_CTL_RXTMOUTCNT_MASK
;
463 val
|= 1 << UART_CTL_RXTMOUTCNT_SHIFT
;
464 bcm_uart_writel(port
, val
, UART_CTL_REG
);
466 /* report any edge on dcd and cts */
467 val
= UART_EXTINP_INT_MASK
;
468 val
|= UART_EXTINP_DCD_NOSENSE_MASK
;
469 val
|= UART_EXTINP_CTS_NOSENSE_MASK
;
470 bcm_uart_writel(port
, val
, UART_EXTINP_REG
);
472 /* register irq and enable rx interrupts */
473 ret
= request_irq(port
->irq
, bcm_uart_interrupt
, 0,
474 dev_name(port
->dev
), port
);
477 bcm_uart_writel(port
, UART_RX_INT_MASK
, UART_IR_REG
);
478 bcm_uart_enable(port
);
483 * serial core request to flush & disable uart
485 static void bcm_uart_shutdown(struct uart_port
*port
)
489 spin_lock_irqsave(&port
->lock
, flags
);
490 bcm_uart_writel(port
, 0, UART_IR_REG
);
491 spin_unlock_irqrestore(&port
->lock
, flags
);
493 bcm_uart_disable(port
);
494 bcm_uart_flush(port
);
495 free_irq(port
->irq
, port
);
499 * serial core request to change current uart setting
501 static void bcm_uart_set_termios(struct uart_port
*port
,
502 struct ktermios
*new,
503 struct ktermios
*old
)
505 unsigned int ctl
, baud
, quot
, ier
;
509 spin_lock_irqsave(&port
->lock
, flags
);
511 /* Drain the hot tub fully before we power it off for the winter. */
512 for (tries
= 3; !bcm_uart_tx_empty(port
) && tries
; tries
--)
515 /* disable uart while changing speed */
516 bcm_uart_disable(port
);
517 bcm_uart_flush(port
);
519 /* update Control register */
520 ctl
= bcm_uart_readl(port
, UART_CTL_REG
);
521 ctl
&= ~UART_CTL_BITSPERSYM_MASK
;
523 switch (new->c_cflag
& CSIZE
) {
525 ctl
|= (0 << UART_CTL_BITSPERSYM_SHIFT
);
528 ctl
|= (1 << UART_CTL_BITSPERSYM_SHIFT
);
531 ctl
|= (2 << UART_CTL_BITSPERSYM_SHIFT
);
534 ctl
|= (3 << UART_CTL_BITSPERSYM_SHIFT
);
538 ctl
&= ~UART_CTL_STOPBITS_MASK
;
539 if (new->c_cflag
& CSTOPB
)
540 ctl
|= UART_CTL_STOPBITS_2
;
542 ctl
|= UART_CTL_STOPBITS_1
;
544 ctl
&= ~(UART_CTL_RXPAREN_MASK
| UART_CTL_TXPAREN_MASK
);
545 if (new->c_cflag
& PARENB
)
546 ctl
|= (UART_CTL_RXPAREN_MASK
| UART_CTL_TXPAREN_MASK
);
547 ctl
&= ~(UART_CTL_RXPAREVEN_MASK
| UART_CTL_TXPAREVEN_MASK
);
548 if (new->c_cflag
& PARODD
)
549 ctl
|= (UART_CTL_RXPAREVEN_MASK
| UART_CTL_TXPAREVEN_MASK
);
550 bcm_uart_writel(port
, ctl
, UART_CTL_REG
);
552 /* update Baudword register */
553 baud
= uart_get_baud_rate(port
, new, old
, 0, port
->uartclk
/ 16);
554 quot
= uart_get_divisor(port
, baud
) - 1;
555 bcm_uart_writel(port
, quot
, UART_BAUD_REG
);
557 /* update Interrupt register */
558 ier
= bcm_uart_readl(port
, UART_IR_REG
);
560 ier
&= ~UART_IR_MASK(UART_IR_EXTIP
);
561 if (UART_ENABLE_MS(port
, new->c_cflag
))
562 ier
|= UART_IR_MASK(UART_IR_EXTIP
);
564 bcm_uart_writel(port
, ier
, UART_IR_REG
);
566 /* update read/ignore mask */
567 port
->read_status_mask
= UART_FIFO_VALID_MASK
;
568 if (new->c_iflag
& INPCK
) {
569 port
->read_status_mask
|= UART_FIFO_FRAMEERR_MASK
;
570 port
->read_status_mask
|= UART_FIFO_PARERR_MASK
;
572 if (new->c_iflag
& (IGNBRK
| BRKINT
))
573 port
->read_status_mask
|= UART_FIFO_BRKDET_MASK
;
575 port
->ignore_status_mask
= 0;
576 if (new->c_iflag
& IGNPAR
)
577 port
->ignore_status_mask
|= UART_FIFO_PARERR_MASK
;
578 if (new->c_iflag
& IGNBRK
)
579 port
->ignore_status_mask
|= UART_FIFO_BRKDET_MASK
;
580 if (!(new->c_cflag
& CREAD
))
581 port
->ignore_status_mask
|= UART_FIFO_VALID_MASK
;
583 uart_update_timeout(port
, new->c_cflag
, baud
);
584 bcm_uart_enable(port
);
585 spin_unlock_irqrestore(&port
->lock
, flags
);
589 * serial core request to claim uart iomem
591 static int bcm_uart_request_port(struct uart_port
*port
)
593 /* UARTs always present */
598 * serial core request to release uart iomem
600 static void bcm_uart_release_port(struct uart_port
*port
)
602 /* Nothing to release ... */
606 * serial core request to do any port required autoconfiguration
608 static void bcm_uart_config_port(struct uart_port
*port
, int flags
)
610 if (flags
& UART_CONFIG_TYPE
) {
611 if (bcm_uart_request_port(port
))
613 port
->type
= PORT_BCM63XX
;
618 * serial core request to check that port information in serinfo are
621 static int bcm_uart_verify_port(struct uart_port
*port
,
622 struct serial_struct
*serinfo
)
624 if (port
->type
!= PORT_BCM63XX
)
626 if (port
->irq
!= serinfo
->irq
)
628 if (port
->iotype
!= serinfo
->io_type
)
630 if (port
->mapbase
!= (unsigned long)serinfo
->iomem_base
)
635 /* serial core callbacks */
636 static const struct uart_ops bcm_uart_ops
= {
637 .tx_empty
= bcm_uart_tx_empty
,
638 .get_mctrl
= bcm_uart_get_mctrl
,
639 .set_mctrl
= bcm_uart_set_mctrl
,
640 .start_tx
= bcm_uart_start_tx
,
641 .stop_tx
= bcm_uart_stop_tx
,
642 .stop_rx
= bcm_uart_stop_rx
,
643 .enable_ms
= bcm_uart_enable_ms
,
644 .break_ctl
= bcm_uart_break_ctl
,
645 .startup
= bcm_uart_startup
,
646 .shutdown
= bcm_uart_shutdown
,
647 .set_termios
= bcm_uart_set_termios
,
648 .type
= bcm_uart_type
,
649 .release_port
= bcm_uart_release_port
,
650 .request_port
= bcm_uart_request_port
,
651 .config_port
= bcm_uart_config_port
,
652 .verify_port
= bcm_uart_verify_port
,
657 #ifdef CONFIG_SERIAL_BCM63XX_CONSOLE
658 static void wait_for_xmitr(struct uart_port
*port
)
662 /* Wait up to 10ms for the character(s) to be sent. */
667 val
= bcm_uart_readl(port
, UART_IR_REG
);
668 if (val
& UART_IR_STAT(UART_IR_TXEMPTY
))
673 /* Wait up to 1s for flow control if necessary */
674 if (port
->flags
& UPF_CONS_FLOW
) {
679 val
= bcm_uart_readl(port
, UART_EXTINP_REG
);
680 if (val
& UART_EXTINP_CTS_MASK
)
690 static void bcm_console_putchar(struct uart_port
*port
, int ch
)
692 wait_for_xmitr(port
);
693 bcm_uart_writel(port
, ch
, UART_FIFO_REG
);
697 * console core request to output given string
699 static void bcm_console_write(struct console
*co
, const char *s
,
702 struct uart_port
*port
;
706 port
= &ports
[co
->index
];
708 local_irq_save(flags
);
710 /* bcm_uart_interrupt() already took the lock */
712 } else if (oops_in_progress
) {
713 locked
= spin_trylock(&port
->lock
);
715 spin_lock(&port
->lock
);
719 /* call helper to deal with \r\n */
720 uart_console_write(port
, s
, count
, bcm_console_putchar
);
722 /* and wait for char to be transmitted */
723 wait_for_xmitr(port
);
726 spin_unlock(&port
->lock
);
727 local_irq_restore(flags
);
731 * console core request to setup given console, find matching uart
734 static int bcm_console_setup(struct console
*co
, char *options
)
736 struct uart_port
*port
;
742 if (co
->index
< 0 || co
->index
>= BCM63XX_NR_UARTS
)
744 port
= &ports
[co
->index
];
748 uart_parse_options(options
, &baud
, &parity
, &bits
, &flow
);
750 return uart_set_options(port
, co
, baud
, parity
, bits
, flow
);
753 static struct uart_driver bcm_uart_driver
;
755 static struct console bcm63xx_console
= {
757 .write
= bcm_console_write
,
758 .device
= uart_console_device
,
759 .setup
= bcm_console_setup
,
760 .flags
= CON_PRINTBUFFER
,
762 .data
= &bcm_uart_driver
,
765 static int __init
bcm63xx_console_init(void)
767 register_console(&bcm63xx_console
);
771 console_initcall(bcm63xx_console_init
);
773 static void bcm_early_write(struct console
*con
, const char *s
, unsigned n
)
775 struct earlycon_device
*dev
= con
->data
;
777 uart_console_write(&dev
->port
, s
, n
, bcm_console_putchar
);
778 wait_for_xmitr(&dev
->port
);
781 static int __init
bcm_early_console_setup(struct earlycon_device
*device
,
784 if (!device
->port
.membase
)
787 device
->con
->write
= bcm_early_write
;
791 OF_EARLYCON_DECLARE(bcm63xx_uart
, "brcm,bcm6345-uart", bcm_early_console_setup
);
793 #define BCM63XX_CONSOLE (&bcm63xx_console)
795 #define BCM63XX_CONSOLE NULL
796 #endif /* CONFIG_SERIAL_BCM63XX_CONSOLE */
798 static struct uart_driver bcm_uart_driver
= {
799 .owner
= THIS_MODULE
,
800 .driver_name
= "bcm63xx_uart",
804 .nr
= BCM63XX_NR_UARTS
,
805 .cons
= BCM63XX_CONSOLE
,
809 * platform driver probe/remove callback
811 static int bcm_uart_probe(struct platform_device
*pdev
)
813 struct resource
*res_mem
, *res_irq
;
814 struct uart_port
*port
;
818 if (pdev
->dev
.of_node
) {
819 pdev
->id
= of_alias_get_id(pdev
->dev
.of_node
, "serial");
822 pdev
->id
= of_alias_get_id(pdev
->dev
.of_node
, "uart");
825 if (pdev
->id
< 0 || pdev
->id
>= BCM63XX_NR_UARTS
)
828 port
= &ports
[pdev
->id
];
831 memset(port
, 0, sizeof(*port
));
833 res_mem
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
837 port
->mapbase
= res_mem
->start
;
838 port
->membase
= devm_ioremap_resource(&pdev
->dev
, res_mem
);
839 if (IS_ERR(port
->membase
))
840 return PTR_ERR(port
->membase
);
842 res_irq
= platform_get_resource(pdev
, IORESOURCE_IRQ
, 0);
846 clk
= clk_get(&pdev
->dev
, "refclk");
847 if (IS_ERR(clk
) && pdev
->dev
.of_node
)
848 clk
= of_clk_get(pdev
->dev
.of_node
, 0);
853 port
->iotype
= UPIO_MEM
;
854 port
->irq
= res_irq
->start
;
855 port
->ops
= &bcm_uart_ops
;
856 port
->flags
= UPF_BOOT_AUTOCONF
;
857 port
->dev
= &pdev
->dev
;
859 port
->uartclk
= clk_get_rate(clk
) / 2;
860 port
->line
= pdev
->id
;
863 ret
= uart_add_one_port(&bcm_uart_driver
, port
);
865 ports
[pdev
->id
].membase
= NULL
;
868 platform_set_drvdata(pdev
, port
);
872 static int bcm_uart_remove(struct platform_device
*pdev
)
874 struct uart_port
*port
;
876 port
= platform_get_drvdata(pdev
);
877 uart_remove_one_port(&bcm_uart_driver
, port
);
878 /* mark port as free */
879 ports
[pdev
->id
].membase
= NULL
;
883 static const struct of_device_id bcm63xx_of_match
[] = {
884 { .compatible
= "brcm,bcm6345-uart" },
887 MODULE_DEVICE_TABLE(of
, bcm63xx_of_match
);
890 * platform driver stuff
892 static struct platform_driver bcm_uart_platform_driver
= {
893 .probe
= bcm_uart_probe
,
894 .remove
= bcm_uart_remove
,
896 .name
= "bcm63xx_uart",
897 .of_match_table
= bcm63xx_of_match
,
901 static int __init
bcm_uart_init(void)
905 ret
= uart_register_driver(&bcm_uart_driver
);
909 ret
= platform_driver_register(&bcm_uart_platform_driver
);
911 uart_unregister_driver(&bcm_uart_driver
);
916 static void __exit
bcm_uart_exit(void)
918 platform_driver_unregister(&bcm_uart_platform_driver
);
919 uart_unregister_driver(&bcm_uart_driver
);
922 module_init(bcm_uart_init
);
923 module_exit(bcm_uart_exit
);
925 MODULE_AUTHOR("Maxime Bizon <mbizon@freebox.fr>");
926 MODULE_DESCRIPTION("Broadcom 63xx integrated uart driver");
927 MODULE_LICENSE("GPL");