summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pvr-source/services4/system/omap4/sgxfreq.c20
-rw-r--r--pvr-source/services4/system/omap4/sysconfig.h2
2 files changed, 21 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;
diff --git a/pvr-source/services4/system/omap4/sysconfig.h b/pvr-source/services4/system/omap4/sysconfig.h
index 64f3187..5a9c8f1 100644
--- a/pvr-source/services4/system/omap4/sysconfig.h
+++ b/pvr-source/services4/system/omap4/sysconfig.h
@@ -51,6 +51,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#define SYS_SGX_CLOCK_SPEED 304742400
#endif
+#define OMAP446X_447X_REFERNECE_FREQUENCY 384000000
+
#define SYS_SGX_HWRECOVERY_TIMEOUT_FREQ (100) // 10ms (100hz)
#define SYS_SGX_PDS_TIMER_FREQ (1000) // 1ms (1000hz)