diff options
author | Alex Frid <afrid@nvidia.com> | 2011-04-01 21:25:40 -0700 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:42:28 -0800 |
commit | 94c3df8e013357feb576ae631f78aae21db2ad71 (patch) | |
tree | 319355daebd42346e938632b123260a8b0e0eac6 | |
parent | 233903b019670654b80aa080d0bc0cb2893b7f7b (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.c | 34 | ||||
-rw-r--r-- | arch/arm/mach-tegra/clock.h | 7 |
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; |