static inline int sr200_get_exif_exptime(struct v4l2_subdev *subdev, u32 *exp_time)
{
	struct i2c_client *client = to_client(subdev);

	int err = 0;
	u8 read_value1 = 0;
	u8 read_value2 = 0;
	u8 read_value3 = 0;
	int OPCLK = 26000000;

	err = fimc_is_sr200_write8(client, 0x03, 0x20);
	CHECK_ERR_COND(err < 0, -ENODEV);

	fimc_is_sr200_read8(client, 0x80, &read_value1);
	fimc_is_sr200_read8(client, 0x81, &read_value2);
	fimc_is_sr200_read8(client, 0x82, &read_value3);

	cam_dbg("exposure time read_value %d, %d, %d\n",
		read_value1, read_value2, read_value3);

	if(read_value1 == 0 && read_value2 == 0 && read_value3 == 0)
	{
		*exp_time = 0;
		err = -EFAULT;
	} else {
		*exp_time = OPCLK / ((read_value1 << 19) + (read_value2 << 11) + (read_value3 << 3));
		cam_dbg("exposure time %u\n", *exp_time);
	}

	return err;
}
예제 #2
0
static int sr130pc10_check_dataline_stop(struct v4l2_subdev *sd)
{
	struct i2c_client *client = v4l2_get_subdevdata(sd);
	struct sr130pc10_state *state = to_state(sd);
	int err = -EINVAL;

	extern int sr130pc10_power_reset(void);

	cam_warn("Warning: do nothing!!\n");
	return err;

	//sr130pc10_write(client, 0xFCFCD000);
	//sr130pc10_write(client, 0x0028D000);
	//sr130pc10_write(client, 0x002A3100);
	//sr130pc10_write(client, 0x0F120000);

	//	err =  sr130pc10_write_regs(sd, sr130pc10_pattern_off,	sizeof(sr130pc10_pattern_off) / sizeof(sr130pc10_pattern_off[0]));
	cam_dbg("sensor reset\n");
#if defined(CONFIG_TARGET_LOCALE_KOR) || defined(CONFIG_TARGET_LOCALE_EUR) || defined(CONFIG_TARGET_LOCALE_HKTW) || defined(CONFIG_TARGET_LOCALE_HKTW_FET) || defined(CONFIG_TARGET_LOCALE_USAGSM)
        // dont't know where this code came from - comment out for compile error
        // sr130pc10_power_reset();
 #endif
	cam_dbg("load camera init setting\n");
	err = sr130pc10_i2c_set_config_register(client,
								   front_init_regs,
								   INIT_NUM_OF_REGS,
								   "front_init_regs");
	state->check_dataline = 0;
	/* mdelay(100); */
	return err;
}
int sensor_sr200_stream_off(struct v4l2_subdev *subdev)
{
	int ret = 0;
	struct sr200_state *state = to_state(subdev);

	cam_info("stream off\n");
	ret = sensor_sr200_apply_set(subdev, "sr200_stop_stream", &sr200_regset_table.stop_stream);
	state->preview.update_frmsize = 1;

	switch (state->runmode) {
	case RUNMODE_CAPTURING:
		cam_dbg("Capture Stop!\n");
		state->runmode = RUNMODE_CAPTURING_STOP;
		break;

	case RUNMODE_RUNNING:
		cam_dbg("Preview Stop!\n");
		state->runmode = RUNMODE_RUNNING_STOP;
		break;

	case RUNMODE_RECORDING:
		cam_dbg("Recording Stop!\n");
		state->runmode = RUNMODE_RECORDING_STOP;
		break;

	default:
		break;
	}

	return ret;
}
예제 #4
0
static int sr130pc10_check_dataline(struct v4l2_subdev *sd, s32 val)
{
	struct i2c_client *client = v4l2_get_subdevdata(sd);

	int err = 0;

	cam_info("DTP %s\n", val ? "ON" : "OFF");

	if (val) {
		cam_dbg("load sr130pc10_pattern_on\n");
		err = sr130pc10_i2c_set_config_register(client,
										  front_pattern_on_regs,
										  PATTERN_ON_NUM_OF_REGS,
										  "front_pattern_on_regs");
	} else {
		cam_dbg("load sr130pc10_pattern_off\n");
		err = sr130pc10_i2c_set_config_register(client,
										  front_pattern_off_regs,
										  PATTERN_OFF_NUM_OF_REGS,
										  "front_pattern_off_regs");
	}
	if (unlikely(err)) {
		cam_err("fail to DTP setting\n");
		return err;
	}

	return 0;
}
예제 #5
0
/*
 * sr200pc20_probe
 * Fetching platform data is being done with s_config subdev call.
 * In probe routine, we just register subdev device
 */
static int sr200pc20_probe(struct i2c_client *client,
		const struct i2c_device_id *id)
{
	struct sr200pc20_state *state = NULL;
	struct v4l2_subdev *sd = NULL;
	int err = 0;

	cam_dbg("E\n");

	state = kzalloc(sizeof(struct sr200pc20_state), GFP_KERNEL);
	if (state == NULL)
		return -ENOMEM;

	sd = &state->sd;
	strcpy(sd->name, SR200PC20_DRIVER_NAME);

	/* Registering subdev */
	v4l2_i2c_subdev_init(sd, client, &sr200pc20_ops);

	err = sr200pc20_s_config(sd, 0, client->dev.platform_data);
	CHECK_ERR_MSG(err, "fail to s_config\n");

	if (device_create_file(&client->dev, &dev_attr_camera_type) < 0) {
		cam_warn("failed to create device file, %s\n",
				dev_attr_camera_type.attr.name);
	}
	cam_dbg("probed!!\n");

	return 0;
}
static inline int sr200_get_exif_iso(struct v4l2_subdev *subdev, u16 *iso)
{
	struct i2c_client *client = to_client(subdev);
	int err = 0;
	u8 read_value = 0;
	unsigned short gain_value = 0;

	err = fimc_is_sr200_write8(client, 0x03, 0x20);
	CHECK_ERR_COND(err < 0, -ENODEV);
	fimc_is_sr200_read8(client, 0xb0, &read_value);

	gain_value = ((read_value * 100) / 32) + 50;
	cam_dbg("iso : gain_value=%d, read_value=%d\n", gain_value, read_value);

	if (gain_value < 114)
		*iso = 50;
	else if (gain_value < 214)
		*iso = 100;
	else if (gain_value < 264)
		*iso = 200;
	else if (gain_value < 752)
		*iso = 400;
	else
		*iso = 800;

	cam_dbg("ISO=%d\n", *iso);
	return 0;
}
예제 #7
0
void sr130pc10_regs_table_exit(void)
{
	cam_dbg(" start\n");

	if(front_regs_buf_ptr) {
		vfree(front_regs_buf_ptr);
		front_regs_buf_ptr = NULL;
	}

	cam_dbg(" done\n");
}
예제 #8
0
/*
 * s_config subdev ops
 * With camera device, we need to re-initialize
 * every single opening time therefor,
 * it is not necessary to be initialized on probe time.
 * except for version checking
 * NOTE: version checking is optional
 */
static int sr130pc10_s_config(struct v4l2_subdev *sd,
		int irq, void *platform_data)
{
	struct i2c_client *client = v4l2_get_subdevdata(sd);
	struct sr130pc10_state *state = to_state(sd);
	struct sr130pc10_platform_data *pdata;

	cam_dbg("E\n");

	state->initialized = 0;
	state->req_fps = state->set_fps = 8;
	state->sensor_mode = SENSOR_CAMERA;

	pdata = client->dev.platform_data;

	if (!pdata) {
		cam_err("no platform data\n");
		return -ENODEV;
	}

	/*
	 * Assign default format and resolution
	 * Use configured default information in platform data
	 * or without them, use default information in driver
	 */
	if (!(pdata->default_width && pdata->default_height)) {
		state->preview_frmsizes.width = DEFAULT_PREVIEW_WIDTH;
		state->preview_frmsizes.height = DEFAULT_PREVIEW_HEIGHT;

	} else {
		state->preview_frmsizes.width = pdata->default_width;
		state->preview_frmsizes.height = pdata->default_height;
	}
	state->capture_frmsizes.width = DEFAULT_CAPTURE_WIDTH;
	state->capture_frmsizes.height = DEFAULT_CAPTURE_HEIGHT;

	cam_dbg("preview_width: %d , preview_height: %d, "
		"capture_width: %d, capture_height: %d",
		state->preview_frmsizes.width, state->preview_frmsizes.height,
		state->capture_frmsizes.width, state->capture_frmsizes.height);

	state->req_fmt.width = state->preview_frmsizes.width;
	state->req_fmt.height = state->preview_frmsizes.height;
	if (!pdata->pixelformat)
		state->req_fmt.pixelformat = DEFAULT_FMT;
	else
		state->req_fmt.pixelformat = pdata->pixelformat;

	return 0;
}
예제 #9
0
static int sr130pc10_s_stream(struct v4l2_subdev *sd, int enable)
{
	struct sr130pc10_state *state = to_state(sd);
	/* struct i2c_client *client = v4l2_get_subdevdata(sd); */
	int err = 0;

	cam_info("stream mode = %d\n", enable);

	switch (enable) {
	case STREAM_MODE_CAM_OFF:
		if (state->sensor_mode == SENSOR_CAMERA) {
			if (state->check_dataline)
				err = sr130pc10_check_dataline(sd, 0);
			else
				err = sr130pc10_control_stream(sd, STREAM_STOP);
		}
		break;

	case STREAM_MODE_CAM_ON:
		/* The position of this code need to be adjusted later */
		if (state->sensor_mode == SENSOR_CAMERA) {
			if (state->req_fmt.priv == V4L2_PIX_FMT_MODE_CAPTURE)
				err = sr130pc10_set_capture_start(sd);
			else
				err = sr130pc10_set_preview_start(sd);
		}
		break;

	case STREAM_MODE_MOVIE_ON:
		cam_dbg("do nothing(movie on)!!\n");
		break;

	case STREAM_MODE_MOVIE_OFF:
		cam_dbg("do nothing(movie off)!!\n");
		break;

	default:
		cam_err("ERR: Invalid stream mode\n");
		break;
	}

	if (unlikely(err < 0)) {
		cam_err("ERR: faild\n");
		return err;
	}

	return 0;
}
static int sr200_set_effect(struct v4l2_subdev *subdev, int effect)
{
	struct sr200_state *state = to_state(subdev);
	int ret = 0;

	cam_info("%s( %d ) : E\n",__func__, effect);

	switch (effect) {
	case V4L2_IMAGE_EFFECT_BASE :
	case V4L2_IMAGE_EFFECT_NONE :
		ret = sensor_sr200_apply_set(subdev, "sr200_Effect_Normal", &sr200_regset_table.effect_none);
		break;
	case V4L2_IMAGE_EFFECT_BNW :
		ret = sensor_sr200_apply_set(subdev, "sr200_Effect_Gray", &sr200_regset_table.effect_gray);
		break;
	case V4L2_IMAGE_EFFECT_SEPIA :
		ret = sensor_sr200_apply_set(subdev, "sr200_Effect_Sepia", &sr200_regset_table.effect_sepia);
		break;
	case V4L2_IMAGE_EFFECT_NEGATIVE :
		ret = sensor_sr200_apply_set(subdev, "sr200_Effect_Negative", &sr200_regset_table.effect_negative);
		break;
	default:
		cam_dbg("%s: Not support.(%d)\n", __func__, effect);
		break;
	}

	state->effect = effect;
	return ret;
}
예제 #11
0
static int sr200pc20_set_preview_start(struct v4l2_subdev *sd)
{
	struct i2c_client *client = v4l2_get_subdevdata(sd);
	struct sr200pc20_state *state = to_state(sd);
	int err = -EINVAL;

	cam_info("reset preview\n");

	cam_dbg("load sr200pc20_preview\n");
	if(state->anti_banding == ANTI_BANDING_50HZ) {
	err = sr200pc20_i2c_set_config_register(client,
									front_preview_camera_50hz_regs,
									PREVIEW_CAMERA_NUM_OF_REGS,
									"front_preview_camera_50hz_regs");
	} else {
	err = sr200pc20_i2c_set_config_register(client,
									front_preview_camera_60hz_regs,
									PREVIEW_CAMERA_NUM_OF_REGS,
									"front_preview_camera_60hz_regs");
	}

	if (state->check_dataline)
		err = sr200pc20_check_dataline(sd, 1);
	if (unlikely(err)) {
		cam_err("fail to make preview\n");
		return err;
	}

	return 0;
}
예제 #12
0
static int sr200pc20_get_iso_speed_rate(struct v4l2_subdev *sd)
{
	struct i2c_client *client = v4l2_get_subdevdata(sd);
	unsigned short read_value;
	int gain;
	int isospeedrating = 0;

	sr200pc20_i2c_write_byte(client, 0x03, 0x20);
	sr200pc20_i2c_read_byte(client, 0xb0, &read_value);
	gain = ((int)read_value * 100  / 32) + 50;

	if (read_value < 125)
		isospeedrating = 50;
	else if (read_value < 175)
		isospeedrating = 100;
	else if (read_value < 250)
		isospeedrating = 200;
	else if (read_value < 375)
		isospeedrating = 400;
	else if (read_value < 550)
		isospeedrating = 800;
	else
		isospeedrating = 1600;

	cam_dbg("get iso = %d\n", isospeedrating);
	return isospeedrating;
}
예제 #13
0
static int s5k5bbgx_control_stream(struct v4l2_subdev *sd, stream_cmd_t cmd)
{
	int err = 0;

	switch (cmd) {
	case STREAM_START:
		cam_warn("WARN: do nothing\n");
		break;

	case STREAM_STOP:
		cam_dbg("stream stop!!!\n");
#if 0
#ifdef CONFIG_LOAD_FILE
		err = s5k5bbgx_write_regs_from_sd(sd, "s5k5bbgx_stream_stop");
#else
		err = s5k5bbgx_write_regs(sd, s5k5bbgx_stream_stop,
			sizeof(s5k5bbgx_stream_stop) / \
			sizeof(s5k5bbgx_stream_stop[0]));
#endif
#endif
		break;
	default:
		cam_err("ERR: Invalid cmd\n");
		break;
	}

	if (unlikely(err))
		cam_err("failed to stream start(stop)\n");

	return err;
}
예제 #14
0
static int s5k5bbgx_set_capture_start(struct v4l2_subdev *sd)
{
	struct s5k5bbgx_state *state = to_state(sd);
	int err = -EINVAL;
	u16 val = 1, retry = 0;

	/* set initial regster value */
#ifdef CONFIG_LOAD_FILE
	err = s5k5bbgx_write_regs_from_sd(sd, "s5k5bbgx_capture");
#else
	err = s5k5bbgx_write_regs(sd, s5k5bbgx_capture,
		sizeof(s5k5bbgx_capture) / sizeof(s5k5bbgx_capture[0]));
#endif
	if (unlikely(err)) {
		cam_err("failed to make capture\n");
		return err;
	}
	s5k5bbgx_get_exif(sd);
	cam_info("Capture ConfigSync\n");
	do {
		msleep(20);
		err = s5k5bbgx_read_reg(sd, REG_PAGE_CAPTURE_STATUS, REG_ADDR_CAPTURE_STATUS, &val);
		CHECK_ERR(err);
		cam_dbg("val = %d\n", val);
		if (val == 0)
			break;
		retry++;
	} while (retry <= S5K5BBGX_READ_STATUS_RETRIES);


	return err;
}
예제 #15
0
static int db8131m_s_parm(struct v4l2_subdev *sd, struct v4l2_streamparm *parms)
{
	int err = 0;
	u32 fps = 0;
	struct db8131m_state *state = to_state(sd);

	if (!state->vt_mode)
		return 0;

	cam_dbg("E\n");

	fps = parms->parm.capture.timeperframe.denominator /
			parms->parm.capture.timeperframe.numerator;

	if (fps != state->set_fps) {
		if (fps < 0 && fps > 30) {
			cam_err("invalid frame rate %d\n", fps);
			fps = 30;
		}
		state->req_fps = fps;

		if (state->initialized) {
			err = db8131m_set_frame_rate(sd, state->req_fps);
			if (err >= 0)
				state->set_fps = state->req_fps;
		}

	}

	return err;
}
예제 #16
0
static int sr130pc10_i2c_set_data_burst(struct i2c_client *client,
                                         regs_short_t reg_buffer[],
          				                 int num_of_regs)
{
	unsigned short subaddr, data_value;
	int i, err = 0;

	for(i = 0; i < num_of_regs; i++) {
		subaddr = reg_buffer[i].subaddr;
		data_value = reg_buffer[i].value;

		switch(subaddr) {
		case DELAY_SEQ:
			cam_dbg("delay = %d\n",data_value*10);
			msleep(data_value * 10);
			break;
		default:
			err = sr130pc10_i2c_write_byte(client, subaddr, data_value);
			if(err < 0) {
				cam_err("i2c write fail\n");
				return -EIO;
			}
			break;
		}
	}

	return 0;
}
예제 #17
0
static int s5k5bbgx_check_dataline_stop(struct v4l2_subdev *sd)
{
	struct i2c_client *client = v4l2_get_subdevdata(sd);
	struct s5k5bbgx_state *state = to_state(sd);
	int err = -EINVAL;

	extern int s5k5bbgx_power_reset(void);

	cam_warn("Warning: do nothing!!\n");
	return err;


	//s5k5bbgx_write(client, 0xFCFCD000);
	//s5k5bbgx_write(client, 0x0028D000);
	//s5k5bbgx_write(client, 0x002A3100);
    	//s5k5bbgx_write(client, 0x0F120000);

   //	err =  s5k5bbgx_write_regs(sd, s5k5bbgx_pattern_off,	sizeof(s5k5bbgx_pattern_off) / sizeof(s5k5bbgx_pattern_off[0]));
	printk("%s: sensor reset\n", __func__);
#if defined(CONFIG_TARGET_LOCALE_KOR) || defined(CONFIG_TARGET_LOCALE_EUR) || defined(CONFIG_TARGET_LOCALE_HKTW) || defined(CONFIG_TARGET_LOCALE_HKTW_FET) || defined(CONFIG_TARGET_LOCALE_USAGSM)
        // dont't know where this code came from - comment out for compile error
        // s5k5bbgx_power_reset();
 #endif
	cam_dbg("load camera init setting\n");
	err =  s5k5bbgx_write_regs(sd, s5k5bbgx_common,	sizeof(s5k5bbgx_common) / sizeof(s5k5bbgx_common[0]));

	state->check_dataline = 0;
	/* mdelay(100); */
	return err;
}
예제 #18
0
static int sr200pc20_check_sensor_status(struct v4l2_subdev *sd)
{

	/*struct i2c_client *client = v4l2_get_subdevdata(sd);*/
	/*u16 val_1 = 0, val_2 = 0;
	int err = -EINVAL; */

#if 1 /* DSLIM */
	cam_warn("check_sensor_status: WARNING, Not implemented!!\n\n");
	return 0;
#else

	err = sr200pc20_read_reg(sd, 0x7000, 0x0132, &val_1);
	CHECK_ERR(err);
	err = sr200pc20_read_reg(sd, 0xD000, 0x1002, &val_2);
	CHECK_ERR(err);

	cam_dbg("read val1=0x%x, val2=0x%x\n", val_1, val_2);

	if ((val_1 != 0xAAAA) || (val_2 != 0))
		goto error_occur;

	cam_info("Sensor ESD Check: not detected\n");
	return 0;
#endif
error_occur:
	cam_err("%s: ERROR, ESD Shock detected!\n\n", __func__);
	return -ERESTART;
}
예제 #19
0
static inline int sr200pc20_get_iso(struct v4l2_subdev *sd, u16 *iso)
{
	struct i2c_client *client = v4l2_get_subdevdata(sd);
	/* u16 iso_gain_table[] = {10, 18, 23, 28};
	u16 iso_table[] = {0, 50, 100, 200, 400}; */
	u16 read_value = 0, gain = 0;


	sr200pc20_i2c_write_byte(client, 0x03, 0x20);
	sr200pc20_i2c_read_byte(client, 0xb0, &read_value);
	gain = (read_value * 100  / 32) + 50;

	if (read_value < 125)
		*iso = 50;
	else if (read_value < 175)
		*iso = 100;
	else if (read_value < 250)
		*iso = 200;
	else if (read_value < 375)
		*iso = 400;
	else if (read_value < 550)
		*iso = 800;
	else
		*iso = 1600;

	cam_dbg("gain=%d, ISO=%d\n", gain, *iso);

	return 0;
}
예제 #20
0
static int db8131m_g_parm(struct v4l2_subdev *sd, struct v4l2_streamparm *parms)
{
	int err = 0;

	cam_dbg("E\n");

	return err;
}
예제 #21
0
static int sr130pc10_try_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt)
{
	int err = 0;

	cam_dbg("E\n");

	return err;
}
예제 #22
0
static int sr200pc20_try_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt)
#endif
{
	int err = 0;

	cam_dbg("E\n");

	return err;
}
예제 #23
0
static int sr200pc20_get_exif(struct v4l2_subdev *sd)
{
	struct sr200pc20_state *state = to_state(sd);
	u32 exposure_time = 0;

	/* Get exposure-time */
	state->exif.exp_time_den = 0;
	sr200pc20_get_expousretime(sd, &exposure_time);
	state->exif.exp_time_den = 1000000 / exposure_time;
	cam_dbg("exposure time=%dus\n", exposure_time);

	/* Get ISO */
	state->exif.iso = 0;
	sr200pc20_get_iso(sd, &state->exif.iso);

	cam_dbg("get_exif: exp_time_den=%d, ISO=%d\n",
		state->exif.exp_time_den, state->exif.iso);
	return 0;
}
예제 #24
0
static int sr130pc10_set_frame_rate(struct v4l2_subdev *sd, u32 fps)
{
	struct i2c_client *client = v4l2_get_subdevdata(sd);
	int err = 0;

	cam_info("frame rate %d\n\n", fps);

	switch (fps) {
	case 7:
		cam_dbg("load sr130pc10_vt_7fps\n");
		err = sr130pc10_i2c_set_config_register(client,
										  front_fps_7_regs,
										  FPS_7_NUM_OF_REGS,
										  "front_fps_7_regs");
		break;
	case 10:
		cam_dbg("load sr130pc10_vt_10fps\n");
		err = sr130pc10_i2c_set_config_register(client,
										  front_fps_10_regs,
										  FPS_10_NUM_OF_REGS,
										  "front_fps_10_regs");
		break;
	case 15:
		cam_dbg("load sr130pc10_vt_15fps\n");
		err = sr130pc10_i2c_set_config_register(client,
										  front_fps_15_regs,
										  FPS_15_NUM_OF_REGS,
										  "front_fps_15_regs");
		break;
	default:
		err = sr130pc10_i2c_set_config_register(client,
										  front_fps_auto_regs,
										  FPS_AUTO_NUM_OF_REGS,
										  "front_fps_auto_regs");
		break;
	}
	if (unlikely(err < 0)) {
		cam_err("i2c_write for set framerate\n");
		return -EIO;
	}

	return err;
}
int sr200_regs_table_init(void)
{
	struct file *filp;
	char *dp;
	long size;
	loff_t pos;
	int ret;
	mm_segment_t fs = get_fs();

	cam_info("%s : E\n", __func__);

	set_fs(get_ds());

	filp = filp_open(LOAD_FILE_PATH, O_RDONLY, 0);

	if (IS_ERR_OR_NULL(filp)) {
		cam_err("file open error\n");
		return PTR_ERR(filp);
	}

	size = filp->f_path.dentry->d_inode->i_size;
	cam_dbg("size = %ld\n", size);
	//dp = kmalloc(size, GFP_KERNEL);
	dp = vmalloc(size);
	if (unlikely(!dp)) {
		cam_err("Out of Memory\n");
		filp_close(filp, current->files);
		return -ENOMEM;
	}

	pos = 0;
	memset(dp, 0, size);
	ret = vfs_read(filp, (char __user *)dp, size, &pos);

	if (unlikely(ret != size)) {
		cam_err("Failed to read file ret = %d\n", ret);
		/*kfree(dp);*/
		vfree(dp);
		filp_close(filp, current->files);
		return -EINVAL;
	}

	filp_close(filp, current->files);

	set_fs(fs);

	sr200_regs_table = dp;

	sr200_regs_table_size = size;

	*((sr200_regs_table + sr200_regs_table_size) - 1) = '\0';

	cam_info("%s : X\n", __func__);
	return 0;
}
예제 #26
0
static int sr130pc10_remove(struct i2c_client *client)
{
	struct v4l2_subdev *sd = i2c_get_clientdata(client);
	struct sr130pc10_state *state = to_state(sd);

	cam_dbg("E\n");

	state->initialized = 0;

	v4l2_device_unregister_subdev(sd);
	kfree(to_state(sd));
	return 0;
}
예제 #27
0
/*
 * sr130pc10_probe
 * Fetching platform data is being done with s_config subdev call.
 * In probe routine, we just register subdev device
 */
static int sr130pc10_probe(struct i2c_client *client,
		const struct i2c_device_id *id)
{
	struct sr130pc10_state *state = NULL;
	struct v4l2_subdev *sd = NULL;

	cam_dbg("E\n");

	state = kzalloc(sizeof(struct sr130pc10_state), GFP_KERNEL);
	if (state == NULL)
		return -ENOMEM;

	sd = &state->sd;
	strcpy(sd->name, SR130PC10_DRIVER_NAME);

	/* Registering subdev */
	v4l2_i2c_subdev_init(sd, client, &sr130pc10_ops);

	cam_dbg("probed!!\n");

	return 0;
}
예제 #28
0
static int sr200pc20_remove(struct i2c_client *client)
{
	struct v4l2_subdev *sd = i2c_get_clientdata(client);
	struct sr200pc20_state *state = to_state(sd);

	cam_dbg("E\n");

	state->initialized = 0;

	device_remove_file(&client->dev, &dev_attr_camera_type);
	v4l2_device_unregister_subdev(sd);
	kfree(to_state(sd));
	return 0;
}
예제 #29
0
static int s5k5bbgx_check_sensor_status(struct v4l2_subdev *sd)
{
	/*struct i2c_client *client = v4l2_get_subdevdata(sd);*/
	u16 val_1 = 0, val_2 = 0;
	int err = -EINVAL;

	err = s5k5bbgx_read_reg(sd, 0x7000, 0x00BC, &val_1);
	CHECK_ERR(err);
	err = s5k5bbgx_read_reg(sd, 0xD000, 0x1002, &val_2);
	CHECK_ERR(err);

	cam_dbg("read val1=0x%x, val2=0x%x\n", val_1, val_2);

	if ((val_1 != 0xAAAA) || (val_2 != 0))
		goto error_occur;

	cam_dbg("Sensor error is not detected\n");
	return 0;

error_occur:
	cam_err("ERR: Sensor error occurs\n\n");
	return -EIO;
}
static int sensor_sr200_g_ctrl(struct v4l2_subdev *subdev, struct v4l2_control *ctrl)
{
	struct sr200_state *state = to_state(subdev);
	int ret = 0;

	switch (ctrl->id) {
	case V4L2_CID_EXIF_EXPOSURE_TIME_DEN:
		if (state->sensor_mode == SENSOR_CAMERA) {
			ctrl->value = state->exif.exp_time_den;
		} else {
			ctrl->value = 26;
		}
		cam_dbg("V4L2_CID_CAMERA_EXIF_EXPTIME :%d\n", ctrl->value);
		break;
	case V4L2_CID_EXIF_EXPOSURE_TIME_NUM:
		ctrl->value = 1;
		cam_dbg("V4L2_CID_EXIF_EXPOSURE_TIME_NUM :%d\n", ctrl->value);
		break;
	case V4L2_CID_CAMERA_EXIF_FLASH:
		ctrl->value = state->exif.flash;
		cam_dbg("V4L2_CID_CAMERA_EXIF_FLASH :%d\n", ctrl->value);
		break;
	case V4L2_CID_CAMERA_EXIF_ISO:
		if (state->sensor_mode == SENSOR_CAMERA) {
			ctrl->value = state->exif.iso;
		} else {
			ctrl->value = 100;
		}
		cam_dbg("V4L2_CID_CAMERA_EXIF_ISO :%d\n", ctrl->value);
		break;
	default:
		cam_warn("g_ctrl : invalid ioctl(0x%08X) is requested", ctrl->id);
		break;
	}

	return ret;
}