Symbol: gc05a2
drivers/media/i2c/gc05a2.c
1000
ret = __v4l2_ctrl_handler_setup(&gc05a2->ctrls);
drivers/media/i2c/gc05a2.c
1002
dev_err(gc05a2->dev, "could not sync v4l2 controls\n");
drivers/media/i2c/gc05a2.c
1006
ret = cci_write(gc05a2->regmap, GC05A2_STREAMING_REG, 1, NULL);
drivers/media/i2c/gc05a2.c
1008
dev_err(gc05a2->dev, "write STREAMING_REG failed: %d\n", ret);
drivers/media/i2c/gc05a2.c
1015
pm_runtime_put(gc05a2->dev);
drivers/media/i2c/gc05a2.c
1019
static int gc05a2_stop_streaming(struct gc05a2 *gc05a2)
drivers/media/i2c/gc05a2.c
1023
ret = cci_write(gc05a2->regmap, GC05A2_STREAMING_REG, 0, NULL);
drivers/media/i2c/gc05a2.c
1025
dev_err(gc05a2->dev, "could not sent stop streaming %d\n", ret);
drivers/media/i2c/gc05a2.c
1027
pm_runtime_put(gc05a2->dev);
drivers/media/i2c/gc05a2.c
1033
struct gc05a2 *gc05a2 = to_gc05a2(subdev);
drivers/media/i2c/gc05a2.c
1040
ret = gc05a2_start_streaming(gc05a2);
drivers/media/i2c/gc05a2.c
1042
ret = gc05a2_stop_streaming(gc05a2);
drivers/media/i2c/gc05a2.c
1070
static int gc05a2_get_regulators(struct device *dev, struct gc05a2 *gc05a2)
drivers/media/i2c/gc05a2.c
1075
gc05a2->supplies[i].supply = gc05a2_supply_name[i];
drivers/media/i2c/gc05a2.c
1078
gc05a2->supplies);
drivers/media/i2c/gc05a2.c
1081
static int gc05a2_parse_fwnode(struct gc05a2 *gc05a2)
drivers/media/i2c/gc05a2.c
1088
struct device *dev = gc05a2->dev;
drivers/media/i2c/gc05a2.c
1106
&gc05a2->link_freq_bitmap);
drivers/media/i2c/gc05a2.c
1124
static int gc05a2_init_controls(struct gc05a2 *gc05a2)
drivers/media/i2c/gc05a2.c
1126
struct i2c_client *client = v4l2_get_subdevdata(&gc05a2->sd);
drivers/media/i2c/gc05a2.c
1134
ctrl_hdlr = &gc05a2->ctrls;
drivers/media/i2c/gc05a2.c
1139
gc05a2->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &gc05a2_ctrl_ops,
drivers/media/i2c/gc05a2.c
1141
gc05a2->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &gc05a2_ctrl_ops,
drivers/media/i2c/gc05a2.c
1143
v4l2_ctrl_cluster(2, &gc05a2->hflip);
drivers/media/i2c/gc05a2.c
1145
gc05a2->link_freq =
drivers/media/i2c/gc05a2.c
1152
if (gc05a2->link_freq)
drivers/media/i2c/gc05a2.c
1153
gc05a2->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/gc05a2.c
1155
gc05a2->pixel_rate =
drivers/media/i2c/gc05a2.c
1163
gc05a2->vblank =
drivers/media/i2c/gc05a2.c
1171
gc05a2->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &gc05a2_ctrl_ops,
drivers/media/i2c/gc05a2.c
1174
if (gc05a2->hblank)
drivers/media/i2c/gc05a2.c
1175
gc05a2->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/gc05a2.c
1183
gc05a2->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &gc05a2_ctrl_ops,
drivers/media/i2c/gc05a2.c
1207
gc05a2->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/gc05a2.c
1220
struct gc05a2 *gc05a2;
drivers/media/i2c/gc05a2.c
1223
gc05a2 = devm_kzalloc(dev, sizeof(*gc05a2), GFP_KERNEL);
drivers/media/i2c/gc05a2.c
1224
if (!gc05a2)
drivers/media/i2c/gc05a2.c
1227
gc05a2->dev = dev;
drivers/media/i2c/gc05a2.c
1229
ret = gc05a2_parse_fwnode(gc05a2);
drivers/media/i2c/gc05a2.c
1233
gc05a2->regmap = devm_cci_regmap_init_i2c(client, 16);
drivers/media/i2c/gc05a2.c
1234
if (IS_ERR(gc05a2->regmap))
drivers/media/i2c/gc05a2.c
1235
return dev_err_probe(dev, PTR_ERR(gc05a2->regmap),
drivers/media/i2c/gc05a2.c
1238
gc05a2->xclk = devm_v4l2_sensor_clk_get_legacy(dev, NULL, true,
drivers/media/i2c/gc05a2.c
1240
if (IS_ERR(gc05a2->xclk))
drivers/media/i2c/gc05a2.c
1241
return dev_err_probe(dev, PTR_ERR(gc05a2->xclk),
drivers/media/i2c/gc05a2.c
1244
ret = gc05a2_get_regulators(dev, gc05a2);
drivers/media/i2c/gc05a2.c
1249
gc05a2->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
drivers/media/i2c/gc05a2.c
1250
if (IS_ERR(gc05a2->reset_gpio))
drivers/media/i2c/gc05a2.c
1251
return dev_err_probe(dev, PTR_ERR(gc05a2->reset_gpio),
drivers/media/i2c/gc05a2.c
1254
v4l2_i2c_subdev_init(&gc05a2->sd, client, &gc05a2_subdev_ops);
drivers/media/i2c/gc05a2.c
1255
gc05a2->sd.internal_ops = &gc05a2_internal_ops;
drivers/media/i2c/gc05a2.c
1256
gc05a2->cur_mode = &gc05a2_modes[0];
drivers/media/i2c/gc05a2.c
1258
ret = gc05a2_init_controls(gc05a2);
drivers/media/i2c/gc05a2.c
1263
gc05a2->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/gc05a2.c
1264
gc05a2->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/gc05a2.c
1265
gc05a2->sd.dev = &client->dev;
drivers/media/i2c/gc05a2.c
1266
gc05a2->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/gc05a2.c
1268
ret = media_entity_pads_init(&gc05a2->sd.entity, 1, &gc05a2->pad);
drivers/media/i2c/gc05a2.c
1274
gc05a2->sd.state_lock = gc05a2->ctrls.lock;
drivers/media/i2c/gc05a2.c
1275
ret = v4l2_subdev_init_finalize(&gc05a2->sd);
drivers/media/i2c/gc05a2.c
1281
pm_runtime_enable(gc05a2->dev);
drivers/media/i2c/gc05a2.c
1282
pm_runtime_set_autosuspend_delay(gc05a2->dev, 1000);
drivers/media/i2c/gc05a2.c
1283
pm_runtime_use_autosuspend(gc05a2->dev);
drivers/media/i2c/gc05a2.c
1284
pm_runtime_idle(gc05a2->dev);
drivers/media/i2c/gc05a2.c
1286
ret = v4l2_async_register_subdev_sensor(&gc05a2->sd);
drivers/media/i2c/gc05a2.c
1295
pm_runtime_disable(gc05a2->dev);
drivers/media/i2c/gc05a2.c
1296
v4l2_subdev_cleanup(&gc05a2->sd);
drivers/media/i2c/gc05a2.c
1299
media_entity_cleanup(&gc05a2->sd.entity);
drivers/media/i2c/gc05a2.c
1302
v4l2_ctrl_handler_free(&gc05a2->ctrls);
drivers/media/i2c/gc05a2.c
1310
struct gc05a2 *gc05a2 = to_gc05a2(sd);
drivers/media/i2c/gc05a2.c
1312
v4l2_async_unregister_subdev(&gc05a2->sd);
drivers/media/i2c/gc05a2.c
1314
media_entity_cleanup(&gc05a2->sd.entity);
drivers/media/i2c/gc05a2.c
1315
v4l2_ctrl_handler_free(&gc05a2->ctrls);
drivers/media/i2c/gc05a2.c
1319
gc05a2_power_off(gc05a2->dev);
drivers/media/i2c/gc05a2.c
607
static inline struct gc05a2 *to_gc05a2(struct v4l2_subdev *sd)
drivers/media/i2c/gc05a2.c
609
return container_of(sd, struct gc05a2, sd);
drivers/media/i2c/gc05a2.c
615
struct gc05a2 *gc05a2 = to_gc05a2(sd);
drivers/media/i2c/gc05a2.c
619
gc05a2->supplies);
drivers/media/i2c/gc05a2.c
621
dev_err(gc05a2->dev, "failed to enable regulators: %d\n", ret);
drivers/media/i2c/gc05a2.c
625
ret = clk_prepare_enable(gc05a2->xclk);
drivers/media/i2c/gc05a2.c
628
gc05a2->supplies);
drivers/media/i2c/gc05a2.c
629
dev_err(gc05a2->dev, "clk prepare enable failed\n");
drivers/media/i2c/gc05a2.c
635
gpiod_set_value_cansleep(gc05a2->reset_gpio, 0);
drivers/media/i2c/gc05a2.c
644
struct gc05a2 *gc05a2 = to_gc05a2(sd);
drivers/media/i2c/gc05a2.c
646
clk_disable_unprepare(gc05a2->xclk);
drivers/media/i2c/gc05a2.c
647
gpiod_set_value_cansleep(gc05a2->reset_gpio, 1);
drivers/media/i2c/gc05a2.c
649
gc05a2->supplies);
drivers/media/i2c/gc05a2.c
684
static int gc05a2_update_cur_mode_controls(struct gc05a2 *gc05a2,
drivers/media/i2c/gc05a2.c
690
ret = __v4l2_ctrl_modify_range(gc05a2->vblank,
drivers/media/i2c/gc05a2.c
695
dev_err(gc05a2->dev, "VB ctrl range update failed\n");
drivers/media/i2c/gc05a2.c
700
ret = __v4l2_ctrl_modify_range(gc05a2->hblank, h_blank, h_blank, 1,
drivers/media/i2c/gc05a2.c
703
dev_err(gc05a2->dev, "HB ctrl range update failed\n");
drivers/media/i2c/gc05a2.c
708
ret = __v4l2_ctrl_modify_range(gc05a2->exposure, GC05A2_EXP_MIN,
drivers/media/i2c/gc05a2.c
712
dev_err(gc05a2->dev, "exposure ctrl range update failed\n");
drivers/media/i2c/gc05a2.c
719
static void gc05a2_update_pad_format(struct gc05a2 *gc08a3,
drivers/media/i2c/gc05a2.c
737
struct gc05a2 *gc05a2 = to_gc05a2(sd);
drivers/media/i2c/gc05a2.c
752
gc05a2_update_pad_format(gc05a2, mode, &fmt->format);
drivers/media/i2c/gc05a2.c
758
gc05a2->cur_mode = mode;
drivers/media/i2c/gc05a2.c
759
gc05a2_update_cur_mode_controls(gc05a2, mode);
drivers/media/i2c/gc05a2.c
804
static int gc05a2_set_ctrl_hflip(struct gc05a2 *gc05a2, u32 ctrl_val)
drivers/media/i2c/gc05a2.c
809
ret = cci_read(gc05a2->regmap, GC05A2_FLIP_REG, &val, NULL);
drivers/media/i2c/gc05a2.c
811
dev_err(gc05a2->dev, "read hflip register failed: %d\n", ret);
drivers/media/i2c/gc05a2.c
815
return cci_update_bits(gc05a2->regmap, GC05A2_FLIP_REG,
drivers/media/i2c/gc05a2.c
820
static int gc05a2_set_ctrl_vflip(struct gc05a2 *gc05a2, u32 ctrl_val)
drivers/media/i2c/gc05a2.c
825
ret = cci_read(gc05a2->regmap, GC05A2_FLIP_REG, &val, NULL);
drivers/media/i2c/gc05a2.c
827
dev_err(gc05a2->dev, "read vflip register failed: %d\n", ret);
drivers/media/i2c/gc05a2.c
831
return cci_update_bits(gc05a2->regmap, GC05A2_FLIP_REG,
drivers/media/i2c/gc05a2.c
836
static int gc05a2_test_pattern(struct gc05a2 *gc05a2, u32 pattern_menu)
drivers/media/i2c/gc05a2.c
867
ret = cci_write(gc05a2->regmap, GC05A2_REG_TEST_PATTERN_IDX,
drivers/media/i2c/gc05a2.c
872
return cci_write(gc05a2->regmap, GC05A2_REG_TEST_PATTERN_EN,
drivers/media/i2c/gc05a2.c
875
return cci_write(gc05a2->regmap, GC05A2_REG_TEST_PATTERN_EN,
drivers/media/i2c/gc05a2.c
882
struct gc05a2 *gc05a2 =
drivers/media/i2c/gc05a2.c
883
container_of(ctrl->handler, struct gc05a2, ctrls);
drivers/media/i2c/gc05a2.c
889
state = v4l2_subdev_get_locked_active_state(&gc05a2->sd);
drivers/media/i2c/gc05a2.c
895
__v4l2_ctrl_modify_range(gc05a2->exposure,
drivers/media/i2c/gc05a2.c
896
gc05a2->exposure->minimum,
drivers/media/i2c/gc05a2.c
897
exposure_max, gc05a2->exposure->step,
drivers/media/i2c/gc05a2.c
905
if (!pm_runtime_get_if_active(gc05a2->dev))
drivers/media/i2c/gc05a2.c
910
ret = cci_write(gc05a2->regmap, GC05A2_EXP_REG,
drivers/media/i2c/gc05a2.c
915
ret = cci_write(gc05a2->regmap, GC05A2_AGAIN_REG,
drivers/media/i2c/gc05a2.c
920
ret = cci_write(gc05a2->regmap, GC05A2_FRAME_LENGTH_REG,
drivers/media/i2c/gc05a2.c
921
gc05a2->cur_mode->height + ctrl->val, NULL);
drivers/media/i2c/gc05a2.c
925
ret = gc05a2_set_ctrl_hflip(gc05a2, ctrl->val);
drivers/media/i2c/gc05a2.c
929
ret = gc05a2_set_ctrl_vflip(gc05a2, ctrl->val);
drivers/media/i2c/gc05a2.c
933
ret = gc05a2_test_pattern(gc05a2, ctrl->val);
drivers/media/i2c/gc05a2.c
940
pm_runtime_put(gc05a2->dev);
drivers/media/i2c/gc05a2.c
949
static int gc05a2_identify_module(struct gc05a2 *gc05a2)
drivers/media/i2c/gc05a2.c
954
if (gc05a2->identified)
drivers/media/i2c/gc05a2.c
957
ret = cci_read(gc05a2->regmap, GC05A2_REG_CHIP_ID, &val, NULL);
drivers/media/i2c/gc05a2.c
962
dev_err(gc05a2->dev, "chip id mismatch: 0x%x!=0x%llx",
drivers/media/i2c/gc05a2.c
967
gc05a2->identified = true;
drivers/media/i2c/gc05a2.c
972
static int gc05a2_start_streaming(struct gc05a2 *gc05a2)
drivers/media/i2c/gc05a2.c
978
ret = pm_runtime_resume_and_get(gc05a2->dev);
drivers/media/i2c/gc05a2.c
982
ret = gc05a2_identify_module(gc05a2);
drivers/media/i2c/gc05a2.c
986
ret = cci_multi_reg_write(gc05a2->regmap,
drivers/media/i2c/gc05a2.c
992
mode = gc05a2->cur_mode;
drivers/media/i2c/gc05a2.c
995
ret = cci_multi_reg_write(gc05a2->regmap,