diff options
| author | Matthias Kaehlcke <mka@chromium.org> | 2018-08-03 16:05:10 -0400 |
|---|---|---|
| committer | MyungJoo Ham <myungjoo.ham@samsung.com> | 2018-10-01 21:16:41 -0400 |
| commit | 6ff66e2a008337b8a005fd0ae2037bed716262cc (patch) | |
| tree | 41850ac28462aec890606158d4c371f81f19bdbf /drivers/devfreq | |
| parent | df5cf4a36178c5d4f2b8b9469cb2f722e64cd102 (diff) | |
PM / devfreq: Don't adjust to user limits in governors
Several governors use the user space limits df->min/max_freq to adjust
the target frequency. This is not necessary, since update_devfreq()
already takes care of this. Instead the governor can request the available
min/max frequency by setting the target frequency to DEVFREQ_MIN/MAX_FREQ
and let update_devfreq() take care of any adjustments.
Signed-off-by: Matthias Kaehlcke <mka@chromium.org>
Reviewed-by: Brian Norris <briannorris@chromium.org>
Reviewed-by: Chanwoo Choi <cw00.choi@samsung.com>
Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
Diffstat (limited to 'drivers/devfreq')
| -rw-r--r-- | drivers/devfreq/governor.h | 3 | ||||
| -rw-r--r-- | drivers/devfreq/governor_performance.c | 5 | ||||
| -rw-r--r-- | drivers/devfreq/governor_powersave.c | 2 | ||||
| -rw-r--r-- | drivers/devfreq/governor_simpleondemand.c | 12 | ||||
| -rw-r--r-- | drivers/devfreq/governor_userspace.c | 16 |
5 files changed, 12 insertions, 26 deletions
diff --git a/drivers/devfreq/governor.h b/drivers/devfreq/governor.h index cfc50a61a90d..b81700244ce3 100644 --- a/drivers/devfreq/governor.h +++ b/drivers/devfreq/governor.h | |||
| @@ -25,6 +25,9 @@ | |||
| 25 | #define DEVFREQ_GOV_SUSPEND 0x4 | 25 | #define DEVFREQ_GOV_SUSPEND 0x4 |
| 26 | #define DEVFREQ_GOV_RESUME 0x5 | 26 | #define DEVFREQ_GOV_RESUME 0x5 |
| 27 | 27 | ||
| 28 | #define DEVFREQ_MIN_FREQ 0 | ||
| 29 | #define DEVFREQ_MAX_FREQ ULONG_MAX | ||
| 30 | |||
| 28 | /** | 31 | /** |
| 29 | * struct devfreq_governor - Devfreq policy governor | 32 | * struct devfreq_governor - Devfreq policy governor |
| 30 | * @node: list node - contains registered devfreq governors | 33 | * @node: list node - contains registered devfreq governors |
diff --git a/drivers/devfreq/governor_performance.c b/drivers/devfreq/governor_performance.c index 4d23ecfbd948..ded429fd51be 100644 --- a/drivers/devfreq/governor_performance.c +++ b/drivers/devfreq/governor_performance.c | |||
| @@ -20,10 +20,7 @@ static int devfreq_performance_func(struct devfreq *df, | |||
| 20 | * target callback should be able to get floor value as | 20 | * target callback should be able to get floor value as |
| 21 | * said in devfreq.h | 21 | * said in devfreq.h |
| 22 | */ | 22 | */ |
| 23 | if (!df->max_freq) | 23 | *freq = DEVFREQ_MAX_FREQ; |
| 24 | *freq = UINT_MAX; | ||
| 25 | else | ||
| 26 | *freq = df->max_freq; | ||
| 27 | return 0; | 24 | return 0; |
| 28 | } | 25 | } |
| 29 | 26 | ||
diff --git a/drivers/devfreq/governor_powersave.c b/drivers/devfreq/governor_powersave.c index 0c42f23249ef..9e8897f5ac42 100644 --- a/drivers/devfreq/governor_powersave.c +++ b/drivers/devfreq/governor_powersave.c | |||
| @@ -20,7 +20,7 @@ static int devfreq_powersave_func(struct devfreq *df, | |||
| 20 | * target callback should be able to get ceiling value as | 20 | * target callback should be able to get ceiling value as |
| 21 | * said in devfreq.h | 21 | * said in devfreq.h |
| 22 | */ | 22 | */ |
| 23 | *freq = df->min_freq; | 23 | *freq = DEVFREQ_MIN_FREQ; |
| 24 | return 0; | 24 | return 0; |
| 25 | } | 25 | } |
| 26 | 26 | ||
diff --git a/drivers/devfreq/governor_simpleondemand.c b/drivers/devfreq/governor_simpleondemand.c index 28e0f2de7100..c0417f0e081e 100644 --- a/drivers/devfreq/governor_simpleondemand.c +++ b/drivers/devfreq/governor_simpleondemand.c | |||
| @@ -27,7 +27,6 @@ static int devfreq_simple_ondemand_func(struct devfreq *df, | |||
| 27 | unsigned int dfso_upthreshold = DFSO_UPTHRESHOLD; | 27 | unsigned int dfso_upthreshold = DFSO_UPTHRESHOLD; |
| 28 | unsigned int dfso_downdifferential = DFSO_DOWNDIFFERENCTIAL; | 28 | unsigned int dfso_downdifferential = DFSO_DOWNDIFFERENCTIAL; |
| 29 | struct devfreq_simple_ondemand_data *data = df->data; | 29 | struct devfreq_simple_ondemand_data *data = df->data; |
| 30 | unsigned long max = (df->max_freq) ? df->max_freq : UINT_MAX; | ||
| 31 | 30 | ||
| 32 | err = devfreq_update_stats(df); | 31 | err = devfreq_update_stats(df); |
| 33 | if (err) | 32 | if (err) |
| @@ -47,7 +46,7 @@ static int devfreq_simple_ondemand_func(struct devfreq *df, | |||
| 47 | 46 | ||
| 48 | /* Assume MAX if it is going to be divided by zero */ | 47 | /* Assume MAX if it is going to be divided by zero */ |
| 49 | if (stat->total_time == 0) { | 48 | if (stat->total_time == 0) { |
| 50 | *freq = max; | 49 | *freq = DEVFREQ_MAX_FREQ; |
| 51 | return 0; | 50 | return 0; |
| 52 | } | 51 | } |
| 53 | 52 | ||
| @@ -60,13 +59,13 @@ static int devfreq_simple_ondemand_func(struct devfreq *df, | |||
| 60 | /* Set MAX if it's busy enough */ | 59 | /* Set MAX if it's busy enough */ |
| 61 | if (stat->busy_time * 100 > | 60 | if (stat->busy_time * 100 > |
| 62 | stat->total_time * dfso_upthreshold) { | 61 | stat->total_time * dfso_upthreshold) { |
| 63 | *freq = max; | 62 | *freq = DEVFREQ_MAX_FREQ; |
| 64 | return 0; | 63 | return 0; |
| 65 | } | 64 | } |
| 66 | 65 | ||
| 67 | /* Set MAX if we do not know the initial frequency */ | 66 | /* Set MAX if we do not know the initial frequency */ |
| 68 | if (stat->current_frequency == 0) { | 67 | if (stat->current_frequency == 0) { |
| 69 | *freq = max; | 68 | *freq = DEVFREQ_MAX_FREQ; |
| 70 | return 0; | 69 | return 0; |
| 71 | } | 70 | } |
| 72 | 71 | ||
| @@ -85,11 +84,6 @@ static int devfreq_simple_ondemand_func(struct devfreq *df, | |||
| 85 | b = div_u64(b, (dfso_upthreshold - dfso_downdifferential / 2)); | 84 | b = div_u64(b, (dfso_upthreshold - dfso_downdifferential / 2)); |
| 86 | *freq = (unsigned long) b; | 85 | *freq = (unsigned long) b; |
| 87 | 86 | ||
| 88 | if (df->min_freq && *freq < df->min_freq) | ||
| 89 | *freq = df->min_freq; | ||
| 90 | if (df->max_freq && *freq > df->max_freq) | ||
| 91 | *freq = df->max_freq; | ||
| 92 | |||
| 93 | return 0; | 87 | return 0; |
| 94 | } | 88 | } |
| 95 | 89 | ||
diff --git a/drivers/devfreq/governor_userspace.c b/drivers/devfreq/governor_userspace.c index 080607c3f34d..378d84c011df 100644 --- a/drivers/devfreq/governor_userspace.c +++ b/drivers/devfreq/governor_userspace.c | |||
| @@ -26,19 +26,11 @@ static int devfreq_userspace_func(struct devfreq *df, unsigned long *freq) | |||
| 26 | { | 26 | { |
| 27 | struct userspace_data *data = df->data; | 27 | struct userspace_data *data = df->data; |
| 28 | 28 | ||
| 29 | if (data->valid) { | 29 | if (data->valid) |
| 30 | unsigned long adjusted_freq = data->user_frequency; | 30 | *freq = data->user_frequency; |
| 31 | 31 | else | |
| 32 | if (df->max_freq && adjusted_freq > df->max_freq) | ||
| 33 | adjusted_freq = df->max_freq; | ||
| 34 | |||
| 35 | if (df->min_freq && adjusted_freq < df->min_freq) | ||
| 36 | adjusted_freq = df->min_freq; | ||
| 37 | |||
| 38 | *freq = adjusted_freq; | ||
| 39 | } else { | ||
| 40 | *freq = df->previous_freq; /* No user freq specified yet */ | 32 | *freq = df->previous_freq; /* No user freq specified yet */ |
| 41 | } | 33 | |
| 42 | return 0; | 34 | return 0; |
| 43 | } | 35 | } |
| 44 | 36 | ||
