ARM: 6057/1: Realview: register PMU IRQs during board initialisation
authorWill Deacon <will.deacon@arm.com>
Thu, 15 Apr 2010 09:16:26 +0000 (10:16 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sun, 2 May 2010 08:35:40 +0000 (09:35 +0100)
This patch updates the initialisation routines for the Realview boards
and the Versatile Express board [ca9x4 tile] so that they register their
PMU IRQs with the PMU framework in the Kernel.

Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mach-realview/realview_eb.c
arch/arm/mach-realview/realview_pb1176.c
arch/arm/mach-realview/realview_pb11mp.c
arch/arm/mach-realview/realview_pba8.c
arch/arm/mach-realview/realview_pbx.c
arch/arm/mach-vexpress/ct-ca9x4.c
arch/arm/mach-vexpress/include/mach/ct-ca9x4.h

index 006765f..422ccd7 100644 (file)
@@ -31,6 +31,7 @@
 #include <asm/irq.h>
 #include <asm/leds.h>
 #include <asm/mach-types.h>
+#include <asm/pmu.h>
 #include <asm/hardware/gic.h>
 #include <asm/hardware/cache-l2x0.h>
 #include <asm/localtimer.h>
@@ -292,6 +293,36 @@ static struct resource realview_eb_isp1761_resources[] = {
        },
 };
 
+static struct resource pmu_resources[] = {
+       [0] = {
+               .start          = IRQ_EB11MP_PMU_CPU0,
+               .end            = IRQ_EB11MP_PMU_CPU0,
+               .flags          = IORESOURCE_IRQ,
+       },
+       [1] = {
+               .start          = IRQ_EB11MP_PMU_CPU1,
+               .end            = IRQ_EB11MP_PMU_CPU1,
+               .flags          = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start          = IRQ_EB11MP_PMU_CPU2,
+               .end            = IRQ_EB11MP_PMU_CPU2,
+               .flags          = IORESOURCE_IRQ,
+       },
+       [3] = {
+               .start          = IRQ_EB11MP_PMU_CPU3,
+               .end            = IRQ_EB11MP_PMU_CPU3,
+               .flags          = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device pmu_device = {
+       .name                   = "arm-pmu",
+       .id                     = ARM_PMU_DEVICE_CPU,
+       .num_resources          = ARRAY_SIZE(pmu_resources),
+       .resource               = pmu_resources,
+};
+
 static void __init gic_init_irq(void)
 {
        if (core_tile_eb11mp() || core_tile_a9mp()) {
@@ -405,6 +436,7 @@ static void __init realview_eb_init(void)
                 * Bits:  .... ...0 0111 1001 0000 .... .... .... */
                l2x0_init(__io_address(REALVIEW_EB11MP_L220_BASE), 0x00790000, 0xfe000fff);
 #endif
+               platform_device_register(&pmu_device);
        }
 
        realview_flash_register(&realview_eb_flash_resource, 1);
index 217f7c1..96568eb 100644 (file)
@@ -31,6 +31,7 @@
 #include <asm/irq.h>
 #include <asm/leds.h>
 #include <asm/mach-types.h>
+#include <asm/pmu.h>
 #include <asm/hardware/gic.h>
 #include <asm/hardware/cache-l2x0.h>
 
@@ -261,6 +262,19 @@ static struct resource realview_pb1176_isp1761_resources[] = {
        },
 };
 
+static struct resource pmu_resource = {
+       .start          = IRQ_DC1176_CORE_PMU,
+       .end            = IRQ_DC1176_CORE_PMU,
+       .flags          = IORESOURCE_IRQ,
+};
+
+static struct platform_device pmu_device = {
+       .name                   = "arm-pmu",
+       .id                     = ARM_PMU_DEVICE_CPU,
+       .num_resources          = 1,
+       .resource               = &pmu_resource,
+};
+
 static void __init gic_init_irq(void)
 {
        /* ARM1176 DevChip GIC, primary */
@@ -322,6 +336,7 @@ static void __init realview_pb1176_init(void)
        realview_eth_register(NULL, realview_pb1176_smsc911x_resources);
        platform_device_register(&realview_i2c_device);
        realview_usb_register(realview_pb1176_isp1761_resources);
+       platform_device_register(&pmu_device);
 
        for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
                struct amba_device *d = amba_devs[i];
index 9ef2ecc..7fbefbb 100644 (file)
@@ -31,6 +31,7 @@
 #include <asm/irq.h>
 #include <asm/leds.h>
 #include <asm/mach-types.h>
+#include <asm/pmu.h>
 #include <asm/hardware/gic.h>
 #include <asm/hardware/cache-l2x0.h>
 #include <asm/localtimer.h>
@@ -258,6 +259,36 @@ static struct resource realview_pb11mp_isp1761_resources[] = {
        },
 };
 
+static struct resource pmu_resources[] = {
+       [0] = {
+               .start          = IRQ_TC11MP_PMU_CPU0,
+               .end            = IRQ_TC11MP_PMU_CPU0,
+               .flags          = IORESOURCE_IRQ,
+       },
+       [1] = {
+               .start          = IRQ_TC11MP_PMU_CPU1,
+               .end            = IRQ_TC11MP_PMU_CPU1,
+               .flags          = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start          = IRQ_TC11MP_PMU_CPU2,
+               .end            = IRQ_TC11MP_PMU_CPU2,
+               .flags          = IORESOURCE_IRQ,
+       },
+       [3] = {
+               .start          = IRQ_TC11MP_PMU_CPU3,
+               .end            = IRQ_TC11MP_PMU_CPU3,
+               .flags          = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device pmu_device = {
+       .name                   = "arm-pmu",
+       .id                     = ARM_PMU_DEVICE_CPU,
+       .num_resources          = ARRAY_SIZE(pmu_resources),
+       .resource               = pmu_resources,
+};
+
 static void __init gic_init_irq(void)
 {
        unsigned int pldctrl;
@@ -327,6 +358,7 @@ static void __init realview_pb11mp_init(void)
        platform_device_register(&realview_i2c_device);
        platform_device_register(&realview_cf_device);
        realview_usb_register(realview_pb11mp_isp1761_resources);
+       platform_device_register(&pmu_device);
 
        for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
                struct amba_device *d = amba_devs[i];
index 2fab3a6..d3c113b 100644 (file)
@@ -30,6 +30,7 @@
 #include <asm/irq.h>
 #include <asm/leds.h>
 #include <asm/mach-types.h>
+#include <asm/pmu.h>
 #include <asm/hardware/gic.h>
 
 #include <asm/mach/arch.h>
@@ -248,6 +249,19 @@ static struct resource realview_pba8_isp1761_resources[] = {
        },
 };
 
+static struct resource pmu_resource = {
+       .start          = IRQ_PBA8_PMU,
+       .end            = IRQ_PBA8_PMU,
+       .flags          = IORESOURCE_IRQ,
+};
+
+static struct platform_device pmu_device = {
+       .name                   = "arm-pmu",
+       .id                     = ARM_PMU_DEVICE_CPU,
+       .num_resources          = 1,
+       .resource               = &pmu_resource,
+};
+
 static void __init gic_init_irq(void)
 {
        /* ARM PB-A8 on-board GIC */
@@ -294,6 +308,7 @@ static void __init realview_pba8_init(void)
        platform_device_register(&realview_i2c_device);
        platform_device_register(&realview_cf_device);
        realview_usb_register(realview_pba8_isp1761_resources);
+       platform_device_register(&pmu_device);
 
        for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
                struct amba_device *d = amba_devs[i];
index d94857e..a235ba3 100644 (file)
@@ -29,6 +29,7 @@
 #include <asm/irq.h>
 #include <asm/leds.h>
 #include <asm/mach-types.h>
+#include <asm/pmu.h>
 #include <asm/smp_twd.h>
 #include <asm/hardware/gic.h>
 #include <asm/hardware/cache-l2x0.h>
@@ -270,6 +271,36 @@ static struct resource realview_pbx_isp1761_resources[] = {
        },
 };
 
+static struct resource pmu_resources[] = {
+       [0] = {
+               .start          = IRQ_PBX_PMU_CPU0,
+               .end            = IRQ_PBX_PMU_CPU0,
+               .flags          = IORESOURCE_IRQ,
+       },
+       [1] = {
+               .start          = IRQ_PBX_PMU_CPU1,
+               .end            = IRQ_PBX_PMU_CPU1,
+               .flags          = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start          = IRQ_PBX_PMU_CPU2,
+               .end            = IRQ_PBX_PMU_CPU2,
+               .flags          = IORESOURCE_IRQ,
+       },
+       [3] = {
+               .start          = IRQ_PBX_PMU_CPU3,
+               .end            = IRQ_PBX_PMU_CPU3,
+               .flags          = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device pmu_device = {
+       .name                   = "arm-pmu",
+       .id                     = ARM_PMU_DEVICE_CPU,
+       .num_resources          = ARRAY_SIZE(pmu_resources),
+       .resource               = pmu_resources,
+};
+
 static void __init gic_init_irq(void)
 {
        /* ARM PBX on-board GIC */
@@ -354,6 +385,7 @@ static void __init realview_pbx_init(void)
                /* 16KB way size, 8-way associativity, parity disabled
                 * Bits:  .. 0 0 0 0 1 00 1 0 1 001 0 000 0 .... .... .... */
                l2x0_init(l2x0_base, 0x02520000, 0xc0000fff);
+               platform_device_register(&pmu_device);
        }
 #endif
 
index 5a0449c..e6f7303 100644 (file)
@@ -4,6 +4,7 @@
 #include <linux/init.h>
 #include <linux/device.h>
 #include <linux/dma-mapping.h>
+#include <linux/platform_device.h>
 #include <linux/amba/bus.h>
 #include <linux/amba/clcd.h>
 
@@ -12,6 +13,7 @@
 #include <asm/hardware/cache-l2x0.h>
 #include <asm/hardware/gic.h>
 #include <asm/mach-types.h>
+#include <asm/pmu.h>
 
 #include <mach/clkdev.h>
 #include <mach/ct-ca9x4.h>
@@ -186,6 +188,36 @@ static struct clk_lookup lookups[] = {
        },
 };
 
+static struct resource pmu_resources[] = {
+       [0] = {
+               .start  = IRQ_CT_CA9X4_PMU_CPU0,
+               .end    = IRQ_CT_CA9X4_PMU_CPU0,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [1] = {
+               .start  = IRQ_CT_CA9X4_PMU_CPU1,
+               .end    = IRQ_CT_CA9X4_PMU_CPU1,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start  = IRQ_CT_CA9X4_PMU_CPU2,
+               .end    = IRQ_CT_CA9X4_PMU_CPU2,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [3] = {
+               .start  = IRQ_CT_CA9X4_PMU_CPU3,
+               .end    = IRQ_CT_CA9X4_PMU_CPU3,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device pmu_device = {
+       .name           = "arm-pmu",
+       .id             = ARM_PMU_DEVICE_CPU,
+       .num_resources  = ARRAY_SIZE(pmu_resources),
+       .resource       = pmu_resources,
+};
+
 static void ct_ca9x4_init(void)
 {
        int i;
@@ -198,6 +230,8 @@ static void ct_ca9x4_init(void)
 
        for (i = 0; i < ARRAY_SIZE(ct_ca9x4_amba_devs); i++)
                amba_device_register(ct_ca9x4_amba_devs[i], &iomem_resource);
+
+       platform_device_register(&pmu_device);
 }
 
 MACHINE_START(VEXPRESS, "ARM-Versatile Express CA9x4")
index 10718e6..8650f04 100644 (file)
@@ -39,5 +39,9 @@
 #define IRQ_CT_CA9X4_TIMER0    80
 #define IRQ_CT_CA9X4_TIMER1    81
 #define IRQ_CT_CA9X4_GPIO      { 82 }
+#define IRQ_CT_CA9X4_PMU_CPU0  92
+#define IRQ_CT_CA9X4_PMU_CPU1  93
+#define IRQ_CT_CA9X4_PMU_CPU2  94
+#define IRQ_CT_CA9X4_PMU_CPU3  95
 
 #endif