On Fri, Jan 13, 2012 at 3:35 PM, Paul Walmsley <paul@xxxxxxxxx> wrote: > cc Tero, Govindraj > > On Thu, 12 Jan 2012, NeilBrown wrote: > >> On Wed, 11 Jan 2012 06:43:04 -0700 (MST) Paul Walmsley <paul@xxxxxxxxx> wrote: >> >> I spent some time exploring why cpuidle never drops below state 0 and found >> out that the code explicitly disables other states when uart is active - for >> a fairly broad definition of 'active'. >> >> I found the "sleep_timeout" setting and set them all to 1 second. This meant >> that cpuidle started working, but I got a lot of garbage characters. >> > > ... > >> Does this really mean CPU_IDLE cannot be used when you might expect chars >> from a serial port - e.g. GPS or Bluetooth? > > Hmmm. Looking at mach-omap2/pm34xx.c and mach-omap2/cpuidle34xx.c, it > indeed prevents even the MPU from entering a low-power state when the UART > is active, as you write. That doesn't seem correct. > > Please try the following patch. It works fine for me on v3.2 with > omap2plus_defconfig on a 35xx BeagleBoard. No dropped or garbled > characters with console use. Not too surprising, since the UART has a > receive FIFO to withstand interrupt servicing delays. > > > - Paul > > From: Paul Walmsley <paul@xxxxxxxxx> > Date: Fri, 13 Jan 2012 02:10:30 -0700 > Subject: [PATCH] ARM: OMAP3: PM: allow MPU to enter low-power states even > when the UART is active > > For some reason, both the existing OMAP3 PM code and the OMAP3 CPUIdle > driver prevent the MPU powerdomain from entering low-power modes when > any UART isn't asleep. Possibly it is intended to minimize the ARM > wakeup latency when UART activity arrives, but the UART has a FIFO > that should handle this for most cases, with no dropped characters. I > may be forgetting something important, though. And CORE/PER low-power > states are a different matter entirely. > > Thanks to NeilBrown <neilb@xxxxxxx> for reporting the problem. > > Signed-off-by: Paul Walmsley <paul@xxxxxxxxx> > Cc: NeilBrown <neilb@xxxxxxx> > Cc: Joe Woodward <jw@xxxxxxxxxxxxxx> > Cc: Tero Kristo <t-kristo@xxxxxx> > Cc: Kevin Hilman <khilman@xxxxxx> > Cc: Govindraj.R <govindraj.raja@xxxxxx> > --- > arch/arm/mach-omap2/cpuidle34xx.c | 8 +++----- > arch/arm/mach-omap2/pm.h | 1 - > arch/arm/mach-omap2/pm34xx.c | 10 ---------- > 3 files changed, 3 insertions(+), 16 deletions(-) > > diff --git a/arch/arm/mach-omap2/cpuidle34xx.c b/arch/arm/mach-omap2/cpuidle34xx.c > index 942bb4f..4ef32d4 100644 > --- a/arch/arm/mach-omap2/cpuidle34xx.c > +++ b/arch/arm/mach-omap2/cpuidle34xx.c > @@ -183,6 +183,9 @@ static int next_valid_state(struct cpuidle_device *dev, > core_deepest_state = PWRDM_POWER_OFF; > } > > + if (!omap_uart_can_sleep()) > + core_deepest_state = PWRDM_POWER_ON; > + omap_uart_can_sleep is removed part of uart runtime conversion, and is no more available on latest mainline, looks like uart runtime patches got merged after 3.2 tagging. -- Thanks, Govindraj.R -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html