Loading Documentation/devicetree/bindings/arm/msm/cpr-regulator.txt +43 −22 Original line number Diff line number Diff line Loading @@ -22,16 +22,13 @@ Required properties: should be 1 for SVS corner - regulator-max-microvolt: Maximum corner value as max constraint, which should be 4 for SUPER_TURBO or 3 for TURBO - qcom,pvs-init-voltage: A list of integers whose length is equal to 2 to the power of qcom,pvs-fuse[num-of-bits]. The location or 0-based index of an element in the list corresponds to the bin number. The value of each integer corresponds to the initial voltage of the PVS bin in turbo mode in microvolts. - qcom,pvs-corner-ceiling-slow: Ceiling voltages of all corners for APC_PVS_SLOW - qcom,pvs-corner-ceiling-nom: Ceiling voltages of all corners for APC_PVS_NOM - qcom,pvs-corner-ceiling-fast: Ceiling voltages of all corners for APC_PVS_FAST The ceiling voltages for each of above three - qcom,pvs-voltage-table: Array of triples in which each triple indicates the initial voltage of the PVS bin in SVS, NOM and Turbo corner in microvolts. The location or 0-based index of an triple in the list corresponds to the bin number. - qcom,cpr-voltage-ceiling: Ceiling voltages of SVS, NOM and TURBO corners respectively - qcom,cpr-voltage-floor: Floor voltages of SVS, NOM and TURBO corners respectively The ceiling voltages for each of above two properties may look like this: 0 (SVS voltage): 1050000 uV 1 (NORMAL voltage): 1150000 uV Loading Loading @@ -243,23 +240,47 @@ Example: interrupts = <0 15 0>; regulator-name = "apc_corner"; regulator-min-microvolt = <1>; regulator-max-microvolt = <3>; regulator-max-microvolt = <12>; qcom,pvs-fuse = <22 6 5 1>; qcom,pvs-fuse-redun-sel = <22 24 3 2 1>; qcom,pvs-fuse-redun = <22 27 5 1>; qcom,pvs-init-voltage = <1330000 1330000 1330000 1320000 1310000 1300000 1290000 1280000 1270000 1260000 1250000 1240000 1230000 1220000 1210000 1200000 1190000 1180000 1170000 1160000 1150000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000>; qcom,pvs-corner-ceiling-slow = <1050000 1160000 1275000>; qcom,pvs-corner-ceiling-nom = <975000 1075000 1200000>; qcom,pvs-corner-ceiling-fast = <900000 1000000 1140000>; qcom,pvs-voltage-table = <1050000 1150000 1350000>, <1050000 1150000 1340000>, <1050000 1150000 1330000>, <1050000 1150000 1320000>, <1050000 1150000 1310000>, <1050000 1150000 1300000>, <1050000 1150000 1290000>, <1050000 1150000 1280000>, <1050000 1150000 1270000>, <1050000 1140000 1260000>, <1050000 1130000 1250000>, <1050000 1120000 1240000>, <1050000 1110000 1230000>, <1050000 1100000 1220000>, <1050000 1090000 1210000>, <1050000 1080000 1200000>, <1050000 1070000 1190000>, <1050000 1060000 1180000>, <1050000 1050000 1170000>, <1050000 1050000 1160000>, <1050000 1050000 1150000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>; qcom,cpr-voltage-ceiling = <1050000 1150000 1280000>; qcom,cpr-voltage-floor = <1050000 1050000 1100000>; vdd-apc-supply = <&pm8226_s2>; vdd-apc-optional-prim-supply = <&ncp6335d>; vdd-apc-optional-sec-supply = <&fan53555>; Loading arch/arm/boot/dts/qcom/msm8226-regulator.dtsi +35 −10 Original line number Diff line number Diff line Loading @@ -40,16 +40,41 @@ qcom,pvs-fuse = <22 6 5 0>; qcom,pvs-fuse-redun = <22 27 5 0>; qcom,pvs-init-voltage = <1350000 1340000 1330000 1320000 1310000 1300000 1290000 1280000 1270000 1260000 1250000 1240000 1230000 1220000 1210000 1200000 1190000 1180000 1170000 1160000 1150000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000>; qcom,pvs-corner-ceiling-slow = <1050000 1150000 1280000>; qcom,pvs-corner-ceiling-nom = <1050000 1080000 1200000>; qcom,pvs-corner-ceiling-fast = <1050000 1050000 1100000>; qcom,pvs-voltage-table = <1050000 1150000 1350000>, <1050000 1150000 1340000>, <1050000 1150000 1330000>, <1050000 1150000 1320000>, <1050000 1150000 1310000>, <1050000 1150000 1300000>, <1050000 1150000 1290000>, <1050000 1150000 1280000>, <1050000 1150000 1270000>, <1050000 1140000 1260000>, <1050000 1130000 1250000>, <1050000 1120000 1240000>, <1050000 1110000 1230000>, <1050000 1100000 1220000>, <1050000 1090000 1210000>, <1050000 1080000 1200000>, <1050000 1070000 1190000>, <1050000 1060000 1180000>, <1050000 1050000 1170000>, <1050000 1050000 1160000>, <1050000 1050000 1150000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>; qcom,cpr-voltage-ceiling = <1050000 1150000 1280000>; qcom,cpr-voltage-floor = <1050000 1050000 1100000>; vdd-apc-supply = <&pm8226_s2>; vdd-mx-supply = <&pm8226_l3_ao>; Loading arch/arm/boot/dts/qcom/msm8226-v1.dtsi +35 −10 Original line number Diff line number Diff line Loading @@ -85,16 +85,41 @@ &apc_vreg_corner { regulator-min-microvolt = <1>; regulator-max-microvolt = <3>; qcom,pvs-init-voltage = <1275000 1275000 1275000 1275000 1275000 1275000 1260000 1245000 1230000 1215000 1200000 1185000 1170000 1155000 1140000 1140000 1140000 1140000 1140000 1140000 1150000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1275000 1275000 1275000 1275000>; qcom,pvs-corner-ceiling-slow = <1050000 1150000 1275000>; qcom,pvs-corner-ceiling-nom = <1050000 1075000 1200000>; qcom,pvs-corner-ceiling-fast = <1050000 1050000 1100000>; qcom,pvs-voltage-table = <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1140000 1260000>, <1050000 1125000 1245000>, <1050000 1110000 1230000>, <1050000 1095000 1215000>, <1050000 1080000 1200000>, <1050000 1065000 1185000>, <1050000 1050000 1170000>, <1050000 1050000 1155000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>; qcom,cpr-voltage-ceiling = <1050000 1150000 1275000>; qcom,cpr-voltage-floor = <1050000 1050000 1100000>; qcom,cpr-step-quotient = <15>; qcom,cpr-apc-volt-step = <5000>; qcom,cpr-up-threshold = <0>; Loading arch/arm/boot/dts/qcom/msm8610-regulator.dtsi +36 −11 Original line number Diff line number Diff line /* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. /* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -42,16 +42,41 @@ qcom,pvs-fuse = <23 6 5 1>; qcom,pvs-fuse-redun = <61 47 5 1>; qcom,pvs-init-voltage = <1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000>; qcom,pvs-corner-ceiling-slow = <1050000 1150000 1275000>; qcom,pvs-corner-ceiling-nom = <1050000 1075000 1275000>; qcom,pvs-corner-ceiling-fast = <1050000 1050000 1275000>; qcom,pvs-voltage-table = <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>; qcom,cpr-voltage-ceiling = <1050000 1150000 1275000>; qcom,cpr-voltage-floor = <1050000 1050000 1275000>; vdd-apc-supply = <&pm8110_s2>; vdd-mx-supply = <&pm8110_l3_ao>; Loading arch/arm/mach-msm/cpr-regulator.c +67 −87 Original line number Diff line number Diff line Loading @@ -174,11 +174,9 @@ struct cpr_regulator { void __iomem *efuse_base; /* Process voltage parameters */ u32 pvs_init_v[CPR_PVS_EFUSE_BINS_MAX]; u32 pvs_corner_v[NUM_APC_PVS][CPR_FUSE_CORNER_MAX]; u32 pvs_corner_v[CPR_FUSE_CORNER_MAX]; /* Process voltage variables */ u32 pvs_bin; u32 process; u32 speed_bin; /* APC voltage regulator */ struct regulator *vdd_apc; Loading Loading @@ -506,8 +504,7 @@ static int cpr_mx_get(struct cpr_regulator *cpr_vreg, int corner, int apc_volt) vdd_mx = cpr_vreg->ceiling_volt[fuse_corner]; break; case VDD_MX_VMIN_APC_SLOW_CORNER_CEILING: vdd_mx = cpr_vreg->pvs_corner_v[APC_PVS_SLOW] [CPR_FUSE_CORNER_TURBO]; vdd_mx = cpr_vreg->ceiling_volt[CPR_FUSE_CORNER_TURBO]; break; case VDD_MX_VMIN_MX_VMAX: vdd_mx = cpr_vreg->vdd_mx_vmax; Loading Loading @@ -853,8 +850,7 @@ static int cpr_regulator_set_voltage(struct regulator_dev *rdev, cpr_ctl_disable(cpr_vreg); new_volt = cpr_vreg->last_volt[corner]; } else { new_volt = cpr_vreg->pvs_corner_v [cpr_vreg->process][fuse_corner]; new_volt = cpr_vreg->pvs_corner_v[fuse_corner]; } cpr_debug("[corner:%d, fuse_corner:%d] = %d uV\n", corner, fuse_corner, Loading Loading @@ -1077,7 +1073,7 @@ static int cpr_voltage_uplift_wa_inc_volt(struct cpr_regulator *cpr_vreg, { u32 uplift_voltage; u32 uplift_max_volt = 0; int rc, i; int rc; rc = of_property_read_u32(of_node, "qcom,cpr-uplift-voltage", &uplift_voltage); Loading @@ -1092,11 +1088,9 @@ static int cpr_voltage_uplift_wa_inc_volt(struct cpr_regulator *cpr_vreg, return rc; } for (i = 0; i < CPR_PVS_EFUSE_BINS_MAX; i++) { cpr_vreg->pvs_init_v[i] += uplift_voltage; if (cpr_vreg->pvs_init_v[i] > uplift_max_volt) cpr_vreg->pvs_init_v[i] = uplift_max_volt; } cpr_vreg->pvs_corner_v[CPR_FUSE_CORNER_TURBO] += uplift_voltage; if (cpr_vreg->pvs_corner_v[CPR_FUSE_CORNER_TURBO] > uplift_max_volt) cpr_vreg->pvs_corner_v[CPR_FUSE_CORNER_TURBO] = uplift_max_volt; return rc; } Loading @@ -1106,11 +1100,11 @@ static int cpr_pvs_init(struct platform_device *pdev, { struct device_node *of_node = pdev->dev.of_node; u64 efuse_bits; int rc, process; int rc, i, stripe_size; u32 pvs_fuse[4], pvs_fuse_redun_sel[5]; u32 init_v; bool redundant; size_t pvs_bins; u32 *tmp; rc = of_property_read_u32_array(of_node, "qcom,pvs-fuse-redun-sel", pvs_fuse_redun_sel, 5); Loading Loading @@ -1145,13 +1139,26 @@ static int cpr_pvs_init(struct platform_device *pdev, pvs_bins = 1 << pvs_fuse[2]; rc = of_property_read_u32_array(of_node, "qcom,pvs-init-voltage", cpr_vreg->pvs_init_v, pvs_bins); stripe_size = CPR_FUSE_CORNER_MAX - 1; tmp = kzalloc(sizeof(u32) * pvs_bins * stripe_size, GFP_KERNEL); if (!tmp) { pr_err("memory alloc failed\n"); return -ENOMEM; } rc = of_property_read_u32_array(of_node, "qcom,pvs-voltage-table", tmp, pvs_bins * stripe_size); if (rc < 0) { pr_err("pvs-init-voltage missing: rc=%d\n", rc); pr_err("pvs-voltage-table missing: rc=%d\n", rc); kfree(tmp); return rc; } for (i = CPR_FUSE_CORNER_SVS; i < CPR_FUSE_CORNER_MAX; i++) cpr_vreg->pvs_corner_v[i] = tmp[cpr_vreg->pvs_bin * stripe_size + i - 1]; kfree(tmp); if (cpr_vreg->flags & FLAGS_UPLIFT_QUOT_VOLT) { rc = cpr_voltage_uplift_wa_inc_volt(cpr_vreg, of_node); if (rc < 0) { Loading @@ -1160,30 +1167,31 @@ static int cpr_pvs_init(struct platform_device *pdev, } } init_v = cpr_vreg->pvs_init_v[cpr_vreg->pvs_bin]; for (process = NUM_APC_PVS - 1; process > APC_PVS_NO; process--) { if (init_v <= cpr_vreg->pvs_corner_v [process][CPR_FUSE_CORNER_TURBO]) break; } if (cpr_vreg->pvs_corner_v[CPR_FUSE_CORNER_TURBO] > cpr_vreg->ceiling_volt[CPR_FUSE_CORNER_TURBO]) cpr_vreg->ceiling_volt[CPR_FUSE_CORNER_TURBO] = cpr_vreg->pvs_corner_v[CPR_FUSE_CORNER_TURBO]; if (process == APC_PVS_NO) { process = APC_PVS_SLOW; cpr_vreg->pvs_corner_v[process][CPR_FUSE_CORNER_TURBO] = init_v; cpr_vreg->ceiling_max = init_v; } else if (process == APC_PVS_FAST && init_v < cpr_vreg->pvs_corner_v [APC_PVS_FAST][CPR_FUSE_CORNER_SVS]) { process = APC_PVS_SLOW; } for (i = CPR_FUSE_CORNER_SVS; i < CPR_FUSE_CORNER_TURBO; i++) if (cpr_vreg->pvs_corner_v[i] > cpr_vreg->ceiling_volt[i]) cpr_vreg->pvs_corner_v[i] = cpr_vreg->ceiling_volt[i]; else if (cpr_vreg->pvs_corner_v[i] < cpr_vreg->floor_volt[i]) cpr_vreg->pvs_corner_v[i] = cpr_vreg->floor_volt[i]; pr_info("[row:%d] = 0x%llX, n_bits=%d, bin=%d (%d)", pvs_fuse[0], efuse_bits, pvs_fuse[2], cpr_vreg->pvs_bin, process); pr_info("pvs initial turbo voltage_= from %u to %u\n", init_v, cpr_vreg->pvs_corner_v[process][CPR_FUSE_CORNER_TURBO]); cpr_vreg->ceiling_max = cpr_vreg->ceiling_volt[CPR_FUSE_CORNER_TURBO]; cpr_vreg->process = process; pr_info("pvs voltage: [%d %d %d] uV\n", cpr_vreg->pvs_corner_v[CPR_FUSE_CORNER_SVS], cpr_vreg->pvs_corner_v[CPR_FUSE_CORNER_NORMAL], cpr_vreg->pvs_corner_v[CPR_FUSE_CORNER_TURBO]); pr_info("ceiling voltage: [%d %d %d] uV\n", cpr_vreg->ceiling_volt[CPR_FUSE_CORNER_SVS], cpr_vreg->ceiling_volt[CPR_FUSE_CORNER_NORMAL], cpr_vreg->ceiling_volt[CPR_FUSE_CORNER_TURBO]); pr_info("floor voltage: [%d %d %d] uV\n", cpr_vreg->floor_volt[CPR_FUSE_CORNER_SVS], cpr_vreg->floor_volt[CPR_FUSE_CORNER_NORMAL], cpr_vreg->floor_volt[CPR_FUSE_CORNER_TURBO]); return 0; } Loading Loading @@ -1581,17 +1589,9 @@ static int cpr_init_cpr_voltages(struct cpr_regulator *cpr_vreg, if (!cpr_vreg->last_volt) return -EINVAL; /* Construct CPR voltage limits */ for (i = CPR_FUSE_CORNER_SVS; i < CPR_FUSE_CORNER_MAX; i++) { cpr_vreg->floor_volt[i] = cpr_vreg->pvs_corner_v[APC_PVS_FAST][i]; cpr_vreg->ceiling_volt[i] = cpr_vreg->pvs_corner_v[APC_PVS_SLOW][i]; } for (i = 1; i < size; i++) { cpr_vreg->last_volt[i] = cpr_vreg->pvs_corner_v [cpr_vreg->process][cpr_vreg->corner_map[i]]; [cpr_vreg->corner_map[i]]; } return 0; Loading Loading @@ -1829,33 +1829,22 @@ static int cpr_voltage_plan_init(struct platform_device *pdev, struct cpr_regulator *cpr_vreg) { struct device_node *of_node = pdev->dev.of_node; int rc, i, j; int rc, i; u32 min_uv = 0; rc = of_property_read_u32_array(of_node, "qcom,pvs-corner-ceiling-slow", &cpr_vreg->pvs_corner_v[APC_PVS_SLOW][CPR_FUSE_CORNER_SVS], CPR_FUSE_CORNER_MAX - CPR_FUSE_CORNER_SVS); if (rc < 0) { pr_err("pvs-corner-ceiling-slow missing: rc=%d\n", rc); return rc; } rc = of_property_read_u32_array(of_node, "qcom,pvs-corner-ceiling-nom", &cpr_vreg->pvs_corner_v[APC_PVS_NOM][CPR_FUSE_CORNER_SVS], CPR_FUSE_CORNER_MAX - CPR_FUSE_CORNER_SVS); rc = of_property_read_u32_array(of_node, "qcom,cpr-voltage-ceiling", &cpr_vreg->ceiling_volt[CPR_FUSE_CORNER_SVS], CPR_FUSE_CORNER_MAX - 1); if (rc < 0) { pr_err("pvs-corner-ceiling-norm missing: rc=%d\n", rc); pr_err("cpr-voltage-ceiling missing: rc=%d\n", rc); return rc; } rc = of_property_read_u32_array(of_node, "qcom,pvs-corner-ceiling-fast", &cpr_vreg->pvs_corner_v[APC_PVS_FAST][CPR_FUSE_CORNER_SVS], CPR_FUSE_CORNER_MAX - CPR_FUSE_CORNER_SVS); rc = of_property_read_u32_array(of_node, "qcom,cpr-voltage-floor", &cpr_vreg->floor_volt[CPR_FUSE_CORNER_SVS], CPR_FUSE_CORNER_MAX - 1); if (rc < 0) { pr_err("pvs-corner-ceiling-fast missing: rc=%d\n", rc); pr_err("cpr-voltage-floor missing: rc=%d\n", rc); return rc; } Loading @@ -1869,22 +1858,13 @@ static int cpr_voltage_plan_init(struct platform_device *pdev, if (cpr_vreg->flags & FLAGS_SET_MIN_VOLTAGE) { of_property_read_u32(of_node, "qcom,cpr-cond-min-voltage", &min_uv); for (i = APC_PVS_SLOW; i < NUM_APC_PVS; i++) for (j = CPR_FUSE_CORNER_SVS; j < CPR_FUSE_CORNER_MAX; j++) if (cpr_vreg->pvs_corner_v[i][j] < min_uv) cpr_vreg->pvs_corner_v[i][j] = min_uv; } /* Set ceiling max and use it for APC_PVS_NO */ cpr_vreg->ceiling_max = cpr_vreg->pvs_corner_v[APC_PVS_SLOW][CPR_FUSE_CORNER_TURBO]; for (i = APC_PVS_SLOW; i < NUM_APC_PVS; i++) { pr_info("[%d] [%d %d %d] uV\n", i, cpr_vreg->pvs_corner_v[i][CPR_FUSE_CORNER_SVS], cpr_vreg->pvs_corner_v[i][CPR_FUSE_CORNER_NORMAL], cpr_vreg->pvs_corner_v[i][CPR_FUSE_CORNER_TURBO]); for (i = CPR_FUSE_CORNER_SVS; i < CPR_FUSE_CORNER_MAX; i++) if (cpr_vreg->ceiling_volt[i] < min_uv) { cpr_vreg->ceiling_volt[i] = min_uv; cpr_vreg->floor_volt[i] = min_uv; } else if (cpr_vreg->floor_volt[i] < min_uv) { cpr_vreg->floor_volt[i] = min_uv; } } return 0; Loading Loading
Documentation/devicetree/bindings/arm/msm/cpr-regulator.txt +43 −22 Original line number Diff line number Diff line Loading @@ -22,16 +22,13 @@ Required properties: should be 1 for SVS corner - regulator-max-microvolt: Maximum corner value as max constraint, which should be 4 for SUPER_TURBO or 3 for TURBO - qcom,pvs-init-voltage: A list of integers whose length is equal to 2 to the power of qcom,pvs-fuse[num-of-bits]. The location or 0-based index of an element in the list corresponds to the bin number. The value of each integer corresponds to the initial voltage of the PVS bin in turbo mode in microvolts. - qcom,pvs-corner-ceiling-slow: Ceiling voltages of all corners for APC_PVS_SLOW - qcom,pvs-corner-ceiling-nom: Ceiling voltages of all corners for APC_PVS_NOM - qcom,pvs-corner-ceiling-fast: Ceiling voltages of all corners for APC_PVS_FAST The ceiling voltages for each of above three - qcom,pvs-voltage-table: Array of triples in which each triple indicates the initial voltage of the PVS bin in SVS, NOM and Turbo corner in microvolts. The location or 0-based index of an triple in the list corresponds to the bin number. - qcom,cpr-voltage-ceiling: Ceiling voltages of SVS, NOM and TURBO corners respectively - qcom,cpr-voltage-floor: Floor voltages of SVS, NOM and TURBO corners respectively The ceiling voltages for each of above two properties may look like this: 0 (SVS voltage): 1050000 uV 1 (NORMAL voltage): 1150000 uV Loading Loading @@ -243,23 +240,47 @@ Example: interrupts = <0 15 0>; regulator-name = "apc_corner"; regulator-min-microvolt = <1>; regulator-max-microvolt = <3>; regulator-max-microvolt = <12>; qcom,pvs-fuse = <22 6 5 1>; qcom,pvs-fuse-redun-sel = <22 24 3 2 1>; qcom,pvs-fuse-redun = <22 27 5 1>; qcom,pvs-init-voltage = <1330000 1330000 1330000 1320000 1310000 1300000 1290000 1280000 1270000 1260000 1250000 1240000 1230000 1220000 1210000 1200000 1190000 1180000 1170000 1160000 1150000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000>; qcom,pvs-corner-ceiling-slow = <1050000 1160000 1275000>; qcom,pvs-corner-ceiling-nom = <975000 1075000 1200000>; qcom,pvs-corner-ceiling-fast = <900000 1000000 1140000>; qcom,pvs-voltage-table = <1050000 1150000 1350000>, <1050000 1150000 1340000>, <1050000 1150000 1330000>, <1050000 1150000 1320000>, <1050000 1150000 1310000>, <1050000 1150000 1300000>, <1050000 1150000 1290000>, <1050000 1150000 1280000>, <1050000 1150000 1270000>, <1050000 1140000 1260000>, <1050000 1130000 1250000>, <1050000 1120000 1240000>, <1050000 1110000 1230000>, <1050000 1100000 1220000>, <1050000 1090000 1210000>, <1050000 1080000 1200000>, <1050000 1070000 1190000>, <1050000 1060000 1180000>, <1050000 1050000 1170000>, <1050000 1050000 1160000>, <1050000 1050000 1150000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>; qcom,cpr-voltage-ceiling = <1050000 1150000 1280000>; qcom,cpr-voltage-floor = <1050000 1050000 1100000>; vdd-apc-supply = <&pm8226_s2>; vdd-apc-optional-prim-supply = <&ncp6335d>; vdd-apc-optional-sec-supply = <&fan53555>; Loading
arch/arm/boot/dts/qcom/msm8226-regulator.dtsi +35 −10 Original line number Diff line number Diff line Loading @@ -40,16 +40,41 @@ qcom,pvs-fuse = <22 6 5 0>; qcom,pvs-fuse-redun = <22 27 5 0>; qcom,pvs-init-voltage = <1350000 1340000 1330000 1320000 1310000 1300000 1290000 1280000 1270000 1260000 1250000 1240000 1230000 1220000 1210000 1200000 1190000 1180000 1170000 1160000 1150000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000>; qcom,pvs-corner-ceiling-slow = <1050000 1150000 1280000>; qcom,pvs-corner-ceiling-nom = <1050000 1080000 1200000>; qcom,pvs-corner-ceiling-fast = <1050000 1050000 1100000>; qcom,pvs-voltage-table = <1050000 1150000 1350000>, <1050000 1150000 1340000>, <1050000 1150000 1330000>, <1050000 1150000 1320000>, <1050000 1150000 1310000>, <1050000 1150000 1300000>, <1050000 1150000 1290000>, <1050000 1150000 1280000>, <1050000 1150000 1270000>, <1050000 1140000 1260000>, <1050000 1130000 1250000>, <1050000 1120000 1240000>, <1050000 1110000 1230000>, <1050000 1100000 1220000>, <1050000 1090000 1210000>, <1050000 1080000 1200000>, <1050000 1070000 1190000>, <1050000 1060000 1180000>, <1050000 1050000 1170000>, <1050000 1050000 1160000>, <1050000 1050000 1150000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>; qcom,cpr-voltage-ceiling = <1050000 1150000 1280000>; qcom,cpr-voltage-floor = <1050000 1050000 1100000>; vdd-apc-supply = <&pm8226_s2>; vdd-mx-supply = <&pm8226_l3_ao>; Loading
arch/arm/boot/dts/qcom/msm8226-v1.dtsi +35 −10 Original line number Diff line number Diff line Loading @@ -85,16 +85,41 @@ &apc_vreg_corner { regulator-min-microvolt = <1>; regulator-max-microvolt = <3>; qcom,pvs-init-voltage = <1275000 1275000 1275000 1275000 1275000 1275000 1260000 1245000 1230000 1215000 1200000 1185000 1170000 1155000 1140000 1140000 1140000 1140000 1140000 1140000 1150000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1275000 1275000 1275000 1275000>; qcom,pvs-corner-ceiling-slow = <1050000 1150000 1275000>; qcom,pvs-corner-ceiling-nom = <1050000 1075000 1200000>; qcom,pvs-corner-ceiling-fast = <1050000 1050000 1100000>; qcom,pvs-voltage-table = <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1140000 1260000>, <1050000 1125000 1245000>, <1050000 1110000 1230000>, <1050000 1095000 1215000>, <1050000 1080000 1200000>, <1050000 1065000 1185000>, <1050000 1050000 1170000>, <1050000 1050000 1155000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1050000 1140000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>; qcom,cpr-voltage-ceiling = <1050000 1150000 1275000>; qcom,cpr-voltage-floor = <1050000 1050000 1100000>; qcom,cpr-step-quotient = <15>; qcom,cpr-apc-volt-step = <5000>; qcom,cpr-up-threshold = <0>; Loading
arch/arm/boot/dts/qcom/msm8610-regulator.dtsi +36 −11 Original line number Diff line number Diff line /* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. /* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -42,16 +42,41 @@ qcom,pvs-fuse = <23 6 5 1>; qcom,pvs-fuse-redun = <61 47 5 1>; qcom,pvs-init-voltage = <1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000 1275000>; qcom,pvs-corner-ceiling-slow = <1050000 1150000 1275000>; qcom,pvs-corner-ceiling-nom = <1050000 1075000 1275000>; qcom,pvs-corner-ceiling-fast = <1050000 1050000 1275000>; qcom,pvs-voltage-table = <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>, <1050000 1150000 1275000>; qcom,cpr-voltage-ceiling = <1050000 1150000 1275000>; qcom,cpr-voltage-floor = <1050000 1050000 1275000>; vdd-apc-supply = <&pm8110_s2>; vdd-mx-supply = <&pm8110_l3_ao>; Loading
arch/arm/mach-msm/cpr-regulator.c +67 −87 Original line number Diff line number Diff line Loading @@ -174,11 +174,9 @@ struct cpr_regulator { void __iomem *efuse_base; /* Process voltage parameters */ u32 pvs_init_v[CPR_PVS_EFUSE_BINS_MAX]; u32 pvs_corner_v[NUM_APC_PVS][CPR_FUSE_CORNER_MAX]; u32 pvs_corner_v[CPR_FUSE_CORNER_MAX]; /* Process voltage variables */ u32 pvs_bin; u32 process; u32 speed_bin; /* APC voltage regulator */ struct regulator *vdd_apc; Loading Loading @@ -506,8 +504,7 @@ static int cpr_mx_get(struct cpr_regulator *cpr_vreg, int corner, int apc_volt) vdd_mx = cpr_vreg->ceiling_volt[fuse_corner]; break; case VDD_MX_VMIN_APC_SLOW_CORNER_CEILING: vdd_mx = cpr_vreg->pvs_corner_v[APC_PVS_SLOW] [CPR_FUSE_CORNER_TURBO]; vdd_mx = cpr_vreg->ceiling_volt[CPR_FUSE_CORNER_TURBO]; break; case VDD_MX_VMIN_MX_VMAX: vdd_mx = cpr_vreg->vdd_mx_vmax; Loading Loading @@ -853,8 +850,7 @@ static int cpr_regulator_set_voltage(struct regulator_dev *rdev, cpr_ctl_disable(cpr_vreg); new_volt = cpr_vreg->last_volt[corner]; } else { new_volt = cpr_vreg->pvs_corner_v [cpr_vreg->process][fuse_corner]; new_volt = cpr_vreg->pvs_corner_v[fuse_corner]; } cpr_debug("[corner:%d, fuse_corner:%d] = %d uV\n", corner, fuse_corner, Loading Loading @@ -1077,7 +1073,7 @@ static int cpr_voltage_uplift_wa_inc_volt(struct cpr_regulator *cpr_vreg, { u32 uplift_voltage; u32 uplift_max_volt = 0; int rc, i; int rc; rc = of_property_read_u32(of_node, "qcom,cpr-uplift-voltage", &uplift_voltage); Loading @@ -1092,11 +1088,9 @@ static int cpr_voltage_uplift_wa_inc_volt(struct cpr_regulator *cpr_vreg, return rc; } for (i = 0; i < CPR_PVS_EFUSE_BINS_MAX; i++) { cpr_vreg->pvs_init_v[i] += uplift_voltage; if (cpr_vreg->pvs_init_v[i] > uplift_max_volt) cpr_vreg->pvs_init_v[i] = uplift_max_volt; } cpr_vreg->pvs_corner_v[CPR_FUSE_CORNER_TURBO] += uplift_voltage; if (cpr_vreg->pvs_corner_v[CPR_FUSE_CORNER_TURBO] > uplift_max_volt) cpr_vreg->pvs_corner_v[CPR_FUSE_CORNER_TURBO] = uplift_max_volt; return rc; } Loading @@ -1106,11 +1100,11 @@ static int cpr_pvs_init(struct platform_device *pdev, { struct device_node *of_node = pdev->dev.of_node; u64 efuse_bits; int rc, process; int rc, i, stripe_size; u32 pvs_fuse[4], pvs_fuse_redun_sel[5]; u32 init_v; bool redundant; size_t pvs_bins; u32 *tmp; rc = of_property_read_u32_array(of_node, "qcom,pvs-fuse-redun-sel", pvs_fuse_redun_sel, 5); Loading Loading @@ -1145,13 +1139,26 @@ static int cpr_pvs_init(struct platform_device *pdev, pvs_bins = 1 << pvs_fuse[2]; rc = of_property_read_u32_array(of_node, "qcom,pvs-init-voltage", cpr_vreg->pvs_init_v, pvs_bins); stripe_size = CPR_FUSE_CORNER_MAX - 1; tmp = kzalloc(sizeof(u32) * pvs_bins * stripe_size, GFP_KERNEL); if (!tmp) { pr_err("memory alloc failed\n"); return -ENOMEM; } rc = of_property_read_u32_array(of_node, "qcom,pvs-voltage-table", tmp, pvs_bins * stripe_size); if (rc < 0) { pr_err("pvs-init-voltage missing: rc=%d\n", rc); pr_err("pvs-voltage-table missing: rc=%d\n", rc); kfree(tmp); return rc; } for (i = CPR_FUSE_CORNER_SVS; i < CPR_FUSE_CORNER_MAX; i++) cpr_vreg->pvs_corner_v[i] = tmp[cpr_vreg->pvs_bin * stripe_size + i - 1]; kfree(tmp); if (cpr_vreg->flags & FLAGS_UPLIFT_QUOT_VOLT) { rc = cpr_voltage_uplift_wa_inc_volt(cpr_vreg, of_node); if (rc < 0) { Loading @@ -1160,30 +1167,31 @@ static int cpr_pvs_init(struct platform_device *pdev, } } init_v = cpr_vreg->pvs_init_v[cpr_vreg->pvs_bin]; for (process = NUM_APC_PVS - 1; process > APC_PVS_NO; process--) { if (init_v <= cpr_vreg->pvs_corner_v [process][CPR_FUSE_CORNER_TURBO]) break; } if (cpr_vreg->pvs_corner_v[CPR_FUSE_CORNER_TURBO] > cpr_vreg->ceiling_volt[CPR_FUSE_CORNER_TURBO]) cpr_vreg->ceiling_volt[CPR_FUSE_CORNER_TURBO] = cpr_vreg->pvs_corner_v[CPR_FUSE_CORNER_TURBO]; if (process == APC_PVS_NO) { process = APC_PVS_SLOW; cpr_vreg->pvs_corner_v[process][CPR_FUSE_CORNER_TURBO] = init_v; cpr_vreg->ceiling_max = init_v; } else if (process == APC_PVS_FAST && init_v < cpr_vreg->pvs_corner_v [APC_PVS_FAST][CPR_FUSE_CORNER_SVS]) { process = APC_PVS_SLOW; } for (i = CPR_FUSE_CORNER_SVS; i < CPR_FUSE_CORNER_TURBO; i++) if (cpr_vreg->pvs_corner_v[i] > cpr_vreg->ceiling_volt[i]) cpr_vreg->pvs_corner_v[i] = cpr_vreg->ceiling_volt[i]; else if (cpr_vreg->pvs_corner_v[i] < cpr_vreg->floor_volt[i]) cpr_vreg->pvs_corner_v[i] = cpr_vreg->floor_volt[i]; pr_info("[row:%d] = 0x%llX, n_bits=%d, bin=%d (%d)", pvs_fuse[0], efuse_bits, pvs_fuse[2], cpr_vreg->pvs_bin, process); pr_info("pvs initial turbo voltage_= from %u to %u\n", init_v, cpr_vreg->pvs_corner_v[process][CPR_FUSE_CORNER_TURBO]); cpr_vreg->ceiling_max = cpr_vreg->ceiling_volt[CPR_FUSE_CORNER_TURBO]; cpr_vreg->process = process; pr_info("pvs voltage: [%d %d %d] uV\n", cpr_vreg->pvs_corner_v[CPR_FUSE_CORNER_SVS], cpr_vreg->pvs_corner_v[CPR_FUSE_CORNER_NORMAL], cpr_vreg->pvs_corner_v[CPR_FUSE_CORNER_TURBO]); pr_info("ceiling voltage: [%d %d %d] uV\n", cpr_vreg->ceiling_volt[CPR_FUSE_CORNER_SVS], cpr_vreg->ceiling_volt[CPR_FUSE_CORNER_NORMAL], cpr_vreg->ceiling_volt[CPR_FUSE_CORNER_TURBO]); pr_info("floor voltage: [%d %d %d] uV\n", cpr_vreg->floor_volt[CPR_FUSE_CORNER_SVS], cpr_vreg->floor_volt[CPR_FUSE_CORNER_NORMAL], cpr_vreg->floor_volt[CPR_FUSE_CORNER_TURBO]); return 0; } Loading Loading @@ -1581,17 +1589,9 @@ static int cpr_init_cpr_voltages(struct cpr_regulator *cpr_vreg, if (!cpr_vreg->last_volt) return -EINVAL; /* Construct CPR voltage limits */ for (i = CPR_FUSE_CORNER_SVS; i < CPR_FUSE_CORNER_MAX; i++) { cpr_vreg->floor_volt[i] = cpr_vreg->pvs_corner_v[APC_PVS_FAST][i]; cpr_vreg->ceiling_volt[i] = cpr_vreg->pvs_corner_v[APC_PVS_SLOW][i]; } for (i = 1; i < size; i++) { cpr_vreg->last_volt[i] = cpr_vreg->pvs_corner_v [cpr_vreg->process][cpr_vreg->corner_map[i]]; [cpr_vreg->corner_map[i]]; } return 0; Loading Loading @@ -1829,33 +1829,22 @@ static int cpr_voltage_plan_init(struct platform_device *pdev, struct cpr_regulator *cpr_vreg) { struct device_node *of_node = pdev->dev.of_node; int rc, i, j; int rc, i; u32 min_uv = 0; rc = of_property_read_u32_array(of_node, "qcom,pvs-corner-ceiling-slow", &cpr_vreg->pvs_corner_v[APC_PVS_SLOW][CPR_FUSE_CORNER_SVS], CPR_FUSE_CORNER_MAX - CPR_FUSE_CORNER_SVS); if (rc < 0) { pr_err("pvs-corner-ceiling-slow missing: rc=%d\n", rc); return rc; } rc = of_property_read_u32_array(of_node, "qcom,pvs-corner-ceiling-nom", &cpr_vreg->pvs_corner_v[APC_PVS_NOM][CPR_FUSE_CORNER_SVS], CPR_FUSE_CORNER_MAX - CPR_FUSE_CORNER_SVS); rc = of_property_read_u32_array(of_node, "qcom,cpr-voltage-ceiling", &cpr_vreg->ceiling_volt[CPR_FUSE_CORNER_SVS], CPR_FUSE_CORNER_MAX - 1); if (rc < 0) { pr_err("pvs-corner-ceiling-norm missing: rc=%d\n", rc); pr_err("cpr-voltage-ceiling missing: rc=%d\n", rc); return rc; } rc = of_property_read_u32_array(of_node, "qcom,pvs-corner-ceiling-fast", &cpr_vreg->pvs_corner_v[APC_PVS_FAST][CPR_FUSE_CORNER_SVS], CPR_FUSE_CORNER_MAX - CPR_FUSE_CORNER_SVS); rc = of_property_read_u32_array(of_node, "qcom,cpr-voltage-floor", &cpr_vreg->floor_volt[CPR_FUSE_CORNER_SVS], CPR_FUSE_CORNER_MAX - 1); if (rc < 0) { pr_err("pvs-corner-ceiling-fast missing: rc=%d\n", rc); pr_err("cpr-voltage-floor missing: rc=%d\n", rc); return rc; } Loading @@ -1869,22 +1858,13 @@ static int cpr_voltage_plan_init(struct platform_device *pdev, if (cpr_vreg->flags & FLAGS_SET_MIN_VOLTAGE) { of_property_read_u32(of_node, "qcom,cpr-cond-min-voltage", &min_uv); for (i = APC_PVS_SLOW; i < NUM_APC_PVS; i++) for (j = CPR_FUSE_CORNER_SVS; j < CPR_FUSE_CORNER_MAX; j++) if (cpr_vreg->pvs_corner_v[i][j] < min_uv) cpr_vreg->pvs_corner_v[i][j] = min_uv; } /* Set ceiling max and use it for APC_PVS_NO */ cpr_vreg->ceiling_max = cpr_vreg->pvs_corner_v[APC_PVS_SLOW][CPR_FUSE_CORNER_TURBO]; for (i = APC_PVS_SLOW; i < NUM_APC_PVS; i++) { pr_info("[%d] [%d %d %d] uV\n", i, cpr_vreg->pvs_corner_v[i][CPR_FUSE_CORNER_SVS], cpr_vreg->pvs_corner_v[i][CPR_FUSE_CORNER_NORMAL], cpr_vreg->pvs_corner_v[i][CPR_FUSE_CORNER_TURBO]); for (i = CPR_FUSE_CORNER_SVS; i < CPR_FUSE_CORNER_MAX; i++) if (cpr_vreg->ceiling_volt[i] < min_uv) { cpr_vreg->ceiling_volt[i] = min_uv; cpr_vreg->floor_volt[i] = min_uv; } else if (cpr_vreg->floor_volt[i] < min_uv) { cpr_vreg->floor_volt[i] = min_uv; } } return 0; Loading