aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc
diff options
context:
space:
mode:
authorAlexei Shlychkov <x0177296@ti.com>2012-08-16 17:30:49 -0700
committerDmytro Kedrovskyi <x0169235@ti.com>2012-09-27 14:32:26 +0300
commitf55d4615b91a188c415592d16bf853febaa13f5f (patch)
treed57f09a7e9a198296ea6049082d065227017e279 /drivers/misc
parent5213da09e55e7ad375aab5eef38ea0f47f265034 (diff)
downloadkernel_samsung_espresso10-f55d4615b91a188c415592d16bf853febaa13f5f.zip
kernel_samsung_espresso10-f55d4615b91a188c415592d16bf853febaa13f5f.tar.gz
kernel_samsung_espresso10-f55d4615b91a188c415592d16bf853febaa13f5f.tar.bz2
gcx: added gcpwr_get_speed function and cur_freq debugfs entry.
Determines the current speed of GC320 in megahertz. Change-Id: I0aadf024193d8c1d2aac7ef79604367249939831 Signed-off-by: Alexei Shlychkov <x0177296@ti.com>
Diffstat (limited to 'drivers/misc')
-rw-r--r--drivers/misc/gcx/gccore/gcdebug.c29
-rw-r--r--drivers/misc/gcx/gccore/gcmain.c25
-rw-r--r--drivers/misc/gcx/gccore/gcmain.h1
3 files changed, 54 insertions, 1 deletions
diff --git a/drivers/misc/gcx/gccore/gcdebug.c b/drivers/misc/gcx/gccore/gcdebug.c
index fdabcb2..fb0d502 100644
--- a/drivers/misc/gcx/gccore/gcdebug.c
+++ b/drivers/misc/gcx/gccore/gcdebug.c
@@ -16,6 +16,7 @@
#include <linux/seq_file.h>
#include <linux/module.h>
#include <linux/uaccess.h>
+#include <linux/delay.h>
#include <linux/gcx.h>
#include <linux/gccore.h>
#include "gcmain.h"
@@ -571,6 +572,32 @@ static const struct file_operations gc_debug_fops_log_reset = {
/*****************************************************************************/
+static int gc_debug_show_cur_freq(struct seq_file *s, void *data)
+{
+ unsigned mhz = gcpwr_get_speed();
+ if (mhz)
+ seq_printf(s, "cur freq: %d mhz\n", mhz);
+ else
+ seq_printf(s, "unable to read cur freq\n");
+
+ return 0;
+}
+
+static int gc_debug_open_cur_freq(struct inode *inode, struct file *file)
+{
+ return single_open(file, gc_debug_show_cur_freq, 0);
+}
+
+static const struct file_operations gc_debug_fops_cur_freq = {
+ .open = gc_debug_open_cur_freq,
+ .write = NULL,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+
+/*****************************************************************************/
+
void gc_debug_init(void)
{
struct dentry *logDir;
@@ -589,6 +616,8 @@ void gc_debug_init(void)
&gc_debug_fops_gpu_last_error);
debugfs_create_bool("cache_status_every_irq", 0664, debug_root,
&gc_cache_status_every_irq);
+ debugfs_create_file("cur_freq", 0664, debug_root, NULL,
+ &gc_debug_fops_cur_freq);
logDir = debugfs_create_dir("log", debug_root);
if (!logDir)
diff --git a/drivers/misc/gcx/gccore/gcmain.c b/drivers/misc/gcx/gccore/gcmain.c
index 61a25ef..d4aca5a 100644
--- a/drivers/misc/gcx/gccore/gcmain.c
+++ b/drivers/misc/gcx/gccore/gcmain.c
@@ -421,7 +421,7 @@ void gcpwr_reset(struct gccorecontext *gccorecontext)
gcclockcontrol.raw);
/* Wait for reset. */
- mdelay(1);
+ msleep(1);
/* Reset soft reset bit. */
gcclockcontrol.reg.reset = 0;
@@ -464,6 +464,29 @@ void gcpwr_reset(struct gccorecontext *gccorecontext)
GCEXIT(GCZONE_POWER);
}
+unsigned int gcpwr_get_speed(void)
+{
+ struct gccorecontext *gccorecontext = &g_context;
+ static const int seccount = 2;
+ unsigned int cyclecount;
+ unsigned int speedmhz = 0;
+
+ GCLOCK(&gccorecontext->powerlock);
+
+ if (gccorecontext->gcpower == GCPWR_ON) {
+ /* Reset cycle counter and sleep. */
+ gc_write_reg(GC_TOTAL_CYCLES_Address, 0);
+ msleep(seccount * 1000);
+
+ /* Read the cycle counter and compute the speed. */
+ cyclecount = gc_read_reg(GC_TOTAL_CYCLES_Address);
+ speedmhz = cyclecount / 1000 / 1000 / seccount;
+ }
+
+ GCUNLOCK(&gccorecontext->powerlock);
+
+ return speedmhz;
+}
/*******************************************************************************
* Public API.
diff --git a/drivers/misc/gcx/gccore/gcmain.h b/drivers/misc/gcx/gccore/gcmain.h
index 1c4ffa1..e2931d4 100644
--- a/drivers/misc/gcx/gccore/gcmain.h
+++ b/drivers/misc/gcx/gccore/gcmain.h
@@ -109,5 +109,6 @@ void gc_write_reg(unsigned int address, unsigned int data);
enum gcpower gcpwr_get(void);
void gcpwr_set(struct gccorecontext *gccorecontext, enum gcpower gcpower);
void gcpwr_reset(struct gccorecontext *gccorecontext);
+unsigned int gcpwr_get_speed(void);
#endif