|
@@ -1109,37 +1109,6 @@ static int imx_startup(struct uart_port *port)
|
|
|
while (!(readl(sport->port.membase + UCR2) & UCR2_SRST) && (--i > 0))
|
|
|
udelay(1);
|
|
|
|
|
|
- /*
|
|
|
- * Allocate the IRQ(s) i.MX1 has three interrupts whereas later
|
|
|
- * chips only have one interrupt.
|
|
|
- */
|
|
|
- if (sport->txirq > 0) {
|
|
|
- retval = request_irq(sport->rxirq, imx_rxint, 0,
|
|
|
- dev_name(port->dev), sport);
|
|
|
- if (retval)
|
|
|
- goto error_out1;
|
|
|
-
|
|
|
- retval = request_irq(sport->txirq, imx_txint, 0,
|
|
|
- dev_name(port->dev), sport);
|
|
|
- if (retval)
|
|
|
- goto error_out2;
|
|
|
-
|
|
|
- /* do not use RTS IRQ on IrDA */
|
|
|
- if (!USE_IRDA(sport)) {
|
|
|
- retval = request_irq(sport->rtsirq, imx_rtsint, 0,
|
|
|
- dev_name(port->dev), sport);
|
|
|
- if (retval)
|
|
|
- goto error_out3;
|
|
|
- }
|
|
|
- } else {
|
|
|
- retval = request_irq(sport->port.irq, imx_int, 0,
|
|
|
- dev_name(port->dev), sport);
|
|
|
- if (retval) {
|
|
|
- free_irq(sport->port.irq, sport);
|
|
|
- goto error_out1;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
spin_lock_irqsave(&sport->port.lock, flags);
|
|
|
/*
|
|
|
* Finally, clear and enable interrupts
|
|
@@ -1202,12 +1171,6 @@ static int imx_startup(struct uart_port *port)
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
-error_out3:
|
|
|
- if (sport->txirq)
|
|
|
- free_irq(sport->txirq, sport);
|
|
|
-error_out2:
|
|
|
- if (sport->rxirq)
|
|
|
- free_irq(sport->rxirq, sport);
|
|
|
error_out1:
|
|
|
return retval;
|
|
|
}
|
|
@@ -1254,17 +1217,6 @@ static void imx_shutdown(struct uart_port *port)
|
|
|
*/
|
|
|
del_timer_sync(&sport->timer);
|
|
|
|
|
|
- /*
|
|
|
- * Free the interrupts
|
|
|
- */
|
|
|
- if (sport->txirq > 0) {
|
|
|
- if (!USE_IRDA(sport))
|
|
|
- free_irq(sport->rtsirq, sport);
|
|
|
- free_irq(sport->txirq, sport);
|
|
|
- free_irq(sport->rxirq, sport);
|
|
|
- } else
|
|
|
- free_irq(sport->port.irq, sport);
|
|
|
-
|
|
|
/*
|
|
|
* Disable all interrupts, port and break condition.
|
|
|
*/
|
|
@@ -1929,6 +1881,36 @@ static int serial_imx_probe(struct platform_device *pdev)
|
|
|
|
|
|
sport->port.uartclk = clk_get_rate(sport->clk_per);
|
|
|
|
|
|
+ /*
|
|
|
+ * Allocate the IRQ(s) i.MX1 has three interrupts whereas later
|
|
|
+ * chips only have one interrupt.
|
|
|
+ */
|
|
|
+ if (sport->txirq > 0) {
|
|
|
+ ret = devm_request_irq(&pdev->dev, sport->rxirq, imx_rxint, 0,
|
|
|
+ dev_name(&pdev->dev), sport);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ ret = devm_request_irq(&pdev->dev, sport->txirq, imx_txint, 0,
|
|
|
+ dev_name(&pdev->dev), sport);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ /* do not use RTS IRQ on IrDA */
|
|
|
+ if (!USE_IRDA(sport)) {
|
|
|
+ ret = devm_request_irq(&pdev->dev, sport->rtsirq,
|
|
|
+ imx_rtsint, 0,
|
|
|
+ dev_name(&pdev->dev), sport);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ ret = devm_request_irq(&pdev->dev, sport->port.irq, imx_int, 0,
|
|
|
+ dev_name(&pdev->dev), sport);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
imx_ports[sport->port.line] = sport;
|
|
|
|
|
|
platform_set_drvdata(pdev, sport);
|