Lines Matching defs:sensor

273 static void ov2680_power_up(struct ov2680_dev *sensor)
275 if (!sensor->pwdn_gpio)
278 gpiod_set_value(sensor->pwdn_gpio, 0);
282 static void ov2680_power_down(struct ov2680_dev *sensor)
284 if (!sensor->pwdn_gpio)
287 gpiod_set_value(sensor->pwdn_gpio, 1);
291 static void ov2680_set_bayer_order(struct ov2680_dev *sensor,
296 if (sensor->ctrls.vflip && sensor->ctrls.vflip->val)
299 if (sensor->ctrls.hflip && sensor->ctrls.hflip->val)
306 __ov2680_get_pad_format(struct ov2680_dev *sensor,
312 return v4l2_subdev_get_try_format(&sensor->sd, state, pad);
314 return &sensor->mode.fmt;
318 __ov2680_get_pad_crop(struct ov2680_dev *sensor,
324 return v4l2_subdev_get_try_crop(&sensor->sd, state, pad);
326 return &sensor->mode.crop;
329 static void ov2680_fill_format(struct ov2680_dev *sensor,
338 ov2680_set_bayer_order(sensor, fmt);
341 static void ov2680_calc_mode(struct ov2680_dev *sensor)
343 int width = sensor->mode.fmt.width;
344 int height = sensor->mode.fmt.height;
348 if (width <= (sensor->mode.crop.width / 2) &&
349 height <= (sensor->mode.crop.height / 2)) {
350 sensor->mode.binning = true;
354 sensor->mode.binning = false;
357 sensor->mode.h_start = (sensor->mode.crop.left +
358 (sensor->mode.crop.width - width) / 2) & ~1;
359 sensor->mode.v_start = (sensor->mode.crop.top +
360 (sensor->mode.crop.height - height) / 2) & ~1;
361 sensor->mode.h_end =
362 min(sensor->mode.h_start + width + OV2680_END_MARGIN - 1,
364 sensor->mode.v_end =
365 min(sensor->mode.v_start + height + OV2680_END_MARGIN - 1,
367 sensor->mode.h_output_size = orig_width;
368 sensor->mode.v_output_size = orig_height;
369 sensor->mode.hts = OV2680_PIXELS_PER_LINE;
370 sensor->mode.vts = OV2680_LINES_PER_FRAME;
373 static int ov2680_set_mode(struct ov2680_dev *sensor)
378 if (sensor->mode.binning) {
390 cci_write(sensor->regmap, OV2680_REG_SENSOR_CTRL_0A,
392 cci_write(sensor->regmap, OV2680_REG_HORIZONTAL_START,
393 sensor->mode.h_start, &ret);
394 cci_write(sensor->regmap, OV2680_REG_VERTICAL_START,
395 sensor->mode.v_start, &ret);
396 cci_write(sensor->regmap, OV2680_REG_HORIZONTAL_END,
397 sensor->mode.h_end, &ret);
398 cci_write(sensor->regmap, OV2680_REG_VERTICAL_END,
399 sensor->mode.v_end, &ret);
400 cci_write(sensor->regmap, OV2680_REG_HORIZONTAL_OUTPUT_SIZE,
401 sensor->mode.h_output_size, &ret);
402 cci_write(sensor->regmap, OV2680_REG_VERTICAL_OUTPUT_SIZE,
403 sensor->mode.v_output_size, &ret);
404 cci_write(sensor->regmap, OV2680_REG_TIMING_HTS,
405 sensor->mode.hts, &ret);
406 cci_write(sensor->regmap, OV2680_REG_TIMING_VTS,
407 sensor->mode.vts, &ret);
408 cci_write(sensor->regmap, OV2680_REG_ISP_X_WIN, 0, &ret);
409 cci_write(sensor->regmap, OV2680_REG_ISP_Y_WIN, 0, &ret);
410 cci_write(sensor->regmap, OV2680_REG_X_INC, inc, &ret);
411 cci_write(sensor->regmap, OV2680_REG_Y_INC, inc, &ret);
412 cci_write(sensor->regmap, OV2680_REG_X_WIN,
413 sensor->mode.h_output_size, &ret);
414 cci_write(sensor->regmap, OV2680_REG_Y_WIN,
415 sensor->mode.v_output_size, &ret);
416 cci_write(sensor->regmap, OV2680_REG_FORMAT1, fmt1, &ret);
417 cci_write(sensor->regmap, OV2680_REG_FORMAT2, fmt2, &ret);
422 static int ov2680_set_vflip(struct ov2680_dev *sensor, s32 val)
426 if (sensor->is_streaming)
429 ret = cci_update_bits(sensor->regmap, OV2680_REG_FORMAT1,
434 ov2680_set_bayer_order(sensor, &sensor->mode.fmt);
438 static int ov2680_set_hflip(struct ov2680_dev *sensor, s32 val)
442 if (sensor->is_streaming)
445 ret = cci_update_bits(sensor->regmap, OV2680_REG_FORMAT2,
450 ov2680_set_bayer_order(sensor, &sensor->mode.fmt);
454 static int ov2680_test_pattern_set(struct ov2680_dev *sensor, int value)
459 return cci_update_bits(sensor->regmap, OV2680_REG_ISP_CTRL00,
462 cci_update_bits(sensor->regmap, OV2680_REG_ISP_CTRL00,
464 cci_update_bits(sensor->regmap, OV2680_REG_ISP_CTRL00,
470 static int ov2680_gain_set(struct ov2680_dev *sensor, u32 gain)
472 return cci_write(sensor->regmap, OV2680_REG_GAIN_PK, gain, NULL);
475 static int ov2680_exposure_set(struct ov2680_dev *sensor, u32 exp)
477 return cci_write(sensor->regmap, OV2680_REG_EXPOSURE_PK, exp << 4,
481 static int ov2680_stream_enable(struct ov2680_dev *sensor)
485 ret = cci_write(sensor->regmap, OV2680_REG_PLL_MULTIPLIER,
486 sensor->pll_mult, NULL);
490 ret = regmap_multi_reg_write(sensor->regmap,
496 ret = ov2680_set_mode(sensor);
501 ret = __v4l2_ctrl_handler_setup(&sensor->ctrls.handler);
505 return cci_write(sensor->regmap, OV2680_REG_STREAM_CTRL, 1, NULL);
508 static int ov2680_stream_disable(struct ov2680_dev *sensor)
510 return cci_write(sensor->regmap, OV2680_REG_STREAM_CTRL, 0, NULL);
513 static int ov2680_power_off(struct ov2680_dev *sensor)
515 clk_disable_unprepare(sensor->xvclk);
516 ov2680_power_down(sensor);
517 regulator_bulk_disable(OV2680_NUM_SUPPLIES, sensor->supplies);
521 static int ov2680_power_on(struct ov2680_dev *sensor)
525 ret = regulator_bulk_enable(OV2680_NUM_SUPPLIES, sensor->supplies);
527 dev_err(sensor->dev, "failed to enable regulators: %d\n", ret);
531 if (!sensor->pwdn_gpio) {
532 ret = cci_write(sensor->regmap, OV2680_REG_SOFT_RESET, 0x01,
535 dev_err(sensor->dev, "sensor soft reset failed\n");
540 ov2680_power_down(sensor);
541 ov2680_power_up(sensor);
544 ret = clk_prepare_enable(sensor->xvclk);
551 regulator_bulk_disable(OV2680_NUM_SUPPLIES, sensor->supplies);
558 struct ov2680_dev *sensor = to_ov2680_dev(sd);
560 mutex_lock(&sensor->lock);
561 fi->interval = sensor->mode.frame_interval;
562 mutex_unlock(&sensor->lock);
569 struct ov2680_dev *sensor = to_ov2680_dev(sd);
572 mutex_lock(&sensor->lock);
574 if (sensor->is_streaming == !!enable)
578 ret = pm_runtime_resume_and_get(sensor->sd.dev);
582 ret = ov2680_stream_enable(sensor);
584 pm_runtime_put(sensor->sd.dev);
588 ret = ov2680_stream_disable(sensor);
589 pm_runtime_put(sensor->sd.dev);
592 sensor->is_streaming = !!enable;
595 mutex_unlock(&sensor->lock);
604 struct ov2680_dev *sensor = to_ov2680_dev(sd);
609 code->code = sensor->mode.fmt.code;
618 struct ov2680_dev *sensor = to_ov2680_dev(sd);
621 fmt = __ov2680_get_pad_format(sensor, sd_state, format->pad,
624 mutex_lock(&sensor->lock);
626 mutex_unlock(&sensor->lock);
635 struct ov2680_dev *sensor = to_ov2680_dev(sd);
641 crop = __ov2680_get_pad_crop(sensor, sd_state, format->pad,
650 ov2680_fill_format(sensor, &format->format, width, height);
658 mutex_lock(&sensor->lock);
660 if (sensor->is_streaming) {
665 sensor->mode.fmt = format->format;
666 ov2680_calc_mode(sensor);
669 mutex_unlock(&sensor->lock);
678 struct ov2680_dev *sensor = to_ov2680_dev(sd);
682 mutex_lock(&sensor->lock);
683 sel->r = *__ov2680_get_pad_crop(sensor, state, sel->pad,
685 mutex_unlock(&sensor->lock);
708 struct ov2680_dev *sensor = to_ov2680_dev(sd);
717 * Clamp the boundaries of the crop rectangle to the size of the sensor
736 crop = __ov2680_get_pad_crop(sensor, state, sel->pad, sel->which);
738 mutex_lock(&sensor->lock);
744 format = __ov2680_get_pad_format(sensor, state, sel->pad,
751 mutex_unlock(&sensor->lock);
761 struct ov2680_dev *sensor = to_ov2680_dev(sd);
765 ov2680_fill_format(sensor, &sd_state->pads[0].try_fmt,
774 struct ov2680_dev *sensor = to_ov2680_dev(sd);
780 crop = __ov2680_get_pad_crop(sensor, sd_state, fse->pad, fse->which);
820 struct ov2680_dev *sensor = to_ov2680_dev(sd);
826 fie->interval = sensor->mode.frame_interval;
834 struct ov2680_dev *sensor = to_ov2680_dev(sd);
838 if (!pm_runtime_get_if_in_use(sensor->sd.dev)) {
839 ov2680_set_bayer_order(sensor, &sensor->mode.fmt);
845 ret = ov2680_gain_set(sensor, ctrl->val);
848 ret = ov2680_exposure_set(sensor, ctrl->val);
851 ret = ov2680_set_vflip(sensor, ctrl->val);
854 ret = ov2680_set_hflip(sensor, ctrl->val);
857 ret = ov2680_test_pattern_set(sensor, ctrl->val);
864 pm_runtime_put(sensor->sd.dev);
894 static int ov2680_mode_init(struct ov2680_dev *sensor)
897 sensor->mode.crop = ov2680_default_crop;
898 ov2680_fill_format(sensor, &sensor->mode.fmt,
900 ov2680_calc_mode(sensor);
902 sensor->mode.frame_interval.denominator = OV2680_FRAME_RATE;
903 sensor->mode.frame_interval.numerator = 1;
908 static int ov2680_v4l2_register(struct ov2680_dev *sensor)
910 struct i2c_client *client = to_i2c_client(sensor->dev);
912 struct ov2680_ctrls *ctrls = &sensor->ctrls;
917 v4l2_i2c_subdev_init(&sensor->sd, client, &ov2680_subdev_ops);
919 sensor->sd.flags = V4L2_SUBDEV_FL_HAS_DEVNODE;
920 sensor->pad.flags = MEDIA_PAD_FL_SOURCE;
921 sensor->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
923 ret = media_entity_pads_init(&sensor->sd.entity, 1, &sensor->pad);
929 hdl->lock = &sensor->lock;
946 0, 0, sensor->link_freq);
948 0, sensor->pixel_rate,
949 1, sensor->pixel_rate);
960 sensor->sd.ctrl_handler = hdl;
962 ret = v4l2_async_register_subdev(&sensor->sd);
969 media_entity_cleanup(&sensor->sd.entity);
975 static int ov2680_get_regulators(struct ov2680_dev *sensor)
980 sensor->supplies[i].supply = ov2680_supply_name[i];
982 return devm_regulator_bulk_get(sensor->dev,
983 OV2680_NUM_SUPPLIES, sensor->supplies);
986 static int ov2680_check_id(struct ov2680_dev *sensor)
991 cci_read(sensor->regmap, OV2680_REG_CHIP_ID, &chip_id, &ret);
992 cci_read(sensor->regmap, OV2680_REG_SC_CMMN_SUB_ID, &rev, &ret);
994 dev_err(sensor->dev, "failed to read chip id\n");
999 dev_err(sensor->dev, "chip id: 0x%04llx does not match expected 0x%04x\n",
1004 dev_info(sensor->dev, "sensor_revision id = 0x%llx, rev= %lld\n",
1010 static int ov2680_parse_dt(struct ov2680_dev *sensor)
1015 struct device *dev = sensor->dev;
1036 * The pin we want is named XSHUTDN in the datasheet. Linux sensor
1051 sensor->pwdn_gpio = gpio;
1053 sensor->xvclk = devm_clk_get_optional(dev, "xvclk");
1054 if (IS_ERR(sensor->xvclk)) {
1055 ret = dev_err_probe(dev, PTR_ERR(sensor->xvclk),
1071 if (ret && !sensor->xvclk) {
1076 if (!ret && sensor->xvclk) {
1077 ret = clk_set_rate(sensor->xvclk, rate);
1084 sensor->xvclk_freq = rate ?: clk_get_rate(sensor->xvclk);
1087 if (sensor->xvclk_freq == ov2680_xvclk_freqs[i])
1094 sensor->xvclk_freq);
1098 sensor->pll_mult = ov2680_pll_multipliers[i];
1100 sensor->link_freq[0] = sensor->xvclk_freq / OV2680_PLL_PREDIV0 /
1101 OV2680_PLL_PREDIV * sensor->pll_mult;
1104 sensor->pixel_rate = sensor->link_freq[0] * 2;
1105 do_div(sensor->pixel_rate, 10);
1115 if (bus_cfg.link_frequencies[i] == sensor->link_freq[0])
1122 sensor->link_freq[0]);
1134 struct ov2680_dev *sensor;
1137 sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL);
1138 if (!sensor)
1141 sensor->dev = &client->dev;
1143 sensor->regmap = devm_cci_regmap_init_i2c(client, 16);
1144 if (IS_ERR(sensor->regmap))
1145 return PTR_ERR(sensor->regmap);
1147 ret = ov2680_parse_dt(sensor);
1151 ret = ov2680_mode_init(sensor);
1155 ret = ov2680_get_regulators(sensor);
1161 mutex_init(&sensor->lock);
1167 ret = ov2680_power_on(sensor);
1171 ret = ov2680_check_id(sensor);
1179 ret = ov2680_v4l2_register(sensor);
1193 ov2680_power_off(sensor);
1196 mutex_destroy(&sensor->lock);
1204 struct ov2680_dev *sensor = to_ov2680_dev(sd);
1206 v4l2_async_unregister_subdev(&sensor->sd);
1207 mutex_destroy(&sensor->lock);
1208 media_entity_cleanup(&sensor->sd.entity);
1209 v4l2_ctrl_handler_free(&sensor->ctrls.handler);
1217 ov2680_power_off(sensor);
1224 struct ov2680_dev *sensor = to_ov2680_dev(sd);
1226 if (sensor->is_streaming)
1227 ov2680_stream_disable(sensor);
1229 return ov2680_power_off(sensor);
1235 struct ov2680_dev *sensor = to_ov2680_dev(sd);
1238 ret = ov2680_power_on(sensor);
1242 if (sensor->is_streaming) {
1243 ret = ov2680_stream_enable(sensor);
1251 ov2680_stream_disable(sensor);
1252 sensor->is_streaming = false;