leds: leds-gpio: Convert gpio_blink_set() to use GPIO descriptors
authorMika Westerberg <mika.westerberg@linux.intel.com>
Fri, 31 Oct 2014 11:40:58 +0000 (13:40 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 4 Nov 2014 20:58:25 +0000 (21:58 +0100)
Commit 21f2aae91e902aad ("leds: leds-gpio: Add support for GPIO
descriptors") already converted most of the driver to use GPIO descriptors.
What is still missing is the platform specific hook gpio_blink_set() and
board files which pass legacy GPIO numbers to this driver in platform data.

In this patch we handle the former and convert gpio_blink_set() to take
GPIO descriptor instead. In order to do this we convert the existing four
users to accept GPIO descriptor and translate it to legacy GPIO number in
the platform code. This effectively "pushes" legacy GPIO number usage from
the driver to platforms.

Also add comment to the remaining block describing that it is legacy code
path and we are getting rid of it eventually.

Suggested-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Acked-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Acked-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
arch/arm/mach-s3c24xx/h1940-bluetooth.c
arch/arm/mach-s3c24xx/h1940.h
arch/arm/mach-s3c24xx/mach-h1940.c
arch/arm/mach-s3c24xx/mach-rx1950.c
arch/arm/plat-orion/gpio.c
arch/arm/plat-orion/include/plat/orion-gpio.h
drivers/leds/leds-gpio.c
include/linux/leds.h

index b4d14b86436727df47dce3bbe0d30db6c7e4e5ad..9c8b1279a4baef85fc06a929340d35310d45542e 100644 (file)
@@ -41,7 +41,7 @@ static void h1940bt_enable(int on)
                mdelay(10);
                gpio_set_value(S3C2410_GPH(1), 0);
 
-               h1940_led_blink_set(-EINVAL, GPIO_LED_BLINK, NULL, NULL);
+               h1940_led_blink_set(NULL, GPIO_LED_BLINK, NULL, NULL);
        }
        else {
                gpio_set_value(S3C2410_GPH(1), 1);
@@ -50,7 +50,7 @@ static void h1940bt_enable(int on)
                mdelay(10);
                gpio_set_value(H1940_LATCH_BLUETOOTH_POWER, 0);
 
-               h1940_led_blink_set(-EINVAL, GPIO_LED_NO_BLINK_LOW, NULL, NULL);
+               h1940_led_blink_set(NULL, GPIO_LED_NO_BLINK_LOW, NULL, NULL);
        }
 }
 
index 2950cc466840c195f6ec57a87ca10fc172a309fe..596d9f64c5b67e080d137004c9d85c70d31f5414 100644 (file)
 #define H1940_SUSPEND_RESUMEAT         (0x30081000)
 #define H1940_SUSPEND_CHECK            (0x30080000)
 
+struct gpio_desc;
+
 extern void h1940_pm_return(void);
-extern int h1940_led_blink_set(unsigned gpio, int state,
+extern int h1940_led_blink_set(struct gpio_desc *desc, int state,
                               unsigned long *delay_on,
                               unsigned long *delay_off);
 
index d35ddc1d99916ff5bd078b377fedb16765118cce..d40d4f5244c6835e4e73205b9e91a20d55613c03 100644 (file)
@@ -359,10 +359,11 @@ static struct platform_device h1940_battery = {
 
 static DEFINE_SPINLOCK(h1940_blink_spin);
 
-int h1940_led_blink_set(unsigned gpio, int state,
+int h1940_led_blink_set(struct gpio_desc *desc, int state,
        unsigned long *delay_on, unsigned long *delay_off)
 {
        int blink_gpio, check_gpio1, check_gpio2;
+       int gpio = desc ? desc_to_gpio(desc) : -EINVAL;
 
        switch (gpio) {
        case H1940_LATCH_LED_GREEN:
index c3f2682d0c62a6454e7de8800c3b665b967adc92..1d35ff375a01297726825ffdefd3d5253a852561 100644 (file)
@@ -250,9 +250,10 @@ static void rx1950_disable_charger(void)
 
 static DEFINE_SPINLOCK(rx1950_blink_spin);
 
-static int rx1950_led_blink_set(unsigned gpio, int state,
+static int rx1950_led_blink_set(struct gpio_desc *desc, int state,
        unsigned long *delay_on, unsigned long *delay_off)
 {
+       int gpio = desc_to_gpio(desc);
        int blink_gpio, check_gpio;
 
        switch (gpio) {
index b61a3bcc2fa83bb028933edc80d934e5d1222386..b357053f40d9b89f8afbfdc41af6052529c49d14 100644 (file)
@@ -306,9 +306,10 @@ EXPORT_SYMBOL(orion_gpio_set_blink);
 
 #define ORION_BLINK_HALF_PERIOD 100 /* ms */
 
-int orion_gpio_led_blink_set(unsigned gpio, int state,
+int orion_gpio_led_blink_set(struct gpio_desc *desc, int state,
        unsigned long *delay_on, unsigned long *delay_off)
 {
+       unsigned gpio = desc_to_gpio(desc);
 
        if (delay_on && delay_off && !*delay_on && !*delay_off)
                *delay_on = *delay_off = ORION_BLINK_HALF_PERIOD;
index e763988b04b9cbd216d22e74a8854b598719b257..e856b073a9c82520557feed0771b329fbac3efe7 100644 (file)
 #include <linux/init.h>
 #include <linux/types.h>
 #include <linux/irqdomain.h>
+
+struct gpio_desc;
+
 /*
  * Orion-specific GPIO API extensions.
  */
 void orion_gpio_set_unused(unsigned pin);
 void orion_gpio_set_blink(unsigned pin, int blink);
-int orion_gpio_led_blink_set(unsigned gpio, int state,
+int orion_gpio_led_blink_set(struct gpio_desc *desc, int state,
        unsigned long *delay_on, unsigned long *delay_off);
 
 #define GPIO_INPUT_OK          (1 << 0)
index edd370dbb22fb01ad6ce616014d4509ac4d0678f..ba4698c32bb04bde6e8ac3b1a433cde84cbeec7d 100644 (file)
@@ -28,7 +28,7 @@ struct gpio_led_data {
        u8 new_level;
        u8 can_sleep;
        u8 blinking;
-       int (*platform_gpio_blink_set)(unsigned gpio, int state,
+       int (*platform_gpio_blink_set)(struct gpio_desc *desc, int state,
                        unsigned long *delay_on, unsigned long *delay_off);
 };
 
@@ -38,13 +38,8 @@ static void gpio_led_work(struct work_struct *work)
                container_of(work, struct gpio_led_data, work);
 
        if (led_dat->blinking) {
-               int gpio = desc_to_gpio(led_dat->gpiod);
-               int level = led_dat->new_level;
-
-               if (gpiod_is_active_low(led_dat->gpiod))
-                       level = !level;
-
-               led_dat->platform_gpio_blink_set(gpio, level, NULL, NULL);
+               led_dat->platform_gpio_blink_set(led_dat->gpiod,
+                                       led_dat->new_level, NULL, NULL);
                led_dat->blinking = 0;
        } else
                gpiod_set_value_cansleep(led_dat->gpiod, led_dat->new_level);
@@ -71,13 +66,8 @@ static void gpio_led_set(struct led_classdev *led_cdev,
                schedule_work(&led_dat->work);
        } else {
                if (led_dat->blinking) {
-                       int gpio = desc_to_gpio(led_dat->gpiod);
-
-                       if (gpiod_is_active_low(led_dat->gpiod))
-                               level = !level;
-
-                       led_dat->platform_gpio_blink_set(gpio, level, NULL,
-                                                        NULL);
+                       led_dat->platform_gpio_blink_set(led_dat->gpiod, level,
+                                                        NULL, NULL);
                        led_dat->blinking = 0;
                } else
                        gpiod_set_value(led_dat->gpiod, level);
@@ -89,20 +79,25 @@ static int gpio_blink_set(struct led_classdev *led_cdev,
 {
        struct gpio_led_data *led_dat =
                container_of(led_cdev, struct gpio_led_data, cdev);
-       int gpio = desc_to_gpio(led_dat->gpiod);
 
        led_dat->blinking = 1;
-       return led_dat->platform_gpio_blink_set(gpio, GPIO_LED_BLINK,
+       return led_dat->platform_gpio_blink_set(led_dat->gpiod, GPIO_LED_BLINK,
                                                delay_on, delay_off);
 }
 
 static int create_gpio_led(const struct gpio_led *template,
        struct gpio_led_data *led_dat, struct device *parent,
-       int (*blink_set)(unsigned, int, unsigned long *, unsigned long *))
+       int (*blink_set)(struct gpio_desc *, int, unsigned long *,
+                        unsigned long *))
 {
        int ret, state;
 
        if (!template->gpiod) {
+               /*
+                * This is the legacy code path for platform code that
+                * still uses GPIO numbers. Ultimately we would like to get
+                * rid of this block completely.
+                */
                unsigned long flags = 0;
 
                /* skip leds that aren't available */
index f3af5c4d90844ef1a2b20a63c55cdfc7cf836acc..361101fef270aecc0488a9efd8c33636950c0616 100644 (file)
@@ -274,7 +274,7 @@ struct gpio_led_platform_data {
 #define GPIO_LED_NO_BLINK_LOW  0       /* No blink GPIO state low */
 #define GPIO_LED_NO_BLINK_HIGH 1       /* No blink GPIO state high */
 #define GPIO_LED_BLINK         2       /* Please, blink */
-       int             (*gpio_blink_set)(unsigned gpio, int state,
+       int             (*gpio_blink_set)(struct gpio_desc *desc, int state,
                                        unsigned long *delay_on,
                                        unsigned long *delay_off);
 };