mirror of
https://github.com/sjlongland/adv950.git
synced 2025-09-14 03:03:15 +10:00
8250: Remove DesignWare UART work-arounds
Again, as per 4834d028978583dfe8e1fc19f1180ceb03d8dfb7.
This commit is contained in:
parent
157b5ca846
commit
7196e3f54d
66
3.x/8250.c
66
3.x/8250.c
@ -478,42 +478,6 @@ static void tsi_serial_out(struct uart_port *p, int offset, int value)
|
||||
writeb(value, p->membase + offset);
|
||||
}
|
||||
|
||||
/* Save the LCR value so it can be re-written when a Busy Detect IRQ occurs. */
|
||||
static inline void dwapb_save_out_value(struct uart_port *p, int offset,
|
||||
int value)
|
||||
{
|
||||
struct uart_8250_port *up =
|
||||
container_of(p, struct uart_8250_port, port);
|
||||
|
||||
if (offset == UART_LCR)
|
||||
up->lcr = value;
|
||||
}
|
||||
|
||||
/* Read the IER to ensure any interrupt is cleared before returning from ISR. */
|
||||
static inline void dwapb_check_clear_ier(struct uart_port *p, int offset)
|
||||
{
|
||||
if (offset == UART_TX || offset == UART_IER)
|
||||
p->serial_in(p, UART_IER);
|
||||
}
|
||||
|
||||
static void dwapb_serial_out(struct uart_port *p, int offset, int value)
|
||||
{
|
||||
int save_offset = offset;
|
||||
offset = map_8250_out_reg(p, offset) << p->regshift;
|
||||
dwapb_save_out_value(p, save_offset, value);
|
||||
writeb(value, p->membase + offset);
|
||||
dwapb_check_clear_ier(p, save_offset);
|
||||
}
|
||||
|
||||
static void dwapb32_serial_out(struct uart_port *p, int offset, int value)
|
||||
{
|
||||
int save_offset = offset;
|
||||
offset = map_8250_out_reg(p, offset) << p->regshift;
|
||||
dwapb_save_out_value(p, save_offset, value);
|
||||
writel(value, p->membase + offset);
|
||||
dwapb_check_clear_ier(p, save_offset);
|
||||
}
|
||||
|
||||
static unsigned int io_serial_in(struct uart_port *p, int offset)
|
||||
{
|
||||
offset = map_8250_in_reg(p, offset) << p->regshift;
|
||||
@ -557,16 +521,6 @@ static void set_io_from_upio(struct uart_port *p)
|
||||
p->serial_out = tsi_serial_out;
|
||||
break;
|
||||
|
||||
case UPIO_DWAPB:
|
||||
p->serial_in = mem_serial_in;
|
||||
p->serial_out = dwapb_serial_out;
|
||||
break;
|
||||
|
||||
case UPIO_DWAPB32:
|
||||
p->serial_in = mem32_serial_in;
|
||||
p->serial_out = dwapb32_serial_out;
|
||||
break;
|
||||
|
||||
default:
|
||||
p->serial_in = io_serial_in;
|
||||
p->serial_out = io_serial_out;
|
||||
@ -584,8 +538,6 @@ serial_out_sync(struct uart_8250_port *up, int offset, int value)
|
||||
case UPIO_MEM:
|
||||
case UPIO_MEM32:
|
||||
case UPIO_AU:
|
||||
case UPIO_DWAPB:
|
||||
case UPIO_DWAPB32:
|
||||
p->serial_out(p, offset, value);
|
||||
p->serial_in(p, UART_LCR); /* safe, no side-effects */
|
||||
break;
|
||||
@ -1755,20 +1707,6 @@ static irqreturn_t serial8250_interrupt(int irq, void *dev_id)
|
||||
|
||||
handled = 1;
|
||||
|
||||
end = NULL;
|
||||
} else if ((up->port.iotype == UPIO_DWAPB ||
|
||||
up->port.iotype == UPIO_DWAPB32) &&
|
||||
(iir & UART_IIR_BUSY) == UART_IIR_BUSY) {
|
||||
/* The DesignWare APB UART has an Busy Detect (0x07)
|
||||
* interrupt meaning an LCR write attempt occurred while the
|
||||
* UART was busy. The interrupt must be cleared by reading
|
||||
* the UART status register (USR) and the LCR re-written. */
|
||||
unsigned int status;
|
||||
status = *(volatile u32 *)up->port.private_data;
|
||||
serial_out(up, UART_LCR, up->lcr);
|
||||
|
||||
handled = 1;
|
||||
|
||||
end = NULL;
|
||||
} else if (end == NULL)
|
||||
end = l;
|
||||
@ -2698,8 +2636,6 @@ static int serial8250_request_std_resource(struct uart_8250_port *up)
|
||||
case UPIO_TSI:
|
||||
case UPIO_MEM32:
|
||||
case UPIO_MEM:
|
||||
case UPIO_DWAPB:
|
||||
case UPIO_DWAPB32:
|
||||
if (!up->port.mapbase)
|
||||
break;
|
||||
|
||||
@ -2736,8 +2672,6 @@ static void serial8250_release_std_resource(struct uart_8250_port *up)
|
||||
case UPIO_TSI:
|
||||
case UPIO_MEM32:
|
||||
case UPIO_MEM:
|
||||
case UPIO_DWAPB:
|
||||
case UPIO_DWAPB32:
|
||||
if (!up->port.mapbase)
|
||||
break;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user