Skip to content

Commit

Permalink
leds: lp55xx: handle enable pin in driver
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Sebastian Reichel authored and Bryan Wu committed Oct 25, 2013
1 parent b0bb83d commit 30dae2f
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 35 deletions.
1 change: 1 addition & 0 deletions Documentation/devicetree/bindings/leds/leds-lp55xx.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
20 changes: 1 addition & 19 deletions arch/arm/mach-omap2/board-rx51-peripherals.c
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 2 additions & 0 deletions arch/arm/mach-ux500/board-mop500.c
Original file line number Diff line number Diff line change
Expand Up @@ -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[] = {
Expand All @@ -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 */
Expand Down
25 changes: 13 additions & 12 deletions drivers/leds/leds-lp55xx-common.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -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. */
}

Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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);

Expand Down
6 changes: 2 additions & 4 deletions include/linux/platform_data/leds-lp55xx.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 30dae2f

Please sign in to comment.