diff options
Diffstat (limited to 'drivers/devfreq/devfreq.c')
-rw-r--r-- | drivers/devfreq/devfreq.c | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c index 329c5e3f3338..b5e7af60723c 100644 --- a/drivers/devfreq/devfreq.c +++ b/drivers/devfreq/devfreq.c | |||
@@ -324,11 +324,11 @@ int update_devfreq(struct devfreq *devfreq) | |||
324 | max_freq = min(devfreq->scaling_max_freq, devfreq->max_freq); | 324 | max_freq = min(devfreq->scaling_max_freq, devfreq->max_freq); |
325 | min_freq = max(devfreq->scaling_min_freq, devfreq->min_freq); | 325 | min_freq = max(devfreq->scaling_min_freq, devfreq->min_freq); |
326 | 326 | ||
327 | if (min_freq && freq < min_freq) { | 327 | if (freq < min_freq) { |
328 | freq = min_freq; | 328 | freq = min_freq; |
329 | flags &= ~DEVFREQ_FLAG_LEAST_UPPER_BOUND; /* Use GLB */ | 329 | flags &= ~DEVFREQ_FLAG_LEAST_UPPER_BOUND; /* Use GLB */ |
330 | } | 330 | } |
331 | if (max_freq && freq > max_freq) { | 331 | if (freq > max_freq) { |
332 | freq = max_freq; | 332 | freq = max_freq; |
333 | flags |= DEVFREQ_FLAG_LEAST_UPPER_BOUND; /* Use LUB */ | 333 | flags |= DEVFREQ_FLAG_LEAST_UPPER_BOUND; /* Use LUB */ |
334 | } | 334 | } |
@@ -1168,17 +1168,26 @@ static ssize_t min_freq_store(struct device *dev, struct device_attribute *attr, | |||
1168 | struct devfreq *df = to_devfreq(dev); | 1168 | struct devfreq *df = to_devfreq(dev); |
1169 | unsigned long value; | 1169 | unsigned long value; |
1170 | int ret; | 1170 | int ret; |
1171 | unsigned long max; | ||
1172 | 1171 | ||
1173 | ret = sscanf(buf, "%lu", &value); | 1172 | ret = sscanf(buf, "%lu", &value); |
1174 | if (ret != 1) | 1173 | if (ret != 1) |
1175 | return -EINVAL; | 1174 | return -EINVAL; |
1176 | 1175 | ||
1177 | mutex_lock(&df->lock); | 1176 | mutex_lock(&df->lock); |
1178 | max = df->max_freq; | 1177 | |
1179 | if (value && max && value > max) { | 1178 | if (value) { |
1180 | ret = -EINVAL; | 1179 | if (value > df->max_freq) { |
1181 | goto unlock; | 1180 | ret = -EINVAL; |
1181 | goto unlock; | ||
1182 | } | ||
1183 | } else { | ||
1184 | unsigned long *freq_table = df->profile->freq_table; | ||
1185 | |||
1186 | /* Get minimum frequency according to sorting order */ | ||
1187 | if (freq_table[0] < freq_table[df->profile->max_state - 1]) | ||
1188 | value = freq_table[0]; | ||
1189 | else | ||
1190 | value = freq_table[df->profile->max_state - 1]; | ||
1182 | } | 1191 | } |
1183 | 1192 | ||
1184 | df->min_freq = value; | 1193 | df->min_freq = value; |
@@ -1203,17 +1212,26 @@ static ssize_t max_freq_store(struct device *dev, struct device_attribute *attr, | |||
1203 | struct devfreq *df = to_devfreq(dev); | 1212 | struct devfreq *df = to_devfreq(dev); |
1204 | unsigned long value; | 1213 | unsigned long value; |
1205 | int ret; | 1214 | int ret; |
1206 | unsigned long min; | ||
1207 | 1215 | ||
1208 | ret = sscanf(buf, "%lu", &value); | 1216 | ret = sscanf(buf, "%lu", &value); |
1209 | if (ret != 1) | 1217 | if (ret != 1) |
1210 | return -EINVAL; | 1218 | return -EINVAL; |
1211 | 1219 | ||
1212 | mutex_lock(&df->lock); | 1220 | mutex_lock(&df->lock); |
1213 | min = df->min_freq; | 1221 | |
1214 | if (value && min && value < min) { | 1222 | if (value) { |
1215 | ret = -EINVAL; | 1223 | if (value < df->min_freq) { |
1216 | goto unlock; | 1224 | ret = -EINVAL; |
1225 | goto unlock; | ||
1226 | } | ||
1227 | } else { | ||
1228 | unsigned long *freq_table = df->profile->freq_table; | ||
1229 | |||
1230 | /* Get maximum frequency according to sorting order */ | ||
1231 | if (freq_table[0] < freq_table[df->profile->max_state - 1]) | ||
1232 | value = freq_table[df->profile->max_state - 1]; | ||
1233 | else | ||
1234 | value = freq_table[0]; | ||
1217 | } | 1235 | } |
1218 | 1236 | ||
1219 | df->max_freq = value; | 1237 | df->max_freq = value; |