Lines Matching refs: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,
314 return &sensor->mode.fmt;
318 __ov2680_get_pad_crop(struct ov2680_dev *sensor,
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);
559 struct ov2680_dev *sensor = to_ov2680_dev(sd);
568 mutex_lock(&sensor->lock);
569 fi->interval = sensor->mode.frame_interval;
570 mutex_unlock(&sensor->lock);
577 struct ov2680_dev *sensor = to_ov2680_dev(sd);
580 mutex_lock(&sensor->lock);
582 if (sensor->is_streaming == !!enable)
586 ret = pm_runtime_resume_and_get(sensor->sd.dev);
590 ret = ov2680_stream_enable(sensor);
592 pm_runtime_put(sensor->sd.dev);
596 ret = ov2680_stream_disable(sensor);
597 pm_runtime_put(sensor->sd.dev);
600 sensor->is_streaming = !!enable;
603 mutex_unlock(&sensor->lock);
612 struct ov2680_dev *sensor = to_ov2680_dev(sd);
617 code->code = sensor->mode.fmt.code;
626 struct ov2680_dev *sensor = to_ov2680_dev(sd);
629 fmt = __ov2680_get_pad_format(sensor, sd_state, format->pad,
632 mutex_lock(&sensor->lock);
634 mutex_unlock(&sensor->lock);
643 struct ov2680_dev *sensor = to_ov2680_dev(sd);
649 crop = __ov2680_get_pad_crop(sensor, sd_state, format->pad,
658 ov2680_fill_format(sensor, &format->format, width, height);
666 mutex_lock(&sensor->lock);
668 if (sensor->is_streaming) {
673 sensor->mode.fmt = format->format;
674 ov2680_calc_mode(sensor);
677 mutex_unlock(&sensor->lock);
686 struct ov2680_dev *sensor = to_ov2680_dev(sd);
690 mutex_lock(&sensor->lock);
691 sel->r = *__ov2680_get_pad_crop(sensor, state, sel->pad,
693 mutex_unlock(&sensor->lock);
716 struct ov2680_dev *sensor = to_ov2680_dev(sd);
725 * Clamp the boundaries of the crop rectangle to the size of the sensor
744 crop = __ov2680_get_pad_crop(sensor, state, sel->pad, sel->which);
746 mutex_lock(&sensor->lock);
752 format = __ov2680_get_pad_format(sensor, state, sel->pad,
759 mutex_unlock(&sensor->lock);
769 struct ov2680_dev *sensor = to_ov2680_dev(sd);
773 ov2680_fill_format(sensor, v4l2_subdev_state_get_format(sd_state, 0),
782 struct ov2680_dev *sensor = to_ov2680_dev(sd);
788 crop = __ov2680_get_pad_crop(sensor, sd_state, fse->pad, fse->which);
828 struct ov2680_dev *sensor = to_ov2680_dev(sd);
834 fie->interval = sensor->mode.frame_interval;
842 struct ov2680_dev *sensor = to_ov2680_dev(sd);
846 if (!pm_runtime_get_if_in_use(sensor->sd.dev)) {
847 ov2680_set_bayer_order(sensor, &sensor->mode.fmt);
853 ret = ov2680_gain_set(sensor, ctrl->val);
856 ret = ov2680_exposure_set(sensor, ctrl->val);
859 ret = ov2680_set_vflip(sensor, ctrl->val);
862 ret = ov2680_set_hflip(sensor, ctrl->val);
865 ret = ov2680_test_pattern_set(sensor, ctrl->val);
872 pm_runtime_put(sensor->sd.dev);
905 static int ov2680_mode_init(struct ov2680_dev *sensor)
908 sensor->mode.crop = ov2680_default_crop;
909 ov2680_fill_format(sensor, &sensor->mode.fmt,
911 ov2680_calc_mode(sensor);
913 sensor->mode.frame_interval.denominator = OV2680_FRAME_RATE;
914 sensor->mode.frame_interval.numerator = 1;
919 static int ov2680_v4l2_register(struct ov2680_dev *sensor)
921 struct i2c_client *client = to_i2c_client(sensor->dev);
923 struct ov2680_ctrls *ctrls = &sensor->ctrls;
928 v4l2_i2c_subdev_init(&sensor->sd, client, &ov2680_subdev_ops);
929 sensor->sd.internal_ops = &ov2680_internal_ops;
931 sensor->sd.flags = V4L2_SUBDEV_FL_HAS_DEVNODE;
932 sensor->pad.flags = MEDIA_PAD_FL_SOURCE;
933 sensor->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
935 ret = media_entity_pads_init(&sensor->sd.entity, 1, &sensor->pad);
941 hdl->lock = &sensor->lock;
958 0, 0, sensor->link_freq);
960 0, sensor->pixel_rate,
961 1, sensor->pixel_rate);
972 sensor->sd.ctrl_handler = hdl;
974 ret = v4l2_async_register_subdev(&sensor->sd);
981 media_entity_cleanup(&sensor->sd.entity);
987 static int ov2680_get_regulators(struct ov2680_dev *sensor)
992 sensor->supplies[i].supply = ov2680_supply_name[i];
994 return devm_regulator_bulk_get(sensor->dev,
995 OV2680_NUM_SUPPLIES, sensor->supplies);
998 static int ov2680_check_id(struct ov2680_dev *sensor)
1003 cci_read(sensor->regmap, OV2680_REG_CHIP_ID, &chip_id, &ret);
1004 cci_read(sensor->regmap, OV2680_REG_SC_CMMN_SUB_ID, &rev, &ret);
1006 dev_err(sensor->dev, "failed to read chip id\n");
1011 dev_err(sensor->dev, "chip id: 0x%04llx does not match expected 0x%04x\n",
1016 dev_info(sensor->dev, "sensor_revision id = 0x%llx, rev= %lld\n",
1022 static int ov2680_parse_dt(struct ov2680_dev *sensor)
1027 struct device *dev = sensor->dev;
1048 * The pin we want is named XSHUTDN in the datasheet. Linux sensor
1063 sensor->pwdn_gpio = gpio;
1065 sensor->xvclk = devm_clk_get_optional(dev, "xvclk");
1066 if (IS_ERR(sensor->xvclk)) {
1067 ret = dev_err_probe(dev, PTR_ERR(sensor->xvclk),
1083 if (ret && !sensor->xvclk) {
1088 if (!ret && sensor->xvclk) {
1089 ret = clk_set_rate(sensor->xvclk, rate);
1096 sensor->xvclk_freq = rate ?: clk_get_rate(sensor->xvclk);
1099 if (sensor->xvclk_freq == ov2680_xvclk_freqs[i])
1106 sensor->xvclk_freq);
1110 sensor->pll_mult = ov2680_pll_multipliers[i];
1112 sensor->link_freq[0] = sensor->xvclk_freq / OV2680_PLL_PREDIV0 /
1113 OV2680_PLL_PREDIV * sensor->pll_mult;
1116 sensor->pixel_rate = sensor->link_freq[0] * 2;
1117 do_div(sensor->pixel_rate, 10);
1127 if (bus_cfg.link_frequencies[i] == sensor->link_freq[0])
1134 sensor->link_freq[0]);
1146 struct ov2680_dev *sensor;
1149 sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL);
1150 if (!sensor)
1153 sensor->dev = &client->dev;
1155 sensor->regmap = devm_cci_regmap_init_i2c(client, 16);
1156 if (IS_ERR(sensor->regmap))
1157 return PTR_ERR(sensor->regmap);
1159 ret = ov2680_parse_dt(sensor);
1163 ret = ov2680_mode_init(sensor);
1167 ret = ov2680_get_regulators(sensor);
1173 mutex_init(&sensor->lock);
1179 ret = ov2680_power_on(sensor);
1183 ret = ov2680_check_id(sensor);
1191 ret = ov2680_v4l2_register(sensor);
1205 ov2680_power_off(sensor);
1208 mutex_destroy(&sensor->lock);
1216 struct ov2680_dev *sensor = to_ov2680_dev(sd);
1218 v4l2_async_unregister_subdev(&sensor->sd);
1219 mutex_destroy(&sensor->lock);
1220 media_entity_cleanup(&sensor->sd.entity);
1221 v4l2_ctrl_handler_free(&sensor->ctrls.handler);
1229 ov2680_power_off(sensor);
1236 struct ov2680_dev *sensor = to_ov2680_dev(sd);
1238 if (sensor->is_streaming)
1239 ov2680_stream_disable(sensor);
1241 return ov2680_power_off(sensor);
1247 struct ov2680_dev *sensor = to_ov2680_dev(sd);
1250 ret = ov2680_power_on(sensor);
1254 if (sensor->is_streaming) {
1255 ret = ov2680_stream_enable(sensor);
1263 ov2680_stream_disable(sensor);
1264 sensor->is_streaming = false;