[PATCH 13/46] davinci: support re-parenting a clock in the clock framework
Russell King - ARM Linux
linux at arm.linux.org.uk
Mon Oct 19 10:05:40 EDT 2009
On Fri, Oct 16, 2009 at 12:09:17PM -0700, Kevin Hilman wrote:
> From: Sekhar Nori <nsekhar at ti.com>
>
> The clk_set_parent() API is implemented to enable re-parenting
> clocks in the clock tree.
>
> This is useful in DVFS and helps by shifting clocks to an asynchronous
> domain where supported by hardware
>
> Signed-off-by: Sekhar Nori <nsekhar at ti.com>
> Signed-off-by: Kevin Hilman <khilman at deeprootsystems.com>
> ---
> arch/arm/mach-davinci/clock.c | 23 +++++++++++++++++++++++
> 1 files changed, 23 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/mach-davinci/clock.c b/arch/arm/mach-davinci/clock.c
> index 09e0e1c..12ceeea 100644
> --- a/arch/arm/mach-davinci/clock.c
> +++ b/arch/arm/mach-davinci/clock.c
> @@ -141,6 +141,29 @@ int clk_set_rate(struct clk *clk, unsigned long rate)
> }
> EXPORT_SYMBOL(clk_set_rate);
>
> +int clk_set_parent(struct clk *clk, struct clk *parent)
> +{
> + unsigned long flags;
> +
> + if (clk == NULL || IS_ERR(clk))
> + return -EINVAL;
> +
> + mutex_lock(&clocks_mutex);
> + clk->parent = parent;
> + list_del_init(&clk->childnode);
> + list_add(&clk->childnode, &clk->parent->children);
> + mutex_unlock(&clocks_mutex);
This is bad, and is suffering from precisely the same problem which
OMAP suffered from:
1. it takes no notice of whether the clk is in use.
2. it takes no notice of whether the parent clocks are being used.
The result is that using clk_set_parent() on a clk_enable()'d clock,
you totally destroy the usecounting of the parent clocks, leading to
the clock tree usecount becoming totally buggered up.
Either refuse to change the parent of an already clk_enable()'d clock,
or do proper usecount fixups when changing the parent.
More information about the linux-arm-kernel
mailing list