Commit dc6e6072 authored by Alex Elder's avatar Alex Elder Committed by David S. Miller

net: ipa: manage endpoints separate from clock

Currently, when (before) the last IPA clock reference is dropped,
all endpoints are suspended.  And whenever the first IPA clock
reference is taken, all endpoints are resumed (or started).

In most cases there's no need to start endpoints when the clock
starts.  So move the calls to ipa_endpoint_suspend() and
ipa_endpoint_resume() out of ipa_clock_put() and ipa_clock_get(),
respectiely.  Instead, only suspend endpoints when handling a system
suspend, and only resume endpoints when handling a system resume.
Signed-off-by: default avatarAlex Elder <elder@linaro.org>
Reviewed-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2b09841c
...@@ -200,9 +200,8 @@ bool ipa_clock_get_additional(struct ipa *ipa) ...@@ -200,9 +200,8 @@ bool ipa_clock_get_additional(struct ipa *ipa)
/* Get an IPA clock reference. If the reference count is non-zero, it is /* Get an IPA clock reference. If the reference count is non-zero, it is
* incremented and return is immediate. Otherwise it is checked again * incremented and return is immediate. Otherwise it is checked again
* under protection of the mutex, and if appropriate the clock (and * under protection of the mutex, and if appropriate the IPA clock
* interconnects) are enabled suspended endpoints (if any) are resumed * is enabled.
* before returning.
* *
* Incrementing the reference count is intentionally deferred until * Incrementing the reference count is intentionally deferred until
* after the clock is running and endpoints are resumed. * after the clock is running and endpoints are resumed.
...@@ -229,17 +228,14 @@ void ipa_clock_get(struct ipa *ipa) ...@@ -229,17 +228,14 @@ void ipa_clock_get(struct ipa *ipa)
goto out_mutex_unlock; goto out_mutex_unlock;
} }
ipa_endpoint_resume(ipa);
refcount_set(&clock->count, 1); refcount_set(&clock->count, 1);
out_mutex_unlock: out_mutex_unlock:
mutex_unlock(&clock->mutex); mutex_unlock(&clock->mutex);
} }
/* Attempt to remove an IPA clock reference. If this represents the last /* Attempt to remove an IPA clock reference. If this represents the
* reference, suspend endpoints and disable the clock (and interconnects) * last reference, disable the IPA clock under protection of the mutex.
* under protection of a mutex.
*/ */
void ipa_clock_put(struct ipa *ipa) void ipa_clock_put(struct ipa *ipa)
{ {
...@@ -249,8 +245,6 @@ void ipa_clock_put(struct ipa *ipa) ...@@ -249,8 +245,6 @@ void ipa_clock_put(struct ipa *ipa)
if (!refcount_dec_and_mutex_lock(&clock->count, &clock->mutex)) if (!refcount_dec_and_mutex_lock(&clock->count, &clock->mutex))
return; return;
ipa_endpoint_suspend(ipa);
ipa_clock_disable(ipa); ipa_clock_disable(ipa);
mutex_unlock(&clock->mutex); mutex_unlock(&clock->mutex);
......
...@@ -907,11 +907,15 @@ static int ipa_remove(struct platform_device *pdev) ...@@ -907,11 +907,15 @@ static int ipa_remove(struct platform_device *pdev)
* Return: Always returns zero * Return: Always returns zero
* *
* Called by the PM framework when a system suspend operation is invoked. * 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) static int ipa_suspend(struct device *dev)
{ {
struct ipa *ipa = dev_get_drvdata(dev); struct ipa *ipa = dev_get_drvdata(dev);
ipa_endpoint_suspend(ipa);
ipa_clock_put(ipa); ipa_clock_put(ipa);
__clear_bit(IPA_FLAG_CLOCK_HELD, ipa->flags); __clear_bit(IPA_FLAG_CLOCK_HELD, ipa->flags);
...@@ -925,6 +929,8 @@ static int ipa_suspend(struct device *dev) ...@@ -925,6 +929,8 @@ static int ipa_suspend(struct device *dev)
* Return: Always returns 0 * Return: Always returns 0
* *
* Called by the PM framework when a system resume operation is invoked. * 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) static int ipa_resume(struct device *dev)
{ {
...@@ -936,6 +942,8 @@ static int ipa_resume(struct device *dev) ...@@ -936,6 +942,8 @@ static int ipa_resume(struct device *dev)
__set_bit(IPA_FLAG_CLOCK_HELD, ipa->flags); __set_bit(IPA_FLAG_CLOCK_HELD, ipa->flags);
ipa_clock_get(ipa); ipa_clock_get(ipa);
ipa_endpoint_resume(ipa);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment