Ver código fonte

qcacld-3.0: Register suspend_noirq/resume_noirq to kernel

Register suspend_noirq/resume_noirq callbacks to kernel. It will
make sure no wake up is pending from FW and if initial wake up is
received then failing it should trigger resume.

Change-Id: I3d3de3789a7d560ed171294fa9a1ebe6389746a7
CRs-Fixed: 1060669
Yuanyuan Liu 8 anos atrás
pai
commit
42567dfb22
2 arquivos alterados com 68 adições e 7 exclusões
  1. 6 0
      core/pld/inc/pld_common.h
  2. 62 7
      core/pld/src/pld_snoc.c

+ 6 - 0
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);

+ 62 - 7
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,
 };
 
 /**