static int msp_serial_handle_irq(struct uart_port *p) { struct msp_uart_data *d = p->private_data; unsigned int iir = readb(p->membase + (UART_IIR << p->regshift)); if (serial8250_handle_irq(p, iir)) { return 1; } else if ((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. * * Note: MSP reserves 0x20 bytes of address space for the UART * and the USR is mapped in a separate block at an offset of * 0xc0 from the start of the UART. */ (void)readb(p->membase + 0xc0); writeb(d->last_lcr, p->membase + (UART_LCR << p->regshift)); return 1; } return 0; }
static int msp_serial_handle_irq(struct uart_port *p) { struct msp_uart_data *d = p->private_data; unsigned int iir = readb(p->membase + (UART_IIR << p->regshift)); if (serial8250_handle_irq(p, iir)) { return 1; } else if ((iir & UART_IIR_BUSY) == UART_IIR_BUSY) { /* */ (void)readb(p->membase + 0xc0); writeb(d->last_lcr, p->membase + (UART_LCR << p->regshift)); return 1; } return 0; }
static int dw8250_handle_irq(struct uart_port *p) { struct dw8250_data *d = p->private_data; unsigned int iir = p->serial_in(p, UART_IIR); if (serial8250_handle_irq(p, iir)) { return 1; } else if ((iir & UART_IIR_BUSY) == UART_IIR_BUSY) { /* Clear the USR */ (void)p->serial_in(p, d->usr_reg); return 1; } return 0; }
static int dw8250_handle_irq(struct uart_port *p) { struct dw8250_data *d = p->private_data; unsigned int iir = p->serial_in(p, UART_IIR); if (serial8250_handle_irq(p, iir)) { return 1; } else if ((iir & UART_IIR_BUSY) == UART_IIR_BUSY) { /* Clear the USR and write the LCR again. */ (void)p->serial_in(p, DW_UART_USR); p->serial_out(p, UART_LCR, d->last_lcr); return 1; } return 0; }
static int dw8250_handle_irq(struct uart_port *p) { struct dw8250_data *d = p->private_data; unsigned int iir = p->serial_in(p, UART_IIR); if (serial8250_handle_irq(p, iir)) { return 1; } else if ((iir & UART_IIR_BUSY) == UART_IIR_BUSY) { (void)p->serial_in(p, UART_USR); p->serial_out(p, d->last_lcr, UART_LCR); return 1; } return 0; }
static irqreturn_t omap8250_irq(int irq, void *dev_id) { struct uart_port *port = dev_id; struct uart_8250_port *up = up_to_u8250p(port); unsigned int iir; int ret; #ifdef CONFIG_SERIAL_8250_DMA if (up->dma) { ret = omap_8250_dma_handle_irq(port); return IRQ_RETVAL(ret); } #endif serial8250_rpm_get(up); iir = serial_port_in(port, UART_IIR); ret = serial8250_handle_irq(port, iir); serial8250_rpm_put(up); return IRQ_RETVAL(ret); }