Symbol: gc08a3
drivers/media/i2c/gc05a2.c
718
static void gc05a2_update_pad_format(struct gc05a2 *gc08a3,
drivers/media/i2c/gc08a3.c
1011
static int gc08a3_get_regulators(struct device *dev, struct gc08a3 *gc08a3)
drivers/media/i2c/gc08a3.c
1016
gc08a3->supplies[i].supply = gc08a3_supply_name[i];
drivers/media/i2c/gc08a3.c
1019
gc08a3->supplies);
drivers/media/i2c/gc08a3.c
1022
static int gc08a3_parse_fwnode(struct gc08a3 *gc08a3)
drivers/media/i2c/gc08a3.c
1029
struct device *dev = gc08a3->dev;
drivers/media/i2c/gc08a3.c
1049
&gc08a3->link_freq_bitmap);
drivers/media/i2c/gc08a3.c
1067
static int gc08a3_init_controls(struct gc08a3 *gc08a3)
drivers/media/i2c/gc08a3.c
1069
struct i2c_client *client = v4l2_get_subdevdata(&gc08a3->sd);
drivers/media/i2c/gc08a3.c
1077
ctrl_hdlr = &gc08a3->ctrls;
drivers/media/i2c/gc08a3.c
1082
gc08a3->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &gc08a3_ctrl_ops,
drivers/media/i2c/gc08a3.c
1084
gc08a3->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &gc08a3_ctrl_ops,
drivers/media/i2c/gc08a3.c
1086
v4l2_ctrl_cluster(2, &gc08a3->hflip);
drivers/media/i2c/gc08a3.c
1088
gc08a3->link_freq =
drivers/media/i2c/gc08a3.c
1095
if (gc08a3->link_freq)
drivers/media/i2c/gc08a3.c
1096
gc08a3->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/gc08a3.c
1098
gc08a3->pixel_rate =
drivers/media/i2c/gc08a3.c
1106
gc08a3->vblank =
drivers/media/i2c/gc08a3.c
1114
gc08a3->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &gc08a3_ctrl_ops,
drivers/media/i2c/gc08a3.c
1117
if (gc08a3->hblank)
drivers/media/i2c/gc08a3.c
1118
gc08a3->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/gc08a3.c
1126
gc08a3->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &gc08a3_ctrl_ops,
drivers/media/i2c/gc08a3.c
1150
gc08a3->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/gc08a3.c
1160
static int gc08a3_identify_module(struct gc08a3 *gc08a3)
drivers/media/i2c/gc08a3.c
1165
ret = cci_read(gc08a3->regmap, GC08A3_REG_CHIP_ID, &val, NULL);
drivers/media/i2c/gc08a3.c
1167
dev_err(gc08a3->dev, "failed to read chip id");
drivers/media/i2c/gc08a3.c
1172
dev_err(gc08a3->dev, "chip id mismatch: 0x%x!=0x%llx",
drivers/media/i2c/gc08a3.c
1183
struct gc08a3 *gc08a3;
drivers/media/i2c/gc08a3.c
1186
gc08a3 = devm_kzalloc(dev, sizeof(*gc08a3), GFP_KERNEL);
drivers/media/i2c/gc08a3.c
1187
if (!gc08a3)
drivers/media/i2c/gc08a3.c
1190
gc08a3->dev = dev;
drivers/media/i2c/gc08a3.c
1192
ret = gc08a3_parse_fwnode(gc08a3);
drivers/media/i2c/gc08a3.c
1196
gc08a3->regmap = devm_cci_regmap_init_i2c(client, 16);
drivers/media/i2c/gc08a3.c
1197
if (IS_ERR(gc08a3->regmap))
drivers/media/i2c/gc08a3.c
1198
return dev_err_probe(dev, PTR_ERR(gc08a3->regmap),
drivers/media/i2c/gc08a3.c
1201
gc08a3->xclk = devm_v4l2_sensor_clk_get_legacy(dev, NULL, true,
drivers/media/i2c/gc08a3.c
1203
if (IS_ERR(gc08a3->xclk))
drivers/media/i2c/gc08a3.c
1204
return dev_err_probe(dev, PTR_ERR(gc08a3->xclk),
drivers/media/i2c/gc08a3.c
1207
ret = gc08a3_get_regulators(dev, gc08a3);
drivers/media/i2c/gc08a3.c
1212
gc08a3->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
drivers/media/i2c/gc08a3.c
1213
if (IS_ERR(gc08a3->reset_gpio))
drivers/media/i2c/gc08a3.c
1214
return dev_err_probe(dev, PTR_ERR(gc08a3->reset_gpio),
drivers/media/i2c/gc08a3.c
1217
v4l2_i2c_subdev_init(&gc08a3->sd, client, &gc08a3_subdev_ops);
drivers/media/i2c/gc08a3.c
1218
gc08a3->sd.internal_ops = &gc08a3_internal_ops;
drivers/media/i2c/gc08a3.c
1219
gc08a3->cur_mode = &gc08a3_modes[0];
drivers/media/i2c/gc08a3.c
1221
ret = gc08a3_power_on(gc08a3->dev);
drivers/media/i2c/gc08a3.c
1226
ret = gc08a3_identify_module(gc08a3);
drivers/media/i2c/gc08a3.c
1232
ret = gc08a3_init_controls(gc08a3);
drivers/media/i2c/gc08a3.c
1238
gc08a3->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/gc08a3.c
1239
gc08a3->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/gc08a3.c
1240
gc08a3->sd.dev = &client->dev;
drivers/media/i2c/gc08a3.c
1241
gc08a3->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/gc08a3.c
1243
ret = media_entity_pads_init(&gc08a3->sd.entity, 1, &gc08a3->pad);
drivers/media/i2c/gc08a3.c
1249
gc08a3->sd.state_lock = gc08a3->ctrls.lock;
drivers/media/i2c/gc08a3.c
1250
ret = v4l2_subdev_init_finalize(&gc08a3->sd);
drivers/media/i2c/gc08a3.c
1256
pm_runtime_set_active(gc08a3->dev);
drivers/media/i2c/gc08a3.c
1257
pm_runtime_enable(gc08a3->dev);
drivers/media/i2c/gc08a3.c
1258
pm_runtime_set_autosuspend_delay(gc08a3->dev, 1000);
drivers/media/i2c/gc08a3.c
1259
pm_runtime_use_autosuspend(gc08a3->dev);
drivers/media/i2c/gc08a3.c
1260
pm_runtime_idle(gc08a3->dev);
drivers/media/i2c/gc08a3.c
1262
ret = v4l2_async_register_subdev_sensor(&gc08a3->sd);
drivers/media/i2c/gc08a3.c
1271
pm_runtime_disable(gc08a3->dev);
drivers/media/i2c/gc08a3.c
1272
v4l2_subdev_cleanup(&gc08a3->sd);
drivers/media/i2c/gc08a3.c
1275
media_entity_cleanup(&gc08a3->sd.entity);
drivers/media/i2c/gc08a3.c
1278
v4l2_ctrl_handler_free(gc08a3->sd.ctrl_handler);
drivers/media/i2c/gc08a3.c
1281
gc08a3_power_off(gc08a3->dev);
drivers/media/i2c/gc08a3.c
1289
struct gc08a3 *gc08a3 = to_gc08a3(sd);
drivers/media/i2c/gc08a3.c
1291
v4l2_async_unregister_subdev(&gc08a3->sd);
drivers/media/i2c/gc08a3.c
1293
media_entity_cleanup(&gc08a3->sd.entity);
drivers/media/i2c/gc08a3.c
1294
v4l2_ctrl_handler_free(&gc08a3->ctrls);
drivers/media/i2c/gc08a3.c
1298
gc08a3_power_off(gc08a3->dev);
drivers/media/i2c/gc08a3.c
581
static inline struct gc08a3 *to_gc08a3(struct v4l2_subdev *sd)
drivers/media/i2c/gc08a3.c
583
return container_of(sd, struct gc08a3, sd);
drivers/media/i2c/gc08a3.c
589
struct gc08a3 *gc08a3 = to_gc08a3(sd);
drivers/media/i2c/gc08a3.c
593
gc08a3->supplies);
drivers/media/i2c/gc08a3.c
595
dev_err(gc08a3->dev, "failed to enable regulators: %d\n", ret);
drivers/media/i2c/gc08a3.c
599
ret = clk_prepare_enable(gc08a3->xclk);
drivers/media/i2c/gc08a3.c
602
gc08a3->supplies);
drivers/media/i2c/gc08a3.c
603
dev_err(gc08a3->dev, "clk prepare enable failed\n");
drivers/media/i2c/gc08a3.c
609
gpiod_set_value_cansleep(gc08a3->reset_gpio, 0);
drivers/media/i2c/gc08a3.c
618
struct gc08a3 *gc08a3 = to_gc08a3(sd);
drivers/media/i2c/gc08a3.c
620
clk_disable_unprepare(gc08a3->xclk);
drivers/media/i2c/gc08a3.c
621
gpiod_set_value_cansleep(gc08a3->reset_gpio, 1);
drivers/media/i2c/gc08a3.c
623
gc08a3->supplies);
drivers/media/i2c/gc08a3.c
658
static int gc08a3_update_cur_mode_controls(struct gc08a3 *gc08a3,
drivers/media/i2c/gc08a3.c
664
ret = __v4l2_ctrl_modify_range(gc08a3->vblank,
drivers/media/i2c/gc08a3.c
669
dev_err(gc08a3->dev, "VB ctrl range update failed\n");
drivers/media/i2c/gc08a3.c
674
ret = __v4l2_ctrl_modify_range(gc08a3->hblank, h_blank, h_blank, 1,
drivers/media/i2c/gc08a3.c
677
dev_err(gc08a3->dev, "HB ctrl range update failed\n");
drivers/media/i2c/gc08a3.c
682
ret = __v4l2_ctrl_modify_range(gc08a3->exposure, GC08A3_EXP_MIN,
drivers/media/i2c/gc08a3.c
686
dev_err(gc08a3->dev, "exposure ctrl range update failed\n");
drivers/media/i2c/gc08a3.c
693
static void gc08a3_update_pad_format(struct gc08a3 *gc08a3,
drivers/media/i2c/gc08a3.c
711
struct gc08a3 *gc08a3 = to_gc08a3(sd);
drivers/media/i2c/gc08a3.c
726
gc08a3_update_pad_format(gc08a3, mode, &fmt->format);
drivers/media/i2c/gc08a3.c
733
gc08a3->cur_mode = mode;
drivers/media/i2c/gc08a3.c
734
gc08a3_update_cur_mode_controls(gc08a3, mode);
drivers/media/i2c/gc08a3.c
779
static int gc08a3_set_ctrl_hflip(struct gc08a3 *gc08a3, u32 ctrl_val)
drivers/media/i2c/gc08a3.c
784
ret = cci_read(gc08a3->regmap, GC08A3_FLIP_REG, &val, NULL);
drivers/media/i2c/gc08a3.c
786
dev_err(gc08a3->dev, "read hflip register failed: %d\n", ret);
drivers/media/i2c/gc08a3.c
790
return cci_update_bits(gc08a3->regmap, GC08A3_FLIP_REG,
drivers/media/i2c/gc08a3.c
795
static int gc08a3_set_ctrl_vflip(struct gc08a3 *gc08a3, u32 ctrl_val)
drivers/media/i2c/gc08a3.c
800
ret = cci_read(gc08a3->regmap, GC08A3_FLIP_REG, &val, NULL);
drivers/media/i2c/gc08a3.c
802
dev_err(gc08a3->dev, "read vflip register failed: %d\n", ret);
drivers/media/i2c/gc08a3.c
806
return cci_update_bits(gc08a3->regmap, GC08A3_FLIP_REG,
drivers/media/i2c/gc08a3.c
811
static int gc08a3_test_pattern(struct gc08a3 *gc08a3, u32 pattern_menu)
drivers/media/i2c/gc08a3.c
836
ret = cci_write(gc08a3->regmap, GC08A3_REG_TEST_PATTERN_IDX,
drivers/media/i2c/gc08a3.c
841
return cci_write(gc08a3->regmap, GC08A3_REG_TEST_PATTERN_EN,
drivers/media/i2c/gc08a3.c
844
return cci_write(gc08a3->regmap, GC08A3_REG_TEST_PATTERN_EN,
drivers/media/i2c/gc08a3.c
851
struct gc08a3 *gc08a3 =
drivers/media/i2c/gc08a3.c
852
container_of(ctrl->handler, struct gc08a3, ctrls);
drivers/media/i2c/gc08a3.c
858
state = v4l2_subdev_get_locked_active_state(&gc08a3->sd);
drivers/media/i2c/gc08a3.c
864
__v4l2_ctrl_modify_range(gc08a3->exposure,
drivers/media/i2c/gc08a3.c
865
gc08a3->exposure->minimum,
drivers/media/i2c/gc08a3.c
866
exposure_max, gc08a3->exposure->step,
drivers/media/i2c/gc08a3.c
874
if (!pm_runtime_get_if_active(gc08a3->dev))
drivers/media/i2c/gc08a3.c
879
ret = cci_write(gc08a3->regmap, GC08A3_EXP_REG,
drivers/media/i2c/gc08a3.c
884
ret = cci_write(gc08a3->regmap, GC08A3_AGAIN_REG,
drivers/media/i2c/gc08a3.c
889
ret = cci_write(gc08a3->regmap, GC08A3_FRAME_LENGTH_REG,
drivers/media/i2c/gc08a3.c
890
gc08a3->cur_mode->height + ctrl->val, NULL);
drivers/media/i2c/gc08a3.c
894
ret = gc08a3_set_ctrl_hflip(gc08a3, ctrl->val);
drivers/media/i2c/gc08a3.c
898
ret = gc08a3_set_ctrl_vflip(gc08a3, ctrl->val);
drivers/media/i2c/gc08a3.c
902
ret = gc08a3_test_pattern(gc08a3, ctrl->val);
drivers/media/i2c/gc08a3.c
909
pm_runtime_put(gc08a3->dev);
drivers/media/i2c/gc08a3.c
918
static int gc08a3_start_streaming(struct gc08a3 *gc08a3)
drivers/media/i2c/gc08a3.c
924
ret = pm_runtime_resume_and_get(gc08a3->dev);
drivers/media/i2c/gc08a3.c
928
ret = cci_multi_reg_write(gc08a3->regmap,
drivers/media/i2c/gc08a3.c
934
mode = gc08a3->cur_mode;
drivers/media/i2c/gc08a3.c
936
ret = cci_multi_reg_write(gc08a3->regmap,
drivers/media/i2c/gc08a3.c
941
ret = __v4l2_ctrl_handler_setup(&gc08a3->ctrls);
drivers/media/i2c/gc08a3.c
943
dev_err(gc08a3->dev, "could not sync v4l2 controls\n");
drivers/media/i2c/gc08a3.c
947
ret = cci_write(gc08a3->regmap, GC08A3_STREAMING_REG, 1, NULL);
drivers/media/i2c/gc08a3.c
949
dev_err(gc08a3->dev, "write STREAMING_REG failed: %d\n", ret);
drivers/media/i2c/gc08a3.c
956
pm_runtime_put(gc08a3->dev);
drivers/media/i2c/gc08a3.c
960
static int gc08a3_stop_streaming(struct gc08a3 *gc08a3)
drivers/media/i2c/gc08a3.c
964
ret = cci_write(gc08a3->regmap, GC08A3_STREAMING_REG, 0, NULL);
drivers/media/i2c/gc08a3.c
966
dev_err(gc08a3->dev, "could not sent stop streaming %d\n", ret);
drivers/media/i2c/gc08a3.c
968
pm_runtime_put(gc08a3->dev);
drivers/media/i2c/gc08a3.c
974
struct gc08a3 *gc08a3 = to_gc08a3(subdev);
drivers/media/i2c/gc08a3.c
981
ret = gc08a3_start_streaming(gc08a3);
drivers/media/i2c/gc08a3.c
983
ret = gc08a3_stop_streaming(gc08a3);