|
@@ -461,42 +461,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;
|
|
@@ -542,16 +506,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;
|
|
@@ -570,8 +524,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;
|
|
@@ -1679,23 +1631,7 @@ static irqreturn_t serial8250_interrupt(int irq, void *dev_id)
|
|
|
port = &up->port;
|
|
|
|
|
|
if (port->handle_irq(port)) {
|
|
|
-
|
|
|
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;
|
|
@@ -2592,8 +2528,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;
|
|
|
|
|
@@ -2630,8 +2564,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;
|
|
|
|