提交 9cdfade8 编写于 作者: B Bin Meng 提交者: Andes

sysreset: syscon: Support value property

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: NBin Meng <bin.meng@windriver.com>
Reviewed-by: NSimon Glass <sjg@chromium.org>
Reviewed-by: NPragnesh Patel <pragnesh.patel@sifive.com>
上级 1ce8182b
......@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册