]> Pileus Git - ~andy/linux/commitdiff
extcon: gpio: Request gpio pin before modifying its state
authorGuenter Roeck <linux@roeck-us.net>
Fri, 22 Nov 2013 17:26:01 +0000 (09:26 -0800)
committerChanwoo Choi <cw00.choi@samsung.com>
Tue, 7 Jan 2014 02:54:26 +0000 (11:54 +0900)
Commit 338de0ca (extcon: gpio: Use gpio driver/chip debounce if supported)
introduced a call to gpio_set_debounce() before actually requesting the
respective gpio pin from the gpio subsystem.

The gpio subsystem expects that a gpio pin was requested before modifying its
state. Not doing so results in a warning from gpiolib, and the gpio pin is
auto-requested. This in turn causes the subsequent devm_gpio_request_one()
to fail. So devm_gpio_request_one() must be called prior to calling
gpio_set_debounce().

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Acked-by: MyungJoo Ham <myungjoo.ham@samsung.com>
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
drivers/extcon/extcon-gpio.c

index 7e0dff58e4943e8b1b09a44c4adba854898cda9d..4736a9c57efa05aef4146b87c7c953557c2a769b 100644 (file)
@@ -105,6 +105,12 @@ static int gpio_extcon_probe(struct platform_device *pdev)
        extcon_data->state_off = pdata->state_off;
        if (pdata->state_on && pdata->state_off)
                extcon_data->edev.print_state = extcon_gpio_print_state;
+
+       ret = devm_gpio_request_one(&pdev->dev, extcon_data->gpio, GPIOF_DIR_IN,
+                                   pdev->name);
+       if (ret < 0)
+               return ret;
+
        if (pdata->debounce) {
                ret = gpio_set_debounce(extcon_data->gpio,
                                        pdata->debounce * 1000);
@@ -117,11 +123,6 @@ static int gpio_extcon_probe(struct platform_device *pdev)
        if (ret < 0)
                return ret;
 
-       ret = devm_gpio_request_one(&pdev->dev, extcon_data->gpio, GPIOF_DIR_IN,
-                                   pdev->name);
-       if (ret < 0)
-               goto err;
-
        INIT_DELAYED_WORK(&extcon_data->work, gpio_extcon_work);
 
        extcon_data->irq = gpio_to_irq(extcon_data->gpio);