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;
(win_data->data_format == YUV420 ||
win_data->data_format == YUV420_A))
continue;
+ mutex_lock(&dev_drv->win_config);
rk_fb_update_win(dev_drv, win, win_data);
win->state = 1;
dev_drv->ops->set_par(dev_drv, i);
dev_drv->ops->pan_display(dev_drv, i);
+ mutex_unlock(&dev_drv->win_config);
#if defined(CONFIG_ROCKCHIP_IOMMU)
if (dev_drv->iommu_enabled) {
g_last_addr[i] = win_data->reg_area_data[0].smem_start +
#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)
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)
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))
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;
}
} else if (ret == 0) {
rk_fb_update_reg(dev_drv, regs);
}
- kfree(regs);
}
err:
info->var.grayscale |=
(dev_drv->cur_screen->mode.xres << 8) +
(dev_drv->cur_screen->mode.yres << 20);
+ mutex_lock(&dev_drv->win_config);
info->fbops->fb_set_par(info);
info->fbops->fb_pan_display(&info->var, info);
+ mutex_unlock(&dev_drv->win_config);
if (dev_drv->ops->dsp_black)
dev_drv->ops->dsp_black(dev_drv, 0);
(dev_drv->cur_screen->xsize << 8) +
(dev_drv->cur_screen->ysize << 20);
}
+
+ mutex_lock(&dev_drv->win_config);
info->fbops->fb_set_par(info);
info->fbops->fb_pan_display(&info->var, info);
+ mutex_unlock(&dev_drv->win_config);
}
}
}
}
}
+ mutex_lock(&dev_drv->win_config);
info->fbops->fb_set_par(info);
- /* info->fbops->fb_ioctl(info, RK_FBIOSET_CONFIG_DONE, 0); */
dev_drv->ops->cfg_done(dev_drv);
+ mutex_unlock(&dev_drv->win_config);
+
return 0;
}
init_completion(&dev_drv->frame_done);
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;