diff options
Diffstat (limited to 'drivers/power/reset/gpio-poweroff.c')
| -rw-r--r-- | drivers/power/reset/gpio-poweroff.c | 39 | 
1 files changed, 18 insertions, 21 deletions
diff --git a/drivers/power/reset/gpio-poweroff.c b/drivers/power/reset/gpio-poweroff.c index 0491e5335d0..e290d48ddd9 100644 --- a/drivers/power/reset/gpio-poweroff.c +++ b/drivers/power/reset/gpio-poweroff.c @@ -29,15 +29,16 @@ static int gpio_active_low;  static void gpio_poweroff_do_poweroff(void)  { -	BUG_ON(gpio_num == -1); +	BUG_ON(!gpio_is_valid(gpio_num)); -	/* drive it active */ +	/* drive it active, also inactive->active edge */  	gpio_direction_output(gpio_num, !gpio_active_low);  	mdelay(100); -	/* rising edge or drive inactive */ +	/* drive inactive, also active->inactive edge */  	gpio_set_value(gpio_num, gpio_active_low);  	mdelay(100); -	/* falling edge */ + +	/* drive it active, also inactive->active edge */  	gpio_set_value(gpio_num, !gpio_active_low);  	/* give it some time */ @@ -46,7 +47,7 @@ static void gpio_poweroff_do_poweroff(void)  	WARN_ON(1);  } -static int __devinit gpio_poweroff_probe(struct platform_device *pdev) +static int gpio_poweroff_probe(struct platform_device *pdev)  {  	enum of_gpio_flags flags;  	bool input = false; @@ -60,15 +61,12 @@ static int __devinit gpio_poweroff_probe(struct platform_device *pdev)  	}  	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; -	} +	if (!gpio_is_valid(gpio_num)) +		return gpio_num; +  	gpio_active_low = flags & OF_GPIO_ACTIVE_LOW; -	if (of_get_property(pdev->dev.of_node, "input", NULL)) -		input = true; +	input = of_property_read_bool(pdev->dev.of_node, "input");  	ret = gpio_request(gpio_num, "poweroff-gpio");  	if (ret) { @@ -96,10 +94,9 @@ err:  	return -ENODEV;  } -static int __devexit gpio_poweroff_remove(struct platform_device *pdev) +static int gpio_poweroff_remove(struct platform_device *pdev)  { -	if (gpio_num != -1) -		gpio_free(gpio_num); +	gpio_free(gpio_num);  	if (pm_power_off == &gpio_poweroff_do_poweroff)  		pm_power_off = NULL; @@ -113,17 +110,17 @@ static const struct of_device_id of_gpio_poweroff_match[] = {  static struct platform_driver gpio_poweroff_driver = {  	.probe = gpio_poweroff_probe, -	.remove = __devexit_p(gpio_poweroff_remove), +	.remove = gpio_poweroff_remove,  	.driver = { -		   .name = "poweroff-gpio", -		   .owner = THIS_MODULE, -		   .of_match_table = of_gpio_poweroff_match, -		   }, +		.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_LICENSE("GPL v2");  MODULE_ALIAS("platform:poweroff-gpio");  |