提交 c627f2ce 编写于 作者: K Kevin Cernekee 提交者: Rob Herring

serial: 8250: Add support for big-endian MMIO accesses

Add cases for UPIO_MEM32BE wherever there are currently cases handling
UPIO_MEM32.
Signed-off-by: NKevin Cernekee <cernekee@gmail.com>
Reviewed-by: NPeter Hurley <peter@hurleysoftware.com>
Acked-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: NRob Herring <robh@kernel.org>
上级 65a71007
...@@ -439,6 +439,18 @@ static unsigned int mem32_serial_in(struct uart_port *p, int offset) ...@@ -439,6 +439,18 @@ static unsigned int mem32_serial_in(struct uart_port *p, int offset)
return readl(p->membase + offset); return readl(p->membase + offset);
} }
static void mem32be_serial_out(struct uart_port *p, int offset, int value)
{
offset = offset << p->regshift;
iowrite32be(value, p->membase + offset);
}
static unsigned int mem32be_serial_in(struct uart_port *p, int offset)
{
offset = offset << p->regshift;
return ioread32be(p->membase + offset);
}
static unsigned int io_serial_in(struct uart_port *p, int offset) static unsigned int io_serial_in(struct uart_port *p, int offset)
{ {
offset = offset << p->regshift; offset = offset << p->regshift;
...@@ -477,6 +489,11 @@ static void set_io_from_upio(struct uart_port *p) ...@@ -477,6 +489,11 @@ static void set_io_from_upio(struct uart_port *p)
p->serial_out = mem32_serial_out; p->serial_out = mem32_serial_out;
break; break;
case UPIO_MEM32BE:
p->serial_in = mem32be_serial_in;
p->serial_out = mem32be_serial_out;
break;
#if defined(CONFIG_MIPS_ALCHEMY) || defined(CONFIG_SERIAL_8250_RT288X) #if defined(CONFIG_MIPS_ALCHEMY) || defined(CONFIG_SERIAL_8250_RT288X)
case UPIO_AU: case UPIO_AU:
p->serial_in = au_serial_in; p->serial_in = au_serial_in;
...@@ -502,6 +519,7 @@ serial_port_out_sync(struct uart_port *p, int offset, int value) ...@@ -502,6 +519,7 @@ serial_port_out_sync(struct uart_port *p, int offset, int value)
switch (p->iotype) { switch (p->iotype) {
case UPIO_MEM: case UPIO_MEM:
case UPIO_MEM32: case UPIO_MEM32:
case UPIO_MEM32BE:
case UPIO_AU: case UPIO_AU:
p->serial_out(p, offset, value); p->serial_out(p, offset, value);
p->serial_in(p, UART_LCR); /* safe, no side-effects */ p->serial_in(p, UART_LCR); /* safe, no side-effects */
...@@ -2743,6 +2761,7 @@ static int serial8250_request_std_resource(struct uart_8250_port *up) ...@@ -2743,6 +2761,7 @@ static int serial8250_request_std_resource(struct uart_8250_port *up)
case UPIO_AU: case UPIO_AU:
case UPIO_TSI: case UPIO_TSI:
case UPIO_MEM32: case UPIO_MEM32:
case UPIO_MEM32BE:
case UPIO_MEM: case UPIO_MEM:
if (!port->mapbase) if (!port->mapbase)
break; break;
...@@ -2779,6 +2798,7 @@ static void serial8250_release_std_resource(struct uart_8250_port *up) ...@@ -2779,6 +2798,7 @@ static void serial8250_release_std_resource(struct uart_8250_port *up)
case UPIO_AU: case UPIO_AU:
case UPIO_TSI: case UPIO_TSI:
case UPIO_MEM32: case UPIO_MEM32:
case UPIO_MEM32BE:
case UPIO_MEM: case UPIO_MEM:
if (!port->mapbase) if (!port->mapbase)
break; break;
......
...@@ -45,6 +45,8 @@ unsigned int __weak __init serial8250_early_in(struct uart_port *port, int offse ...@@ -45,6 +45,8 @@ unsigned int __weak __init serial8250_early_in(struct uart_port *port, int offse
return readb(port->membase + offset); return readb(port->membase + offset);
case UPIO_MEM32: case UPIO_MEM32:
return readl(port->membase + (offset << 2)); return readl(port->membase + (offset << 2));
case UPIO_MEM32BE:
return ioread32be(port->membase + (offset << 2));
case UPIO_PORT: case UPIO_PORT:
return inb(port->iobase + offset); return inb(port->iobase + offset);
default: default:
...@@ -61,6 +63,9 @@ void __weak __init serial8250_early_out(struct uart_port *port, int offset, int ...@@ -61,6 +63,9 @@ void __weak __init serial8250_early_out(struct uart_port *port, int offset, int
case UPIO_MEM32: case UPIO_MEM32:
writel(value, port->membase + (offset << 2)); writel(value, port->membase + (offset << 2));
break; break;
case UPIO_MEM32BE:
iowrite32be(value, port->membase + (offset << 2));
break;
case UPIO_PORT: case UPIO_PORT:
outb(value, port->iobase + offset); outb(value, port->iobase + offset);
break; break;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册