summaryrefslogtreecommitdiff
path: root/lib/utils/reset/fdt_reset_gpio.c
diff options
context:
space:
mode:
authorHeinrich Schuchardt <heinrich.schuchardt@canonical.com>2021-09-28 14:42:46 +0300
committerAnup Patel <anup@brainfault.org>2021-10-01 07:54:43 +0300
commit754d51192b6bf6a4afd9d46c5f736a9f6dd1b404 (patch)
tree4fa636116858ce08252f70b388eb12d2f06bd886 /lib/utils/reset/fdt_reset_gpio.c
parentfa59dd317aaf9c05c6d89a40c27bd98316d8c2df (diff)
downloadopensbi-754d51192b6bf6a4afd9d46c5f736a9f6dd1b404.tar.xz
lib: utils: identify supported GPIO reset methods
The GPIO reset driver supports reset and poweroff. But not all boards support both. gpio_system_reset_check() must detect this situation. Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> Reviewed-by: Anup Patel <anup.patel@wdc.com>
Diffstat (limited to 'lib/utils/reset/fdt_reset_gpio.c')
-rw-r--r--lib/utils/reset/fdt_reset_gpio.c44
1 files changed, 21 insertions, 23 deletions
diff --git a/lib/utils/reset/fdt_reset_gpio.c b/lib/utils/reset/fdt_reset_gpio.c
index 30127f5..77e4d0e 100644
--- a/lib/utils/reset/fdt_reset_gpio.c
+++ b/lib/utils/reset/fdt_reset_gpio.c
@@ -35,21 +35,9 @@ static struct gpio_reset restart = {
.inactive_delay = 100
};
-static int gpio_system_reset_check(u32 type, u32 reason)
-{
- switch (type) {
- case SBI_SRST_RESET_TYPE_SHUTDOWN:
- case SBI_SRST_RESET_TYPE_COLD_REBOOT:
- case SBI_SRST_RESET_TYPE_WARM_REBOOT:
- return 1;
- }
-
- return 0;
-}
-
-static void gpio_system_reset(u32 type, u32 reason)
+static struct gpio_reset *gpio_get_reset_settings(u32 type)
{
- struct gpio_reset *reset = NULL;
+ struct gpio_reset *reset;
switch (type) {
case SBI_SRST_RESET_TYPE_SHUTDOWN:
@@ -59,14 +47,26 @@ static void gpio_system_reset(u32 type, u32 reason)
case SBI_SRST_RESET_TYPE_WARM_REBOOT:
reset = &restart;
break;
+ default:
+ reset = NULL;
}
- if (reset) {
- if (!reset->pin.chip) {
- sbi_printf("%s: gpio pin not available\n", __func__);
- goto skip_reset;
- }
+ if (reset && !reset->pin.chip)
+ reset = NULL;
+
+ return reset;
+}
+
+static int gpio_system_reset_check(u32 type, u32 reason)
+{
+ return !!gpio_get_reset_settings(type);
+}
+
+static void gpio_system_reset(u32 type, u32 reason)
+{
+ struct gpio_reset *reset = gpio_get_reset_settings(type);
+ if (reset) {
/* drive it active, also inactive->active edge */
gpio_direction_output(&reset->pin, 1);
sbi_timer_mdelay(reset->active_delay);
@@ -77,11 +77,9 @@ static void gpio_system_reset(u32 type, u32 reason)
/* drive it active, also inactive->active edge */
gpio_set(&reset->pin, 1);
-
-skip_reset:
- /* hang !!! */
- sbi_hart_hang();
}
+ /* hang !!! */
+ sbi_hart_hang();
}
static struct sbi_system_reset_device gpio_reset = {