123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- // SPDX-License-Identifier: GPL-2.0
- /*
- * Copyright (C) 2018 Xilinx, Inc. - Michal Simek
- */
- #include <common.h>
- #include <dm.h>
- #include <errno.h>
- #include <log.h>
- #include <sysreset.h>
- #include <asm/gpio.h>
- struct gpio_reboot_priv {
- struct gpio_desc gpio;
- };
- static int gpio_reboot_request(struct udevice *dev, enum sysreset_t type)
- {
- struct gpio_reboot_priv *priv = dev_get_priv(dev);
- /*
- * When debug log is enabled please make sure that chars won't end up
- * in output fifo. Or you can append udelay(); to get enough time
- * to HW to emit output fifo.
- */
- debug("GPIO reset\n");
- /* Writing 1 respects polarity (active high/low) based on gpio->flags */
- return dm_gpio_set_value(&priv->gpio, 1);
- }
- static struct sysreset_ops gpio_reboot_ops = {
- .request = gpio_reboot_request,
- };
- int gpio_reboot_probe(struct udevice *dev)
- {
- struct gpio_reboot_priv *priv = dev_get_priv(dev);
- /*
- * Linux kernel DT binding contain others optional properties
- * which are not supported now
- */
- return gpio_request_by_name(dev, "gpios", 0, &priv->gpio, GPIOD_IS_OUT);
- }
- static const struct udevice_id led_gpio_ids[] = {
- { .compatible = "gpio-restart" },
- { }
- };
- U_BOOT_DRIVER(gpio_reboot) = {
- .id = UCLASS_SYSRESET,
- .name = "gpio_restart",
- .of_match = led_gpio_ids,
- .ops = &gpio_reboot_ops,
- .priv_auto_alloc_size = sizeof(struct gpio_reboot_priv),
- .probe = gpio_reboot_probe,
- };
|