Merge branches 'pm-core', 'pm-sleep' and 'pm-qos'
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 14 Mar 2019 09:51:38 +0000 (10:51 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 14 Mar 2019 09:51:38 +0000 (10:51 +0100)
* pm-core:
  PM-runtime: Call pm_runtime_active|suspended_time() from sysfs
  PM-runtime: Consolidate code to get active/suspended time

* pm-sleep:
  PM / wakeup: Drop wakeup_source_drop()
  PM / wakeup: Rework wakeup source timer cancellation

* pm-qos:
  PM / QoS: Fix typo in file description

drivers/base/power/domain.c
drivers/base/power/main.c
drivers/base/power/power.h
drivers/base/power/runtime.c
drivers/base/power/sysfs.c
drivers/base/power/trace.c
drivers/base/power/wakeup.c
include/linux/pm.h
include/linux/pm_wakeup.h

index 2c334c0..764e0f2 100644 (file)
@@ -6,6 +6,8 @@
  * This file is released under the GPLv2.
  */
 
+#define pr_fmt(fmt) "PM: " fmt
+
 #include <linux/delay.h>
 #include <linux/kernel.h>
 #include <linux/io.h>
@@ -1657,8 +1659,8 @@ int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd,
        genpd_lock_nested(genpd, SINGLE_DEPTH_NESTING);
 
        if (!list_empty(&subdomain->master_links) || subdomain->device_count) {
-               pr_warn("%s: unable to remove subdomain %s\n", genpd->name,
-                       subdomain->name);
+               pr_warn("%s: unable to remove subdomain %s\n",
+                       genpd->name, subdomain->name);
                ret = -EBUSY;
                goto out;
        }
@@ -1767,7 +1769,7 @@ int pm_genpd_init(struct generic_pm_domain *genpd,
                if (ret)
                        return ret;
        } else if (!gov) {
-               pr_warn("%s : no governor for states\n", genpd->name);
+               pr_warn("%s: no governor for states\n", genpd->name);
        }
 
        device_initialize(&genpd->dev);
@@ -2514,7 +2516,7 @@ static int genpd_parse_state(struct genpd_power_state *genpd_state,
                                                &entry_latency);
        if (err) {
                pr_debug(" * %pOF missing entry-latency-us property\n",
-                                               state_node);
+                        state_node);
                return -EINVAL;
        }
 
@@ -2522,7 +2524,7 @@ static int genpd_parse_state(struct genpd_power_state *genpd_state,
                                                &exit_latency);
        if (err) {
                pr_debug(" * %pOF missing exit-latency-us property\n",
-                                               state_node);
+                        state_node);
                return -EINVAL;
        }
 
index 893ae46..929bc9d 100644 (file)
@@ -17,6 +17,8 @@
  * subsystem list maintains.
  */
 
+#define pr_fmt(fmt) "PM: " fmt
+
 #include <linux/device.h>
 #include <linux/export.h>
 #include <linux/mutex.h>
@@ -128,7 +130,7 @@ void device_pm_add(struct device *dev)
        if (device_pm_not_required(dev))
                return;
 
-       pr_debug("PM: Adding info for %s:%s\n",
+       pr_debug("Adding info for %s:%s\n",
                 dev->bus ? dev->bus->name : "No Bus", dev_name(dev));
        device_pm_check_callbacks(dev);
        mutex_lock(&dpm_list_mtx);
@@ -149,7 +151,7 @@ void device_pm_remove(struct device *dev)
        if (device_pm_not_required(dev))
                return;
 
-       pr_debug("PM: Removing info for %s:%s\n",
+       pr_debug("Removing info for %s:%s\n",
                 dev->bus ? dev->bus->name : "No Bus", dev_name(dev));
        complete_all(&dev->power.completion);
        mutex_lock(&dpm_list_mtx);
@@ -168,7 +170,7 @@ void device_pm_remove(struct device *dev)
  */
 void device_pm_move_before(struct device *deva, struct device *devb)
 {
-       pr_debug("PM: Moving %s:%s before %s:%s\n",
+       pr_debug("Moving %s:%s before %s:%s\n",
                 deva->bus ? deva->bus->name : "No Bus", dev_name(deva),
                 devb->bus ? devb->bus->name : "No Bus", dev_name(devb));
        /* Delete deva from dpm_list and reinsert before devb. */
@@ -182,7 +184,7 @@ void device_pm_move_before(struct device *deva, struct device *devb)
  */
 void device_pm_move_after(struct device *deva, struct device *devb)
 {
-       pr_debug("PM: Moving %s:%s after %s:%s\n",
+       pr_debug("Moving %s:%s after %s:%s\n",
                 deva->bus ? deva->bus->name : "No Bus", dev_name(deva),
                 devb->bus ? devb->bus->name : "No Bus", dev_name(devb));
        /* Delete deva from dpm_list and reinsert after devb. */
@@ -195,7 +197,7 @@ void device_pm_move_after(struct device *deva, struct device *devb)
  */
 void device_pm_move_last(struct device *dev)
 {
-       pr_debug("PM: Moving %s:%s to end of list\n",
+       pr_debug("Moving %s:%s to end of list\n",
                 dev->bus ? dev->bus->name : "No Bus", dev_name(dev));
        list_move_tail(&dev->power.entry, &dpm_list);
 }
@@ -418,8 +420,8 @@ static void pm_dev_dbg(struct device *dev, pm_message_t state, const char *info)
 static void pm_dev_err(struct device *dev, pm_message_t state, const char *info,
                        int error)
 {
-       printk(KERN_ERR "PM: Device %s failed to %s%s: error %d\n",
-               dev_name(dev), pm_verb(state.event), info, error);
+       pr_err("Device %s failed to %s%s: error %d\n",
+              dev_name(dev), pm_verb(state.event), info, error);
 }
 
 static void dpm_show_time(ktime_t starttime, pm_message_t state, int error,
@@ -2022,8 +2024,7 @@ int dpm_prepare(pm_message_t state)
                                error = 0;
                                continue;
                        }
-                       printk(KERN_INFO "PM: Device %s not prepared "
-                               "for power transition: code %d\n",
+                       pr_info("Device %s not prepared for power transition: code %d\n",
                                dev_name(dev), error);
                        put_device(dev);
                        break;
@@ -2062,7 +2063,7 @@ EXPORT_SYMBOL_GPL(dpm_suspend_start);
 void __suspend_report_result(const char *function, void *fn, int ret)
 {
        if (ret)
-               printk(KERN_ERR "%s(): %pF returns %d\n", function, fn, ret);
+               pr_err("%s(): %pF returns %d\n", function, fn, ret);
 }
 EXPORT_SYMBOL_GPL(__suspend_report_result);
 
index c511def..ec33fbd 100644 (file)
@@ -21,6 +21,7 @@ static inline void pm_runtime_early_init(struct device *dev)
 extern void pm_runtime_init(struct device *dev);
 extern void pm_runtime_reinit(struct device *dev);
 extern void pm_runtime_remove(struct device *dev);
+extern u64 pm_runtime_active_time(struct device *dev);
 
 #define WAKE_IRQ_DEDICATED_ALLOCATED   BIT(0)
 #define WAKE_IRQ_DEDICATED_MANAGED     BIT(1)
index 78937c4..a2d22e3 100644 (file)
@@ -64,7 +64,7 @@ static int rpm_suspend(struct device *dev, int rpmflags);
  * runtime_status field is updated, to account the time in the old state
  * correctly.
  */
-void update_pm_runtime_accounting(struct device *dev)
+static void update_pm_runtime_accounting(struct device *dev)
 {
        u64 now, last, delta;
 
@@ -98,7 +98,7 @@ static void __update_runtime_status(struct device *dev, enum rpm_status status)
        dev->power.runtime_status = status;
 }
 
-u64 pm_runtime_suspended_time(struct device *dev)
+static u64 rpm_get_accounted_time(struct device *dev, bool suspended)
 {
        u64 time;
        unsigned long flags;
@@ -106,12 +106,22 @@ u64 pm_runtime_suspended_time(struct device *dev)
        spin_lock_irqsave(&dev->power.lock, flags);
 
        update_pm_runtime_accounting(dev);
-       time = dev->power.suspended_time;
+       time = suspended ? dev->power.suspended_time : dev->power.active_time;
 
        spin_unlock_irqrestore(&dev->power.lock, flags);
 
        return time;
 }
+
+u64 pm_runtime_active_time(struct device *dev)
+{
+       return rpm_get_accounted_time(dev, false);
+}
+
+u64 pm_runtime_suspended_time(struct device *dev)
+{
+       return rpm_get_accounted_time(dev, true);
+}
 EXPORT_SYMBOL_GPL(pm_runtime_suspended_time);
 
 /**
index c6bf761..1226e44 100644 (file)
@@ -125,13 +125,9 @@ static ssize_t runtime_active_time_show(struct device *dev,
                                struct device_attribute *attr, char *buf)
 {
        int ret;
-       u64 tmp;
-       spin_lock_irq(&dev->power.lock);
-       update_pm_runtime_accounting(dev);
-       tmp = dev->power.active_time;
+       u64 tmp = pm_runtime_active_time(dev);
        do_div(tmp, NSEC_PER_MSEC);
        ret = sprintf(buf, "%llu\n", tmp);
-       spin_unlock_irq(&dev->power.lock);
        return ret;
 }
 
@@ -141,13 +137,9 @@ static ssize_t runtime_suspended_time_show(struct device *dev,
                                struct device_attribute *attr, char *buf)
 {
        int ret;
-       u64 tmp;
-       spin_lock_irq(&dev->power.lock);
-       update_pm_runtime_accounting(dev);
-       tmp = dev->power.suspended_time;
+       u64 tmp = pm_runtime_suspended_time(dev);
        do_div(tmp, NSEC_PER_MSEC);
        ret = sprintf(buf, "%llu\n", tmp);
-       spin_unlock_irq(&dev->power.lock);
        return ret;
 }
 
index b11f47a..2bd9d2c 100644 (file)
@@ -7,6 +7,8 @@
  * devices may be working.
  */
 
+#define pr_fmt(fmt) "PM: " fmt
+
 #include <linux/pm-trace.h>
 #include <linux/export.h>
 #include <linux/rtc.h>
index f1fee72..bb1ae17 100644 (file)
@@ -6,6 +6,8 @@
  * This file is released under the GPLv2.
  */
 
+#define pr_fmt(fmt) "PM: " fmt
+
 #include <linux/device.h>
 #include <linux/slab.h>
 #include <linux/sched/signal.h>
@@ -106,23 +108,6 @@ struct wakeup_source *wakeup_source_create(const char *name)
 }
 EXPORT_SYMBOL_GPL(wakeup_source_create);
 
-/**
- * wakeup_source_drop - Prepare a struct wakeup_source object for destruction.
- * @ws: Wakeup source to prepare for destruction.
- *
- * Callers must ensure that __pm_stay_awake() or __pm_wakeup_event() will never
- * be run in parallel with this function for the same wakeup source object.
- */
-void wakeup_source_drop(struct wakeup_source *ws)
-{
-       if (!ws)
-               return;
-
-       del_timer_sync(&ws->timer);
-       __pm_relax(ws);
-}
-EXPORT_SYMBOL_GPL(wakeup_source_drop);
-
 /*
  * Record wakeup_source statistics being deleted into a dummy wakeup_source.
  */
@@ -162,7 +147,7 @@ void wakeup_source_destroy(struct wakeup_source *ws)
        if (!ws)
                return;
 
-       wakeup_source_drop(ws);
+       __pm_relax(ws);
        wakeup_source_record(ws);
        kfree_const(ws->name);
        kfree(ws);
@@ -205,6 +190,13 @@ void wakeup_source_remove(struct wakeup_source *ws)
        list_del_rcu(&ws->entry);
        raw_spin_unlock_irqrestore(&events_lock, flags);
        synchronize_srcu(&wakeup_srcu);
+
+       del_timer_sync(&ws->timer);
+       /*
+        * Clear timer.function to make wakeup_source_not_registered() treat
+        * this wakeup source as not registered.
+        */
+       ws->timer.function = NULL;
 }
 EXPORT_SYMBOL_GPL(wakeup_source_remove);
 
@@ -853,7 +845,7 @@ bool pm_wakeup_pending(void)
        raw_spin_unlock_irqrestore(&events_lock, flags);
 
        if (ret) {
-               pr_debug("PM: Wakeup pending, aborting suspend\n");
+               pr_debug("Wakeup pending, aborting suspend\n");
                pm_print_active_wakeup_sources();
        }
 
index 06f7ed8..66c19a6 100644 (file)
@@ -643,7 +643,6 @@ struct dev_pm_info {
        struct dev_pm_qos       *qos;
 };
 
-extern void update_pm_runtime_accounting(struct device *dev);
 extern int dev_pm_get_subsys_data(struct device *dev);
 extern void dev_pm_put_subsys_data(struct device *dev);
 
index 4238dde..0ff134d 100644 (file)
@@ -96,7 +96,6 @@ static inline void device_set_wakeup_path(struct device *dev)
 /* drivers/base/power/wakeup.c */
 extern void wakeup_source_prepare(struct wakeup_source *ws, const char *name);
 extern struct wakeup_source *wakeup_source_create(const char *name);
-extern void wakeup_source_drop(struct wakeup_source *ws);
 extern void wakeup_source_destroy(struct wakeup_source *ws);
 extern void wakeup_source_add(struct wakeup_source *ws);
 extern void wakeup_source_remove(struct wakeup_source *ws);
@@ -134,8 +133,6 @@ static inline struct wakeup_source *wakeup_source_create(const char *name)
        return NULL;
 }
 
-static inline void wakeup_source_drop(struct wakeup_source *ws) {}
-
 static inline void wakeup_source_destroy(struct wakeup_source *ws) {}
 
 static inline void wakeup_source_add(struct wakeup_source *ws) {}
@@ -204,12 +201,6 @@ static inline void wakeup_source_init(struct wakeup_source *ws,
        wakeup_source_add(ws);
 }
 
-static inline void wakeup_source_trash(struct wakeup_source *ws)
-{
-       wakeup_source_remove(ws);
-       wakeup_source_drop(ws);
-}
-
 static inline void __pm_wakeup_event(struct wakeup_source *ws, unsigned int msec)
 {
        return pm_wakeup_ws_event(ws, msec, false);