/**
* enum ipa_flag - IPA state flags
- * @IPA_FLAG_CLOCK_HELD: Whether IPA clock is held to prevent suspend
- * @IPA_FLAG_COUNT: Number of defined IPA flags
+ * @IPA_FLAG_RESUMED: Whether resume from suspend has been signaled
+ * @IPA_FLAG_COUNT: Number of defined IPA flags
*/
enum ipa_flag {
- IPA_FLAG_CLOCK_HELD,
+ IPA_FLAG_RESUMED,
IPA_FLAG_COUNT, /* Last; not a flag */
};
* More than one endpoint could signal this; if so, ignore
* all but the first.
*/
- if (!test_and_set_bit(IPA_FLAG_CLOCK_HELD, ipa->flags))
+ if (!test_and_set_bit(IPA_FLAG_RESUMED, ipa->flags))
pm_wakeup_dev_event(&ipa->pdev->dev, 0, true);
/* Acknowledge/clear the suspend interrupt on all endpoints */
* is held after initialization completes, and won't get dropped
* unless/until a system suspend request arrives.
*/
- __set_bit(IPA_FLAG_CLOCK_HELD, ipa->flags);
ipa_clock_get(ipa);
ipa_hardware_config(ipa);
err_hardware_deconfig:
ipa_hardware_deconfig(ipa);
ipa_clock_put(ipa);
- __clear_bit(IPA_FLAG_CLOCK_HELD, ipa->flags);
return ret;
}
ipa_endpoint_deconfig(ipa);
ipa_hardware_deconfig(ipa);
ipa_clock_put(ipa);
- __clear_bit(IPA_FLAG_CLOCK_HELD, ipa->flags);
}
static int ipa_firmware_load(struct device *dev)
dev_set_drvdata(dev, ipa);
ipa->modem_rproc = rproc;
ipa->clock = clock;
- __clear_bit(IPA_FLAG_CLOCK_HELD, ipa->flags);
ipa->version = data->version;
ret = ipa_reg_init(ipa);
{
struct ipa *ipa = dev_get_drvdata(dev);
+ /* When a suspended RX endpoint has a packet ready to receive, we
+ * get an IPA SUSPEND interrupt. We trigger a system resume in
+ * that case, but only on the first such interrupt since suspend.
+ */
+ __clear_bit(IPA_FLAG_RESUMED, ipa->flags);
+
ipa_endpoint_suspend(ipa);
ipa_clock_put(ipa);
- __clear_bit(IPA_FLAG_CLOCK_HELD, ipa->flags);
return 0;
}
/* This clock reference will keep the IPA out of suspend
* until we get a power management suspend request.
*/
- __set_bit(IPA_FLAG_CLOCK_HELD, ipa->flags);
ipa_clock_get(ipa);
ipa_endpoint_resume(ipa);