Commit cc0fa84a01d328a1ad70076b90f08281c4c79f92
Committed by
Linus Torvalds
1 parent
b62735d9c6
Exists in
master
and in
7 other branches
[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>
Showing 2 changed files with 12 additions and 6 deletions Side-by-side Diff
arch/powerpc/platforms/powermac/pfunc_core.c
... | ... | @@ -862,21 +862,28 @@ |
862 | 862 | spin_unlock_irqrestore(&pmf_lock, flags); |
863 | 863 | return -ENODEV; |
864 | 864 | } |
865 | + if (list_empty(&func->irq_clients)) | |
866 | + func->dev->handlers->irq_enable(func); | |
865 | 867 | list_add(&client->link, &func->irq_clients); |
868 | + client->func = func; | |
866 | 869 | spin_unlock_irqrestore(&pmf_lock, flags); |
867 | 870 | |
868 | 871 | return 0; |
869 | 872 | } |
870 | 873 | EXPORT_SYMBOL_GPL(pmf_register_irq_client); |
871 | 874 | |
872 | -void pmf_unregister_irq_client(struct device_node *np, | |
873 | - const char *name, | |
874 | - struct pmf_irq_client *client) | |
875 | +void pmf_unregister_irq_client(struct pmf_irq_client *client) | |
875 | 876 | { |
877 | + struct pmf_function *func = client->func; | |
876 | 878 | unsigned long flags; |
877 | 879 | |
880 | + BUG_ON(func == NULL); | |
881 | + | |
878 | 882 | spin_lock_irqsave(&pmf_lock, flags); |
883 | + client->func = NULL; | |
879 | 884 | list_del(&client->link); |
885 | + if (list_empty(&func->irq_clients)) | |
886 | + func->dev->handlers->irq_disable(func); | |
880 | 887 | spin_unlock_irqrestore(&pmf_lock, flags); |
881 | 888 | } |
882 | 889 | EXPORT_SYMBOL_GPL(pmf_unregister_irq_client); |
include/asm-powerpc/pmac_pfunc.h
... | ... | @@ -167,6 +167,7 @@ |
167 | 167 | void *data; |
168 | 168 | struct module *owner; |
169 | 169 | struct list_head link; |
170 | + struct pmf_function *func; | |
170 | 171 | }; |
171 | 172 | |
172 | 173 | |
... | ... | @@ -187,9 +188,7 @@ |
187 | 188 | const char *name, |
188 | 189 | struct pmf_irq_client *client); |
189 | 190 | |
190 | -extern void pmf_unregister_irq_client(struct device_node *np, | |
191 | - const char *name, | |
192 | - struct pmf_irq_client *client); | |
191 | +extern void pmf_unregister_irq_client(struct pmf_irq_client *client); | |
193 | 192 | |
194 | 193 | /* |
195 | 194 | * Called by the handlers when an irq happens |