sh: clkfwk: Map tree hierarchy in debugfs.
This adopts the OMAP clock framework debugfs bits and replaces the aging procfs bits. The procfs clocks entry was primarily a debugging aid, and used to be tied in to cpuinfo before the clock list grew too unweildly. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
		
							parent
							
								
									cc96eace48
								
							
						
					
					
						commit
						cedcf3366f
					
				| @ -38,6 +38,7 @@ struct clk { | ||||
| 
 | ||||
| 	unsigned long		arch_flags; | ||||
| 	void			*priv; | ||||
| 	struct dentry		*dentry; | ||||
| }; | ||||
| 
 | ||||
| struct clk_lookup { | ||||
|  | ||||
| @ -28,7 +28,7 @@ | ||||
| #include <linux/seq_file.h> | ||||
| #include <linux/err.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/proc_fs.h> | ||||
| #include <linux/debugfs.h> | ||||
| #include <asm/clock.h> | ||||
| #include <asm/machvec.h> | ||||
| 
 | ||||
| @ -404,24 +404,6 @@ void clk_put(struct clk *clk) | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(clk_put); | ||||
| 
 | ||||
| 
 | ||||
| static int show_clocks(char *buf, char **start, off_t off, | ||||
| 		       int len, int *eof, void *data) | ||||
| { | ||||
| 	struct clk *clk; | ||||
| 	char *p = buf; | ||||
| 
 | ||||
| 	list_for_each_entry_reverse(clk, &clock_list, node) { | ||||
| 		unsigned long rate = clk_get_rate(clk); | ||||
| 
 | ||||
| 		p += sprintf(p, "%-12s\t: %ld.%02ldMHz\t%s\n", clk->name, | ||||
| 			     rate / 1000000, (rate % 1000000) / 10000, | ||||
| 			      (clk->usecount > 0) ?  "enabled" : "disabled"); | ||||
| 	} | ||||
| 
 | ||||
| 	return p - buf; | ||||
| } | ||||
| 
 | ||||
| #ifdef CONFIG_PM | ||||
| static int clks_sysdev_suspend(struct sys_device *dev, pm_message_t state) | ||||
| { | ||||
| @ -516,14 +498,90 @@ int __init clk_init(void) | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static int __init clk_proc_init(void) | ||||
| { | ||||
| 	struct proc_dir_entry *p; | ||||
| 	p = create_proc_read_entry("clocks", S_IRUSR, NULL, | ||||
| 				   show_clocks, NULL); | ||||
| 	if (unlikely(!p)) | ||||
| 		return -EINVAL; | ||||
| /*
 | ||||
|  *	debugfs support to trace clock tree hierarchy and attributes | ||||
|  */ | ||||
| static struct dentry *clk_debugfs_root; | ||||
| 
 | ||||
| static int clk_debugfs_register_one(struct clk *c) | ||||
| { | ||||
| 	int err; | ||||
| 	struct dentry *d, *child; | ||||
| 	struct clk *pa = c->parent; | ||||
| 	char s[255]; | ||||
| 	char *p = s; | ||||
| 
 | ||||
| 	p += sprintf(p, "%s", c->name); | ||||
| 	if (c->id > 0) | ||||
| 		sprintf(p, ":%d", c->id); | ||||
| 	d = debugfs_create_dir(s, pa ? pa->dentry : clk_debugfs_root); | ||||
| 	if (!d) | ||||
| 		return -ENOMEM; | ||||
| 	c->dentry = d; | ||||
| 
 | ||||
| 	d = debugfs_create_u8("usecount", S_IRUGO, c->dentry, (u8 *)&c->usecount); | ||||
| 	if (!d) { | ||||
| 		err = -ENOMEM; | ||||
| 		goto err_out; | ||||
| 	} | ||||
| 	d = debugfs_create_u32("rate", S_IRUGO, c->dentry, (u32 *)&c->rate); | ||||
| 	if (!d) { | ||||
| 		err = -ENOMEM; | ||||
| 		goto err_out; | ||||
| 	} | ||||
| 	d = debugfs_create_x32("flags", S_IRUGO, c->dentry, (u32 *)&c->flags); | ||||
| 	if (!d) { | ||||
| 		err = -ENOMEM; | ||||
| 		goto err_out; | ||||
| 	} | ||||
| 	return 0; | ||||
| 
 | ||||
| err_out: | ||||
| 	d = c->dentry; | ||||
| 	list_for_each_entry(child, &d->d_subdirs, d_u.d_child) | ||||
| 		debugfs_remove(child); | ||||
| 	debugfs_remove(c->dentry); | ||||
| 	return err; | ||||
| } | ||||
| 
 | ||||
| static int clk_debugfs_register(struct clk *c) | ||||
| { | ||||
| 	int err; | ||||
| 	struct clk *pa = c->parent; | ||||
| 
 | ||||
| 	if (pa && !pa->dentry) { | ||||
| 		err = clk_debugfs_register(pa); | ||||
| 		if (err) | ||||
| 			return err; | ||||
| 	} | ||||
| 
 | ||||
| 	if (!c->dentry) { | ||||
| 		err = clk_debugfs_register_one(c); | ||||
| 		if (err) | ||||
| 			return err; | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| subsys_initcall(clk_proc_init); | ||||
| 
 | ||||
| static int __init clk_debugfs_init(void) | ||||
| { | ||||
| 	struct clk *c; | ||||
| 	struct dentry *d; | ||||
| 	int err; | ||||
| 
 | ||||
| 	d = debugfs_create_dir("clock", NULL); | ||||
| 	if (!d) | ||||
| 		return -ENOMEM; | ||||
| 	clk_debugfs_root = d; | ||||
| 
 | ||||
| 	list_for_each_entry(c, &clock_list, node) { | ||||
| 		err = clk_debugfs_register(c); | ||||
| 		if (err) | ||||
| 			goto err_out; | ||||
| 	} | ||||
| 	return 0; | ||||
| err_out: | ||||
| 	debugfs_remove(clk_debugfs_root); /* REVISIT: Cleanup correctly */ | ||||
| 	return err; | ||||
| } | ||||
| late_initcall(clk_debugfs_init); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user