Skip to content

Commit 3284ffb

Browse files
committed
clk: renesas: rcar-gen4: Add support for fixed variable PLLs
The custom clock driver that models PLL clocks on R-Car Gen4 supports variable clocks, while PLL1 uses a similar control register layout, but is read-only. Extend the existing support to fixed clocks and PLL1, and introduce a new clock type and helper macro to describe a fixed PLL. Signed-off-by: Geert Uytterhoeven <[email protected]> Reviewed-by: Yoshihiro Shimoda <[email protected]> Link: https://lore.kernel.org/841fbb63d472c357b3ce291a5991db3b847f96d8.1721648548.git.geert+renesas@glider.be
1 parent 724620b commit 3284ffb

File tree

2 files changed

+26
-10
lines changed

2 files changed

+26
-10
lines changed

drivers/clk/renesas/rcar-gen4-cpg.c

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,10 @@ static int cpg_pll_8_25_clk_set_rate(struct clk_hw *hw, unsigned long rate,
179179
val & pll_clk->pllecr_pllst_mask, 0, 1000);
180180
}
181181

182+
static const struct clk_ops cpg_pll_f8_25_clk_ops = {
183+
.recalc_rate = cpg_pll_8_25_clk_recalc_rate,
184+
};
185+
182186
static const struct clk_ops cpg_pll_v8_25_clk_ops = {
183187
.recalc_rate = cpg_pll_8_25_clk_recalc_rate,
184188
.determine_rate = cpg_pll_8_25_clk_determine_rate,
@@ -188,13 +192,15 @@ static const struct clk_ops cpg_pll_v8_25_clk_ops = {
188192
static struct clk * __init cpg_pll_clk_register(const char *name,
189193
const char *parent_name,
190194
void __iomem *base,
191-
unsigned int index)
195+
unsigned int index,
196+
const struct clk_ops *ops)
192197
{
193198
static const struct { u16 cr0, cr1; } pll_cr_offsets[] __initconst = {
194-
[2 - 2] = { CPG_PLL2CR0, CPG_PLL2CR1 },
195-
[3 - 2] = { CPG_PLL3CR0, CPG_PLL3CR1 },
196-
[4 - 2] = { CPG_PLL4CR0, CPG_PLL4CR1 },
197-
[6 - 2] = { CPG_PLL6CR0, CPG_PLL6CR1 },
199+
[1 - 1] = { CPG_PLL1CR0, CPG_PLL1CR1 },
200+
[2 - 1] = { CPG_PLL2CR0, CPG_PLL2CR1 },
201+
[3 - 1] = { CPG_PLL3CR0, CPG_PLL3CR1 },
202+
[4 - 1] = { CPG_PLL4CR0, CPG_PLL4CR1 },
203+
[6 - 1] = { CPG_PLL6CR0, CPG_PLL6CR1 },
198204
};
199205
struct clk_init_data init = {};
200206
struct cpg_pll_clk *pll_clk;
@@ -205,13 +211,13 @@ static struct clk * __init cpg_pll_clk_register(const char *name,
205211
return ERR_PTR(-ENOMEM);
206212

207213
init.name = name;
208-
init.ops = &cpg_pll_v8_25_clk_ops;
214+
init.ops = ops;
209215
init.parent_names = &parent_name;
210216
init.num_parents = 1;
211217

212218
pll_clk->hw.init = &init;
213-
pll_clk->pllcr0_reg = base + pll_cr_offsets[index - 2].cr0;
214-
pll_clk->pllcr1_reg = base + pll_cr_offsets[index - 2].cr1;
219+
pll_clk->pllcr0_reg = base + pll_cr_offsets[index - 1].cr0;
220+
pll_clk->pllcr1_reg = base + pll_cr_offsets[index - 1].cr1;
215221
pll_clk->pllecr_reg = base + CPG_PLLECR;
216222
pll_clk->pllecr_pllst_mask = CPG_PLLECR_PLLST(index);
217223

@@ -413,7 +419,7 @@ struct clk * __init rcar_gen4_cpg_clk_register(struct device *dev,
413419
* modes.
414420
*/
415421
return cpg_pll_clk_register(core->name, __clk_get_name(parent),
416-
base, 2);
422+
base, 2, &cpg_pll_v8_25_clk_ops);
417423

418424
case CLK_TYPE_GEN4_PLL2:
419425
mult = cpg_pll_config->pll2_mult;
@@ -445,9 +451,15 @@ struct clk * __init rcar_gen4_cpg_clk_register(struct device *dev,
445451
mult = (FIELD_GET(CPG_PLLxCR_STC, value) + 1) * 2;
446452
break;
447453

454+
case CLK_TYPE_GEN4_PLL_F8_25:
455+
return cpg_pll_clk_register(core->name, __clk_get_name(parent),
456+
base, core->offset,
457+
&cpg_pll_f8_25_clk_ops);
458+
448459
case CLK_TYPE_GEN4_PLL_V8_25:
449460
return cpg_pll_clk_register(core->name, __clk_get_name(parent),
450-
base, core->offset);
461+
base, core->offset,
462+
&cpg_pll_v8_25_clk_ops);
451463

452464
case CLK_TYPE_GEN4_Z:
453465
return cpg_z_clk_register(core->name, __clk_get_name(parent),

drivers/clk/renesas/rcar-gen4-cpg.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ enum rcar_gen4_clk_types {
1919
CLK_TYPE_GEN4_PLL4,
2020
CLK_TYPE_GEN4_PLL5,
2121
CLK_TYPE_GEN4_PLL6,
22+
CLK_TYPE_GEN4_PLL_F8_25, /* Fixed fractional 8.25 PLL */
2223
CLK_TYPE_GEN4_PLL_V8_25, /* Variable fractional 8.25 PLL */
2324
CLK_TYPE_GEN4_SDSRC,
2425
CLK_TYPE_GEN4_SDH,
@@ -48,6 +49,9 @@ enum rcar_gen4_clk_types {
4849
#define DEF_GEN4_OSC(_name, _id, _parent, _div) \
4950
DEF_BASE(_name, _id, CLK_TYPE_GEN4_OSC, _parent, .div = _div)
5051

52+
#define DEF_GEN4_PLL_F8_25(_name, _idx, _id, _parent) \
53+
DEF_BASE(_name, _id, CLK_TYPE_GEN4_PLL_F8_25, _parent, .offset = _idx)
54+
5155
#define DEF_GEN4_PLL_V8_25(_name, _idx, _id, _parent) \
5256
DEF_BASE(_name, _id, CLK_TYPE_GEN4_PLL_V8_25, _parent, .offset = _idx)
5357

0 commit comments

Comments
 (0)