linux-stable/arch
Jon Hunter 77da2d910a OMAP3: PM: Prevent hang in prcm_interrupt_handler
There are two scenarios where a race condition could result in a hang
in the prcm_interrupt handler. These are:

1). Waiting for PRM_IRQSTATUS_MPU register to clear.
Bit 0 of the PRM_IRQSTATUS_MPU register indicates that a wake-up event
is pending for the MPU. This bit can only be cleared if the all the
wake-up events latched in the various PM_WKST_x registers have been
cleared. If a wake-up event occurred during the processing of the prcm
interrupt handler, after the corresponding PM_WKST_x register was
checked but before the PRM_IRQSTATUS_MPU was cleared, then the CPU
would be stuck forever waiting for bit 0 in PRM_IRQSTATUS_MPU to be
cleared.

2). Waiting for the PM_WKST_x register to clear.
Some power domains have more than one wake-up source. The PM_WKST_x
registers indicate the source of a wake-up event and need to be cleared
after a wake-up event occurs. When the PM_WKST_x registers are read and
before they are cleared, it is possible that another wake-up event
could occur causing another bit to be set in one of the PM_WKST_x
registers. If this did occur after reading a PM_WKST_x register then
the CPU would miss this event and get stuck forever in a loop waiting
for that PM_WKST_x register to clear.

This patch address the above race conditions that would result in a
hang.

Signed-off-by: Jon Hunter <jon-hunter@ti.com>
Reviewed-by: Paul Walmsley <paul@pwsan.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
2009-10-05 10:50:59 -07:00
..
alpha alpha: Fix duplicate <asm/thread_info.h> include 2009-09-27 14:46:05 -07:00
arm OMAP3: PM: Prevent hang in prcm_interrupt_handler 2009-10-05 10:50:59 -07:00
avr32 Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild-next 2009-09-23 15:37:02 -07:00
blackfin blackfin: Cleanup linker script using new linker script macros. 2009-09-24 17:16:22 -07:00
cris Merge branch 'for-linus' of git://repo.or.cz/cris-mirror 2009-09-24 17:08:56 -07:00
frv FRV: Flash mappings for the MB93090-MB00 motherboard 2009-09-24 17:18:38 -07:00
h8300 h8300: Cleanup linker script using new linker script macros. 2009-09-24 17:16:22 -07:00
ia64 const: mark struct vm_struct_operations 2009-09-27 11:39:25 -07:00
m32r Merge branch 'for-linus' of git://www.linux-m32r.org/git/takata/linux-2.6_dev 2009-09-24 17:25:09 -07:00
m68k headers: utsname.h redux 2009-09-23 18:13:10 -07:00
m68knommu headers: utsname.h redux 2009-09-23 18:13:10 -07:00
microblaze Merge branch 'for-linus' of git://git.monstr.eu/linux-2.6-microblaze 2009-09-24 09:01:44 -07:00
mips mips: fix build of vmlinux.lds 2009-09-25 19:49:27 +02:00
mn10300 mn10300: Clean up linker script using higher-level macros. 2009-09-24 17:16:22 -07:00
parisc parisc: Remove useless altinstructions code copied from x86. 2009-09-24 17:16:21 -07:00
powerpc const: mark struct vm_struct_operations 2009-09-27 11:39:25 -07:00
s390 sysctl: remove "struct file *" argument of ->proc_handler 2009-09-24 07:21:04 -07:00
score Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild-next 2009-09-23 15:37:02 -07:00
sh sh: Add support DMA Engine to SH7780 2009-09-25 12:19:33 +09:00
sparc Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6 2009-09-26 10:08:23 -07:00
um um: Clean up linker script using standard macros. 2009-09-24 17:16:22 -07:00
x86 const: mark struct vm_struct_operations 2009-09-27 11:39:25 -07:00
xtensa xtensa: Cleanup linker script using new linker script macros. 2009-09-24 17:16:21 -07:00
.gitignore
Kconfig oprofile: fix oprofile regression: select RING_BUFFER_ALLOW_SWAP 2009-09-17 15:53:42 -04:00