ARM: pxa: add clk_set_rate()
authorHaojian Zhuang <haojian.zhuang@marvell.com>
Fri, 8 Apr 2011 12:15:38 +0000 (20:15 +0800)
committerEric Miao <eric.y.miao@gmail.com>
Tue, 12 Jul 2011 11:45:19 +0000 (19:45 +0800)
Since there're mulitple clock rates in some device controllers, enable
clk_set_rate() for this usage.

Signed-off-by: Haojian Zhuang <haojian.zhuang@marvell.com>
Signed-off-by: Eric Miao <eric.y.miao@gmail.com>
arch/arm/mach-mmp/clock.c
arch/arm/mach-mmp/clock.h
arch/arm/mach-pxa/clock.c
arch/arm/mach-pxa/clock.h

index 886e05648f08a5a4975bc0257b2b0929e9fffc1f..7c6f95f291425c5fd3fc3d5c8969d4e9f739201f 100644 (file)
@@ -88,3 +88,18 @@ unsigned long clk_get_rate(struct clk *clk)
        return rate;
 }
 EXPORT_SYMBOL(clk_get_rate);
+
+int clk_set_rate(struct clk *clk, unsigned long rate)
+{
+       unsigned long flags;
+       int ret = -EINVAL;
+
+       if (clk->ops->setrate) {
+               spin_lock_irqsave(&clocks_lock, flags);
+               ret = clk->ops->setrate(clk, rate);
+               spin_unlock_irqrestore(&clocks_lock, flags);
+       }
+
+       return ret;
+}
+EXPORT_SYMBOL(clk_set_rate);
index 9b027d7491f5e9ba854e496568eaa2fafdc9be5e..3143e994e672326acb26a7648a4cac7376e1f078 100644 (file)
@@ -12,6 +12,7 @@ struct clkops {
        void                    (*enable)(struct clk *);
        void                    (*disable)(struct clk *);
        unsigned long           (*getrate)(struct clk *);
+       int                     (*setrate)(struct clk *, unsigned long);
 };
 
 struct clk {
index d5152220ce947607f072b47ae01d21419170c3b3..4d466102a0272edc5812ec7645d480541c92be37 100644 (file)
@@ -53,6 +53,21 @@ unsigned long clk_get_rate(struct clk *clk)
 }
 EXPORT_SYMBOL(clk_get_rate);
 
+int clk_set_rate(struct clk *clk, unsigned long rate)
+{
+       unsigned long flags;
+       int ret = -EINVAL;
+
+       if (clk->ops->setrate) {
+               spin_lock_irqsave(&clocks_lock, flags);
+               ret = clk->ops->setrate(clk, rate);
+               spin_unlock_irqrestore(&clocks_lock, flags);
+       }
+
+       return ret;
+}
+EXPORT_SYMBOL(clk_set_rate);
+
 void clk_dummy_enable(struct clk *clk)
 {
 }
index 1f2fb9c43f062301ab5dc9595203a94ab4bfada4..3a258b1bf1aa46f39d255cb81a2643b667394192 100644 (file)
@@ -5,6 +5,7 @@ struct clkops {
        void                    (*enable)(struct clk *);
        void                    (*disable)(struct clk *);
        unsigned long           (*getrate)(struct clk *);
+       int                     (*setrate)(struct clk *, unsigned long);
 };
 
 struct clk {