소스 검색

Merge "disp: msm: sde: clean up LTM driver states when lastclose is called"

qctecmdr 6 년 전
부모
커밋
274a5a6fda
1개의 변경된 파일16개의 추가작업 그리고 2개의 파일을 삭제
  1. 16 2
      msm/sde/sde_color_processing.c

+ 16 - 2
msm/sde/sde_color_processing.c

@@ -1587,10 +1587,8 @@ void sde_cp_crtc_destroy_properties(struct drm_crtc *crtc)
 	mutex_destroy(&sde_crtc->crtc_cp_lock);
 	INIT_LIST_HEAD(&sde_crtc->active_list);
 	INIT_LIST_HEAD(&sde_crtc->dirty_list);
-	INIT_LIST_HEAD(&sde_crtc->feature_list);
 	INIT_LIST_HEAD(&sde_crtc->ad_dirty);
 	INIT_LIST_HEAD(&sde_crtc->ad_active);
-	mutex_destroy(&sde_crtc->ltm_buffer_lock);
 	INIT_LIST_HEAD(&sde_crtc->ltm_buf_free);
 	INIT_LIST_HEAD(&sde_crtc->ltm_buf_busy);
 }
@@ -1644,6 +1642,7 @@ void sde_cp_crtc_clear(struct drm_crtc *crtc)
 {
 	struct sde_crtc *sde_crtc = NULL;
 	unsigned long flags;
+	u32 i = 0;
 
 	if (!crtc) {
 		DRM_ERROR("crtc %pK\n", crtc);
@@ -1665,6 +1664,21 @@ void sde_cp_crtc_clear(struct drm_crtc *crtc)
 	spin_lock_irqsave(&sde_crtc->spin_lock, flags);
 	list_del_init(&sde_crtc->user_event_list);
 	spin_unlock_irqrestore(&sde_crtc->spin_lock, flags);
+
+	for (i = 0; i < sde_crtc->ltm_buffer_cnt; i++) {
+		if (sde_crtc->ltm_buffers[i]) {
+			msm_gem_put_vaddr(sde_crtc->ltm_buffers[i]->gem);
+			drm_framebuffer_put(sde_crtc->ltm_buffers[i]->fb);
+			msm_gem_put_iova(sde_crtc->ltm_buffers[i]->gem,
+					sde_crtc->ltm_buffers[i]->aspace);
+			kfree(sde_crtc->ltm_buffers[i]);
+			sde_crtc->ltm_buffers[i] = NULL;
+		}
+	}
+	sde_crtc->ltm_buffer_cnt = 0;
+	sde_crtc->ltm_hist_en = false;
+	INIT_LIST_HEAD(&sde_crtc->ltm_buf_free);
+	INIT_LIST_HEAD(&sde_crtc->ltm_buf_busy);
 }
 
 static void dspp_pcc_install_property(struct drm_crtc *crtc)