diff options
| -rw-r--r-- | core/pld/inc/pld_common.h | 6 | ||||
| -rw-r--r-- | core/pld/src/pld_snoc.c | 69 |
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, }; /** |
