Loading Documentation/devicetree/bindings/leds/leds-qpnp-wled.txt +1 −1 Original line number Original line Diff line number Diff line Loading @@ -48,12 +48,12 @@ Optional properties for WLED: - qcom,en-ext-pfet-sc-pro : Specify if external pfet short circuit protection is needed - qcom,en-ext-pfet-sc-pro : Specify if external pfet short circuit protection is needed - qcom,cons-sync-write-delay-us : Specify in 'us' the duration of delay between two consecutive writes to - qcom,cons-sync-write-delay-us : Specify in 'us' the duration of delay between two consecutive writes to SYNC register. SYNC register. - qcom,sc-deb-cycles : debounce time for short circuit detection Optional properties if 'qcom,disp-type-amoled' is mentioned in DT: Optional properties if 'qcom,disp-type-amoled' is mentioned in DT: - qcom,loop-ea-gm : control the gm for gm stage in control loop. default is 3. - qcom,loop-ea-gm : control the gm for gm stage in control loop. default is 3. - qcom,loop-comp-res-kohm : control to select the compensation resistor in kohm. default is 320. - qcom,loop-comp-res-kohm : control to select the compensation resistor in kohm. default is 320. - qcom,vref-psm-mv : reference psm voltage in mv. default for amoled is 450. - qcom,vref-psm-mv : reference psm voltage in mv. default for amoled is 450. - qcom,sc-deb-cycles : debounce time for short circuit detection - qcom,avdd-trim-steps-from-center : The number of steps to trim the OVP threshold voltage. The possible values can be between -7 to 8. - qcom,avdd-trim-steps-from-center : The number of steps to trim the OVP threshold voltage. The possible values can be between -7 to 8. Example: Example: Loading drivers/leds/leds-qpnp-wled.c +49 −33 Original line number Original line Diff line number Diff line Loading @@ -173,13 +173,14 @@ #define QPNP_WLED_MODULE_EN_SHIFT 7 #define QPNP_WLED_MODULE_EN_SHIFT 7 #define QPNP_WLED_DISP_SEL_MASK 0x7F #define QPNP_WLED_DISP_SEL_MASK 0x7F #define QPNP_WLED_DISP_SEL_SHIFT 7 #define QPNP_WLED_DISP_SEL_SHIFT 7 #define QPNP_WLED_EN_SC_MASK 0x7F #define QPNP_WLED_EN_SC_DEB_CYCLES_MASK 0x79 #define QPNP_WLED_EN_DEB_CYCLES_MASK 0xF9 #define QPNP_WLED_EN_SC_SHIFT 7 #define QPNP_WLED_EN_SC_SHIFT 7 #define QPNP_WLED_SC_PRO_EN_DSCHGR 0x8 #define QPNP_WLED_SC_PRO_EN_DSCHGR 0x8 #define QPNP_WLED_SC_DEB_CYCLES_MIN 2 #define QPNP_WLED_SC_DEB_CYCLES_MIN 2 #define QPNP_WLED_SC_DEB_CYCLES_MAX 16 #define QPNP_WLED_SC_DEB_CYCLES_MAX 16 #define QPNP_WLED_SC_DEB_SUB 2 #define QPNP_WLED_SC_DEB_CYCLES_SUB 2 #define QPNP_WLED_SC_DEB_CYCLES_DFLT_AMOLED 4 #define QPNP_WLED_SC_DEB_CYCLES_DFLT 4 #define QPNP_WLED_EXT_FET_DTEST2 0x09 #define QPNP_WLED_EXT_FET_DTEST2 0x09 #define QPNP_WLED_SEC_ACCESS_REG(b) (b + 0xD0) #define QPNP_WLED_SEC_ACCESS_REG(b) (b + 0xD0) Loading Loading @@ -905,13 +906,6 @@ static int qpnp_wled_set_disp(struct qpnp_wled *wled, u16 base_addr) if (rc) if (rc) return rc; return rc; /* Configure the Soft start Ramp delay for AMOLED */ reg = 0; rc = qpnp_wled_write_reg(wled, ®, QPNP_WLED_SOFTSTART_RAMP_DLY(base_addr)); if (rc) return rc; /* Configure the CTRL TEST4 register for AMOLED */ /* Configure the CTRL TEST4 register for AMOLED */ rc = qpnp_wled_read_reg(wled, ®, rc = qpnp_wled_read_reg(wled, ®, QPNP_WLED_TEST4_REG(wled->ctrl_base)); QPNP_WLED_TEST4_REG(wled->ctrl_base)); Loading Loading @@ -1032,6 +1026,13 @@ static int qpnp_wled_config(struct qpnp_wled *wled) return rc; return rc; } } /* Configure the Soft start Ramp delay: for AMOLED - 0,for LCD - 2 */ reg = (wled->disp_type_amoled) ? 0 : 2; rc = qpnp_wled_write_reg(wled, ®, QPNP_WLED_SOFTSTART_RAMP_DLY(wled->ctrl_base)); if (rc) return rc; /* Configure the MAX BOOST DUTY register */ /* Configure the MAX BOOST DUTY register */ if (wled->boost_duty_ns < QPNP_WLED_BOOST_DUTY_MIN_NS) if (wled->boost_duty_ns < QPNP_WLED_BOOST_DUTY_MIN_NS) wled->boost_duty_ns = QPNP_WLED_BOOST_DUTY_MIN_NS; wled->boost_duty_ns = QPNP_WLED_BOOST_DUTY_MIN_NS; Loading Loading @@ -1329,21 +1330,18 @@ static int qpnp_wled_config(struct qpnp_wled *wled) QPNP_WLED_SC_PRO_REG(wled->ctrl_base)); QPNP_WLED_SC_PRO_REG(wled->ctrl_base)); if (rc < 0) if (rc < 0) return rc; return rc; reg &= QPNP_WLED_EN_SC_MASK; reg &= QPNP_WLED_EN_SC_DEB_CYCLES_MASK; reg |= 1 << QPNP_WLED_EN_SC_SHIFT; reg |= 1 << QPNP_WLED_EN_SC_SHIFT; if (wled->disp_type_amoled) { if (wled->sc_deb_cycles < QPNP_WLED_SC_DEB_CYCLES_MIN) if (wled->sc_deb_cycles < QPNP_WLED_SC_DEB_CYCLES_MIN) wled->sc_deb_cycles = wled->sc_deb_cycles = QPNP_WLED_SC_DEB_CYCLES_MIN; QPNP_WLED_SC_DEB_CYCLES_MIN; else if (wled->sc_deb_cycles > QPNP_WLED_SC_DEB_CYCLES_MAX) else if (wled->sc_deb_cycles > wled->sc_deb_cycles = QPNP_WLED_SC_DEB_CYCLES_MAX; QPNP_WLED_SC_DEB_CYCLES_MAX) temp = fls(wled->sc_deb_cycles) - QPNP_WLED_SC_DEB_CYCLES_SUB; wled->sc_deb_cycles = reg |= (temp << 1); QPNP_WLED_SC_DEB_CYCLES_MAX; temp = fls(wled->sc_deb_cycles) - QPNP_WLED_SC_DEB_SUB; if (wled->disp_type_amoled) reg |= ((temp << 1) | QPNP_WLED_SC_PRO_EN_DSCHGR); reg |= QPNP_WLED_SC_PRO_EN_DSCHGR; } rc = qpnp_wled_write_reg(wled, ®, rc = qpnp_wled_write_reg(wled, ®, QPNP_WLED_SC_PRO_REG(wled->ctrl_base)); QPNP_WLED_SC_PRO_REG(wled->ctrl_base)); Loading @@ -1361,6 +1359,24 @@ static int qpnp_wled_config(struct qpnp_wled *wled) if (rc) if (rc) return rc; return rc; } } } else { rc = qpnp_wled_read_reg(wled, ®, QPNP_WLED_SC_PRO_REG(wled->ctrl_base)); if (rc < 0) return rc; reg &= QPNP_WLED_EN_DEB_CYCLES_MASK; if (wled->sc_deb_cycles < QPNP_WLED_SC_DEB_CYCLES_MIN) wled->sc_deb_cycles = QPNP_WLED_SC_DEB_CYCLES_MIN; else if (wled->sc_deb_cycles > QPNP_WLED_SC_DEB_CYCLES_MAX) wled->sc_deb_cycles = QPNP_WLED_SC_DEB_CYCLES_MAX; temp = fls(wled->sc_deb_cycles) - QPNP_WLED_SC_DEB_CYCLES_SUB; reg |= (temp << 1); rc = qpnp_wled_write_reg(wled, ®, QPNP_WLED_SC_PRO_REG(wled->ctrl_base)); if (rc) return rc; } } return 0; return 0; Loading Loading @@ -1426,26 +1442,26 @@ static int qpnp_wled_parse_dt(struct qpnp_wled *wled) return rc; return rc; } } wled->sc_deb_cycles = QPNP_WLED_SC_DEB_CYCLES_DFLT_AMOLED; wled->avdd_trim_steps_from_center = 0; rc = of_property_read_u32(spmi->dev.of_node, rc = of_property_read_u32(spmi->dev.of_node, "qcom,sc-deb-cycles", &temp_val); "qcom,avdd-trim-steps-from-center", &temp_val); if (!rc) { if (!rc) { wled->sc_deb_cycles = temp_val; wled->avdd_trim_steps_from_center = temp_val; } else if (rc != -EINVAL) { } else if (rc != -EINVAL) { dev_err(&spmi->dev, "Unable to read sc debounce cycles\n"); dev_err(&spmi->dev, "Unable to read avdd trim steps from center value\n"); return rc; return rc; } } } wled->avdd_trim_steps_from_center = 0; wled->sc_deb_cycles = QPNP_WLED_SC_DEB_CYCLES_DFLT; rc = of_property_read_u32(spmi->dev.of_node, rc = of_property_read_u32(spmi->dev.of_node, "qcom,avdd-trim-steps-from-center", &temp_val); "qcom,sc-deb-cycles", &temp_val); if (!rc) { if (!rc) { wled->avdd_trim_steps_from_center = temp_val; wled->sc_deb_cycles = temp_val; } else if (rc != -EINVAL) { } else if (rc != -EINVAL) { dev_err(&spmi->dev, "Unable to read avdd trim steps from center value\n"); dev_err(&spmi->dev, "Unable to read sc debounce cycles\n"); return rc; return rc; } } } wled->fdbk_op = QPNP_WLED_FDBK_AUTO; wled->fdbk_op = QPNP_WLED_FDBK_AUTO; rc = of_property_read_string(spmi->dev.of_node, rc = of_property_read_string(spmi->dev.of_node, Loading Loading
Documentation/devicetree/bindings/leds/leds-qpnp-wled.txt +1 −1 Original line number Original line Diff line number Diff line Loading @@ -48,12 +48,12 @@ Optional properties for WLED: - qcom,en-ext-pfet-sc-pro : Specify if external pfet short circuit protection is needed - qcom,en-ext-pfet-sc-pro : Specify if external pfet short circuit protection is needed - qcom,cons-sync-write-delay-us : Specify in 'us' the duration of delay between two consecutive writes to - qcom,cons-sync-write-delay-us : Specify in 'us' the duration of delay between two consecutive writes to SYNC register. SYNC register. - qcom,sc-deb-cycles : debounce time for short circuit detection Optional properties if 'qcom,disp-type-amoled' is mentioned in DT: Optional properties if 'qcom,disp-type-amoled' is mentioned in DT: - qcom,loop-ea-gm : control the gm for gm stage in control loop. default is 3. - qcom,loop-ea-gm : control the gm for gm stage in control loop. default is 3. - qcom,loop-comp-res-kohm : control to select the compensation resistor in kohm. default is 320. - qcom,loop-comp-res-kohm : control to select the compensation resistor in kohm. default is 320. - qcom,vref-psm-mv : reference psm voltage in mv. default for amoled is 450. - qcom,vref-psm-mv : reference psm voltage in mv. default for amoled is 450. - qcom,sc-deb-cycles : debounce time for short circuit detection - qcom,avdd-trim-steps-from-center : The number of steps to trim the OVP threshold voltage. The possible values can be between -7 to 8. - qcom,avdd-trim-steps-from-center : The number of steps to trim the OVP threshold voltage. The possible values can be between -7 to 8. Example: Example: Loading
drivers/leds/leds-qpnp-wled.c +49 −33 Original line number Original line Diff line number Diff line Loading @@ -173,13 +173,14 @@ #define QPNP_WLED_MODULE_EN_SHIFT 7 #define QPNP_WLED_MODULE_EN_SHIFT 7 #define QPNP_WLED_DISP_SEL_MASK 0x7F #define QPNP_WLED_DISP_SEL_MASK 0x7F #define QPNP_WLED_DISP_SEL_SHIFT 7 #define QPNP_WLED_DISP_SEL_SHIFT 7 #define QPNP_WLED_EN_SC_MASK 0x7F #define QPNP_WLED_EN_SC_DEB_CYCLES_MASK 0x79 #define QPNP_WLED_EN_DEB_CYCLES_MASK 0xF9 #define QPNP_WLED_EN_SC_SHIFT 7 #define QPNP_WLED_EN_SC_SHIFT 7 #define QPNP_WLED_SC_PRO_EN_DSCHGR 0x8 #define QPNP_WLED_SC_PRO_EN_DSCHGR 0x8 #define QPNP_WLED_SC_DEB_CYCLES_MIN 2 #define QPNP_WLED_SC_DEB_CYCLES_MIN 2 #define QPNP_WLED_SC_DEB_CYCLES_MAX 16 #define QPNP_WLED_SC_DEB_CYCLES_MAX 16 #define QPNP_WLED_SC_DEB_SUB 2 #define QPNP_WLED_SC_DEB_CYCLES_SUB 2 #define QPNP_WLED_SC_DEB_CYCLES_DFLT_AMOLED 4 #define QPNP_WLED_SC_DEB_CYCLES_DFLT 4 #define QPNP_WLED_EXT_FET_DTEST2 0x09 #define QPNP_WLED_EXT_FET_DTEST2 0x09 #define QPNP_WLED_SEC_ACCESS_REG(b) (b + 0xD0) #define QPNP_WLED_SEC_ACCESS_REG(b) (b + 0xD0) Loading Loading @@ -905,13 +906,6 @@ static int qpnp_wled_set_disp(struct qpnp_wled *wled, u16 base_addr) if (rc) if (rc) return rc; return rc; /* Configure the Soft start Ramp delay for AMOLED */ reg = 0; rc = qpnp_wled_write_reg(wled, ®, QPNP_WLED_SOFTSTART_RAMP_DLY(base_addr)); if (rc) return rc; /* Configure the CTRL TEST4 register for AMOLED */ /* Configure the CTRL TEST4 register for AMOLED */ rc = qpnp_wled_read_reg(wled, ®, rc = qpnp_wled_read_reg(wled, ®, QPNP_WLED_TEST4_REG(wled->ctrl_base)); QPNP_WLED_TEST4_REG(wled->ctrl_base)); Loading Loading @@ -1032,6 +1026,13 @@ static int qpnp_wled_config(struct qpnp_wled *wled) return rc; return rc; } } /* Configure the Soft start Ramp delay: for AMOLED - 0,for LCD - 2 */ reg = (wled->disp_type_amoled) ? 0 : 2; rc = qpnp_wled_write_reg(wled, ®, QPNP_WLED_SOFTSTART_RAMP_DLY(wled->ctrl_base)); if (rc) return rc; /* Configure the MAX BOOST DUTY register */ /* Configure the MAX BOOST DUTY register */ if (wled->boost_duty_ns < QPNP_WLED_BOOST_DUTY_MIN_NS) if (wled->boost_duty_ns < QPNP_WLED_BOOST_DUTY_MIN_NS) wled->boost_duty_ns = QPNP_WLED_BOOST_DUTY_MIN_NS; wled->boost_duty_ns = QPNP_WLED_BOOST_DUTY_MIN_NS; Loading Loading @@ -1329,21 +1330,18 @@ static int qpnp_wled_config(struct qpnp_wled *wled) QPNP_WLED_SC_PRO_REG(wled->ctrl_base)); QPNP_WLED_SC_PRO_REG(wled->ctrl_base)); if (rc < 0) if (rc < 0) return rc; return rc; reg &= QPNP_WLED_EN_SC_MASK; reg &= QPNP_WLED_EN_SC_DEB_CYCLES_MASK; reg |= 1 << QPNP_WLED_EN_SC_SHIFT; reg |= 1 << QPNP_WLED_EN_SC_SHIFT; if (wled->disp_type_amoled) { if (wled->sc_deb_cycles < QPNP_WLED_SC_DEB_CYCLES_MIN) if (wled->sc_deb_cycles < QPNP_WLED_SC_DEB_CYCLES_MIN) wled->sc_deb_cycles = wled->sc_deb_cycles = QPNP_WLED_SC_DEB_CYCLES_MIN; QPNP_WLED_SC_DEB_CYCLES_MIN; else if (wled->sc_deb_cycles > QPNP_WLED_SC_DEB_CYCLES_MAX) else if (wled->sc_deb_cycles > wled->sc_deb_cycles = QPNP_WLED_SC_DEB_CYCLES_MAX; QPNP_WLED_SC_DEB_CYCLES_MAX) temp = fls(wled->sc_deb_cycles) - QPNP_WLED_SC_DEB_CYCLES_SUB; wled->sc_deb_cycles = reg |= (temp << 1); QPNP_WLED_SC_DEB_CYCLES_MAX; temp = fls(wled->sc_deb_cycles) - QPNP_WLED_SC_DEB_SUB; if (wled->disp_type_amoled) reg |= ((temp << 1) | QPNP_WLED_SC_PRO_EN_DSCHGR); reg |= QPNP_WLED_SC_PRO_EN_DSCHGR; } rc = qpnp_wled_write_reg(wled, ®, rc = qpnp_wled_write_reg(wled, ®, QPNP_WLED_SC_PRO_REG(wled->ctrl_base)); QPNP_WLED_SC_PRO_REG(wled->ctrl_base)); Loading @@ -1361,6 +1359,24 @@ static int qpnp_wled_config(struct qpnp_wled *wled) if (rc) if (rc) return rc; return rc; } } } else { rc = qpnp_wled_read_reg(wled, ®, QPNP_WLED_SC_PRO_REG(wled->ctrl_base)); if (rc < 0) return rc; reg &= QPNP_WLED_EN_DEB_CYCLES_MASK; if (wled->sc_deb_cycles < QPNP_WLED_SC_DEB_CYCLES_MIN) wled->sc_deb_cycles = QPNP_WLED_SC_DEB_CYCLES_MIN; else if (wled->sc_deb_cycles > QPNP_WLED_SC_DEB_CYCLES_MAX) wled->sc_deb_cycles = QPNP_WLED_SC_DEB_CYCLES_MAX; temp = fls(wled->sc_deb_cycles) - QPNP_WLED_SC_DEB_CYCLES_SUB; reg |= (temp << 1); rc = qpnp_wled_write_reg(wled, ®, QPNP_WLED_SC_PRO_REG(wled->ctrl_base)); if (rc) return rc; } } return 0; return 0; Loading Loading @@ -1426,26 +1442,26 @@ static int qpnp_wled_parse_dt(struct qpnp_wled *wled) return rc; return rc; } } wled->sc_deb_cycles = QPNP_WLED_SC_DEB_CYCLES_DFLT_AMOLED; wled->avdd_trim_steps_from_center = 0; rc = of_property_read_u32(spmi->dev.of_node, rc = of_property_read_u32(spmi->dev.of_node, "qcom,sc-deb-cycles", &temp_val); "qcom,avdd-trim-steps-from-center", &temp_val); if (!rc) { if (!rc) { wled->sc_deb_cycles = temp_val; wled->avdd_trim_steps_from_center = temp_val; } else if (rc != -EINVAL) { } else if (rc != -EINVAL) { dev_err(&spmi->dev, "Unable to read sc debounce cycles\n"); dev_err(&spmi->dev, "Unable to read avdd trim steps from center value\n"); return rc; return rc; } } } wled->avdd_trim_steps_from_center = 0; wled->sc_deb_cycles = QPNP_WLED_SC_DEB_CYCLES_DFLT; rc = of_property_read_u32(spmi->dev.of_node, rc = of_property_read_u32(spmi->dev.of_node, "qcom,avdd-trim-steps-from-center", &temp_val); "qcom,sc-deb-cycles", &temp_val); if (!rc) { if (!rc) { wled->avdd_trim_steps_from_center = temp_val; wled->sc_deb_cycles = temp_val; } else if (rc != -EINVAL) { } else if (rc != -EINVAL) { dev_err(&spmi->dev, "Unable to read avdd trim steps from center value\n"); dev_err(&spmi->dev, "Unable to read sc debounce cycles\n"); return rc; return rc; } } } wled->fdbk_op = QPNP_WLED_FDBK_AUTO; wled->fdbk_op = QPNP_WLED_FDBK_AUTO; rc = of_property_read_string(spmi->dev.of_node, rc = of_property_read_string(spmi->dev.of_node, Loading