31 #if defined(CONFIG_SERIAL_AMBA_PL010_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
35 #include <linux/module.h>
40 #include <linux/device.h>
41 #include <linux/tty.h>
43 #include <linux/serial_core.h>
44 #include <linux/serial.h>
48 #include <linux/slab.h>
54 #define SERIAL_AMBA_MAJOR 204
55 #define SERIAL_AMBA_MINOR 16
56 #define SERIAL_AMBA_NR UART_NR
58 #define AMBA_ISR_PASS_LIMIT 256
60 #define UART_RX_DATA(s) (((s) & UART01x_FR_RXFE) == 0)
61 #define UART_TX_READY(s) (((s) & UART01x_FR_TXFF) == 0)
63 #define UART_DUMMY_RSR_RX 256
64 #define UART_PORT_SIZE 64
127 uap->
port.icount.rx++;
139 uap->
port.icount.brk++;
140 if (uart_handle_break(&uap->
port))
143 uap->
port.icount.parity++;
145 uap->
port.icount.frame++;
147 uap->
port.icount.overrun++;
149 rsr &= uap->
port.read_status_mask;
151 if (rsr & UART01x_RSR_BE)
153 else if (rsr & UART01x_RSR_PE)
155 else if (rsr & UART01x_RSR_FE)
167 spin_unlock(&uap->
port.lock);
169 spin_lock(&uap->
port.lock);
177 if (uap->
port.x_char) {
179 uap->
port.icount.tx++;
180 uap->
port.x_char = 0;
184 pl010_stop_tx(&uap->
port);
188 count = uap->
port.fifosize >> 1;
192 uap->
port.icount.tx++;
195 }
while (--count > 0);
201 pl010_stop_tx(&uap->
port);
222 uap->
port.icount.dsr++;
236 spin_lock(&uap->
port.lock);
244 pl010_modem_status(uap);
248 if (pass_counter-- == 0)
257 spin_unlock(&uap->
port.lock);
276 if (status & UART01x_FR_DCD)
278 if (status & UART01x_FR_DSR)
286 static void pl010_set_mctrl(
struct uart_port *port,
unsigned int mctrl)
291 uap->
data->set_mctrl(uap->
dev, uap->
port.membase, mctrl);
294 static void pl010_break_ctl(
struct uart_port *port,
int break_state)
302 if (break_state == -1)
307 spin_unlock_irqrestore(&uap->
port.lock, flags);
310 static int pl010_startup(
struct uart_port *port)
318 retval = clk_prepare_enable(uap->
clk);
345 clk_disable_unprepare(uap->
clk);
350 static void pl010_shutdown(
struct uart_port *port)
372 clk_disable_unprepare(uap->
clk);
380 unsigned int lcr_h,
old_cr;
382 unsigned int baud, quot;
411 if (uap->
port.fifosize > 1)
430 uap->
port.ignore_status_mask = 0;
470 spin_unlock_irqrestore(&uap->
port.lock, flags);
473 static void pl010_set_ldisc(
struct uart_port *port,
int new)
477 pl010_enable_ms(port);
482 static const char *pl010_type(
struct uart_port *port)
490 static void pl010_release_port(
struct uart_port *port)
498 static int pl010_request_port(
struct uart_port *port)
507 static void pl010_config_port(
struct uart_port *port,
int flags)
511 pl010_request_port(port);
530 static struct uart_ops amba_pl010_pops = {
531 .tx_empty = pl010_tx_empty,
532 .set_mctrl = pl010_set_mctrl,
533 .get_mctrl = pl010_get_mctrl,
534 .stop_tx = pl010_stop_tx,
535 .start_tx = pl010_start_tx,
536 .stop_rx = pl010_stop_rx,
537 .enable_ms = pl010_enable_ms,
538 .break_ctl = pl010_break_ctl,
539 .startup = pl010_startup,
540 .shutdown = pl010_shutdown,
541 .set_termios = pl010_set_termios,
542 .set_ldisc = pl010_set_ldisc,
544 .release_port = pl010_release_port,
545 .request_port = pl010_request_port,
546 .config_port = pl010_config_port,
547 .verify_port = pl010_verify_port,
552 #ifdef CONFIG_SERIAL_AMBA_PL010_CONSOLE
554 static void pl010_console_putchar(
struct uart_port *port,
int ch)
567 pl010_console_write(
struct console *co,
const char *
s,
unsigned int count)
597 int *parity,
int *
bits)
600 unsigned int lcr_h, quot;
618 *baud = uap->
port.uartclk / (16 * (quot + 1));
638 uap = amba_ports[co->
index];
651 pl010_console_get_options(uap, &baud, &parity, &bits);
657 static struct console amba_console = {
659 .write = pl010_console_write,
661 .setup = pl010_console_setup,
667 #define AMBA_CONSOLE &amba_console
669 #define AMBA_CONSOLE NULL
674 .driver_name =
"ttyAM",
689 if (amba_ports[i] ==
NULL)
710 if (IS_ERR(uap->
clk)) {
711 ret = PTR_ERR(uap->
clk);
716 uap->
port.mapbase = dev->
res.start;
717 uap->
port.membase = base;
720 uap->
port.fifosize = 16;
721 uap->
port.ops = &amba_pl010_pops;
725 uap->
data = dev->
dev.platform_data;
733 amba_ports[
i] =
NULL;
754 if (amba_ports[i] == uap)
755 amba_ports[
i] =
NULL;
783 static struct amba_id pl010_ids[] = {
795 .name =
"uart-pl010",
797 .id_table = pl010_ids,
798 .probe = pl010_probe,
799 .remove = pl010_remove,
800 .suspend = pl010_suspend,
801 .resume = pl010_resume,
804 static int __init pl010_init(
void)
819 static void __exit pl010_exit(
void)