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

Michael Trimarchi trimarchi at gandalf.sssup.it
Mon Jun 22 22:09:59 CEST 2009


Rask Ingemann Lambertsen wrote:
>    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.
>   
We are looking the same files?
s3c_pm_do_save, save the array of register and so I think that it saves 
the MPLLCON and CLKDIVN

Michael







More information about the openmoko-kernel mailing list