blob: de42b5935424687e75df5cae93a23fd023c3ef14 [file] [log] [blame]
Michal Simek0d832b32018-07-13 11:04:56 +02001// 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>
Simon Glassf7ae49f2020-05-10 11:40:05 -06009#include <log.h>
Michal Simek0d832b32018-07-13 11:04:56 +020010#include <sysreset.h>
11#include <asm/gpio.h>
12
13struct gpio_reboot_priv {
14 struct gpio_desc gpio;
15};
16
17static int gpio_reboot_request(struct udevice *dev, enum sysreset_t type)
18{
19 struct gpio_reboot_priv *priv = dev_get_priv(dev);
Jonathan Liua47164d2023-03-28 17:44:23 +110020 int ret;
Michal Simek0d832b32018-07-13 11:04:56 +020021
22 /*
23 * When debug log is enabled please make sure that chars won't end up
24 * in output fifo. Or you can append udelay(); to get enough time
25 * to HW to emit output fifo.
26 */
27 debug("GPIO reset\n");
28
29 /* Writing 1 respects polarity (active high/low) based on gpio->flags */
Jonathan Liua47164d2023-03-28 17:44:23 +110030 ret = dm_gpio_set_value(&priv->gpio, 1);
31 if (ret < 0)
32 return ret;
33
34 return -EINPROGRESS;
Michal Simek0d832b32018-07-13 11:04:56 +020035}
36
37static struct sysreset_ops gpio_reboot_ops = {
38 .request = gpio_reboot_request,
39};
40
Samuel Holland30ba45d2021-11-03 22:55:12 -050041static int gpio_reboot_probe(struct udevice *dev)
Michal Simek0d832b32018-07-13 11:04:56 +020042{
43 struct gpio_reboot_priv *priv = dev_get_priv(dev);
44
45 /*
46 * Linux kernel DT binding contain others optional properties
47 * which are not supported now
48 */
49
50 return gpio_request_by_name(dev, "gpios", 0, &priv->gpio, GPIOD_IS_OUT);
51}
52
53static const struct udevice_id led_gpio_ids[] = {
54 { .compatible = "gpio-restart" },
55 { }
56};
57
58U_BOOT_DRIVER(gpio_reboot) = {
59 .id = UCLASS_SYSRESET,
60 .name = "gpio_restart",
61 .of_match = led_gpio_ids,
62 .ops = &gpio_reboot_ops,
Simon Glass41575d82020-12-03 16:55:17 -070063 .priv_auto = sizeof(struct gpio_reboot_priv),
Michal Simek0d832b32018-07-13 11:04:56 +020064 .probe = gpio_reboot_probe,
65};