Commit 7c74c220 authored by Hans de Goede's avatar Hans de Goede Committed by Maxime Ripard

clk: sunxi: Give sunxi_factors_register a registers parameter

Before this commit sunxi_factors_register uses of_iomap(node, 0) to get
the clk registers. The sun6i prcm has factor clocks, for which we want to
use sunxi_factors_register, but of_iomap(node, 0) does not work for the prcm
factor clocks, because the prcm uses the mfd framework, so the registers
are not part of the dt-node, instead they are added to the platform_device,
as platform_device resources.

This commit makes getting the registers the callers duty, so that
sunxi_factors_register can be used with mfd instantiated platform device too.

While at it also add error checking to the of_iomap calls.

This commit also drops the __init function from sunxi_factors_register since
platform driver probe functions are not __init.
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarMaxime Ripard <maxime.ripard@free-electrons.com>
parent ff8bbf78
...@@ -156,9 +156,10 @@ static const struct clk_ops clk_factors_ops = { ...@@ -156,9 +156,10 @@ static const struct clk_ops clk_factors_ops = {
.set_rate = clk_factors_set_rate, .set_rate = clk_factors_set_rate,
}; };
struct clk * __init sunxi_factors_register(struct device_node *node, struct clk *sunxi_factors_register(struct device_node *node,
const struct factors_data *data, const struct factors_data *data,
spinlock_t *lock) spinlock_t *lock,
void __iomem *reg)
{ {
struct clk *clk; struct clk *clk;
struct clk_factors *factors; struct clk_factors *factors;
...@@ -168,11 +169,8 @@ struct clk * __init sunxi_factors_register(struct device_node *node, ...@@ -168,11 +169,8 @@ struct clk * __init sunxi_factors_register(struct device_node *node,
struct clk_hw *mux_hw = NULL; struct clk_hw *mux_hw = NULL;
const char *clk_name = node->name; const char *clk_name = node->name;
const char *parents[FACTORS_MAX_PARENTS]; const char *parents[FACTORS_MAX_PARENTS];
void __iomem *reg;
int i = 0; int i = 0;
reg = of_iomap(node, 0);
/* if we have a mux, we will have >1 parents */ /* if we have a mux, we will have >1 parents */
while (i < FACTORS_MAX_PARENTS && while (i < FACTORS_MAX_PARENTS &&
(parents[i] = of_clk_get_parent_name(node, i)) != NULL) (parents[i] = of_clk_get_parent_name(node, i)) != NULL)
......
...@@ -36,8 +36,9 @@ struct clk_factors { ...@@ -36,8 +36,9 @@ struct clk_factors {
spinlock_t *lock; spinlock_t *lock;
}; };
struct clk * __init sunxi_factors_register(struct device_node *node, struct clk *sunxi_factors_register(struct device_node *node,
const struct factors_data *data, const struct factors_data *data,
spinlock_t *lock); spinlock_t *lock,
void __iomem *reg);
#endif #endif
...@@ -79,7 +79,17 @@ static DEFINE_SPINLOCK(sun4i_a10_mod0_lock); ...@@ -79,7 +79,17 @@ static DEFINE_SPINLOCK(sun4i_a10_mod0_lock);
static void __init sun4i_a10_mod0_setup(struct device_node *node) static void __init sun4i_a10_mod0_setup(struct device_node *node)
{ {
sunxi_factors_register(node, &sun4i_a10_mod0_data, &sun4i_a10_mod0_lock); void __iomem *reg;
reg = of_iomap(node, 0);
if (!reg) {
pr_err("Could not get registers for mod0-clk: %s\n",
node->name);
return;
}
sunxi_factors_register(node, &sun4i_a10_mod0_data,
&sun4i_a10_mod0_lock, reg);
} }
CLK_OF_DECLARE(sun4i_a10_mod0, "allwinner,sun4i-a10-mod0-clk", sun4i_a10_mod0_setup); CLK_OF_DECLARE(sun4i_a10_mod0, "allwinner,sun4i-a10-mod0-clk", sun4i_a10_mod0_setup);
...@@ -87,7 +97,17 @@ static DEFINE_SPINLOCK(sun5i_a13_mbus_lock); ...@@ -87,7 +97,17 @@ static DEFINE_SPINLOCK(sun5i_a13_mbus_lock);
static void __init sun5i_a13_mbus_setup(struct device_node *node) static void __init sun5i_a13_mbus_setup(struct device_node *node)
{ {
struct clk *mbus = sunxi_factors_register(node, &sun4i_a10_mod0_data, &sun5i_a13_mbus_lock); struct clk *mbus;
void __iomem *reg;
reg = of_iomap(node, 0);
if (!reg) {
pr_err("Could not get registers for a13-mbus-clk\n");
return;
}
mbus = sunxi_factors_register(node, &sun4i_a10_mod0_data,
&sun5i_a13_mbus_lock, reg);
/* The MBUS clocks needs to be always enabled */ /* The MBUS clocks needs to be always enabled */
__clk_get(mbus); __clk_get(mbus);
......
...@@ -69,8 +69,17 @@ static DEFINE_SPINLOCK(sun8i_a23_mbus_lock); ...@@ -69,8 +69,17 @@ static DEFINE_SPINLOCK(sun8i_a23_mbus_lock);
static void __init sun8i_a23_mbus_setup(struct device_node *node) static void __init sun8i_a23_mbus_setup(struct device_node *node)
{ {
struct clk *mbus = sunxi_factors_register(node, &sun8i_a23_mbus_data, struct clk *mbus;
&sun8i_a23_mbus_lock); void __iomem *reg;
reg = of_iomap(node, 0);
if (!reg) {
pr_err("Could not get registers for a23-mbus-clk\n");
return;
}
mbus = sunxi_factors_register(node, &sun8i_a23_mbus_data,
&sun8i_a23_mbus_lock, reg);
/* The MBUS clocks needs to be always enabled */ /* The MBUS clocks needs to be always enabled */
__clk_get(mbus); __clk_get(mbus);
......
...@@ -728,7 +728,16 @@ static const struct factors_data sun7i_a20_out_data __initconst = { ...@@ -728,7 +728,16 @@ static const struct factors_data sun7i_a20_out_data __initconst = {
static struct clk * __init sunxi_factors_clk_setup(struct device_node *node, static struct clk * __init sunxi_factors_clk_setup(struct device_node *node,
const struct factors_data *data) const struct factors_data *data)
{ {
return sunxi_factors_register(node, data, &clk_lock); void __iomem *reg;
reg = of_iomap(node, 0);
if (!reg) {
pr_err("Could not get registers for factors-clk: %s\n",
node->name);
return NULL;
}
return sunxi_factors_register(node, data, &clk_lock, reg);
} }
......
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