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:
Kaustabh Chakraborty
2025-10-17 20:51:29 +05:30
committed by Minkyu Kang
parent caa740df9c
commit 2a07137641
3 changed files with 28 additions and 21 deletions

View File

@@ -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)
{

View File

@@ -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);

View File

@@ -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;
}