merge v306 drivers sunxi_uart.c code
This commit is contained in:
parent
04434b208a
commit
6c5704361a
|
@ -88,7 +88,7 @@ static void sw_uart_release_dma_rx(struct sw_uart_port *sw_uport);
|
||||||
static int sw_uart_init_dma_rx(struct sw_uart_port *sw_uport);
|
static int sw_uart_init_dma_rx(struct sw_uart_port *sw_uport);
|
||||||
static int sw_uart_start_dma_rx(struct sw_uart_port *sw_uport);
|
static int sw_uart_start_dma_rx(struct sw_uart_port *sw_uport);
|
||||||
static void sw_uart_update_rb_addr(struct sw_uart_port *sw_uport);
|
static void sw_uart_update_rb_addr(struct sw_uart_port *sw_uport);
|
||||||
static void sw_uart_report_dma_rx(unsigned long uart);
|
static enum hrtimer_restart sw_uart_report_dma_rx(struct hrtimer *rx_hrtimer);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_SW_UART_DUMP_DATA
|
#ifdef CONFIG_SW_UART_DUMP_DATA
|
||||||
|
@ -575,7 +575,7 @@ static void sw_uart_stop_dma_rx(struct sw_uart_port *sw_uport)
|
||||||
struct sw_uart_dma *uart_dma = sw_uport->dma;
|
struct sw_uart_dma *uart_dma = sw_uport->dma;
|
||||||
|
|
||||||
if (uart_dma && uart_dma->rx_dma_used) {
|
if (uart_dma && uart_dma->rx_dma_used) {
|
||||||
del_timer(&uart_dma->rx_timer);
|
hrtimer_cancel(&sw_uport->rx_hrtimer);
|
||||||
dmaengine_terminate_all(uart_dma->dma_chan_rx);
|
dmaengine_terminate_all(uart_dma->dma_chan_rx);
|
||||||
uart_dma->rb_tail = 0;
|
uart_dma->rb_tail = 0;
|
||||||
uart_dma->rx_dma_used = 0;
|
uart_dma->rx_dma_used = 0;
|
||||||
|
@ -671,8 +671,8 @@ static int sw_uart_start_dma_rx(struct sw_uart_port *sw_uport)
|
||||||
|
|
||||||
uart_dma->rx_dma_used = 1;
|
uart_dma->rx_dma_used = 1;
|
||||||
if (uart_dma->use_timer == 1) {
|
if (uart_dma->use_timer == 1) {
|
||||||
mod_timer(&uart_dma->rx_timer,
|
hrtimer_start(&sw_uport->rx_hrtimer,
|
||||||
jiffies + msecs_to_jiffies(uart_dma->rx_timeout));
|
ns_to_ktime(uart_dma->rx_timeout), HRTIMER_MODE_REL);
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -693,15 +693,16 @@ static void sw_uart_update_rb_addr(struct sw_uart_port *sw_uport)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sw_uart_report_dma_rx(unsigned long uart)
|
static enum hrtimer_restart sw_uart_report_dma_rx(struct hrtimer *rx_hrtimer)
|
||||||
{
|
{
|
||||||
int count, flip = 0;
|
int count, flip = 0;
|
||||||
struct sw_uart_port *sw_uport = (struct sw_uart_port *)uart;
|
struct sw_uart_port *sw_uport = container_of(rx_hrtimer,
|
||||||
|
struct sw_uart_port, rx_hrtimer);
|
||||||
struct uart_port *port = &sw_uport->port;
|
struct uart_port *port = &sw_uport->port;
|
||||||
struct sw_uart_dma *uart_dma = sw_uport->dma;
|
struct sw_uart_dma *uart_dma = sw_uport->dma;
|
||||||
|
|
||||||
if (!uart_dma->rx_dma_used || !port->state->port.tty)
|
if (!uart_dma->rx_dma_used || !port->state->port.tty)
|
||||||
return;
|
return HRTIMER_NORESTART;
|
||||||
|
|
||||||
sw_uart_update_rb_addr(sw_uport);
|
sw_uart_update_rb_addr(sw_uport);
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -717,9 +718,12 @@ static void sw_uart_report_dma_rx(unsigned long uart)
|
||||||
(uart_dma->rb_tail + count) & (uart_dma->rb_size - 1);
|
(uart_dma->rb_tail + count) & (uart_dma->rb_size - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (uart_dma->use_timer == 1)
|
if (uart_dma->use_timer == 1) {
|
||||||
mod_timer(&uart_dma->rx_timer,
|
hrtimer_forward_now(&sw_uport->rx_hrtimer,
|
||||||
jiffies + msecs_to_jiffies(uart_dma->rx_timeout));
|
ns_to_ktime(uart_dma->rx_timeout));
|
||||||
|
}
|
||||||
|
|
||||||
|
return HRTIMER_RESTART;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1183,8 +1187,11 @@ static void sw_uart_set_termios(struct uart_port *port, struct ktermios *termios
|
||||||
#endif
|
#endif
|
||||||
/* flow control */
|
/* flow control */
|
||||||
sw_uport->mcr &= ~SUNXI_UART_MCR_AFE;
|
sw_uport->mcr &= ~SUNXI_UART_MCR_AFE;
|
||||||
if (termios->c_cflag & CRTSCTS)
|
port->status &= ~(UPSTAT_AUTOCTS | UPSTAT_AUTORTS);
|
||||||
|
if (termios->c_cflag & CRTSCTS) {
|
||||||
|
port->status |= UPSTAT_AUTOCTS | UPSTAT_AUTORTS;
|
||||||
sw_uport->mcr |= SUNXI_UART_MCR_AFE;
|
sw_uport->mcr |= SUNXI_UART_MCR_AFE;
|
||||||
|
}
|
||||||
serial_out(port, sw_uport->mcr, SUNXI_UART_MCR);
|
serial_out(port, sw_uport->mcr, SUNXI_UART_MCR);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1831,6 +1838,7 @@ static int sw_uart_probe(struct platform_device *pdev)
|
||||||
pdev->dev.init_name = sw_uport->name;
|
pdev->dev.init_name = sw_uport->name;
|
||||||
pdev->dev.platform_data = sw_uport->pdata;
|
pdev->dev.platform_data = sw_uport->pdata;
|
||||||
|
|
||||||
|
#if 0
|
||||||
snprintf(uart_para, sizeof(uart_para), "uart%d_regulator", pdev->id);
|
snprintf(uart_para, sizeof(uart_para), "uart%d_regulator", pdev->id);
|
||||||
ret = of_property_read_string(np, uart_para, &uart_string);
|
ret = of_property_read_string(np, uart_para, &uart_string);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -1844,7 +1852,7 @@ static int sw_uart_probe(struct platform_device *pdev)
|
||||||
SERIAL_MSG("uart%d error to get resource\n", pdev->id);
|
SERIAL_MSG("uart%d error to get resource\n", pdev->id);
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_EVB_PLATFORM
|
#ifdef CONFIG_EVB_PLATFORM
|
||||||
sw_uport->mclk = of_clk_get(np, 0);
|
sw_uport->mclk = of_clk_get(np, 0);
|
||||||
|
@ -1942,23 +1950,21 @@ static int sw_uart_probe(struct platform_device *pdev)
|
||||||
if (sw_uport->dma->use_dma & RX_DMA) {
|
if (sw_uport->dma->use_dma & RX_DMA) {
|
||||||
/* timer */
|
/* timer */
|
||||||
sw_uport->dma->use_timer = UART_USE_TIMER;
|
sw_uport->dma->use_timer = UART_USE_TIMER;
|
||||||
sw_uport->dma->rx_timer.function = sw_uart_report_dma_rx;
|
sw_uport->dma->rx_timeout = 2000000;
|
||||||
sw_uport->dma->rx_timer.data = (unsigned long)sw_uport;
|
hrtimer_init(&sw_uport->rx_hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
||||||
sw_uport->dma->rx_timeout = 5;
|
sw_uport->rx_hrtimer.function = sw_uart_report_dma_rx;
|
||||||
sw_uport->dma->rx_timer.expires =
|
|
||||||
jiffies + msecs_to_jiffies(sw_uport->dma->rx_timeout);
|
|
||||||
init_timer(&sw_uport->dma->rx_timer);
|
|
||||||
|
|
||||||
/* rx buffer */
|
/* rx buffer */
|
||||||
sw_uport->dma->rb_size = DMA_SERIAL_BUFFER_SIZE;
|
sw_uport->dma->rb_size = DMA_SERIAL_BUFFER_SIZE;
|
||||||
sw_uport->dma->rx_buffer = dma_alloc_coherent(
|
sw_uport->dma->rx_buffer = dma_alloc_coherent(
|
||||||
sw_uport->port.dev, sw_uport->dma->rb_size,
|
sw_uport->port.dev, sw_uport->dma->rb_size,
|
||||||
&sw_uport->dma->rx_phy_addr, DMA_MEMORY_MAP);
|
&sw_uport->dma->rx_phy_addr, GFP_KERNEL);
|
||||||
sw_uport->dma->rb_tail = 0;
|
sw_uport->dma->rb_tail = 0;
|
||||||
|
|
||||||
if (!sw_uport->dma->rx_buffer) {
|
if (!sw_uport->dma->rx_buffer) {
|
||||||
dev_info(sw_uport->port.dev,
|
dev_err(sw_uport->port.dev,
|
||||||
"dmam_alloc_coherent dma_rx_buffer fail\n");
|
"dmam_alloc_coherent dma_rx_buffer fail\n");
|
||||||
|
return -ENOMEM;
|
||||||
} else {
|
} else {
|
||||||
dev_info(sw_uport->port.dev,
|
dev_info(sw_uport->port.dev,
|
||||||
"dma_rx_buffer %p\n", sw_uport->dma->rx_buffer);
|
"dma_rx_buffer %p\n", sw_uport->dma->rx_buffer);
|
||||||
|
|
Loading…
Reference in New Issue