diff options
author | Finn Thain <fthain@telegraphics.com.au> | 2016-01-03 08:05:08 +0300 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2016-01-07 05:42:52 +0300 |
commit | b6488f97d3b5b602a066956e58a1ba282456d79b (patch) | |
tree | 1ca8032c303d20869e0955f962c3747fbb297322 /drivers/scsi/arm | |
parent | b01ec34895720348dab7eae6bfb28a5799130bce (diff) | |
download | linux-b6488f97d3b5b602a066956e58a1ba282456d79b.tar.xz |
ncr5380: Split NCR5380_init() into two functions
This patch splits the NCR5380_init() function into two parts, similar
to the scheme used with atari_NCR5380.c. This avoids two problems.
Firstly, NCR5380_init() may perform a bus reset, which would cause the
chip to assert IRQ. The chip is unable to mask its bus reset interrupt.
Drivers can't call request_irq() before calling NCR5380_init(), because
initialization must happen before the interrupt handler executes. If
driver initialization causes an interrupt it may be problematic on some
platforms. To avoid that, first move the bus reset code into
NCR5380_maybe_reset_bus().
Secondly, NCR5380_init() contains some board-specific interrupt setup code
for the NCR53C400 that does not belong in the core driver. In moving this
code, better not re-order interrupt initialization and bus reset. Again,
the solution is to move the bus reset code into NCR5380_maybe_reset_bus().
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Tested-by: Ondrej Zary <linux@rainbow-software.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi/arm')
-rw-r--r-- | drivers/scsi/arm/cumana_1.c | 2 | ||||
-rw-r--r-- | drivers/scsi/arm/oak.c | 2 |
2 files changed, 4 insertions, 0 deletions
diff --git a/drivers/scsi/arm/cumana_1.c b/drivers/scsi/arm/cumana_1.c index 8996a6ccc08f..c7dc65e39cdb 100644 --- a/drivers/scsi/arm/cumana_1.c +++ b/drivers/scsi/arm/cumana_1.c @@ -240,6 +240,8 @@ static int cumanascsi1_probe(struct expansion_card *ec, NCR5380_init(host, 0); + NCR5380_maybe_reset_bus(host); + priv(host)->ctrl = 0; writeb(0, priv(host)->base + CTRL); diff --git a/drivers/scsi/arm/oak.c b/drivers/scsi/arm/oak.c index aa5310bef9b7..ca0f31d22f43 100644 --- a/drivers/scsi/arm/oak.c +++ b/drivers/scsi/arm/oak.c @@ -145,6 +145,8 @@ static int oakscsi_probe(struct expansion_card *ec, const struct ecard_id *id) NCR5380_init(host, 0); + NCR5380_maybe_reset_bus(host); + ret = scsi_add_host(host, &ec->dev); if (ret) goto out_unmap; |