power: reset: gpio-poweroff: add ability to specific active and inactive delays

Similar to gpio-reset allow to specify active and inactive delays
while keeping the 100ms defaults that were used previously all the time.

The dt-properties are named the same as in gpio-reset but get an "-ms"
suffix as properties should contain such a suffix specifying its unit.

Signed-off-by: Heiko Stuebner <heiko.stuebner@bq.com>
Reviewed-by: Rob Herring <robh@kernel.org>
Reviewed-by: Moritz Fischer <mdf@kernel.org>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
This commit is contained in:
Heiko Stuebner 2018-11-11 22:45:38 +01:00 committed by Sebastian Reichel
parent a53a68cee8
commit 76ee875c2f
2 changed files with 10 additions and 2 deletions

View File

@ -27,6 +27,8 @@ Optional properties:
it to an output when the power-off handler is called. If this optional it to an output when the power-off handler is called. If this optional
property is not specified, the GPIO is initialized as an output in its property is not specified, the GPIO is initialized as an output in its
inactive state. inactive state.
- active-delay-ms: Delay (default 100) to wait after driving gpio active
- inactive-delay-ms: Delay (default 100) to wait after driving gpio inactive
- timeout-ms: Time to wait before asserting a WARN_ON(1). If nothing is - timeout-ms: Time to wait before asserting a WARN_ON(1). If nothing is
specified, 3000 ms is used. specified, 3000 ms is used.

View File

@ -26,6 +26,8 @@
*/ */
static struct gpio_desc *reset_gpio; static struct gpio_desc *reset_gpio;
static u32 timeout = DEFAULT_TIMEOUT_MS; static u32 timeout = DEFAULT_TIMEOUT_MS;
static u32 active_delay = 100;
static u32 inactive_delay = 100;
static void gpio_poweroff_do_poweroff(void) static void gpio_poweroff_do_poweroff(void)
{ {
@ -33,10 +35,11 @@ static void gpio_poweroff_do_poweroff(void)
/* drive it active, also inactive->active edge */ /* drive it active, also inactive->active edge */
gpiod_direction_output(reset_gpio, 1); gpiod_direction_output(reset_gpio, 1);
mdelay(100); mdelay(active_delay);
/* drive inactive, also active->inactive edge */ /* drive inactive, also active->inactive edge */
gpiod_set_value_cansleep(reset_gpio, 0); gpiod_set_value_cansleep(reset_gpio, 0);
mdelay(100); mdelay(inactive_delay);
/* drive it active, also inactive->active edge */ /* drive it active, also inactive->active edge */
gpiod_set_value_cansleep(reset_gpio, 1); gpiod_set_value_cansleep(reset_gpio, 1);
@ -66,6 +69,9 @@ static int gpio_poweroff_probe(struct platform_device *pdev)
else else
flags = GPIOD_OUT_LOW; flags = GPIOD_OUT_LOW;
device_property_read_u32(&pdev->dev, "active-delay-ms", &active_delay);
device_property_read_u32(&pdev->dev, "inactive-delay-ms",
&inactive_delay);
device_property_read_u32(&pdev->dev, "timeout-ms", &timeout); device_property_read_u32(&pdev->dev, "timeout-ms", &timeout);
reset_gpio = devm_gpiod_get(&pdev->dev, NULL, flags); reset_gpio = devm_gpiod_get(&pdev->dev, NULL, flags);