diff options
Diffstat (limited to 'drivers/tty/serial/atmel_serial.c')
-rw-r--r-- | drivers/tty/serial/atmel_serial.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c index 4e959c43f680..d58fe4763d9e 100644 --- a/drivers/tty/serial/atmel_serial.c +++ b/drivers/tty/serial/atmel_serial.c | |||
@@ -855,7 +855,7 @@ static int atmel_prepare_tx_dma(struct uart_port *port) | |||
855 | spin_lock_init(&atmel_port->lock_tx); | 855 | spin_lock_init(&atmel_port->lock_tx); |
856 | sg_init_table(&atmel_port->sg_tx, 1); | 856 | sg_init_table(&atmel_port->sg_tx, 1); |
857 | /* UART circular tx buffer is an aligned page. */ | 857 | /* UART circular tx buffer is an aligned page. */ |
858 | BUG_ON((int)port->state->xmit.buf & ~PAGE_MASK); | 858 | BUG_ON(!PAGE_ALIGNED(port->state->xmit.buf)); |
859 | sg_set_page(&atmel_port->sg_tx, | 859 | sg_set_page(&atmel_port->sg_tx, |
860 | virt_to_page(port->state->xmit.buf), | 860 | virt_to_page(port->state->xmit.buf), |
861 | UART_XMIT_SIZE, | 861 | UART_XMIT_SIZE, |
@@ -1034,10 +1034,10 @@ static int atmel_prepare_rx_dma(struct uart_port *port) | |||
1034 | spin_lock_init(&atmel_port->lock_rx); | 1034 | spin_lock_init(&atmel_port->lock_rx); |
1035 | sg_init_table(&atmel_port->sg_rx, 1); | 1035 | sg_init_table(&atmel_port->sg_rx, 1); |
1036 | /* UART circular rx buffer is an aligned page. */ | 1036 | /* UART circular rx buffer is an aligned page. */ |
1037 | BUG_ON((int)port->state->xmit.buf & ~PAGE_MASK); | 1037 | BUG_ON(!PAGE_ALIGNED(ring->buf)); |
1038 | sg_set_page(&atmel_port->sg_rx, | 1038 | sg_set_page(&atmel_port->sg_rx, |
1039 | virt_to_page(ring->buf), | 1039 | virt_to_page(ring->buf), |
1040 | ATMEL_SERIAL_RINGSIZE, | 1040 | sizeof(struct atmel_uart_char) * ATMEL_SERIAL_RINGSIZE, |
1041 | (int)ring->buf & ~PAGE_MASK); | 1041 | (int)ring->buf & ~PAGE_MASK); |
1042 | nent = dma_map_sg(port->dev, | 1042 | nent = dma_map_sg(port->dev, |
1043 | &atmel_port->sg_rx, | 1043 | &atmel_port->sg_rx, |
@@ -1554,7 +1554,7 @@ static void atmel_tasklet_func(unsigned long data) | |||
1554 | spin_unlock(&port->lock); | 1554 | spin_unlock(&port->lock); |
1555 | } | 1555 | } |
1556 | 1556 | ||
1557 | static int atmel_init_property(struct atmel_uart_port *atmel_port, | 1557 | static void atmel_init_property(struct atmel_uart_port *atmel_port, |
1558 | struct platform_device *pdev) | 1558 | struct platform_device *pdev) |
1559 | { | 1559 | { |
1560 | struct device_node *np = pdev->dev.of_node; | 1560 | struct device_node *np = pdev->dev.of_node; |
@@ -1595,7 +1595,6 @@ static int atmel_init_property(struct atmel_uart_port *atmel_port, | |||
1595 | atmel_port->use_dma_tx = false; | 1595 | atmel_port->use_dma_tx = false; |
1596 | } | 1596 | } |
1597 | 1597 | ||
1598 | return 0; | ||
1599 | } | 1598 | } |
1600 | 1599 | ||
1601 | static void atmel_init_rs485(struct uart_port *port, | 1600 | static void atmel_init_rs485(struct uart_port *port, |
@@ -1777,10 +1776,13 @@ static int atmel_startup(struct uart_port *port) | |||
1777 | if (retval) | 1776 | if (retval) |
1778 | goto free_irq; | 1777 | goto free_irq; |
1779 | 1778 | ||
1779 | tasklet_enable(&atmel_port->tasklet); | ||
1780 | |||
1780 | /* | 1781 | /* |
1781 | * Initialize DMA (if necessary) | 1782 | * Initialize DMA (if necessary) |
1782 | */ | 1783 | */ |
1783 | atmel_init_property(atmel_port, pdev); | 1784 | atmel_init_property(atmel_port, pdev); |
1785 | atmel_set_ops(port); | ||
1784 | 1786 | ||
1785 | if (atmel_port->prepare_rx) { | 1787 | if (atmel_port->prepare_rx) { |
1786 | retval = atmel_port->prepare_rx(port); | 1788 | retval = atmel_port->prepare_rx(port); |
@@ -1879,6 +1881,7 @@ static void atmel_shutdown(struct uart_port *port) | |||
1879 | * Clear out any scheduled tasklets before | 1881 | * Clear out any scheduled tasklets before |
1880 | * we destroy the buffers | 1882 | * we destroy the buffers |
1881 | */ | 1883 | */ |
1884 | tasklet_disable(&atmel_port->tasklet); | ||
1882 | tasklet_kill(&atmel_port->tasklet); | 1885 | tasklet_kill(&atmel_port->tasklet); |
1883 | 1886 | ||
1884 | /* | 1887 | /* |
@@ -2256,8 +2259,8 @@ static int atmel_init_port(struct atmel_uart_port *atmel_port, | |||
2256 | struct uart_port *port = &atmel_port->uart; | 2259 | struct uart_port *port = &atmel_port->uart; |
2257 | struct atmel_uart_data *pdata = dev_get_platdata(&pdev->dev); | 2260 | struct atmel_uart_data *pdata = dev_get_platdata(&pdev->dev); |
2258 | 2261 | ||
2259 | if (!atmel_init_property(atmel_port, pdev)) | 2262 | atmel_init_property(atmel_port, pdev); |
2260 | atmel_set_ops(port); | 2263 | atmel_set_ops(port); |
2261 | 2264 | ||
2262 | atmel_init_rs485(port, pdev); | 2265 | atmel_init_rs485(port, pdev); |
2263 | 2266 | ||
@@ -2272,6 +2275,7 @@ static int atmel_init_port(struct atmel_uart_port *atmel_port, | |||
2272 | 2275 | ||
2273 | tasklet_init(&atmel_port->tasklet, atmel_tasklet_func, | 2276 | tasklet_init(&atmel_port->tasklet, atmel_tasklet_func, |
2274 | (unsigned long)port); | 2277 | (unsigned long)port); |
2278 | tasklet_disable(&atmel_port->tasklet); | ||
2275 | 2279 | ||
2276 | memset(&atmel_port->rx_ring, 0, sizeof(atmel_port->rx_ring)); | 2280 | memset(&atmel_port->rx_ring, 0, sizeof(atmel_port->rx_ring)); |
2277 | 2281 | ||
@@ -2581,8 +2585,8 @@ static int atmel_init_gpios(struct atmel_uart_port *p, struct device *dev) | |||
2581 | struct gpio_desc *gpiod; | 2585 | struct gpio_desc *gpiod; |
2582 | 2586 | ||
2583 | p->gpios = mctrl_gpio_init(dev, 0); | 2587 | p->gpios = mctrl_gpio_init(dev, 0); |
2584 | if (IS_ERR_OR_NULL(p->gpios)) | 2588 | if (IS_ERR(p->gpios)) |
2585 | return -1; | 2589 | return PTR_ERR(p->gpios); |
2586 | 2590 | ||
2587 | for (i = 0; i < UART_GPIO_MAX; i++) { | 2591 | for (i = 0; i < UART_GPIO_MAX; i++) { |
2588 | gpiod = mctrl_gpio_to_gpiod(p->gpios, i); | 2592 | gpiod = mctrl_gpio_to_gpiod(p->gpios, i); |
@@ -2635,9 +2639,10 @@ static int atmel_serial_probe(struct platform_device *pdev) | |||
2635 | spin_lock_init(&port->lock_suspended); | 2639 | spin_lock_init(&port->lock_suspended); |
2636 | 2640 | ||
2637 | ret = atmel_init_gpios(port, &pdev->dev); | 2641 | ret = atmel_init_gpios(port, &pdev->dev); |
2638 | if (ret < 0) | 2642 | if (ret < 0) { |
2639 | dev_err(&pdev->dev, "%s", | 2643 | dev_err(&pdev->dev, "Failed to initialize GPIOs."); |
2640 | "Failed to initialize GPIOs. The serial port may not work as expected"); | 2644 | goto err; |
2645 | } | ||
2641 | 2646 | ||
2642 | ret = atmel_init_port(port, pdev); | 2647 | ret = atmel_init_port(port, pdev); |
2643 | if (ret) | 2648 | if (ret) |