Commit c7a6ced9 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds

Pull LED subsystem update from Bryan Wu.

* 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds: (24 commits)
  leds: add output driver configuration for pca9633 led driver
  leds: lm3642: Use regmap_update_bits() in lm3642_chip_init()
  leds: Add new LED driver for lm3642 chips
  leds-lp5523: Fix riskiness of the page fault
  leds-lp5523: turn off the LED engines on unloading the driver
  leds-lm3530: Fix smatch warnings
  leds-lm3530: Use devm_regulator_get function
  leds: leds-gpio: adopt pinctrl support
  leds: Add new LED driver for lm355x chips
  leds-lp5523: use the i2c device id rather than fixed name
  leds-lp5523: add new device id for LP55231
  leds-lp5523: support new LP55231 device
  leds: triggers: send uevent when changing triggers
  leds-lp5523: minor code style fixes
  leds-lp5523: change the return type of lp5523_set_mode()
  leds-lp5523: set the brightness to 0 forcely on removing the driver
  leds-lp5523: add channel name in the platform data
  leds: leds-gpio: Use of_get_child_count() helper
  leds: leds-gpio: Use platform_{get,set}_drvdata
  leds: leds-gpio: use of_match_ptr()
  ...
parents a188e7e9 2f73c392
...@@ -10,8 +10,22 @@ Contact: Samu Onkalo (samu.p.onkalo-at-nokia.com) ...@@ -10,8 +10,22 @@ Contact: Samu Onkalo (samu.p.onkalo-at-nokia.com)
Description Description
----------- -----------
LP5523 can drive up to 9 channels. Leds can be controlled directly via LP5523 can drive up to 9 channels. Leds can be controlled directly via
the led class control interface. Channels have generic names: the led class control interface.
lp5523:channelx where x is 0...8 The name of each channel is configurable in the platform data - name and label.
There are three options to make the channel name.
a) Define the 'name' in the platform data
To make specific channel name, then use 'name' platform data.
/sys/class/leds/R1 (name: 'R1')
/sys/class/leds/B1 (name: 'B1')
b) Use the 'label' with no 'name' field
For one device name with channel number, then use 'label'.
/sys/class/leds/RGB:channelN (label: 'RGB', N: 0 ~ 8)
c) Default
If both fields are NULL, 'lp5523' is used by default.
/sys/class/leds/lp5523:channelN (N: 0 ~ 8)
The chip provides 3 engines. Each engine can control channels without The chip provides 3 engines. Each engine can control channels without
interaction from the main CPU. Details of the micro engine code can be found interaction from the main CPU. Details of the micro engine code can be found
...@@ -46,12 +60,13 @@ Note - chan_nr can have values between 0 and 8. ...@@ -46,12 +60,13 @@ Note - chan_nr can have values between 0 and 8.
static struct lp5523_led_config lp5523_led_config[] = { static struct lp5523_led_config lp5523_led_config[] = {
{ {
.name = "D1",
.chan_nr = 0, .chan_nr = 0,
.led_current = 50, .led_current = 50,
.max_current = 130, .max_current = 130,
}, },
... ...
}, { {
.chan_nr = 8, .chan_nr = 8,
.led_current = 50, .led_current = 50,
.max_current = 130, .max_current = 130,
......
...@@ -63,6 +63,17 @@ config LEDS_LM3533 ...@@ -63,6 +63,17 @@ config LEDS_LM3533
hardware-accelerated blinking with maximum on and off periods of 9.8 hardware-accelerated blinking with maximum on and off periods of 9.8
and 77 seconds respectively. and 77 seconds respectively.
config LEDS_LM3642
tristate "LED support for LM3642 Chip"
depends on LEDS_CLASS && I2C
select REGMAP_I2C
help
This option enables support for LEDs connected to LM3642.
The LM3642 is a 4MHz fixed-frequency synchronous boost
converter plus 1.5A constant current driver for a high-current
white LED.
config LEDS_LOCOMO config LEDS_LOCOMO
tristate "LED Support for Locomo device" tristate "LED Support for Locomo device"
depends on LEDS_CLASS depends on LEDS_CLASS
...@@ -192,11 +203,12 @@ config LEDS_LP5521 ...@@ -192,11 +203,12 @@ config LEDS_LP5521
programming the engines. programming the engines.
config LEDS_LP5523 config LEDS_LP5523
tristate "LED Support for N.S. LP5523 LED driver chip" tristate "LED Support for TI/National LP5523/55231 LED driver chip"
depends on LEDS_CLASS && I2C depends on LEDS_CLASS && I2C
help help
If you say yes here you get support for the National Semiconductor If you say yes here you get support for TI/National Semiconductor
LP5523 LED driver. It is 9 channel chip with programmable engines. LP5523/55231 LED driver.
It is 9 channel chip with programmable engines.
Driver provides direct control via LED class and interface for Driver provides direct control via LED class and interface for
programming the engines. programming the engines.
...@@ -422,13 +434,13 @@ config LEDS_MAX8997 ...@@ -422,13 +434,13 @@ config LEDS_MAX8997
This option enables support for on-chip LED drivers on This option enables support for on-chip LED drivers on
MAXIM MAX8997 PMIC. MAXIM MAX8997 PMIC.
config LEDS_LM3556 config LEDS_LM355x
tristate "LED support for LM3556 Chip" tristate "LED support for LM355x Chips, LM3554 and LM3556"
depends on LEDS_CLASS && I2C depends on LEDS_CLASS && I2C
select REGMAP_I2C select REGMAP_I2C
help help
This option enables support for LEDs connected to LM3556. This option enables support for LEDs connected to LM355x.
LM3556 includes Torch, Flash and Indicator functions. LM355x includes Torch, Flash and Indicator functions.
config LEDS_OT200 config LEDS_OT200
tristate "LED support for the Bachmann OT200" tristate "LED support for the Bachmann OT200"
......
...@@ -11,6 +11,7 @@ obj-$(CONFIG_LEDS_BD2802) += leds-bd2802.o ...@@ -11,6 +11,7 @@ obj-$(CONFIG_LEDS_BD2802) += leds-bd2802.o
obj-$(CONFIG_LEDS_LOCOMO) += leds-locomo.o obj-$(CONFIG_LEDS_LOCOMO) += leds-locomo.o
obj-$(CONFIG_LEDS_LM3530) += leds-lm3530.o obj-$(CONFIG_LEDS_LM3530) += leds-lm3530.o
obj-$(CONFIG_LEDS_LM3533) += leds-lm3533.o obj-$(CONFIG_LEDS_LM3533) += leds-lm3533.o
obj-$(CONFIG_LEDS_LM3642) += leds-lm3642.o
obj-$(CONFIG_LEDS_MIKROTIK_RB532) += leds-rb532.o obj-$(CONFIG_LEDS_MIKROTIK_RB532) += leds-rb532.o
obj-$(CONFIG_LEDS_S3C24XX) += leds-s3c24xx.o obj-$(CONFIG_LEDS_S3C24XX) += leds-s3c24xx.o
obj-$(CONFIG_LEDS_NET48XX) += leds-net48xx.o obj-$(CONFIG_LEDS_NET48XX) += leds-net48xx.o
...@@ -48,7 +49,7 @@ obj-$(CONFIG_LEDS_NETXBIG) += leds-netxbig.o ...@@ -48,7 +49,7 @@ obj-$(CONFIG_LEDS_NETXBIG) += leds-netxbig.o
obj-$(CONFIG_LEDS_ASIC3) += leds-asic3.o obj-$(CONFIG_LEDS_ASIC3) += leds-asic3.o
obj-$(CONFIG_LEDS_RENESAS_TPU) += leds-renesas-tpu.o obj-$(CONFIG_LEDS_RENESAS_TPU) += leds-renesas-tpu.o
obj-$(CONFIG_LEDS_MAX8997) += leds-max8997.o obj-$(CONFIG_LEDS_MAX8997) += leds-max8997.o
obj-$(CONFIG_LEDS_LM3556) += leds-lm3556.o obj-$(CONFIG_LEDS_LM355x) += leds-lm355x.o
obj-$(CONFIG_LEDS_BLINKM) += leds-blinkm.o obj-$(CONFIG_LEDS_BLINKM) += leds-blinkm.o
# LED SPI Drivers # LED SPI Drivers
......
...@@ -124,6 +124,16 @@ static void led_timer_function(unsigned long data) ...@@ -124,6 +124,16 @@ static void led_timer_function(unsigned long data)
mod_timer(&led_cdev->blink_timer, jiffies + msecs_to_jiffies(delay)); mod_timer(&led_cdev->blink_timer, jiffies + msecs_to_jiffies(delay));
} }
static void set_brightness_delayed(struct work_struct *ws)
{
struct led_classdev *led_cdev =
container_of(ws, struct led_classdev, set_brightness_work);
led_stop_software_blink(led_cdev);
__led_set_brightness(led_cdev, led_cdev->delayed_set_value);
}
/** /**
* led_classdev_suspend - suspend an led_classdev. * led_classdev_suspend - suspend an led_classdev.
* @led_cdev: the led_classdev to suspend. * @led_cdev: the led_classdev to suspend.
...@@ -191,6 +201,8 @@ int led_classdev_register(struct device *parent, struct led_classdev *led_cdev) ...@@ -191,6 +201,8 @@ int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)
led_update_brightness(led_cdev); led_update_brightness(led_cdev);
INIT_WORK(&led_cdev->set_brightness_work, set_brightness_delayed);
init_timer(&led_cdev->blink_timer); init_timer(&led_cdev->blink_timer);
led_cdev->blink_timer.function = led_timer_function; led_cdev->blink_timer.function = led_timer_function;
led_cdev->blink_timer.data = (unsigned long)led_cdev; led_cdev->blink_timer.data = (unsigned long)led_cdev;
...@@ -221,7 +233,10 @@ void led_classdev_unregister(struct led_classdev *led_cdev) ...@@ -221,7 +233,10 @@ void led_classdev_unregister(struct led_classdev *led_cdev)
up_write(&led_cdev->trigger_lock); up_write(&led_cdev->trigger_lock);
#endif #endif
cancel_work_sync(&led_cdev->set_brightness_work);
/* Stop blinking */ /* Stop blinking */
led_stop_software_blink(led_cdev);
led_set_brightness(led_cdev, LED_OFF); led_set_brightness(led_cdev, LED_OFF);
device_unregister(led_cdev->dev); device_unregister(led_cdev->dev);
......
...@@ -103,13 +103,23 @@ void led_blink_set_oneshot(struct led_classdev *led_cdev, ...@@ -103,13 +103,23 @@ void led_blink_set_oneshot(struct led_classdev *led_cdev,
} }
EXPORT_SYMBOL(led_blink_set_oneshot); EXPORT_SYMBOL(led_blink_set_oneshot);
void led_set_brightness(struct led_classdev *led_cdev, void led_stop_software_blink(struct led_classdev *led_cdev)
enum led_brightness brightness)
{ {
/* stop and clear soft-blink timer */
del_timer_sync(&led_cdev->blink_timer); del_timer_sync(&led_cdev->blink_timer);
led_cdev->blink_delay_on = 0; led_cdev->blink_delay_on = 0;
led_cdev->blink_delay_off = 0; led_cdev->blink_delay_off = 0;
}
EXPORT_SYMBOL_GPL(led_stop_software_blink);
void led_set_brightness(struct led_classdev *led_cdev,
enum led_brightness brightness)
{
/* delay brightness setting if need to stop soft-blink timer */
if (led_cdev->blink_delay_on || led_cdev->blink_delay_off) {
led_cdev->delayed_set_value = brightness;
schedule_work(&led_cdev->set_brightness_work);
return;
}
__led_set_brightness(led_cdev, brightness); __led_set_brightness(led_cdev, brightness);
} }
......
...@@ -102,6 +102,12 @@ EXPORT_SYMBOL_GPL(led_trigger_show); ...@@ -102,6 +102,12 @@ EXPORT_SYMBOL_GPL(led_trigger_show);
void led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trig) void led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trig)
{ {
unsigned long flags; unsigned long flags;
char *event = NULL;
char *envp[2];
const char *name;
name = trig ? trig->name : "none";
event = kasprintf(GFP_KERNEL, "TRIGGER=%s", name);
/* Remove any existing trigger */ /* Remove any existing trigger */
if (led_cdev->trigger) { if (led_cdev->trigger) {
...@@ -109,6 +115,8 @@ void led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trig) ...@@ -109,6 +115,8 @@ void led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trig)
list_del(&led_cdev->trig_list); list_del(&led_cdev->trig_list);
write_unlock_irqrestore(&led_cdev->trigger->leddev_list_lock, write_unlock_irqrestore(&led_cdev->trigger->leddev_list_lock,
flags); flags);
cancel_work_sync(&led_cdev->set_brightness_work);
led_stop_software_blink(led_cdev);
if (led_cdev->trigger->deactivate) if (led_cdev->trigger->deactivate)
led_cdev->trigger->deactivate(led_cdev); led_cdev->trigger->deactivate(led_cdev);
led_cdev->trigger = NULL; led_cdev->trigger = NULL;
...@@ -122,6 +130,13 @@ void led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trig) ...@@ -122,6 +130,13 @@ void led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trig)
if (trig->activate) if (trig->activate)
trig->activate(led_cdev); trig->activate(led_cdev);
} }
if (event) {
envp[0] = event;
envp[1] = NULL;
kobject_uevent_env(&led_cdev->dev->kobj, KOBJ_CHANGE, envp);
kfree(event);
}
} }
EXPORT_SYMBOL_GPL(led_trigger_set); EXPORT_SYMBOL_GPL(led_trigger_set);
...@@ -224,7 +239,7 @@ void led_trigger_event(struct led_trigger *trig, ...@@ -224,7 +239,7 @@ void led_trigger_event(struct led_trigger *trig,
struct led_classdev *led_cdev; struct led_classdev *led_cdev;
led_cdev = list_entry(entry, struct led_classdev, trig_list); led_cdev = list_entry(entry, struct led_classdev, trig_list);
__led_set_brightness(led_cdev, brightness); led_set_brightness(led_cdev, brightness);
} }
read_unlock(&trig->leddev_list_lock); read_unlock(&trig->leddev_list_lock);
} }
......
...@@ -31,7 +31,7 @@ static int __init clevo_mail_led_dmi_callback(const struct dmi_system_id *id) ...@@ -31,7 +31,7 @@ static int __init clevo_mail_led_dmi_callback(const struct dmi_system_id *id)
} }
/* /*
* struct mail_led_whitelist - List of known good models * struct clevo_mail_led_dmi_table - List of known good models
* *
* Contains the known good models this driver is compatible with. * Contains the known good models this driver is compatible with.
* When adding a new model try to be as strict as possible. This * When adding a new model try to be as strict as possible. This
...@@ -39,7 +39,7 @@ static int __init clevo_mail_led_dmi_callback(const struct dmi_system_id *id) ...@@ -39,7 +39,7 @@ static int __init clevo_mail_led_dmi_callback(const struct dmi_system_id *id)
* detected as working, but in reality it is not) as low as * detected as working, but in reality it is not) as low as
* possible. * possible.
*/ */
static struct dmi_system_id __initdata mail_led_whitelist[] = { static struct dmi_system_id __initdata clevo_mail_led_dmi_table[] = {
{ {
.callback = clevo_mail_led_dmi_callback, .callback = clevo_mail_led_dmi_callback,
.ident = "Clevo D410J", .ident = "Clevo D410J",
...@@ -59,11 +59,10 @@ static struct dmi_system_id __initdata mail_led_whitelist[] = { ...@@ -59,11 +59,10 @@ static struct dmi_system_id __initdata mail_led_whitelist[] = {
}, },
{ {
.callback = clevo_mail_led_dmi_callback, .callback = clevo_mail_led_dmi_callback,
.ident = "Positivo Mobile", .ident = "Clevo M5x0V",
.matches = { .matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "CLEVO Co. "), DMI_MATCH(DMI_BOARD_VENDOR, "CLEVO Co. "),
DMI_MATCH(DMI_BOARD_NAME, "M5X0V "), DMI_MATCH(DMI_BOARD_NAME, "M5X0V "),
DMI_MATCH(DMI_PRODUCT_NAME, "Positivo Mobile"),
DMI_MATCH(DMI_PRODUCT_VERSION, "VT6198") DMI_MATCH(DMI_PRODUCT_VERSION, "VT6198")
} }
}, },
...@@ -89,6 +88,7 @@ static struct dmi_system_id __initdata mail_led_whitelist[] = { ...@@ -89,6 +88,7 @@ static struct dmi_system_id __initdata mail_led_whitelist[] = {
}, },
{ } { }
}; };
MODULE_DEVICE_TABLE(dmi, clevo_mail_led_dmi_table);
static void clevo_mail_led_set(struct led_classdev *led_cdev, static void clevo_mail_led_set(struct led_classdev *led_cdev,
enum led_brightness value) enum led_brightness value)
...@@ -180,7 +180,7 @@ static int __init clevo_mail_led_init(void) ...@@ -180,7 +180,7 @@ static int __init clevo_mail_led_init(void)
/* Check with the help of DMI if we are running on supported hardware */ /* Check with the help of DMI if we are running on supported hardware */
if (!nodetect) { if (!nodetect) {
count = dmi_check_system(mail_led_whitelist); count = dmi_check_system(clevo_mail_led_dmi_table);
} else { } else {
count = 1; count = 1;
printk(KERN_ERR KBUILD_MODNAME ": Skipping DMI detection. " printk(KERN_ERR KBUILD_MODNAME ": Skipping DMI detection. "
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/pinctrl/consumer.h>
struct gpio_led_data { struct gpio_led_data {
struct led_classdev cdev; struct led_classdev cdev;
...@@ -170,11 +171,10 @@ static struct gpio_leds_priv * __devinit gpio_leds_create_of(struct platform_dev ...@@ -170,11 +171,10 @@ static struct gpio_leds_priv * __devinit gpio_leds_create_of(struct platform_dev
{ {
struct device_node *np = pdev->dev.of_node, *child; struct device_node *np = pdev->dev.of_node, *child;
struct gpio_leds_priv *priv; struct gpio_leds_priv *priv;
int count = 0, ret; int count, ret;
/* count LEDs in this device, so we know how much to allocate */ /* count LEDs in this device, so we know how much to allocate */
for_each_child_of_node(np, child) count = of_get_child_count(np);
count++;
if (!count) if (!count)
return NULL; return NULL;
...@@ -228,7 +228,6 @@ static struct gpio_leds_priv * __devinit gpio_leds_create_of(struct platform_dev ...@@ -228,7 +228,6 @@ static struct gpio_leds_priv * __devinit gpio_leds_create_of(struct platform_dev
{ {
return NULL; return NULL;
} }
#define of_gpio_leds_match NULL
#endif /* CONFIG_OF_GPIO */ #endif /* CONFIG_OF_GPIO */
...@@ -236,8 +235,14 @@ static int __devinit gpio_led_probe(struct platform_device *pdev) ...@@ -236,8 +235,14 @@ static int __devinit gpio_led_probe(struct platform_device *pdev)
{ {
struct gpio_led_platform_data *pdata = pdev->dev.platform_data; struct gpio_led_platform_data *pdata = pdev->dev.platform_data;
struct gpio_leds_priv *priv; struct gpio_leds_priv *priv;
struct pinctrl *pinctrl;
int i, ret = 0; int i, ret = 0;
pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
if (IS_ERR(pinctrl))
dev_warn(&pdev->dev,
"pins are not configured from the driver\n");
if (pdata && pdata->num_leds) { if (pdata && pdata->num_leds) {
priv = devm_kzalloc(&pdev->dev, priv = devm_kzalloc(&pdev->dev,
sizeof_gpio_leds_priv(pdata->num_leds), sizeof_gpio_leds_priv(pdata->num_leds),
...@@ -270,13 +275,13 @@ static int __devinit gpio_led_probe(struct platform_device *pdev) ...@@ -270,13 +275,13 @@ static int __devinit gpio_led_probe(struct platform_device *pdev)
static int __devexit gpio_led_remove(struct platform_device *pdev) static int __devexit gpio_led_remove(struct platform_device *pdev)
{ {
struct gpio_leds_priv *priv = dev_get_drvdata(&pdev->dev); struct gpio_leds_priv *priv = platform_get_drvdata(pdev);
int i; int i;
for (i = 0; i < priv->num_leds; i++) for (i = 0; i < priv->num_leds; i++)
delete_gpio_led(&priv->leds[i]); delete_gpio_led(&priv->leds[i]);
dev_set_drvdata(&pdev->dev, NULL); platform_set_drvdata(pdev, NULL);
return 0; return 0;
} }
...@@ -287,7 +292,7 @@ static struct platform_driver gpio_led_driver = { ...@@ -287,7 +292,7 @@ static struct platform_driver gpio_led_driver = {
.driver = { .driver = {
.name = "leds-gpio", .name = "leds-gpio",
.owner = THIS_MODULE, .owner = THIS_MODULE,
.of_match_table = of_gpio_leds_match, .of_match_table = of_match_ptr(of_gpio_leds_match),
}, },
}; };
......
...@@ -150,7 +150,7 @@ static int lm3530_get_mode_from_str(const char *str) ...@@ -150,7 +150,7 @@ static int lm3530_get_mode_from_str(const char *str)
if (sysfs_streq(str, mode_map[i].mode)) if (sysfs_streq(str, mode_map[i].mode))
return mode_map[i].mode_val; return mode_map[i].mode_val;
return -1; return -EINVAL;
} }
static void lm3530_als_configure(struct lm3530_platform_data *pdata, static void lm3530_als_configure(struct lm3530_platform_data *pdata,
...@@ -358,7 +358,7 @@ static ssize_t lm3530_mode_set(struct device *dev, struct device_attribute ...@@ -358,7 +358,7 @@ static ssize_t lm3530_mode_set(struct device *dev, struct device_attribute
mode = lm3530_get_mode_from_str(buf); mode = lm3530_get_mode_from_str(buf);
if (mode < 0) { if (mode < 0) {
dev_err(dev, "Invalid mode\n"); dev_err(dev, "Invalid mode\n");
return -EINVAL; return mode;
} }
drvdata->mode = mode; drvdata->mode = mode;
...@@ -416,7 +416,7 @@ static int __devinit lm3530_probe(struct i2c_client *client, ...@@ -416,7 +416,7 @@ static int __devinit lm3530_probe(struct i2c_client *client,
i2c_set_clientdata(client, drvdata); i2c_set_clientdata(client, drvdata);
drvdata->regulator = regulator_get(&client->dev, "vin"); drvdata->regulator = devm_regulator_get(&client->dev, "vin");
if (IS_ERR(drvdata->regulator)) { if (IS_ERR(drvdata->regulator)) {
dev_err(&client->dev, "regulator get failed\n"); dev_err(&client->dev, "regulator get failed\n");
err = PTR_ERR(drvdata->regulator); err = PTR_ERR(drvdata->regulator);
...@@ -429,15 +429,13 @@ static int __devinit lm3530_probe(struct i2c_client *client, ...@@ -429,15 +429,13 @@ static int __devinit lm3530_probe(struct i2c_client *client,
if (err < 0) { if (err < 0) {
dev_err(&client->dev, dev_err(&client->dev,
"Register Init failed: %d\n", err); "Register Init failed: %d\n", err);
err = -ENODEV; return err;
goto err_reg_init;
} }
} }
err = led_classdev_register(&client->dev, &drvdata->led_dev); err = led_classdev_register(&client->dev, &drvdata->led_dev);
if (err < 0) { if (err < 0) {
dev_err(&client->dev, "Register led class failed: %d\n", err); dev_err(&client->dev, "Register led class failed: %d\n", err);
err = -ENODEV; return err;
goto err_class_register;
} }
err = device_create_file(drvdata->led_dev.dev, &dev_attr_mode); err = device_create_file(drvdata->led_dev.dev, &dev_attr_mode);
...@@ -451,9 +449,6 @@ static int __devinit lm3530_probe(struct i2c_client *client, ...@@ -451,9 +449,6 @@ static int __devinit lm3530_probe(struct i2c_client *client,
err_create_file: err_create_file:
led_classdev_unregister(&drvdata->led_dev); led_classdev_unregister(&drvdata->led_dev);
err_class_register:
err_reg_init:
regulator_put(drvdata->regulator);
return err; return err;
} }
...@@ -465,7 +460,6 @@ static int __devexit lm3530_remove(struct i2c_client *client) ...@@ -465,7 +460,6 @@ static int __devexit lm3530_remove(struct i2c_client *client)
if (drvdata->enable) if (drvdata->enable)
regulator_disable(drvdata->regulator); regulator_disable(drvdata->regulator);
regulator_put(drvdata->regulator);
led_classdev_unregister(&drvdata->led_dev); led_classdev_unregister(&drvdata->led_dev);
return 0; return 0;
} }
......
This diff is collapsed.
...@@ -104,6 +104,11 @@ ...@@ -104,6 +104,11 @@
#define LED_ACTIVE(mux, led) (!!(mux & (0x0001 << led))) #define LED_ACTIVE(mux, led) (!!(mux & (0x0001 << led)))
#define SHIFT_MASK(id) (((id) - 1) * 2) #define SHIFT_MASK(id) (((id) - 1) * 2)
enum lp5523_chip_id {
LP5523,
LP55231,
};
struct lp5523_engine { struct lp5523_engine {
int id; int id;
u8 mode; u8 mode;
...@@ -150,7 +155,7 @@ static inline struct lp5523_chip *led_to_lp5523(struct lp5523_led *led) ...@@ -150,7 +155,7 @@ static inline struct lp5523_chip *led_to_lp5523(struct lp5523_led *led)
leds[led->id]); leds[led->id]);
} }
static int lp5523_set_mode(struct lp5523_engine *engine, u8 mode); static void lp5523_set_mode(struct lp5523_engine *engine, u8 mode);
static int lp5523_set_engine_mode(struct lp5523_engine *engine, u8 mode); static int lp5523_set_engine_mode(struct lp5523_engine *engine, u8 mode);
static int lp5523_load_program(struct lp5523_engine *engine, const u8 *pattern); static int lp5523_load_program(struct lp5523_engine *engine, const u8 *pattern);
...@@ -177,7 +182,7 @@ static int lp5523_detect(struct i2c_client *client) ...@@ -177,7 +182,7 @@ static int lp5523_detect(struct i2c_client *client)
int ret; int ret;
u8 buf; u8 buf;
ret = lp5523_write(client, LP5523_REG_ENABLE, 0x40); ret = lp5523_write(client, LP5523_REG_ENABLE, LP5523_ENABLE);
if (ret) if (ret)
return ret; return ret;
ret = lp5523_read(client, LP5523_REG_ENABLE, &buf); ret = lp5523_read(client, LP5523_REG_ENABLE, &buf);
...@@ -338,7 +343,8 @@ static int lp5523_mux_parse(const char *buf, u16 *mux, size_t len) ...@@ -338,7 +343,8 @@ static int lp5523_mux_parse(const char *buf, u16 *mux, size_t len)
{ {
int i; int i;
u16 tmp_mux = 0; u16 tmp_mux = 0;
len = len < LP5523_LEDS ? len : LP5523_LEDS;
len = min_t(int, len, LP5523_LEDS);
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
switch (buf[i]) { switch (buf[i]) {
case '1': case '1':
...@@ -546,6 +552,9 @@ static int lp5523_do_store_load(struct lp5523_engine *engine, ...@@ -546,6 +552,9 @@ static int lp5523_do_store_load(struct lp5523_engine *engine,
unsigned cmd; unsigned cmd;
u8 pattern[LP5523_PROGRAM_LENGTH] = {0}; u8 pattern[LP5523_PROGRAM_LENGTH] = {0};
if (engine->mode != LP5523_CMD_LOAD)
return -EINVAL;
while ((offset < len - 1) && (i < LP5523_PROGRAM_LENGTH)) { while ((offset < len - 1) && (i < LP5523_PROGRAM_LENGTH)) {
/* separate sscanfs because length is working only for %s */ /* separate sscanfs because length is working only for %s */
ret = sscanf(buf + offset, "%2s%n ", c, &nrchars); ret = sscanf(buf + offset, "%2s%n ", c, &nrchars);
...@@ -563,12 +572,7 @@ static int lp5523_do_store_load(struct lp5523_engine *engine, ...@@ -563,12 +572,7 @@ static int lp5523_do_store_load(struct lp5523_engine *engine,
goto fail; goto fail;
mutex_lock(&chip->lock); mutex_lock(&chip->lock);
ret = lp5523_load_program(engine, pattern);
if (engine->mode == LP5523_CMD_LOAD)
ret = lp5523_load_program(engine, pattern);
else
ret = -EINVAL;
mutex_unlock(&chip->lock); mutex_unlock(&chip->lock);
if (ret) { if (ret) {
...@@ -755,6 +759,7 @@ static struct attribute *lp5523_attributes[] = { ...@@ -755,6 +759,7 @@ static struct attribute *lp5523_attributes[] = {
&dev_attr_engine2_leds.attr, &dev_attr_engine2_leds.attr,
&dev_attr_engine3_load.attr, &dev_attr_engine3_load.attr,
&dev_attr_engine3_leds.attr, &dev_attr_engine3_leds.attr,
NULL,
}; };
static const struct attribute_group lp5523_group = { static const struct attribute_group lp5523_group = {
...@@ -789,26 +794,28 @@ static void lp5523_unregister_sysfs(struct i2c_client *client) ...@@ -789,26 +794,28 @@ static void lp5523_unregister_sysfs(struct i2c_client *client)
/*--------------------------------------------------------------*/ /*--------------------------------------------------------------*/
/* Set chip operating mode */ /* Set chip operating mode */
/*--------------------------------------------------------------*/ /*--------------------------------------------------------------*/
static int lp5523_set_mode(struct lp5523_engine *engine, u8 mode) static void lp5523_set_mode(struct lp5523_engine *engine, u8 mode)
{ {
int ret = 0;
/* if in that mode already do nothing, except for run */ /* if in that mode already do nothing, except for run */
if (mode == engine->mode && mode != LP5523_CMD_RUN) if (mode == engine->mode && mode != LP5523_CMD_RUN)
return 0; return;
if (mode == LP5523_CMD_RUN) { switch (mode) {
ret = lp5523_run_program(engine); case LP5523_CMD_RUN:
} else if (mode == LP5523_CMD_LOAD) { lp5523_run_program(engine);
break;
case LP5523_CMD_LOAD:
lp5523_set_engine_mode(engine, LP5523_CMD_DISABLED); lp5523_set_engine_mode(engine, LP5523_CMD_DISABLED);
lp5523_set_engine_mode(engine, LP5523_CMD_LOAD); lp5523_set_engine_mode(engine, LP5523_CMD_LOAD);
} else if (mode == LP5523_CMD_DISABLED) { break;
case LP5523_CMD_DISABLED:
lp5523_set_engine_mode(engine, LP5523_CMD_DISABLED); lp5523_set_engine_mode(engine, LP5523_CMD_DISABLED);
break;
default:
return;
} }
engine->mode = mode; engine->mode = mode;
return ret;
} }
/*--------------------------------------------------------------*/ /*--------------------------------------------------------------*/
...@@ -827,7 +834,8 @@ static int __init lp5523_init_engine(struct lp5523_engine *engine, int id) ...@@ -827,7 +834,8 @@ static int __init lp5523_init_engine(struct lp5523_engine *engine, int id)
} }
static int __devinit lp5523_init_led(struct lp5523_led *led, struct device *dev, static int __devinit lp5523_init_led(struct lp5523_led *led, struct device *dev,
int chan, struct lp5523_platform_data *pdata) int chan, struct lp5523_platform_data *pdata,
const char *chip_name)
{ {
char name[32]; char name[32];
int res; int res;
...@@ -846,10 +854,14 @@ static int __devinit lp5523_init_led(struct lp5523_led *led, struct device *dev, ...@@ -846,10 +854,14 @@ static int __devinit lp5523_init_led(struct lp5523_led *led, struct device *dev,
return -EINVAL; return -EINVAL;
} }
snprintf(name, sizeof(name), "%s:channel%d", if (pdata->led_config[chan].name) {
pdata->label ?: "lp5523", chan); led->cdev.name = pdata->led_config[chan].name;
} else {
snprintf(name, sizeof(name), "%s:channel%d",
pdata->label ? : chip_name, chan);
led->cdev.name = name;
}
led->cdev.name = name;
led->cdev.brightness_set = lp5523_set_brightness; led->cdev.brightness_set = lp5523_set_brightness;
res = led_classdev_register(dev, &led->cdev); res = led_classdev_register(dev, &led->cdev);
if (res < 0) { if (res < 0) {
...@@ -917,7 +929,7 @@ static int __devinit lp5523_probe(struct i2c_client *client, ...@@ -917,7 +929,7 @@ static int __devinit lp5523_probe(struct i2c_client *client,
if (ret) if (ret)
goto fail1; goto fail1;
dev_info(&client->dev, "LP5523 Programmable led chip found\n"); dev_info(&client->dev, "%s Programmable led chip found\n", id->name);
/* Initialize engines */ /* Initialize engines */
for (i = 0; i < ARRAY_SIZE(chip->engines); i++) { for (i = 0; i < ARRAY_SIZE(chip->engines); i++) {
...@@ -945,7 +957,8 @@ static int __devinit lp5523_probe(struct i2c_client *client, ...@@ -945,7 +957,8 @@ static int __devinit lp5523_probe(struct i2c_client *client,
INIT_WORK(&chip->leds[led].brightness_work, INIT_WORK(&chip->leds[led].brightness_work,
lp5523_led_brightness_work); lp5523_led_brightness_work);
ret = lp5523_init_led(&chip->leds[led], &client->dev, i, pdata); ret = lp5523_init_led(&chip->leds[led], &client->dev, i, pdata,
id->name);
if (ret) { if (ret) {
dev_err(&client->dev, "error initializing leds\n"); dev_err(&client->dev, "error initializing leds\n");
goto fail2; goto fail2;
...@@ -970,7 +983,7 @@ static int __devinit lp5523_probe(struct i2c_client *client, ...@@ -970,7 +983,7 @@ static int __devinit lp5523_probe(struct i2c_client *client,
fail2: fail2:
for (i = 0; i < chip->num_leds; i++) { for (i = 0; i < chip->num_leds; i++) {
led_classdev_unregister(&chip->leds[i].cdev); led_classdev_unregister(&chip->leds[i].cdev);
cancel_work_sync(&chip->leds[i].brightness_work); flush_work(&chip->leds[i].brightness_work);
} }
fail1: fail1:
if (pdata->enable) if (pdata->enable)
...@@ -985,11 +998,14 @@ static int lp5523_remove(struct i2c_client *client) ...@@ -985,11 +998,14 @@ static int lp5523_remove(struct i2c_client *client)
struct lp5523_chip *chip = i2c_get_clientdata(client); struct lp5523_chip *chip = i2c_get_clientdata(client);
int i; int i;
/* Disable engine mode */
lp5523_write(client, LP5523_REG_OP_MODE, LP5523_CMD_DISABLED);
lp5523_unregister_sysfs(client); lp5523_unregister_sysfs(client);
for (i = 0; i < chip->num_leds; i++) { for (i = 0; i < chip->num_leds; i++) {
led_classdev_unregister(&chip->leds[i].cdev); led_classdev_unregister(&chip->leds[i].cdev);
cancel_work_sync(&chip->leds[i].brightness_work); flush_work(&chip->leds[i].brightness_work);
} }
if (chip->pdata->enable) if (chip->pdata->enable)
...@@ -1000,7 +1016,8 @@ static int lp5523_remove(struct i2c_client *client) ...@@ -1000,7 +1016,8 @@ static int lp5523_remove(struct i2c_client *client)
} }
static const struct i2c_device_id lp5523_id[] = { static const struct i2c_device_id lp5523_id[] = {
{ "lp5523", 0 }, { "lp5523", LP5523 },
{ "lp55231", LP55231 },
{ } { }
}; };
...@@ -1008,7 +1025,7 @@ MODULE_DEVICE_TABLE(i2c, lp5523_id); ...@@ -1008,7 +1025,7 @@ MODULE_DEVICE_TABLE(i2c, lp5523_id);
static struct i2c_driver lp5523_driver = { static struct i2c_driver lp5523_driver = {
.driver = { .driver = {
.name = "lp5523", .name = "lp5523x",
}, },
.probe = lp5523_probe, .probe = lp5523_probe,
.remove = lp5523_remove, .remove = lp5523_remove,
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/platform_data/leds-pca9633.h>
/* LED select registers determine the source that drives LED outputs */ /* LED select registers determine the source that drives LED outputs */
#define PCA9633_LED_OFF 0x0 /* LED driver off */ #define PCA9633_LED_OFF 0x0 /* LED driver off */
...@@ -96,13 +97,13 @@ static int __devinit pca9633_probe(struct i2c_client *client, ...@@ -96,13 +97,13 @@ static int __devinit pca9633_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
struct pca9633_led *pca9633; struct pca9633_led *pca9633;
struct led_platform_data *pdata; struct pca9633_platform_data *pdata;
int i, err; int i, err;
pdata = client->dev.platform_data; pdata = client->dev.platform_data;
if (pdata) { if (pdata) {
if (pdata->num_leds <= 0 || pdata->num_leds > 4) { if (pdata->leds.num_leds <= 0 || pdata->leds.num_leds > 4) {
dev_err(&client->dev, "board info must claim at most 4 LEDs"); dev_err(&client->dev, "board info must claim at most 4 LEDs");
return -EINVAL; return -EINVAL;
} }
...@@ -119,14 +120,14 @@ static int __devinit pca9633_probe(struct i2c_client *client, ...@@ -119,14 +120,14 @@ static int __devinit pca9633_probe(struct i2c_client *client,
pca9633[i].led_num = i; pca9633[i].led_num = i;
/* Platform data can specify LED names and default triggers */ /* Platform data can specify LED names and default triggers */
if (pdata && i < pdata->num_leds) { if (pdata && i < pdata->leds.num_leds) {
if (pdata->leds[i].name) if (pdata->leds.leds[i].name)
snprintf(pca9633[i].name, snprintf(pca9633[i].name,
sizeof(pca9633[i].name), "pca9633:%s", sizeof(pca9633[i].name), "pca9633:%s",
pdata->leds[i].name); pdata->leds.leds[i].name);
if (pdata->leds[i].default_trigger) if (pdata->leds.leds[i].default_trigger)
pca9633[i].led_cdev.default_trigger = pca9633[i].led_cdev.default_trigger =
pdata->leds[i].default_trigger; pdata->leds.leds[i].default_trigger;
} else { } else {
snprintf(pca9633[i].name, sizeof(pca9633[i].name), snprintf(pca9633[i].name, sizeof(pca9633[i].name),
"pca9633:%d", i); "pca9633:%d", i);
...@@ -145,6 +146,10 @@ static int __devinit pca9633_probe(struct i2c_client *client, ...@@ -145,6 +146,10 @@ static int __devinit pca9633_probe(struct i2c_client *client,
/* Disable LED all-call address and set normal mode */ /* Disable LED all-call address and set normal mode */
i2c_smbus_write_byte_data(client, PCA9633_MODE1, 0x00); i2c_smbus_write_byte_data(client, PCA9633_MODE1, 0x00);
/* Configure output: open-drain or totem pole (push-pull) */
if (pdata && pdata->outdrv == PCA9633_OPEN_DRAIN)
i2c_smbus_write_byte_data(client, PCA9633_MODE2, 0x01);
/* Turn off LEDs */ /* Turn off LEDs */
i2c_smbus_write_byte_data(client, PCA9633_LEDOUT, 0x00); i2c_smbus_write_byte_data(client, PCA9633_LEDOUT, 0x00);
......
...@@ -201,7 +201,7 @@ static int wm8350_led_probe(struct platform_device *pdev) ...@@ -201,7 +201,7 @@ static int wm8350_led_probe(struct platform_device *pdev)
struct regulator *isink, *dcdc; struct regulator *isink, *dcdc;
struct wm8350_led *led; struct wm8350_led *led;
struct wm8350_led_platform_data *pdata = pdev->dev.platform_data; struct wm8350_led_platform_data *pdata = pdev->dev.platform_data;
int ret, i; int i;
if (pdata == NULL) { if (pdata == NULL) {
dev_err(&pdev->dev, "no platform data\n"); dev_err(&pdev->dev, "no platform data\n");
...@@ -214,24 +214,21 @@ static int wm8350_led_probe(struct platform_device *pdev) ...@@ -214,24 +214,21 @@ static int wm8350_led_probe(struct platform_device *pdev)
return -EINVAL; return -EINVAL;
} }
isink = regulator_get(&pdev->dev, "led_isink"); isink = devm_regulator_get(&pdev->dev, "led_isink");
if (IS_ERR(isink)) { if (IS_ERR(isink)) {
printk(KERN_ERR "%s: can't get ISINK\n", __func__); printk(KERN_ERR "%s: can't get ISINK\n", __func__);
return PTR_ERR(isink); return PTR_ERR(isink);
} }
dcdc = regulator_get(&pdev->dev, "led_vcc"); dcdc = devm_regulator_get(&pdev->dev, "led_vcc");
if (IS_ERR(dcdc)) { if (IS_ERR(dcdc)) {
printk(KERN_ERR "%s: can't get DCDC\n", __func__); printk(KERN_ERR "%s: can't get DCDC\n", __func__);
ret = PTR_ERR(dcdc); return PTR_ERR(dcdc);
goto err_isink;
} }
led = devm_kzalloc(&pdev->dev, sizeof(*led), GFP_KERNEL); led = devm_kzalloc(&pdev->dev, sizeof(*led), GFP_KERNEL);
if (led == NULL) { if (led == NULL)
ret = -ENOMEM; return -ENOMEM;
goto err_dcdc;
}
led->cdev.brightness_set = wm8350_led_set; led->cdev.brightness_set = wm8350_led_set;
led->cdev.default_trigger = pdata->default_trigger; led->cdev.default_trigger = pdata->default_trigger;
...@@ -257,17 +254,7 @@ static int wm8350_led_probe(struct platform_device *pdev) ...@@ -257,17 +254,7 @@ static int wm8350_led_probe(struct platform_device *pdev)
led->value = LED_OFF; led->value = LED_OFF;
platform_set_drvdata(pdev, led); platform_set_drvdata(pdev, led);
ret = led_classdev_register(&pdev->dev, &led->cdev); return led_classdev_register(&pdev->dev, &led->cdev);
if (ret < 0)
goto err_dcdc;
return 0;
err_dcdc:
regulator_put(dcdc);
err_isink:
regulator_put(isink);
return ret;
} }
static int wm8350_led_remove(struct platform_device *pdev) static int wm8350_led_remove(struct platform_device *pdev)
...@@ -277,8 +264,6 @@ static int wm8350_led_remove(struct platform_device *pdev) ...@@ -277,8 +264,6 @@ static int wm8350_led_remove(struct platform_device *pdev)
led_classdev_unregister(&led->cdev); led_classdev_unregister(&led->cdev);
flush_work(&led->work); flush_work(&led->work);
wm8350_led_disable(led); wm8350_led_disable(led);
regulator_put(led->dcdc);
regulator_put(led->isink);
return 0; return 0;
} }
......
...@@ -32,6 +32,8 @@ static inline int led_get_brightness(struct led_classdev *led_cdev) ...@@ -32,6 +32,8 @@ static inline int led_get_brightness(struct led_classdev *led_cdev)
return led_cdev->brightness; return led_cdev->brightness;
} }
void led_stop_software_blink(struct led_classdev *led_cdev);
extern struct rw_semaphore leds_list_lock; extern struct rw_semaphore leds_list_lock;
extern struct list_head leds_list; extern struct list_head leds_list;
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
/* See Documentation/leds/leds-lp5523.txt */ /* See Documentation/leds/leds-lp5523.txt */
struct lp5523_led_config { struct lp5523_led_config {
const char *name;
u8 chan_nr; u8 chan_nr;
u8 led_current; /* mA x10, 0 if led is not connected */ u8 led_current; /* mA x10, 0 if led is not connected */
u8 max_current; u8 max_current;
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/rwsem.h> #include <linux/rwsem.h>
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/workqueue.h>
struct device; struct device;
/* /*
...@@ -69,6 +70,9 @@ struct led_classdev { ...@@ -69,6 +70,9 @@ struct led_classdev {
struct timer_list blink_timer; struct timer_list blink_timer;
int blink_brightness; int blink_brightness;
struct work_struct set_brightness_work;
int delayed_set_value;
#ifdef CONFIG_LEDS_TRIGGERS #ifdef CONFIG_LEDS_TRIGGERS
/* Protects the trigger data below */ /* Protects the trigger data below */
struct rw_semaphore trigger_lock; struct rw_semaphore trigger_lock;
......
/*
* Simple driver for Texas Instruments LM3556 LED Flash driver chip (Rev0x03)
* Copyright (C) 2012 Texas Instruments
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
*/
#ifndef __LINUX_LM3556_H
#define __LINUX_LM3556_H
#define LM3556_NAME "leds-lm3556"
enum lm3556_pin_polarity {
PIN_LOW_ACTIVE = 0,
PIN_HIGH_ACTIVE,
};
enum lm3556_pin_enable {
PIN_DISABLED = 0,
PIN_ENABLED,
};
enum lm3556_strobe_usuage {
STROBE_EDGE_DETECT = 0,
STROBE_LEVEL_DETECT,
};
enum lm3556_indic_mode {
INDIC_MODE_INTERNAL = 0,
INDIC_MODE_EXTERNAL,
};
struct lm3556_platform_data {
enum lm3556_pin_enable torch_pin_en;
enum lm3556_pin_polarity torch_pin_polarity;
enum lm3556_strobe_usuage strobe_usuage;
enum lm3556_pin_enable strobe_pin_en;
enum lm3556_pin_polarity strobe_pin_polarity;
enum lm3556_pin_enable tx_pin_en;
enum lm3556_pin_polarity tx_pin_polarity;
enum lm3556_indic_mode indicator_mode;
};
#endif /* __LINUX_LM3556_H */
/*
* Copyright (C) 2012 Texas Instruments
*
* License Terms: GNU General Public License v2
*
* Simple driver for Texas Instruments LM355x LED driver chip
*
* Author: G.Shark Jeong <gshark.jeong@gmail.com>
* Daniel Jeong <daniel.jeong@ti.com>
*/
#define LM355x_NAME "leds-lm355x"
#define LM3554_NAME "leds-lm3554"
#define LM3556_NAME "leds-lm3556"
/* lm3554 : strobe def. on */
enum lm355x_strobe {
LM355x_PIN_STROBE_DISABLE = 0x00,
LM355x_PIN_STROBE_ENABLE = 0x01,
};
enum lm355x_torch {
LM355x_PIN_TORCH_DISABLE = 0,
LM3554_PIN_TORCH_ENABLE = 0x80,
LM3556_PIN_TORCH_ENABLE = 0x10,
};
enum lm355x_tx2 {
LM355x_PIN_TX_DISABLE = 0,
LM3554_PIN_TX_ENABLE = 0x20,
LM3556_PIN_TX_ENABLE = 0x40,
};
enum lm355x_ntc {
LM355x_PIN_NTC_DISABLE = 0,
LM3554_PIN_NTC_ENABLE = 0x08,
LM3556_PIN_NTC_ENABLE = 0x80,
};
enum lm355x_pmode {
LM355x_PMODE_DISABLE = 0,
LM355x_PMODE_ENABLE = 0x04,
};
/*
* struct lm3554_platform_data
* @pin_strobe: strobe input
* @pin_torch : input pin
* lm3554-tx1/torch/gpio1
* lm3556-torch
* @pin_tx2 : input pin
* lm3554-envm/tx2/gpio2
* lm3556-tx pin
* @ntc_pin : output pin
* lm3554-ledi/ntc
* lm3556-temp pin
* @pass_mode : pass mode
*/
struct lm355x_platform_data {
enum lm355x_strobe pin_strobe;
enum lm355x_torch pin_tx1;
enum lm355x_tx2 pin_tx2;
enum lm355x_ntc ntc_pin;
enum lm355x_pmode pass_mode;
};
/*
* Copyright (C) 2012 Texas Instruments
*
* License Terms: GNU General Public License v2
*
* Simple driver for Texas Instruments LM3642 LED driver chip
*
* Author: G.Shark Jeong <gshark.jeong@gmail.com>
* Daniel Jeong <daniel.jeong@ti.com>
*/
#ifndef __LINUX_LM3642_H
#define __LINUX_LM3642_H
#define LM3642_NAME "leds-lm3642"
enum lm3642_torch_pin_enable {
LM3642_TORCH_PIN_DISABLE = 0x00,
LM3642_TORCH_PIN_ENABLE = 0x10,
};
enum lm3642_strobe_pin_enable {
LM3642_STROBE_PIN_DISABLE = 0x00,
LM3642_STROBE_PIN_ENABLE = 0x20,
};
enum lm3642_tx_pin_enable {
LM3642_TX_PIN_DISABLE = 0x00,
LM3642_TX_PIN_ENABLE = 0x40,
};
struct lm3642_platform_data {
enum lm3642_torch_pin_enable torch_pin;
enum lm3642_strobe_pin_enable strobe_pin;
enum lm3642_tx_pin_enable tx_pin;
};
#endif /* __LINUX_LM3642_H */
/*
* PCA9633 LED chip driver.
*
* Copyright 2012 bct electronic GmbH
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
#ifndef __LINUX_PCA9633_H
#define __LINUX_PCA9633_H
#include <linux/leds.h>
enum pca9633_outdrv {
PCA9633_OPEN_DRAIN,
PCA9633_TOTEM_POLE, /* aka push-pull */
};
struct pca9633_platform_data {
struct led_platform_data leds;
enum pca9633_outdrv outdrv;
};
#endif /* __LINUX_PCA9633_H*/
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment