PM / Runtime: Remove device fields related to suspend time, v2
Rafael J. Wysocki [Sun, 29 Apr 2012 20:54:36 +0000 (22:54 +0200)]
After the previous changes in default_stop_ok() and
default_power_down_ok() for PM domains, there are two fields in
struct dev_pm_info that aren't necessary any more,  suspend_time
and max_time_suspended_ns.

Remove those fields along with all of the code that accesses them,
which simplifies the runtime PM framework quite a bit.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>

drivers/base/power/domain.c
drivers/base/power/runtime.c
include/linux/pm.h
include/linux/pm_runtime.h

index d03a8c7..45c2b7f 100644 (file)
@@ -445,16 +445,6 @@ static int pm_genpd_poweroff(struct generic_pm_domain *genpd)
 
        genpd->status = GPD_STATE_POWER_OFF;
 
-       /* Update PM QoS information for devices in the domain. */
-       list_for_each_entry_reverse(pdd, &genpd->dev_list, list_node) {
-               struct gpd_timing_data *td = &to_gpd_data(pdd)->td;
-
-               pm_runtime_update_max_time_suspended(pdd->dev,
-                                       td->start_latency_ns +
-                                       td->restore_state_latency_ns +
-                                       genpd->power_on_latency_ns);
-       }
-
        list_for_each_entry(link, &genpd->slave_links, slave_node) {
                genpd_sd_counter_dec(link->master);
                genpd_queue_power_off_work(link->master);
@@ -515,9 +505,6 @@ static int pm_genpd_runtime_suspend(struct device *dev)
        if (ret)
                return ret;
 
-       pm_runtime_update_max_time_suspended(dev,
-                               dev_gpd_data(dev)->td.start_latency_ns);
-
        /*
         * If power.irq_safe is set, this routine will be run with interrupts
         * off, so it can't use mutexes.
index bd0f394..5989487 100644 (file)
@@ -282,47 +282,6 @@ static int rpm_callback(int (*cb)(struct device *), struct device *dev)
        return retval != -EACCES ? retval : -EIO;
 }
 
-struct rpm_qos_data {
-       ktime_t time_now;
-       s64 constraint_ns;
-};
-
-/**
- * rpm_update_qos_constraint - Update a given PM QoS constraint data.
- * @dev: Device whose timing data to use.
- * @data: PM QoS constraint data to update.
- *
- * Use the suspend timing data of @dev to update PM QoS constraint data pointed
- * to by @data.
- */
-static int rpm_update_qos_constraint(struct device *dev, void *data)
-{
-       struct rpm_qos_data *qos = data;
-       unsigned long flags;
-       s64 delta_ns;
-       int ret = 0;
-
-       spin_lock_irqsave(&dev->power.lock, flags);
-
-       if (dev->power.max_time_suspended_ns < 0)
-               goto out;
-
-       delta_ns = dev->power.max_time_suspended_ns -
-               ktime_to_ns(ktime_sub(qos->time_now, dev->power.suspend_time));
-       if (delta_ns <= 0) {
-               ret = -EBUSY;
-               goto out;
-       }
-
-       if (qos->constraint_ns > delta_ns || qos->constraint_ns == 0)
-               qos->constraint_ns = delta_ns;
-
- out:
-       spin_unlock_irqrestore(&dev->power.lock, flags);
-
-       return ret;
-}
-
 /**
  * rpm_suspend - Carry out runtime suspend of given device.
  * @dev: Device to suspend.
@@ -349,7 +308,6 @@ static int rpm_suspend(struct device *dev, int rpmflags)
 {
        int (*callback)(struct device *);
        struct device *parent = NULL;
-       struct rpm_qos_data qos;
        int retval;
 
        trace_rpm_suspend(dev, rpmflags);
@@ -445,38 +403,14 @@ static int rpm_suspend(struct device *dev, int rpmflags)
                goto out;
        }
 
-       qos.constraint_ns = __dev_pm_qos_read_value(dev);
-       if (qos.constraint_ns < 0) {
-               /* Negative constraint means "never suspend". */
+       if (__dev_pm_qos_read_value(dev) < 0) {
+               /* Negative PM QoS constraint means "never suspend". */
                retval = -EPERM;
                goto out;
        }
-       qos.constraint_ns *= NSEC_PER_USEC;
-       qos.time_now = ktime_get();
 
        __update_runtime_status(dev, RPM_SUSPENDING);
 
-       if (!dev->power.ignore_children) {
-               if (dev->power.irq_safe)
-                       spin_unlock(&dev->power.lock);
-               else
-                       spin_unlock_irq(&dev->power.lock);
-
-               retval = device_for_each_child(dev, &qos,
-                                              rpm_update_qos_constraint);
-
-               if (dev->power.irq_safe)
-                       spin_lock(&dev->power.lock);
-               else
-                       spin_lock_irq(&dev->power.lock);
-
-               if (retval)
-                       goto fail;
-       }
-
-       dev->power.suspend_time = qos.time_now;
-       dev->power.max_time_suspended_ns = qos.constraint_ns ? : -1;
-
        if (dev->pm_domain)
                callback = dev->pm_domain->ops.runtime_suspend;
        else if (dev->type && dev->type->pm)
@@ -529,8 +463,6 @@ static int rpm_suspend(struct device *dev, int rpmflags)
 
  fail:
        __update_runtime_status(dev, RPM_ACTIVE);
-       dev->power.suspend_time = ktime_set(0, 0);
-       dev->power.max_time_suspended_ns = -1;
        dev->power.deferred_resume = false;
        wake_up_all(&dev->power.wait_queue);
 
@@ -704,9 +636,6 @@ static int rpm_resume(struct device *dev, int rpmflags)
        if (dev->power.no_callbacks)
                goto no_callback;       /* Assume success. */
 
-       dev->power.suspend_time = ktime_set(0, 0);
-       dev->power.max_time_suspended_ns = -1;
-
        __update_runtime_status(dev, RPM_RESUMING);
 
        if (dev->pm_domain)
@@ -1369,9 +1298,6 @@ void pm_runtime_init(struct device *dev)
        setup_timer(&dev->power.suspend_timer, pm_suspend_timer_fn,
                        (unsigned long)dev);
 
-       dev->power.suspend_time = ktime_set(0, 0);
-       dev->power.max_time_suspended_ns = -1;
-
        init_waitqueue_head(&dev->power.wait_queue);
 }
 
@@ -1389,28 +1315,3 @@ void pm_runtime_remove(struct device *dev)
        if (dev->power.irq_safe && dev->parent)
                pm_runtime_put_sync(dev->parent);
 }
-
-/**
- * pm_runtime_update_max_time_suspended - Update device's suspend time data.
- * @dev: Device to handle.
- * @delta_ns: Value to subtract from the device's max_time_suspended_ns field.
- *
- * Update the device's power.max_time_suspended_ns field by subtracting
- * @delta_ns from it.  The resulting value of power.max_time_suspended_ns is
- * never negative.
- */
-void pm_runtime_update_max_time_suspended(struct device *dev, s64 delta_ns)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&dev->power.lock, flags);
-
-       if (delta_ns > 0 && dev->power.max_time_suspended_ns > 0) {
-               if (dev->power.max_time_suspended_ns > delta_ns)
-                       dev->power.max_time_suspended_ns -= delta_ns;
-               else
-                       dev->power.max_time_suspended_ns = 0;
-       }
-
-       spin_unlock_irqrestore(&dev->power.lock, flags);
-}
index 715305e..f067e60 100644 (file)
@@ -544,8 +544,6 @@ struct dev_pm_info {
        unsigned long           active_jiffies;
        unsigned long           suspended_jiffies;
        unsigned long           accounting_timestamp;
-       ktime_t                 suspend_time;
-       s64                     max_time_suspended_ns;
        struct dev_pm_qos_request *pq_req;
 #endif
        struct pm_subsys_data   *subsys_data;  /* Owned by the subsystem. */
index 609daae..f271860 100644 (file)
@@ -150,9 +150,6 @@ static inline void pm_runtime_set_autosuspend_delay(struct device *dev,
 static inline unsigned long pm_runtime_autosuspend_expiration(
                                struct device *dev) { return 0; }
 
-static inline void pm_runtime_update_max_time_suspended(struct device *dev,
-                                                       s64 delta_ns) {}
-
 #endif /* !CONFIG_PM_RUNTIME */
 
 static inline int pm_runtime_idle(struct device *dev)