Symbol: ov02c10
drivers/media/i2c/ov02c10.c
394
static inline struct ov02c10 *to_ov02c10(struct v4l2_subdev *subdev)
drivers/media/i2c/ov02c10.c
396
return container_of(subdev, struct ov02c10, sd);
drivers/media/i2c/ov02c10.c
399
static int ov02c10_test_pattern(struct ov02c10 *ov02c10, int pattern)
drivers/media/i2c/ov02c10.c
404
return cci_update_bits(ov02c10->regmap, OV02C10_REG_TEST_PATTERN,
drivers/media/i2c/ov02c10.c
407
cci_update_bits(ov02c10->regmap, OV02C10_REG_TEST_PATTERN,
drivers/media/i2c/ov02c10.c
409
cci_update_bits(ov02c10->regmap, OV02C10_REG_TEST_PATTERN,
drivers/media/i2c/ov02c10.c
416
struct ov02c10 *ov02c10 = container_of(ctrl->handler,
drivers/media/i2c/ov02c10.c
417
struct ov02c10, ctrl_handler);
drivers/media/i2c/ov02c10.c
426
__v4l2_ctrl_modify_range(ov02c10->exposure,
drivers/media/i2c/ov02c10.c
427
ov02c10->exposure->minimum,
drivers/media/i2c/ov02c10.c
428
exposure_max, ov02c10->exposure->step,
drivers/media/i2c/ov02c10.c
433
if (!pm_runtime_get_if_in_use(ov02c10->dev))
drivers/media/i2c/ov02c10.c
438
cci_write(ov02c10->regmap, OV02C10_REG_ANALOG_GAIN,
drivers/media/i2c/ov02c10.c
443
cci_write(ov02c10->regmap, OV02C10_REG_DIGITAL_GAIN,
drivers/media/i2c/ov02c10.c
448
cci_write(ov02c10->regmap, OV02C10_REG_EXPOSURE,
drivers/media/i2c/ov02c10.c
453
cci_write(ov02c10->regmap, OV02C10_REG_VTS, height + ctrl->val,
drivers/media/i2c/ov02c10.c
458
ret = ov02c10_test_pattern(ov02c10, ctrl->val);
drivers/media/i2c/ov02c10.c
462
cci_write(ov02c10->regmap, OV02C10_ISP_X_WIN_CONTROL,
drivers/media/i2c/ov02c10.c
464
cci_update_bits(ov02c10->regmap, OV02C10_ROTATE_CONTROL,
drivers/media/i2c/ov02c10.c
469
cci_write(ov02c10->regmap, OV02C10_ISP_Y_WIN_CONTROL,
drivers/media/i2c/ov02c10.c
471
cci_update_bits(ov02c10->regmap, OV02C10_ROTATE_CONTROL,
drivers/media/i2c/ov02c10.c
480
pm_runtime_put(ov02c10->dev);
drivers/media/i2c/ov02c10.c
489
static int ov02c10_init_controls(struct ov02c10 *ov02c10)
drivers/media/i2c/ov02c10.c
491
struct v4l2_ctrl_handler *ctrl_hdlr = &ov02c10->ctrl_handler;
drivers/media/i2c/ov02c10.c
500
ov02c10->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr,
drivers/media/i2c/ov02c10.c
503
ov02c10->link_freq_index, 0,
drivers/media/i2c/ov02c10.c
505
if (ov02c10->link_freq)
drivers/media/i2c/ov02c10.c
506
ov02c10->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/ov02c10.c
509
pixel_rate = div_u64(link_freq_menu_items[ov02c10->link_freq_index] *
drivers/media/i2c/ov02c10.c
510
2 * ov02c10->mipi_lanes, OV02C10_RGB_DEPTH);
drivers/media/i2c/ov02c10.c
512
ov02c10->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &ov02c10_ctrl_ops,
drivers/media/i2c/ov02c10.c
520
vts_def = mode->vts_min * ov02c10->mipi_lanes;
drivers/media/i2c/ov02c10.c
525
ov02c10->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov02c10_ctrl_ops,
drivers/media/i2c/ov02c10.c
530
ov02c10->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov02c10_ctrl_ops,
drivers/media/i2c/ov02c10.c
533
if (ov02c10->hblank)
drivers/media/i2c/ov02c10.c
534
ov02c10->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/ov02c10.c
543
ov02c10->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &ov02c10_ctrl_ops,
drivers/media/i2c/ov02c10.c
561
ret = v4l2_fwnode_device_parse(ov02c10->dev, &props);
drivers/media/i2c/ov02c10.c
570
ov02c10->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/ov02c10.c
589
struct ov02c10 *ov02c10 = to_ov02c10(sd);
drivers/media/i2c/ov02c10.c
593
ret = pm_runtime_resume_and_get(ov02c10->dev);
drivers/media/i2c/ov02c10.c
599
ret = regmap_multi_reg_write(ov02c10->regmap,
drivers/media/i2c/ov02c10.c
602
dev_err(ov02c10->dev, "failed to set mode\n");
drivers/media/i2c/ov02c10.c
606
reg_sequence = mode->lane_settings[ov02c10->mipi_lanes - 1];
drivers/media/i2c/ov02c10.c
607
sequence_length = mode->lane_settings_length[ov02c10->mipi_lanes - 1];
drivers/media/i2c/ov02c10.c
608
ret = regmap_multi_reg_write(ov02c10->regmap,
drivers/media/i2c/ov02c10.c
611
dev_err(ov02c10->dev, "failed to write lane settings\n");
drivers/media/i2c/ov02c10.c
615
ret = __v4l2_ctrl_handler_setup(ov02c10->sd.ctrl_handler);
drivers/media/i2c/ov02c10.c
619
ret = cci_write(ov02c10->regmap, OV02C10_REG_STREAM_CONTROL, 1, NULL);
drivers/media/i2c/ov02c10.c
622
pm_runtime_put(ov02c10->dev);
drivers/media/i2c/ov02c10.c
631
struct ov02c10 *ov02c10 = to_ov02c10(sd);
drivers/media/i2c/ov02c10.c
633
cci_write(ov02c10->regmap, OV02C10_REG_STREAM_CONTROL, 0, NULL);
drivers/media/i2c/ov02c10.c
634
pm_runtime_put(ov02c10->dev);
drivers/media/i2c/ov02c10.c
643
struct ov02c10 *ov02c10 = to_ov02c10(sd);
drivers/media/i2c/ov02c10.c
646
ov02c10->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
drivers/media/i2c/ov02c10.c
647
if (IS_ERR(ov02c10->reset))
drivers/media/i2c/ov02c10.c
648
return dev_err_probe(dev, PTR_ERR(ov02c10->reset),
drivers/media/i2c/ov02c10.c
652
ov02c10->supplies[i].supply = ov02c10_supply_names[i];
drivers/media/i2c/ov02c10.c
655
ov02c10->supplies);
drivers/media/i2c/ov02c10.c
661
struct ov02c10 *ov02c10 = to_ov02c10(sd);
drivers/media/i2c/ov02c10.c
663
gpiod_set_value_cansleep(ov02c10->reset, 1);
drivers/media/i2c/ov02c10.c
666
ov02c10->supplies);
drivers/media/i2c/ov02c10.c
668
clk_disable_unprepare(ov02c10->img_clk);
drivers/media/i2c/ov02c10.c
676
struct ov02c10 *ov02c10 = to_ov02c10(sd);
drivers/media/i2c/ov02c10.c
679
ret = clk_prepare_enable(ov02c10->img_clk);
drivers/media/i2c/ov02c10.c
686
ov02c10->supplies);
drivers/media/i2c/ov02c10.c
689
clk_disable_unprepare(ov02c10->img_clk);
drivers/media/i2c/ov02c10.c
693
if (ov02c10->reset) {
drivers/media/i2c/ov02c10.c
696
gpiod_set_value_cansleep(ov02c10->reset, 0);
drivers/media/i2c/ov02c10.c
708
struct ov02c10 *ov02c10 = to_ov02c10(sd);
drivers/media/i2c/ov02c10.c
718
vblank_def = mode->vts_min * ov02c10->mipi_lanes - mode->height;
drivers/media/i2c/ov02c10.c
719
__v4l2_ctrl_modify_range(ov02c10->vblank, mode->vts_min - mode->height,
drivers/media/i2c/ov02c10.c
721
__v4l2_ctrl_s_ctrl(ov02c10->vblank, vblank_def);
drivers/media/i2c/ov02c10.c
723
__v4l2_ctrl_modify_range(ov02c10->hblank, h_blank, h_blank, 1, h_blank);
drivers/media/i2c/ov02c10.c
793
static int ov02c10_identify_module(struct ov02c10 *ov02c10)
drivers/media/i2c/ov02c10.c
798
ret = cci_read(ov02c10->regmap, OV02C10_REG_CHIP_ID, &chip_id, NULL);
drivers/media/i2c/ov02c10.c
803
dev_err(ov02c10->dev, "chip id mismatch: %x!=%llx",
drivers/media/i2c/ov02c10.c
811
static int ov02c10_check_hwcfg(struct ov02c10 *ov02c10)
drivers/media/i2c/ov02c10.c
816
struct device *dev = ov02c10->dev;
drivers/media/i2c/ov02c10.c
844
ov02c10->link_freq_index = ffs(link_freq_bitmap) - 1;
drivers/media/i2c/ov02c10.c
854
ov02c10->mipi_lanes = bus_cfg.bus.mipi_csi2.num_data_lanes;
drivers/media/i2c/ov02c10.c
864
struct ov02c10 *ov02c10 = to_ov02c10(sd);
drivers/media/i2c/ov02c10.c
870
pm_runtime_disable(ov02c10->dev);
drivers/media/i2c/ov02c10.c
871
if (!pm_runtime_status_suspended(ov02c10->dev)) {
drivers/media/i2c/ov02c10.c
872
ov02c10_power_off(ov02c10->dev);
drivers/media/i2c/ov02c10.c
873
pm_runtime_set_suspended(ov02c10->dev);
drivers/media/i2c/ov02c10.c
879
struct ov02c10 *ov02c10;
drivers/media/i2c/ov02c10.c
883
ov02c10 = devm_kzalloc(&client->dev, sizeof(*ov02c10), GFP_KERNEL);
drivers/media/i2c/ov02c10.c
884
if (!ov02c10)
drivers/media/i2c/ov02c10.c
887
ov02c10->dev = &client->dev;
drivers/media/i2c/ov02c10.c
889
ov02c10->img_clk = devm_v4l2_sensor_clk_get(ov02c10->dev, NULL);
drivers/media/i2c/ov02c10.c
890
if (IS_ERR(ov02c10->img_clk))
drivers/media/i2c/ov02c10.c
891
return dev_err_probe(ov02c10->dev, PTR_ERR(ov02c10->img_clk),
drivers/media/i2c/ov02c10.c
894
freq = clk_get_rate(ov02c10->img_clk);
drivers/media/i2c/ov02c10.c
896
return dev_err_probe(ov02c10->dev, -EINVAL,
drivers/media/i2c/ov02c10.c
900
v4l2_i2c_subdev_init(&ov02c10->sd, client, &ov02c10_subdev_ops);
drivers/media/i2c/ov02c10.c
903
ret = ov02c10_check_hwcfg(ov02c10);
drivers/media/i2c/ov02c10.c
907
ret = ov02c10_get_pm_resources(ov02c10->dev);
drivers/media/i2c/ov02c10.c
911
ov02c10->regmap = devm_cci_regmap_init_i2c(client, 16);
drivers/media/i2c/ov02c10.c
912
if (IS_ERR(ov02c10->regmap))
drivers/media/i2c/ov02c10.c
913
return PTR_ERR(ov02c10->regmap);
drivers/media/i2c/ov02c10.c
915
ret = ov02c10_power_on(ov02c10->dev);
drivers/media/i2c/ov02c10.c
917
dev_err_probe(ov02c10->dev, ret, "failed to power on\n");
drivers/media/i2c/ov02c10.c
921
ret = ov02c10_identify_module(ov02c10);
drivers/media/i2c/ov02c10.c
923
dev_err(ov02c10->dev, "failed to find sensor: %d", ret);
drivers/media/i2c/ov02c10.c
927
ret = ov02c10_init_controls(ov02c10);
drivers/media/i2c/ov02c10.c
929
dev_err(ov02c10->dev, "failed to init controls: %d", ret);
drivers/media/i2c/ov02c10.c
933
ov02c10->sd.internal_ops = &ov02c10_internal_ops;
drivers/media/i2c/ov02c10.c
934
ov02c10->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/ov02c10.c
935
ov02c10->sd.entity.ops = &ov02c10_subdev_entity_ops;
drivers/media/i2c/ov02c10.c
936
ov02c10->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/ov02c10.c
937
ov02c10->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/ov02c10.c
938
ret = media_entity_pads_init(&ov02c10->sd.entity, 1, &ov02c10->pad);
drivers/media/i2c/ov02c10.c
940
dev_err(ov02c10->dev, "failed to init entity pads: %d", ret);
drivers/media/i2c/ov02c10.c
944
ov02c10->sd.state_lock = ov02c10->ctrl_handler.lock;
drivers/media/i2c/ov02c10.c
945
ret = v4l2_subdev_init_finalize(&ov02c10->sd);
drivers/media/i2c/ov02c10.c
947
dev_err(ov02c10->dev, "failed to init subdev: %d", ret);
drivers/media/i2c/ov02c10.c
951
pm_runtime_set_active(ov02c10->dev);
drivers/media/i2c/ov02c10.c
952
pm_runtime_enable(ov02c10->dev);
drivers/media/i2c/ov02c10.c
954
ret = v4l2_async_register_subdev_sensor(&ov02c10->sd);
drivers/media/i2c/ov02c10.c
956
dev_err(ov02c10->dev, "failed to register V4L2 subdev: %d",
drivers/media/i2c/ov02c10.c
961
pm_runtime_idle(ov02c10->dev);
drivers/media/i2c/ov02c10.c
965
pm_runtime_disable(ov02c10->dev);
drivers/media/i2c/ov02c10.c
966
pm_runtime_set_suspended(ov02c10->dev);
drivers/media/i2c/ov02c10.c
967
v4l2_subdev_cleanup(&ov02c10->sd);
drivers/media/i2c/ov02c10.c
970
media_entity_cleanup(&ov02c10->sd.entity);
drivers/media/i2c/ov02c10.c
973
v4l2_ctrl_handler_free(ov02c10->sd.ctrl_handler);
drivers/media/i2c/ov02c10.c
976
ov02c10_power_off(ov02c10->dev);