@@ -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
4750struct 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+
381412static 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