|
@@ -198,6 +198,7 @@ static void scc_init_portstructs(void)
|
|
|
static int mvme147_scc_init(void)
|
|
|
{
|
|
|
struct scc_port *port;
|
|
|
+ int error;
|
|
|
|
|
|
printk(KERN_INFO "SCC: MVME147 Serial Driver\n");
|
|
|
/* Init channel A */
|
|
@@ -207,14 +208,23 @@ static int mvme147_scc_init(void)
|
|
|
port->datap = port->ctrlp + 1;
|
|
|
port->port_a = &scc_ports[0];
|
|
|
port->port_b = &scc_ports[1];
|
|
|
- request_irq(MVME147_IRQ_SCCA_TX, scc_tx_int, IRQF_DISABLED,
|
|
|
+ error = request_irq(MVME147_IRQ_SCCA_TX, scc_tx_int, IRQF_DISABLED,
|
|
|
"SCC-A TX", port);
|
|
|
- request_irq(MVME147_IRQ_SCCA_STAT, scc_stat_int, IRQF_DISABLED,
|
|
|
+ if (error)
|
|
|
+ goto fail;
|
|
|
+ error = request_irq(MVME147_IRQ_SCCA_STAT, scc_stat_int, IRQF_DISABLED,
|
|
|
"SCC-A status", port);
|
|
|
- request_irq(MVME147_IRQ_SCCA_RX, scc_rx_int, IRQF_DISABLED,
|
|
|
+ if (error)
|
|
|
+ goto fail_free_a_tx;
|
|
|
+ error = request_irq(MVME147_IRQ_SCCA_RX, scc_rx_int, IRQF_DISABLED,
|
|
|
"SCC-A RX", port);
|
|
|
- request_irq(MVME147_IRQ_SCCA_SPCOND, scc_spcond_int, IRQF_DISABLED,
|
|
|
- "SCC-A special cond", port);
|
|
|
+ if (error)
|
|
|
+ goto fail_free_a_stat;
|
|
|
+ error = request_irq(MVME147_IRQ_SCCA_SPCOND, scc_spcond_int,
|
|
|
+ IRQF_DISABLED, "SCC-A special cond", port);
|
|
|
+ if (error)
|
|
|
+ goto fail_free_a_rx;
|
|
|
+
|
|
|
{
|
|
|
SCC_ACCESS_INIT(port);
|
|
|
|
|
@@ -234,14 +244,23 @@ static int mvme147_scc_init(void)
|
|
|
port->datap = port->ctrlp + 1;
|
|
|
port->port_a = &scc_ports[0];
|
|
|
port->port_b = &scc_ports[1];
|
|
|
- request_irq(MVME147_IRQ_SCCB_TX, scc_tx_int, IRQF_DISABLED,
|
|
|
+ error = request_irq(MVME147_IRQ_SCCB_TX, scc_tx_int, IRQF_DISABLED,
|
|
|
"SCC-B TX", port);
|
|
|
- request_irq(MVME147_IRQ_SCCB_STAT, scc_stat_int, IRQF_DISABLED,
|
|
|
+ if (error)
|
|
|
+ goto fail_free_a_spcond;
|
|
|
+ error = request_irq(MVME147_IRQ_SCCB_STAT, scc_stat_int, IRQF_DISABLED,
|
|
|
"SCC-B status", port);
|
|
|
- request_irq(MVME147_IRQ_SCCB_RX, scc_rx_int, IRQF_DISABLED,
|
|
|
+ if (error)
|
|
|
+ goto fail_free_b_tx;
|
|
|
+ error = request_irq(MVME147_IRQ_SCCB_RX, scc_rx_int, IRQF_DISABLED,
|
|
|
"SCC-B RX", port);
|
|
|
- request_irq(MVME147_IRQ_SCCB_SPCOND, scc_spcond_int, IRQF_DISABLED,
|
|
|
- "SCC-B special cond", port);
|
|
|
+ if (error)
|
|
|
+ goto fail_free_b_stat;
|
|
|
+ error = request_irq(MVME147_IRQ_SCCB_SPCOND, scc_spcond_int,
|
|
|
+ IRQF_DISABLED, "SCC-B special cond", port);
|
|
|
+ if (error)
|
|
|
+ goto fail_free_b_rx;
|
|
|
+
|
|
|
{
|
|
|
SCC_ACCESS_INIT(port);
|
|
|
|
|
@@ -257,6 +276,23 @@ static int mvme147_scc_init(void)
|
|
|
scc_init_drivers();
|
|
|
|
|
|
return 0;
|
|
|
+
|
|
|
+fail_free_b_rx:
|
|
|
+ free_irq(MVME147_IRQ_SCCB_RX, port);
|
|
|
+fail_free_b_stat:
|
|
|
+ free_irq(MVME147_IRQ_SCCB_STAT, port);
|
|
|
+fail_free_b_tx:
|
|
|
+ free_irq(MVME147_IRQ_SCCB_TX, port);
|
|
|
+fail_free_a_spcond:
|
|
|
+ free_irq(MVME147_IRQ_SCCA_SPCOND, port);
|
|
|
+fail_free_a_rx:
|
|
|
+ free_irq(MVME147_IRQ_SCCA_RX, port);
|
|
|
+fail_free_a_stat:
|
|
|
+ free_irq(MVME147_IRQ_SCCA_STAT, port);
|
|
|
+fail_free_a_tx:
|
|
|
+ free_irq(MVME147_IRQ_SCCA_TX, port);
|
|
|
+fail:
|
|
|
+ return error;
|
|
|
}
|
|
|
#endif
|
|
|
|
|
@@ -265,6 +301,7 @@ static int mvme147_scc_init(void)
|
|
|
static int mvme162_scc_init(void)
|
|
|
{
|
|
|
struct scc_port *port;
|
|
|
+ int error;
|
|
|
|
|
|
if (!(mvme16x_config & MVME16x_CONFIG_GOT_SCCA))
|
|
|
return (-ENODEV);
|
|
@@ -277,14 +314,23 @@ static int mvme162_scc_init(void)
|
|
|
port->datap = port->ctrlp + 2;
|
|
|
port->port_a = &scc_ports[0];
|
|
|
port->port_b = &scc_ports[1];
|
|
|
- request_irq(MVME162_IRQ_SCCA_TX, scc_tx_int, IRQF_DISABLED,
|
|
|
+ error = request_irq(MVME162_IRQ_SCCA_TX, scc_tx_int, IRQF_DISABLED,
|
|
|
"SCC-A TX", port);
|
|
|
- request_irq(MVME162_IRQ_SCCA_STAT, scc_stat_int, IRQF_DISABLED,
|
|
|
+ if (error)
|
|
|
+ goto fail;
|
|
|
+ error = request_irq(MVME162_IRQ_SCCA_STAT, scc_stat_int, IRQF_DISABLED,
|
|
|
"SCC-A status", port);
|
|
|
- request_irq(MVME162_IRQ_SCCA_RX, scc_rx_int, IRQF_DISABLED,
|
|
|
+ if (error)
|
|
|
+ goto fail_free_a_tx;
|
|
|
+ error = request_irq(MVME162_IRQ_SCCA_RX, scc_rx_int, IRQF_DISABLED,
|
|
|
"SCC-A RX", port);
|
|
|
- request_irq(MVME162_IRQ_SCCA_SPCOND, scc_spcond_int, IRQF_DISABLED,
|
|
|
- "SCC-A special cond", port);
|
|
|
+ if (error)
|
|
|
+ goto fail_free_a_stat;
|
|
|
+ error = request_irq(MVME162_IRQ_SCCA_SPCOND, scc_spcond_int,
|
|
|
+ IRQF_DISABLED, "SCC-A special cond", port);
|
|
|
+ if (error)
|
|
|
+ goto fail_free_a_rx;
|
|
|
+
|
|
|
{
|
|
|
SCC_ACCESS_INIT(port);
|
|
|
|
|
@@ -304,14 +350,22 @@ static int mvme162_scc_init(void)
|
|
|
port->datap = port->ctrlp + 2;
|
|
|
port->port_a = &scc_ports[0];
|
|
|
port->port_b = &scc_ports[1];
|
|
|
- request_irq(MVME162_IRQ_SCCB_TX, scc_tx_int, IRQF_DISABLED,
|
|
|
+ error = request_irq(MVME162_IRQ_SCCB_TX, scc_tx_int, IRQF_DISABLED,
|
|
|
"SCC-B TX", port);
|
|
|
- request_irq(MVME162_IRQ_SCCB_STAT, scc_stat_int, IRQF_DISABLED,
|
|
|
+ if (error)
|
|
|
+ goto fail_free_a_spcond;
|
|
|
+ error = request_irq(MVME162_IRQ_SCCB_STAT, scc_stat_int, IRQF_DISABLED,
|
|
|
"SCC-B status", port);
|
|
|
- request_irq(MVME162_IRQ_SCCB_RX, scc_rx_int, IRQF_DISABLED,
|
|
|
+ if (error)
|
|
|
+ goto fail_free_b_tx;
|
|
|
+ error = request_irq(MVME162_IRQ_SCCB_RX, scc_rx_int, IRQF_DISABLED,
|
|
|
"SCC-B RX", port);
|
|
|
- request_irq(MVME162_IRQ_SCCB_SPCOND, scc_spcond_int, IRQF_DISABLED,
|
|
|
- "SCC-B special cond", port);
|
|
|
+ if (error)
|
|
|
+ goto fail_free_b_stat;
|
|
|
+ error = request_irq(MVME162_IRQ_SCCB_SPCOND, scc_spcond_int,
|
|
|
+ IRQF_DISABLED, "SCC-B special cond", port);
|
|
|
+ if (error)
|
|
|
+ goto fail_free_b_rx;
|
|
|
|
|
|
{
|
|
|
SCC_ACCESS_INIT(port); /* Either channel will do */
|
|
@@ -328,6 +382,23 @@ static int mvme162_scc_init(void)
|
|
|
scc_init_drivers();
|
|
|
|
|
|
return 0;
|
|
|
+
|
|
|
+fail_free_b_rx:
|
|
|
+ free_irq(MVME162_IRQ_SCCB_RX, port);
|
|
|
+fail_free_b_stat:
|
|
|
+ free_irq(MVME162_IRQ_SCCB_STAT, port);
|
|
|
+fail_free_b_tx:
|
|
|
+ free_irq(MVME162_IRQ_SCCB_TX, port);
|
|
|
+fail_free_a_spcond:
|
|
|
+ free_irq(MVME162_IRQ_SCCA_SPCOND, port);
|
|
|
+fail_free_a_rx:
|
|
|
+ free_irq(MVME162_IRQ_SCCA_RX, port);
|
|
|
+fail_free_a_stat:
|
|
|
+ free_irq(MVME162_IRQ_SCCA_STAT, port);
|
|
|
+fail_free_a_tx:
|
|
|
+ free_irq(MVME162_IRQ_SCCA_TX, port);
|
|
|
+fail:
|
|
|
+ return error;
|
|
|
}
|
|
|
#endif
|
|
|
|
|
@@ -336,6 +407,7 @@ static int mvme162_scc_init(void)
|
|
|
static int bvme6000_scc_init(void)
|
|
|
{
|
|
|
struct scc_port *port;
|
|
|
+ int error;
|
|
|
|
|
|
printk(KERN_INFO "SCC: BVME6000 Serial Driver\n");
|
|
|
/* Init channel A */
|
|
@@ -345,14 +417,23 @@ static int bvme6000_scc_init(void)
|
|
|
port->datap = port->ctrlp + 4;
|
|
|
port->port_a = &scc_ports[0];
|
|
|
port->port_b = &scc_ports[1];
|
|
|
- request_irq(BVME_IRQ_SCCA_TX, scc_tx_int, IRQF_DISABLED,
|
|
|
+ error = request_irq(BVME_IRQ_SCCA_TX, scc_tx_int, IRQF_DISABLED,
|
|
|
"SCC-A TX", port);
|
|
|
- request_irq(BVME_IRQ_SCCA_STAT, scc_stat_int, IRQF_DISABLED,
|
|
|
+ if (error)
|
|
|
+ goto fail;
|
|
|
+ error = request_irq(BVME_IRQ_SCCA_STAT, scc_stat_int, IRQF_DISABLED,
|
|
|
"SCC-A status", port);
|
|
|
- request_irq(BVME_IRQ_SCCA_RX, scc_rx_int, IRQF_DISABLED,
|
|
|
+ if (error)
|
|
|
+ goto fail_free_a_tx;
|
|
|
+ error = request_irq(BVME_IRQ_SCCA_RX, scc_rx_int, IRQF_DISABLED,
|
|
|
"SCC-A RX", port);
|
|
|
- request_irq(BVME_IRQ_SCCA_SPCOND, scc_spcond_int, IRQF_DISABLED,
|
|
|
- "SCC-A special cond", port);
|
|
|
+ if (error)
|
|
|
+ goto fail_free_a_stat;
|
|
|
+ error = request_irq(BVME_IRQ_SCCA_SPCOND, scc_spcond_int,
|
|
|
+ IRQF_DISABLED, "SCC-A special cond", port);
|
|
|
+ if (error)
|
|
|
+ goto fail_free_a_rx;
|
|
|
+
|
|
|
{
|
|
|
SCC_ACCESS_INIT(port);
|
|
|
|
|
@@ -372,14 +453,22 @@ static int bvme6000_scc_init(void)
|
|
|
port->datap = port->ctrlp + 4;
|
|
|
port->port_a = &scc_ports[0];
|
|
|
port->port_b = &scc_ports[1];
|
|
|
- request_irq(BVME_IRQ_SCCB_TX, scc_tx_int, IRQF_DISABLED,
|
|
|
+ error = request_irq(BVME_IRQ_SCCB_TX, scc_tx_int, IRQF_DISABLED,
|
|
|
"SCC-B TX", port);
|
|
|
- request_irq(BVME_IRQ_SCCB_STAT, scc_stat_int, IRQF_DISABLED,
|
|
|
+ if (error)
|
|
|
+ goto fail_free_a_spcond;
|
|
|
+ error = request_irq(BVME_IRQ_SCCB_STAT, scc_stat_int, IRQF_DISABLED,
|
|
|
"SCC-B status", port);
|
|
|
- request_irq(BVME_IRQ_SCCB_RX, scc_rx_int, IRQF_DISABLED,
|
|
|
+ if (error)
|
|
|
+ goto fail_free_b_tx;
|
|
|
+ error = request_irq(BVME_IRQ_SCCB_RX, scc_rx_int, IRQF_DISABLED,
|
|
|
"SCC-B RX", port);
|
|
|
- request_irq(BVME_IRQ_SCCB_SPCOND, scc_spcond_int, IRQF_DISABLED,
|
|
|
- "SCC-B special cond", port);
|
|
|
+ if (error)
|
|
|
+ goto fail_free_b_stat;
|
|
|
+ error = request_irq(BVME_IRQ_SCCB_SPCOND, scc_spcond_int,
|
|
|
+ IRQF_DISABLED, "SCC-B special cond", port);
|
|
|
+ if (error)
|
|
|
+ goto fail_free_b_rx;
|
|
|
|
|
|
{
|
|
|
SCC_ACCESS_INIT(port); /* Either channel will do */
|
|
@@ -393,6 +482,23 @@ static int bvme6000_scc_init(void)
|
|
|
scc_init_drivers();
|
|
|
|
|
|
return 0;
|
|
|
+
|
|
|
+fail:
|
|
|
+ free_irq(BVME_IRQ_SCCA_STAT, port);
|
|
|
+fail_free_a_tx:
|
|
|
+ free_irq(BVME_IRQ_SCCA_RX, port);
|
|
|
+fail_free_a_stat:
|
|
|
+ free_irq(BVME_IRQ_SCCA_SPCOND, port);
|
|
|
+fail_free_a_rx:
|
|
|
+ free_irq(BVME_IRQ_SCCB_TX, port);
|
|
|
+fail_free_a_spcond:
|
|
|
+ free_irq(BVME_IRQ_SCCB_STAT, port);
|
|
|
+fail_free_b_tx:
|
|
|
+ free_irq(BVME_IRQ_SCCB_RX, port);
|
|
|
+fail_free_b_stat:
|
|
|
+ free_irq(BVME_IRQ_SCCB_SPCOND, port);
|
|
|
+fail_free_b_rx:
|
|
|
+ return error;
|
|
|
}
|
|
|
#endif
|
|
|
|