diff options
author | Fancy Fang <chen.fang@freescale.com> | 2014-11-07 16:44:46 +0800 |
---|---|---|
committer | Nitin Garg <nitin.garg@freescale.com> | 2015-01-15 21:18:32 -0600 |
commit | 9266315a1115c63f5ac7bc4bde748fce2b4ea7f7 (patch) | |
tree | 331771f0628d72ae77b9756d9cb5d5f9237b7fa1 | |
parent | bbe1d4716ba1b41104ccdfdd7d0bbb4605496734 (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.c | 31 | ||||
-rw-r--r-- | include/uapi/linux/mxcfb.h | 4 |
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 |