Loading arch/arm/boot/dts/qcom/msm8996-regulator.dtsi +2 −2 Original line number Diff line number Diff line Loading @@ -869,9 +869,9 @@ 0 2539 0 0 0 0 0 0>; qcom,cpr-open-loop-voltage-fuse-adjustment = <90000 (-5000) (-30000) (-115000)>; <0 (-5000) (-30000) (-115000)>; qcom,cpr-closed-loop-voltage-adjustment = <0 75000 0 (-10000) (-65000)>; <0 0 0 (-10000) (-65000)>; qcom,cpr-floor-to-ceiling-max-range = <0 130000 40000 85000 85000>; Loading drivers/regulator/cpr3-hmss-regulator.c +60 −45 Original line number Diff line number Diff line Loading @@ -576,9 +576,10 @@ static int cpr3_msm8996_hmss_calculate_open_loop_voltages( for (i = 1; i < vreg->fuse_corner_count; i++) { if (fuse_volt[i] < fuse_volt[i - 1]) { cpr3_err(vreg, "voltage fuse[%d]=%d < fuse[%d]=%d uV; interpolation not possible\n", i, fuse_volt[i], i - 1, fuse_volt[i - 1]); allow_interpolation = false; cpr3_info(vreg, "fuse corner %d voltage=%d uV < fuse corner %d voltage=%d uV; overriding: fuse corner %d voltage=%d\n", i, fuse_volt[i], i - 1, fuse_volt[i - 1], i, fuse_volt[i - 1]); fuse_volt[i] = fuse_volt[i - 1]; } } Loading Loading @@ -961,6 +962,7 @@ static int cpr3_msm8996_hmss_calculate_target_quotients( i = CPR3_MSM8996_HMSS_FUSE_CORNER_MINSVS; quot_adjust = cpr3_quot_adjustment(ro_scale[i], volt_adjust_fuse[i]); quot = fuse->target_quot[i] + quot_adjust; quot_high[i] = quot; ro = fuse->ro_sel[i]; if (quot_adjust) cpr3_info(vreg, "adjusted fuse corner %d RO%u target quot: %llu --> %u (%d uV)\n", Loading @@ -968,33 +970,6 @@ static int cpr3_msm8996_hmss_calculate_target_quotients( for (i = 0; i <= fmax_corner[CPR3_MSM8996_HMSS_FUSE_CORNER_MINSVS]; i++) vreg->corner[i].target_quot[ro] = quot; for (i = CPR3_MSM8996_HMSS_FUSE_CORNER_SVS; i < vreg->fuse_corner_count; i++) { quot_high[i] = fuse->target_quot[i]; quot_low[i] = quot_high[i] - fuse->quot_offset[i] * MSM8996_HMSS_QUOT_OFFSET_SCALE; if (quot_low[i] > quot_high[i]) { cpr3_err(vreg, "invalid quot[%d]=%llu and quot_offset[%d]=-%llu; interpolation not possible\n", i, quot_high[i], i, fuse->quot_offset[i] * MSM8996_HMSS_QUOT_OFFSET_SCALE); rc = cpr3_msm8996_hmss_set_no_interpolation_quotients( vreg, volt_adjust, volt_adjust_fuse, ro_scale); goto done; } } if (fuse->ro_sel[CPR3_MSM8996_HMSS_FUSE_CORNER_MINSVS] != fuse->ro_sel[CPR3_MSM8996_HMSS_FUSE_CORNER_SVS]) { cpr3_err(vreg, "MinSVS RO=%llu is not the same as SVS RO=%llu; interpolation not possible\n", fuse->ro_sel[CPR3_MSM8996_HMSS_FUSE_CORNER_MINSVS], fuse->ro_sel[CPR3_MSM8996_HMSS_FUSE_CORNER_SVS]); rc = cpr3_msm8996_hmss_set_no_interpolation_quotients(vreg, volt_adjust, volt_adjust_fuse, ro_scale); goto done; } /* * The LowSVS target quotient is defined as: * (SVS target quotient) - (the unpacked SVS quotient offset) Loading @@ -1002,14 +977,38 @@ static int cpr3_msm8996_hmss_calculate_target_quotients( * possible to interpolate between their target quotient values. */ i = CPR3_MSM8996_HMSS_FUSE_CORNER_LOWSVS; quot_high[i] = quot_low[CPR3_MSM8996_HMSS_FUSE_CORNER_SVS]; quot_high[i] = fuse->target_quot[CPR3_MSM8996_HMSS_FUSE_CORNER_SVS] - fuse->quot_offset[CPR3_MSM8996_HMSS_FUSE_CORNER_SVS] * MSM8996_HMSS_QUOT_OFFSET_SCALE; quot_low[i] = fuse->target_quot[CPR3_MSM8996_HMSS_FUSE_CORNER_MINSVS]; if (quot_low[i] > quot_high[i]) { cpr3_err(vreg, "invalid quot_lowsvs=%llu and quot_minsvs=%llu; interpolation not possible\n", quot_high[i], quot_low[i]); rc = cpr3_msm8996_hmss_set_no_interpolation_quotients(vreg, volt_adjust, volt_adjust_fuse, ro_scale); goto done; if (quot_high[i] < quot_low[i]) { cpr3_info(vreg, "quot_lowsvs=%llu < quot_minsvs=%llu; overriding: quot_lowsvs=%llu\n", quot_high[i], quot_low[i], quot_low[i]); quot_high[i] = quot_low[i]; } if (fuse->ro_sel[CPR3_MSM8996_HMSS_FUSE_CORNER_MINSVS] != fuse->ro_sel[CPR3_MSM8996_HMSS_FUSE_CORNER_SVS]) { cpr3_info(vreg, "MinSVS RO=%llu != SVS RO=%llu; disabling LowSVS interpolation\n", fuse->ro_sel[CPR3_MSM8996_HMSS_FUSE_CORNER_MINSVS], fuse->ro_sel[CPR3_MSM8996_HMSS_FUSE_CORNER_SVS]); quot_low[i] = quot_high[i]; } for (i = CPR3_MSM8996_HMSS_FUSE_CORNER_SVS; i < vreg->fuse_corner_count; i++) { quot_high[i] = fuse->target_quot[i]; if (fuse->ro_sel[i] == fuse->ro_sel[i - 1]) quot_low[i] = quot_high[i - 1]; else quot_low[i] = quot_high[i] - fuse->quot_offset[i] * MSM8996_HMSS_QUOT_OFFSET_SCALE; if (quot_high[i] < quot_low[i]) { cpr3_info(vreg, "quot_high[%d]=%llu < quot_low[%d]=%llu; overriding: quot_high[%d]=%llu\n", i, quot_high[i], i, quot_low[i], i, quot_low[i]); quot_high[i] = quot_low[i]; } } /* Perform per-fuse-corner target quotient adjustment */ Loading @@ -1024,16 +1023,17 @@ static int cpr3_msm8996_hmss_calculate_target_quotients( volt_adjust_fuse[i]); } if (fuse->ro_sel[i] == fuse->ro_sel[i - 1]) quot_low[i] = quot_high[i - 1]; else quot_low[i] += cpr3_quot_adjustment(ro_scale[i], volt_adjust_fuse[i - 1]); if (quot_low[i] > quot_high[i]) { cpr3_err(vreg, "invalid quot_high[%d]=%llu and quot_low[%d]=%llu after adjustment; interpolation not possible\n", i, quot_high[i], i, quot_low[i]); rc = cpr3_msm8996_hmss_set_no_interpolation_quotients( vreg, volt_adjust, volt_adjust_fuse, ro_scale); goto done; if (quot_high[i] < quot_low[i]) { cpr3_info(vreg, "quot_high[%d]=%llu < quot_low[%d]=%llu after adjustment; overriding: quot_high[%d]=%llu\n", i, quot_high[i], i, quot_low[i], i, quot_low[i]); quot_high[i] = quot_low[i]; } } Loading Loading @@ -1065,6 +1065,21 @@ static int cpr3_msm8996_hmss_calculate_target_quotients( } } /* Ensure that target quotients increase monotonically */ for (i = 1; i < vreg->corner_count; i++) { ro = fuse->ro_sel[vreg->corner[i].cpr_fuse_corner]; if (fuse->ro_sel[vreg->corner[i - 1].cpr_fuse_corner] == ro && vreg->corner[i].target_quot[ro] < vreg->corner[i - 1].target_quot[ro]) { cpr3_info(vreg, "adjusted corner %d RO%u target quot=%u < adjusted corner %d RO%u target quot=%u; overriding: corner %d RO%u target quot=%u\n", i, ro, vreg->corner[i].target_quot[ro], i - 1, ro, vreg->corner[i - 1].target_quot[ro], i, ro, vreg->corner[i - 1].target_quot[ro]); vreg->corner[i].target_quot[ro] = vreg->corner[i - 1].target_quot[ro]; } } done: kfree(volt_adjust); kfree(volt_adjust_fuse); Loading drivers/regulator/cpr3-mmss-regulator.c +21 −3 Original line number Diff line number Diff line Loading @@ -308,6 +308,23 @@ static int cpr3_mmss_adjust_target_quotients(struct cpr3_regulator *vreg, } } /* Ensure that target quotients increase monotonically */ for (i = 1; i < vreg->corner_count; i++) { for (j = 0; j < CPR3_RO_COUNT; j++) { if (vreg->corner[i].target_quot[j] && vreg->corner[i].target_quot[j] < vreg->corner[i - 1].target_quot[j]) { cpr3_info(vreg, "adjusted corner %d RO%u target quot=%u < adjusted corner %d RO%u target quot=%u; overriding: corner %d RO%u target quot=%u\n", i, j, vreg->corner[i].target_quot[j], i - 1, j, vreg->corner[i - 1].target_quot[j], i, j, vreg->corner[i - 1].target_quot[j]); vreg->corner[i].target_quot[j] = vreg->corner[i - 1].target_quot[j]; } } } done: kfree(volt_adjust); kfree(ro_scale); Loading Loading @@ -376,9 +393,10 @@ static int cpr3_msm8996_mmss_calculate_open_loop_voltages( for (i = 1; i < vreg->fuse_corner_count; i++) { if (fuse_volt[i] < fuse_volt[i - 1]) { cpr3_err(vreg, "voltage fuse[%d]=%d < fuse[%d]=%d uV; interpolation not possible\n", i, fuse_volt[i], i - 1, fuse_volt[i - 1]); allow_interpolation = false; cpr3_info(vreg, "fuse corner %d voltage=%d uV < fuse corner %d voltage=%d uV; overriding: fuse corner %d voltage=%d\n", i, fuse_volt[i], i - 1, fuse_volt[i - 1], i, fuse_volt[i - 1]); fuse_volt[i] = fuse_volt[i - 1]; } } Loading drivers/regulator/cpr3-util.c +13 −0 Original line number Diff line number Diff line Loading @@ -993,6 +993,19 @@ int cpr3_adjust_open_loop_voltages(struct cpr3_regulator *vreg, int corner_sum, } } /* Ensure that open-loop voltages increase monotonically */ for (i = 1; i < vreg->corner_count; i++) { if (vreg->corner[i].open_loop_volt < vreg->corner[i - 1].open_loop_volt) { cpr3_info(vreg, "adjusted corner %d open-loop voltage=%d uV < corner %d voltage=%d uV; overriding: corner %d voltage=%d\n", i, vreg->corner[i].open_loop_volt, i - 1, vreg->corner[i - 1].open_loop_volt, i, vreg->corner[i - 1].open_loop_volt); vreg->corner[i].open_loop_volt = vreg->corner[i - 1].open_loop_volt; } } done: kfree(volt_adjust); return rc; Loading Loading
arch/arm/boot/dts/qcom/msm8996-regulator.dtsi +2 −2 Original line number Diff line number Diff line Loading @@ -869,9 +869,9 @@ 0 2539 0 0 0 0 0 0>; qcom,cpr-open-loop-voltage-fuse-adjustment = <90000 (-5000) (-30000) (-115000)>; <0 (-5000) (-30000) (-115000)>; qcom,cpr-closed-loop-voltage-adjustment = <0 75000 0 (-10000) (-65000)>; <0 0 0 (-10000) (-65000)>; qcom,cpr-floor-to-ceiling-max-range = <0 130000 40000 85000 85000>; Loading
drivers/regulator/cpr3-hmss-regulator.c +60 −45 Original line number Diff line number Diff line Loading @@ -576,9 +576,10 @@ static int cpr3_msm8996_hmss_calculate_open_loop_voltages( for (i = 1; i < vreg->fuse_corner_count; i++) { if (fuse_volt[i] < fuse_volt[i - 1]) { cpr3_err(vreg, "voltage fuse[%d]=%d < fuse[%d]=%d uV; interpolation not possible\n", i, fuse_volt[i], i - 1, fuse_volt[i - 1]); allow_interpolation = false; cpr3_info(vreg, "fuse corner %d voltage=%d uV < fuse corner %d voltage=%d uV; overriding: fuse corner %d voltage=%d\n", i, fuse_volt[i], i - 1, fuse_volt[i - 1], i, fuse_volt[i - 1]); fuse_volt[i] = fuse_volt[i - 1]; } } Loading Loading @@ -961,6 +962,7 @@ static int cpr3_msm8996_hmss_calculate_target_quotients( i = CPR3_MSM8996_HMSS_FUSE_CORNER_MINSVS; quot_adjust = cpr3_quot_adjustment(ro_scale[i], volt_adjust_fuse[i]); quot = fuse->target_quot[i] + quot_adjust; quot_high[i] = quot; ro = fuse->ro_sel[i]; if (quot_adjust) cpr3_info(vreg, "adjusted fuse corner %d RO%u target quot: %llu --> %u (%d uV)\n", Loading @@ -968,33 +970,6 @@ static int cpr3_msm8996_hmss_calculate_target_quotients( for (i = 0; i <= fmax_corner[CPR3_MSM8996_HMSS_FUSE_CORNER_MINSVS]; i++) vreg->corner[i].target_quot[ro] = quot; for (i = CPR3_MSM8996_HMSS_FUSE_CORNER_SVS; i < vreg->fuse_corner_count; i++) { quot_high[i] = fuse->target_quot[i]; quot_low[i] = quot_high[i] - fuse->quot_offset[i] * MSM8996_HMSS_QUOT_OFFSET_SCALE; if (quot_low[i] > quot_high[i]) { cpr3_err(vreg, "invalid quot[%d]=%llu and quot_offset[%d]=-%llu; interpolation not possible\n", i, quot_high[i], i, fuse->quot_offset[i] * MSM8996_HMSS_QUOT_OFFSET_SCALE); rc = cpr3_msm8996_hmss_set_no_interpolation_quotients( vreg, volt_adjust, volt_adjust_fuse, ro_scale); goto done; } } if (fuse->ro_sel[CPR3_MSM8996_HMSS_FUSE_CORNER_MINSVS] != fuse->ro_sel[CPR3_MSM8996_HMSS_FUSE_CORNER_SVS]) { cpr3_err(vreg, "MinSVS RO=%llu is not the same as SVS RO=%llu; interpolation not possible\n", fuse->ro_sel[CPR3_MSM8996_HMSS_FUSE_CORNER_MINSVS], fuse->ro_sel[CPR3_MSM8996_HMSS_FUSE_CORNER_SVS]); rc = cpr3_msm8996_hmss_set_no_interpolation_quotients(vreg, volt_adjust, volt_adjust_fuse, ro_scale); goto done; } /* * The LowSVS target quotient is defined as: * (SVS target quotient) - (the unpacked SVS quotient offset) Loading @@ -1002,14 +977,38 @@ static int cpr3_msm8996_hmss_calculate_target_quotients( * possible to interpolate between their target quotient values. */ i = CPR3_MSM8996_HMSS_FUSE_CORNER_LOWSVS; quot_high[i] = quot_low[CPR3_MSM8996_HMSS_FUSE_CORNER_SVS]; quot_high[i] = fuse->target_quot[CPR3_MSM8996_HMSS_FUSE_CORNER_SVS] - fuse->quot_offset[CPR3_MSM8996_HMSS_FUSE_CORNER_SVS] * MSM8996_HMSS_QUOT_OFFSET_SCALE; quot_low[i] = fuse->target_quot[CPR3_MSM8996_HMSS_FUSE_CORNER_MINSVS]; if (quot_low[i] > quot_high[i]) { cpr3_err(vreg, "invalid quot_lowsvs=%llu and quot_minsvs=%llu; interpolation not possible\n", quot_high[i], quot_low[i]); rc = cpr3_msm8996_hmss_set_no_interpolation_quotients(vreg, volt_adjust, volt_adjust_fuse, ro_scale); goto done; if (quot_high[i] < quot_low[i]) { cpr3_info(vreg, "quot_lowsvs=%llu < quot_minsvs=%llu; overriding: quot_lowsvs=%llu\n", quot_high[i], quot_low[i], quot_low[i]); quot_high[i] = quot_low[i]; } if (fuse->ro_sel[CPR3_MSM8996_HMSS_FUSE_CORNER_MINSVS] != fuse->ro_sel[CPR3_MSM8996_HMSS_FUSE_CORNER_SVS]) { cpr3_info(vreg, "MinSVS RO=%llu != SVS RO=%llu; disabling LowSVS interpolation\n", fuse->ro_sel[CPR3_MSM8996_HMSS_FUSE_CORNER_MINSVS], fuse->ro_sel[CPR3_MSM8996_HMSS_FUSE_CORNER_SVS]); quot_low[i] = quot_high[i]; } for (i = CPR3_MSM8996_HMSS_FUSE_CORNER_SVS; i < vreg->fuse_corner_count; i++) { quot_high[i] = fuse->target_quot[i]; if (fuse->ro_sel[i] == fuse->ro_sel[i - 1]) quot_low[i] = quot_high[i - 1]; else quot_low[i] = quot_high[i] - fuse->quot_offset[i] * MSM8996_HMSS_QUOT_OFFSET_SCALE; if (quot_high[i] < quot_low[i]) { cpr3_info(vreg, "quot_high[%d]=%llu < quot_low[%d]=%llu; overriding: quot_high[%d]=%llu\n", i, quot_high[i], i, quot_low[i], i, quot_low[i]); quot_high[i] = quot_low[i]; } } /* Perform per-fuse-corner target quotient adjustment */ Loading @@ -1024,16 +1023,17 @@ static int cpr3_msm8996_hmss_calculate_target_quotients( volt_adjust_fuse[i]); } if (fuse->ro_sel[i] == fuse->ro_sel[i - 1]) quot_low[i] = quot_high[i - 1]; else quot_low[i] += cpr3_quot_adjustment(ro_scale[i], volt_adjust_fuse[i - 1]); if (quot_low[i] > quot_high[i]) { cpr3_err(vreg, "invalid quot_high[%d]=%llu and quot_low[%d]=%llu after adjustment; interpolation not possible\n", i, quot_high[i], i, quot_low[i]); rc = cpr3_msm8996_hmss_set_no_interpolation_quotients( vreg, volt_adjust, volt_adjust_fuse, ro_scale); goto done; if (quot_high[i] < quot_low[i]) { cpr3_info(vreg, "quot_high[%d]=%llu < quot_low[%d]=%llu after adjustment; overriding: quot_high[%d]=%llu\n", i, quot_high[i], i, quot_low[i], i, quot_low[i]); quot_high[i] = quot_low[i]; } } Loading Loading @@ -1065,6 +1065,21 @@ static int cpr3_msm8996_hmss_calculate_target_quotients( } } /* Ensure that target quotients increase monotonically */ for (i = 1; i < vreg->corner_count; i++) { ro = fuse->ro_sel[vreg->corner[i].cpr_fuse_corner]; if (fuse->ro_sel[vreg->corner[i - 1].cpr_fuse_corner] == ro && vreg->corner[i].target_quot[ro] < vreg->corner[i - 1].target_quot[ro]) { cpr3_info(vreg, "adjusted corner %d RO%u target quot=%u < adjusted corner %d RO%u target quot=%u; overriding: corner %d RO%u target quot=%u\n", i, ro, vreg->corner[i].target_quot[ro], i - 1, ro, vreg->corner[i - 1].target_quot[ro], i, ro, vreg->corner[i - 1].target_quot[ro]); vreg->corner[i].target_quot[ro] = vreg->corner[i - 1].target_quot[ro]; } } done: kfree(volt_adjust); kfree(volt_adjust_fuse); Loading
drivers/regulator/cpr3-mmss-regulator.c +21 −3 Original line number Diff line number Diff line Loading @@ -308,6 +308,23 @@ static int cpr3_mmss_adjust_target_quotients(struct cpr3_regulator *vreg, } } /* Ensure that target quotients increase monotonically */ for (i = 1; i < vreg->corner_count; i++) { for (j = 0; j < CPR3_RO_COUNT; j++) { if (vreg->corner[i].target_quot[j] && vreg->corner[i].target_quot[j] < vreg->corner[i - 1].target_quot[j]) { cpr3_info(vreg, "adjusted corner %d RO%u target quot=%u < adjusted corner %d RO%u target quot=%u; overriding: corner %d RO%u target quot=%u\n", i, j, vreg->corner[i].target_quot[j], i - 1, j, vreg->corner[i - 1].target_quot[j], i, j, vreg->corner[i - 1].target_quot[j]); vreg->corner[i].target_quot[j] = vreg->corner[i - 1].target_quot[j]; } } } done: kfree(volt_adjust); kfree(ro_scale); Loading Loading @@ -376,9 +393,10 @@ static int cpr3_msm8996_mmss_calculate_open_loop_voltages( for (i = 1; i < vreg->fuse_corner_count; i++) { if (fuse_volt[i] < fuse_volt[i - 1]) { cpr3_err(vreg, "voltage fuse[%d]=%d < fuse[%d]=%d uV; interpolation not possible\n", i, fuse_volt[i], i - 1, fuse_volt[i - 1]); allow_interpolation = false; cpr3_info(vreg, "fuse corner %d voltage=%d uV < fuse corner %d voltage=%d uV; overriding: fuse corner %d voltage=%d\n", i, fuse_volt[i], i - 1, fuse_volt[i - 1], i, fuse_volt[i - 1]); fuse_volt[i] = fuse_volt[i - 1]; } } Loading
drivers/regulator/cpr3-util.c +13 −0 Original line number Diff line number Diff line Loading @@ -993,6 +993,19 @@ int cpr3_adjust_open_loop_voltages(struct cpr3_regulator *vreg, int corner_sum, } } /* Ensure that open-loop voltages increase monotonically */ for (i = 1; i < vreg->corner_count; i++) { if (vreg->corner[i].open_loop_volt < vreg->corner[i - 1].open_loop_volt) { cpr3_info(vreg, "adjusted corner %d open-loop voltage=%d uV < corner %d voltage=%d uV; overriding: corner %d voltage=%d\n", i, vreg->corner[i].open_loop_volt, i - 1, vreg->corner[i - 1].open_loop_volt, i, vreg->corner[i - 1].open_loop_volt); vreg->corner[i].open_loop_volt = vreg->corner[i - 1].open_loop_volt; } } done: kfree(volt_adjust); return rc; Loading