diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/smc91x.h | 2 | ||||
-rw-r--r-- | drivers/serial/bfin_5xx.c | 19 | ||||
-rw-r--r-- | drivers/spi/spi_bfin5xx.c | 17 |
3 files changed, 28 insertions, 10 deletions
diff --git a/drivers/net/smc91x.h b/drivers/net/smc91x.h index 506bffcbc6d..f8429449dc1 100644 --- a/drivers/net/smc91x.h +++ b/drivers/net/smc91x.h @@ -58,6 +58,8 @@ #elif defined(CONFIG_BFIN) #define SMC_IRQ_FLAGS IRQF_TRIGGER_HIGH +#define RPC_LSA_DEFAULT RPC_LED_100_10 +#define RPC_LSB_DEFAULT RPC_LED_TX_RX # if defined (CONFIG_BFIN561_EZKIT) #define SMC_CAN_USE_8BIT 0 diff --git a/drivers/serial/bfin_5xx.c b/drivers/serial/bfin_5xx.c index 787dc7168f3..22569bd5d82 100644 --- a/drivers/serial/bfin_5xx.c +++ b/drivers/serial/bfin_5xx.c @@ -185,6 +185,7 @@ static void bfin_serial_rx_chars(struct bfin_serial_port *uart) uart->port.icount.brk++; if (uart_handle_break(&uart->port)) goto ignore_char; + status &= ~(PE | FE); } if (status & PE) uart->port.icount.parity++; @@ -341,6 +342,7 @@ static void bfin_serial_dma_rx_chars(struct bfin_serial_port *uart) uart->port.icount.brk++; if (uart_handle_break(&uart->port)) goto dma_ignore_char; + status &= ~(PE | FE); } if (status & PE) uart->port.icount.parity++; @@ -517,6 +519,14 @@ static void bfin_serial_mctrl_check(struct bfin_serial_port *uart) */ static void bfin_serial_break_ctl(struct uart_port *port, int break_state) { + struct bfin_serial_port *uart = (struct bfin_serial_port *)port; + u16 lcr = UART_GET_LCR(uart); + if (break_state) + lcr |= SB; + else + lcr &= ~SB; + UART_PUT_LCR(uart, lcr); + SSYNC(); } static int bfin_serial_startup(struct uart_port *port) @@ -625,11 +635,12 @@ bfin_serial_set_termios(struct uart_port *port, struct ktermios *termios, if (termios->c_cflag & CSTOPB) lcr |= STB; - if (termios->c_cflag & PARENB) { + if (termios->c_cflag & PARENB) lcr |= PEN; - if (!(termios->c_cflag & PARODD)) - lcr |= EPS; - } + if (!(termios->c_cflag & PARODD)) + lcr |= EPS; + if (termios->c_cflag & CMSPAR) + lcr |= STP; port->read_status_mask = OE; if (termios->c_iflag & INPCK) diff --git a/drivers/spi/spi_bfin5xx.c b/drivers/spi/spi_bfin5xx.c index 7d2d9ec6cac..48587c27050 100644 --- a/drivers/spi/spi_bfin5xx.c +++ b/drivers/spi/spi_bfin5xx.c @@ -582,14 +582,19 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id) dev_dbg(&drv_data->pdev->dev, "in dma_irq_handler\n"); clear_dma_irqstat(CH_SPI); + /* Wait for DMA to complete */ + while (get_dma_curr_irqstat(CH_SPI) & DMA_RUN) + continue; + /* - * wait for the last transaction shifted out. yes, these two - * while loops are supposed to be the same (see the HRM). + * wait for the last transaction shifted out. HRM states: + * at this point there may still be data in the SPI DMA FIFO waiting + * to be transmitted ... software needs to poll TXS in the SPI_STAT + * register until it goes low for 2 successive reads */ if (drv_data->tx != NULL) { - while (bfin_read_SPI_STAT() & TXS) - continue; - while (bfin_read_SPI_STAT() & TXS) + while ((bfin_read_SPI_STAT() & TXS) || + (bfin_read_SPI_STAT() & TXS)) continue; } @@ -1082,7 +1087,7 @@ static int setup(struct spi_device *spi) */ static void cleanup(struct spi_device *spi) { - struct chip_data *chip = spi_get_ctldata((struct spi_device *)spi); + struct chip_data *chip = spi_get_ctldata(spi); kfree(chip); } |