generate a 5ms low pulse on sdb pin when startup, then the chip becomes more stable in the complex EM environment. Signed-off-by: Grant Feng <von81@xxxxxxx> --- drivers/leds/leds-is31fl32xx.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/drivers/leds/leds-is31fl32xx.c b/drivers/leds/leds-is31fl32xx.c index cd768f991da1..07b543120e06 100644 --- a/drivers/leds/leds-is31fl32xx.c +++ b/drivers/leds/leds-is31fl32xx.c @@ -16,6 +16,8 @@ #include <linux/module.h> #include <linux/of.h> #include <linux/of_device.h> +#include <linux/delay.h> +#include <linux/gpio/consumer.h> /* Used to indicate a device has no such register */ #define IS31FL32XX_REG_NONE 0xFF @@ -43,6 +45,7 @@ struct is31fl32xx_led_data { struct is31fl32xx_priv { const struct is31fl32xx_chipdef *cdef; struct i2c_client *client; + struct gpio_desc *sdb_gpio; unsigned int num_leds; struct is31fl32xx_led_data leds[]; }; @@ -282,11 +285,17 @@ static int is31fl32xx_software_shutdown(struct is31fl32xx_priv *priv, return 0; } -static int is31fl32xx_init_regs(struct is31fl32xx_priv *priv) +static int is31fl32xx_init(struct is31fl32xx_priv *priv) { const struct is31fl32xx_chipdef *cdef = priv->cdef; int ret; + if (priv->sdb_gpio) { + gpiod_direction_output(priv->sdb_gpio, 0); + mdelay(5); + gpiod_direction_output(priv->sdb_gpio, 1); + } + ret = is31fl32xx_reset_regs(priv); if (ret) return ret; @@ -372,6 +381,15 @@ static int is31fl32xx_parse_dt(struct device *dev, struct device_node *child; int ret = 0; + priv->sdb_gpio = devm_gpiod_get_optional(dev, + "sdb", + GPIOD_OUT_HIGH); + if (IS_ERR(priv->sdb_gpio)) { + ret = PTR_ERR(priv->sdb_gpio); + dev_err(dev, "Failed to get sdb gpio: %d\n", ret); + return ret; + } + for_each_child_of_node(dev->of_node, child) { struct is31fl32xx_led_data *led_data = &priv->leds[priv->num_leds]; @@ -453,11 +471,11 @@ static int is31fl32xx_probe(struct i2c_client *client, priv->cdef = cdef; i2c_set_clientdata(client, priv); - ret = is31fl32xx_init_regs(priv); + ret = is31fl32xx_parse_dt(dev, priv); if (ret) return ret; - ret = is31fl32xx_parse_dt(dev, priv); + ret = is31fl32xx_init(priv); if (ret) return ret; -- 2.17.1