Symbol: gc08a3
drivers/media/i2c/gc05a2.c
719
static void gc05a2_update_pad_format(struct gc05a2 *gc08a3,
drivers/media/i2c/gc08a3.c
1012
static int gc08a3_get_regulators(struct device *dev, struct gc08a3 *gc08a3)
drivers/media/i2c/gc08a3.c
1017
gc08a3->supplies[i].supply = gc08a3_supply_name[i];
drivers/media/i2c/gc08a3.c
1020
gc08a3->supplies);
drivers/media/i2c/gc08a3.c
1023
static int gc08a3_parse_fwnode(struct gc08a3 *gc08a3)
drivers/media/i2c/gc08a3.c
1030
struct device *dev = gc08a3->dev;
drivers/media/i2c/gc08a3.c
1050
&gc08a3->link_freq_bitmap);
drivers/media/i2c/gc08a3.c
1068
static int gc08a3_init_controls(struct gc08a3 *gc08a3)
drivers/media/i2c/gc08a3.c
1070
struct i2c_client *client = v4l2_get_subdevdata(&gc08a3->sd);
drivers/media/i2c/gc08a3.c
1078
ctrl_hdlr = &gc08a3->ctrls;
drivers/media/i2c/gc08a3.c
1083
gc08a3->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &gc08a3_ctrl_ops,
drivers/media/i2c/gc08a3.c
1085
gc08a3->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &gc08a3_ctrl_ops,
drivers/media/i2c/gc08a3.c
1087
v4l2_ctrl_cluster(2, &gc08a3->hflip);
drivers/media/i2c/gc08a3.c
1089
gc08a3->link_freq =
drivers/media/i2c/gc08a3.c
1096
if (gc08a3->link_freq)
drivers/media/i2c/gc08a3.c
1097
gc08a3->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/gc08a3.c
1099
gc08a3->pixel_rate =
drivers/media/i2c/gc08a3.c
1107
gc08a3->vblank =
drivers/media/i2c/gc08a3.c
1115
gc08a3->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &gc08a3_ctrl_ops,
drivers/media/i2c/gc08a3.c
1118
if (gc08a3->hblank)
drivers/media/i2c/gc08a3.c
1119
gc08a3->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/gc08a3.c
1127
gc08a3->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &gc08a3_ctrl_ops,
drivers/media/i2c/gc08a3.c
1151
gc08a3->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/gc08a3.c
1161
static int gc08a3_identify_module(struct gc08a3 *gc08a3)
drivers/media/i2c/gc08a3.c
1166
ret = cci_read(gc08a3->regmap, GC08A3_REG_CHIP_ID, &val, NULL);
drivers/media/i2c/gc08a3.c
1168
dev_err(gc08a3->dev, "failed to read chip id");
drivers/media/i2c/gc08a3.c
1173
dev_err(gc08a3->dev, "chip id mismatch: 0x%x!=0x%llx",
drivers/media/i2c/gc08a3.c
1184
struct gc08a3 *gc08a3;
drivers/media/i2c/gc08a3.c
1187
gc08a3 = devm_kzalloc(dev, sizeof(*gc08a3), GFP_KERNEL);
drivers/media/i2c/gc08a3.c
1188
if (!gc08a3)
drivers/media/i2c/gc08a3.c
1191
gc08a3->dev = dev;
drivers/media/i2c/gc08a3.c
1193
ret = gc08a3_parse_fwnode(gc08a3);
drivers/media/i2c/gc08a3.c
1197
gc08a3->regmap = devm_cci_regmap_init_i2c(client, 16);
drivers/media/i2c/gc08a3.c
1198
if (IS_ERR(gc08a3->regmap))
drivers/media/i2c/gc08a3.c
1199
return dev_err_probe(dev, PTR_ERR(gc08a3->regmap),
drivers/media/i2c/gc08a3.c
1202
gc08a3->xclk = devm_v4l2_sensor_clk_get_legacy(dev, NULL, true,
drivers/media/i2c/gc08a3.c
1204
if (IS_ERR(gc08a3->xclk))
drivers/media/i2c/gc08a3.c
1205
return dev_err_probe(dev, PTR_ERR(gc08a3->xclk),
drivers/media/i2c/gc08a3.c
1208
ret = gc08a3_get_regulators(dev, gc08a3);
drivers/media/i2c/gc08a3.c
1213
gc08a3->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
drivers/media/i2c/gc08a3.c
1214
if (IS_ERR(gc08a3->reset_gpio))
drivers/media/i2c/gc08a3.c
1215
return dev_err_probe(dev, PTR_ERR(gc08a3->reset_gpio),
drivers/media/i2c/gc08a3.c
1218
v4l2_i2c_subdev_init(&gc08a3->sd, client, &gc08a3_subdev_ops);
drivers/media/i2c/gc08a3.c
1219
gc08a3->sd.internal_ops = &gc08a3_internal_ops;
drivers/media/i2c/gc08a3.c
1220
gc08a3->cur_mode = &gc08a3_modes[0];
drivers/media/i2c/gc08a3.c
1222
ret = gc08a3_power_on(gc08a3->dev);
drivers/media/i2c/gc08a3.c
1227
ret = gc08a3_identify_module(gc08a3);
drivers/media/i2c/gc08a3.c
1233
ret = gc08a3_init_controls(gc08a3);
drivers/media/i2c/gc08a3.c
1239
gc08a3->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/gc08a3.c
1240
gc08a3->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/gc08a3.c
1241
gc08a3->sd.dev = &client->dev;
drivers/media/i2c/gc08a3.c
1242
gc08a3->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/gc08a3.c
1244
ret = media_entity_pads_init(&gc08a3->sd.entity, 1, &gc08a3->pad);
drivers/media/i2c/gc08a3.c
1250
gc08a3->sd.state_lock = gc08a3->ctrls.lock;
drivers/media/i2c/gc08a3.c
1251
ret = v4l2_subdev_init_finalize(&gc08a3->sd);
drivers/media/i2c/gc08a3.c
1257
pm_runtime_set_active(gc08a3->dev);
drivers/media/i2c/gc08a3.c
1258
pm_runtime_enable(gc08a3->dev);
drivers/media/i2c/gc08a3.c
1259
pm_runtime_set_autosuspend_delay(gc08a3->dev, 1000);
drivers/media/i2c/gc08a3.c
1260
pm_runtime_use_autosuspend(gc08a3->dev);
drivers/media/i2c/gc08a3.c
1261
pm_runtime_idle(gc08a3->dev);
drivers/media/i2c/gc08a3.c
1263
ret = v4l2_async_register_subdev_sensor(&gc08a3->sd);
drivers/media/i2c/gc08a3.c
1272
pm_runtime_disable(gc08a3->dev);
drivers/media/i2c/gc08a3.c
1273
v4l2_subdev_cleanup(&gc08a3->sd);
drivers/media/i2c/gc08a3.c
1276
media_entity_cleanup(&gc08a3->sd.entity);
drivers/media/i2c/gc08a3.c
1279
v4l2_ctrl_handler_free(gc08a3->sd.ctrl_handler);
drivers/media/i2c/gc08a3.c
1282
gc08a3_power_off(gc08a3->dev);
drivers/media/i2c/gc08a3.c
1290
struct gc08a3 *gc08a3 = to_gc08a3(sd);
drivers/media/i2c/gc08a3.c
1292
v4l2_async_unregister_subdev(&gc08a3->sd);
drivers/media/i2c/gc08a3.c
1294
media_entity_cleanup(&gc08a3->sd.entity);
drivers/media/i2c/gc08a3.c
1295
v4l2_ctrl_handler_free(&gc08a3->ctrls);
drivers/media/i2c/gc08a3.c
1299
gc08a3_power_off(gc08a3->dev);
drivers/media/i2c/gc08a3.c
582
static inline struct gc08a3 *to_gc08a3(struct v4l2_subdev *sd)
drivers/media/i2c/gc08a3.c
584
return container_of(sd, struct gc08a3, sd);
drivers/media/i2c/gc08a3.c
590
struct gc08a3 *gc08a3 = to_gc08a3(sd);
drivers/media/i2c/gc08a3.c
594
gc08a3->supplies);
drivers/media/i2c/gc08a3.c
596
dev_err(gc08a3->dev, "failed to enable regulators: %d\n", ret);
drivers/media/i2c/gc08a3.c
600
ret = clk_prepare_enable(gc08a3->xclk);
drivers/media/i2c/gc08a3.c
603
gc08a3->supplies);
drivers/media/i2c/gc08a3.c
604
dev_err(gc08a3->dev, "clk prepare enable failed\n");
drivers/media/i2c/gc08a3.c
610
gpiod_set_value_cansleep(gc08a3->reset_gpio, 0);
drivers/media/i2c/gc08a3.c
619
struct gc08a3 *gc08a3 = to_gc08a3(sd);
drivers/media/i2c/gc08a3.c
621
clk_disable_unprepare(gc08a3->xclk);
drivers/media/i2c/gc08a3.c
622
gpiod_set_value_cansleep(gc08a3->reset_gpio, 1);
drivers/media/i2c/gc08a3.c
624
gc08a3->supplies);
drivers/media/i2c/gc08a3.c
659
static int gc08a3_update_cur_mode_controls(struct gc08a3 *gc08a3,
drivers/media/i2c/gc08a3.c
665
ret = __v4l2_ctrl_modify_range(gc08a3->vblank,
drivers/media/i2c/gc08a3.c
670
dev_err(gc08a3->dev, "VB ctrl range update failed\n");
drivers/media/i2c/gc08a3.c
675
ret = __v4l2_ctrl_modify_range(gc08a3->hblank, h_blank, h_blank, 1,
drivers/media/i2c/gc08a3.c
678
dev_err(gc08a3->dev, "HB ctrl range update failed\n");
drivers/media/i2c/gc08a3.c
683
ret = __v4l2_ctrl_modify_range(gc08a3->exposure, GC08A3_EXP_MIN,
drivers/media/i2c/gc08a3.c
687
dev_err(gc08a3->dev, "exposure ctrl range update failed\n");
drivers/media/i2c/gc08a3.c
694
static void gc08a3_update_pad_format(struct gc08a3 *gc08a3,
drivers/media/i2c/gc08a3.c
712
struct gc08a3 *gc08a3 = to_gc08a3(sd);
drivers/media/i2c/gc08a3.c
727
gc08a3_update_pad_format(gc08a3, mode, &fmt->format);
drivers/media/i2c/gc08a3.c
734
gc08a3->cur_mode = mode;
drivers/media/i2c/gc08a3.c
735
gc08a3_update_cur_mode_controls(gc08a3, mode);
drivers/media/i2c/gc08a3.c
780
static int gc08a3_set_ctrl_hflip(struct gc08a3 *gc08a3, u32 ctrl_val)
drivers/media/i2c/gc08a3.c
785
ret = cci_read(gc08a3->regmap, GC08A3_FLIP_REG, &val, NULL);
drivers/media/i2c/gc08a3.c
787
dev_err(gc08a3->dev, "read hflip register failed: %d\n", ret);
drivers/media/i2c/gc08a3.c
791
return cci_update_bits(gc08a3->regmap, GC08A3_FLIP_REG,
drivers/media/i2c/gc08a3.c
796
static int gc08a3_set_ctrl_vflip(struct gc08a3 *gc08a3, u32 ctrl_val)
drivers/media/i2c/gc08a3.c
801
ret = cci_read(gc08a3->regmap, GC08A3_FLIP_REG, &val, NULL);
drivers/media/i2c/gc08a3.c
803
dev_err(gc08a3->dev, "read vflip register failed: %d\n", ret);
drivers/media/i2c/gc08a3.c
807
return cci_update_bits(gc08a3->regmap, GC08A3_FLIP_REG,
drivers/media/i2c/gc08a3.c
812
static int gc08a3_test_pattern(struct gc08a3 *gc08a3, u32 pattern_menu)
drivers/media/i2c/gc08a3.c
837
ret = cci_write(gc08a3->regmap, GC08A3_REG_TEST_PATTERN_IDX,
drivers/media/i2c/gc08a3.c
842
return cci_write(gc08a3->regmap, GC08A3_REG_TEST_PATTERN_EN,
drivers/media/i2c/gc08a3.c
845
return cci_write(gc08a3->regmap, GC08A3_REG_TEST_PATTERN_EN,
drivers/media/i2c/gc08a3.c
852
struct gc08a3 *gc08a3 =
drivers/media/i2c/gc08a3.c
853
container_of(ctrl->handler, struct gc08a3, ctrls);
drivers/media/i2c/gc08a3.c
859
state = v4l2_subdev_get_locked_active_state(&gc08a3->sd);
drivers/media/i2c/gc08a3.c
865
__v4l2_ctrl_modify_range(gc08a3->exposure,
drivers/media/i2c/gc08a3.c
866
gc08a3->exposure->minimum,
drivers/media/i2c/gc08a3.c
867
exposure_max, gc08a3->exposure->step,
drivers/media/i2c/gc08a3.c
875
if (!pm_runtime_get_if_active(gc08a3->dev))
drivers/media/i2c/gc08a3.c
880
ret = cci_write(gc08a3->regmap, GC08A3_EXP_REG,
drivers/media/i2c/gc08a3.c
885
ret = cci_write(gc08a3->regmap, GC08A3_AGAIN_REG,
drivers/media/i2c/gc08a3.c
890
ret = cci_write(gc08a3->regmap, GC08A3_FRAME_LENGTH_REG,
drivers/media/i2c/gc08a3.c
891
gc08a3->cur_mode->height + ctrl->val, NULL);
drivers/media/i2c/gc08a3.c
895
ret = gc08a3_set_ctrl_hflip(gc08a3, ctrl->val);
drivers/media/i2c/gc08a3.c
899
ret = gc08a3_set_ctrl_vflip(gc08a3, ctrl->val);
drivers/media/i2c/gc08a3.c
903
ret = gc08a3_test_pattern(gc08a3, ctrl->val);
drivers/media/i2c/gc08a3.c
910
pm_runtime_put(gc08a3->dev);
drivers/media/i2c/gc08a3.c
919
static int gc08a3_start_streaming(struct gc08a3 *gc08a3)
drivers/media/i2c/gc08a3.c
925
ret = pm_runtime_resume_and_get(gc08a3->dev);
drivers/media/i2c/gc08a3.c
929
ret = cci_multi_reg_write(gc08a3->regmap,
drivers/media/i2c/gc08a3.c
935
mode = gc08a3->cur_mode;
drivers/media/i2c/gc08a3.c
937
ret = cci_multi_reg_write(gc08a3->regmap,
drivers/media/i2c/gc08a3.c
942
ret = __v4l2_ctrl_handler_setup(&gc08a3->ctrls);
drivers/media/i2c/gc08a3.c
944
dev_err(gc08a3->dev, "could not sync v4l2 controls\n");
drivers/media/i2c/gc08a3.c
948
ret = cci_write(gc08a3->regmap, GC08A3_STREAMING_REG, 1, NULL);
drivers/media/i2c/gc08a3.c
950
dev_err(gc08a3->dev, "write STREAMING_REG failed: %d\n", ret);
drivers/media/i2c/gc08a3.c
957
pm_runtime_put(gc08a3->dev);
drivers/media/i2c/gc08a3.c
961
static int gc08a3_stop_streaming(struct gc08a3 *gc08a3)
drivers/media/i2c/gc08a3.c
965
ret = cci_write(gc08a3->regmap, GC08A3_STREAMING_REG, 0, NULL);
drivers/media/i2c/gc08a3.c
967
dev_err(gc08a3->dev, "could not sent stop streaming %d\n", ret);
drivers/media/i2c/gc08a3.c
969
pm_runtime_put(gc08a3->dev);
drivers/media/i2c/gc08a3.c
975
struct gc08a3 *gc08a3 = to_gc08a3(subdev);
drivers/media/i2c/gc08a3.c
982
ret = gc08a3_start_streaming(gc08a3);
drivers/media/i2c/gc08a3.c
984
ret = gc08a3_stop_streaming(gc08a3);