[PATCH 4/7] ARM: sa1100: clean up of the clock support

Russell King - ARM Linux linux at arm.linux.org.uk
Thu Feb 23 05:32:10 EST 2012


On Tue, Feb 21, 2012 at 05:04:53PM +0800, Haojian Zhuang wrote:
> From: Jett.Zhou <jtzhou at marvell.com>
> 
> Signed-off-by: Jett.Zhou <jtzhou at marvell.com>
> signed-off-by: Haojian Zhuang <haojian.zhuang at marvell.com>
> ---
>  arch/arm/Kconfig             |    2 +-
>  arch/arm/mach-sa1100/clock.c |   91 ++++++++++++++++++++++++++++++-----------
>  2 files changed, 67 insertions(+), 26 deletions(-)
> 
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index a48aecc..6e40039 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -754,7 +754,7 @@ config ARCH_SA1100
>  	select ARCH_HAS_CPUFREQ
>  	select CPU_FREQ
>  	select GENERIC_CLOCKEVENTS
> -	select HAVE_CLK
> +	select CLKDEV_LOOKUP
>  	select HAVE_SCHED_CLOCK
>  	select TICK_ONESHOT
>  	select ARCH_REQUIRE_GPIOLIB
> diff --git a/arch/arm/mach-sa1100/clock.c b/arch/arm/mach-sa1100/clock.c
> index dab3c63..d6df9f6 100644
> --- a/arch/arm/mach-sa1100/clock.c
> +++ b/arch/arm/mach-sa1100/clock.c
> @@ -11,17 +11,39 @@
>  #include <linux/clk.h>
>  #include <linux/spinlock.h>
>  #include <linux/mutex.h>
> +#include <linux/io.h>
> +#include <linux/clkdev.h>
>  
>  #include <mach/hardware.h>
>  
> -/*
> - * Very simple clock implementation - we only have one clock to deal with.
> - */
> +struct clkops {
> +	void			(*enable)(struct clk *);
> +	void			(*disable)(struct clk *);
> +	unsigned long		(*getrate)(struct clk *);

Is getrate() used?  If not, please get rid of it.

> +};
> +
>  struct clk {
> +	const struct clkops	*ops;
> +	unsigned long		rate;
>  	unsigned int		enabled;
>  };
>  
> -static void clk_gpio27_enable(void)
> +#define INIT_CLKREG(_clk, _devname, _conname)		\
> +	{						\
> +		.clk		= _clk,			\
> +		.dev_id		= _devname,		\
> +		.con_id		= _conname,		\
> +	}

This should use CLKDEV_INIT() rather than defining its own.

> +
> +#define DEFINE_CLK(_name, _ops, _rate)			\
> +struct clk clk_##_name = {				\
> +		.ops	= _ops,				\
> +		.rate	= _rate,			\
> +	}
> +
> +static DEFINE_SPINLOCK(clocks_lock);
> +
> +static void clk_gpio27_enable(struct clk *clk)
>  {
>  	/*
>  	 * First, set up the 3.6864MHz clock on GPIO 27 for the SA-1111:
> @@ -32,38 +54,22 @@ static void clk_gpio27_enable(void)
>  	TUCR = TUCR_3_6864MHz;
>  }
>  
> -static void clk_gpio27_disable(void)
> +static void clk_gpio27_disable(struct clk *clk)
>  {
>  	TUCR = 0;
>  	GPDR &= ~GPIO_32_768kHz;
>  	GAFR &= ~GPIO_32_768kHz;
>  }
>  
> -static struct clk clk_gpio27;
> -
> -static DEFINE_SPINLOCK(clocks_lock);
> -
> -struct clk *clk_get(struct device *dev, const char *id)
> -{
> -	const char *devname = dev_name(dev);
> -
> -	return strcmp(devname, "sa1111.0") ? ERR_PTR(-ENOENT) : &clk_gpio27;
> -}
> -EXPORT_SYMBOL(clk_get);
> -
> -void clk_put(struct clk *clk)
> -{
> -}
> -EXPORT_SYMBOL(clk_put);
> -
>  int clk_enable(struct clk *clk)
>  {
>  	unsigned long flags;
>  

	if (clk) {

>  	spin_lock_irqsave(&clocks_lock, flags);
>  	if (clk->enabled++ == 0)
> -		clk_gpio27_enable();
> +		clk->ops->enable(clk);
>  	spin_unlock_irqrestore(&clocks_lock, flags);

	}

> +
>  	return 0;
>  }
>  EXPORT_SYMBOL(clk_enable);
> @@ -76,13 +82,48 @@ void clk_disable(struct clk *clk)
>  

	if (clk) {

>  	spin_lock_irqsave(&clocks_lock, flags);
>  	if (--clk->enabled == 0)
> -		clk_gpio27_disable();
> +		clk->ops->disable(clk);
>  	spin_unlock_irqrestore(&clocks_lock, flags);

	}

>  }
>  EXPORT_SYMBOL(clk_disable);
>  
>  unsigned long clk_get_rate(struct clk *clk)
>  {
> -	return 3686400;
> +	unsigned long rate;
> +

	unsigned long rate = 0;
	if (clk) {

> +	rate = clk->rate;
> +	if (clk->ops->getrate)
> +		rate = clk->ops->getrate(clk);

	}

> +
> +	return rate;
>  }
>  EXPORT_SYMBOL(clk_get_rate);
> +
> +const struct clkops clk_gpio27_ops = {
> +	.enable		= clk_gpio27_enable,
> +	.disable	= clk_gpio27_disable,
> +};
> +
> +static void clk_dummy_enable(struct clk *clk) { }
> +static void clk_dummy_disable(struct clk *clk) { }
> +
> +const struct clkops clk_dummy_ops = {
> +	.enable		= clk_dummy_enable,
> +	.disable	= clk_dummy_disable,
> +};
> +
> +static DEFINE_CLK(gpio27, &clk_gpio27_ops, 3686400);
> +static DEFINE_CLK(dummy, &clk_dummy_ops, 0);

Get rid of the dummy clock...

> +
> +static struct clk_lookup sa11xx_clkregs[] = {
> +	INIT_CLKREG(&clk_gpio27, "sa1111.0", NULL),
> +	INIT_CLKREG(&clk_dummy, "sa1100-rtc", NULL),

	CLKDEV_INIT("sa1100-rtc", NULL, NULL),

> +};
> +
> +static int __init sa11xx_clk_init(void)
> +{
> +	clkdev_add_table(sa11xx_clkregs, ARRAY_SIZE(sa11xx_clkregs));
> +	return 0;
> +}
> +
> +postcore_initcall(sa11xx_clk_init);

Why postcore?  There's nothing stopping this being done earlier.



More information about the linux-arm-kernel mailing list