/*
 * 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.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301, USA.
 *
 */
#ifdef CONFIG_COMPAT
#include <linux/compat.h>

#include <linux/videodev2.h>

#include "atomisp_internal.h"
#include "atomisp_compat.h"
#include "atomisp_compat_ioctl32.h"

static int get_atomisp_histogram32(struct atomisp_histogram *kp,
					struct atomisp_histogram32 __user *up)
{
	compat_uptr_t tmp;

	if (!access_ok(VERIFY_READ, up, sizeof(struct atomisp_histogram32)) ||
		get_user(kp->num_elements, &up->num_elements) ||
		get_user(tmp, &up->data))
			return -EFAULT;

	kp->data = compat_ptr(tmp);
	return 0;
}

static int put_atomisp_histogram32(struct atomisp_histogram *kp,
					struct atomisp_histogram32 __user *up)
{
	compat_uptr_t tmp = (compat_uptr_t)((uintptr_t)kp->data);

	if (!access_ok(VERIFY_WRITE, up, sizeof(struct atomisp_histogram32)) ||
		put_user(kp->num_elements, &up->num_elements) ||
		put_user(tmp, &up->data))
			return -EFAULT;

	return 0;
}

static inline int get_v4l2_pix_format(struct v4l2_pix_format *kp,
					struct v4l2_pix_format __user *up)
{
	if (copy_from_user(kp, up, sizeof(struct v4l2_pix_format)))
		return -EFAULT;
	return 0;
}

static inline int put_v4l2_pix_format(struct v4l2_pix_format *kp,
					struct v4l2_pix_format __user *up)
{
	if (copy_to_user(up, kp, sizeof(struct v4l2_pix_format)))
		return -EFAULT;
	return 0;
}

static int get_v4l2_framebuffer32(struct v4l2_framebuffer *kp,
					struct v4l2_framebuffer32 __user *up)
{
	compat_uptr_t tmp;

	if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_framebuffer32)) ||
		get_user(tmp, &up->base) ||
		get_user(kp->capability, &up->capability) ||
		get_user(kp->flags, &up->flags))
			return -EFAULT;

	kp->base = (void __force *)compat_ptr(tmp);
	get_v4l2_pix_format((struct v4l2_pix_format *)&kp->fmt, &up->fmt);
	return 0;
}

static int get_atomisp_dis_statistics32(struct atomisp_dis_statistics *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(VERIFY_READ, up,
			sizeof(struct atomisp_dis_statistics32)) ||
		copy_from_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) ||
		get_user(kp->exp_id, &up->exp_id))
			return -EFAULT;

	kp->dvs2_stat.hor_prod.odd_real = compat_ptr(hor_prod_odd_real);
	kp->dvs2_stat.hor_prod.odd_imag = compat_ptr(hor_prod_odd_imag);
	kp->dvs2_stat.hor_prod.even_real = compat_ptr(hor_prod_even_real);
	kp->dvs2_stat.hor_prod.even_imag = compat_ptr(hor_prod_even_imag);
	kp->dvs2_stat.ver_prod.odd_real = compat_ptr(ver_prod_odd_real);
	kp->dvs2_stat.ver_prod.odd_imag = compat_ptr(ver_prod_odd_imag);
	kp->dvs2_stat.ver_prod.even_real = compat_ptr(ver_prod_even_real);
	kp->dvs2_stat.ver_prod.even_imag = compat_ptr(ver_prod_even_imag);
	return 0;
}

static int put_atomisp_dis_statistics32(struct atomisp_dis_statistics *kp,
				struct atomisp_dis_statistics32 __user *up)
{
	compat_uptr_t hor_prod_odd_real =
		(compat_uptr_t)((uintptr_t)kp->dvs2_stat.hor_prod.odd_real);
	compat_uptr_t hor_prod_odd_imag =
		(compat_uptr_t)((uintptr_t)kp->dvs2_stat.hor_prod.odd_imag);
	compat_uptr_t hor_prod_even_real =
		(compat_uptr_t)((uintptr_t)kp->dvs2_stat.hor_prod.even_real);
	compat_uptr_t hor_prod_even_imag =
		(compat_uptr_t)((uintptr_t)kp->dvs2_stat.hor_prod.even_imag);
	compat_uptr_t ver_prod_odd_real =
		(compat_uptr_t)((uintptr_t)kp->dvs2_stat.ver_prod.odd_real);
	compat_uptr_t ver_prod_odd_imag =
		(compat_uptr_t)((uintptr_t)kp->dvs2_stat.ver_prod.odd_imag);
	compat_uptr_t ver_prod_even_real =
		(compat_uptr_t)((uintptr_t)kp->dvs2_stat.ver_prod.even_real);
	compat_uptr_t ver_prod_even_imag =
		(compat_uptr_t)((uintptr_t)kp->dvs2_stat.ver_prod.even_imag);

	if (!access_ok(VERIFY_WRITE, up,
			sizeof(struct atomisp_dis_statistics32)) ||
		copy_to_user(up, kp, sizeof(struct atomisp_dvs_grid_info)) ||
		put_user(hor_prod_odd_real,
				&up->dvs2_stat.hor_prod.odd_real) ||
		put_user(hor_prod_odd_imag,
				&up->dvs2_stat.hor_prod.odd_imag) ||
		put_user(hor_prod_even_real,
				&up->dvs2_stat.hor_prod.even_real) ||
		put_user(hor_prod_even_imag,
				&up->dvs2_stat.hor_prod.even_imag) ||
		put_user(ver_prod_odd_real,
				&up->dvs2_stat.ver_prod.odd_real) ||
		put_user(ver_prod_odd_imag,
				&up->dvs2_stat.ver_prod.odd_imag) ||
		put_user(ver_prod_even_real,
				&up->dvs2_stat.ver_prod.even_real) ||
		put_user(ver_prod_even_imag,
				&up->dvs2_stat.ver_prod.even_imag) ||
		put_user(kp->exp_id, &up->exp_id))
			return -EFAULT;

	return 0;
}

static int get_atomisp_dis_coefficients32(struct atomisp_dis_coefficients *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(VERIFY_READ, up,
			sizeof(struct atomisp_dis_coefficients32)) ||
		copy_from_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))
			return -EFAULT;

	kp->hor_coefs.odd_real = compat_ptr(hor_coefs_odd_real);
	kp->hor_coefs.odd_imag = compat_ptr(hor_coefs_odd_imag);
	kp->hor_coefs.even_real = compat_ptr(hor_coefs_even_real);
	kp->hor_coefs.even_imag = compat_ptr(hor_coefs_even_imag);
	kp->ver_coefs.odd_real = compat_ptr(ver_coefs_odd_real);
	kp->ver_coefs.odd_imag = compat_ptr(ver_coefs_odd_imag);
	kp->ver_coefs.even_real = compat_ptr(ver_coefs_even_real);
	kp->ver_coefs.even_imag = compat_ptr(ver_coefs_even_imag);
	return 0;
}

static int get_atomisp_dvs_6axis_config32(struct atomisp_dvs_6axis_config *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(VERIFY_READ, up,
			sizeof(struct atomisp_dvs_6axis_config32)) ||
		get_user(kp->exp_id, &up->exp_id) ||
		get_user(kp->width_y, &up->width_y) ||
		get_user(kp->height_y, &up->height_y) ||
		get_user(kp->width_uv, &up->width_uv) ||
		get_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))
			return -EFAULT;

	kp->xcoords_y = (void __force *)compat_ptr(xcoords_y);
	kp->ycoords_y = (void __force *)compat_ptr(ycoords_y);
	kp->xcoords_uv = (void __force *)compat_ptr(xcoords_uv);
	kp->ycoords_uv = (void __force *)compat_ptr(ycoords_uv);
	return 0;
}

static int get_atomisp_3a_statistics32(struct atomisp_3a_statistics *kp,
				struct atomisp_3a_statistics32 __user *up)
{
	compat_uptr_t data;
	compat_uptr_t rgby_data;

	if (!access_ok(VERIFY_READ, up,
			sizeof(struct atomisp_3a_statistics32)) ||
		copy_from_user(kp, up, sizeof(struct atomisp_grid_info)) ||
		get_user(rgby_data, &up->rgby_data) ||
		get_user(data, &up->data) ||
		get_user(kp->exp_id, &up->exp_id) ||
		get_user(kp->isp_config_id, &up->isp_config_id))
			return -EFAULT;

	kp->data = compat_ptr(data);
	kp->rgby_data = compat_ptr(rgby_data);

	return 0;
}

static int put_atomisp_3a_statistics32(struct atomisp_3a_statistics *kp,
				struct atomisp_3a_statistics32 __user *up)
{
	compat_uptr_t data = (compat_uptr_t)((uintptr_t)kp->data);
	compat_uptr_t rgby_data = (compat_uptr_t)((uintptr_t)kp->rgby_data);

	if (!access_ok(VERIFY_WRITE, up,
			sizeof(struct atomisp_3a_statistics32)) ||
		copy_to_user(up, kp, sizeof(struct atomisp_grid_info)) ||
		put_user(rgby_data, &up->rgby_data) ||
		put_user(data, &up->data) ||
		put_user(kp->exp_id, &up->exp_id) ||
		put_user(kp->isp_config_id, &up->isp_config_id))
			return -EFAULT;

	return 0;
}


static int get_atomisp_metadata_stat32(struct atomisp_metadata *kp,
				struct atomisp_metadata32 __user *up)
{
	compat_uptr_t data;
	compat_uptr_t effective_width;

	if (!access_ok(VERIFY_READ, up,
			sizeof(struct atomisp_metadata32)) ||
		get_user(data, &up->data) ||
		get_user(kp->width, &up->width) ||
		get_user(kp->height, &up->height) ||
		get_user(kp->stride, &up->stride) ||
		get_user(kp->exp_id, &up->exp_id) ||
		get_user(effective_width, &up->effective_width))
			return -EFAULT;

	kp->data = compat_ptr(data);
	kp->effective_width = (void __force *)compat_ptr(effective_width);
	return 0;
}


static int put_atomisp_metadata_stat32(struct atomisp_metadata *kp,
				struct atomisp_metadata32 __user *up)
{
	compat_uptr_t data = (compat_uptr_t)((uintptr_t)kp->data);
	compat_uptr_t effective_width =
		(compat_uptr_t)((uintptr_t)kp->effective_width);
	if (!access_ok(VERIFY_WRITE, up,
			sizeof(struct atomisp_metadata32)) ||
		put_user(data, &up->data) ||
		put_user(kp->width, &up->width) ||
		put_user(kp->height, &up->height) ||
		put_user(kp->stride, &up->stride) ||
		put_user(kp->exp_id, &up->exp_id) ||
		put_user(effective_width, &up->effective_width))
			return -EFAULT;

	return 0;
}

static int put_atomisp_metadata_by_type_stat32(
				struct atomisp_metadata_with_type *kp,
				struct atomisp_metadata_with_type32 __user *up)
{
	compat_uptr_t data = (compat_uptr_t)((uintptr_t)kp->data);
	compat_uptr_t effective_width =
		(compat_uptr_t)((uintptr_t)kp->effective_width);
	if (!access_ok(VERIFY_WRITE, up,
			sizeof(struct atomisp_metadata_with_type32)) ||
		put_user(data, &up->data) ||
		put_user(kp->width, &up->width) ||
		put_user(kp->height, &up->height) ||
		put_user(kp->stride, &up->stride) ||
		put_user(kp->exp_id, &up->exp_id) ||
		put_user(effective_width, &up->effective_width) ||
		put_user(kp->type, &up->type))
			return -EFAULT;

	return 0;
}

static int get_atomisp_metadata_by_type_stat32(
				struct atomisp_metadata_with_type *kp,
				struct atomisp_metadata_with_type32 __user *up)
{
	compat_uptr_t data;
	compat_uptr_t effective_width;

	if (!access_ok(VERIFY_READ, up,
			sizeof(struct atomisp_metadata_with_type32)) ||
		get_user(data, &up->data) ||
		get_user(kp->width, &up->width) ||
		get_user(kp->height, &up->height) ||
		get_user(kp->stride, &up->stride) ||
		get_user(kp->exp_id, &up->exp_id) ||
		get_user(effective_width, &up->effective_width) ||
		get_user(kp->type, &up->type))
			return -EFAULT;

	kp->data = compat_ptr(data);
	kp->effective_width = (void __force *)compat_ptr(effective_width);
	return 0;
}

static int get_atomisp_morph_table32(struct atomisp_morph_table *kp,
				struct atomisp_morph_table32 __user *up)
{
	unsigned int n = ATOMISP_MORPH_TABLE_NUM_PLANES;

	if (!access_ok(VERIFY_READ, up,
			sizeof(struct atomisp_morph_table32)) ||
		get_user(kp->enabled, &up->enabled) ||
		get_user(kp->width, &up->width) ||
		get_user(kp->height, &up->height))
			return -EFAULT;

	while (n-- > 0) {
		uintptr_t *coord_kp = (uintptr_t *)&kp->coordinates_x[n];

		if (get_user((*coord_kp), &up->coordinates_x[n]))
			return -EFAULT;

		coord_kp = (uintptr_t *)&kp->coordinates_y[n];
		if (get_user((*coord_kp), &up->coordinates_y[n]))
			return -EFAULT;
	}
	return 0;
}

static int put_atomisp_morph_table32(struct atomisp_morph_table *kp,
				struct atomisp_morph_table32 __user *up)
{
	unsigned int n = ATOMISP_MORPH_TABLE_NUM_PLANES;

	if (!access_ok(VERIFY_WRITE, up,
			sizeof(struct atomisp_morph_table32)) ||
		put_user(kp->enabled, &up->enabled) ||
		put_user(kp->width, &up->width) ||
		put_user(kp->height, &up->height))
			return -EFAULT;

	while (n-- > 0) {
		uintptr_t *coord_kp = (uintptr_t *)&kp->coordinates_x[n];

		if (put_user((*coord_kp), &up->coordinates_x[n]))
			return -EFAULT;

		coord_kp = (uintptr_t *)&kp->coordinates_y[n];
		if (put_user((*coord_kp), &up->coordinates_y[n]))
			return -EFAULT;
	}
	return 0;
}

static int get_atomisp_overlay32(struct atomisp_overlay *kp,
					struct atomisp_overlay32 __user *up)
{
	compat_uptr_t frame;
	if (!access_ok(VERIFY_READ, up, sizeof(struct atomisp_overlay32)) ||
		get_user(frame, &up->frame) ||
		get_user(kp->bg_y, &up->bg_y) ||
		get_user(kp->bg_u, &up->bg_u) ||
		get_user(kp->bg_v, &up->bg_v) ||
		get_user(kp->blend_input_perc_y, &up->blend_input_perc_y) ||
		get_user(kp->blend_input_perc_u, &up->blend_input_perc_u) ||
		get_user(kp->blend_input_perc_v, &up->blend_input_perc_v) ||
		get_user(kp->blend_overlay_perc_y,
				&up->blend_overlay_perc_y) ||
		get_user(kp->blend_overlay_perc_u,
				&up->blend_overlay_perc_u) ||
		get_user(kp->blend_overlay_perc_v,
				&up->blend_overlay_perc_v) ||
		get_user(kp->blend_overlay_perc_u,
				&up->blend_overlay_perc_u) ||
		get_user(kp->overlay_start_x, &up->overlay_start_y))
			return -EFAULT;

	kp->frame = (void __force *)compat_ptr(frame);
	return 0;
}

static int put_atomisp_overlay32(struct atomisp_overlay *kp,
					struct atomisp_overlay32 __user *up)
{
	compat_uptr_t frame = (compat_uptr_t)((uintptr_t)kp->frame);

	if (!access_ok(VERIFY_WRITE, up, sizeof(struct atomisp_overlay32)) ||
		put_user(frame, &up->frame) ||
		put_user(kp->bg_y, &up->bg_y) ||
		put_user(kp->bg_u, &up->bg_u) ||
		put_user(kp->bg_v, &up->bg_v) ||
		put_user(kp->blend_input_perc_y, &up->blend_input_perc_y) ||
		put_user(kp->blend_input_perc_u, &up->blend_input_perc_u) ||
		put_user(kp->blend_input_perc_v, &up->blend_input_perc_v) ||
		put_user(kp->blend_overlay_perc_y,
				&up->blend_overlay_perc_y) ||
		put_user(kp->blend_overlay_perc_u,
				&up->blend_overlay_perc_u) ||
		put_user(kp->blend_overlay_perc_v,
				&up->blend_overlay_perc_v) ||
		put_user(kp->blend_overlay_perc_u,
				&up->blend_overlay_perc_u) ||
		put_user(kp->overlay_start_x, &up->overlay_start_y))
			return -EFAULT;

	return 0;
}

static int get_atomisp_calibration_group32(
				struct atomisp_calibration_group *kp,
				struct atomisp_calibration_group32 __user *up)
{
	compat_uptr_t calb_grp_values;

	if (!access_ok(VERIFY_READ, up,
			sizeof(struct atomisp_calibration_group32)) ||
		get_user(kp->size, &up->size) ||
		get_user(kp->type, &up->type) ||
		get_user(calb_grp_values, &up->calb_grp_values))
			return -EFAULT;

	kp->calb_grp_values = (void __force *)compat_ptr(calb_grp_values);
	return 0;
}

static int put_atomisp_calibration_group32(
				struct atomisp_calibration_group *kp,
				struct atomisp_calibration_group32 __user *up)
{
	compat_uptr_t calb_grp_values =
			(compat_uptr_t)((uintptr_t)kp->calb_grp_values);

	if (!access_ok(VERIFY_WRITE, up,
			sizeof(struct atomisp_calibration_group32)) ||
		put_user(kp->size, &up->size) ||
		put_user(kp->type, &up->type) ||
		put_user(calb_grp_values, &up->calb_grp_values))
			return -EFAULT;

	return 0;
}

static int get_atomisp_acc_fw_load32(struct atomisp_acc_fw_load *kp,
				struct atomisp_acc_fw_load32 __user *up)
{
	compat_uptr_t data;

	if (!access_ok(VERIFY_READ, up,
			sizeof(struct atomisp_acc_fw_load32)) ||
		get_user(kp->size, &up->size) ||
		get_user(kp->fw_handle, &up->fw_handle) ||
		get_user(data, &up->data))
			return -EFAULT;

	kp->data = compat_ptr(data);
	return 0;
}

static int put_atomisp_acc_fw_load32(struct atomisp_acc_fw_load *kp,
				struct atomisp_acc_fw_load32 __user *up)
{
	compat_uptr_t data = (compat_uptr_t)((uintptr_t)kp->data);

	if (!access_ok(VERIFY_WRITE, up,
			sizeof(struct atomisp_acc_fw_load32)) ||
		put_user(kp->size, &up->size) ||
		put_user(kp->fw_handle, &up->fw_handle) ||
		put_user(data, &up->data))
			return -EFAULT;

	return 0;
}

static int get_atomisp_acc_fw_arg32(struct atomisp_acc_fw_arg *kp,
					struct atomisp_acc_fw_arg32 __user *up)
{
	compat_uptr_t value;

	if (!access_ok(VERIFY_READ, up, sizeof(struct atomisp_acc_fw_arg32)) ||
		get_user(kp->fw_handle, &up->fw_handle) ||
		get_user(kp->index, &up->index) ||
		get_user(value, &up->value) ||
		get_user(kp->size, &up->size))
			return -EFAULT;

	kp->value = compat_ptr(value);
	return 0;
}

static int put_atomisp_acc_fw_arg32(struct atomisp_acc_fw_arg *kp,
					struct atomisp_acc_fw_arg32 __user *up)
{
	compat_uptr_t value = (compat_uptr_t)((uintptr_t)kp->value);

	if (!access_ok(VERIFY_WRITE, up, sizeof(struct atomisp_acc_fw_arg32)) ||
		put_user(kp->fw_handle, &up->fw_handle) ||
		put_user(kp->index, &up->index) ||
		put_user(value, &up->value) ||
		put_user(kp->size, &up->size))
			return -EFAULT;

	return 0;
}

static int get_v4l2_private_int_data32(struct v4l2_private_int_data *kp,
					struct v4l2_private_int_data32 __user *up)
{
	compat_uptr_t data;

	if (!access_ok(VERIFY_READ, up,
			sizeof(struct v4l2_private_int_data32)) ||
		get_user(kp->size, &up->size) ||
		get_user(data, &up->data) ||
		get_user(kp->reserved[0], &up->reserved[0]) ||
		get_user(kp->reserved[1], &up->reserved[1]))
			return -EFAULT;

	kp->data = compat_ptr(data);
	return 0;
}

static int put_v4l2_private_int_data32(struct v4l2_private_int_data *kp,
				struct v4l2_private_int_data32 __user *up)
{
	compat_uptr_t data = (compat_uptr_t)((uintptr_t)kp->data);

	if (!access_ok(VERIFY_WRITE, up,
			sizeof(struct v4l2_private_int_data32)) ||
		put_user(kp->size, &up->size) ||
		put_user(data, &up->data) ||
		put_user(kp->reserved[0], &up->reserved[0]) ||
		put_user(kp->reserved[1], &up->reserved[1]))
			return -EFAULT;

	return 0;
}

static int get_atomisp_shading_table32(struct atomisp_shading_table *kp,
				struct atomisp_shading_table32 __user *up)
{
	unsigned int n = ATOMISP_NUM_SC_COLORS;

	if (!access_ok(VERIFY_READ, up,
			sizeof(struct atomisp_shading_table32)) ||
		get_user(kp->enable, &up->enable) ||
		get_user(kp->sensor_width, &up->sensor_width) ||
		get_user(kp->sensor_height, &up->sensor_height) ||
		get_user(kp->width, &up->width) ||
		get_user(kp->height, &up->height) ||
		get_user(kp->fraction_bits, &up->fraction_bits))
			return -EFAULT;

	while (n-- > 0) {
		uintptr_t *data_p = (uintptr_t *)&kp->data[n];

		if (get_user((*data_p), &up->data[n]))
			return -EFAULT;
	}
	return 0;
}

static int get_atomisp_acc_map32(struct atomisp_acc_map *kp,
					struct atomisp_acc_map32 __user *up)
{
	compat_uptr_t user_ptr;

	if (!access_ok(VERIFY_READ, up, sizeof(struct atomisp_acc_map32)) ||
		get_user(kp->flags, &up->flags) ||
		get_user(kp->length, &up->length) ||
		get_user(user_ptr, &up->user_ptr) ||
		get_user(kp->css_ptr, &up->css_ptr) ||
		get_user(kp->reserved[0], &up->reserved[0]) ||
		get_user(kp->reserved[1], &up->reserved[1]) ||
		get_user(kp->reserved[2], &up->reserved[2]) ||
		get_user(kp->reserved[3], &up->reserved[3]))
			return -EFAULT;

	kp->user_ptr = compat_ptr(user_ptr);
	return 0;
}

static int put_atomisp_acc_map32(struct atomisp_acc_map *kp,
					struct atomisp_acc_map32 __user *up)
{
	compat_uptr_t user_ptr = (compat_uptr_t)((uintptr_t)kp->user_ptr);

	if (!access_ok(VERIFY_WRITE, up, sizeof(struct atomisp_acc_map32)) ||
		put_user(kp->flags, &up->flags) ||
		put_user(kp->length, &up->length) ||
		put_user(user_ptr, &up->user_ptr) ||
		put_user(kp->css_ptr, &up->css_ptr) ||
		put_user(kp->reserved[0], &up->reserved[0]) ||
		put_user(kp->reserved[1], &up->reserved[1]) ||
		put_user(kp->reserved[2], &up->reserved[2]) ||
		put_user(kp->reserved[3], &up->reserved[3]))
			return -EFAULT;

	return 0;
}

static int get_atomisp_acc_s_mapped_arg32(struct atomisp_acc_s_mapped_arg *kp,
				struct atomisp_acc_s_mapped_arg32 __user *up)
{
	if (!access_ok(VERIFY_READ, up,
			sizeof(struct atomisp_acc_s_mapped_arg32)) ||
		get_user(kp->fw_handle, &up->fw_handle) ||
		get_user(kp->memory, &up->memory) ||
		get_user(kp->length, &up->length) ||
		get_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 *kp,
				struct atomisp_acc_s_mapped_arg32 __user *up)
{
	if (!access_ok(VERIFY_WRITE, up,
			sizeof(struct atomisp_acc_s_mapped_arg32)) ||
		put_user(kp->fw_handle, &up->fw_handle) ||
		put_user(kp->memory, &up->memory) ||
		put_user(kp->length, &up->length) ||
		put_user(kp->css_ptr, &up->css_ptr))
			return -EFAULT;

	return 0;
}

static int get_atomisp_parameters32(struct atomisp_parameters *kp,
					struct atomisp_parameters32 __user *up)
{
	int n = offsetof(struct atomisp_parameters32, output_frame) /
				sizeof(compat_uptr_t);
	unsigned int size, offset = 0;
	void  __user *user_ptr;
#ifdef ISP2401
	unsigned int stp, mtp, dcp, dscp = 0;

#endif
	if (!access_ok(VERIFY_READ, up, sizeof(struct atomisp_parameters32)))
			return -EFAULT;

	while (n >= 0) {
		compat_uptr_t __user *src = ((compat_uptr_t __user *)up) + n;
		uintptr_t *dst = ((uintptr_t *)kp) + n;

		if (get_user((*dst), src))
			return -EFAULT;
		n--;
	}
	if (get_user(kp->isp_config_id, &up->isp_config_id) ||
#ifndef ISP2401
	    get_user(kp->per_frame_setting, &up->per_frame_setting))
#else
	    get_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))
#endif
		return -EFAULT;

	{
		union {
			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;
		} karg;

		size = sizeof(struct atomisp_shading_table) +
				sizeof(struct atomisp_morph_table) +
				sizeof(struct atomisp_dis_coefficients) +
				sizeof(struct atomisp_dvs_6axis_config);
		user_ptr = compat_alloc_user_space(size);

		/* handle shading table */
#ifndef ISP2401
		if (up->shading_table != 0) {
#else
		if (stp != 0) {
#endif
			if (get_atomisp_shading_table32(&karg.shading_table,
				(struct atomisp_shading_table32 __user *)
#ifndef ISP2401
						(uintptr_t)up->shading_table))
#else
						(uintptr_t)stp))
#endif
				return -EFAULT;

			kp->shading_table = (void __force *)user_ptr + offset;
			offset = sizeof(struct atomisp_shading_table);
			if (!kp->shading_table)
				return -EFAULT;

			if (copy_to_user((void __user *)kp->shading_table,
					 &karg.shading_table,
					 sizeof(struct atomisp_shading_table)))
				return -EFAULT;
		}

		/* handle morph table */
#ifndef ISP2401
		if (up->morph_table != 0) {
#else
		if (mtp != 0) {
#endif
			if (get_atomisp_morph_table32(&karg.morph_table,
					(struct atomisp_morph_table32 __user *)
#ifndef ISP2401
						(uintptr_t)up->morph_table))
#else
						(uintptr_t)mtp))
#endif
				return -EFAULT;

			kp->morph_table = (void __force *)user_ptr + offset;
			offset += sizeof(struct atomisp_morph_table);
			if (!kp->morph_table)
				return -EFAULT;

			if (copy_to_user((void __user *)kp->morph_table,
					 &karg.morph_table,
					 sizeof(struct atomisp_morph_table)))
				return -EFAULT;
		}

		/* handle dvs2 coefficients */
#ifndef ISP2401
		if (up->dvs2_coefs != 0) {
#else
		if (dcp != 0) {
#endif
			if (get_atomisp_dis_coefficients32(&karg.dvs2_coefs,
				(struct atomisp_dis_coefficients32 __user *)
#ifndef ISP2401
						(uintptr_t)up->dvs2_coefs))
#else
						(uintptr_t)dcp))
#endif
				return -EFAULT;

			kp->dvs2_coefs = (void __force *)user_ptr + offset;
			offset += sizeof(struct atomisp_dis_coefficients);
			if (!kp->dvs2_coefs)
				return -EFAULT;

			if (copy_to_user((void __user *)kp->dvs2_coefs,
					 &karg.dvs2_coefs,
					 sizeof(struct atomisp_dis_coefficients)))
				return -EFAULT;
		}
		/* handle dvs 6axis configuration */
#ifndef ISP2401
		if (up->dvs_6axis_config != 0) {
#else
		if (dscp != 0) {
#endif
			if (get_atomisp_dvs_6axis_config32(&karg.dvs_6axis_config,
				(struct atomisp_dvs_6axis_config32 __user *)
#ifndef ISP2401
						(uintptr_t)up->dvs_6axis_config))
#else
						(uintptr_t)dscp))
#endif
				return -EFAULT;

			kp->dvs_6axis_config = (void __force *)user_ptr + offset;
			offset += sizeof(struct atomisp_dvs_6axis_config);
			if (!kp->dvs_6axis_config)
				return -EFAULT;

			if (copy_to_user((void __user *)kp->dvs_6axis_config,
					 &karg.dvs_6axis_config,
					 sizeof(struct atomisp_dvs_6axis_config)))
				return -EFAULT;
		}
	}
	return 0;
}

static int get_atomisp_acc_fw_load_to_pipe32(
			struct atomisp_acc_fw_load_to_pipe *kp,
			struct atomisp_acc_fw_load_to_pipe32 __user *up)
{
	compat_uptr_t data;
	if (!access_ok(VERIFY_READ, up,
			sizeof(struct atomisp_acc_fw_load_to_pipe32)) ||
		get_user(kp->flags, &up->flags) ||
		get_user(kp->fw_handle, &up->fw_handle) ||
		get_user(kp->size, &up->size) ||
		get_user(kp->type, &up->type) ||
		get_user(kp->reserved[0], &up->reserved[0]) ||
		get_user(kp->reserved[1], &up->reserved[1]) ||
		get_user(kp->reserved[2], &up->reserved[2]) ||
		get_user(data, &up->data))
			return -EFAULT;

	kp->data = compat_ptr(data);
	return 0;
}

static int put_atomisp_acc_fw_load_to_pipe32(
			struct atomisp_acc_fw_load_to_pipe *kp,
			struct atomisp_acc_fw_load_to_pipe32 __user *up)
{
	compat_uptr_t data = (compat_uptr_t)((uintptr_t)kp->data);
	if (!access_ok(VERIFY_WRITE, up,
			sizeof(struct atomisp_acc_fw_load_to_pipe32)) ||
		put_user(kp->flags, &up->flags) ||
		put_user(kp->fw_handle, &up->fw_handle) ||
		put_user(kp->size, &up->size) ||
		put_user(kp->type, &up->type) ||
		put_user(kp->reserved[0], &up->reserved[0]) ||
		put_user(kp->reserved[1], &up->reserved[1]) ||
		put_user(kp->reserved[2], &up->reserved[2]) ||
		put_user(data, &up->data))
			return -EFAULT;

	return 0;
}

static int get_atomisp_sensor_ae_bracketing_lut(
			struct atomisp_sensor_ae_bracketing_lut *kp,
			struct atomisp_sensor_ae_bracketing_lut32 __user *up)
{
	compat_uptr_t lut;
	if (!access_ok(VERIFY_READ, up,
			sizeof(struct atomisp_sensor_ae_bracketing_lut32)) ||
		get_user(kp->lut_size, &up->lut_size) ||
		get_user(lut, &up->lut))
			return -EFAULT;

	kp->lut = (void __force *)compat_ptr(lut);
	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;
}

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;
	} karg;
	mm_segment_t old_fs;
	void __user *up = compat_ptr(arg);
	long err = -ENOIOCTLCMD;

	/* 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;

	old_fs = get_fs();
	set_fs(KERNEL_DS);
	err = native_ioctl(file, cmd, (unsigned long)&karg);
	set_fs(old_fs);
	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:
#ifdef ISP2401
	case ATOMISP_IOC_S_SENSOR_RUNMODE:
	case ATOMISP_IOC_G_UPDATE_EXPOSURE:
#endif
		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 */
