Browse Source

disp: msm: sde: move DRM_EVENT_CRTC_POWER trigger

Currently, power on and off are being triggered prematurely.
This changes moves both calls to the end of enable and disable
functions to better align with events. It also creates a common
function to simplify event notifications.

Change-Id: I0291747a84991deb139552b2bff476a6436d5409
Signed-off-by: Samantha Tran <[email protected]>
Samantha Tran 4 năm trước cách đây
mục cha
commit
10a48e58f6
1 tập tin đã thay đổi với 27 bổ sung30 xóa
  1. 27 30
      msm/sde/sde_crtc.c

+ 27 - 30
msm/sde/sde_crtc.c

@@ -2629,10 +2629,28 @@ static void sde_crtc_frame_event_work(struct kthread_work *work)
 	SDE_ATRACE_END("crtc_frame_event");
 	SDE_ATRACE_END("crtc_frame_event");
 }
 }
 
 
+static void sde_crtc_event_notify(struct drm_crtc *crtc, uint32_t type, uint32_t len, uint32_t val)
+{
+	struct drm_event event;
+
+	if (!crtc) {
+		SDE_ERROR("invalid crtc\n");
+		return;
+	}
+
+	event.type = type;
+	event.length = len;
+	msm_mode_object_event_notify(&crtc->base, crtc->dev, &event, (u8 *)&val);
+
+	SDE_EVT32(DRMID(crtc), type, len, val);
+	SDE_DEBUG("crtc:%d event(%d) value(%d) notified\n", DRMID(crtc), type, val);
+}
+
 void sde_crtc_complete_commit(struct drm_crtc *crtc,
 void sde_crtc_complete_commit(struct drm_crtc *crtc,
 		struct drm_crtc_state *old_state)
 		struct drm_crtc_state *old_state)
 {
 {
 	struct sde_crtc *sde_crtc;
 	struct sde_crtc *sde_crtc;
+	u32 power_on = 1;
 
 
 	if (!crtc || !crtc->state) {
 	if (!crtc || !crtc->state) {
 		SDE_ERROR("invalid crtc\n");
 		SDE_ERROR("invalid crtc\n");
@@ -2642,6 +2660,9 @@ void sde_crtc_complete_commit(struct drm_crtc *crtc,
 	sde_crtc = to_sde_crtc(crtc);
 	sde_crtc = to_sde_crtc(crtc);
 	SDE_EVT32_VERBOSE(DRMID(crtc));
 	SDE_EVT32_VERBOSE(DRMID(crtc));
 
 
+	if (crtc->state->active_changed && crtc->state->active)
+		sde_crtc_event_notify(crtc, DRM_EVENT_CRTC_POWER, sizeof(u32), power_on);
+
 	sde_core_perf_crtc_update(crtc, 0, false);
 	sde_core_perf_crtc_update(crtc, 0, false);
 }
 }
 
 
@@ -4105,7 +4126,6 @@ static void sde_crtc_mmrm_cb_notification(struct drm_crtc *crtc)
 	struct msm_drm_private *priv;
 	struct msm_drm_private *priv;
 	unsigned long requested_clk;
 	unsigned long requested_clk;
 	struct sde_kms *kms = NULL;
 	struct sde_kms *kms = NULL;
-	struct drm_event event;
 
 
 	if (!crtc->dev->dev_private) {
 	if (!crtc->dev->dev_private) {
 		pr_err("invalid crtc priv\n");
 		pr_err("invalid crtc priv\n");
@@ -4122,12 +4142,8 @@ static void sde_crtc_mmrm_cb_notification(struct drm_crtc *crtc)
 			kms->perf.clk_name);
 			kms->perf.clk_name);
 
 
 	/* notify user space the reduced clk rate */
 	/* notify user space the reduced clk rate */
-	event.type = DRM_EVENT_MMRM_CB;
-	event.length = sizeof(unsigned long);
-	msm_mode_object_event_notify(&crtc->base, crtc->dev,
-			&event, (u8 *)&requested_clk);
+	sde_crtc_event_notify(crtc, DRM_EVENT_MMRM_CB, sizeof(unsigned long), requested_clk);
 
 
-	SDE_EVT32(DRMID(crtc), requested_clk);
 	SDE_DEBUG("crtc[%d]: MMRM cb notified clk:%d\n",
 	SDE_DEBUG("crtc[%d]: MMRM cb notified clk:%d\n",
 		crtc->base.id, requested_clk);
 		crtc->base.id, requested_clk);
 }
 }
@@ -4141,7 +4157,6 @@ static void sde_crtc_handle_power_event(u32 event_type, void *arg)
 	unsigned long flags;
 	unsigned long flags;
 	struct sde_crtc_irq_info *node = NULL;
 	struct sde_crtc_irq_info *node = NULL;
 	int ret = 0;
 	int ret = 0;
-	struct drm_event event;
 
 
 	if (!crtc) {
 	if (!crtc) {
 		SDE_ERROR("invalid crtc\n");
 		SDE_ERROR("invalid crtc\n");
@@ -4200,11 +4215,8 @@ static void sde_crtc_handle_power_event(u32 event_type, void *arg)
 	case SDE_POWER_EVENT_POST_DISABLE:
 	case SDE_POWER_EVENT_POST_DISABLE:
 		sde_crtc_reset_sw_state(crtc);
 		sde_crtc_reset_sw_state(crtc);
 		sde_cp_crtc_suspend(crtc);
 		sde_cp_crtc_suspend(crtc);
-		event.type = DRM_EVENT_SDE_POWER;
-		event.length = sizeof(power_on);
 		power_on = 0;
 		power_on = 0;
-		msm_mode_object_event_notify(&crtc->base, crtc->dev, &event,
-				(u8 *)&power_on);
+		sde_crtc_event_notify(crtc, DRM_EVENT_SDE_POWER, sizeof(u32), power_on);
 		break;
 		break;
 	case SDE_POWER_EVENT_MMRM_CALLBACK:
 	case SDE_POWER_EVENT_MMRM_CALLBACK:
 		sde_crtc_mmrm_cb_notification(crtc);
 		sde_crtc_mmrm_cb_notification(crtc);
@@ -4246,7 +4258,6 @@ static void sde_crtc_disable(struct drm_crtc *crtc)
 	struct msm_drm_private *priv;
 	struct msm_drm_private *priv;
 	unsigned long flags;
 	unsigned long flags;
 	struct sde_crtc_irq_info *node = NULL;
 	struct sde_crtc_irq_info *node = NULL;
-	struct drm_event event;
 	u32 power_on;
 	u32 power_on;
 	bool in_cont_splash = false;
 	bool in_cont_splash = false;
 	int ret, i;
 	int ret, i;
@@ -4279,12 +4290,7 @@ static void sde_crtc_disable(struct drm_crtc *crtc)
 	SDE_EVT32_VERBOSE(DRMID(crtc));
 	SDE_EVT32_VERBOSE(DRMID(crtc));
 
 
 	/* update color processing on suspend */
 	/* update color processing on suspend */
-	event.type = DRM_EVENT_CRTC_POWER;
-	event.length = sizeof(u32);
 	sde_cp_crtc_suspend(crtc);
 	sde_cp_crtc_suspend(crtc);
-	power_on = 0;
-	msm_mode_object_event_notify(&crtc->base, crtc->dev, &event,
-			(u8 *)&power_on);
 
 
 	mutex_unlock(&sde_crtc->crtc_lock);
 	mutex_unlock(&sde_crtc->crtc_lock);
 	kthread_flush_worker(&priv->event_thread[crtc->index].worker);
 	kthread_flush_worker(&priv->event_thread[crtc->index].worker);
@@ -4369,6 +4375,9 @@ static void sde_crtc_disable(struct drm_crtc *crtc)
 	_sde_crtc_reset(crtc);
 	_sde_crtc_reset(crtc);
 	sde_cp_crtc_disable(crtc);
 	sde_cp_crtc_disable(crtc);
 
 
+	power_on = 0;
+	sde_crtc_event_notify(crtc, DRM_EVENT_CRTC_POWER, sizeof(u32), power_on);
+
 	mutex_unlock(&sde_crtc->crtc_lock);
 	mutex_unlock(&sde_crtc->crtc_lock);
 }
 }
 
 
@@ -4380,8 +4389,6 @@ static void sde_crtc_enable(struct drm_crtc *crtc,
 	struct msm_drm_private *priv;
 	struct msm_drm_private *priv;
 	unsigned long flags;
 	unsigned long flags;
 	struct sde_crtc_irq_info *node = NULL;
 	struct sde_crtc_irq_info *node = NULL;
-	struct drm_event event;
-	u32 power_on;
 	int ret, i;
 	int ret, i;
 	struct sde_crtc_state *cstate;
 	struct sde_crtc_state *cstate;
 	struct msm_display_mode *msm_mode;
 	struct msm_display_mode *msm_mode;
@@ -4455,12 +4462,7 @@ static void sde_crtc_enable(struct drm_crtc *crtc,
 	sde_crtc->enabled = true;
 	sde_crtc->enabled = true;
 	sde_cp_crtc_enable(crtc);
 	sde_cp_crtc_enable(crtc);
 	/* update color processing on resume */
 	/* update color processing on resume */
-	event.type = DRM_EVENT_CRTC_POWER;
-	event.length = sizeof(u32);
 	sde_cp_crtc_resume(crtc);
 	sde_cp_crtc_resume(crtc);
-	power_on = 1;
-	msm_mode_object_event_notify(&crtc->base, crtc->dev, &event,
-			(u8 *)&power_on);
 
 
 	mutex_unlock(&sde_crtc->crtc_lock);
 	mutex_unlock(&sde_crtc->crtc_lock);
 
 
@@ -6840,19 +6842,14 @@ static void __sde_crtc_idle_notify_work(struct kthread_work *work)
 	struct sde_crtc *sde_crtc = container_of(work, struct sde_crtc,
 	struct sde_crtc *sde_crtc = container_of(work, struct sde_crtc,
 				idle_notify_work.work);
 				idle_notify_work.work);
 	struct drm_crtc *crtc;
 	struct drm_crtc *crtc;
-	struct drm_event event;
 	int ret = 0;
 	int ret = 0;
 
 
 	if (!sde_crtc) {
 	if (!sde_crtc) {
 		SDE_ERROR("invalid sde crtc\n");
 		SDE_ERROR("invalid sde crtc\n");
 	} else {
 	} else {
 		crtc = &sde_crtc->base;
 		crtc = &sde_crtc->base;
-		event.type = DRM_EVENT_IDLE_NOTIFY;
-		event.length = sizeof(u32);
-		msm_mode_object_event_notify(&crtc->base, crtc->dev,
-				&event, (u8 *)&ret);
+		sde_crtc_event_notify(crtc, DRM_EVENT_IDLE_NOTIFY, sizeof(u32), ret);
 
 
-		SDE_EVT32(DRMID(crtc));
 		SDE_DEBUG("crtc[%d]: idle timeout notified\n", crtc->base.id);
 		SDE_DEBUG("crtc[%d]: idle timeout notified\n", crtc->base.id);
 
 
 		sde_crtc_static_img_control(crtc, CACHE_STATE_PRE_CACHE, false);
 		sde_crtc_static_img_control(crtc, CACHE_STATE_PRE_CACHE, false);