mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
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: Subbaraman Narayanamurthy <subbaram@codeaurora.org>
This commit is contained in:
parent
ad16cf8944
commit
f960132e37
@ -1,4 +1,4 @@
|
||||
/* 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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user