/* Get an IPA clock reference.  If the reference count is non-zero, it is
  * incremented and return is immediate.  Otherwise it is checked again
- * under protection of the mutex, and if appropriate the clock (and
- * interconnects) are enabled suspended endpoints (if any) are resumed
- * before returning.
+ * under protection of the mutex, and if appropriate the IPA clock
+ * is enabled.
  *
  * Incrementing the reference count is intentionally deferred until
  * after the clock is running and endpoints are resumed.
                goto out_mutex_unlock;
        }
 
-       ipa_endpoint_resume(ipa);
-
        refcount_set(&clock->count, 1);
 
 out_mutex_unlock:
        mutex_unlock(&clock->mutex);
 }
 
-/* Attempt to remove an IPA clock reference.  If this represents the last
- * reference, suspend endpoints and disable the clock (and interconnects)
- * under protection of a mutex.
+/* Attempt to remove an IPA clock reference.  If this represents the
+ * last reference, disable the IPA clock under protection of the mutex.
  */
 void ipa_clock_put(struct ipa *ipa)
 {
        if (!refcount_dec_and_mutex_lock(&clock->count, &clock->mutex))
                return;
 
-       ipa_endpoint_suspend(ipa);
-
        ipa_clock_disable(ipa);
 
        mutex_unlock(&clock->mutex);
 
  * Return:     Always returns zero
  *
  * Called by the PM framework when a system suspend operation is invoked.
+ * Suspends endpoints and releases the clock reference held to keep
+ * the IPA clock running until this point.
  */
 static int ipa_suspend(struct device *dev)
 {
        struct ipa *ipa = dev_get_drvdata(dev);
 
+       ipa_endpoint_suspend(ipa);
+
        ipa_clock_put(ipa);
        __clear_bit(IPA_FLAG_CLOCK_HELD, ipa->flags);
 
  * Return:     Always returns 0
  *
  * Called by the PM framework when a system resume operation is invoked.
+ * Takes an IPA clock reference to keep the clock running until suspend,
+ * and resumes endpoints.
  */
 static int ipa_resume(struct device *dev)
 {
        __set_bit(IPA_FLAG_CLOCK_HELD, ipa->flags);
        ipa_clock_get(ipa);
 
+       ipa_endpoint_resume(ipa);
+
        return 0;
 }