X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=drivers%2Fsysreset%2Fsysreset_syscon.c;h=f64701aab3c834ad967a30f04b1ef3ca0a217e81;hb=c27178ba3649f539c9f1890ea147f4c5415f63b5;hp=3abce7f678679ac838476f77773eabefea9e9802;hpb=f855a7bc12dc3bdf83905b4c72a6d795ee8d8ee5;p=oweals%2Fu-boot.git diff --git a/drivers/sysreset/sysreset_syscon.c b/drivers/sysreset/sysreset_syscon.c index 3abce7f678..f64701aab3 100644 --- a/drivers/sysreset/sysreset_syscon.c +++ b/drivers/sysreset/sysreset_syscon.c @@ -1,11 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0+ /* * Copyright (C) 2017 Álvaro Fernández Rojas * * Derived from linux/drivers/power/reset/syscon-reboot.c: * Copyright (C) 2013, Applied Micro Circuits Corporation * Author: Feng Kan - * - * SPDX-License-Identifier: GPL-2.0+ */ #include @@ -14,8 +13,7 @@ #include #include #include - -DECLARE_GLOBAL_DATA_PTR; +#include struct syscon_reboot_priv { struct regmap *regmap; @@ -26,6 +24,10 @@ struct syscon_reboot_priv { static int syscon_reboot_request(struct udevice *dev, enum sysreset_t type) { struct syscon_reboot_priv *priv = dev_get_priv(dev); + ulong driver_data = dev_get_driver_data(dev); + + if (type != driver_data) + return -EPROTONOSUPPORT; regmap_write(priv->regmap, priv->offset, priv->mask); @@ -38,33 +40,23 @@ static struct sysreset_ops syscon_reboot_ops = { int syscon_reboot_probe(struct udevice *dev) { - struct udevice *syscon; struct syscon_reboot_priv *priv = dev_get_priv(dev); - int err; - - err = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, - "regmap", &syscon); - if (err) { - pr_err("unable to find syscon device\n"); - return err; - } - priv->regmap = syscon_get_regmap(syscon); - if (!priv->regmap) { + priv->regmap = syscon_regmap_lookup_by_phandle(dev, "regmap"); + if (IS_ERR(priv->regmap)) { pr_err("unable to find regmap\n"); return -ENODEV; } - priv->offset = fdtdec_get_uint(gd->fdt_blob, dev_of_offset(dev), - "offset", 0); - priv->mask = fdtdec_get_uint(gd->fdt_blob, dev_of_offset(dev), - "mask", 0); + priv->offset = dev_read_u32_default(dev, "offset", 0); + priv->mask = dev_read_u32_default(dev, "mask", 0); return 0; } static const struct udevice_id syscon_reboot_ids[] = { - { .compatible = "syscon-reboot" }, + { .compatible = "syscon-reboot", .data = SYSRESET_COLD }, + { .compatible = "syscon-poweroff", .data = SYSRESET_POWER_OFF }, { /* sentinel */ } };