Loading Documentation/devicetree/bindings/regulator/cpr-regulator.txt +6 −0 Original line number Diff line number Diff line Loading @@ -290,6 +290,11 @@ Optional properties: highest voltage fuse corner. A given cpr-regulator device must have either qcom,cpr-fuse-init-voltage specified or qcom,pvs-voltage-table (and its associated properties). - qcom,cpr-init-voltage-ref: Array of reference voltages in microvolts used when decoding the initial voltage fuse values. The elements in the array are ordered from lowest voltage corner to highest voltage corner. This property must be of length defined by qcom,cpr-fuse-corners. This property is required if qcom,cpr-fuse-init-voltage is present. - qcom,cpr-init-voltage-step: The voltage step size in microvolts of the CPR initial voltage fuses described by the qcom,cpr-fuse-init-voltage property. This property is required if qcom,cpr-fuse-init-voltage is present. Loading Loading @@ -410,6 +415,7 @@ Example: <27 36 6 0>, <27 18 6 0>, <27 0 6 0>; qcom,cpr-init-voltage-ref = <1050000 1150000 1280000>; qcom,cpr-init-voltage-step = <10000>; }; arch/arm/boot/dts/qcom/msm8916-regulator.dtsi +1 −0 Original line number Diff line number Diff line Loading @@ -82,6 +82,7 @@ <27 36 6 0>, <27 18 6 0>, <27 0 6 0>; qcom,cpr-init-voltage-ref = <1050000 1150000 1350000>; qcom,cpr-init-voltage-step = <10000>; qcom,cpr-corner-map = <1 1 2 2 3 3 3>; qcom,cpr-corner-frequency-map = Loading arch/arm/boot/dts/qcom/msm8994-regulator.dtsi +2 −0 Original line number Diff line number Diff line Loading @@ -532,6 +532,7 @@ <138 0 6 0>, <138 6 6 0>, <138 12 6 0>; qcom,cpr-init-voltage-ref = <900000 1000000 1115000>; qcom,cpr-init-voltage-step = <10000>; }; Loading Loading @@ -576,6 +577,7 @@ <138 54 6 0>, <138 60 6 0>, <139 2 6 0>; qcom,cpr-init-voltage-ref = <900000 1000000 1115000>; qcom,cpr-init-voltage-step = <10000>; }; }; drivers/regulator/cpr-regulator.c +22 −3 Original line number Diff line number Diff line Loading @@ -1220,7 +1220,7 @@ static int cpr_pvs_per_corner_init(struct device_node *of_node, { u64 efuse_bits; int i, size, sign, steps, step_size_uv, rc; u32 *fuse_sel, *tmp; u32 *fuse_sel, *tmp, *ref_uv; struct property *prop; prop = of_find_property(of_node, "qcom,cpr-fuse-init-voltage", NULL); Loading Loading @@ -1252,6 +1252,24 @@ static int cpr_pvs_per_corner_init(struct device_node *of_node, kfree(fuse_sel); return rc; } ref_uv = kzalloc((cpr_vreg->num_fuse_corners + 1) * sizeof(*ref_uv), GFP_KERNEL); if (!ref_uv) { pr_err("Could not allocate memory for reference voltages\n"); kfree(fuse_sel); return -ENOMEM; } rc = of_property_read_u32_array(of_node, "qcom,cpr-init-voltage-ref", &ref_uv[CPR_FUSE_CORNER_MIN], cpr_vreg->num_fuse_corners); if (rc < 0) { pr_err("read qcom,cpr-init-voltage-ref failed, rc = %d\n", rc); kfree(fuse_sel); kfree(ref_uv); return rc; } tmp = fuse_sel; for (i = CPR_FUSE_CORNER_MIN; i <= cpr_vreg->num_fuse_corners; i++) { efuse_bits = cpr_read_efuse_param(cpr_vreg, fuse_sel[0], Loading @@ -1259,8 +1277,8 @@ static int cpr_pvs_per_corner_init(struct device_node *of_node, sign = (efuse_bits & (1 << (fuse_sel[2] - 1))) ? -1 : 1; steps = efuse_bits & ((1 << (fuse_sel[2] - 1)) - 1); pr_debug("corner %d: sign = %d, steps = %d\n", i, sign, steps); cpr_vreg->pvs_corner_v[i] = cpr_vreg->ceiling_volt[i] + sign * steps * step_size_uv; cpr_vreg->pvs_corner_v[i] = ref_uv[i] + sign * steps * step_size_uv; cpr_vreg->pvs_corner_v[i] = DIV_ROUND_UP( cpr_vreg->pvs_corner_v[i], cpr_vreg->step_volt) * Loading @@ -1280,6 +1298,7 @@ static int cpr_pvs_per_corner_init(struct device_node *of_node, fuse_sel += 4; } kfree(tmp); kfree(ref_uv); return 0; } Loading Loading
Documentation/devicetree/bindings/regulator/cpr-regulator.txt +6 −0 Original line number Diff line number Diff line Loading @@ -290,6 +290,11 @@ Optional properties: highest voltage fuse corner. A given cpr-regulator device must have either qcom,cpr-fuse-init-voltage specified or qcom,pvs-voltage-table (and its associated properties). - qcom,cpr-init-voltage-ref: Array of reference voltages in microvolts used when decoding the initial voltage fuse values. The elements in the array are ordered from lowest voltage corner to highest voltage corner. This property must be of length defined by qcom,cpr-fuse-corners. This property is required if qcom,cpr-fuse-init-voltage is present. - qcom,cpr-init-voltage-step: The voltage step size in microvolts of the CPR initial voltage fuses described by the qcom,cpr-fuse-init-voltage property. This property is required if qcom,cpr-fuse-init-voltage is present. Loading Loading @@ -410,6 +415,7 @@ Example: <27 36 6 0>, <27 18 6 0>, <27 0 6 0>; qcom,cpr-init-voltage-ref = <1050000 1150000 1280000>; qcom,cpr-init-voltage-step = <10000>; };
arch/arm/boot/dts/qcom/msm8916-regulator.dtsi +1 −0 Original line number Diff line number Diff line Loading @@ -82,6 +82,7 @@ <27 36 6 0>, <27 18 6 0>, <27 0 6 0>; qcom,cpr-init-voltage-ref = <1050000 1150000 1350000>; qcom,cpr-init-voltage-step = <10000>; qcom,cpr-corner-map = <1 1 2 2 3 3 3>; qcom,cpr-corner-frequency-map = Loading
arch/arm/boot/dts/qcom/msm8994-regulator.dtsi +2 −0 Original line number Diff line number Diff line Loading @@ -532,6 +532,7 @@ <138 0 6 0>, <138 6 6 0>, <138 12 6 0>; qcom,cpr-init-voltage-ref = <900000 1000000 1115000>; qcom,cpr-init-voltage-step = <10000>; }; Loading Loading @@ -576,6 +577,7 @@ <138 54 6 0>, <138 60 6 0>, <139 2 6 0>; qcom,cpr-init-voltage-ref = <900000 1000000 1115000>; qcom,cpr-init-voltage-step = <10000>; }; };
drivers/regulator/cpr-regulator.c +22 −3 Original line number Diff line number Diff line Loading @@ -1220,7 +1220,7 @@ static int cpr_pvs_per_corner_init(struct device_node *of_node, { u64 efuse_bits; int i, size, sign, steps, step_size_uv, rc; u32 *fuse_sel, *tmp; u32 *fuse_sel, *tmp, *ref_uv; struct property *prop; prop = of_find_property(of_node, "qcom,cpr-fuse-init-voltage", NULL); Loading Loading @@ -1252,6 +1252,24 @@ static int cpr_pvs_per_corner_init(struct device_node *of_node, kfree(fuse_sel); return rc; } ref_uv = kzalloc((cpr_vreg->num_fuse_corners + 1) * sizeof(*ref_uv), GFP_KERNEL); if (!ref_uv) { pr_err("Could not allocate memory for reference voltages\n"); kfree(fuse_sel); return -ENOMEM; } rc = of_property_read_u32_array(of_node, "qcom,cpr-init-voltage-ref", &ref_uv[CPR_FUSE_CORNER_MIN], cpr_vreg->num_fuse_corners); if (rc < 0) { pr_err("read qcom,cpr-init-voltage-ref failed, rc = %d\n", rc); kfree(fuse_sel); kfree(ref_uv); return rc; } tmp = fuse_sel; for (i = CPR_FUSE_CORNER_MIN; i <= cpr_vreg->num_fuse_corners; i++) { efuse_bits = cpr_read_efuse_param(cpr_vreg, fuse_sel[0], Loading @@ -1259,8 +1277,8 @@ static int cpr_pvs_per_corner_init(struct device_node *of_node, sign = (efuse_bits & (1 << (fuse_sel[2] - 1))) ? -1 : 1; steps = efuse_bits & ((1 << (fuse_sel[2] - 1)) - 1); pr_debug("corner %d: sign = %d, steps = %d\n", i, sign, steps); cpr_vreg->pvs_corner_v[i] = cpr_vreg->ceiling_volt[i] + sign * steps * step_size_uv; cpr_vreg->pvs_corner_v[i] = ref_uv[i] + sign * steps * step_size_uv; cpr_vreg->pvs_corner_v[i] = DIV_ROUND_UP( cpr_vreg->pvs_corner_v[i], cpr_vreg->step_volt) * Loading @@ -1280,6 +1298,7 @@ static int cpr_pvs_per_corner_init(struct device_node *of_node, fuse_sel += 4; } kfree(tmp); kfree(ref_uv); return 0; } Loading