-
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.
yaml --- r: 342332 b: refs/heads/master c: 96ff0f5 h: refs/heads/master v: v3
- Loading branch information
Jamie Lentin
authored and
Jason Cooper
committed
Nov 24, 2012
1 parent
a79d15d
commit 1515379
Showing
7 changed files
with
172 additions
and
1 deletion.
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: f4a00139b7cbeff538e616a21f6b57249a9d3ed8 | ||
refs/heads/master: 96ff0f5c7efd4a2205c48a76a6a1fcd2731e6128 |
22 changes: 22 additions & 0 deletions
22
trunk/Documentation/devicetree/bindings/gpio/gpio-poweroff.txt
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,22 @@ | ||
GPIO line that should be set high/low to power off a device | ||
|
||
Required properties: | ||
- compatible : should be "gpio-poweroff". | ||
- gpios : The GPIO to set high/low, see "gpios property" in | ||
Documentation/devicetree/bindings/gpio/gpio.txt. If the pin should be | ||
low to power down the board set it to "Active Low", otherwise set | ||
gpio to "Active High". | ||
|
||
Optional properties: | ||
- input : Initially configure the GPIO line as an input. Only reconfigure | ||
it to an output when the pm_power_off function is called. If this optional | ||
property is not specified, the GPIO is initialized as an output in its | ||
inactive state. | ||
|
||
|
||
Examples: | ||
|
||
gpio-poweroff { | ||
compatible = "gpio-poweroff"; | ||
gpios = <&gpio 4 0>; /* GPIO 4 Active Low */ | ||
}; |
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,15 @@ | ||
menuconfig POWER_RESET | ||
bool "Board level reset or power off" | ||
help | ||
Provides a number of drivers which either reset a complete board | ||
or shut it down, by manipulating the main power supply on the board. | ||
|
||
Say Y here to enable board reset and power off | ||
|
||
config POWER_RESET_GPIO | ||
bool "GPIO power-off driver" | ||
depends on OF_GPIO && POWER_RESET | ||
help | ||
This driver supports turning off your board via a GPIO line. | ||
If your board needs a GPIO high/low to power down, say Y and | ||
create a binding in your devicetree. |
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 @@ | ||
obj-$(CONFIG_POWER_RESET_GPIO) += gpio-poweroff.o |
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,129 @@ | ||
/* | ||
* Toggles a GPIO pin to power down a device | ||
* | ||
* Jamie Lentin <jm@lentin.co.uk> | ||
* Andrew Lunn <andrew@lunn.ch> | ||
* | ||
* Copyright (C) 2012 Jamie Lentin | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
* | ||
*/ | ||
#include <linux/kernel.h> | ||
#include <linux/init.h> | ||
#include <linux/delay.h> | ||
#include <linux/platform_device.h> | ||
#include <linux/gpio.h> | ||
#include <linux/of_platform.h> | ||
#include <linux/of_gpio.h> | ||
#include <linux/module.h> | ||
|
||
/* | ||
* Hold configuration here, cannot be more than one instance of the driver | ||
* since pm_power_off itself is global. | ||
*/ | ||
static int gpio_num = -1; | ||
static int gpio_active_low; | ||
|
||
static void gpio_poweroff_do_poweroff(void) | ||
{ | ||
BUG_ON(gpio_num == -1); | ||
|
||
/* drive it active */ | ||
gpio_direction_output(gpio_num, !gpio_active_low); | ||
mdelay(100); | ||
/* rising edge or drive inactive */ | ||
gpio_set_value(gpio_num, gpio_active_low); | ||
mdelay(100); | ||
/* falling edge */ | ||
gpio_set_value(gpio_num, !gpio_active_low); | ||
|
||
/* give it some time */ | ||
mdelay(3000); | ||
|
||
WARN_ON(1); | ||
} | ||
|
||
static int __devinit gpio_poweroff_probe(struct platform_device *pdev) | ||
{ | ||
enum of_gpio_flags flags; | ||
bool input = false; | ||
int ret; | ||
|
||
/* If a pm_power_off function has already been added, leave it alone */ | ||
if (pm_power_off != NULL) { | ||
pr_err("%s: pm_power_off function already registered", | ||
__func__); | ||
return -EBUSY; | ||
} | ||
|
||
gpio_num = of_get_gpio_flags(pdev->dev.of_node, 0, &flags); | ||
if (gpio_num < 0) { | ||
pr_err("%s: Could not get GPIO configuration: %d", | ||
__func__, gpio_num); | ||
return -ENODEV; | ||
} | ||
gpio_active_low = flags & OF_GPIO_ACTIVE_LOW; | ||
|
||
if (of_get_property(pdev->dev.of_node, "input", NULL)) | ||
input = true; | ||
|
||
ret = gpio_request(gpio_num, "poweroff-gpio"); | ||
if (ret) { | ||
pr_err("%s: Could not get GPIO %d", __func__, gpio_num); | ||
return ret; | ||
} | ||
if (input) { | ||
if (gpio_direction_input(gpio_num)) { | ||
pr_err("Could not set direction of GPIO %d to input", | ||
gpio_num); | ||
goto err; | ||
} | ||
} else { | ||
if (gpio_direction_output(gpio_num, gpio_active_low)) { | ||
pr_err("Could not set direction of GPIO %d", gpio_num); | ||
goto err; | ||
} | ||
} | ||
|
||
pm_power_off = &gpio_poweroff_do_poweroff; | ||
return 0; | ||
|
||
err: | ||
gpio_free(gpio_num); | ||
return -ENODEV; | ||
} | ||
|
||
static int __devexit gpio_poweroff_remove(struct platform_device *pdev) | ||
{ | ||
if (gpio_num != -1) | ||
gpio_free(gpio_num); | ||
if (pm_power_off == &gpio_poweroff_do_poweroff) | ||
pm_power_off = NULL; | ||
|
||
return 0; | ||
} | ||
|
||
static const struct of_device_id of_gpio_poweroff_match[] = { | ||
{ .compatible = "gpio-poweroff", }, | ||
{}, | ||
}; | ||
|
||
static struct platform_driver gpio_poweroff_driver = { | ||
.probe = gpio_poweroff_probe, | ||
.remove = __devexit_p(gpio_poweroff_remove), | ||
.driver = { | ||
.name = "poweroff-gpio", | ||
.owner = THIS_MODULE, | ||
.of_match_table = of_gpio_poweroff_match, | ||
}, | ||
}; | ||
|
||
module_platform_driver(gpio_poweroff_driver); | ||
|
||
MODULE_AUTHOR("Jamie Lentin <jm@lentin.co.uk>"); | ||
MODULE_DESCRIPTION("GPIO poweroff driver"); | ||
MODULE_LICENSE("GPL"); | ||
MODULE_ALIAS("platform:poweroff-gpio"); |