Commit 85b656cf 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 changes from Bryan Wu:
 "LED subsystem updates for 3.13 are basically cleanup and also add a
  new driver for PCA9685"

* 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds:
  leds: lp55xx: handle enable pin in driver
  leds-gpio: of: led should not be created if its status is disabled
  of: introduce of_get_available_child_count
  leds: Added driver for the NXP PCA9685 I2C chip
  leds: pwm: Remove redundant of_match_ptr
  leds: Include linux/of.h header
  leds: dac124s085: Remove redundant spi_set_drvdata
  leds: lp55xx: enable setting default trigger
  leds: blinkm: Remove redundant break
parents 2b684c07 30dae2f9
...@@ -10,6 +10,7 @@ Each child has own specific current settings ...@@ -10,6 +10,7 @@ Each child has own specific current settings
- max-cur: Maximun current at each led channel. - max-cur: Maximun current at each led channel.
Optional properties: Optional properties:
- enable-gpio: GPIO attached to the chip's enable pin
- label: Used for naming LEDs - label: Used for naming LEDs
- pwr-sel: LP8501 specific property. Power selection for output channels. - pwr-sel: LP8501 specific property. Power selection for output channels.
0: D1~9 are connected to VDD 0: D1~9 are connected to VDD
...@@ -17,12 +18,15 @@ Optional properties: ...@@ -17,12 +18,15 @@ Optional properties:
2: D1~6 with VOUT, D7~9 with VDD 2: D1~6 with VOUT, D7~9 with VDD
3: D1~9 are connected to VOUT 3: D1~9 are connected to VOUT
Alternatively, each child can have specific channel name Alternatively, each child can have a specific channel name and trigger:
- chan-name: Name of each channel name - chan-name (optional): name of channel
- linux,default-trigger (optional): see
Documentation/devicetree/bindings/leds/common.txt
example 1) LP5521 example 1) LP5521
3 LED channels, external clock used. Channel names are 'lp5521_pri:channel0', 3 LED channels, external clock used. Channel names are 'lp5521_pri:channel0',
'lp5521_pri:channel1' and 'lp5521_pri:channel2' 'lp5521_pri:channel1' and 'lp5521_pri:channel2', with a heartbeat trigger
on channel 0.
lp5521@32 { lp5521@32 {
compatible = "national,lp5521"; compatible = "national,lp5521";
...@@ -33,6 +37,7 @@ lp5521@32 { ...@@ -33,6 +37,7 @@ lp5521@32 {
chan0 { chan0 {
led-cur = /bits/ 8 <0x2f>; led-cur = /bits/ 8 <0x2f>;
max-cur = /bits/ 8 <0x5f>; max-cur = /bits/ 8 <0x5f>;
linux,default-trigger = "heartbeat";
}; };
chan1 { chan1 {
......
...@@ -213,29 +213,11 @@ static struct lp55xx_led_config rx51_lp5523_led_config[] = { ...@@ -213,29 +213,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 = { static struct lp55xx_platform_data rx51_lp5523_platform_data = {
.led_config = rx51_lp5523_led_config, .led_config = rx51_lp5523_led_config,
.num_channels = ARRAY_SIZE(rx51_lp5523_led_config), .num_channels = ARRAY_SIZE(rx51_lp5523_led_config),
.clock_mode = LP55XX_CLOCK_AUTO, .clock_mode = LP55XX_CLOCK_AUTO,
.setup_resources = rx51_lp5523_setup, .enable_gpio = RX51_LP5523_CHIP_EN_GPIO,
.release_resources = rx51_lp5523_release,
.enable = rx51_lp5523_enable,
}; };
#endif #endif
......
...@@ -300,6 +300,16 @@ config LEDS_PCA963X ...@@ -300,6 +300,16 @@ config LEDS_PCA963X
LED driver chip accessed via the I2C bus. Supported LED driver chip accessed via the I2C bus. Supported
devices include PCA9633 and PCA9634 devices include PCA9633 and PCA9634
config LEDS_PCA9685
tristate "LED support for PCA9685 I2C chip"
depends on LEDS_CLASS
depends on I2C
help
This option enables support for LEDs connected to the PCA9685
LED driver chip accessed via the I2C bus.
The PCA9685 offers 12-bit PWM (4095 levels of brightness) on
16 individual channels.
config LEDS_WM831X_STATUS config LEDS_WM831X_STATUS
tristate "LED support for status LEDs on WM831x PMICs" tristate "LED support for status LEDs on WM831x PMICs"
depends on LEDS_CLASS depends on LEDS_CLASS
......
...@@ -36,6 +36,7 @@ obj-$(CONFIG_LEDS_OT200) += leds-ot200.o ...@@ -36,6 +36,7 @@ obj-$(CONFIG_LEDS_OT200) += leds-ot200.o
obj-$(CONFIG_LEDS_FSG) += leds-fsg.o obj-$(CONFIG_LEDS_FSG) += leds-fsg.o
obj-$(CONFIG_LEDS_PCA955X) += leds-pca955x.o obj-$(CONFIG_LEDS_PCA955X) += leds-pca955x.o
obj-$(CONFIG_LEDS_PCA963X) += leds-pca963x.o obj-$(CONFIG_LEDS_PCA963X) += leds-pca963x.o
obj-$(CONFIG_LEDS_PCA9685) += leds-pca9685.o
obj-$(CONFIG_LEDS_DA903X) += leds-da903x.o obj-$(CONFIG_LEDS_DA903X) += leds-da903x.o
obj-$(CONFIG_LEDS_DA9052) += leds-da9052.o obj-$(CONFIG_LEDS_DA9052) += leds-da9052.o
obj-$(CONFIG_LEDS_WM831X_STATUS) += leds-wm831x-status.o obj-$(CONFIG_LEDS_WM831X_STATUS) += leds-wm831x-status.o
......
...@@ -161,13 +161,10 @@ static ssize_t show_color_common(struct device *dev, char *buf, int color) ...@@ -161,13 +161,10 @@ static ssize_t show_color_common(struct device *dev, char *buf, int color)
switch (color) { switch (color) {
case RED: case RED:
return scnprintf(buf, PAGE_SIZE, "%02X\n", data->red); return scnprintf(buf, PAGE_SIZE, "%02X\n", data->red);
break;
case GREEN: case GREEN:
return scnprintf(buf, PAGE_SIZE, "%02X\n", data->green); return scnprintf(buf, PAGE_SIZE, "%02X\n", data->green);
break;
case BLUE: case BLUE:
return scnprintf(buf, PAGE_SIZE, "%02X\n", data->blue); return scnprintf(buf, PAGE_SIZE, "%02X\n", data->blue);
break;
default: default:
return -EINVAL; return -EINVAL;
} }
......
...@@ -101,7 +101,6 @@ static int dac124s085_probe(struct spi_device *spi) ...@@ -101,7 +101,6 @@ static int dac124s085_probe(struct spi_device *spi)
while (i--) while (i--)
led_classdev_unregister(&dac->leds[i].ldev); led_classdev_unregister(&dac->leds[i].ldev);
spi_set_drvdata(spi, NULL);
return ret; return ret;
} }
...@@ -115,8 +114,6 @@ static int dac124s085_remove(struct spi_device *spi) ...@@ -115,8 +114,6 @@ static int dac124s085_remove(struct spi_device *spi)
cancel_work_sync(&dac->leds[i].work); cancel_work_sync(&dac->leds[i].work);
} }
spi_set_drvdata(spi, NULL);
return 0; return 0;
} }
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/leds.h> #include <linux/leds.h>
#include <linux/of.h>
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/of_gpio.h> #include <linux/of_gpio.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -170,11 +171,11 @@ static struct gpio_leds_priv *gpio_leds_create_of(struct platform_device *pdev) ...@@ -170,11 +171,11 @@ static struct gpio_leds_priv *gpio_leds_create_of(struct platform_device *pdev)
int count, 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 */
count = of_get_child_count(np); count = of_get_available_child_count(np);
if (!count) if (!count)
return ERR_PTR(-ENODEV); return ERR_PTR(-ENODEV);
for_each_child_of_node(np, child) for_each_available_child_of_node(np, child)
if (of_get_gpio(child, 0) == -EPROBE_DEFER) if (of_get_gpio(child, 0) == -EPROBE_DEFER)
return ERR_PTR(-EPROBE_DEFER); return ERR_PTR(-EPROBE_DEFER);
...@@ -183,7 +184,7 @@ static struct gpio_leds_priv *gpio_leds_create_of(struct platform_device *pdev) ...@@ -183,7 +184,7 @@ static struct gpio_leds_priv *gpio_leds_create_of(struct platform_device *pdev)
if (!priv) if (!priv)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
for_each_child_of_node(np, child) { for_each_available_child_of_node(np, child) {
struct gpio_led led = {}; struct gpio_led led = {};
enum of_gpio_flags flags; enum of_gpio_flags flags;
const char *state; const char *state;
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <linux/leds.h> #include <linux/leds.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/of.h>
#include <linux/platform_data/leds-lp55xx.h> #include <linux/platform_data/leds-lp55xx.h>
#include <linux/slab.h> #include <linux/slab.h>
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <linux/leds.h> #include <linux/leds.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/of.h>
#include <linux/platform_data/leds-lp55xx.h> #include <linux/platform_data/leds-lp55xx.h>
#include <linux/slab.h> #include <linux/slab.h>
......
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/platform_data/leds-lp55xx.h> #include <linux/platform_data/leds-lp55xx.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/gpio.h>
#include <linux/of_gpio.h>
#include "leds-lp55xx-common.h" #include "leds-lp55xx-common.h"
...@@ -165,6 +167,7 @@ static int lp55xx_init_led(struct lp55xx_led *led, ...@@ -165,6 +167,7 @@ static int lp55xx_init_led(struct lp55xx_led *led,
led->led_current = pdata->led_config[chan].led_current; led->led_current = pdata->led_config[chan].led_current;
led->max_current = pdata->led_config[chan].max_current; led->max_current = pdata->led_config[chan].max_current;
led->chan_nr = pdata->led_config[chan].chan_nr; led->chan_nr = pdata->led_config[chan].chan_nr;
led->cdev.default_trigger = pdata->led_config[chan].default_trigger;
if (led->chan_nr >= max_channel) { if (led->chan_nr >= max_channel) {
dev_err(dev, "Use channel numbers between 0 and %d\n", dev_err(dev, "Use channel numbers between 0 and %d\n",
...@@ -406,18 +409,18 @@ int lp55xx_init_device(struct lp55xx_chip *chip) ...@@ -406,18 +409,18 @@ int lp55xx_init_device(struct lp55xx_chip *chip)
if (!pdata || !cfg) if (!pdata || !cfg)
return -EINVAL; return -EINVAL;
if (pdata->setup_resources) { if (gpio_is_valid(pdata->enable_gpio)) {
ret = pdata->setup_resources(); ret = devm_gpio_request_one(dev, pdata->enable_gpio,
GPIOF_DIR_OUT, "lp5523_enable");
if (ret < 0) { 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; goto err;
} }
}
if (pdata->enable) { gpio_set_value(pdata->enable_gpio, 0);
pdata->enable(0);
usleep_range(1000, 2000); /* Keep enable down at least 1ms */ 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. */ usleep_range(1000, 2000); /* 500us abs min. */
} }
...@@ -458,11 +461,8 @@ void lp55xx_deinit_device(struct lp55xx_chip *chip) ...@@ -458,11 +461,8 @@ void lp55xx_deinit_device(struct lp55xx_chip *chip)
if (chip->clk) if (chip->clk)
clk_disable_unprepare(chip->clk); clk_disable_unprepare(chip->clk);
if (pdata->enable) if (gpio_is_valid(pdata->enable_gpio))
pdata->enable(0); gpio_set_value(pdata->enable_gpio, 0);
if (pdata->release_resources)
pdata->release_resources();
} }
EXPORT_SYMBOL_GPL(lp55xx_deinit_device); EXPORT_SYMBOL_GPL(lp55xx_deinit_device);
...@@ -586,6 +586,8 @@ int lp55xx_of_populate_pdata(struct device *dev, struct device_node *np) ...@@ -586,6 +586,8 @@ int lp55xx_of_populate_pdata(struct device *dev, struct device_node *np)
of_property_read_string(child, "chan-name", &cfg[i].name); of_property_read_string(child, "chan-name", &cfg[i].name);
of_property_read_u8(child, "led-cur", &cfg[i].led_current); of_property_read_u8(child, "led-cur", &cfg[i].led_current);
of_property_read_u8(child, "max-cur", &cfg[i].max_current); of_property_read_u8(child, "max-cur", &cfg[i].max_current);
cfg[i].default_trigger =
of_get_property(child, "linux,default-trigger", NULL);
i++; i++;
} }
...@@ -593,6 +595,8 @@ int lp55xx_of_populate_pdata(struct device *dev, struct device_node *np) ...@@ -593,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_string(np, "label", &pdata->label);
of_property_read_u8(np, "clock-mode", &pdata->clock_mode); of_property_read_u8(np, "clock-mode", &pdata->clock_mode);
pdata->enable_gpio = of_get_named_gpio(np, "enable-gpio", 0);
/* LP8501 specific */ /* LP8501 specific */
of_property_read_u8(np, "pwr-sel", (u8 *)&pdata->pwr_sel); of_property_read_u8(np, "pwr-sel", (u8 *)&pdata->pwr_sel);
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <linux/leds.h> #include <linux/leds.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/of.h>
#include <linux/platform_data/leds-lp55xx.h> #include <linux/platform_data/leds-lp55xx.h>
#include <linux/slab.h> #include <linux/slab.h>
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <linux/leds.h> #include <linux/leds.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/platform_data/leds-kirkwood-ns2.h> #include <linux/platform_data/leds-kirkwood-ns2.h>
#include <linux/of.h>
#include <linux/of_gpio.h> #include <linux/of_gpio.h>
/* /*
......
/*
* Copyright 2013 Maximilian Güntner <maximilian.guentner@gmail.com>
*
* This file is subject to the terms and conditions of version 2 of
* the GNU General Public License. See the file COPYING in the main
* directory of this archive for more details.
*
* Based on leds-pca963x.c driver by
* Peter Meerwald <p.meerwald@bct-electronic.com>
*
* Driver for the NXP PCA9685 12-Bit PWM LED driver chip.
*
*/
#include <linux/ctype.h>
#include <linux/delay.h>
#include <linux/err.h>
#include <linux/i2c.h>
#include <linux/leds.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/workqueue.h>
#include <linux/platform_data/leds-pca9685.h>
/* Register Addresses */
#define PCA9685_MODE1 0x00
#define PCA9685_MODE2 0x01
#define PCA9685_LED0_ON_L 0x06
#define PCA9685_ALL_LED_ON_L 0xFA
/* MODE1 Register */
#define PCA9685_ALLCALL 0x00
#define PCA9685_SLEEP 0x04
#define PCA9685_AI 0x05
/* MODE2 Register */
#define PCA9685_INVRT 0x04
#define PCA9685_OUTDRV 0x02
static const struct i2c_device_id pca9685_id[] = {
{ "pca9685", 0 },
{ }
};
MODULE_DEVICE_TABLE(i2c, pca9685_id);
struct pca9685_led {
struct i2c_client *client;
struct work_struct work;
u16 brightness;
struct led_classdev led_cdev;
int led_num; /* 0-15 */
char name[32];
};
static void pca9685_write_msg(struct i2c_client *client, u8 *buf, u8 len)
{
struct i2c_msg msg = {
.addr = client->addr,
.flags = 0x00,
.len = len,
.buf = buf
};
i2c_transfer(client->adapter, &msg, 1);
}
static void pca9685_all_off(struct i2c_client *client)
{
u8 i2c_buffer[5] = {PCA9685_ALL_LED_ON_L, 0x00, 0x00, 0x00, 0x10};
pca9685_write_msg(client, i2c_buffer, 5);
}
static void pca9685_led_work(struct work_struct *work)
{
struct pca9685_led *pca9685;
u8 i2c_buffer[5];
pca9685 = container_of(work, struct pca9685_led, work);
i2c_buffer[0] = PCA9685_LED0_ON_L + 4 * pca9685->led_num;
/*
* 4095 is the maximum brightness, so we set the ON time to 0x1000
* which disables the PWM generator for that LED
*/
if (pca9685->brightness == 4095)
*((__le16 *)(i2c_buffer+1)) = cpu_to_le16(0x1000);
else
*((__le16 *)(i2c_buffer+1)) = 0x0000;
if (pca9685->brightness == 0)
*((__le16 *)(i2c_buffer+3)) = cpu_to_le16(0x1000);
else if (pca9685->brightness == 4095)
*((__le16 *)(i2c_buffer+3)) = 0x0000;
else
*((__le16 *)(i2c_buffer+3)) = cpu_to_le16(pca9685->brightness);
pca9685_write_msg(pca9685->client, i2c_buffer, 5);
}
static void pca9685_led_set(struct led_classdev *led_cdev,
enum led_brightness value)
{
struct pca9685_led *pca9685;
pca9685 = container_of(led_cdev, struct pca9685_led, led_cdev);
pca9685->brightness = value;
schedule_work(&pca9685->work);
}
static int pca9685_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct pca9685_led *pca9685;
struct pca9685_platform_data *pdata;
int err;
u8 i;
pdata = dev_get_platdata(&client->dev);
if (pdata) {
if (pdata->leds.num_leds < 1 || pdata->leds.num_leds > 15) {
dev_err(&client->dev, "board info must claim 1-16 LEDs");
return -EINVAL;
}
}
pca9685 = devm_kzalloc(&client->dev, 16 * sizeof(*pca9685), GFP_KERNEL);
if (!pca9685)
return -ENOMEM;
i2c_set_clientdata(client, pca9685);
pca9685_all_off(client);
for (i = 0; i < 16; i++) {
pca9685[i].client = client;
pca9685[i].led_num = i;
pca9685[i].name[0] = '\0';
if (pdata && i < pdata->leds.num_leds) {
if (pdata->leds.leds[i].name)
strncpy(pca9685[i].name,
pdata->leds.leds[i].name,
sizeof(pca9685[i].name)-1);
if (pdata->leds.leds[i].default_trigger)
pca9685[i].led_cdev.default_trigger =
pdata->leds.leds[i].default_trigger;
}
if (strlen(pca9685[i].name) == 0) {
/*
* Write adapter and address to the name as well.
* Otherwise multiple chips attached to one host would
* not work.
*/
snprintf(pca9685[i].name, sizeof(pca9685[i].name),
"pca9685:%d:x%.2x:%d",
client->adapter->nr, client->addr, i);
}
pca9685[i].led_cdev.name = pca9685[i].name;
pca9685[i].led_cdev.max_brightness = 0xfff;
pca9685[i].led_cdev.brightness_set = pca9685_led_set;
INIT_WORK(&pca9685[i].work, pca9685_led_work);
err = led_classdev_register(&client->dev, &pca9685[i].led_cdev);
if (err < 0)
goto exit;
}
if (pdata)
i2c_smbus_write_byte_data(client, PCA9685_MODE2,
pdata->outdrv << PCA9685_OUTDRV |
pdata->inverted << PCA9685_INVRT);
else
i2c_smbus_write_byte_data(client, PCA9685_MODE2,
PCA9685_TOTEM_POLE << PCA9685_OUTDRV);
/* Enable Auto-Increment, enable oscillator, ALLCALL/SUBADDR disabled */
i2c_smbus_write_byte_data(client, PCA9685_MODE1, BIT(PCA9685_AI));
return 0;
exit:
while (i--) {
led_classdev_unregister(&pca9685[i].led_cdev);
cancel_work_sync(&pca9685[i].work);
}
return err;
}
static int pca9685_remove(struct i2c_client *client)
{
struct pca9685_led *pca9685 = i2c_get_clientdata(client);
u8 i;
for (i = 0; i < 16; i++) {
led_classdev_unregister(&pca9685[i].led_cdev);
cancel_work_sync(&pca9685[i].work);
}
pca9685_all_off(client);
return 0;
}
static struct i2c_driver pca9685_driver = {
.driver = {
.name = "leds-pca9685",
.owner = THIS_MODULE,
},
.probe = pca9685_probe,
.remove = pca9685_remove,
.id_table = pca9685_id,
};
module_i2c_driver(pca9685_driver);
MODULE_AUTHOR("Maximilian Güntner <maximilian.guentner@gmail.com>");
MODULE_DESCRIPTION("PCA9685 LED Driver");
MODULE_LICENSE("GPL v2");
...@@ -232,7 +232,7 @@ static struct platform_driver led_pwm_driver = { ...@@ -232,7 +232,7 @@ static struct platform_driver led_pwm_driver = {
.driver = { .driver = {
.name = "leds_pwm", .name = "leds_pwm",
.owner = THIS_MODULE, .owner = THIS_MODULE,
.of_match_table = of_match_ptr(of_pwm_leds_match), .of_match_table = of_pwm_leds_match,
}, },
}; };
......
...@@ -226,6 +226,17 @@ static inline int of_get_child_count(const struct device_node *np) ...@@ -226,6 +226,17 @@ static inline int of_get_child_count(const struct device_node *np)
return num; return num;
} }
static inline int of_get_available_child_count(const struct device_node *np)
{
struct device_node *child;
int num = 0;
for_each_available_child_of_node(np, child)
num++;
return num;
}
/* cache lookup */ /* cache lookup */
extern struct device_node *of_find_next_cache_node(const struct device_node *); extern struct device_node *of_find_next_cache_node(const struct device_node *);
extern struct device_node *of_find_node_with_property( extern struct device_node *of_find_node_with_property(
...@@ -378,6 +389,11 @@ static inline int of_get_child_count(const struct device_node *np) ...@@ -378,6 +389,11 @@ static inline int of_get_child_count(const struct device_node *np)
return 0; return 0;
} }
static inline int of_get_available_child_count(const struct device_node *np)
{
return 0;
}
static inline int of_device_is_compatible(const struct device_node *device, static inline int of_device_is_compatible(const struct device_node *device,
const char *name) const char *name)
{ {
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
struct lp55xx_led_config { struct lp55xx_led_config {
const char *name; const char *name;
const char *default_trigger;
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;
...@@ -66,10 +67,8 @@ struct lp55xx_platform_data { ...@@ -66,10 +67,8 @@ struct lp55xx_platform_data {
/* Clock configuration */ /* Clock configuration */
u8 clock_mode; u8 clock_mode;
/* Platform specific functions */ /* optional enable GPIO */
int (*setup_resources)(void); int enable_gpio;
void (*release_resources)(void);
void (*enable)(bool state);
/* Predefined pattern data */ /* Predefined pattern data */
struct lp55xx_predef_pattern *patterns; struct lp55xx_predef_pattern *patterns;
......
/*
* Copyright 2013 Maximilian Güntner <maximilian.guentner@gmail.com>
*
* This file is subject to the terms and conditions of version 2 of
* the GNU General Public License. See the file COPYING in the main
* directory of this archive for more details.
*
* Based on leds-pca963x.h by Peter Meerwald <p.meerwald@bct-electronic.com>
*
* LED driver for the NXP PCA9685 PWM chip
*
*/
#ifndef __LINUX_PCA9685_H
#define __LINUX_PCA9685_H
#include <linux/leds.h>
enum pca9685_outdrv {
PCA9685_OPEN_DRAIN,
PCA9685_TOTEM_POLE,
};
enum pca9685_inverted {
PCA9685_NOT_INVERTED,
PCA9685_INVERTED,
};
struct pca9685_platform_data {
struct led_platform_data leds;
enum pca9685_outdrv outdrv;
enum pca9685_inverted inverted;
};
#endif /* __LINUX_PCA9685_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