2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
6 * Derived from many drivers using generic_serial interface.
8 * Copyright (C) 2008 Maxime Bizon <mbizon@freebox.fr>
10 * Serial driver for BCM63xx integrated UART.
12 * Hardware flow control was _not_ tested since I only have RX/TX on
16 #if defined(CONFIG_SERIAL_BCM63XX_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
20 #include <linux/kernel.h>
21 #include <linux/platform_device.h>
22 #include <linux/init.h>
23 #include <linux/delay.h>
24 #include <linux/module.h>
25 #include <linux/console.h>
26 #include <linux/clk.h>
27 #include <linux/tty.h>
28 #include <linux/tty_flip.h>
29 #include <linux/sysrq.h>
30 #include <linux/serial.h>
31 #include <linux/serial_core.h>
32 #include <linux/serial_bcm63xx.h>
36 #define BCM63XX_NR_UARTS 2
38 static struct uart_port ports
[BCM63XX_NR_UARTS
];
41 * rx interrupt mask / stat
45 * - rx fifo above threshold
46 * - rx fifo not empty for too long
48 #define UART_RX_INT_MASK (UART_IR_MASK(UART_IR_RXOVER) | \
49 UART_IR_MASK(UART_IR_RXTHRESH) | \
50 UART_IR_MASK(UART_IR_RXTIMEOUT))
52 #define UART_RX_INT_STAT (UART_IR_STAT(UART_IR_RXOVER) | \
53 UART_IR_STAT(UART_IR_RXTHRESH) | \
54 UART_IR_STAT(UART_IR_RXTIMEOUT))
57 * tx interrupt mask / stat
61 * - tx fifo below threshold
63 #define UART_TX_INT_MASK (UART_IR_MASK(UART_IR_TXEMPTY) | \
64 UART_IR_MASK(UART_IR_TXTRESH))
66 #define UART_TX_INT_STAT (UART_IR_STAT(UART_IR_TXEMPTY) | \
67 UART_IR_STAT(UART_IR_TXTRESH))
70 * external input interrupt
72 * mask: any edge on CTS, DCD
74 #define UART_EXTINP_INT_MASK (UART_EXTINP_IRMASK(UART_EXTINP_IR_CTS) | \
75 UART_EXTINP_IRMASK(UART_EXTINP_IR_DCD))
78 * handy uart register accessor
80 static inline unsigned int bcm_uart_readl(struct uart_port
*port
,
83 return __raw_readl(port
->membase
+ offset
);
86 static inline void bcm_uart_writel(struct uart_port
*port
,
87 unsigned int value
, unsigned int offset
)
89 __raw_writel(value
, port
->membase
+ offset
);
93 * serial core request to check if uart tx fifo is empty
95 static unsigned int bcm_uart_tx_empty(struct uart_port
*port
)
99 val
= bcm_uart_readl(port
, UART_IR_REG
);
100 return (val
& UART_IR_STAT(UART_IR_TXEMPTY
)) ? 1 : 0;
104 * serial core request to set RTS and DTR pin state and loopback mode
106 static void bcm_uart_set_mctrl(struct uart_port
*port
, unsigned int mctrl
)
110 val
= bcm_uart_readl(port
, UART_MCTL_REG
);
111 val
&= ~(UART_MCTL_DTR_MASK
| UART_MCTL_RTS_MASK
);
112 /* invert of written value is reflected on the pin */
113 if (!(mctrl
& TIOCM_DTR
))
114 val
|= UART_MCTL_DTR_MASK
;
115 if (!(mctrl
& TIOCM_RTS
))
116 val
|= UART_MCTL_RTS_MASK
;
117 bcm_uart_writel(port
, val
, UART_MCTL_REG
);
119 val
= bcm_uart_readl(port
, UART_CTL_REG
);
120 if (mctrl
& TIOCM_LOOP
)
121 val
|= UART_CTL_LOOPBACK_MASK
;
123 val
&= ~UART_CTL_LOOPBACK_MASK
;
124 bcm_uart_writel(port
, val
, UART_CTL_REG
);
128 * serial core request to return RI, CTS, DCD and DSR pin state
130 static unsigned int bcm_uart_get_mctrl(struct uart_port
*port
)
132 unsigned int val
, mctrl
;
135 val
= bcm_uart_readl(port
, UART_EXTINP_REG
);
136 if (val
& UART_EXTINP_RI_MASK
)
138 if (val
& UART_EXTINP_CTS_MASK
)
140 if (val
& UART_EXTINP_DCD_MASK
)
142 if (val
& UART_EXTINP_DSR_MASK
)
148 * serial core request to disable tx ASAP (used for flow control)
150 static void bcm_uart_stop_tx(struct uart_port
*port
)
154 val
= bcm_uart_readl(port
, UART_CTL_REG
);
155 val
&= ~(UART_CTL_TXEN_MASK
);
156 bcm_uart_writel(port
, val
, UART_CTL_REG
);
158 val
= bcm_uart_readl(port
, UART_IR_REG
);
159 val
&= ~UART_TX_INT_MASK
;
160 bcm_uart_writel(port
, val
, UART_IR_REG
);
164 * serial core request to (re)enable tx
166 static void bcm_uart_start_tx(struct uart_port
*port
)
170 val
= bcm_uart_readl(port
, UART_IR_REG
);
171 val
|= UART_TX_INT_MASK
;
172 bcm_uart_writel(port
, val
, UART_IR_REG
);
174 val
= bcm_uart_readl(port
, UART_CTL_REG
);
175 val
|= UART_CTL_TXEN_MASK
;
176 bcm_uart_writel(port
, val
, UART_CTL_REG
);
180 * serial core request to stop rx, called before port shutdown
182 static void bcm_uart_stop_rx(struct uart_port
*port
)
186 val
= bcm_uart_readl(port
, UART_IR_REG
);
187 val
&= ~UART_RX_INT_MASK
;
188 bcm_uart_writel(port
, val
, UART_IR_REG
);
192 * serial core request to enable modem status interrupt reporting
194 static void bcm_uart_enable_ms(struct uart_port
*port
)
198 val
= bcm_uart_readl(port
, UART_IR_REG
);
199 val
|= UART_IR_MASK(UART_IR_EXTIP
);
200 bcm_uart_writel(port
, val
, UART_IR_REG
);
204 * serial core request to start/stop emitting break char
206 static void bcm_uart_break_ctl(struct uart_port
*port
, int ctl
)
211 spin_lock_irqsave(&port
->lock
, flags
);
213 val
= bcm_uart_readl(port
, UART_CTL_REG
);
215 val
|= UART_CTL_XMITBRK_MASK
;
217 val
&= ~UART_CTL_XMITBRK_MASK
;
218 bcm_uart_writel(port
, val
, UART_CTL_REG
);
220 spin_unlock_irqrestore(&port
->lock
, flags
);
224 * return port type in string format
226 static const char *bcm_uart_type(struct uart_port
*port
)
228 return (port
->type
== PORT_BCM63XX
) ? "bcm63xx_uart" : NULL
;
232 * read all chars in rx fifo and send them to core
234 static void bcm_uart_do_rx(struct uart_port
*port
)
236 struct tty_port
*tty_port
= &port
->state
->port
;
237 unsigned int max_count
;
239 /* limit number of char read in interrupt, should not be
240 * higher than fifo size anyway since we're much faster than
244 unsigned int iestat
, c
, cstat
;
247 /* get overrun/fifo empty information from ier
249 iestat
= bcm_uart_readl(port
, UART_IR_REG
);
251 if (unlikely(iestat
& UART_IR_STAT(UART_IR_RXOVER
))) {
254 /* fifo reset is required to clear
256 val
= bcm_uart_readl(port
, UART_CTL_REG
);
257 val
|= UART_CTL_RSTRXFIFO_MASK
;
258 bcm_uart_writel(port
, val
, UART_CTL_REG
);
260 port
->icount
.overrun
++;
261 tty_insert_flip_char(tty_port
, 0, TTY_OVERRUN
);
264 if (!(iestat
& UART_IR_STAT(UART_IR_RXNOTEMPTY
)))
267 cstat
= c
= bcm_uart_readl(port
, UART_FIFO_REG
);
272 if (unlikely((cstat
& UART_FIFO_ANYERR_MASK
))) {
274 if (cstat
& UART_FIFO_BRKDET_MASK
) {
276 if (uart_handle_break(port
))
280 if (cstat
& UART_FIFO_PARERR_MASK
)
281 port
->icount
.parity
++;
282 if (cstat
& UART_FIFO_FRAMEERR_MASK
)
283 port
->icount
.frame
++;
285 /* update flag wrt read_status_mask */
286 cstat
&= port
->read_status_mask
;
287 if (cstat
& UART_FIFO_BRKDET_MASK
)
289 if (cstat
& UART_FIFO_FRAMEERR_MASK
)
291 if (cstat
& UART_FIFO_PARERR_MASK
)
295 if (uart_handle_sysrq_char(port
, c
))
299 if ((cstat
& port
->ignore_status_mask
) == 0)
300 tty_insert_flip_char(tty_port
, c
, flag
);
302 } while (--max_count
);
304 spin_unlock(&port
->lock
);
305 tty_flip_buffer_push(tty_port
);
306 spin_lock(&port
->lock
);
310 * fill tx fifo with chars to send, stop when fifo is about to be full
311 * or when all chars have been sent.
313 static void bcm_uart_do_tx(struct uart_port
*port
)
315 struct circ_buf
*xmit
;
316 unsigned int val
, max_count
;
319 bcm_uart_writel(port
, port
->x_char
, UART_FIFO_REG
);
325 if (uart_tx_stopped(port
)) {
326 bcm_uart_stop_tx(port
);
330 xmit
= &port
->state
->xmit
;
331 if (uart_circ_empty(xmit
))
334 val
= bcm_uart_readl(port
, UART_MCTL_REG
);
335 val
= (val
& UART_MCTL_TXFIFOFILL_MASK
) >> UART_MCTL_TXFIFOFILL_SHIFT
;
336 max_count
= port
->fifosize
- val
;
338 while (max_count
--) {
341 c
= xmit
->buf
[xmit
->tail
];
342 bcm_uart_writel(port
, c
, UART_FIFO_REG
);
343 xmit
->tail
= (xmit
->tail
+ 1) & (UART_XMIT_SIZE
- 1);
345 if (uart_circ_empty(xmit
))
349 if (uart_circ_chars_pending(xmit
) < WAKEUP_CHARS
)
350 uart_write_wakeup(port
);
352 if (uart_circ_empty(xmit
))
357 /* nothing to send, disable transmit interrupt */
358 val
= bcm_uart_readl(port
, UART_IR_REG
);
359 val
&= ~UART_TX_INT_MASK
;
360 bcm_uart_writel(port
, val
, UART_IR_REG
);
365 * process uart interrupt
367 static irqreturn_t
bcm_uart_interrupt(int irq
, void *dev_id
)
369 struct uart_port
*port
;
370 unsigned int irqstat
;
373 spin_lock(&port
->lock
);
375 irqstat
= bcm_uart_readl(port
, UART_IR_REG
);
376 if (irqstat
& UART_RX_INT_STAT
)
377 bcm_uart_do_rx(port
);
379 if (irqstat
& UART_TX_INT_STAT
)
380 bcm_uart_do_tx(port
);
382 if (irqstat
& UART_IR_MASK(UART_IR_EXTIP
)) {
385 estat
= bcm_uart_readl(port
, UART_EXTINP_REG
);
386 if (estat
& UART_EXTINP_IRSTAT(UART_EXTINP_IR_CTS
))
387 uart_handle_cts_change(port
,
388 estat
& UART_EXTINP_CTS_MASK
);
389 if (estat
& UART_EXTINP_IRSTAT(UART_EXTINP_IR_DCD
))
390 uart_handle_dcd_change(port
,
391 estat
& UART_EXTINP_DCD_MASK
);
394 spin_unlock(&port
->lock
);
399 * enable rx & tx operation on uart
401 static void bcm_uart_enable(struct uart_port
*port
)
405 val
= bcm_uart_readl(port
, UART_CTL_REG
);
406 val
|= (UART_CTL_BRGEN_MASK
| UART_CTL_TXEN_MASK
| UART_CTL_RXEN_MASK
);
407 bcm_uart_writel(port
, val
, UART_CTL_REG
);
411 * disable rx & tx operation on uart
413 static void bcm_uart_disable(struct uart_port
*port
)
417 val
= bcm_uart_readl(port
, UART_CTL_REG
);
418 val
&= ~(UART_CTL_BRGEN_MASK
| UART_CTL_TXEN_MASK
|
420 bcm_uart_writel(port
, val
, UART_CTL_REG
);
424 * clear all unread data in rx fifo and unsent data in tx fifo
426 static void bcm_uart_flush(struct uart_port
*port
)
430 /* empty rx and tx fifo */
431 val
= bcm_uart_readl(port
, UART_CTL_REG
);
432 val
|= UART_CTL_RSTRXFIFO_MASK
| UART_CTL_RSTTXFIFO_MASK
;
433 bcm_uart_writel(port
, val
, UART_CTL_REG
);
435 /* read any pending char to make sure all irq status are
437 (void)bcm_uart_readl(port
, UART_FIFO_REG
);
441 * serial core request to initialize uart and start rx operation
443 static int bcm_uart_startup(struct uart_port
*port
)
448 /* mask all irq and flush port */
449 bcm_uart_disable(port
);
450 bcm_uart_writel(port
, 0, UART_IR_REG
);
451 bcm_uart_flush(port
);
453 /* clear any pending external input interrupt */
454 (void)bcm_uart_readl(port
, UART_EXTINP_REG
);
456 /* set rx/tx fifo thresh to fifo half size */
457 val
= bcm_uart_readl(port
, UART_MCTL_REG
);
458 val
&= ~(UART_MCTL_RXFIFOTHRESH_MASK
| UART_MCTL_TXFIFOTHRESH_MASK
);
459 val
|= (port
->fifosize
/ 2) << UART_MCTL_RXFIFOTHRESH_SHIFT
;
460 val
|= (port
->fifosize
/ 2) << UART_MCTL_TXFIFOTHRESH_SHIFT
;
461 bcm_uart_writel(port
, val
, UART_MCTL_REG
);
463 /* set rx fifo timeout to 1 char time */
464 val
= bcm_uart_readl(port
, UART_CTL_REG
);
465 val
&= ~UART_CTL_RXTMOUTCNT_MASK
;
466 val
|= 1 << UART_CTL_RXTMOUTCNT_SHIFT
;
467 bcm_uart_writel(port
, val
, UART_CTL_REG
);
469 /* report any edge on dcd and cts */
470 val
= UART_EXTINP_INT_MASK
;
471 val
|= UART_EXTINP_DCD_NOSENSE_MASK
;
472 val
|= UART_EXTINP_CTS_NOSENSE_MASK
;
473 bcm_uart_writel(port
, val
, UART_EXTINP_REG
);
475 /* register irq and enable rx interrupts */
476 ret
= request_irq(port
->irq
, bcm_uart_interrupt
, 0,
477 bcm_uart_type(port
), port
);
480 bcm_uart_writel(port
, UART_RX_INT_MASK
, UART_IR_REG
);
481 bcm_uart_enable(port
);
486 * serial core request to flush & disable uart
488 static void bcm_uart_shutdown(struct uart_port
*port
)
492 spin_lock_irqsave(&port
->lock
, flags
);
493 bcm_uart_writel(port
, 0, UART_IR_REG
);
494 spin_unlock_irqrestore(&port
->lock
, flags
);
496 bcm_uart_disable(port
);
497 bcm_uart_flush(port
);
498 free_irq(port
->irq
, port
);
502 * serial core request to change current uart setting
504 static void bcm_uart_set_termios(struct uart_port
*port
,
505 struct ktermios
*new,
506 struct ktermios
*old
)
508 unsigned int ctl
, baud
, quot
, ier
;
511 spin_lock_irqsave(&port
->lock
, flags
);
513 /* disable uart while changing speed */
514 bcm_uart_disable(port
);
515 bcm_uart_flush(port
);
517 /* update Control register */
518 ctl
= bcm_uart_readl(port
, UART_CTL_REG
);
519 ctl
&= ~UART_CTL_BITSPERSYM_MASK
;
521 switch (new->c_cflag
& CSIZE
) {
523 ctl
|= (0 << UART_CTL_BITSPERSYM_SHIFT
);
526 ctl
|= (1 << UART_CTL_BITSPERSYM_SHIFT
);
529 ctl
|= (2 << UART_CTL_BITSPERSYM_SHIFT
);
532 ctl
|= (3 << UART_CTL_BITSPERSYM_SHIFT
);
536 ctl
&= ~UART_CTL_STOPBITS_MASK
;
537 if (new->c_cflag
& CSTOPB
)
538 ctl
|= UART_CTL_STOPBITS_2
;
540 ctl
|= UART_CTL_STOPBITS_1
;
542 ctl
&= ~(UART_CTL_RXPAREN_MASK
| UART_CTL_TXPAREN_MASK
);
543 if (new->c_cflag
& PARENB
)
544 ctl
|= (UART_CTL_RXPAREN_MASK
| UART_CTL_TXPAREN_MASK
);
545 ctl
&= ~(UART_CTL_RXPAREVEN_MASK
| UART_CTL_TXPAREVEN_MASK
);
546 if (new->c_cflag
& PARODD
)
547 ctl
|= (UART_CTL_RXPAREVEN_MASK
| UART_CTL_TXPAREVEN_MASK
);
548 bcm_uart_writel(port
, ctl
, UART_CTL_REG
);
550 /* update Baudword register */
551 baud
= uart_get_baud_rate(port
, new, old
, 0, port
->uartclk
/ 16);
552 quot
= uart_get_divisor(port
, baud
) - 1;
553 bcm_uart_writel(port
, quot
, UART_BAUD_REG
);
555 /* update Interrupt register */
556 ier
= bcm_uart_readl(port
, UART_IR_REG
);
558 ier
&= ~UART_IR_MASK(UART_IR_EXTIP
);
559 if (UART_ENABLE_MS(port
, new->c_cflag
))
560 ier
|= UART_IR_MASK(UART_IR_EXTIP
);
562 bcm_uart_writel(port
, ier
, UART_IR_REG
);
564 /* update read/ignore mask */
565 port
->read_status_mask
= UART_FIFO_VALID_MASK
;
566 if (new->c_iflag
& INPCK
) {
567 port
->read_status_mask
|= UART_FIFO_FRAMEERR_MASK
;
568 port
->read_status_mask
|= UART_FIFO_PARERR_MASK
;
570 if (new->c_iflag
& (IGNBRK
| BRKINT
))
571 port
->read_status_mask
|= UART_FIFO_BRKDET_MASK
;
573 port
->ignore_status_mask
= 0;
574 if (new->c_iflag
& IGNPAR
)
575 port
->ignore_status_mask
|= UART_FIFO_PARERR_MASK
;
576 if (new->c_iflag
& IGNBRK
)
577 port
->ignore_status_mask
|= UART_FIFO_BRKDET_MASK
;
578 if (!(new->c_cflag
& CREAD
))
579 port
->ignore_status_mask
|= UART_FIFO_VALID_MASK
;
581 uart_update_timeout(port
, new->c_cflag
, baud
);
582 bcm_uart_enable(port
);
583 spin_unlock_irqrestore(&port
->lock
, flags
);
587 * serial core request to claim uart iomem
589 static int bcm_uart_request_port(struct uart_port
*port
)
591 /* UARTs always present */
596 * serial core request to release uart iomem
598 static void bcm_uart_release_port(struct uart_port
*port
)
600 /* Nothing to release ... */
604 * serial core request to do any port required autoconfiguration
606 static void bcm_uart_config_port(struct uart_port
*port
, int flags
)
608 if (flags
& UART_CONFIG_TYPE
) {
609 if (bcm_uart_request_port(port
))
611 port
->type
= PORT_BCM63XX
;
616 * serial core request to check that port information in serinfo are
619 static int bcm_uart_verify_port(struct uart_port
*port
,
620 struct serial_struct
*serinfo
)
622 if (port
->type
!= PORT_BCM63XX
)
624 if (port
->irq
!= serinfo
->irq
)
626 if (port
->iotype
!= serinfo
->io_type
)
628 if (port
->mapbase
!= (unsigned long)serinfo
->iomem_base
)
633 /* serial core callbacks */
634 static struct uart_ops bcm_uart_ops
= {
635 .tx_empty
= bcm_uart_tx_empty
,
636 .get_mctrl
= bcm_uart_get_mctrl
,
637 .set_mctrl
= bcm_uart_set_mctrl
,
638 .start_tx
= bcm_uart_start_tx
,
639 .stop_tx
= bcm_uart_stop_tx
,
640 .stop_rx
= bcm_uart_stop_rx
,
641 .enable_ms
= bcm_uart_enable_ms
,
642 .break_ctl
= bcm_uart_break_ctl
,
643 .startup
= bcm_uart_startup
,
644 .shutdown
= bcm_uart_shutdown
,
645 .set_termios
= bcm_uart_set_termios
,
646 .type
= bcm_uart_type
,
647 .release_port
= bcm_uart_release_port
,
648 .request_port
= bcm_uart_request_port
,
649 .config_port
= bcm_uart_config_port
,
650 .verify_port
= bcm_uart_verify_port
,
655 #ifdef CONFIG_SERIAL_BCM63XX_CONSOLE
656 static inline void wait_for_xmitr(struct uart_port
*port
)
660 /* Wait up to 10ms for the character(s) to be sent. */
665 val
= bcm_uart_readl(port
, UART_IR_REG
);
666 if (val
& UART_IR_STAT(UART_IR_TXEMPTY
))
671 /* Wait up to 1s for flow control if necessary */
672 if (port
->flags
& UPF_CONS_FLOW
) {
677 val
= bcm_uart_readl(port
, UART_EXTINP_REG
);
678 if (val
& UART_EXTINP_CTS_MASK
)
688 static void bcm_console_putchar(struct uart_port
*port
, int ch
)
690 wait_for_xmitr(port
);
691 bcm_uart_writel(port
, ch
, UART_FIFO_REG
);
695 * console core request to output given string
697 static void bcm_console_write(struct console
*co
, const char *s
,
700 struct uart_port
*port
;
704 port
= &ports
[co
->index
];
706 local_irq_save(flags
);
708 /* bcm_uart_interrupt() already took the lock */
710 } else if (oops_in_progress
) {
711 locked
= spin_trylock(&port
->lock
);
713 spin_lock(&port
->lock
);
717 /* call helper to deal with \r\n */
718 uart_console_write(port
, s
, count
, bcm_console_putchar
);
720 /* and wait for char to be transmitted */
721 wait_for_xmitr(port
);
724 spin_unlock(&port
->lock
);
725 local_irq_restore(flags
);
729 * console core request to setup given console, find matching uart
732 static int bcm_console_setup(struct console
*co
, char *options
)
734 struct uart_port
*port
;
740 if (co
->index
< 0 || co
->index
>= BCM63XX_NR_UARTS
)
742 port
= &ports
[co
->index
];
746 uart_parse_options(options
, &baud
, &parity
, &bits
, &flow
);
748 return uart_set_options(port
, co
, baud
, parity
, bits
, flow
);
751 static struct uart_driver bcm_uart_driver
;
753 static struct console bcm63xx_console
= {
755 .write
= bcm_console_write
,
756 .device
= uart_console_device
,
757 .setup
= bcm_console_setup
,
758 .flags
= CON_PRINTBUFFER
,
760 .data
= &bcm_uart_driver
,
763 static int __init
bcm63xx_console_init(void)
765 register_console(&bcm63xx_console
);
769 console_initcall(bcm63xx_console_init
);
771 static void bcm_early_write(struct console
*con
, const char *s
, unsigned n
)
773 struct earlycon_device
*dev
= con
->data
;
775 uart_console_write(&dev
->port
, s
, n
, bcm_console_putchar
);
776 wait_for_xmitr(&dev
->port
);
779 static int __init
bcm_early_console_setup(struct earlycon_device
*device
,
782 if (!device
->port
.membase
)
785 device
->con
->write
= bcm_early_write
;
789 OF_EARLYCON_DECLARE(bcm63xx_uart
, "brcm,bcm6345-uart", bcm_early_console_setup
);
791 #define BCM63XX_CONSOLE (&bcm63xx_console)
793 #define BCM63XX_CONSOLE NULL
794 #endif /* CONFIG_SERIAL_BCM63XX_CONSOLE */
796 static struct uart_driver bcm_uart_driver
= {
797 .owner
= THIS_MODULE
,
798 .driver_name
= "bcm63xx_uart",
802 .nr
= BCM63XX_NR_UARTS
,
803 .cons
= BCM63XX_CONSOLE
,
807 * platform driver probe/remove callback
809 static int bcm_uart_probe(struct platform_device
*pdev
)
811 struct resource
*res_mem
, *res_irq
;
812 struct uart_port
*port
;
816 if (pdev
->dev
.of_node
)
817 pdev
->id
= of_alias_get_id(pdev
->dev
.of_node
, "uart");
819 if (pdev
->id
< 0 || pdev
->id
>= BCM63XX_NR_UARTS
)
822 port
= &ports
[pdev
->id
];
825 memset(port
, 0, sizeof(*port
));
827 res_mem
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
831 port
->mapbase
= res_mem
->start
;
832 port
->membase
= devm_ioremap_resource(&pdev
->dev
, res_mem
);
833 if (IS_ERR(port
->membase
))
834 return PTR_ERR(port
->membase
);
836 res_irq
= platform_get_resource(pdev
, IORESOURCE_IRQ
, 0);
840 clk
= pdev
->dev
.of_node
? of_clk_get(pdev
->dev
.of_node
, 0) :
841 clk_get(&pdev
->dev
, "periph");
845 port
->iotype
= UPIO_MEM
;
846 port
->irq
= res_irq
->start
;
847 port
->ops
= &bcm_uart_ops
;
848 port
->flags
= UPF_BOOT_AUTOCONF
;
849 port
->dev
= &pdev
->dev
;
851 port
->uartclk
= clk_get_rate(clk
) / 2;
852 port
->line
= pdev
->id
;
855 ret
= uart_add_one_port(&bcm_uart_driver
, port
);
857 ports
[pdev
->id
].membase
= NULL
;
860 platform_set_drvdata(pdev
, port
);
864 static int bcm_uart_remove(struct platform_device
*pdev
)
866 struct uart_port
*port
;
868 port
= platform_get_drvdata(pdev
);
869 uart_remove_one_port(&bcm_uart_driver
, port
);
870 /* mark port as free */
871 ports
[pdev
->id
].membase
= NULL
;
875 static const struct of_device_id bcm63xx_of_match
[] = {
876 { .compatible
= "brcm,bcm6345-uart" },
879 MODULE_DEVICE_TABLE(of
, bcm63xx_of_match
);
882 * platform driver stuff
884 static struct platform_driver bcm_uart_platform_driver
= {
885 .probe
= bcm_uart_probe
,
886 .remove
= bcm_uart_remove
,
888 .name
= "bcm63xx_uart",
889 .of_match_table
= bcm63xx_of_match
,
893 static int __init
bcm_uart_init(void)
897 ret
= uart_register_driver(&bcm_uart_driver
);
901 ret
= platform_driver_register(&bcm_uart_platform_driver
);
903 uart_unregister_driver(&bcm_uart_driver
);
908 static void __exit
bcm_uart_exit(void)
910 platform_driver_unregister(&bcm_uart_platform_driver
);
911 uart_unregister_driver(&bcm_uart_driver
);
914 module_init(bcm_uart_init
);
915 module_exit(bcm_uart_exit
);
917 MODULE_AUTHOR("Maxime Bizon <mbizon@freebox.fr>");
918 MODULE_DESCRIPTION("Broadcom 63xx integrated uart driver");
919 MODULE_LICENSE("GPL");