* [patch v2 0/3] arm: pmu: support pmu/perf on OMAP4 @ 2011-03-02 10:56 tom.leiming at gmail.com 2011-03-02 10:56 ` [patch v2 1/3] arm: introduce cross trigger interface helpers tom.leiming at gmail.com ` (2 more replies) 0 siblings, 3 replies; 8+ messages in thread From: tom.leiming at gmail.com @ 2011-03-02 10:56 UTC (permalink / raw) To: linux-arm-kernel Hi, This patches support pmu irq routed from CTI, such as implemented on OMAP4: - introduce some CTI helpers and registers' definition - introduce .enable_irq and .disable_irq into platform_data, so perf irq handler can handle irq correctly if it is routed from CTI on OMAP4 - configure CTI on OMAP4 so that perf can work on OMAP4 The patches have been tested Ok on Pandaboard, and 'perf' does work after applying them. v2: - move cti related code out of perf_event.c - introduce .enable_irq and .disable_irq into platform_data as suggested by Will. v1: - rebase the patch set against 2.6.38-rc6-next-20110301, fix conflicts, which is pointed out by Will Deacon arch/arm/include/asm/cti.h | 177 +++++++++++++++++++++++++++++++++++++++++ arch/arm/include/asm/pmu.h | 15 +++- arch/arm/kernel/perf_event.c | 15 +++- arch/arm/mach-omap2/dbg44xx.h | 18 ++++ arch/arm/mach-omap2/devices.c | 83 ++++++++++++++++++- 5 files changed, 299 insertions(+), 9 deletions(-) thanks, -- Lei Ming ^ permalink raw reply [flat|nested] 8+ messages in thread
* [patch v2 1/3] arm: introduce cross trigger interface helpers 2011-03-02 10:56 [patch v2 0/3] arm: pmu: support pmu/perf on OMAP4 tom.leiming at gmail.com @ 2011-03-02 10:56 ` tom.leiming at gmail.com 2011-03-02 10:56 ` [patch v2 2/3] arm: pmu: allow platform specifc irq enable/disable handling tom.leiming at gmail.com 2011-03-02 10:57 ` [patch v2 3/3] arm: omap4: support pmu tom.leiming at gmail.com 2 siblings, 0 replies; 8+ messages in thread From: tom.leiming at gmail.com @ 2011-03-02 10:56 UTC (permalink / raw) To: linux-arm-kernel From: Ming Lei <tom.leiming@gmail.com> OMAP4 uses cross trigger interface(CTI) to route performance monitor irq to GIC, so introduce cti helpers to make access for cti easily. Signed-off-by: Ming Lei <tom.leiming@gmail.com> --- arch/arm/include/asm/cti.h | 177 ++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 177 insertions(+), 0 deletions(-) create mode 100644 arch/arm/include/asm/cti.h diff --git a/arch/arm/include/asm/cti.h b/arch/arm/include/asm/cti.h new file mode 100644 index 0000000..c9addd3 --- /dev/null +++ b/arch/arm/include/asm/cti.h @@ -0,0 +1,177 @@ +/* + * arch/arm/include/asm/cti.h + */ +#ifndef __ASMARM_CTI_H +#define __ASMARM_CTI_H + +#include <asm/io.h> + +/*The registers' definition is from section 3.2 of + * Embedded Cross Trigger Revision: r0p0 + **/ +#define CTICONTROL 0x000 +#define CTISTATUS 0x004 +#define CTILOCK 0x008 +#define CTIPROTECTION 0x00C +#define CTIINTACK 0x010 +#define CTIAPPSET 0x014 +#define CTIAPPCLEAR 0x018 +#define CTIAPPPULSE 0x01c +#define CTIINEN 0x020 +#define CTIOUTEN 0x0A0 +#define CTITRIGINSTATUS 0x130 +#define CTITRIGOUTSTATUS 0x134 +#define CTICHINSTATUS 0x138 +#define CTICHOUTSTATUS 0x13c +#define CTIPERIPHID0 0xFE0 +#define CTIPERIPHID1 0xFE4 +#define CTIPERIPHID2 0xFE8 +#define CTIPERIPHID3 0xFEC +#define CTIPCELLID0 0xFF0 +#define CTIPCELLID1 0xFF4 +#define CTIPCELLID2 0xFF8 +#define CTIPCELLID3 0xFFC + +/*The two below are from section 3.6.4 of + * CoreSight v1.0 Architecture Specification + **/ +#define LOCKACCESS 0xFB0 +#define LOCKSTATUS 0xFB4 + +/** + * struct cti - cross trigger interface struct + * @base: mapped virtual address for the cti base + * @irq: irq number for the cti + * @trig_out_for_irq: triger out number which will cause + * the @irq happen + * + * cti struct used to operate cti registers. + */ +struct cti { + void *base; + int irq; + int trig_out_for_irq; +}; + +/** + * cti_init - initialize the cti instance + * @cti: cti instance + * @base: mapped virtual address for the cti base + * @irq: irq number for the cti + * @trig_out: triger out number which will cause + * the @irq happen + * + * called by machine code to pass the board dependent + * @base, @irq and @trig_out to cti. + */ +static inline void cti_init(struct cti *cti, + void *base, int irq, int trig_out) +{ + cti->base = base; + cti->irq = irq; + cti->trig_out_for_irq = trig_out; +} + +/** + * cti_map_trigger - use the @chan to map @trig_in to @trig_out + * @cti: cti instance + * @trig_in: trigger in number + * @trig_out: trigger out number + * @channel: channel number + * + * This function maps one trigger in of @trig_in to one trigger + * out of @trig_out using the channel @chan. + */ +static inline void cti_map_trigger(struct cti *cti, + int trig_in, int trig_out, int chan) +{ + void *base = cti->base; + unsigned long val; + + val = __raw_readl(base + CTIINEN + trig_in * 4); + val |= 1 << chan; + __raw_writel(val, base + CTIINEN + trig_in * 4); + + val = __raw_readl(base + CTIOUTEN + trig_out * 4); + val |= 1 << chan; + __raw_writel(val, base + CTIOUTEN + trig_out * 4); +} + +/** + * cti_enable - enable the cti module + * @cti: cti instance + * + * enable the cti module + */ +static inline void cti_enable(struct cti *cti) +{ + __raw_writel(0x1, cti->base); +} + +/** + * cti_disable - disable the cti module + * @cti: cti instance + * + * enable the cti module + */ +static inline void cti_disable(struct cti *cti) +{ + __raw_writel(0, cti->base); +} + +/** + * cti_irq_ack - clear the cti irq + * @cti: cti instance + * + * clear the cti irq + */ +static inline void cti_irq_ack(struct cti *cti) +{ + void *base = cti->base; + unsigned long val; + + val = __raw_readl(base + CTIINTACK); + val |= 1 << cti->trig_out_for_irq; + __raw_writel(val, base + CTIINTACK); +} + +/** + * cti_unlock - unlock cti module + * @cti: cti instance + * + * unlock the cti module, or else any writes to the cti + * module is not allowed. + */ +static inline void cti_unlock(struct cti *cti) +{ + void *base = cti->base; + unsigned long val; + + val = __raw_readl(base + LOCKSTATUS); + + if (val & 1) { + val = 0xC5ACCE55; + __raw_writel(val, base + LOCKACCESS); + } +} + +/** + * cti_unlock - lock cti module + * @cti: cti instance + * + * lock the cti module, so any writes to the cti + * module will be not allowed. + */ +static inline void cti_lock(struct cti *cti) +{ + void *base = cti->base; + unsigned long val; + + val = __raw_readl(base + LOCKSTATUS); + + if (!(val & 1)) { + val = ~0xC5ACCE55; + __raw_writel(val, base + LOCKACCESS); + } +} +#endif -- 1.7.3 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [patch v2 2/3] arm: pmu: allow platform specifc irq enable/disable handling 2011-03-02 10:56 [patch v2 0/3] arm: pmu: support pmu/perf on OMAP4 tom.leiming at gmail.com 2011-03-02 10:56 ` [patch v2 1/3] arm: introduce cross trigger interface helpers tom.leiming at gmail.com @ 2011-03-02 10:56 ` tom.leiming at gmail.com 2011-03-02 12:10 ` Will Deacon [not found] ` <-3190832915456449126@unknownmsgid> 2011-03-02 10:57 ` [patch v2 3/3] arm: omap4: support pmu tom.leiming at gmail.com 2 siblings, 2 replies; 8+ messages in thread From: tom.leiming at gmail.com @ 2011-03-02 10:56 UTC (permalink / raw) To: linux-arm-kernel From: Ming Lei <tom.leiming@gmail.com> This patch introduces .enable_irq and .disable_irq into struct arm_pmu_platdata, so platform specific irq enablement can be handled after request_irq, and platform specific irq disablement can be handled before free_irq. This patch is for support of pmu irq routed from CTI on omap4. Signed-off-by: Ming Lei <tom.leiming@gmail.com> --- arch/arm/include/asm/pmu.h | 15 ++++++++++++--- arch/arm/kernel/perf_event.c | 15 ++++++++++++--- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/arch/arm/include/asm/pmu.h b/arch/arm/include/asm/pmu.h index 7544ce6..e50c542 100644 --- a/arch/arm/include/asm/pmu.h +++ b/arch/arm/include/asm/pmu.h @@ -22,13 +22,22 @@ enum arm_pmu_type { /* * struct arm_pmu_platdata - ARM PMU platform data * - * @handle_irq: an optional handler which will be called from the interrupt and - * passed the address of the low level handler, and can be used to implement - * any platform specific handling before or after calling it. + * @handle_irq: an optional handler which will be called from the + * interrupt and passed the address of the low level handler, + * and can be used to implement any platform specific handling + * before or after calling it. + * @enable_irq: an optional handler which will be called after + * request_irq and be used to handle some platform specific + * irq enablement + * @disable_irq: an optional handler which will be called before + * free_irq and be used to handle some platform specific + * irq disablement */ struct arm_pmu_platdata { irqreturn_t (*handle_irq)(int irq, void *dev, irq_handler_t pmu_handler); + void (*enable_irq)(int irq); + void (*disable_irq)(int irq); }; #ifdef CONFIG_CPU_HAS_PMU diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index 22e194eb..61ff471 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c @@ -422,14 +422,18 @@ armpmu_reserve_hardware(void) pr_warning("unable to request IRQ%d for ARM perf " "counters\n", irq); break; - } + } else if (plat->enable_irq) + plat->enable_irq(irq); } if (err) { for (i = i - 1; i >= 0; --i) { irq = platform_get_irq(pmu_device, i); - if (irq >= 0) + if (irq >= 0) { + if (plat->disable_irq) + plat->disable_irq(irq); free_irq(irq, NULL); + } } release_pmu(pmu_device); pmu_device = NULL; @@ -442,11 +446,16 @@ static void armpmu_release_hardware(void) { int i, irq; + struct arm_pmu_platdata *plat = + dev_get_platdata(&pmu_device->dev); for (i = pmu_device->num_resources - 1; i >= 0; --i) { irq = platform_get_irq(pmu_device, i); - if (irq >= 0) + if (irq >= 0) { + if (plat->disable_irq) + plat->disable_irq(irq); free_irq(irq, NULL); + } } armpmu->stop(); -- 1.7.3 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [patch v2 2/3] arm: pmu: allow platform specifc irq enable/disable handling 2011-03-02 10:56 ` [patch v2 2/3] arm: pmu: allow platform specifc irq enable/disable handling tom.leiming at gmail.com @ 2011-03-02 12:10 ` Will Deacon [not found] ` <-3190832915456449126@unknownmsgid> 1 sibling, 0 replies; 8+ messages in thread From: Will Deacon @ 2011-03-02 12:10 UTC (permalink / raw) To: linux-arm-kernel Hello, > -----Original Message----- > From: tom.leiming at gmail.com [mailto:tom.leiming at gmail.com] > Sent: 02 March 2011 10:57 > To: linux at arm.linux.org.uk > Cc: linux-arm-kernel at lists.infradead.org; Will Deacon; Ming Lei > Subject: [patch v2 2/3] arm: pmu: allow platform specifc irq enable/disable handling > > From: Ming Lei <tom.leiming@gmail.com> > > This patch introduces .enable_irq and .disable_irq into > struct arm_pmu_platdata, so platform specific irq enablement > can be handled after request_irq, and platform specific irq > disablement can be handled before free_irq. > > This patch is for support of pmu irq routed from CTI on omap4. > > Signed-off-by: Ming Lei <tom.leiming@gmail.com> > --- > arch/arm/include/asm/pmu.h | 15 ++++++++++++--- > arch/arm/kernel/perf_event.c | 15 ++++++++++++--- > 2 files changed, 24 insertions(+), 6 deletions(-) [...] Looks good to me. Unfortunately, I don't have an OMAP4 to test this on (contributions welcome :) so I've just eyeballed the code: Reviewed-by: Will Deacon <will.deacon@arm.com> You'll need to wait for the ux500 stuff to be merged before you can get this upstream (Linus W is handling the pull request afaik). Will ^ permalink raw reply [flat|nested] 8+ messages in thread
[parent not found: <-3190832915456449126@unknownmsgid>]
* [patch v2 2/3] arm: pmu: allow platform specifc irq enable/disable handling [not found] ` <-3190832915456449126@unknownmsgid> @ 2011-03-02 14:35 ` Ming Lei 2011-03-02 15:46 ` Will Deacon 0 siblings, 1 reply; 8+ messages in thread From: Ming Lei @ 2011-03-02 14:35 UTC (permalink / raw) To: linux-arm-kernel Hi Will, 2011/3/2 Will Deacon <will.deacon@arm.com>: > Looks good to me. Unfortunately, I don't have an OMAP4 to test this > on (contributions welcome :) so I've just eyeballed the code: > > Reviewed-by: Will Deacon <will.deacon@arm.com> > > You'll need to wait for the ux500 stuff to be merged before you can > get this upstream (Linus W is handling the pull request afaik). Thanks for your review, the ux500 stuff has been merged into -next tree already, so this one may be into -next too. thanks, -- Lei Ming ^ permalink raw reply [flat|nested] 8+ messages in thread
* [patch v2 2/3] arm: pmu: allow platform specifc irq enable/disable handling 2011-03-02 14:35 ` Ming Lei @ 2011-03-02 15:46 ` Will Deacon 0 siblings, 0 replies; 8+ messages in thread From: Will Deacon @ 2011-03-02 15:46 UTC (permalink / raw) To: linux-arm-kernel > Hi Will, Hello, > 2011/3/2 Will Deacon <will.deacon@arm.com>: > > Looks good to me. Unfortunately, I don't have an OMAP4 to test this > > on (contributions welcome :) so I've just eyeballed the code: > > > > Reviewed-by: Will Deacon <will.deacon@arm.com> > > > > You'll need to wait for the ux500 stuff to be merged before you can > > get this upstream (Linus W is handling the pull request afaik). > > Thanks for your review, the ux500 stuff has been merged into -next > tree already, so this one may be into -next too. Ok, that's great. I've just noticed that you've typoed the subject line for the patch (s/specifc/specific/) so you might want to fix that before Sergei spots it! Will ^ permalink raw reply [flat|nested] 8+ messages in thread
* [patch v2 3/3] arm: omap4: support pmu 2011-03-02 10:56 [patch v2 0/3] arm: pmu: support pmu/perf on OMAP4 tom.leiming at gmail.com 2011-03-02 10:56 ` [patch v2 1/3] arm: introduce cross trigger interface helpers tom.leiming at gmail.com 2011-03-02 10:56 ` [patch v2 2/3] arm: pmu: allow platform specifc irq enable/disable handling tom.leiming at gmail.com @ 2011-03-02 10:57 ` tom.leiming at gmail.com 2011-03-02 12:43 ` Santosh Shilimkar 2 siblings, 1 reply; 8+ messages in thread From: tom.leiming at gmail.com @ 2011-03-02 10:57 UTC (permalink / raw) To: linux-arm-kernel From: Ming Lei <tom.leiming@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: Woodruff Richard <r-woodruff2@ti.com> Cc: Tony Lindgren <tony@atomide.com> Cc: linux-omap at vger.kernel.org Signed-off-by: Ming Lei <tom.leiming@gmail.com> --- arch/arm/mach-omap2/dbg44xx.h | 18 +++++++++ arch/arm/mach-omap2/devices.c | 83 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 arch/arm/mach-omap2/dbg44xx.h diff --git a/arch/arm/mach-omap2/dbg44xx.h b/arch/arm/mach-omap2/dbg44xx.h new file mode 100644 index 0000000..e447ad5 --- /dev/null +++ b/arch/arm/mach-omap2/dbg44xx.h @@ -0,0 +1,18 @@ +/* + * OMAP44xx on-chip debug support + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * XXX This file needs to be updated to align on one of "OMAP4", "OMAP44XX", + * or "OMAP4430". + */ + +#ifndef __ARCH_ARM_MACH_OMAP2_DBG44XX_H +#define __ARCH_ARM_MACH_OMAP2_DBG44XX_H + +#define OMAP44XX_CTI0_BASE 0x54148000 +#define OMAP44XX_CTI1_BASE 0x54149000 + +#endif diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index d216976..bae02d5 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> @@ -35,6 +36,7 @@ #include "mux.h" #include "control.h" +#include "dbg44xx.h" #if defined(CONFIG_VIDEO_OMAP2) || defined(CONFIG_VIDEO_OMAP2_MODULE) @@ -322,20 +324,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 *base0; + void *base1; + + base0 = ioremap(OMAP44XX_CTI0_BASE, 4096); + base1 = ioremap(OMAP44XX_CTI1_BASE, 4096); + 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); } -- 1.7.3 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [patch v2 3/3] arm: omap4: support pmu 2011-03-02 10:57 ` [patch v2 3/3] arm: omap4: support pmu tom.leiming at gmail.com @ 2011-03-02 12:43 ` Santosh Shilimkar 0 siblings, 0 replies; 8+ messages in thread From: Santosh Shilimkar @ 2011-03-02 12:43 UTC (permalink / raw) To: linux-arm-kernel Tom, > -----Original Message----- > From: linux-arm-kernel-bounces at lists.infradead.org [mailto:linux- > arm-kernel-bounces at lists.infradead.org] On Behalf Of > tom.leiming at gmail.com > Sent: Wednesday, March 02, 2011 4:27 PM > To: linux at arm.linux.org.uk > Cc: Woodruff Richard; Tony Lindgren; Ming Lei; will.deacon at arm.com; > linux-omap at vger.kernel.org; linux-arm-kernel at lists.infradead.org > Subject: [patch v2 3/3] arm: omap4: support pmu > > From: Ming Lei <tom.leiming@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: Woodruff Richard <r-woodruff2@ti.com> > Cc: Tony Lindgren <tony@atomide.com> > Cc: linux-omap at vger.kernel.org > Signed-off-by: Ming Lei <tom.leiming@gmail.com> > --- Few comments. > arch/arm/mach-omap2/dbg44xx.h | 18 +++++++++ > arch/arm/mach-omap2/devices.c | 83 > +++++++++++++++++++++++++++++++++++++++- > 2 files changed, 98 insertions(+), 3 deletions(-) > create mode 100644 arch/arm/mach-omap2/dbg44xx.h > > diff --git a/arch/arm/mach-omap2/dbg44xx.h b/arch/arm/mach- > omap2/dbg44xx.h > new file mode 100644 > index 0000000..e447ad5 > --- /dev/null > +++ b/arch/arm/mach-omap2/dbg44xx.h > @@ -0,0 +1,18 @@ > +/* > + * OMAP44xx on-chip debug support > + * > + * This program is free software; you can redistribute it and/or > modify > + * it under the terms of the GNU General Public License version 2 > as > + * published by the Free Software Foundation. > + * > + * XXX This file needs to be updated to align on one of "OMAP4", > "OMAP44XX", > + * or "OMAP4430". > + */ > + > +#ifndef __ARCH_ARM_MACH_OMAP2_DBG44XX_H > +#define __ARCH_ARM_MACH_OMAP2_DBG44XX_H > + > +#define OMAP44XX_CTI0_BASE 0x54148000 > +#define OMAP44XX_CTI1_BASE 0x54149000 > + > +#endif You don't need this file. Move this base addresses to arch/arm/plat-omap/include/plat/omap44xx.h > diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach- > omap2/devices.c > index d216976..bae02d5 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> > @@ -35,6 +36,7 @@ > > #include "mux.h" > #include "control.h" > +#include "dbg44xx.h" > > #if defined(CONFIG_VIDEO_OMAP2) || > defined(CONFIG_VIDEO_OMAP2_MODULE) > > @@ -322,20 +324,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 *base0; > + void *base1; s/ void *base/ void __iomem *base > + > + base0 = ioremap(OMAP44XX_CTI0_BASE, 4096); s/4096/SZ_4K > + base1 = ioremap(OMAP44XX_CTI1_BASE, 4096); > + if (!base0 && !base1) { > + pr_err("ioremap for omap4 CTI failed\n"); s/omap4/OMAP4 > + 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); > } > -- > 1.7.3 > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel at lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2011-03-02 15:46 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-03-02 10:56 [patch v2 0/3] arm: pmu: support pmu/perf on OMAP4 tom.leiming at gmail.com 2011-03-02 10:56 ` [patch v2 1/3] arm: introduce cross trigger interface helpers tom.leiming at gmail.com 2011-03-02 10:56 ` [patch v2 2/3] arm: pmu: allow platform specifc irq enable/disable handling tom.leiming at gmail.com 2011-03-02 12:10 ` Will Deacon [not found] ` <-3190832915456449126@unknownmsgid> 2011-03-02 14:35 ` Ming Lei 2011-03-02 15:46 ` Will Deacon 2011-03-02 10:57 ` [patch v2 3/3] arm: omap4: support pmu tom.leiming at gmail.com 2011-03-02 12:43 ` Santosh Shilimkar
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).