diff options
| -rw-r--r-- | arch/arm/mach-omap2/voltage.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c index 8a36342e60d2..4dc60e83e00d 100644 --- a/arch/arm/mach-omap2/voltage.c +++ b/arch/arm/mach-omap2/voltage.c | |||
| @@ -73,7 +73,8 @@ unsigned long voltdm_get_voltage(struct voltagedomain *voltdm) | |||
| 73 | int voltdm_scale(struct voltagedomain *voltdm, | 73 | int voltdm_scale(struct voltagedomain *voltdm, |
| 74 | unsigned long target_volt) | 74 | unsigned long target_volt) |
| 75 | { | 75 | { |
| 76 | int ret; | 76 | int ret, i; |
| 77 | unsigned long volt = 0; | ||
| 77 | 78 | ||
| 78 | if (!voltdm || IS_ERR(voltdm)) { | 79 | if (!voltdm || IS_ERR(voltdm)) { |
| 79 | pr_warning("%s: VDD specified does not exist!\n", __func__); | 80 | pr_warning("%s: VDD specified does not exist!\n", __func__); |
| @@ -86,9 +87,23 @@ int voltdm_scale(struct voltagedomain *voltdm, | |||
| 86 | return -ENODATA; | 87 | return -ENODATA; |
| 87 | } | 88 | } |
| 88 | 89 | ||
| 89 | ret = voltdm->scale(voltdm, target_volt); | 90 | /* Adjust voltage to the exact voltage from the OPP table */ |
| 91 | for (i = 0; voltdm->volt_data[i].volt_nominal != 0; i++) { | ||
| 92 | if (voltdm->volt_data[i].volt_nominal >= target_volt) { | ||
| 93 | volt = voltdm->volt_data[i].volt_nominal; | ||
| 94 | break; | ||
| 95 | } | ||
| 96 | } | ||
| 97 | |||
| 98 | if (!volt) { | ||
| 99 | pr_warning("%s: not scaling. OPP voltage for %lu, not found.\n", | ||
| 100 | __func__, target_volt); | ||
| 101 | return -EINVAL; | ||
| 102 | } | ||
| 103 | |||
| 104 | ret = voltdm->scale(voltdm, volt); | ||
| 90 | if (!ret) | 105 | if (!ret) |
| 91 | voltdm->nominal_volt = target_volt; | 106 | voltdm->nominal_volt = volt; |
| 92 | 107 | ||
| 93 | return ret; | 108 | return ret; |
| 94 | } | 109 | } |
