From: Ben Collins 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 Signed-off-by: Benjamin Herrenschmidt Signed-off-by: Andrew Morton --- arch/powerpc/platforms/powermac/pfunc_core.c | 13 ++++++++++--- include/asm-powerpc/pmac_pfunc.h | 5 ++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff -puN arch/powerpc/platforms/powermac/pfunc_core.c~powerpc-enable-irqs-for-platform-functions arch/powerpc/platforms/powermac/pfunc_core.c --- devel/arch/powerpc/platforms/powermac/pfunc_core.c~powerpc-enable-irqs-for-platform-functions 2006-01-22 23:30:31.000000000 -0800 +++ devel-akpm/arch/powerpc/platforms/powermac/pfunc_core.c 2006-01-22 23:30:31.000000000 -0800 @@ -862,21 +862,28 @@ int pmf_register_irq_client(struct devic spin_unlock_irqrestore(&pmf_lock, flags); return -ENODEV; } + if (list_empty(&func->irq_clients)) + func->dev->handlers->irq_enable(func); list_add(&client->link, &func->irq_clients); + client->func = func; spin_unlock_irqrestore(&pmf_lock, flags); return 0; } EXPORT_SYMBOL_GPL(pmf_register_irq_client); -void pmf_unregister_irq_client(struct device_node *np, - const char *name, - struct pmf_irq_client *client) +void pmf_unregister_irq_client(struct pmf_irq_client *client) { + struct pmf_function *func = client->func; unsigned long flags; + BUG_ON(func == NULL); + spin_lock_irqsave(&pmf_lock, flags); + client->func = NULL; list_del(&client->link); + if (list_empty(&func->irq_clients)) + func->dev->handlers->irq_disable(func); spin_unlock_irqrestore(&pmf_lock, flags); } EXPORT_SYMBOL_GPL(pmf_unregister_irq_client); diff -puN include/asm-powerpc/pmac_pfunc.h~powerpc-enable-irqs-for-platform-functions include/asm-powerpc/pmac_pfunc.h --- devel/include/asm-powerpc/pmac_pfunc.h~powerpc-enable-irqs-for-platform-functions 2006-01-22 23:30:31.000000000 -0800 +++ devel-akpm/include/asm-powerpc/pmac_pfunc.h 2006-01-22 23:30:31.000000000 -0800 @@ -167,6 +167,7 @@ struct pmf_irq_client { void *data; struct module *owner; struct list_head link; + struct pmf_function *func; }; @@ -187,9 +188,7 @@ extern int pmf_register_irq_client(struc const char *name, struct pmf_irq_client *client); -extern void pmf_unregister_irq_client(struct device_node *np, - const char *name, - struct pmf_irq_client *client); +extern void pmf_unregister_irq_client(struct pmf_irq_client *client); /* * Called by the handlers when an irq happens _