xref: /OK3568_Linux_fs/kernel/include/linux/of_irq.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef __OF_IRQ_H
3*4882a593Smuzhiyun #define __OF_IRQ_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <linux/types.h>
6*4882a593Smuzhiyun #include <linux/errno.h>
7*4882a593Smuzhiyun #include <linux/irq.h>
8*4882a593Smuzhiyun #include <linux/irqdomain.h>
9*4882a593Smuzhiyun #include <linux/ioport.h>
10*4882a593Smuzhiyun #include <linux/of.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun typedef int (*of_irq_init_cb_t)(struct device_node *, struct device_node *);
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun /*
15*4882a593Smuzhiyun  * Workarounds only applied to 32bit powermac machines
16*4882a593Smuzhiyun  */
17*4882a593Smuzhiyun #define OF_IMAP_OLDWORLD_MAC	0x00000001
18*4882a593Smuzhiyun #define OF_IMAP_NO_PHANDLE	0x00000002
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #if defined(CONFIG_PPC32) && defined(CONFIG_PPC_PMAC)
21*4882a593Smuzhiyun extern unsigned int of_irq_workarounds;
22*4882a593Smuzhiyun extern struct device_node *of_irq_dflt_pic;
23*4882a593Smuzhiyun extern int of_irq_parse_oldworld(struct device_node *device, int index,
24*4882a593Smuzhiyun 			       struct of_phandle_args *out_irq);
25*4882a593Smuzhiyun #else /* CONFIG_PPC32 && CONFIG_PPC_PMAC */
26*4882a593Smuzhiyun #define of_irq_workarounds (0)
27*4882a593Smuzhiyun #define of_irq_dflt_pic (NULL)
of_irq_parse_oldworld(struct device_node * device,int index,struct of_phandle_args * out_irq)28*4882a593Smuzhiyun static inline int of_irq_parse_oldworld(struct device_node *device, int index,
29*4882a593Smuzhiyun 				      struct of_phandle_args *out_irq)
30*4882a593Smuzhiyun {
31*4882a593Smuzhiyun 	return -EINVAL;
32*4882a593Smuzhiyun }
33*4882a593Smuzhiyun #endif /* CONFIG_PPC32 && CONFIG_PPC_PMAC */
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun extern int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq);
36*4882a593Smuzhiyun extern unsigned int irq_create_of_mapping(struct of_phandle_args *irq_data);
37*4882a593Smuzhiyun extern int of_irq_to_resource(struct device_node *dev, int index,
38*4882a593Smuzhiyun 			      struct resource *r);
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun extern void of_irq_init(const struct of_device_id *matches);
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #ifdef CONFIG_OF_IRQ
43*4882a593Smuzhiyun extern int of_irq_parse_one(struct device_node *device, int index,
44*4882a593Smuzhiyun 			  struct of_phandle_args *out_irq);
45*4882a593Smuzhiyun extern int of_irq_count(struct device_node *dev);
46*4882a593Smuzhiyun extern int of_irq_get(struct device_node *dev, int index);
47*4882a593Smuzhiyun extern int of_irq_get_byname(struct device_node *dev, const char *name);
48*4882a593Smuzhiyun extern int of_irq_to_resource_table(struct device_node *dev,
49*4882a593Smuzhiyun 		struct resource *res, int nr_irqs);
50*4882a593Smuzhiyun extern struct device_node *of_irq_find_parent(struct device_node *child);
51*4882a593Smuzhiyun extern struct irq_domain *of_msi_get_domain(struct device *dev,
52*4882a593Smuzhiyun 					    struct device_node *np,
53*4882a593Smuzhiyun 					    enum irq_domain_bus_token token);
54*4882a593Smuzhiyun extern struct irq_domain *of_msi_map_get_device_domain(struct device *dev,
55*4882a593Smuzhiyun 							u32 id,
56*4882a593Smuzhiyun 							u32 bus_token);
57*4882a593Smuzhiyun extern void of_msi_configure(struct device *dev, struct device_node *np);
58*4882a593Smuzhiyun u32 of_msi_map_id(struct device *dev, struct device_node *msi_np, u32 id_in);
59*4882a593Smuzhiyun #else
of_irq_parse_one(struct device_node * device,int index,struct of_phandle_args * out_irq)60*4882a593Smuzhiyun static inline int of_irq_parse_one(struct device_node *device, int index,
61*4882a593Smuzhiyun 				   struct of_phandle_args *out_irq)
62*4882a593Smuzhiyun {
63*4882a593Smuzhiyun 	return -EINVAL;
64*4882a593Smuzhiyun }
of_irq_count(struct device_node * dev)65*4882a593Smuzhiyun static inline int of_irq_count(struct device_node *dev)
66*4882a593Smuzhiyun {
67*4882a593Smuzhiyun 	return 0;
68*4882a593Smuzhiyun }
of_irq_get(struct device_node * dev,int index)69*4882a593Smuzhiyun static inline int of_irq_get(struct device_node *dev, int index)
70*4882a593Smuzhiyun {
71*4882a593Smuzhiyun 	return 0;
72*4882a593Smuzhiyun }
of_irq_get_byname(struct device_node * dev,const char * name)73*4882a593Smuzhiyun static inline int of_irq_get_byname(struct device_node *dev, const char *name)
74*4882a593Smuzhiyun {
75*4882a593Smuzhiyun 	return 0;
76*4882a593Smuzhiyun }
of_irq_to_resource_table(struct device_node * dev,struct resource * res,int nr_irqs)77*4882a593Smuzhiyun static inline int of_irq_to_resource_table(struct device_node *dev,
78*4882a593Smuzhiyun 					   struct resource *res, int nr_irqs)
79*4882a593Smuzhiyun {
80*4882a593Smuzhiyun 	return 0;
81*4882a593Smuzhiyun }
of_irq_find_parent(struct device_node * child)82*4882a593Smuzhiyun static inline void *of_irq_find_parent(struct device_node *child)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun 	return NULL;
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun 
of_msi_get_domain(struct device * dev,struct device_node * np,enum irq_domain_bus_token token)87*4882a593Smuzhiyun static inline struct irq_domain *of_msi_get_domain(struct device *dev,
88*4882a593Smuzhiyun 						   struct device_node *np,
89*4882a593Smuzhiyun 						   enum irq_domain_bus_token token)
90*4882a593Smuzhiyun {
91*4882a593Smuzhiyun 	return NULL;
92*4882a593Smuzhiyun }
of_msi_map_get_device_domain(struct device * dev,u32 id,u32 bus_token)93*4882a593Smuzhiyun static inline struct irq_domain *of_msi_map_get_device_domain(struct device *dev,
94*4882a593Smuzhiyun 						u32 id, u32 bus_token)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun 	return NULL;
97*4882a593Smuzhiyun }
of_msi_configure(struct device * dev,struct device_node * np)98*4882a593Smuzhiyun static inline void of_msi_configure(struct device *dev, struct device_node *np)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun }
of_msi_map_id(struct device * dev,struct device_node * msi_np,u32 id_in)101*4882a593Smuzhiyun static inline u32 of_msi_map_id(struct device *dev,
102*4882a593Smuzhiyun 				 struct device_node *msi_np, u32 id_in)
103*4882a593Smuzhiyun {
104*4882a593Smuzhiyun 	return id_in;
105*4882a593Smuzhiyun }
106*4882a593Smuzhiyun #endif
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun #if defined(CONFIG_OF_IRQ) || defined(CONFIG_SPARC)
109*4882a593Smuzhiyun /*
110*4882a593Smuzhiyun  * irq_of_parse_and_map() is used by all OF enabled platforms; but SPARC
111*4882a593Smuzhiyun  * implements it differently.  However, the prototype is the same for all,
112*4882a593Smuzhiyun  * so declare it here regardless of the CONFIG_OF_IRQ setting.
113*4882a593Smuzhiyun  */
114*4882a593Smuzhiyun extern unsigned int irq_of_parse_and_map(struct device_node *node, int index);
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun #else /* !CONFIG_OF && !CONFIG_SPARC */
irq_of_parse_and_map(struct device_node * dev,int index)117*4882a593Smuzhiyun static inline unsigned int irq_of_parse_and_map(struct device_node *dev,
118*4882a593Smuzhiyun 						int index)
119*4882a593Smuzhiyun {
120*4882a593Smuzhiyun 	return 0;
121*4882a593Smuzhiyun }
122*4882a593Smuzhiyun #endif /* !CONFIG_OF */
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun #endif /* __OF_IRQ_H */
125