summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFancy Fang <chen.fang@freescale.com>2014-11-07 16:44:46 +0800
committerNitin Garg <nitin.garg@freescale.com>2015-04-14 14:01:02 -0500
commitb00a5d0fe891d86609fd560b27426203af9b3c5b (patch)
treebef4c6216bb36a9d696974cbece09f07c069e767
parenta5125b0a960a35146bf3f879d641ba9e2b40b462 (diff)
MLK-9741-01: ARM: IMX6SL-EVK: EPDC: add two ioctls to disable/enable EPDC hardware access
The two ioctls can be used to disable/enable EPDC hardware access which are required by epdc user apps to do some sync jobs. Signed-off-by: Fancy Fang <chen.fang@freescale.com>
-rw-r--r--drivers/video/mxc/mxc_epdc_fb.c31
-rw-r--r--include/uapi/linux/mxcfb.h4
2 files changed, 34 insertions, 1 deletions
diff --git a/drivers/video/mxc/mxc_epdc_fb.c b/drivers/video/mxc/mxc_epdc_fb.c
index 939ec77054a8..c8174809cb0c 100644
--- a/drivers/video/mxc/mxc_epdc_fb.c
+++ b/drivers/video/mxc/mxc_epdc_fb.c
@@ -90,6 +90,7 @@
#define MERGE_BLOCK 2
static unsigned long default_bpp = 16;
+DEFINE_MUTEX(hard_lock);
struct update_marker_data {
struct list_head full_list;
@@ -2820,13 +2821,18 @@ static int mxc_epdc_fb_send_single_update(struct mxcfb_update_data *upd_data,
upd_data->waveform_mode);
return -EINVAL;
}
+
+ mutex_lock(&fb_data->queue_mutex);
if ((upd_data->update_region.left + upd_data->update_region.width > fb_data->epdc_fb_var.xres) ||
(upd_data->update_region.top + upd_data->update_region.height > fb_data->epdc_fb_var.yres)) {
+ mutex_unlock(&fb_data->queue_mutex);
dev_err(fb_data->dev,
"Update region is outside bounds of framebuffer."
"Aborting update.\n");
return -EINVAL;
}
+ mutex_unlock(&fb_data->queue_mutex);
+
if (upd_data->flags & EPDC_FLAG_USE_ALT_BUFFER) {
if ((upd_data->update_region.width !=
upd_data->alt_buffer_data.alt_update_region.width) ||
@@ -3261,6 +3267,10 @@ static int mxc_epdc_fb_ioctl(struct fb_info *info, unsigned int cmd,
case MXCFB_SEND_UPDATE:
{
struct mxcfb_update_data upd_data;
+
+ if (mutex_lock_interruptible(&hard_lock) < 0)
+ return -ERESTARTSYS;
+
if (!copy_from_user(&upd_data, argp,
sizeof(upd_data))) {
ret = mxc_epdc_fb_send_update(&upd_data, info);
@@ -3271,6 +3281,8 @@ static int mxc_epdc_fb_ioctl(struct fb_info *info, unsigned int cmd,
ret = -EFAULT;
}
+ mutex_unlock(&hard_lock);
+
break;
}
case MXCFB_WAIT_FOR_UPDATE_COMPLETE:
@@ -3327,6 +3339,25 @@ static int mxc_epdc_fb_ioctl(struct fb_info *info, unsigned int cmd,
break;
}
+ case MXCFB_DISABLE_EPDC_ACCESS:
+ {
+ struct mxc_epdc_fb_data *fb_data = info ?
+ (struct mxc_epdc_fb_data *)info:g_fb_data;
+ mxc_epdc_fb_flush_updates(fb_data);
+ /* disable handling any user update request */
+ mutex_lock(&hard_lock);
+ ret = 0;
+ break;
+ }
+
+ case MXCFB_ENABLE_EPDC_ACCESS:
+ {
+ /* enable user update handling again */
+ mutex_unlock(&hard_lock);
+ ret = 0;
+ break;
+ }
+
default:
break;
}
diff --git a/include/uapi/linux/mxcfb.h b/include/uapi/linux/mxcfb.h
index 672696184897..568250021508 100644
--- a/include/uapi/linux/mxcfb.h
+++ b/include/uapi/linux/mxcfb.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013 Freescale Semiconductor, Inc. All Rights Reserved
+ * Copyright (C) 2013-2014 Freescale Semiconductor, Inc. All Rights Reserved
*/
/*
@@ -171,4 +171,6 @@ struct mxcfb_csc_matrix {
#define MXCFB_GET_PWRDOWN_DELAY _IOR('F', 0x31, int32_t)
#define MXCFB_SET_UPDATE_SCHEME _IOW('F', 0x32, __u32)
#define MXCFB_GET_WORK_BUFFER _IOWR('F', 0x34, unsigned long)
+#define MXCFB_DISABLE_EPDC_ACCESS _IO('F', 0x35)
+#define MXCFB_ENABLE_EPDC_ACCESS _IO('F', 0x36)
#endif