diff options
-rw-r--r-- | arch/arm/mach-omap2/serial.c | 5 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/plat/omap-serial.h | 3 | ||||
-rw-r--r-- | drivers/tty/serial/omap-serial.c | 15 |
3 files changed, 14 insertions, 9 deletions
diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index 5b1b36a45e9c..5dd928945033 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c | |||
@@ -64,13 +64,15 @@ struct omap_uart_state { | |||
64 | static LIST_HEAD(uart_list); | 64 | static LIST_HEAD(uart_list); |
65 | static u8 num_uarts; | 65 | static u8 num_uarts; |
66 | 66 | ||
67 | #define DEFAULT_RXDMA_TIMEOUT 1 /* RX DMA polling rate (us) */ | 67 | #define DEFAULT_RXDMA_POLLRATE 1 /* RX DMA polling rate (us) */ |
68 | #define DEFAULT_RXDMA_BUFSIZE 4096 /* RX DMA buffer size */ | 68 | #define DEFAULT_RXDMA_BUFSIZE 4096 /* RX DMA buffer size */ |
69 | #define DEFAULT_RXDMA_TIMEOUT (3 * HZ)/* RX DMA timeout (jiffies) */ | ||
69 | 70 | ||
70 | static struct omap_uart_port_info omap_serial_default_info[] __initdata = { | 71 | static struct omap_uart_port_info omap_serial_default_info[] __initdata = { |
71 | { | 72 | { |
72 | .dma_enabled = false, | 73 | .dma_enabled = false, |
73 | .dma_rx_buf_size = DEFAULT_RXDMA_BUFSIZE, | 74 | .dma_rx_buf_size = DEFAULT_RXDMA_BUFSIZE, |
75 | .dma_rx_poll_rate = DEFAULT_RXDMA_POLLRATE, | ||
74 | .dma_rx_timeout = DEFAULT_RXDMA_TIMEOUT, | 76 | .dma_rx_timeout = DEFAULT_RXDMA_TIMEOUT, |
75 | .autosuspend_timeout = DEFAULT_AUTOSUSPEND_DELAY, | 77 | .autosuspend_timeout = DEFAULT_AUTOSUSPEND_DELAY, |
76 | }, | 78 | }, |
@@ -351,6 +353,7 @@ void __init omap_serial_init_port(struct omap_board_data *bdata, | |||
351 | omap_up.enable_wakeup = omap_uart_enable_wakeup; | 353 | omap_up.enable_wakeup = omap_uart_enable_wakeup; |
352 | omap_up.dma_rx_buf_size = info->dma_rx_buf_size; | 354 | omap_up.dma_rx_buf_size = info->dma_rx_buf_size; |
353 | omap_up.dma_rx_timeout = info->dma_rx_timeout; | 355 | omap_up.dma_rx_timeout = info->dma_rx_timeout; |
356 | omap_up.dma_rx_poll_rate = info->dma_rx_poll_rate; | ||
354 | omap_up.autosuspend_timeout = info->autosuspend_timeout; | 357 | omap_up.autosuspend_timeout = info->autosuspend_timeout; |
355 | 358 | ||
356 | /* Enable the MDR1 Errata i202 for OMAP2430/3xxx/44xx */ | 359 | /* Enable the MDR1 Errata i202 for OMAP2430/3xxx/44xx */ |
diff --git a/arch/arm/plat-omap/include/plat/omap-serial.h b/arch/arm/plat-omap/include/plat/omap-serial.h index a740a6c0e104..ea63b2bc761c 100644 --- a/arch/arm/plat-omap/include/plat/omap-serial.h +++ b/arch/arm/plat-omap/include/plat/omap-serial.h | |||
@@ -53,7 +53,6 @@ | |||
53 | 53 | ||
54 | #define OMAP_UART_DMA_CH_FREE -1 | 54 | #define OMAP_UART_DMA_CH_FREE -1 |
55 | 55 | ||
56 | #define RX_TIMEOUT (3 * HZ) | ||
57 | #define OMAP_MAX_HSUART_PORTS 4 | 56 | #define OMAP_MAX_HSUART_PORTS 4 |
58 | 57 | ||
59 | #define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA | 58 | #define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA |
@@ -69,6 +68,7 @@ struct omap_uart_port_info { | |||
69 | unsigned int dma_rx_buf_size; | 68 | unsigned int dma_rx_buf_size; |
70 | unsigned int dma_rx_timeout; | 69 | unsigned int dma_rx_timeout; |
71 | unsigned int autosuspend_timeout; | 70 | unsigned int autosuspend_timeout; |
71 | unsigned int dma_rx_poll_rate; | ||
72 | 72 | ||
73 | int (*get_context_loss_count)(struct device *); | 73 | int (*get_context_loss_count)(struct device *); |
74 | void (*set_forceidle)(struct platform_device *); | 74 | void (*set_forceidle)(struct platform_device *); |
@@ -98,6 +98,7 @@ struct uart_omap_dma { | |||
98 | /* timer to poll activity on rx dma */ | 98 | /* timer to poll activity on rx dma */ |
99 | struct timer_list rx_timer; | 99 | struct timer_list rx_timer; |
100 | unsigned int rx_buf_size; | 100 | unsigned int rx_buf_size; |
101 | unsigned int rx_poll_rate; | ||
101 | unsigned int rx_timeout; | 102 | unsigned int rx_timeout; |
102 | }; | 103 | }; |
103 | 104 | ||
diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c index d60e001cf60f..e1eaa66c047b 100644 --- a/drivers/tty/serial/omap-serial.c +++ b/drivers/tty/serial/omap-serial.c | |||
@@ -47,7 +47,7 @@ static struct uart_omap_port *ui[OMAP_MAX_HSUART_PORTS]; | |||
47 | 47 | ||
48 | /* Forward declaration of functions */ | 48 | /* Forward declaration of functions */ |
49 | static void uart_tx_dma_callback(int lch, u16 ch_status, void *data); | 49 | static void uart_tx_dma_callback(int lch, u16 ch_status, void *data); |
50 | static void serial_omap_rx_timeout(unsigned long uart_no); | 50 | static void serial_omap_rxdma_poll(unsigned long uart_no); |
51 | static int serial_omap_start_rxdma(struct uart_omap_port *up); | 51 | static int serial_omap_start_rxdma(struct uart_omap_port *up); |
52 | static void serial_omap_mdr1_errataset(struct uart_omap_port *up, u8 mdr1); | 52 | static void serial_omap_mdr1_errataset(struct uart_omap_port *up, u8 mdr1); |
53 | 53 | ||
@@ -542,7 +542,7 @@ static int serial_omap_startup(struct uart_port *port) | |||
542 | (dma_addr_t *)&(up->uart_dma.tx_buf_dma_phys), | 542 | (dma_addr_t *)&(up->uart_dma.tx_buf_dma_phys), |
543 | 0); | 543 | 0); |
544 | init_timer(&(up->uart_dma.rx_timer)); | 544 | init_timer(&(up->uart_dma.rx_timer)); |
545 | up->uart_dma.rx_timer.function = serial_omap_rx_timeout; | 545 | up->uart_dma.rx_timer.function = serial_omap_rxdma_poll; |
546 | up->uart_dma.rx_timer.data = up->pdev->id; | 546 | up->uart_dma.rx_timer.data = up->pdev->id; |
547 | /* Currently the buffer size is 4KB. Can increase it */ | 547 | /* Currently the buffer size is 4KB. Can increase it */ |
548 | up->uart_dma.rx_buf = dma_alloc_coherent(NULL, | 548 | up->uart_dma.rx_buf = dma_alloc_coherent(NULL, |
@@ -1160,7 +1160,7 @@ static int serial_omap_resume(struct device *dev) | |||
1160 | } | 1160 | } |
1161 | #endif | 1161 | #endif |
1162 | 1162 | ||
1163 | static void serial_omap_rx_timeout(unsigned long uart_no) | 1163 | static void serial_omap_rxdma_poll(unsigned long uart_no) |
1164 | { | 1164 | { |
1165 | struct uart_omap_port *up = ui[uart_no]; | 1165 | struct uart_omap_port *up = ui[uart_no]; |
1166 | unsigned int curr_dma_pos, curr_transmitted_size; | 1166 | unsigned int curr_dma_pos, curr_transmitted_size; |
@@ -1170,9 +1170,9 @@ static void serial_omap_rx_timeout(unsigned long uart_no) | |||
1170 | if ((curr_dma_pos == up->uart_dma.prev_rx_dma_pos) || | 1170 | if ((curr_dma_pos == up->uart_dma.prev_rx_dma_pos) || |
1171 | (curr_dma_pos == 0)) { | 1171 | (curr_dma_pos == 0)) { |
1172 | if (jiffies_to_msecs(jiffies - up->port_activity) < | 1172 | if (jiffies_to_msecs(jiffies - up->port_activity) < |
1173 | RX_TIMEOUT) { | 1173 | up->uart_dma.rx_timeout) { |
1174 | mod_timer(&up->uart_dma.rx_timer, jiffies + | 1174 | mod_timer(&up->uart_dma.rx_timer, jiffies + |
1175 | usecs_to_jiffies(up->uart_dma.rx_timeout)); | 1175 | usecs_to_jiffies(up->uart_dma.rx_poll_rate)); |
1176 | } else { | 1176 | } else { |
1177 | serial_omap_stop_rxdma(up); | 1177 | serial_omap_stop_rxdma(up); |
1178 | up->ier |= (UART_IER_RDI | UART_IER_RLSI); | 1178 | up->ier |= (UART_IER_RDI | UART_IER_RLSI); |
@@ -1201,7 +1201,7 @@ static void serial_omap_rx_timeout(unsigned long uart_no) | |||
1201 | } | 1201 | } |
1202 | } else { | 1202 | } else { |
1203 | mod_timer(&up->uart_dma.rx_timer, jiffies + | 1203 | mod_timer(&up->uart_dma.rx_timer, jiffies + |
1204 | usecs_to_jiffies(up->uart_dma.rx_timeout)); | 1204 | usecs_to_jiffies(up->uart_dma.rx_poll_rate)); |
1205 | } | 1205 | } |
1206 | up->port_activity = jiffies; | 1206 | up->port_activity = jiffies; |
1207 | } | 1207 | } |
@@ -1240,7 +1240,7 @@ static int serial_omap_start_rxdma(struct uart_omap_port *up) | |||
1240 | /* FIXME: Cache maintenance needed here? */ | 1240 | /* FIXME: Cache maintenance needed here? */ |
1241 | omap_start_dma(up->uart_dma.rx_dma_channel); | 1241 | omap_start_dma(up->uart_dma.rx_dma_channel); |
1242 | mod_timer(&up->uart_dma.rx_timer, jiffies + | 1242 | mod_timer(&up->uart_dma.rx_timer, jiffies + |
1243 | usecs_to_jiffies(up->uart_dma.rx_timeout)); | 1243 | usecs_to_jiffies(up->uart_dma.rx_poll_rate)); |
1244 | up->uart_dma.rx_dma_used = true; | 1244 | up->uart_dma.rx_dma_used = true; |
1245 | return ret; | 1245 | return ret; |
1246 | } | 1246 | } |
@@ -1376,6 +1376,7 @@ static int serial_omap_probe(struct platform_device *pdev) | |||
1376 | up->use_dma = 1; | 1376 | up->use_dma = 1; |
1377 | up->uart_dma.rx_buf_size = omap_up_info->dma_rx_buf_size; | 1377 | up->uart_dma.rx_buf_size = omap_up_info->dma_rx_buf_size; |
1378 | up->uart_dma.rx_timeout = omap_up_info->dma_rx_timeout; | 1378 | up->uart_dma.rx_timeout = omap_up_info->dma_rx_timeout; |
1379 | up->uart_dma.rx_poll_rate = omap_up_info->dma_rx_poll_rate; | ||
1379 | spin_lock_init(&(up->uart_dma.tx_lock)); | 1380 | spin_lock_init(&(up->uart_dma.tx_lock)); |
1380 | spin_lock_init(&(up->uart_dma.rx_lock)); | 1381 | spin_lock_init(&(up->uart_dma.rx_lock)); |
1381 | up->uart_dma.tx_dma_channel = OMAP_UART_DMA_CH_FREE; | 1382 | up->uart_dma.tx_dma_channel = OMAP_UART_DMA_CH_FREE; |