10ms resolution. This is not required for switch node.
Optional properties inside child node:
+- qcom,current-ma : operational current intensity for LED in mA. Accepted values are a
+ positive integer in the range of 0 to qcom,max-current inclusive.
- qcom,ires-ua : Integer type to specify current resolution. Accepted values should be
12500, 10000, 7500, and 5000. Unit is uA.
- qcom,hdrm-voltage-mv : Integer type specifying headroom voltage. Values are from 125mV to 500mV
qcom,default-led-trigger =
"flash0_trigger";
qcom,id = <0>;
+ qcom,current-ma = <1000>;
qcom,duration-ms = <1280>;
qcom,ires-ua = <12500>;
qcom,hdrm-voltage-mv = <325>;
qcom,default-led-trigger =
"flash1_trigger";
qcom,id = <1>;
+ qcom,current-ma = <1000>;
qcom,duration-ms = <1280>;
qcom,ires-ua = <12500>;
qcom,hdrm-voltage-mv = <325>;
qcom,default-led-trigger =
"flash2_trigger";
qcom,id = <2>;
+ qcom,current-ma = <500>;
qcom,duration-ms = <1280>;
qcom,ires-ua = <12500>;
qcom,hdrm-voltage-mv = <325>;
qcom,default-led-trigger =
"torch0_trigger";
qcom,id = <0>;
+ qcom,current-ma = <300>;
qcom,ires-ua = <12500>;
qcom,hdrm-voltage-mv = <325>;
qcom,hdrm-vol-hi-lo-win-mv = <100>;
qcom,default-led-trigger =
"torch1_trigger";
qcom,id = <1>;
+ qcom,current-ma = <300>;
qcom,ires-ua = <12500>;
qcom,hdrm-voltage-mv = <325>;
qcom,hdrm-vol-hi-lo-win-mv = <100>;
qcom,default-led-trigger =
"torch2_trigger";
qcom,id = <2>;
+ qcom,current-ma = <300>;
qcom,ires-ua = <12500>;
qcom,hdrm-voltage-mv = <325>;
qcom,hdrm-vol-hi-lo-win-mv = <100>;
#define FLASH_LED_MOD_CTRL_MASK 0x80
#define FLASH_LED_ISC_DELAY_MASK 0x03
-#define FLASH_LED_TYPE_FLASH 0
-#define FLASH_LED_TYPE_TORCH 1
#define FLASH_LED_HEADROOM_AUTO_MODE_ENABLED true
#define FLASH_LED_ISC_DELAY_SHIFT 6
#define FLASH_LED_ISC_DELAY_DEFAULT_US 3
#define FLASH_LED_MOD_ENABLE 0x80
#define FLASH_LED_DISABLE 0x00
#define FLASH_LED_SAFETY_TMR_DISABLED 0x13
+#define FLASH_LED_MIN_CURRENT_MA 25
+
+enum flash_led_type {
+ FLASH_LED_TYPE_FLASH,
+ FLASH_LED_TYPE_TORCH,
+};
/*
* Flash LED configuration read from device tree
static void qpnp_flash_led_node_set(struct flash_node_data *fnode, int value)
{
- int prgm_current_ma;
+ int prgm_current_ma = value;
- prgm_current_ma = value < 0 ? 0 : value;
- prgm_current_ma = value > fnode->cdev.max_brightness ?
- fnode->cdev.max_brightness : value;
+ if (value <= 0)
+ prgm_current_ma = 0;
+ else if (value < FLASH_LED_MIN_CURRENT_MA)
+ prgm_current_ma = FLASH_LED_MIN_CURRENT_MA;
+
+ prgm_current_ma = min(prgm_current_ma, fnode->max_current);
+ fnode->current_ma = prgm_current_ma;
fnode->cdev.brightness = prgm_current_ma;
- fnode->brightness = prgm_current_ma * 1000 / fnode->ires_ua + 1;
+ fnode->current_reg_val = prgm_current_ma * 1000 / fnode->ires_ua + 1;
fnode->led_on = prgm_current_ma != 0;
}
rc = qpnp_flash_led_masked_write(led,
FLASH_LED_REG_TGR_CURRENT(led->base + addr_offset),
- FLASH_LED_CURRENT_MASK, led->fnode[i].brightness);
+ FLASH_LED_CURRENT_MASK, led->fnode[i].current_reg_val);
if (rc)
return rc;
FLASH_LED_CURRENT_MASK, 0);
if (rc)
return rc;
+
led->fnode[i].led_on = false;
if (led->fnode[i].pinctrl) {
return rc;
}
- rc = of_property_read_u32(node, "qcom,max-current", &val);
- if (!rc) {
- fnode->cdev.max_brightness = val;
- } else {
- dev_err(&led->pdev->dev, "Unable to read max current\n");
- return rc;
- }
-
rc = of_property_read_string(node, "label", &temp_string);
if (!rc) {
if (!strcmp(temp_string, "flash"))
return rc;
}
+ rc = of_property_read_u32(node, "qcom,max-current", &val);
+ if (!rc) {
+ if (val < FLASH_LED_MIN_CURRENT_MA)
+ val = FLASH_LED_MIN_CURRENT_MA;
+ fnode->max_current = val;
+ fnode->cdev.max_brightness = val;
+ } else {
+ dev_err(&led->pdev->dev,
+ "Unable to read max current, rc=%d\n", rc);
+ return rc;
+ }
+
+ rc = of_property_read_u32(node, "qcom,current-ma", &val);
+ if (!rc) {
+ if (val < FLASH_LED_MIN_CURRENT_MA ||
+ val > fnode->max_current)
+ dev_warn(&led->pdev->dev,
+ "Invalid operational current specified, capping it\n");
+ if (val < FLASH_LED_MIN_CURRENT_MA)
+ val = FLASH_LED_MIN_CURRENT_MA;
+ if (val > fnode->max_current)
+ val = fnode->max_current;
+ fnode->current_ma = val;
+ fnode->cdev.brightness = val;
+ } else if (rc != -EINVAL) {
+ dev_err(&led->pdev->dev,
+ "Unable to read operational current, rc=%d\n", rc);
+ return rc;
+ }
+
fnode->duration = FLASH_LED_SAFETY_TMR_DISABLED;
rc = of_property_read_u32(node, "qcom,duration-ms", &val);
if (!rc) {