Symbol: ov02e10
drivers/media/i2c/ov02e10.c
257
static inline struct ov02e10 *to_ov02e10(struct v4l2_subdev *subdev)
drivers/media/i2c/ov02e10.c
259
return container_of(subdev, struct ov02e10, sd);
drivers/media/i2c/ov02e10.c
280
static void ov02e10_test_pattern(struct ov02e10 *ov02e10, u32 pattern, int *pret)
drivers/media/i2c/ov02e10.c
286
cci_write(ov02e10->regmap, OV02E10_REG_TEST_PATTERN, pattern, pret);
drivers/media/i2c/ov02e10.c
291
struct ov02e10 *ov02e10 = container_of(ctrl->handler,
drivers/media/i2c/ov02e10.c
292
struct ov02e10, ctrl_handler);
drivers/media/i2c/ov02e10.c
299
exposure_max = ov02e10->cur_mode->height + ctrl->val -
drivers/media/i2c/ov02e10.c
301
ret = __v4l2_ctrl_modify_range(ov02e10->exposure,
drivers/media/i2c/ov02e10.c
302
ov02e10->exposure->minimum,
drivers/media/i2c/ov02e10.c
304
ov02e10->exposure->step,
drivers/media/i2c/ov02e10.c
311
if (!pm_runtime_get_if_in_use(ov02e10->dev))
drivers/media/i2c/ov02e10.c
314
ret = cci_write(ov02e10->regmap, OV02E10_REG_COMMAND_UPDATE,
drivers/media/i2c/ov02e10.c
319
cci_write(ov02e10->regmap, OV02E10_REG_PAGE_FLAG,
drivers/media/i2c/ov02e10.c
321
cci_write(ov02e10->regmap, OV02E10_REG_ANALOG_GAIN,
drivers/media/i2c/ov02e10.c
326
cci_write(ov02e10->regmap, OV02E10_REG_PAGE_FLAG,
drivers/media/i2c/ov02e10.c
328
cci_write(ov02e10->regmap, OV02E10_REG_DIGITAL_GAIN,
drivers/media/i2c/ov02e10.c
333
cci_write(ov02e10->regmap, OV02E10_REG_PAGE_FLAG,
drivers/media/i2c/ov02e10.c
335
cci_write(ov02e10->regmap, OV02E10_REG_EXPOSURE,
drivers/media/i2c/ov02e10.c
341
cci_write(ov02e10->regmap, OV02E10_REG_PAGE_FLAG,
drivers/media/i2c/ov02e10.c
343
cci_write(ov02e10->regmap, OV02E10_REG_ORIENTATION,
drivers/media/i2c/ov02e10.c
344
ov02e10->hflip->val | ov02e10->vflip->val << 1, &ret);
drivers/media/i2c/ov02e10.c
347
cci_write(ov02e10->regmap, OV02E10_REG_PAGE_FLAG,
drivers/media/i2c/ov02e10.c
349
cci_write(ov02e10->regmap, OV02E10_REG_VTS,
drivers/media/i2c/ov02e10.c
350
ov02e10->cur_mode->height + ctrl->val, &ret);
drivers/media/i2c/ov02e10.c
354
cci_write(ov02e10->regmap, OV02E10_REG_PAGE_FLAG,
drivers/media/i2c/ov02e10.c
356
ov02e10_test_pattern(ov02e10, ctrl->val, &ret);
drivers/media/i2c/ov02e10.c
364
cci_write(ov02e10->regmap, OV02E10_REG_COMMAND_UPDATE,
drivers/media/i2c/ov02e10.c
367
pm_runtime_put(ov02e10->dev);
drivers/media/i2c/ov02e10.c
376
static int ov02e10_init_controls(struct ov02e10 *ov02e10)
drivers/media/i2c/ov02e10.c
378
struct v4l2_ctrl_handler *ctrl_hdlr = &ov02e10->ctrl_handler;
drivers/media/i2c/ov02e10.c
379
const struct ov02e10_mode *mode = ov02e10->cur_mode;
drivers/media/i2c/ov02e10.c
387
ov02e10->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr,
drivers/media/i2c/ov02e10.c
390
ov02e10->link_freq_index,
drivers/media/i2c/ov02e10.c
392
if (ov02e10->link_freq)
drivers/media/i2c/ov02e10.c
393
ov02e10->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/ov02e10.c
395
pixel_rate = to_pixel_rate(ov02e10->link_freq_index);
drivers/media/i2c/ov02e10.c
396
ov02e10->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &ov02e10_ctrl_ops,
drivers/media/i2c/ov02e10.c
403
ov02e10->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov02e10_ctrl_ops,
drivers/media/i2c/ov02e10.c
408
ov02e10->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov02e10_ctrl_ops,
drivers/media/i2c/ov02e10.c
411
if (ov02e10->hblank)
drivers/media/i2c/ov02e10.c
412
ov02e10->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/ov02e10.c
423
ov02e10->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &ov02e10_ctrl_ops,
drivers/media/i2c/ov02e10.c
430
ov02e10->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &ov02e10_ctrl_ops,
drivers/media/i2c/ov02e10.c
432
if (ov02e10->hflip)
drivers/media/i2c/ov02e10.c
433
ov02e10->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/ov02e10.c
435
ov02e10->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &ov02e10_ctrl_ops,
drivers/media/i2c/ov02e10.c
437
if (ov02e10->vflip)
drivers/media/i2c/ov02e10.c
438
ov02e10->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/ov02e10.c
445
ret = v4l2_fwnode_device_parse(ov02e10->dev, &props);
drivers/media/i2c/ov02e10.c
454
ov02e10->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/ov02e10.c
468
static int ov02e10_set_stream_mode(struct ov02e10 *ov02e10, u8 val)
drivers/media/i2c/ov02e10.c
472
cci_write(ov02e10->regmap, OV02E10_REG_PAGE_FLAG, OV02E10_PAGE_0, &ret);
drivers/media/i2c/ov02e10.c
473
cci_write(ov02e10->regmap, CCI_REG8(0xa0), val, &ret);
drivers/media/i2c/ov02e10.c
474
cci_write(ov02e10->regmap, OV02E10_REG_PAGE_FLAG, OV02E10_PAGE_1, &ret);
drivers/media/i2c/ov02e10.c
475
cci_write(ov02e10->regmap, CCI_REG8(0x01), 0x02, &ret);
drivers/media/i2c/ov02e10.c
484
struct ov02e10 *ov02e10 = to_ov02e10(sd);
drivers/media/i2c/ov02e10.c
488
ret = pm_runtime_resume_and_get(ov02e10->dev);
drivers/media/i2c/ov02e10.c
492
reg_list = &ov02e10->cur_mode->reg_list;
drivers/media/i2c/ov02e10.c
493
ret = regmap_multi_reg_write(ov02e10->regmap, reg_list->regs,
drivers/media/i2c/ov02e10.c
496
dev_err(ov02e10->dev, "failed to set mode\n");
drivers/media/i2c/ov02e10.c
500
ret = __v4l2_ctrl_handler_setup(ov02e10->sd.ctrl_handler);
drivers/media/i2c/ov02e10.c
504
ret = ov02e10_set_stream_mode(ov02e10, 1);
drivers/media/i2c/ov02e10.c
508
pm_runtime_put(ov02e10->dev);
drivers/media/i2c/ov02e10.c
517
struct ov02e10 *ov02e10 = to_ov02e10(sd);
drivers/media/i2c/ov02e10.c
519
ov02e10_set_stream_mode(ov02e10, 0);
drivers/media/i2c/ov02e10.c
520
pm_runtime_put(ov02e10->dev);
drivers/media/i2c/ov02e10.c
528
struct ov02e10 *ov02e10 = to_ov02e10(sd);
drivers/media/i2c/ov02e10.c
531
ov02e10->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
drivers/media/i2c/ov02e10.c
532
if (IS_ERR(ov02e10->reset))
drivers/media/i2c/ov02e10.c
533
return dev_err_probe(dev, PTR_ERR(ov02e10->reset),
drivers/media/i2c/ov02e10.c
537
ov02e10->supplies[i].supply = ov02e10_supply_names[i];
drivers/media/i2c/ov02e10.c
540
ov02e10->supplies);
drivers/media/i2c/ov02e10.c
546
struct ov02e10 *ov02e10 = to_ov02e10(sd);
drivers/media/i2c/ov02e10.c
548
if (ov02e10->reset)
drivers/media/i2c/ov02e10.c
549
gpiod_set_value_cansleep(ov02e10->reset, 1);
drivers/media/i2c/ov02e10.c
552
ov02e10->supplies);
drivers/media/i2c/ov02e10.c
554
clk_disable_unprepare(ov02e10->img_clk);
drivers/media/i2c/ov02e10.c
562
struct ov02e10 *ov02e10 = to_ov02e10(sd);
drivers/media/i2c/ov02e10.c
565
ret = clk_prepare_enable(ov02e10->img_clk);
drivers/media/i2c/ov02e10.c
572
ov02e10->supplies);
drivers/media/i2c/ov02e10.c
578
if (ov02e10->reset) {
drivers/media/i2c/ov02e10.c
580
gpiod_set_value_cansleep(ov02e10->reset, 0);
drivers/media/i2c/ov02e10.c
587
clk_disable_unprepare(ov02e10->img_clk);
drivers/media/i2c/ov02e10.c
596
struct ov02e10 *ov02e10 = to_ov02e10(sd);
drivers/media/i2c/ov02e10.c
611
ov02e10->cur_mode = mode;
drivers/media/i2c/ov02e10.c
612
ret = __v4l2_ctrl_s_ctrl(ov02e10->link_freq,
drivers/media/i2c/ov02e10.c
613
ov02e10->link_freq_index);
drivers/media/i2c/ov02e10.c
617
ret = __v4l2_ctrl_s_ctrl_int64(ov02e10->pixel_rate,
drivers/media/i2c/ov02e10.c
618
to_pixel_rate(ov02e10->link_freq_index));
drivers/media/i2c/ov02e10.c
624
ret = __v4l2_ctrl_modify_range(ov02e10->vblank,
drivers/media/i2c/ov02e10.c
631
ret = __v4l2_ctrl_s_ctrl(ov02e10->vblank, vblank_def);
drivers/media/i2c/ov02e10.c
635
h_blank = to_pixels_per_line(mode->hts, ov02e10->link_freq_index);
drivers/media/i2c/ov02e10.c
637
ret = __v4l2_ctrl_modify_range(ov02e10->hblank, h_blank,
drivers/media/i2c/ov02e10.c
648
struct ov02e10 *ov02e10 = to_ov02e10(sd);
drivers/media/i2c/ov02e10.c
653
ov02e10_update_pad_format(ov02e10->cur_mode, &fmt->format);
drivers/media/i2c/ov02e10.c
723
static int ov02e10_identify_module(struct ov02e10 *ov02e10)
drivers/media/i2c/ov02e10.c
728
ret = cci_write(ov02e10->regmap, OV02E10_REG_PAGE_FLAG,
drivers/media/i2c/ov02e10.c
730
cci_read(ov02e10->regmap, OV02E10_REG_CHIP_ID, &val, &ret);
drivers/media/i2c/ov02e10.c
735
dev_err(ov02e10->dev, "chip id mismatch: %x!=%x\n",
drivers/media/i2c/ov02e10.c
743
static int ov02e10_check_hwcfg(struct ov02e10 *ov02e10)
drivers/media/i2c/ov02e10.c
748
struct device *dev = ov02e10->dev;
drivers/media/i2c/ov02e10.c
786
ov02e10->link_freq_index = ffs(link_freq_bitmap) - 1;
drivers/media/i2c/ov02e10.c
787
ov02e10->mipi_lanes = bus_cfg.bus.mipi_csi2.num_data_lanes;
drivers/media/i2c/ov02e10.c
798
struct ov02e10 *ov02e10 = to_ov02e10(sd);
drivers/media/i2c/ov02e10.c
804
pm_runtime_disable(ov02e10->dev);
drivers/media/i2c/ov02e10.c
806
if (!pm_runtime_status_suspended(ov02e10->dev)) {
drivers/media/i2c/ov02e10.c
807
ov02e10_power_off(ov02e10->dev);
drivers/media/i2c/ov02e10.c
808
pm_runtime_set_suspended(ov02e10->dev);
drivers/media/i2c/ov02e10.c
814
struct ov02e10 *ov02e10;
drivers/media/i2c/ov02e10.c
818
ov02e10 = devm_kzalloc(&client->dev, sizeof(*ov02e10), GFP_KERNEL);
drivers/media/i2c/ov02e10.c
819
if (!ov02e10)
drivers/media/i2c/ov02e10.c
822
ov02e10->dev = &client->dev;
drivers/media/i2c/ov02e10.c
824
ov02e10->img_clk = devm_v4l2_sensor_clk_get(ov02e10->dev, NULL);
drivers/media/i2c/ov02e10.c
825
if (IS_ERR(ov02e10->img_clk))
drivers/media/i2c/ov02e10.c
826
return dev_err_probe(ov02e10->dev, PTR_ERR(ov02e10->img_clk),
drivers/media/i2c/ov02e10.c
829
freq = clk_get_rate(ov02e10->img_clk);
drivers/media/i2c/ov02e10.c
831
return dev_err_probe(ov02e10->dev, -EINVAL,
drivers/media/i2c/ov02e10.c
835
v4l2_i2c_subdev_init(&ov02e10->sd, client, &ov02e10_subdev_ops);
drivers/media/i2c/ov02e10.c
838
ret = ov02e10_check_hwcfg(ov02e10);
drivers/media/i2c/ov02e10.c
843
ov02e10->regmap = devm_cci_regmap_init_i2c(client, 8);
drivers/media/i2c/ov02e10.c
844
if (IS_ERR(ov02e10->regmap))
drivers/media/i2c/ov02e10.c
845
return PTR_ERR(ov02e10->regmap);
drivers/media/i2c/ov02e10.c
847
ret = ov02e10_get_pm_resources(ov02e10->dev);
drivers/media/i2c/ov02e10.c
851
ret = ov02e10_power_on(ov02e10->dev);
drivers/media/i2c/ov02e10.c
853
dev_err_probe(ov02e10->dev, ret, "failed to power on\n");
drivers/media/i2c/ov02e10.c
858
ret = ov02e10_identify_module(ov02e10);
drivers/media/i2c/ov02e10.c
860
dev_err(ov02e10->dev, "failed to find sensor: %d\n", ret);
drivers/media/i2c/ov02e10.c
864
ov02e10->cur_mode = &supported_modes[0];
drivers/media/i2c/ov02e10.c
865
ret = ov02e10_init_controls(ov02e10);
drivers/media/i2c/ov02e10.c
867
dev_err(ov02e10->dev, "failed to init controls: %d\n", ret);
drivers/media/i2c/ov02e10.c
872
ov02e10->sd.internal_ops = &ov02e10_internal_ops;
drivers/media/i2c/ov02e10.c
873
ov02e10->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/ov02e10.c
874
ov02e10->sd.entity.ops = &ov02e10_subdev_entity_ops;
drivers/media/i2c/ov02e10.c
875
ov02e10->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/ov02e10.c
878
ov02e10->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/ov02e10.c
879
ret = media_entity_pads_init(&ov02e10->sd.entity, 1, &ov02e10->pad);
drivers/media/i2c/ov02e10.c
881
dev_err(ov02e10->dev, "failed to init entity pads: %d", ret);
drivers/media/i2c/ov02e10.c
885
ov02e10->sd.state_lock = ov02e10->ctrl_handler.lock;
drivers/media/i2c/ov02e10.c
886
ret = v4l2_subdev_init_finalize(&ov02e10->sd);
drivers/media/i2c/ov02e10.c
888
dev_err(ov02e10->dev, "failed to init subdev: %d", ret);
drivers/media/i2c/ov02e10.c
892
pm_runtime_set_active(ov02e10->dev);
drivers/media/i2c/ov02e10.c
893
pm_runtime_enable(ov02e10->dev);
drivers/media/i2c/ov02e10.c
895
ret = v4l2_async_register_subdev_sensor(&ov02e10->sd);
drivers/media/i2c/ov02e10.c
897
dev_err(ov02e10->dev, "failed to register V4L2 subdev: %d",
drivers/media/i2c/ov02e10.c
902
pm_runtime_idle(ov02e10->dev);
drivers/media/i2c/ov02e10.c
906
pm_runtime_disable(ov02e10->dev);
drivers/media/i2c/ov02e10.c
907
pm_runtime_set_suspended(ov02e10->dev);
drivers/media/i2c/ov02e10.c
908
v4l2_subdev_cleanup(&ov02e10->sd);
drivers/media/i2c/ov02e10.c
911
media_entity_cleanup(&ov02e10->sd.entity);
drivers/media/i2c/ov02e10.c
914
v4l2_ctrl_handler_free(ov02e10->sd.ctrl_handler);
drivers/media/i2c/ov02e10.c
917
ov02e10_power_off(ov02e10->dev);