aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Collins <bcollins@ubuntu.com>2006-02-01 06:04:47 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-02-01 11:53:10 -0500
commitcc0fa84a01d328a1ad70076b90f08281c4c79f92 (patch)
treec588be11c6f3ed5888647444157c0a9ef5b28a57
parentb62735d9c6212de6fd1b5e96b41d978939fb0dd2 (diff)
[PATCH] powerpc: enable irq's for platform functions.
Make the platform function interrupt functions actually work. Calls irq_enable() for the first in the list, and irq_disable() for the last. Added *func to struct irq_client so the the user can pass just that to pmf_unregister_irq_client(). Signed-off-by: Ben Collins <bcollins@ubuntu.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--arch/powerpc/platforms/powermac/pfunc_core.c13
-rw-r--r--include/asm-powerpc/pmac_pfunc.h5
2 files changed, 12 insertions, 6 deletions
diff --git a/arch/powerpc/platforms/powermac/pfunc_core.c b/arch/powerpc/platforms/powermac/pfunc_core.c
index c32c623001dc..356a739e52b2 100644
--- a/arch/powerpc/platforms/powermac/pfunc_core.c
+++ b/arch/powerpc/platforms/powermac/pfunc_core.c
@@ -862,21 +862,28 @@ int pmf_register_irq_client(struct device_node *target,
862 spin_unlock_irqrestore(&pmf_lock, flags); 862 spin_unlock_irqrestore(&pmf_lock, flags);
863 return -ENODEV; 863 return -ENODEV;
864 } 864 }
865 if (list_empty(&func->irq_clients))
866 func->dev->handlers->irq_enable(func);
865 list_add(&client->link, &func->irq_clients); 867 list_add(&client->link, &func->irq_clients);
868 client->func = func;
866 spin_unlock_irqrestore(&pmf_lock, flags); 869 spin_unlock_irqrestore(&pmf_lock, flags);
867 870
868 return 0; 871 return 0;
869} 872}
870EXPORT_SYMBOL_GPL(pmf_register_irq_client); 873EXPORT_SYMBOL_GPL(pmf_register_irq_client);
871 874
872void pmf_unregister_irq_client(struct device_node *np, 875void pmf_unregister_irq_client(struct pmf_irq_client *client)
873 const char *name,
874 struct pmf_irq_client *client)
875{ 876{
877 struct pmf_function *func = client->func;
876 unsigned long flags; 878 unsigned long flags;
877 879
880 BUG_ON(func == NULL);
881
878 spin_lock_irqsave(&pmf_lock, flags); 882 spin_lock_irqsave(&pmf_lock, flags);
883 client->func = NULL;
879 list_del(&client->link); 884 list_del(&client->link);
885 if (list_empty(&func->irq_clients))
886 func->dev->handlers->irq_disable(func);
880 spin_unlock_irqrestore(&pmf_lock, flags); 887 spin_unlock_irqrestore(&pmf_lock, flags);
881} 888}
882EXPORT_SYMBOL_GPL(pmf_unregister_irq_client); 889EXPORT_SYMBOL_GPL(pmf_unregister_irq_client);
diff --git a/include/asm-powerpc/pmac_pfunc.h b/include/asm-powerpc/pmac_pfunc.h
index d9728c80f86d..cef61304ffc2 100644
--- a/include/asm-powerpc/pmac_pfunc.h
+++ b/include/asm-powerpc/pmac_pfunc.h
@@ -167,6 +167,7 @@ struct pmf_irq_client {
167 void *data; 167 void *data;
168 struct module *owner; 168 struct module *owner;
169 struct list_head link; 169 struct list_head link;
170 struct pmf_function *func;
170}; 171};
171 172
172 173
@@ -187,9 +188,7 @@ extern int pmf_register_irq_client(struct device_node *np,
187 const char *name, 188 const char *name,
188 struct pmf_irq_client *client); 189 struct pmf_irq_client *client);
189 190
190extern void pmf_unregister_irq_client(struct device_node *np, 191extern void pmf_unregister_irq_client(struct pmf_irq_client *client);
191 const char *name,
192 struct pmf_irq_client *client);
193 192
194/* 193/*
195 * Called by the handlers when an irq happens 194 * Called by the handlers when an irq happens