[PATCH] ARM: Tegra: dt: Set up an OF IRQ translation range

Grant Likely grant.likely at secretlab.ca
Sat Apr 30 09:19:31 EST 2011


On Fri, Apr 29, 2011 at 04:31:33PM -0600, Stephen Warren wrote:
> Without this, none of the devicetree devices in tegra-harmony.dts can
> map interrupts, and the system fails to boot.
> 
> Signed-off-by: Stephen Warren <swarren at nvidia.com>
> ---
> Note: This patch is based on Grant's latest
> git://git.secretlab.ca/git/linux-2.6 devicetree/test
> plus all the Tegra fixes I recently posted to linaro-dev, which in
> particular move tegra-harmony.dts to a different location.
> 
> Question: It seems like the call to of_irq_domain_add_simple should be
> part of arch/arm/common/gic.c:gic_init(), rather than each SoC's DT board
> file having to do this. However, that'd require gic_init having an OF
> device node to pass to of_irq_domain_add_simple.

I agree.  We could add a variant of gic_init that accepts a device
node so that it can take care of setting up a simple domain.  I've
actually got a patch that I've been working on that embeds
of_irq_domain in struct gic_chip_data() so that it has direct access
to the hw context, which may end up being a cleaner overall solution.

> Question 2: Should the range of IRQ numbers cover just the IRQs directly
> managed by the GIC itself, or cover the entire range of IRQ numbers for
> the SoC? Put another way, should it include mappings for a GPIO controller
> then aggregates interrupts from N GPIOs into 1 or M GIC interrupts, or not?
> Put yet another way, should the code pass INT_MAIN_NR or NR_IRQS for Tegra?
> I suspect the former, and that child interrupt devices should themselves
> call of_irq_domain_add_simple to set up their mappings?

If you're talking about GPIOs, then probably not since you'll want
your GPIO controller described using a different node from the irq
controller.  If all of the irqs will be described using a single node,
then it makes sense to have a separate of_irq_domain registration for
each node (otherwise you have to jump through all kinds of hoops to
make it work).

>From an SoC perspective, if the chip is documented as having a single
flat irq numberspace, even if it is implemented by multiple gics, then
it makes a certain amount of sense to describe the whole irq complex
with a single node and of_irq_domain().  The flip side is that Russell
wants, and I agree, to have a common binding as must as possible for
all the different irq controllers that are out there; particularly in
light of the irq_chip_generic work that Thomas is carving out.

> 
> Question 3: I'm not sure "arm,gic" is the correct sanctioned compatible value?

I really prefer to name stuff like this after the specific
implementation, like "nvidia,tegra250-gic", with a possible
'compatible' string of the arm logic core: "arm,gic".  Also, I'd be a
lot happier if I knew more about how different versions of the gic
spec are handled, and if some of that version information could be
encoded in the compatible value.

g.

> 
>  arch/arm/boot/dts/tegra-harmony.dts |    2 ++
>  arch/arm/mach-tegra/board-dt.c      |   13 +++++++++++++
>  2 files changed, 15 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm/boot/dts/tegra-harmony.dts b/arch/arm/boot/dts/tegra-harmony.dts
> index 6fe09d7..1972f61 100644
> --- a/arch/arm/boot/dts/tegra-harmony.dts
> +++ b/arch/arm/boot/dts/tegra-harmony.dts
> @@ -26,8 +26,10 @@
>  		ranges;
>  
>  		intc: intc {
> +			compatible = "arm,gic";
>  			interrupt-controller;
>  			#interrupt-cells = <1>;
> +			reg = <0x50041000 0x1000 0x50040100 0x100 >;
>  		};
>  	};
>  
> diff --git a/arch/arm/mach-tegra/board-dt.c b/arch/arm/mach-tegra/board-dt.c
> index aa37783..894c7a3 100644
> --- a/arch/arm/mach-tegra/board-dt.c
> +++ b/arch/arm/mach-tegra/board-dt.c
> @@ -22,7 +22,9 @@
>  #include <linux/clk.h>
>  #include <linux/dma-mapping.h>
>  #include <linux/of.h>
> +#include <linux/of_address.h>
>  #include <linux/of_fdt.h>
> +#include <linux/of_irq.h>
>  #include <linux/of_platform.h>
>  #include <linux/pda_power.h>
>  #include <linux/io.h>
> @@ -137,8 +139,19 @@ static struct of_device_id tegra_dt_match_table[] __initdata = {
>  	{}
>  };
>  
> +struct of_device_id gic_match[] = {
> +	{ .compatible = "arm,gic", }, {}
> +};
> +
>  static void __init tegra_dt_init(void)
>  {
> +	struct device_node *node;
> +
> +	node = of_find_matching_node_by_address(NULL, gic_match,
> +						TEGRA_ARM_INT_DIST_BASE);
> +	if (node)
> +		of_irq_domain_add_simple(node, INT_GIC_BASE, INT_MAIN_NR);
> +
>  	/*
>  	 * Before registering devices; tell Linux about which device nodes
>  	 * are intended to be registered so that it doesn't create devices
> -- 
> 1.7.0.4
> 


More information about the devicetree-discuss mailing list