diff --git a/drivers/leds/leds-qpnp-flash-v2.c b/drivers/leds/leds-qpnp-flash-v2.c index ec3f68b5d406..b4ec36fd3cdf 100644 --- a/drivers/leds/leds-qpnp-flash-v2.c +++ b/drivers/leds/leds-qpnp-flash-v2.c @@ -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; @@ -1431,6 +1436,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) { @@ -1522,8 +1543,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"); @@ -1969,7 +1991,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;