[PATCH 16/16] ARM: omap: disable cpuidle for OMAP3 platforms
From: Russell King - ARM Linux <hidden>
Date: 2012-02-08 22:59:23
Also in:
linux-omap
On Wed, Feb 08, 2012 at 10:59:06AM -0800, Tony Lindgren wrote:
* Russell King - ARM Linux [off-list ref] [120208 08:10]:quoted
Commit 2fd149645eb4 (ARM: OMAP2+: UART: Remove omap_uart_can_sleep and add pm_qos) has caused a regression on OMAP3 platforms. When the UART is trying to transmit data, if we enter a low power mode, transmission stops, which makes serial on OMAP3 unusable - a 'dmesg' takes five minutes to be output at 115200 baud, at a rate of around a block of 16 characters every couple of seconds. Unfortunately, the commit above can't be reverted because of many other changes in this area, so this implements a dirty fix by disabling CPU idle in the places the original commit does, irrespective of the UART state....quoted
--- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c@@ -421,7 +421,7 @@ static void omap3_pm_idle(void) local_irq_disable(); local_fiq_disable(); - if (omap_irq_pending() || need_resched()) + if (omap_irq_pending() || need_resched() || 1) goto out; trace_power_start(POWER_CSTATE, 1, smp_processor_id());Argh, this is just too ugly. There has got to be a better fix for the -rc series.
That I'd agree on - because it is ugly and it's the best I could do to revert the commit mentioned above short of reverting a whole raft of other useful looking commits. There's got to be a better solution.
Looks like the patches to fix omap-serial.c are queued for v3.4, so that won't help.
Well, the fact of the matter is this is a regression, which means it needs fixing for v3.3. A simple patch would be preferred over more complex patches. So, if there's no other solution but to put the omap-serial patches in for v3.3, then that's the best solution for v3.3. First, someone who understands this code needs to see whether there is a simpler fix (eg, putting back what was there in a simpler form.) However, leaving it in its current state for v3.3 is not acceptable.