diff mbox series

[1/2] power: pmic: rk8xx: Support sysreset shutdown method

Message ID 20220523193001.13715-2-macroalpha82@gmail.com
State Superseded
Delegated to: Kever Yang
Headers show
Series Rockchip: Add option to prevent boot on plug-in | expand

Commit Message

Chris Morgan May 23, 2022, 7:30 p.m. UTC
From: Chris Morgan <macromorgan@hotmail.com>

Add support for sysreset shutdown for this PMIC. The values were pulled
from the various datasheets, but for now it has only been tested on
the rk817 (for an Odroid Go Advance).

Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
---
 drivers/power/pmic/rk8xx.c | 50 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 49 insertions(+), 1 deletion(-)

Comments

Jaehoon Chung May 26, 2022, 4:49 a.m. UTC | #1
On 5/24/22 04:30, Chris Morgan wrote:
> From: Chris Morgan <macromorgan@hotmail.com>
> 
> Add support for sysreset shutdown for this PMIC. The values were pulled
> from the various datasheets, but for now it has only been tested on
> the rk817 (for an Odroid Go Advance).
> 
> Signed-off-by: Chris Morgan <macromorgan@hotmail.com>

Reviewed-by: Jaehoon Chung <jh80.chung@samsung.com>

Best Regards,
Jaehoon Chung

> ---
>  drivers/power/pmic/rk8xx.c | 50 +++++++++++++++++++++++++++++++++++++-
>  1 file changed, 49 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/power/pmic/rk8xx.c b/drivers/power/pmic/rk8xx.c
> index 5f442fea68..1ffbecc02a 100644
> --- a/drivers/power/pmic/rk8xx.c
> +++ b/drivers/power/pmic/rk8xx.c
> @@ -6,10 +6,50 @@
>  
>  #include <common.h>
>  #include <dm.h>
> +#include <dm/lists.h>
>  #include <errno.h>
>  #include <log.h>
>  #include <power/rk8xx_pmic.h>
>  #include <power/pmic.h>
> +#include <sysreset.h>
> +
> +static int rk8xx_sysreset_request(struct udevice *dev, enum sysreset_t type)
> +{
> +	struct rk8xx_priv *priv = dev_get_priv(dev->parent);
> +
> +	if (type != SYSRESET_POWER_OFF)
> +		return -EPROTONOSUPPORT;
> +
> +	switch (priv->variant) {
> +	case RK805_ID:
> +	case RK808_ID:
> +	case RK816_ID:
> +	case RK818_ID:
> +		pmic_clrsetbits(dev->parent, REG_DEVCTRL, 0, BIT(0));
> +		break;
> +	case RK809_ID:
> +	case RK817_ID:
> +		pmic_clrsetbits(dev->parent, RK817_REG_SYS_CFG3, 0,
> +				BIT(0));
> +		break;
> +	default:
> +		printf("Unknown PMIC RK%x: Cannot shutdown\n",
> +		       priv->variant);
> +		return -EPROTONOSUPPORT;
> +	};
> +
> +	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,
> +};
>  
>  static struct reg_data rk817_init_reg[] = {
>  /* enable the under-voltage protection,
> @@ -61,7 +101,7 @@ static int rk8xx_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
>  static int rk8xx_bind(struct udevice *dev)
>  {
>  	ofnode regulators_node;
> -	int children;
> +	int children, ret;
>  
>  	regulators_node = dev_read_subnode(dev, "regulators");
>  	if (!ofnode_valid(regulators_node)) {
> @@ -72,6 +112,14 @@ static int rk8xx_bind(struct udevice *dev)
>  
>  	debug("%s: '%s' - found regulators subnode\n", __func__, dev->name);
>  
> +	if (CONFIG_IS_ENABLED(SYSRESET)) {
> +		ret = device_bind_driver_to_node(dev, "rk8xx_sysreset",
> +						 "rk8xx_sysreset",
> +						 dev_ofnode(dev), NULL);
> +		if (ret)
> +			return ret;
> +	}
> +
>  	children = pmic_bind_children(dev, regulators_node, pmic_children_info);
>  	if (!children)
>  		debug("%s: %s - no child found\n", __func__, dev->name);
Kever Yang May 26, 2022, 6:59 a.m. UTC | #2
Hi Chris,


On 2022/5/24 03:30, Chris Morgan wrote:
> From: Chris Morgan <macromorgan@hotmail.com>
>
> Add support for sysreset shutdown for this PMIC. The values were pulled
> from the various datasheets, but for now it has only been tested on
> the rk817 (for an Odroid Go Advance).
>
> Signed-off-by: Chris Morgan <macromorgan@hotmail.com>

Reviewed-by: Kever Yang <kever.yang@rock-chips.com>


Thanks,

- Kever

> ---
>   drivers/power/pmic/rk8xx.c | 50 +++++++++++++++++++++++++++++++++++++-
>   1 file changed, 49 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/power/pmic/rk8xx.c b/drivers/power/pmic/rk8xx.c
> index 5f442fea68..1ffbecc02a 100644
> --- a/drivers/power/pmic/rk8xx.c
> +++ b/drivers/power/pmic/rk8xx.c
> @@ -6,10 +6,50 @@
>   
>   #include <common.h>
>   #include <dm.h>
> +#include <dm/lists.h>
>   #include <errno.h>
>   #include <log.h>
>   #include <power/rk8xx_pmic.h>
>   #include <power/pmic.h>
> +#include <sysreset.h>
> +
> +static int rk8xx_sysreset_request(struct udevice *dev, enum sysreset_t type)
> +{
> +	struct rk8xx_priv *priv = dev_get_priv(dev->parent);
> +
> +	if (type != SYSRESET_POWER_OFF)
> +		return -EPROTONOSUPPORT;
> +
> +	switch (priv->variant) {
> +	case RK805_ID:
> +	case RK808_ID:
> +	case RK816_ID:
> +	case RK818_ID:
> +		pmic_clrsetbits(dev->parent, REG_DEVCTRL, 0, BIT(0));
> +		break;
> +	case RK809_ID:
> +	case RK817_ID:
> +		pmic_clrsetbits(dev->parent, RK817_REG_SYS_CFG3, 0,
> +				BIT(0));
> +		break;
> +	default:
> +		printf("Unknown PMIC RK%x: Cannot shutdown\n",
> +		       priv->variant);
> +		return -EPROTONOSUPPORT;
> +	};
> +
> +	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,
> +};
>   
>   static struct reg_data rk817_init_reg[] = {
>   /* enable the under-voltage protection,
> @@ -61,7 +101,7 @@ static int rk8xx_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
>   static int rk8xx_bind(struct udevice *dev)
>   {
>   	ofnode regulators_node;
> -	int children;
> +	int children, ret;
>   
>   	regulators_node = dev_read_subnode(dev, "regulators");
>   	if (!ofnode_valid(regulators_node)) {
> @@ -72,6 +112,14 @@ static int rk8xx_bind(struct udevice *dev)
>   
>   	debug("%s: '%s' - found regulators subnode\n", __func__, dev->name);
>   
> +	if (CONFIG_IS_ENABLED(SYSRESET)) {
> +		ret = device_bind_driver_to_node(dev, "rk8xx_sysreset",
> +						 "rk8xx_sysreset",
> +						 dev_ofnode(dev), NULL);
> +		if (ret)
> +			return ret;
> +	}
> +
>   	children = pmic_bind_children(dev, regulators_node, pmic_children_info);
>   	if (!children)
>   		debug("%s: %s - no child found\n", __func__, dev->name);
diff mbox series

Patch

diff --git a/drivers/power/pmic/rk8xx.c b/drivers/power/pmic/rk8xx.c
index 5f442fea68..1ffbecc02a 100644
--- a/drivers/power/pmic/rk8xx.c
+++ b/drivers/power/pmic/rk8xx.c
@@ -6,10 +6,50 @@ 
 
 #include <common.h>
 #include <dm.h>
+#include <dm/lists.h>
 #include <errno.h>
 #include <log.h>
 #include <power/rk8xx_pmic.h>
 #include <power/pmic.h>
+#include <sysreset.h>
+
+static int rk8xx_sysreset_request(struct udevice *dev, enum sysreset_t type)
+{
+	struct rk8xx_priv *priv = dev_get_priv(dev->parent);
+
+	if (type != SYSRESET_POWER_OFF)
+		return -EPROTONOSUPPORT;
+
+	switch (priv->variant) {
+	case RK805_ID:
+	case RK808_ID:
+	case RK816_ID:
+	case RK818_ID:
+		pmic_clrsetbits(dev->parent, REG_DEVCTRL, 0, BIT(0));
+		break;
+	case RK809_ID:
+	case RK817_ID:
+		pmic_clrsetbits(dev->parent, RK817_REG_SYS_CFG3, 0,
+				BIT(0));
+		break;
+	default:
+		printf("Unknown PMIC RK%x: Cannot shutdown\n",
+		       priv->variant);
+		return -EPROTONOSUPPORT;
+	};
+
+	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,
+};
 
 static struct reg_data rk817_init_reg[] = {
 /* enable the under-voltage protection,
@@ -61,7 +101,7 @@  static int rk8xx_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
 static int rk8xx_bind(struct udevice *dev)
 {
 	ofnode regulators_node;
-	int children;
+	int children, ret;
 
 	regulators_node = dev_read_subnode(dev, "regulators");
 	if (!ofnode_valid(regulators_node)) {
@@ -72,6 +112,14 @@  static int rk8xx_bind(struct udevice *dev)
 
 	debug("%s: '%s' - found regulators subnode\n", __func__, dev->name);
 
+	if (CONFIG_IS_ENABLED(SYSRESET)) {
+		ret = device_bind_driver_to_node(dev, "rk8xx_sysreset",
+						 "rk8xx_sysreset",
+						 dev_ofnode(dev), NULL);
+		if (ret)
+			return ret;
+	}
+
 	children = pmic_bind_children(dev, regulators_node, pmic_children_info);
 	if (!children)
 		debug("%s: %s - no child found\n", __func__, dev->name);