msm: sde: avoid commit kickoff if no inline start

Avoid triggering the rotator kickoff unless the 'start'
notification has been received for inline rotation use
cases. This prevents the rotator hardware from waiting
for, and timing out on, a hardware start event that
never triggers due to the DRM driver aborting the commit
cycle.

Change-Id: If11268795280ca6f7de331fe942e7eb4f5fdc2eb
Signed-off-by: Clarence Ip <cip@codeaurora.org>
diff --git a/drivers/media/platform/msm/sde/rotator/sde_rotator_core.h b/drivers/media/platform/msm/sde/rotator/sde_rotator_core.h
index 731ff1e..91c830f 100644
--- a/drivers/media/platform/msm/sde/rotator/sde_rotator_core.h
+++ b/drivers/media/platform/msm/sde/rotator/sde_rotator_core.h
@@ -115,8 +115,8 @@
 	SDE_ROTATOR_TS_FENCE,		/* wait for source buffer fence */
 	SDE_ROTATOR_TS_QUEUE,		/* wait for h/w resource */
 	SDE_ROTATOR_TS_COMMIT,		/* prepare h/w command */
+	SDE_ROTATOR_TS_START,		/* wait for h/w kickoff rdy (inline) */
 	SDE_ROTATOR_TS_FLUSH,		/* initiate h/w processing */
-	SDE_ROTATOR_TS_START,		/* h/w triggered (if inline) */
 	SDE_ROTATOR_TS_DONE,		/* receive h/w completion */
 	SDE_ROTATOR_TS_RETIRE,		/* signal destination buffer fence */
 	SDE_ROTATOR_TS_SRCDQB,		/* dequeue source buffer */
@@ -442,6 +442,8 @@
 
 	int (*ops_config_hw)(struct sde_rot_hw_resource *hw,
 			struct sde_rot_entry *entry);
+	int (*ops_cancel_hw)(struct sde_rot_hw_resource *hw,
+			struct sde_rot_entry *entry);
 	int (*ops_kickoff_entry)(struct sde_rot_hw_resource *hw,
 			struct sde_rot_entry *entry);
 	int (*ops_wait_for_entry)(struct sde_rot_hw_resource *hw,
@@ -616,20 +618,33 @@
  *	indicator that allows the rotator to delay its rotator
  *	timeout waiting until such time as the inline rotation has
  *	really started.
+ * @mgr: Pointer to rotator manager
  * @req: Pointer to rotation request
  */
-void sde_rotator_req_reset_start(struct sde_rot_entry_container *req);
+void sde_rotator_req_reset_start(struct sde_rot_mgr *mgr,
+		struct sde_rot_entry_container *req);
 
 /*
  * sde_rotator_req_set_start - set inline h/w 'start' indicator
+ * @mgr: Pointer to rotator manager
  * @req: Pointer to rotation request
  */
-void sde_rotator_req_set_start(struct sde_rot_entry_container *req);
+void sde_rotator_req_set_start(struct sde_rot_mgr *mgr,
+		struct sde_rot_entry_container *req);
+
+/*
+ * sde_rotator_req_wait_start - wait for inline h/w 'start' indicator
+ * @mgr: Pointer to rotator manager
+ * @req: Pointer to rotation request
+ * return: Zero on success
+ */
+int sde_rotator_req_wait_start(struct sde_rot_mgr *mgr,
+		struct sde_rot_entry_container *req);
 
 /*
  * sde_rotator_req_finish - notify manager that client is finished with the
  *	given request and manager can release the request as required
- * @rot_dev: Pointer to rotator device
+ * @mgr: Pointer to rotator manager
  * @private: Pointer to rotator manager per file context
  * @req: Pointer to rotation request
  * return: none
@@ -662,18 +677,6 @@
 	struct sde_rot_entry_container *req);
 
 /*
- * sde_rotator_commit_request - queue/schedule the given request and wait
- *	until h/w commit
- * @rot_dev: Pointer to rotator device
- * @private: Pointer to rotator manager per file context
- * @req: Pointer to rotation request
- * return: 0 if success; error code otherwise
- */
-void sde_rotator_commit_request(struct sde_rot_mgr *mgr,
-	struct sde_rot_file_private *ctx,
-	struct sde_rot_entry_container *req);
-
-/*
  * sde_rotator_verify_config_all - verify given rotation configuration
  * @rot_dev: Pointer to rotator device
  * @config: Pointer to rotator configuration