/** * cdns_uart_isr - Interrupt handler * @irq: Irq number * @dev_id: Id of the port * * Return: IRQHANDLED */ static irqreturn_t cdns_uart_isr(int irq, void *dev_id) { struct uart_port *port = (struct uart_port *)dev_id; unsigned long flags; unsigned int isrstatus; spin_lock_irqsave(&port->lock, flags); /* Read the interrupt status register to determine which * interrupt(s) is/are active. */ isrstatus = readl(port->membase + CDNS_UART_ISR); if (isrstatus & CDNS_UART_RX_IRQS) cdns_uart_handle_rx(port, isrstatus); if ((isrstatus & CDNS_UART_IXR_TXEMPTY) == CDNS_UART_IXR_TXEMPTY) cdns_uart_handle_tx(port); writel(isrstatus, port->membase + CDNS_UART_ISR); /* be sure to release the lock and tty before leaving */ spin_unlock_irqrestore(&port->lock, flags); return IRQ_HANDLED; }
/** * cdns_uart_start_tx - Start transmitting bytes * @port: Handle to the uart port structure */ static void cdns_uart_start_tx(struct uart_port *port) { unsigned int status; if (uart_tx_stopped(port)) return; /* * Set the TX enable bit and clear the TX disable bit to enable the * transmitter. */ status = readl(port->membase + CDNS_UART_CR); status &= ~CDNS_UART_CR_TX_DIS; status |= CDNS_UART_CR_TX_EN; writel(status, port->membase + CDNS_UART_CR); if (uart_circ_empty(&port->state->xmit)) return; cdns_uart_handle_tx(port); writel(CDNS_UART_IXR_TXEMPTY, port->membase + CDNS_UART_ISR); /* Enable the TX Empty interrupt */ writel(CDNS_UART_IXR_TXEMPTY, port->membase + CDNS_UART_IER); }
/** * cdns_uart_isr - Interrupt handler * @irq: Irq number * @dev_id: Id of the port * * Return: IRQHANDLED */ static irqreturn_t cdns_uart_isr(int irq, void *dev_id) { struct uart_port *port = (struct uart_port *)dev_id; unsigned int isrstatus; spin_lock(&port->lock); /* Read the interrupt status register to determine which * interrupt(s) is/are active and clear them. */ isrstatus = cdns_uart_readl(CDNS_UART_ISR_OFFSET); cdns_uart_writel(isrstatus, CDNS_UART_ISR_OFFSET); if (isrstatus & CDNS_UART_IXR_TXEMPTY) { cdns_uart_handle_tx(dev_id); isrstatus &= ~CDNS_UART_IXR_TXEMPTY; } if (isrstatus & CDNS_UART_IXR_MASK) cdns_uart_handle_rx(dev_id, isrstatus); spin_unlock(&port->lock); return IRQ_HANDLED; }