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 |
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>
>-----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 --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;