aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty/serial
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-04-24 11:46:18 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-04-24 11:46:18 -0400
commitd56a669ca59c37ed0a7282a251b2f2f22533343a (patch)
treecef7bd4699754057474cc96430864f690f1786e0 /drivers/tty/serial
parent836ee4874e201a5907f9658fb2bf3527dd952d30 (diff)
parent04fca0e390e80d88c2f959aef86e0bb7f26fea01 (diff)
Merge tag 'devicetree-for-4.1' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux
Pull second batch of devicetree updates from Rob Herring: "As Grant mentioned in the first devicetree pull request, here is the 2nd batch of DT changes for 4.1. The main remaining item here is the endianness bindings and related 8250 driver support. - DT endianness specification bindings - big-endian 8250 serial support - DT overlay unittest updates - various DT doc updates - compile fixes for OF_IRQ=n" * tag 'devicetree-for-4.1' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux: frv: add io{read,write}{16,32}be functions mn10300: add io{read,write}{16,32}be functions Documentation: DT bindings: add doc for Altera's SoCFPGA platform of: base: improve of_get_next_child() kernel-doc Doc: dt: arch_timer: discourage clock-frequency use of: unittest: overlay: Keep track of created overlays of/fdt: fix allocation size for device node path serial: of_serial: Support big-endian register accesses serial: 8250: Add support for big-endian MMIO accesses of: Document {little,big,native}-endian bindings of/fdt: Add endianness helper function for early init code of: Add helper function to check MMIO register endianness of/fdt: Remove "reg" data prints from early_init_dt_scan_memory of: add vendor prefix for Artesyn of: Add dummy of_irq_to_resource_table() for IRQ_OF=n of: OF_IRQ should depend on IRQ_DOMAIN
Diffstat (limited to 'drivers/tty/serial')
-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",