]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
clk: ti: remove exported ll_ops struct, instead add an API for registration
authorTero Kristo <t-kristo@ti.com>
Mon, 27 Apr 2015 18:55:42 +0000 (21:55 +0300)
committerTero Kristo <t-kristo@ti.com>
Tue, 2 Jun 2015 09:31:46 +0000 (12:31 +0300)
We should avoid exporting data from drivers, instead use an API for
registering the clock low level operations.

Signed-off-by: Tero Kristo <t-kristo@ti.com>
arch/arm/mach-omap2/clock.c
arch/arm/mach-omap2/clock.h
arch/arm/mach-omap2/io.c
drivers/clk/ti/clk.c
drivers/clk/ti/clock.h
drivers/clk/ti/clockdomain.c
include/linux/clk/ti.h

index 99875dba803aaf94bb458d436dd158027f1bae89..40a88c2e40168e42d06473189ae0ebb8e0b5f63a 100644 (file)
@@ -112,6 +112,19 @@ static struct ti_clk_ll_ops omap_clk_ll_ops = {
        .cm_split_idlest_reg = cm_split_idlest_reg,
 };
 
+/**
+ * omap2_clk_setup_ll_ops - setup clock driver low-level ops
+ *
+ * Sets up clock driver low-level platform ops. These are needed
+ * for register accesses and various other misc platform operations.
+ * Returns 0 on success, -EBUSY if low level ops have been registered
+ * already.
+ */
+int __init omap2_clk_setup_ll_ops(void)
+{
+       return ti_clk_setup_ll_ops(&omap_clk_ll_ops);
+}
+
 /**
  * omap2_clk_provider_init - initialize a clock provider
  * @match_table: DT device table to match for devices to init
@@ -130,8 +143,6 @@ int __init omap2_clk_provider_init(struct device_node *np, int index,
 {
        struct clk_iomap *io;
 
-       ti_clk_ll_ops = &omap_clk_ll_ops;
-
        io = kzalloc(sizeof(*io), GFP_KERNEL);
 
        io->regmap = syscon;
@@ -155,8 +166,6 @@ void __init omap2_clk_legacy_provider_init(int index, void __iomem *mem)
 {
        struct clk_iomap *io;
 
-       ti_clk_ll_ops = &omap_clk_ll_ops;
-
        io = memblock_virt_alloc(sizeof(*io), 0);
 
        io->mem = mem;
index 1986ab216b1ac60c483b9c691ed7b0be691faaac..a7051d6a05e99b4e6f28cfe365e673456633707f 100644 (file)
@@ -83,6 +83,7 @@ struct regmap;
 int __init omap2_clk_provider_init(struct device_node *np, int index,
                                   struct regmap *syscon, void __iomem *mem);
 void __init omap2_clk_legacy_provider_init(int index, void __iomem *mem);
+int __init omap2_clk_setup_ll_ops(void);
 
 void __init ti_clk_init_features(void);
 #endif
index 74678565cd9792f84e54195a16eab828cfbbd0dc..a253aafbb9a29fe3a7350ca959095e3e78b836d4 100644 (file)
@@ -722,6 +722,8 @@ int __init omap_clk_init(void)
 
        ti_clk_init_features();
 
+       omap2_clk_setup_ll_ops();
+
        if (of_have_populated_dt()) {
                ret = omap_control_init();
                if (ret)
index 5baea03cfc923cd9f5ec2b01e49c16cabce00250..58b83e0af90f54f0080fc3e50a841d14444ea9b7 100644 (file)
@@ -32,6 +32,27 @@ static struct device_node *clocks_node_ptr[CLK_MAX_MEMMAPS];
 
 struct ti_clk_features ti_clk_features;
 
+/**
+ * ti_clk_setup_ll_ops - setup low level clock operations
+ * @ops: low level clock ops descriptor
+ *
+ * Sets up low level clock operations for TI clock driver. This is used
+ * to provide various callbacks for the clock driver towards platform
+ * specific code. Returns 0 on success, -EBUSY if ll_ops have been
+ * registered already.
+ */
+int ti_clk_setup_ll_ops(struct ti_clk_ll_ops *ops)
+{
+       if (ti_clk_ll_ops) {
+               pr_err("Attempt to register ll_ops multiple times.\n");
+               return -EBUSY;
+       }
+
+       ti_clk_ll_ops = ops;
+
+       return 0;
+}
+
 /**
  * ti_dt_clocks_register - register DT alias clocks during boot
  * @oclks: list of clocks to register
index 3c43125b9cc925a918e524cb9a55ddf6501cfc52..d4d232fd89bc12aaf29bf37f4dba4f738a60e655 100644 (file)
@@ -280,4 +280,6 @@ long omap4_dpll_regm4xen_determine_rate(struct clk_hw *hw,
                                        unsigned long *best_parent_rate,
                                        struct clk_hw **best_parent_clk);
 
+extern struct ti_clk_ll_ops *ti_clk_ll_ops;
+
 #endif
index 61ef87b1a6887583f456ffd46b0f06b388c4338a..80a7b6944d1073379ce3100b90977b798869a16a 100644 (file)
@@ -21,6 +21,8 @@
 #include <linux/of_address.h>
 #include <linux/clk/ti.h>
 
+#include "clock.h"
+
 #undef pr_fmt
 #define pr_fmt(fmt) "%s: " fmt, __func__
 
index 5eccdf5c0e8421384960470ad89e79a5942596fe..5b644313e38a488e1425149c36edc3256433f4b4 100644 (file)
@@ -235,8 +235,6 @@ struct ti_clk_ll_ops {
                                       u8 *idlest_reg_id);
 };
 
-extern struct ti_clk_ll_ops *ti_clk_ll_ops;
-
 #define to_clk_hw_omap(_hw) container_of(_hw, struct clk_hw_omap, hw)
 
 void omap2_init_clk_clkdm(struct clk_hw *clk);
@@ -255,6 +253,7 @@ unsigned long omap2_get_dpll_rate(struct clk_hw_omap *clk);
 void ti_dt_clk_init_provider(struct device_node *np, int index);
 void ti_dt_clk_init_retry_clks(void);
 void ti_dt_clockdomains_setup(void);
+int ti_clk_setup_ll_ops(struct ti_clk_ll_ops *ops);
 
 int omap3430_dt_clk_init(void);
 int omap3630_dt_clk_init(void);