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