Symbol: og01a1b
drivers/media/i2c/og01a1b.c
1000
if (IS_ERR(og01a1b->reset_gpio)) {
drivers/media/i2c/og01a1b.c
1001
dev_err(og01a1b->dev, "cannot get reset GPIO\n");
drivers/media/i2c/og01a1b.c
1002
return PTR_ERR(og01a1b->reset_gpio);
drivers/media/i2c/og01a1b.c
1005
og01a1b->avdd = devm_regulator_get_optional(og01a1b->dev, "avdd");
drivers/media/i2c/og01a1b.c
1006
if (IS_ERR(og01a1b->avdd)) {
drivers/media/i2c/og01a1b.c
1007
ret = PTR_ERR(og01a1b->avdd);
drivers/media/i2c/og01a1b.c
1009
dev_err_probe(og01a1b->dev, ret,
drivers/media/i2c/og01a1b.c
1014
og01a1b->avdd = NULL;
drivers/media/i2c/og01a1b.c
1017
og01a1b->dovdd = devm_regulator_get_optional(og01a1b->dev, "dovdd");
drivers/media/i2c/og01a1b.c
1018
if (IS_ERR(og01a1b->dovdd)) {
drivers/media/i2c/og01a1b.c
1019
ret = PTR_ERR(og01a1b->dovdd);
drivers/media/i2c/og01a1b.c
1021
dev_err_probe(og01a1b->dev, ret,
drivers/media/i2c/og01a1b.c
1026
og01a1b->dovdd = NULL;
drivers/media/i2c/og01a1b.c
1029
og01a1b->dvdd = devm_regulator_get_optional(og01a1b->dev, "dvdd");
drivers/media/i2c/og01a1b.c
1030
if (IS_ERR(og01a1b->dvdd)) {
drivers/media/i2c/og01a1b.c
1031
ret = PTR_ERR(og01a1b->dvdd);
drivers/media/i2c/og01a1b.c
1033
dev_err_probe(og01a1b->dev, ret,
drivers/media/i2c/og01a1b.c
1038
og01a1b->dvdd = NULL;
drivers/media/i2c/og01a1b.c
1042
ret = og01a1b_power_on(og01a1b->dev);
drivers/media/i2c/og01a1b.c
1046
ret = og01a1b_identify_module(og01a1b);
drivers/media/i2c/og01a1b.c
1048
dev_err(og01a1b->dev, "failed to find sensor: %d", ret);
drivers/media/i2c/og01a1b.c
1052
og01a1b->cur_mode = &supported_modes[0];
drivers/media/i2c/og01a1b.c
1053
og01a1b->code = og01a1b_mbus_formats[0];
drivers/media/i2c/og01a1b.c
1054
ret = og01a1b_init_controls(og01a1b);
drivers/media/i2c/og01a1b.c
1056
dev_err(og01a1b->dev, "failed to init controls: %d", ret);
drivers/media/i2c/og01a1b.c
1060
og01a1b->sd.state_lock = og01a1b->ctrl_handler.lock;
drivers/media/i2c/og01a1b.c
1061
og01a1b->sd.internal_ops = &og01a1b_internal_ops;
drivers/media/i2c/og01a1b.c
1062
og01a1b->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/og01a1b.c
1063
og01a1b->sd.entity.ops = &og01a1b_subdev_entity_ops;
drivers/media/i2c/og01a1b.c
1064
og01a1b->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/og01a1b.c
1065
og01a1b->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/og01a1b.c
1066
ret = media_entity_pads_init(&og01a1b->sd.entity, 1, &og01a1b->pad);
drivers/media/i2c/og01a1b.c
1068
dev_err(og01a1b->dev, "failed to init entity pads: %d", ret);
drivers/media/i2c/og01a1b.c
1072
ret = v4l2_subdev_init_finalize(&og01a1b->sd);
drivers/media/i2c/og01a1b.c
1074
dev_err_probe(og01a1b->dev, ret,
drivers/media/i2c/og01a1b.c
1079
ret = v4l2_async_register_subdev_sensor(&og01a1b->sd);
drivers/media/i2c/og01a1b.c
1081
dev_err(og01a1b->dev, "failed to register V4L2 subdev: %d",
drivers/media/i2c/og01a1b.c
1087
pm_runtime_set_active(og01a1b->dev);
drivers/media/i2c/og01a1b.c
1088
pm_runtime_enable(og01a1b->dev);
drivers/media/i2c/og01a1b.c
1089
pm_runtime_idle(og01a1b->dev);
drivers/media/i2c/og01a1b.c
1094
v4l2_subdev_cleanup(&og01a1b->sd);
drivers/media/i2c/og01a1b.c
1097
media_entity_cleanup(&og01a1b->sd.entity);
drivers/media/i2c/og01a1b.c
1100
v4l2_ctrl_handler_free(og01a1b->sd.ctrl_handler);
drivers/media/i2c/og01a1b.c
1103
og01a1b_power_off(og01a1b->dev);
drivers/media/i2c/og01a1b.c
456
static int og01a1b_test_pattern(struct og01a1b *og01a1b, u32 pattern)
drivers/media/i2c/og01a1b.c
462
return cci_write(og01a1b->regmap, OG01A1B_REG_TEST_PATTERN,
drivers/media/i2c/og01a1b.c
468
struct og01a1b *og01a1b = container_of(ctrl->handler,
drivers/media/i2c/og01a1b.c
469
struct og01a1b, ctrl_handler);
drivers/media/i2c/og01a1b.c
476
exposure_max = og01a1b->cur_mode->height + ctrl->val -
drivers/media/i2c/og01a1b.c
478
__v4l2_ctrl_modify_range(og01a1b->exposure,
drivers/media/i2c/og01a1b.c
479
og01a1b->exposure->minimum,
drivers/media/i2c/og01a1b.c
480
exposure_max, og01a1b->exposure->step,
drivers/media/i2c/og01a1b.c
485
if (!pm_runtime_get_if_in_use(og01a1b->dev))
drivers/media/i2c/og01a1b.c
490
ret = cci_write(og01a1b->regmap, OG01A1B_REG_ANALOG_GAIN,
drivers/media/i2c/og01a1b.c
495
ret = cci_write(og01a1b->regmap, OG01A1B_REG_DIG_GAIN,
drivers/media/i2c/og01a1b.c
500
ret = cci_write(og01a1b->regmap, OG01A1B_REG_EXPOSURE,
drivers/media/i2c/og01a1b.c
505
ret = cci_write(og01a1b->regmap, OG01A1B_REG_VTS,
drivers/media/i2c/og01a1b.c
506
og01a1b->cur_mode->height + ctrl->val, NULL);
drivers/media/i2c/og01a1b.c
510
ret = og01a1b_test_pattern(og01a1b, ctrl->val);
drivers/media/i2c/og01a1b.c
518
pm_runtime_put(og01a1b->dev);
drivers/media/i2c/og01a1b.c
527
static int og01a1b_init_controls(struct og01a1b *og01a1b)
drivers/media/i2c/og01a1b.c
534
ctrl_hdlr = &og01a1b->ctrl_handler;
drivers/media/i2c/og01a1b.c
539
og01a1b->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr,
drivers/media/i2c/og01a1b.c
545
if (og01a1b->link_freq)
drivers/media/i2c/og01a1b.c
546
og01a1b->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/og01a1b.c
548
bpp = (og01a1b->code == MEDIA_BUS_FMT_Y10_1X10 ? 10 : 8);
drivers/media/i2c/og01a1b.c
549
og01a1b->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &og01a1b_ctrl_ops,
drivers/media/i2c/og01a1b.c
554
og01a1b->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &og01a1b_ctrl_ops,
drivers/media/i2c/og01a1b.c
556
og01a1b->cur_mode->vts_min -
drivers/media/i2c/og01a1b.c
557
og01a1b->cur_mode->height,
drivers/media/i2c/og01a1b.c
559
og01a1b->cur_mode->height, 1,
drivers/media/i2c/og01a1b.c
560
og01a1b->cur_mode->vts_def -
drivers/media/i2c/og01a1b.c
561
og01a1b->cur_mode->height);
drivers/media/i2c/og01a1b.c
562
h_blank = to_pixels_per_line(og01a1b->cur_mode->hts,
drivers/media/i2c/og01a1b.c
563
og01a1b->cur_mode->link_freq_index, bpp) -
drivers/media/i2c/og01a1b.c
564
og01a1b->cur_mode->width;
drivers/media/i2c/og01a1b.c
565
og01a1b->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &og01a1b_ctrl_ops,
drivers/media/i2c/og01a1b.c
568
if (og01a1b->hblank)
drivers/media/i2c/og01a1b.c
569
og01a1b->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/og01a1b.c
577
exposure_max = (og01a1b->cur_mode->vts_def -
drivers/media/i2c/og01a1b.c
579
og01a1b->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &og01a1b_ctrl_ops,
drivers/media/i2c/og01a1b.c
593
og01a1b->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/og01a1b.c
610
struct og01a1b *og01a1b = to_og01a1b(sd);
drivers/media/i2c/og01a1b.c
611
unsigned int link_freq_index = og01a1b->cur_mode->link_freq_index;
drivers/media/i2c/og01a1b.c
615
ret = pm_runtime_resume_and_get(og01a1b->dev);
drivers/media/i2c/og01a1b.c
62
#define to_og01a1b(_sd) container_of(_sd, struct og01a1b, sd)
drivers/media/i2c/og01a1b.c
620
ret = cci_multi_reg_write(og01a1b->regmap, reg_list->regs,
drivers/media/i2c/og01a1b.c
623
dev_err(og01a1b->dev, "failed to set plls: %d\n", ret);
drivers/media/i2c/og01a1b.c
627
reg_list = &og01a1b->cur_mode->reg_list;
drivers/media/i2c/og01a1b.c
628
ret = cci_multi_reg_write(og01a1b->regmap, reg_list->regs,
drivers/media/i2c/og01a1b.c
631
dev_err(og01a1b->dev, "failed to set mode: %d\n", ret);
drivers/media/i2c/og01a1b.c
635
ret = cci_write(og01a1b->regmap, CCI_REG8(0x3662),
drivers/media/i2c/og01a1b.c
636
(og01a1b->code == MEDIA_BUS_FMT_Y10_1X10 ? 0x4 : 0x6),
drivers/media/i2c/og01a1b.c
639
dev_err(og01a1b->dev, "failed to set output format: %d\n", ret);
drivers/media/i2c/og01a1b.c
643
ret = __v4l2_ctrl_handler_setup(og01a1b->sd.ctrl_handler);
drivers/media/i2c/og01a1b.c
647
ret = cci_write(og01a1b->regmap, OG01A1B_REG_MODE_SELECT,
drivers/media/i2c/og01a1b.c
650
dev_err(og01a1b->dev, "failed to start streaming: %d\n", ret);
drivers/media/i2c/og01a1b.c
657
pm_runtime_put_autosuspend(og01a1b->dev);
drivers/media/i2c/og01a1b.c
666
struct og01a1b *og01a1b = to_og01a1b(sd);
drivers/media/i2c/og01a1b.c
669
ret = cci_write(og01a1b->regmap, OG01A1B_REG_MODE_SELECT,
drivers/media/i2c/og01a1b.c
672
dev_err(og01a1b->dev, "failed to stop streaming: %d\n", ret);
drivers/media/i2c/og01a1b.c
674
pm_runtime_put_autosuspend(og01a1b->dev);
drivers/media/i2c/og01a1b.c
683
struct og01a1b *og01a1b = to_og01a1b(sd);
drivers/media/i2c/og01a1b.c
698
__v4l2_ctrl_s_ctrl(og01a1b->link_freq, mode->link_freq_index);
drivers/media/i2c/og01a1b.c
699
__v4l2_ctrl_s_ctrl_int64(og01a1b->pixel_rate,
drivers/media/i2c/og01a1b.c
704
__v4l2_ctrl_modify_range(og01a1b->vblank,
drivers/media/i2c/og01a1b.c
707
__v4l2_ctrl_s_ctrl(og01a1b->vblank, vblank_def);
drivers/media/i2c/og01a1b.c
710
__v4l2_ctrl_modify_range(og01a1b->hblank, h_blank, h_blank, 1, h_blank);
drivers/media/i2c/og01a1b.c
712
og01a1b->cur_mode = mode;
drivers/media/i2c/og01a1b.c
713
og01a1b->code = fmt->format.code;
drivers/media/i2c/og01a1b.c
755
struct og01a1b *og01a1b = to_og01a1b(sd);
drivers/media/i2c/og01a1b.c
760
.width = og01a1b->cur_mode->width,
drivers/media/i2c/og01a1b.c
761
.height = og01a1b->cur_mode->height,
drivers/media/i2c/og01a1b.c
762
.code = og01a1b->code,
drivers/media/i2c/og01a1b.c
797
static int og01a1b_identify_module(struct og01a1b *og01a1b)
drivers/media/i2c/og01a1b.c
802
ret = cci_read(og01a1b->regmap, OG01A1B_REG_CHIP_ID, &val, NULL);
drivers/media/i2c/og01a1b.c
807
dev_err(og01a1b->dev, "chip id mismatch: %x!=%llx",
drivers/media/i2c/og01a1b.c
815
static int og01a1b_check_hwcfg(struct og01a1b *og01a1b)
drivers/media/i2c/og01a1b.c
817
struct device *dev = og01a1b->dev;
drivers/media/i2c/og01a1b.c
877
struct og01a1b *og01a1b = to_og01a1b(sd);
drivers/media/i2c/og01a1b.c
880
if (og01a1b->avdd) {
drivers/media/i2c/og01a1b.c
881
ret = regulator_enable(og01a1b->avdd);
drivers/media/i2c/og01a1b.c
886
if (og01a1b->dovdd) {
drivers/media/i2c/og01a1b.c
887
ret = regulator_enable(og01a1b->dovdd);
drivers/media/i2c/og01a1b.c
892
if (og01a1b->dvdd) {
drivers/media/i2c/og01a1b.c
893
ret = regulator_enable(og01a1b->dvdd);
drivers/media/i2c/og01a1b.c
898
ret = clk_prepare_enable(og01a1b->xvclk);
drivers/media/i2c/og01a1b.c
902
gpiod_set_value_cansleep(og01a1b->reset_gpio, 0);
drivers/media/i2c/og01a1b.c
904
if (og01a1b->reset_gpio)
drivers/media/i2c/og01a1b.c
906
else if (og01a1b->xvclk)
drivers/media/i2c/og01a1b.c
912
if (og01a1b->dvdd)
drivers/media/i2c/og01a1b.c
913
regulator_disable(og01a1b->dvdd);
drivers/media/i2c/og01a1b.c
915
if (og01a1b->dovdd)
drivers/media/i2c/og01a1b.c
916
regulator_disable(og01a1b->dovdd);
drivers/media/i2c/og01a1b.c
918
if (og01a1b->avdd)
drivers/media/i2c/og01a1b.c
919
regulator_disable(og01a1b->avdd);
drivers/media/i2c/og01a1b.c
928
struct og01a1b *og01a1b = to_og01a1b(sd);
drivers/media/i2c/og01a1b.c
930
if (og01a1b->xvclk)
drivers/media/i2c/og01a1b.c
933
clk_disable_unprepare(og01a1b->xvclk);
drivers/media/i2c/og01a1b.c
935
gpiod_set_value_cansleep(og01a1b->reset_gpio, 1);
drivers/media/i2c/og01a1b.c
937
if (og01a1b->dvdd)
drivers/media/i2c/og01a1b.c
938
regulator_disable(og01a1b->dvdd);
drivers/media/i2c/og01a1b.c
940
if (og01a1b->dovdd)
drivers/media/i2c/og01a1b.c
941
regulator_disable(og01a1b->dovdd);
drivers/media/i2c/og01a1b.c
943
if (og01a1b->avdd)
drivers/media/i2c/og01a1b.c
944
regulator_disable(og01a1b->avdd);
drivers/media/i2c/og01a1b.c
952
struct og01a1b *og01a1b = to_og01a1b(sd);
drivers/media/i2c/og01a1b.c
955
v4l2_subdev_cleanup(&og01a1b->sd);
drivers/media/i2c/og01a1b.c
958
pm_runtime_disable(og01a1b->dev);
drivers/media/i2c/og01a1b.c
963
struct og01a1b *og01a1b;
drivers/media/i2c/og01a1b.c
967
og01a1b = devm_kzalloc(&client->dev, sizeof(*og01a1b), GFP_KERNEL);
drivers/media/i2c/og01a1b.c
968
if (!og01a1b)
drivers/media/i2c/og01a1b.c
971
og01a1b->dev = &client->dev;
drivers/media/i2c/og01a1b.c
973
v4l2_i2c_subdev_init(&og01a1b->sd, client, &og01a1b_subdev_ops);
drivers/media/i2c/og01a1b.c
975
og01a1b->regmap = devm_cci_regmap_init_i2c(client, 16);
drivers/media/i2c/og01a1b.c
976
if (IS_ERR(og01a1b->regmap))
drivers/media/i2c/og01a1b.c
977
return dev_err_probe(og01a1b->dev, PTR_ERR(og01a1b->regmap),
drivers/media/i2c/og01a1b.c
980
og01a1b->xvclk = devm_v4l2_sensor_clk_get(og01a1b->dev, NULL);
drivers/media/i2c/og01a1b.c
981
if (IS_ERR(og01a1b->xvclk))
drivers/media/i2c/og01a1b.c
982
return dev_err_probe(og01a1b->dev, PTR_ERR(og01a1b->xvclk),
drivers/media/i2c/og01a1b.c
985
freq = clk_get_rate(og01a1b->xvclk);
drivers/media/i2c/og01a1b.c
987
return dev_err_probe(og01a1b->dev, -EINVAL,
drivers/media/i2c/og01a1b.c
991
ret = og01a1b_check_hwcfg(og01a1b);
drivers/media/i2c/og01a1b.c
993
dev_err(og01a1b->dev, "failed to check HW configuration: %d",
drivers/media/i2c/og01a1b.c
998
og01a1b->reset_gpio = devm_gpiod_get_optional(og01a1b->dev, "reset",