[PATCH] ARM: OMAP: Work around hardcoded interrupts
Tony Lindgren
tony at atomide.com
Thu Jan 15 08:20:23 PST 2015
* Marc Zyngier <marc.zyngier at arm.com> [150115 07:24]:
> --- a/arch/arm/mach-omap2/omap4-common.c
> +++ b/arch/arm/mach-omap2/omap4-common.c
> @@ -256,6 +256,38 @@ static int __init omap4_sar_ram_init(void)
> }
> omap_early_initcall(omap4_sar_ram_init);
>
> +static struct of_device_id gic_match[] = {
> + { .compatible = "arm,cortex-a9-gic", },
> + { .compatible = "arm,cortex-a15-gic", },
> + { },
> +};
> +
> +static struct device_node *gic_node;
> +
> +unsigned int omap4_xlate_irq(unsigned int hwirq)
> +{
> + struct of_phandle_args irq_data;
> + unsigned int irq;
> +
> + if (!gic_node)
> + gic_node = of_find_matching_node(NULL, gic_match);
> +
> + if (WARN_ON(!gic_node))
> + return hwirq;
> +
> + irq_data.np = gic_node;
> + irq_data.args_count = 3;
> + irq_data.args[0] = 0;
> + irq_data.args[1] = hwirq - OMAP44XX_IRQ_GIC_START;
> + irq_data.args[2] = IRQ_TYPE_LEVEL_HIGH;
> +
> + irq = irq_create_of_mapping(&irq_data);
> + if (WARN_ON(!irq))
> + irq = hwirq;
> +
> + return irq;
> +}
> +
> void __init omap_gic_of_init(void)
> {
> struct device_node *np;
Thanks for the quick fix, this is is fine with me as long as we
don't have other legacy users. At least I did not find any other
legacy users based on a quick grep.
> --- a/arch/arm/mach-omap2/omap_hwmod_54xx_data.c
> +++ b/arch/arm/mach-omap2/omap_hwmod_54xx_data.c
> @@ -288,6 +288,7 @@ static struct omap_hwmod omap54xx_dma_system_hwmod = {
> .class = &omap54xx_dma_hwmod_class,
> .clkdm_name = "dma_clkdm",
> .mpu_irqs = omap54xx_dma_system_irqs,
> + .xlate_irq = omap4_xlate_irq,
> .main_clk = "l3_iclk_div",
> .prcm = {
> .omap4 = {
We could now drop the legacy DMA init completely for omap4 and later.
But that would require patching the legacy DMA for the exported
functions.. So probably not doable for the -rc series and does not
solve the issue with other legacy IRQ users.
> --- a/arch/arm/mach-omap2/twl-common.c
> +++ b/arch/arm/mach-omap2/twl-common.c
> @@ -71,9 +71,12 @@ void __init omap4_pmic_init(const char *pmic_type,
> struct i2c_board_info *devices, int nr_devices)
> {
> /* PMIC part*/
> + unsigned int irq;
> +
> omap_mux_init_signal("sys_nirq1", OMAP_PIN_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE);
> omap_mux_init_signal("fref_clk0_out.sys_drm_msecure", OMAP_PIN_OUTPUT);
> - omap_pmic_init(1, 400, pmic_type, 7 + OMAP44XX_IRQ_GIC_START, pmic_data);
> + irq = omap4_xlate_irq(7 + OMAP44XX_IRQ_GIC_START);
> + omap_pmic_init(1, 400, pmic_type, irq, pmic_data);
>
> /* Register additional devices on i2c1 bus if needed */
> if (devices)
FYI, I posted a patch yesterday to drop the legacy init code
for twl6040 as the legacy omap4_pmic_init() is no longer used.
No need to change this patch though.
So unless somebody has better ideas for the fix for -rc series,
I'll queue this with the twl6040 code removal patch.
Regards,
Tony
More information about the linux-arm-kernel
mailing list