powerpc: More fixes for lazy IRQ vs. idle
[deliverable/linux.git] / arch / powerpc / platforms / cell / pervasive.c
index 8a3631ce912ba52782640bd41b41e7f20e8c56f6..d17e98bc0c10d3ff0469cfa8af873f08d57abded 100644 (file)
 
 #include "pervasive.h"
 
-static int sysreset_hack;
-
 static void cbe_power_save(void)
 {
        unsigned long ctrl, thread_switch_control;
 
-       /*
-        * We need to hard disable interrupts, the local_irq_enable() done by
-        * our caller upon return will hard re-enable.
-        */
-       hard_irq_disable();
+       /* Ensure our interrupt state is properly tracked */
+       if (!prep_irq_for_idle())
+               return;
 
        ctrl = mfspr(SPRN_CTRLF);
 
@@ -83,13 +79,13 @@ static void cbe_power_save(void)
         */
        ctrl &= ~(CTRL_RUNLATCH | CTRL_TE);
        mtspr(SPRN_CTRLT, ctrl);
+
+       /* Re-enable interrupts in MSR */
+       __hard_irq_enable();
 }
 
 static int cbe_system_reset_exception(struct pt_regs *regs)
 {
-       int cpu;
-       struct cbe_pmd_regs __iomem *pmd;
-
        switch (regs->msr & SRR1_WAKEMASK) {
        case SRR1_WAKEEE:
                do_IRQ(regs);
@@ -98,19 +94,7 @@ static int cbe_system_reset_exception(struct pt_regs *regs)
                timer_interrupt(regs);
                break;
        case SRR1_WAKEMT:
-               /*
-                * The BMC can inject user triggered system reset exceptions,
-                * but cannot set the system reset reason in srr1,
-                * so check an extra register here.
-                */
-               if (sysreset_hack && (cpu = smp_processor_id()) == 0) {
-                       pmd = cbe_get_cpu_pmd_regs(cpu);
-                       if (in_be64(&pmd->ras_esc_0) & 0xffff) {
-                               out_be64(&pmd->ras_esc_0, 0);
-                               return 0;
-                       }
-               }
-               break;
+               return cbe_sysreset_hack();
 #ifdef CONFIG_CBE_RAS
        case SRR1_WAKESYSERR:
                cbe_system_error_exception(regs);
@@ -134,8 +118,6 @@ void __init cbe_pervasive_init(void)
        if (!cpu_has_feature(CPU_FTR_PAUSE_ZERO))
                return;
 
-       sysreset_hack = machine_is_compatible("IBM,CBPLUS-1.0");
-
        for_each_possible_cpu(cpu) {
                struct cbe_pmd_regs __iomem *regs = cbe_get_cpu_pmd_regs(cpu);
                if (!regs)
@@ -144,12 +126,6 @@ void __init cbe_pervasive_init(void)
                 /* Enable Pause(0) control bit */
                out_be64(&regs->pmcr, in_be64(&regs->pmcr) |
                                            CBE_PMD_PAUSE_ZERO_CONTROL);
-
-               /* Enable JTAG system-reset hack */
-               if (sysreset_hack)
-                       out_be32(&regs->fir_mode_reg,
-                               in_be32(&regs->fir_mode_reg) |
-                               CBE_PMD_FIR_MODE_M8);
        }
 
        ppc_md.power_save = cbe_power_save;
This page took 0.026802 seconds and 5 git commands to generate.