Loading drivers/leds/leds-qpnp-flash-v2.c +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 Loading Loading @@ -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 Loading Loading @@ -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; Loading Loading @@ -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), Loading @@ -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), Loading @@ -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), Loading @@ -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), Loading Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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"); Loading Loading @@ -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 Loading
drivers/leds/leds-qpnp-flash-v2.c +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 Loading Loading @@ -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 Loading Loading @@ -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; Loading Loading @@ -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), Loading @@ -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), Loading @@ -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), Loading @@ -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), Loading Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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"); Loading Loading @@ -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