#include <mach/clock.h>
#include <asm/proc-fns.h>
#include <asm/system.h>
+#include <asm/hardware/gic.h>
#include "crm_regs.h"
#include "regs-anadig.h"
extern int tick_broadcast_oneshot_active(void);
+void ca9_do_idle(void)
+{
+ do {
+ cpu_do_idle();
+ } while (__raw_readl(gic_cpu_base_addr + GIC_CPU_HIGHPRI) == 1023);
+}
+
void arch_idle_single_core(void)
{
u32 reg;
reg |= MXC_CCM_CGPR_WAIT_MODE_FIX;
__raw_writel(reg, MXC_CCM_CGPR);
- cpu_do_idle();
+ ca9_do_idle();
} else {
/*
* Implement the 12:5 ARM:IPG_CLK ratio
__raw_writel(wait_mode_arm_podf, MXC_CCM_CACRR);
while (__raw_readl(MXC_CCM_CDHIPR))
;
- cpu_do_idle();
+ ca9_do_idle();
__raw_writel(cur_arm_podf - 1, MXC_CCM_CACRR);
}
void arch_idle_with_workaround(cpu)
{
- u32 reg;
u32 podf = wait_mode_arm_podf;
*((char *)(&num_cpu_idle_lock) + (char)cpu) = 0x0;
reg |= MXC_CCM_CGPR_WAIT_MODE_FIX;
__raw_writel(reg, MXC_CCM_CGPR);
- cpu_do_idle();
+ ca9_do_idle();
} else
arch_idle_with_workaround(cpu);
#ifdef CONFIG_LOCAL_TIMERS
reg &= ~MXC_CCM_CGPR_MEM_IPG_STOP_MASK;
__raw_writel(reg, MXC_CCM_CGPR);
- cpu_do_idle();
+ ca9_do_idle();
} else if (num_possible_cpus() == 1)
/* iMX6SL or iMX6DLS */
arch_idle_single_core();
arch_idle_multi_core();
} else {
mxc_cpu_lp_set(WAIT_CLOCKED);
- cpu_do_idle();
+ ca9_do_idle();
}
}