leds: lp55xx: handle enable pin in driver
authorSebastian Reichel <sre@debian.org>
Tue, 22 Oct 2013 18:02:56 +0000 (11:02 -0700)
committerBryan Wu <cooloney@gmail.com>
Fri, 25 Oct 2013 17:13:25 +0000 (10:13 -0700)
This patch moves the handling of the chip's enable pin from the board
code into the driver. It also updates all board-code files using the
driver to incorporate this change.

This is needed for device tree support of the enable pin.

Signed-off-by: Sebastian Reichel <sre@debian.org>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Acked-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Bryan Wu <cooloney@gmail.com>
Documentation/devicetree/bindings/leds/leds-lp55xx.txt
arch/arm/mach-omap2/board-rx51-peripherals.c
arch/arm/mach-ux500/board-mop500.c
drivers/leds/leds-lp55xx-common.c
include/linux/platform_data/leds-lp55xx.h

index d221e75d90fa86ebbfdb562e33180e390f58ae35..c55b8c016a9e2bc55490efb3228a285a129725fc 100644 (file)
@@ -10,6 +10,7 @@ Each child has own specific current settings
 - max-cur: Maximun current at each led channel.
 
 Optional properties:
+- enable-gpio: GPIO attached to the chip's enable pin
 - label: Used for naming LEDs
 - pwr-sel: LP8501 specific property. Power selection for output channels.
          0: D1~9 are connected to VDD
index f6fe388af9895ef8c8b2859f9177a146a30fb965..68dc998fa34b9c91298d2617742a55b157f8afcb 100644 (file)
@@ -211,29 +211,11 @@ static struct lp55xx_led_config rx51_lp5523_led_config[] = {
        }
 };
 
-static int rx51_lp5523_setup(void)
-{
-       return gpio_request_one(RX51_LP5523_CHIP_EN_GPIO, GPIOF_DIR_OUT,
-                       "lp5523_enable");
-}
-
-static void rx51_lp5523_release(void)
-{
-       gpio_free(RX51_LP5523_CHIP_EN_GPIO);
-}
-
-static void rx51_lp5523_enable(bool state)
-{
-       gpio_set_value(RX51_LP5523_CHIP_EN_GPIO, !!state);
-}
-
 static struct lp55xx_platform_data rx51_lp5523_platform_data = {
        .led_config             = rx51_lp5523_led_config,
        .num_channels           = ARRAY_SIZE(rx51_lp5523_led_config),
        .clock_mode             = LP55XX_CLOCK_AUTO,
-       .setup_resources        = rx51_lp5523_setup,
-       .release_resources      = rx51_lp5523_release,
-       .enable                 = rx51_lp5523_enable,
+       .enable_gpio            = RX51_LP5523_CHIP_EN_GPIO,
 };
 #endif
 
index ad0806eff7624da302513909ab41a3af400ed820..703dec2b7d8da8013543f5faf868f0d308eefda9 100644 (file)
@@ -297,6 +297,7 @@ static struct lp55xx_platform_data __initdata lp5521_pri_data = {
        .led_config     = &lp5521_pri_led[0],
        .num_channels   = 3,
        .clock_mode     = LP55XX_CLOCK_EXT,
+       .enable_gpio    = -1,
 };
 
 static struct lp55xx_led_config lp5521_sec_led[] = {
@@ -322,6 +323,7 @@ static struct lp55xx_platform_data __initdata lp5521_sec_data = {
        .led_config     = &lp5521_sec_led[0],
        .num_channels   = 3,
        .clock_mode     = LP55XX_CLOCK_EXT,
+       .enable_gpio    = -1,
 };
 
 /* I2C0 devices only available on the first HREF/MOP500 */
index 075acf5b9fab7ba668c3d88f236730c209835ae6..9acc6bb7deef01f153e5c71044ac93be7e983ba9 100644 (file)
@@ -20,6 +20,8 @@
 #include <linux/module.h>
 #include <linux/platform_data/leds-lp55xx.h>
 #include <linux/slab.h>
+#include <linux/gpio.h>
+#include <linux/of_gpio.h>
 
 #include "leds-lp55xx-common.h"
 
@@ -407,18 +409,18 @@ int lp55xx_init_device(struct lp55xx_chip *chip)
        if (!pdata || !cfg)
                return -EINVAL;
 
-       if (pdata->setup_resources) {
-               ret = pdata->setup_resources();
+       if (gpio_is_valid(pdata->enable_gpio)) {
+               ret = devm_gpio_request_one(dev, pdata->enable_gpio,
+                                           GPIOF_DIR_OUT, "lp5523_enable");
                if (ret < 0) {
-                       dev_err(dev, "setup resoure err: %d\n", ret);
+                       dev_err(dev, "could not acquire enable gpio (err=%d)\n",
+                               ret);
                        goto err;
                }
-       }
 
-       if (pdata->enable) {
-               pdata->enable(0);
+               gpio_set_value(pdata->enable_gpio, 0);
                usleep_range(1000, 2000); /* Keep enable down at least 1ms */
-               pdata->enable(1);
+               gpio_set_value(pdata->enable_gpio, 1);
                usleep_range(1000, 2000); /* 500us abs min. */
        }
 
@@ -459,11 +461,8 @@ void lp55xx_deinit_device(struct lp55xx_chip *chip)
        if (chip->clk)
                clk_disable_unprepare(chip->clk);
 
-       if (pdata->enable)
-               pdata->enable(0);
-
-       if (pdata->release_resources)
-               pdata->release_resources();
+       if (gpio_is_valid(pdata->enable_gpio))
+               gpio_set_value(pdata->enable_gpio, 0);
 }
 EXPORT_SYMBOL_GPL(lp55xx_deinit_device);
 
@@ -596,6 +595,8 @@ int lp55xx_of_populate_pdata(struct device *dev, struct device_node *np)
        of_property_read_string(np, "label", &pdata->label);
        of_property_read_u8(np, "clock-mode", &pdata->clock_mode);
 
+       pdata->enable_gpio = of_get_named_gpio(np, "enable-gpio", 0);
+
        /* LP8501 specific */
        of_property_read_u8(np, "pwr-sel", (u8 *)&pdata->pwr_sel);
 
index c32de4dcec54d12daabf5cb46c7971baeb8d335c..624ff9edad6f1f60914bb0d844d6a6af2ab0f9f8 100644 (file)
@@ -67,10 +67,8 @@ struct lp55xx_platform_data {
        /* Clock configuration */
        u8 clock_mode;
 
-       /* Platform specific functions */
-       int (*setup_resources)(void);
-       void (*release_resources)(void);
-       void (*enable)(bool state);
+       /* optional enable GPIO */
+       int enable_gpio;
 
        /* Predefined pattern data */
        struct lp55xx_predef_pattern *patterns;