Commit e9e63088 authored by Tero Kristo's avatar Tero Kristo

clk: ti: remove exported ll_ops struct, instead add an API for registration

We should avoid exporting data from drivers, instead use an API for
registering the clock low level operations.
Signed-off-by: default avatarTero Kristo <t-kristo@ti.com>
parent 9e11814a
...@@ -112,6 +112,19 @@ static struct ti_clk_ll_ops omap_clk_ll_ops = { ...@@ -112,6 +112,19 @@ static struct ti_clk_ll_ops omap_clk_ll_ops = {
.cm_split_idlest_reg = cm_split_idlest_reg, .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 * omap2_clk_provider_init - initialize a clock provider
* @match_table: DT device table to match for devices to init * @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, ...@@ -130,8 +143,6 @@ int __init omap2_clk_provider_init(struct device_node *np, int index,
{ {
struct clk_iomap *io; struct clk_iomap *io;
ti_clk_ll_ops = &omap_clk_ll_ops;
io = kzalloc(sizeof(*io), GFP_KERNEL); io = kzalloc(sizeof(*io), GFP_KERNEL);
io->regmap = syscon; io->regmap = syscon;
...@@ -155,8 +166,6 @@ void __init omap2_clk_legacy_provider_init(int index, void __iomem *mem) ...@@ -155,8 +166,6 @@ void __init omap2_clk_legacy_provider_init(int index, void __iomem *mem)
{ {
struct clk_iomap *io; struct clk_iomap *io;
ti_clk_ll_ops = &omap_clk_ll_ops;
io = memblock_virt_alloc(sizeof(*io), 0); io = memblock_virt_alloc(sizeof(*io), 0);
io->mem = mem; io->mem = mem;
......
...@@ -83,6 +83,7 @@ struct regmap; ...@@ -83,6 +83,7 @@ struct regmap;
int __init omap2_clk_provider_init(struct device_node *np, int index, int __init omap2_clk_provider_init(struct device_node *np, int index,
struct regmap *syscon, void __iomem *mem); struct regmap *syscon, void __iomem *mem);
void __init omap2_clk_legacy_provider_init(int index, 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); void __init ti_clk_init_features(void);
#endif #endif
...@@ -722,6 +722,8 @@ int __init omap_clk_init(void) ...@@ -722,6 +722,8 @@ int __init omap_clk_init(void)
ti_clk_init_features(); ti_clk_init_features();
omap2_clk_setup_ll_ops();
if (of_have_populated_dt()) { if (of_have_populated_dt()) {
ret = omap_control_init(); ret = omap_control_init();
if (ret) if (ret)
......
...@@ -32,6 +32,27 @@ static struct device_node *clocks_node_ptr[CLK_MAX_MEMMAPS]; ...@@ -32,6 +32,27 @@ static struct device_node *clocks_node_ptr[CLK_MAX_MEMMAPS];
struct ti_clk_features ti_clk_features; 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 * ti_dt_clocks_register - register DT alias clocks during boot
* @oclks: list of clocks to register * @oclks: list of clocks to register
......
...@@ -280,4 +280,6 @@ long omap4_dpll_regm4xen_determine_rate(struct clk_hw *hw, ...@@ -280,4 +280,6 @@ long omap4_dpll_regm4xen_determine_rate(struct clk_hw *hw,
unsigned long *best_parent_rate, unsigned long *best_parent_rate,
struct clk_hw **best_parent_clk); struct clk_hw **best_parent_clk);
extern struct ti_clk_ll_ops *ti_clk_ll_ops;
#endif #endif
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
#include <linux/of_address.h> #include <linux/of_address.h>
#include <linux/clk/ti.h> #include <linux/clk/ti.h>
#include "clock.h"
#undef pr_fmt #undef pr_fmt
#define pr_fmt(fmt) "%s: " fmt, __func__ #define pr_fmt(fmt) "%s: " fmt, __func__
......
...@@ -235,8 +235,6 @@ struct ti_clk_ll_ops { ...@@ -235,8 +235,6 @@ struct ti_clk_ll_ops {
u8 *idlest_reg_id); 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) #define to_clk_hw_omap(_hw) container_of(_hw, struct clk_hw_omap, hw)
void omap2_init_clk_clkdm(struct clk_hw *clk); void omap2_init_clk_clkdm(struct clk_hw *clk);
...@@ -255,6 +253,7 @@ unsigned long omap2_get_dpll_rate(struct clk_hw_omap *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_provider(struct device_node *np, int index);
void ti_dt_clk_init_retry_clks(void); void ti_dt_clk_init_retry_clks(void);
void ti_dt_clockdomains_setup(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 omap3430_dt_clk_init(void);
int omap3630_dt_clk_init(void); int omap3630_dt_clk_init(void);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment