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

Commit 3b00fbf7 authored by Jigarkumar Kishorkumar Zala's avatar Jigarkumar Kishorkumar Zala
Browse files

leds: leds-qpnp-flash: change to dynamic LED trigger



Change to dynamic LED trigger, in order to update strobe
trigger register as per LED request events. This change
helps to trigger only requested LED and isolate
other LEDs.

Change-Id: I6f3bcefa02513ff653b1857760c3b32de02365a9
Signed-off-by: default avatarJigarkumar Kishorkumar Zala <j_zala@codeaurora.org>
parent 55bc7ff0
Loading
Loading
Loading
Loading
+144 −118
Original line number Diff line number Diff line
@@ -793,21 +793,8 @@ 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;
	u8 val, tmp;
	int rc, i;

	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 module enable reg\n");
		return -EINVAL;
	}

	tmp = ~flash_node->trigger & val;
	if (!tmp) {
	rc = qpnp_led_masked_write(led->spmi_dev,
			FLASH_LED_UNLOCK_SECURE(led->base),
			FLASH_SECURE_MASK, FLASH_UNLOCK_SECURE);
@@ -826,6 +813,30 @@ static int qpnp_flash_led_module_disable(struct qpnp_flash_led *led,
		return -EINVAL;
	}

	if (led->pdata->hdrm_sns_ch0_en) {
		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) {
		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,
			FLASH_MODULE_ENABLE_CTRL(led->base),
			FLASH_MODULE_ENABLE_MASK,
@@ -881,40 +892,9 @@ static int qpnp_flash_led_module_disable(struct qpnp_flash_led *led,
			return -EINVAL;
		}
	}
	} else {
		rc = qpnp_led_masked_write(led->spmi_dev,
			FLASH_MODULE_ENABLE_CTRL(led->base),
			FLASH_MODULE_ENABLE_MASK,
			FLASH_LED_MODULE_CTRL_DEFAULT);
		if (rc) {
			dev_err(&led->spmi_dev->dev, "Module disable failed\n");
			return -EINVAL;
		}
	}

	if (led->pdata->hdrm_sns_ch0_en) {
		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) {
		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;
		}
	}
	for (i = 0; i < led->num_leds; i++)
		led->flash_node[i].flash_on = false;

	return 0;
}
@@ -1036,7 +1016,10 @@ static void qpnp_flash_led_work(struct work_struct *work)
		}
		if (led->flash_node[led->num_leds - 1].id ==
							FLASH_LED_SWITCH) {
			if (led->flash_node[2].flash_on) {
			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);
@@ -1048,9 +1031,10 @@ static void qpnp_flash_led_work(struct work_struct *work)
					"Torch reg write failed\n");
				goto exit_flash_led_work;
			}
			}

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

			val = (u8)(flash_node[3].prgm_current *
						FLASH_TORCH_MAX_LEVEL
					/ led->flash_node[3].max_current);
@@ -1061,8 +1045,6 @@ static void qpnp_flash_led_work(struct work_struct *work)
				dev_err(&led->spmi_dev->dev,
					"Torch reg write failed\n");
				goto exit_flash_led_work;

				}
			}
		} else {
			val = (u8)(flash_node->prgm_current *
@@ -1107,8 +1089,8 @@ static void qpnp_flash_led_work(struct work_struct *work)
			goto exit_flash_led_work;
		}

		if (led->flash_node[2].flash_on) {
		if (led->pdata->hdrm_sns_ch0_en) {
			if (led->flash_node[2].flash_on) {
				rc = qpnp_led_masked_write(led->spmi_dev,
					FLASH_HDRM_SNS_ENABLE_CTRL0(led->base),
					FLASH_LED_HDRM_SNS_ENABLE_MASK,
@@ -1118,11 +1100,21 @@ static void qpnp_flash_led_work(struct work_struct *work)
					"Headroom sense enable failed\n");
					goto exit_flash_led_work;
				}
			} else {
				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_led_work;
				}
			}
		}

		if (led->flash_node[3].flash_on) {
		if (led->pdata->hdrm_sns_ch1_en) {
			if (led->flash_node[3].flash_on) {
				rc = qpnp_led_masked_write(led->spmi_dev,
					FLASH_HDRM_SNS_ENABLE_CTRL1(led->base),
					FLASH_LED_HDRM_SNS_ENABLE_MASK,
@@ -1132,12 +1124,22 @@ static void qpnp_flash_led_work(struct work_struct *work)
					"Headroom sense enable failed\n");
					goto exit_flash_led_work;
				}
			} else {
				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_led_work;
				}
			}
		}

		rc = qpnp_led_masked_write(led->spmi_dev,
			FLASH_LED_STROBE_CTRL(led->base),
			flash_node->trigger,
			FLASH_STROBE_MASK,
			flash_node->trigger);
		if (rc) {
			dev_err(&led->spmi_dev->dev,
@@ -1196,6 +1198,7 @@ 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 <
@@ -1209,23 +1212,28 @@ 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) {
				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) {
				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)
					? max_curr_avail_ma :
					led->flash_node[1].prgm_current;
			}
			}

			val = (u8)(led->flash_node[0].prgm_current *
						FLASH_MAX_LEVEL /
@@ -1320,8 +1328,8 @@ static void qpnp_flash_led_work(struct work_struct *work)
						FLASH_RAMP_UP_DELAY_US_MAX);
		}

		if (led->flash_node[0].flash_on) {
		if (led->pdata->hdrm_sns_ch0_en) {
			if (led->flash_node[0].flash_on) {
				rc = qpnp_led_masked_write(led->spmi_dev,
					FLASH_HDRM_SNS_ENABLE_CTRL0(led->base),
					FLASH_LED_HDRM_SNS_ENABLE_MASK,
@@ -1331,11 +1339,21 @@ static void qpnp_flash_led_work(struct work_struct *work)
					"Headroom sense enable failed\n");
					goto exit_flash_led_work;
				}
			} else {
				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_led_work;
				}
			}
		}

		if (led->flash_node[1].flash_on) {
		if (led->pdata->hdrm_sns_ch1_en) {
			if (led->flash_node[1].flash_on) {
				rc = qpnp_led_masked_write(led->spmi_dev,
					FLASH_HDRM_SNS_ENABLE_CTRL1(led->base),
					FLASH_LED_HDRM_SNS_ENABLE_MASK,
@@ -1345,12 +1363,22 @@ static void qpnp_flash_led_work(struct work_struct *work)
					"Headroom sense enable failed\n");
					goto exit_flash_led_work;
				}
			} else {
				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_led_work;
				}
			}
		}

		rc = qpnp_led_masked_write(led->spmi_dev,
			FLASH_LED_STROBE_CTRL(led->base),
			flash_node->trigger,
			FLASH_STROBE_MASK,
			flash_node->trigger);
		if (rc) {
			dev_err(&led->spmi_dev->dev,
@@ -1448,8 +1476,6 @@ static void qpnp_flash_led_brightness_set(struct led_classdev *led_cdev,
				flash_node->prgm_current =
					led->flash_node[0].prgm_current +
					led->flash_node[1].prgm_current;
			flash_node->trigger = FLASH_LED0_TRIGGER |
						 FLASH_LED1_TRIGGER;
			schedule_work(&flash_node->work);
			return;
		}