diff options
Diffstat (limited to 'drivers/tty')
-rw-r--r-- | drivers/tty/serial/8250/8250_core.c | 20 | ||||
-rw-r--r-- | drivers/tty/serial/8250/8250_early.c | 5 | ||||
-rw-r--r-- | drivers/tty/serial/of_serial.c | 3 |
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 | ||
453 | static 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 | |||
459 | static 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 | |||
453 | static unsigned int io_serial_in(struct uart_port *p, int offset) | 465 | static 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", |