|
@@ -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);
|