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>
This commit is contained in:
Tirupathi Reddy 2017-02-09 16:29:24 +05:30
parent 88fee0f381
commit af45f02836
4 changed files with 35 additions and 0 deletions

View file

@ -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
=================================================

View file

@ -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,

View file

@ -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. */

View file

@ -1220,6 +1220,14 @@ int cpr3_parse_common_ctrl_data(struct cpr3_controller *ctrl)
return -ENODEV;
}
/*
* 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