net:rfkill: add a gpio setup function into GPIO rfkill
authorSangwook Lee <sangwook.lee@linaro.org>
Thu, 29 Sep 2011 11:57:17 +0000 (12:57 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 3 Oct 2011 19:19:19 +0000 (15:19 -0400)
Add a gpio setup function which gives a chance to set up
platform specific configuration such as pin multiplexing,
input/output direction at the runtime or booting time.

Signed-off-by: Sangwook Lee <sangwook.lee@linaro.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
include/linux/rfkill-gpio.h
net/rfkill/rfkill-gpio.c

index a175d05..4d09f6e 100644 (file)
@@ -30,6 +30,8 @@
  * @reset_gpio:                GPIO which is used for reseting rfkill switch
  * @shutdown_gpio:     GPIO which is used for shutdown of rfkill switch
  * @power_clk_name:    [optional] name of clk to turn off while blocked
+ * @gpio_runtime_close:        clean up platform specific gpio configuration
+ * @gpio_runtime_setup:        set up platform specific gpio configuration
  */
 
 struct rfkill_gpio_platform_data {
@@ -38,6 +40,8 @@ struct rfkill_gpio_platform_data {
        int                     shutdown_gpio;
        const char              *power_clk_name;
        enum rfkill_type        type;
+       void    (*gpio_runtime_close)(struct platform_device *);
+       int     (*gpio_runtime_setup)(struct platform_device *);
 };
 
 #endif /* __RFKILL_GPIO_H */
index 256c5dd..128677d 100644 (file)
@@ -101,6 +101,14 @@ static int rfkill_gpio_probe(struct platform_device *pdev)
        if (!rfkill)
                return -ENOMEM;
 
+       if (pdata->gpio_runtime_setup) {
+               ret = pdata->gpio_runtime_setup(pdev);
+               if (ret) {
+                       pr_warn("%s: can't set up gpio\n", __func__);
+                       return ret;
+               }
+       }
+
        rfkill->pdata = pdata;
 
        len = strlen(pdata->name);
@@ -182,7 +190,10 @@ fail_alloc:
 static int rfkill_gpio_remove(struct platform_device *pdev)
 {
        struct rfkill_gpio_data *rfkill = platform_get_drvdata(pdev);
+       struct rfkill_gpio_platform_data *pdata = pdev->dev.platform_data;
 
+       if (pdata->gpio_runtime_close)
+               pdata->gpio_runtime_close(pdev);
        rfkill_unregister(rfkill->rfkill_dev);
        rfkill_destroy(rfkill->rfkill_dev);
        if (gpio_is_valid(rfkill->pdata->shutdown_gpio))