[PATCH] clkdev: add debugfs support

Uwe Kleine-König u.kleine-koenig at pengutronix.de
Tue Apr 12 02:55:58 EDT 2011


Hello Jean-Christophe,

On Tue, Apr 12, 2011 at 03:32:59AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> create a file in /sys/kernel/debug/clkdev
> 
> with the list of lookup with the con_id, dev_id and the clock rate
> 
> as this
> 
> dev_id               con_id               rate
> (null)               clk32k                   32768 Hz
> (null)               main                  16367660 Hz
> (null)               plla                 199919178 Hz
> (null)               mck                   99959589 Hz
> at91_mci.0           mci_clk               99959589 Hz
> at91_mci.1           mci_clk               99959589 Hz
> atmel_spi.0          spi_clk               99959589 Hz
> 
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
> ---
>  drivers/clk/clkdev.c |   40 ++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 40 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/clk/clkdev.c b/drivers/clk/clkdev.c
> index 0fc0a79..5c3a6fb 100644
> --- a/drivers/clk/clkdev.c
> +++ b/drivers/clk/clkdev.c
> @@ -19,6 +19,8 @@
>  #include <linux/mutex.h>
>  #include <linux/clk.h>
>  #include <linux/clkdev.h>
> +#include <linux/debugfs.h>
> +#include <linux/seq_file.h>
>  
>  static LIST_HEAD(clocks);
>  static DEFINE_MUTEX(clocks_mutex);
> @@ -174,3 +176,41 @@ void clkdev_drop(struct clk_lookup *cl)
>  	kfree(cl);
>  }
>  EXPORT_SYMBOL(clkdev_drop);
> +
> +#ifdef CONFIG_DEBUG_FS
> +static int clkdev_clk_show(struct seq_file *s, void *unused)
> +{
> +	struct clk_lookup *p;
> +
> +	seq_printf(s, "%-20s %-20s rate\n", "dev_id", "con_id");
> +
> +	list_for_each_entry(p, &clocks, node) {
> +
> +		seq_printf(s, "%-20s %-20s %9ld Hz\n",
> +			p->dev_id, p->con_id, clk_get_rate(p->clk));
s/%9ld/%9lu/ ?

According to include/linux/clk.h, the result of clk_get_rate is "only
valid once the clock source has been enabled". So it would be nice to
find out (and tell) if a clock is on or not.

> +	}
> +	return 0;
> +}
> +
> +static int clkdev_clk_open(struct inode *inode, struct file *file)
> +{
> +	return single_open(file, clkdev_clk_show, NULL);
> +}
> +
> +static const struct file_operations clkdev_clk_operations = {
> +	.open		= clkdev_clk_open,
> +	.read		= seq_read,
> +	.llseek		= seq_lseek,
> +	.release	= single_release,
> +};
> +
> +static int __init clkdev_clk_debugfs_init(void)
> +{
> +	/* /sys/kernel/debug/clkdev */
> +	(void) debugfs_create_file("clkdev", S_IFREG | S_IRUGO, NULL, NULL,
> +				   &clkdev_clk_operations);
I'd be a bit more conservative here and would only allow S_IRUSR.

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |



More information about the linux-arm-kernel mailing list