Merge common code between PowerPC and Microblaze. SPARC implements irq_of_parse_and_map(), but the implementation is different, so it does not use this code. Signed-off-by: Grant Likely <grant.likely@secretlab.ca> Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Michal Simek <monstr@monstr.eu> Cc: "David S. Miller" <davem@davemloft.net> Cc: Stephen Rothwell <sfr@canb.auug.org.au> Cc: Jeremy Kerr <jeremy.kerr@canonical.com>tirimbino
parent
b505ff5e72
commit
e387344499
@ -0,0 +1,45 @@ |
||||
/*
|
||||
* Derived from arch/i386/kernel/irq.c |
||||
* Copyright (C) 1992 Linus Torvalds |
||||
* Adapted from arch/i386 by Gary Thomas |
||||
* Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) |
||||
* Updated and modified by Cort Dougan <cort@fsmlabs.com> |
||||
* Copyright (C) 1996-2001 Cort Dougan |
||||
* Adapted for Power Macintosh by Paul Mackerras |
||||
* Copyright (C) 1996 Paul Mackerras (paulus@cs.anu.edu.au) |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License |
||||
* as published by the Free Software Foundation; either version |
||||
* 2 of the License, or (at your option) any later version. |
||||
* |
||||
* This file contains the code used to make IRQ descriptions in the |
||||
* device tree to actual irq numbers on an interrupt controller |
||||
* driver. |
||||
*/ |
||||
|
||||
#include <linux/errno.h> |
||||
#include <linux/module.h> |
||||
#include <linux/of.h> |
||||
#include <linux/of_irq.h> |
||||
#include <linux/string.h> |
||||
|
||||
/**
|
||||
* irq_of_parse_and_map - Parse and map an interrupt into linux virq space |
||||
* @device: Device node of the device whose interrupt is to be mapped |
||||
* @index: Index of the interrupt to map |
||||
* |
||||
* This function is a wrapper that chains of_irq_map_one() and |
||||
* irq_create_of_mapping() to make things easier to callers |
||||
*/ |
||||
unsigned int irq_of_parse_and_map(struct device_node *dev, int index) |
||||
{ |
||||
struct of_irq oirq; |
||||
|
||||
if (of_irq_map_one(dev, index, &oirq)) |
||||
return NO_IRQ; |
||||
|
||||
return irq_create_of_mapping(oirq.controller, oirq.specifier, |
||||
oirq.size); |
||||
} |
||||
EXPORT_SYMBOL_GPL(irq_of_parse_and_map); |
@ -0,0 +1,41 @@ |
||||
#ifndef __OF_IRQ_H |
||||
#define __OF_IRQ_H |
||||
|
||||
#if defined(CONFIG_OF) |
||||
struct of_irq; |
||||
#include <linux/types.h> |
||||
#include <linux/of.h> |
||||
|
||||
/*
|
||||
* irq_of_parse_and_map() is used ba all OF enabled platforms; but SPARC |
||||
* implements it differently. However, the prototype is the same for all, |
||||
* so declare it here regardless of the CONFIG_OF_IRQ setting. |
||||
*/ |
||||
extern unsigned int irq_of_parse_and_map(struct device_node *node, int index); |
||||
|
||||
#if defined(CONFIG_OF_IRQ) |
||||
/**
|
||||
* of_irq - container for device_node/irq_specifier pair for an irq controller |
||||
* @controller: pointer to interrupt controller device tree node |
||||
* @size: size of interrupt specifier |
||||
* @specifier: array of cells @size long specifing the specific interrupt |
||||
* |
||||
* This structure is returned when an interrupt is mapped. The controller |
||||
* field needs to be put() after use |
||||
*/ |
||||
#define OF_MAX_IRQ_SPEC 4 /* We handle specifiers of at most 4 cells */ |
||||
struct of_irq { |
||||
struct device_node *controller; /* Interrupt controller node */ |
||||
u32 size; /* Specifier size */ |
||||
u32 specifier[OF_MAX_IRQ_SPEC]; /* Specifier copy */ |
||||
}; |
||||
|
||||
extern int of_irq_map_one(struct device_node *device, int index, |
||||
struct of_irq *out_irq); |
||||
extern unsigned int irq_create_of_mapping(struct device_node *controller, |
||||
const u32 *intspec, |
||||
unsigned int intsize); |
||||
|
||||
#endif /* CONFIG_OF_IRQ */ |
||||
#endif /* CONFIG_OF */ |
||||
#endif /* __OF_IRQ_H */ |
Loading…
Reference in new issue