Commit | Line | Data |
---|---|---|
42a2478b MS |
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 */ | |
67bf8766 | 20 | static unsigned int reset_val; |
42a2478b | 21 | |
42a2478b MS |
22 | void of_platform_reset_gpio_probe(void) |
23 | { | |
24 | int ret; | |
fe9f6844 GL |
25 | handle = of_get_named_gpio(of_find_node_by_path("/"), |
26 | "hard-reset-gpios", 0); | |
42a2478b MS |
27 | |
28 | if (!gpio_is_valid(handle)) { | |
29 | printk(KERN_INFO "Skipping unavailable RESET gpio %d (%s)\n", | |
30 | handle, "reset"); | |
31 | } | |
32 | ||
33 | ret = gpio_request(handle, "reset"); | |
34 | if (ret < 0) { | |
35 | printk(KERN_INFO "GPIO pin is already allocated\n"); | |
36 | return; | |
37 | } | |
38 | ||
39 | /* get current setup value */ | |
67bf8766 | 40 | reset_val = gpio_get_value(handle); |
42a2478b | 41 | /* FIXME maybe worth to perform any action */ |
67bf8766 | 42 | pr_debug("Reset: Gpio output state: 0x%x\n", reset_val); |
42a2478b MS |
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 | ||
67bf8766 MS |
52 | printk(KERN_INFO "RESET: Registered gpio device: %d, current val: %d\n", |
53 | handle, reset_val); | |
42a2478b MS |
54 | return; |
55 | err: | |
56 | gpio_free(handle); | |
57 | return; | |
58 | } | |
59 | ||
60 | ||
61 | static void gpio_system_reset(void) | |
62 | { | |
67bf8766 | 63 | gpio_set_value(handle, 1 - reset_val); |
42a2478b MS |
64 | } |
65 | #else | |
66 | #define gpio_system_reset() do {} while (0) | |
67 | void of_platform_reset_gpio_probe(void) | |
68 | { | |
69 | return; | |
70 | } | |
71 | #endif | |
72 | ||
73 | void machine_restart(char *cmd) | |
74 | { | |
75 | printk(KERN_NOTICE "Machine restart...\n"); | |
76 | gpio_system_reset(); | |
77 | dump_stack(); | |
78 | while (1) | |
79 | ; | |
80 | } | |
81 | ||
82 | void machine_shutdown(void) | |
83 | { | |
84 | printk(KERN_NOTICE "Machine shutdown...\n"); | |
85 | while (1) | |
86 | ; | |
87 | } | |
88 | ||
89 | void machine_halt(void) | |
90 | { | |
91 | printk(KERN_NOTICE "Machine halt...\n"); | |
92 | while (1) | |
93 | ; | |
94 | } | |
95 | ||
96 | void machine_power_off(void) | |
97 | { | |
98 | printk(KERN_NOTICE "Machine power off...\n"); | |
99 | while (1) | |
100 | ; | |
101 | } |