diff options
Diffstat (limited to 'arch/arm/mach-davinci/clock.c')
| -rw-r--r-- | arch/arm/mach-davinci/clock.c | 39 | 
1 files changed, 38 insertions, 1 deletions
diff --git a/arch/arm/mach-davinci/clock.c b/arch/arm/mach-davinci/clock.c index 34668ead53c..d458558ee84 100644 --- a/arch/arm/mach-davinci/clock.c +++ b/arch/arm/mach-davinci/clock.c @@ -52,6 +52,40 @@ static void __clk_disable(struct clk *clk)  		__clk_disable(clk->parent);  } +int davinci_clk_reset(struct clk *clk, bool reset) +{ +	unsigned long flags; + +	if (clk == NULL || IS_ERR(clk)) +		return -EINVAL; + +	spin_lock_irqsave(&clockfw_lock, flags); +	if (clk->flags & CLK_PSC) +		davinci_psc_reset(clk->gpsc, clk->lpsc, reset); +	spin_unlock_irqrestore(&clockfw_lock, flags); + +	return 0; +} +EXPORT_SYMBOL(davinci_clk_reset); + +int davinci_clk_reset_assert(struct clk *clk) +{ +	if (clk == NULL || IS_ERR(clk) || !clk->reset) +		return -EINVAL; + +	return clk->reset(clk, true); +} +EXPORT_SYMBOL(davinci_clk_reset_assert); + +int davinci_clk_reset_deassert(struct clk *clk) +{ +	if (clk == NULL || IS_ERR(clk) || !clk->reset) +		return -EINVAL; + +	return clk->reset(clk, false); +} +EXPORT_SYMBOL(davinci_clk_reset_deassert); +  int clk_enable(struct clk *clk)  {  	unsigned long flags; @@ -535,7 +569,7 @@ int davinci_set_refclk_rate(unsigned long rate)  }  int __init davinci_clk_init(struct clk_lookup *clocks) -  { +{  	struct clk_lookup *c;  	struct clk *clk;  	size_t num_clocks = 0; @@ -576,6 +610,9 @@ int __init davinci_clk_init(struct clk_lookup *clocks)  		if (clk->lpsc)  			clk->flags |= CLK_PSC; +		if (clk->flags & PSC_LRST) +			clk->reset = davinci_clk_reset; +  		clk_register(clk);  		num_clocks++;  |