Symbol: ov02a10
drivers/media/i2c/ov02a10.c
130
static inline struct ov02a10 *to_ov02a10(struct v4l2_subdev *sd)
drivers/media/i2c/ov02a10.c
132
return container_of(sd, struct ov02a10, subdev);
drivers/media/i2c/ov02a10.c
273
static int ov02a10_write_array(struct ov02a10 *ov02a10,
drivers/media/i2c/ov02a10.c
276
struct i2c_client *client = v4l2_get_subdevdata(&ov02a10->subdev);
drivers/media/i2c/ov02a10.c
302
struct ov02a10 *ov02a10 = to_ov02a10(sd);
drivers/media/i2c/ov02a10.c
307
mutex_lock(&ov02a10->mutex);
drivers/media/i2c/ov02a10.c
309
if (ov02a10->streaming && fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
drivers/media/i2c/ov02a10.c
315
mbus_fmt->code = ov02a10->fmt.code;
drivers/media/i2c/ov02a10.c
316
ov02a10_fill_fmt(ov02a10->cur_mode, mbus_fmt);
drivers/media/i2c/ov02a10.c
321
frame_fmt = &ov02a10->fmt;
drivers/media/i2c/ov02a10.c
326
mutex_unlock(&ov02a10->mutex);
drivers/media/i2c/ov02a10.c
334
struct ov02a10 *ov02a10 = to_ov02a10(sd);
drivers/media/i2c/ov02a10.c
337
mutex_lock(&ov02a10->mutex);
drivers/media/i2c/ov02a10.c
343
fmt->format = ov02a10->fmt;
drivers/media/i2c/ov02a10.c
344
mbus_fmt->code = ov02a10->fmt.code;
drivers/media/i2c/ov02a10.c
345
ov02a10_fill_fmt(ov02a10->cur_mode, mbus_fmt);
drivers/media/i2c/ov02a10.c
348
mutex_unlock(&ov02a10->mutex);
drivers/media/i2c/ov02a10.c
357
struct ov02a10 *ov02a10 = to_ov02a10(sd);
drivers/media/i2c/ov02a10.c
362
code->code = ov02a10->fmt.code;
drivers/media/i2c/ov02a10.c
382
static int ov02a10_check_sensor_id(struct ov02a10 *ov02a10)
drivers/media/i2c/ov02a10.c
384
struct i2c_client *client = v4l2_get_subdevdata(&ov02a10->subdev);
drivers/media/i2c/ov02a10.c
396
dev_err(ov02a10->dev, "unexpected sensor id(0x%04x)\n", chip_id);
drivers/media/i2c/ov02a10.c
407
struct ov02a10 *ov02a10 = to_ov02a10(sd);
drivers/media/i2c/ov02a10.c
410
gpiod_set_value_cansleep(ov02a10->rst_gpio, 1);
drivers/media/i2c/ov02a10.c
411
gpiod_set_value_cansleep(ov02a10->pd_gpio, 1);
drivers/media/i2c/ov02a10.c
413
ret = clk_prepare_enable(ov02a10->eclk);
drivers/media/i2c/ov02a10.c
420
ov02a10->supplies);
drivers/media/i2c/ov02a10.c
427
gpiod_set_value_cansleep(ov02a10->pd_gpio, 0);
drivers/media/i2c/ov02a10.c
430
gpiod_set_value_cansleep(ov02a10->rst_gpio, 0);
drivers/media/i2c/ov02a10.c
433
ret = ov02a10_check_sensor_id(ov02a10);
drivers/media/i2c/ov02a10.c
441
ov02a10->supplies);
drivers/media/i2c/ov02a10.c
443
clk_disable_unprepare(ov02a10->eclk);
drivers/media/i2c/ov02a10.c
452
struct ov02a10 *ov02a10 = to_ov02a10(sd);
drivers/media/i2c/ov02a10.c
454
gpiod_set_value_cansleep(ov02a10->rst_gpio, 1);
drivers/media/i2c/ov02a10.c
455
clk_disable_unprepare(ov02a10->eclk);
drivers/media/i2c/ov02a10.c
456
gpiod_set_value_cansleep(ov02a10->pd_gpio, 1);
drivers/media/i2c/ov02a10.c
458
ov02a10->supplies);
drivers/media/i2c/ov02a10.c
463
static int __ov02a10_start_stream(struct ov02a10 *ov02a10)
drivers/media/i2c/ov02a10.c
465
struct i2c_client *client = v4l2_get_subdevdata(&ov02a10->subdev);
drivers/media/i2c/ov02a10.c
470
reg_list = &ov02a10->cur_mode->reg_list;
drivers/media/i2c/ov02a10.c
471
ret = ov02a10_write_array(ov02a10, reg_list);
drivers/media/i2c/ov02a10.c
476
ret = __v4l2_ctrl_handler_setup(ov02a10->subdev.ctrl_handler);
drivers/media/i2c/ov02a10.c
481
if (ov02a10->upside_down) {
drivers/media/i2c/ov02a10.c
485
dev_err(ov02a10->dev, "failed to set orientation\n");
drivers/media/i2c/ov02a10.c
495
if (ov02a10->mipi_clock_voltage != OV02A10_MIPI_TX_SPEED_DEFAULT) {
drivers/media/i2c/ov02a10.c
497
ov02a10->mipi_clock_voltage);
drivers/media/i2c/ov02a10.c
507
static int __ov02a10_stop_stream(struct ov02a10 *ov02a10)
drivers/media/i2c/ov02a10.c
509
struct i2c_client *client = v4l2_get_subdevdata(&ov02a10->subdev);
drivers/media/i2c/ov02a10.c
533
struct ov02a10 *ov02a10 = to_ov02a10(sd);
drivers/media/i2c/ov02a10.c
536
mutex_lock(&ov02a10->mutex);
drivers/media/i2c/ov02a10.c
538
if (ov02a10->streaming == on) {
drivers/media/i2c/ov02a10.c
544
ret = pm_runtime_resume_and_get(ov02a10->dev);
drivers/media/i2c/ov02a10.c
548
ret = __ov02a10_start_stream(ov02a10);
drivers/media/i2c/ov02a10.c
550
__ov02a10_stop_stream(ov02a10);
drivers/media/i2c/ov02a10.c
551
ov02a10->streaming = !on;
drivers/media/i2c/ov02a10.c
555
__ov02a10_stop_stream(ov02a10);
drivers/media/i2c/ov02a10.c
556
pm_runtime_put(ov02a10->dev);
drivers/media/i2c/ov02a10.c
559
ov02a10->streaming = on;
drivers/media/i2c/ov02a10.c
560
mutex_unlock(&ov02a10->mutex);
drivers/media/i2c/ov02a10.c
565
pm_runtime_put(ov02a10->dev);
drivers/media/i2c/ov02a10.c
567
mutex_unlock(&ov02a10->mutex);
drivers/media/i2c/ov02a10.c
576
static int ov02a10_set_exposure(struct ov02a10 *ov02a10, int val)
drivers/media/i2c/ov02a10.c
578
struct i2c_client *client = v4l2_get_subdevdata(&ov02a10->subdev);
drivers/media/i2c/ov02a10.c
598
static int ov02a10_set_gain(struct ov02a10 *ov02a10, int val)
drivers/media/i2c/ov02a10.c
600
struct i2c_client *client = v4l2_get_subdevdata(&ov02a10->subdev);
drivers/media/i2c/ov02a10.c
615
static int ov02a10_set_vblank(struct ov02a10 *ov02a10, int val)
drivers/media/i2c/ov02a10.c
617
struct i2c_client *client = v4l2_get_subdevdata(&ov02a10->subdev);
drivers/media/i2c/ov02a10.c
618
u32 vts = val + ov02a10->cur_mode->height - OV02A10_BASE_LINES;
drivers/media/i2c/ov02a10.c
638
static int ov02a10_set_test_pattern(struct ov02a10 *ov02a10, int pattern)
drivers/media/i2c/ov02a10.c
640
struct i2c_client *client = v4l2_get_subdevdata(&ov02a10->subdev);
drivers/media/i2c/ov02a10.c
663
struct ov02a10 *ov02a10 = container_of(ctrl->handler,
drivers/media/i2c/ov02a10.c
664
struct ov02a10, ctrl_handler);
drivers/media/i2c/ov02a10.c
671
max_expo = ov02a10->cur_mode->height + ctrl->val -
drivers/media/i2c/ov02a10.c
673
__v4l2_ctrl_modify_range(ov02a10->exposure,
drivers/media/i2c/ov02a10.c
674
ov02a10->exposure->minimum, max_expo,
drivers/media/i2c/ov02a10.c
675
ov02a10->exposure->step,
drivers/media/i2c/ov02a10.c
676
ov02a10->exposure->default_value);
drivers/media/i2c/ov02a10.c
680
if (!pm_runtime_get_if_in_use(ov02a10->dev))
drivers/media/i2c/ov02a10.c
685
ret = ov02a10_set_exposure(ov02a10, ctrl->val);
drivers/media/i2c/ov02a10.c
688
ret = ov02a10_set_gain(ov02a10, ctrl->val);
drivers/media/i2c/ov02a10.c
691
ret = ov02a10_set_vblank(ov02a10, ctrl->val);
drivers/media/i2c/ov02a10.c
694
ret = ov02a10_set_test_pattern(ov02a10, ctrl->val);
drivers/media/i2c/ov02a10.c
701
pm_runtime_put(ov02a10->dev);
drivers/media/i2c/ov02a10.c
734
static int ov02a10_initialize_controls(struct ov02a10 *ov02a10)
drivers/media/i2c/ov02a10.c
745
handler = &ov02a10->ctrl_handler;
drivers/media/i2c/ov02a10.c
746
mode = ov02a10->cur_mode;
drivers/media/i2c/ov02a10.c
751
handler->lock = &ov02a10->mutex;
drivers/media/i2c/ov02a10.c
772
ov02a10->exposure = v4l2_ctrl_new_std(handler, &ov02a10_ctrl_ops,
drivers/media/i2c/ov02a10.c
791
dev_err(ov02a10->dev, "failed to init controls(%d)\n", ret);
drivers/media/i2c/ov02a10.c
795
ov02a10->subdev.ctrl_handler = handler;
drivers/media/i2c/ov02a10.c
805
static int ov02a10_check_hwcfg(struct device *dev, struct ov02a10 *ov02a10)
drivers/media/i2c/ov02a10.c
833
ov02a10->mipi_clock_voltage = clk_volt;
drivers/media/i2c/ov02a10.c
858
struct ov02a10 *ov02a10;
drivers/media/i2c/ov02a10.c
863
ov02a10 = devm_kzalloc(dev, sizeof(*ov02a10), GFP_KERNEL);
drivers/media/i2c/ov02a10.c
864
if (!ov02a10)
drivers/media/i2c/ov02a10.c
867
ov02a10->dev = dev;
drivers/media/i2c/ov02a10.c
869
ret = ov02a10_check_hwcfg(dev, ov02a10);
drivers/media/i2c/ov02a10.c
874
v4l2_i2c_subdev_init(&ov02a10->subdev, client, &ov02a10_subdev_ops);
drivers/media/i2c/ov02a10.c
875
ov02a10->subdev.internal_ops = &ov02a10_internal_ops;
drivers/media/i2c/ov02a10.c
877
ov02a10->mipi_clock_voltage = OV02A10_MIPI_TX_SPEED_DEFAULT;
drivers/media/i2c/ov02a10.c
878
ov02a10->fmt.code = MEDIA_BUS_FMT_SBGGR10_1X10;
drivers/media/i2c/ov02a10.c
884
ov02a10->upside_down = true;
drivers/media/i2c/ov02a10.c
885
ov02a10->fmt.code = MEDIA_BUS_FMT_SRGGB10_1X10;
drivers/media/i2c/ov02a10.c
888
ov02a10->eclk = devm_v4l2_sensor_clk_get_legacy(dev, "eclk", false, 0);
drivers/media/i2c/ov02a10.c
889
if (IS_ERR(ov02a10->eclk))
drivers/media/i2c/ov02a10.c
890
return dev_err_probe(dev, PTR_ERR(ov02a10->eclk),
drivers/media/i2c/ov02a10.c
893
if (clk_get_rate(ov02a10->eclk) != OV02A10_ECLK_FREQ)
drivers/media/i2c/ov02a10.c
896
ov02a10->pd_gpio = devm_gpiod_get(dev, "powerdown", GPIOD_OUT_HIGH);
drivers/media/i2c/ov02a10.c
897
if (IS_ERR(ov02a10->pd_gpio))
drivers/media/i2c/ov02a10.c
898
return dev_err_probe(dev, PTR_ERR(ov02a10->pd_gpio),
drivers/media/i2c/ov02a10.c
901
ov02a10->rst_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
drivers/media/i2c/ov02a10.c
902
if (IS_ERR(ov02a10->rst_gpio))
drivers/media/i2c/ov02a10.c
903
return dev_err_probe(dev, PTR_ERR(ov02a10->rst_gpio),
drivers/media/i2c/ov02a10.c
907
ov02a10->supplies[i].supply = ov02a10_supply_names[i];
drivers/media/i2c/ov02a10.c
910
ov02a10->supplies);
drivers/media/i2c/ov02a10.c
914
mutex_init(&ov02a10->mutex);
drivers/media/i2c/ov02a10.c
917
ov02a10->cur_mode = &supported_modes[0];
drivers/media/i2c/ov02a10.c
919
ret = ov02a10_initialize_controls(ov02a10);
drivers/media/i2c/ov02a10.c
926
ov02a10->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/ov02a10.c
927
ov02a10->subdev.entity.ops = &ov02a10_subdev_entity_ops;
drivers/media/i2c/ov02a10.c
928
ov02a10->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/ov02a10.c
929
ov02a10->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/ov02a10.c
931
ret = media_entity_pads_init(&ov02a10->subdev.entity, 1, &ov02a10->pad);
drivers/media/i2c/ov02a10.c
946
ret = v4l2_async_register_subdev(&ov02a10->subdev);
drivers/media/i2c/ov02a10.c
960
media_entity_cleanup(&ov02a10->subdev.entity);
drivers/media/i2c/ov02a10.c
962
v4l2_ctrl_handler_free(ov02a10->subdev.ctrl_handler);
drivers/media/i2c/ov02a10.c
964
mutex_destroy(&ov02a10->mutex);
drivers/media/i2c/ov02a10.c
972
struct ov02a10 *ov02a10 = to_ov02a10(sd);
drivers/media/i2c/ov02a10.c
977
pm_runtime_disable(ov02a10->dev);
drivers/media/i2c/ov02a10.c
978
if (!pm_runtime_status_suspended(ov02a10->dev))
drivers/media/i2c/ov02a10.c
979
ov02a10_power_off(ov02a10->dev);
drivers/media/i2c/ov02a10.c
980
pm_runtime_set_suspended(ov02a10->dev);
drivers/media/i2c/ov02a10.c
981
mutex_destroy(&ov02a10->mutex);