/**
  * 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);