Ver código fonte

touch: Add workqueue for suspend

Added work Queues to handle suspend functionality.

Change-Id: I1a7799056cd31d29b36172b5a0c509c9f6312dcd
Signed-off-by: Sayantan Majumder <[email protected]>
Srinu Gorle 3 anos atrás
pai
commit
c54d687364
2 arquivos alterados com 38 adições e 7 exclusões
  1. 37 7
      pt/pt_core.c
  2. 1 0
      pt/pt_regs.h

+ 37 - 7
pt/pt_core.c

@@ -10825,15 +10825,16 @@ static int pt_core_suspend_(struct device *dev)
  ******************************************************************************/
 static int pt_core_suspend(struct device *dev)
 {
-	struct pt_core_data *cd = dev_get_drvdata(dev);
-	int rc = 0;
+		struct pt_core_data *cd = dev_get_drvdata(dev);
+		int rc = 0;
 
-	if (cd->cpdata->flags & PT_CORE_FLAG_SKIP_SYS_SLEEP)
-		return 0;
+		if (cd->cpdata->flags & PT_CORE_FLAG_SKIP_SYS_SLEEP)
+			return 0;
 
-	rc = pt_core_suspend_(dev);
-	pt_debug(dev, DL_WARN, "%s Exit - rc = %d\n", __func__, rc);
-	return 0;
+		queue_work(cd->pt_workqueue, &cd->suspend_offload_work);
+		pt_debug(cd->dev, DL_ERROR, "%s End\n", __func__);
+
+		return rc;
 }
 
 /*******************************************************************************
@@ -10910,6 +10911,34 @@ exit:
 	return rc;
 }
 
+/*******************************************************************************
+ * FUNCTION: suspend_offload_work
+ *
+ * SUMMARY: Wrapper function of pt_core_suspend() to avoid TP to be waken/slept
+ *  along with kernel power state even the display is off based on the check of
+ *  TTDL core platform flag.
+ *
+ * RETURN:
+ *	 0 = success
+ *	!0 = failure
+ *
+ * PARAMETERS:
+ *      *dev  - pointer to core device
+ ******************************************************************************/
+static void pt_suspend_offload_work(struct work_struct *work)
+
+{
+	int rc = 0;
+	struct pt_core_data *cd = container_of(work, struct pt_core_data,
+				suspend_offload_work);
+
+	if (cd->cpdata->flags & PT_CORE_FLAG_SKIP_SYS_SLEEP)
+		return;
+
+	rc = pt_core_suspend_(cd->dev);
+	pt_debug(cd->dev, DL_WARN, "%s Exit - rc = %d\n", __func__, rc);
+}
+
 /*******************************************************************************
  * FUNCTION: resume_offload_work
  *
@@ -17805,6 +17834,7 @@ skip_enum:
 	pt_debug(dev, DL_ERROR, "%s: Probe: Setup drm notifier\n", __func__);
 	pt_setup_drm_notifier(cd);
 	INIT_WORK(&cd->resume_offload_work, pt_resume_offload_work);
+	INIT_WORK(&cd->suspend_offload_work, pt_suspend_offload_work);
 #elif defined(CONFIG_FB)
 	pt_setup_fb_notifier(cd);
 #endif

+ 1 - 0
pt/pt_regs.h

@@ -1448,6 +1448,7 @@ struct pt_core_data {
 	struct device *dev;
 	struct workqueue_struct *pt_workqueue;
 	struct work_struct	resume_offload_work;
+	struct work_struct	suspend_offload_work;
 	struct work_struct	suspend_work;
 	struct work_struct	resume_work;