• Dave Gerlach's avatar
    soc: ti: Add pm33xx driver for basic suspend support · afe761f8
    Dave Gerlach authored
    AM335x and AM437x support various low power modes as documented
    in section 8.1.4.3 of the AM335x Technical Reference Manual and
    section 6.4.3 of the AM437x Technical Reference Manual.
    
    DeepSleep0 mode offers the lowest power mode with limited
    wakeup sources without a system reboot and is mapped as
    the suspend state in the kernel. In this state, MPU and
    PER domains are turned off with the internal RAM held in
    retention to facilitate the resume process. As part of
    the boot process, the assembly code is copied over to OCMCRAM
    so it can be executed to turn of the EMIF and put DDR into self
    refresh.
    
    Both platforms have a Cortex-M3 (WKUP_M3) which assists the MPU
    in DeepSleep0 entry and exit. WKUP_M3 takes care
    of the clockdomain and powerdomain transitions based on the
    intended low power state. MPU needs to load the appropriate
    WKUP_M3 binary onto the WKUP_M3 memory space before it can
    leverage any of the PM features like DeepSleep. This loading
    is handled by the remoteproc driver wkup_m3_rproc.
    
    Communication with the WKUP_M3 is handled by a wkup_m3_ipc
    driver that exposes the specific PM functionality to be used
    the PM code.
    
    In the current implementation when the suspend process
    is initiated, MPU interrupts the WKUP_M3 to let it know about
    the intent of entering DeepSleep0 and waits for an ACK. When
    the ACK is received MPU continues with its suspend process
    to suspend all the drivers and then jumps to assembly in
    OCMC RAM. The assembly code puts the external RAM in self-refresh
    mode, gates the MPU clock, and then finally executes the WFI
    instruction. Execution of the WFI instruction with MPU clock gated
    triggers another interrupt to the WKUP_M3 which then continues
    with the power down sequence wherein the clockdomain and
    powerdomain transition takes place. As part of the sleep sequence,
    WKUP_M3 unmasks the interrupt lines for the wakeup sources. WFI
    execution on WKUP_M3 causes the hardware to disable the main
    oscillator of the SoC and from here system remains in sleep state
    until a wake source brings the system into resume path.
    
    When a wakeup event occurs, WKUP_M3 starts the power-up
    sequence by switching on the power domains and finally
    enabling the clock to MPU. Since the MPU gets powered down
    as part of the sleep sequence in the resume path ROM code
    starts executing. The ROM code detects a wakeup from sleep
    and then jumps to the resume location in OCMC which was
    populated in one of the IPC registers as part of the suspend
    sequence.
    
    Code is based on work by Vaibhav Bedia.
    Signed-off-by: default avatarDave Gerlach <d-gerlach@ti.com>
    Acked-by: default avatarSantosh Shilimkar <ssantosh@kernel.org>
    Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
    afe761f8
Makefile 354 Bytes