/* port->lock held by caller. */ static void sc26xx_start_tx(struct uart_port *port) { struct circ_buf *xmit = &port->state->xmit; while (!uart_circ_empty(xmit)) { if (!(READ_SC_PORT(port, SR) & SR_TXRDY)) { sc26xx_enable_irq(port, IMR_TXRDY); break; } WRITE_SC_PORT(port, THR, xmit->buf[xmit->tail]); xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); port->icount.tx++; } }
/* port->lock is not held. */ static int sc26xx_startup(struct uart_port *port) { sc26xx_disable_irq(port, IMR_TXRDY | IMR_RXRDY); WRITE_SC(port, OPCR, 0); /* reset tx and rx */ WRITE_SC_PORT(port, CR, CR_RES_RX); WRITE_SC_PORT(port, CR, CR_RES_TX); /* start rx/tx */ WRITE_SC_PORT(port, CR, CR_ENA_TX | CR_ENA_RX); /* enable irqs */ sc26xx_enable_irq(port, IMR_RXRDY); return 0; }
static int sc26xx_startup(struct uart_port *port) { sc26xx_disable_irq(port, IMR_TXRDY | IMR_RXRDY); WRITE_SC(port, OPCR, 0); WRITE_SC_PORT(port, CR, CR_RES_RX); WRITE_SC_PORT(port, CR, CR_RES_TX); WRITE_SC_PORT(port, CR, CR_ENA_TX | CR_ENA_RX); sc26xx_enable_irq(port, IMR_RXRDY); return 0; }