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 static int of_reset_gpio_handle(void) 23 { 24 int ret; /* variable which stored handle reset gpio pin */ 25 struct device_node *root; /* root node */ 26 struct device_node *gpio; /* gpio node */ 27 struct of_gpio_chip *of_gc = NULL; 28 enum of_gpio_flags flags ; 29 const void *gpio_spec; 30 31 /* find out root node */ 32 root = of_find_node_by_path("/"); 33 34 /* give me handle for gpio node to be possible allocate pin */ 35 ret = of_parse_phandles_with_args(root, "hard-reset-gpios", 36 "#gpio-cells", 0, &gpio, &gpio_spec); 37 if (ret) { 38 pr_debug("%s: can't parse gpios property\n", __func__); 39 goto err0; 40 } 41 42 of_gc = gpio->data; 43 if (!of_gc) { 44 pr_debug("%s: gpio controller %s isn't registered\n", 45 root->full_name, gpio->full_name); 46 ret = -ENODEV; 47 goto err1; 48 } 49 50 ret = of_gc->xlate(of_gc, root, gpio_spec, &flags); 51 if (ret < 0) 52 goto err1; 53 54 ret += of_gc->gc.base; 55 err1: 56 of_node_put(gpio); 57 err0: 58 pr_debug("%s exited with status %d\n", __func__, ret); 59 return ret; 60 } 61 62 void of_platform_reset_gpio_probe(void) 63 { 64 int ret; 65 handle = of_reset_gpio_handle(); 66 67 if (!gpio_is_valid(handle)) { 68 printk(KERN_INFO "Skipping unavailable RESET gpio %d (%s)\n", 69 handle, "reset"); 70 } 71 72 ret = gpio_request(handle, "reset"); 73 if (ret < 0) { 74 printk(KERN_INFO "GPIO pin is already allocated\n"); 75 return; 76 } 77 78 /* get current setup value */ 79 reset_val = gpio_get_value(handle); 80 /* FIXME maybe worth to perform any action */ 81 pr_debug("Reset: Gpio output state: 0x%x\n", reset_val); 82 83 /* Setup GPIO as output */ 84 ret = gpio_direction_output(handle, 0); 85 if (ret < 0) 86 goto err; 87 88 /* Setup output direction */ 89 gpio_set_value(handle, 0); 90 91 printk(KERN_INFO "RESET: Registered gpio device: %d, current val: %d\n", 92 handle, reset_val); 93 return; 94 err: 95 gpio_free(handle); 96 return; 97 } 98 99 100 static void gpio_system_reset(void) 101 { 102 gpio_set_value(handle, 1 - reset_val); 103 } 104 #else 105 #define gpio_system_reset() do {} while (0) 106 void of_platform_reset_gpio_probe(void) 107 { 108 return; 109 } 110 #endif 111 112 void machine_restart(char *cmd) 113 { 114 printk(KERN_NOTICE "Machine restart...\n"); 115 gpio_system_reset(); 116 dump_stack(); 117 while (1) 118 ; 119 } 120 121 void machine_shutdown(void) 122 { 123 printk(KERN_NOTICE "Machine shutdown...\n"); 124 while (1) 125 ; 126 } 127 128 void machine_halt(void) 129 { 130 printk(KERN_NOTICE "Machine halt...\n"); 131 while (1) 132 ; 133 } 134 135 void machine_power_off(void) 136 { 137 printk(KERN_NOTICE "Machine power off...\n"); 138 while (1) 139 ; 140 } 141