drivers/media/i2c/ov01a10.c
1003
ov01a10 = devm_kzalloc(&client->dev, sizeof(*ov01a10), GFP_KERNEL);
drivers/media/i2c/ov01a10.c
1004
if (!ov01a10)
drivers/media/i2c/ov01a10.c
1007
ov01a10->dev = &client->dev;
drivers/media/i2c/ov01a10.c
1008
ov01a10->cfg = cfg;
drivers/media/i2c/ov01a10.c
1010
ov01a10->regmap = devm_cci_regmap_init_i2c(client, 16);
drivers/media/i2c/ov01a10.c
1011
if (IS_ERR(ov01a10->regmap))
drivers/media/i2c/ov01a10.c
1012
return PTR_ERR(ov01a10->regmap);
drivers/media/i2c/ov01a10.c
1014
v4l2_i2c_subdev_init(&ov01a10->sd, client, &ov01a10_subdev_ops);
drivers/media/i2c/ov01a10.c
1016
v4l2_i2c_subdev_set_name(&ov01a10->sd, client, cfg->model, NULL);
drivers/media/i2c/ov01a10.c
1017
ov01a10->sd.internal_ops = &ov01a10_internal_ops;
drivers/media/i2c/ov01a10.c
1019
ret = ov01a10_check_hwcfg(ov01a10);
drivers/media/i2c/ov01a10.c
1023
ret = ov01a10_get_pm_resources(ov01a10);
drivers/media/i2c/ov01a10.c
1031
ret = ov01a10_identify_module(ov01a10);
drivers/media/i2c/ov01a10.c
1035
ret = ov01a10_init_controls(ov01a10);
drivers/media/i2c/ov01a10.c
1039
ov01a10->sd.state_lock = ov01a10->ctrl_handler.lock;
drivers/media/i2c/ov01a10.c
1040
ov01a10->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/ov01a10.c
1041
ov01a10->sd.entity.ops = &ov01a10_subdev_entity_ops;
drivers/media/i2c/ov01a10.c
1042
ov01a10->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/ov01a10.c
1043
ov01a10->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/ov01a10.c
1045
ret = media_entity_pads_init(&ov01a10->sd.entity, 1, &ov01a10->pad);
drivers/media/i2c/ov01a10.c
1049
ret = v4l2_subdev_init_finalize(&ov01a10->sd);
drivers/media/i2c/ov01a10.c
1061
ret = v4l2_async_register_subdev_sensor(&ov01a10->sd);
drivers/media/i2c/ov01a10.c
1070
v4l2_subdev_cleanup(&ov01a10->sd);
drivers/media/i2c/ov01a10.c
1073
media_entity_cleanup(&ov01a10->sd.entity);
drivers/media/i2c/ov01a10.c
1076
v4l2_ctrl_handler_free(ov01a10->sd.ctrl_handler);
drivers/media/i2c/ov01a10.c
272
static inline struct ov01a10 *to_ov01a10(struct v4l2_subdev *subdev)
drivers/media/i2c/ov01a10.c
274
return container_of(subdev, struct ov01a10, sd);
drivers/media/i2c/ov01a10.c
277
static struct v4l2_mbus_framefmt *ov01a10_get_active_format(struct ov01a10 *ov01a10)
drivers/media/i2c/ov01a10.c
280
v4l2_subdev_get_locked_active_state(&ov01a10->sd);
drivers/media/i2c/ov01a10.c
285
static struct v4l2_rect *ov01a10_get_active_crop(struct ov01a10 *ov01a10)
drivers/media/i2c/ov01a10.c
288
v4l2_subdev_get_locked_active_state(&ov01a10->sd);
drivers/media/i2c/ov01a10.c
293
static int ov01a10_update_digital_gain(struct ov01a10 *ov01a10, u32 d_gain)
drivers/media/i2c/ov01a10.c
298
cci_write(ov01a10->regmap, OV01A10_REG_DIGITAL_GAIN_B, real, &ret);
drivers/media/i2c/ov01a10.c
299
cci_write(ov01a10->regmap, OV01A10_REG_DIGITAL_GAIN_GB, real, &ret);
drivers/media/i2c/ov01a10.c
300
cci_write(ov01a10->regmap, OV01A10_REG_DIGITAL_GAIN_GR, real, &ret);
drivers/media/i2c/ov01a10.c
301
cci_write(ov01a10->regmap, OV01A10_REG_DIGITAL_GAIN_R, real, &ret);
drivers/media/i2c/ov01a10.c
306
static int ov01a10_test_pattern(struct ov01a10 *ov01a10, u32 pattern)
drivers/media/i2c/ov01a10.c
311
return cci_write(ov01a10->regmap, OV01A10_REG_TEST_PATTERN, pattern,
drivers/media/i2c/ov01a10.c
315
static void ov01a10_set_format1(struct ov01a10 *ov01a10, int *ret)
drivers/media/i2c/ov01a10.c
317
u8 val = ov01a10->cfg->format1_base_val;
drivers/media/i2c/ov01a10.c
320
if (!ov01a10->hflip->val)
drivers/media/i2c/ov01a10.c
323
if (ov01a10->vflip->val)
drivers/media/i2c/ov01a10.c
326
cci_write(ov01a10->regmap, OV01A10_REG_FORMAT1, val, ret);
drivers/media/i2c/ov01a10.c
329
static int ov01a10_set_hflip(struct ov01a10 *ov01a10, bool hflip)
drivers/media/i2c/ov01a10.c
331
struct v4l2_rect *crop = ov01a10_get_active_crop(ov01a10);
drivers/media/i2c/ov01a10.c
332
const struct ov01a10_sensor_cfg *cfg = ov01a10->cfg;
drivers/media/i2c/ov01a10.c
340
cci_write(ov01a10->regmap, OV01A10_REG_X_WIN, offset, &ret);
drivers/media/i2c/ov01a10.c
341
ov01a10_set_format1(ov01a10, &ret);
drivers/media/i2c/ov01a10.c
346
static int ov01a10_set_vflip(struct ov01a10 *ov01a10, bool vflip)
drivers/media/i2c/ov01a10.c
348
struct v4l2_rect *crop = ov01a10_get_active_crop(ov01a10);
drivers/media/i2c/ov01a10.c
349
const struct ov01a10_sensor_cfg *cfg = ov01a10->cfg;
drivers/media/i2c/ov01a10.c
357
cci_write(ov01a10->regmap, OV01A10_REG_Y_WIN, offset, &ret);
drivers/media/i2c/ov01a10.c
358
ov01a10_set_format1(ov01a10, &ret);
drivers/media/i2c/ov01a10.c
365
struct ov01a10 *ov01a10 = container_of(ctrl->handler,
drivers/media/i2c/ov01a10.c
366
struct ov01a10, ctrl_handler);
drivers/media/i2c/ov01a10.c
367
struct v4l2_mbus_framefmt *fmt = ov01a10_get_active_format(ov01a10);
drivers/media/i2c/ov01a10.c
374
__v4l2_ctrl_modify_range(ov01a10->exposure,
drivers/media/i2c/ov01a10.c
379
if (!pm_runtime_get_if_in_use(ov01a10->dev))
drivers/media/i2c/ov01a10.c
384
ret = cci_write(ov01a10->regmap, OV01A10_REG_ANALOG_GAIN,
drivers/media/i2c/ov01a10.c
389
ret = ov01a10_update_digital_gain(ov01a10, ctrl->val);
drivers/media/i2c/ov01a10.c
393
ret = cci_write(ov01a10->regmap, OV01A10_REG_EXPOSURE,
drivers/media/i2c/ov01a10.c
398
ret = cci_write(ov01a10->regmap, OV01A10_REG_VTS,
drivers/media/i2c/ov01a10.c
403
ret = ov01a10_test_pattern(ov01a10, ctrl->val);
drivers/media/i2c/ov01a10.c
407
ov01a10_set_hflip(ov01a10, ctrl->val);
drivers/media/i2c/ov01a10.c
411
ov01a10_set_vflip(ov01a10, ctrl->val);
drivers/media/i2c/ov01a10.c
419
pm_runtime_put(ov01a10->dev);
drivers/media/i2c/ov01a10.c
428
static int ov01a10_init_controls(struct ov01a10 *ov01a10)
drivers/media/i2c/ov01a10.c
436
ret = v4l2_fwnode_device_parse(ov01a10->dev, &props);
drivers/media/i2c/ov01a10.c
440
ctrl_hdlr = &ov01a10->ctrl_handler;
drivers/media/i2c/ov01a10.c
445
ov01a10->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr,
drivers/media/i2c/ov01a10.c
448
ov01a10->link_freq_index, 0,
drivers/media/i2c/ov01a10.c
451
ov01a10->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &ov01a10_ctrl_ops,
drivers/media/i2c/ov01a10.c
458
ov01a10->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov01a10_ctrl_ops,
drivers/media/i2c/ov01a10.c
463
ov01a10->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov01a10_ctrl_ops,
drivers/media/i2c/ov01a10.c
475
ov01a10->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &ov01a10_ctrl_ops,
drivers/media/i2c/ov01a10.c
487
ov01a10->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &ov01a10_ctrl_ops,
drivers/media/i2c/ov01a10.c
489
ov01a10->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &ov01a10_ctrl_ops,
drivers/media/i2c/ov01a10.c
502
ov01a10->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/ov01a10.c
503
ov01a10->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/ov01a10.c
505
ov01a10->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/ov01a10.c
514
static void ov01a10_fill_format(struct ov01a10 *ov01a10,
drivers/media/i2c/ov01a10.c
521
fmt->code = ov01a10->cfg->bus_fmt;
drivers/media/i2c/ov01a10.c
526
static int ov01a10_set_mode(struct ov01a10 *ov01a10)
drivers/media/i2c/ov01a10.c
528
struct v4l2_mbus_framefmt *fmt = ov01a10_get_active_format(ov01a10);
drivers/media/i2c/ov01a10.c
531
cci_write(ov01a10->regmap, OV01A10_REG_X_ADDR_START, 0, &ret);
drivers/media/i2c/ov01a10.c
532
cci_write(ov01a10->regmap, OV01A10_REG_Y_ADDR_START, 0, &ret);
drivers/media/i2c/ov01a10.c
533
cci_write(ov01a10->regmap, OV01A10_REG_X_ADDR_END,
drivers/media/i2c/ov01a10.c
535
cci_write(ov01a10->regmap, OV01A10_REG_Y_ADDR_END,
drivers/media/i2c/ov01a10.c
537
cci_write(ov01a10->regmap, OV01A10_REG_X_OUTPUT_SIZE,
drivers/media/i2c/ov01a10.c
539
cci_write(ov01a10->regmap, OV01A10_REG_Y_OUTPUT_SIZE,
drivers/media/i2c/ov01a10.c
542
cci_write(ov01a10->regmap, OV01A10_REG_HTS,
drivers/media/i2c/ov01a10.c
551
static int ov01a10_start_streaming(struct ov01a10 *ov01a10)
drivers/media/i2c/ov01a10.c
556
freq_cfg = &link_freq_configs[ov01a10->link_freq_index];
drivers/media/i2c/ov01a10.c
557
ret = regmap_multi_reg_write(ov01a10->regmap, freq_cfg->regs,
drivers/media/i2c/ov01a10.c
560
dev_err(ov01a10->dev, "failed to set plls\n");
drivers/media/i2c/ov01a10.c
564
ret = regmap_multi_reg_write(ov01a10->regmap, ov01a10_global_setting,
drivers/media/i2c/ov01a10.c
567
dev_err(ov01a10->dev, "failed to initialize sensor\n");
drivers/media/i2c/ov01a10.c
571
ret = ov01a10_set_mode(ov01a10);
drivers/media/i2c/ov01a10.c
573
dev_err(ov01a10->dev, "failed to set mode\n");
drivers/media/i2c/ov01a10.c
577
ret = __v4l2_ctrl_handler_setup(ov01a10->sd.ctrl_handler);
drivers/media/i2c/ov01a10.c
581
return cci_write(ov01a10->regmap, OV01A10_REG_MODE_SELECT,
drivers/media/i2c/ov01a10.c
585
static void ov01a10_stop_streaming(struct ov01a10 *ov01a10)
drivers/media/i2c/ov01a10.c
587
cci_write(ov01a10->regmap, OV01A10_REG_MODE_SELECT,
drivers/media/i2c/ov01a10.c
593
struct ov01a10 *ov01a10 = to_ov01a10(sd);
drivers/media/i2c/ov01a10.c
600
ret = pm_runtime_resume_and_get(ov01a10->dev);
drivers/media/i2c/ov01a10.c
604
ret = ov01a10_start_streaming(ov01a10);
drivers/media/i2c/ov01a10.c
606
pm_runtime_put(ov01a10->dev);
drivers/media/i2c/ov01a10.c
610
ov01a10_stop_streaming(ov01a10);
drivers/media/i2c/ov01a10.c
611
pm_runtime_put(ov01a10->dev);
drivers/media/i2c/ov01a10.c
620
static void ov01a10_update_blank_ctrls(struct ov01a10 *ov01a10,
drivers/media/i2c/ov01a10.c
626
__v4l2_ctrl_modify_range(ov01a10->vblank,
drivers/media/i2c/ov01a10.c
630
__v4l2_ctrl_s_ctrl(ov01a10->vblank, vblank_def);
drivers/media/i2c/ov01a10.c
633
__v4l2_ctrl_modify_range(ov01a10->hblank, hblank, hblank, 1, hblank);
drivers/media/i2c/ov01a10.c
641
struct ov01a10 *ov01a10 = to_ov01a10(sd);
drivers/media/i2c/ov01a10.c
642
const int pattern_size = ov01a10->cfg->pattern_size;
drivers/media/i2c/ov01a10.c
643
const int border_size = ov01a10->cfg->border_size;
drivers/media/i2c/ov01a10.c
663
ov01a10_fill_format(ov01a10, &fmt->format, width, height);
drivers/media/i2c/ov01a10.c
667
ov01a10_update_blank_ctrls(ov01a10, width, height);
drivers/media/i2c/ov01a10.c
675
struct ov01a10 *ov01a10 = to_ov01a10(sd);
drivers/media/i2c/ov01a10.c
678
ov01a10_fill_format(ov01a10, v4l2_subdev_state_get_format(sd_state, 0),
drivers/media/i2c/ov01a10.c
688
struct ov01a10 *ov01a10 = to_ov01a10(sd);
drivers/media/i2c/ov01a10.c
693
code->code = ov01a10->cfg->bus_fmt;
drivers/media/i2c/ov01a10.c
702
struct ov01a10 *ov01a10 = to_ov01a10(sd);
drivers/media/i2c/ov01a10.c
703
const int pattern_size = ov01a10->cfg->pattern_size;
drivers/media/i2c/ov01a10.c
704
const int border_size = ov01a10->cfg->border_size;
drivers/media/i2c/ov01a10.c
721
struct ov01a10 *ov01a10 = to_ov01a10(sd);
drivers/media/i2c/ov01a10.c
722
const int border_size = ov01a10->cfg->border_size;
drivers/media/i2c/ov01a10.c
753
struct ov01a10 *ov01a10 = to_ov01a10(sd);
drivers/media/i2c/ov01a10.c
754
const int pattern_size = ov01a10->cfg->pattern_size;
drivers/media/i2c/ov01a10.c
755
const int border_size = ov01a10->cfg->border_size;
drivers/media/i2c/ov01a10.c
785
ov01a10_update_blank_ctrls(ov01a10, rect.width,
drivers/media/i2c/ov01a10.c
826
static int ov01a10_get_pm_resources(struct ov01a10 *ov01a10)
drivers/media/i2c/ov01a10.c
831
ov01a10->clk = devm_v4l2_sensor_clk_get(ov01a10->dev, NULL);
drivers/media/i2c/ov01a10.c
832
if (IS_ERR(ov01a10->clk))
drivers/media/i2c/ov01a10.c
833
return dev_err_probe(ov01a10->dev, PTR_ERR(ov01a10->clk),
drivers/media/i2c/ov01a10.c
836
freq = clk_get_rate(ov01a10->clk);
drivers/media/i2c/ov01a10.c
838
return dev_err_probe(ov01a10->dev, -EINVAL,
drivers/media/i2c/ov01a10.c
842
ov01a10->reset = devm_gpiod_get_optional(ov01a10->dev, "reset",
drivers/media/i2c/ov01a10.c
844
if (IS_ERR(ov01a10->reset))
drivers/media/i2c/ov01a10.c
845
return dev_err_probe(ov01a10->dev, PTR_ERR(ov01a10->reset),
drivers/media/i2c/ov01a10.c
848
ov01a10->powerdown = devm_gpiod_get_optional(ov01a10->dev, "powerdown",
drivers/media/i2c/ov01a10.c
850
if (IS_ERR(ov01a10->powerdown))
drivers/media/i2c/ov01a10.c
851
return dev_err_probe(ov01a10->dev, PTR_ERR(ov01a10->powerdown),
drivers/media/i2c/ov01a10.c
855
ov01a10->supplies[i].supply = ov01a10_supply_names[i];
drivers/media/i2c/ov01a10.c
857
ret = devm_regulator_bulk_get(ov01a10->dev,
drivers/media/i2c/ov01a10.c
859
ov01a10->supplies);
drivers/media/i2c/ov01a10.c
861
return dev_err_probe(ov01a10->dev, ret, "getting regulators\n");
drivers/media/i2c/ov01a10.c
869
struct ov01a10 *ov01a10 = to_ov01a10(sd);
drivers/media/i2c/ov01a10.c
872
ret = clk_prepare_enable(ov01a10->clk);
drivers/media/i2c/ov01a10.c
879
ov01a10->supplies);
drivers/media/i2c/ov01a10.c
882
clk_disable_unprepare(ov01a10->clk);
drivers/media/i2c/ov01a10.c
886
if (ov01a10->reset || ov01a10->powerdown) {
drivers/media/i2c/ov01a10.c
889
gpiod_set_value_cansleep(ov01a10->powerdown, 0);
drivers/media/i2c/ov01a10.c
890
gpiod_set_value_cansleep(ov01a10->reset, 0);
drivers/media/i2c/ov01a10.c
900
struct ov01a10 *ov01a10 = to_ov01a10(sd);
drivers/media/i2c/ov01a10.c
902
gpiod_set_value_cansleep(ov01a10->reset, 1);
drivers/media/i2c/ov01a10.c
903
gpiod_set_value_cansleep(ov01a10->powerdown, 1);
drivers/media/i2c/ov01a10.c
906
ov01a10->supplies);
drivers/media/i2c/ov01a10.c
908
clk_disable_unprepare(ov01a10->clk);
drivers/media/i2c/ov01a10.c
912
static int ov01a10_identify_module(struct ov01a10 *ov01a10)
drivers/media/i2c/ov01a10.c
917
ret = cci_read(ov01a10->regmap, OV01A10_REG_CHIP_ID, &val, NULL);
drivers/media/i2c/ov01a10.c
922
dev_err(ov01a10->dev, "chip id mismatch: %x!=%llx\n",
drivers/media/i2c/ov01a10.c
930
static int ov01a10_check_hwcfg(struct ov01a10 *ov01a10)
drivers/media/i2c/ov01a10.c
935
struct fwnode_handle *ep, *fwnode = dev_fwnode(ov01a10->dev);
drivers/media/i2c/ov01a10.c
945
return dev_err_probe(ov01a10->dev, -EPROBE_DEFER,
drivers/media/i2c/ov01a10.c
951
return dev_err_probe(ov01a10->dev, ret, "parsing endpoint\n");
drivers/media/i2c/ov01a10.c
953
ret = v4l2_link_freq_to_bitmap(ov01a10->dev,
drivers/media/i2c/ov01a10.c
963
ov01a10->link_freq_index = ffs(link_freq_bitmap) - 1;
drivers/media/i2c/ov01a10.c
966
ret = dev_err_probe(ov01a10->dev, -EINVAL,
drivers/media/i2c/ov01a10.c
996
struct ov01a10 *ov01a10;