|
@@ -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++;
|
|
|
|