Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6cac77cc authored by Vasko Kalanoski's avatar Vasko Kalanoski Committed by Rajesh Bondugula
Browse files

msm: camera: sensor: add compat ioctl support in ois driver



Add compat ioctl support in ois driver so that 32 bit
userpsace ioctl calls are directed to proper ioctl handler
functions in ois driver.

Change-Id: Id5ff736fc62bc8aec3604081191fe05dd4fa5f94
Signed-off-by: default avatarVasko Kalanoski <vaskok@codeaurora.org>
parent acdce027
Loading
Loading
Loading
Loading
+159 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ DEFINE_MSM_MUTEX(msm_ois_mutex);

#define MAX_POLL_COUNT 100

static struct v4l2_file_operations msm_ois_v4l2_subdev_fops;
static int32_t msm_ois_power_up(struct msm_ois_ctrl_t *o_ctrl);
static int32_t msm_ois_power_down(struct msm_ois_ctrl_t *o_ctrl);

@@ -859,6 +860,156 @@ probe_failure:
	return rc;
}

#ifdef CONFIG_COMPAT
static long msm_ois_subdev_do_ioctl(
	struct file *file, unsigned int cmd, void *arg)
{
	long rc = 0;
	struct video_device *vdev = video_devdata(file);
	struct v4l2_subdev *sd = vdev_to_v4l2_subdev(vdev);
	struct msm_ois_cfg_data32 *u32 =
		(struct msm_ois_cfg_data32 *)arg;
	struct msm_ois_cfg_data ois_data;
	void *parg = arg;

	ois_data.cfgtype = u32->cfgtype;
	ois_data.is_ois_supported = u32->is_ois_supported;
	switch (cmd) {
	case VIDIOC_MSM_OIS_CFG32:
		cmd = VIDIOC_MSM_OIS_CFG;

		switch (u32->cfgtype) {
		case CFG_OIS_INI_SET:
		case CFG_OIS_ENABLE:
		case CFG_OIS_DISABLE:
		case CFG_OIS_SET_MOVIE_MODE:
		case CFG_OIS_SET_STILL_MODE:
		case CFG_OIS_SET_CENTERING_ON:
		case CFG_OIS_SET_PANTILT_ON:
			ois_data.cfg.enable_centering_ois =
				u32->cfg.enable_centering_ois;
			ois_data.cfg.set_info.ois_params.data_size =
				u32->cfg.set_info.ois_params.data_size;
			ois_data.cfg.set_info.ois_params.init_setting_size =
				u32->cfg.set_info.ois_params.init_setting_size;
			ois_data.cfg.set_info.ois_params.
				enable_ois_setting_size = u32->cfg.set_info.
				ois_params.enable_ois_setting_size;
			ois_data.cfg.set_info.ois_params.
				disable_ois_setting_size =
				u32->cfg.set_info.ois_params.
				disable_ois_setting_size;
			ois_data.cfg.set_info.ois_params.
				movie_mode_ois_setting_size =
				u32->cfg.set_info.ois_params.
				movie_mode_ois_setting_size;
			ois_data.cfg.set_info.ois_params.
				still_mode_ois_setting_size =
				u32->cfg.set_info.ois_params.
				still_mode_ois_setting_size;
			ois_data.cfg.set_info.ois_params.
				centering_on_ois_setting_size =
				u32->cfg.set_info.ois_params.
				centering_on_ois_setting_size;
			ois_data.cfg.set_info.ois_params.
				centering_off_ois_setting_size =
				u32->cfg.set_info.ois_params.
				centering_off_ois_setting_size;
			ois_data.cfg.set_info.ois_params.
				pantilt_on_ois_setting_size =
				u32->cfg.set_info.ois_params.
				pantilt_on_ois_setting_size;
			ois_data.cfg.set_info.ois_params.i2c_addr =
				u32->cfg.set_info.ois_params.i2c_addr;
			ois_data.cfg.set_info.ois_params.i2c_addr_type =
				u32->cfg.set_info.ois_params.i2c_addr_type;
			ois_data.cfg.set_info.ois_params.i2c_data_type =
				u32->cfg.set_info.ois_params.i2c_data_type;
			ois_data.cfg.set_info.ois_params.init_settings =
				compat_ptr(u32->cfg.set_info.ois_params.
				init_settings);
			ois_data.cfg.set_info.ois_params.enable_ois_settings =
				compat_ptr(u32->cfg.set_info.ois_params.
				enable_ois_settings);
			ois_data.cfg.set_info.ois_params.disable_ois_settings =
				compat_ptr(u32->cfg.set_info.ois_params.
				disable_ois_settings);
			ois_data.cfg.set_info.ois_params.
				movie_mode_ois_settings =
				compat_ptr(u32->cfg.set_info.ois_params.
				movie_mode_ois_settings);
			ois_data.cfg.set_info.ois_params.
				still_mode_ois_settings =
				compat_ptr(u32->cfg.set_info.ois_params.
				still_mode_ois_settings);
			ois_data.cfg.set_info.ois_params.
				centering_on_ois_settings =
				compat_ptr(u32->cfg.set_info.ois_params.
				centering_on_ois_settings);
			ois_data.cfg.set_info.ois_params.
				centering_off_ois_settings =
				compat_ptr(u32->cfg.set_info.ois_params.
				centering_off_ois_settings);
			ois_data.cfg.set_info.ois_params.
				pantilt_on_ois_settings =
				compat_ptr(u32->cfg.set_info.ois_params.
				pantilt_on_ois_settings);
			parg = &ois_data;
			break;
		case CFG_OIS_I2C_WRITE_SEQ_TABLE: {
			struct msm_camera_i2c_seq_reg_setting settings;
			struct msm_camera_i2c_seq_reg_setting32 settings32;

			if (copy_from_user(&settings32,
				(void *)compat_ptr(u32->cfg.settings),
				sizeof(
				struct msm_camera_i2c_seq_reg_setting32))) {
				pr_err("copy_from_user failed\n");
				return -EFAULT;
			}

			settings.addr_type = settings32.addr_type;
			settings.delay = settings32.delay;
			settings.size = settings32.size;
			settings.reg_setting =
				compat_ptr(settings32.reg_setting);

			ois_data.cfgtype = u32->cfgtype;
			ois_data.cfg.settings = &settings;
			parg = &ois_data;
		}
			break;
		default:
			parg = &ois_data;
			break;
		}
	}
	rc = msm_ois_subdev_ioctl(sd, cmd, parg);
	if (!rc)
		return rc;
	switch (cmd) {
	case VIDIOC_MSM_OIS_CFG:
		switch (u32->cfgtype) {
		case CFG_OIS_INI_SET:
			u32->is_ois_supported =
				ois_data.is_ois_supported;
			break;
		default:
			break;
		}
	default:
		break;
	}
	return rc;
}

static long msm_ois_subdev_fops_ioctl(struct file *file, unsigned int cmd,
	unsigned long arg)
{
	return video_usercopy(file, cmd, arg, msm_ois_subdev_do_ioctl);
}
#endif

static int32_t msm_ois_platform_probe(struct platform_device *pdev)
{
	int32_t rc = 0;
@@ -941,6 +1092,14 @@ static int32_t msm_ois_platform_probe(struct platform_device *pdev)
	msm_ois_t->msm_sd.close_seq = MSM_SD_CLOSE_2ND_CATEGORY | 0x2;
	msm_sd_register(&msm_ois_t->msm_sd);
	msm_ois_t->ois_state = OIS_POWER_DOWN;
	msm_ois_v4l2_subdev_fops = v4l2_subdev_fops;
#ifdef CONFIG_COMPAT
	msm_ois_v4l2_subdev_fops.compat_ioctl32 =
		msm_ois_subdev_fops_ioctl;
#endif
	msm_ois_t->msm_sd.sd.devnode->fops =
		&msm_ois_v4l2_subdev_fops;

	CDBG("Exit\n");
	return rc;
}
+54 −10
Original line number Diff line number Diff line
@@ -529,6 +529,13 @@ struct msm_eeprom_cfg_data32 {
		struct eeprom_write_t32 write_data;
	} cfg;
};

struct msm_camera_i2c_seq_reg_setting32 {
	compat_uptr_t reg_setting;
	uint16_t size;
	enum msm_camera_i2c_reg_addr_type addr_type;
	uint16_t delay;
};
#endif

enum msm_sensor_cfg_type_t {
@@ -825,11 +832,6 @@ struct sensor_init_cfg_data {
#define VIDIOC_MSM_CSID_IO_CFG \
	_IOWR('V', BASE_VIDIOC_PRIVATE + 5, struct csid_cfg_data)

#ifdef CONFIG_COMPAT
#define VIDIOC_MSM_CSID_IO_CFG32 \
	_IOWR('V', BASE_VIDIOC_PRIVATE + 5, struct csid_cfg_data32)
#endif

#define VIDIOC_MSM_ACTUATOR_CFG \
	_IOWR('V', BASE_VIDIOC_PRIVATE + 6, struct msm_actuator_cfg_data)

@@ -839,11 +841,6 @@ struct sensor_init_cfg_data {
#define VIDIOC_MSM_EEPROM_CFG \
	_IOWR('V', BASE_VIDIOC_PRIVATE + 8, struct msm_eeprom_cfg_data)

#ifdef CONFIG_COMPAT
#define VIDIOC_MSM_EEPROM_CFG32 \
	_IOWR('V', BASE_VIDIOC_PRIVATE + 8, struct msm_eeprom_cfg_data32)
#endif

#define VIDIOC_MSM_SENSOR_GET_AF_STATUS \
	_IOWR('V', BASE_VIDIOC_PRIVATE + 9, uint32_t)

@@ -935,6 +932,43 @@ struct sensorb_cfg_data32 {
	} cfg;
};

struct msm_ois_params_t32 {
	uint16_t data_size;
	uint16_t init_setting_size;
	uint16_t enable_ois_setting_size;
	uint16_t disable_ois_setting_size;
	uint16_t movie_mode_ois_setting_size;
	uint16_t still_mode_ois_setting_size;
	uint16_t centering_on_ois_setting_size;
	uint16_t centering_off_ois_setting_size;
	uint16_t pantilt_on_ois_setting_size;
	uint32_t i2c_addr;
	enum msm_camera_i2c_reg_addr_type i2c_addr_type;
	enum msm_camera_i2c_data_type i2c_data_type;
	compat_uptr_t init_settings;
	compat_uptr_t enable_ois_settings;
	compat_uptr_t disable_ois_settings;
	compat_uptr_t movie_mode_ois_settings;
	compat_uptr_t still_mode_ois_settings;
	compat_uptr_t centering_on_ois_settings;
	compat_uptr_t centering_off_ois_settings;
	compat_uptr_t pantilt_on_ois_settings;
};

struct msm_ois_set_info_t32 {
	struct msm_ois_params_t32 ois_params;
};

struct msm_ois_cfg_data32 {
	int cfgtype;
	uint8_t is_ois_supported;
	union {
		uint8_t enable_centering_ois;
		struct msm_ois_set_info_t32 set_info;
		compat_uptr_t settings;
	} cfg;
};

#define VIDIOC_MSM_ACTUATOR_CFG32 \
	_IOWR('V', BASE_VIDIOC_PRIVATE + 6, struct msm_actuator_cfg_data32)

@@ -946,6 +980,16 @@ struct sensorb_cfg_data32 {

#define VIDIOC_MSM_SENSOR_CFG32 \
	_IOWR('V', BASE_VIDIOC_PRIVATE + 1, struct sensorb_cfg_data32)

#define VIDIOC_MSM_EEPROM_CFG32 \
	_IOWR('V', BASE_VIDIOC_PRIVATE + 8, struct msm_eeprom_cfg_data32)

#define VIDIOC_MSM_OIS_CFG32 \
	_IOWR('V', BASE_VIDIOC_PRIVATE + 11, struct msm_ois_cfg_data32)

#define VIDIOC_MSM_CSID_IO_CFG32 \
	_IOWR('V', BASE_VIDIOC_PRIVATE + 5, struct csid_cfg_data32)

#endif

#endif /* __LINUX_MSM_CAM_SENSOR_H */