diff mbox series

[v2] media: atomisp: remove compat_ioctl32 code

Message ID 20201007153439.699164-1-arnd@arndb.de
State Accepted
Commit b4c650f1af68251f1970aecfc3c2fceec1552da2
Headers show
Series [v2] media: atomisp: remove compat_ioctl32 code | expand

Commit Message

Arnd Bergmann Oct. 7, 2020, 3:34 p.m. UTC
This is one of the last remaining users of compat_alloc_user_space()
and copy_in_user(), which are in the process of getting removed.

As of commit 57e6b6f2303e ("media: atomisp_fops.c: disable
atomisp_compat_ioctl32"), nothing in this file is actually getting used
as the only reference has been stubbed out.

Remove the entire file -- anyone willing to restore the functionality
can equally well just look up the contents in the git history if needed.

Cc: Sakari Ailus <sakari.ailus@linux.intel.com>
Cc: Hans Verkuil <hverkuil@xs4all.nl>
Suggested-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

---
This is the alternative approach for the patch, removing the already
dead code instead of just not compiling it.
---
 drivers/staging/media/atomisp/Makefile        |    1 -
 drivers/staging/media/atomisp/TODO            |    5 +
 .../atomisp/pci/atomisp_compat_ioctl32.c      | 1202 -----------------
 .../staging/media/atomisp/pci/atomisp_fops.c  |    8 +-
 4 files changed, 8 insertions(+), 1208 deletions(-)
 delete mode 100644 drivers/staging/media/atomisp/pci/atomisp_compat_ioctl32.c

-- 
2.27.0

Comments

Andy Shevchenko Oct. 7, 2020, 4:14 p.m. UTC | #1
On Wed, Oct 07, 2020 at 05:34:15PM +0200, Arnd Bergmann wrote:
> This is one of the last remaining users of compat_alloc_user_space()

> and copy_in_user(), which are in the process of getting removed.

> 

> As of commit 57e6b6f2303e ("media: atomisp_fops.c: disable

> atomisp_compat_ioctl32"), nothing in this file is actually getting used

> as the only reference has been stubbed out.

> 

> Remove the entire file -- anyone willing to restore the functionality

> can equally well just look up the contents in the git history if needed.


Good one!
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>


> Cc: Sakari Ailus <sakari.ailus@linux.intel.com>

> Cc: Hans Verkuil <hverkuil@xs4all.nl>

> Suggested-by: Christoph Hellwig <hch@lst.de>

> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

> ---

> This is the alternative approach for the patch, removing the already

> dead code instead of just not compiling it.

> ---

>  drivers/staging/media/atomisp/Makefile        |    1 -

>  drivers/staging/media/atomisp/TODO            |    5 +

>  .../atomisp/pci/atomisp_compat_ioctl32.c      | 1202 -----------------

>  .../staging/media/atomisp/pci/atomisp_fops.c  |    8 +-

>  4 files changed, 8 insertions(+), 1208 deletions(-)

>  delete mode 100644 drivers/staging/media/atomisp/pci/atomisp_compat_ioctl32.c

> 

> diff --git a/drivers/staging/media/atomisp/Makefile b/drivers/staging/media/atomisp/Makefile

> index 1dfad0dd02d0..3bbd4bf4408c 100644

> --- a/drivers/staging/media/atomisp/Makefile

> +++ b/drivers/staging/media/atomisp/Makefile

> @@ -16,7 +16,6 @@ atomisp-objs += \

>  	pci/atomisp_acc.o \

>  	pci/atomisp_cmd.o \

>  	pci/atomisp_compat_css20.o \

> -	pci/atomisp_compat_ioctl32.o \

>  	pci/atomisp_csi2.o \

>  	pci/atomisp_drvfs.o \

>  	pci/atomisp_file.o \

> diff --git a/drivers/staging/media/atomisp/TODO b/drivers/staging/media/atomisp/TODO

> index 6987bb2d32cf..2d1ef9eb262a 100644

> --- a/drivers/staging/media/atomisp/TODO

> +++ b/drivers/staging/media/atomisp/TODO

> @@ -120,6 +120,11 @@ TODO

>      for this driver until the other work is done, as there will be a lot

>      of code churn until this driver becomes functional again.

>  

> +16. Fix private ioctls to not need a compat_ioctl handler for running

> +    32-bit tasks. The compat code has been removed because of bugs,

> +    and should not be needed for modern drivers. Fixing this properly

> +    unfortunately means an incompatible ABI change.

> +

>  Limitations

>  ===========

>  

> diff --git a/drivers/staging/media/atomisp/pci/atomisp_compat_ioctl32.c b/drivers/staging/media/atomisp/pci/atomisp_compat_ioctl32.c

> deleted file mode 100644

> index e5553df5bad4..000000000000

> --- a/drivers/staging/media/atomisp/pci/atomisp_compat_ioctl32.c

> +++ /dev/null

> @@ -1,1202 +0,0 @@

> -// SPDX-License-Identifier: GPL-2.0

> -/*

> - * Support for Intel Camera Imaging ISP subsystem.

> - *

> - * Copyright (c) 2013 Intel Corporation. All Rights Reserved.

> - *

> - * This program is free software; you can redistribute it and/or

> - * modify it under the terms of the GNU General Public License version

> - * 2 as published by the Free Software Foundation.

> - *

> - * This program is distributed in the hope that it will be useful,

> - * but WITHOUT ANY WARRANTY; without even the implied warranty of

> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

> - * GNU General Public License for more details.

> - *

> - *

> - */

> -#ifdef CONFIG_COMPAT

> -#include <linux/compat.h>

> -

> -#include <linux/videodev2.h>

> -

> -#include "atomisp_internal.h"

> -#include "atomisp_compat.h"

> -#include "atomisp_ioctl.h"

> -#include "atomisp_compat_ioctl32.h"

> -

> -/* Macros borrowed from v4l2-compat-ioctl32.c */

> -

> -#define get_user_cast(__x, __ptr)					\

> -({									\

> -	get_user(__x, (typeof(*__ptr) __user *)(__ptr));		\

> -})

> -

> -#define put_user_force(__x, __ptr)					\

> -({									\

> -	put_user((typeof(*__x) __force *)(__x), __ptr);			\

> -})

> -

> -/* Use the same argument order as copy_in_user */

> -#define assign_in_user(to, from)					\

> -({									\

> -	typeof(*from) __assign_tmp;					\

> -									\

> -	get_user_cast(__assign_tmp, from) || put_user(__assign_tmp, to);\

> -})

> -

> -static int get_atomisp_histogram32(struct atomisp_histogram __user *kp,

> -				   struct atomisp_histogram32 __user *up)

> -{

> -	compat_uptr_t tmp;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_histogram32)) ||

> -	    assign_in_user(&kp->num_elements, &up->num_elements) ||

> -	    get_user(tmp, &up->data) ||

> -	    put_user(compat_ptr(tmp), &kp->data))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int put_atomisp_histogram32(struct atomisp_histogram __user *kp,

> -				   struct atomisp_histogram32 __user *up)

> -{

> -	void __user *tmp;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_histogram32)) ||

> -	    assign_in_user(&up->num_elements, &kp->num_elements) ||

> -	    get_user(tmp, &kp->data) ||

> -	    put_user(ptr_to_compat(tmp), &up->data))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int get_v4l2_framebuffer32(struct v4l2_framebuffer __user *kp,

> -				  struct v4l2_framebuffer32 __user *up)

> -{

> -	compat_uptr_t tmp;

> -

> -	if (!access_ok(up, sizeof(struct v4l2_framebuffer32)) ||

> -	    get_user(tmp, &up->base) ||

> -	    put_user_force(compat_ptr(tmp), &kp->base) ||

> -	    assign_in_user(&kp->capability, &up->capability) ||

> -	    assign_in_user(&kp->flags, &up->flags) ||

> -	    copy_in_user(&kp->fmt, &up->fmt, sizeof(kp->fmt)))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int get_atomisp_dis_statistics32(struct atomisp_dis_statistics __user *kp,

> -					struct atomisp_dis_statistics32 __user *up)

> -{

> -	compat_uptr_t hor_prod_odd_real;

> -	compat_uptr_t hor_prod_odd_imag;

> -	compat_uptr_t hor_prod_even_real;

> -	compat_uptr_t hor_prod_even_imag;

> -	compat_uptr_t ver_prod_odd_real;

> -	compat_uptr_t ver_prod_odd_imag;

> -	compat_uptr_t ver_prod_even_real;

> -	compat_uptr_t ver_prod_even_imag;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_dis_statistics32)) ||

> -	    copy_in_user(kp, up, sizeof(struct atomisp_dvs_grid_info)) ||

> -	    get_user(hor_prod_odd_real,

> -		     &up->dvs2_stat.hor_prod.odd_real) ||

> -	    get_user(hor_prod_odd_imag,

> -		     &up->dvs2_stat.hor_prod.odd_imag) ||

> -	    get_user(hor_prod_even_real,

> -		     &up->dvs2_stat.hor_prod.even_real) ||

> -	    get_user(hor_prod_even_imag,

> -		     &up->dvs2_stat.hor_prod.even_imag) ||

> -	    get_user(ver_prod_odd_real,

> -		     &up->dvs2_stat.ver_prod.odd_real) ||

> -	    get_user(ver_prod_odd_imag,

> -		     &up->dvs2_stat.ver_prod.odd_imag) ||

> -	    get_user(ver_prod_even_real,

> -		     &up->dvs2_stat.ver_prod.even_real) ||

> -	    get_user(ver_prod_even_imag,

> -		     &up->dvs2_stat.ver_prod.even_imag) ||

> -	    assign_in_user(&kp->exp_id, &up->exp_id) ||

> -	    put_user(compat_ptr(hor_prod_odd_real),

> -		     &kp->dvs2_stat.hor_prod.odd_real) ||

> -	    put_user(compat_ptr(hor_prod_odd_imag),

> -		     &kp->dvs2_stat.hor_prod.odd_imag) ||

> -	    put_user(compat_ptr(hor_prod_even_real),

> -		     &kp->dvs2_stat.hor_prod.even_real) ||

> -	    put_user(compat_ptr(hor_prod_even_imag),

> -		     &kp->dvs2_stat.hor_prod.even_imag) ||

> -	    put_user(compat_ptr(ver_prod_odd_real),

> -		     &kp->dvs2_stat.ver_prod.odd_real) ||

> -	    put_user(compat_ptr(ver_prod_odd_imag),

> -		     &kp->dvs2_stat.ver_prod.odd_imag) ||

> -	    put_user(compat_ptr(ver_prod_even_real),

> -		     &kp->dvs2_stat.ver_prod.even_real) ||

> -	    put_user(compat_ptr(ver_prod_even_imag),

> -		     &kp->dvs2_stat.ver_prod.even_imag))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int put_atomisp_dis_statistics32(struct atomisp_dis_statistics __user *kp,

> -					struct atomisp_dis_statistics32 __user *up)

> -{

> -	void __user *hor_prod_odd_real;

> -	void __user *hor_prod_odd_imag;

> -	void __user *hor_prod_even_real;

> -	void __user *hor_prod_even_imag;

> -	void __user *ver_prod_odd_real;

> -	void __user *ver_prod_odd_imag;

> -	void __user *ver_prod_even_real;

> -	void __user *ver_prod_even_imag;

> -

> -	if (!!access_ok(up, sizeof(struct atomisp_dis_statistics32)) ||

> -	    copy_in_user(up, kp, sizeof(struct atomisp_dvs_grid_info)) ||

> -	    get_user(hor_prod_odd_real,

> -		     &kp->dvs2_stat.hor_prod.odd_real) ||

> -	    get_user(hor_prod_odd_imag,

> -		     &kp->dvs2_stat.hor_prod.odd_imag) ||

> -	    get_user(hor_prod_even_real,

> -		     &kp->dvs2_stat.hor_prod.even_real) ||

> -	    get_user(hor_prod_even_imag,

> -		     &kp->dvs2_stat.hor_prod.even_imag) ||

> -	    get_user(ver_prod_odd_real,

> -		     &kp->dvs2_stat.ver_prod.odd_real) ||

> -	    get_user(ver_prod_odd_imag,

> -		     &kp->dvs2_stat.ver_prod.odd_imag) ||

> -	    get_user(ver_prod_even_real,

> -		     &kp->dvs2_stat.ver_prod.even_real) ||

> -	    get_user(ver_prod_even_imag,

> -		     &kp->dvs2_stat.ver_prod.even_imag) ||

> -	    put_user(ptr_to_compat(hor_prod_odd_real),

> -		     &up->dvs2_stat.hor_prod.odd_real) ||

> -	    put_user(ptr_to_compat(hor_prod_odd_imag),

> -		     &up->dvs2_stat.hor_prod.odd_imag) ||

> -	    put_user(ptr_to_compat(hor_prod_even_real),

> -		     &up->dvs2_stat.hor_prod.even_real) ||

> -	    put_user(ptr_to_compat(hor_prod_even_imag),

> -		     &up->dvs2_stat.hor_prod.even_imag) ||

> -	    put_user(ptr_to_compat(ver_prod_odd_real),

> -		     &up->dvs2_stat.ver_prod.odd_real) ||

> -	    put_user(ptr_to_compat(ver_prod_odd_imag),

> -		     &up->dvs2_stat.ver_prod.odd_imag) ||

> -	    put_user(ptr_to_compat(ver_prod_even_real),

> -		     &up->dvs2_stat.ver_prod.even_real) ||

> -	    put_user(ptr_to_compat(ver_prod_even_imag),

> -		     &up->dvs2_stat.ver_prod.even_imag) ||

> -	    assign_in_user(&up->exp_id, &kp->exp_id))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int get_atomisp_dis_coefficients32(struct atomisp_dis_coefficients __user *kp,

> -					  struct atomisp_dis_coefficients32 __user *up)

> -{

> -	compat_uptr_t hor_coefs_odd_real;

> -	compat_uptr_t hor_coefs_odd_imag;

> -	compat_uptr_t hor_coefs_even_real;

> -	compat_uptr_t hor_coefs_even_imag;

> -	compat_uptr_t ver_coefs_odd_real;

> -	compat_uptr_t ver_coefs_odd_imag;

> -	compat_uptr_t ver_coefs_even_real;

> -	compat_uptr_t ver_coefs_even_imag;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_dis_coefficients32)) ||

> -	    copy_in_user(kp, up, sizeof(struct atomisp_dvs_grid_info)) ||

> -	    get_user(hor_coefs_odd_real, &up->hor_coefs.odd_real) ||

> -	    get_user(hor_coefs_odd_imag, &up->hor_coefs.odd_imag) ||

> -	    get_user(hor_coefs_even_real, &up->hor_coefs.even_real) ||

> -	    get_user(hor_coefs_even_imag, &up->hor_coefs.even_imag) ||

> -	    get_user(ver_coefs_odd_real, &up->ver_coefs.odd_real) ||

> -	    get_user(ver_coefs_odd_imag, &up->ver_coefs.odd_imag) ||

> -	    get_user(ver_coefs_even_real, &up->ver_coefs.even_real) ||

> -	    get_user(ver_coefs_even_imag, &up->ver_coefs.even_imag) ||

> -	    put_user(compat_ptr(hor_coefs_odd_real),

> -		     &kp->hor_coefs.odd_real) ||

> -	    put_user(compat_ptr(hor_coefs_odd_imag),

> -		     &kp->hor_coefs.odd_imag) ||

> -	    put_user(compat_ptr(hor_coefs_even_real),

> -		     &kp->hor_coefs.even_real) ||

> -	    put_user(compat_ptr(hor_coefs_even_imag),

> -		     &kp->hor_coefs.even_imag) ||

> -	    put_user(compat_ptr(ver_coefs_odd_real),

> -		     &kp->ver_coefs.odd_real) ||

> -	    put_user(compat_ptr(ver_coefs_odd_imag),

> -		     &kp->ver_coefs.odd_imag) ||

> -	    put_user(compat_ptr(ver_coefs_even_real),

> -		     &kp->ver_coefs.even_real) ||

> -	    put_user(compat_ptr(ver_coefs_even_imag),

> -		     &kp->ver_coefs.even_imag))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int get_atomisp_dvs_6axis_config32(struct atomisp_dvs_6axis_config __user *kp,

> -					  struct atomisp_dvs_6axis_config32 __user *up)

> -{

> -	compat_uptr_t xcoords_y;

> -	compat_uptr_t ycoords_y;

> -	compat_uptr_t xcoords_uv;

> -	compat_uptr_t ycoords_uv;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_dvs_6axis_config32)) ||

> -	    assign_in_user(&kp->exp_id, &up->exp_id) ||

> -	    assign_in_user(&kp->width_y, &up->width_y) ||

> -	    assign_in_user(&kp->height_y, &up->height_y) ||

> -	    assign_in_user(&kp->width_uv, &up->width_uv) ||

> -	    assign_in_user(&kp->height_uv, &up->height_uv) ||

> -	    get_user(xcoords_y, &up->xcoords_y) ||

> -	    get_user(ycoords_y, &up->ycoords_y) ||

> -	    get_user(xcoords_uv, &up->xcoords_uv) ||

> -	    get_user(ycoords_uv, &up->ycoords_uv) ||

> -	    put_user_force(compat_ptr(xcoords_y), &kp->xcoords_y) ||

> -	    put_user_force(compat_ptr(ycoords_y), &kp->ycoords_y) ||

> -	    put_user_force(compat_ptr(xcoords_uv), &kp->xcoords_uv) ||

> -	    put_user_force(compat_ptr(ycoords_uv), &kp->ycoords_uv))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int get_atomisp_3a_statistics32(struct atomisp_3a_statistics __user *kp,

> -				       struct atomisp_3a_statistics32 __user *up)

> -{

> -	compat_uptr_t data;

> -	compat_uptr_t rgby_data;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_3a_statistics32)) ||

> -	    copy_in_user(kp, up, sizeof(struct atomisp_grid_info)) ||

> -	    get_user(rgby_data, &up->rgby_data) ||

> -	    put_user(compat_ptr(rgby_data), &kp->rgby_data) ||

> -	    get_user(data, &up->data) ||

> -	    put_user(compat_ptr(data), &kp->data) ||

> -	    assign_in_user(&kp->exp_id, &up->exp_id) ||

> -	    assign_in_user(&kp->isp_config_id, &up->isp_config_id))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int put_atomisp_3a_statistics32(struct atomisp_3a_statistics __user *kp,

> -				       struct atomisp_3a_statistics32 __user *up)

> -{

> -	void __user *data;

> -	void __user *rgby_data;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_3a_statistics32)) ||

> -	    copy_in_user(up, kp, sizeof(struct atomisp_grid_info)) ||

> -	    get_user(rgby_data, &kp->rgby_data) ||

> -	    put_user(ptr_to_compat(rgby_data), &up->rgby_data) ||

> -	    get_user(data, &kp->data) ||

> -	    put_user(ptr_to_compat(data), &up->data) ||

> -	    assign_in_user(&up->exp_id, &kp->exp_id) ||

> -	    assign_in_user(&up->isp_config_id, &kp->isp_config_id))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int get_atomisp_metadata_stat32(struct atomisp_metadata __user *kp,

> -				       struct atomisp_metadata32 __user *up)

> -{

> -	compat_uptr_t data;

> -	compat_uptr_t effective_width;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_metadata32)) ||

> -	    get_user(data, &up->data) ||

> -	    put_user(compat_ptr(data), &kp->data) ||

> -	    assign_in_user(&kp->width, &up->width) ||

> -	    assign_in_user(&kp->height, &up->height) ||

> -	    assign_in_user(&kp->stride, &up->stride) ||

> -	    assign_in_user(&kp->exp_id, &up->exp_id) ||

> -	    get_user(effective_width, &up->effective_width) ||

> -	    put_user_force(compat_ptr(effective_width), &kp->effective_width))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int put_atomisp_metadata_stat32(struct atomisp_metadata __user *kp,

> -				struct atomisp_metadata32 __user *up)

> -{

> -	void __user *data;

> -	void *effective_width;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_metadata32)) ||

> -	    get_user(data, &kp->data) ||

> -	    put_user(ptr_to_compat(data), &up->data) ||

> -	    assign_in_user(&up->width, &kp->width) ||

> -	    assign_in_user(&up->height, &kp->height) ||

> -	    assign_in_user(&up->stride, &kp->stride) ||

> -	    assign_in_user(&up->exp_id, &kp->exp_id) ||

> -	    get_user(effective_width, &kp->effective_width) ||

> -	    put_user(ptr_to_compat((void __user *)effective_width),

> -				   &up->effective_width))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int

> -put_atomisp_metadata_by_type_stat32(struct atomisp_metadata_with_type __user *kp,

> -				    struct atomisp_metadata_with_type32 __user *up)

> -{

> -	void __user *data;

> -	u32 *effective_width;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_metadata_with_type32)) ||

> -	    get_user(data, &kp->data) ||

> -	    put_user(ptr_to_compat(data), &up->data) ||

> -	    assign_in_user(&up->width, &kp->width) ||

> -	    assign_in_user(&up->height, &kp->height) ||

> -	    assign_in_user(&up->stride, &kp->stride) ||

> -	    assign_in_user(&up->exp_id, &kp->exp_id) ||

> -	    get_user(effective_width, &kp->effective_width) ||

> -	    put_user(ptr_to_compat((void __user *)effective_width),

> -		     &up->effective_width) ||

> -	    assign_in_user(&up->type, &kp->type))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int

> -get_atomisp_metadata_by_type_stat32(struct atomisp_metadata_with_type __user *kp,

> -				    struct atomisp_metadata_with_type32 __user *up)

> -{

> -	compat_uptr_t data;

> -	compat_uptr_t effective_width;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_metadata_with_type32)) ||

> -	    get_user(data, &up->data) ||

> -	    put_user(compat_ptr(data), &kp->data) ||

> -	    assign_in_user(&kp->width, &up->width) ||

> -	    assign_in_user(&kp->height, &up->height) ||

> -	    assign_in_user(&kp->stride, &up->stride) ||

> -	    assign_in_user(&kp->exp_id, &up->exp_id) ||

> -	    get_user(effective_width, &up->effective_width) ||

> -	    put_user_force(compat_ptr(effective_width), &kp->effective_width) ||

> -	    assign_in_user(&kp->type, &up->type))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int

> -get_atomisp_morph_table32(struct atomisp_morph_table __user *kp,

> -			  struct atomisp_morph_table32 __user *up)

> -{

> -	unsigned int n = ATOMISP_MORPH_TABLE_NUM_PLANES;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_morph_table32)) ||

> -		assign_in_user(&kp->enabled, &up->enabled) ||

> -		assign_in_user(&kp->width, &up->width) ||

> -		assign_in_user(&kp->height, &up->height))

> -			return -EFAULT;

> -

> -	while (n-- > 0) {

> -		compat_uptr_t coord_kp;

> -

> -		if (get_user(coord_kp, &up->coordinates_x[n]) ||

> -		    put_user(compat_ptr(coord_kp), &kp->coordinates_x[n]) ||

> -		    get_user(coord_kp, &up->coordinates_y[n]) ||

> -		    put_user(compat_ptr(coord_kp), &kp->coordinates_y[n]))

> -			return -EFAULT;

> -	}

> -	return 0;

> -}

> -

> -static int put_atomisp_morph_table32(struct atomisp_morph_table __user *kp,

> -				     struct atomisp_morph_table32 __user *up)

> -{

> -	unsigned int n = ATOMISP_MORPH_TABLE_NUM_PLANES;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_morph_table32)) ||

> -		assign_in_user(&up->enabled, &kp->enabled) ||

> -		assign_in_user(&up->width, &kp->width) ||

> -		assign_in_user(&up->height, &kp->height))

> -			return -EFAULT;

> -

> -	while (n-- > 0) {

> -		void __user *coord_kp;

> -

> -		if (get_user(coord_kp, &kp->coordinates_x[n]) ||

> -		    put_user(ptr_to_compat(coord_kp), &up->coordinates_x[n]) ||

> -		    get_user(coord_kp, &kp->coordinates_y[n]) ||

> -		    put_user(ptr_to_compat(coord_kp), &up->coordinates_y[n]))

> -			return -EFAULT;

> -	}

> -	return 0;

> -}

> -

> -static int get_atomisp_overlay32(struct atomisp_overlay __user *kp,

> -				 struct atomisp_overlay32 __user *up)

> -{

> -	compat_uptr_t frame;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_overlay32)) ||

> -	    get_user(frame, &up->frame) ||

> -	    put_user_force(compat_ptr(frame), &kp->frame) ||

> -	    assign_in_user(&kp->bg_y, &up->bg_y) ||

> -	    assign_in_user(&kp->bg_u, &up->bg_u) ||

> -	    assign_in_user(&kp->bg_v, &up->bg_v) ||

> -	    assign_in_user(&kp->blend_input_perc_y,

> -			   &up->blend_input_perc_y) ||

> -	    assign_in_user(&kp->blend_input_perc_u,

> -			   &up->blend_input_perc_u) ||

> -	    assign_in_user(&kp->blend_input_perc_v,

> -			   &up->blend_input_perc_v) ||

> -	    assign_in_user(&kp->blend_overlay_perc_y,

> -			   &up->blend_overlay_perc_y) ||

> -	    assign_in_user(&kp->blend_overlay_perc_u,

> -			   &up->blend_overlay_perc_u) ||

> -	    assign_in_user(&kp->blend_overlay_perc_v,

> -			   &up->blend_overlay_perc_v) ||

> -	    assign_in_user(&kp->overlay_start_x, &up->overlay_start_x) ||

> -	    assign_in_user(&kp->overlay_start_y, &up->overlay_start_y))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int put_atomisp_overlay32(struct atomisp_overlay __user *kp,

> -				 struct atomisp_overlay32 __user *up)

> -{

> -	void *frame;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_overlay32)) ||

> -	    get_user(frame, &kp->frame) ||

> -	    put_user(ptr_to_compat((void __user *)frame), &up->frame) ||

> -	    assign_in_user(&up->bg_y, &kp->bg_y) ||

> -	    assign_in_user(&up->bg_u, &kp->bg_u) ||

> -	    assign_in_user(&up->bg_v, &kp->bg_v) ||

> -	    assign_in_user(&up->blend_input_perc_y,

> -			   &kp->blend_input_perc_y) ||

> -	    assign_in_user(&up->blend_input_perc_u,

> -			   &kp->blend_input_perc_u) ||

> -	    assign_in_user(&up->blend_input_perc_v,

> -			   &kp->blend_input_perc_v) ||

> -	    assign_in_user(&up->blend_overlay_perc_y,

> -			   &kp->blend_overlay_perc_y) ||

> -	    assign_in_user(&up->blend_overlay_perc_u,

> -			   &kp->blend_overlay_perc_u) ||

> -	    assign_in_user(&up->blend_overlay_perc_v,

> -			   &kp->blend_overlay_perc_v) ||

> -	    assign_in_user(&up->overlay_start_x, &kp->overlay_start_x) ||

> -	    assign_in_user(&up->overlay_start_y, &kp->overlay_start_y))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int

> -get_atomisp_calibration_group32(struct atomisp_calibration_group __user *kp,

> -				struct atomisp_calibration_group32 __user *up)

> -{

> -	compat_uptr_t calb_grp_values;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_calibration_group32)) ||

> -	    assign_in_user(&kp->size, &up->size) ||

> -	    assign_in_user(&kp->type, &up->type) ||

> -	    get_user(calb_grp_values, &up->calb_grp_values) ||

> -	    put_user_force(compat_ptr(calb_grp_values), &kp->calb_grp_values))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int

> -put_atomisp_calibration_group32(struct atomisp_calibration_group __user *kp,

> -				struct atomisp_calibration_group32 __user *up)

> -{

> -	void *calb_grp_values;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_calibration_group32)) ||

> -	    assign_in_user(&up->size, &kp->size) ||

> -	    assign_in_user(&up->type, &kp->type) ||

> -	    get_user(calb_grp_values, &kp->calb_grp_values) ||

> -	    put_user(ptr_to_compat((void __user *)calb_grp_values),

> -		     &up->calb_grp_values))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int get_atomisp_acc_fw_load32(struct atomisp_acc_fw_load __user *kp,

> -				     struct atomisp_acc_fw_load32 __user *up)

> -{

> -	compat_uptr_t data;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_acc_fw_load32)) ||

> -	    assign_in_user(&kp->size, &up->size) ||

> -	    assign_in_user(&kp->fw_handle, &up->fw_handle) ||

> -	    get_user_cast(data, &up->data) ||

> -	    put_user(compat_ptr(data), &kp->data))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int put_atomisp_acc_fw_load32(struct atomisp_acc_fw_load __user *kp,

> -				     struct atomisp_acc_fw_load32 __user *up)

> -{

> -	void __user *data;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_acc_fw_load32)) ||

> -	    assign_in_user(&up->size, &kp->size) ||

> -	    assign_in_user(&up->fw_handle, &kp->fw_handle) ||

> -	    get_user(data, &kp->data) ||

> -	    put_user(ptr_to_compat(data), &up->data))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int get_atomisp_acc_fw_arg32(struct atomisp_acc_fw_arg __user *kp,

> -				    struct atomisp_acc_fw_arg32 __user *up)

> -{

> -	compat_uptr_t value;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_acc_fw_arg32)) ||

> -	    assign_in_user(&kp->fw_handle, &up->fw_handle) ||

> -	    assign_in_user(&kp->index, &up->index) ||

> -	    get_user(value, &up->value) ||

> -	    put_user(compat_ptr(value), &kp->value) ||

> -	    assign_in_user(&kp->size, &up->size))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int put_atomisp_acc_fw_arg32(struct atomisp_acc_fw_arg __user *kp,

> -				    struct atomisp_acc_fw_arg32 __user *up)

> -{

> -	void __user *value;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_acc_fw_arg32)) ||

> -	    assign_in_user(&up->fw_handle, &kp->fw_handle) ||

> -	    assign_in_user(&up->index, &kp->index) ||

> -	    get_user(value, &kp->value) ||

> -	    put_user(ptr_to_compat(value), &up->value) ||

> -	    assign_in_user(&up->size, &kp->size))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int get_v4l2_private_int_data32(struct v4l2_private_int_data __user *kp,

> -				       struct v4l2_private_int_data32 __user *up)

> -{

> -	compat_uptr_t data;

> -

> -	if (!access_ok(up, sizeof(struct v4l2_private_int_data32)) ||

> -	    assign_in_user(&kp->size, &up->size) ||

> -	    get_user(data, &up->data) ||

> -	    put_user(compat_ptr(data), &kp->data) ||

> -	    assign_in_user(&kp->reserved[0], &up->reserved[0]) ||

> -	    assign_in_user(&kp->reserved[1], &up->reserved[1]))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int put_v4l2_private_int_data32(struct v4l2_private_int_data __user *kp,

> -				       struct v4l2_private_int_data32 __user *up)

> -{

> -	void __user *data;

> -

> -	if (!access_ok(up, sizeof(struct v4l2_private_int_data32)) ||

> -	    assign_in_user(&up->size, &kp->size) ||

> -	    get_user(data, &kp->data) ||

> -	    put_user(ptr_to_compat(data), &up->data) ||

> -	    assign_in_user(&up->reserved[0], &kp->reserved[0]) ||

> -	    assign_in_user(&up->reserved[1], &kp->reserved[1]))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int get_atomisp_shading_table32(struct atomisp_shading_table __user *kp,

> -				       struct atomisp_shading_table32 __user *up)

> -{

> -	unsigned int n = ATOMISP_NUM_SC_COLORS;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_shading_table32)) ||

> -	    assign_in_user(&kp->enable, &up->enable) ||

> -	    assign_in_user(&kp->sensor_width, &up->sensor_width) ||

> -	    assign_in_user(&kp->sensor_height, &up->sensor_height) ||

> -	    assign_in_user(&kp->width, &up->width) ||

> -	    assign_in_user(&kp->height, &up->height) ||

> -	    assign_in_user(&kp->fraction_bits, &up->fraction_bits))

> -		return -EFAULT;

> -

> -	while (n-- > 0) {

> -		compat_uptr_t tmp;

> -

> -		if (get_user(tmp, &up->data[n]) ||

> -		    put_user_force(compat_ptr(tmp), &kp->data[n]))

> -			return -EFAULT;

> -	}

> -	return 0;

> -}

> -

> -static int get_atomisp_acc_map32(struct atomisp_acc_map __user *kp,

> -				 struct atomisp_acc_map32 __user *up)

> -{

> -	compat_uptr_t user_ptr;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_acc_map32)) ||

> -	    assign_in_user(&kp->flags, &up->flags) ||

> -	    assign_in_user(&kp->length, &up->length) ||

> -	    get_user(user_ptr, &up->user_ptr) ||

> -	    put_user(compat_ptr(user_ptr), &kp->user_ptr) ||

> -	    assign_in_user(&kp->css_ptr, &up->css_ptr) ||

> -	    assign_in_user(&kp->reserved[0], &up->reserved[0]) ||

> -	    assign_in_user(&kp->reserved[1], &up->reserved[1]) ||

> -	    assign_in_user(&kp->reserved[2], &up->reserved[2]) ||

> -	    assign_in_user(&kp->reserved[3], &up->reserved[3]))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int put_atomisp_acc_map32(struct atomisp_acc_map __user *kp,

> -				 struct atomisp_acc_map32 __user *up)

> -{

> -	void __user *user_ptr;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_acc_map32)) ||

> -	    assign_in_user(&up->flags, &kp->flags) ||

> -	    assign_in_user(&up->length, &kp->length) ||

> -	    get_user(user_ptr, &kp->user_ptr) ||

> -	    put_user(ptr_to_compat(user_ptr), &up->user_ptr) ||

> -	    assign_in_user(&up->css_ptr, &kp->css_ptr) ||

> -	    assign_in_user(&up->reserved[0], &kp->reserved[0]) ||

> -	    assign_in_user(&up->reserved[1], &kp->reserved[1]) ||

> -	    assign_in_user(&up->reserved[2], &kp->reserved[2]) ||

> -	    assign_in_user(&up->reserved[3], &kp->reserved[3]))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int

> -get_atomisp_acc_s_mapped_arg32(struct atomisp_acc_s_mapped_arg __user *kp,

> -			       struct atomisp_acc_s_mapped_arg32 __user *up)

> -{

> -	if (!access_ok(up, sizeof(struct atomisp_acc_s_mapped_arg32)) ||

> -	    assign_in_user(&kp->fw_handle, &up->fw_handle) ||

> -	    assign_in_user(&kp->memory, &up->memory) ||

> -	    assign_in_user(&kp->length, &up->length) ||

> -	    assign_in_user(&kp->css_ptr, &up->css_ptr))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int

> -put_atomisp_acc_s_mapped_arg32(struct atomisp_acc_s_mapped_arg __user *kp,

> -			       struct atomisp_acc_s_mapped_arg32 __user *up)

> -{

> -	if (!access_ok(up, sizeof(struct atomisp_acc_s_mapped_arg32)) ||

> -	    assign_in_user(&up->fw_handle, &kp->fw_handle) ||

> -	    assign_in_user(&up->memory, &kp->memory) ||

> -	    assign_in_user(&up->length, &kp->length) ||

> -	    assign_in_user(&up->css_ptr, &kp->css_ptr))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int get_atomisp_parameters32(struct atomisp_parameters __user *kp,

> -				    struct atomisp_parameters32 __user *up)

> -{

> -	int n = offsetof(struct atomisp_parameters32, output_frame) /

> -		sizeof(compat_uptr_t);

> -	compat_uptr_t stp, mtp, dcp, dscp;

> -	struct {

> -		struct atomisp_shading_table shading_table;

> -		struct atomisp_morph_table morph_table;

> -		struct atomisp_dis_coefficients dvs2_coefs;

> -		struct atomisp_dvs_6axis_config dvs_6axis_config;

> -	} __user *karg = (void __user *)(kp + 1);

> -

> -	if (!access_ok(up, sizeof(struct atomisp_parameters32)))

> -		return -EFAULT;

> -

> -	while (n >= 0) {

> -		compat_uptr_t __user *src = (compat_uptr_t __user *)up + n;

> -		void * __user *dst = (void * __user *)kp + n;

> -		compat_uptr_t tmp;

> -

> -		if (get_user_cast(tmp, src) || put_user_force(compat_ptr(tmp), dst))

> -			return -EFAULT;

> -		n--;

> -	}

> -

> -	if (assign_in_user(&kp->isp_config_id, &up->isp_config_id) ||

> -	    assign_in_user(&kp->per_frame_setting, &up->per_frame_setting) ||

> -	    get_user(stp, &up->shading_table) ||

> -	    get_user(mtp, &up->morph_table) ||

> -	    get_user(dcp, &up->dvs2_coefs) ||

> -	    get_user(dscp, &up->dvs_6axis_config))

> -		return -EFAULT;

> -

> -	/* handle shading table */

> -	if (stp && (get_atomisp_shading_table32(&karg->shading_table,

> -						compat_ptr(stp)) ||

> -		    put_user_force(&karg->shading_table, &kp->shading_table)))

> -		return -EFAULT;

> -

> -	/* handle morph table */

> -	if (mtp && (get_atomisp_morph_table32(&karg->morph_table,

> -					      compat_ptr(mtp)) ||

> -		    put_user_force(&karg->morph_table, &kp->morph_table)))

> -		return -EFAULT;

> -

> -	/* handle dvs2 coefficients */

> -	if (dcp && (get_atomisp_dis_coefficients32(&karg->dvs2_coefs,

> -						   compat_ptr(dcp)) ||

> -		    put_user_force(&karg->dvs2_coefs, &kp->dvs2_coefs)))

> -		return -EFAULT;

> -

> -	/* handle dvs 6axis configuration */

> -	if (dscp &&

> -	    (get_atomisp_dvs_6axis_config32(&karg->dvs_6axis_config,

> -					    compat_ptr(dscp)) ||

> -	     put_user_force(&karg->dvs_6axis_config, &kp->dvs_6axis_config)))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int

> -get_atomisp_acc_fw_load_to_pipe32(struct atomisp_acc_fw_load_to_pipe __user *kp,

> -				  struct atomisp_acc_fw_load_to_pipe32 __user *up)

> -{

> -	compat_uptr_t data;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_acc_fw_load_to_pipe32)) ||

> -	    assign_in_user(&kp->flags, &up->flags) ||

> -	    assign_in_user(&kp->fw_handle, &up->fw_handle) ||

> -	    assign_in_user(&kp->size, &up->size) ||

> -	    assign_in_user(&kp->type, &up->type) ||

> -	    assign_in_user(&kp->reserved[0], &up->reserved[0]) ||

> -	    assign_in_user(&kp->reserved[1], &up->reserved[1]) ||

> -	    assign_in_user(&kp->reserved[2], &up->reserved[2]) ||

> -	    get_user(data, &up->data) ||

> -	    put_user(compat_ptr(data), &kp->data))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int

> -put_atomisp_acc_fw_load_to_pipe32(struct atomisp_acc_fw_load_to_pipe __user *kp,

> -				  struct atomisp_acc_fw_load_to_pipe32 __user *up)

> -{

> -	void __user *data;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_acc_fw_load_to_pipe32)) ||

> -	    assign_in_user(&up->flags, &kp->flags) ||

> -	    assign_in_user(&up->fw_handle, &kp->fw_handle) ||

> -	    assign_in_user(&up->size, &kp->size) ||

> -	    assign_in_user(&up->type, &kp->type) ||

> -	    assign_in_user(&up->reserved[0], &kp->reserved[0]) ||

> -	    assign_in_user(&up->reserved[1], &kp->reserved[1]) ||

> -	    assign_in_user(&up->reserved[2], &kp->reserved[2]) ||

> -	    get_user(data, &kp->data) ||

> -	    put_user(ptr_to_compat(data), &up->data))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static int

> -get_atomisp_sensor_ae_bracketing_lut(struct atomisp_sensor_ae_bracketing_lut __user *kp,

> -				     struct atomisp_sensor_ae_bracketing_lut32 __user *up)

> -{

> -	compat_uptr_t lut;

> -

> -	if (!access_ok(up, sizeof(struct atomisp_sensor_ae_bracketing_lut32)) ||

> -	    assign_in_user(&kp->lut_size, &up->lut_size) ||

> -	    get_user(lut, &up->lut) ||

> -	    put_user_force(compat_ptr(lut), &kp->lut))

> -		return -EFAULT;

> -

> -	return 0;

> -}

> -

> -static long native_ioctl(struct file *file, unsigned int cmd, unsigned long arg)

> -{

> -	long ret = -ENOIOCTLCMD;

> -

> -	if (file->f_op->unlocked_ioctl)

> -		ret = file->f_op->unlocked_ioctl(file, cmd, arg);

> -

> -	return ret;

> -}

> -

> -static long atomisp_do_compat_ioctl(struct file *file,

> -				    unsigned int cmd, unsigned long arg)

> -{

> -	union {

> -		struct atomisp_histogram his;

> -		struct atomisp_dis_statistics dis_s;

> -		struct atomisp_dis_coefficients dis_c;

> -		struct atomisp_dvs_6axis_config dvs_c;

> -		struct atomisp_3a_statistics s3a_s;

> -		struct atomisp_morph_table mor_t;

> -		struct v4l2_framebuffer v4l2_buf;

> -		struct atomisp_overlay overlay;

> -		struct atomisp_calibration_group cal_grp;

> -		struct atomisp_acc_fw_load acc_fw_load;

> -		struct atomisp_acc_fw_arg acc_fw_arg;

> -		struct v4l2_private_int_data v4l2_pri_data;

> -		struct atomisp_shading_table shd_tbl;

> -		struct atomisp_acc_map acc_map;

> -		struct atomisp_acc_s_mapped_arg acc_map_arg;

> -		struct atomisp_parameters param;

> -		struct atomisp_acc_fw_load_to_pipe acc_fw_to_pipe;

> -		struct atomisp_metadata md;

> -		struct atomisp_metadata_with_type md_with_type;

> -		struct atomisp_sensor_ae_bracketing_lut lut;

> -	} __user *karg;

> -	void __user *up = compat_ptr(arg);

> -	long err = -ENOIOCTLCMD;

> -

> -	karg = compat_alloc_user_space(

> -		sizeof(*karg) + (cmd == ATOMISP_IOC_S_PARAMETERS32 ?

> -				 sizeof(struct atomisp_shading_table) +

> -				 sizeof(struct atomisp_morph_table) +

> -				 sizeof(struct atomisp_dis_coefficients) +

> -				 sizeof(struct atomisp_dvs_6axis_config) : 0));

> -	if (!karg)

> -		return -ENOMEM;

> -

> -	/* First, convert the command. */

> -	switch (cmd) {

> -	case ATOMISP_IOC_G_HISTOGRAM32:

> -		cmd = ATOMISP_IOC_G_HISTOGRAM;

> -		break;

> -	case ATOMISP_IOC_S_HISTOGRAM32:

> -		cmd = ATOMISP_IOC_S_HISTOGRAM;

> -		break;

> -	case ATOMISP_IOC_G_DIS_STAT32:

> -		cmd = ATOMISP_IOC_G_DIS_STAT;

> -		break;

> -	case ATOMISP_IOC_S_DIS_COEFS32:

> -		cmd = ATOMISP_IOC_S_DIS_COEFS;

> -		break;

> -	case ATOMISP_IOC_S_DIS_VECTOR32:

> -		cmd = ATOMISP_IOC_S_DIS_VECTOR;

> -		break;

> -	case ATOMISP_IOC_G_3A_STAT32:

> -		cmd = ATOMISP_IOC_G_3A_STAT;

> -		break;

> -	case ATOMISP_IOC_G_ISP_GDC_TAB32:

> -		cmd = ATOMISP_IOC_G_ISP_GDC_TAB;

> -		break;

> -	case ATOMISP_IOC_S_ISP_GDC_TAB32:

> -		cmd = ATOMISP_IOC_S_ISP_GDC_TAB;

> -		break;

> -	case ATOMISP_IOC_S_ISP_FPN_TABLE32:

> -		cmd = ATOMISP_IOC_S_ISP_FPN_TABLE;

> -		break;

> -	case ATOMISP_IOC_G_ISP_OVERLAY32:

> -		cmd = ATOMISP_IOC_G_ISP_OVERLAY;

> -		break;

> -	case ATOMISP_IOC_S_ISP_OVERLAY32:

> -		cmd = ATOMISP_IOC_S_ISP_OVERLAY;

> -		break;

> -	case ATOMISP_IOC_G_SENSOR_CALIBRATION_GROUP32:

> -		cmd = ATOMISP_IOC_G_SENSOR_CALIBRATION_GROUP;

> -		break;

> -	case ATOMISP_IOC_ACC_LOAD32:

> -		cmd = ATOMISP_IOC_ACC_LOAD;

> -		break;

> -	case ATOMISP_IOC_ACC_S_ARG32:

> -		cmd = ATOMISP_IOC_ACC_S_ARG;

> -		break;

> -	case ATOMISP_IOC_G_SENSOR_PRIV_INT_DATA32:

> -		cmd = ATOMISP_IOC_G_SENSOR_PRIV_INT_DATA;

> -		break;

> -	case ATOMISP_IOC_S_ISP_SHD_TAB32:

> -		cmd = ATOMISP_IOC_S_ISP_SHD_TAB;

> -		break;

> -	case ATOMISP_IOC_ACC_DESTAB32:

> -		cmd = ATOMISP_IOC_ACC_DESTAB;

> -		break;

> -	case ATOMISP_IOC_G_MOTOR_PRIV_INT_DATA32:

> -		cmd = ATOMISP_IOC_G_MOTOR_PRIV_INT_DATA;

> -		break;

> -	case ATOMISP_IOC_ACC_MAP32:

> -		cmd = ATOMISP_IOC_ACC_MAP;

> -		break;

> -	case ATOMISP_IOC_ACC_UNMAP32:

> -		cmd = ATOMISP_IOC_ACC_UNMAP;

> -		break;

> -	case ATOMISP_IOC_ACC_S_MAPPED_ARG32:

> -		cmd = ATOMISP_IOC_ACC_S_MAPPED_ARG;

> -		break;

> -	case ATOMISP_IOC_S_PARAMETERS32:

> -		cmd = ATOMISP_IOC_S_PARAMETERS;

> -		break;

> -	case ATOMISP_IOC_ACC_LOAD_TO_PIPE32:

> -		cmd = ATOMISP_IOC_ACC_LOAD_TO_PIPE;

> -		break;

> -	case ATOMISP_IOC_G_METADATA32:

> -		cmd = ATOMISP_IOC_G_METADATA;

> -		break;

> -	case ATOMISP_IOC_G_METADATA_BY_TYPE32:

> -		cmd = ATOMISP_IOC_G_METADATA_BY_TYPE;

> -		break;

> -	case ATOMISP_IOC_S_SENSOR_AE_BRACKETING_LUT32:

> -		cmd = ATOMISP_IOC_S_SENSOR_AE_BRACKETING_LUT;

> -		break;

> -	}

> -

> -	switch (cmd) {

> -	case ATOMISP_IOC_G_HISTOGRAM:

> -	case ATOMISP_IOC_S_HISTOGRAM:

> -		err = get_atomisp_histogram32(&karg->his, up);

> -		break;

> -	case ATOMISP_IOC_G_DIS_STAT:

> -		err = get_atomisp_dis_statistics32(&karg->dis_s, up);

> -		break;

> -	case ATOMISP_IOC_S_DIS_COEFS:

> -		err = get_atomisp_dis_coefficients32(&karg->dis_c, up);

> -		break;

> -	case ATOMISP_IOC_S_DIS_VECTOR:

> -		err = get_atomisp_dvs_6axis_config32(&karg->dvs_c, up);

> -		break;

> -	case ATOMISP_IOC_G_3A_STAT:

> -		err = get_atomisp_3a_statistics32(&karg->s3a_s, up);

> -		break;

> -	case ATOMISP_IOC_G_ISP_GDC_TAB:

> -	case ATOMISP_IOC_S_ISP_GDC_TAB:

> -		err = get_atomisp_morph_table32(&karg->mor_t, up);

> -		break;

> -	case ATOMISP_IOC_S_ISP_FPN_TABLE:

> -		err = get_v4l2_framebuffer32(&karg->v4l2_buf, up);

> -		break;

> -	case ATOMISP_IOC_G_ISP_OVERLAY:

> -	case ATOMISP_IOC_S_ISP_OVERLAY:

> -		err = get_atomisp_overlay32(&karg->overlay, up);

> -		break;

> -	case ATOMISP_IOC_G_SENSOR_CALIBRATION_GROUP:

> -		err = get_atomisp_calibration_group32(&karg->cal_grp, up);

> -		break;

> -	case ATOMISP_IOC_ACC_LOAD:

> -		err = get_atomisp_acc_fw_load32(&karg->acc_fw_load, up);

> -		break;

> -	case ATOMISP_IOC_ACC_S_ARG:

> -	case ATOMISP_IOC_ACC_DESTAB:

> -		err = get_atomisp_acc_fw_arg32(&karg->acc_fw_arg, up);

> -		break;

> -	case ATOMISP_IOC_G_SENSOR_PRIV_INT_DATA:

> -	case ATOMISP_IOC_G_MOTOR_PRIV_INT_DATA:

> -		err = get_v4l2_private_int_data32(&karg->v4l2_pri_data, up);

> -		break;

> -	case ATOMISP_IOC_S_ISP_SHD_TAB:

> -		err = get_atomisp_shading_table32(&karg->shd_tbl, up);

> -		break;

> -	case ATOMISP_IOC_ACC_MAP:

> -	case ATOMISP_IOC_ACC_UNMAP:

> -		err = get_atomisp_acc_map32(&karg->acc_map, up);

> -		break;

> -	case ATOMISP_IOC_ACC_S_MAPPED_ARG:

> -		err = get_atomisp_acc_s_mapped_arg32(&karg->acc_map_arg, up);

> -		break;

> -	case ATOMISP_IOC_S_PARAMETERS:

> -		err = get_atomisp_parameters32(&karg->param, up);

> -		break;

> -	case ATOMISP_IOC_ACC_LOAD_TO_PIPE:

> -		err = get_atomisp_acc_fw_load_to_pipe32(&karg->acc_fw_to_pipe,

> -							up);

> -		break;

> -	case ATOMISP_IOC_G_METADATA:

> -		err = get_atomisp_metadata_stat32(&karg->md, up);

> -		break;

> -	case ATOMISP_IOC_G_METADATA_BY_TYPE:

> -		err = get_atomisp_metadata_by_type_stat32(&karg->md_with_type,

> -							  up);

> -		break;

> -	case ATOMISP_IOC_S_SENSOR_AE_BRACKETING_LUT:

> -		err = get_atomisp_sensor_ae_bracketing_lut(&karg->lut, up);

> -		break;

> -	}

> -	if (err)

> -		return err;

> -

> -	err = native_ioctl(file, cmd, (unsigned long)karg);

> -	if (err)

> -		return err;

> -

> -	switch (cmd) {

> -	case ATOMISP_IOC_G_HISTOGRAM:

> -		err = put_atomisp_histogram32(&karg->his, up);

> -		break;

> -	case ATOMISP_IOC_G_DIS_STAT:

> -		err = put_atomisp_dis_statistics32(&karg->dis_s, up);

> -		break;

> -	case ATOMISP_IOC_G_3A_STAT:

> -		err = put_atomisp_3a_statistics32(&karg->s3a_s, up);

> -		break;

> -	case ATOMISP_IOC_G_ISP_GDC_TAB:

> -		err = put_atomisp_morph_table32(&karg->mor_t, up);

> -		break;

> -	case ATOMISP_IOC_G_ISP_OVERLAY:

> -		err = put_atomisp_overlay32(&karg->overlay, up);

> -		break;

> -	case ATOMISP_IOC_G_SENSOR_CALIBRATION_GROUP:

> -		err = put_atomisp_calibration_group32(&karg->cal_grp, up);

> -		break;

> -	case ATOMISP_IOC_ACC_LOAD:

> -		err = put_atomisp_acc_fw_load32(&karg->acc_fw_load, up);

> -		break;

> -	case ATOMISP_IOC_ACC_S_ARG:

> -	case ATOMISP_IOC_ACC_DESTAB:

> -		err = put_atomisp_acc_fw_arg32(&karg->acc_fw_arg, up);

> -		break;

> -	case ATOMISP_IOC_G_SENSOR_PRIV_INT_DATA:

> -	case ATOMISP_IOC_G_MOTOR_PRIV_INT_DATA:

> -		err = put_v4l2_private_int_data32(&karg->v4l2_pri_data, up);

> -		break;

> -	case ATOMISP_IOC_ACC_MAP:

> -	case ATOMISP_IOC_ACC_UNMAP:

> -		err = put_atomisp_acc_map32(&karg->acc_map, up);

> -		break;

> -	case ATOMISP_IOC_ACC_S_MAPPED_ARG:

> -		err = put_atomisp_acc_s_mapped_arg32(&karg->acc_map_arg, up);

> -		break;

> -	case ATOMISP_IOC_ACC_LOAD_TO_PIPE:

> -		err = put_atomisp_acc_fw_load_to_pipe32(&karg->acc_fw_to_pipe,

> -							up);

> -		break;

> -	case ATOMISP_IOC_G_METADATA:

> -		err = put_atomisp_metadata_stat32(&karg->md, up);

> -		break;

> -	case ATOMISP_IOC_G_METADATA_BY_TYPE:

> -		err = put_atomisp_metadata_by_type_stat32(&karg->md_with_type,

> -							  up);

> -		break;

> -	}

> -

> -	return err;

> -}

> -

> -long atomisp_compat_ioctl32(struct file *file,

> -			    unsigned int cmd, unsigned long arg)

> -{

> -	struct video_device *vdev = video_devdata(file);

> -	struct atomisp_device *isp = video_get_drvdata(vdev);

> -	long ret = -ENOIOCTLCMD;

> -

> -	if (!file->f_op->unlocked_ioctl)

> -		return ret;

> -

> -	switch (cmd) {

> -	case ATOMISP_IOC_G_XNR:

> -	case ATOMISP_IOC_S_XNR:

> -	case ATOMISP_IOC_G_NR:

> -	case ATOMISP_IOC_S_NR:

> -	case ATOMISP_IOC_G_TNR:

> -	case ATOMISP_IOC_S_TNR:

> -	case ATOMISP_IOC_G_BLACK_LEVEL_COMP:

> -	case ATOMISP_IOC_S_BLACK_LEVEL_COMP:

> -	case ATOMISP_IOC_G_EE:

> -	case ATOMISP_IOC_S_EE:

> -	case ATOMISP_IOC_S_DIS_VECTOR:

> -	case ATOMISP_IOC_G_ISP_PARM:

> -	case ATOMISP_IOC_S_ISP_PARM:

> -	case ATOMISP_IOC_G_ISP_GAMMA:

> -	case ATOMISP_IOC_S_ISP_GAMMA:

> -	case ATOMISP_IOC_ISP_MAKERNOTE:

> -	case ATOMISP_IOC_G_ISP_MACC:

> -	case ATOMISP_IOC_S_ISP_MACC:

> -	case ATOMISP_IOC_G_ISP_BAD_PIXEL_DETECTION:

> -	case ATOMISP_IOC_S_ISP_BAD_PIXEL_DETECTION:

> -	case ATOMISP_IOC_G_ISP_FALSE_COLOR_CORRECTION:

> -	case ATOMISP_IOC_S_ISP_FALSE_COLOR_CORRECTION:

> -	case ATOMISP_IOC_G_ISP_CTC:

> -	case ATOMISP_IOC_S_ISP_CTC:

> -	case ATOMISP_IOC_G_ISP_WHITE_BALANCE:

> -	case ATOMISP_IOC_S_ISP_WHITE_BALANCE:

> -	case ATOMISP_IOC_CAMERA_BRIDGE:

> -	case ATOMISP_IOC_G_SENSOR_MODE_DATA:

> -	case ATOMISP_IOC_S_EXPOSURE:

> -	case ATOMISP_IOC_G_3A_CONFIG:

> -	case ATOMISP_IOC_S_3A_CONFIG:

> -	case ATOMISP_IOC_ACC_UNLOAD:

> -	case ATOMISP_IOC_ACC_START:

> -	case ATOMISP_IOC_ACC_WAIT:

> -	case ATOMISP_IOC_ACC_ABORT:

> -	case ATOMISP_IOC_G_ISP_GAMMA_CORRECTION:

> -	case ATOMISP_IOC_S_ISP_GAMMA_CORRECTION:

> -	case ATOMISP_IOC_S_CONT_CAPTURE_CONFIG:

> -	case ATOMISP_IOC_G_DVS2_BQ_RESOLUTIONS:

> -	case ATOMISP_IOC_EXT_ISP_CTRL:

> -	case ATOMISP_IOC_EXP_ID_UNLOCK:

> -	case ATOMISP_IOC_EXP_ID_CAPTURE:

> -	case ATOMISP_IOC_S_ENABLE_DZ_CAPT_PIPE:

> -	case ATOMISP_IOC_G_FORMATS_CONFIG:

> -	case ATOMISP_IOC_S_FORMATS_CONFIG:

> -	case ATOMISP_IOC_S_EXPOSURE_WINDOW:

> -	case ATOMISP_IOC_S_ACC_STATE:

> -	case ATOMISP_IOC_G_ACC_STATE:

> -	case ATOMISP_IOC_INJECT_A_FAKE_EVENT:

> -	case ATOMISP_IOC_G_SENSOR_AE_BRACKETING_INFO:

> -	case ATOMISP_IOC_S_SENSOR_AE_BRACKETING_MODE:

> -	case ATOMISP_IOC_G_SENSOR_AE_BRACKETING_MODE:

> -	case ATOMISP_IOC_G_INVALID_FRAME_NUM:

> -	case ATOMISP_IOC_S_ARRAY_RESOLUTION:

> -	case ATOMISP_IOC_S_SENSOR_RUNMODE:

> -	case ATOMISP_IOC_G_UPDATE_EXPOSURE:

> -		ret = native_ioctl(file, cmd, arg);

> -		break;

> -

> -	case ATOMISP_IOC_G_HISTOGRAM32:

> -	case ATOMISP_IOC_S_HISTOGRAM32:

> -	case ATOMISP_IOC_G_DIS_STAT32:

> -	case ATOMISP_IOC_S_DIS_COEFS32:

> -	case ATOMISP_IOC_S_DIS_VECTOR32:

> -	case ATOMISP_IOC_G_3A_STAT32:

> -	case ATOMISP_IOC_G_ISP_GDC_TAB32:

> -	case ATOMISP_IOC_S_ISP_GDC_TAB32:

> -	case ATOMISP_IOC_S_ISP_FPN_TABLE32:

> -	case ATOMISP_IOC_G_ISP_OVERLAY32:

> -	case ATOMISP_IOC_S_ISP_OVERLAY32:

> -	case ATOMISP_IOC_G_SENSOR_CALIBRATION_GROUP32:

> -	case ATOMISP_IOC_ACC_LOAD32:

> -	case ATOMISP_IOC_ACC_S_ARG32:

> -	case ATOMISP_IOC_G_SENSOR_PRIV_INT_DATA32:

> -	case ATOMISP_IOC_S_ISP_SHD_TAB32:

> -	case ATOMISP_IOC_ACC_DESTAB32:

> -	case ATOMISP_IOC_G_MOTOR_PRIV_INT_DATA32:

> -	case ATOMISP_IOC_ACC_MAP32:

> -	case ATOMISP_IOC_ACC_UNMAP32:

> -	case ATOMISP_IOC_ACC_S_MAPPED_ARG32:

> -	case ATOMISP_IOC_S_PARAMETERS32:

> -	case ATOMISP_IOC_ACC_LOAD_TO_PIPE32:

> -	case ATOMISP_IOC_G_METADATA32:

> -	case ATOMISP_IOC_G_METADATA_BY_TYPE32:

> -	case ATOMISP_IOC_S_SENSOR_AE_BRACKETING_LUT32:

> -		ret = atomisp_do_compat_ioctl(file, cmd, arg);

> -		break;

> -

> -	default:

> -		dev_warn(isp->dev,

> -			 "%s: unknown ioctl '%c', dir=%d, #%d (0x%08x)\n",

> -			 __func__, _IOC_TYPE(cmd), _IOC_DIR(cmd), _IOC_NR(cmd),

> -			 cmd);

> -		break;

> -	}

> -	return ret;

> -}

> -#endif /* CONFIG_COMPAT */

> diff --git a/drivers/staging/media/atomisp/pci/atomisp_fops.c b/drivers/staging/media/atomisp/pci/atomisp_fops.c

> index 453bb6913550..b2d85b585cf9 100644

> --- a/drivers/staging/media/atomisp/pci/atomisp_fops.c

> +++ b/drivers/staging/media/atomisp/pci/atomisp_fops.c

> @@ -1280,7 +1280,8 @@ const struct v4l2_file_operations atomisp_fops = {

>  	.unlocked_ioctl = video_ioctl2,

>  #ifdef CONFIG_COMPAT

>  	/*

> -	 * There are problems with this code. Disable this for now.

> +	 * this was removed because of bugs, the interface

> +	 * needs to be made safe for compat tasks instead.

>  	.compat_ioctl32 = atomisp_compat_ioctl32,

>  	 */

>  #endif

> @@ -1294,10 +1295,7 @@ const struct v4l2_file_operations atomisp_file_fops = {

>  	.mmap = atomisp_file_mmap,

>  	.unlocked_ioctl = video_ioctl2,

>  #ifdef CONFIG_COMPAT

> -	/*

> -	 * There are problems with this code. Disable this for now.

> -	.compat_ioctl32 = atomisp_compat_ioctl32,

> -	 */

> +	/* .compat_ioctl32 = atomisp_compat_ioctl32, */

>  #endif

>  	.poll = atomisp_poll,

>  };

> -- 

> 2.27.0

> 


-- 
With Best Regards,
Andy Shevchenko
diff mbox series

Patch

diff --git a/drivers/staging/media/atomisp/Makefile b/drivers/staging/media/atomisp/Makefile
index 1dfad0dd02d0..3bbd4bf4408c 100644
--- a/drivers/staging/media/atomisp/Makefile
+++ b/drivers/staging/media/atomisp/Makefile
@@ -16,7 +16,6 @@  atomisp-objs += \
 	pci/atomisp_acc.o \
 	pci/atomisp_cmd.o \
 	pci/atomisp_compat_css20.o \
-	pci/atomisp_compat_ioctl32.o \
 	pci/atomisp_csi2.o \
 	pci/atomisp_drvfs.o \
 	pci/atomisp_file.o \
diff --git a/drivers/staging/media/atomisp/TODO b/drivers/staging/media/atomisp/TODO
index 6987bb2d32cf..2d1ef9eb262a 100644
--- a/drivers/staging/media/atomisp/TODO
+++ b/drivers/staging/media/atomisp/TODO
@@ -120,6 +120,11 @@  TODO
     for this driver until the other work is done, as there will be a lot
     of code churn until this driver becomes functional again.
 
+16. Fix private ioctls to not need a compat_ioctl handler for running
+    32-bit tasks. The compat code has been removed because of bugs,
+    and should not be needed for modern drivers. Fixing this properly
+    unfortunately means an incompatible ABI change.
+
 Limitations
 ===========
 
diff --git a/drivers/staging/media/atomisp/pci/atomisp_compat_ioctl32.c b/drivers/staging/media/atomisp/pci/atomisp_compat_ioctl32.c
deleted file mode 100644
index e5553df5bad4..000000000000
--- a/drivers/staging/media/atomisp/pci/atomisp_compat_ioctl32.c
+++ /dev/null
@@ -1,1202 +0,0 @@ 
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Support for Intel Camera Imaging ISP subsystem.
- *
- * Copyright (c) 2013 Intel Corporation. All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version
- * 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- *
- */
-#ifdef CONFIG_COMPAT
-#include <linux/compat.h>
-
-#include <linux/videodev2.h>
-
-#include "atomisp_internal.h"
-#include "atomisp_compat.h"
-#include "atomisp_ioctl.h"
-#include "atomisp_compat_ioctl32.h"
-
-/* Macros borrowed from v4l2-compat-ioctl32.c */
-
-#define get_user_cast(__x, __ptr)					\
-({									\
-	get_user(__x, (typeof(*__ptr) __user *)(__ptr));		\
-})
-
-#define put_user_force(__x, __ptr)					\
-({									\
-	put_user((typeof(*__x) __force *)(__x), __ptr);			\
-})
-
-/* Use the same argument order as copy_in_user */
-#define assign_in_user(to, from)					\
-({									\
-	typeof(*from) __assign_tmp;					\
-									\
-	get_user_cast(__assign_tmp, from) || put_user(__assign_tmp, to);\
-})
-
-static int get_atomisp_histogram32(struct atomisp_histogram __user *kp,
-				   struct atomisp_histogram32 __user *up)
-{
-	compat_uptr_t tmp;
-
-	if (!access_ok(up, sizeof(struct atomisp_histogram32)) ||
-	    assign_in_user(&kp->num_elements, &up->num_elements) ||
-	    get_user(tmp, &up->data) ||
-	    put_user(compat_ptr(tmp), &kp->data))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int put_atomisp_histogram32(struct atomisp_histogram __user *kp,
-				   struct atomisp_histogram32 __user *up)
-{
-	void __user *tmp;
-
-	if (!access_ok(up, sizeof(struct atomisp_histogram32)) ||
-	    assign_in_user(&up->num_elements, &kp->num_elements) ||
-	    get_user(tmp, &kp->data) ||
-	    put_user(ptr_to_compat(tmp), &up->data))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int get_v4l2_framebuffer32(struct v4l2_framebuffer __user *kp,
-				  struct v4l2_framebuffer32 __user *up)
-{
-	compat_uptr_t tmp;
-
-	if (!access_ok(up, sizeof(struct v4l2_framebuffer32)) ||
-	    get_user(tmp, &up->base) ||
-	    put_user_force(compat_ptr(tmp), &kp->base) ||
-	    assign_in_user(&kp->capability, &up->capability) ||
-	    assign_in_user(&kp->flags, &up->flags) ||
-	    copy_in_user(&kp->fmt, &up->fmt, sizeof(kp->fmt)))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int get_atomisp_dis_statistics32(struct atomisp_dis_statistics __user *kp,
-					struct atomisp_dis_statistics32 __user *up)
-{
-	compat_uptr_t hor_prod_odd_real;
-	compat_uptr_t hor_prod_odd_imag;
-	compat_uptr_t hor_prod_even_real;
-	compat_uptr_t hor_prod_even_imag;
-	compat_uptr_t ver_prod_odd_real;
-	compat_uptr_t ver_prod_odd_imag;
-	compat_uptr_t ver_prod_even_real;
-	compat_uptr_t ver_prod_even_imag;
-
-	if (!access_ok(up, sizeof(struct atomisp_dis_statistics32)) ||
-	    copy_in_user(kp, up, sizeof(struct atomisp_dvs_grid_info)) ||
-	    get_user(hor_prod_odd_real,
-		     &up->dvs2_stat.hor_prod.odd_real) ||
-	    get_user(hor_prod_odd_imag,
-		     &up->dvs2_stat.hor_prod.odd_imag) ||
-	    get_user(hor_prod_even_real,
-		     &up->dvs2_stat.hor_prod.even_real) ||
-	    get_user(hor_prod_even_imag,
-		     &up->dvs2_stat.hor_prod.even_imag) ||
-	    get_user(ver_prod_odd_real,
-		     &up->dvs2_stat.ver_prod.odd_real) ||
-	    get_user(ver_prod_odd_imag,
-		     &up->dvs2_stat.ver_prod.odd_imag) ||
-	    get_user(ver_prod_even_real,
-		     &up->dvs2_stat.ver_prod.even_real) ||
-	    get_user(ver_prod_even_imag,
-		     &up->dvs2_stat.ver_prod.even_imag) ||
-	    assign_in_user(&kp->exp_id, &up->exp_id) ||
-	    put_user(compat_ptr(hor_prod_odd_real),
-		     &kp->dvs2_stat.hor_prod.odd_real) ||
-	    put_user(compat_ptr(hor_prod_odd_imag),
-		     &kp->dvs2_stat.hor_prod.odd_imag) ||
-	    put_user(compat_ptr(hor_prod_even_real),
-		     &kp->dvs2_stat.hor_prod.even_real) ||
-	    put_user(compat_ptr(hor_prod_even_imag),
-		     &kp->dvs2_stat.hor_prod.even_imag) ||
-	    put_user(compat_ptr(ver_prod_odd_real),
-		     &kp->dvs2_stat.ver_prod.odd_real) ||
-	    put_user(compat_ptr(ver_prod_odd_imag),
-		     &kp->dvs2_stat.ver_prod.odd_imag) ||
-	    put_user(compat_ptr(ver_prod_even_real),
-		     &kp->dvs2_stat.ver_prod.even_real) ||
-	    put_user(compat_ptr(ver_prod_even_imag),
-		     &kp->dvs2_stat.ver_prod.even_imag))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int put_atomisp_dis_statistics32(struct atomisp_dis_statistics __user *kp,
-					struct atomisp_dis_statistics32 __user *up)
-{
-	void __user *hor_prod_odd_real;
-	void __user *hor_prod_odd_imag;
-	void __user *hor_prod_even_real;
-	void __user *hor_prod_even_imag;
-	void __user *ver_prod_odd_real;
-	void __user *ver_prod_odd_imag;
-	void __user *ver_prod_even_real;
-	void __user *ver_prod_even_imag;
-
-	if (!!access_ok(up, sizeof(struct atomisp_dis_statistics32)) ||
-	    copy_in_user(up, kp, sizeof(struct atomisp_dvs_grid_info)) ||
-	    get_user(hor_prod_odd_real,
-		     &kp->dvs2_stat.hor_prod.odd_real) ||
-	    get_user(hor_prod_odd_imag,
-		     &kp->dvs2_stat.hor_prod.odd_imag) ||
-	    get_user(hor_prod_even_real,
-		     &kp->dvs2_stat.hor_prod.even_real) ||
-	    get_user(hor_prod_even_imag,
-		     &kp->dvs2_stat.hor_prod.even_imag) ||
-	    get_user(ver_prod_odd_real,
-		     &kp->dvs2_stat.ver_prod.odd_real) ||
-	    get_user(ver_prod_odd_imag,
-		     &kp->dvs2_stat.ver_prod.odd_imag) ||
-	    get_user(ver_prod_even_real,
-		     &kp->dvs2_stat.ver_prod.even_real) ||
-	    get_user(ver_prod_even_imag,
-		     &kp->dvs2_stat.ver_prod.even_imag) ||
-	    put_user(ptr_to_compat(hor_prod_odd_real),
-		     &up->dvs2_stat.hor_prod.odd_real) ||
-	    put_user(ptr_to_compat(hor_prod_odd_imag),
-		     &up->dvs2_stat.hor_prod.odd_imag) ||
-	    put_user(ptr_to_compat(hor_prod_even_real),
-		     &up->dvs2_stat.hor_prod.even_real) ||
-	    put_user(ptr_to_compat(hor_prod_even_imag),
-		     &up->dvs2_stat.hor_prod.even_imag) ||
-	    put_user(ptr_to_compat(ver_prod_odd_real),
-		     &up->dvs2_stat.ver_prod.odd_real) ||
-	    put_user(ptr_to_compat(ver_prod_odd_imag),
-		     &up->dvs2_stat.ver_prod.odd_imag) ||
-	    put_user(ptr_to_compat(ver_prod_even_real),
-		     &up->dvs2_stat.ver_prod.even_real) ||
-	    put_user(ptr_to_compat(ver_prod_even_imag),
-		     &up->dvs2_stat.ver_prod.even_imag) ||
-	    assign_in_user(&up->exp_id, &kp->exp_id))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int get_atomisp_dis_coefficients32(struct atomisp_dis_coefficients __user *kp,
-					  struct atomisp_dis_coefficients32 __user *up)
-{
-	compat_uptr_t hor_coefs_odd_real;
-	compat_uptr_t hor_coefs_odd_imag;
-	compat_uptr_t hor_coefs_even_real;
-	compat_uptr_t hor_coefs_even_imag;
-	compat_uptr_t ver_coefs_odd_real;
-	compat_uptr_t ver_coefs_odd_imag;
-	compat_uptr_t ver_coefs_even_real;
-	compat_uptr_t ver_coefs_even_imag;
-
-	if (!access_ok(up, sizeof(struct atomisp_dis_coefficients32)) ||
-	    copy_in_user(kp, up, sizeof(struct atomisp_dvs_grid_info)) ||
-	    get_user(hor_coefs_odd_real, &up->hor_coefs.odd_real) ||
-	    get_user(hor_coefs_odd_imag, &up->hor_coefs.odd_imag) ||
-	    get_user(hor_coefs_even_real, &up->hor_coefs.even_real) ||
-	    get_user(hor_coefs_even_imag, &up->hor_coefs.even_imag) ||
-	    get_user(ver_coefs_odd_real, &up->ver_coefs.odd_real) ||
-	    get_user(ver_coefs_odd_imag, &up->ver_coefs.odd_imag) ||
-	    get_user(ver_coefs_even_real, &up->ver_coefs.even_real) ||
-	    get_user(ver_coefs_even_imag, &up->ver_coefs.even_imag) ||
-	    put_user(compat_ptr(hor_coefs_odd_real),
-		     &kp->hor_coefs.odd_real) ||
-	    put_user(compat_ptr(hor_coefs_odd_imag),
-		     &kp->hor_coefs.odd_imag) ||
-	    put_user(compat_ptr(hor_coefs_even_real),
-		     &kp->hor_coefs.even_real) ||
-	    put_user(compat_ptr(hor_coefs_even_imag),
-		     &kp->hor_coefs.even_imag) ||
-	    put_user(compat_ptr(ver_coefs_odd_real),
-		     &kp->ver_coefs.odd_real) ||
-	    put_user(compat_ptr(ver_coefs_odd_imag),
-		     &kp->ver_coefs.odd_imag) ||
-	    put_user(compat_ptr(ver_coefs_even_real),
-		     &kp->ver_coefs.even_real) ||
-	    put_user(compat_ptr(ver_coefs_even_imag),
-		     &kp->ver_coefs.even_imag))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int get_atomisp_dvs_6axis_config32(struct atomisp_dvs_6axis_config __user *kp,
-					  struct atomisp_dvs_6axis_config32 __user *up)
-{
-	compat_uptr_t xcoords_y;
-	compat_uptr_t ycoords_y;
-	compat_uptr_t xcoords_uv;
-	compat_uptr_t ycoords_uv;
-
-	if (!access_ok(up, sizeof(struct atomisp_dvs_6axis_config32)) ||
-	    assign_in_user(&kp->exp_id, &up->exp_id) ||
-	    assign_in_user(&kp->width_y, &up->width_y) ||
-	    assign_in_user(&kp->height_y, &up->height_y) ||
-	    assign_in_user(&kp->width_uv, &up->width_uv) ||
-	    assign_in_user(&kp->height_uv, &up->height_uv) ||
-	    get_user(xcoords_y, &up->xcoords_y) ||
-	    get_user(ycoords_y, &up->ycoords_y) ||
-	    get_user(xcoords_uv, &up->xcoords_uv) ||
-	    get_user(ycoords_uv, &up->ycoords_uv) ||
-	    put_user_force(compat_ptr(xcoords_y), &kp->xcoords_y) ||
-	    put_user_force(compat_ptr(ycoords_y), &kp->ycoords_y) ||
-	    put_user_force(compat_ptr(xcoords_uv), &kp->xcoords_uv) ||
-	    put_user_force(compat_ptr(ycoords_uv), &kp->ycoords_uv))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int get_atomisp_3a_statistics32(struct atomisp_3a_statistics __user *kp,
-				       struct atomisp_3a_statistics32 __user *up)
-{
-	compat_uptr_t data;
-	compat_uptr_t rgby_data;
-
-	if (!access_ok(up, sizeof(struct atomisp_3a_statistics32)) ||
-	    copy_in_user(kp, up, sizeof(struct atomisp_grid_info)) ||
-	    get_user(rgby_data, &up->rgby_data) ||
-	    put_user(compat_ptr(rgby_data), &kp->rgby_data) ||
-	    get_user(data, &up->data) ||
-	    put_user(compat_ptr(data), &kp->data) ||
-	    assign_in_user(&kp->exp_id, &up->exp_id) ||
-	    assign_in_user(&kp->isp_config_id, &up->isp_config_id))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int put_atomisp_3a_statistics32(struct atomisp_3a_statistics __user *kp,
-				       struct atomisp_3a_statistics32 __user *up)
-{
-	void __user *data;
-	void __user *rgby_data;
-
-	if (!access_ok(up, sizeof(struct atomisp_3a_statistics32)) ||
-	    copy_in_user(up, kp, sizeof(struct atomisp_grid_info)) ||
-	    get_user(rgby_data, &kp->rgby_data) ||
-	    put_user(ptr_to_compat(rgby_data), &up->rgby_data) ||
-	    get_user(data, &kp->data) ||
-	    put_user(ptr_to_compat(data), &up->data) ||
-	    assign_in_user(&up->exp_id, &kp->exp_id) ||
-	    assign_in_user(&up->isp_config_id, &kp->isp_config_id))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int get_atomisp_metadata_stat32(struct atomisp_metadata __user *kp,
-				       struct atomisp_metadata32 __user *up)
-{
-	compat_uptr_t data;
-	compat_uptr_t effective_width;
-
-	if (!access_ok(up, sizeof(struct atomisp_metadata32)) ||
-	    get_user(data, &up->data) ||
-	    put_user(compat_ptr(data), &kp->data) ||
-	    assign_in_user(&kp->width, &up->width) ||
-	    assign_in_user(&kp->height, &up->height) ||
-	    assign_in_user(&kp->stride, &up->stride) ||
-	    assign_in_user(&kp->exp_id, &up->exp_id) ||
-	    get_user(effective_width, &up->effective_width) ||
-	    put_user_force(compat_ptr(effective_width), &kp->effective_width))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int put_atomisp_metadata_stat32(struct atomisp_metadata __user *kp,
-				struct atomisp_metadata32 __user *up)
-{
-	void __user *data;
-	void *effective_width;
-
-	if (!access_ok(up, sizeof(struct atomisp_metadata32)) ||
-	    get_user(data, &kp->data) ||
-	    put_user(ptr_to_compat(data), &up->data) ||
-	    assign_in_user(&up->width, &kp->width) ||
-	    assign_in_user(&up->height, &kp->height) ||
-	    assign_in_user(&up->stride, &kp->stride) ||
-	    assign_in_user(&up->exp_id, &kp->exp_id) ||
-	    get_user(effective_width, &kp->effective_width) ||
-	    put_user(ptr_to_compat((void __user *)effective_width),
-				   &up->effective_width))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int
-put_atomisp_metadata_by_type_stat32(struct atomisp_metadata_with_type __user *kp,
-				    struct atomisp_metadata_with_type32 __user *up)
-{
-	void __user *data;
-	u32 *effective_width;
-
-	if (!access_ok(up, sizeof(struct atomisp_metadata_with_type32)) ||
-	    get_user(data, &kp->data) ||
-	    put_user(ptr_to_compat(data), &up->data) ||
-	    assign_in_user(&up->width, &kp->width) ||
-	    assign_in_user(&up->height, &kp->height) ||
-	    assign_in_user(&up->stride, &kp->stride) ||
-	    assign_in_user(&up->exp_id, &kp->exp_id) ||
-	    get_user(effective_width, &kp->effective_width) ||
-	    put_user(ptr_to_compat((void __user *)effective_width),
-		     &up->effective_width) ||
-	    assign_in_user(&up->type, &kp->type))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int
-get_atomisp_metadata_by_type_stat32(struct atomisp_metadata_with_type __user *kp,
-				    struct atomisp_metadata_with_type32 __user *up)
-{
-	compat_uptr_t data;
-	compat_uptr_t effective_width;
-
-	if (!access_ok(up, sizeof(struct atomisp_metadata_with_type32)) ||
-	    get_user(data, &up->data) ||
-	    put_user(compat_ptr(data), &kp->data) ||
-	    assign_in_user(&kp->width, &up->width) ||
-	    assign_in_user(&kp->height, &up->height) ||
-	    assign_in_user(&kp->stride, &up->stride) ||
-	    assign_in_user(&kp->exp_id, &up->exp_id) ||
-	    get_user(effective_width, &up->effective_width) ||
-	    put_user_force(compat_ptr(effective_width), &kp->effective_width) ||
-	    assign_in_user(&kp->type, &up->type))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int
-get_atomisp_morph_table32(struct atomisp_morph_table __user *kp,
-			  struct atomisp_morph_table32 __user *up)
-{
-	unsigned int n = ATOMISP_MORPH_TABLE_NUM_PLANES;
-
-	if (!access_ok(up, sizeof(struct atomisp_morph_table32)) ||
-		assign_in_user(&kp->enabled, &up->enabled) ||
-		assign_in_user(&kp->width, &up->width) ||
-		assign_in_user(&kp->height, &up->height))
-			return -EFAULT;
-
-	while (n-- > 0) {
-		compat_uptr_t coord_kp;
-
-		if (get_user(coord_kp, &up->coordinates_x[n]) ||
-		    put_user(compat_ptr(coord_kp), &kp->coordinates_x[n]) ||
-		    get_user(coord_kp, &up->coordinates_y[n]) ||
-		    put_user(compat_ptr(coord_kp), &kp->coordinates_y[n]))
-			return -EFAULT;
-	}
-	return 0;
-}
-
-static int put_atomisp_morph_table32(struct atomisp_morph_table __user *kp,
-				     struct atomisp_morph_table32 __user *up)
-{
-	unsigned int n = ATOMISP_MORPH_TABLE_NUM_PLANES;
-
-	if (!access_ok(up, sizeof(struct atomisp_morph_table32)) ||
-		assign_in_user(&up->enabled, &kp->enabled) ||
-		assign_in_user(&up->width, &kp->width) ||
-		assign_in_user(&up->height, &kp->height))
-			return -EFAULT;
-
-	while (n-- > 0) {
-		void __user *coord_kp;
-
-		if (get_user(coord_kp, &kp->coordinates_x[n]) ||
-		    put_user(ptr_to_compat(coord_kp), &up->coordinates_x[n]) ||
-		    get_user(coord_kp, &kp->coordinates_y[n]) ||
-		    put_user(ptr_to_compat(coord_kp), &up->coordinates_y[n]))
-			return -EFAULT;
-	}
-	return 0;
-}
-
-static int get_atomisp_overlay32(struct atomisp_overlay __user *kp,
-				 struct atomisp_overlay32 __user *up)
-{
-	compat_uptr_t frame;
-
-	if (!access_ok(up, sizeof(struct atomisp_overlay32)) ||
-	    get_user(frame, &up->frame) ||
-	    put_user_force(compat_ptr(frame), &kp->frame) ||
-	    assign_in_user(&kp->bg_y, &up->bg_y) ||
-	    assign_in_user(&kp->bg_u, &up->bg_u) ||
-	    assign_in_user(&kp->bg_v, &up->bg_v) ||
-	    assign_in_user(&kp->blend_input_perc_y,
-			   &up->blend_input_perc_y) ||
-	    assign_in_user(&kp->blend_input_perc_u,
-			   &up->blend_input_perc_u) ||
-	    assign_in_user(&kp->blend_input_perc_v,
-			   &up->blend_input_perc_v) ||
-	    assign_in_user(&kp->blend_overlay_perc_y,
-			   &up->blend_overlay_perc_y) ||
-	    assign_in_user(&kp->blend_overlay_perc_u,
-			   &up->blend_overlay_perc_u) ||
-	    assign_in_user(&kp->blend_overlay_perc_v,
-			   &up->blend_overlay_perc_v) ||
-	    assign_in_user(&kp->overlay_start_x, &up->overlay_start_x) ||
-	    assign_in_user(&kp->overlay_start_y, &up->overlay_start_y))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int put_atomisp_overlay32(struct atomisp_overlay __user *kp,
-				 struct atomisp_overlay32 __user *up)
-{
-	void *frame;
-
-	if (!access_ok(up, sizeof(struct atomisp_overlay32)) ||
-	    get_user(frame, &kp->frame) ||
-	    put_user(ptr_to_compat((void __user *)frame), &up->frame) ||
-	    assign_in_user(&up->bg_y, &kp->bg_y) ||
-	    assign_in_user(&up->bg_u, &kp->bg_u) ||
-	    assign_in_user(&up->bg_v, &kp->bg_v) ||
-	    assign_in_user(&up->blend_input_perc_y,
-			   &kp->blend_input_perc_y) ||
-	    assign_in_user(&up->blend_input_perc_u,
-			   &kp->blend_input_perc_u) ||
-	    assign_in_user(&up->blend_input_perc_v,
-			   &kp->blend_input_perc_v) ||
-	    assign_in_user(&up->blend_overlay_perc_y,
-			   &kp->blend_overlay_perc_y) ||
-	    assign_in_user(&up->blend_overlay_perc_u,
-			   &kp->blend_overlay_perc_u) ||
-	    assign_in_user(&up->blend_overlay_perc_v,
-			   &kp->blend_overlay_perc_v) ||
-	    assign_in_user(&up->overlay_start_x, &kp->overlay_start_x) ||
-	    assign_in_user(&up->overlay_start_y, &kp->overlay_start_y))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int
-get_atomisp_calibration_group32(struct atomisp_calibration_group __user *kp,
-				struct atomisp_calibration_group32 __user *up)
-{
-	compat_uptr_t calb_grp_values;
-
-	if (!access_ok(up, sizeof(struct atomisp_calibration_group32)) ||
-	    assign_in_user(&kp->size, &up->size) ||
-	    assign_in_user(&kp->type, &up->type) ||
-	    get_user(calb_grp_values, &up->calb_grp_values) ||
-	    put_user_force(compat_ptr(calb_grp_values), &kp->calb_grp_values))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int
-put_atomisp_calibration_group32(struct atomisp_calibration_group __user *kp,
-				struct atomisp_calibration_group32 __user *up)
-{
-	void *calb_grp_values;
-
-	if (!access_ok(up, sizeof(struct atomisp_calibration_group32)) ||
-	    assign_in_user(&up->size, &kp->size) ||
-	    assign_in_user(&up->type, &kp->type) ||
-	    get_user(calb_grp_values, &kp->calb_grp_values) ||
-	    put_user(ptr_to_compat((void __user *)calb_grp_values),
-		     &up->calb_grp_values))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int get_atomisp_acc_fw_load32(struct atomisp_acc_fw_load __user *kp,
-				     struct atomisp_acc_fw_load32 __user *up)
-{
-	compat_uptr_t data;
-
-	if (!access_ok(up, sizeof(struct atomisp_acc_fw_load32)) ||
-	    assign_in_user(&kp->size, &up->size) ||
-	    assign_in_user(&kp->fw_handle, &up->fw_handle) ||
-	    get_user_cast(data, &up->data) ||
-	    put_user(compat_ptr(data), &kp->data))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int put_atomisp_acc_fw_load32(struct atomisp_acc_fw_load __user *kp,
-				     struct atomisp_acc_fw_load32 __user *up)
-{
-	void __user *data;
-
-	if (!access_ok(up, sizeof(struct atomisp_acc_fw_load32)) ||
-	    assign_in_user(&up->size, &kp->size) ||
-	    assign_in_user(&up->fw_handle, &kp->fw_handle) ||
-	    get_user(data, &kp->data) ||
-	    put_user(ptr_to_compat(data), &up->data))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int get_atomisp_acc_fw_arg32(struct atomisp_acc_fw_arg __user *kp,
-				    struct atomisp_acc_fw_arg32 __user *up)
-{
-	compat_uptr_t value;
-
-	if (!access_ok(up, sizeof(struct atomisp_acc_fw_arg32)) ||
-	    assign_in_user(&kp->fw_handle, &up->fw_handle) ||
-	    assign_in_user(&kp->index, &up->index) ||
-	    get_user(value, &up->value) ||
-	    put_user(compat_ptr(value), &kp->value) ||
-	    assign_in_user(&kp->size, &up->size))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int put_atomisp_acc_fw_arg32(struct atomisp_acc_fw_arg __user *kp,
-				    struct atomisp_acc_fw_arg32 __user *up)
-{
-	void __user *value;
-
-	if (!access_ok(up, sizeof(struct atomisp_acc_fw_arg32)) ||
-	    assign_in_user(&up->fw_handle, &kp->fw_handle) ||
-	    assign_in_user(&up->index, &kp->index) ||
-	    get_user(value, &kp->value) ||
-	    put_user(ptr_to_compat(value), &up->value) ||
-	    assign_in_user(&up->size, &kp->size))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int get_v4l2_private_int_data32(struct v4l2_private_int_data __user *kp,
-				       struct v4l2_private_int_data32 __user *up)
-{
-	compat_uptr_t data;
-
-	if (!access_ok(up, sizeof(struct v4l2_private_int_data32)) ||
-	    assign_in_user(&kp->size, &up->size) ||
-	    get_user(data, &up->data) ||
-	    put_user(compat_ptr(data), &kp->data) ||
-	    assign_in_user(&kp->reserved[0], &up->reserved[0]) ||
-	    assign_in_user(&kp->reserved[1], &up->reserved[1]))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int put_v4l2_private_int_data32(struct v4l2_private_int_data __user *kp,
-				       struct v4l2_private_int_data32 __user *up)
-{
-	void __user *data;
-
-	if (!access_ok(up, sizeof(struct v4l2_private_int_data32)) ||
-	    assign_in_user(&up->size, &kp->size) ||
-	    get_user(data, &kp->data) ||
-	    put_user(ptr_to_compat(data), &up->data) ||
-	    assign_in_user(&up->reserved[0], &kp->reserved[0]) ||
-	    assign_in_user(&up->reserved[1], &kp->reserved[1]))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int get_atomisp_shading_table32(struct atomisp_shading_table __user *kp,
-				       struct atomisp_shading_table32 __user *up)
-{
-	unsigned int n = ATOMISP_NUM_SC_COLORS;
-
-	if (!access_ok(up, sizeof(struct atomisp_shading_table32)) ||
-	    assign_in_user(&kp->enable, &up->enable) ||
-	    assign_in_user(&kp->sensor_width, &up->sensor_width) ||
-	    assign_in_user(&kp->sensor_height, &up->sensor_height) ||
-	    assign_in_user(&kp->width, &up->width) ||
-	    assign_in_user(&kp->height, &up->height) ||
-	    assign_in_user(&kp->fraction_bits, &up->fraction_bits))
-		return -EFAULT;
-
-	while (n-- > 0) {
-		compat_uptr_t tmp;
-
-		if (get_user(tmp, &up->data[n]) ||
-		    put_user_force(compat_ptr(tmp), &kp->data[n]))
-			return -EFAULT;
-	}
-	return 0;
-}
-
-static int get_atomisp_acc_map32(struct atomisp_acc_map __user *kp,
-				 struct atomisp_acc_map32 __user *up)
-{
-	compat_uptr_t user_ptr;
-
-	if (!access_ok(up, sizeof(struct atomisp_acc_map32)) ||
-	    assign_in_user(&kp->flags, &up->flags) ||
-	    assign_in_user(&kp->length, &up->length) ||
-	    get_user(user_ptr, &up->user_ptr) ||
-	    put_user(compat_ptr(user_ptr), &kp->user_ptr) ||
-	    assign_in_user(&kp->css_ptr, &up->css_ptr) ||
-	    assign_in_user(&kp->reserved[0], &up->reserved[0]) ||
-	    assign_in_user(&kp->reserved[1], &up->reserved[1]) ||
-	    assign_in_user(&kp->reserved[2], &up->reserved[2]) ||
-	    assign_in_user(&kp->reserved[3], &up->reserved[3]))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int put_atomisp_acc_map32(struct atomisp_acc_map __user *kp,
-				 struct atomisp_acc_map32 __user *up)
-{
-	void __user *user_ptr;
-
-	if (!access_ok(up, sizeof(struct atomisp_acc_map32)) ||
-	    assign_in_user(&up->flags, &kp->flags) ||
-	    assign_in_user(&up->length, &kp->length) ||
-	    get_user(user_ptr, &kp->user_ptr) ||
-	    put_user(ptr_to_compat(user_ptr), &up->user_ptr) ||
-	    assign_in_user(&up->css_ptr, &kp->css_ptr) ||
-	    assign_in_user(&up->reserved[0], &kp->reserved[0]) ||
-	    assign_in_user(&up->reserved[1], &kp->reserved[1]) ||
-	    assign_in_user(&up->reserved[2], &kp->reserved[2]) ||
-	    assign_in_user(&up->reserved[3], &kp->reserved[3]))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int
-get_atomisp_acc_s_mapped_arg32(struct atomisp_acc_s_mapped_arg __user *kp,
-			       struct atomisp_acc_s_mapped_arg32 __user *up)
-{
-	if (!access_ok(up, sizeof(struct atomisp_acc_s_mapped_arg32)) ||
-	    assign_in_user(&kp->fw_handle, &up->fw_handle) ||
-	    assign_in_user(&kp->memory, &up->memory) ||
-	    assign_in_user(&kp->length, &up->length) ||
-	    assign_in_user(&kp->css_ptr, &up->css_ptr))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int
-put_atomisp_acc_s_mapped_arg32(struct atomisp_acc_s_mapped_arg __user *kp,
-			       struct atomisp_acc_s_mapped_arg32 __user *up)
-{
-	if (!access_ok(up, sizeof(struct atomisp_acc_s_mapped_arg32)) ||
-	    assign_in_user(&up->fw_handle, &kp->fw_handle) ||
-	    assign_in_user(&up->memory, &kp->memory) ||
-	    assign_in_user(&up->length, &kp->length) ||
-	    assign_in_user(&up->css_ptr, &kp->css_ptr))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int get_atomisp_parameters32(struct atomisp_parameters __user *kp,
-				    struct atomisp_parameters32 __user *up)
-{
-	int n = offsetof(struct atomisp_parameters32, output_frame) /
-		sizeof(compat_uptr_t);
-	compat_uptr_t stp, mtp, dcp, dscp;
-	struct {
-		struct atomisp_shading_table shading_table;
-		struct atomisp_morph_table morph_table;
-		struct atomisp_dis_coefficients dvs2_coefs;
-		struct atomisp_dvs_6axis_config dvs_6axis_config;
-	} __user *karg = (void __user *)(kp + 1);
-
-	if (!access_ok(up, sizeof(struct atomisp_parameters32)))
-		return -EFAULT;
-
-	while (n >= 0) {
-		compat_uptr_t __user *src = (compat_uptr_t __user *)up + n;
-		void * __user *dst = (void * __user *)kp + n;
-		compat_uptr_t tmp;
-
-		if (get_user_cast(tmp, src) || put_user_force(compat_ptr(tmp), dst))
-			return -EFAULT;
-		n--;
-	}
-
-	if (assign_in_user(&kp->isp_config_id, &up->isp_config_id) ||
-	    assign_in_user(&kp->per_frame_setting, &up->per_frame_setting) ||
-	    get_user(stp, &up->shading_table) ||
-	    get_user(mtp, &up->morph_table) ||
-	    get_user(dcp, &up->dvs2_coefs) ||
-	    get_user(dscp, &up->dvs_6axis_config))
-		return -EFAULT;
-
-	/* handle shading table */
-	if (stp && (get_atomisp_shading_table32(&karg->shading_table,
-						compat_ptr(stp)) ||
-		    put_user_force(&karg->shading_table, &kp->shading_table)))
-		return -EFAULT;
-
-	/* handle morph table */
-	if (mtp && (get_atomisp_morph_table32(&karg->morph_table,
-					      compat_ptr(mtp)) ||
-		    put_user_force(&karg->morph_table, &kp->morph_table)))
-		return -EFAULT;
-
-	/* handle dvs2 coefficients */
-	if (dcp && (get_atomisp_dis_coefficients32(&karg->dvs2_coefs,
-						   compat_ptr(dcp)) ||
-		    put_user_force(&karg->dvs2_coefs, &kp->dvs2_coefs)))
-		return -EFAULT;
-
-	/* handle dvs 6axis configuration */
-	if (dscp &&
-	    (get_atomisp_dvs_6axis_config32(&karg->dvs_6axis_config,
-					    compat_ptr(dscp)) ||
-	     put_user_force(&karg->dvs_6axis_config, &kp->dvs_6axis_config)))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int
-get_atomisp_acc_fw_load_to_pipe32(struct atomisp_acc_fw_load_to_pipe __user *kp,
-				  struct atomisp_acc_fw_load_to_pipe32 __user *up)
-{
-	compat_uptr_t data;
-
-	if (!access_ok(up, sizeof(struct atomisp_acc_fw_load_to_pipe32)) ||
-	    assign_in_user(&kp->flags, &up->flags) ||
-	    assign_in_user(&kp->fw_handle, &up->fw_handle) ||
-	    assign_in_user(&kp->size, &up->size) ||
-	    assign_in_user(&kp->type, &up->type) ||
-	    assign_in_user(&kp->reserved[0], &up->reserved[0]) ||
-	    assign_in_user(&kp->reserved[1], &up->reserved[1]) ||
-	    assign_in_user(&kp->reserved[2], &up->reserved[2]) ||
-	    get_user(data, &up->data) ||
-	    put_user(compat_ptr(data), &kp->data))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int
-put_atomisp_acc_fw_load_to_pipe32(struct atomisp_acc_fw_load_to_pipe __user *kp,
-				  struct atomisp_acc_fw_load_to_pipe32 __user *up)
-{
-	void __user *data;
-
-	if (!access_ok(up, sizeof(struct atomisp_acc_fw_load_to_pipe32)) ||
-	    assign_in_user(&up->flags, &kp->flags) ||
-	    assign_in_user(&up->fw_handle, &kp->fw_handle) ||
-	    assign_in_user(&up->size, &kp->size) ||
-	    assign_in_user(&up->type, &kp->type) ||
-	    assign_in_user(&up->reserved[0], &kp->reserved[0]) ||
-	    assign_in_user(&up->reserved[1], &kp->reserved[1]) ||
-	    assign_in_user(&up->reserved[2], &kp->reserved[2]) ||
-	    get_user(data, &kp->data) ||
-	    put_user(ptr_to_compat(data), &up->data))
-		return -EFAULT;
-
-	return 0;
-}
-
-static int
-get_atomisp_sensor_ae_bracketing_lut(struct atomisp_sensor_ae_bracketing_lut __user *kp,
-				     struct atomisp_sensor_ae_bracketing_lut32 __user *up)
-{
-	compat_uptr_t lut;
-
-	if (!access_ok(up, sizeof(struct atomisp_sensor_ae_bracketing_lut32)) ||
-	    assign_in_user(&kp->lut_size, &up->lut_size) ||
-	    get_user(lut, &up->lut) ||
-	    put_user_force(compat_ptr(lut), &kp->lut))
-		return -EFAULT;
-
-	return 0;
-}
-
-static long native_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
-{
-	long ret = -ENOIOCTLCMD;
-
-	if (file->f_op->unlocked_ioctl)
-		ret = file->f_op->unlocked_ioctl(file, cmd, arg);
-
-	return ret;
-}
-
-static long atomisp_do_compat_ioctl(struct file *file,
-				    unsigned int cmd, unsigned long arg)
-{
-	union {
-		struct atomisp_histogram his;
-		struct atomisp_dis_statistics dis_s;
-		struct atomisp_dis_coefficients dis_c;
-		struct atomisp_dvs_6axis_config dvs_c;
-		struct atomisp_3a_statistics s3a_s;
-		struct atomisp_morph_table mor_t;
-		struct v4l2_framebuffer v4l2_buf;
-		struct atomisp_overlay overlay;
-		struct atomisp_calibration_group cal_grp;
-		struct atomisp_acc_fw_load acc_fw_load;
-		struct atomisp_acc_fw_arg acc_fw_arg;
-		struct v4l2_private_int_data v4l2_pri_data;
-		struct atomisp_shading_table shd_tbl;
-		struct atomisp_acc_map acc_map;
-		struct atomisp_acc_s_mapped_arg acc_map_arg;
-		struct atomisp_parameters param;
-		struct atomisp_acc_fw_load_to_pipe acc_fw_to_pipe;
-		struct atomisp_metadata md;
-		struct atomisp_metadata_with_type md_with_type;
-		struct atomisp_sensor_ae_bracketing_lut lut;
-	} __user *karg;
-	void __user *up = compat_ptr(arg);
-	long err = -ENOIOCTLCMD;
-
-	karg = compat_alloc_user_space(
-		sizeof(*karg) + (cmd == ATOMISP_IOC_S_PARAMETERS32 ?
-				 sizeof(struct atomisp_shading_table) +
-				 sizeof(struct atomisp_morph_table) +
-				 sizeof(struct atomisp_dis_coefficients) +
-				 sizeof(struct atomisp_dvs_6axis_config) : 0));
-	if (!karg)
-		return -ENOMEM;
-
-	/* First, convert the command. */
-	switch (cmd) {
-	case ATOMISP_IOC_G_HISTOGRAM32:
-		cmd = ATOMISP_IOC_G_HISTOGRAM;
-		break;
-	case ATOMISP_IOC_S_HISTOGRAM32:
-		cmd = ATOMISP_IOC_S_HISTOGRAM;
-		break;
-	case ATOMISP_IOC_G_DIS_STAT32:
-		cmd = ATOMISP_IOC_G_DIS_STAT;
-		break;
-	case ATOMISP_IOC_S_DIS_COEFS32:
-		cmd = ATOMISP_IOC_S_DIS_COEFS;
-		break;
-	case ATOMISP_IOC_S_DIS_VECTOR32:
-		cmd = ATOMISP_IOC_S_DIS_VECTOR;
-		break;
-	case ATOMISP_IOC_G_3A_STAT32:
-		cmd = ATOMISP_IOC_G_3A_STAT;
-		break;
-	case ATOMISP_IOC_G_ISP_GDC_TAB32:
-		cmd = ATOMISP_IOC_G_ISP_GDC_TAB;
-		break;
-	case ATOMISP_IOC_S_ISP_GDC_TAB32:
-		cmd = ATOMISP_IOC_S_ISP_GDC_TAB;
-		break;
-	case ATOMISP_IOC_S_ISP_FPN_TABLE32:
-		cmd = ATOMISP_IOC_S_ISP_FPN_TABLE;
-		break;
-	case ATOMISP_IOC_G_ISP_OVERLAY32:
-		cmd = ATOMISP_IOC_G_ISP_OVERLAY;
-		break;
-	case ATOMISP_IOC_S_ISP_OVERLAY32:
-		cmd = ATOMISP_IOC_S_ISP_OVERLAY;
-		break;
-	case ATOMISP_IOC_G_SENSOR_CALIBRATION_GROUP32:
-		cmd = ATOMISP_IOC_G_SENSOR_CALIBRATION_GROUP;
-		break;
-	case ATOMISP_IOC_ACC_LOAD32:
-		cmd = ATOMISP_IOC_ACC_LOAD;
-		break;
-	case ATOMISP_IOC_ACC_S_ARG32:
-		cmd = ATOMISP_IOC_ACC_S_ARG;
-		break;
-	case ATOMISP_IOC_G_SENSOR_PRIV_INT_DATA32:
-		cmd = ATOMISP_IOC_G_SENSOR_PRIV_INT_DATA;
-		break;
-	case ATOMISP_IOC_S_ISP_SHD_TAB32:
-		cmd = ATOMISP_IOC_S_ISP_SHD_TAB;
-		break;
-	case ATOMISP_IOC_ACC_DESTAB32:
-		cmd = ATOMISP_IOC_ACC_DESTAB;
-		break;
-	case ATOMISP_IOC_G_MOTOR_PRIV_INT_DATA32:
-		cmd = ATOMISP_IOC_G_MOTOR_PRIV_INT_DATA;
-		break;
-	case ATOMISP_IOC_ACC_MAP32:
-		cmd = ATOMISP_IOC_ACC_MAP;
-		break;
-	case ATOMISP_IOC_ACC_UNMAP32:
-		cmd = ATOMISP_IOC_ACC_UNMAP;
-		break;
-	case ATOMISP_IOC_ACC_S_MAPPED_ARG32:
-		cmd = ATOMISP_IOC_ACC_S_MAPPED_ARG;
-		break;
-	case ATOMISP_IOC_S_PARAMETERS32:
-		cmd = ATOMISP_IOC_S_PARAMETERS;
-		break;
-	case ATOMISP_IOC_ACC_LOAD_TO_PIPE32:
-		cmd = ATOMISP_IOC_ACC_LOAD_TO_PIPE;
-		break;
-	case ATOMISP_IOC_G_METADATA32:
-		cmd = ATOMISP_IOC_G_METADATA;
-		break;
-	case ATOMISP_IOC_G_METADATA_BY_TYPE32:
-		cmd = ATOMISP_IOC_G_METADATA_BY_TYPE;
-		break;
-	case ATOMISP_IOC_S_SENSOR_AE_BRACKETING_LUT32:
-		cmd = ATOMISP_IOC_S_SENSOR_AE_BRACKETING_LUT;
-		break;
-	}
-
-	switch (cmd) {
-	case ATOMISP_IOC_G_HISTOGRAM:
-	case ATOMISP_IOC_S_HISTOGRAM:
-		err = get_atomisp_histogram32(&karg->his, up);
-		break;
-	case ATOMISP_IOC_G_DIS_STAT:
-		err = get_atomisp_dis_statistics32(&karg->dis_s, up);
-		break;
-	case ATOMISP_IOC_S_DIS_COEFS:
-		err = get_atomisp_dis_coefficients32(&karg->dis_c, up);
-		break;
-	case ATOMISP_IOC_S_DIS_VECTOR:
-		err = get_atomisp_dvs_6axis_config32(&karg->dvs_c, up);
-		break;
-	case ATOMISP_IOC_G_3A_STAT:
-		err = get_atomisp_3a_statistics32(&karg->s3a_s, up);
-		break;
-	case ATOMISP_IOC_G_ISP_GDC_TAB:
-	case ATOMISP_IOC_S_ISP_GDC_TAB:
-		err = get_atomisp_morph_table32(&karg->mor_t, up);
-		break;
-	case ATOMISP_IOC_S_ISP_FPN_TABLE:
-		err = get_v4l2_framebuffer32(&karg->v4l2_buf, up);
-		break;
-	case ATOMISP_IOC_G_ISP_OVERLAY:
-	case ATOMISP_IOC_S_ISP_OVERLAY:
-		err = get_atomisp_overlay32(&karg->overlay, up);
-		break;
-	case ATOMISP_IOC_G_SENSOR_CALIBRATION_GROUP:
-		err = get_atomisp_calibration_group32(&karg->cal_grp, up);
-		break;
-	case ATOMISP_IOC_ACC_LOAD:
-		err = get_atomisp_acc_fw_load32(&karg->acc_fw_load, up);
-		break;
-	case ATOMISP_IOC_ACC_S_ARG:
-	case ATOMISP_IOC_ACC_DESTAB:
-		err = get_atomisp_acc_fw_arg32(&karg->acc_fw_arg, up);
-		break;
-	case ATOMISP_IOC_G_SENSOR_PRIV_INT_DATA:
-	case ATOMISP_IOC_G_MOTOR_PRIV_INT_DATA:
-		err = get_v4l2_private_int_data32(&karg->v4l2_pri_data, up);
-		break;
-	case ATOMISP_IOC_S_ISP_SHD_TAB:
-		err = get_atomisp_shading_table32(&karg->shd_tbl, up);
-		break;
-	case ATOMISP_IOC_ACC_MAP:
-	case ATOMISP_IOC_ACC_UNMAP:
-		err = get_atomisp_acc_map32(&karg->acc_map, up);
-		break;
-	case ATOMISP_IOC_ACC_S_MAPPED_ARG:
-		err = get_atomisp_acc_s_mapped_arg32(&karg->acc_map_arg, up);
-		break;
-	case ATOMISP_IOC_S_PARAMETERS:
-		err = get_atomisp_parameters32(&karg->param, up);
-		break;
-	case ATOMISP_IOC_ACC_LOAD_TO_PIPE:
-		err = get_atomisp_acc_fw_load_to_pipe32(&karg->acc_fw_to_pipe,
-							up);
-		break;
-	case ATOMISP_IOC_G_METADATA:
-		err = get_atomisp_metadata_stat32(&karg->md, up);
-		break;
-	case ATOMISP_IOC_G_METADATA_BY_TYPE:
-		err = get_atomisp_metadata_by_type_stat32(&karg->md_with_type,
-							  up);
-		break;
-	case ATOMISP_IOC_S_SENSOR_AE_BRACKETING_LUT:
-		err = get_atomisp_sensor_ae_bracketing_lut(&karg->lut, up);
-		break;
-	}
-	if (err)
-		return err;
-
-	err = native_ioctl(file, cmd, (unsigned long)karg);
-	if (err)
-		return err;
-
-	switch (cmd) {
-	case ATOMISP_IOC_G_HISTOGRAM:
-		err = put_atomisp_histogram32(&karg->his, up);
-		break;
-	case ATOMISP_IOC_G_DIS_STAT:
-		err = put_atomisp_dis_statistics32(&karg->dis_s, up);
-		break;
-	case ATOMISP_IOC_G_3A_STAT:
-		err = put_atomisp_3a_statistics32(&karg->s3a_s, up);
-		break;
-	case ATOMISP_IOC_G_ISP_GDC_TAB:
-		err = put_atomisp_morph_table32(&karg->mor_t, up);
-		break;
-	case ATOMISP_IOC_G_ISP_OVERLAY:
-		err = put_atomisp_overlay32(&karg->overlay, up);
-		break;
-	case ATOMISP_IOC_G_SENSOR_CALIBRATION_GROUP:
-		err = put_atomisp_calibration_group32(&karg->cal_grp, up);
-		break;
-	case ATOMISP_IOC_ACC_LOAD:
-		err = put_atomisp_acc_fw_load32(&karg->acc_fw_load, up);
-		break;
-	case ATOMISP_IOC_ACC_S_ARG:
-	case ATOMISP_IOC_ACC_DESTAB:
-		err = put_atomisp_acc_fw_arg32(&karg->acc_fw_arg, up);
-		break;
-	case ATOMISP_IOC_G_SENSOR_PRIV_INT_DATA:
-	case ATOMISP_IOC_G_MOTOR_PRIV_INT_DATA:
-		err = put_v4l2_private_int_data32(&karg->v4l2_pri_data, up);
-		break;
-	case ATOMISP_IOC_ACC_MAP:
-	case ATOMISP_IOC_ACC_UNMAP:
-		err = put_atomisp_acc_map32(&karg->acc_map, up);
-		break;
-	case ATOMISP_IOC_ACC_S_MAPPED_ARG:
-		err = put_atomisp_acc_s_mapped_arg32(&karg->acc_map_arg, up);
-		break;
-	case ATOMISP_IOC_ACC_LOAD_TO_PIPE:
-		err = put_atomisp_acc_fw_load_to_pipe32(&karg->acc_fw_to_pipe,
-							up);
-		break;
-	case ATOMISP_IOC_G_METADATA:
-		err = put_atomisp_metadata_stat32(&karg->md, up);
-		break;
-	case ATOMISP_IOC_G_METADATA_BY_TYPE:
-		err = put_atomisp_metadata_by_type_stat32(&karg->md_with_type,
-							  up);
-		break;
-	}
-
-	return err;
-}
-
-long atomisp_compat_ioctl32(struct file *file,
-			    unsigned int cmd, unsigned long arg)
-{
-	struct video_device *vdev = video_devdata(file);
-	struct atomisp_device *isp = video_get_drvdata(vdev);
-	long ret = -ENOIOCTLCMD;
-
-	if (!file->f_op->unlocked_ioctl)
-		return ret;
-
-	switch (cmd) {
-	case ATOMISP_IOC_G_XNR:
-	case ATOMISP_IOC_S_XNR:
-	case ATOMISP_IOC_G_NR:
-	case ATOMISP_IOC_S_NR:
-	case ATOMISP_IOC_G_TNR:
-	case ATOMISP_IOC_S_TNR:
-	case ATOMISP_IOC_G_BLACK_LEVEL_COMP:
-	case ATOMISP_IOC_S_BLACK_LEVEL_COMP:
-	case ATOMISP_IOC_G_EE:
-	case ATOMISP_IOC_S_EE:
-	case ATOMISP_IOC_S_DIS_VECTOR:
-	case ATOMISP_IOC_G_ISP_PARM:
-	case ATOMISP_IOC_S_ISP_PARM:
-	case ATOMISP_IOC_G_ISP_GAMMA:
-	case ATOMISP_IOC_S_ISP_GAMMA:
-	case ATOMISP_IOC_ISP_MAKERNOTE:
-	case ATOMISP_IOC_G_ISP_MACC:
-	case ATOMISP_IOC_S_ISP_MACC:
-	case ATOMISP_IOC_G_ISP_BAD_PIXEL_DETECTION:
-	case ATOMISP_IOC_S_ISP_BAD_PIXEL_DETECTION:
-	case ATOMISP_IOC_G_ISP_FALSE_COLOR_CORRECTION:
-	case ATOMISP_IOC_S_ISP_FALSE_COLOR_CORRECTION:
-	case ATOMISP_IOC_G_ISP_CTC:
-	case ATOMISP_IOC_S_ISP_CTC:
-	case ATOMISP_IOC_G_ISP_WHITE_BALANCE:
-	case ATOMISP_IOC_S_ISP_WHITE_BALANCE:
-	case ATOMISP_IOC_CAMERA_BRIDGE:
-	case ATOMISP_IOC_G_SENSOR_MODE_DATA:
-	case ATOMISP_IOC_S_EXPOSURE:
-	case ATOMISP_IOC_G_3A_CONFIG:
-	case ATOMISP_IOC_S_3A_CONFIG:
-	case ATOMISP_IOC_ACC_UNLOAD:
-	case ATOMISP_IOC_ACC_START:
-	case ATOMISP_IOC_ACC_WAIT:
-	case ATOMISP_IOC_ACC_ABORT:
-	case ATOMISP_IOC_G_ISP_GAMMA_CORRECTION:
-	case ATOMISP_IOC_S_ISP_GAMMA_CORRECTION:
-	case ATOMISP_IOC_S_CONT_CAPTURE_CONFIG:
-	case ATOMISP_IOC_G_DVS2_BQ_RESOLUTIONS:
-	case ATOMISP_IOC_EXT_ISP_CTRL:
-	case ATOMISP_IOC_EXP_ID_UNLOCK:
-	case ATOMISP_IOC_EXP_ID_CAPTURE:
-	case ATOMISP_IOC_S_ENABLE_DZ_CAPT_PIPE:
-	case ATOMISP_IOC_G_FORMATS_CONFIG:
-	case ATOMISP_IOC_S_FORMATS_CONFIG:
-	case ATOMISP_IOC_S_EXPOSURE_WINDOW:
-	case ATOMISP_IOC_S_ACC_STATE:
-	case ATOMISP_IOC_G_ACC_STATE:
-	case ATOMISP_IOC_INJECT_A_FAKE_EVENT:
-	case ATOMISP_IOC_G_SENSOR_AE_BRACKETING_INFO:
-	case ATOMISP_IOC_S_SENSOR_AE_BRACKETING_MODE:
-	case ATOMISP_IOC_G_SENSOR_AE_BRACKETING_MODE:
-	case ATOMISP_IOC_G_INVALID_FRAME_NUM:
-	case ATOMISP_IOC_S_ARRAY_RESOLUTION:
-	case ATOMISP_IOC_S_SENSOR_RUNMODE:
-	case ATOMISP_IOC_G_UPDATE_EXPOSURE:
-		ret = native_ioctl(file, cmd, arg);
-		break;
-
-	case ATOMISP_IOC_G_HISTOGRAM32:
-	case ATOMISP_IOC_S_HISTOGRAM32:
-	case ATOMISP_IOC_G_DIS_STAT32:
-	case ATOMISP_IOC_S_DIS_COEFS32:
-	case ATOMISP_IOC_S_DIS_VECTOR32:
-	case ATOMISP_IOC_G_3A_STAT32:
-	case ATOMISP_IOC_G_ISP_GDC_TAB32:
-	case ATOMISP_IOC_S_ISP_GDC_TAB32:
-	case ATOMISP_IOC_S_ISP_FPN_TABLE32:
-	case ATOMISP_IOC_G_ISP_OVERLAY32:
-	case ATOMISP_IOC_S_ISP_OVERLAY32:
-	case ATOMISP_IOC_G_SENSOR_CALIBRATION_GROUP32:
-	case ATOMISP_IOC_ACC_LOAD32:
-	case ATOMISP_IOC_ACC_S_ARG32:
-	case ATOMISP_IOC_G_SENSOR_PRIV_INT_DATA32:
-	case ATOMISP_IOC_S_ISP_SHD_TAB32:
-	case ATOMISP_IOC_ACC_DESTAB32:
-	case ATOMISP_IOC_G_MOTOR_PRIV_INT_DATA32:
-	case ATOMISP_IOC_ACC_MAP32:
-	case ATOMISP_IOC_ACC_UNMAP32:
-	case ATOMISP_IOC_ACC_S_MAPPED_ARG32:
-	case ATOMISP_IOC_S_PARAMETERS32:
-	case ATOMISP_IOC_ACC_LOAD_TO_PIPE32:
-	case ATOMISP_IOC_G_METADATA32:
-	case ATOMISP_IOC_G_METADATA_BY_TYPE32:
-	case ATOMISP_IOC_S_SENSOR_AE_BRACKETING_LUT32:
-		ret = atomisp_do_compat_ioctl(file, cmd, arg);
-		break;
-
-	default:
-		dev_warn(isp->dev,
-			 "%s: unknown ioctl '%c', dir=%d, #%d (0x%08x)\n",
-			 __func__, _IOC_TYPE(cmd), _IOC_DIR(cmd), _IOC_NR(cmd),
-			 cmd);
-		break;
-	}
-	return ret;
-}
-#endif /* CONFIG_COMPAT */
diff --git a/drivers/staging/media/atomisp/pci/atomisp_fops.c b/drivers/staging/media/atomisp/pci/atomisp_fops.c
index 453bb6913550..b2d85b585cf9 100644
--- a/drivers/staging/media/atomisp/pci/atomisp_fops.c
+++ b/drivers/staging/media/atomisp/pci/atomisp_fops.c
@@ -1280,7 +1280,8 @@  const struct v4l2_file_operations atomisp_fops = {
 	.unlocked_ioctl = video_ioctl2,
 #ifdef CONFIG_COMPAT
 	/*
-	 * There are problems with this code. Disable this for now.
+	 * this was removed because of bugs, the interface
+	 * needs to be made safe for compat tasks instead.
 	.compat_ioctl32 = atomisp_compat_ioctl32,
 	 */
 #endif
@@ -1294,10 +1295,7 @@  const struct v4l2_file_operations atomisp_file_fops = {
 	.mmap = atomisp_file_mmap,
 	.unlocked_ioctl = video_ioctl2,
 #ifdef CONFIG_COMPAT
-	/*
-	 * There are problems with this code. Disable this for now.
-	.compat_ioctl32 = atomisp_compat_ioctl32,
-	 */
+	/* .compat_ioctl32 = atomisp_compat_ioctl32, */
 #endif
 	.poll = atomisp_poll,
 };