diff --git a/drivers/leds/aw2033/leds_aw2033.c b/drivers/leds/aw2033/leds_aw2033.c index 5a52b312479e..d0d2f4219628 100644 --- a/drivers/leds/aw2033/leds_aw2033.c +++ b/drivers/leds/aw2033/leds_aw2033.c @@ -59,6 +59,7 @@ #define AW2033_LED_MANUAL_PWM_MASK 0xFF #define AW2033_LED_FADEIN_MODE_MASK 0x20 #define AW2033_LED_FADEOUT_MODE_MASK 0x40 +#define AW2033_CLEAR_MASK 0x00 #define MAX_RISE_TIME_MS 15 #define MAX_HOLD_TIME_MS 15 @@ -137,8 +138,17 @@ static int aw2033_read(struct aw2033_led *led, u8 reg, u8 *val) static void aw2033_soft_reset(struct aw2033_led *led) { - aw2033_write(led, AW2033_REG_RESET, AW2033_RESET_MASK); - msleep(5); + int reg; + + /* don't use reset reg, it cause CHGDIS enable */ + /* aw2033_write(led, AW2033_REG_RESET, AW2033_RESET_MASK); */ + aw2033_write(led, AW2033_REG_GCR1, AW2033_CHARGE_DISABLE_MASK); + aw2033_write(led, AW2033_REG_GCR2, AW2033_CLEAR_MASK); + + for (reg = AW2033_REG_LEDEN; reg <= AW2033_REG_LED2T2; reg++) + aw2033_write(led, reg, AW2033_CLEAR_MASK); + + /* msleep(5); */ /* don't need delay anymore*/ } static void aw2033_brightness_work(struct work_struct *work) @@ -149,10 +159,10 @@ static void aw2033_brightness_work(struct work_struct *work) mutex_lock(&led->pdata->led->lock); - /* enable aw2033 if disabled */ aw2033_read(led, AW2033_REG_GCR1, &val); - if (!(val&AW2033_CHIP_ENABLE_MASK)) { + /*only enable when brightness is bigger than 0, avoid blink when boot */ + if ((led->cdev.brightness > 0) && !(val&AW2033_CHIP_ENABLE_MASK)) { aw2033_write(led, AW2033_REG_GCR1, AW2033_CHARGE_DISABLE_MASK | AW2033_CHIP_ENABLE_MASK); msleep(2); @@ -194,7 +204,8 @@ static void aw2033_led_blink_set(struct aw2033_led *led, unsigned long blinking) /* enable aw2033 if disabled */ aw2033_read(led, AW2033_REG_GCR1, &val); - if (!(val&AW2033_CHIP_ENABLE_MASK)) { + /*only enable when blinking is bigger than 0, avoid blink when boot */ + if ((blinking > 0) && !(val&AW2033_CHIP_ENABLE_MASK)) { aw2033_write(led, AW2033_REG_GCR1, AW2033_CHARGE_DISABLE_MASK | AW2033_CHIP_ENABLE_MASK); msleep(2);