diff options
| author | Grant Likely <grant.likely@secretlab.ca> | 2012-02-28 13:48:58 -0600 | 
|---|---|---|
| committer | Grant Likely <grant.likely@secretlab.ca> | 2012-02-28 13:48:58 -0600 | 
| commit | b3950d50cfc343b3e7dc5c69c96a61b182fd1e37 (patch) | |
| tree | d54affae2b1e25464493b48aa88cd8d6b4770812 /drivers/tty/serial/omap-serial.c | |
| parent | daefd89efc279b142bbb054577c2d706da211723 (diff) | |
| parent | 280ad7fda5f95211857fda38960f2b6fdf6edd3e (diff) | |
| download | olio-linux-3.10-b3950d50cfc343b3e7dc5c69c96a61b182fd1e37.tar.xz olio-linux-3.10-b3950d50cfc343b3e7dc5c69c96a61b182fd1e37.zip  | |
Merge branch 'irqdomain/next' into gpio/next
Diffstat (limited to 'drivers/tty/serial/omap-serial.c')
| -rw-r--r-- | drivers/tty/serial/omap-serial.c | 30 | 
1 files changed, 25 insertions, 5 deletions
diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c index 1c242693148..f80904145fd 100644 --- a/drivers/tty/serial/omap-serial.c +++ b/drivers/tty/serial/omap-serial.c @@ -46,6 +46,13 @@  #define DEFAULT_CLK_SPEED 48000000 /* 48Mhz*/ +/* SCR register bitmasks */ +#define OMAP_UART_SCR_RX_TRIG_GRANU1_MASK		(1 << 7) + +/* FCR register bitmasks */ +#define OMAP_UART_FCR_RX_FIFO_TRIG_SHIFT		6 +#define OMAP_UART_FCR_RX_FIFO_TRIG_MASK			(0x3 << 6) +  static struct uart_omap_port *ui[OMAP_MAX_HSUART_PORTS];  /* Forward declaration of functions */ @@ -129,6 +136,7 @@ static void serial_omap_enable_ms(struct uart_port *port)  static void serial_omap_stop_tx(struct uart_port *port)  {  	struct uart_omap_port *up = (struct uart_omap_port *)port; +	struct omap_uart_port_info *pdata = up->pdev->dev.platform_data;  	if (up->use_dma &&  		up->uart_dma.tx_dma_channel != OMAP_UART_DMA_CH_FREE) { @@ -151,6 +159,9 @@ static void serial_omap_stop_tx(struct uart_port *port)  		serial_out(up, UART_IER, up->ier);  	} +	if (!up->use_dma && pdata->set_forceidle) +		pdata->set_forceidle(up->pdev); +  	pm_runtime_mark_last_busy(&up->pdev->dev);  	pm_runtime_put_autosuspend(&up->pdev->dev);  } @@ -279,6 +290,7 @@ static inline void serial_omap_enable_ier_thri(struct uart_omap_port *up)  static void serial_omap_start_tx(struct uart_port *port)  {  	struct uart_omap_port *up = (struct uart_omap_port *)port; +	struct omap_uart_port_info *pdata = up->pdev->dev.platform_data;  	struct circ_buf *xmit;  	unsigned int start;  	int ret = 0; @@ -286,6 +298,8 @@ static void serial_omap_start_tx(struct uart_port *port)  	if (!up->use_dma) {  		pm_runtime_get_sync(&up->pdev->dev);  		serial_omap_enable_ier_thri(up); +		if (pdata->set_noidle) +			pdata->set_noidle(up->pdev);  		pm_runtime_mark_last_busy(&up->pdev->dev);  		pm_runtime_put_autosuspend(&up->pdev->dev);  		return; @@ -726,8 +740,7 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,  	quot = serial_omap_get_divisor(port, baud);  	/* calculate wakeup latency constraint */ -	up->calc_latency = (1000000 * up->port.fifosize) / -				(1000 * baud / 8); +	up->calc_latency = (USEC_PER_SEC * up->port.fifosize) / (baud / 8);  	up->latency = up->calc_latency;  	schedule_work(&up->qos_work); @@ -811,14 +824,21 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,  	up->mcr = serial_in(up, UART_MCR);  	serial_out(up, UART_MCR, up->mcr | UART_MCR_TCRTLR);  	/* FIFO ENABLE, DMA MODE */ -	serial_out(up, UART_FCR, up->fcr); -	serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); + +	up->scr |= OMAP_UART_SCR_RX_TRIG_GRANU1_MASK;  	if (up->use_dma) {  		serial_out(up, UART_TI752_TLR, 0); -		up->scr |= (UART_FCR_TRIGGER_4 | UART_FCR_TRIGGER_8); +		up->scr |= UART_FCR_TRIGGER_4; +	} else { +		/* Set receive FIFO threshold to 1 byte */ +		up->fcr &= ~OMAP_UART_FCR_RX_FIFO_TRIG_MASK; +		up->fcr |= (0x1 << OMAP_UART_FCR_RX_FIFO_TRIG_SHIFT);  	} +	serial_out(up, UART_FCR, up->fcr); +	serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); +  	serial_out(up, UART_OMAP_SCR, up->scr);  	serial_out(up, UART_EFR, up->efr);  |