Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzi...
[sfrench/cifs-2.6.git] / arch / microblaze / kernel / reset.c
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 gpio_chip *gc;
28         u32 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         gc = of_node_to_gpiochip(gpio);
43         if (!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 = gc->of_xlate(gc, root, gpio_spec, &flags);
51         if (ret < 0)
52                 goto err1;
53
54         ret += 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 }