diff options
author | Patrick Delaunay <patrick.delaunay@st.com> | 2019-02-04 11:26:19 +0100 |
---|---|---|
committer | Patrick Delaunay <patrick.delaunay@st.com> | 2019-04-12 16:09:13 +0200 |
commit | 8811583e0413c8c00116e87113c359bdc4b582b4 (patch) | |
tree | af05b58d5a6f3fb122efb85affe8ca9e3d35d30e /drivers/power/pmic | |
parent | db4ff0df656f8ca8d363df64cddc7b5f835a7ecc (diff) | |
download | u-boot-8811583e0413c8c00116e87113c359bdc4b582b4.tar.gz |
pmic: stpmu1: add power switch off support
Add sysreset support, and support power switch off request,
needed by poweroff command.
Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
Diffstat (limited to 'drivers/power/pmic')
-rw-r--r-- | drivers/power/pmic/stpmic1.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/drivers/power/pmic/stpmic1.c b/drivers/power/pmic/stpmic1.c index 25450ebd42..c962160307 100644 --- a/drivers/power/pmic/stpmic1.c +++ b/drivers/power/pmic/stpmic1.c @@ -7,6 +7,9 @@ #include <dm.h> #include <errno.h> #include <i2c.h> +#include <sysreset.h> +#include <dm/device.h> +#include <dm/lists.h> #include <power/pmic.h> #include <power/stpmic1.h> @@ -72,6 +75,10 @@ static int stpmic1_bind(struct udevice *dev) dev_dbg(dev, "no child found\n"); #endif /* DM_REGULATOR */ + if (CONFIG_IS_ENABLED(SYSRESET)) + return device_bind_driver(dev, "stpmic1-sysreset", + "stpmic1-sysreset", NULL); + return 0; } @@ -93,3 +100,42 @@ U_BOOT_DRIVER(pmic_stpmic1) = { .bind = stpmic1_bind, .ops = &stpmic1_ops, }; + +#ifdef CONFIG_SYSRESET +static int stpmic1_sysreset_request(struct udevice *dev, enum sysreset_t type) +{ + struct udevice *pmic_dev; + int ret; + + if (type != SYSRESET_POWER) + return -EPROTONOSUPPORT; + + ret = uclass_get_device_by_driver(UCLASS_PMIC, + DM_GET_DRIVER(pmic_stpmic1), + &pmic_dev); + + if (ret) + return -EOPNOTSUPP; + + ret = pmic_reg_read(pmic_dev, STPMIC1_MAIN_CR); + if (ret < 0) + return ret; + + ret = pmic_reg_write(pmic_dev, STPMIC1_MAIN_CR, + ret | STPMIC1_SWOFF | STPMIC1_RREQ_EN); + if (ret < 0) + return ret; + + return -EINPROGRESS; +} + +static struct sysreset_ops stpmic1_sysreset_ops = { + .request = stpmic1_sysreset_request, +}; + +U_BOOT_DRIVER(stpmic1_sysreset) = { + .name = "stpmic1-sysreset", + .id = UCLASS_SYSRESET, + .ops = &stpmic1_sysreset_ops, +}; +#endif |