Merge tag 'u-boot-imx-20200623' of https://gitlab.denx.de/u-boot/custodians/u-boot-imx
[oweals/u-boot.git] / drivers / sysreset / sysreset_gpio.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) 2018 Xilinx, Inc. - Michal Simek
4  */
5
6 #include <common.h>
7 #include <dm.h>
8 #include <errno.h>
9 #include <log.h>
10 #include <sysreset.h>
11 #include <asm/gpio.h>
12
13 struct gpio_reboot_priv {
14         struct gpio_desc gpio;
15 };
16
17 static int gpio_reboot_request(struct udevice *dev, enum sysreset_t type)
18 {
19         struct gpio_reboot_priv *priv = dev_get_priv(dev);
20
21         /*
22          * When debug log is enabled please make sure that chars won't end up
23          * in output fifo. Or you can append udelay(); to get enough time
24          * to HW to emit output fifo.
25          */
26         debug("GPIO reset\n");
27
28         /* Writing 1 respects polarity (active high/low) based on gpio->flags */
29         return dm_gpio_set_value(&priv->gpio, 1);
30 }
31
32 static struct sysreset_ops gpio_reboot_ops = {
33         .request = gpio_reboot_request,
34 };
35
36 int gpio_reboot_probe(struct udevice *dev)
37 {
38         struct gpio_reboot_priv *priv = dev_get_priv(dev);
39
40         /*
41          * Linux kernel DT binding contain others optional properties
42          * which are not supported now
43          */
44
45         return gpio_request_by_name(dev, "gpios", 0, &priv->gpio, GPIOD_IS_OUT);
46 }
47
48 static const struct udevice_id led_gpio_ids[] = {
49         { .compatible = "gpio-restart" },
50         { }
51 };
52
53 U_BOOT_DRIVER(gpio_reboot) = {
54         .id = UCLASS_SYSRESET,
55         .name = "gpio_restart",
56         .of_match = led_gpio_ids,
57         .ops = &gpio_reboot_ops,
58         .priv_auto_alloc_size = sizeof(struct gpio_reboot_priv),
59         .probe = gpio_reboot_probe,
60 };