Skip to content

Commit a5763e4

Browse files
Wenping Zhangrkhuangtao
authored andcommitted
leds: leds-is31fl32xx: add delayed register function.
This function is used for led scrolling, set "default-trigger-delay-ms" in led dts node to enable this function. Change-Id: I4dff3ab29d8ef18344df4c3a0f18a595a404154c Signed-off-by: Wenping Zhang <wenping.zhang@rock-chips.com>
1 parent a7d17fd commit a5763e4

1 file changed

Lines changed: 47 additions & 10 deletions

File tree

drivers/leds/leds-is31fl32xx.c

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ struct is31fl32xx_led_data {
4242
struct led_classdev cdev;
4343
u8 channel; /* 1-based, max priv->cdef->channels */
4444
struct is31fl32xx_priv *priv;
45+
unsigned int register_delay;
46+
struct device *dev;
47+
struct delayed_work register_work;
4548
};
4649

4750
struct is31fl32xx_priv {
@@ -147,8 +150,8 @@ static int is31fl32xx_write(struct is31fl32xx_priv *priv, u8 reg, u8 val)
147150
ret = i2c_smbus_write_byte_data(priv->client, reg, val);
148151
if (ret) {
149152
dev_err(&priv->client->dev,
150-
"register write to 0x%02X failed (error %d)",
151-
reg, ret);
153+
"register write to 0x%02X failed (error %d),val=%d",
154+
reg, ret, val);
152155
}
153156
return ret;
154157
}
@@ -342,7 +345,9 @@ static int is31fl32xx_parse_child_dt(const struct device *dev,
342345
{
343346
struct led_classdev *cdev = &led_data->cdev;
344347
int ret = 0;
345-
u32 reg;
348+
u32 reg = -1;
349+
u32 blink_delay_on = 0;
350+
u32 blink_delay_off = 0;
346351

347352
if (of_property_read_string(child, "label", &cdev->name))
348353
cdev->name = child->name;
@@ -359,6 +364,17 @@ static int is31fl32xx_parse_child_dt(const struct device *dev,
359364
of_property_read_string(child, "linux,default-trigger",
360365
&cdev->default_trigger);
361366

367+
of_property_read_u32(child, "linux,blink-delay-on-ms",
368+
&blink_delay_on);
369+
cdev->blink_delay_on = (u64)blink_delay_on;
370+
371+
of_property_read_u32(child, "linux,blink-delay-off-ms",
372+
&blink_delay_off);
373+
cdev->blink_delay_off = (u64)blink_delay_off;
374+
375+
of_property_read_u32(child, "linux,default-trigger-delay-ms",
376+
&led_data->register_delay);
377+
362378
cdev->brightness_set = is31fl32xx_brightness_set;
363379

364380
return 0;
@@ -378,6 +394,21 @@ static struct is31fl32xx_led_data *is31fl32xx_find_led_data(
378394
return NULL;
379395
}
380396

397+
static void register_classdev_delayed(struct work_struct *ws)
398+
{
399+
struct is31fl32xx_led_data *led_data =
400+
container_of(ws, struct is31fl32xx_led_data,
401+
register_work.work);
402+
int ret;
403+
404+
ret = devm_led_classdev_register(led_data->dev, &led_data->cdev);
405+
if (ret) {
406+
dev_err(led_data->dev, "failed to register PWM led for %s: %d\n",
407+
led_data->cdev.name, ret);
408+
return;
409+
}
410+
}
411+
381412
static int is31fl32xx_parse_dt(struct device *dev,
382413
struct is31fl32xx_priv *priv)
383414
{
@@ -390,6 +421,7 @@ static int is31fl32xx_parse_dt(struct device *dev,
390421
const struct is31fl32xx_led_data *other_led_data;
391422

392423
led_data->priv = priv;
424+
led_data->dev = dev;
393425

394426
ret = is31fl32xx_parse_child_dt(dev, child, led_data);
395427
if (ret)
@@ -406,14 +438,19 @@ static int is31fl32xx_parse_dt(struct device *dev,
406438
led_data->channel);
407439
goto err;
408440
}
409-
410-
ret = devm_led_classdev_register(dev, &led_data->cdev);
411-
if (ret) {
412-
dev_err(dev, "failed to register PWM led for %s: %d\n",
413-
led_data->cdev.name, ret);
414-
goto err;
441+
if (led_data->register_delay) {
442+
INIT_DELAYED_WORK(&led_data->register_work,
443+
register_classdev_delayed);
444+
schedule_delayed_work(&led_data->register_work,
445+
msecs_to_jiffies(led_data->register_delay));
446+
} else {
447+
ret = devm_led_classdev_register(dev, &led_data->cdev);
448+
if (ret) {
449+
dev_err(dev, "failed to register PWM led for %s: %d\n",
450+
led_data->cdev.name, ret);
451+
goto err;
452+
}
415453
}
416-
417454
priv->num_leds++;
418455
}
419456

0 commit comments

Comments
 (0)