diff options
Diffstat (limited to 'arch/microblaze/kernel/reset.c')
-rw-r--r-- | arch/microblaze/kernel/reset.c | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/arch/microblaze/kernel/reset.c b/arch/microblaze/kernel/reset.c new file mode 100644 index 000000000..fcbe1daf6 --- /dev/null +++ b/arch/microblaze/kernel/reset.c @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2009 Michal Simek <monstr@monstr.eu> + * Copyright (C) 2009 PetaLogix + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include <linux/init.h> +#include <linux/of_platform.h> + +/* Trigger specific functions */ +#ifdef CONFIG_GPIOLIB + +#include <linux/of_gpio.h> + +static int handle; /* reset pin handle */ +static unsigned int reset_val; + +static int of_platform_reset_gpio_probe(void) +{ + int ret; + handle = of_get_named_gpio(of_find_node_by_path("/"), + "hard-reset-gpios", 0); + + if (!gpio_is_valid(handle)) { + pr_info("Skipping unavailable RESET gpio %d (%s)\n", + handle, "reset"); + return -ENODEV; + } + + ret = gpio_request(handle, "reset"); + if (ret < 0) { + pr_info("GPIO pin is already allocated\n"); + return ret; + } + + /* get current setup value */ + reset_val = gpio_get_value(handle); + /* FIXME maybe worth to perform any action */ + pr_debug("Reset: Gpio output state: 0x%x\n", reset_val); + + /* Setup GPIO as output */ + ret = gpio_direction_output(handle, 0); + if (ret < 0) + goto err; + + /* Setup output direction */ + gpio_set_value(handle, 0); + + pr_info("RESET: Registered gpio device: %d, current val: %d\n", + handle, reset_val); + return 0; +err: + gpio_free(handle); + return ret; +} +device_initcall(of_platform_reset_gpio_probe); + + +static void gpio_system_reset(void) +{ + if (gpio_is_valid(handle)) + gpio_set_value(handle, 1 - reset_val); + else + pr_notice("Reset GPIO unavailable - halting!\n"); +} +#else +static void gpio_system_reset(void) +{ + pr_notice("No reset GPIO present - halting!\n"); +} + +void of_platform_reset_gpio_probe(void) +{ + return; +} +#endif + +void machine_restart(char *cmd) +{ + pr_notice("Machine restart...\n"); + gpio_system_reset(); + while (1) + ; +} + +void machine_shutdown(void) +{ + pr_notice("Machine shutdown...\n"); + while (1) + ; +} + +void machine_halt(void) +{ + pr_notice("Machine halt...\n"); + while (1) + ; +} + +void machine_power_off(void) +{ + pr_notice("Machine power off...\n"); + while (1) + ; +} |