|
@@ -1276,7 +1276,6 @@ static void rx_dma_timer_init(struct lpuart_port *sport)
|
|
static int lpuart_startup(struct uart_port *port)
|
|
static int lpuart_startup(struct uart_port *port)
|
|
{
|
|
{
|
|
struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
|
|
struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
|
|
- int ret;
|
|
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
unsigned char temp;
|
|
unsigned char temp;
|
|
|
|
|
|
@@ -1291,11 +1290,6 @@ static int lpuart_startup(struct uart_port *port)
|
|
sport->rxfifo_size = 0x1 << (((temp >> UARTPFIFO_RXSIZE_OFF) &
|
|
sport->rxfifo_size = 0x1 << (((temp >> UARTPFIFO_RXSIZE_OFF) &
|
|
UARTPFIFO_FIFOSIZE_MASK) + 1);
|
|
UARTPFIFO_FIFOSIZE_MASK) + 1);
|
|
|
|
|
|
- ret = devm_request_irq(port->dev, port->irq, lpuart_int, 0,
|
|
|
|
- DRIVER_NAME, sport);
|
|
|
|
- if (ret)
|
|
|
|
- return ret;
|
|
|
|
-
|
|
|
|
spin_lock_irqsave(&sport->port.lock, flags);
|
|
spin_lock_irqsave(&sport->port.lock, flags);
|
|
|
|
|
|
lpuart_setup_watermark(sport);
|
|
lpuart_setup_watermark(sport);
|
|
@@ -1333,7 +1327,6 @@ static int lpuart_startup(struct uart_port *port)
|
|
static int lpuart32_startup(struct uart_port *port)
|
|
static int lpuart32_startup(struct uart_port *port)
|
|
{
|
|
{
|
|
struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
|
|
struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
|
|
- int ret;
|
|
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
unsigned long temp;
|
|
unsigned long temp;
|
|
|
|
|
|
@@ -1346,11 +1339,6 @@ static int lpuart32_startup(struct uart_port *port)
|
|
sport->rxfifo_size = 0x1 << (((temp >> UARTFIFO_RXSIZE_OFF) &
|
|
sport->rxfifo_size = 0x1 << (((temp >> UARTFIFO_RXSIZE_OFF) &
|
|
UARTFIFO_FIFOSIZE_MASK) - 1);
|
|
UARTFIFO_FIFOSIZE_MASK) - 1);
|
|
|
|
|
|
- ret = devm_request_irq(port->dev, port->irq, lpuart32_int, 0,
|
|
|
|
- DRIVER_NAME, sport);
|
|
|
|
- if (ret)
|
|
|
|
- return ret;
|
|
|
|
-
|
|
|
|
spin_lock_irqsave(&sport->port.lock, flags);
|
|
spin_lock_irqsave(&sport->port.lock, flags);
|
|
|
|
|
|
lpuart32_setup_watermark(sport);
|
|
lpuart32_setup_watermark(sport);
|
|
@@ -1380,8 +1368,6 @@ static void lpuart_shutdown(struct uart_port *port)
|
|
|
|
|
|
spin_unlock_irqrestore(&port->lock, flags);
|
|
spin_unlock_irqrestore(&port->lock, flags);
|
|
|
|
|
|
- devm_free_irq(port->dev, port->irq, sport);
|
|
|
|
-
|
|
|
|
if (sport->lpuart_dma_rx_use) {
|
|
if (sport->lpuart_dma_rx_use) {
|
|
del_timer_sync(&sport->lpuart_timer);
|
|
del_timer_sync(&sport->lpuart_timer);
|
|
lpuart_dma_rx_free(&sport->port);
|
|
lpuart_dma_rx_free(&sport->port);
|
|
@@ -1400,7 +1386,6 @@ static void lpuart_shutdown(struct uart_port *port)
|
|
|
|
|
|
static void lpuart32_shutdown(struct uart_port *port)
|
|
static void lpuart32_shutdown(struct uart_port *port)
|
|
{
|
|
{
|
|
- struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
|
|
|
|
unsigned long temp;
|
|
unsigned long temp;
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
|
|
|
|
@@ -1413,8 +1398,6 @@ static void lpuart32_shutdown(struct uart_port *port)
|
|
lpuart32_write(port, temp, UARTCTRL);
|
|
lpuart32_write(port, temp, UARTCTRL);
|
|
|
|
|
|
spin_unlock_irqrestore(&port->lock, flags);
|
|
spin_unlock_irqrestore(&port->lock, flags);
|
|
-
|
|
|
|
- devm_free_irq(port->dev, port->irq, sport);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
static void
|
|
@@ -2212,16 +2195,22 @@ static int lpuart_probe(struct platform_device *pdev)
|
|
|
|
|
|
platform_set_drvdata(pdev, &sport->port);
|
|
platform_set_drvdata(pdev, &sport->port);
|
|
|
|
|
|
- if (lpuart_is_32(sport))
|
|
|
|
|
|
+ if (lpuart_is_32(sport)) {
|
|
lpuart_reg.cons = LPUART32_CONSOLE;
|
|
lpuart_reg.cons = LPUART32_CONSOLE;
|
|
- else
|
|
|
|
|
|
+ ret = devm_request_irq(&pdev->dev, sport->port.irq, lpuart32_int, 0,
|
|
|
|
+ DRIVER_NAME, sport);
|
|
|
|
+ } else {
|
|
lpuart_reg.cons = LPUART_CONSOLE;
|
|
lpuart_reg.cons = LPUART_CONSOLE;
|
|
|
|
+ ret = devm_request_irq(&pdev->dev, sport->port.irq, lpuart_int, 0,
|
|
|
|
+ DRIVER_NAME, sport);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (ret)
|
|
|
|
+ goto failed_irq_request;
|
|
|
|
|
|
ret = uart_add_one_port(&lpuart_reg, &sport->port);
|
|
ret = uart_add_one_port(&lpuart_reg, &sport->port);
|
|
- if (ret) {
|
|
|
|
- clk_disable_unprepare(sport->clk);
|
|
|
|
- return ret;
|
|
|
|
- }
|
|
|
|
|
|
+ if (ret)
|
|
|
|
+ goto failed_attach_port;
|
|
|
|
|
|
sport->dma_tx_chan = dma_request_slave_channel(sport->port.dev, "tx");
|
|
sport->dma_tx_chan = dma_request_slave_channel(sport->port.dev, "tx");
|
|
if (!sport->dma_tx_chan)
|
|
if (!sport->dma_tx_chan)
|
|
@@ -2240,6 +2229,11 @@ static int lpuart_probe(struct platform_device *pdev)
|
|
}
|
|
}
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
|
|
+
|
|
|
|
+failed_attach_port:
|
|
|
|
+failed_irq_request:
|
|
|
|
+ clk_disable_unprepare(sport->clk);
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
|
|
static int lpuart_remove(struct platform_device *pdev)
|
|
static int lpuart_remove(struct platform_device *pdev)
|