mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-27 17:11:46 +00:00
leds-lp55xx: use lp55xx_init_led() common function
lp5521_init_led() and lp5523_init_led() are replaced with one common function, lp55xx_init_led(). Max channels is configurable, so it's used in lp55xx_init_led(). 'LP5523_LEDS' are changed to 'LP5523_MAX_LEDS'. lp55xx_set_brightness, lp55xx_led_attributes: skeleton Will be filled in next patches. Signed-off-by: Milo(Woogyom) Kim <milo.kim@ti.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
This commit is contained in:
parent
9e9b3db1b2
commit
0e2023463a
4 changed files with 76 additions and 104 deletions
|
@ -689,55 +689,6 @@ static void lp5521_unregister_sysfs(struct i2c_client *client)
|
||||||
&lp5521_led_attribute_group);
|
&lp5521_led_attribute_group);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int lp5521_init_led(struct lp5521_led *led,
|
|
||||||
struct i2c_client *client,
|
|
||||||
int chan, struct lp5521_platform_data *pdata)
|
|
||||||
{
|
|
||||||
struct device *dev = &client->dev;
|
|
||||||
char name[32];
|
|
||||||
int res;
|
|
||||||
|
|
||||||
if (chan >= LP5521_MAX_LEDS)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
if (pdata->led_config[chan].led_current == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
led->led_current = pdata->led_config[chan].led_current;
|
|
||||||
led->max_current = pdata->led_config[chan].max_current;
|
|
||||||
led->chan_nr = pdata->led_config[chan].chan_nr;
|
|
||||||
|
|
||||||
if (led->chan_nr >= LP5521_MAX_LEDS) {
|
|
||||||
dev_err(dev, "Use channel numbers between 0 and %d\n",
|
|
||||||
LP5521_MAX_LEDS - 1);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
led->cdev.brightness_set = lp5521_set_brightness;
|
|
||||||
if (pdata->led_config[chan].name) {
|
|
||||||
led->cdev.name = pdata->led_config[chan].name;
|
|
||||||
} else {
|
|
||||||
snprintf(name, sizeof(name), "%s:channel%d",
|
|
||||||
pdata->label ?: client->name, chan);
|
|
||||||
led->cdev.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
res = led_classdev_register(dev, &led->cdev);
|
|
||||||
if (res < 0) {
|
|
||||||
dev_err(dev, "couldn't register led on channel %d\n", chan);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
res = sysfs_create_group(&led->cdev.dev->kobj,
|
|
||||||
&lp5521_led_attribute_group);
|
|
||||||
if (res < 0) {
|
|
||||||
dev_err(dev, "couldn't register current attribute\n");
|
|
||||||
led_classdev_unregister(&led->cdev);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void lp5521_unregister_leds(struct lp5521_chip *chip)
|
static void lp5521_unregister_leds(struct lp5521_chip *chip)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -758,6 +709,7 @@ static struct lp55xx_device_config lp5521_cfg = {
|
||||||
.addr = LP5521_REG_ENABLE,
|
.addr = LP5521_REG_ENABLE,
|
||||||
.val = LP5521_ENABLE_DEFAULT,
|
.val = LP5521_ENABLE_DEFAULT,
|
||||||
},
|
},
|
||||||
|
.max_channel = LP5521_MAX_LEDS,
|
||||||
.post_init_device = lp5521_post_init_device,
|
.post_init_device = lp5521_post_init_device,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -94,7 +94,7 @@
|
||||||
#define LP5523_PROGRAM_PAGES 6
|
#define LP5523_PROGRAM_PAGES 6
|
||||||
#define LP5523_ADC_SHORTCIRC_LIM 80
|
#define LP5523_ADC_SHORTCIRC_LIM 80
|
||||||
|
|
||||||
#define LP5523_LEDS 9
|
#define LP5523_MAX_LEDS 9
|
||||||
#define LP5523_ENGINES 3
|
#define LP5523_ENGINES 3
|
||||||
|
|
||||||
#define LP5523_ENG_MASK_BASE 0x30 /* 00110000 */
|
#define LP5523_ENG_MASK_BASE 0x30 /* 00110000 */
|
||||||
|
@ -136,7 +136,7 @@ struct lp5523_chip {
|
||||||
struct mutex lock; /* Serialize control */
|
struct mutex lock; /* Serialize control */
|
||||||
struct i2c_client *client;
|
struct i2c_client *client;
|
||||||
struct lp5523_engine engines[LP5523_ENGINES];
|
struct lp5523_engine engines[LP5523_ENGINES];
|
||||||
struct lp5523_led leds[LP5523_LEDS];
|
struct lp5523_led leds[LP5523_MAX_LEDS];
|
||||||
struct lp5523_platform_data *pdata;
|
struct lp5523_platform_data *pdata;
|
||||||
u8 num_channels;
|
u8 num_channels;
|
||||||
u8 num_leds;
|
u8 num_leds;
|
||||||
|
@ -285,7 +285,7 @@ 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 = min_t(int, len, LP5523_LEDS);
|
len = min_t(int, len, LP5523_MAX_LEDS);
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
switch (buf[i]) {
|
switch (buf[i]) {
|
||||||
case '1':
|
case '1':
|
||||||
|
@ -308,7 +308,7 @@ static int lp5523_mux_parse(const char *buf, u16 *mux, size_t len)
|
||||||
static void lp5523_mux_to_array(u16 led_mux, char *array)
|
static void lp5523_mux_to_array(u16 led_mux, char *array)
|
||||||
{
|
{
|
||||||
int i, pos = 0;
|
int i, pos = 0;
|
||||||
for (i = 0; i < LP5523_LEDS; i++)
|
for (i = 0; i < LP5523_MAX_LEDS; i++)
|
||||||
pos += sprintf(array + pos, "%x", LED_ACTIVE(led_mux, i));
|
pos += sprintf(array + pos, "%x", LED_ACTIVE(led_mux, i));
|
||||||
|
|
||||||
array[pos] = '\0';
|
array[pos] = '\0';
|
||||||
|
@ -324,7 +324,7 @@ static ssize_t show_engine_leds(struct device *dev,
|
||||||
{
|
{
|
||||||
struct i2c_client *client = to_i2c_client(dev);
|
struct i2c_client *client = to_i2c_client(dev);
|
||||||
struct lp5523_chip *chip = i2c_get_clientdata(client);
|
struct lp5523_chip *chip = i2c_get_clientdata(client);
|
||||||
char mux[LP5523_LEDS + 1];
|
char mux[LP5523_MAX_LEDS + 1];
|
||||||
|
|
||||||
lp5523_mux_to_array(chip->engines[nr - 1].led_mux, mux);
|
lp5523_mux_to_array(chip->engines[nr - 1].led_mux, mux);
|
||||||
|
|
||||||
|
@ -417,7 +417,7 @@ static ssize_t lp5523_selftest(struct device *dev,
|
||||||
|
|
||||||
vdd--; /* There may be some fluctuation in measurement */
|
vdd--; /* There may be some fluctuation in measurement */
|
||||||
|
|
||||||
for (i = 0; i < LP5523_LEDS; i++) {
|
for (i = 0; i < LP5523_MAX_LEDS; i++) {
|
||||||
/* Skip non-existing channels */
|
/* Skip non-existing channels */
|
||||||
if (chip->pdata->led_config[i].led_current == 0)
|
if (chip->pdata->led_config[i].led_current == 0)
|
||||||
continue;
|
continue;
|
||||||
|
@ -773,55 +773,6 @@ static void lp5523_set_mode(struct lp5523_engine *engine, u8 mode)
|
||||||
/*--------------------------------------------------------------*/
|
/*--------------------------------------------------------------*/
|
||||||
/* Probe, Attach, Remove */
|
/* Probe, Attach, Remove */
|
||||||
/*--------------------------------------------------------------*/
|
/*--------------------------------------------------------------*/
|
||||||
static int lp5523_init_led(struct lp5523_led *led, struct device *dev,
|
|
||||||
int chan, struct lp5523_platform_data *pdata,
|
|
||||||
const char *chip_name)
|
|
||||||
{
|
|
||||||
char name[32];
|
|
||||||
int res;
|
|
||||||
|
|
||||||
if (chan >= LP5523_LEDS)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
if (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->chan_nr = pdata->led_config[chan].chan_nr;
|
|
||||||
|
|
||||||
if (led->chan_nr >= LP5523_LEDS) {
|
|
||||||
dev_err(dev, "Use channel numbers between 0 and %d\n",
|
|
||||||
LP5523_LEDS - 1);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pdata->led_config[chan].name) {
|
|
||||||
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.brightness_set = lp5523_set_brightness;
|
|
||||||
res = led_classdev_register(dev, &led->cdev);
|
|
||||||
if (res < 0) {
|
|
||||||
dev_err(dev, "couldn't register led on channel %d\n",
|
|
||||||
chan);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
res = sysfs_create_group(&led->cdev.dev->kobj,
|
|
||||||
&lp5523_led_attribute_group);
|
|
||||||
if (res < 0) {
|
|
||||||
dev_err(dev, "couldn't register current attribute\n");
|
|
||||||
led_classdev_unregister(&led->cdev);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
led->led_current = 0;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void lp5523_unregister_leds(struct lp5523_chip *chip)
|
static void lp5523_unregister_leds(struct lp5523_chip *chip)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -842,6 +793,7 @@ static struct lp55xx_device_config lp5523_cfg = {
|
||||||
.addr = LP5523_REG_ENABLE,
|
.addr = LP5523_REG_ENABLE,
|
||||||
.val = LP5523_ENABLE,
|
.val = LP5523_ENABLE,
|
||||||
},
|
},
|
||||||
|
.max_channel = LP5523_MAX_LEDS,
|
||||||
.post_init_device = lp5523_post_init_device,
|
.post_init_device = lp5523_post_init_device,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -63,9 +63,75 @@ static int lp55xx_post_init_device(struct lp55xx_chip *chip)
|
||||||
return cfg->post_init_device(chip);
|
return cfg->post_init_device(chip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct attribute *lp55xx_led_attributes[] = {
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct attribute_group lp55xx_led_attr_group = {
|
||||||
|
.attrs = lp55xx_led_attributes
|
||||||
|
};
|
||||||
|
|
||||||
|
static void lp55xx_set_brightness(struct led_classdev *cdev,
|
||||||
|
enum led_brightness brightness)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
static int lp55xx_init_led(struct lp55xx_led *led,
|
static int lp55xx_init_led(struct lp55xx_led *led,
|
||||||
struct lp55xx_chip *chip, int chan)
|
struct lp55xx_chip *chip, int chan)
|
||||||
{
|
{
|
||||||
|
struct lp55xx_platform_data *pdata = chip->pdata;
|
||||||
|
struct lp55xx_device_config *cfg = chip->cfg;
|
||||||
|
struct device *dev = &chip->cl->dev;
|
||||||
|
char name[32];
|
||||||
|
int ret;
|
||||||
|
int max_channel = cfg->max_channel;
|
||||||
|
|
||||||
|
if (chan >= max_channel) {
|
||||||
|
dev_err(dev, "invalid channel: %d / %d\n", chan, max_channel);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pdata->led_config[chan].led_current == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
led->led_current = pdata->led_config[chan].led_current;
|
||||||
|
led->max_current = pdata->led_config[chan].max_current;
|
||||||
|
led->chan_nr = pdata->led_config[chan].chan_nr;
|
||||||
|
|
||||||
|
if (led->chan_nr >= max_channel) {
|
||||||
|
dev_err(dev, "Use channel numbers between 0 and %d\n",
|
||||||
|
max_channel - 1);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
led->cdev.brightness_set = lp55xx_set_brightness;
|
||||||
|
|
||||||
|
if (pdata->led_config[chan].name) {
|
||||||
|
led->cdev.name = pdata->led_config[chan].name;
|
||||||
|
} else {
|
||||||
|
snprintf(name, sizeof(name), "%s:channel%d",
|
||||||
|
pdata->label ? : chip->cl->name, chan);
|
||||||
|
led->cdev.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* register led class device for each channel and
|
||||||
|
* add device attributes
|
||||||
|
*/
|
||||||
|
|
||||||
|
ret = led_classdev_register(dev, &led->cdev);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(dev, "led register err: %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = sysfs_create_group(&led->cdev.dev->kobj, &lp55xx_led_attr_group);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(dev, "led sysfs err: %d\n", ret);
|
||||||
|
led_classdev_unregister(&led->cdev);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@ struct lp55xx_reg {
|
||||||
* struct lp55xx_device_config
|
* struct lp55xx_device_config
|
||||||
* @reset : Chip specific reset command
|
* @reset : Chip specific reset command
|
||||||
* @enable : Chip specific enable command
|
* @enable : Chip specific enable command
|
||||||
|
* @max_channel : Maximum number of channels
|
||||||
* @post_init_device : Chip specific initialization code
|
* @post_init_device : Chip specific initialization code
|
||||||
* @brightness_work_fn : Brightness work function
|
* @brightness_work_fn : Brightness work function
|
||||||
* @set_led_current : LED current set function
|
* @set_led_current : LED current set function
|
||||||
|
@ -39,6 +40,7 @@ struct lp55xx_reg {
|
||||||
struct lp55xx_device_config {
|
struct lp55xx_device_config {
|
||||||
const struct lp55xx_reg reset;
|
const struct lp55xx_reg reset;
|
||||||
const struct lp55xx_reg enable;
|
const struct lp55xx_reg enable;
|
||||||
|
const int max_channel;
|
||||||
|
|
||||||
/* define if the device has specific initialization process */
|
/* define if the device has specific initialization process */
|
||||||
int (*post_init_device) (struct lp55xx_chip *chip);
|
int (*post_init_device) (struct lp55xx_chip *chip);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue