ARM: EXYNOS: Enable PMUs for exynos4
authorChanho Park <chanho61.park@samsung.com>
Wed, 12 Dec 2012 05:03:54 +0000 (14:03 +0900)
committerKukjin Kim <kgene.kim@samsung.com>
Mon, 8 Apr 2013 16:47:45 +0000 (01:47 +0900)
This patch defines irq numbers of ARM performance monitoring unit for exynos4.
Firs of all, we need to fix IRQ_PMU correctly and to split pmu initialization
of exynos from plat-samsung for easily defining it.

The number of CPU cores and PMU irq numbers are vary according to soc types.
So, we need to identify each soc type using soc_is_xxx function and to define
the pmu irqs dynamically. For example, the exynos4412 has 4 cpu cores and pmus.

Signed-off-by: Chanho Park <chanho61.park@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
arch/arm/mach-exynos/common.c
arch/arm/mach-exynos/include/mach/irqs.h
arch/arm/plat-samsung/devs.c

index 02e35abd136b4ae39aba1c70a7068715cfdab0c8..603fedb80b0c4924a9ca958e69e027df27cdd5d6 100644 (file)
@@ -39,6 +39,7 @@
 #include <mach/regs-irq.h>
 #include <mach/regs-pmu.h>
 #include <mach/regs-gpio.h>
+#include <mach/irqs.h>
 
 #include <plat/cpu.h>
 #include <plat/devs.h>
@@ -850,3 +851,30 @@ static int __init exynos_init_irq_eint(void)
        return 0;
 }
 arch_initcall(exynos_init_irq_eint);
+
+static struct resource exynos4_pmu_resource[] = {
+       DEFINE_RES_IRQ(EXYNOS4_IRQ_PMU),
+       DEFINE_RES_IRQ(EXYNOS4_IRQ_PMU_CPU1),
+#if defined(CONFIG_SOC_EXYNOS4412)
+       DEFINE_RES_IRQ(EXYNOS4_IRQ_PMU_CPU2),
+       DEFINE_RES_IRQ(EXYNOS4_IRQ_PMU_CPU3),
+#endif
+};
+
+static struct platform_device exynos4_device_pmu = {
+       .name           = "arm-pmu",
+       .num_resources  = ARRAY_SIZE(exynos4_pmu_resource),
+       .resource       = exynos4_pmu_resource,
+};
+
+static int __init exynos_armpmu_init(void)
+{
+       if (!of_have_populated_dt()) {
+               if (soc_is_exynos4210() || soc_is_exynos4212())
+                       exynos4_device_pmu.num_resources = 2;
+               platform_device_register(&exynos4_device_pmu);
+       }
+
+       return 0;
+}
+arch_initcall(exynos_armpmu_init);
index 3874906614034b622dedd0939b59181685d1d977..35fe6d52d2304b30366685925d90513e2f8d1c35 100644 (file)
 #define EXYNOS4_IRQ_ADC1               IRQ_SPI(107)
 #define EXYNOS4_IRQ_PEN1               IRQ_SPI(108)
 #define EXYNOS4_IRQ_KEYPAD             IRQ_SPI(109)
-#define EXYNOS4_IRQ_PMU                        IRQ_SPI(110)
+#define EXYNOS4_IRQ_POWER_PMU          IRQ_SPI(110)
 #define EXYNOS4_IRQ_GPS                        IRQ_SPI(111)
 #define EXYNOS4_IRQ_INTFEEDCTRL_SSS    IRQ_SPI(112)
 #define EXYNOS4_IRQ_SLIMBUS            IRQ_SPI(113)
 #define EXYNOS4_IRQ_TSI                        IRQ_SPI(115)
 #define EXYNOS4_IRQ_SATA               IRQ_SPI(116)
 
+#define EXYNOS4_IRQ_PMU                        COMBINER_IRQ(2, 2)
+#define EXYNOS4_IRQ_PMU_CPU1           COMBINER_IRQ(3, 2)
+#define EXYNOS4_IRQ_PMU_CPU2           COMBINER_IRQ(18, 2)
+#define EXYNOS4_IRQ_PMU_CPU3           COMBINER_IRQ(19, 2)
+
 #define EXYNOS4_IRQ_TMU_TRIG0          COMBINER_IRQ(2, 4)
 #define EXYNOS4_IRQ_TMU_TRIG1          COMBINER_IRQ(3, 4)
 
 #define IRQ_TC                         EXYNOS4_IRQ_PEN0
 
 #define IRQ_KEYPAD                     EXYNOS4_IRQ_KEYPAD
-#define IRQ_PMU                                EXYNOS4_IRQ_PMU
 
 #define IRQ_FIMD0_FIFO                 EXYNOS4_IRQ_FIMD0_FIFO
 #define IRQ_FIMD0_VSYNC                        EXYNOS4_IRQ_FIMD0_VSYNC
index 51afedda9ab61fd761114d79422fb2e34d6e138b..e1124d9fd2b0205908149a59158ee7f0aedd9589 100644 (file)
@@ -1113,7 +1113,7 @@ struct platform_device s5p_device_onenand = {
 
 /* PMU */
 
-#ifdef CONFIG_PLAT_S5P
+#if defined(CONFIG_PLAT_S5P) && !defined(CONFIG_ARCH_EXYNOS)
 static struct resource s5p_pmu_resource[] = {
        DEFINE_RES_IRQ(IRQ_PMU)
 };