[patch v3 3/3] arm: omap4: support pmu

Jean Pihet jean.pihet at newoldbits.com
Mon Mar 7 04:54:34 EST 2011


On Fri, Mar 4, 2011 at 7:16 AM, Santosh Shilimkar
<santosh.shilimkar at ti.com> wrote:
>> -----Original Message-----
>> From: tom.leiming at gmail.com [mailto:tom.leiming at gmail.com]
>> Sent: Thursday, March 03, 2011 4:24 PM
>> To: linux at arm.linux.org.uk
>> Cc: linux-arm-kernel at lists.infradead.org; will.deacon at arm.com; Ming
>> Lei; Santosh Shilimkar; Woodruff Richard; Tony Lindgren; linux-
>> omap at vger.kernel.org
>> Subject: [patch v3 3/3] arm: omap4: support pmu
>>
>> From: Ming Lei <tom.leiming at gmail.com>
>>
>> This patch supports pmu irq routed from CTI, so
>> make pmu/perf working on OMAP4.
>>
>> The idea is from Woodruff Richard in the disscussion
>> about "Oprofile on Pandaboard / Omap4" on
>> pandaboard at googlegroups.com.
>>
>> Cc: Santosh Shilimkar <santosh.shilimkar at ti.com>
>> Cc: Woodruff Richard <r-woodruff2 at ti.com>
>> Cc: Tony Lindgren <tony at atomide.com>
>> Cc: linux-omap at vger.kernel.org
>> Signed-off-by: Ming Lei <tom.leiming at gmail.com>
>> ---
> Looks good.
> Acked-by: Santosh Shilimkar <santosh.shilimkar at ti.com>

Great!

Acked-by: Jean Pihet <j-pihet at ti.com>

Thanks,
Jean

>
>>  arch/arm/mach-omap2/devices.c              |   82
>> +++++++++++++++++++++++++++-
>>  arch/arm/plat-omap/include/plat/omap44xx.h |    2 +
>>  2 files changed, 81 insertions(+), 3 deletions(-)
>>
>> diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-
>> omap2/devices.c
>> index d216976..d97bb5a 100644
>> --- a/arch/arm/mach-omap2/devices.c
>> +++ b/arch/arm/mach-omap2/devices.c
>> @@ -22,6 +22,7 @@
>>  #include <asm/mach-types.h>
>>  #include <asm/mach/map.h>
>>  #include <asm/pmu.h>
>> +#include <asm/cti.h>
>>
>>  #include <plat/tc.h>
>>  #include <plat/board.h>
>> @@ -322,20 +323,95 @@ static struct resource omap3_pmu_resource = {
>>       .flags  = IORESOURCE_IRQ,
>>  };
>>
>> +static struct resource omap4_pmu_resource[] = {
>> +     {
>> +             .start  = OMAP44XX_IRQ_CTI0,
>> +             .end    = OMAP44XX_IRQ_CTI0,
>> +             .flags  = IORESOURCE_IRQ,
>> +     },
>> +     {
>> +             .start  = OMAP44XX_IRQ_CTI1,
>> +             .end    = OMAP44XX_IRQ_CTI1,
>> +             .flags  = IORESOURCE_IRQ,
>> +     }
>> +};
>> +
>>  static struct platform_device omap_pmu_device = {
>>       .name           = "arm-pmu",
>>       .id             = ARM_PMU_DEVICE_CPU,
>>       .num_resources  = 1,
>>  };
>>
>> +static struct arm_pmu_platdata omap4_pmu_data;
>> +static struct cti omap4_cti[2];
>> +
>> +static void omap4_enable_cti(int irq)
>> +{
>> +     if (irq == OMAP44XX_IRQ_CTI0)
>> +             cti_enable(&omap4_cti[0]);
>> +     else if (irq == OMAP44XX_IRQ_CTI1)
>> +             cti_enable(&omap4_cti[1]);
>> +}
>> +
>> +static void omap4_disable_cti(int irq)
>> +{
>> +     if (irq == OMAP44XX_IRQ_CTI0)
>> +             cti_disable(&omap4_cti[0]);
>> +     else if (irq == OMAP44XX_IRQ_CTI1)
>> +             cti_disable(&omap4_cti[1]);
>> +}
>> +
>> +static irqreturn_t omap4_pmu_handler(int irq, void *dev,
>> irq_handler_t handler)
>> +{
>> +     if (irq == OMAP44XX_IRQ_CTI0)
>> +             cti_irq_ack(&omap4_cti[0]);
>> +     else if (irq == OMAP44XX_IRQ_CTI1)
>> +             cti_irq_ack(&omap4_cti[1]);
>> +
>> +     return handler(irq, dev);
>> +}
>> +
>> +static void omap4_configure_pmu_irq(void)
>> +{
>> +     void __iomem *base0;
>> +     void __iomem *base1;
>> +
>> +     base0 = ioremap(OMAP44XX_CTI0_BASE, SZ_4K);
>> +     base1 = ioremap(OMAP44XX_CTI1_BASE, SZ_4K);
>> +     if (!base0 && !base1) {
>> +             pr_err("ioremap for OMAP4 CTI failed\n");
>> +             return;
>> +     }
>> +
>> +     /*configure CTI0 for pmu irq routing*/
>> +     cti_init(&omap4_cti[0], base0, OMAP44XX_IRQ_CTI0, 6);
>> +     cti_unlock(&omap4_cti[0]);
>> +     cti_map_trigger(&omap4_cti[0], 1, 6, 2);
>> +
>> +     /*configure CTI1 for pmu irq routing*/
>> +     cti_init(&omap4_cti[1], base1, OMAP44XX_IRQ_CTI1, 6);
>> +     cti_unlock(&omap4_cti[1]);
>> +     cti_map_trigger(&omap4_cti[1], 1, 6, 2);
>> +
>> +     omap4_pmu_data.handle_irq = omap4_pmu_handler;
>> +     omap4_pmu_data.enable_irq = omap4_enable_cti;
>> +     omap4_pmu_data.disable_irq = omap4_disable_cti;
>> +}
>> +
>>  static void omap_init_pmu(void)
>>  {
>> -     if (cpu_is_omap24xx())
>> +     if (cpu_is_omap24xx()) {
>>               omap_pmu_device.resource = &omap2_pmu_resource;
>> -     else if (cpu_is_omap34xx())
>> +     } else if (cpu_is_omap34xx()) {
>>               omap_pmu_device.resource = &omap3_pmu_resource;
>> -     else
>> +     } else if (cpu_is_omap44xx()) {
>> +             omap_pmu_device.resource = omap4_pmu_resource;
>> +             omap_pmu_device.num_resources = 2;
>> +             omap_pmu_device.dev.platform_data = &omap4_pmu_data;
>> +             omap4_configure_pmu_irq();
>> +     } else {
>>               return;
>> +     }
>>
>>       platform_device_register(&omap_pmu_device);
>>  }
>> diff --git a/arch/arm/plat-omap/include/plat/omap44xx.h
>> b/arch/arm/plat-omap/include/plat/omap44xx.h
>> index ea2b8a6..b127a16 100644
>> --- a/arch/arm/plat-omap/include/plat/omap44xx.h
>> +++ b/arch/arm/plat-omap/include/plat/omap44xx.h
>> @@ -57,5 +57,7 @@
>>  #define OMAP44XX_HSUSB_OHCI_BASE     (L4_44XX_BASE + 0x64800)
>>  #define OMAP44XX_HSUSB_EHCI_BASE     (L4_44XX_BASE + 0x64C00)
>>
>> +#define OMAP44XX_CTI0_BASE           0x54148000
>> +#define OMAP44XX_CTI1_BASE           0x54149000
>>  #endif /* __ASM_ARCH_OMAP44XX_H */
>>
>> --
>> 1.7.3
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>



More information about the linux-arm-kernel mailing list