Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 30dae2f9 authored by Sebastian Reichel's avatar Sebastian Reichel Committed by Bryan Wu
Browse files

leds: lp55xx: handle enable pin in driver



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: default avatarSebastian Reichel <sre@debian.org>
Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Acked-by: default avatarTony Lindgren <tony@atomide.com>
Signed-off-by: default avatarBryan Wu <cooloney@gmail.com>
parent b0bb83df
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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
+1 −19
Original line number Diff line number Diff line
@@ -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

+2 −0
Original line number Diff line number Diff line
@@ -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 */
+13 −12
Original line number Diff line number Diff line
@@ -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);

+2 −4
Original line number Diff line number Diff line
@@ -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;