1e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely#ifndef __OF_IRQ_H
2e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely#define __OF_IRQ_H
3e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely
4e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely#if defined(CONFIG_OF)
5e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likelystruct of_irq;
6e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely#include <linux/types.h>
77dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely#include <linux/errno.h>
8530719b2341fea925f58a5d6be0353fa43a88bafGrant Likely#include <linux/irq.h>
9d593f25ff263b1a7752b7380f8b7d57809206c40Grant Likely#include <linux/irqdomain.h>
107dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely#include <linux/ioport.h>
11e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely#include <linux/of.h>
12e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely
13e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely/*
14e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely * irq_of_parse_and_map() is used ba all OF enabled platforms; but SPARC
15e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely * implements it differently.  However, the prototype is the same for all,
16e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely * so declare it here regardless of the CONFIG_OF_IRQ setting.
17e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely */
18e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likelyextern unsigned int irq_of_parse_and_map(struct device_node *node, int index);
19e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely
20e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely#if defined(CONFIG_OF_IRQ)
21e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely/**
22e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely * of_irq - container for device_node/irq_specifier pair for an irq controller
23e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely * @controller: pointer to interrupt controller device tree node
24e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely * @size: size of interrupt specifier
25e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely * @specifier: array of cells @size long specifing the specific interrupt
26e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely *
27e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely * This structure is returned when an interrupt is mapped. The controller
28e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely * field needs to be put() after use
29e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely */
30e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely#define OF_MAX_IRQ_SPEC		4 /* We handle specifiers of at most 4 cells */
31e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likelystruct of_irq {
32e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely	struct device_node *controller; /* Interrupt controller node */
33e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely	u32 size; /* Specifier size */
34e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely	u32 specifier[OF_MAX_IRQ_SPEC]; /* Specifier copy */
35e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely};
36e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely
37c71a54b0820179e53483d5220cdef1a0df8d5bd1Rob Herringtypedef int (*of_irq_init_cb_t)(struct device_node *, struct device_node *);
38c71a54b0820179e53483d5220cdef1a0df8d5bd1Rob Herring
397dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely/*
407dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely * Workarounds only applied to 32bit powermac machines
417dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely */
427dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely#define OF_IMAP_OLDWORLD_MAC	0x00000001
437dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely#define OF_IMAP_NO_PHANDLE	0x00000002
447dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely
457dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely#if defined(CONFIG_PPC32) && defined(CONFIG_PPC_PMAC)
467dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likelyextern unsigned int of_irq_workarounds;
477dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likelyextern struct device_node *of_irq_dflt_pic;
487dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likelyextern int of_irq_map_oldworld(struct device_node *device, int index,
497dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely			       struct of_irq *out_irq);
507dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely#else /* CONFIG_PPC32 && CONFIG_PPC_PMAC */
517dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely#define of_irq_workarounds (0)
527dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely#define of_irq_dflt_pic (NULL)
537dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likelystatic inline int of_irq_map_oldworld(struct device_node *device, int index,
547dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely				      struct of_irq *out_irq)
557dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely{
567dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely	return -EINVAL;
577dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely}
587dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely#endif /* CONFIG_PPC32 && CONFIG_PPC_PMAC */
597dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely
607dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely
617dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likelyextern int of_irq_map_raw(struct device_node *parent, const u32 *intspec,
627dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely			  u32 ointsize, const u32 *addr,
637dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely			  struct of_irq *out_irq);
64e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likelyextern int of_irq_map_one(struct device_node *device, int index,
65e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely			  struct of_irq *out_irq);
66e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likelyextern unsigned int irq_create_of_mapping(struct device_node *controller,
67e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely					  const u32 *intspec,
68e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely					  unsigned int intsize);
697dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likelyextern int of_irq_to_resource(struct device_node *dev, int index,
707dc2e1134a22dc242175d5321c0c9e97d16eb87bGrant Likely			      struct resource *r);
7152f6537cb2f0b461a9ce3457c01a6cfa2ae0bb22Andres Salomonextern int of_irq_count(struct device_node *dev);
7252f6537cb2f0b461a9ce3457c01a6cfa2ae0bb22Andres Salomonextern int of_irq_to_resource_table(struct device_node *dev,
7352f6537cb2f0b461a9ce3457c01a6cfa2ae0bb22Andres Salomon		struct resource *res, int nr_irqs);
740b2e9a8e10ad2d191e5c37e77f1ce23e148e7a0bMichael Ellermanextern struct device_node *of_irq_find_parent(struct device_node *child);
75e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely
76c71a54b0820179e53483d5220cdef1a0df8d5bd1Rob Herringextern void of_irq_init(const struct of_device_id *matches);
7708a543ad33fc188650801bd36eed4ffe272643e1Grant Likely
78e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely#endif /* CONFIG_OF_IRQ */
79e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely#endif /* CONFIG_OF */
80e3873444990dd6f8a095d1f72b5ad45192f8c506Grant Likely#endif /* __OF_IRQ_H */
81