]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
ARM: Indirect round/set_rate operations through clk structure
authorRussell King <rmk+kernel@arm.linux.org.uk>
Mon, 1 Mar 2010 16:18:39 +0000 (16:18 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sun, 2 May 2010 08:35:38 +0000 (09:35 +0100)
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mach-integrator/impd1.c
arch/arm/mach-integrator/include/mach/clkdev.h
arch/arm/mach-integrator/integrator_cp.c
arch/arm/mach-realview/core.c
arch/arm/mach-realview/include/mach/clkdev.h
arch/arm/mach-versatile/core.c
arch/arm/mach-versatile/include/mach/clkdev.h
arch/arm/plat-versatile/clock.c
arch/arm/plat-versatile/include/plat/clock.h [new file with mode: 0644]

index 2f9de622d1fa13d65dfb4e1dd3ea5aa9b3ea687d..1a0ee93e45190493e78bea5de0fa4f2f405a0b56 100644 (file)
@@ -71,6 +71,12 @@ static void impd1_setvco(struct clk *clk, struct icst_vco vco)
 #endif
 }
 
+static const struct clk_ops impd1_clk_ops = {
+       .round  = icst_clk_round,
+       .set    = icst_clk_set,
+       .setvco = impd1_setvco,
+};
+
 void impd1_tweak_control(struct device *dev, u32 mask, u32 val)
 {
        struct impd1_module *impd1 = dev_get_drvdata(dev);
@@ -366,10 +372,10 @@ static int impd1_probe(struct lm_device *dev)
                (unsigned long)dev->resource.start);
 
        for (i = 0; i < ARRAY_SIZE(impd1->vcos); i++) {
+               impd1->vcos[i].ops = &impd1_clk_ops,
                impd1->vcos[i].owner = THIS_MODULE,
                impd1->vcos[i].params = &impd1_vco_params,
-               impd1->vcos[i].data = impd1,
-               impd1->vcos[i].setvco = impd1_setvco;
+               impd1->vcos[i].data = impd1;
        }
        impd1->vcos[0].vcoreg = impd1->base + IMPD1_OSC1;
        impd1->vcos[1].vcoreg = impd1->base + IMPD1_OSC2;
index ed67e8edc0d1e2cf4ac063610ebff27ec72d8258..bfe07679faecbcf0006cca03d72f98155780fbf4 100644 (file)
@@ -2,14 +2,14 @@
 #define __ASM_MACH_CLKDEV_H
 
 #include <linux/module.h>
-#include <asm/hardware/icst.h>
+#include <plat/clock.h>
 
 struct clk {
        unsigned long           rate;
+       const struct clk_ops    *ops;
        struct module           *owner;
        const struct icst_params *params;
        void __iomem            *vcoreg;
-       void                    (*setvco)(struct clk *, struct icst_vco vco);
        void                    *data;
 };
 
index 590858004ef65083582027828075b288cd0c2178..54edb6b8504fbb61a4dbffa17c65226989af6b24 100644 (file)
@@ -293,10 +293,16 @@ static void cp_auxvco_set(struct clk *clk, struct icst_vco vco)
        writel(0, CM_LOCK);
 }
 
+static const struct clk_ops cp_auxclk_ops = {
+       .round  = icst_clk_round,
+       .set    = icst_clk_set,
+       .setvco = cp_auxvco_set,
+};
+
 static struct clk cp_auxclk = {
+       .ops    = &cp_auxclk_ops,
        .params = &cp_auxvco_params,
        .vcoreg = CM_AUXOSC,
-       .setvco = cp_auxvco_set,
 };
 
 static struct clk_lookup cp_lookups[] = {
index 043b93bab7dfa85acf4c4261aeed8b23a56eb80e..1b468bd490af3e7065b3bf5ba5f6e2dcb693caf2 100644 (file)
@@ -281,9 +281,15 @@ static void realview_oscvco_set(struct clk *clk, struct icst_vco vco)
        writel(0, sys_lock);
 }
 
+static const struct clk_ops oscvco_clk_ops = {
+       .round  = icst_clk_round,
+       .set    = icst_clk_set,
+       .setvco = realview_oscvco_set,
+};
+
 static struct clk oscvco_clk = {
+       .ops    = &oscvco_clk_ops,
        .params = &realview_oscvco_params,
-       .setvco = realview_oscvco_set,
 };
 
 /*
index baea03c9ad45a28fa11ed80cf2562eb9098173d1..e58d0771b64e090151a0d98a69fbd4221a1597d3 100644 (file)
@@ -1,13 +1,13 @@
 #ifndef __ASM_MACH_CLKDEV_H
 #define __ASM_MACH_CLKDEV_H
 
-#include <asm/hardware/icst.h>
+#include <plat/clock.h>
 
 struct clk {
        unsigned long           rate;
+       const struct clk_ops    *ops;
        const struct icst_params *params;
        void __iomem            *vcoreg;
-       void                    (*setvco)(struct clk *, struct icst_vco vco);
 };
 
 #define __clk_get(clk) ({ 1; })
index 957bbde83d342b9a9e6361124c60a15344c9ce16..60baba65635e5ad9d4e67aae93402f9bc8e3e39b 100644 (file)
@@ -381,9 +381,15 @@ static void versatile_oscvco_set(struct clk *clk, struct icst_vco vco)
        writel(0, sys_lock);
 }
 
+static const struct clk_ops osc4_clk_ops = {
+       .round  = icst_clk_round,
+       .set    = icst_clk_set,
+       .setvco = versatile_oscvco_set,
+};
+
 static struct clk osc4_clk = {
+       .ops    = &osc4_clk_ops,
        .params = &versatile_oscvco_params,
-       .setvco = versatile_oscvco_set,
 };
 
 /*
index baea03c9ad45a28fa11ed80cf2562eb9098173d1..e58d0771b64e090151a0d98a69fbd4221a1597d3 100644 (file)
@@ -1,13 +1,13 @@
 #ifndef __ASM_MACH_CLKDEV_H
 #define __ASM_MACH_CLKDEV_H
 
-#include <asm/hardware/icst.h>
+#include <plat/clock.h>
 
 struct clk {
        unsigned long           rate;
+       const struct clk_ops    *ops;
        const struct icst_params *params;
        void __iomem            *vcoreg;
-       void                    (*setvco)(struct clk *, struct icst_vco vco);
 };
 
 #define __clk_get(clk) ({ 1; })
index 2fa34de92325d6238b8076fd1adf5308b30b00e6..5c8b6564fdc225ff49970cf5768f5cc2db1a733a 100644 (file)
@@ -37,24 +37,38 @@ EXPORT_SYMBOL(clk_get_rate);
 
 long clk_round_rate(struct clk *clk, unsigned long rate)
 {
-       struct icst_vco vco;
-       vco = icst_hz_to_vco(clk->params, rate);
-       return icst_hz(clk->params, vco);
+       long ret = -EIO;
+       if (clk->ops && clk->ops->round)
+               ret = clk->ops->round(clk, rate);
+       return ret;
 }
 EXPORT_SYMBOL(clk_round_rate);
 
 int clk_set_rate(struct clk *clk, unsigned long rate)
 {
        int ret = -EIO;
-
-       if (clk->setvco) {
-               struct icst_vco vco;
-
-               vco = icst_hz_to_vco(clk->params, rate);
-               clk->rate = icst_hz(clk->params, vco);
-               clk->setvco(clk, vco);
-               ret = 0;
-       }
+       if (clk->ops && clk->ops->set)
+               ret = clk->ops->set(clk, rate);
        return ret;
 }
 EXPORT_SYMBOL(clk_set_rate);
+
+long icst_clk_round(struct clk *clk, unsigned long rate)
+{
+       struct icst_vco vco;
+       vco = icst_hz_to_vco(clk->params, rate);
+       return icst_hz(clk->params, vco);
+}
+EXPORT_SYMBOL(icst_clk_round);
+
+int icst_clk_set(struct clk *clk, unsigned long rate)
+{
+       struct icst_vco vco;
+
+       vco = icst_hz_to_vco(clk->params, rate);
+       clk->rate = icst_hz(clk->params, vco);
+       clk->ops->setvco(clk, vco);
+
+       return 0;
+}
+EXPORT_SYMBOL(icst_clk_set);
diff --git a/arch/arm/plat-versatile/include/plat/clock.h b/arch/arm/plat-versatile/include/plat/clock.h
new file mode 100644 (file)
index 0000000..3cfb024
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef PLAT_CLOCK_H
+#define PLAT_CLOCK_H
+
+#include <asm/hardware/icst.h>
+
+struct clk_ops {
+       long    (*round)(struct clk *, unsigned long);
+       int     (*set)(struct clk *, unsigned long);
+       void    (*setvco)(struct clk *, struct icst_vco);
+};
+
+int icst_clk_set(struct clk *, unsigned long);
+long icst_clk_round(struct clk *, unsigned long);
+
+#endif