diff options
author | Sergei Shtylyov <sshtylyov@ru.mvista.com> | 2010-05-07 14:49:02 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2010-05-14 17:35:52 -0400 |
commit | e42a542ba9cca594897176020445023c54d903d6 (patch) | |
tree | b2a136581d6fcea9a2a6c534888319b70e15c2af | |
parent | 41dec29bcb05eb8ec396f70ce791c6e3e4ce4712 (diff) |
libata: make sff_irq_on() method optional
Now, with the introduction of the sff_set_devctl() method, we can
use it in sff_irq_on() method too -- that way its implementations
in 'pata_bf54x' and 'pata_scc' become virtually identical to
ata_sff_irq_on(). The sff_irq_on() method now becomes quite
superfluous, and the only reason not to remove it completely is
the existence of the 'pata_octeon_cf' driver which implements it
as an empty function. Just make the method optional then, with
ata_sff_irq_on() becoming generic taskfile-bound function, still
global for the 'pata_bf54x' driver to be able to call it from its
thaw() and postreset() methods.
While at it, make the sff_irq_on() method and ata_sff_irq_on() return
'void' as the result is always ignored anyway.
Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
-rw-r--r-- | drivers/ata/libata-sff.c | 26 | ||||
-rw-r--r-- | drivers/ata/pata_bf54x.c | 29 | ||||
-rw-r--r-- | drivers/ata/pata_octeon_cf.c | 3 | ||||
-rw-r--r-- | drivers/ata/pata_scc.c | 24 | ||||
-rw-r--r-- | include/linux/libata.h | 4 |
5 files changed, 20 insertions, 66 deletions
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index 31b495fcd969..b7f7f8557fee 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c | |||
@@ -63,7 +63,6 @@ const struct ata_port_operations ata_sff_port_ops = { | |||
63 | .sff_tf_read = ata_sff_tf_read, | 63 | .sff_tf_read = ata_sff_tf_read, |
64 | .sff_exec_command = ata_sff_exec_command, | 64 | .sff_exec_command = ata_sff_exec_command, |
65 | .sff_data_xfer = ata_sff_data_xfer, | 65 | .sff_data_xfer = ata_sff_data_xfer, |
66 | .sff_irq_on = ata_sff_irq_on, | ||
67 | .sff_irq_clear = ata_sff_irq_clear, | 66 | .sff_irq_clear = ata_sff_irq_clear, |
68 | 67 | ||
69 | .lost_interrupt = ata_sff_lost_interrupt, | 68 | .lost_interrupt = ata_sff_lost_interrupt, |
@@ -538,24 +537,29 @@ void ata_dev_select(struct ata_port *ap, unsigned int device, | |||
538 | * Enable interrupts on a legacy IDE device using MMIO or PIO, | 537 | * Enable interrupts on a legacy IDE device using MMIO or PIO, |
539 | * wait for idle, clear any pending interrupts. | 538 | * wait for idle, clear any pending interrupts. |
540 | * | 539 | * |
540 | * Note: may NOT be used as the sff_irq_on() entry in | ||
541 | * ata_port_operations. | ||
542 | * | ||
541 | * LOCKING: | 543 | * LOCKING: |
542 | * Inherited from caller. | 544 | * Inherited from caller. |
543 | */ | 545 | */ |
544 | u8 ata_sff_irq_on(struct ata_port *ap) | 546 | void ata_sff_irq_on(struct ata_port *ap) |
545 | { | 547 | { |
546 | struct ata_ioports *ioaddr = &ap->ioaddr; | 548 | struct ata_ioports *ioaddr = &ap->ioaddr; |
547 | u8 tmp; | 549 | |
550 | if (ap->ops->sff_irq_on) { | ||
551 | ap->ops->sff_irq_on(ap); | ||
552 | return; | ||
553 | } | ||
548 | 554 | ||
549 | ap->ctl &= ~ATA_NIEN; | 555 | ap->ctl &= ~ATA_NIEN; |
550 | ap->last_ctl = ap->ctl; | 556 | ap->last_ctl = ap->ctl; |
551 | 557 | ||
552 | if (ioaddr->ctl_addr) | 558 | if (ap->ops->sff_set_devctl || ioaddr->ctl_addr) |
553 | iowrite8(ap->ctl, ioaddr->ctl_addr); | 559 | ata_sff_set_devctl(ap, ap->ctl); |
554 | tmp = ata_wait_idle(ap); | 560 | ata_wait_idle(ap); |
555 | 561 | ||
556 | ap->ops->sff_irq_clear(ap); | 562 | ap->ops->sff_irq_clear(ap); |
557 | |||
558 | return tmp; | ||
559 | } | 563 | } |
560 | EXPORT_SYMBOL_GPL(ata_sff_irq_on); | 564 | EXPORT_SYMBOL_GPL(ata_sff_irq_on); |
561 | 565 | ||
@@ -1186,7 +1190,7 @@ static void ata_hsm_qc_complete(struct ata_queued_cmd *qc, int in_wq) | |||
1186 | qc = ata_qc_from_tag(ap, qc->tag); | 1190 | qc = ata_qc_from_tag(ap, qc->tag); |
1187 | if (qc) { | 1191 | if (qc) { |
1188 | if (likely(!(qc->err_mask & AC_ERR_HSM))) { | 1192 | if (likely(!(qc->err_mask & AC_ERR_HSM))) { |
1189 | ap->ops->sff_irq_on(ap); | 1193 | ata_sff_irq_on(ap); |
1190 | ata_qc_complete(qc); | 1194 | ata_qc_complete(qc); |
1191 | } else | 1195 | } else |
1192 | ata_port_freeze(ap); | 1196 | ata_port_freeze(ap); |
@@ -1202,7 +1206,7 @@ static void ata_hsm_qc_complete(struct ata_queued_cmd *qc, int in_wq) | |||
1202 | } else { | 1206 | } else { |
1203 | if (in_wq) { | 1207 | if (in_wq) { |
1204 | spin_lock_irqsave(ap->lock, flags); | 1208 | spin_lock_irqsave(ap->lock, flags); |
1205 | ap->ops->sff_irq_on(ap); | 1209 | ata_sff_irq_on(ap); |
1206 | ata_qc_complete(qc); | 1210 | ata_qc_complete(qc); |
1207 | spin_unlock_irqrestore(ap->lock, flags); | 1211 | spin_unlock_irqrestore(ap->lock, flags); |
1208 | } else | 1212 | } else |
@@ -1946,7 +1950,7 @@ void ata_sff_thaw(struct ata_port *ap) | |||
1946 | /* clear & re-enable interrupts */ | 1950 | /* clear & re-enable interrupts */ |
1947 | ap->ops->sff_check_status(ap); | 1951 | ap->ops->sff_check_status(ap); |
1948 | ap->ops->sff_irq_clear(ap); | 1952 | ap->ops->sff_irq_clear(ap); |
1949 | ap->ops->sff_irq_on(ap); | 1953 | ata_sff_irq_on(ap); |
1950 | } | 1954 | } |
1951 | EXPORT_SYMBOL_GPL(ata_sff_thaw); | 1955 | EXPORT_SYMBOL_GPL(ata_sff_thaw); |
1952 | 1956 | ||
diff --git a/drivers/ata/pata_bf54x.c b/drivers/ata/pata_bf54x.c index 198307534d90..07c110470e25 100644 --- a/drivers/ata/pata_bf54x.c +++ b/drivers/ata/pata_bf54x.c | |||
@@ -1228,30 +1228,6 @@ static void bfin_irq_clear(struct ata_port *ap) | |||
1228 | } | 1228 | } |
1229 | 1229 | ||
1230 | /** | 1230 | /** |
1231 | * bfin_irq_on - Enable interrupts on a port. | ||
1232 | * @ap: Port on which interrupts are enabled. | ||
1233 | * | ||
1234 | * Note: Original code is ata_sff_irq_on(). | ||
1235 | */ | ||
1236 | |||
1237 | static unsigned char bfin_irq_on(struct ata_port *ap) | ||
1238 | { | ||
1239 | void __iomem *base = (void __iomem *)ap->ioaddr.ctl_addr; | ||
1240 | u8 tmp; | ||
1241 | |||
1242 | dev_dbg(ap->dev, "in atapi irq on\n"); | ||
1243 | ap->ctl &= ~ATA_NIEN; | ||
1244 | ap->last_ctl = ap->ctl; | ||
1245 | |||
1246 | write_atapi_register(base, ATA_REG_CTRL, ap->ctl); | ||
1247 | tmp = ata_wait_idle(ap); | ||
1248 | |||
1249 | bfin_irq_clear(ap); | ||
1250 | |||
1251 | return tmp; | ||
1252 | } | ||
1253 | |||
1254 | /** | ||
1255 | * bfin_thaw - Thaw DMA controller port | 1231 | * bfin_thaw - Thaw DMA controller port |
1256 | * @ap: port to thaw | 1232 | * @ap: port to thaw |
1257 | * | 1233 | * |
@@ -1262,7 +1238,7 @@ void bfin_thaw(struct ata_port *ap) | |||
1262 | { | 1238 | { |
1263 | dev_dbg(ap->dev, "in atapi dma thaw\n"); | 1239 | dev_dbg(ap->dev, "in atapi dma thaw\n"); |
1264 | bfin_check_status(ap); | 1240 | bfin_check_status(ap); |
1265 | bfin_irq_on(ap); | 1241 | ata_sff_irq_on(ap); |
1266 | } | 1242 | } |
1267 | 1243 | ||
1268 | /** | 1244 | /** |
@@ -1279,7 +1255,7 @@ static void bfin_postreset(struct ata_link *link, unsigned int *classes) | |||
1279 | void __iomem *base = (void __iomem *)ap->ioaddr.ctl_addr; | 1255 | void __iomem *base = (void __iomem *)ap->ioaddr.ctl_addr; |
1280 | 1256 | ||
1281 | /* re-enable interrupts */ | 1257 | /* re-enable interrupts */ |
1282 | bfin_irq_on(ap); | 1258 | ata_sff_irq_on(ap); |
1283 | 1259 | ||
1284 | /* is double-select really necessary? */ | 1260 | /* is double-select really necessary? */ |
1285 | if (classes[0] != ATA_DEV_NONE) | 1261 | if (classes[0] != ATA_DEV_NONE) |
@@ -1477,7 +1453,6 @@ static struct ata_port_operations bfin_pata_ops = { | |||
1477 | .postreset = bfin_postreset, | 1453 | .postreset = bfin_postreset, |
1478 | 1454 | ||
1479 | .sff_irq_clear = bfin_irq_clear, | 1455 | .sff_irq_clear = bfin_irq_clear, |
1480 | .sff_irq_on = bfin_irq_on, | ||
1481 | 1456 | ||
1482 | .port_start = bfin_port_start, | 1457 | .port_start = bfin_port_start, |
1483 | .port_stop = bfin_port_stop, | 1458 | .port_stop = bfin_port_stop, |
diff --git a/drivers/ata/pata_octeon_cf.c b/drivers/ata/pata_octeon_cf.c index 005a44483a7b..303ca7e82408 100644 --- a/drivers/ata/pata_octeon_cf.c +++ b/drivers/ata/pata_octeon_cf.c | |||
@@ -489,9 +489,8 @@ static void octeon_cf_exec_command16(struct ata_port *ap, | |||
489 | ata_wait_idle(ap); | 489 | ata_wait_idle(ap); |
490 | } | 490 | } |
491 | 491 | ||
492 | static u8 octeon_cf_irq_on(struct ata_port *ap) | 492 | static void octeon_cf_irq_on(struct ata_port *ap) |
493 | { | 493 | { |
494 | return 0; | ||
495 | } | 494 | } |
496 | 495 | ||
497 | static void octeon_cf_irq_clear(struct ata_port *ap) | 496 | static void octeon_cf_irq_clear(struct ata_port *ap) |
diff --git a/drivers/ata/pata_scc.c b/drivers/ata/pata_scc.c index 86b25fef34a9..d3988991ca68 100644 --- a/drivers/ata/pata_scc.c +++ b/drivers/ata/pata_scc.c | |||
@@ -828,29 +828,6 @@ static unsigned int scc_data_xfer (struct ata_device *dev, unsigned char *buf, | |||
828 | } | 828 | } |
829 | 829 | ||
830 | /** | 830 | /** |
831 | * scc_irq_on - Enable interrupts on a port. | ||
832 | * @ap: Port on which interrupts are enabled. | ||
833 | * | ||
834 | * Note: Original code is ata_sff_irq_on(). | ||
835 | */ | ||
836 | |||
837 | static u8 scc_irq_on (struct ata_port *ap) | ||
838 | { | ||
839 | struct ata_ioports *ioaddr = &ap->ioaddr; | ||
840 | u8 tmp; | ||
841 | |||
842 | ap->ctl &= ~ATA_NIEN; | ||
843 | ap->last_ctl = ap->ctl; | ||
844 | |||
845 | out_be32(ioaddr->ctl_addr, ap->ctl); | ||
846 | tmp = ata_wait_idle(ap); | ||
847 | |||
848 | ap->ops->sff_irq_clear(ap); | ||
849 | |||
850 | return tmp; | ||
851 | } | ||
852 | |||
853 | /** | ||
854 | * scc_pata_prereset - prepare for reset | 831 | * scc_pata_prereset - prepare for reset |
855 | * @ap: ATA port to be reset | 832 | * @ap: ATA port to be reset |
856 | * @deadline: deadline jiffies for the operation | 833 | * @deadline: deadline jiffies for the operation |
@@ -977,7 +954,6 @@ static struct ata_port_operations scc_pata_ops = { | |||
977 | .post_internal_cmd = scc_bmdma_stop, | 954 | .post_internal_cmd = scc_bmdma_stop, |
978 | 955 | ||
979 | .sff_irq_clear = scc_irq_clear, | 956 | .sff_irq_clear = scc_irq_clear, |
980 | .sff_irq_on = scc_irq_on, | ||
981 | 957 | ||
982 | .port_start = scc_port_start, | 958 | .port_start = scc_port_start, |
983 | .port_stop = scc_port_stop, | 959 | .port_stop = scc_port_stop, |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 6207ec600722..af700923a393 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -859,7 +859,7 @@ struct ata_port_operations { | |||
859 | const struct ata_taskfile *tf); | 859 | const struct ata_taskfile *tf); |
860 | unsigned int (*sff_data_xfer)(struct ata_device *dev, | 860 | unsigned int (*sff_data_xfer)(struct ata_device *dev, |
861 | unsigned char *buf, unsigned int buflen, int rw); | 861 | unsigned char *buf, unsigned int buflen, int rw); |
862 | u8 (*sff_irq_on)(struct ata_port *); | 862 | void (*sff_irq_on)(struct ata_port *); |
863 | bool (*sff_irq_check)(struct ata_port *); | 863 | bool (*sff_irq_check)(struct ata_port *); |
864 | void (*sff_irq_clear)(struct ata_port *); | 864 | void (*sff_irq_clear)(struct ata_port *); |
865 | 865 | ||
@@ -1599,7 +1599,7 @@ extern unsigned int ata_sff_data_xfer32(struct ata_device *dev, | |||
1599 | unsigned char *buf, unsigned int buflen, int rw); | 1599 | unsigned char *buf, unsigned int buflen, int rw); |
1600 | extern unsigned int ata_sff_data_xfer_noirq(struct ata_device *dev, | 1600 | extern unsigned int ata_sff_data_xfer_noirq(struct ata_device *dev, |
1601 | unsigned char *buf, unsigned int buflen, int rw); | 1601 | unsigned char *buf, unsigned int buflen, int rw); |
1602 | extern u8 ata_sff_irq_on(struct ata_port *ap); | 1602 | extern void ata_sff_irq_on(struct ata_port *ap); |
1603 | extern void ata_sff_irq_clear(struct ata_port *ap); | 1603 | extern void ata_sff_irq_clear(struct ata_port *ap); |
1604 | extern int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc, | 1604 | extern int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc, |
1605 | u8 status, int in_wq); | 1605 | u8 status, int in_wq); |