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 #include <asm/prom.h> 13 14 /* Trigger specific functions */ 15 #ifdef CONFIG_GPIOLIB 16 17 #include <linux/of_gpio.h> 18 19 static int handle; /* reset pin handle */ 20 static unsigned int reset_val; 21 22 void of_platform_reset_gpio_probe(void) 23 { 24 int ret; 25 handle = of_get_named_gpio(of_find_node_by_path("/"), 26 "hard-reset-gpios", 0); 27 28 if (!gpio_is_valid(handle)) { 29 pr_info("Skipping unavailable RESET gpio %d (%s)\n", 30 handle, "reset"); 31 return; 32 } 33 34 ret = gpio_request(handle, "reset"); 35 if (ret < 0) { 36 pr_info("GPIO pin is already allocated\n"); 37 return; 38 } 39 40 /* get current setup value */ 41 reset_val = gpio_get_value(handle); 42 /* FIXME maybe worth to perform any action */ 43 pr_debug("Reset: Gpio output state: 0x%x\n", reset_val); 44 45 /* Setup GPIO as output */ 46 ret = gpio_direction_output(handle, 0); 47 if (ret < 0) 48 goto err; 49 50 /* Setup output direction */ 51 gpio_set_value(handle, 0); 52 53 pr_info("RESET: Registered gpio device: %d, current val: %d\n", 54 handle, reset_val); 55 return; 56 err: 57 gpio_free(handle); 58 return; 59 } 60 61 62 static void gpio_system_reset(void) 63 { 64 if (gpio_is_valid(handle)) 65 gpio_set_value(handle, 1 - reset_val); 66 else 67 pr_notice("Reset GPIO unavailable - halting!\n"); 68 } 69 #else 70 #define gpio_system_reset() do {} while (0) 71 void of_platform_reset_gpio_probe(void) 72 { 73 return; 74 } 75 #endif 76 77 void machine_restart(char *cmd) 78 { 79 pr_notice("Machine restart...\n"); 80 gpio_system_reset(); 81 while (1) 82 ; 83 } 84 85 void machine_shutdown(void) 86 { 87 pr_notice("Machine shutdown...\n"); 88 while (1) 89 ; 90 } 91 92 void machine_halt(void) 93 { 94 pr_notice("Machine halt...\n"); 95 while (1) 96 ; 97 } 98 99 void machine_power_off(void) 100 { 101 pr_notice("Machine power off...\n"); 102 while (1) 103 ; 104 } 105