Re: [PATCH] ARM: OMAP: Work around hardcoded interrupts

2015-01-15 Thread Tony Lindgren
* Marc Zyngier marc.zyng...@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
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] ARM: OMAP: Work around hardcoded interrupts

2015-01-15 Thread Marc Zyngier
Commit 9a1091ef0017 (irqchip: gic: Support hierarchy irq domain)
changed the GIC driver to use a non-legacy IRQ domain on DT
platforms. This patch assumes that DT-driven systems are getting
all of their interrupts from device tree.

Turns out that OMAP has quite a few hidden gems, and still uses
hardcoded interrupts despite having fairly complete DTs.

This patch attempts to work around these by offering a translation
method that can be called directly from the hwmod code, if present.
The same hack is sprinkled over PRCM and TWL.

It isn't pretty, but it seems to do the job without having to add
more hacks to the interrupt controller code.

Tested on OMAP4 (Panda-ES) and OMAP5 (UEVM5432).

Signed-off-by: Marc Zyngier marc.zyng...@arm.com
---
 arch/arm/mach-omap2/common.h   |  1 +
 arch/arm/mach-omap2/omap4-common.c | 32 ++
 arch/arm/mach-omap2/omap_hwmod.c   | 10 --
 arch/arm/mach-omap2/omap_hwmod.h   |  1 +
 arch/arm/mach-omap2/omap_hwmod_44xx_data.c |  5 +
 arch/arm/mach-omap2/omap_hwmod_54xx_data.c |  1 +
 arch/arm/mach-omap2/prcm-common.h  |  1 +
 arch/arm/mach-omap2/prm44xx.c  |  1 +
 arch/arm/mach-omap2/prm_common.c   | 14 +++--
 arch/arm/mach-omap2/twl-common.c   |  5 -
 10 files changed, 66 insertions(+), 5 deletions(-)

diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h
index 377eea8..b664494 100644
--- a/arch/arm/mach-omap2/common.h
+++ b/arch/arm/mach-omap2/common.h
@@ -211,6 +211,7 @@ extern struct device *omap2_get_iva_device(void);
 extern struct device *omap2_get_l3_device(void);
 extern struct device *omap4_get_dsp_device(void);
 
+unsigned int omap4_xlate_irq(unsigned int hwirq);
 void omap_gic_of_init(void);
 
 #ifdef CONFIG_CACHE_L2X0
diff --git a/arch/arm/mach-omap2/omap4-common.c 
b/arch/arm/mach-omap2/omap4-common.c
index b7cb44a..cc30e49 100644
--- 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;
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index cbb908d..9025fff 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -3534,9 +3534,15 @@ int omap_hwmod_fill_resources(struct omap_hwmod *oh, 
struct resource *res)
 
mpu_irqs_cnt = _count_mpu_irqs(oh);
for (i = 0; i  mpu_irqs_cnt; i++) {
+   unsigned int irq;
+
+   if (oh-xlate_irq)
+   irq = oh-xlate_irq((oh-mpu_irqs + i)-irq);
+   else
+   irq = (oh-mpu_irqs + i)-irq;
(res + r)-name = (oh-mpu_irqs + i)-name;
-   (res + r)-start = (oh-mpu_irqs + i)-irq;
-   (res + r)-end = (oh-mpu_irqs + i)-irq;
+   (res + r)-start = irq;
+   (res + r)-end = irq;
(res + r)-flags = IORESOURCE_IRQ;
r++;
}
diff --git a/arch/arm/mach-omap2/omap_hwmod.h b/arch/arm/mach-omap2/omap_hwmod.h
index 35ca6ef..5b42faf 100644
--- a/arch/arm/mach-omap2/omap_hwmod.h
+++ b/arch/arm/mach-omap2/omap_hwmod.h
@@ -676,6 +676,7 @@ struct omap_hwmod {
spinlock_t  _lock;
struct list_headnode;
struct omap_hwmod_ocp_if*_mpu_port;
+   unsigned int(*xlate_irq)(unsigned int);
u16 flags;
u8  mpu_rt_idx;
u8  response_lat;
diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c 
b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
index c314b3c..f5e68a7 100644
--- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
@@ -479,6 +479,7 @@ static struct omap_hwmod omap44xx_dma_system_hwmod = {
.class  = omap44xx_dma_hwmod_class,
.clkdm_name = l3_dma_clkdm,
.mpu_irqs   = omap44xx_dma_system_irqs,
+   .xlate_irq  

Re: [PATCH] ARM: OMAP: Work around hardcoded interrupts

2015-01-15 Thread Nishanth Menon
On 15:20-20150115, Marc Zyngier wrote:
 Commit 9a1091ef0017 (irqchip: gic: Support hierarchy irq domain)
nit-picking which Tony can handle I think..
checkpatch --strict seems picky and recommends using   as follows:
Commit 9a1091ef0017 (irqchip: gic: Support hierarchy irq domain.)

Otherwise,
Acked-by: Nishanth Menon n...@ti.com

-- 
Regards,
Nishanth Menon
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html