1. Article purpose
The purpose of this article is to:
- list the Power Management Integrated Circuit (PMIC) hardware components that might be integrated in the different boards
- link these components to the corresponding software framework(s)
- point to the datasheet(s) of these components
- explain, when necessary, how to configure these components.
2. Software frameworks
Domain | Peripheral | Software components | Comment | ||
---|---|---|---|---|---|
OP-TEE | Linux | STM32Cube | |||
PMIC | STPMIC1 | OP-TEE overview SCMI overview |
SCMI overview Regulator overview Watchdog overview U-Boot |
3. STPMIC1
3.1. Description
The STPMIC1 is a device that handles the power supplies for some STM32MP boards. The STPMIC1 main features are:
- configuration via I²C bus,
- 10 regulators of different kinds with over-current protection,
- 3 power switches for USB supplies,
- a power-on key input,
- a watchdog,
- a thermal protection,
- a NORMAL mode and an ALTERNATE mode that is used for system suspend.
The STPMIC documentation is available from www.st.com [1], for example STPMIC1 datasheet.
When using a PMIC on a board, it is recommended to use a secure I²C (for example I2C4 or I2C6 on STM32MP15x lines ) protected by ETPZC and the PMIC is handle only in OP-TEE, exported with SCMI.
It is the default configuration of all STMicroelectronics STM32MP13x lines boards.
For STMicroelectronics STM32MP15x lines boards, it is not the case because the used I2C is shared with other devices.
3.2. Support in Linux Kernel
The PMIC can be accessed via SCMI protocol. If this option is chosen, the kernel does not instantiate any linux STPMIC1 driver but instead it uses SCMI regulators to control power supplies. As the PMIC driver is fully handled in OP-TEE the I2C bus can be secured.
It is the default configuration for STM32MP13x lines .
3.2.1. STMPIC1 MFD driver
The STPMIC1 Multi-Function Devices (MFD) driver is composed of several parts:
- The core driver
- The regulator driver
- The watchdog driver
- The input driver
The thermal feature is not supported.
It is used only for STM32MP15x lines .
Bindings are described in: Documentation/devicetree/bindings/mfd/st,stpmic1.yaml
3.2.1.1. Core driver
The core implements the Multi-Function Devices Framework API.
- It is probed by the I²C framework.
- It handles communication with the PMIC via I²C.
- It probes the others STPMIC1 drivers (input, watchdog....).
- It acts as an interrupt controller for the other drivers.
Source code:
3.2.1.2. Regulator driver
The driver implements the Regulator framework API
- Each BUCK, LDO or POWER SWITCH inside the STPMIC1 device is presented as a voltage regulator.
- Power switches are presented as fixed voltage sources. Voltage can not be set.
- The driver does not handle the suspend configuration. This is done by the Secure Monitor.
Source code:
3.2.1.3. Watchdog driver
The driver implements the Watchdog framework API
When enabled, a watchdog device is available for the user-land. As soon as a user has started to write in the watchdog it is armed in the PMIC. When the watchdog timer expires, the PMIC shuts down.
Source code:
3.2.1.4. Input driver
The driver implements the Input framework API.
The driver exposes a single key (KEY_POWER) that can be used as any standard input device in /dev/input/eventX
Source code:
3.2.1.5. Kernel Configuration
With kernel menuconfig, enable following configurations:
- core part: MFD_STPMIC1
- regulator: REGULATOR_STPMIC1
- watchdog: STPMIC1_WATCHDOG
- input: INPUT_STPMIC1_ONKEY
3.3. Support in U-Boot
The PMIC can also be accessed via SCMI protocol. If this option is chosen, U-Boot does not instantiate any STPMIC1 driver but instead it uses SCMI regulators to control power supplies.
It is the default configuration for STM32MP13x lines .
3.3.1. U-Boot STPMIC1 driver
STPMIC1 is used by U-Boot for STM32MP15x lines to:
- Control regulators used by other drivers (mmc-supply for SDCard for example, usb vbus)
- Trace pmic startup reason
STMPIC is supported with existing uclass of the 'Driver Model' described in doc/develop/driver-model/pmic-framework.rst or in U-Boot Documentation.
- pmic :
- uclass: drivers/power/pmic/pmic-uclass.c , CONFIG_DM_PMIC
- driver: drivers/power/pmic/stpmic1.c , CONFIG_PMIC_STPMIC1
- regulator:
- uclass: drivers/power/regulator/regulator-uclass.c , CONFIG_DM_REGULATOR
- driver: drivers/power/regulator/stpmic1.c , CONFIG_DM_REGULATOR_STPMIC1
- sysreset:
- uclass: drivers/sysreset/sysreset-uclass.c , CONFIG_SYSRESET
- code in pmic driver
The STPMIC1 is available with the existing commands:
- pmic (CONFIG_CMD_PMIC)
- regulator (CONFIG_CMD_REGULATOR)
- poweroff (CONFIG_CMD_POWEROFF)
STPMIC1 driver supports configuration via device-tree; the bindings, same as kernel, are described in: Documentation/devicetree/bindings/mfd/st,stpmic1.yaml
3.4. Support in Cortex-A7 Secure
3.4.1. TF-A
STPMIC1 is used by TF-A firmware to configure DDR and storage power supplies.
Driver source code:
STPMIC1 driver supports configuration via device-tree, bindings are described in:
An example of PMIC configuration with device tree can be found in this file, node &i2c4: fdts/stm32mp15xx-edx.dtsi
When using a PMIC on a board, TF-A is configured to use a secure I²C (I2C4 or I2C6). By default on STMicroelectronics boards, I2C4 is used.
Using another I²C (non-secure) is not supported in the TF-A implementation made by STMicroelectronics. But it is possible to modify the code and device tree files to support it.
Here is an example with I2C2:
- Copy the chosen I²C node from Linux device tree in the TF-A device tree file for your board, as well as its dependencies (like pinctrl). You can also remove the properties not used by TF-A as done in the example below
/ {
...
soc {
...
+ i2c2: i2c@40013000 {
+ compatible = "st,stm32mp15-i2c";
+ reg = <0x40013000 0x400>;
+ clocks = <&rcc I2C2_K>;
+ resets = <&rcc I2C2_R>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ status = "disabled";
+ };
- change pmic node parent to this newly added I²C
& i2c2 {
...
pmic: stpmic@33 { # You may also require to change this I²C address (33)
...
};
- remove in PMIC node the property:
secure-status = "okay";
- Add this I²C base address in plat/st/stm32mp1/stm32mp1_def.h :
#define I2C2_BASE U(0x40013000)
- Add a case for this I²C in register_periph_iomem() function, in the file plat/st/stm32mp1/stm32mp1_shared_resources.c . It should be placed with the other non-secure peripherals (UARTs and IWDG2):
case UART7_BASE:
case UART8_BASE:
case IWDG2_BASE:
+ case I2C2_BASE:
/* Allow drivers to register some non secure resources */
VERBOSE("IO for non secure resource 0x%x\n",
(unsigned int)base);
- Add the clock of this I²C in the stm32mp1_clk_gate[] table in the file drivers/st/clk/stm32mp1_clk.c
+ _CLK_SC_SELEC(RCC_MP_APB1ENSETR, 22, I2C2_K, _I2C12_SEL),
- Regarding the GPIO ports used by I2C2: in this stm32mp1_clk_gate[] table, remove the #ifdef IMAGE_BL2 around GPIO banks entries if present
3.4.2. OP-TEE
STPMIC1 is used by OP-TEE OS to configure the regulators for system suspend and system shutdown.
Driver source code:
3.4.2.1. SCMI Driver
As most of regulators handled by OP-TEE, the STPMIC1 regulators can be shared via SCMI voltage domains protocol to the non secure world.
It is the default configuration for STM32MP13x lines .
4. References
Please refer to the following links for additional information: