Symbol: gc0308
drivers/media/i2c/gc0308.c
1050
struct gc0308 *gc0308 = to_gc0308(sd);
drivers/media/i2c/gc0308.c
1068
gc0308->mode.out_format = gc0308_formats[i].regval;
drivers/media/i2c/gc0308.c
1069
gc0308->mode.subsample = mode->subsample;
drivers/media/i2c/gc0308.c
1070
gc0308->mode.width = mode->width;
drivers/media/i2c/gc0308.c
1071
gc0308->mode.height = mode->height;
drivers/media/i2c/gc0308.c
1101
static int gc0308_set_resolution(struct gc0308 *gc0308, int *ret)
drivers/media/i2c/gc0308.c
1104
{GC0308_SUBSAMPLE, gc0308->mode.subsample},
drivers/media/i2c/gc0308.c
1113
{GC0308_CROP_WIN_HEIGHT, gc0308->mode.height},
drivers/media/i2c/gc0308.c
1114
{GC0308_CROP_WIN_WIDTH, gc0308->mode.width},
drivers/media/i2c/gc0308.c
1117
return cci_multi_reg_write(gc0308->regmap, resolution_regs,
drivers/media/i2c/gc0308.c
1121
static int gc0308_start_stream(struct gc0308 *gc0308)
drivers/media/i2c/gc0308.c
1125
ret = pm_runtime_resume_and_get(gc0308->dev);
drivers/media/i2c/gc0308.c
1129
cci_multi_reg_write(gc0308->regmap, sensor_default_regs,
drivers/media/i2c/gc0308.c
1131
cci_update_bits(gc0308->regmap, GC0308_OUT_FORMAT,
drivers/media/i2c/gc0308.c
1132
GENMASK(4, 0), gc0308->mode.out_format, &ret);
drivers/media/i2c/gc0308.c
1133
gc0308_set_resolution(gc0308, &ret);
drivers/media/i2c/gc0308.c
1136
dev_err(gc0308->dev, "failed to update registers: %d\n", ret);
drivers/media/i2c/gc0308.c
1140
ret = __v4l2_ctrl_handler_setup(&gc0308->hdl);
drivers/media/i2c/gc0308.c
1142
dev_err(gc0308->dev, "failed to setup controls\n");
drivers/media/i2c/gc0308.c
1148
if (gc0308->mbus_config & V4L2_MBUS_VSYNC_ACTIVE_LOW)
drivers/media/i2c/gc0308.c
1150
if (gc0308->mbus_config & V4L2_MBUS_HSYNC_ACTIVE_LOW)
drivers/media/i2c/gc0308.c
1152
ret = cci_write(gc0308->regmap, GC0308_SYNC_MODE, sync_mode, NULL);
drivers/media/i2c/gc0308.c
1159
pm_runtime_put_autosuspend(gc0308->dev);
drivers/media/i2c/gc0308.c
1163
static int gc0308_stop_stream(struct gc0308 *gc0308)
drivers/media/i2c/gc0308.c
1165
pm_runtime_put_autosuspend(gc0308->dev);
drivers/media/i2c/gc0308.c
1171
struct gc0308 *gc0308 = to_gc0308(sd);
drivers/media/i2c/gc0308.c
1178
ret = gc0308_start_stream(gc0308);
drivers/media/i2c/gc0308.c
1180
ret = gc0308_stop_stream(gc0308);
drivers/media/i2c/gc0308.c
1200
static int gc0308_bus_config(struct gc0308 *gc0308)
drivers/media/i2c/gc0308.c
1202
struct device *dev = gc0308->dev;
drivers/media/i2c/gc0308.c
1218
gc0308->mbus_config = bus_cfg.bus.parallel.flags;
drivers/media/i2c/gc0308.c
1229
static int gc0308_init_controls(struct gc0308 *gc0308)
drivers/media/i2c/gc0308.c
1233
v4l2_ctrl_handler_init(&gc0308->hdl, 11);
drivers/media/i2c/gc0308.c
1234
gc0308->hblank = v4l2_ctrl_new_std(&gc0308->hdl, &gc0308_ctrl_ops,
drivers/media/i2c/gc0308.c
1238
gc0308->vblank = v4l2_ctrl_new_std(&gc0308->hdl, &gc0308_ctrl_ops,
drivers/media/i2c/gc0308.c
1242
gc0308->hflip = v4l2_ctrl_new_std(&gc0308->hdl, &gc0308_ctrl_ops,
drivers/media/i2c/gc0308.c
1244
gc0308->vflip = v4l2_ctrl_new_std(&gc0308->hdl, &gc0308_ctrl_ops,
drivers/media/i2c/gc0308.c
1246
v4l2_ctrl_new_std(&gc0308->hdl, &gc0308_ctrl_ops, V4L2_CID_PIXEL_RATE,
drivers/media/i2c/gc0308.c
1249
v4l2_ctrl_new_std(&gc0308->hdl, &gc0308_ctrl_ops,
drivers/media/i2c/gc0308.c
1251
v4l2_ctrl_new_std_menu_items(&gc0308->hdl, &gc0308_ctrl_ops,
drivers/media/i2c/gc0308.c
1255
v4l2_ctrl_new_std_menu(&gc0308->hdl, &gc0308_ctrl_ops,
drivers/media/i2c/gc0308.c
1258
v4l2_ctrl_new_std_menu(&gc0308->hdl, &gc0308_ctrl_ops,
drivers/media/i2c/gc0308.c
1260
v4l2_ctrl_new_std_menu(&gc0308->hdl, &gc0308_ctrl_ops,
drivers/media/i2c/gc0308.c
1264
v4l2_ctrl_new_int_menu(&gc0308->hdl, &gc0308_ctrl_ops,
drivers/media/i2c/gc0308.c
1270
gc0308->sd.ctrl_handler = &gc0308->hdl;
drivers/media/i2c/gc0308.c
1271
if (gc0308->hdl.error) {
drivers/media/i2c/gc0308.c
1272
ret = gc0308->hdl.error;
drivers/media/i2c/gc0308.c
1273
v4l2_ctrl_handler_free(&gc0308->hdl);
drivers/media/i2c/gc0308.c
1277
v4l2_ctrl_cluster(2, &gc0308->hflip);
drivers/media/i2c/gc0308.c
1278
v4l2_ctrl_cluster(2, &gc0308->hblank);
drivers/media/i2c/gc0308.c
1286
struct gc0308 *gc0308;
drivers/media/i2c/gc0308.c
1291
gc0308 = devm_kzalloc(dev, sizeof(*gc0308), GFP_KERNEL);
drivers/media/i2c/gc0308.c
1292
if (!gc0308)
drivers/media/i2c/gc0308.c
1295
gc0308->dev = dev;
drivers/media/i2c/gc0308.c
1296
dev_set_drvdata(dev, gc0308);
drivers/media/i2c/gc0308.c
1298
ret = gc0308_bus_config(gc0308);
drivers/media/i2c/gc0308.c
1302
gc0308->clk = devm_clk_get_optional(dev, NULL);
drivers/media/i2c/gc0308.c
1303
if (IS_ERR(gc0308->clk))
drivers/media/i2c/gc0308.c
1304
return dev_err_probe(dev, PTR_ERR(gc0308->clk),
drivers/media/i2c/gc0308.c
1307
gc0308->vdd = devm_regulator_get(dev, "vdd28");
drivers/media/i2c/gc0308.c
1308
if (IS_ERR(gc0308->vdd))
drivers/media/i2c/gc0308.c
1309
return dev_err_probe(dev, PTR_ERR(gc0308->vdd),
drivers/media/i2c/gc0308.c
1312
gc0308->pwdn_gpio = devm_gpiod_get(dev, "powerdown", GPIOD_OUT_LOW);
drivers/media/i2c/gc0308.c
1313
if (IS_ERR(gc0308->pwdn_gpio))
drivers/media/i2c/gc0308.c
1314
return dev_err_probe(dev, PTR_ERR(gc0308->pwdn_gpio),
drivers/media/i2c/gc0308.c
1317
gc0308->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
drivers/media/i2c/gc0308.c
1318
if (IS_ERR(gc0308->reset_gpio))
drivers/media/i2c/gc0308.c
1319
return dev_err_probe(dev, PTR_ERR(gc0308->reset_gpio),
drivers/media/i2c/gc0308.c
1327
gc0308->regmap = devm_regmap_init_i2c(client, &gc0308_regmap_config);
drivers/media/i2c/gc0308.c
1328
if (IS_ERR(gc0308->regmap))
drivers/media/i2c/gc0308.c
1329
return dev_err_probe(dev, PTR_ERR(gc0308->regmap),
drivers/media/i2c/gc0308.c
1332
v4l2_i2c_subdev_init(&gc0308->sd, client, &gc0308_subdev_ops);
drivers/media/i2c/gc0308.c
1333
gc0308->sd.internal_ops = &gc0308_internal_ops;
drivers/media/i2c/gc0308.c
1334
gc0308->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/gc0308.c
1336
ret = gc0308_init_controls(gc0308);
drivers/media/i2c/gc0308.c
1340
gc0308->sd.state_lock = gc0308->hdl.lock;
drivers/media/i2c/gc0308.c
1341
gc0308->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/gc0308.c
1342
gc0308->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/gc0308.c
1343
ret = media_entity_pads_init(&gc0308->sd.entity, 1, &gc0308->pad);
drivers/media/i2c/gc0308.c
1347
ret = v4l2_subdev_init_finalize(&gc0308->sd);
drivers/media/i2c/gc0308.c
1355
if (gc0308->clk) {
drivers/media/i2c/gc0308.c
1356
clkrate = clk_get_rate(gc0308->clk);
drivers/media/i2c/gc0308.c
1361
ret = cci_read(gc0308->regmap, GC0308_CHIP_ID, &regval, NULL);
drivers/media/i2c/gc0308.c
1384
ret = v4l2_async_register_subdev(&gc0308->sd);
drivers/media/i2c/gc0308.c
1398
v4l2_subdev_cleanup(&gc0308->sd);
drivers/media/i2c/gc0308.c
1400
media_entity_cleanup(&gc0308->sd.entity);
drivers/media/i2c/gc0308.c
1402
v4l2_ctrl_handler_free(&gc0308->hdl);
drivers/media/i2c/gc0308.c
1408
struct gc0308 *gc0308 = i2c_get_clientdata(client);
drivers/media/i2c/gc0308.c
1411
v4l2_async_unregister_subdev(&gc0308->sd);
drivers/media/i2c/gc0308.c
1412
v4l2_ctrl_handler_free(&gc0308->hdl);
drivers/media/i2c/gc0308.c
1413
media_entity_cleanup(&gc0308->sd.entity);
drivers/media/i2c/gc0308.c
451
static inline struct gc0308 *to_gc0308(struct v4l2_subdev *sd)
drivers/media/i2c/gc0308.c
453
return container_of(sd, struct gc0308, sd);
drivers/media/i2c/gc0308.c
771
struct gc0308 *gc0308 = dev_get_drvdata(dev);
drivers/media/i2c/gc0308.c
774
ret = regulator_enable(gc0308->vdd);
drivers/media/i2c/gc0308.c
778
ret = clk_prepare_enable(gc0308->clk);
drivers/media/i2c/gc0308.c
782
gpiod_set_value_cansleep(gc0308->pwdn_gpio, 0);
drivers/media/i2c/gc0308.c
785
gpiod_set_value_cansleep(gc0308->reset_gpio, 1);
drivers/media/i2c/gc0308.c
787
gpiod_set_value_cansleep(gc0308->reset_gpio, 0);
drivers/media/i2c/gc0308.c
793
regulator_disable(gc0308->vdd);
drivers/media/i2c/gc0308.c
799
struct gc0308 *gc0308 = dev_get_drvdata(dev);
drivers/media/i2c/gc0308.c
801
gpiod_set_value_cansleep(gc0308->pwdn_gpio, 1);
drivers/media/i2c/gc0308.c
802
clk_disable_unprepare(gc0308->clk);
drivers/media/i2c/gc0308.c
803
regulator_disable(gc0308->vdd);
drivers/media/i2c/gc0308.c
812
struct gc0308 *gc0308 = to_gc0308(sd);
drivers/media/i2c/gc0308.c
814
return cci_read(gc0308->regmap, CCI_REG8(reg->reg), &reg->val, NULL);
drivers/media/i2c/gc0308.c
820
struct gc0308 *gc0308 = to_gc0308(sd);
drivers/media/i2c/gc0308.c
822
return cci_write(gc0308->regmap, CCI_REG8(reg->reg), reg->val, NULL);
drivers/media/i2c/gc0308.c
826
static int gc0308_set_exposure(struct gc0308 *gc0308, enum gc0308_exp_val exp)
drivers/media/i2c/gc0308.c
834
return cci_multi_reg_write(gc0308->regmap, exposure_reg_seq,
drivers/media/i2c/gc0308.c
838
static int gc0308_set_awb_mode(struct gc0308 *gc0308,
drivers/media/i2c/gc0308.c
849
ret = cci_update_bits(gc0308->regmap, GC0308_AAAA_EN,
drivers/media/i2c/gc0308.c
851
ret = cci_multi_reg_write(gc0308->regmap, awb_reg_seq,
drivers/media/i2c/gc0308.c
857
static int gc0308_set_colormode(struct gc0308 *gc0308, enum v4l2_colorfx mode)
drivers/media/i2c/gc0308.c
873
return cci_multi_reg_write(gc0308->regmap, colormode_reg_seq,
drivers/media/i2c/gc0308.c
877
static int gc0308_set_power_line_freq(struct gc0308 *gc0308, int frequency)
drivers/media/i2c/gc0308.c
896
return cci_multi_reg_write(gc0308->regmap, pwr_line_60hz,
drivers/media/i2c/gc0308.c
899
return cci_multi_reg_write(gc0308->regmap, pwr_line_50hz,
drivers/media/i2c/gc0308.c
906
static int gc0308_update_mirror(struct gc0308 *gc0308)
drivers/media/i2c/gc0308.c
910
if (gc0308->vflip->val)
drivers/media/i2c/gc0308.c
913
if (gc0308->hflip->val)
drivers/media/i2c/gc0308.c
916
return cci_update_bits(gc0308->regmap, GC0308_CISCTL_MODE1,
drivers/media/i2c/gc0308.c
920
static int gc0308_update_blanking(struct gc0308 *gc0308)
drivers/media/i2c/gc0308.c
922
u16 vblank = gc0308->vblank->val;
drivers/media/i2c/gc0308.c
923
u16 hblank = gc0308->hblank->val;
drivers/media/i2c/gc0308.c
927
cci_write(gc0308->regmap, GC0308_VB_HB, vbhb, &ret);
drivers/media/i2c/gc0308.c
928
cci_write(gc0308->regmap, GC0308_HBLANK, hblank & 0xff, &ret);
drivers/media/i2c/gc0308.c
929
cci_write(gc0308->regmap, GC0308_VBLANK, vblank & 0xff, &ret);
drivers/media/i2c/gc0308.c
936
struct gc0308 *gc0308 = container_of(ctrl->handler, struct gc0308, hdl);
drivers/media/i2c/gc0308.c
942
return gc0308_update_blanking(gc0308);
drivers/media/i2c/gc0308.c
945
return gc0308_update_mirror(gc0308);
drivers/media/i2c/gc0308.c
947
return cci_update_bits(gc0308->regmap, GC0308_AAAA_EN,
drivers/media/i2c/gc0308.c
950
return gc0308_set_awb_mode(gc0308, ctrl->val);
drivers/media/i2c/gc0308.c
952
return gc0308_set_power_line_freq(gc0308, ctrl->val);
drivers/media/i2c/gc0308.c
954
return gc0308_set_colormode(gc0308, ctrl->val);
drivers/media/i2c/gc0308.c
956
return cci_update_bits(gc0308->regmap, GC0308_DEBUG_MODE2,
drivers/media/i2c/gc0308.c
959
return gc0308_set_exposure(gc0308, ctrl->val);
drivers/media/i2c/gc0308.c
967
struct gc0308 *gc0308 = container_of(ctrl->handler, struct gc0308, hdl);
drivers/media/i2c/gc0308.c
970
if (!pm_runtime_get_if_in_use(gc0308->dev))
drivers/media/i2c/gc0308.c
975
dev_err(gc0308->dev, "failed to set control: %d\n", ret);
drivers/media/i2c/gc0308.c
977
pm_runtime_put_autosuspend(gc0308->dev);