2323#include <linux/delay.h>
2424#include <linux/of_gpio.h>
2525#include <linux/gpio.h>
26+ #ifdef CONFIG_LEDS_TRIGGER_MULTI_CTRL
27+ #include "leds-multi.h"
28+ #endif
2629
2730/* Used to indicate a device has no such register */
2831#define IS31FL32XX_REG_NONE 0xFF
@@ -151,14 +154,17 @@ static const struct is31fl32xx_chipdef is31fl3216_cdef = {
151154static int is31fl32xx_write (struct is31fl32xx_priv * priv , u8 reg , u8 val )
152155{
153156 int ret ;
157+ int retries = 3 ;
154158
155159 dev_dbg (& priv -> client -> dev , "writing register 0x%02X=0x%02X" , reg , val );
156160
157161 ret = i2c_smbus_write_byte_data (priv -> client , reg , val );
158- if (ret ) {
162+ while (ret && ( retries -- > 0 ) ) {
159163 dev_err (& priv -> client -> dev ,
160164 "register write to 0x%02X failed (error %d),val=%d" ,
161165 reg , ret , val );
166+ msleep (100 );
167+ ret = i2c_smbus_write_byte_data (priv -> client , reg , val );
162168 }
163169 return ret ;
164170}
@@ -270,6 +276,11 @@ static void is31fl32xx_brightness_set(struct led_classdev *led_cdev,
270276 schedule_work (& led_data -> brightness_work );
271277}
272278
279+ #if 0
280+ /*
281+ * we use function is31fl32xx_software_shutdown to reset the registers
282+ * of is31fl32xx.
283+ */
273284static int is31fl32xx_reset_regs (struct is31fl32xx_priv * priv )
274285{
275286 const struct is31fl32xx_chipdef * cdef = priv -> cdef ;
@@ -286,6 +297,7 @@ static int is31fl32xx_reset_regs(struct is31fl32xx_priv *priv)
286297
287298 return 0 ;
288299}
300+ #endif
289301
290302static int is31fl32xx_software_shutdown (struct is31fl32xx_priv * priv ,
291303 bool enable )
@@ -312,9 +324,9 @@ static int is31fl32xx_init_regs(struct is31fl32xx_priv *priv)
312324 const struct is31fl32xx_chipdef * cdef = priv -> cdef ;
313325 int ret ;
314326
315- ret = is31fl32xx_reset_regs (priv );
327+ ret = is31fl32xx_software_shutdown (priv , true );
316328 if (ret )
317- pr_err ("%s, write to reset register failed\n" , __func__ );
329+ pr_err ("%s, write to shutdown register failed\n" , __func__ );
318330
319331 /*
320332 * Set enable bit for all channels.
@@ -468,6 +480,9 @@ static int is31fl32xx_parse_dt(struct device *dev,
468480 goto err ;
469481 }
470482 }
483+ #ifdef CONFIG_LEDS_TRIGGER_MULTI_CTRL
484+ led_multi_control_register (& led_data -> cdev );
485+ #endif
471486 priv -> num_leds ++ ;
472487 }
473488
@@ -538,6 +553,10 @@ static int is31fl32xx_probe(struct i2c_client *client,
538553 if (ret )
539554 return ret ;
540555
556+ #ifdef CONFIG_LEDS_TRIGGER_MULTI_CTRL
557+ led_multi_control_init (dev );
558+ #endif
559+
541560 ret = is31fl32xx_parse_dt (dev , priv );
542561 if (ret )
543562 return ret ;
@@ -550,29 +569,40 @@ static int is31fl32xx_remove(struct i2c_client *client)
550569 int i ;
551570 struct is31fl32xx_priv * priv = i2c_get_clientdata (client );
552571
572+ #ifdef CONFIG_LEDS_TRIGGER_MULTI_CTRL
573+ led_multi_control_exit (& client -> dev );
574+ #endif
553575 for (i = 0 ; i < priv -> num_leds ; i ++ ) {
554576 struct is31fl32xx_led_data * led_data =
555577 & priv -> leds [i ];
556578 cancel_delayed_work_sync (& led_data -> register_work );
557579 cancel_work_sync (& led_data -> brightness_work );
580+ #ifdef CONFIG_LEDS_TRIGGER_MULTI_CTRL
581+ led_multi_control_unregister (& led_data -> cdev );
582+ #endif
558583 }
559-
560- return is31fl32xx_reset_regs (priv );
584+ return is31fl32xx_software_shutdown (priv , true);
561585}
562586
563587static void is31fl32xx_shutdown (struct i2c_client * client )
564588{
565589 int i ;
566590 struct is31fl32xx_priv * priv = i2c_get_clientdata (client );
567591
592+ #ifdef CONFIG_LEDS_TRIGGER_MULTI_CTRL
593+ led_multi_control_exit (& client -> dev );
594+ #endif
568595 for (i = 0 ; i < priv -> num_leds ; i ++ ) {
569596 struct is31fl32xx_led_data * led_data =
570597 & priv -> leds [i ];
571598 cancel_delayed_work_sync (& led_data -> register_work );
572599 cancel_work_sync (& led_data -> brightness_work );
600+ #ifdef CONFIG_LEDS_TRIGGER_MULTI_CTRL
601+ led_multi_control_unregister (& led_data -> cdev );
602+ #endif
573603 }
574604
575- is31fl32xx_reset_regs (priv );
605+ is31fl32xx_software_shutdown (priv , true );
576606 gpiod_set_value (priv -> reset_gpio , 0 );
577607}
578608
0 commit comments