Skip to content

Commit 158ddb8

Browse files
ziyao233bebarino
authored andcommitted
clk: loongson2: Avoid hardcoding firmware name of the reference clock
Loongson-2K0300 requires a reference clock with a frequency different from previous SoCs (120MHz v.s. 100MHz), thus hardcoding the firmware name of the reference clock as ref_100m isn't a good idea. This patch retrives the clock name of the reference clock dynamically during probe, avoiding the hardcoded pdata structure and preparing for support of future SoCs. Signed-off-by: Yao Zi <ziyao@disroot.org> Signed-off-by: Stephen Boyd <sboyd@kernel.org>
1 parent 1ba5395 commit 158ddb8

1 file changed

Lines changed: 17 additions & 16 deletions

File tree

drivers/clk/clk-loongson2.c

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,6 @@
1313
#include <linux/io-64-nonatomic-lo-hi.h>
1414
#include <dt-bindings/clock/loongson,ls2k-clk.h>
1515

16-
static const struct clk_parent_data pdata[] = {
17-
{ .fw_name = "ref_100m", },
18-
};
19-
2016
enum loongson2_clk_type {
2117
CLK_TYPE_PLL,
2218
CLK_TYPE_SCALE,
@@ -275,7 +271,8 @@ static const struct clk_ops loongson2_freqscale_recalc_ops = {
275271
.recalc_rate = loongson2_freqscale_recalc_rate,
276272
};
277273

278-
static struct clk_hw *loongson2_clk_register(struct loongson2_clk_provider *clp,
274+
static struct clk_hw *loongson2_clk_register(const char *parent,
275+
struct loongson2_clk_provider *clp,
279276
const struct loongson2_clk_board_info *cld,
280277
const struct clk_ops *ops)
281278
{
@@ -292,11 +289,7 @@ static struct clk_hw *loongson2_clk_register(struct loongson2_clk_provider *clp,
292289
init.ops = ops;
293290
init.flags = 0;
294291
init.num_parents = 1;
295-
296-
if (!cld->parent_name)
297-
init.parent_data = pdata;
298-
else
299-
init.parent_names = &cld->parent_name;
292+
init.parent_names = &parent;
300293

301294
clk->reg = clp->base + cld->reg_offset;
302295
clk->div_shift = cld->div_shift;
@@ -321,11 +314,17 @@ static int loongson2_clk_probe(struct platform_device *pdev)
321314
struct device *dev = &pdev->dev;
322315
struct loongson2_clk_provider *clp;
323316
const struct loongson2_clk_board_info *p, *data;
317+
const char *refclk_name, *parent_name;
324318

325319
data = device_get_match_data(dev);
326320
if (!data)
327321
return -EINVAL;
328322

323+
refclk_name = of_clk_get_parent_name(dev->of_node, 0);
324+
if (IS_ERR(refclk_name))
325+
return dev_err_probe(dev, PTR_ERR(refclk_name),
326+
"failed to get refclk name\n");
327+
329328
for (p = data; p->name; p++)
330329
clks_num = max(clks_num, p->id + 1);
331330

@@ -347,34 +346,36 @@ static int loongson2_clk_probe(struct platform_device *pdev)
347346

348347
for (i = 0; i < clks_num; i++) {
349348
p = &data[i];
349+
parent_name = p->parent_name ? p->parent_name : refclk_name;
350+
350351
switch (p->type) {
351352
case CLK_TYPE_PLL:
352-
hw = loongson2_clk_register(clp, p,
353+
hw = loongson2_clk_register(parent_name, clp, p,
353354
&loongson2_pll_recalc_ops);
354355
break;
355356
case CLK_TYPE_SCALE:
356-
hw = loongson2_clk_register(clp, p,
357+
hw = loongson2_clk_register(parent_name, clp, p,
357358
&loongson2_freqscale_recalc_ops);
358359
break;
359360
case CLK_TYPE_DIVIDER:
360361
hw = devm_clk_hw_register_divider(dev, p->name,
361-
p->parent_name, 0,
362+
parent_name, 0,
362363
clp->base + p->reg_offset,
363364
p->div_shift, p->div_width,
364365
CLK_DIVIDER_ONE_BASED |
365366
CLK_DIVIDER_ALLOW_ZERO,
366367
&clp->clk_lock);
367368
break;
368369
case CLK_TYPE_GATE:
369-
hw = devm_clk_hw_register_gate(dev, p->name, p->parent_name,
370+
hw = devm_clk_hw_register_gate(dev, p->name, parent_name,
370371
p->flags,
371372
clp->base + p->reg_offset,
372373
p->bit_idx, 0,
373374
&clp->clk_lock);
374375
break;
375376
case CLK_TYPE_FIXED:
376-
hw = devm_clk_hw_register_fixed_rate_parent_data(dev, p->name, pdata,
377-
0, p->fixed_rate);
377+
hw = devm_clk_hw_register_fixed_rate(dev, p->name, parent_name,
378+
0, p->fixed_rate);
378379
break;
379380
default:
380381
return dev_err_probe(dev, -EINVAL, "Invalid clk type\n");

0 commit comments

Comments
 (0)