summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Frid <afrid@nvidia.com>2011-04-01 21:25:40 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:42:28 -0800
commit94c3df8e013357feb576ae631f78aae21db2ad71 (patch)
tree319355daebd42346e938632b123260a8b0e0eac6
parent233903b019670654b80aa080d0bc0cb2893b7f7b (diff)
ARM: tegra: clock: Add clock time on statistic
Original-Change-Id: I361e00ef84ce4ca9a9c6d7340de2d095fc67a208 Reviewed-on: http://git-master/r/25180 Tested-by: Aleksandr Frid <afrid@nvidia.com> Reviewed-by: Jin Qian <jqian@nvidia.com> Reviewed-by: Jonathan Mayo <jmayo@nvidia.com> Reviewed-by: Scott Williams <scwilliams@nvidia.com> Original-Change-Id: If382fc3b5d2ca678df8a9319a06bae967fc3c658 Rebase-Id: Ref4182db3e144202dd2df2047a3683e478e070fc
-rw-r--r--arch/arm/mach-tegra/clock.c34
-rw-r--r--arch/arm/mach-tegra/clock.h7
2 files changed, 41 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/clock.c b/arch/arm/mach-tegra/clock.c
index 8131c723e1cb..cce16b29aaf7 100644
--- a/arch/arm/mach-tegra/clock.c
+++ b/arch/arm/mach-tegra/clock.c
@@ -104,6 +104,18 @@ struct clk *tegra_get_clock_by_name(const char *name)
return ret;
}
+static void clk_stats_update(struct clk *c)
+{
+ u64 cur_jiffies = get_jiffies_64();
+
+ if (c->refcnt) {
+ c->stats.time_on = cputime64_add(c->stats.time_on,
+ cputime64_sub(cur_jiffies, c->stats.last_update));
+ }
+
+ c->stats.last_update = cur_jiffies;
+}
+
/* Must be called with clk_lock(c) held */
static unsigned long clk_predict_rate_from_parent(struct clk *c, struct clk *p)
{
@@ -204,6 +216,7 @@ void clk_init(struct clk *c)
else
c->state = ON;
}
+ c->stats.last_update = get_jiffies_64();
mutex_lock(&clock_list_lock);
list_add(&c->node, &clocks);
@@ -240,6 +253,7 @@ int clk_enable(struct clk *c)
c->state = ON;
c->set = true;
}
+ clk_stats_update(c);
}
c->refcnt++;
out:
@@ -267,6 +281,7 @@ void clk_disable(struct clk *c)
clk_disable(c->parent);
c->state = OFF;
+ clk_stats_update(c);
}
c->refcnt--;
@@ -981,6 +996,20 @@ DEFINE_SIMPLE_ATTRIBUTE(rate_fops, rate_get, NULL, "%llu\n");
DEFINE_SIMPLE_ATTRIBUTE(state_fops, state_get, NULL, "%llu\n");
#endif
+static int time_on_get(void *data, u64 *val)
+{
+ unsigned long flags;
+ struct clk *c = (struct clk *)data;
+
+ clk_lock_save(c, flags);
+ clk_stats_update(c);
+ *val = cputime64_to_clock_t(c->stats.time_on);
+ clk_unlock_restore(c, flags);
+
+ return 0;
+}
+DEFINE_SIMPLE_ATTRIBUTE(time_on_fops, time_on_get, NULL, "%llu\n");
+
static int clk_debugfs_register_one(struct clk *c)
{
struct dentry *d;
@@ -1017,6 +1046,11 @@ static int clk_debugfs_register_one(struct clk *c)
if (!d)
goto err_out;
+ d = debugfs_create_file(
+ "time_on", S_IRUGO, c->dent, c, &time_on_fops);
+ if (!d)
+ goto err_out;
+
if (c->inputs) {
d = debugfs_create_file("possible_parents", S_IRUGO, c->dent,
c, &possible_parents_fops);
diff --git a/arch/arm/mach-tegra/clock.h b/arch/arm/mach-tegra/clock.h
index 27d70d0345a6..cf1bd1c5afee 100644
--- a/arch/arm/mach-tegra/clock.h
+++ b/arch/arm/mach-tegra/clock.h
@@ -59,6 +59,7 @@
#include <linux/list.h>
#include <linux/mutex.h>
#include <linux/spinlock.h>
+#include <asm/cputime.h>
#include <mach/clk.h>
#define MAX_SAME_LIMIT_SKU_IDS 16
@@ -90,6 +91,11 @@ struct clk_ops {
void (*reset)(struct clk *, bool);
};
+struct clk_stats {
+ cputime64_t time_on;
+ u64 last_update;
+};
+
enum cpu_mode {
MODE_G = 0,
MODE_LP,
@@ -126,6 +132,7 @@ struct clk {
struct clk *parent;
u32 div;
u32 mul;
+ struct clk_stats stats;
const struct clk_mux_sel *inputs;
u32 reg;