linux/drivers/soc
Dave Gerlach afe761f8d3 soc: ti: Add pm33xx driver for basic suspend support
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: Dave Gerlach <d-gerlach@ti.com>
Acked-by: Santosh Shilimkar <ssantosh@kernel.org>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2018-02-27 08:53:46 -08:00
..
actions soc: actions: sps: Add S700 2017-11-27 23:11:01 +01:00
amlogic meson-gx-socinfo: Fix package id parsing 2017-11-30 15:29:44 -08:00
atmel drivers: soc: atmel: Add basic support for new sama5d2 SiPs 2017-09-17 19:45:59 +02:00
bcm soc: bcm: brcmstb: Be multi-platform compatible 2018-01-15 15:47:07 +01:00
dove License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
fsl soc: fsl: guts: Add a NULL check for devm_kasprintf() 2018-01-22 16:59:48 -06:00
gemini soc: Add SoC driver for Gemini 2018-01-04 17:01:53 +01:00
imx soc: imx: gpc: Add i.MX6SX PCI power domain 2017-12-26 16:26:46 +08:00
lantiq MIPS: lantiq: Add a GPHY driver which uses the RCU syscon-mfd 2017-09-04 21:19:02 +02:00
mediatek soc: mediatek: add MT2712 scpsys support 2017-12-21 11:49:23 +01:00
qcom soc: qcom: smp2p: Use common error handling code in qcom_smp2p_probe() 2018-01-01 00:29:09 -06:00
renesas soc: renesas: rcar-sysc: Keep wakeup sources active during system suspend 2017-12-20 11:16:05 +01:00
rockchip soc: rockchip: power-domain: Use GENPD_FLAG_ACTIVE_WAKEUP 2017-11-08 01:00:47 +01:00
samsung soc: samsung: Add SPDX license identifiers 2018-01-03 18:45:15 +01:00
sunxi drivers: soc: sunxi: add support for A64 and its SRAM C 2017-08-18 14:30:21 +08:00
tegra soc/tegra: fuse: Explicitly request DMA channel from APB DMA driver 2017-12-21 17:04:12 +01:00
ti soc: ti: Add pm33xx driver for basic suspend support 2018-02-27 08:53:46 -08:00
ux500
versatile soc: versatile: remove unnecessary static in realview_soc_probe() 2017-08-16 22:28:27 +02:00
xilinx soc: xilinx: Fix Kconfig alignment 2018-01-16 15:50:21 +01:00
zte
Kconfig soc: xilinx: Create folder structure for soc specific drivers 2018-01-08 13:42:39 +01:00
Makefile ARM: SoC driver updates for 4.16 2018-02-01 16:35:31 -08:00