diff options
| -rw-r--r-- | arch/arm/mach-omap2/Makefile | 1 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/devices.c | 29 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c | 6 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | 6 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/pmu.c | 82 |
5 files changed, 95 insertions, 29 deletions
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index f629df13f157..0deb30072977 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile | |||
| @@ -199,6 +199,7 @@ obj-$(CONFIG_ARCH_OMAP4) += omap_hwmod_44xx_data.o | |||
| 199 | 199 | ||
| 200 | # EMU peripherals | 200 | # EMU peripherals |
| 201 | obj-$(CONFIG_OMAP3_EMU) += emu.o | 201 | obj-$(CONFIG_OMAP3_EMU) += emu.o |
| 202 | obj-$(CONFIG_HW_PERF_EVENTS) += pmu.o | ||
| 202 | 203 | ||
| 203 | # L3 interconnect | 204 | # L3 interconnect |
| 204 | obj-$(CONFIG_ARCH_OMAP3) += omap_l3_smx.o | 205 | obj-$(CONFIG_ARCH_OMAP3) += omap_l3_smx.o |
diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index 33bdbe4633aa..1b7e1c6e5359 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c | |||
| @@ -434,34 +434,6 @@ static void omap_init_mcspi(void) | |||
| 434 | static inline void omap_init_mcspi(void) {} | 434 | static inline void omap_init_mcspi(void) {} |
| 435 | #endif | 435 | #endif |
| 436 | 436 | ||
| 437 | static struct resource omap2_pmu_resource = { | ||
| 438 | .start = 3 + OMAP_INTC_START, | ||
| 439 | .flags = IORESOURCE_IRQ, | ||
| 440 | }; | ||
| 441 | |||
| 442 | static struct resource omap3_pmu_resource = { | ||
| 443 | .start = 3 + OMAP_INTC_START, | ||
| 444 | .flags = IORESOURCE_IRQ, | ||
| 445 | }; | ||
| 446 | |||
| 447 | static struct platform_device omap_pmu_device = { | ||
| 448 | .name = "arm-pmu", | ||
| 449 | .id = ARM_PMU_DEVICE_CPU, | ||
| 450 | .num_resources = 1, | ||
| 451 | }; | ||
| 452 | |||
| 453 | static void omap_init_pmu(void) | ||
| 454 | { | ||
| 455 | if (cpu_is_omap24xx()) | ||
| 456 | omap_pmu_device.resource = &omap2_pmu_resource; | ||
| 457 | else if (cpu_is_omap34xx()) | ||
| 458 | omap_pmu_device.resource = &omap3_pmu_resource; | ||
| 459 | else | ||
| 460 | return; | ||
| 461 | |||
| 462 | platform_device_register(&omap_pmu_device); | ||
| 463 | } | ||
| 464 | |||
| 465 | /** | 437 | /** |
| 466 | * omap_init_rng - bind the RNG hwmod to the RNG omap_device | 438 | * omap_init_rng - bind the RNG hwmod to the RNG omap_device |
| 467 | * | 439 | * |
| @@ -664,7 +636,6 @@ static int __init omap2_init_devices(void) | |||
| 664 | omap_init_mcpdm(); | 636 | omap_init_mcpdm(); |
| 665 | omap_init_mcspi(); | 637 | omap_init_mcspi(); |
| 666 | } | 638 | } |
| 667 | omap_init_pmu(); | ||
| 668 | omap_init_sti(); | 639 | omap_init_sti(); |
| 669 | omap_init_rng(); | 640 | omap_init_rng(); |
| 670 | omap_init_sham(); | 641 | omap_init_sham(); |
diff --git a/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c b/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c index de39017d2e28..d59a9ce40d2a 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c | |||
| @@ -218,8 +218,14 @@ struct omap_hwmod omap2xxx_l4_wkup_hwmod = { | |||
| 218 | }; | 218 | }; |
| 219 | 219 | ||
| 220 | /* MPU */ | 220 | /* MPU */ |
| 221 | static struct omap_hwmod_irq_info omap2xxx_mpu_irqs[] = { | ||
| 222 | { .name = "pmu", .irq = 3 }, | ||
| 223 | { .irq = -1 } | ||
| 224 | }; | ||
| 225 | |||
| 221 | struct omap_hwmod omap2xxx_mpu_hwmod = { | 226 | struct omap_hwmod omap2xxx_mpu_hwmod = { |
| 222 | .name = "mpu", | 227 | .name = "mpu", |
| 228 | .mpu_irqs = omap2xxx_mpu_irqs, | ||
| 223 | .class = &mpu_hwmod_class, | 229 | .class = &mpu_hwmod_class, |
| 224 | .main_clk = "mpu_ck", | 230 | .main_clk = "mpu_ck", |
| 225 | }; | 231 | }; |
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index ffc014244386..4ad1f2b270af 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | |||
| @@ -93,8 +93,14 @@ static struct omap_hwmod omap3xxx_l4_sec_hwmod = { | |||
| 93 | }; | 93 | }; |
| 94 | 94 | ||
| 95 | /* MPU */ | 95 | /* MPU */ |
| 96 | static struct omap_hwmod_irq_info omap3xxx_mpu_irqs[] = { | ||
| 97 | { .name = "pmu", .irq = 3 }, | ||
| 98 | { .irq = -1 } | ||
| 99 | }; | ||
| 100 | |||
| 96 | static struct omap_hwmod omap3xxx_mpu_hwmod = { | 101 | static struct omap_hwmod omap3xxx_mpu_hwmod = { |
| 97 | .name = "mpu", | 102 | .name = "mpu", |
| 103 | .mpu_irqs = omap3xxx_mpu_irqs, | ||
| 98 | .class = &mpu_hwmod_class, | 104 | .class = &mpu_hwmod_class, |
| 99 | .main_clk = "arm_fck", | 105 | .main_clk = "arm_fck", |
| 100 | }; | 106 | }; |
diff --git a/arch/arm/mach-omap2/pmu.c b/arch/arm/mach-omap2/pmu.c new file mode 100644 index 000000000000..cf68bab4fde1 --- /dev/null +++ b/arch/arm/mach-omap2/pmu.c | |||
| @@ -0,0 +1,82 @@ | |||
| 1 | /* | ||
| 2 | * OMAP2 ARM Performance Monitoring Unit (PMU) Support | ||
| 3 | * | ||
| 4 | * Copyright (C) 2012 Texas Instruments, Inc. | ||
| 5 | * | ||
| 6 | * Contacts: | ||
| 7 | * Jon Hunter <jon-hunter@ti.com> | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or modify | ||
| 10 | * it under the terms of the GNU General Public License as published by | ||
| 11 | * the Free Software Foundation; either version 2 of the License, or | ||
| 12 | * (at your option) any later version. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include <asm/pmu.h> | ||
| 16 | |||
| 17 | #include <plat/omap_hwmod.h> | ||
| 18 | #include <plat/omap_device.h> | ||
| 19 | |||
| 20 | static char *omap2_pmu_oh_names[] = {"mpu"}; | ||
| 21 | static char *omap3_pmu_oh_names[] = {"mpu", "debugss"}; | ||
| 22 | static struct platform_device *omap_pmu_dev; | ||
| 23 | |||
| 24 | /** | ||
| 25 | * omap2_init_pmu - creates and registers PMU platform device | ||
| 26 | * @oh_num: Number of OMAP HWMODs required to create PMU device | ||
| 27 | * @oh_names: Array of OMAP HWMODS names required to create PMU device | ||
| 28 | * | ||
| 29 | * Uses OMAP HWMOD framework to create and register an ARM PMU device | ||
| 30 | * from a list of HWMOD names passed. Currently supports OMAP2 and | ||
| 31 | * OMAP3 devices. | ||
| 32 | */ | ||
| 33 | static int __init omap2_init_pmu(unsigned oh_num, char *oh_names[]) | ||
| 34 | { | ||
| 35 | int i; | ||
| 36 | struct omap_hwmod *oh[2]; | ||
| 37 | char *dev_name = "arm-pmu"; | ||
| 38 | |||
| 39 | if ((!oh_num) || (oh_num > 2)) | ||
| 40 | return -EINVAL; | ||
| 41 | |||
| 42 | for (i = 0; i < oh_num; i++) { | ||
| 43 | oh[i] = omap_hwmod_lookup(oh_names[i]); | ||
| 44 | if (!oh[i]) { | ||
| 45 | pr_err("Could not look up %s hwmod\n", oh_names[i]); | ||
| 46 | return -ENODEV; | ||
| 47 | } | ||
| 48 | } | ||
| 49 | |||
| 50 | omap_pmu_dev = omap_device_build_ss(dev_name, -1, oh, oh_num, NULL, 0, | ||
| 51 | NULL, 0, 0); | ||
| 52 | WARN(IS_ERR(omap_pmu_dev), "Can't build omap_device for %s.\n", | ||
| 53 | dev_name); | ||
| 54 | |||
| 55 | return IS_ERR(omap_pmu_dev) ? PTR_ERR(omap_pmu_dev) : 0; | ||
| 56 | } | ||
| 57 | |||
| 58 | static int __init omap_init_pmu(void) | ||
| 59 | { | ||
| 60 | unsigned oh_num; | ||
| 61 | char **oh_names; | ||
| 62 | |||
| 63 | /* | ||
| 64 | * To create an ARM-PMU device the following HWMODs | ||
| 65 | * are required for the various OMAP2+ devices. | ||
| 66 | * | ||
| 67 | * OMAP24xx: mpu | ||
| 68 | * OMAP3xxx: mpu, debugss | ||
| 69 | */ | ||
| 70 | if (cpu_is_omap24xx()) { | ||
| 71 | oh_num = ARRAY_SIZE(omap2_pmu_oh_names); | ||
| 72 | oh_names = omap2_pmu_oh_names; | ||
| 73 | } else if (cpu_is_omap34xx()) { | ||
| 74 | oh_num = ARRAY_SIZE(omap3_pmu_oh_names); | ||
| 75 | oh_names = omap3_pmu_oh_names; | ||
| 76 | } else { | ||
| 77 | return 0; | ||
| 78 | } | ||
| 79 | |||
| 80 | return omap2_init_pmu(oh_num, oh_names); | ||
| 81 | } | ||
| 82 | subsys_initcall(omap_init_pmu); | ||
