2 * ***************************************************************************
3 * Marvell Armada-3700 Serial Driver
4 * Author: Wilson Ding <dingwei@marvell.com>
5 * Copyright (C) 2015 Marvell International Ltd.
6 * ***************************************************************************
7 * This program is free software: you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation, either version 2 of the License, or any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 * ***************************************************************************
21 #include <linux/clk.h>
22 #include <linux/console.h>
23 #include <linux/delay.h>
24 #include <linux/device.h>
25 #include <linux/init.h>
27 #include <linux/iopoll.h>
29 #include <linux/of_address.h>
30 #include <linux/of_device.h>
31 #include <linux/of_irq.h>
32 #include <linux/of_platform.h>
33 #include <linux/platform_device.h>
34 #include <linux/serial.h>
35 #include <linux/serial_core.h>
36 #include <linux/slab.h>
37 #include <linux/tty.h>
38 #include <linux/tty_flip.h>
42 #define RBR_BRK_DET BIT(15)
43 #define RBR_FRM_ERR_DET BIT(14)
44 #define RBR_PAR_ERR_DET BIT(13)
45 #define RBR_OVR_ERR_DET BIT(12)
49 #define UART_CTRL 0x08
50 #define CTRL_SOFT_RST BIT(31)
51 #define CTRL_TXFIFO_RST BIT(15)
52 #define CTRL_RXFIFO_RST BIT(14)
53 #define CTRL_ST_MIRR_EN BIT(13)
54 #define CTRL_LPBK_EN BIT(12)
55 #define CTRL_SND_BRK_SEQ BIT(11)
56 #define CTRL_PAR_EN BIT(10)
57 #define CTRL_TWO_STOP BIT(9)
58 #define CTRL_TX_HFL_INT BIT(8)
59 #define CTRL_RX_HFL_INT BIT(7)
60 #define CTRL_TX_EMP_INT BIT(6)
61 #define CTRL_TX_RDY_INT BIT(5)
62 #define CTRL_RX_RDY_INT BIT(4)
63 #define CTRL_BRK_DET_INT BIT(3)
64 #define CTRL_FRM_ERR_INT BIT(2)
65 #define CTRL_PAR_ERR_INT BIT(1)
66 #define CTRL_OVR_ERR_INT BIT(0)
67 #define CTRL_RX_INT (CTRL_RX_RDY_INT | CTRL_BRK_DET_INT |\
68 CTRL_FRM_ERR_INT | CTRL_PAR_ERR_INT | CTRL_OVR_ERR_INT)
70 #define UART_STAT 0x0c
71 #define STAT_TX_FIFO_EMP BIT(13)
72 #define STAT_RX_FIFO_EMP BIT(12)
73 #define STAT_TX_FIFO_FUL BIT(11)
74 #define STAT_TX_FIFO_HFL BIT(10)
75 #define STAT_RX_TOGL BIT(9)
76 #define STAT_RX_FIFO_FUL BIT(8)
77 #define STAT_RX_FIFO_HFL BIT(7)
78 #define STAT_TX_EMP BIT(6)
79 #define STAT_TX_RDY BIT(5)
80 #define STAT_RX_RDY BIT(4)
81 #define STAT_BRK_DET BIT(3)
82 #define STAT_FRM_ERR BIT(2)
83 #define STAT_PAR_ERR BIT(1)
84 #define STAT_OVR_ERR BIT(0)
85 #define STAT_BRK_ERR (STAT_BRK_DET | STAT_FRM_ERR | STAT_FRM_ERR\
86 | STAT_PAR_ERR | STAT_OVR_ERR)
88 #define UART_BRDV 0x10
90 #define MVEBU_NR_UARTS 1
92 #define MVEBU_UART_TYPE "mvebu-uart"
94 static struct uart_port mvebu_uart_ports
[MVEBU_NR_UARTS
];
96 struct mvebu_uart_data
{
97 struct uart_port
*port
;
101 /* Core UART Driver Operations */
102 static unsigned int mvebu_uart_tx_empty(struct uart_port
*port
)
107 spin_lock_irqsave(&port
->lock
, flags
);
108 st
= readl(port
->membase
+ UART_STAT
);
109 spin_unlock_irqrestore(&port
->lock
, flags
);
111 return (st
& STAT_TX_FIFO_EMP
) ? TIOCSER_TEMT
: 0;
114 static unsigned int mvebu_uart_get_mctrl(struct uart_port
*port
)
116 return TIOCM_CTS
| TIOCM_DSR
| TIOCM_CAR
;
119 static void mvebu_uart_set_mctrl(struct uart_port
*port
,
123 * Even if we do not support configuring the modem control lines, this
124 * function must be proided to the serial core
128 static void mvebu_uart_stop_tx(struct uart_port
*port
)
130 unsigned int ctl
= readl(port
->membase
+ UART_CTRL
);
132 ctl
&= ~CTRL_TX_RDY_INT
;
133 writel(ctl
, port
->membase
+ UART_CTRL
);
136 static void mvebu_uart_start_tx(struct uart_port
*port
)
138 unsigned int ctl
= readl(port
->membase
+ UART_CTRL
);
140 ctl
|= CTRL_TX_RDY_INT
;
141 writel(ctl
, port
->membase
+ UART_CTRL
);
144 static void mvebu_uart_stop_rx(struct uart_port
*port
)
146 unsigned int ctl
= readl(port
->membase
+ UART_CTRL
);
149 writel(ctl
, port
->membase
+ UART_CTRL
);
152 static void mvebu_uart_break_ctl(struct uart_port
*port
, int brk
)
157 spin_lock_irqsave(&port
->lock
, flags
);
158 ctl
= readl(port
->membase
+ UART_CTRL
);
160 ctl
|= CTRL_SND_BRK_SEQ
;
162 ctl
&= ~CTRL_SND_BRK_SEQ
;
163 writel(ctl
, port
->membase
+ UART_CTRL
);
164 spin_unlock_irqrestore(&port
->lock
, flags
);
167 static void mvebu_uart_rx_chars(struct uart_port
*port
, unsigned int status
)
169 struct tty_port
*tport
= &port
->state
->port
;
170 unsigned char ch
= 0;
174 if (status
& STAT_RX_RDY
) {
175 ch
= readl(port
->membase
+ UART_RBR
);
180 if (status
& STAT_PAR_ERR
)
181 port
->icount
.parity
++;
184 if (status
& STAT_BRK_DET
) {
186 status
&= ~(STAT_FRM_ERR
| STAT_PAR_ERR
);
187 if (uart_handle_break(port
))
191 if (status
& STAT_OVR_ERR
)
192 port
->icount
.overrun
++;
194 if (status
& STAT_FRM_ERR
)
195 port
->icount
.frame
++;
197 if (uart_handle_sysrq_char(port
, ch
))
200 if (status
& port
->ignore_status_mask
& STAT_PAR_ERR
)
201 status
&= ~STAT_RX_RDY
;
203 status
&= port
->read_status_mask
;
205 if (status
& STAT_PAR_ERR
)
208 status
&= ~port
->ignore_status_mask
;
210 if (status
& STAT_RX_RDY
)
211 tty_insert_flip_char(tport
, ch
, flag
);
213 if (status
& STAT_BRK_DET
)
214 tty_insert_flip_char(tport
, 0, TTY_BREAK
);
216 if (status
& STAT_FRM_ERR
)
217 tty_insert_flip_char(tport
, 0, TTY_FRAME
);
219 if (status
& STAT_OVR_ERR
)
220 tty_insert_flip_char(tport
, 0, TTY_OVERRUN
);
223 status
= readl(port
->membase
+ UART_STAT
);
224 } while (status
& (STAT_RX_RDY
| STAT_BRK_DET
));
226 tty_flip_buffer_push(tport
);
229 static void mvebu_uart_tx_chars(struct uart_port
*port
, unsigned int status
)
231 struct circ_buf
*xmit
= &port
->state
->xmit
;
236 writel(port
->x_char
, port
->membase
+ UART_TSH
);
242 if (uart_circ_empty(xmit
) || uart_tx_stopped(port
)) {
243 mvebu_uart_stop_tx(port
);
247 for (count
= 0; count
< port
->fifosize
; count
++) {
248 writel(xmit
->buf
[xmit
->tail
], port
->membase
+ UART_TSH
);
249 xmit
->tail
= (xmit
->tail
+ 1) & (UART_XMIT_SIZE
- 1);
252 if (uart_circ_empty(xmit
))
255 st
= readl(port
->membase
+ UART_STAT
);
256 if (st
& STAT_TX_FIFO_FUL
)
260 if (uart_circ_chars_pending(xmit
) < WAKEUP_CHARS
)
261 uart_write_wakeup(port
);
263 if (uart_circ_empty(xmit
))
264 mvebu_uart_stop_tx(port
);
267 static irqreturn_t
mvebu_uart_isr(int irq
, void *dev_id
)
269 struct uart_port
*port
= (struct uart_port
*)dev_id
;
270 unsigned int st
= readl(port
->membase
+ UART_STAT
);
272 if (st
& (STAT_RX_RDY
| STAT_OVR_ERR
| STAT_FRM_ERR
| STAT_BRK_DET
))
273 mvebu_uart_rx_chars(port
, st
);
275 if (st
& STAT_TX_RDY
)
276 mvebu_uart_tx_chars(port
, st
);
281 static int mvebu_uart_startup(struct uart_port
*port
)
285 writel(CTRL_TXFIFO_RST
| CTRL_RXFIFO_RST
,
286 port
->membase
+ UART_CTRL
);
288 writel(CTRL_RX_INT
, port
->membase
+ UART_CTRL
);
290 ret
= request_irq(port
->irq
, mvebu_uart_isr
, port
->irqflags
, "serial",
293 dev_err(port
->dev
, "failed to request irq\n");
300 static void mvebu_uart_shutdown(struct uart_port
*port
)
302 writel(0, port
->membase
+ UART_CTRL
);
304 free_irq(port
->irq
, port
);
307 static void mvebu_uart_set_termios(struct uart_port
*port
,
308 struct ktermios
*termios
,
309 struct ktermios
*old
)
314 spin_lock_irqsave(&port
->lock
, flags
);
316 port
->read_status_mask
= STAT_RX_RDY
| STAT_OVR_ERR
|
317 STAT_TX_RDY
| STAT_TX_FIFO_FUL
;
319 if (termios
->c_iflag
& INPCK
)
320 port
->read_status_mask
|= STAT_FRM_ERR
| STAT_PAR_ERR
;
322 port
->ignore_status_mask
= 0;
323 if (termios
->c_iflag
& IGNPAR
)
324 port
->ignore_status_mask
|=
325 STAT_FRM_ERR
| STAT_PAR_ERR
| STAT_OVR_ERR
;
327 if ((termios
->c_cflag
& CREAD
) == 0)
328 port
->ignore_status_mask
|= STAT_RX_RDY
| STAT_BRK_ERR
;
331 tty_termios_copy_hw(termios
, old
);
333 baud
= uart_get_baud_rate(port
, termios
, old
, 0, 460800);
334 uart_update_timeout(port
, termios
->c_cflag
, baud
);
336 spin_unlock_irqrestore(&port
->lock
, flags
);
339 static const char *mvebu_uart_type(struct uart_port
*port
)
341 return MVEBU_UART_TYPE
;
344 static void mvebu_uart_release_port(struct uart_port
*port
)
346 /* Nothing to do here */
349 static int mvebu_uart_request_port(struct uart_port
*port
)
354 #ifdef CONFIG_CONSOLE_POLL
355 static int mvebu_uart_get_poll_char(struct uart_port
*port
)
357 unsigned int st
= readl(port
->membase
+ UART_STAT
);
359 if (!(st
& STAT_RX_RDY
))
362 return readl(port
->membase
+ UART_RBR
);
365 static void mvebu_uart_put_poll_char(struct uart_port
*port
, unsigned char c
)
370 st
= readl(port
->membase
+ UART_STAT
);
372 if (!(st
& STAT_TX_FIFO_FUL
))
378 writel(c
, port
->membase
+ UART_TSH
);
382 static const struct uart_ops mvebu_uart_ops
= {
383 .tx_empty
= mvebu_uart_tx_empty
,
384 .set_mctrl
= mvebu_uart_set_mctrl
,
385 .get_mctrl
= mvebu_uart_get_mctrl
,
386 .stop_tx
= mvebu_uart_stop_tx
,
387 .start_tx
= mvebu_uart_start_tx
,
388 .stop_rx
= mvebu_uart_stop_rx
,
389 .break_ctl
= mvebu_uart_break_ctl
,
390 .startup
= mvebu_uart_startup
,
391 .shutdown
= mvebu_uart_shutdown
,
392 .set_termios
= mvebu_uart_set_termios
,
393 .type
= mvebu_uart_type
,
394 .release_port
= mvebu_uart_release_port
,
395 .request_port
= mvebu_uart_request_port
,
396 #ifdef CONFIG_CONSOLE_POLL
397 .poll_get_char
= mvebu_uart_get_poll_char
,
398 .poll_put_char
= mvebu_uart_put_poll_char
,
402 /* Console Driver Operations */
404 #ifdef CONFIG_SERIAL_MVEBU_CONSOLE
406 static void mvebu_uart_putc(struct uart_port
*port
, int c
)
411 st
= readl(port
->membase
+ UART_STAT
);
412 if (!(st
& STAT_TX_FIFO_FUL
))
416 writel(c
, port
->membase
+ UART_TSH
);
419 st
= readl(port
->membase
+ UART_STAT
);
420 if (st
& STAT_TX_FIFO_EMP
)
425 static void mvebu_uart_putc_early_write(struct console
*con
,
429 struct earlycon_device
*dev
= con
->data
;
431 uart_console_write(&dev
->port
, s
, n
, mvebu_uart_putc
);
435 mvebu_uart_early_console_setup(struct earlycon_device
*device
,
438 if (!device
->port
.membase
)
441 device
->con
->write
= mvebu_uart_putc_early_write
;
446 EARLYCON_DECLARE(ar3700_uart
, mvebu_uart_early_console_setup
);
447 OF_EARLYCON_DECLARE(ar3700_uart
, "marvell,armada-3700-uart",
448 mvebu_uart_early_console_setup
);
450 static void wait_for_xmitr(struct uart_port
*port
)
454 readl_poll_timeout_atomic(port
->membase
+ UART_STAT
, val
,
455 (val
& STAT_TX_EMP
), 1, 10000);
458 static void mvebu_uart_console_putchar(struct uart_port
*port
, int ch
)
460 wait_for_xmitr(port
);
461 writel(ch
, port
->membase
+ UART_TSH
);
464 static void mvebu_uart_console_write(struct console
*co
, const char *s
,
467 struct uart_port
*port
= &mvebu_uart_ports
[co
->index
];
472 if (oops_in_progress
)
473 locked
= spin_trylock_irqsave(&port
->lock
, flags
);
475 spin_lock_irqsave(&port
->lock
, flags
);
477 ier
= readl(port
->membase
+ UART_CTRL
) &
478 (CTRL_RX_INT
| CTRL_TX_RDY_INT
);
479 writel(0, port
->membase
+ UART_CTRL
);
481 uart_console_write(port
, s
, count
, mvebu_uart_console_putchar
);
483 wait_for_xmitr(port
);
486 writel(ier
, port
->membase
+ UART_CTRL
);
489 spin_unlock_irqrestore(&port
->lock
, flags
);
492 static int mvebu_uart_console_setup(struct console
*co
, char *options
)
494 struct uart_port
*port
;
500 if (co
->index
< 0 || co
->index
>= MVEBU_NR_UARTS
)
503 port
= &mvebu_uart_ports
[co
->index
];
505 if (!port
->mapbase
|| !port
->membase
) {
506 pr_debug("console on ttyMV%i not present\n", co
->index
);
511 uart_parse_options(options
, &baud
, &parity
, &bits
, &flow
);
513 return uart_set_options(port
, co
, baud
, parity
, bits
, flow
);
516 static struct uart_driver mvebu_uart_driver
;
518 static struct console mvebu_uart_console
= {
520 .write
= mvebu_uart_console_write
,
521 .device
= uart_console_device
,
522 .setup
= mvebu_uart_console_setup
,
523 .flags
= CON_PRINTBUFFER
,
525 .data
= &mvebu_uart_driver
,
528 static int __init
mvebu_uart_console_init(void)
530 register_console(&mvebu_uart_console
);
534 console_initcall(mvebu_uart_console_init
);
537 #endif /* CONFIG_SERIAL_MVEBU_CONSOLE */
539 static struct uart_driver mvebu_uart_driver
= {
540 .owner
= THIS_MODULE
,
541 .driver_name
= "mvebu_serial",
543 .nr
= MVEBU_NR_UARTS
,
544 #ifdef CONFIG_SERIAL_MVEBU_CONSOLE
545 .cons
= &mvebu_uart_console
,
549 static int mvebu_uart_probe(struct platform_device
*pdev
)
551 struct resource
*reg
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
552 struct resource
*irq
= platform_get_resource(pdev
, IORESOURCE_IRQ
, 0);
553 struct uart_port
*port
;
554 struct mvebu_uart_data
*data
;
558 dev_err(&pdev
->dev
, "no registers/irq defined\n");
562 port
= &mvebu_uart_ports
[0];
564 spin_lock_init(&port
->lock
);
566 port
->dev
= &pdev
->dev
;
567 port
->type
= PORT_MVEBU
;
568 port
->ops
= &mvebu_uart_ops
;
572 port
->iotype
= UPIO_MEM32
;
573 port
->flags
= UPF_FIXED_PORT
;
574 port
->line
= 0; /* single port: force line number to 0 */
576 port
->irq
= irq
->start
;
578 port
->mapbase
= reg
->start
;
580 port
->membase
= devm_ioremap_resource(&pdev
->dev
, reg
);
581 if (IS_ERR(port
->membase
))
582 return -PTR_ERR(port
->membase
);
584 data
= devm_kzalloc(&pdev
->dev
, sizeof(struct mvebu_uart_data
),
591 port
->private_data
= data
;
592 platform_set_drvdata(pdev
, data
);
594 ret
= uart_add_one_port(&mvebu_uart_driver
, port
);
600 /* Match table for of_platform binding */
601 static const struct of_device_id mvebu_uart_of_match
[] = {
602 { .compatible
= "marvell,armada-3700-uart", },
606 static struct platform_driver mvebu_uart_platform_driver
= {
607 .probe
= mvebu_uart_probe
,
609 .name
= "mvebu-uart",
610 .of_match_table
= of_match_ptr(mvebu_uart_of_match
),
611 .suppress_bind_attrs
= true,
615 static int __init
mvebu_uart_init(void)
619 ret
= uart_register_driver(&mvebu_uart_driver
);
623 ret
= platform_driver_register(&mvebu_uart_platform_driver
);
625 uart_unregister_driver(&mvebu_uart_driver
);
629 arch_initcall(mvebu_uart_init
);