summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/pld/inc/pld_common.h6
-rw-r--r--core/pld/src/pld_snoc.c69
2 files changed, 68 insertions, 7 deletions
diff --git a/core/pld/inc/pld_common.h b/core/pld/inc/pld_common.h
index 0882b9c4c31a..d3bf8d6c3fdb 100644
--- a/core/pld/inc/pld_common.h
+++ b/core/pld/inc/pld_common.h
@@ -298,6 +298,8 @@ struct pld_soc_info {
* @runtime_resume: optional operation, put the device into the fully
* active state in response to a wakeup event generated by
* hardware or at the request of software.
+ * @suspend_noirq: optional operation, complete the actions started by suspend().
+ * @resume_noirq: optional operation, prepare for the execution of resume()
*/
struct pld_driver_ops {
int (*probe)(struct device *dev,
@@ -326,6 +328,10 @@ struct pld_driver_ops {
enum pld_bus_type bus_type);
int (*runtime_resume)(struct device *dev,
enum pld_bus_type bus_type);
+ int (*suspend_noirq)(struct device *dev,
+ enum pld_bus_type bus_type);
+ int (*resume_noirq)(struct device *dev,
+ enum pld_bus_type bus_type);
};
int pld_init(void);
diff --git a/core/pld/src/pld_snoc.c b/core/pld/src/pld_snoc.c
index bfbedb056c12..a47409b4180d 100644
--- a/core/pld/src/pld_snoc.c
+++ b/core/pld/src/pld_snoc.c
@@ -148,25 +148,26 @@ static void pld_snoc_crash_shutdown(void *dev)
}
/**
- * pld_snoc_suspend() - Suspend callback function for power management
+ * pld_snoc_pm_suspend() - PM suspend callback function for power management
* @dev: device
- * @state: power state
*
* This function is to suspend the platform device when power management
* is enabled.
*
* Return: void
*/
-static int pld_snoc_suspend(struct device *dev, pm_message_t state)
+static int pld_snoc_pm_suspend(struct device *dev)
{
struct pld_context *pld_context;
+ pm_message_t state;
+ state.event = PM_EVENT_SUSPEND;
pld_context = pld_get_global_context();
return pld_context->ops->suspend(dev, PLD_BUS_TYPE_SNOC, state);
}
/**
- * pld_snoc_resume() - Resume callback function for power management
+ * pld_snoc_pm_resume() - PM resume callback function for power management
* @pdev: device
*
* This function is to resume the platform device when power management
@@ -174,7 +175,7 @@ static int pld_snoc_suspend(struct device *dev, pm_message_t state)
*
* Return: void
*/
-static int pld_snoc_resume(struct device *dev)
+static int pld_snoc_pm_resume(struct device *dev)
{
struct pld_context *pld_context;
@@ -182,6 +183,58 @@ static int pld_snoc_resume(struct device *dev)
return pld_context->ops->resume(dev, PLD_BUS_TYPE_SNOC);
}
+/**
+ * pld_snoc_suspend_noirq() - Complete the actions started by suspend()
+ * @dev: device
+ *
+ * Complete the actions started by suspend(). Carry out any
+ * additional operations required for suspending the device that might be
+ * racing with its driver's interrupt handler, which is guaranteed not to
+ * run while suspend_noirq() is being executed.
+ *
+ * Return: 0 for success
+ * Non zero failure code for errors
+ */
+static int pld_snoc_suspend_noirq(struct device *dev)
+{
+ struct pld_context *pld_context;
+
+ pld_context = pld_get_global_context();
+ if (!pld_context)
+ return -EINVAL;
+
+ if (pld_context->ops->suspend_noirq)
+ return pld_context->ops->
+ suspend_noirq(dev, PLD_BUS_TYPE_SNOC);
+ return 0;
+}
+
+/**
+ * pld_snoc_resume_noirq() - Prepare for the execution of resume()
+ * @pdev: device
+ *
+ * Prepare for the execution of resume() by carrying out any
+ * operations required for resuming the device that might be racing with
+ * its driver's interrupt handler, which is guaranteed not to run while
+ * resume_noirq() is being executed.
+ *
+ * Return: 0 for success
+ * Non zero failure code for errors
+ */
+static int pld_snoc_resume_noirq(struct device *dev)
+{
+ struct pld_context *pld_context;
+
+ pld_context = pld_get_global_context();
+ if (!pld_context)
+ return -EINVAL;
+
+ if (pld_context->ops->resume_noirq)
+ return pld_context->ops->
+ resume_noirq(dev, PLD_BUS_TYPE_SNOC);
+ return 0;
+}
+
struct icnss_driver_ops pld_snoc_ops = {
.name = "pld_snoc",
.probe = pld_snoc_probe,
@@ -189,8 +242,10 @@ struct icnss_driver_ops pld_snoc_ops = {
.shutdown = pld_snoc_shutdown,
.reinit = pld_snoc_reinit,
.crash_shutdown = pld_snoc_crash_shutdown,
- .suspend = pld_snoc_suspend,
- .resume = pld_snoc_resume,
+ .pm_suspend = pld_snoc_pm_suspend,
+ .pm_resume = pld_snoc_pm_resume,
+ .suspend_noirq = pld_snoc_suspend_noirq,
+ .resume_noirq = pld_snoc_resume_noirq,
};
/**