Skip to content

Commit 45a7953

Browse files
committed
Merge branches 'pm-core', 'pm-opp', 'pm-domains', 'pm-cpu' and 'pm-avs'
* pm-core: PM / wakeup: Set power.can_wakeup if wakeup_sysfs_add() fails * pm-opp: PM / OPP: Fix get sharing CPUs when hotplug is used PM / OPP: OF: Use pr_debug() instead of pr_err() while adding OPP table * pm-domains: PM / Domains: Convert to using %pOF instead of full_name PM / Domains: Extend generic power domain debugfs PM / Domains: Add time accounting to various genpd states * pm-cpu: PM / CPU: replace raw_notifier with atomic_notifier * pm-avs: PM / AVS: rockchip-io: add io selectors and supplies for RV1108
6 parents 569dbb8 + 820b9b0 + 7627929 + ea11e94 + 313c8c1 + 9d913e4 commit 45a7953

File tree

7 files changed

+318
-71
lines changed

7 files changed

+318
-71
lines changed

Documentation/devicetree/bindings/power/rockchip-io-domain.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ Required properties:
3939
- "rockchip,rk3368-pmu-io-voltage-domain" for rk3368 pmu-domains
4040
- "rockchip,rk3399-io-voltage-domain" for rk3399
4141
- "rockchip,rk3399-pmu-io-voltage-domain" for rk3399 pmu-domains
42+
- "rockchip,rv1108-io-voltage-domain" for rv1108
43+
- "rockchip,rv1108-pmu-io-voltage-domain" for rv1108 pmu-domains
4244

4345
Deprecated properties:
4446
- rockchip,grf: phandle to the syscon managing the "general register files"

drivers/base/power/domain.c

Lines changed: 234 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,34 @@ static void genpd_sd_counter_inc(struct generic_pm_domain *genpd)
209209
smp_mb__after_atomic();
210210
}
211211

212+
#ifdef CONFIG_DEBUG_FS
213+
static void genpd_update_accounting(struct generic_pm_domain *genpd)
214+
{
215+
ktime_t delta, now;
216+
217+
now = ktime_get();
218+
delta = ktime_sub(now, genpd->accounting_time);
219+
220+
/*
221+
* If genpd->status is active, it means we are just
222+
* out of off and so update the idle time and vice
223+
* versa.
224+
*/
225+
if (genpd->status == GPD_STATE_ACTIVE) {
226+
int state_idx = genpd->state_idx;
227+
228+
genpd->states[state_idx].idle_time =
229+
ktime_add(genpd->states[state_idx].idle_time, delta);
230+
} else {
231+
genpd->on_time = ktime_add(genpd->on_time, delta);
232+
}
233+
234+
genpd->accounting_time = now;
235+
}
236+
#else
237+
static inline void genpd_update_accounting(struct generic_pm_domain *genpd) {}
238+
#endif
239+
212240
static int _genpd_power_on(struct generic_pm_domain *genpd, bool timed)
213241
{
214242
unsigned int state_idx = genpd->state_idx;
@@ -361,6 +389,7 @@ static int genpd_power_off(struct generic_pm_domain *genpd, bool one_dev_on,
361389
}
362390

363391
genpd->status = GPD_STATE_POWER_OFF;
392+
genpd_update_accounting(genpd);
364393

365394
list_for_each_entry(link, &genpd->slave_links, slave_node) {
366395
genpd_sd_counter_dec(link->master);
@@ -413,6 +442,8 @@ static int genpd_power_on(struct generic_pm_domain *genpd, unsigned int depth)
413442
goto err;
414443

415444
genpd->status = GPD_STATE_ACTIVE;
445+
genpd_update_accounting(genpd);
446+
416447
return 0;
417448

418449
err:
@@ -1540,6 +1571,7 @@ int pm_genpd_init(struct generic_pm_domain *genpd,
15401571
genpd->max_off_time_changed = true;
15411572
genpd->provider = NULL;
15421573
genpd->has_provider = false;
1574+
genpd->accounting_time = ktime_get();
15431575
genpd->domain.ops.runtime_suspend = genpd_runtime_suspend;
15441576
genpd->domain.ops.runtime_resume = genpd_runtime_resume;
15451577
genpd->domain.ops.prepare = pm_genpd_prepare;
@@ -1743,7 +1775,7 @@ static int genpd_add_provider(struct device_node *np, genpd_xlate_t xlate,
17431775
mutex_lock(&of_genpd_mutex);
17441776
list_add(&cp->link, &of_genpd_providers);
17451777
mutex_unlock(&of_genpd_mutex);
1746-
pr_debug("Added domain provider from %s\n", np->full_name);
1778+
pr_debug("Added domain provider from %pOF\n", np);
17471779

17481780
return 0;
17491781
}
@@ -2149,16 +2181,16 @@ static int genpd_parse_state(struct genpd_power_state *genpd_state,
21492181
err = of_property_read_u32(state_node, "entry-latency-us",
21502182
&entry_latency);
21512183
if (err) {
2152-
pr_debug(" * %s missing entry-latency-us property\n",
2153-
state_node->full_name);
2184+
pr_debug(" * %pOF missing entry-latency-us property\n",
2185+
state_node);
21542186
return -EINVAL;
21552187
}
21562188

21572189
err = of_property_read_u32(state_node, "exit-latency-us",
21582190
&exit_latency);
21592191
if (err) {
2160-
pr_debug(" * %s missing exit-latency-us property\n",
2161-
state_node->full_name);
2192+
pr_debug(" * %pOF missing exit-latency-us property\n",
2193+
state_node);
21622194
return -EINVAL;
21632195
}
21642196

@@ -2212,8 +2244,8 @@ int of_genpd_parse_idle_states(struct device_node *dn,
22122244
ret = genpd_parse_state(&st[i++], np);
22132245
if (ret) {
22142246
pr_err
2215-
("Parsing idle state node %s failed with err %d\n",
2216-
np->full_name, ret);
2247+
("Parsing idle state node %pOF failed with err %d\n",
2248+
np, ret);
22172249
of_node_put(np);
22182250
kfree(st);
22192251
return ret;
@@ -2327,7 +2359,7 @@ static int pm_genpd_summary_one(struct seq_file *s,
23272359
return 0;
23282360
}
23292361

2330-
static int pm_genpd_summary_show(struct seq_file *s, void *data)
2362+
static int genpd_summary_show(struct seq_file *s, void *data)
23312363
{
23322364
struct generic_pm_domain *genpd;
23332365
int ret = 0;
@@ -2350,32 +2382,217 @@ static int pm_genpd_summary_show(struct seq_file *s, void *data)
23502382
return ret;
23512383
}
23522384

2353-
static int pm_genpd_summary_open(struct inode *inode, struct file *file)
2385+
static int genpd_status_show(struct seq_file *s, void *data)
23542386
{
2355-
return single_open(file, pm_genpd_summary_show, NULL);
2387+
static const char * const status_lookup[] = {
2388+
[GPD_STATE_ACTIVE] = "on",
2389+
[GPD_STATE_POWER_OFF] = "off"
2390+
};
2391+
2392+
struct generic_pm_domain *genpd = s->private;
2393+
int ret = 0;
2394+
2395+
ret = genpd_lock_interruptible(genpd);
2396+
if (ret)
2397+
return -ERESTARTSYS;
2398+
2399+
if (WARN_ON_ONCE(genpd->status >= ARRAY_SIZE(status_lookup)))
2400+
goto exit;
2401+
2402+
if (genpd->status == GPD_STATE_POWER_OFF)
2403+
seq_printf(s, "%s-%u\n", status_lookup[genpd->status],
2404+
genpd->state_idx);
2405+
else
2406+
seq_printf(s, "%s\n", status_lookup[genpd->status]);
2407+
exit:
2408+
genpd_unlock(genpd);
2409+
return ret;
23562410
}
23572411

2358-
static const struct file_operations pm_genpd_summary_fops = {
2359-
.open = pm_genpd_summary_open,
2360-
.read = seq_read,
2361-
.llseek = seq_lseek,
2362-
.release = single_release,
2363-
};
2412+
static int genpd_sub_domains_show(struct seq_file *s, void *data)
2413+
{
2414+
struct generic_pm_domain *genpd = s->private;
2415+
struct gpd_link *link;
2416+
int ret = 0;
2417+
2418+
ret = genpd_lock_interruptible(genpd);
2419+
if (ret)
2420+
return -ERESTARTSYS;
2421+
2422+
list_for_each_entry(link, &genpd->master_links, master_node)
2423+
seq_printf(s, "%s\n", link->slave->name);
2424+
2425+
genpd_unlock(genpd);
2426+
return ret;
2427+
}
2428+
2429+
static int genpd_idle_states_show(struct seq_file *s, void *data)
2430+
{
2431+
struct generic_pm_domain *genpd = s->private;
2432+
unsigned int i;
2433+
int ret = 0;
2434+
2435+
ret = genpd_lock_interruptible(genpd);
2436+
if (ret)
2437+
return -ERESTARTSYS;
2438+
2439+
seq_puts(s, "State Time Spent(ms)\n");
2440+
2441+
for (i = 0; i < genpd->state_count; i++) {
2442+
ktime_t delta = 0;
2443+
s64 msecs;
2444+
2445+
if ((genpd->status == GPD_STATE_POWER_OFF) &&
2446+
(genpd->state_idx == i))
2447+
delta = ktime_sub(ktime_get(), genpd->accounting_time);
2448+
2449+
msecs = ktime_to_ms(
2450+
ktime_add(genpd->states[i].idle_time, delta));
2451+
seq_printf(s, "S%-13i %lld\n", i, msecs);
2452+
}
2453+
2454+
genpd_unlock(genpd);
2455+
return ret;
2456+
}
2457+
2458+
static int genpd_active_time_show(struct seq_file *s, void *data)
2459+
{
2460+
struct generic_pm_domain *genpd = s->private;
2461+
ktime_t delta = 0;
2462+
int ret = 0;
2463+
2464+
ret = genpd_lock_interruptible(genpd);
2465+
if (ret)
2466+
return -ERESTARTSYS;
2467+
2468+
if (genpd->status == GPD_STATE_ACTIVE)
2469+
delta = ktime_sub(ktime_get(), genpd->accounting_time);
2470+
2471+
seq_printf(s, "%lld ms\n", ktime_to_ms(
2472+
ktime_add(genpd->on_time, delta)));
2473+
2474+
genpd_unlock(genpd);
2475+
return ret;
2476+
}
2477+
2478+
static int genpd_total_idle_time_show(struct seq_file *s, void *data)
2479+
{
2480+
struct generic_pm_domain *genpd = s->private;
2481+
ktime_t delta = 0, total = 0;
2482+
unsigned int i;
2483+
int ret = 0;
2484+
2485+
ret = genpd_lock_interruptible(genpd);
2486+
if (ret)
2487+
return -ERESTARTSYS;
2488+
2489+
for (i = 0; i < genpd->state_count; i++) {
2490+
2491+
if ((genpd->status == GPD_STATE_POWER_OFF) &&
2492+
(genpd->state_idx == i))
2493+
delta = ktime_sub(ktime_get(), genpd->accounting_time);
2494+
2495+
total = ktime_add(total, genpd->states[i].idle_time);
2496+
}
2497+
total = ktime_add(total, delta);
2498+
2499+
seq_printf(s, "%lld ms\n", ktime_to_ms(total));
2500+
2501+
genpd_unlock(genpd);
2502+
return ret;
2503+
}
2504+
2505+
2506+
static int genpd_devices_show(struct seq_file *s, void *data)
2507+
{
2508+
struct generic_pm_domain *genpd = s->private;
2509+
struct pm_domain_data *pm_data;
2510+
const char *kobj_path;
2511+
int ret = 0;
2512+
2513+
ret = genpd_lock_interruptible(genpd);
2514+
if (ret)
2515+
return -ERESTARTSYS;
2516+
2517+
list_for_each_entry(pm_data, &genpd->dev_list, list_node) {
2518+
kobj_path = kobject_get_path(&pm_data->dev->kobj,
2519+
genpd_is_irq_safe(genpd) ?
2520+
GFP_ATOMIC : GFP_KERNEL);
2521+
if (kobj_path == NULL)
2522+
continue;
2523+
2524+
seq_printf(s, "%s\n", kobj_path);
2525+
kfree(kobj_path);
2526+
}
2527+
2528+
genpd_unlock(genpd);
2529+
return ret;
2530+
}
2531+
2532+
#define define_genpd_open_function(name) \
2533+
static int genpd_##name##_open(struct inode *inode, struct file *file) \
2534+
{ \
2535+
return single_open(file, genpd_##name##_show, inode->i_private); \
2536+
}
2537+
2538+
define_genpd_open_function(summary);
2539+
define_genpd_open_function(status);
2540+
define_genpd_open_function(sub_domains);
2541+
define_genpd_open_function(idle_states);
2542+
define_genpd_open_function(active_time);
2543+
define_genpd_open_function(total_idle_time);
2544+
define_genpd_open_function(devices);
2545+
2546+
#define define_genpd_debugfs_fops(name) \
2547+
static const struct file_operations genpd_##name##_fops = { \
2548+
.open = genpd_##name##_open, \
2549+
.read = seq_read, \
2550+
.llseek = seq_lseek, \
2551+
.release = single_release, \
2552+
}
2553+
2554+
define_genpd_debugfs_fops(summary);
2555+
define_genpd_debugfs_fops(status);
2556+
define_genpd_debugfs_fops(sub_domains);
2557+
define_genpd_debugfs_fops(idle_states);
2558+
define_genpd_debugfs_fops(active_time);
2559+
define_genpd_debugfs_fops(total_idle_time);
2560+
define_genpd_debugfs_fops(devices);
23642561

23652562
static int __init pm_genpd_debug_init(void)
23662563
{
23672564
struct dentry *d;
2565+
struct generic_pm_domain *genpd;
23682566

23692567
pm_genpd_debugfs_dir = debugfs_create_dir("pm_genpd", NULL);
23702568

23712569
if (!pm_genpd_debugfs_dir)
23722570
return -ENOMEM;
23732571

23742572
d = debugfs_create_file("pm_genpd_summary", S_IRUGO,
2375-
pm_genpd_debugfs_dir, NULL, &pm_genpd_summary_fops);
2573+
pm_genpd_debugfs_dir, NULL, &genpd_summary_fops);
23762574
if (!d)
23772575
return -ENOMEM;
23782576

2577+
list_for_each_entry(genpd, &gpd_list, gpd_list_node) {
2578+
d = debugfs_create_dir(genpd->name, pm_genpd_debugfs_dir);
2579+
if (!d)
2580+
return -ENOMEM;
2581+
2582+
debugfs_create_file("current_state", 0444,
2583+
d, genpd, &genpd_status_fops);
2584+
debugfs_create_file("sub_domains", 0444,
2585+
d, genpd, &genpd_sub_domains_fops);
2586+
debugfs_create_file("idle_states", 0444,
2587+
d, genpd, &genpd_idle_states_fops);
2588+
debugfs_create_file("active_time", 0444,
2589+
d, genpd, &genpd_active_time_fops);
2590+
debugfs_create_file("total_idle_time", 0444,
2591+
d, genpd, &genpd_total_idle_time_fops);
2592+
debugfs_create_file("devices", 0444,
2593+
d, genpd, &genpd_devices_fops);
2594+
}
2595+
23792596
return 0;
23802597
}
23812598
late_initcall(pm_genpd_debug_init);

0 commit comments

Comments
 (0)