From: Mark Yao <mark.yao@rock-chips.com>
Date: Mon, 1 Dec 2014 09:21:25 +0000 (+0800)
Subject: rk_fb: use front_regs instead of some global variable
X-Git-Tag: firefly_0821_release~4423
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=52e5c707fc4fde7471c3007802a4a17720dd450c;p=firefly-linux-kernel-4.4.55.git

rk_fb: use front_regs instead of some global variable

front_regs means this config is scaning on the vop devices

Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
---

diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c
index 5944e9fc36ad..aef2035c8430 100755
--- a/drivers/video/rockchip/rk_fb.c
+++ b/drivers/video/rockchip/rk_fb.c
@@ -65,9 +65,6 @@ int (*video_data_to_mirroring) (struct fb_info *info, u32 yuv_phy[2]);
 EXPORT_SYMBOL(video_data_to_mirroring);
 #endif
 
-struct rk_fb_reg_win_data g_reg_win_data[4];
-static int g_last_win_num;
-static int g_first_buf = 1;
 static struct rk_fb_trsm_ops *trsm_lvds_ops;
 static struct rk_fb_trsm_ops *trsm_edp_ops;
 static struct rk_fb_trsm_ops *trsm_mipi_ops;
@@ -2047,7 +2044,7 @@ ext_win_exit:
 #ifdef H_USE_FENCE
 	sw_sync_timeline_inc(dev_drv->timeline, 1);
 #endif
-	if (!g_first_buf) {
+	if (dev_drv->front_regs) {
 #if defined(CONFIG_ROCKCHIP_IOMMU)
 		if (dev_drv->iommu_enabled) {
 			if (dev_drv->ops->mmu_en)
@@ -2056,20 +2053,28 @@ ext_win_exit:
 			g_last_timeout = timeout;
 		}
 #endif
-		for (i = 0; i < g_last_win_num; i++)
-			rk_fb_free_dma_buf(dev_drv, &g_reg_win_data[i]);
+
+		mutex_lock(&dev_drv->front_lock);
+
+		for (i = 0; i < dev_drv->front_regs->win_num; i++) {
+			win_data = &dev_drv->front_regs->reg_win_data[i];
+			rk_fb_free_dma_buf(dev_drv, win_data);
+		}
+		kfree(dev_drv->front_regs);
+
+		mutex_unlock(&dev_drv->front_lock);
 
 #if defined(CONFIG_ROCKCHIP_IOMMU)
 		if (dev_drv->iommu_enabled)
 			freed_addr[freed_index] = 0xfefefefe;
 #endif
 	}
-	for (i = 0; i < regs->win_num; i++) {
-		memcpy(&g_reg_win_data[i], &(regs->reg_win_data[i]),
-		       sizeof(struct rk_fb_reg_win_data));
-	}
-	g_last_win_num = regs->win_num;
-	g_first_buf = 0;
+
+	mutex_lock(&dev_drv->front_lock);
+
+	dev_drv->front_regs = regs;
+
+	mutex_unlock(&dev_drv->front_lock);
 }
 
 static void rk_fb_update_regs_handler(struct kthread_work *work)
@@ -2087,7 +2092,6 @@ static void rk_fb_update_regs_handler(struct kthread_work *work)
 	list_for_each_entry_safe(data, next, &saved_list, list) {
 		rk_fb_update_reg(dev_drv, data);
 		list_del(&data->list);
-		kfree(data);
 	}
 
 	if (dev_drv->wait_fs && list_empty(&dev_drv->update_regs_list))
@@ -2414,7 +2418,6 @@ static int rk_fb_set_win_config(struct fb_info *info,
 	mutex_lock(&dev_drv->output_lock);
 	if (!(dev_drv->suspend_flag == 0)) {
 		rk_fb_update_reg(dev_drv, regs);
-		kfree(regs);
 		printk(KERN_INFO "suspend_flag = 1\n");
 		goto err;
 	}
@@ -2481,7 +2484,6 @@ static int rk_fb_set_win_config(struct fb_info *info,
 		} else if (ret == 0) {
 			rk_fb_update_reg(dev_drv, regs);
 		}
-		kfree(regs);
 	}
 
 err:
@@ -3921,6 +3923,7 @@ static int init_lcdc_device_driver(struct rk_fb *rk_fb,
 	spin_lock_init(&dev_drv->cpl_lock);
 	mutex_init(&dev_drv->fb_win_id_mutex);
 	mutex_init(&dev_drv->win_config);
+	mutex_init(&dev_drv->front_lock);
 	dev_drv->ops->fb_win_remap(dev_drv, dev_drv->fb_win_map);
 	dev_drv->first_frame = 1;
 	dev_drv->overscan.left = 100;
diff --git a/include/linux/rk_fb.h b/include/linux/rk_fb.h
index 2227a217f891..e9b7fedd2bcf 100755
--- a/include/linux/rk_fb.h
+++ b/include/linux/rk_fb.h
@@ -561,6 +561,12 @@ struct rk_lcdc_driver {
 	int iommu_enabled;
 
 	struct rk_fb_reg_area_data reg_area_data;
+	/*
+	 * front_regs means this config is scaning on the devices.
+	 */
+	struct rk_fb_reg_data *front_regs;
+	struct mutex front_lock;
+
 	struct mutex fb_win_id_mutex;
 	struct mutex win_config;