[U-Boot] [PATCH] rk8xx: implement poweroff

Urja Rannikko urjaman at gmail.com
Wed Apr 3 12:21:50 UTC 2019


Based on snooping around the linux kernel rk8xx driver, and
tested to work on the ASUS C201.

Signed-off-by: Urja Rannikko <urjaman at gmail.com>
---
This is really handy to be able to poweroff (without pressing power button
for a long time) the C201 from u-boot, so i'm sending this as is.
The thing that is bothering me is the pmic_get --- i checked that
every rk8xx is named "pmic" in the device tree so it should work, but
it just feels really weird that this seems to be the best way to access
the driver...

 drivers/power/pmic/rk8xx.c | 34 ++++++++++++++++++++++++++++++++++
 include/power/rk8xx_pmic.h |  4 ++++
 2 files changed, 38 insertions(+)

diff --git a/drivers/power/pmic/rk8xx.c b/drivers/power/pmic/rk8xx.c
index 25c339ab12..c42e180e21 100644
--- a/drivers/power/pmic/rk8xx.c
+++ b/drivers/power/pmic/rk8xx.c
@@ -87,6 +87,40 @@ static int rk8xx_probe(struct udevice *dev)
 	return 0;
 }
 
+#if CONFIG_IS_ENABLED(CMD_POWEROFF)
+/* 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.
+ */
+
+int do_poweroff(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+	struct udevice *dev;
+	struct rk8xx_priv *priv;
+	u8 bits;
+
+	/* "Hey, what would one name a pmic in the device tree..." */
+	if (pmic_get("pmic", &dev) != 0) {
+		printf("pmic not found\n");
+		return 1;
+	}
+	priv = dev_get_priv(dev);
+
+	if (priv->variant == RK818_ID)
+		bits = DEV_OFF;
+	else
+		bits = DEV_OFF_RST;
+
+	if (pmic_clrsetbits(dev, REG_DEVCTRL, 0, bits) != 0) {
+		printf("pmic_clrsetbits failed\n");
+		return 1;
+	}
+
+	printf("Poweroff apparently failed.\n");
+	return 0;
+}
+#endif
+
 static struct dm_pmic_ops rk8xx_ops = {
 	.reg_count = rk8xx_reg_count,
 	.read = rk8xx_read,
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



More information about the U-Boot mailing list