[PATCH 01/20] ARM: clean up idle handlers
Nicolas Pitre
nico at fluxnic.net
Mon Dec 19 14:43:01 EST 2011
On Mon, 19 Dec 2011, Tony Lindgren wrote:
> * Nicolas Pitre <nico at fluxnic.net> [111219 01:20]:
> > Let's factor out the need_resched() check instead of having it duplicated
> > in every pm_idle implementations to avoid inconsistencies (omap2_pm_idle
> > was missing it already).
> >
> > The forceful re-enablement of IRQs after pm_idle has returned can go.
> > The warning certainly doesn't trigger for existing users. Similar for
> > the redundant local_irq_disable() call in the OMAP implementations.
> >
> > To get rid of the pm_idle calling convention oddity, let's introduce
> > arm_pm_idle() allowing for the local_irq_enable() to be factored out
> > from SOC specific implementations. The default pm_idle function becomes
> > a wrapper for arm_pm_idle and it takes care of enabling IRQs closer to
> > where they are initially disabled.
> >
> > And finally move the comment explaining the reason for that turning off
> > of IRQs to a more proper location.
> >
> > Signed-off-by: Nicolas Pitre <nicolas.pitre at linaro.org>
>
> For omaps:
>
> Tested-by: Tony Lindgren <tony at atomide.com>
Thanks.
> For pm44xx.c the following merge will be needed for omap/omap4 branch
> in arm-soc tree:
Great. I'm CC'ing Arnd and Olof so they are aware.
>
> --- a/arch/arm/mach-omap2/pm44xx.c
> +++ b/arch/arm/mach-omap2/pm44xx.c
> @@@ -16,10 -17,10 +17,12 @@@
> #include <linux/err.h>
> #include <linux/slab.h>
>
> +#include <asm/system.h>
> +
> #include "common.h"
> + #include "clockdomain.h"
> #include "powerdomain.h"
> + #include "pm.h"
>
> struct power_state {
> struct powerdomain *pwrdm;
> @@@ -85,11 -161,30 +163,24 @@@ static int __init pwrdms_setup(struct p
> pwrst = kmalloc(sizeof(struct power_state), GFP_ATOMIC);
> if (!pwrst)
> return -ENOMEM;
> +
> pwrst->pwrdm = pwrdm;
> - pwrst->next_state = PWRDM_POWER_ON;
> + pwrst->next_state = PWRDM_POWER_RET;
> list_add(&pwrst->node, &pwrst_list);
>
> - return pwrdm_set_next_pwrst(pwrst->pwrdm, pwrst->next_state);
> + return omap_set_pwrdm_state(pwrst->pwrdm, pwrst->next_state);
> + }
> +
> + /**
> + * omap_default_idle - OMAP4 default ilde routine.'
> + *
> + * Implements OMAP4 memory, IO ordering requirements which can't be addressed
> + * with default arch_idle() hook. Used by all CPUs with !CONFIG_CPUIDLE and
> + * by secondary CPU with CONFIG_CPUIDLE.
> + */
> + static void omap_default_idle(void)
> + {
> - local_irq_disable();
> - local_fiq_disable();
> -
> + omap_do_wfi();
> -
> - local_fiq_enable();
> - local_irq_enable();
> }
>
> /**
> @@@ -117,6 -255,11 +251,11 @@@ static int __init omap4_pm_init(void
> suspend_set_ops(&omap_pm_ops);
> #endif /* CONFIG_SUSPEND */
>
> + /* Overwrite the default arch_idle() */
> - pm_idle = omap_default_idle;
> ++ arm_pm_idle = omap_default_idle;
> +
> + omap4_idle_init();
> +
> err2:
> return ret;
> }
>
> Regards,
>
> Tony
>
More information about the linux-arm-kernel
mailing list