Skip to content

Commit 7df3f0b

Browse files
committed
Merge tag 'v4.17-rockchip-drivers-1' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip into next/drivers
Pull "Rockchip driver changes for 4.17" from Heiko Stübner: Rockchip soc drivers containing conversion of the power-domain driver to use the clk-bulk APIs and two more socs to disable jtag-switching. On the plus-side the issue we see with that are _supposed_ to be fixed in hardware in upcoming socs, so maybe this can be the last of those. * tag 'v4.17-rockchip-drivers-1' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip: soc: rockchip: power-domain: Add a sanity check on pd->num_clks soc: rockchip: power-domain: use clk_bulk APIs soc: rockchip: disable jtag switching for RK3128 SoCs soc: rockchip: disable jtag switching for RK3228/RK3229 SoCs
2 parents 7f95de5 + b127199 commit 7df3f0b

File tree

2 files changed

+75
-48
lines changed

2 files changed

+75
-48
lines changed

drivers/soc/rockchip/grf.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,28 @@ static const struct rockchip_grf_info rk3036_grf __initconst = {
4343
.num_values = ARRAY_SIZE(rk3036_defaults),
4444
};
4545

46+
#define RK3128_GRF_SOC_CON0 0x140
47+
48+
static const struct rockchip_grf_value rk3128_defaults[] __initconst = {
49+
{ "jtag switching", RK3128_GRF_SOC_CON0, HIWORD_UPDATE(0, 1, 8) },
50+
};
51+
52+
static const struct rockchip_grf_info rk3128_grf __initconst = {
53+
.values = rk3128_defaults,
54+
.num_values = ARRAY_SIZE(rk3128_defaults),
55+
};
56+
57+
#define RK3228_GRF_SOC_CON6 0x418
58+
59+
static const struct rockchip_grf_value rk3228_defaults[] __initconst = {
60+
{ "jtag switching", RK3228_GRF_SOC_CON6, HIWORD_UPDATE(0, 1, 8) },
61+
};
62+
63+
static const struct rockchip_grf_info rk3228_grf __initconst = {
64+
.values = rk3228_defaults,
65+
.num_values = ARRAY_SIZE(rk3228_defaults),
66+
};
67+
4668
#define RK3288_GRF_SOC_CON0 0x244
4769

4870
static const struct rockchip_grf_value rk3288_defaults[] __initconst = {
@@ -91,6 +113,12 @@ static const struct of_device_id rockchip_grf_dt_match[] __initconst = {
91113
{
92114
.compatible = "rockchip,rk3036-grf",
93115
.data = (void *)&rk3036_grf,
116+
}, {
117+
.compatible = "rockchip,rk3128-grf",
118+
.data = (void *)&rk3128_grf,
119+
}, {
120+
.compatible = "rockchip,rk3228-grf",
121+
.data = (void *)&rk3228_grf,
94122
}, {
95123
.compatible = "rockchip,rk3288-grf",
96124
.data = (void *)&rk3288_grf,

drivers/soc/rockchip/pm_domains.c

Lines changed: 47 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ struct rockchip_pm_domain {
6767
struct regmap **qos_regmap;
6868
u32 *qos_save_regs[MAX_QOS_REGS_NUM];
6969
int num_clks;
70-
struct clk *clks[];
70+
struct clk_bulk_data *clks;
7171
};
7272

7373
struct rockchip_pmu {
@@ -274,13 +274,18 @@ static void rockchip_do_pmu_set_power_domain(struct rockchip_pm_domain *pd,
274274

275275
static int rockchip_pd_power(struct rockchip_pm_domain *pd, bool power_on)
276276
{
277-
int i;
277+
struct rockchip_pmu *pmu = pd->pmu;
278+
int ret;
278279

279-
mutex_lock(&pd->pmu->mutex);
280+
mutex_lock(&pmu->mutex);
280281

281282
if (rockchip_pmu_domain_is_on(pd) != power_on) {
282-
for (i = 0; i < pd->num_clks; i++)
283-
clk_enable(pd->clks[i]);
283+
ret = clk_bulk_enable(pd->num_clks, pd->clks);
284+
if (ret < 0) {
285+
dev_err(pmu->dev, "failed to enable clocks\n");
286+
mutex_unlock(&pmu->mutex);
287+
return ret;
288+
}
284289

285290
if (!power_on) {
286291
rockchip_pmu_save_qos(pd);
@@ -298,11 +303,10 @@ static int rockchip_pd_power(struct rockchip_pm_domain *pd, bool power_on)
298303
rockchip_pmu_restore_qos(pd);
299304
}
300305

301-
for (i = pd->num_clks - 1; i >= 0; i--)
302-
clk_disable(pd->clks[i]);
306+
clk_bulk_disable(pd->num_clks, pd->clks);
303307
}
304308

305-
mutex_unlock(&pd->pmu->mutex);
309+
mutex_unlock(&pmu->mutex);
306310
return 0;
307311
}
308312

@@ -364,8 +368,6 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
364368
const struct rockchip_domain_info *pd_info;
365369
struct rockchip_pm_domain *pd;
366370
struct device_node *qos_node;
367-
struct clk *clk;
368-
int clk_cnt;
369371
int i, j;
370372
u32 id;
371373
int error;
@@ -391,41 +393,41 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
391393
return -EINVAL;
392394
}
393395

394-
clk_cnt = of_count_phandle_with_args(node, "clocks", "#clock-cells");
395-
pd = devm_kzalloc(pmu->dev,
396-
sizeof(*pd) + clk_cnt * sizeof(pd->clks[0]),
397-
GFP_KERNEL);
396+
pd = devm_kzalloc(pmu->dev, sizeof(*pd), GFP_KERNEL);
398397
if (!pd)
399398
return -ENOMEM;
400399

401400
pd->info = pd_info;
402401
pd->pmu = pmu;
403402

404-
for (i = 0; i < clk_cnt; i++) {
405-
clk = of_clk_get(node, i);
406-
if (IS_ERR(clk)) {
407-
error = PTR_ERR(clk);
403+
pd->num_clks = of_count_phandle_with_args(node, "clocks",
404+
"#clock-cells");
405+
if (pd->num_clks > 0) {
406+
pd->clks = devm_kcalloc(pmu->dev, pd->num_clks,
407+
sizeof(*pd->clks), GFP_KERNEL);
408+
if (!pd->clks)
409+
return -ENOMEM;
410+
} else {
411+
dev_dbg(pmu->dev, "%s: doesn't have clocks: %d\n",
412+
node->name, pd->num_clks);
413+
pd->num_clks = 0;
414+
}
415+
416+
for (i = 0; i < pd->num_clks; i++) {
417+
pd->clks[i].clk = of_clk_get(node, i);
418+
if (IS_ERR(pd->clks[i].clk)) {
419+
error = PTR_ERR(pd->clks[i].clk);
408420
dev_err(pmu->dev,
409421
"%s: failed to get clk at index %d: %d\n",
410422
node->name, i, error);
411-
goto err_out;
412-
}
413-
414-
error = clk_prepare(clk);
415-
if (error) {
416-
dev_err(pmu->dev,
417-
"%s: failed to prepare clk %pC (index %d): %d\n",
418-
node->name, clk, i, error);
419-
clk_put(clk);
420-
goto err_out;
423+
return error;
421424
}
422-
423-
pd->clks[pd->num_clks++] = clk;
424-
425-
dev_dbg(pmu->dev, "added clock '%pC' to domain '%s'\n",
426-
clk, node->name);
427425
}
428426

427+
error = clk_bulk_prepare(pd->num_clks, pd->clks);
428+
if (error)
429+
goto err_put_clocks;
430+
429431
pd->num_qos = of_count_phandle_with_args(node, "pm_qos",
430432
NULL);
431433

@@ -435,7 +437,7 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
435437
GFP_KERNEL);
436438
if (!pd->qos_regmap) {
437439
error = -ENOMEM;
438-
goto err_out;
440+
goto err_unprepare_clocks;
439441
}
440442

441443
for (j = 0; j < MAX_QOS_REGS_NUM; j++) {
@@ -445,21 +447,21 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
445447
GFP_KERNEL);
446448
if (!pd->qos_save_regs[j]) {
447449
error = -ENOMEM;
448-
goto err_out;
450+
goto err_unprepare_clocks;
449451
}
450452
}
451453

452454
for (j = 0; j < pd->num_qos; j++) {
453455
qos_node = of_parse_phandle(node, "pm_qos", j);
454456
if (!qos_node) {
455457
error = -ENODEV;
456-
goto err_out;
458+
goto err_unprepare_clocks;
457459
}
458460
pd->qos_regmap[j] = syscon_node_to_regmap(qos_node);
459461
if (IS_ERR(pd->qos_regmap[j])) {
460462
error = -ENODEV;
461463
of_node_put(qos_node);
462-
goto err_out;
464+
goto err_unprepare_clocks;
463465
}
464466
of_node_put(qos_node);
465467
}
@@ -470,7 +472,7 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
470472
dev_err(pmu->dev,
471473
"failed to power on domain '%s': %d\n",
472474
node->name, error);
473-
goto err_out;
475+
goto err_unprepare_clocks;
474476
}
475477

476478
pd->genpd.name = node->name;
@@ -486,17 +488,16 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
486488
pmu->genpd_data.domains[id] = &pd->genpd;
487489
return 0;
488490

489-
err_out:
490-
while (--i >= 0) {
491-
clk_unprepare(pd->clks[i]);
492-
clk_put(pd->clks[i]);
493-
}
491+
err_unprepare_clocks:
492+
clk_bulk_unprepare(pd->num_clks, pd->clks);
493+
err_put_clocks:
494+
clk_bulk_put(pd->num_clks, pd->clks);
494495
return error;
495496
}
496497

497498
static void rockchip_pm_remove_one_domain(struct rockchip_pm_domain *pd)
498499
{
499-
int i, ret;
500+
int ret;
500501

501502
/*
502503
* We're in the error cleanup already, so we only complain,
@@ -507,10 +508,8 @@ static void rockchip_pm_remove_one_domain(struct rockchip_pm_domain *pd)
507508
dev_err(pd->pmu->dev, "failed to remove domain '%s' : %d - state may be inconsistent\n",
508509
pd->genpd.name, ret);
509510

510-
for (i = 0; i < pd->num_clks; i++) {
511-
clk_unprepare(pd->clks[i]);
512-
clk_put(pd->clks[i]);
513-
}
511+
clk_bulk_unprepare(pd->num_clks, pd->clks);
512+
clk_bulk_put(pd->num_clks, pd->clks);
514513

515514
/* protect the zeroing of pm->num_clks */
516515
mutex_lock(&pd->pmu->mutex);

0 commit comments

Comments
 (0)