mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-04 01:49:36 +00:00
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: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
This commit is contained in:
parent
ff8bbf78e4
commit
7c74c220e9
5 changed files with 51 additions and 14 deletions
|
@ -156,9 +156,10 @@ static const struct clk_ops clk_factors_ops = {
|
|||
.set_rate = clk_factors_set_rate,
|
||||
};
|
||||
|
||||
struct clk * __init sunxi_factors_register(struct device_node *node,
|
||||
const struct factors_data *data,
|
||||
spinlock_t *lock)
|
||||
struct clk *sunxi_factors_register(struct device_node *node,
|
||||
const struct factors_data *data,
|
||||
spinlock_t *lock,
|
||||
void __iomem *reg)
|
||||
{
|
||||
struct clk *clk;
|
||||
struct clk_factors *factors;
|
||||
|
@ -168,11 +169,8 @@ struct clk * __init sunxi_factors_register(struct device_node *node,
|
|||
struct clk_hw *mux_hw = NULL;
|
||||
const char *clk_name = node->name;
|
||||
const char *parents[FACTORS_MAX_PARENTS];
|
||||
void __iomem *reg;
|
||||
int i = 0;
|
||||
|
||||
reg = of_iomap(node, 0);
|
||||
|
||||
/* if we have a mux, we will have >1 parents */
|
||||
while (i < FACTORS_MAX_PARENTS &&
|
||||
(parents[i] = of_clk_get_parent_name(node, i)) != NULL)
|
||||
|
|
|
@ -36,8 +36,9 @@ struct clk_factors {
|
|||
spinlock_t *lock;
|
||||
};
|
||||
|
||||
struct clk * __init sunxi_factors_register(struct device_node *node,
|
||||
const struct factors_data *data,
|
||||
spinlock_t *lock);
|
||||
struct clk *sunxi_factors_register(struct device_node *node,
|
||||
const struct factors_data *data,
|
||||
spinlock_t *lock,
|
||||
void __iomem *reg);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -79,7 +79,17 @@ static DEFINE_SPINLOCK(sun4i_a10_mod0_lock);
|
|||
|
||||
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);
|
||||
|
||||
|
@ -87,7 +97,17 @@ static DEFINE_SPINLOCK(sun5i_a13_mbus_lock);
|
|||
|
||||
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 */
|
||||
__clk_get(mbus);
|
||||
|
|
|
@ -69,8 +69,17 @@ static DEFINE_SPINLOCK(sun8i_a23_mbus_lock);
|
|||
|
||||
static void __init sun8i_a23_mbus_setup(struct device_node *node)
|
||||
{
|
||||
struct clk *mbus = sunxi_factors_register(node, &sun8i_a23_mbus_data,
|
||||
&sun8i_a23_mbus_lock);
|
||||
struct clk *mbus;
|
||||
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 */
|
||||
__clk_get(mbus);
|
||||
|
|
|
@ -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,
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue