diff options
| author | Will Deacon <will.deacon@arm.com> | 2010-04-15 05:16:26 -0400 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-05-02 04:35:40 -0400 |
| commit | f417cbad7394fdccec850d13d7d5621516d693ce (patch) | |
| tree | 78a14c7f605ee810efa2f3ccd29841c98ecdd8f3 | |
| parent | 59ac59f6f1432aa9417d2592bdfd17c99804dd66 (diff) | |
ARM: 6057/1: Realview: register PMU IRQs during board initialisation
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>
| -rw-r--r-- | arch/arm/mach-realview/realview_eb.c | 32 | ||||
| -rw-r--r-- | arch/arm/mach-realview/realview_pb1176.c | 15 | ||||
| -rw-r--r-- | arch/arm/mach-realview/realview_pb11mp.c | 32 | ||||
| -rw-r--r-- | arch/arm/mach-realview/realview_pba8.c | 15 | ||||
| -rw-r--r-- | arch/arm/mach-realview/realview_pbx.c | 32 | ||||
| -rw-r--r-- | arch/arm/mach-vexpress/ct-ca9x4.c | 34 | ||||
| -rw-r--r-- | arch/arm/mach-vexpress/include/mach/ct-ca9x4.h | 4 |
7 files changed, 164 insertions, 0 deletions
diff --git a/arch/arm/mach-realview/realview_eb.c b/arch/arm/mach-realview/realview_eb.c index 006765fd204c..422ccd70d5f5 100644 --- a/arch/arm/mach-realview/realview_eb.c +++ b/arch/arm/mach-realview/realview_eb.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | #include <asm/irq.h> | 31 | #include <asm/irq.h> |
| 32 | #include <asm/leds.h> | 32 | #include <asm/leds.h> |
| 33 | #include <asm/mach-types.h> | 33 | #include <asm/mach-types.h> |
| 34 | #include <asm/pmu.h> | ||
| 34 | #include <asm/hardware/gic.h> | 35 | #include <asm/hardware/gic.h> |
| 35 | #include <asm/hardware/cache-l2x0.h> | 36 | #include <asm/hardware/cache-l2x0.h> |
| 36 | #include <asm/localtimer.h> | 37 | #include <asm/localtimer.h> |
| @@ -292,6 +293,36 @@ static struct resource realview_eb_isp1761_resources[] = { | |||
| 292 | }, | 293 | }, |
| 293 | }; | 294 | }; |
| 294 | 295 | ||
| 296 | static struct resource pmu_resources[] = { | ||
| 297 | [0] = { | ||
| 298 | .start = IRQ_EB11MP_PMU_CPU0, | ||
| 299 | .end = IRQ_EB11MP_PMU_CPU0, | ||
| 300 | .flags = IORESOURCE_IRQ, | ||
| 301 | }, | ||
| 302 | [1] = { | ||
| 303 | .start = IRQ_EB11MP_PMU_CPU1, | ||
| 304 | .end = IRQ_EB11MP_PMU_CPU1, | ||
| 305 | .flags = IORESOURCE_IRQ, | ||
| 306 | }, | ||
| 307 | [2] = { | ||
| 308 | .start = IRQ_EB11MP_PMU_CPU2, | ||
| 309 | .end = IRQ_EB11MP_PMU_CPU2, | ||
| 310 | .flags = IORESOURCE_IRQ, | ||
| 311 | }, | ||
| 312 | [3] = { | ||
| 313 | .start = IRQ_EB11MP_PMU_CPU3, | ||
| 314 | .end = IRQ_EB11MP_PMU_CPU3, | ||
| 315 | .flags = IORESOURCE_IRQ, | ||
| 316 | }, | ||
| 317 | }; | ||
| 318 | |||
| 319 | static struct platform_device pmu_device = { | ||
| 320 | .name = "arm-pmu", | ||
| 321 | .id = ARM_PMU_DEVICE_CPU, | ||
| 322 | .num_resources = ARRAY_SIZE(pmu_resources), | ||
| 323 | .resource = pmu_resources, | ||
| 324 | }; | ||
| 325 | |||
| 295 | static void __init gic_init_irq(void) | 326 | static void __init gic_init_irq(void) |
| 296 | { | 327 | { |
| 297 | if (core_tile_eb11mp() || core_tile_a9mp()) { | 328 | if (core_tile_eb11mp() || core_tile_a9mp()) { |
| @@ -405,6 +436,7 @@ static void __init realview_eb_init(void) | |||
| 405 | * Bits: .... ...0 0111 1001 0000 .... .... .... */ | 436 | * Bits: .... ...0 0111 1001 0000 .... .... .... */ |
| 406 | l2x0_init(__io_address(REALVIEW_EB11MP_L220_BASE), 0x00790000, 0xfe000fff); | 437 | l2x0_init(__io_address(REALVIEW_EB11MP_L220_BASE), 0x00790000, 0xfe000fff); |
| 407 | #endif | 438 | #endif |
| 439 | platform_device_register(&pmu_device); | ||
| 408 | } | 440 | } |
| 409 | 441 | ||
| 410 | realview_flash_register(&realview_eb_flash_resource, 1); | 442 | realview_flash_register(&realview_eb_flash_resource, 1); |
diff --git a/arch/arm/mach-realview/realview_pb1176.c b/arch/arm/mach-realview/realview_pb1176.c index 217f7c19551e..96568ebfa2bb 100644 --- a/arch/arm/mach-realview/realview_pb1176.c +++ b/arch/arm/mach-realview/realview_pb1176.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | #include <asm/irq.h> | 31 | #include <asm/irq.h> |
| 32 | #include <asm/leds.h> | 32 | #include <asm/leds.h> |
| 33 | #include <asm/mach-types.h> | 33 | #include <asm/mach-types.h> |
| 34 | #include <asm/pmu.h> | ||
| 34 | #include <asm/hardware/gic.h> | 35 | #include <asm/hardware/gic.h> |
| 35 | #include <asm/hardware/cache-l2x0.h> | 36 | #include <asm/hardware/cache-l2x0.h> |
| 36 | 37 | ||
| @@ -261,6 +262,19 @@ static struct resource realview_pb1176_isp1761_resources[] = { | |||
| 261 | }, | 262 | }, |
| 262 | }; | 263 | }; |
| 263 | 264 | ||
| 265 | static struct resource pmu_resource = { | ||
| 266 | .start = IRQ_DC1176_CORE_PMU, | ||
| 267 | .end = IRQ_DC1176_CORE_PMU, | ||
| 268 | .flags = IORESOURCE_IRQ, | ||
| 269 | }; | ||
| 270 | |||
| 271 | static struct platform_device pmu_device = { | ||
| 272 | .name = "arm-pmu", | ||
| 273 | .id = ARM_PMU_DEVICE_CPU, | ||
| 274 | .num_resources = 1, | ||
| 275 | .resource = &pmu_resource, | ||
| 276 | }; | ||
| 277 | |||
| 264 | static void __init gic_init_irq(void) | 278 | static void __init gic_init_irq(void) |
| 265 | { | 279 | { |
| 266 | /* ARM1176 DevChip GIC, primary */ | 280 | /* ARM1176 DevChip GIC, primary */ |
| @@ -322,6 +336,7 @@ static void __init realview_pb1176_init(void) | |||
| 322 | realview_eth_register(NULL, realview_pb1176_smsc911x_resources); | 336 | realview_eth_register(NULL, realview_pb1176_smsc911x_resources); |
| 323 | platform_device_register(&realview_i2c_device); | 337 | platform_device_register(&realview_i2c_device); |
| 324 | realview_usb_register(realview_pb1176_isp1761_resources); | 338 | realview_usb_register(realview_pb1176_isp1761_resources); |
| 339 | platform_device_register(&pmu_device); | ||
| 325 | 340 | ||
| 326 | for (i = 0; i < ARRAY_SIZE(amba_devs); i++) { | 341 | for (i = 0; i < ARRAY_SIZE(amba_devs); i++) { |
| 327 | struct amba_device *d = amba_devs[i]; | 342 | struct amba_device *d = amba_devs[i]; |
diff --git a/arch/arm/mach-realview/realview_pb11mp.c b/arch/arm/mach-realview/realview_pb11mp.c index 9ef2ecc3c098..7fbefbbebaf0 100644 --- a/arch/arm/mach-realview/realview_pb11mp.c +++ b/arch/arm/mach-realview/realview_pb11mp.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | #include <asm/irq.h> | 31 | #include <asm/irq.h> |
| 32 | #include <asm/leds.h> | 32 | #include <asm/leds.h> |
| 33 | #include <asm/mach-types.h> | 33 | #include <asm/mach-types.h> |
| 34 | #include <asm/pmu.h> | ||
| 34 | #include <asm/hardware/gic.h> | 35 | #include <asm/hardware/gic.h> |
| 35 | #include <asm/hardware/cache-l2x0.h> | 36 | #include <asm/hardware/cache-l2x0.h> |
| 36 | #include <asm/localtimer.h> | 37 | #include <asm/localtimer.h> |
| @@ -258,6 +259,36 @@ static struct resource realview_pb11mp_isp1761_resources[] = { | |||
| 258 | }, | 259 | }, |
| 259 | }; | 260 | }; |
| 260 | 261 | ||
| 262 | static struct resource pmu_resources[] = { | ||
| 263 | [0] = { | ||
| 264 | .start = IRQ_TC11MP_PMU_CPU0, | ||
| 265 | .end = IRQ_TC11MP_PMU_CPU0, | ||
| 266 | .flags = IORESOURCE_IRQ, | ||
| 267 | }, | ||
| 268 | [1] = { | ||
| 269 | .start = IRQ_TC11MP_PMU_CPU1, | ||
| 270 | .end = IRQ_TC11MP_PMU_CPU1, | ||
| 271 | .flags = IORESOURCE_IRQ, | ||
| 272 | }, | ||
| 273 | [2] = { | ||
| 274 | .start = IRQ_TC11MP_PMU_CPU2, | ||
| 275 | .end = IRQ_TC11MP_PMU_CPU2, | ||
| 276 | .flags = IORESOURCE_IRQ, | ||
| 277 | }, | ||
| 278 | [3] = { | ||
| 279 | .start = IRQ_TC11MP_PMU_CPU3, | ||
| 280 | .end = IRQ_TC11MP_PMU_CPU3, | ||
| 281 | .flags = IORESOURCE_IRQ, | ||
| 282 | }, | ||
| 283 | }; | ||
| 284 | |||
| 285 | static struct platform_device pmu_device = { | ||
| 286 | .name = "arm-pmu", | ||
| 287 | .id = ARM_PMU_DEVICE_CPU, | ||
| 288 | .num_resources = ARRAY_SIZE(pmu_resources), | ||
| 289 | .resource = pmu_resources, | ||
| 290 | }; | ||
| 291 | |||
| 261 | static void __init gic_init_irq(void) | 292 | static void __init gic_init_irq(void) |
| 262 | { | 293 | { |
| 263 | unsigned int pldctrl; | 294 | unsigned int pldctrl; |
| @@ -327,6 +358,7 @@ static void __init realview_pb11mp_init(void) | |||
| 327 | platform_device_register(&realview_i2c_device); | 358 | platform_device_register(&realview_i2c_device); |
| 328 | platform_device_register(&realview_cf_device); | 359 | platform_device_register(&realview_cf_device); |
| 329 | realview_usb_register(realview_pb11mp_isp1761_resources); | 360 | realview_usb_register(realview_pb11mp_isp1761_resources); |
| 361 | platform_device_register(&pmu_device); | ||
| 330 | 362 | ||
| 331 | for (i = 0; i < ARRAY_SIZE(amba_devs); i++) { | 363 | for (i = 0; i < ARRAY_SIZE(amba_devs); i++) { |
| 332 | struct amba_device *d = amba_devs[i]; | 364 | struct amba_device *d = amba_devs[i]; |
diff --git a/arch/arm/mach-realview/realview_pba8.c b/arch/arm/mach-realview/realview_pba8.c index 2fab3a6d566b..d3c113b3dfce 100644 --- a/arch/arm/mach-realview/realview_pba8.c +++ b/arch/arm/mach-realview/realview_pba8.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #include <asm/irq.h> | 30 | #include <asm/irq.h> |
| 31 | #include <asm/leds.h> | 31 | #include <asm/leds.h> |
| 32 | #include <asm/mach-types.h> | 32 | #include <asm/mach-types.h> |
| 33 | #include <asm/pmu.h> | ||
| 33 | #include <asm/hardware/gic.h> | 34 | #include <asm/hardware/gic.h> |
| 34 | 35 | ||
| 35 | #include <asm/mach/arch.h> | 36 | #include <asm/mach/arch.h> |
| @@ -248,6 +249,19 @@ static struct resource realview_pba8_isp1761_resources[] = { | |||
| 248 | }, | 249 | }, |
| 249 | }; | 250 | }; |
| 250 | 251 | ||
| 252 | static struct resource pmu_resource = { | ||
| 253 | .start = IRQ_PBA8_PMU, | ||
| 254 | .end = IRQ_PBA8_PMU, | ||
| 255 | .flags = IORESOURCE_IRQ, | ||
| 256 | }; | ||
| 257 | |||
| 258 | static struct platform_device pmu_device = { | ||
| 259 | .name = "arm-pmu", | ||
| 260 | .id = ARM_PMU_DEVICE_CPU, | ||
| 261 | .num_resources = 1, | ||
| 262 | .resource = &pmu_resource, | ||
| 263 | }; | ||
| 264 | |||
| 251 | static void __init gic_init_irq(void) | 265 | static void __init gic_init_irq(void) |
| 252 | { | 266 | { |
| 253 | /* ARM PB-A8 on-board GIC */ | 267 | /* ARM PB-A8 on-board GIC */ |
| @@ -294,6 +308,7 @@ static void __init realview_pba8_init(void) | |||
| 294 | platform_device_register(&realview_i2c_device); | 308 | platform_device_register(&realview_i2c_device); |
| 295 | platform_device_register(&realview_cf_device); | 309 | platform_device_register(&realview_cf_device); |
| 296 | realview_usb_register(realview_pba8_isp1761_resources); | 310 | realview_usb_register(realview_pba8_isp1761_resources); |
| 311 | platform_device_register(&pmu_device); | ||
| 297 | 312 | ||
| 298 | for (i = 0; i < ARRAY_SIZE(amba_devs); i++) { | 313 | for (i = 0; i < ARRAY_SIZE(amba_devs); i++) { |
| 299 | struct amba_device *d = amba_devs[i]; | 314 | struct amba_device *d = amba_devs[i]; |
diff --git a/arch/arm/mach-realview/realview_pbx.c b/arch/arm/mach-realview/realview_pbx.c index d94857eb0690..a235ba30996b 100644 --- a/arch/arm/mach-realview/realview_pbx.c +++ b/arch/arm/mach-realview/realview_pbx.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | #include <asm/irq.h> | 29 | #include <asm/irq.h> |
| 30 | #include <asm/leds.h> | 30 | #include <asm/leds.h> |
| 31 | #include <asm/mach-types.h> | 31 | #include <asm/mach-types.h> |
| 32 | #include <asm/pmu.h> | ||
| 32 | #include <asm/smp_twd.h> | 33 | #include <asm/smp_twd.h> |
| 33 | #include <asm/hardware/gic.h> | 34 | #include <asm/hardware/gic.h> |
| 34 | #include <asm/hardware/cache-l2x0.h> | 35 | #include <asm/hardware/cache-l2x0.h> |
| @@ -270,6 +271,36 @@ static struct resource realview_pbx_isp1761_resources[] = { | |||
| 270 | }, | 271 | }, |
| 271 | }; | 272 | }; |
| 272 | 273 | ||
| 274 | static struct resource pmu_resources[] = { | ||
| 275 | [0] = { | ||
| 276 | .start = IRQ_PBX_PMU_CPU0, | ||
| 277 | .end = IRQ_PBX_PMU_CPU0, | ||
| 278 | .flags = IORESOURCE_IRQ, | ||
| 279 | }, | ||
| 280 | [1] = { | ||
| 281 | .start = IRQ_PBX_PMU_CPU1, | ||
| 282 | .end = IRQ_PBX_PMU_CPU1, | ||
| 283 | .flags = IORESOURCE_IRQ, | ||
| 284 | }, | ||
| 285 | [2] = { | ||
| 286 | .start = IRQ_PBX_PMU_CPU2, | ||
| 287 | .end = IRQ_PBX_PMU_CPU2, | ||
| 288 | .flags = IORESOURCE_IRQ, | ||
| 289 | }, | ||
| 290 | [3] = { | ||
| 291 | .start = IRQ_PBX_PMU_CPU3, | ||
| 292 | .end = IRQ_PBX_PMU_CPU3, | ||
| 293 | .flags = IORESOURCE_IRQ, | ||
| 294 | }, | ||
| 295 | }; | ||
| 296 | |||
| 297 | static struct platform_device pmu_device = { | ||
| 298 | .name = "arm-pmu", | ||
| 299 | .id = ARM_PMU_DEVICE_CPU, | ||
| 300 | .num_resources = ARRAY_SIZE(pmu_resources), | ||
| 301 | .resource = pmu_resources, | ||
| 302 | }; | ||
| 303 | |||
| 273 | static void __init gic_init_irq(void) | 304 | static void __init gic_init_irq(void) |
| 274 | { | 305 | { |
| 275 | /* ARM PBX on-board GIC */ | 306 | /* ARM PBX on-board GIC */ |
| @@ -354,6 +385,7 @@ static void __init realview_pbx_init(void) | |||
| 354 | /* 16KB way size, 8-way associativity, parity disabled | 385 | /* 16KB way size, 8-way associativity, parity disabled |
| 355 | * Bits: .. 0 0 0 0 1 00 1 0 1 001 0 000 0 .... .... .... */ | 386 | * Bits: .. 0 0 0 0 1 00 1 0 1 001 0 000 0 .... .... .... */ |
| 356 | l2x0_init(l2x0_base, 0x02520000, 0xc0000fff); | 387 | l2x0_init(l2x0_base, 0x02520000, 0xc0000fff); |
| 388 | platform_device_register(&pmu_device); | ||
| 357 | } | 389 | } |
| 358 | #endif | 390 | #endif |
| 359 | 391 | ||
diff --git a/arch/arm/mach-vexpress/ct-ca9x4.c b/arch/arm/mach-vexpress/ct-ca9x4.c index 5a0449c6f50d..e6f73030d5f0 100644 --- a/arch/arm/mach-vexpress/ct-ca9x4.c +++ b/arch/arm/mach-vexpress/ct-ca9x4.c | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | #include <linux/init.h> | 4 | #include <linux/init.h> |
| 5 | #include <linux/device.h> | 5 | #include <linux/device.h> |
| 6 | #include <linux/dma-mapping.h> | 6 | #include <linux/dma-mapping.h> |
| 7 | #include <linux/platform_device.h> | ||
| 7 | #include <linux/amba/bus.h> | 8 | #include <linux/amba/bus.h> |
| 8 | #include <linux/amba/clcd.h> | 9 | #include <linux/amba/clcd.h> |
| 9 | 10 | ||
| @@ -12,6 +13,7 @@ | |||
| 12 | #include <asm/hardware/cache-l2x0.h> | 13 | #include <asm/hardware/cache-l2x0.h> |
| 13 | #include <asm/hardware/gic.h> | 14 | #include <asm/hardware/gic.h> |
| 14 | #include <asm/mach-types.h> | 15 | #include <asm/mach-types.h> |
| 16 | #include <asm/pmu.h> | ||
| 15 | 17 | ||
| 16 | #include <mach/clkdev.h> | 18 | #include <mach/clkdev.h> |
| 17 | #include <mach/ct-ca9x4.h> | 19 | #include <mach/ct-ca9x4.h> |
| @@ -186,6 +188,36 @@ static struct clk_lookup lookups[] = { | |||
| 186 | }, | 188 | }, |
| 187 | }; | 189 | }; |
| 188 | 190 | ||
| 191 | static struct resource pmu_resources[] = { | ||
| 192 | [0] = { | ||
| 193 | .start = IRQ_CT_CA9X4_PMU_CPU0, | ||
| 194 | .end = IRQ_CT_CA9X4_PMU_CPU0, | ||
| 195 | .flags = IORESOURCE_IRQ, | ||
| 196 | }, | ||
| 197 | [1] = { | ||
| 198 | .start = IRQ_CT_CA9X4_PMU_CPU1, | ||
| 199 | .end = IRQ_CT_CA9X4_PMU_CPU1, | ||
| 200 | .flags = IORESOURCE_IRQ, | ||
| 201 | }, | ||
| 202 | [2] = { | ||
| 203 | .start = IRQ_CT_CA9X4_PMU_CPU2, | ||
| 204 | .end = IRQ_CT_CA9X4_PMU_CPU2, | ||
| 205 | .flags = IORESOURCE_IRQ, | ||
| 206 | }, | ||
| 207 | [3] = { | ||
| 208 | .start = IRQ_CT_CA9X4_PMU_CPU3, | ||
| 209 | .end = IRQ_CT_CA9X4_PMU_CPU3, | ||
| 210 | .flags = IORESOURCE_IRQ, | ||
| 211 | }, | ||
| 212 | }; | ||
| 213 | |||
| 214 | static struct platform_device pmu_device = { | ||
| 215 | .name = "arm-pmu", | ||
| 216 | .id = ARM_PMU_DEVICE_CPU, | ||
| 217 | .num_resources = ARRAY_SIZE(pmu_resources), | ||
| 218 | .resource = pmu_resources, | ||
| 219 | }; | ||
| 220 | |||
| 189 | static void ct_ca9x4_init(void) | 221 | static void ct_ca9x4_init(void) |
| 190 | { | 222 | { |
| 191 | int i; | 223 | int i; |
| @@ -198,6 +230,8 @@ static void ct_ca9x4_init(void) | |||
| 198 | 230 | ||
| 199 | for (i = 0; i < ARRAY_SIZE(ct_ca9x4_amba_devs); i++) | 231 | for (i = 0; i < ARRAY_SIZE(ct_ca9x4_amba_devs); i++) |
| 200 | amba_device_register(ct_ca9x4_amba_devs[i], &iomem_resource); | 232 | amba_device_register(ct_ca9x4_amba_devs[i], &iomem_resource); |
| 233 | |||
| 234 | platform_device_register(&pmu_device); | ||
| 201 | } | 235 | } |
| 202 | 236 | ||
| 203 | MACHINE_START(VEXPRESS, "ARM-Versatile Express CA9x4") | 237 | MACHINE_START(VEXPRESS, "ARM-Versatile Express CA9x4") |
diff --git a/arch/arm/mach-vexpress/include/mach/ct-ca9x4.h b/arch/arm/mach-vexpress/include/mach/ct-ca9x4.h index 10718e654c6a..8650f04136ef 100644 --- a/arch/arm/mach-vexpress/include/mach/ct-ca9x4.h +++ b/arch/arm/mach-vexpress/include/mach/ct-ca9x4.h | |||
| @@ -39,5 +39,9 @@ | |||
| 39 | #define IRQ_CT_CA9X4_TIMER0 80 | 39 | #define IRQ_CT_CA9X4_TIMER0 80 |
| 40 | #define IRQ_CT_CA9X4_TIMER1 81 | 40 | #define IRQ_CT_CA9X4_TIMER1 81 |
| 41 | #define IRQ_CT_CA9X4_GPIO { 82 } | 41 | #define IRQ_CT_CA9X4_GPIO { 82 } |
| 42 | #define IRQ_CT_CA9X4_PMU_CPU0 92 | ||
| 43 | #define IRQ_CT_CA9X4_PMU_CPU1 93 | ||
| 44 | #define IRQ_CT_CA9X4_PMU_CPU2 94 | ||
| 45 | #define IRQ_CT_CA9X4_PMU_CPU3 95 | ||
| 42 | 46 | ||
| 43 | #endif | 47 | #endif |
