Openmoko Bug #2295: cpufreq: serial ports fail after suspend/resume: rxerr: port=1 ch=0x24, rxs=0x00000001

Rask Ingemann Lambertsen rask at sygehus.dk
Sat Jun 20 23:10:01 CEST 2009


   There doesn't appear to be a way for me to post a reply on the trac, so
I'll do so here. Feel free to repost my reply on the trac.

On Thu, Jun 18, 2009 at 07:20:48AM -0000, Openmoko Public Trac wrote:
> 
> Comment(by budfive):
> 
>  I did some sleuthing by peeking into /dev/mem. Here's the analysis:
> 
>  Before and after the suspend, all of the UART registers seem to be set
>  identically. This indicates that the UART module itself is likely not the
>  culprit. The other likely caus is the baud clock. It is likely running at
>  the wrong speed, causing the UART to read garbage and to report reception
>  errors. Further, since cpufreq is involved, it makes this possibility all
>  the more likely.

   I decoded the UART error to 'framing error' a couple of weeks back. Other
noticable breakage when coming out of suspend:

1) HDQ doesn't work.
2) Audio plays too slowly.
3) CPU runs slower than normally.
4) Kernel clock runs much too slowly.

>  Looking at the clock registers, there are 2 discrepancies:
> 
>  {{{
>  |    Address | Meaning | Value before suspend | Value after suspend |
>  |------------+---------+----------------------+---------------------|
>  | 0x4C000004 | MPLLCON | 0x0002a010           | 0x0008e071          |
>  | 0x4C000014 | CLKDIVN | 0x00000005           | 0x00000007          |
>  }}}
>  This means that the MPLL configuration and the HCLK divider were changed.

   My patch does not touch those registers. Decoding the register values, I
get:

Before suspend		After suspend
M_SDIV =  0		M_SDIV =   1
M_PDIV =  1		M_PDIV =   7
M_MDIV = 42		M_MDIV = 142
MPLLclock = 400 [1]	MPLLclock = 200 [2]

FCLK = MPLLclock	FCLK = MPLLclock
HCLK = FCLK / 4 = 100	HCLK = FCLK / 3 = 66.7
PCLK = HCLK / 2 = 50	PCLK = HCLK / 2 = 33.3

[1] (2 * ( 42 + 8) * 12) / ((1 + 2) * 2^0) = 400
[2] (2 * (142 + 8) * 12) / ((7 + 2) * 2^1) = 200

>  The changed MPLL configuration probably isn't good either, but it's not
>  causing this particular breakage at least.

   On the contrary, it (and the HCLK change) is exactly the problem.

   The MPLLCON dividers happen to be exactly those used by U-Boot. I'm using
U-Boot as the bootloader. What about you?

   Looking at arch/arm/plat-s3c24xx/pm.c, I see that when CONFIG_CPU_FREQ is
defined, MPLLCON and CLKDIVN are not saved and restored across suspends. I
could find nowhere that saves and restores CAMDIVN at all.

-- 
Rask Ingemann Lambertsen
Danish law requires addresses in e-mail to be logged and stored for a year



More information about the openmoko-kernel mailing list