linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] PPI fixes for 3.2
@ 2011-11-02 17:30 Marc Zyngier
  2011-11-02 17:30 ` [PATCH 1/2] ARM: EXYNOS4: convert MCT to percpu interrupt API Marc Zyngier
  2011-11-02 17:30 ` [PATCH 2/2] ARM: mcx: fix local timer interrupt handling Marc Zyngier
  0 siblings, 2 replies; 11+ messages in thread
From: Marc Zyngier @ 2011-11-02 17:30 UTC (permalink / raw)
  To: linux-arm-kernel

After the merge of the percpu interrupt patches, a couple of platforms
need to be updated:
- Samsung MCT timers have gained a PPI implementation using the old
  API,
- imx6q needs to be updated not to care about local timer interrupts
  anymore.

The patches are also available at the following location:
git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms.git ppi-fixes-for-3.2

Thanks,

	M.

Marc Zyngier (2):
  ARM: EXYNOS4: convert MCT to percpu interrupt API
  ARM: mcx: fix local timer interrupt handling

 arch/arm/mach-exynos4/mct.c |   40 +++++++++++++++++++++++++++-------------
 arch/arm/plat-mxc/gic.c     |   11 ++---------
 2 files changed, 29 insertions(+), 22 deletions(-)

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/2] ARM: EXYNOS4: convert MCT to percpu interrupt API
  2011-11-02 17:30 [PATCH 0/2] PPI fixes for 3.2 Marc Zyngier
@ 2011-11-02 17:30 ` Marc Zyngier
  2011-11-03  6:27   ` Kukjin Kim
  2011-11-10  2:40   ` MyungJoo Ham
  2011-11-02 17:30 ` [PATCH 2/2] ARM: mcx: fix local timer interrupt handling Marc Zyngier
  1 sibling, 2 replies; 11+ messages in thread
From: Marc Zyngier @ 2011-11-02 17:30 UTC (permalink / raw)
  To: linux-arm-kernel

MCT recently gained per cpu interrupts, and missed the fact that
ARM has moved to a genirq based implementation.

This patch converts the driver to the new API.

Boot tested on Origen.

Cc: Kukjin Kim <kgene.kim@samsung.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
---
 arch/arm/mach-exynos4/mct.c |   40 +++++++++++++++++++++++++++-------------
 1 files changed, 27 insertions(+), 13 deletions(-)

diff --git a/arch/arm/mach-exynos4/mct.c b/arch/arm/mach-exynos4/mct.c
index f191608..97343df 100644
--- a/arch/arm/mach-exynos4/mct.c
+++ b/arch/arm/mach-exynos4/mct.c
@@ -44,7 +44,7 @@ struct mct_clock_event_device {
 	char name[10];
 };
 
-struct mct_clock_event_device mct_tick[NR_CPUS];
+static DEFINE_PER_CPU(struct mct_clock_event_device, percpu_mct_tick);
 
 static void exynos4_mct_write(unsigned int value, void *addr)
 {
@@ -302,7 +302,7 @@ static void exynos4_mct_tick_start(unsigned long cycles,
 static int exynos4_tick_set_next_event(unsigned long cycles,
 				       struct clock_event_device *evt)
 {
-	struct mct_clock_event_device *mevt = &mct_tick[smp_processor_id()];
+	struct mct_clock_event_device *mevt = this_cpu_ptr(&percpu_mct_tick);
 
 	exynos4_mct_tick_start(cycles, mevt);
 
@@ -312,7 +312,7 @@ static int exynos4_tick_set_next_event(unsigned long cycles,
 static inline void exynos4_tick_set_mode(enum clock_event_mode mode,
 					 struct clock_event_device *evt)
 {
-	struct mct_clock_event_device *mevt = &mct_tick[smp_processor_id()];
+	struct mct_clock_event_device *mevt = this_cpu_ptr(&percpu_mct_tick);
 
 	exynos4_mct_tick_stop(mevt);
 
@@ -376,14 +376,16 @@ static struct irqaction mct_tick1_event_irq = {
 
 static void exynos4_mct_tick_init(struct clock_event_device *evt)
 {
+	struct mct_clock_event_device *mevt;
 	unsigned int cpu = smp_processor_id();
 
-	mct_tick[cpu].evt = evt;
+	mevt = this_cpu_ptr(&percpu_mct_tick);
+	mevt->evt = evt;
 
-	mct_tick[cpu].base = EXYNOS4_MCT_L_BASE(cpu);
-	sprintf(mct_tick[cpu].name, "mct_tick%d", cpu);
+	mevt->base = EXYNOS4_MCT_L_BASE(cpu);
+	sprintf(mevt->name, "mct_tick%d", cpu);
 
-	evt->name = mct_tick[cpu].name;
+	evt->name = mevt->name;
 	evt->cpumask = cpumask_of(cpu);
 	evt->set_next_event = exynos4_tick_set_next_event;
 	evt->set_mode = exynos4_tick_set_mode;
@@ -398,21 +400,21 @@ static void exynos4_mct_tick_init(struct clock_event_device *evt)
 
 	clockevents_register_device(evt);
 
-	exynos4_mct_write(0x1, mct_tick[cpu].base + MCT_L_TCNTB_OFFSET);
+	exynos4_mct_write(0x1, mevt->base + MCT_L_TCNTB_OFFSET);
 
 	if (mct_int_type == MCT_INT_SPI) {
 		if (cpu == 0) {
-			mct_tick0_event_irq.dev_id = &mct_tick[cpu];
+			mct_tick0_event_irq.dev_id = mevt;
 			evt->irq = IRQ_MCT_L0;
 			setup_irq(IRQ_MCT_L0, &mct_tick0_event_irq);
 		} else {
-			mct_tick1_event_irq.dev_id = &mct_tick[cpu];
+			mct_tick1_event_irq.dev_id = mevt;
 			evt->irq = IRQ_MCT_L1;
 			setup_irq(IRQ_MCT_L1, &mct_tick1_event_irq);
 			irq_set_affinity(IRQ_MCT_L1, cpumask_of(1));
 		}
 	} else {
-		gic_enable_ppi(IRQ_MCT_LOCALTIMER);
+		enable_percpu_irq(IRQ_MCT_LOCALTIMER, 0);
 	}
 }
 
@@ -427,9 +429,11 @@ int __cpuinit local_timer_setup(struct clock_event_device *evt)
 void local_timer_stop(struct clock_event_device *evt)
 {
 	evt->set_mode(CLOCK_EVT_MODE_UNUSED, evt);
-	disable_irq(evt->irq);
+	if (mct_int_type == MCT_INT_SPI)
+		disable_irq(evt->irq);
+	else
+		disable_percpu_irq(IRQ_MCT_LOCALTIMER);
 }
-
 #endif /* CONFIG_LOCAL_TIMERS */
 
 static void __init exynos4_timer_resources(void)
@@ -438,6 +442,16 @@ static void __init exynos4_timer_resources(void)
 	mct_clk = clk_get(NULL, "xtal");
 
 	clk_rate = clk_get_rate(mct_clk);
+
+	if (mct_int_type == MCT_INT_PPI) {
+		int err;
+
+		err = request_percpu_irq(IRQ_MCT_LOCALTIMER,
+					 exynos4_mct_tick_isr, "MCT",
+					 &percpu_mct_tick);
+		WARN(err, "MCT: can't request IRQ %d (%d)\n",
+		     IRQ_MCT_LOCALTIMER, err);
+	}
 }
 
 static void __init exynos4_timer_init(void)
-- 
1.7.0.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/2] ARM: mcx: fix local timer interrupt handling
  2011-11-02 17:30 [PATCH 0/2] PPI fixes for 3.2 Marc Zyngier
  2011-11-02 17:30 ` [PATCH 1/2] ARM: EXYNOS4: convert MCT to percpu interrupt API Marc Zyngier
@ 2011-11-02 17:30 ` Marc Zyngier
  2011-11-02 18:27   ` Uwe Kleine-König
                     ` (2 more replies)
  1 sibling, 3 replies; 11+ messages in thread
From: Marc Zyngier @ 2011-11-02 17:30 UTC (permalink / raw)
  To: linux-arm-kernel

As local timer interrupts are now handled as normal interrupts,
remove the special case in the GIC handler.

Cc: Shawn Guo <shawn.guo@linaro.org>
Cc: Sascha Hauer <kernel@pengutronix.de>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
---
 arch/arm/plat-mxc/gic.c |   11 ++---------
 1 files changed, 2 insertions(+), 9 deletions(-)

diff --git a/arch/arm/plat-mxc/gic.c b/arch/arm/plat-mxc/gic.c
index b3b8eed..12f8f81 100644
--- a/arch/arm/plat-mxc/gic.c
+++ b/arch/arm/plat-mxc/gic.c
@@ -28,21 +28,14 @@ asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs)
 		if (irqnr == 1023)
 			break;
 
-		if (irqnr > 29 && irqnr < 1021)
+		if (irqnr > 15 && irqnr < 1021)
 			handle_IRQ(irqnr, regs);
 #ifdef CONFIG_SMP
-		else if (irqnr < 16) {
+		else {
 			writel_relaxed(irqstat, gic_cpu_base_addr +
 						GIC_CPU_EOI);
 			handle_IPI(irqnr, regs);
 		}
 #endif
-#ifdef CONFIG_LOCAL_TIMERS
-		else if (irqnr == 29) {
-			writel_relaxed(irqstat, gic_cpu_base_addr +
-						GIC_CPU_EOI);
-			handle_local_timer(regs);
-		}
-#endif
 	} while (1);
 }
-- 
1.7.0.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/2] ARM: mcx: fix local timer interrupt handling
  2011-11-02 17:30 ` [PATCH 2/2] ARM: mcx: fix local timer interrupt handling Marc Zyngier
@ 2011-11-02 18:27   ` Uwe Kleine-König
  2011-11-03  4:35   ` Shawn Guo
  2011-11-03  6:55   ` Sascha Hauer
  2 siblings, 0 replies; 11+ messages in thread
From: Uwe Kleine-König @ 2011-11-02 18:27 UTC (permalink / raw)
  To: linux-arm-kernel

$Subject ~= s/cx/xc/;

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-K?nig            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 2/2] ARM: mcx: fix local timer interrupt handling
  2011-11-02 17:30 ` [PATCH 2/2] ARM: mcx: fix local timer interrupt handling Marc Zyngier
  2011-11-02 18:27   ` Uwe Kleine-König
@ 2011-11-03  4:35   ` Shawn Guo
  2011-11-03  6:55   ` Sascha Hauer
  2 siblings, 0 replies; 11+ messages in thread
From: Shawn Guo @ 2011-11-03  4:35 UTC (permalink / raw)
  To: linux-arm-kernel

On 3 November 2011 01:30, Marc Zyngier <marc.zyngier@arm.com> wrote:
> As local timer interrupts are now handled as normal interrupts,
> remove the special case in the GIC handler.
>
> Cc: Shawn Guo <shawn.guo@linaro.org>
> Cc: Sascha Hauer <kernel@pengutronix.de>
> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>

I also noticed this problem and had a patch fixing it.  But due to the
tight Linaro Connect agenda, I have not got the chance to send it out.
 Glad to see this patch fixing the problem.

Acked-and-tested-by: Shawn Guo <shawn.guo@linaro.org>

> ---
> ?arch/arm/plat-mxc/gic.c | ? 11 ++---------
> ?1 files changed, 2 insertions(+), 9 deletions(-)
>
> diff --git a/arch/arm/plat-mxc/gic.c b/arch/arm/plat-mxc/gic.c
> index b3b8eed..12f8f81 100644
> --- a/arch/arm/plat-mxc/gic.c
> +++ b/arch/arm/plat-mxc/gic.c
> @@ -28,21 +28,14 @@ asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs)
> ? ? ? ? ? ? ? ?if (irqnr == 1023)
> ? ? ? ? ? ? ? ? ? ? ? ?break;
>
> - ? ? ? ? ? ? ? if (irqnr > 29 && irqnr < 1021)
> + ? ? ? ? ? ? ? if (irqnr > 15 && irqnr < 1021)
> ? ? ? ? ? ? ? ? ? ? ? ?handle_IRQ(irqnr, regs);
> ?#ifdef CONFIG_SMP
> - ? ? ? ? ? ? ? else if (irqnr < 16) {
> + ? ? ? ? ? ? ? else {
> ? ? ? ? ? ? ? ? ? ? ? ?writel_relaxed(irqstat, gic_cpu_base_addr +
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?GIC_CPU_EOI);
> ? ? ? ? ? ? ? ? ? ? ? ?handle_IPI(irqnr, regs);
> ? ? ? ? ? ? ? ?}
> ?#endif
> -#ifdef CONFIG_LOCAL_TIMERS
> - ? ? ? ? ? ? ? else if (irqnr == 29) {
> - ? ? ? ? ? ? ? ? ? ? ? writel_relaxed(irqstat, gic_cpu_base_addr +
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? GIC_CPU_EOI);
> - ? ? ? ? ? ? ? ? ? ? ? handle_local_timer(regs);
> - ? ? ? ? ? ? ? }
> -#endif
> ? ? ? ?} while (1);
> ?}
> --
> 1.7.0.4
>
>
>



-- 
Regards,
Shawn

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/2] ARM: EXYNOS4: convert MCT to percpu interrupt API
  2011-11-02 17:30 ` [PATCH 1/2] ARM: EXYNOS4: convert MCT to percpu interrupt API Marc Zyngier
@ 2011-11-03  6:27   ` Kukjin Kim
  2011-11-10  2:40   ` MyungJoo Ham
  1 sibling, 0 replies; 11+ messages in thread
From: Kukjin Kim @ 2011-11-03  6:27 UTC (permalink / raw)
  To: linux-arm-kernel

Marc Zyngier wrote:
> 
> MCT recently gained per cpu interrupts, and missed the fact that
> ARM has moved to a genirq based implementation.
> 
> This patch converts the driver to the new API.
> 
> Boot tested on Origen.
> 
> Cc: Kukjin Kim <kgene.kim@samsung.com>
> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
> ---
>  arch/arm/mach-exynos4/mct.c |   40 +++++++++++++++++++++++++++-----------
> --
>  1 files changed, 27 insertions(+), 13 deletions(-)
> 
> diff --git a/arch/arm/mach-exynos4/mct.c b/arch/arm/mach-exynos4/mct.c
> index f191608..97343df 100644
> --- a/arch/arm/mach-exynos4/mct.c
> +++ b/arch/arm/mach-exynos4/mct.c
> @@ -44,7 +44,7 @@ struct mct_clock_event_device {
>  	char name[10];
>  };
> 
> -struct mct_clock_event_device mct_tick[NR_CPUS];
> +static DEFINE_PER_CPU(struct mct_clock_event_device, percpu_mct_tick);
> 
>  static void exynos4_mct_write(unsigned int value, void *addr)
>  {
> @@ -302,7 +302,7 @@ static void exynos4_mct_tick_start(unsigned long
cycles,
>  static int exynos4_tick_set_next_event(unsigned long cycles,
>  				       struct clock_event_device *evt)
>  {
> -	struct mct_clock_event_device *mevt = &mct_tick[smp_processor_id()];
> +	struct mct_clock_event_device *mevt =
this_cpu_ptr(&percpu_mct_tick);
> 
>  	exynos4_mct_tick_start(cycles, mevt);
> 
> @@ -312,7 +312,7 @@ static int exynos4_tick_set_next_event(unsigned long
> cycles,
>  static inline void exynos4_tick_set_mode(enum clock_event_mode mode,
>  					 struct clock_event_device *evt)
>  {
> -	struct mct_clock_event_device *mevt = &mct_tick[smp_processor_id()];
> +	struct mct_clock_event_device *mevt =
this_cpu_ptr(&percpu_mct_tick);
> 
>  	exynos4_mct_tick_stop(mevt);
> 
> @@ -376,14 +376,16 @@ static struct irqaction mct_tick1_event_irq = {
> 
>  static void exynos4_mct_tick_init(struct clock_event_device *evt)
>  {
> +	struct mct_clock_event_device *mevt;
>  	unsigned int cpu = smp_processor_id();
> 
> -	mct_tick[cpu].evt = evt;
> +	mevt = this_cpu_ptr(&percpu_mct_tick);
> +	mevt->evt = evt;
> 
> -	mct_tick[cpu].base = EXYNOS4_MCT_L_BASE(cpu);
> -	sprintf(mct_tick[cpu].name, "mct_tick%d", cpu);
> +	mevt->base = EXYNOS4_MCT_L_BASE(cpu);
> +	sprintf(mevt->name, "mct_tick%d", cpu);
> 
> -	evt->name = mct_tick[cpu].name;
> +	evt->name = mevt->name;
>  	evt->cpumask = cpumask_of(cpu);
>  	evt->set_next_event = exynos4_tick_set_next_event;
>  	evt->set_mode = exynos4_tick_set_mode;
> @@ -398,21 +400,21 @@ static void exynos4_mct_tick_init(struct
> clock_event_device *evt)
> 
>  	clockevents_register_device(evt);
> 
> -	exynos4_mct_write(0x1, mct_tick[cpu].base + MCT_L_TCNTB_OFFSET);
> +	exynos4_mct_write(0x1, mevt->base + MCT_L_TCNTB_OFFSET);
> 
>  	if (mct_int_type == MCT_INT_SPI) {
>  		if (cpu == 0) {
> -			mct_tick0_event_irq.dev_id = &mct_tick[cpu];
> +			mct_tick0_event_irq.dev_id = mevt;
>  			evt->irq = IRQ_MCT_L0;
>  			setup_irq(IRQ_MCT_L0, &mct_tick0_event_irq);
>  		} else {
> -			mct_tick1_event_irq.dev_id = &mct_tick[cpu];
> +			mct_tick1_event_irq.dev_id = mevt;
>  			evt->irq = IRQ_MCT_L1;
>  			setup_irq(IRQ_MCT_L1, &mct_tick1_event_irq);
>  			irq_set_affinity(IRQ_MCT_L1, cpumask_of(1));
>  		}
>  	} else {
> -		gic_enable_ppi(IRQ_MCT_LOCALTIMER);
> +		enable_percpu_irq(IRQ_MCT_LOCALTIMER, 0);
>  	}
>  }
> 
> @@ -427,9 +429,11 @@ int __cpuinit local_timer_setup(struct
clock_event_device
> *evt)
>  void local_timer_stop(struct clock_event_device *evt)
>  {
>  	evt->set_mode(CLOCK_EVT_MODE_UNUSED, evt);
> -	disable_irq(evt->irq);
> +	if (mct_int_type == MCT_INT_SPI)
> +		disable_irq(evt->irq);
> +	else
> +		disable_percpu_irq(IRQ_MCT_LOCALTIMER);
>  }
> -
>  #endif /* CONFIG_LOCAL_TIMERS */
> 
>  static void __init exynos4_timer_resources(void)
> @@ -438,6 +442,16 @@ static void __init exynos4_timer_resources(void)
>  	mct_clk = clk_get(NULL, "xtal");
> 
>  	clk_rate = clk_get_rate(mct_clk);
> +
> +	if (mct_int_type == MCT_INT_PPI) {
> +		int err;
> +
> +		err = request_percpu_irq(IRQ_MCT_LOCALTIMER,
> +					 exynos4_mct_tick_isr, "MCT",
> +					 &percpu_mct_tick);
> +		WARN(err, "MCT: can't request IRQ %d (%d)\n",
> +		     IRQ_MCT_LOCALTIMER, err);
> +	}
>  }
> 
>  static void __init exynos4_timer_init(void)
> --
> 1.7.0.4

Hi Marc,

It works fine on SMDKV310 and SMDK4X12.
I will pick this up in Samsung tree and it will be sent to Arnd for this
merge window soon.

Thanks.

Best regards,
Kgene.
--
Kukjin Kim <kgene.kim@samsung.com>, Senior Engineer,
SW Solution Development Team, Samsung Electronics Co., Ltd.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 2/2] ARM: mcx: fix local timer interrupt handling
  2011-11-02 17:30 ` [PATCH 2/2] ARM: mcx: fix local timer interrupt handling Marc Zyngier
  2011-11-02 18:27   ` Uwe Kleine-König
  2011-11-03  4:35   ` Shawn Guo
@ 2011-11-03  6:55   ` Sascha Hauer
  2 siblings, 0 replies; 11+ messages in thread
From: Sascha Hauer @ 2011-11-03  6:55 UTC (permalink / raw)
  To: linux-arm-kernel

On Wed, Nov 02, 2011 at 05:30:49PM +0000, Marc Zyngier wrote:
> As local timer interrupts are now handled as normal interrupts,
> remove the special case in the GIC handler.
> 
> Cc: Shawn Guo <shawn.guo@linaro.org>
> Cc: Sascha Hauer <kernel@pengutronix.de>
> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>

Ok, I'll pick this one up.

Sascha

> ---
>  arch/arm/plat-mxc/gic.c |   11 ++---------
>  1 files changed, 2 insertions(+), 9 deletions(-)
> 
> diff --git a/arch/arm/plat-mxc/gic.c b/arch/arm/plat-mxc/gic.c
> index b3b8eed..12f8f81 100644
> --- a/arch/arm/plat-mxc/gic.c
> +++ b/arch/arm/plat-mxc/gic.c
> @@ -28,21 +28,14 @@ asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs)
>  		if (irqnr == 1023)
>  			break;
>  
> -		if (irqnr > 29 && irqnr < 1021)
> +		if (irqnr > 15 && irqnr < 1021)
>  			handle_IRQ(irqnr, regs);
>  #ifdef CONFIG_SMP
> -		else if (irqnr < 16) {
> +		else {
>  			writel_relaxed(irqstat, gic_cpu_base_addr +
>  						GIC_CPU_EOI);
>  			handle_IPI(irqnr, regs);
>  		}
>  #endif
> -#ifdef CONFIG_LOCAL_TIMERS
> -		else if (irqnr == 29) {
> -			writel_relaxed(irqstat, gic_cpu_base_addr +
> -						GIC_CPU_EOI);
> -			handle_local_timer(regs);
> -		}
> -#endif
>  	} while (1);
>  }
> -- 
> 1.7.0.4
> 
> 
> 

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/2] ARM: EXYNOS4: convert MCT to percpu interrupt API
  2011-11-02 17:30 ` [PATCH 1/2] ARM: EXYNOS4: convert MCT to percpu interrupt API Marc Zyngier
  2011-11-03  6:27   ` Kukjin Kim
@ 2011-11-10  2:40   ` MyungJoo Ham
  2011-11-10  9:43     ` Marc Zyngier
  1 sibling, 1 reply; 11+ messages in thread
From: MyungJoo Ham @ 2011-11-10  2:40 UTC (permalink / raw)
  To: linux-arm-kernel

On Thu, Nov 3, 2011 at 2:30 AM, Marc Zyngier <marc.zyngier@arm.com> wrote:
> MCT recently gained per cpu interrupts, and missed the fact that
> ARM has moved to a genirq based implementation.
>
> This patch converts the driver to the new API.
>
> Boot tested on Origen.
>
> Cc: Kukjin Kim <kgene.kim@samsung.com>
> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>

There is one concern regarding the CONFIG_LOCAL_TIMER.

[]
> ?#endif /* CONFIG_LOCAL_TIMERS */
>
> ?static void __init exynos4_timer_resources(void)
> @@ -438,6 +442,16 @@ static void __init exynos4_timer_resources(void)
> ? ? ? ?mct_clk = clk_get(NULL, "xtal");
>
> ? ? ? ?clk_rate = clk_get_rate(mct_clk);
> +
> + ? ? ? if (mct_int_type == MCT_INT_PPI) {
> + ? ? ? ? ? ? ? int err;
> +
> + ? ? ? ? ? ? ? err = request_percpu_irq(IRQ_MCT_LOCALTIMER,
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?exynos4_mct_tick_isr, "MCT",
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?&percpu_mct_tick);
> + ? ? ? ? ? ? ? WARN(err, "MCT: can't request IRQ %d (%d)\n",
> + ? ? ? ? ? ? ? ? ? ?IRQ_MCT_LOCALTIMER, err);
> + ? ? ? }
> ?}
>

You've added exynos4_mct_tick_isr, which is defined in
CONFIG_LOCAL_TIMER section, in the place that is compiled without
CONFIG_LOCAL_TIMER.
I guess we are going to stop supporting LOCAL_TIMER in Exynos later
and this could be a problem with it.


Cheers!
MyungJoo

-- 
MyungJoo Ham, Ph.D.
Mobile Software Platform Lab, DMC Business, Samsung Electronics

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/2] ARM: EXYNOS4: convert MCT to percpu interrupt API
  2011-11-10  2:40   ` MyungJoo Ham
@ 2011-11-10  9:43     ` Marc Zyngier
  2011-11-10 23:33       ` MyungJoo Ham
  0 siblings, 1 reply; 11+ messages in thread
From: Marc Zyngier @ 2011-11-10  9:43 UTC (permalink / raw)
  To: linux-arm-kernel

On 10/11/11 02:40, MyungJoo Ham wrote:
> On Thu, Nov 3, 2011 at 2:30 AM, Marc Zyngier <marc.zyngier@arm.com> wrote:
>> MCT recently gained per cpu interrupts, and missed the fact that
>> ARM has moved to a genirq based implementation.
>>
>> This patch converts the driver to the new API.
>>
>> Boot tested on Origen.
>>
>> Cc: Kukjin Kim <kgene.kim@samsung.com>
>> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
> 
> There is one concern regarding the CONFIG_LOCAL_TIMER.
> 
> []
>>  #endif /* CONFIG_LOCAL_TIMERS */
>>
>>  static void __init exynos4_timer_resources(void)
>> @@ -438,6 +442,16 @@ static void __init exynos4_timer_resources(void)
>>        mct_clk = clk_get(NULL, "xtal");
>>
>>        clk_rate = clk_get_rate(mct_clk);
>> +
>> +       if (mct_int_type == MCT_INT_PPI) {
>> +               int err;
>> +
>> +               err = request_percpu_irq(IRQ_MCT_LOCALTIMER,
>> +                                        exynos4_mct_tick_isr, "MCT",
>> +                                        &percpu_mct_tick);
>> +               WARN(err, "MCT: can't request IRQ %d (%d)\n",
>> +                    IRQ_MCT_LOCALTIMER, err);
>> +       }
>>  }
>>
> 
> You've added exynos4_mct_tick_isr, which is defined in
> CONFIG_LOCAL_TIMER section, in the place that is compiled without
> CONFIG_LOCAL_TIMER.
> I guess we are going to stop supporting LOCAL_TIMER in Exynos later
> and this could be a problem with it.

Yup, this is a problem. It probably means we need to #ifdef that chink
as well. I'm not sure I get your remark about not supporting LOCAL_TIMER
though. Are you planning to move away from the LOCAL_TIMER infrastructure?

If that's the case, you might as well know that my pet plan is to get
rid of the LOCAL_TIMER option altogether, and move to a model where each
timer driver is (sort of) autonomous, instead of being driven by the SMP
code.

	M.
-- 
Jazz is not dead. It just smells funny...

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/2] ARM: EXYNOS4: convert MCT to percpu interrupt API
  2011-11-10  9:43     ` Marc Zyngier
@ 2011-11-10 23:33       ` MyungJoo Ham
  2011-11-11 10:02         ` Marc Zyngier
  0 siblings, 1 reply; 11+ messages in thread
From: MyungJoo Ham @ 2011-11-10 23:33 UTC (permalink / raw)
  To: linux-arm-kernel

On Thu, Nov 10, 2011 at 6:43 PM, Marc Zyngier <marc.zyngier@arm.com> wrote:
> On 10/11/11 02:40, MyungJoo Ham wrote:
>> On Thu, Nov 3, 2011 at 2:30 AM, Marc Zyngier <marc.zyngier@arm.com> wrote:
>>> MCT recently gained per cpu interrupts, and missed the fact that
>>> ARM has moved to a genirq based implementation.
>>>
>>> This patch converts the driver to the new API.
>>>
>>> Boot tested on Origen.
>>>
>>> Cc: Kukjin Kim <kgene.kim@samsung.com>
>>> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
>>
>> There is one concern regarding the CONFIG_LOCAL_TIMER.
>>
>> []
>>> ?#endif /* CONFIG_LOCAL_TIMERS */
>>>
>>> ?static void __init exynos4_timer_resources(void)
>>> @@ -438,6 +442,16 @@ static void __init exynos4_timer_resources(void)
>>> ? ? ? ?mct_clk = clk_get(NULL, "xtal");
>>>
>>> ? ? ? ?clk_rate = clk_get_rate(mct_clk);
>>> +
>>> + ? ? ? if (mct_int_type == MCT_INT_PPI) {
>>> + ? ? ? ? ? ? ? int err;
>>> +
>>> + ? ? ? ? ? ? ? err = request_percpu_irq(IRQ_MCT_LOCALTIMER,
>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?exynos4_mct_tick_isr, "MCT",
>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?&percpu_mct_tick);
>>> + ? ? ? ? ? ? ? WARN(err, "MCT: can't request IRQ %d (%d)\n",
>>> + ? ? ? ? ? ? ? ? ? ?IRQ_MCT_LOCALTIMER, err);
>>> + ? ? ? }
>>> ?}
>>>
>>
>> You've added exynos4_mct_tick_isr, which is defined in
>> CONFIG_LOCAL_TIMER section, in the place that is compiled without
>> CONFIG_LOCAL_TIMER.
>> I guess we are going to stop supporting LOCAL_TIMER in Exynos later
>> and this could be a problem with it.
>
> Yup, this is a problem. It probably means we need to #ifdef that chink
> as well. I'm not sure I get your remark about not supporting LOCAL_TIMER
> though. Are you planning to move away from the LOCAL_TIMER infrastructure?

Yes, we may need to #ifdef that block.
And yes, for the Exynos series, I'll need to double check; however, I
think we are planning to move away from the LOCAL_TIMER for MCT.

>
> If that's the case, you might as well know that my pet plan is to get
> rid of the LOCAL_TIMER option altogether, and move to a model where each
> timer driver is (sort of) autonomous, instead of being driven by the SMP
> code.
>
> ? ? ? ?M.
> --
> Jazz is not dead. It just smells funny...
>
>

Cheers!
MyungJoo

-- 
MyungJoo Ham, Ph.D.
Mobile Software Platform Lab, DMC Business, Samsung Electronics

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/2] ARM: EXYNOS4: convert MCT to percpu interrupt API
  2011-11-10 23:33       ` MyungJoo Ham
@ 2011-11-11 10:02         ` Marc Zyngier
  0 siblings, 0 replies; 11+ messages in thread
From: Marc Zyngier @ 2011-11-11 10:02 UTC (permalink / raw)
  To: linux-arm-kernel

On 10/11/11 23:33, MyungJoo Ham wrote:
> On Thu, Nov 10, 2011 at 6:43 PM, Marc Zyngier <marc.zyngier@arm.com> wrote:
>> On 10/11/11 02:40, MyungJoo Ham wrote:
>>> On Thu, Nov 3, 2011 at 2:30 AM, Marc Zyngier <marc.zyngier@arm.com> wrote:
>>>> MCT recently gained per cpu interrupts, and missed the fact that
>>>> ARM has moved to a genirq based implementation.
>>>>
>>>> This patch converts the driver to the new API.
>>>>
>>>> Boot tested on Origen.
>>>>
>>>> Cc: Kukjin Kim <kgene.kim@samsung.com>
>>>> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
>>>
>>> There is one concern regarding the CONFIG_LOCAL_TIMER.
>>>
>>> []
>>>>  #endif /* CONFIG_LOCAL_TIMERS */
>>>>
>>>>  static void __init exynos4_timer_resources(void)
>>>> @@ -438,6 +442,16 @@ static void __init exynos4_timer_resources(void)
>>>>        mct_clk = clk_get(NULL, "xtal");
>>>>
>>>>        clk_rate = clk_get_rate(mct_clk);
>>>> +
>>>> +       if (mct_int_type == MCT_INT_PPI) {
>>>> +               int err;
>>>> +
>>>> +               err = request_percpu_irq(IRQ_MCT_LOCALTIMER,
>>>> +                                        exynos4_mct_tick_isr, "MCT",
>>>> +                                        &percpu_mct_tick);
>>>> +               WARN(err, "MCT: can't request IRQ %d (%d)\n",
>>>> +                    IRQ_MCT_LOCALTIMER, err);
>>>> +       }
>>>>  }
>>>>
>>>
>>> You've added exynos4_mct_tick_isr, which is defined in
>>> CONFIG_LOCAL_TIMER section, in the place that is compiled without
>>> CONFIG_LOCAL_TIMER.
>>> I guess we are going to stop supporting LOCAL_TIMER in Exynos later
>>> and this could be a problem with it.
>>
>> Yup, this is a problem. It probably means we need to #ifdef that chink
>> as well. I'm not sure I get your remark about not supporting LOCAL_TIMER
>> though. Are you planning to move away from the LOCAL_TIMER infrastructure?
> 
> Yes, we may need to #ifdef that block.
> And yes, for the Exynos series, I'll need to double check; however, I
> think we are planning to move away from the LOCAL_TIMER for MCT.

I have patches for this already.

	M.
-- 
Jazz is not dead. It just smells funny...

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2011-11-11 10:02 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-11-02 17:30 [PATCH 0/2] PPI fixes for 3.2 Marc Zyngier
2011-11-02 17:30 ` [PATCH 1/2] ARM: EXYNOS4: convert MCT to percpu interrupt API Marc Zyngier
2011-11-03  6:27   ` Kukjin Kim
2011-11-10  2:40   ` MyungJoo Ham
2011-11-10  9:43     ` Marc Zyngier
2011-11-10 23:33       ` MyungJoo Ham
2011-11-11 10:02         ` Marc Zyngier
2011-11-02 17:30 ` [PATCH 2/2] ARM: mcx: fix local timer interrupt handling Marc Zyngier
2011-11-02 18:27   ` Uwe Kleine-König
2011-11-03  4:35   ` Shawn Guo
2011-11-03  6:55   ` Sascha Hauer

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).