|
@@ -475,8 +475,41 @@ int __init clk_init(struct clk_functions * custom_clocks)
|
|
|
/*
|
|
|
* debugfs support to trace clock tree hierarchy and attributes
|
|
|
*/
|
|
|
+
|
|
|
+#include <linux/debugfs.h>
|
|
|
+#include <linux/seq_file.h>
|
|
|
+
|
|
|
static struct dentry *clk_debugfs_root;
|
|
|
|
|
|
+static int clk_dbg_show_summary(struct seq_file *s, void *unused)
|
|
|
+{
|
|
|
+ struct clk *c;
|
|
|
+ struct clk *pa;
|
|
|
+
|
|
|
+ seq_printf(s, "%-30s %-30s %-10s %s\n",
|
|
|
+ "clock-name", "parent-name", "rate", "use-count");
|
|
|
+
|
|
|
+ list_for_each_entry(c, &clocks, node) {
|
|
|
+ pa = c->parent;
|
|
|
+ seq_printf(s, "%-30s %-30s %-10lu %d\n",
|
|
|
+ c->name, pa ? pa->name : "none", c->rate, c->usecount);
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int clk_dbg_open(struct inode *inode, struct file *file)
|
|
|
+{
|
|
|
+ return single_open(file, clk_dbg_show_summary, inode->i_private);
|
|
|
+}
|
|
|
+
|
|
|
+static const struct file_operations debug_clock_fops = {
|
|
|
+ .open = clk_dbg_open,
|
|
|
+ .read = seq_read,
|
|
|
+ .llseek = seq_lseek,
|
|
|
+ .release = single_release,
|
|
|
+};
|
|
|
+
|
|
|
static int clk_debugfs_register_one(struct clk *c)
|
|
|
{
|
|
|
int err;
|
|
@@ -551,6 +584,12 @@ static int __init clk_debugfs_init(void)
|
|
|
if (err)
|
|
|
goto err_out;
|
|
|
}
|
|
|
+
|
|
|
+ d = debugfs_create_file("summary", S_IRUGO,
|
|
|
+ d, NULL, &debug_clock_fops);
|
|
|
+ if (!d)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
return 0;
|
|
|
err_out:
|
|
|
debugfs_remove_recursive(clk_debugfs_root);
|