aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/tty')
-rw-r--r--drivers/tty/serial/8250/8250_core.c20
-rw-r--r--drivers/tty/serial/8250/8250_early.c5
-rw-r--r--drivers/tty/serial/of_serial.c3
3 files changed, 27 insertions, 1 deletions
diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c
index 422ebea96a64..4506e405c8f3 100644
--- a/drivers/tty/serial/8250/8250_core.c
+++ b/drivers/tty/serial/8250/8250_core.c
@@ -450,6 +450,18 @@ static unsigned int mem32_serial_in(struct uart_port *p, int offset)
450 return readl(p->membase + offset); 450 return readl(p->membase + offset);
451} 451}
452 452
453static void mem32be_serial_out(struct uart_port *p, int offset, int value)
454{
455 offset = offset << p->regshift;
456 iowrite32be(value, p->membase + offset);
457}
458
459static unsigned int mem32be_serial_in(struct uart_port *p, int offset)
460{
461 offset = offset << p->regshift;
462 return ioread32be(p->membase + offset);
463}
464
453static unsigned int io_serial_in(struct uart_port *p, int offset) 465static unsigned int io_serial_in(struct uart_port *p, int offset)
454{ 466{
455 offset = offset << p->regshift; 467 offset = offset << p->regshift;
@@ -488,6 +500,11 @@ static void set_io_from_upio(struct uart_port *p)
488 p->serial_out = mem32_serial_out; 500 p->serial_out = mem32_serial_out;
489 break; 501 break;
490 502
503 case UPIO_MEM32BE:
504 p->serial_in = mem32be_serial_in;
505 p->serial_out = mem32be_serial_out;
506 break;
507
491#if defined(CONFIG_MIPS_ALCHEMY) || defined(CONFIG_SERIAL_8250_RT288X) 508#if defined(CONFIG_MIPS_ALCHEMY) || defined(CONFIG_SERIAL_8250_RT288X)
492 case UPIO_AU: 509 case UPIO_AU:
493 p->serial_in = au_serial_in; 510 p->serial_in = au_serial_in;
@@ -513,6 +530,7 @@ serial_port_out_sync(struct uart_port *p, int offset, int value)
513 switch (p->iotype) { 530 switch (p->iotype) {
514 case UPIO_MEM: 531 case UPIO_MEM:
515 case UPIO_MEM32: 532 case UPIO_MEM32:
533 case UPIO_MEM32BE:
516 case UPIO_AU: 534 case UPIO_AU:
517 p->serial_out(p, offset, value); 535 p->serial_out(p, offset, value);
518 p->serial_in(p, UART_LCR); /* safe, no side-effects */ 536 p->serial_in(p, UART_LCR); /* safe, no side-effects */
@@ -2748,6 +2766,7 @@ static int serial8250_request_std_resource(struct uart_8250_port *up)
2748 case UPIO_AU: 2766 case UPIO_AU:
2749 case UPIO_TSI: 2767 case UPIO_TSI:
2750 case UPIO_MEM32: 2768 case UPIO_MEM32:
2769 case UPIO_MEM32BE:
2751 case UPIO_MEM: 2770 case UPIO_MEM:
2752 if (!port->mapbase) 2771 if (!port->mapbase)
2753 break; 2772 break;
@@ -2784,6 +2803,7 @@ static void serial8250_release_std_resource(struct uart_8250_port *up)
2784 case UPIO_AU: 2803 case UPIO_AU:
2785 case UPIO_TSI: 2804 case UPIO_TSI:
2786 case UPIO_MEM32: 2805 case UPIO_MEM32:
2806 case UPIO_MEM32BE:
2787 case UPIO_MEM: 2807 case UPIO_MEM:
2788 if (!port->mapbase) 2808 if (!port->mapbase)
2789 break; 2809 break;
diff --git a/drivers/tty/serial/8250/8250_early.c b/drivers/tty/serial/8250/8250_early.c
index 8e119682266a..6c0fd8b9d1c3 100644
--- a/drivers/tty/serial/8250/8250_early.c
+++ b/drivers/tty/serial/8250/8250_early.c
@@ -42,6 +42,8 @@ unsigned int __weak __init serial8250_early_in(struct uart_port *port, int offse
42 return readb(port->membase + offset); 42 return readb(port->membase + offset);
43 case UPIO_MEM32: 43 case UPIO_MEM32:
44 return readl(port->membase + (offset << 2)); 44 return readl(port->membase + (offset << 2));
45 case UPIO_MEM32BE:
46 return ioread32be(port->membase + (offset << 2));
45 case UPIO_PORT: 47 case UPIO_PORT:
46 return inb(port->iobase + offset); 48 return inb(port->iobase + offset);
47 default: 49 default:
@@ -58,6 +60,9 @@ void __weak __init serial8250_early_out(struct uart_port *port, int offset, int
58 case UPIO_MEM32: 60 case UPIO_MEM32:
59 writel(value, port->membase + (offset << 2)); 61 writel(value, port->membase + (offset << 2));
60 break; 62 break;
63 case UPIO_MEM32BE:
64 iowrite32be(value, port->membase + (offset << 2));
65 break;
61 case UPIO_PORT: 66 case UPIO_PORT:
62 outb(value, port->iobase + offset); 67 outb(value, port->iobase + offset);
63 break; 68 break;
diff --git a/drivers/tty/serial/of_serial.c b/drivers/tty/serial/of_serial.c
index aa00154c4a6d..5b73afb9f9f3 100644
--- a/drivers/tty/serial/of_serial.c
+++ b/drivers/tty/serial/of_serial.c
@@ -116,7 +116,8 @@ static int of_platform_serial_setup(struct platform_device *ofdev,
116 port->iotype = UPIO_MEM; 116 port->iotype = UPIO_MEM;
117 break; 117 break;
118 case 4: 118 case 4:
119 port->iotype = UPIO_MEM32; 119 port->iotype = of_device_is_big_endian(np) ?
120 UPIO_MEM32BE : UPIO_MEM32;
120 break; 121 break;
121 default: 122 default:
122 dev_warn(&ofdev->dev, "unsupported reg-io-width (%d)\n", 123 dev_warn(&ofdev->dev, "unsupported reg-io-width (%d)\n",