3.2.2.14. TPS6594 PMIC
3.2.2.14.1. Introduction
TPS6594 is a Power Management IC which provides regulators (bucks and LDOs) and others features like GPIOs, RTC, watchdog, ESMs (Error Signal Monitor), and PFSM (Pre-configurable Finite State Machine). The SoC and the PMIC can communicate through the I2C or SPI interfaces. TPS6594 is the super-set device while TPS6593 and LP8764 are derivatives.
This guide covers TPS6594/TPS6593/LP8764 PMIC drivers.
At least one of the two interfaces should be selected : either I2C or SPI driver. The others drivers are sub-modules and may be selected or not, depending on the application.
Supported boards (using I2C interface)
AM62A SK EVM -> 1 TPS6593
J721E EVM -> 2 TPS6594
J721S2 EVM -> 2 TPS6594 + 1 LP8764
J7200 EVM -> 1 TPS6594 + 1 LP8764
J784S4 EVM -> 1 TPS6594
3.2.2.14.2. Device tree configuration
See device tree binding:
Documentation/devicetree/bindings/mfd/ti,tps6594.yaml
3.2.2.14.3. TPS6594 I2C driver
Driver source location:
drivers/mfd/tps6594-i2c.c
Kernel configuration options
Configs to be enabled in kernel:
CONFIG_I2C
CONFIG_MFD_TPS6594_I2C (TPS6594 I2C support)
Device Drivers --->
Multifunction device drivers --->
<*> TI TPS6594 Power Management chip with I2C
CRC feature
- When drivers are built as ‘modules’
For safety applications, a CRC feature can be enabled from userspace:
echo "options tps6594_i2c enable_crc=true" > /etc/modprobe.d/tps6594.conf; sync;
Then, the board must be powered off/on with the mechanical switch to apply the new setting.
CRC feature will be enabled at module loading. Example of kernel messages for J721S2:
[ 5.060454] tps6594 0-0048: CRC feature enabled on primary PMIC
[ 5.086440] tps6594 0-004c: CRC feature enabled on secondary PMIC
[ 5.115762] tps6594 0-0058: CRC feature enabled on secondary PMIC
To disable CRC feature, the modprobe conf file must be removed:
rm /etc/modprobe.d/tps6594.conf; sync;
Then, the board must be powered off/on with the mechanical switch to apply the new setting.
- When drivers are built statically into the kernel (‘built-in’)
CRC feature can be enabled through the kernel command line parameter:
tps6594_i2c.enable_crc=Y
If the kernel command line is edited from uboot, the new setting can be saved to the persistent storage:
saveenv
3.2.2.14.4. TPS6594 SPI driver
Driver source location:
drivers/mfd/tps6594-spi.c
Kernel configuration options
Configs to be enabled in kernel:
CONFIG_SPI_MASTER
CONFIG_MFD_TPS6594_SPI (TPS6594 SPI support)
Device Drivers --->
Multifunction device drivers --->
<*> TI TPS6594 Power Management chip with SPI
CRC feature
For safety applications, a CRC feature can be enabled (see ‘TPS6594 I2C driver’ chapter).
3.2.2.14.5. TPS6594 GPIO/pinctrl driver
The TPS6594 device integrates 11 configurable general-purpose I/Os that are multiplexed with alternative functions.
Driver source location:
drivers/pinctrl/pinctrl-tps6594.c
[WARNING] GPIO indexation is 0-based in linux, whereas it is 1-based in the PMIC TRM. So GPIO5 in linux corresponds to GPIO6 in the TRM.
Kernel configuration options
Configs to be enabled in kernel:
CONFIG_PINCTRL_TPS6594 (TPS6594 GPIO support)
Device Drivers --->
Pin controllers --->
<*> Pinctrl and GPIO driver for TI TPS6594 PMIC
Driver usage (inputs - outputs)
Examples given for AM62A.
List all gpiochips present on the system, their names, labels and number of GPIO lines:
gpiodetect
[...]
gpiochip4 [tps6594-gpio] (11 lines)
List all lines of specified gpiochips, their names, consumers, direction, active state and additional flags:
gpioinfo gpiochip4
gpiochip4 - 11 lines:
line 0: unnamed unused input active-high
line 1: unnamed unused input active-high
line 2: unnamed unused input active-high
line 3: unnamed unused output active-high
line 4: unnamed unused input active-high
line 5: unnamed unused output active-high
line 6: unnamed unused input active-high
line 7: unnamed unused input active-high
line 8: unnamed unused input active-high
line 9: unnamed unused input active-high
line 10: unnamed unused input active-high
Read values of specified GPIO lines:
gpioget gpiochip4 5
0
Set values of specified GPIO lines:
gpioset gpiochip4 5=1
Driver usage (pinctrl)
Examples given for AM62A.
Get functions available for each pin:
cat /sys/kernel/debug/pinctrl/tps6594-pinctrl.1.auto/pinmux-functions
function 0: gpio, groups = [ GPIO0 GPIO1 GPIO2 GPIO3 GPIO4 GPIO5 GPIO6 GPIO7 GPIO8 GPIO9 GPIO10 ]
function 1: nsleep1, groups = [ GPIO0 GPIO1 GPIO2 GPIO3 GPIO4 GPIO5 GPIO6 GPIO7 GPIO8 GPIO9 GPIO10 ]
function 2: nsleep2, groups = [ GPIO0 GPIO1 GPIO2 GPIO3 GPIO4 GPIO5 GPIO6 GPIO7 GPIO8 GPIO9 GPIO10 ]
function 3: wkup1, groups = [ GPIO0 GPIO1 GPIO2 GPIO3 GPIO4 GPIO5 GPIO6 GPIO7 GPIO8 GPIO9 GPIO10 ]
function 4: wkup2, groups = [ GPIO0 GPIO1 GPIO2 GPIO3 GPIO4 GPIO5 GPIO6 GPIO7 GPIO8 GPIO9 GPIO10 ]
function 5: scl_i2c2-cs_spi, groups = [ GPIO0 GPIO1 ]
function 6: nrstout_soc, groups = [ GPIO0 GPIO10 ]
function 7: trig_wdog, groups = [ GPIO1 GPIO10 ]
function 8: sda_i2c2-sdo_spi, groups = [ GPIO1 ]
function 9: clk32kout, groups = [ GPIO2 GPIO3 GPIO7 ]
function 10: nerr_soc, groups = [ GPIO2 ]
function 11: sclk_spmi, groups = [ GPIO4 ]
function 12: sdata_spmi, groups = [ GPIO5 ]
function 13: nerr_mcu, groups = [ GPIO6 ]
function 14: syncclkout, groups = [ GPIO7 GPIO9 ]
function 15: disable_wdog, groups = [ GPIO7 GPIO8 ]
function 16: pdog, groups = [ GPIO8 ]
function 17: syncclkin, groups = [ GPIO9 ]
Modify the function for a pin:
echo "<group> <function>" > /sys/kernel/debug/pinctrl/tps6594-pinctrl.1.auto/pinmux-select
Examples:
echo "GPIO7 gpio" > /sys/kernel/debug/pinctrl/tps6594-pinctrl.1.auto/pinmux-select
echo "GPIO2 nerr_soc" > /sys/kernel/debug/pinctrl/tps6594-pinctrl.1.auto/pinmux-select
3.2.2.14.6. TPS6594 regulator driver
The TPS6594 provides regulators (bucks and LDOs). The output voltages are configurable and are meant to supply power to the main processor and other components. Bucks can be used in single or multiphase mode, depending on the PMIC part number.
Driver source location:
drivers/regulator/tps6594-regulator.c
Kernel configuration options
Configs to be enabled in kernel:
CONFIG_REGULATOR_TPS6594 (TPS6594 regulator support)
Device Drivers --->
Voltage and Current Regulator Support --->
<*> TI TPS6594 Power regulators
Driver usage
Regulator summary can be displayed:
cat /sys/kernel/debug/regulator/regulator_summary
Regulator events, if any, can be seen by running this command:
cat /proc/interrupts
3.2.2.14.7. TPS6594 ESM driver
This device monitors the SoC error output signal at its nERR_SOC input pin. In error condition, ESM toggles its nRSTOUT_SOC pin to reset the SoC.
Typically, Error Signal Monitor (on PMIC side) can be set up along with Error Signaling Module (on SoC side).
Driver source location:
drivers/misc/tps6594-esm.c
Kernel configuration options
Configs to be enabled in kernel:
CONFIG_TPS6594_ESM (TPS6594 ESM support)
Device Drivers --->
Misc devices --->
<*> TI TPS6594 Error Signal Monitor support
Driver usage
PMIC ESM will be started at module loading.
ESM errors, if any, can be seen by running this command:
cat /proc/interrupts
3.2.2.14.8. TPS6594 RTC driver
Driver source location:
drivers/rtc/rtc-tps6594.c
Kernel configuration options
Configs to be enabled in kernel:
CONFIG_RTC_DRV_TPS6594 (TPS6594 RTC support)
Device Drivers --->
Real Time Clock --->
<*> TI TPS6594 RTC driver
Driver usage
Once the module is loaded, each RTC is exposed as a character device file by the kernel to be used by userspace:
/dev/rtcX X - index (zero-based)
Read date/time as follow:
cat /sys/class/rtc/rtc0/date
cat /sys/class/rtc/rtc0/time
Alarms, if any, can be seen by running this command:
cat /proc/interrupts
An example of how to use RTC from a userspace application is given in PFSM driver chapter.
3.2.2.14.9. TPS6594 PFSM driver
Strictly speaking, PFSM is not hardware. It is a piece of code. PMIC integrates a state machine which manages operational modes. Depending on the current operational mode, some voltage domains remain energized while others can be off.
PFSM driver can be used to trigger transitions between configured states.
Driver source location:
drivers/misc/tps6594-pfsm.c
Kernel configuration options
Configs to be enabled in kernel:
CONFIG_TPS6594_PFSM (TPS6594 PFSM support)
Device Drivers --->
Misc devices --->
<*> TI TPS6594 Pre-configurable Finite State Machine support
Driver usage
Once the module is loaded, each PFSM is exposed as a character device file by the kernel to be used by userspace:
/dev/pfsm-X-Y X - chip ID
[0] = TPS6594
[1] = TPS6593
[2] = LP8764
Y - I2C address or SPI chip select
Example: '/dev/pfsm-1-0x4c' is TPS6593 @ I2C address 0x4c
Dump the registers of pages 0 and 1 as follow:
hexdump -C /dev/pfsm-1-0x4c
PFSM events, if any, can be seen by running this command:
cat /proc/interrupts
For more information, see kernel documentation:
Documentation/misc-devices/tps6594-pfsm.rst
A userspace code example is also provided:
samples/pfsm