aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/ecard.c
diff options
context:
space:
mode:
authorRussell King <rmk@dyn-67.arm.linux.org.uk>2007-05-10 11:46:13 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2007-05-11 12:18:55 -0400
commitc7b87f3d5037a35b5c7bb916ffc826be3fcb208d (patch)
tree57fb9d7bb21965fa0d78b26043cf459ce51a9668 /arch/arm/kernel/ecard.c
parent129a84de2347002f09721cda3155ccfd19fade40 (diff)
[ARM] ecard: add helper function for setting ecard irq ops
Rather than having every driver fiddle about setting its private IRQ operations and data, provide a helper function to contain this functionality in one place. Arrange to remove the driver-private IRQ operations and data when the device is removed from the driver, and remove the driver private code to do this. This fixes potential problems caused by drivers forgetting to remove these hooks. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/kernel/ecard.c')
-rw-r--r--arch/arm/kernel/ecard.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/arch/arm/kernel/ecard.c b/arch/arm/kernel/ecard.c
index bdbd7da99286..65f1398723a4 100644
--- a/arch/arm/kernel/ecard.c
+++ b/arch/arm/kernel/ecard.c
@@ -958,6 +958,14 @@ void ecard_release_resources(struct expansion_card *ec)
958} 958}
959EXPORT_SYMBOL(ecard_release_resources); 959EXPORT_SYMBOL(ecard_release_resources);
960 960
961void ecard_setirq(struct expansion_card *ec, const struct expansion_card_ops *ops, void *irq_data)
962{
963 ec->irq_data = irq_data;
964 barrier();
965 ec->ops = ops;
966}
967EXPORT_SYMBOL(ecard_setirq);
968
961/* 969/*
962 * Probe for an expansion card. 970 * Probe for an expansion card.
963 * 971 *
@@ -1133,6 +1141,14 @@ static int ecard_drv_remove(struct device *dev)
1133 drv->remove(ec); 1141 drv->remove(ec);
1134 ecard_release(ec); 1142 ecard_release(ec);
1135 1143
1144 /*
1145 * Restore the default operations. We ensure that the
1146 * ops are set before we change the data.
1147 */
1148 ec->ops = &ecard_default_ops;
1149 barrier();
1150 ec->irq_data = NULL;
1151
1136 return 0; 1152 return 0;
1137} 1153}
1138 1154