diff options
author | Jon Mayo <jmayo@nvidia.com> | 2011-07-20 18:49:00 -0700 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:48:02 -0800 |
commit | 7bbb45285a0cc99448ea80fcc6a64bf10dd60b26 (patch) | |
tree | 4ed1b7da56fbf3d9359e3bc5236e2666064ee5d6 /arch/arm/mach-tegra/latency_allowance.c | |
parent | cce0ba5553a9ce53f7f6b6f4754e9adbc379d90b (diff) |
ARM: tegra: la: Add debugfs to latency allowance.
add /sys/kernel/debug/tegra_latency/la_info to print programmed latency
allowance settings.
Original-Change-Id: I65a7a04c42f8ac27aaf2c1c953d695bc0bba0c77
Reviewed-on: http://git-master/r/42285
Reviewed-by: Jonathan Mayo <jmayo@nvidia.com>
Tested-by: Jonathan Mayo <jmayo@nvidia.com>
Reviewed-by: Krishna Reddy <vdumpa@nvidia.com>
Rebase-Id: R540ef9a4ed274eae52800edcd6ad590e16b67e09
Diffstat (limited to 'arch/arm/mach-tegra/latency_allowance.c')
-rw-r--r-- | arch/arm/mach-tegra/latency_allowance.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/latency_allowance.c b/arch/arm/mach-tegra/latency_allowance.c index b96ddd7fd427..4c2de2a13fba 100644 --- a/arch/arm/mach-tegra/latency_allowance.c +++ b/arch/arm/mach-tegra/latency_allowance.c @@ -17,6 +17,8 @@ #include <linux/types.h> #include <linux/init.h> #include <linux/kernel.h> +#include <linux/debugfs.h> +#include <linux/seq_file.h> #include <linux/err.h> #include <linux/spinlock_types.h> #include <linux/spinlock.h> @@ -95,6 +97,8 @@ printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__); \ } +static struct dentry *latency_debug_dir; + struct la_client_info { unsigned int fifo_size_in_atoms; unsigned int expiration_in_ns; /* worst case expiration value */ @@ -478,6 +482,48 @@ void tegra_disable_latency_scaling(enum tegra_la_id id) spin_unlock(&safety_lock); } +static int la_regs_show(struct seq_file *s, void *unused) +{ + unsigned i; + unsigned long la; + + /* iterate the list, but don't print MAX_ID */ + for (i = 0; i < ARRAY_SIZE(la_info) - 1; i++) { + la = (readl(la_info[i].reg_addr) & la_info[i].mask) + >> la_info[i].shift; + seq_printf(s, "%-16s: %4u\n", la_info[i].name, la); + } + + return 0; +} + +static int dbg_la_regs_open(struct inode *inode, struct file *file) +{ + return single_open(file, la_regs_show, inode->i_private); +} + +static const struct file_operations regs_fops = { + .open = dbg_la_regs_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static int __init tegra_latency_allowance_debugfs_init(void) +{ + if (latency_debug_dir) + return 0; + + latency_debug_dir = debugfs_create_dir("tegra_latency", NULL); + + debugfs_create_file("la_info", S_IRUGO, latency_debug_dir, NULL, + ®s_fops); + + return 0; +} + +late_initcall(tegra_latency_allowance_debugfs_init); + static int __init tegra_latency_allowance_init(void) { la_scaling_enable_count = 0; |