-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Michal Simek <monstr@monstr.eu>
- Loading branch information
Michal Simek
committed
Dec 14, 2009
1 parent
f405425
commit 42a2478
Showing
6 changed files
with
171 additions
and
30 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,138 @@ | ||
/* | ||
* Copyright (C) 2009 Michal Simek <monstr@monstr.eu> | ||
* Copyright (C) 2009 PetaLogix | ||
* | ||
* This file is subject to the terms and conditions of the GNU General Public | ||
* License. See the file "COPYING" in the main directory of this archive | ||
* for more details. | ||
*/ | ||
|
||
#include <linux/init.h> | ||
#include <linux/of_platform.h> | ||
#include <asm/prom.h> | ||
|
||
/* Trigger specific functions */ | ||
#ifdef CONFIG_GPIOLIB | ||
|
||
#include <linux/of_gpio.h> | ||
|
||
static int handle; /* reset pin handle */ | ||
|
||
static int of_reset_gpio_handle(void) | ||
{ | ||
int ret; /* variable which stored handle reset gpio pin */ | ||
struct device_node *root; /* root node */ | ||
struct device_node *gpio; /* gpio node */ | ||
struct of_gpio_chip *of_gc = NULL; | ||
enum of_gpio_flags flags ; | ||
const void *gpio_spec; | ||
|
||
/* find out root node */ | ||
root = of_find_node_by_path("/"); | ||
|
||
/* give me handle for gpio node to be possible allocate pin */ | ||
ret = of_parse_phandles_with_args(root, "hard-reset-gpios", | ||
"#gpio-cells", 0, &gpio, &gpio_spec); | ||
if (ret) { | ||
pr_debug("%s: can't parse gpios property\n", __func__); | ||
goto err0; | ||
} | ||
|
||
of_gc = gpio->data; | ||
if (!of_gc) { | ||
pr_debug("%s: gpio controller %s isn't registered\n", | ||
root->full_name, gpio->full_name); | ||
ret = -ENODEV; | ||
goto err1; | ||
} | ||
|
||
ret = of_gc->xlate(of_gc, root, gpio_spec, &flags); | ||
if (ret < 0) | ||
goto err1; | ||
|
||
ret += of_gc->gc.base; | ||
err1: | ||
of_node_put(gpio); | ||
err0: | ||
pr_debug("%s exited with status %d\n", __func__, ret); | ||
return ret; | ||
} | ||
|
||
void of_platform_reset_gpio_probe(void) | ||
{ | ||
int ret; | ||
handle = of_reset_gpio_handle(); | ||
|
||
if (!gpio_is_valid(handle)) { | ||
printk(KERN_INFO "Skipping unavailable RESET gpio %d (%s)\n", | ||
handle, "reset"); | ||
} | ||
|
||
ret = gpio_request(handle, "reset"); | ||
if (ret < 0) { | ||
printk(KERN_INFO "GPIO pin is already allocated\n"); | ||
return; | ||
} | ||
|
||
/* get current setup value */ | ||
ret = gpio_get_value(handle); | ||
/* FIXME maybe worth to perform any action */ | ||
pr_debug("Reset: Gpio output state: 0x%x\n", ret); | ||
|
||
/* Setup GPIO as output */ | ||
ret = gpio_direction_output(handle, 0); | ||
if (ret < 0) | ||
goto err; | ||
|
||
/* Setup output direction */ | ||
gpio_set_value(handle, 0); | ||
|
||
printk(KERN_INFO "Registered reset device: %d\n", handle); | ||
return; | ||
err: | ||
gpio_free(handle); | ||
return; | ||
} | ||
|
||
|
||
static void gpio_system_reset(void) | ||
{ | ||
gpio_set_value(handle, 1); | ||
} | ||
#else | ||
#define gpio_system_reset() do {} while (0) | ||
void of_platform_reset_gpio_probe(void) | ||
{ | ||
return; | ||
} | ||
#endif | ||
|
||
void machine_restart(char *cmd) | ||
{ | ||
printk(KERN_NOTICE "Machine restart...\n"); | ||
gpio_system_reset(); | ||
dump_stack(); | ||
while (1) | ||
; | ||
} | ||
|
||
void machine_shutdown(void) | ||
{ | ||
printk(KERN_NOTICE "Machine shutdown...\n"); | ||
while (1) | ||
; | ||
} | ||
|
||
void machine_halt(void) | ||
{ | ||
printk(KERN_NOTICE "Machine halt...\n"); | ||
while (1) | ||
; | ||
} | ||
|
||
void machine_power_off(void) | ||
{ | ||
printk(KERN_NOTICE "Machine power off...\n"); | ||
while (1) | ||
; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters