Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0e4d2cfe authored by Chun Zhang's avatar Chun Zhang Committed by Abinaya P
Browse files

leds: leds-qpnp-flash: provide runtime detection for torch LED



Torch LEDs were hard coded as 2, 3 in LED array and whenever torch is
in use, driver dereference LED node 2 and 3 to utilize it. However,
when there is only one flash LED, torch will be placed at index 1 in
LED array and driver cannot access torch at all. To address this issue
update switch node type when torch or flash is utilized to detect LED
in use is torch or flash.

Change-Id: I55c7088388fc7a651ab5c16cc9821759f46c8cc7
Signed-off-by: default avatarChun Zhang <chunz@codeaurora.org>
parent 75d530af
Loading
Loading
Loading
Loading
+12 −27
Original line number Diff line number Diff line
@@ -1096,11 +1096,7 @@ static void qpnp_flash_led_work(struct work_struct *work)
		}
	}

	if (((led->flash_node[2].flash_on ||
		led->flash_node[3].flash_on) &&
		!led->flash_node[0].flash_on &&
		!led->flash_node[1].flash_on) ||
		flash_node->type == TORCH) {
	if (flash_node->type == TORCH) {
		rc = qpnp_led_masked_write(led->spmi_dev,
			FLASH_LED_UNLOCK_SECURE(led->base),
			FLASH_SECURE_MASK, FLASH_UNLOCK_SECURE);
@@ -1120,10 +1116,6 @@ static void qpnp_flash_led_work(struct work_struct *work)
		}
		if (led->flash_node[led->num_leds - 1].id ==
							FLASH_LED_SWITCH) {
			flash_node->trigger = 0;
			if (led->flash_node[2].flash_on)
				flash_node->trigger |= FLASH_LED0_TRIGGER;

			val = (u8)(led->flash_node[2].prgm_current *
						FLASH_TORCH_MAX_LEVEL
					/ led->flash_node[2].max_current);
@@ -1136,9 +1128,6 @@ static void qpnp_flash_led_work(struct work_struct *work)
				goto exit_flash_led_work;
			}

			if (led->flash_node[3].flash_on)
				flash_node->trigger |= FLASH_LED1_TRIGGER;

			val = (u8)(led->flash_node[3].prgm_current *
						FLASH_TORCH_MAX_LEVEL
					/ led->flash_node[3].max_current);
@@ -1250,11 +1239,7 @@ static void qpnp_flash_led_work(struct work_struct *work)
				"Strobe ctrl reg write failed\n");
			goto exit_flash_led_work;
		}
	} else if (((led->flash_node[0].flash_on ||
			led->flash_node[1].flash_on) &&
			!led->flash_node[2].flash_on &&
			!led->flash_node[3].flash_on) ||
			flash_node->type == FLASH) {
	} else if (flash_node->type == FLASH) {
		if (led->flash_node[0].flash_on)
			max_curr_avail_ma += led->flash_node[0].max_current;
		if (led->flash_node[1].flash_on)
@@ -1303,7 +1288,6 @@ static void qpnp_flash_led_work(struct work_struct *work)

		if (led->flash_node[led->num_leds - 1].id ==
							FLASH_LED_SWITCH) {
			flash_node->trigger = 0;
			if (led->flash_node[0].flash_on &&
					led->flash_node[1].flash_on) {
				if (max_curr_avail_ma <
@@ -1317,22 +1301,13 @@ static void qpnp_flash_led_work(struct work_struct *work)
							* max_curr_avail_ma /
						flash_node->prgm_current;
				}
				flash_node->trigger = FLASH_LED0_TRIGGER |
							FLASH_LED1_TRIGGER;
			} else {
				if (led->flash_node[0].flash_on)
					flash_node->trigger |=
							FLASH_LED0_TRIGGER;

				led->flash_node[0].prgm_current
					= (max_curr_avail_ma <
					led->flash_node[0].prgm_current)
					? max_curr_avail_ma :
					led->flash_node[0].prgm_current;

				if (led->flash_node[1].flash_on)
					flash_node->trigger |=
							FLASH_LED1_TRIGGER;
				led->flash_node[1].prgm_current
					= (max_curr_avail_ma <
					led->flash_node[1].prgm_current)
@@ -1568,12 +1543,22 @@ static void qpnp_flash_led_brightness_set(struct led_classdev *led_cdev,
	flash_node->cdev.brightness = value;
	if (led->flash_node[led->num_leds - 1].id ==
						FLASH_LED_SWITCH) {
		if (flash_node->type == TORCH)
			led->flash_node[led->num_leds - 1].type = TORCH;
		else if (flash_node->type == FLASH)
			led->flash_node[led->num_leds - 1].type = FLASH;

		if (flash_node->id == FLASH_LED_0 ||
					 flash_node->id == FLASH_LED_1) {
			if (value < FLASH_LED_MIN_CURRENT_MA && value != 0)
				value = FLASH_LED_MIN_CURRENT_MA;
			flash_node->prgm_current = value;
			flash_node->flash_on = value ? true : false;
			if (value)
				led->flash_node[led->num_leds - 1].trigger |=
						0x80 >> flash_node->id;
			else
				led->flash_node[led->num_leds - 1].trigger = 0;
			return;
		} else if (flash_node->id == FLASH_LED_SWITCH) {
			if (led->flash_node[0].flash_on ||