android_kernel_motorola_sm6225/arch
Paul Walmsley 3c82e229f0 OMAP3 clock: correct module IDLEST bits: SSI; DSS; USBHOST; HSOTGUSB
Fix two bugs in the OMAP3 clock tree pertaining to the SSI, DSS,
USBHOST, and HSOTGUSB devices.  These devices are both interconnect
initiators and targets.  Without this patch, clk_enable()s on clocks for
these modules can be very high latency (potentially up to ~200
milliseconds) and message such as the following are generated:

    Clock usbhost_48m_fck didn't enable in 100000 tries

Two bugs are fixed by this patch.  First, OMAP hardware only supports
target CM_IDLEST register bits on ES2+ chips and beyond.  ES1 chips
should not wait for these clocks to enable.  So, split the appropriate
clocks into ES1 and ES2+ variants, so that kernels running on ES1
devices won't try to wait.

Second, the current heuristic in omap2_clk_dflt_find_idlest() will
fail for these clocks.  It assumes that the CM_IDLEST bit to wait upon
is the same as the CM_*CLKEN bit, which is false[1].  Fix by
implementing custom clkops .find_idlest function pointers for the
appropriate clocks that return the correct slave IDLEST bit shift.

This was originally fixed in the linux-omap kernel during 2.6.29 in a
slightly different manner[2][3].

In the medium-term future, all of the module IDLEST code will
eventually be moved to the omap_hwmod code.

Problem reported by Jarkko Nikula <jhnikula@gmail.com>:

    http://marc.info/?l=linux-omap&m=124306184903679&w=2

...

1. See for example 34xx TRM Revision P Table 4-213 and 4-217 (for the
   DSS case).

2. http://www.spinics.net/lists/linux-omap/msg05512.html et seq.

3. http://lkml.indiana.edu/hypermail/linux/kernel/0901.3/01498.html


Signed-off-by: Paul Walmsley <paul@pwsan.com>
Cc: Jarkko Nikula <jhnikula@gmail.com>
2009-07-24 20:10:36 -06:00
..
alpha headers: smp_lock.h redux 2009-07-12 12:22:34 -07:00
arm OMAP3 clock: correct module IDLEST bits: SSI; DSS; USBHOST; HSOTGUSB 2009-07-24 20:10:36 -06:00
avr32 sched: INIT_PREEMPT_COUNT 2009-07-10 14:24:05 -07:00
blackfin blackfin: fix wrong CTS inversion 2009-07-20 16:38:44 -07:00
cris headers: smp_lock.h redux 2009-07-12 12:22:34 -07:00
frv sched: INIT_PREEMPT_COUNT 2009-07-10 14:24:05 -07:00
h8300 sched: INIT_PREEMPT_COUNT 2009-07-10 14:24:05 -07:00
ia64 Revert "Neither asm/types.h nor linux/types.h is required for arch/ia64/include/asm/fpu.h" 2009-07-17 06:35:05 -07:00
m32r headers: smp_lock.h redux 2009-07-12 12:22:34 -07:00
m68k sched: INIT_PREEMPT_COUNT 2009-07-10 14:24:05 -07:00
m68knommu Remove multiple KERN_ prefixes from printk formats 2009-07-08 10:30:03 -07:00
microblaze headers: smp_lock.h redux 2009-07-12 12:22:34 -07:00
mips headers: smp_lock.h redux 2009-07-12 12:22:34 -07:00
mn10300 vmlinux.lds.h: restructure BSS linker script macros 2009-07-18 00:02:45 +02:00
parisc sched: INIT_PREEMPT_COUNT 2009-07-10 14:24:05 -07:00
powerpc powerpc: Fix another bug in move of altivec code to vector.S 2009-07-15 17:41:46 +10:00
s390 headers: smp_lock.h redux 2009-07-12 12:22:34 -07:00
sh headers: smp_lock.h redux 2009-07-12 12:22:34 -07:00
sparc Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6 2009-07-13 10:24:08 -07:00
um sched: INIT_PREEMPT_COUNT 2009-07-10 14:24:05 -07:00
x86 Merge branch 'perf-counters-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/peterz/linux-2.6-perf 2009-07-22 11:41:56 -07:00
xtensa sched: INIT_PREEMPT_COUNT 2009-07-10 14:24:05 -07:00
.gitignore
Kconfig gcov: add gcov profiling infrastructure 2009-06-18 13:03:57 -07:00