Skip to content
This repository was archived by the owner on Oct 5, 2018. It is now read-only.

Commit 46d2aff

Browse files
committed
Merge tag 'pmdomain-v6.17-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/linux-pm
Pull pmdomain fixes from Ulf Hansson: "pmdomain core: - Restore behaviour for disabling unused PM domains and introduce the GENPD_FLAG_NO_STAY_ON configuration bit pmdomain providers: - renesas: Don't keep unused PM domains powered-on - rockchip: Fix regulator dependency with GENPD_FLAG_NO_STAY_ON" * tag 'pmdomain-v6.17-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/linux-pm: pmdomain: renesas: rmobile-sysc: Don't keep unused PM domains powered-on pmdomain: renesas: rcar-gen4-sysc: Don't keep unused PM domains powered-on pmdomain: renesas: rcar-sysc: Don't keep unused PM domains powered-on pmdomain: rockchip: Fix regulator dependency with GENPD_FLAG_NO_STAY_ON pmdomain: core: Restore behaviour for disabling unused PM domains pmdomain: renesas: rcar-sysc: Make rcar_sysc_onecell_np __initdata
2 parents 39879e3 + 303010f commit 46d2aff

File tree

6 files changed

+27
-9
lines changed

6 files changed

+27
-9
lines changed

drivers/pmdomain/core.c

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ static const struct genpd_lock_ops genpd_raw_spin_ops = {
187187
#define genpd_is_opp_table_fw(genpd) (genpd->flags & GENPD_FLAG_OPP_TABLE_FW)
188188
#define genpd_is_dev_name_fw(genpd) (genpd->flags & GENPD_FLAG_DEV_NAME_FW)
189189
#define genpd_is_no_sync_state(genpd) (genpd->flags & GENPD_FLAG_NO_SYNC_STATE)
190+
#define genpd_is_no_stay_on(genpd) (genpd->flags & GENPD_FLAG_NO_STAY_ON)
190191

191192
static inline bool irq_safe_dev_in_sleep_domain(struct device *dev,
192193
const struct generic_pm_domain *genpd)
@@ -1357,7 +1358,6 @@ static int genpd_runtime_resume(struct device *dev)
13571358
return ret;
13581359
}
13591360

1360-
#ifndef CONFIG_PM_GENERIC_DOMAINS_OF
13611361
static bool pd_ignore_unused;
13621362
static int __init pd_ignore_unused_setup(char *__unused)
13631363
{
@@ -1382,9 +1382,6 @@ static int __init genpd_power_off_unused(void)
13821382
mutex_lock(&gpd_list_lock);
13831383

13841384
list_for_each_entry(genpd, &gpd_list, gpd_list_node) {
1385-
genpd_lock(genpd);
1386-
genpd->stay_on = false;
1387-
genpd_unlock(genpd);
13881385
genpd_queue_power_off_work(genpd);
13891386
}
13901387

@@ -1393,7 +1390,6 @@ static int __init genpd_power_off_unused(void)
13931390
return 0;
13941391
}
13951392
late_initcall_sync(genpd_power_off_unused);
1396-
#endif
13971393

13981394
#ifdef CONFIG_PM_SLEEP
13991395

@@ -2367,6 +2363,18 @@ static void genpd_lock_init(struct generic_pm_domain *genpd)
23672363
}
23682364
}
23692365

2366+
#ifdef CONFIG_PM_GENERIC_DOMAINS_OF
2367+
static void genpd_set_stay_on(struct generic_pm_domain *genpd, bool is_off)
2368+
{
2369+
genpd->stay_on = !genpd_is_no_stay_on(genpd) && !is_off;
2370+
}
2371+
#else
2372+
static void genpd_set_stay_on(struct generic_pm_domain *genpd, bool is_off)
2373+
{
2374+
genpd->stay_on = false;
2375+
}
2376+
#endif
2377+
23702378
/**
23712379
* pm_genpd_init - Initialize a generic I/O PM domain object.
23722380
* @genpd: PM domain object to initialize.
@@ -2392,7 +2400,7 @@ int pm_genpd_init(struct generic_pm_domain *genpd,
23922400
INIT_WORK(&genpd->power_off_work, genpd_power_off_work_fn);
23932401
atomic_set(&genpd->sd_count, 0);
23942402
genpd->status = is_off ? GENPD_STATE_OFF : GENPD_STATE_ON;
2395-
genpd->stay_on = !is_off;
2403+
genpd_set_stay_on(genpd, is_off);
23962404
genpd->sync_state = GENPD_SYNC_STATE_OFF;
23972405
genpd->device_count = 0;
23982406
genpd->provider = NULL;

drivers/pmdomain/renesas/rcar-gen4-sysc.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ static int __init rcar_gen4_sysc_pd_setup(struct rcar_gen4_sysc_pd *pd)
251251
genpd->detach_dev = cpg_mssr_detach_dev;
252252
}
253253

254+
genpd->flags |= GENPD_FLAG_NO_STAY_ON;
254255
genpd->power_off = rcar_gen4_sysc_pd_power_off;
255256
genpd->power_on = rcar_gen4_sysc_pd_power_on;
256257

drivers/pmdomain/renesas/rcar-sysc.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ static int __init rcar_sysc_pd_setup(struct rcar_sysc_pd *pd)
241241
}
242242
}
243243

244+
genpd->flags |= GENPD_FLAG_NO_STAY_ON;
244245
genpd->power_off = rcar_sysc_pd_power_off;
245246
genpd->power_on = rcar_sysc_pd_power_on;
246247

@@ -342,7 +343,7 @@ struct rcar_pm_domains {
342343
};
343344

344345
static struct genpd_onecell_data *rcar_sysc_onecell_data;
345-
static struct device_node *rcar_sysc_onecell_np;
346+
static struct device_node *rcar_sysc_onecell_np __initdata = NULL;
346347

347348
static int __init rcar_sysc_pd_init(void)
348349
{

drivers/pmdomain/renesas/rmobile-sysc.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,8 @@ static void rmobile_init_pm_domain(struct rmobile_pm_domain *rmobile_pd)
100100
struct generic_pm_domain *genpd = &rmobile_pd->genpd;
101101
struct dev_power_governor *gov = rmobile_pd->gov;
102102

103-
genpd->flags |= GENPD_FLAG_PM_CLK | GENPD_FLAG_ACTIVE_WAKEUP;
103+
genpd->flags |= GENPD_FLAG_PM_CLK | GENPD_FLAG_ACTIVE_WAKEUP |
104+
GENPD_FLAG_NO_STAY_ON;
104105
genpd->attach_dev = cpg_mstp_attach_dev;
105106
genpd->detach_dev = cpg_mstp_detach_dev;
106107

drivers/pmdomain/rockchip/pm-domains.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -865,7 +865,7 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
865865
pd->genpd.power_on = rockchip_pd_power_on;
866866
pd->genpd.attach_dev = rockchip_pd_attach_dev;
867867
pd->genpd.detach_dev = rockchip_pd_detach_dev;
868-
pd->genpd.flags = GENPD_FLAG_PM_CLK;
868+
pd->genpd.flags = GENPD_FLAG_PM_CLK | GENPD_FLAG_NO_STAY_ON;
869869
if (pd_info->active_wakeup)
870870
pd->genpd.flags |= GENPD_FLAG_ACTIVE_WAKEUP;
871871
pm_genpd_init(&pd->genpd, NULL,

include/linux/pm_domain.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,12 @@ struct dev_pm_domain_list {
115115
* genpd provider specific way, likely through a
116116
* parent device node. This flag makes genpd to
117117
* skip its internal support for this.
118+
*
119+
* GENPD_FLAG_NO_STAY_ON: For genpd OF providers a powered-on PM domain at
120+
* initialization is prevented from being
121+
* powered-off until the ->sync_state() callback is
122+
* invoked. This flag informs genpd to allow a
123+
* power-off without waiting for ->sync_state().
118124
*/
119125
#define GENPD_FLAG_PM_CLK (1U << 0)
120126
#define GENPD_FLAG_IRQ_SAFE (1U << 1)
@@ -126,6 +132,7 @@ struct dev_pm_domain_list {
126132
#define GENPD_FLAG_OPP_TABLE_FW (1U << 7)
127133
#define GENPD_FLAG_DEV_NAME_FW (1U << 8)
128134
#define GENPD_FLAG_NO_SYNC_STATE (1U << 9)
135+
#define GENPD_FLAG_NO_STAY_ON (1U << 10)
129136

130137
enum gpd_status {
131138
GENPD_STATE_ON = 0, /* PM domain is on */

0 commit comments

Comments
 (0)