diff options
| author | Tirupathi Reddy <tirupath@codeaurora.org> | 2017-02-09 16:29:24 +0530 |
|---|---|---|
| committer | Tirupathi Reddy <tirupath@codeaurora.org> | 2017-02-13 09:32:57 +0530 |
| commit | af45f0283644300a5ab60a007418cababbe92a31 (patch) | |
| tree | e26de02f466b37dc74bcbcc1468ce5d58f38d3e1 | |
| parent | 88fee0f3817730e279872a381b760833a146aa5b (diff) | |
regulator: cpr3: Use default step_quot during corner switch
Configure CPR4/h controllers to reset to default step_quot on each
loop_en = 0 transition. This enables the CPR controller to use the
default step_quot during a corner switch and then later switch to
the run-time calibrated step_quot. Without this feature enabled,
there is a chance for the CPR controller to use the run-time
calibrated step_quot of lower modes for higher modes that sometimes
can lead to closed-loop voltage getting stuck at open-loop voltage.
CRs-Fixed: 2003482
Change-Id: Ic738f6205a2e2030202abd811e94bd47240bad43
Signed-off-by: Tirupathi Reddy <tirupath@codeaurora.org>
| -rw-r--r-- | Documentation/devicetree/bindings/regulator/cpr3-regulator.txt | 9 | ||||
| -rw-r--r-- | drivers/regulator/cpr3-regulator.c | 11 | ||||
| -rw-r--r-- | drivers/regulator/cpr3-regulator.h | 7 | ||||
| -rw-r--r-- | drivers/regulator/cpr3-util.c | 8 |
4 files changed, 35 insertions, 0 deletions
diff --git a/Documentation/devicetree/bindings/regulator/cpr3-regulator.txt b/Documentation/devicetree/bindings/regulator/cpr3-regulator.txt index af53e59cd87f..37e8391259c6 100644 --- a/Documentation/devicetree/bindings/regulator/cpr3-regulator.txt +++ b/Documentation/devicetree/bindings/regulator/cpr3-regulator.txt @@ -209,6 +209,15 @@ Platform independent properties: as the corresponding addresses are specified in the qcom,cpr-panic-reg-addr-list property. +- qcom,cpr-reset-step-quot-loop-en + Usage: optional; only meaningful for CPR4 and CPRh controllers + Value type: <empty> + Definition: Boolean value which indicates that the CPR controller should + be configured to reset step_quot on each loop_en = 0 + transition. This configuration allows the CPR controller to + first use the default step_quot and then later switch to the + run-time calibrated step_quot. + ================================================= Second Level Nodes - CPR Threads for a Controller ================================================= diff --git a/drivers/regulator/cpr3-regulator.c b/drivers/regulator/cpr3-regulator.c index c51ed182ba96..3ffe094fe53c 100644 --- a/drivers/regulator/cpr3-regulator.c +++ b/drivers/regulator/cpr3-regulator.c @@ -174,6 +174,7 @@ #define CPR4_CPR_TIMER_CLAMP_THREAD_AGGREGATION_EN BIT(27) #define CPR4_REG_MISC 0x700 +#define CPR4_MISC_RESET_STEP_QUOT_LOOP_EN BIT(2) #define CPR4_MISC_MARGIN_TABLE_ROW_SELECT_MASK GENMASK(23, 20) #define CPR4_MISC_MARGIN_TABLE_ROW_SELECT_SHIFT 20 #define CPR4_MISC_TEMP_SENSOR_ID_START_MASK GENMASK(27, 24) @@ -698,6 +699,11 @@ static int cpr3_regulator_init_cpr4(struct cpr3_controller *ctrl) int thread_id = 0; u64 temp; + if (ctrl->reset_step_quot_loop_en) + cpr3_masked_write(ctrl, CPR4_REG_MISC, + CPR4_MISC_RESET_STEP_QUOT_LOOP_EN, + CPR4_MISC_RESET_STEP_QUOT_LOOP_EN); + if (ctrl->supports_hw_closed_loop) { if (ctrl->saw_use_unit_mV) pmic_step_size = ctrl->step_volt / 1000; @@ -1310,6 +1316,11 @@ static int cpr3_regulator_init_cprh(struct cpr3_controller *ctrl) return rc; } + if (ctrl->reset_step_quot_loop_en) + cpr3_masked_write(ctrl, CPR4_REG_MISC, + CPR4_MISC_RESET_STEP_QUOT_LOOP_EN, + CPR4_MISC_RESET_STEP_QUOT_LOOP_EN); + if (ctrl->saw_use_unit_mV) pmic_step_size = ctrl->step_volt / 1000; cpr3_masked_write(ctrl, CPR4_REG_MARGIN_ADJ_CTL, diff --git a/drivers/regulator/cpr3-regulator.h b/drivers/regulator/cpr3-regulator.h index 7dae23ca0e70..1ac0f7b816b3 100644 --- a/drivers/regulator/cpr3-regulator.h +++ b/drivers/regulator/cpr3-regulator.h @@ -735,6 +735,12 @@ struct cpr3_panic_regs_info { * @panic_notifier: Notifier block registered to global panic notifier list. * @support_ldo300_vreg: Boolean value which indicates that this CPR controller * manages an underlying LDO regulator of type LDO300. + * @reset_step_quot_loop_en: Boolean value which indicates that this CPR + * controller should be configured to reset step_quot on + * each loop_en = 0 transition. This configuration allows + * the CPR controller to first use the default step_quot + * and then later switch to the run-time calibrated + * step_quot. * * This structure contains both configuration and runtime state data. The * elements cpr_allowed_sw, use_hw_closed_loop, aggr_corner, cpr_enabled, @@ -836,6 +842,7 @@ struct cpr3_controller { struct cpr3_panic_regs_info *panic_regs_info; struct notifier_block panic_notifier; bool support_ldo300_vreg; + bool reset_step_quot_loop_en; }; /* Used for rounding voltages to the closest physically available set point. */ diff --git a/drivers/regulator/cpr3-util.c b/drivers/regulator/cpr3-util.c index 0a1a1c56bd16..fcbaf9f5f51f 100644 --- a/drivers/regulator/cpr3-util.c +++ b/drivers/regulator/cpr3-util.c @@ -1221,6 +1221,14 @@ int cpr3_parse_common_ctrl_data(struct cpr3_controller *ctrl) } /* + * Reset step_quot to default on each loop_en = 0 transition is + * optional. + */ + ctrl->reset_step_quot_loop_en + = of_property_read_bool(ctrl->dev->of_node, + "qcom,cpr-reset-step-quot-loop-en"); + + /* * Regulator device handles are not necessary for CPRh controllers * since communication with the regulators is completely managed * in hardware. |
