diff mbox series

[2/5] sysreset: syscon: Support value property

Message ID 1592890186-18082-2-git-send-email-bmeng.cn@gmail.com
State New
Headers show
Series [1/5] sysreset: syscon: Don't assume default value for offset and mask property | expand

Commit Message

Bin Meng June 23, 2020, 5:29 a.m. UTC
From: Bin Meng <bin.meng at windriver.com>

Per the DT binding, <mask> and <value> property can have either one
or both, and if <value> is missing, <mask> should be used, which is
what current U-Boot sysreset_syscon driver supports.

This adds support to the <value> property to the driver, and <mask>
semantics is updated to really be a mask to the value if both exist.

Signed-off-by: Bin Meng <bin.meng at windriver.com>
---

 drivers/sysreset/sysreset_syscon.c | 22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

Comments

Simon Glass June 26, 2020, 1:43 a.m. UTC | #1
On Mon, 22 Jun 2020 at 23:30, Bin Meng <bmeng.cn at gmail.com> wrote:
>
> From: Bin Meng <bin.meng at windriver.com>
>
> Per the DT binding, <mask> and <value> property can have either one
> or both, and if <value> is missing, <mask> should be used, which is
> what current U-Boot sysreset_syscon driver supports.
>
> This adds support to the <value> property to the driver, and <mask>
> semantics is updated to really be a mask to the value if both exist.
>
> Signed-off-by: Bin Meng <bin.meng at windriver.com>
> ---
>
>  drivers/sysreset/sysreset_syscon.c | 22 +++++++++++++++++-----
>  1 file changed, 17 insertions(+), 5 deletions(-)

Reviewed-by: Simon Glass <sjg at chromium.org>
Pragnesh Patel June 26, 2020, 6:12 a.m. UTC | #2
>-----Original Message-----
>From: Bin Meng <bmeng.cn at gmail.com>
>Sent: 23 June 2020 11:00
>To: Rick Chen <rick at andestech.com>; Simon Glass <sjg at chromium.org>;
>Pragnesh Patel <pragnesh.patel at sifive.com>; Sagar Kadam
><sagar.kadam at sifive.com>; U-Boot Mailing List <u-boot at lists.denx.de>
>Cc: Bin Meng <bin.meng at windriver.com>
>Subject: [PATCH 2/5] sysreset: syscon: Support value property
>
>[External Email] Do not click links or attachments unless you recognize the
>sender and know the content is safe
>
>From: Bin Meng <bin.meng at windriver.com>
>
>Per the DT binding, <mask> and <value> property can have either one or
>both, and if <value> is missing, <mask> should be used, which is what current
>U-Boot sysreset_syscon driver supports.
>
>This adds support to the <value> property to the driver, and <mask>
>semantics is updated to really be a mask to the value if both exist.
>
>Signed-off-by: Bin Meng <bin.meng at windriver.com>
>---
>
> drivers/sysreset/sysreset_syscon.c | 22 +++++++++++++++++-----
> 1 file changed, 17 insertions(+), 5 deletions(-)

Reviewed-by: Pragnesh Patel <pragnesh.patel at sifive.com>
diff mbox series

Patch

diff --git a/drivers/sysreset/sysreset_syscon.c b/drivers/sysreset/sysreset_syscon.c
index caf2482..1c47486 100644
--- a/drivers/sysreset/sysreset_syscon.c
+++ b/drivers/sysreset/sysreset_syscon.c
@@ -19,6 +19,7 @@  struct syscon_reboot_priv {
 	struct regmap *regmap;
 	unsigned int offset;
 	unsigned int mask;
+	unsigned int value;
 };
 
 static int syscon_reboot_request(struct udevice *dev, enum sysreset_t type)
@@ -29,7 +30,7 @@  static int syscon_reboot_request(struct udevice *dev, enum sysreset_t type)
 	if (type != driver_data)
 		return -EPROTONOSUPPORT;
 
-	regmap_write(priv->regmap, priv->offset, priv->mask);
+	regmap_update_bits(priv->regmap, priv->offset, priv->mask, priv->value);
 
 	return -EINPROGRESS;
 }
@@ -42,6 +43,7 @@  int syscon_reboot_probe(struct udevice *dev)
 {
 	struct syscon_reboot_priv *priv = dev_get_priv(dev);
 	int err;
+	int mask_err, value_err;
 
 	priv->regmap = syscon_regmap_lookup_by_phandle(dev, "regmap");
 	if (IS_ERR(priv->regmap)) {
@@ -55,10 +57,20 @@  int syscon_reboot_probe(struct udevice *dev)
 		return -ENOENT;
 	}
 
-	err = dev_read_u32(dev, "mask", &priv->mask);
-	if (err) {
-		pr_err("unable to find mask\n");
-		return -ENOENT;
+	mask_err = dev_read_u32(dev, "mask", &priv->mask);
+	value_err = dev_read_u32(dev, "value", &priv->value);
+	if (mask_err && value_err) {
+		pr_err("unable to find mask and value\n");
+		return -EINVAL;
+	}
+
+	if (value_err) {
+		/* support old binding */
+		priv->value = priv->mask;
+		priv->mask = 0xffffffff;
+	} else if (mask_err) {
+		/* support value without mask*/
+		priv->mask = 0xffffffff;
 	}
 
 	return 0;