/* * serial core request to initialize uart and start rx operation */ static int bcm_uart_startup(struct uart_port *port) { unsigned int val; int ret; /* mask all irq and flush port */ bcm_uart_disable(port); bcm_uart_writel(port, 0, UART_IR_REG); bcm_uart_flush(port); /* clear any pending external input interrupt */ (void)bcm_uart_readl(port, UART_EXTINP_REG); /* set rx/tx fifo thresh to fifo half size */ val = bcm_uart_readl(port, UART_MCTL_REG); val &= ~(UART_MCTL_RXFIFOTHRESH_MASK | UART_MCTL_TXFIFOTHRESH_MASK); val |= (port->fifosize / 2) << UART_MCTL_RXFIFOTHRESH_SHIFT; val |= (port->fifosize / 2) << UART_MCTL_TXFIFOTHRESH_SHIFT; bcm_uart_writel(port, val, UART_MCTL_REG); /* set rx fifo timeout to 1 char time */ val = bcm_uart_readl(port, UART_CTL_REG); val &= ~UART_CTL_RXTMOUTCNT_MASK; val |= 1 << UART_CTL_RXTMOUTCNT_SHIFT; bcm_uart_writel(port, val, UART_CTL_REG); /* report any edge on dcd and cts */ val = UART_EXTINP_INT_MASK; val |= UART_EXTINP_DCD_NOSENSE_MASK; val |= UART_EXTINP_CTS_NOSENSE_MASK; bcm_uart_writel(port, val, UART_EXTINP_REG); /* register irq and enable rx interrupts */ ret = request_irq(port->irq, bcm_uart_interrupt, 0, bcm_uart_type(port), port); if (ret) return ret; bcm_uart_writel(port, UART_RX_INT_MASK, UART_IR_REG); bcm_uart_enable(port); return 0; }
static int bcm_uart_startup(struct uart_port *port) { unsigned int val; int ret; bcm_uart_disable(port); bcm_uart_writel(port, 0, UART_IR_REG); bcm_uart_flush(port); (void)bcm_uart_readl(port, UART_EXTINP_REG); val = bcm_uart_readl(port, UART_MCTL_REG); val &= ~(UART_MCTL_RXFIFOTHRESH_MASK | UART_MCTL_TXFIFOTHRESH_MASK); val |= (port->fifosize / 2) << UART_MCTL_RXFIFOTHRESH_SHIFT; val |= (port->fifosize / 2) << UART_MCTL_TXFIFOTHRESH_SHIFT; bcm_uart_writel(port, val, UART_MCTL_REG); val = bcm_uart_readl(port, UART_CTL_REG); val &= ~UART_CTL_RXTMOUTCNT_MASK; val |= 1 << UART_CTL_RXTMOUTCNT_SHIFT; bcm_uart_writel(port, val, UART_CTL_REG); val = UART_EXTINP_INT_MASK; val |= UART_EXTINP_DCD_NOSENSE_MASK; val |= UART_EXTINP_CTS_NOSENSE_MASK; bcm_uart_writel(port, val, UART_EXTINP_REG); ret = request_irq(port->irq, bcm_uart_interrupt, 0, bcm_uart_type(port), port); if (ret) return ret; bcm_uart_writel(port, UART_RX_INT_MASK, UART_IR_REG); bcm_uart_enable(port); return 0; }