diff options
author | Ziyan <jaraidaniel@gmail.com> | 2016-01-24 13:01:49 +0100 |
---|---|---|
committer | Ziyan <jaraidaniel@gmail.com> | 2016-01-24 16:02:43 +0100 |
commit | 17b183085b9321f0dbdf48b5a73f6f32559ddb46 (patch) | |
tree | d5a175694532496a02bd6e7c3b7f94084aeeb8e1 /pvr-source/services4/system/omap4/sgxfreq.c | |
parent | 9ce39213f4e21a5b080a101245ec63893e3e3a14 (diff) | |
download | hardware_ti_omap4-17b183085b9321f0dbdf48b5a73f6f32559ddb46.zip hardware_ti_omap4-17b183085b9321f0dbdf48b5a73f6f32559ddb46.tar.gz hardware_ti_omap4-17b183085b9321f0dbdf48b5a73f6f32559ddb46.tar.bz2 |
sgxfreq: set correct frequency limit on omap4460/4470
Commit 5e398ba changes how the initial frequency limit is selected: instead of
selecting the highest avaliable one, it hardcodes it to SYS_SGX_CLOCK_SPEED,
which is defined as 307200000 Hz for SGX540_120. However, omap4460/4470 devices
use 384000000 Hz, so we end up underclocking them.
Instead of hardcoding these frequencies, let's just use them as a reference
frequency, and use the first frequency that is less than or equal to the correct
reference frequency. This way, we can ensure a safe frequency set on kernels
with custom SGX clock frequencies enabled.
Change-Id: Ic55be55dbb5c9d4a3807096209cdf07bbbdca719
Diffstat (limited to 'pvr-source/services4/system/omap4/sgxfreq.c')
-rw-r--r-- | pvr-source/services4/system/omap4/sgxfreq.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/pvr-source/services4/system/omap4/sgxfreq.c b/pvr-source/services4/system/omap4/sgxfreq.c index 56123ae..8d3e96f 100644 --- a/pvr-source/services4/system/omap4/sgxfreq.c +++ b/pvr-source/services4/system/omap4/sgxfreq.c @@ -208,6 +208,24 @@ static const struct attribute *sgxfreq_attributes[] = { /************************ end sysfs interface ************************/ +static unsigned long __sgxfreq_get_max_safe_freq(void) +{ + int i; + unsigned long reference_freq = SYS_SGX_CLOCK_SPEED; + unsigned long freq; + + if (!cpu_is_omap443x()) + reference_freq = OMAP446X_447X_REFERNECE_FREQUENCY; + + for (i = sfd.freq_cnt - 1; i >= 0; i--) { + freq = sfd.freq_list[i]; + if (freq <= reference_freq) + return freq; + } + + return reference_freq; +} + static void __set_freq(void) { unsigned long freq; @@ -334,7 +352,7 @@ int sgxfreq_init(struct device *dev) rcu_read_unlock(); mutex_init(&sfd.freq_mutex); - sfd.freq_limit = SYS_SGX_CLOCK_SPEED; + sfd.freq_limit = __sgxfreq_get_max_safe_freq(); sgxfreq_set_freq_request(sfd.freq_list[sfd.freq_cnt - 1]); sfd.sgx_data.clk_on = false; sfd.sgx_data.active = false; |