]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00177757 Fix suspend/resume issue when enable localtimer
authorAnson Huang <b20788@freescale.com>
Fri, 23 Mar 2012 06:08:51 +0000 (14:08 +0800)
committerOliver Wendt <ow@karo-electronics.de>
Mon, 30 Sep 2013 12:11:19 +0000 (14:11 +0200)
Need to disable localtimer's PPI when suspend, or ARM core
will run into exception when resume.

Signed-off-by: Anson Huang <b20788@freescale.com>
arch/arm/common/gic.c
arch/arm/include/asm/hardware/gic.h
arch/arm/kernel/smp_twd.c

index ab8c07d48a262eb14753ee4dfaae0811132c3497..b33a75f1acefefe69b94994c6090c37da1f86b65 100644 (file)
@@ -385,6 +385,15 @@ void __cpuinit gic_enable_ppi(unsigned int irq)
        gic_unmask_irq(irq_get_irq_data(irq));
        local_irq_restore(flags);
 }
+void __cpuinit gic_disable_ppi(unsigned int irq)
+{
+       unsigned long flags;
+
+       local_irq_save(flags);
+       irq_set_status_flags(irq, IRQ_NOPROBE);
+       gic_mask_irq(irq_get_irq_data(irq));
+       local_irq_restore(flags);
+}
 
 void save_gic_cpu_state(unsigned int gic_nr, struct gic_cpu_state *gcs)
 {
index 0fa541d200bbd70e18926e2c7412ffa6541c6bc2..c8647b309ab11240ac07725eddf0c05bcd5b75d1 100644 (file)
@@ -67,6 +67,7 @@ void gic_secondary_init(unsigned int);
 void gic_cascade_irq(unsigned int gic_nr, unsigned int irq);
 void gic_raise_softirq(const struct cpumask *mask, unsigned int irq);
 void gic_enable_ppi(unsigned int);
+void gic_disable_ppi(unsigned int);
 void save_gic_cpu_state(unsigned int gic_nr, struct gic_cpu_state *gcs);
 void restore_gic_cpu_state(unsigned int gic_nr, struct gic_cpu_state *gcs);
 void save_gic_dist_state(unsigned int gic_nr, struct gic_dist_state *gds);
index 983f8cc078cbd3384eb36478d2faaf317c08c20e..a5a2f45069d57553835d16c77ec315caace74e9b 100644 (file)
@@ -43,15 +43,18 @@ static void twd_set_mode(enum clock_event_mode mode,
                ctrl = TWD_TIMER_CONTROL_ENABLE | TWD_TIMER_CONTROL_IT_ENABLE
                        | TWD_TIMER_CONTROL_PERIODIC;
                __raw_writel(twd_timer_rate / HZ, twd_base + TWD_TIMER_LOAD);
+               gic_enable_ppi(clk->irq);
                break;
        case CLOCK_EVT_MODE_ONESHOT:
                /* period set, and timer enabled in 'next_event' hook */
                ctrl = TWD_TIMER_CONTROL_IT_ENABLE | TWD_TIMER_CONTROL_ONESHOT;
+               gic_enable_ppi(clk->irq);
                break;
        case CLOCK_EVT_MODE_UNUSED:
        case CLOCK_EVT_MODE_SHUTDOWN:
        default:
                ctrl = 0;
+               gic_disable_ppi(clk->irq);
        }
 
        __raw_writel(ctrl, twd_base + TWD_TIMER_CONTROL);