Merge "leds: qpnp-flash-v2: Add support for configuring hardware mitigation"
This commit is contained in:
commit
e657410985
2 changed files with 32 additions and 0 deletions
|
@ -50,6 +50,10 @@ Optional properties:
|
|||
Default value is 2.
|
||||
- qcom,lmh-level : Optional property to configure flash current preemptive mitigation.
|
||||
Accepted values are 0, 1, and 3. Default value is 0.
|
||||
- qcom,iled-thrsh-ma : Optional property to configure the led current threshold at which HW
|
||||
preemptive mitigation is triggered. Unit is mA. Default value is 1000.
|
||||
Accepted values are in the range 0 - 3100, with steps of 100.
|
||||
0 disables autonomous HW mitigation.
|
||||
- qcom,thermal-derate-en : Boolean property to enable flash current thermal mitigation.
|
||||
- qcom,thermal-derate-current : Array of currrent limits for thermal mitigation. Required if
|
||||
qcom,thermal-derate-en is specified. Unit is mA. Format is
|
||||
|
|
|
@ -48,6 +48,7 @@
|
|||
#define FLASH_LED_REG_THERMAL_THRSH3(base) (base + 0x58)
|
||||
#define FLASH_LED_REG_VPH_DROOP_THRESHOLD(base) (base + 0x61)
|
||||
#define FLASH_LED_REG_VPH_DROOP_DEBOUNCE(base) (base + 0x62)
|
||||
#define FLASH_LED_REG_ILED_GRT_THRSH(base) (base + 0x67)
|
||||
#define FLASH_LED_REG_MITIGATION_SEL(base) (base + 0x6E)
|
||||
#define FLASH_LED_REG_MITIGATION_SW(base) (base + 0x6F)
|
||||
#define FLASH_LED_REG_LMH_LEVEL(base) (base + 0x70)
|
||||
|
@ -63,6 +64,7 @@
|
|||
#define FLASH_LED_CURRENT_DERATE_EN_MASK GENMASK(2, 0)
|
||||
#define FLASH_LED_VPH_DROOP_DEBOUNCE_MASK GENMASK(1, 0)
|
||||
#define FLASH_LED_LMH_MITIGATION_SEL_MASK GENMASK(1, 0)
|
||||
#define FLASH_LED_ILED_GRT_THRSH_MASK GENMASK(5, 0)
|
||||
#define FLASH_LED_LMH_LEVEL_MASK GENMASK(1, 0)
|
||||
#define FLASH_LED_VPH_DROOP_HYSTERESIS_MASK GENMASK(5, 4)
|
||||
#define FLASH_LED_VPH_DROOP_THRESHOLD_MASK GENMASK(2, 0)
|
||||
|
@ -78,6 +80,7 @@
|
|||
#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 FLASH_LED_ISC_WARMUP_DELAY_SHIFT 6
|
||||
#define FLASH_LED_WARMUP_DELAY_DEFAULT 2
|
||||
|
@ -101,6 +104,8 @@
|
|||
#define FLASH_LED_LMH_MITIGATION_DISABLE 0
|
||||
#define FLASH_LED_LMH_MITIGATION_SEL_DEFAULT 2
|
||||
#define FLASH_LED_LMH_MITIGATION_SEL_MAX 2
|
||||
#define FLASH_LED_MITIGATION_THRSH_DEFAULT 0xA
|
||||
#define FLASH_LED_MITIGATION_THRSH_MAX 0x1F
|
||||
#define FLASH_LED_LMH_OCV_THRESH_DEFAULT_UV 3700000
|
||||
#define FLASH_LED_LMH_RBATT_THRESH_DEFAULT_UOHM 400000
|
||||
#define FLASH_LED_IRES_BASE 3
|
||||
|
@ -200,6 +205,7 @@ struct flash_led_platform_data {
|
|||
u8 vph_droop_debounce;
|
||||
u8 lmh_mitigation_sel;
|
||||
u8 lmh_level;
|
||||
u8 iled_thrsh_val;
|
||||
u8 hw_strobe_option;
|
||||
bool hdrm_auto_mode_en;
|
||||
bool thermal_derate_en;
|
||||
|
@ -358,6 +364,13 @@ static int qpnp_flash_led_init_settings(struct qpnp_flash_led *led)
|
|||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
rc = qpnp_flash_led_masked_write(led,
|
||||
FLASH_LED_REG_ILED_GRT_THRSH(led->base),
|
||||
FLASH_LED_ILED_GRT_THRSH_MASK,
|
||||
led->pdata->iled_thrsh_val);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1664,6 +1677,21 @@ static int qpnp_flash_led_parse_common_dt(struct qpnp_flash_led *led,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
led->pdata->iled_thrsh_val = FLASH_LED_MITIGATION_THRSH_DEFAULT;
|
||||
rc = of_property_read_u32(node, "qcom,iled-thrsh-ma", &val);
|
||||
if (!rc) {
|
||||
led->pdata->iled_thrsh_val = MITIGATION_THRSH_MA_TO_VAL(val);
|
||||
} else if (rc != -EINVAL) {
|
||||
dev_err(&led->pdev->dev, "Unable to parse iled_thrsh_val, rc=%d\n",
|
||||
rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (led->pdata->iled_thrsh_val > FLASH_LED_MITIGATION_THRSH_MAX) {
|
||||
dev_err(&led->pdev->dev, "Invalid iled_thrsh_val specified\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
led->pdata->all_ramp_up_done_irq =
|
||||
of_irq_get_byname(node, "all-ramp-up-done-irq");
|
||||
if (led->pdata->all_ramp_up_done_irq < 0)
|
||||
|
|
Loading…
Add table
Reference in a new issue