diff options
| author | Arnd Bergmann <arnd@arndb.de> | 2011-10-31 09:08:10 -0400 |
|---|---|---|
| committer | Arnd Bergmann <arnd@arndb.de> | 2011-10-31 09:08:10 -0400 |
| commit | 08cab72f91c8b28ffabfd143119bccdd4a115ad7 (patch) | |
| tree | ccd5583971caecd82bf2d1e62691bf6e0362d650 /include/linux | |
| parent | 86c1e5a74af11e4817ffa6d7748d9ac1353b5b53 (diff) | |
| parent | f37a53cc5d8a8fb199e41386d125d8c2ed9e54ef (diff) | |
Merge branch 'dt/gic' into next/dt
Conflicts:
arch/arm/include/asm/localtimer.h
arch/arm/mach-msm/board-msm8x60.c
arch/arm/mach-omap2/board-generic.c
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/cpu_pm.h | 109 | ||||
| -rw-r--r-- | include/linux/interrupt.h | 38 | ||||
| -rw-r--r-- | include/linux/irq.h | 18 | ||||
| -rw-r--r-- | include/linux/irqdesc.h | 1 | ||||
| -rw-r--r-- | include/linux/irqdomain.h | 16 | ||||
| -rw-r--r-- | include/linux/of_irq.h | 3 |
6 files changed, 172 insertions, 13 deletions
diff --git a/include/linux/cpu_pm.h b/include/linux/cpu_pm.h new file mode 100644 index 000000000000..455b233dd3b1 --- /dev/null +++ b/include/linux/cpu_pm.h | |||
| @@ -0,0 +1,109 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2011 Google, Inc. | ||
| 3 | * | ||
| 4 | * Author: | ||
| 5 | * Colin Cross <ccross@android.com> | ||
| 6 | * | ||
| 7 | * This software is licensed under the terms of the GNU General Public | ||
| 8 | * License version 2, as published by the Free Software Foundation, and | ||
| 9 | * may be copied, distributed, and modified under those terms. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, | ||
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 14 | * GNU General Public License for more details. | ||
| 15 | * | ||
| 16 | */ | ||
| 17 | |||
| 18 | #ifndef _LINUX_CPU_PM_H | ||
| 19 | #define _LINUX_CPU_PM_H | ||
| 20 | |||
| 21 | #include <linux/kernel.h> | ||
| 22 | #include <linux/notifier.h> | ||
| 23 | |||
| 24 | /* | ||
| 25 | * When a CPU goes to a low power state that turns off power to the CPU's | ||
| 26 | * power domain, the contents of some blocks (floating point coprocessors, | ||
| 27 | * interrupt controllers, caches, timers) in the same power domain can | ||
| 28 | * be lost. The cpm_pm notifiers provide a method for platform idle, suspend, | ||
| 29 | * and hotplug implementations to notify the drivers for these blocks that | ||
| 30 | * they may be reset. | ||
| 31 | * | ||
| 32 | * All cpu_pm notifications must be called with interrupts disabled. | ||
| 33 | * | ||
| 34 | * The notifications are split into two classes: CPU notifications and CPU | ||
| 35 | * cluster notifications. | ||
| 36 | * | ||
| 37 | * CPU notifications apply to a single CPU and must be called on the affected | ||
| 38 | * CPU. They are used to save per-cpu context for affected blocks. | ||
| 39 | * | ||
| 40 | * CPU cluster notifications apply to all CPUs in a single power domain. They | ||
| 41 | * are used to save any global context for affected blocks, and must be called | ||
| 42 | * after all the CPUs in the power domain have been notified of the low power | ||
| 43 | * state. | ||
| 44 | */ | ||
| 45 | |||
| 46 | /* | ||
| 47 | * Event codes passed as unsigned long val to notifier calls | ||
| 48 | */ | ||
| 49 | enum cpu_pm_event { | ||
| 50 | /* A single cpu is entering a low power state */ | ||
| 51 | CPU_PM_ENTER, | ||
| 52 | |||
| 53 | /* A single cpu failed to enter a low power state */ | ||
| 54 | CPU_PM_ENTER_FAILED, | ||
| 55 | |||
| 56 | /* A single cpu is exiting a low power state */ | ||
| 57 | CPU_PM_EXIT, | ||
| 58 | |||
| 59 | /* A cpu power domain is entering a low power state */ | ||
| 60 | CPU_CLUSTER_PM_ENTER, | ||
| 61 | |||
| 62 | /* A cpu power domain failed to enter a low power state */ | ||
| 63 | CPU_CLUSTER_PM_ENTER_FAILED, | ||
| 64 | |||
| 65 | /* A cpu power domain is exiting a low power state */ | ||
| 66 | CPU_CLUSTER_PM_EXIT, | ||
| 67 | }; | ||
| 68 | |||
| 69 | #ifdef CONFIG_CPU_PM | ||
| 70 | int cpu_pm_register_notifier(struct notifier_block *nb); | ||
| 71 | int cpu_pm_unregister_notifier(struct notifier_block *nb); | ||
| 72 | int cpu_pm_enter(void); | ||
| 73 | int cpu_pm_exit(void); | ||
| 74 | int cpu_cluster_pm_enter(void); | ||
| 75 | int cpu_cluster_pm_exit(void); | ||
| 76 | |||
| 77 | #else | ||
| 78 | |||
| 79 | static inline int cpu_pm_register_notifier(struct notifier_block *nb) | ||
| 80 | { | ||
| 81 | return 0; | ||
| 82 | } | ||
| 83 | |||
| 84 | static inline int cpu_pm_unregister_notifier(struct notifier_block *nb) | ||
| 85 | { | ||
| 86 | return 0; | ||
| 87 | } | ||
| 88 | |||
| 89 | static inline int cpu_pm_enter(void) | ||
| 90 | { | ||
| 91 | return 0; | ||
| 92 | } | ||
| 93 | |||
| 94 | static inline int cpu_pm_exit(void) | ||
| 95 | { | ||
| 96 | return 0; | ||
| 97 | } | ||
| 98 | |||
| 99 | static inline int cpu_cluster_pm_enter(void) | ||
| 100 | { | ||
| 101 | return 0; | ||
| 102 | } | ||
| 103 | |||
| 104 | static inline int cpu_cluster_pm_exit(void) | ||
| 105 | { | ||
| 106 | return 0; | ||
| 107 | } | ||
| 108 | #endif | ||
| 109 | #endif | ||
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index a103732b7588..664544ff77d5 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h | |||
| @@ -95,6 +95,7 @@ typedef irqreturn_t (*irq_handler_t)(int, void *); | |||
| 95 | * @flags: flags (see IRQF_* above) | 95 | * @flags: flags (see IRQF_* above) |
| 96 | * @name: name of the device | 96 | * @name: name of the device |
| 97 | * @dev_id: cookie to identify the device | 97 | * @dev_id: cookie to identify the device |
| 98 | * @percpu_dev_id: cookie to identify the device | ||
| 98 | * @next: pointer to the next irqaction for shared interrupts | 99 | * @next: pointer to the next irqaction for shared interrupts |
| 99 | * @irq: interrupt number | 100 | * @irq: interrupt number |
| 100 | * @dir: pointer to the proc/irq/NN/name entry | 101 | * @dir: pointer to the proc/irq/NN/name entry |
| @@ -104,17 +105,18 @@ typedef irqreturn_t (*irq_handler_t)(int, void *); | |||
| 104 | * @thread_mask: bitmask for keeping track of @thread activity | 105 | * @thread_mask: bitmask for keeping track of @thread activity |
| 105 | */ | 106 | */ |
| 106 | struct irqaction { | 107 | struct irqaction { |
| 107 | irq_handler_t handler; | 108 | irq_handler_t handler; |
| 108 | unsigned long flags; | 109 | unsigned long flags; |
| 109 | void *dev_id; | 110 | void *dev_id; |
| 110 | struct irqaction *next; | 111 | void __percpu *percpu_dev_id; |
| 111 | int irq; | 112 | struct irqaction *next; |
| 112 | irq_handler_t thread_fn; | 113 | int irq; |
| 113 | struct task_struct *thread; | 114 | irq_handler_t thread_fn; |
| 114 | unsigned long thread_flags; | 115 | struct task_struct *thread; |
| 115 | unsigned long thread_mask; | 116 | unsigned long thread_flags; |
| 116 | const char *name; | 117 | unsigned long thread_mask; |
| 117 | struct proc_dir_entry *dir; | 118 | const char *name; |
| 119 | struct proc_dir_entry *dir; | ||
| 118 | } ____cacheline_internodealigned_in_smp; | 120 | } ____cacheline_internodealigned_in_smp; |
| 119 | 121 | ||
| 120 | extern irqreturn_t no_action(int cpl, void *dev_id); | 122 | extern irqreturn_t no_action(int cpl, void *dev_id); |
| @@ -136,6 +138,10 @@ extern int __must_check | |||
| 136 | request_any_context_irq(unsigned int irq, irq_handler_t handler, | 138 | request_any_context_irq(unsigned int irq, irq_handler_t handler, |
| 137 | unsigned long flags, const char *name, void *dev_id); | 139 | unsigned long flags, const char *name, void *dev_id); |
| 138 | 140 | ||
| 141 | extern int __must_check | ||
| 142 | request_percpu_irq(unsigned int irq, irq_handler_t handler, | ||
| 143 | const char *devname, void __percpu *percpu_dev_id); | ||
| 144 | |||
| 139 | extern void exit_irq_thread(void); | 145 | extern void exit_irq_thread(void); |
| 140 | #else | 146 | #else |
| 141 | 147 | ||
| @@ -164,10 +170,18 @@ request_any_context_irq(unsigned int irq, irq_handler_t handler, | |||
| 164 | return request_irq(irq, handler, flags, name, dev_id); | 170 | return request_irq(irq, handler, flags, name, dev_id); |
| 165 | } | 171 | } |
| 166 | 172 | ||
| 173 | static inline int __must_check | ||
| 174 | request_percpu_irq(unsigned int irq, irq_handler_t handler, | ||
| 175 | const char *devname, void __percpu *percpu_dev_id) | ||
| 176 | { | ||
| 177 | return request_irq(irq, handler, 0, devname, percpu_dev_id); | ||
| 178 | } | ||
| 179 | |||
| 167 | static inline void exit_irq_thread(void) { } | 180 | static inline void exit_irq_thread(void) { } |
| 168 | #endif | 181 | #endif |
| 169 | 182 | ||
| 170 | extern void free_irq(unsigned int, void *); | 183 | extern void free_irq(unsigned int, void *); |
| 184 | extern void free_percpu_irq(unsigned int, void __percpu *); | ||
| 171 | 185 | ||
| 172 | struct device; | 186 | struct device; |
| 173 | 187 | ||
| @@ -207,7 +221,9 @@ extern void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id); | |||
| 207 | 221 | ||
| 208 | extern void disable_irq_nosync(unsigned int irq); | 222 | extern void disable_irq_nosync(unsigned int irq); |
| 209 | extern void disable_irq(unsigned int irq); | 223 | extern void disable_irq(unsigned int irq); |
| 224 | extern void disable_percpu_irq(unsigned int irq); | ||
| 210 | extern void enable_irq(unsigned int irq); | 225 | extern void enable_irq(unsigned int irq); |
| 226 | extern void enable_percpu_irq(unsigned int irq, unsigned int type); | ||
| 211 | 227 | ||
| 212 | /* The following three functions are for the core kernel use only. */ | 228 | /* The following three functions are for the core kernel use only. */ |
| 213 | #ifdef CONFIG_GENERIC_HARDIRQS | 229 | #ifdef CONFIG_GENERIC_HARDIRQS |
diff --git a/include/linux/irq.h b/include/linux/irq.h index 59517300a315..59e49c80cc2c 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
| @@ -66,6 +66,7 @@ typedef void (*irq_preflow_handler_t)(struct irq_data *data); | |||
| 66 | * IRQ_NO_BALANCING - Interrupt cannot be balanced (affinity set) | 66 | * IRQ_NO_BALANCING - Interrupt cannot be balanced (affinity set) |
| 67 | * IRQ_MOVE_PCNTXT - Interrupt can be migrated from process context | 67 | * IRQ_MOVE_PCNTXT - Interrupt can be migrated from process context |
| 68 | * IRQ_NESTED_TRHEAD - Interrupt nests into another thread | 68 | * IRQ_NESTED_TRHEAD - Interrupt nests into another thread |
| 69 | * IRQ_PER_CPU_DEVID - Dev_id is a per-cpu variable | ||
| 69 | */ | 70 | */ |
| 70 | enum { | 71 | enum { |
| 71 | IRQ_TYPE_NONE = 0x00000000, | 72 | IRQ_TYPE_NONE = 0x00000000, |
| @@ -88,12 +89,13 @@ enum { | |||
| 88 | IRQ_MOVE_PCNTXT = (1 << 14), | 89 | IRQ_MOVE_PCNTXT = (1 << 14), |
| 89 | IRQ_NESTED_THREAD = (1 << 15), | 90 | IRQ_NESTED_THREAD = (1 << 15), |
| 90 | IRQ_NOTHREAD = (1 << 16), | 91 | IRQ_NOTHREAD = (1 << 16), |
| 92 | IRQ_PER_CPU_DEVID = (1 << 17), | ||
| 91 | }; | 93 | }; |
| 92 | 94 | ||
| 93 | #define IRQF_MODIFY_MASK \ | 95 | #define IRQF_MODIFY_MASK \ |
| 94 | (IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \ | 96 | (IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \ |
| 95 | IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL | IRQ_NO_BALANCING | \ | 97 | IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL | IRQ_NO_BALANCING | \ |
| 96 | IRQ_PER_CPU | IRQ_NESTED_THREAD) | 98 | IRQ_PER_CPU | IRQ_NESTED_THREAD | IRQ_NOTHREAD | IRQ_PER_CPU_DEVID) |
| 97 | 99 | ||
| 98 | #define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING) | 100 | #define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING) |
| 99 | 101 | ||
| @@ -336,12 +338,14 @@ struct irq_chip { | |||
| 336 | * IRQCHIP_MASK_ON_SUSPEND: Mask non wake irqs in the suspend path | 338 | * IRQCHIP_MASK_ON_SUSPEND: Mask non wake irqs in the suspend path |
| 337 | * IRQCHIP_ONOFFLINE_ENABLED: Only call irq_on/off_line callbacks | 339 | * IRQCHIP_ONOFFLINE_ENABLED: Only call irq_on/off_line callbacks |
| 338 | * when irq enabled | 340 | * when irq enabled |
| 341 | * IRQCHIP_SKIP_SET_WAKE: Skip chip.irq_set_wake(), for this irq chip | ||
| 339 | */ | 342 | */ |
| 340 | enum { | 343 | enum { |
| 341 | IRQCHIP_SET_TYPE_MASKED = (1 << 0), | 344 | IRQCHIP_SET_TYPE_MASKED = (1 << 0), |
| 342 | IRQCHIP_EOI_IF_HANDLED = (1 << 1), | 345 | IRQCHIP_EOI_IF_HANDLED = (1 << 1), |
| 343 | IRQCHIP_MASK_ON_SUSPEND = (1 << 2), | 346 | IRQCHIP_MASK_ON_SUSPEND = (1 << 2), |
| 344 | IRQCHIP_ONOFFLINE_ENABLED = (1 << 3), | 347 | IRQCHIP_ONOFFLINE_ENABLED = (1 << 3), |
| 348 | IRQCHIP_SKIP_SET_WAKE = (1 << 4), | ||
| 345 | }; | 349 | }; |
| 346 | 350 | ||
| 347 | /* This include will go away once we isolated irq_desc usage to core code */ | 351 | /* This include will go away once we isolated irq_desc usage to core code */ |
| @@ -365,6 +369,8 @@ enum { | |||
| 365 | struct irqaction; | 369 | struct irqaction; |
| 366 | extern int setup_irq(unsigned int irq, struct irqaction *new); | 370 | extern int setup_irq(unsigned int irq, struct irqaction *new); |
| 367 | extern void remove_irq(unsigned int irq, struct irqaction *act); | 371 | extern void remove_irq(unsigned int irq, struct irqaction *act); |
| 372 | extern int setup_percpu_irq(unsigned int irq, struct irqaction *new); | ||
| 373 | extern void remove_percpu_irq(unsigned int irq, struct irqaction *act); | ||
| 368 | 374 | ||
| 369 | extern void irq_cpu_online(void); | 375 | extern void irq_cpu_online(void); |
| 370 | extern void irq_cpu_offline(void); | 376 | extern void irq_cpu_offline(void); |
| @@ -392,6 +398,7 @@ extern void handle_edge_irq(unsigned int irq, struct irq_desc *desc); | |||
| 392 | extern void handle_edge_eoi_irq(unsigned int irq, struct irq_desc *desc); | 398 | extern void handle_edge_eoi_irq(unsigned int irq, struct irq_desc *desc); |
| 393 | extern void handle_simple_irq(unsigned int irq, struct irq_desc *desc); | 399 | extern void handle_simple_irq(unsigned int irq, struct irq_desc *desc); |
| 394 | extern void handle_percpu_irq(unsigned int irq, struct irq_desc *desc); | 400 | extern void handle_percpu_irq(unsigned int irq, struct irq_desc *desc); |
| 401 | extern void handle_percpu_devid_irq(unsigned int irq, struct irq_desc *desc); | ||
| 395 | extern void handle_bad_irq(unsigned int irq, struct irq_desc *desc); | 402 | extern void handle_bad_irq(unsigned int irq, struct irq_desc *desc); |
| 396 | extern void handle_nested_irq(unsigned int irq); | 403 | extern void handle_nested_irq(unsigned int irq); |
| 397 | 404 | ||
| @@ -420,6 +427,8 @@ static inline void irq_set_chip_and_handler(unsigned int irq, struct irq_chip *c | |||
| 420 | irq_set_chip_and_handler_name(irq, chip, handle, NULL); | 427 | irq_set_chip_and_handler_name(irq, chip, handle, NULL); |
| 421 | } | 428 | } |
| 422 | 429 | ||
| 430 | extern int irq_set_percpu_devid(unsigned int irq); | ||
| 431 | |||
| 423 | extern void | 432 | extern void |
| 424 | __irq_set_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, | 433 | __irq_set_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, |
| 425 | const char *name); | 434 | const char *name); |
| @@ -481,6 +490,13 @@ static inline void irq_set_nested_thread(unsigned int irq, bool nest) | |||
| 481 | irq_clear_status_flags(irq, IRQ_NESTED_THREAD); | 490 | irq_clear_status_flags(irq, IRQ_NESTED_THREAD); |
| 482 | } | 491 | } |
| 483 | 492 | ||
| 493 | static inline void irq_set_percpu_devid_flags(unsigned int irq) | ||
| 494 | { | ||
| 495 | irq_set_status_flags(irq, | ||
| 496 | IRQ_NOAUTOEN | IRQ_PER_CPU | IRQ_NOTHREAD | | ||
| 497 | IRQ_NOPROBE | IRQ_PER_CPU_DEVID); | ||
| 498 | } | ||
| 499 | |||
| 484 | /* Handle dynamic irq creation and destruction */ | 500 | /* Handle dynamic irq creation and destruction */ |
| 485 | extern unsigned int create_irq_nr(unsigned int irq_want, int node); | 501 | extern unsigned int create_irq_nr(unsigned int irq_want, int node); |
| 486 | extern int create_irq(void); | 502 | extern int create_irq(void); |
diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h index 150134ac709a..6b69c2c9dff1 100644 --- a/include/linux/irqdesc.h +++ b/include/linux/irqdesc.h | |||
| @@ -53,6 +53,7 @@ struct irq_desc { | |||
| 53 | unsigned long last_unhandled; /* Aging timer for unhandled count */ | 53 | unsigned long last_unhandled; /* Aging timer for unhandled count */ |
| 54 | unsigned int irqs_unhandled; | 54 | unsigned int irqs_unhandled; |
| 55 | raw_spinlock_t lock; | 55 | raw_spinlock_t lock; |
| 56 | struct cpumask *percpu_enabled; | ||
| 56 | #ifdef CONFIG_SMP | 57 | #ifdef CONFIG_SMP |
| 57 | const struct cpumask *affinity_hint; | 58 | const struct cpumask *affinity_hint; |
| 58 | struct irq_affinity_notify *affinity_notify; | 59 | struct irq_affinity_notify *affinity_notify; |
diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h index 3ad553e8eae2..99834e581b9e 100644 --- a/include/linux/irqdomain.h +++ b/include/linux/irqdomain.h | |||
| @@ -47,6 +47,7 @@ struct irq_domain_ops { | |||
| 47 | * of the irq_domain is responsible for allocating the array of | 47 | * of the irq_domain is responsible for allocating the array of |
| 48 | * irq_desc structures. | 48 | * irq_desc structures. |
| 49 | * @nr_irq: Number of irqs managed by the irq domain | 49 | * @nr_irq: Number of irqs managed by the irq domain |
| 50 | * @hwirq_base: Starting number for hwirqs managed by the irq domain | ||
| 50 | * @ops: pointer to irq_domain methods | 51 | * @ops: pointer to irq_domain methods |
| 51 | * @priv: private data pointer for use by owner. Not touched by irq_domain | 52 | * @priv: private data pointer for use by owner. Not touched by irq_domain |
| 52 | * core code. | 53 | * core code. |
| @@ -57,6 +58,7 @@ struct irq_domain { | |||
| 57 | struct list_head list; | 58 | struct list_head list; |
| 58 | unsigned int irq_base; | 59 | unsigned int irq_base; |
| 59 | unsigned int nr_irq; | 60 | unsigned int nr_irq; |
| 61 | unsigned int hwirq_base; | ||
| 60 | const struct irq_domain_ops *ops; | 62 | const struct irq_domain_ops *ops; |
| 61 | void *priv; | 63 | void *priv; |
| 62 | struct device_node *of_node; | 64 | struct device_node *of_node; |
| @@ -72,9 +74,21 @@ struct irq_domain { | |||
| 72 | static inline unsigned int irq_domain_to_irq(struct irq_domain *d, | 74 | static inline unsigned int irq_domain_to_irq(struct irq_domain *d, |
| 73 | unsigned long hwirq) | 75 | unsigned long hwirq) |
| 74 | { | 76 | { |
| 75 | return d->ops->to_irq ? d->ops->to_irq(d, hwirq) : d->irq_base + hwirq; | 77 | if (d->ops->to_irq) |
| 78 | return d->ops->to_irq(d, hwirq); | ||
| 79 | if (WARN_ON(hwirq < d->hwirq_base)) | ||
| 80 | return 0; | ||
| 81 | return d->irq_base + hwirq - d->hwirq_base; | ||
| 76 | } | 82 | } |
| 77 | 83 | ||
| 84 | #define irq_domain_for_each_hwirq(d, hw) \ | ||
| 85 | for (hw = d->hwirq_base; hw < d->hwirq_base + d->nr_irq; hw++) | ||
| 86 | |||
| 87 | #define irq_domain_for_each_irq(d, hw, irq) \ | ||
| 88 | for (hw = d->hwirq_base, irq = irq_domain_to_irq(d, hw); \ | ||
| 89 | hw < d->hwirq_base + d->nr_irq; \ | ||
| 90 | hw++, irq = irq_domain_to_irq(d, hw)) | ||
| 91 | |||
| 78 | extern void irq_domain_add(struct irq_domain *domain); | 92 | extern void irq_domain_add(struct irq_domain *domain); |
| 79 | extern void irq_domain_del(struct irq_domain *domain); | 93 | extern void irq_domain_del(struct irq_domain *domain); |
| 80 | #endif /* CONFIG_IRQ_DOMAIN */ | 94 | #endif /* CONFIG_IRQ_DOMAIN */ |
diff --git a/include/linux/of_irq.h b/include/linux/of_irq.h index cd2e61ce4e83..d0307eed20c9 100644 --- a/include/linux/of_irq.h +++ b/include/linux/of_irq.h | |||
| @@ -33,6 +33,8 @@ struct of_irq { | |||
| 33 | u32 specifier[OF_MAX_IRQ_SPEC]; /* Specifier copy */ | 33 | u32 specifier[OF_MAX_IRQ_SPEC]; /* Specifier copy */ |
| 34 | }; | 34 | }; |
| 35 | 35 | ||
| 36 | typedef int (*of_irq_init_cb_t)(struct device_node *, struct device_node *); | ||
| 37 | |||
| 36 | /* | 38 | /* |
| 37 | * Workarounds only applied to 32bit powermac machines | 39 | * Workarounds only applied to 32bit powermac machines |
| 38 | */ | 40 | */ |
| @@ -73,6 +75,7 @@ extern int of_irq_to_resource_table(struct device_node *dev, | |||
| 73 | struct resource *res, int nr_irqs); | 75 | struct resource *res, int nr_irqs); |
| 74 | extern struct device_node *of_irq_find_parent(struct device_node *child); | 76 | extern struct device_node *of_irq_find_parent(struct device_node *child); |
| 75 | 77 | ||
| 78 | extern void of_irq_init(const struct of_device_id *matches); | ||
| 76 | 79 | ||
| 77 | #endif /* CONFIG_OF_IRQ */ | 80 | #endif /* CONFIG_OF_IRQ */ |
| 78 | #endif /* CONFIG_OF */ | 81 | #endif /* CONFIG_OF */ |
