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

Commit c36195bb authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

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

parents 8cefe950 6cac77cc
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
@@ -568,6 +568,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 {
@@ -864,11 +871,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)

@@ -878,11 +880,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)

@@ -974,6 +971,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)

@@ -985,6 +1019,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 */