aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/mach-omap2/Makefile1
-rw-r--r--arch/arm/mach-omap2/devices.c29
-rw-r--r--arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c6
-rw-r--r--arch/arm/mach-omap2/omap_hwmod_3xxx_data.c6
-rw-r--r--arch/arm/mach-omap2/pmu.c82
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
201obj-$(CONFIG_OMAP3_EMU) += emu.o 201obj-$(CONFIG_OMAP3_EMU) += emu.o
202obj-$(CONFIG_HW_PERF_EVENTS) += pmu.o
202 203
203# L3 interconnect 204# L3 interconnect
204obj-$(CONFIG_ARCH_OMAP3) += omap_l3_smx.o 205obj-$(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)
434static inline void omap_init_mcspi(void) {} 434static inline void omap_init_mcspi(void) {}
435#endif 435#endif
436 436
437static struct resource omap2_pmu_resource = {
438 .start = 3 + OMAP_INTC_START,
439 .flags = IORESOURCE_IRQ,
440};
441
442static struct resource omap3_pmu_resource = {
443 .start = 3 + OMAP_INTC_START,
444 .flags = IORESOURCE_IRQ,
445};
446
447static struct platform_device omap_pmu_device = {
448 .name = "arm-pmu",
449 .id = ARM_PMU_DEVICE_CPU,
450 .num_resources = 1,
451};
452
453static 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 */
221static struct omap_hwmod_irq_info omap2xxx_mpu_irqs[] = {
222 { .name = "pmu", .irq = 3 },
223 { .irq = -1 }
224};
225
221struct omap_hwmod omap2xxx_mpu_hwmod = { 226struct 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 */
96static struct omap_hwmod_irq_info omap3xxx_mpu_irqs[] = {
97 { .name = "pmu", .irq = 3 },
98 { .irq = -1 }
99};
100
96static struct omap_hwmod omap3xxx_mpu_hwmod = { 101static 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
20static char *omap2_pmu_oh_names[] = {"mpu"};
21static char *omap3_pmu_oh_names[] = {"mpu", "debugss"};
22static 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 */
33static 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
58static 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}
82subsys_initcall(omap_init_pmu);