| 			S3C24XX Suspend Support | 
 | 			======================= | 
 |  | 
 |  | 
 | Introduction | 
 | ------------ | 
 |  | 
 |   The S3C24XX supports a low-power suspend mode, where the SDRAM is kept | 
 |   in Self-Refresh mode, and all but the essential peripheral blocks are | 
 |   powered down. For more information on how this works, please look | 
 |   at the relevant CPU datasheet from Samsung. | 
 |  | 
 |  | 
 | Requirements | 
 | ------------ | 
 |  | 
 |   1) A bootloader that can support the necessary resume operation | 
 |  | 
 |   2) Support for at least 1 source for resume | 
 |  | 
 |   3) CONFIG_PM enabled in the kernel | 
 |  | 
 |   4) Any peripherals that are going to be powered down at the same | 
 |      time require suspend/resume support. | 
 |  | 
 |  | 
 | Resuming | 
 | -------- | 
 |  | 
 |   The S3C2410 user manual defines the process of sending the CPU to | 
 |   sleep and how it resumes. The default behaviour of the Linux code | 
 |   is to set the GSTATUS3 register to the physical address of the | 
 |   code to resume Linux operation. | 
 |  | 
 |   GSTATUS4 is currently left alone by the sleep code, and is free to | 
 |   use for any other purposes (for example, the EB2410ITX uses this to | 
 |   save memory configuration in). | 
 |  | 
 |  | 
 | Machine Support | 
 | --------------- | 
 |  | 
 |   The machine specific functions must call the s3c_pm_init() function | 
 |   to say that its bootloader is capable of resuming. This can be as | 
 |   simple as adding the following to the machine's definition: | 
 |  | 
 |   INITMACHINE(s3c_pm_init) | 
 |  | 
 |   A board can do its own setup before calling s3c_pm_init, if it | 
 |   needs to setup anything else for power management support. | 
 |  | 
 |   There is currently no support for over-riding the default method of | 
 |   saving the resume address, if your board requires it, then contact | 
 |   the maintainer and discuss what is required. | 
 |  | 
 |   Note, the original method of adding an late_initcall() is wrong, | 
 |   and will end up initialising all compiled machines' pm init! | 
 |  | 
 |   The following is an example of code used for testing wakeup from | 
 |   an falling edge on IRQ_EINT0: | 
 |  | 
 |  | 
 | static irqreturn_t button_irq(int irq, void *pw) | 
 | { | 
 | 	return IRQ_HANDLED; | 
 | } | 
 |  | 
 | statuc void __init machine_init(void) | 
 | { | 
 | 	... | 
 |  | 
 | 	request_irq(IRQ_EINT0, button_irq, IRQF_TRIGGER_FALLING, | 
 | 		   "button-irq-eint0", NULL); | 
 |  | 
 | 	enable_irq_wake(IRQ_EINT0); | 
 |  | 
 | 	s3c_pm_init(); | 
 | } | 
 |  | 
 |  | 
 | Debugging | 
 | --------- | 
 |  | 
 |   There are several important things to remember when using PM suspend: | 
 |  | 
 |   1) The uart drivers will disable the clocks to the UART blocks when | 
 |      suspending, which means that use of printascii() or similar direct | 
 |      access to the UARTs will cause the debug to stop. | 
 |  | 
 |   2) Whilst the pm code itself will attempt to re-enable the UART clocks, | 
 |      care should be taken that any external clock sources that the UARTs | 
 |      rely on are still enabled at that point. | 
 |  | 
 |   3) If any debugging is placed in the resume path, then it must have the | 
 |      relevant clocks and peripherals setup before use (ie, bootloader). | 
 |  | 
 |      For example, if you transmit a character from the UART, the baud | 
 |      rate and uart controls must be setup beforehand. | 
 |  | 
 |  | 
 | Configuration | 
 | ------------- | 
 |  | 
 |   The S3C2410 specific configuration in `System Type` defines various | 
 |   aspects of how the S3C2410 suspend and resume support is configured | 
 |  | 
 |   `S3C2410 PM Suspend debug` | 
 |  | 
 |     This option prints messages to the serial console before and after | 
 |     the actual suspend, giving detailed information on what is | 
 |     happening | 
 |  | 
 |  | 
 |   `S3C2410 PM Suspend Memory CRC` | 
 |  | 
 |     Allows the entire memory to be checksummed before and after the | 
 |     suspend to see if there has been any corruption of the contents. | 
 |  | 
 |     Note, the time to calculate the CRC is dependent on the CPU speed | 
 |     and the size of memory. For an 64Mbyte RAM area on an 200MHz | 
 |     S3C2410, this can take approximately 4 seconds to complete. | 
 |  | 
 |     This support requires the CRC32 function to be enabled. | 
 |  | 
 |  | 
 |   `S3C2410 PM Suspend CRC Chunksize (KiB)` | 
 |  | 
 |     Defines the size of memory each CRC chunk covers. A smaller value | 
 |     will mean that the CRC data block will take more memory, but will | 
 |     identify any faults with better precision | 
 |  | 
 |  | 
 | Document Author | 
 | --------------- | 
 |  | 
 | Ben Dooks, Copyright 2004 Simtec Electronics | 
 |  |