sysreset: implement TPS80031 sysreset functions

TPS80031/TPS80032 PMICs have embedded power control functions
used by some device to initiane device power off. Implement it as
sysreset driver.

Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
This commit is contained in:
Svyatoslav Ryhel 2023-10-24 10:49:06 +03:00 committed by Tom Rini
parent fa1e72ea3d
commit 9d937cdc2c
5 changed files with 64 additions and 1 deletions

View file

@ -44,7 +44,16 @@ static int tps80031_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
static int tps80031_bind(struct udevice *dev) static int tps80031_bind(struct udevice *dev)
{ {
ofnode regulators_node; ofnode regulators_node;
int children; int children, ret;
if (IS_ENABLED(CONFIG_SYSRESET_TPS80031)) {
ret = device_bind_driver(dev, TPS80031_RST_DRIVER,
"sysreset", NULL);
if (ret) {
log_err("cannot bind SYSRESET (ret = %d)\n", ret);
return ret;
}
}
regulators_node = dev_read_subnode(dev, "regulators"); regulators_node = dev_read_subnode(dev, "regulators");
if (!ofnode_valid(regulators_node)) { if (!ofnode_valid(regulators_node)) {

View file

@ -157,6 +157,14 @@ config SYSRESET_TI_SCI
This enables the system reset driver support over TI System Control This enables the system reset driver support over TI System Control
Interface available on some new TI's SoCs. Interface available on some new TI's SoCs.
config SYSRESET_TPS80031
bool "Enable support for TPS80031/TPS80032 PMIC System Reset"
depends on DM_PMIC_TPS80031
select SYSRESET_CMD_POWEROFF if CMD_POWEROFF
help
Enable system power management functions found in TPS80031/TPS80032
PMICs.
config SYSRESET_SYSCON config SYSRESET_SYSCON
bool "Enable support for mfd syscon reboot driver" bool "Enable support for mfd syscon reboot driver"
select REGMAP select REGMAP

View file

@ -19,6 +19,7 @@ obj-$(CONFIG_SYSRESET_SOCFPGA) += sysreset_socfpga.o
obj-$(CONFIG_SYSRESET_SOCFPGA_SOC64) += sysreset_socfpga_soc64.o obj-$(CONFIG_SYSRESET_SOCFPGA_SOC64) += sysreset_socfpga_soc64.o
obj-$(CONFIG_SYSRESET_TEGRA) += sysreset_tegra.o obj-$(CONFIG_SYSRESET_TEGRA) += sysreset_tegra.o
obj-$(CONFIG_SYSRESET_TI_SCI) += sysreset-ti-sci.o obj-$(CONFIG_SYSRESET_TI_SCI) += sysreset-ti-sci.o
obj-$(CONFIG_$(SPL_TPL_)SYSRESET_TPS80031) += sysreset_tps80031.o
obj-$(CONFIG_SYSRESET_SYSCON) += sysreset_syscon.o obj-$(CONFIG_SYSRESET_SYSCON) += sysreset_syscon.o
obj-$(CONFIG_SYSRESET_WATCHDOG) += sysreset_watchdog.o obj-$(CONFIG_SYSRESET_WATCHDOG) += sysreset_watchdog.o
obj-$(CONFIG_SYSRESET_RESETCTL) += sysreset_resetctl.o obj-$(CONFIG_SYSRESET_RESETCTL) += sysreset_resetctl.o

View file

@ -0,0 +1,40 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright(C) 2023 Svyatoslav Ryhel <clamor95@gmail.com>
*/
#include <dm.h>
#include <i2c.h>
#include <errno.h>
#include <sysreset.h>
#include <power/pmic.h>
#include <power/tps80031.h>
static int tps80031_sysreset_request(struct udevice *dev,
enum sysreset_t type)
{
switch (type) {
case SYSRESET_POWER:
/* TPS80031: SW_RESET > PHOENIX_DEV_ON */
pmic_reg_write(dev->parent, TPS80031_PHOENIX_DEV_ON, SW_RESET);
break;
case SYSRESET_POWER_OFF:
/* TPS80031: DEVOFF > PHOENIX_DEV_ON */
pmic_reg_write(dev->parent, TPS80031_PHOENIX_DEV_ON, DEVOFF);
break;
default:
return -EPROTONOSUPPORT;
}
return -EINPROGRESS;
}
static struct sysreset_ops tps80031_sysreset = {
.request = tps80031_sysreset_request,
};
U_BOOT_DRIVER(sysreset_tps80031) = {
.id = UCLASS_SYSRESET,
.name = TPS80031_RST_DRIVER,
.ops = &tps80031_sysreset,
};

View file

@ -12,6 +12,7 @@
/* Drivers name */ /* Drivers name */
#define TPS80031_LDO_DRIVER "tps80031_ldo" #define TPS80031_LDO_DRIVER "tps80031_ldo"
#define TPS80031_SMPS_DRIVER "tps80031_smps" #define TPS80031_SMPS_DRIVER "tps80031_smps"
#define TPS80031_RST_DRIVER "tps80031_rst"
#define TPS80031_SMPS_OFFSET 0xe0 #define TPS80031_SMPS_OFFSET 0xe0
#define TPS80031_OFFSET_FLAG BIT(0) #define TPS80031_OFFSET_FLAG BIT(0)
@ -35,6 +36,10 @@
#define LDO_VOLT_MIN 1018000 #define LDO_VOLT_MIN 1018000
#define LDO_VOLT_BASE 916000 #define LDO_VOLT_BASE 916000
#define TPS80031_PHOENIX_DEV_ON 0x25
#define SW_RESET BIT(6)
#define DEVOFF BIT(0)
/* register groups */ /* register groups */
enum { enum {
CTRL, CTRL,