diff --git a/drivers/leds/leds-qti-flash.c b/drivers/leds/leds-qti-flash.c index b77faa29312b..790a2dc81f2b 100644 --- a/drivers/leds/leds-qti-flash.c +++ b/drivers/leds/leds-qti-flash.c @@ -469,17 +469,16 @@ static void qti_flash_led_brightness_set(struct led_classdev *led_cdev, led = fnode->led; if (!brightness) { - rc = qti_flash_led_disable(fnode); + rc = qti_flash_led_strobe(fnode->led, NULL, + FLASH_LED_ENABLE(fnode->id), 0); if (rc < 0) { - pr_err("Failed to set brightness %d to LED\n", - brightness); + pr_err("Failed to destrobe LED, rc=%d\n", rc); return; } - rc = qti_flash_led_strobe(fnode->led, NULL, - FLASH_LED_ENABLE(fnode->id), 0); + rc = qti_flash_led_disable(fnode); if (rc < 0) - pr_err("Failed to destrobe LED, rc=%d\n", rc); + pr_err("Failed to disable LED\n"); return; } @@ -600,6 +599,21 @@ static int qti_flash_switch_disable(struct flash_switch_data *snode) int rc = 0, i; u8 led_dis = 0; + for (i = 0; i < led->num_fnodes; i++) { + if (!(snode->led_mask & BIT(led->fnode[i].id)) || + !led->fnode[i].configured) + continue; + + led_dis |= BIT(led->fnode[i].id); + } + + rc = qti_flash_led_strobe(led, NULL, led_dis, ~led_dis); + if (rc < 0) { + pr_err("Failed to destrobe LEDs under with switch, rc=%d\n", + rc); + return rc; + } + for (i = 0; i < led->num_fnodes; i++) { /* * Do not turn OFF flash/torch device if @@ -607,7 +621,7 @@ static int qti_flash_switch_disable(struct flash_switch_data *snode) * ii. brightness is not configured for device under this switch */ if (!(snode->led_mask & BIT(led->fnode[i].id)) || - !led->fnode[i].configured) + !led->fnode[i].configured) continue; rc = qti_flash_led_disable(&led->fnode[i]); @@ -616,14 +630,12 @@ static int qti_flash_switch_disable(struct flash_switch_data *snode) &led->fnode[i].id); break; } - - led_dis |= (1 << led->fnode[i].id); } snode->on_time_ms = 0; snode->off_time_ms = 0; - return qti_flash_led_strobe(led, NULL, led_dis, ~led_dis); + return rc; } static void qti_flash_led_switch_brightness_set( @@ -1108,20 +1120,25 @@ static int qti_flash_strobe_set(struct led_classdev_flash *fdev, if (fnode->enabled == state) return 0; - if (!state) { - rc = qti_flash_led_disable(fnode); - if (rc < 0) { - pr_err("Failed to disable LED %u\n", fnode->id); - return rc; - } - } + if (state && !fnode->configured) + return -EINVAL; mask = FLASH_LED_ENABLE(fnode->id); value = state ? FLASH_LED_ENABLE(fnode->id) : 0; rc = qti_flash_led_strobe(fnode->led, NULL, mask, value); - if (!rc) - fnode->enabled = state; + if (rc < 0) { + pr_err("Failed to %s LED, rc=%d\n", + state ? "strobe" : "desrobe", rc); + return rc; + } + fnode->enabled = state; + + if (!state) { + rc = qti_flash_led_disable(fnode); + if (rc < 0) + pr_err("Failed to disable LED %u\n", fnode->id); + } return rc; }