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

Commit 5857ed08 authored by Jigarkumar Kishorkumar Zala's avatar Jigarkumar Kishorkumar Zala
Browse files

leds: leds-qpnp-flash: add check for determining enabled flashLED module



Add check to determine enabled module, when module disablement sequence
is called. This check is necessary in order to avoid module disablement
when anyone of the flash/torch LED is in use.

Change-Id: I5d041ea531a78ce60ef0a793489602e3317f981a
Signed-off-by: default avatarJigarkumar Kishorkumar Zala <j_zala@codeaurora.org>
Signed-off-by: default avatarAbinaya P <abinayap@codeaurora.org>
parent d6287a3c
Loading
Loading
Loading
Loading
+90 −74
Original line number Diff line number Diff line
@@ -252,7 +252,7 @@ struct qpnp_flash_led {

static u8 qpnp_flash_led_ctrl_dbg_regs[] = {
	0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
	0x4A, 0x4B, 0x4C, 0x4F, 0x51, 0x52, 0x54, 0x55, 0x5A
	0x4A, 0x4B, 0x4C, 0x4F, 0x51, 0x52, 0x54, 0x55, 0x5A, 0x5C, 0x5D,
};

static int flash_led_dbgfs_file_open(struct qpnp_flash_led *led,
@@ -898,8 +898,22 @@ static int qpnp_flash_led_module_disable(struct qpnp_flash_led *led,
				struct flash_node_data *flash_node)
{
	union power_supply_propval psy_prop;
	int rc, i;
	int rc;
	u8 val, tmp;

	rc = spmi_ext_register_readl(led->spmi_dev->ctrl,
				led->spmi_dev->sid,
				FLASH_LED_STROBE_CTRL(led->base),
				&val, 1);
	if (rc) {
		dev_err(&led->spmi_dev->dev,
				"Unable to read strobe reg\n");
		return -EINVAL;
	}

	tmp = (~flash_node->trigger) & val;
	if (!tmp) {
		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);
@@ -917,35 +931,6 @@ static int qpnp_flash_led_module_disable(struct qpnp_flash_led *led,
					"Torch reg write failed\n");
				return -EINVAL;
			}

	if (led->pdata->hdrm_sns_ch0_en) {
		if (flash_node->id == FLASH_LED_0 ||
				flash_node->id == FLASH_LED_SWITCH) {
			rc = qpnp_led_masked_write(led->spmi_dev,
				FLASH_HDRM_SNS_ENABLE_CTRL0(led->base),
				FLASH_LED_HDRM_SNS_ENABLE_MASK,
				FLASH_LED_HDRM_SNS_DISABLE);
			if (rc) {
				dev_err(&led->spmi_dev->dev,
					"Headroom sense disable failed\n");
				return rc;
			}
		}
	}

	if (led->pdata->hdrm_sns_ch1_en) {
		if (flash_node->id == FLASH_LED_1 ||
				flash_node->id == FLASH_LED_SWITCH) {
			rc = qpnp_led_masked_write(led->spmi_dev,
				FLASH_HDRM_SNS_ENABLE_CTRL1(led->base),
				FLASH_LED_HDRM_SNS_ENABLE_MASK,
				FLASH_LED_HDRM_SNS_DISABLE);
			if (rc) {
				dev_err(&led->spmi_dev->dev,
					"Headroom sense disable failed\n");
				return rc;
			}
		}
		}

		rc = qpnp_led_masked_write(led->spmi_dev,
@@ -953,7 +938,8 @@ static int qpnp_flash_led_module_disable(struct qpnp_flash_led *led,
				FLASH_MODULE_ENABLE_MASK,
				FLASH_LED_MODULE_CTRL_DEFAULT);
		if (rc) {
		dev_err(&led->spmi_dev->dev, "Module disable failed\n");
			dev_err(&led->spmi_dev->dev,
					"Module disable failed\n");
			return -EINVAL;
		}

@@ -979,11 +965,9 @@ static int qpnp_flash_led_module_disable(struct qpnp_flash_led *led,
				return -EINVAL;
			}
		}
	}

	if (flash_node->id == FLASH_LED_SWITCH)
		flash_node->trigger = 0;

	if (!(flash_node->trigger & FLASH_LED0_TRIGGER)) {
	if (flash_node->trigger & FLASH_LED0_TRIGGER) {
		rc = qpnp_led_masked_write(led->spmi_dev,
				led->current_addr,
				FLASH_CURRENT_MASK, 0x00);
@@ -992,9 +976,10 @@ static int qpnp_flash_led_module_disable(struct qpnp_flash_led *led,
				"current register write failed\n");
			return -EINVAL;
		}

	}

	if (!(flash_node->trigger & FLASH_LED1_TRIGGER)) {
	if (flash_node->trigger & FLASH_LED1_TRIGGER) {
		rc = qpnp_led_masked_write(led->spmi_dev,
				led->current2_addr,
				FLASH_CURRENT_MASK, 0x00);
@@ -1005,8 +990,8 @@ static int qpnp_flash_led_module_disable(struct qpnp_flash_led *led,
		}
	}

	for (i = 0; i < led->num_leds; i++)
		led->flash_node[i].flash_on = false;
	if (flash_node->id == FLASH_LED_SWITCH)
		flash_node->trigger = 0;

	return 0;
}
@@ -1492,14 +1477,45 @@ static void qpnp_flash_led_work(struct work_struct *work)
turn_off:
	rc = qpnp_led_masked_write(led->spmi_dev,
			FLASH_LED_STROBE_CTRL(led->base),
			flash_node->trigger, FLASH_LED_DISABLE);
			flash_node->id == FLASH_LED_SWITCH ? FLASH_STROBE_MASK
						: flash_node->trigger,
						FLASH_LED_DISABLE);
	if (rc) {
		dev_err(&led->spmi_dev->dev, "Strobe disable failed\n");
		goto exit_flash_led_work;
	}

	usleep_range(FLASH_RAMP_DN_DELAY_US_MIN, FLASH_RAMP_DN_DELAY_US_MAX);
exit_flash_hdrm_sns:
	if (led->pdata->hdrm_sns_ch0_en) {
		if (flash_node->id == FLASH_LED_0 ||
				flash_node->id == FLASH_LED_SWITCH) {
			rc = qpnp_led_masked_write(led->spmi_dev,
					FLASH_HDRM_SNS_ENABLE_CTRL0(led->base),
					FLASH_LED_HDRM_SNS_ENABLE_MASK,
					FLASH_LED_HDRM_SNS_DISABLE);
			if (rc) {
				dev_err(&led->spmi_dev->dev,
					"Headroom sense disable failed\n");
				goto exit_flash_hdrm_sns;
			}
		}
	}

	if (led->pdata->hdrm_sns_ch1_en) {
		if (flash_node->id == FLASH_LED_1 ||
				flash_node->id == FLASH_LED_SWITCH) {
			rc = qpnp_led_masked_write(led->spmi_dev,
					FLASH_HDRM_SNS_ENABLE_CTRL1(led->base),
					FLASH_LED_HDRM_SNS_ENABLE_MASK,
					FLASH_LED_HDRM_SNS_DISABLE);
			if (rc) {
				dev_err(&led->spmi_dev->dev,
					"Headroom sense disable failed\n");
				goto exit_flash_hdrm_sns;
			}
		}
	}
exit_flash_led_work:
	rc = qpnp_flash_led_module_disable(led, flash_node);
	if (rc) {
@@ -1555,9 +1571,13 @@ static void qpnp_flash_led_brightness_set(struct led_classdev *led_cdev,

			flash_node->prgm_current = value;
			flash_node->flash_on = value ? true : false;
			if (value) {
			if (value)
				led->flash_node[led->num_leds - 1].trigger |=
						(0x80 >> flash_node->id);
			else
				led->flash_node[led->num_leds - 1].trigger &=
						~(0x80 >> flash_node->id);

			if (flash_node->id == FLASH_LED_0)
				led->flash_node[led->num_leds - 1].
				prgm_current = flash_node->prgm_current;
@@ -1565,10 +1585,6 @@ static void qpnp_flash_led_brightness_set(struct led_classdev *led_cdev,
				led->flash_node[led->num_leds - 1].
				prgm_current2 =
				flash_node->prgm_current;
			} else {
				led->flash_node[led->num_leds - 1].trigger &=
						~(0x80 >> flash_node->id);
			}

			return;
		} else if (flash_node->id == FLASH_LED_SWITCH) {