From patchwork Tue Jun 23 05:29:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bin Meng X-Patchwork-Id: 242781 List-Id: U-Boot discussion From: bmeng.cn at gmail.com (Bin Meng) Date: Mon, 22 Jun 2020 22:29:42 -0700 Subject: [PATCH 1/5] sysreset: syscon: Don't assume default value for offset and mask property Message-ID: <1592890186-18082-1-git-send-email-bmeng.cn@gmail.com> From: Bin Meng Per the DT binding, is a required property. Let's abort the probe if it is missing. For the property, current codes assume a default value of zero, which is not correct either. Signed-off-by: Bin Meng Reviewed-by: Simon Glass Reviewed-by: Pragnesh Patel --- drivers/sysreset/sysreset_syscon.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/drivers/sysreset/sysreset_syscon.c b/drivers/sysreset/sysreset_syscon.c index f64701a..caf2482 100644 --- a/drivers/sysreset/sysreset_syscon.c +++ b/drivers/sysreset/sysreset_syscon.c @@ -41,6 +41,7 @@ static struct sysreset_ops syscon_reboot_ops = { int syscon_reboot_probe(struct udevice *dev) { struct syscon_reboot_priv *priv = dev_get_priv(dev); + int err; priv->regmap = syscon_regmap_lookup_by_phandle(dev, "regmap"); if (IS_ERR(priv->regmap)) { @@ -48,8 +49,17 @@ int syscon_reboot_probe(struct udevice *dev) return -ENODEV; } - priv->offset = dev_read_u32_default(dev, "offset", 0); - priv->mask = dev_read_u32_default(dev, "mask", 0); + err = dev_read_u32(dev, "offset", &priv->offset); + if (err) { + pr_err("unable to find offset\n"); + return -ENOENT; + } + + err = dev_read_u32(dev, "mask", &priv->mask); + if (err) { + pr_err("unable to find mask\n"); + return -ENOENT; + } return 0; } From patchwork Tue Jun 23 05:29:43 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bin Meng X-Patchwork-Id: 242782 List-Id: U-Boot discussion From: bmeng.cn at gmail.com (Bin Meng) Date: Mon, 22 Jun 2020 22:29:43 -0700 Subject: [PATCH 2/5] sysreset: syscon: Support value property In-Reply-To: <1592890186-18082-1-git-send-email-bmeng.cn@gmail.com> References: <1592890186-18082-1-git-send-email-bmeng.cn@gmail.com> Message-ID: <1592890186-18082-2-git-send-email-bmeng.cn@gmail.com> From: Bin Meng Per the DT binding, and property can have either one or both, and if is missing, should be used, which is what current U-Boot sysreset_syscon driver supports. This adds support to the property to the driver, and semantics is updated to really be a mask to the value if both exist. Signed-off-by: Bin Meng Reviewed-by: Simon Glass Reviewed-by: Pragnesh Patel --- drivers/sysreset/sysreset_syscon.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) 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; From patchwork Tue Jun 23 05:29:44 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bin Meng X-Patchwork-Id: 242783 List-Id: U-Boot discussion From: bmeng.cn at gmail.com (Bin Meng) Date: Mon, 22 Jun 2020 22:29:44 -0700 Subject: [PATCH 3/5] riscv: Do not build reset.c if SYSRESET is on In-Reply-To: <1592890186-18082-1-git-send-email-bmeng.cn@gmail.com> References: <1592890186-18082-1-git-send-email-bmeng.cn@gmail.com> Message-ID: <1592890186-18082-3-git-send-email-bmeng.cn@gmail.com> From: Bin Meng SYSRESET uclass driver already provides all the reset APIs, hence exclude our own ad-hoc reset.c implementation. Signed-off-by: Bin Meng Reviewed-by: Sagar Kadam Reviewed-by: Pragnesh Patel --- arch/riscv/lib/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/riscv/lib/Makefile b/arch/riscv/lib/Makefile index b5e9324..6c503ff 100644 --- a/arch/riscv/lib/Makefile +++ b/arch/riscv/lib/Makefile @@ -20,7 +20,9 @@ obj-$(CONFIG_SBI) += sbi.o obj-$(CONFIG_SBI_IPI) += sbi_ipi.o endif obj-y += interrupts.o +ifeq ($(CONFIG_$(SPL_)SYSRESET),) obj-y += reset.o +endif obj-y += setjmp.o obj-$(CONFIG_$(SPL_)SMP) += smp.o obj-$(CONFIG_SPL_BUILD) += spl.o From patchwork Tue Jun 23 05:29:45 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bin Meng X-Patchwork-Id: 242784 List-Id: U-Boot discussion From: bmeng.cn at gmail.com (Bin Meng) Date: Mon, 22 Jun 2020 22:29:45 -0700 Subject: [PATCH 4/5] riscv: qemu: Add syscon reboot and poweroff support In-Reply-To: <1592890186-18082-1-git-send-email-bmeng.cn@gmail.com> References: <1592890186-18082-1-git-send-email-bmeng.cn@gmail.com> Message-ID: <1592890186-18082-4-git-send-email-bmeng.cn@gmail.com> From: Bin Meng This adds syscon reboot and poweroff support to QEMU RISC-V. Signed-off-by: Bin Meng Reviewed-by: Pragnesh Patel --- board/emulation/qemu-riscv/Kconfig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/board/emulation/qemu-riscv/Kconfig b/board/emulation/qemu-riscv/Kconfig index ad99b08..617c4aa 100644 --- a/board/emulation/qemu-riscv/Kconfig +++ b/board/emulation/qemu-riscv/Kconfig @@ -53,5 +53,9 @@ config BOARD_SPECIFIC_OPTIONS # dummy imply NVME imply SPL_RAM_SUPPORT imply SPL_RAM_DEVICE + imply SYSRESET + imply SYSRESET_SYSCON + imply CMD_POWEROFF + imply SYSRESET_CMD_POWEROFF endif From patchwork Tue Jun 23 05:29:46 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bin Meng X-Patchwork-Id: 242785 List-Id: U-Boot discussion From: bmeng.cn at gmail.com (Bin Meng) Date: Mon, 22 Jun 2020 22:29:46 -0700 Subject: [PATCH 5/5] riscv: sifive: fu540: Add gpio-restart support In-Reply-To: <1592890186-18082-1-git-send-email-bmeng.cn@gmail.com> References: <1592890186-18082-1-git-send-email-bmeng.cn@gmail.com> Message-ID: <1592890186-18082-5-git-send-email-bmeng.cn@gmail.com> From: Bin Meng The HiFive Unleashed board wires GPIO pin#10 to the input of the system reset signal. This adds gpio reboot support. Signed-off-by: Bin Meng Reviewed-by: Sagar Kadam Tested-by: Sagar Kadam Reviewed-by: Pragnesh Patel --- board/sifive/fu540/Kconfig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/board/sifive/fu540/Kconfig b/board/sifive/fu540/Kconfig index 86193d7..6f65681 100644 --- a/board/sifive/fu540/Kconfig +++ b/board/sifive/fu540/Kconfig @@ -65,5 +65,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy imply SMP imply MISC imply SIFIVE_OTP + imply SYSRESET + imply SYSRESET_GPIO endif