aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorPaul Mundt <lethal@linux-sh.org>2007-11-07 21:14:56 -0500
committerJeff Garzik <jeff@garzik.org>2007-11-08 13:08:41 -0500
commit3d46b2e2faa56d12c6d51bf1071fd11abd009d0b (patch)
treebe1b269c820068407c7f289c64948b8f8a63b8b8 /drivers
parent6004bda1cce51273ac9e71a39e680831b9ff4503 (diff)
libata: Support PIO polling-only hosts.
By default ata_host_activate() expects a valid IRQ in order to successfully register the host. This patch enables a special case for registering polling-only hosts that either don't have IRQs or have buggy IRQ generation (either in terms of handling or sensing), which otherwise work fine. Hosts that want to use polling mode can simply set ATA_FLAG_PIO_POLLING and pass in an invalid IRQ. Signed-off-by: Paul Mundt <lethal@linux-sh.org> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/ata/libata-core.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index ec3ce120a517..89fd0e9ed746 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -7178,6 +7178,10 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
7178 * request IRQ and register it. This helper takes necessasry 7178 * request IRQ and register it. This helper takes necessasry
7179 * arguments and performs the three steps in one go. 7179 * arguments and performs the three steps in one go.
7180 * 7180 *
7181 * An invalid IRQ skips the IRQ registration and expects the host to
7182 * have set polling mode on the port. In this case, @irq_handler
7183 * should be NULL.
7184 *
7181 * LOCKING: 7185 * LOCKING:
7182 * Inherited from calling layer (may sleep). 7186 * Inherited from calling layer (may sleep).
7183 * 7187 *
@@ -7194,6 +7198,12 @@ int ata_host_activate(struct ata_host *host, int irq,
7194 if (rc) 7198 if (rc)
7195 return rc; 7199 return rc;
7196 7200
7201 /* Special case for polling mode */
7202 if (!irq) {
7203 WARN_ON(irq_handler);
7204 return ata_host_register(host, sht);
7205 }
7206
7197 rc = devm_request_irq(host->dev, irq, irq_handler, irq_flags, 7207 rc = devm_request_irq(host->dev, irq, irq_handler, irq_flags,
7198 dev_driver_string(host->dev), host); 7208 dev_driver_string(host->dev), host);
7199 if (rc) 7209 if (rc)