aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-07-03 19:50:31 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-07-03 19:50:31 -0400
commit03ffbcdd7898c0b5299efeb9f18de927487ec1cf (patch)
tree0569222e4dc9db22049d7d8d15920cc085a194f6 /include
parent1b044f1cfc65a7d90b209dfabd57e16d98b58c5b (diff)
parentf9632de40ee0161e864bea8c1b017d957fd7312c (diff)
Merge branch 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull irq updates from Thomas Gleixner: "The irq department delivers: - Expand the generic infrastructure handling the irq migration on CPU hotplug and convert X86 over to it. (Thomas Gleixner) Aside of consolidating code this is a preparatory change for: - Finalizing the affinity management for multi-queue devices. The main change here is to shut down interrupts which are affine to a outgoing CPU and reenabling them when the CPU comes online again. That avoids moving interrupts pointlessly around and breaking and reestablishing affinities for no value. (Christoph Hellwig) Note: This contains also the BLOCK-MQ and NVME changes which depend on the rework of the irq core infrastructure. Jens acked them and agreed that they should go with the irq changes. - Consolidation of irq domain code (Marc Zyngier) - State tracking consolidation in the core code (Jeffy Chen) - Add debug infrastructure for hierarchical irq domains (Thomas Gleixner) - Infrastructure enhancement for managing generic interrupt chips via devmem (Bartosz Golaszewski) - Constification work all over the place (Tobias Klauser) - Two new interrupt controller drivers for MVEBU (Thomas Petazzoni) - The usual set of fixes, updates and enhancements all over the place" * 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (112 commits) irqchip/or1k-pic: Fix interrupt acknowledgement irqchip/irq-mvebu-gicp: Allocate enough memory for spi_bitmap irqchip/gic-v3: Fix out-of-bound access in gic_set_affinity nvme: Allocate queues for all possible CPUs blk-mq: Create hctx for each present CPU blk-mq: Include all present CPUs in the default queue mapping genirq: Avoid unnecessary low level irq function calls genirq: Set irq masked state when initializing irq_desc genirq/timings: Add infrastructure for estimating the next interrupt arrival time genirq/timings: Add infrastructure to track the interrupt timings genirq/debugfs: Remove pointless NULL pointer check irqchip/gic-v3-its: Don't assume GICv3 hardware supports 16bit INTID irqchip/gic-v3-its: Add ACPI NUMA node mapping irqchip/gic-v3-its-platform-msi: Make of_device_ids const irqchip/gic-v3-its: Make of_device_ids const irqchip/irq-mvebu-icu: Add new driver for Marvell ICU irqchip/irq-mvebu-gicp: Add new driver for Marvell GICP dt-bindings/interrupt-controller: Add DT binding for the Marvell ICU genirq/irqdomain: Remove auto-recursive hierarchy support irqchip/MSI: Use irq_domain_update_bus_token instead of an open coded access ...
Diffstat (limited to 'include')
-rw-r--r--include/dt-bindings/interrupt-controller/mvebu-icu.h15
-rw-r--r--include/linux/cpuhotplug.h2
-rw-r--r--include/linux/interrupt.h6
-rw-r--r--include/linux/irq.h89
-rw-r--r--include/linux/irqdesc.h4
-rw-r--r--include/linux/irqdomain.h43
6 files changed, 154 insertions, 5 deletions
diff --git a/include/dt-bindings/interrupt-controller/mvebu-icu.h b/include/dt-bindings/interrupt-controller/mvebu-icu.h
new file mode 100644
index 000000000000..8249558545c7
--- /dev/null
+++ b/include/dt-bindings/interrupt-controller/mvebu-icu.h
@@ -0,0 +1,15 @@
1/*
2 * This header provides constants for the MVEBU ICU driver.
3 */
4
5#ifndef _DT_BINDINGS_INTERRUPT_CONTROLLER_MVEBU_ICU_H
6#define _DT_BINDINGS_INTERRUPT_CONTROLLER_MVEBU_ICU_H
7
8/* interrupt specifier cell 0 */
9
10#define ICU_GRP_NSR 0x0
11#define ICU_GRP_SR 0x1
12#define ICU_GRP_SEI 0x4
13#define ICU_GRP_REI 0x5
14
15#endif
diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h
index 0f2a80377520..7f815d915977 100644
--- a/include/linux/cpuhotplug.h
+++ b/include/linux/cpuhotplug.h
@@ -58,7 +58,6 @@ enum cpuhp_state {
58 CPUHP_XEN_EVTCHN_PREPARE, 58 CPUHP_XEN_EVTCHN_PREPARE,
59 CPUHP_ARM_SHMOBILE_SCU_PREPARE, 59 CPUHP_ARM_SHMOBILE_SCU_PREPARE,
60 CPUHP_SH_SH3X_PREPARE, 60 CPUHP_SH_SH3X_PREPARE,
61 CPUHP_BLK_MQ_PREPARE,
62 CPUHP_NET_FLOW_PREPARE, 61 CPUHP_NET_FLOW_PREPARE,
63 CPUHP_TOPOLOGY_PREPARE, 62 CPUHP_TOPOLOGY_PREPARE,
64 CPUHP_NET_IUCV_PREPARE, 63 CPUHP_NET_IUCV_PREPARE,
@@ -124,6 +123,7 @@ enum cpuhp_state {
124 CPUHP_AP_ONLINE_IDLE, 123 CPUHP_AP_ONLINE_IDLE,
125 CPUHP_AP_SMPBOOT_THREADS, 124 CPUHP_AP_SMPBOOT_THREADS,
126 CPUHP_AP_X86_VDSO_VMA_ONLINE, 125 CPUHP_AP_X86_VDSO_VMA_ONLINE,
126 CPUHP_AP_IRQ_AFFINITY_ONLINE,
127 CPUHP_AP_PERF_ONLINE, 127 CPUHP_AP_PERF_ONLINE,
128 CPUHP_AP_PERF_X86_ONLINE, 128 CPUHP_AP_PERF_X86_ONLINE,
129 CPUHP_AP_PERF_X86_UNCORE_ONLINE, 129 CPUHP_AP_PERF_X86_UNCORE_ONLINE,
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
index a6fba4804672..37f8e354f564 100644
--- a/include/linux/interrupt.h
+++ b/include/linux/interrupt.h
@@ -703,6 +703,12 @@ static inline void init_irq_proc(void)
703} 703}
704#endif 704#endif
705 705
706#ifdef CONFIG_IRQ_TIMINGS
707void irq_timings_enable(void);
708void irq_timings_disable(void);
709u64 irq_timings_next_event(u64 now);
710#endif
711
706struct seq_file; 712struct seq_file;
707int show_interrupts(struct seq_file *p, void *v); 713int show_interrupts(struct seq_file *p, void *v);
708int arch_show_interrupts(struct seq_file *p, int prec); 714int arch_show_interrupts(struct seq_file *p, int prec);
diff --git a/include/linux/irq.h b/include/linux/irq.h
index f887351aa80e..00db35b61e9e 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -22,6 +22,7 @@
22#include <linux/topology.h> 22#include <linux/topology.h>
23#include <linux/wait.h> 23#include <linux/wait.h>
24#include <linux/io.h> 24#include <linux/io.h>
25#include <linux/slab.h>
25 26
26#include <asm/irq.h> 27#include <asm/irq.h>
27#include <asm/ptrace.h> 28#include <asm/ptrace.h>
@@ -136,6 +137,9 @@ struct irq_domain;
136 * @affinity: IRQ affinity on SMP. If this is an IPI 137 * @affinity: IRQ affinity on SMP. If this is an IPI
137 * related irq, then this is the mask of the 138 * related irq, then this is the mask of the
138 * CPUs to which an IPI can be sent. 139 * CPUs to which an IPI can be sent.
140 * @effective_affinity: The effective IRQ affinity on SMP as some irq
141 * chips do not allow multi CPU destinations.
142 * A subset of @affinity.
139 * @msi_desc: MSI descriptor 143 * @msi_desc: MSI descriptor
140 * @ipi_offset: Offset of first IPI target cpu in @affinity. Optional. 144 * @ipi_offset: Offset of first IPI target cpu in @affinity. Optional.
141 */ 145 */
@@ -147,6 +151,9 @@ struct irq_common_data {
147 void *handler_data; 151 void *handler_data;
148 struct msi_desc *msi_desc; 152 struct msi_desc *msi_desc;
149 cpumask_var_t affinity; 153 cpumask_var_t affinity;
154#ifdef CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK
155 cpumask_var_t effective_affinity;
156#endif
150#ifdef CONFIG_GENERIC_IRQ_IPI 157#ifdef CONFIG_GENERIC_IRQ_IPI
151 unsigned int ipi_offset; 158 unsigned int ipi_offset;
152#endif 159#endif
@@ -199,6 +206,10 @@ struct irq_data {
199 * IRQD_WAKEUP_ARMED - Wakeup mode armed 206 * IRQD_WAKEUP_ARMED - Wakeup mode armed
200 * IRQD_FORWARDED_TO_VCPU - The interrupt is forwarded to a VCPU 207 * IRQD_FORWARDED_TO_VCPU - The interrupt is forwarded to a VCPU
201 * IRQD_AFFINITY_MANAGED - Affinity is auto-managed by the kernel 208 * IRQD_AFFINITY_MANAGED - Affinity is auto-managed by the kernel
209 * IRQD_IRQ_STARTED - Startup state of the interrupt
210 * IRQD_MANAGED_SHUTDOWN - Interrupt was shutdown due to empty affinity
211 * mask. Applies only to affinity managed irqs.
212 * IRQD_SINGLE_TARGET - IRQ allows only a single affinity target
202 */ 213 */
203enum { 214enum {
204 IRQD_TRIGGER_MASK = 0xf, 215 IRQD_TRIGGER_MASK = 0xf,
@@ -216,6 +227,9 @@ enum {
216 IRQD_WAKEUP_ARMED = (1 << 19), 227 IRQD_WAKEUP_ARMED = (1 << 19),
217 IRQD_FORWARDED_TO_VCPU = (1 << 20), 228 IRQD_FORWARDED_TO_VCPU = (1 << 20),
218 IRQD_AFFINITY_MANAGED = (1 << 21), 229 IRQD_AFFINITY_MANAGED = (1 << 21),
230 IRQD_IRQ_STARTED = (1 << 22),
231 IRQD_MANAGED_SHUTDOWN = (1 << 23),
232 IRQD_SINGLE_TARGET = (1 << 24),
219}; 233};
220 234
221#define __irqd_to_state(d) ACCESS_PRIVATE((d)->common, state_use_accessors) 235#define __irqd_to_state(d) ACCESS_PRIVATE((d)->common, state_use_accessors)
@@ -264,6 +278,20 @@ static inline bool irqd_is_level_type(struct irq_data *d)
264 return __irqd_to_state(d) & IRQD_LEVEL; 278 return __irqd_to_state(d) & IRQD_LEVEL;
265} 279}
266 280
281/*
282 * Must only be called of irqchip.irq_set_affinity() or low level
283 * hieararchy domain allocation functions.
284 */
285static inline void irqd_set_single_target(struct irq_data *d)
286{
287 __irqd_to_state(d) |= IRQD_SINGLE_TARGET;
288}
289
290static inline bool irqd_is_single_target(struct irq_data *d)
291{
292 return __irqd_to_state(d) & IRQD_SINGLE_TARGET;
293}
294
267static inline bool irqd_is_wakeup_set(struct irq_data *d) 295static inline bool irqd_is_wakeup_set(struct irq_data *d)
268{ 296{
269 return __irqd_to_state(d) & IRQD_WAKEUP_STATE; 297 return __irqd_to_state(d) & IRQD_WAKEUP_STATE;
@@ -329,6 +357,16 @@ static inline void irqd_clr_activated(struct irq_data *d)
329 __irqd_to_state(d) &= ~IRQD_ACTIVATED; 357 __irqd_to_state(d) &= ~IRQD_ACTIVATED;
330} 358}
331 359
360static inline bool irqd_is_started(struct irq_data *d)
361{
362 return __irqd_to_state(d) & IRQD_IRQ_STARTED;
363}
364
365static inline bool irqd_is_managed_and_shutdown(struct irq_data *d)
366{
367 return __irqd_to_state(d) & IRQD_MANAGED_SHUTDOWN;
368}
369
332#undef __irqd_to_state 370#undef __irqd_to_state
333 371
334static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d) 372static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d)
@@ -478,14 +516,21 @@ extern int irq_set_affinity_locked(struct irq_data *data,
478 const struct cpumask *cpumask, bool force); 516 const struct cpumask *cpumask, bool force);
479extern int irq_set_vcpu_affinity(unsigned int irq, void *vcpu_info); 517extern int irq_set_vcpu_affinity(unsigned int irq, void *vcpu_info);
480 518
519#if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_IRQ_MIGRATION)
481extern void irq_migrate_all_off_this_cpu(void); 520extern void irq_migrate_all_off_this_cpu(void);
521extern int irq_affinity_online_cpu(unsigned int cpu);
522#else
523# define irq_affinity_online_cpu NULL
524#endif
482 525
483#if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ) 526#if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ)
484void irq_move_irq(struct irq_data *data); 527void irq_move_irq(struct irq_data *data);
485void irq_move_masked_irq(struct irq_data *data); 528void irq_move_masked_irq(struct irq_data *data);
529void irq_force_complete_move(struct irq_desc *desc);
486#else 530#else
487static inline void irq_move_irq(struct irq_data *data) { } 531static inline void irq_move_irq(struct irq_data *data) { }
488static inline void irq_move_masked_irq(struct irq_data *data) { } 532static inline void irq_move_masked_irq(struct irq_data *data) { }
533static inline void irq_force_complete_move(struct irq_desc *desc) { }
489#endif 534#endif
490 535
491extern int no_irq_affinity; 536extern int no_irq_affinity;
@@ -727,6 +772,29 @@ static inline struct cpumask *irq_data_get_affinity_mask(struct irq_data *d)
727 return d->common->affinity; 772 return d->common->affinity;
728} 773}
729 774
775#ifdef CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK
776static inline
777struct cpumask *irq_data_get_effective_affinity_mask(struct irq_data *d)
778{
779 return d->common->effective_affinity;
780}
781static inline void irq_data_update_effective_affinity(struct irq_data *d,
782 const struct cpumask *m)
783{
784 cpumask_copy(d->common->effective_affinity, m);
785}
786#else
787static inline void irq_data_update_effective_affinity(struct irq_data *d,
788 const struct cpumask *m)
789{
790}
791static inline
792struct cpumask *irq_data_get_effective_affinity_mask(struct irq_data *d)
793{
794 return d->common->affinity;
795}
796#endif
797
730unsigned int arch_dynirq_lower_bound(unsigned int from); 798unsigned int arch_dynirq_lower_bound(unsigned int from);
731 799
732int __irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node, 800int __irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node,
@@ -951,6 +1019,14 @@ int irq_setup_alt_chip(struct irq_data *d, unsigned int type);
951void irq_remove_generic_chip(struct irq_chip_generic *gc, u32 msk, 1019void irq_remove_generic_chip(struct irq_chip_generic *gc, u32 msk,
952 unsigned int clr, unsigned int set); 1020 unsigned int clr, unsigned int set);
953 1021
1022struct irq_chip_generic *
1023devm_irq_alloc_generic_chip(struct device *dev, const char *name, int num_ct,
1024 unsigned int irq_base, void __iomem *reg_base,
1025 irq_flow_handler_t handler);
1026int devm_irq_setup_generic_chip(struct device *dev, struct irq_chip_generic *gc,
1027 u32 msk, enum irq_gc_flags flags,
1028 unsigned int clr, unsigned int set);
1029
954struct irq_chip_generic *irq_get_domain_generic_chip(struct irq_domain *d, unsigned int hw_irq); 1030struct irq_chip_generic *irq_get_domain_generic_chip(struct irq_domain *d, unsigned int hw_irq);
955 1031
956int __irq_alloc_domain_generic_chips(struct irq_domain *d, int irqs_per_chip, 1032int __irq_alloc_domain_generic_chips(struct irq_domain *d, int irqs_per_chip,
@@ -967,6 +1043,19 @@ int __irq_alloc_domain_generic_chips(struct irq_domain *d, int irqs_per_chip,
967 handler, clr, set, flags); \ 1043 handler, clr, set, flags); \
968}) 1044})
969 1045
1046static inline void irq_free_generic_chip(struct irq_chip_generic *gc)
1047{
1048 kfree(gc);
1049}
1050
1051static inline void irq_destroy_generic_chip(struct irq_chip_generic *gc,
1052 u32 msk, unsigned int clr,
1053 unsigned int set)
1054{
1055 irq_remove_generic_chip(gc, msk, clr, set);
1056 irq_free_generic_chip(gc);
1057}
1058
970static inline struct irq_chip_type *irq_data_get_chip_type(struct irq_data *d) 1059static inline struct irq_chip_type *irq_data_get_chip_type(struct irq_data *d)
971{ 1060{
972 return container_of(d->chip, struct irq_chip_type, chip); 1061 return container_of(d->chip, struct irq_chip_type, chip);
diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h
index c9be57931b58..d425a3a09722 100644
--- a/include/linux/irqdesc.h
+++ b/include/linux/irqdesc.h
@@ -46,6 +46,7 @@ struct pt_regs;
46 * @rcu: rcu head for delayed free 46 * @rcu: rcu head for delayed free
47 * @kobj: kobject used to represent this struct in sysfs 47 * @kobj: kobject used to represent this struct in sysfs
48 * @dir: /proc/irq/ procfs entry 48 * @dir: /proc/irq/ procfs entry
49 * @debugfs_file: dentry for the debugfs file
49 * @name: flow handler name for /proc/interrupts output 50 * @name: flow handler name for /proc/interrupts output
50 */ 51 */
51struct irq_desc { 52struct irq_desc {
@@ -88,6 +89,9 @@ struct irq_desc {
88#ifdef CONFIG_PROC_FS 89#ifdef CONFIG_PROC_FS
89 struct proc_dir_entry *dir; 90 struct proc_dir_entry *dir;
90#endif 91#endif
92#ifdef CONFIG_GENERIC_IRQ_DEBUGFS
93 struct dentry *debugfs_file;
94#endif
91#ifdef CONFIG_SPARSE_IRQ 95#ifdef CONFIG_SPARSE_IRQ
92 struct rcu_head rcu; 96 struct rcu_head rcu;
93 struct kobject kobj; 97 struct kobject kobj;
diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h
index 9f3616085423..cac77a5c5555 100644
--- a/include/linux/irqdomain.h
+++ b/include/linux/irqdomain.h
@@ -130,6 +130,7 @@ struct irq_domain_chip_generic;
130 * @host_data: private data pointer for use by owner. Not touched by irq_domain 130 * @host_data: private data pointer for use by owner. Not touched by irq_domain
131 * core code. 131 * core code.
132 * @flags: host per irq_domain flags 132 * @flags: host per irq_domain flags
133 * @mapcount: The number of mapped interrupts
133 * 134 *
134 * Optional elements 135 * Optional elements
135 * @of_node: Pointer to device tree nodes associated with the irq_domain. Used 136 * @of_node: Pointer to device tree nodes associated with the irq_domain. Used
@@ -138,6 +139,7 @@ struct irq_domain_chip_generic;
138 * setting up one or more generic chips for interrupt controllers 139 * setting up one or more generic chips for interrupt controllers
139 * drivers using the generic chip library which uses this pointer. 140 * drivers using the generic chip library which uses this pointer.
140 * @parent: Pointer to parent irq_domain to support hierarchy irq_domains 141 * @parent: Pointer to parent irq_domain to support hierarchy irq_domains
142 * @debugfs_file: dentry for the domain debugfs file
141 * 143 *
142 * Revmap data, used internally by irq_domain 144 * Revmap data, used internally by irq_domain
143 * @revmap_direct_max_irq: The largest hwirq that can be set for controllers that 145 * @revmap_direct_max_irq: The largest hwirq that can be set for controllers that
@@ -152,6 +154,7 @@ struct irq_domain {
152 const struct irq_domain_ops *ops; 154 const struct irq_domain_ops *ops;
153 void *host_data; 155 void *host_data;
154 unsigned int flags; 156 unsigned int flags;
157 unsigned int mapcount;
155 158
156 /* Optional data */ 159 /* Optional data */
157 struct fwnode_handle *fwnode; 160 struct fwnode_handle *fwnode;
@@ -160,6 +163,9 @@ struct irq_domain {
160#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY 163#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
161 struct irq_domain *parent; 164 struct irq_domain *parent;
162#endif 165#endif
166#ifdef CONFIG_GENERIC_IRQ_DEBUGFS
167 struct dentry *debugfs_file;
168#endif
163 169
164 /* reverse map data. The linear map gets appended to the irq_domain */ 170 /* reverse map data. The linear map gets appended to the irq_domain */
165 irq_hw_number_t hwirq_max; 171 irq_hw_number_t hwirq_max;
@@ -174,8 +180,8 @@ enum {
174 /* Irq domain is hierarchical */ 180 /* Irq domain is hierarchical */
175 IRQ_DOMAIN_FLAG_HIERARCHY = (1 << 0), 181 IRQ_DOMAIN_FLAG_HIERARCHY = (1 << 0),
176 182
177 /* Core calls alloc/free recursive through the domain hierarchy. */ 183 /* Irq domain name was allocated in __irq_domain_add() */
178 IRQ_DOMAIN_FLAG_AUTO_RECURSIVE = (1 << 1), 184 IRQ_DOMAIN_NAME_ALLOCATED = (1 << 6),
179 185
180 /* Irq domain is an IPI domain with virq per cpu */ 186 /* Irq domain is an IPI domain with virq per cpu */
181 IRQ_DOMAIN_FLAG_IPI_PER_CPU = (1 << 2), 187 IRQ_DOMAIN_FLAG_IPI_PER_CPU = (1 << 2),
@@ -203,7 +209,33 @@ static inline struct device_node *irq_domain_get_of_node(struct irq_domain *d)
203} 209}
204 210
205#ifdef CONFIG_IRQ_DOMAIN 211#ifdef CONFIG_IRQ_DOMAIN
206struct fwnode_handle *irq_domain_alloc_fwnode(void *data); 212struct fwnode_handle *__irq_domain_alloc_fwnode(unsigned int type, int id,
213 const char *name, void *data);
214
215enum {
216 IRQCHIP_FWNODE_REAL,
217 IRQCHIP_FWNODE_NAMED,
218 IRQCHIP_FWNODE_NAMED_ID,
219};
220
221static inline
222struct fwnode_handle *irq_domain_alloc_named_fwnode(const char *name)
223{
224 return __irq_domain_alloc_fwnode(IRQCHIP_FWNODE_NAMED, 0, name, NULL);
225}
226
227static inline
228struct fwnode_handle *irq_domain_alloc_named_id_fwnode(const char *name, int id)
229{
230 return __irq_domain_alloc_fwnode(IRQCHIP_FWNODE_NAMED_ID, id, name,
231 NULL);
232}
233
234static inline struct fwnode_handle *irq_domain_alloc_fwnode(void *data)
235{
236 return __irq_domain_alloc_fwnode(IRQCHIP_FWNODE_REAL, 0, NULL, data);
237}
238
207void irq_domain_free_fwnode(struct fwnode_handle *fwnode); 239void irq_domain_free_fwnode(struct fwnode_handle *fwnode);
208struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, int size, 240struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, int size,
209 irq_hw_number_t hwirq_max, int direct_max, 241 irq_hw_number_t hwirq_max, int direct_max,
@@ -238,6 +270,9 @@ static inline bool is_fwnode_irqchip(struct fwnode_handle *fwnode)
238 return fwnode && fwnode->type == FWNODE_IRQCHIP; 270 return fwnode && fwnode->type == FWNODE_IRQCHIP;
239} 271}
240 272
273extern void irq_domain_update_bus_token(struct irq_domain *domain,
274 enum irq_domain_bus_token bus_token);
275
241static inline 276static inline
242struct irq_domain *irq_find_matching_fwnode(struct fwnode_handle *fwnode, 277struct irq_domain *irq_find_matching_fwnode(struct fwnode_handle *fwnode,
243 enum irq_domain_bus_token bus_token) 278 enum irq_domain_bus_token bus_token)
@@ -410,7 +445,7 @@ static inline int irq_domain_alloc_irqs(struct irq_domain *domain,
410 NULL); 445 NULL);
411} 446}
412 447
413extern int irq_domain_alloc_irqs_recursive(struct irq_domain *domain, 448extern int irq_domain_alloc_irqs_hierarchy(struct irq_domain *domain,
414 unsigned int irq_base, 449 unsigned int irq_base,
415 unsigned int nr_irqs, void *arg); 450 unsigned int nr_irqs, void *arg);
416extern int irq_domain_set_hwirq_and_chip(struct irq_domain *domain, 451extern int irq_domain_set_hwirq_and_chip(struct irq_domain *domain,