
Hi Simon,
El 16/04/2017 a las 21:34, Simon Glass escribió:
Hi Alvaro,
On 15 April 2017 at 16:03, Álvaro Fernández Rojas noltari@gmail.com wrote:
Add a new sysreset driver based on linux/drivers/power/reset/syscon-reboot.c, which provides a generic driver for platforms that only require writing a mask to a regmap offset.
Signed-off-by: Álvaro Fernández Rojas noltari@gmail.com
v2: no changes
drivers/sysreset/Kconfig | 8 +++++ drivers/sysreset/Makefile | 1 + drivers/sysreset/sysreset_syscon.c | 60 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 drivers/sysreset/sysreset_syscon.c
diff --git a/drivers/sysreset/Kconfig b/drivers/sysreset/Kconfig index 05a37b9..0946c9d 100644 --- a/drivers/sysreset/Kconfig +++ b/drivers/sysreset/Kconfig @@ -13,4 +13,12 @@ config SYSRESET to effect a reset. The uclass will try all available drivers when reset_walk() is called.
+config SYSRESET_SYSCON
bool "Enable support for mfd syscon reboot driver"
depends on SYSRESET
select REGMAP
select SYSCON
help
Description here.
Yes please!
Sure, my fault :P
endmenu diff --git a/drivers/sysreset/Makefile b/drivers/sysreset/Makefile index 49b8bb6..1205f47 100644 --- a/drivers/sysreset/Makefile +++ b/drivers/sysreset/Makefile @@ -18,3 +18,4 @@ obj-$(CONFIG_ARCH_SNAPDRAGON) += sysreset_snapdragon.o obj-$(CONFIG_ARCH_STI) += sysreset_sti.o obj-$(CONFIG_TARGET_XTFPGA) += sysreset_xtfpga.o obj-$(CONFIG_ARCH_ASPEED) += sysreset_ast.o +obj-$(CONFIG_SYSRESET_SYSCON) += sysreset_syscon.o diff --git a/drivers/sysreset/sysreset_syscon.c b/drivers/sysreset/sysreset_syscon.c new file mode 100644 index 0000000..61aeb1d --- /dev/null +++ b/drivers/sysreset/sysreset_syscon.c @@ -0,0 +1,60 @@ +/*
- Copyright (C) 2017 Álvaro Fernández Rojas noltari@gmail.com
- Derived from linux/drivers/power/reset/syscon-reboot.c:
Copyright (C) 2013, Applied Micro Circuits Corporation
Author: Feng Kan <fkan@apm.com>
- SPDX-License-Identifier: GPL-2.0+
- */
+#include <common.h> +#include <dm.h> +#include <errno.h> +#include <sysreset.h>
this should go at the end
I will fix it.
+#include <regmap.h> +#include <syscon.h>
+DECLARE_GLOBAL_DATA_PTR;
+static int syscon_reboot_request(struct udevice *dev, enum sysreset_t type) +{
struct udevice *syscon;
struct regmap *regmap;
unsigned int offset, mask;
int err;
err = uclass_get_device_by_phandle(UCLASS_SYSCON, dev,
"regmap", &syscon);
if (err) {
error("unable to find syscon device\n");
return err;
}
regmap = syscon_get_regmap(syscon);
if (!regmap) {
error("unable to find regmap\n");
return -ENODEV;
}
offset = fdtdec_get_uint(gd->fdt_blob, dev_of_offset(dev), "offset", 0);
mask = fdtdec_get_uint(gd->fdt_blob, dev_of_offset(dev), "mask", 0);
You should do this in ofdata_to_platdata() or probe() and store it in a local struct
I tried doing it in probe: https://github.com/Noltari/u-boot/commit/37f45960f240c3e57fa70afe69d9b5782c9...
However it looks like probe is never called with my current U_BOOT_DRIVER settings... Then I tried doing it in bind instead of probe and it looks like the syscon device isn't ready when syscon-reboot is binded... Any ideas? :$
return regmap_write(regmap, offset, mask);
Check error here, and either return -EINPROGRESS or some other error
I will, but regmap_write returns always 0, so there's no error at all to check...
+}
+static struct sysreset_ops syscon_reboot_ops = {
.request = syscon_reboot_request,
+};
+static const struct udevice_id syscon_reboot_ids[] = {
{ .compatible = "syscon-reboot" },
{ /* sentinel */ }
+};
+U_BOOT_DRIVER(syscon_reboot) = {
.name = "syscon_reboot",
.id = UCLASS_SYSRESET,
.of_match = syscon_reboot_ids,
.ops = &syscon_reboot_ops,
+};
2.1.4
Regards, Simon