Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | S3C24XX Suspend Support |
| 2 | ======================= |
| 3 | |
| 4 | |
| 5 | Introduction |
| 6 | ------------ |
| 7 | |
| 8 | The S3C2410 supports a low-power suspend mode, where the SDRAM is kept |
| 9 | in Self-Refresh mode, and all but the essential peripheral blocks are |
| 10 | powered down. For more information on how this works, please look |
| 11 | at the S3C2410 datasheets from Samsung. |
| 12 | |
| 13 | |
| 14 | Requirements |
| 15 | ------------ |
| 16 | |
| 17 | 1) A bootloader that can support the necessary resume operation |
| 18 | |
| 19 | 2) Support for at least 1 source for resume |
| 20 | |
| 21 | 3) CONFIG_PM enabled in the kernel |
| 22 | |
| 23 | 4) Any peripherals that are going to be powered down at the same |
| 24 | time require suspend/resume support. |
| 25 | |
| 26 | |
| 27 | Resuming |
| 28 | -------- |
| 29 | |
| 30 | The S3C2410 user manual defines the process of sending the CPU to |
| 31 | sleep and how it resumes. The default behaviour of the Linux code |
| 32 | is to set the GSTATUS3 register to the physical address of the |
| 33 | code to resume Linux operation. |
| 34 | |
| 35 | GSTATUS4 is currently left alone by the sleep code, and is free to |
| 36 | use for any other purposes (for example, the EB2410ITX uses this to |
| 37 | save memory configuration in). |
| 38 | |
| 39 | |
| 40 | Machine Support |
| 41 | --------------- |
| 42 | |
| 43 | The machine specific functions must call the s3c2410_pm_init() function |
| 44 | to say that its bootloader is capable of resuming. This can be as |
| 45 | simple as adding the following to the machine's definition: |
| 46 | |
| 47 | INITMACHINE(s3c2410_pm_init) |
| 48 | |
| 49 | A board can do its own setup before calling s3c2410_pm_init, if it |
| 50 | needs to setup anything else for power management support. |
| 51 | |
| 52 | There is currently no support for over-riding the default method of |
| 53 | saving the resume address, if your board requires it, then contact |
| 54 | the maintainer and discuss what is required. |
| 55 | |
| 56 | Note, the original method of adding an late_initcall() is wrong, |
| 57 | and will end up initialising all compiled machines' pm init! |
| 58 | |
| 59 | |
| 60 | Debugging |
| 61 | --------- |
| 62 | |
| 63 | There are several important things to remember when using PM suspend: |
| 64 | |
| 65 | 1) The uart drivers will disable the clocks to the UART blocks when |
| 66 | suspending, which means that use of printascii() or similar direct |
| 67 | access to the UARTs will cause the debug to stop. |
| 68 | |
| 69 | 2) Whilst the pm code itself will attempt to re-enable the UART clocks, |
| 70 | care should be taken that any external clock sources that the UARTs |
| 71 | rely on are still enabled at that point. |
| 72 | |
| 73 | |
| 74 | Configuration |
| 75 | ------------- |
| 76 | |
| 77 | The S3C2410 specific configuration in `System Type` defines various |
| 78 | aspects of how the S3C2410 suspend and resume support is configured |
| 79 | |
| 80 | `S3C2410 PM Suspend debug` |
| 81 | |
| 82 | This option prints messages to the serial console before and after |
| 83 | the actual suspend, giving detailed information on what is |
| 84 | happening |
| 85 | |
| 86 | |
| 87 | `S3C2410 PM Suspend Memory CRC` |
| 88 | |
| 89 | Allows the entire memory to be checksummed before and after the |
| 90 | suspend to see if there has been any corruption of the contents. |
| 91 | |
| 92 | This support requires the CRC32 function to be enabled. |
| 93 | |
| 94 | |
| 95 | `S3C2410 PM Suspend CRC Chunksize (KiB)` |
| 96 | |
| 97 | Defines the size of memory each CRC chunk covers. A smaller value |
| 98 | will mean that the CRC data block will take more memory, but will |
| 99 | identify any faults with better precision |
| 100 | |
| 101 | |
| 102 | Document Author |
| 103 | --------------- |
| 104 | |
| 105 | Ben Dooks, (c) 2004 Simtec Electronics |
| 106 | |