mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-13 15:03:58 +03:00
clk: exynos: provide device pointer to clk_register_* functions
The device pointer set as NULL causes problems when clock banks depend on clocks from another clock bank. In such case, the appropriate clock needs to be resolved from OF phandle arguments, which is not possible if the associated device is not provided. Make necessary changes to make the correct device pointer available. Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org> Signed-off-by: Minkyu Kang <mk7.kang@samsung.com>
This commit is contained in:
committed by
Minkyu Kang
parent
caa740df9c
commit
2a07137641
@@ -136,7 +136,8 @@ static struct clk *_samsung_clk_register_pll(void __iomem *base,
|
||||
return clk;
|
||||
}
|
||||
|
||||
void samsung_clk_register_pll(void __iomem *base, unsigned int cmu_id,
|
||||
void samsung_clk_register_pll(struct udevice *dev, void __iomem *base,
|
||||
unsigned int cmu_id,
|
||||
const struct samsung_pll_clock *clk_list,
|
||||
unsigned int nr_clk)
|
||||
{
|
||||
|
||||
@@ -22,7 +22,8 @@ enum samsung_pll_type {
|
||||
pll_0831x,
|
||||
};
|
||||
|
||||
void samsung_clk_register_pll(void __iomem *base, unsigned int cmu_id,
|
||||
void samsung_clk_register_pll(struct udevice *dev, void __iomem *base,
|
||||
unsigned int cmu_id,
|
||||
const struct samsung_pll_clock *clk_list,
|
||||
unsigned int nr_clk);
|
||||
|
||||
|
||||
@@ -10,7 +10,8 @@
|
||||
#include <dm.h>
|
||||
#include "clk.h"
|
||||
|
||||
static void samsung_clk_register_mux(void __iomem *base, unsigned int cmu_id,
|
||||
static void samsung_clk_register_mux(struct udevice *dev, void __iomem *base,
|
||||
unsigned int cmu_id,
|
||||
const struct samsung_mux_clock *clk_list,
|
||||
unsigned int nr_clk)
|
||||
{
|
||||
@@ -22,15 +23,17 @@ static void samsung_clk_register_mux(void __iomem *base, unsigned int cmu_id,
|
||||
unsigned long clk_id;
|
||||
|
||||
m = &clk_list[cnt];
|
||||
clk = clk_register_mux(NULL, m->name, m->parent_names,
|
||||
m->num_parents, m->flags, base + m->offset, m->shift,
|
||||
m->width, m->mux_flags);
|
||||
clk = clk_register_mux(dev, m->name, m->parent_names,
|
||||
m->num_parents, m->flags,
|
||||
base + m->offset, m->shift, m->width,
|
||||
m->mux_flags);
|
||||
clk_id = SAMSUNG_TO_CLK_ID(cmu_id, m->id);
|
||||
clk_dm(clk_id, clk);
|
||||
}
|
||||
}
|
||||
|
||||
static void samsung_clk_register_div(void __iomem *base, unsigned int cmu_id,
|
||||
static void samsung_clk_register_div(struct udevice *dev, void __iomem *base,
|
||||
unsigned int cmu_id,
|
||||
const struct samsung_div_clock *clk_list,
|
||||
unsigned int nr_clk)
|
||||
{
|
||||
@@ -42,15 +45,16 @@ static void samsung_clk_register_div(void __iomem *base, unsigned int cmu_id,
|
||||
unsigned long clk_id;
|
||||
|
||||
d = &clk_list[cnt];
|
||||
clk = clk_register_divider(NULL, d->name, d->parent_name,
|
||||
d->flags, base + d->offset, d->shift,
|
||||
d->width, d->div_flags);
|
||||
clk = clk_register_divider(dev, d->name, d->parent_name,
|
||||
d->flags, base + d->offset, d->shift,
|
||||
d->width, d->div_flags);
|
||||
clk_id = SAMSUNG_TO_CLK_ID(cmu_id, d->id);
|
||||
clk_dm(clk_id, clk);
|
||||
}
|
||||
}
|
||||
|
||||
static void samsung_clk_register_gate(void __iomem *base, unsigned int cmu_id,
|
||||
static void samsung_clk_register_gate(struct udevice *dev, void __iomem *base,
|
||||
unsigned int cmu_id,
|
||||
const struct samsung_gate_clock *clk_list,
|
||||
unsigned int nr_clk)
|
||||
{
|
||||
@@ -62,16 +66,16 @@ static void samsung_clk_register_gate(void __iomem *base, unsigned int cmu_id,
|
||||
unsigned long clk_id;
|
||||
|
||||
g = &clk_list[cnt];
|
||||
clk = clk_register_gate(NULL, g->name, g->parent_name,
|
||||
g->flags, base + g->offset, g->bit_idx,
|
||||
g->gate_flags, NULL);
|
||||
clk = clk_register_gate(dev, g->name, g->parent_name,
|
||||
g->flags, base + g->offset, g->bit_idx,
|
||||
g->gate_flags, NULL);
|
||||
clk_id = SAMSUNG_TO_CLK_ID(cmu_id, g->id);
|
||||
clk_dm(clk_id, clk);
|
||||
}
|
||||
}
|
||||
|
||||
typedef void (*samsung_clk_register_fn)(void __iomem *base, unsigned int cmu_id,
|
||||
const void *clk_list,
|
||||
typedef void (*samsung_clk_register_fn)(struct udevice *dev, void __iomem *base,
|
||||
unsigned int cmu_id, const void *clk_list,
|
||||
unsigned int nr_clk);
|
||||
|
||||
static const samsung_clk_register_fn samsung_clk_register_fns[] = {
|
||||
@@ -91,16 +95,17 @@ static const samsung_clk_register_fn samsung_clk_register_fns[] = {
|
||||
* Having the array of clock groups @clk_groups makes it possible to keep a
|
||||
* correct clocks registration order.
|
||||
*/
|
||||
static void samsung_cmu_register_clocks(void __iomem *base, unsigned int cmu_id,
|
||||
const struct samsung_clk_group *clk_groups,
|
||||
unsigned int nr_groups)
|
||||
static void samsung_cmu_register_clocks(struct udevice *dev, void __iomem *base,
|
||||
unsigned int cmu_id,
|
||||
const struct samsung_clk_group *clk_groups,
|
||||
unsigned int nr_groups)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < nr_groups; i++) {
|
||||
const struct samsung_clk_group *g = &clk_groups[i];
|
||||
|
||||
samsung_clk_register_fns[g->type](base, cmu_id,
|
||||
samsung_clk_register_fns[g->type](dev, base, cmu_id,
|
||||
g->clk_list, g->nr_clk);
|
||||
}
|
||||
}
|
||||
@@ -124,7 +129,7 @@ int samsung_cmu_register_one(struct udevice *dev, unsigned int cmu_id,
|
||||
if (!base)
|
||||
return -EINVAL;
|
||||
|
||||
samsung_cmu_register_clocks(base, cmu_id, clk_groups, nr_groups);
|
||||
samsung_cmu_register_clocks(dev, base, cmu_id, clk_groups, nr_groups);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user