Skip to content

Commit 0c3d587

Browse files
Wenping Zhangrkhuangtao
authored andcommitted
leds: leds-is31fl32xx: enable multi-control mode and solve register failed issue during reboot.
Change-Id: I299ae4c97adde806c10ce74d2b843a82a4956682 Signed-off-by: Wenping Zhang <wenping.zhang@rock-chips.com>
1 parent f745a93 commit 0c3d587

1 file changed

Lines changed: 36 additions & 6 deletions

File tree

drivers/leds/leds-is31fl32xx.c

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
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 = {
151154
static 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+
*/
273284
static 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

290302
static 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

563587
static 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

Comments
 (0)