@@ -65,13 +100,16 @@ static void scif_uart_interrupt(int irq, void *data,
struct cpu_user_regs *regs)
serial_rx_interrupt(port, regs);
/* Error Interrupt */
- if ( status & SCIF_ERRORS )
- scif_writew(uart, SCIF_SCFSR, ~SCIF_ERRORS);
- if ( scif_readw(uart, SCIF_SCLSR) & SCLSR_ORER )
- scif_writew(uart, SCIF_SCLSR, 0);
+ if ( status & params->error_mask )
+ scif_writew(uart, params->status_reg, ~params->error_mask);
+ if ( params->overrun_reg != params->status_reg )
+ {
+ if ( scif_readw(uart, params->overrun_reg) & params->overrun_mask )
+ scif_writew(uart, params->overrun_reg, ~params->overrun_mask);
> + }
ctrl = scif_readw(uart, SCIF_SCSCR);
- status = scif_readw(uart, SCIF_SCFSR) & ~SCFSR_TEND;
+ status = scif_readw(uart, params->status_reg) & ~SCFSR_TEND;
/* Ignore next flag if TX Interrupt is disabled */
if ( !(ctrl & SCSCR_TIE) )
status &= ~SCFSR_TDFE;
@@ -81,12 +119,13 @@ static void scif_uart_interrupt(int irq, void *data,
struct cpu_user_regs *regs)
static void __init scif_uart_init_preirq(struct serial_port *port)
{
struct scif_uart *uart = port->uart;
+ const struct port_params *params = uart->params;
/*
* Wait until last bit has been transmitted. This is needed for a smooth
* transition when we come from early printk
*/
- while ( !(scif_readw(uart, SCIF_SCFSR) & SCFSR_TEND) );
+ while ( !(scif_readw(uart, params->status_reg) & SCFSR_TEND) );
/* Disable TX/RX parts and all interrupts */
scif_writew(uart, SCIF_SCSCR, 0);
@@ -95,10 +134,10 @@ static void __init scif_uart_init_preirq(struct
serial_port *port)
scif_writew(uart, SCIF_SCFCR, SCFCR_RFRST | SCFCR_TFRST);
/* Clear all errors and flags */
- scif_readw(uart, SCIF_SCFSR);
- scif_writew(uart, SCIF_SCFSR, 0);
- scif_readw(uart, SCIF_SCLSR);
- scif_writew(uart, SCIF_SCLSR, 0);
+ scif_readw(uart, params->status_reg);
+ scif_writew(uart, params->status_reg, 0);
+ scif_readw(uart, params->overrun_reg);
+ scif_writew(uart, params->overrun_reg, 0);
/* Setup trigger level for TX/RX FIFOs */
scif_writew(uart, SCIF_SCFCR, SCFCR_RTRG11 | SCFCR_TTRG11);
@@ -111,6 +150,7 @@ static void __init scif_uart_init_preirq(struct serial_port
*port)
static void __init scif_uart_init_postirq(struct serial_port *port)
{
struct scif_uart *uart = port->uart;
+ const struct port_params *params = uart->params;
int rc;
uart->irqaction.handler = scif_uart_interrupt;
@@ -122,14 +162,17 @@ static void __init scif_uart_init_postirq(struct
serial_port *port)
uart->irq);
/* Clear all errors */
- if ( scif_readw(uart, SCIF_SCFSR) & SCIF_ERRORS )
- scif_writew(uart, SCIF_SCFSR, ~SCIF_ERRORS);
- if ( scif_readw(uart, SCIF_SCLSR) & SCLSR_ORER )
- scif_writew(uart, SCIF_SCLSR, 0);
+ if ( scif_readw(uart, params->status_reg) & params->error_mask )
+ scif_writew(uart, params->status_reg, ~params->error_mask);
+ if ( params->overrun_reg != params->status_reg )