Commit cc0fa84a01d328a1ad70076b90f08281c4c79f92

Authored by Ben Collins
Committed by Linus Torvalds
1 parent b62735d9c6

[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