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

Commit f960132e authored by Subbaraman Narayanamurthy's avatar Subbaraman Narayanamurthy
Browse files

leds: qpnp-flash-v2: Fix the macro calculations



Some of the macros used for calculations are incorrect when
values like 0 are passed. Fix them.

CRs-Fixed: 2165402
Change-Id: I6428704169a83e420236b58b310bdd1acaa3a948
Signed-off-by: default avatarSubbaraman Narayanamurthy <subbaram@codeaurora.org>
parent ad16cf89
Loading
Loading
Loading
Loading
+34 −12
Original line number Diff line number Diff line
/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -99,11 +99,8 @@

#define	VPH_DROOP_DEBOUNCE_US_TO_VAL(val_us)	(val_us / 8)
#define	VPH_DROOP_HYST_MV_TO_VAL(val_mv)	(val_mv / 25)
#define	VPH_DROOP_THRESH_MV_TO_VAL(val_mv)	((val_mv / 100) - 25)
#define	VPH_DROOP_THRESH_VAL_TO_UV(val)		((val + 25) * 100000)
#define	MITIGATION_THRSH_MA_TO_VAL(val_ma)	(val_ma / 100)
#define	CURRENT_MA_TO_REG_VAL(curr_ma, ires_ua)	((curr_ma * 1000) / ires_ua - 1)
#define	SAFETY_TMR_TO_REG_VAL(duration_ms)	((duration_ms / 10) - 1)
#define	THERMAL_HYST_TEMP_TO_VAL(val, divisor)	(val / divisor)

#define	FLASH_LED_ISC_WARMUP_DELAY_SHIFT	6
@@ -317,6 +314,14 @@ static int max_ires_curr_ma_table[MAX_IRES_LEVELS] = {
	FLASH_LED_IRES7P5_MAX_CURR_MA, FLASH_LED_IRES5P0_MAX_CURR_MA
};

static inline int get_current_reg_code(int target_curr_ma, int ires_ua)
{
	if (!ires_ua || !target_curr_ma || (target_curr_ma < (ires_ua / 1000)))
		return 0;

	return DIV_ROUND_UP(target_curr_ma * 1000, ires_ua) - 1;
}

static int qpnp_flash_led_read(struct qpnp_flash_led *led, u16 addr, u8 *data)
{
	int rc;
@@ -542,7 +547,7 @@ static int qpnp_flash_led_init_settings(struct qpnp_flash_led *led)
		return rc;

	if (led->pdata->led1n2_iclamp_low_ma) {
		val = CURRENT_MA_TO_REG_VAL(led->pdata->led1n2_iclamp_low_ma,
		val = get_current_reg_code(led->pdata->led1n2_iclamp_low_ma,
						led->fnode[LED1].ires_ua);
		rc = qpnp_flash_led_masked_write(led,
				FLASH_LED_REG_LED1N2_ICLAMP_LOW(led->base),
@@ -552,7 +557,7 @@ static int qpnp_flash_led_init_settings(struct qpnp_flash_led *led)
	}

	if (led->pdata->led1n2_iclamp_mid_ma) {
		val = CURRENT_MA_TO_REG_VAL(led->pdata->led1n2_iclamp_mid_ma,
		val = get_current_reg_code(led->pdata->led1n2_iclamp_mid_ma,
						led->fnode[LED1].ires_ua);
		rc = qpnp_flash_led_masked_write(led,
				FLASH_LED_REG_LED1N2_ICLAMP_MID(led->base),
@@ -562,7 +567,7 @@ static int qpnp_flash_led_init_settings(struct qpnp_flash_led *led)
	}

	if (led->pdata->led3_iclamp_low_ma) {
		val = CURRENT_MA_TO_REG_VAL(led->pdata->led3_iclamp_low_ma,
		val = get_current_reg_code(led->pdata->led3_iclamp_low_ma,
						led->fnode[LED3].ires_ua);
		rc = qpnp_flash_led_masked_write(led,
				FLASH_LED_REG_LED3_ICLAMP_LOW(led->base),
@@ -572,7 +577,7 @@ static int qpnp_flash_led_init_settings(struct qpnp_flash_led *led)
	}

	if (led->pdata->led3_iclamp_mid_ma) {
		val = CURRENT_MA_TO_REG_VAL(led->pdata->led3_iclamp_mid_ma,
		val = get_current_reg_code(led->pdata->led3_iclamp_mid_ma,
						led->fnode[LED3].ires_ua);
		rc = qpnp_flash_led_masked_write(led,
				FLASH_LED_REG_LED3_ICLAMP_MID(led->base),
@@ -992,7 +997,7 @@ static void qpnp_flash_led_node_set(struct flash_node_data *fnode, int value)
	}
	fnode->current_ma = prgm_current_ma;
	fnode->cdev.brightness = prgm_current_ma;
	fnode->current_reg_val = CURRENT_MA_TO_REG_VAL(prgm_current_ma,
	fnode->current_reg_val = get_current_reg_code(prgm_current_ma,
					fnode->ires_ua);
	fnode->led_on = prgm_current_ma != 0;

@@ -1430,6 +1435,22 @@ int qpnp_flash_led_unregister_irq_notifier(struct notifier_block *nb)
	return atomic_notifier_chain_unregister(&irq_notifier_list, nb);
}

static inline u8 get_safety_timer_code(u32 duration_ms)
{
	if (!duration_ms)
		return 0;

	return (duration_ms / 10) - 1;
}

static inline u8 get_vph_droop_thresh_code(u32 val_mv)
{
	if (!val_mv)
		return 0;

	return (val_mv / 100) - 25;
}

static int qpnp_flash_led_parse_each_led_dt(struct qpnp_flash_led *led,
			struct flash_node_data *fnode, struct device_node *node)
{
@@ -1521,8 +1542,9 @@ static int qpnp_flash_led_parse_each_led_dt(struct qpnp_flash_led *led,
	fnode->duration = FLASH_LED_SAFETY_TMR_DISABLED;
	rc = of_property_read_u32(node, "qcom,duration-ms", &val);
	if (!rc) {
		fnode->duration = (u8)(SAFETY_TMR_TO_REG_VAL(val) |
					FLASH_LED_SAFETY_TMR_ENABLE);
		fnode->duration = get_safety_timer_code(val);
		if (fnode->duration)
			fnode->duration |= FLASH_LED_SAFETY_TMR_ENABLE;
	} else if (rc == -EINVAL) {
		if (fnode->type == FLASH_LED_TYPE_FLASH) {
			pr_err("Timer duration is required for flash LED\n");
@@ -1968,7 +1990,7 @@ static int qpnp_flash_led_parse_common_dt(struct qpnp_flash_led *led,
	rc = of_property_read_u32(node, "qcom,vph-droop-threshold-mv", &val);
	if (!rc) {
		led->pdata->vph_droop_threshold =
			VPH_DROOP_THRESH_MV_TO_VAL(val);
			get_vph_droop_thresh_code(val);
	} else if (rc != -EINVAL) {
		pr_err("Unable to read VPH droop threshold, rc=%d\n", rc);
		return rc;