Symbol: gc05a2
drivers/media/i2c/gc05a2.c
1001
dev_err(gc05a2->dev, "could not sync v4l2 controls\n");
drivers/media/i2c/gc05a2.c
1005
ret = cci_write(gc05a2->regmap, GC05A2_STREAMING_REG, 1, NULL);
drivers/media/i2c/gc05a2.c
1007
dev_err(gc05a2->dev, "write STREAMING_REG failed: %d\n", ret);
drivers/media/i2c/gc05a2.c
1014
pm_runtime_put(gc05a2->dev);
drivers/media/i2c/gc05a2.c
1018
static int gc05a2_stop_streaming(struct gc05a2 *gc05a2)
drivers/media/i2c/gc05a2.c
1022
ret = cci_write(gc05a2->regmap, GC05A2_STREAMING_REG, 0, NULL);
drivers/media/i2c/gc05a2.c
1024
dev_err(gc05a2->dev, "could not sent stop streaming %d\n", ret);
drivers/media/i2c/gc05a2.c
1026
pm_runtime_put(gc05a2->dev);
drivers/media/i2c/gc05a2.c
1032
struct gc05a2 *gc05a2 = to_gc05a2(subdev);
drivers/media/i2c/gc05a2.c
1039
ret = gc05a2_start_streaming(gc05a2);
drivers/media/i2c/gc05a2.c
1041
ret = gc05a2_stop_streaming(gc05a2);
drivers/media/i2c/gc05a2.c
1069
static int gc05a2_get_regulators(struct device *dev, struct gc05a2 *gc05a2)
drivers/media/i2c/gc05a2.c
1074
gc05a2->supplies[i].supply = gc05a2_supply_name[i];
drivers/media/i2c/gc05a2.c
1077
gc05a2->supplies);
drivers/media/i2c/gc05a2.c
1080
static int gc05a2_parse_fwnode(struct gc05a2 *gc05a2)
drivers/media/i2c/gc05a2.c
1087
struct device *dev = gc05a2->dev;
drivers/media/i2c/gc05a2.c
1105
&gc05a2->link_freq_bitmap);
drivers/media/i2c/gc05a2.c
1123
static int gc05a2_init_controls(struct gc05a2 *gc05a2)
drivers/media/i2c/gc05a2.c
1125
struct i2c_client *client = v4l2_get_subdevdata(&gc05a2->sd);
drivers/media/i2c/gc05a2.c
1133
ctrl_hdlr = &gc05a2->ctrls;
drivers/media/i2c/gc05a2.c
1138
gc05a2->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &gc05a2_ctrl_ops,
drivers/media/i2c/gc05a2.c
1140
gc05a2->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &gc05a2_ctrl_ops,
drivers/media/i2c/gc05a2.c
1142
v4l2_ctrl_cluster(2, &gc05a2->hflip);
drivers/media/i2c/gc05a2.c
1144
gc05a2->link_freq =
drivers/media/i2c/gc05a2.c
1151
if (gc05a2->link_freq)
drivers/media/i2c/gc05a2.c
1152
gc05a2->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/gc05a2.c
1154
gc05a2->pixel_rate =
drivers/media/i2c/gc05a2.c
1162
gc05a2->vblank =
drivers/media/i2c/gc05a2.c
1170
gc05a2->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &gc05a2_ctrl_ops,
drivers/media/i2c/gc05a2.c
1173
if (gc05a2->hblank)
drivers/media/i2c/gc05a2.c
1174
gc05a2->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/gc05a2.c
1182
gc05a2->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &gc05a2_ctrl_ops,
drivers/media/i2c/gc05a2.c
1206
gc05a2->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/gc05a2.c
1219
struct gc05a2 *gc05a2;
drivers/media/i2c/gc05a2.c
1222
gc05a2 = devm_kzalloc(dev, sizeof(*gc05a2), GFP_KERNEL);
drivers/media/i2c/gc05a2.c
1223
if (!gc05a2)
drivers/media/i2c/gc05a2.c
1226
gc05a2->dev = dev;
drivers/media/i2c/gc05a2.c
1228
ret = gc05a2_parse_fwnode(gc05a2);
drivers/media/i2c/gc05a2.c
1232
gc05a2->regmap = devm_cci_regmap_init_i2c(client, 16);
drivers/media/i2c/gc05a2.c
1233
if (IS_ERR(gc05a2->regmap))
drivers/media/i2c/gc05a2.c
1234
return dev_err_probe(dev, PTR_ERR(gc05a2->regmap),
drivers/media/i2c/gc05a2.c
1237
gc05a2->xclk = devm_v4l2_sensor_clk_get_legacy(dev, NULL, true,
drivers/media/i2c/gc05a2.c
1239
if (IS_ERR(gc05a2->xclk))
drivers/media/i2c/gc05a2.c
1240
return dev_err_probe(dev, PTR_ERR(gc05a2->xclk),
drivers/media/i2c/gc05a2.c
1243
ret = gc05a2_get_regulators(dev, gc05a2);
drivers/media/i2c/gc05a2.c
1248
gc05a2->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
drivers/media/i2c/gc05a2.c
1249
if (IS_ERR(gc05a2->reset_gpio))
drivers/media/i2c/gc05a2.c
1250
return dev_err_probe(dev, PTR_ERR(gc05a2->reset_gpio),
drivers/media/i2c/gc05a2.c
1253
v4l2_i2c_subdev_init(&gc05a2->sd, client, &gc05a2_subdev_ops);
drivers/media/i2c/gc05a2.c
1254
gc05a2->sd.internal_ops = &gc05a2_internal_ops;
drivers/media/i2c/gc05a2.c
1255
gc05a2->cur_mode = &gc05a2_modes[0];
drivers/media/i2c/gc05a2.c
1257
ret = gc05a2_init_controls(gc05a2);
drivers/media/i2c/gc05a2.c
1262
gc05a2->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/gc05a2.c
1263
gc05a2->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/gc05a2.c
1264
gc05a2->sd.dev = &client->dev;
drivers/media/i2c/gc05a2.c
1265
gc05a2->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/gc05a2.c
1267
ret = media_entity_pads_init(&gc05a2->sd.entity, 1, &gc05a2->pad);
drivers/media/i2c/gc05a2.c
1273
gc05a2->sd.state_lock = gc05a2->ctrls.lock;
drivers/media/i2c/gc05a2.c
1274
ret = v4l2_subdev_init_finalize(&gc05a2->sd);
drivers/media/i2c/gc05a2.c
1280
pm_runtime_enable(gc05a2->dev);
drivers/media/i2c/gc05a2.c
1281
pm_runtime_set_autosuspend_delay(gc05a2->dev, 1000);
drivers/media/i2c/gc05a2.c
1282
pm_runtime_use_autosuspend(gc05a2->dev);
drivers/media/i2c/gc05a2.c
1283
pm_runtime_idle(gc05a2->dev);
drivers/media/i2c/gc05a2.c
1285
ret = v4l2_async_register_subdev_sensor(&gc05a2->sd);
drivers/media/i2c/gc05a2.c
1294
pm_runtime_disable(gc05a2->dev);
drivers/media/i2c/gc05a2.c
1295
v4l2_subdev_cleanup(&gc05a2->sd);
drivers/media/i2c/gc05a2.c
1298
media_entity_cleanup(&gc05a2->sd.entity);
drivers/media/i2c/gc05a2.c
1301
v4l2_ctrl_handler_free(&gc05a2->ctrls);
drivers/media/i2c/gc05a2.c
1309
struct gc05a2 *gc05a2 = to_gc05a2(sd);
drivers/media/i2c/gc05a2.c
1311
v4l2_async_unregister_subdev(&gc05a2->sd);
drivers/media/i2c/gc05a2.c
1313
media_entity_cleanup(&gc05a2->sd.entity);
drivers/media/i2c/gc05a2.c
1314
v4l2_ctrl_handler_free(&gc05a2->ctrls);
drivers/media/i2c/gc05a2.c
1318
gc05a2_power_off(gc05a2->dev);
drivers/media/i2c/gc05a2.c
606
static inline struct gc05a2 *to_gc05a2(struct v4l2_subdev *sd)
drivers/media/i2c/gc05a2.c
608
return container_of(sd, struct gc05a2, sd);
drivers/media/i2c/gc05a2.c
614
struct gc05a2 *gc05a2 = to_gc05a2(sd);
drivers/media/i2c/gc05a2.c
618
gc05a2->supplies);
drivers/media/i2c/gc05a2.c
620
dev_err(gc05a2->dev, "failed to enable regulators: %d\n", ret);
drivers/media/i2c/gc05a2.c
624
ret = clk_prepare_enable(gc05a2->xclk);
drivers/media/i2c/gc05a2.c
627
gc05a2->supplies);
drivers/media/i2c/gc05a2.c
628
dev_err(gc05a2->dev, "clk prepare enable failed\n");
drivers/media/i2c/gc05a2.c
634
gpiod_set_value_cansleep(gc05a2->reset_gpio, 0);
drivers/media/i2c/gc05a2.c
643
struct gc05a2 *gc05a2 = to_gc05a2(sd);
drivers/media/i2c/gc05a2.c
645
clk_disable_unprepare(gc05a2->xclk);
drivers/media/i2c/gc05a2.c
646
gpiod_set_value_cansleep(gc05a2->reset_gpio, 1);
drivers/media/i2c/gc05a2.c
648
gc05a2->supplies);
drivers/media/i2c/gc05a2.c
683
static int gc05a2_update_cur_mode_controls(struct gc05a2 *gc05a2,
drivers/media/i2c/gc05a2.c
689
ret = __v4l2_ctrl_modify_range(gc05a2->vblank,
drivers/media/i2c/gc05a2.c
694
dev_err(gc05a2->dev, "VB ctrl range update failed\n");
drivers/media/i2c/gc05a2.c
699
ret = __v4l2_ctrl_modify_range(gc05a2->hblank, h_blank, h_blank, 1,
drivers/media/i2c/gc05a2.c
702
dev_err(gc05a2->dev, "HB ctrl range update failed\n");
drivers/media/i2c/gc05a2.c
707
ret = __v4l2_ctrl_modify_range(gc05a2->exposure, GC05A2_EXP_MIN,
drivers/media/i2c/gc05a2.c
711
dev_err(gc05a2->dev, "exposure ctrl range update failed\n");
drivers/media/i2c/gc05a2.c
718
static void gc05a2_update_pad_format(struct gc05a2 *gc08a3,
drivers/media/i2c/gc05a2.c
736
struct gc05a2 *gc05a2 = to_gc05a2(sd);
drivers/media/i2c/gc05a2.c
751
gc05a2_update_pad_format(gc05a2, mode, &fmt->format);
drivers/media/i2c/gc05a2.c
757
gc05a2->cur_mode = mode;
drivers/media/i2c/gc05a2.c
758
gc05a2_update_cur_mode_controls(gc05a2, mode);
drivers/media/i2c/gc05a2.c
803
static int gc05a2_set_ctrl_hflip(struct gc05a2 *gc05a2, u32 ctrl_val)
drivers/media/i2c/gc05a2.c
808
ret = cci_read(gc05a2->regmap, GC05A2_FLIP_REG, &val, NULL);
drivers/media/i2c/gc05a2.c
810
dev_err(gc05a2->dev, "read hflip register failed: %d\n", ret);
drivers/media/i2c/gc05a2.c
814
return cci_update_bits(gc05a2->regmap, GC05A2_FLIP_REG,
drivers/media/i2c/gc05a2.c
819
static int gc05a2_set_ctrl_vflip(struct gc05a2 *gc05a2, u32 ctrl_val)
drivers/media/i2c/gc05a2.c
824
ret = cci_read(gc05a2->regmap, GC05A2_FLIP_REG, &val, NULL);
drivers/media/i2c/gc05a2.c
826
dev_err(gc05a2->dev, "read vflip register failed: %d\n", ret);
drivers/media/i2c/gc05a2.c
830
return cci_update_bits(gc05a2->regmap, GC05A2_FLIP_REG,
drivers/media/i2c/gc05a2.c
835
static int gc05a2_test_pattern(struct gc05a2 *gc05a2, u32 pattern_menu)
drivers/media/i2c/gc05a2.c
866
ret = cci_write(gc05a2->regmap, GC05A2_REG_TEST_PATTERN_IDX,
drivers/media/i2c/gc05a2.c
871
return cci_write(gc05a2->regmap, GC05A2_REG_TEST_PATTERN_EN,
drivers/media/i2c/gc05a2.c
874
return cci_write(gc05a2->regmap, GC05A2_REG_TEST_PATTERN_EN,
drivers/media/i2c/gc05a2.c
881
struct gc05a2 *gc05a2 =
drivers/media/i2c/gc05a2.c
882
container_of(ctrl->handler, struct gc05a2, ctrls);
drivers/media/i2c/gc05a2.c
888
state = v4l2_subdev_get_locked_active_state(&gc05a2->sd);
drivers/media/i2c/gc05a2.c
894
__v4l2_ctrl_modify_range(gc05a2->exposure,
drivers/media/i2c/gc05a2.c
895
gc05a2->exposure->minimum,
drivers/media/i2c/gc05a2.c
896
exposure_max, gc05a2->exposure->step,
drivers/media/i2c/gc05a2.c
904
if (!pm_runtime_get_if_active(gc05a2->dev))
drivers/media/i2c/gc05a2.c
909
ret = cci_write(gc05a2->regmap, GC05A2_EXP_REG,
drivers/media/i2c/gc05a2.c
914
ret = cci_write(gc05a2->regmap, GC05A2_AGAIN_REG,
drivers/media/i2c/gc05a2.c
919
ret = cci_write(gc05a2->regmap, GC05A2_FRAME_LENGTH_REG,
drivers/media/i2c/gc05a2.c
920
gc05a2->cur_mode->height + ctrl->val, NULL);
drivers/media/i2c/gc05a2.c
924
ret = gc05a2_set_ctrl_hflip(gc05a2, ctrl->val);
drivers/media/i2c/gc05a2.c
928
ret = gc05a2_set_ctrl_vflip(gc05a2, ctrl->val);
drivers/media/i2c/gc05a2.c
932
ret = gc05a2_test_pattern(gc05a2, ctrl->val);
drivers/media/i2c/gc05a2.c
939
pm_runtime_put(gc05a2->dev);
drivers/media/i2c/gc05a2.c
948
static int gc05a2_identify_module(struct gc05a2 *gc05a2)
drivers/media/i2c/gc05a2.c
953
if (gc05a2->identified)
drivers/media/i2c/gc05a2.c
956
ret = cci_read(gc05a2->regmap, GC05A2_REG_CHIP_ID, &val, NULL);
drivers/media/i2c/gc05a2.c
961
dev_err(gc05a2->dev, "chip id mismatch: 0x%x!=0x%llx",
drivers/media/i2c/gc05a2.c
966
gc05a2->identified = true;
drivers/media/i2c/gc05a2.c
971
static int gc05a2_start_streaming(struct gc05a2 *gc05a2)
drivers/media/i2c/gc05a2.c
977
ret = pm_runtime_resume_and_get(gc05a2->dev);
drivers/media/i2c/gc05a2.c
981
ret = gc05a2_identify_module(gc05a2);
drivers/media/i2c/gc05a2.c
985
ret = cci_multi_reg_write(gc05a2->regmap,
drivers/media/i2c/gc05a2.c
991
mode = gc05a2->cur_mode;
drivers/media/i2c/gc05a2.c
994
ret = cci_multi_reg_write(gc05a2->regmap,
drivers/media/i2c/gc05a2.c
999
ret = __v4l2_ctrl_handler_setup(&gc05a2->ctrls);