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: Kevin Cernekee <cernekee@gmail.com> Reviewed-by: Peter Hurley <peter@hurleysoftware.com> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Rob Herring <robh@kernel.org>
This commit is contained in:
Родитель
65a71007a2
Коммит
c627f2ceb6
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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
|
||||||
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
|
||||||
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;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче