1/* 2 * Copyright (C) 2009 Michal Simek <monstr@monstr.eu> 3 * Copyright (C) 2009 PetaLogix 4 * 5 * This file is subject to the terms and conditions of the GNU General Public 6 * License. See the file "COPYING" in the main directory of this archive 7 * for more details. 8 */ 9 10#include <linux/init.h> 11#include <linux/of_platform.h> 12 13/* Trigger specific functions */ 14#ifdef CONFIG_GPIOLIB 15 16#include <linux/of_gpio.h> 17 18static int handle; /* reset pin handle */ 19static unsigned int reset_val; 20 21void of_platform_reset_gpio_probe(void) 22{ 23 int ret; 24 handle = of_get_named_gpio(of_find_node_by_path("/"), 25 "hard-reset-gpios", 0); 26 27 if (!gpio_is_valid(handle)) { 28 pr_info("Skipping unavailable RESET gpio %d (%s)\n", 29 handle, "reset"); 30 return; 31 } 32 33 ret = gpio_request(handle, "reset"); 34 if (ret < 0) { 35 pr_info("GPIO pin is already allocated\n"); 36 return; 37 } 38 39 /* get current setup value */ 40 reset_val = gpio_get_value(handle); 41 /* FIXME maybe worth to perform any action */ 42 pr_debug("Reset: Gpio output state: 0x%x\n", reset_val); 43 44 /* Setup GPIO as output */ 45 ret = gpio_direction_output(handle, 0); 46 if (ret < 0) 47 goto err; 48 49 /* Setup output direction */ 50 gpio_set_value(handle, 0); 51 52 pr_info("RESET: Registered gpio device: %d, current val: %d\n", 53 handle, reset_val); 54 return; 55err: 56 gpio_free(handle); 57 return; 58} 59 60 61static void gpio_system_reset(void) 62{ 63 if (gpio_is_valid(handle)) 64 gpio_set_value(handle, 1 - reset_val); 65 else 66 pr_notice("Reset GPIO unavailable - halting!\n"); 67} 68#else 69static void gpio_system_reset(void) 70{ 71 pr_notice("No reset GPIO present - halting!\n"); 72} 73 74void of_platform_reset_gpio_probe(void) 75{ 76 return; 77} 78#endif 79 80void machine_restart(char *cmd) 81{ 82 pr_notice("Machine restart...\n"); 83 gpio_system_reset(); 84 while (1) 85 ; 86} 87 88void machine_shutdown(void) 89{ 90 pr_notice("Machine shutdown...\n"); 91 while (1) 92 ; 93} 94 95void machine_halt(void) 96{ 97 pr_notice("Machine halt...\n"); 98 while (1) 99 ; 100} 101 102void machine_power_off(void) 103{ 104 pr_notice("Machine power off...\n"); 105 while (1) 106 ; 107} 108