From: Urja Rannikko <urjaman@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v2 3/3] rk8xx: add a sysreset driver for poweroff
Date: Thu, 16 May 2019 21:48:43 +0000 [thread overview]
Message-ID: <20190516214843.1557-3-urjaman@gmail.com> (raw)
In-Reply-To: <20190516214843.1557-1-urjaman@gmail.com>
Based on snooping around the linux kernel rk8xx driver.
Tested on an ASUS C201.
Signed-off-by: Urja Rannikko <urjaman@gmail.com>
---
drivers/power/pmic/Kconfig | 1 +
drivers/power/pmic/rk8xx.c | 62 +++++++++++++++++++++++++++++++++++---
include/power/rk8xx_pmic.h | 4 +++
3 files changed, 63 insertions(+), 4 deletions(-)
diff --git a/drivers/power/pmic/Kconfig b/drivers/power/pmic/Kconfig
index 52edb29b48..3f6e30d503 100644
--- a/drivers/power/pmic/Kconfig
+++ b/drivers/power/pmic/Kconfig
@@ -124,6 +124,7 @@ config PMIC_PM8916
config PMIC_RK8XX
bool "Enable support for Rockchip PMIC RK8XX"
depends on DM_PMIC
+ select SYSRESET_CMD_POWEROFF if CMD_POWEROFF
---help---
The Rockchip RK808 PMIC provides four buck DC-DC convertors, 8 LDOs,
an RTC and two low Rds (resistance (drain to source)) switches. It is
diff --git a/drivers/power/pmic/rk8xx.c b/drivers/power/pmic/rk8xx.c
index 25c339ab12..52e41051ae 100644
--- a/drivers/power/pmic/rk8xx.c
+++ b/drivers/power/pmic/rk8xx.c
@@ -6,6 +6,9 @@
#include <common.h>
#include <dm.h>
+#include <sysreset.h>
+#include <dm/device.h>
+#include <dm/lists.h>
#include <errno.h>
#include <power/rk8xx_pmic.h>
#include <power/pmic.h>
@@ -49,9 +52,9 @@ static int rk8xx_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
return 0;
}
-#if CONFIG_IS_ENABLED(PMIC_CHILDREN)
static int rk8xx_bind(struct udevice *dev)
{
+#if CONFIG_IS_ENABLED(PMIC_CHILDREN)
ofnode regulators_node;
int children;
@@ -68,10 +71,15 @@ static int rk8xx_bind(struct udevice *dev)
if (!children)
debug("%s: %s - no child found\n", __func__, dev->name);
+#endif
+
+ if (CONFIG_IS_ENABLED(SYSRESET))
+ return device_bind_driver(dev, "rk8xx-sysreset",
+ "rk8xx-sysreset", NULL);
+
/* Always return success for this device */
return 0;
}
-#endif
static int rk8xx_probe(struct udevice *dev)
{
@@ -103,10 +111,56 @@ U_BOOT_DRIVER(pmic_rk8xx) = {
.name = "rk8xx pmic",
.id = UCLASS_PMIC,
.of_match = rk8xx_ids,
-#if CONFIG_IS_ENABLED(PMIC_CHILDREN)
.bind = rk8xx_bind,
-#endif
.priv_auto_alloc_size = sizeof(struct rk8xx_priv),
.probe = rk8xx_probe,
.ops = &rk8xx_ops,
};
+
+#if IS_ENABLED(CONFIG_SYSRESET)
+/* NOTE: Should only enable this function if the rockchip,system-power-manager
+ * property is in the device tree node, but it is there in every board that has
+ * an rk8xx in u-boot currently, so this is left as an excercise for later.
+ */
+static int rk8xx_sysreset_request(struct udevice *dev, enum sysreset_t type)
+{
+ struct udevice *pmic_dev;
+ struct rk8xx_priv *priv;
+ int ret;
+ u8 bits;
+
+ if (type != SYSRESET_POWER_OFF)
+ return -EPROTONOSUPPORT;
+
+ ret = uclass_get_device_by_driver(UCLASS_PMIC,
+ DM_GET_DRIVER(pmic_rk8xx),
+ &pmic_dev);
+
+ if (ret)
+ return -EOPNOTSUPP;
+
+ priv = dev_get_priv(pmic_dev);
+
+ if (priv->variant == RK818_ID)
+ bits = DEV_OFF;
+ else
+ bits = DEV_OFF_RST;
+
+ ret = pmic_clrsetbits(pmic_dev, REG_DEVCTRL, 0, bits);
+
+ if (ret < 0)
+ return ret;
+
+ return -EINPROGRESS;
+}
+
+static struct sysreset_ops rk8xx_sysreset_ops = {
+ .request = rk8xx_sysreset_request,
+};
+
+U_BOOT_DRIVER(rk8xx_sysreset) = {
+ .name = "rk8xx-sysreset",
+ .id = UCLASS_SYSRESET,
+ .ops = &rk8xx_sysreset_ops,
+};
+#endif
diff --git a/include/power/rk8xx_pmic.h b/include/power/rk8xx_pmic.h
index c06248f751..565b35985e 100644
--- a/include/power/rk8xx_pmic.h
+++ b/include/power/rk8xx_pmic.h
@@ -177,6 +177,10 @@ enum {
#define RK8XX_ID_MSK 0xfff0
+/* DEVCTRL bits for poweroff */
+#define DEV_OFF_RST BIT(3)
+#define DEV_OFF BIT(0)
+
struct rk8xx_reg_table {
char *name;
u8 reg_ctl;
--
2.21.0
next prev parent reply other threads:[~2019-05-16 21:48 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-16 21:48 [U-Boot] [PATCH v2 1/3] sysreset: switch to using SYSRESET_POWER_OFF for poweroff Urja Rannikko
2019-05-16 21:48 ` [U-Boot] [PATCH v2 2/3] sysreset: move stm32mp sysreset poweroff implementation to sysreset uclass Urja Rannikko
2019-05-17 6:51 ` Patrice CHOTARD
2019-05-20 13:27 ` Patrick DELAUNAY
2019-05-16 21:48 ` Urja Rannikko [this message]
2019-08-14 2:46 ` [U-Boot] [PATCH v2 3/3] rk8xx: add a sysreset driver for poweroff Kever Yang
2019-08-14 19:35 ` Simon Glass
2019-08-15 10:38 ` [U-Boot] [PATCH v2 3/3] rk8xx: add a sysreset driver for poweroff【请注意,邮件由sjg@google.com代发】 Kever Yang
2019-05-18 16:08 ` [U-Boot] [PATCH v2 1/3] sysreset: switch to using SYSRESET_POWER_OFF for poweroff Simon Glass
2019-05-20 13:16 ` Patrick DELAUNAY
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190516214843.1557-3-urjaman@gmail.com \
--to=urjaman@gmail.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.