Symbol: gc0308
drivers/media/i2c/gc0308.c
1049
struct gc0308 *gc0308 = to_gc0308(sd);
drivers/media/i2c/gc0308.c
1067
gc0308->mode.out_format = gc0308_formats[i].regval;
drivers/media/i2c/gc0308.c
1068
gc0308->mode.subsample = mode->subsample;
drivers/media/i2c/gc0308.c
1069
gc0308->mode.width = mode->width;
drivers/media/i2c/gc0308.c
1070
gc0308->mode.height = mode->height;
drivers/media/i2c/gc0308.c
1100
static int gc0308_set_resolution(struct gc0308 *gc0308, int *ret)
drivers/media/i2c/gc0308.c
1103
{GC0308_SUBSAMPLE, gc0308->mode.subsample},
drivers/media/i2c/gc0308.c
1112
{GC0308_CROP_WIN_HEIGHT, gc0308->mode.height},
drivers/media/i2c/gc0308.c
1113
{GC0308_CROP_WIN_WIDTH, gc0308->mode.width},
drivers/media/i2c/gc0308.c
1116
return cci_multi_reg_write(gc0308->regmap, resolution_regs,
drivers/media/i2c/gc0308.c
1120
static int gc0308_start_stream(struct gc0308 *gc0308)
drivers/media/i2c/gc0308.c
1124
ret = pm_runtime_resume_and_get(gc0308->dev);
drivers/media/i2c/gc0308.c
1128
cci_multi_reg_write(gc0308->regmap, sensor_default_regs,
drivers/media/i2c/gc0308.c
1130
cci_update_bits(gc0308->regmap, GC0308_OUT_FORMAT,
drivers/media/i2c/gc0308.c
1131
GENMASK(4, 0), gc0308->mode.out_format, &ret);
drivers/media/i2c/gc0308.c
1132
gc0308_set_resolution(gc0308, &ret);
drivers/media/i2c/gc0308.c
1135
dev_err(gc0308->dev, "failed to update registers: %d\n", ret);
drivers/media/i2c/gc0308.c
1139
ret = __v4l2_ctrl_handler_setup(&gc0308->hdl);
drivers/media/i2c/gc0308.c
1141
dev_err(gc0308->dev, "failed to setup controls\n");
drivers/media/i2c/gc0308.c
1147
if (gc0308->mbus_config & V4L2_MBUS_VSYNC_ACTIVE_LOW)
drivers/media/i2c/gc0308.c
1149
if (gc0308->mbus_config & V4L2_MBUS_HSYNC_ACTIVE_LOW)
drivers/media/i2c/gc0308.c
1151
ret = cci_write(gc0308->regmap, GC0308_SYNC_MODE, sync_mode, NULL);
drivers/media/i2c/gc0308.c
1158
pm_runtime_put_autosuspend(gc0308->dev);
drivers/media/i2c/gc0308.c
1162
static int gc0308_stop_stream(struct gc0308 *gc0308)
drivers/media/i2c/gc0308.c
1164
pm_runtime_put_autosuspend(gc0308->dev);
drivers/media/i2c/gc0308.c
1170
struct gc0308 *gc0308 = to_gc0308(sd);
drivers/media/i2c/gc0308.c
1177
ret = gc0308_start_stream(gc0308);
drivers/media/i2c/gc0308.c
1179
ret = gc0308_stop_stream(gc0308);
drivers/media/i2c/gc0308.c
1199
static int gc0308_bus_config(struct gc0308 *gc0308)
drivers/media/i2c/gc0308.c
1201
struct device *dev = gc0308->dev;
drivers/media/i2c/gc0308.c
1217
gc0308->mbus_config = bus_cfg.bus.parallel.flags;
drivers/media/i2c/gc0308.c
1228
static int gc0308_init_controls(struct gc0308 *gc0308)
drivers/media/i2c/gc0308.c
1232
v4l2_ctrl_handler_init(&gc0308->hdl, 11);
drivers/media/i2c/gc0308.c
1233
gc0308->hblank = v4l2_ctrl_new_std(&gc0308->hdl, &gc0308_ctrl_ops,
drivers/media/i2c/gc0308.c
1237
gc0308->vblank = v4l2_ctrl_new_std(&gc0308->hdl, &gc0308_ctrl_ops,
drivers/media/i2c/gc0308.c
1241
gc0308->hflip = v4l2_ctrl_new_std(&gc0308->hdl, &gc0308_ctrl_ops,
drivers/media/i2c/gc0308.c
1243
gc0308->vflip = v4l2_ctrl_new_std(&gc0308->hdl, &gc0308_ctrl_ops,
drivers/media/i2c/gc0308.c
1245
v4l2_ctrl_new_std(&gc0308->hdl, &gc0308_ctrl_ops, V4L2_CID_PIXEL_RATE,
drivers/media/i2c/gc0308.c
1248
v4l2_ctrl_new_std(&gc0308->hdl, &gc0308_ctrl_ops,
drivers/media/i2c/gc0308.c
1250
v4l2_ctrl_new_std_menu_items(&gc0308->hdl, &gc0308_ctrl_ops,
drivers/media/i2c/gc0308.c
1254
v4l2_ctrl_new_std_menu(&gc0308->hdl, &gc0308_ctrl_ops,
drivers/media/i2c/gc0308.c
1257
v4l2_ctrl_new_std_menu(&gc0308->hdl, &gc0308_ctrl_ops,
drivers/media/i2c/gc0308.c
1259
v4l2_ctrl_new_std_menu(&gc0308->hdl, &gc0308_ctrl_ops,
drivers/media/i2c/gc0308.c
1263
v4l2_ctrl_new_int_menu(&gc0308->hdl, &gc0308_ctrl_ops,
drivers/media/i2c/gc0308.c
1269
gc0308->sd.ctrl_handler = &gc0308->hdl;
drivers/media/i2c/gc0308.c
1270
if (gc0308->hdl.error) {
drivers/media/i2c/gc0308.c
1271
ret = gc0308->hdl.error;
drivers/media/i2c/gc0308.c
1272
v4l2_ctrl_handler_free(&gc0308->hdl);
drivers/media/i2c/gc0308.c
1276
v4l2_ctrl_cluster(2, &gc0308->hflip);
drivers/media/i2c/gc0308.c
1277
v4l2_ctrl_cluster(2, &gc0308->hblank);
drivers/media/i2c/gc0308.c
1285
struct gc0308 *gc0308;
drivers/media/i2c/gc0308.c
1290
gc0308 = devm_kzalloc(dev, sizeof(*gc0308), GFP_KERNEL);
drivers/media/i2c/gc0308.c
1291
if (!gc0308)
drivers/media/i2c/gc0308.c
1294
gc0308->dev = dev;
drivers/media/i2c/gc0308.c
1295
dev_set_drvdata(dev, gc0308);
drivers/media/i2c/gc0308.c
1297
ret = gc0308_bus_config(gc0308);
drivers/media/i2c/gc0308.c
1301
gc0308->clk = devm_clk_get_optional(dev, NULL);
drivers/media/i2c/gc0308.c
1302
if (IS_ERR(gc0308->clk))
drivers/media/i2c/gc0308.c
1303
return dev_err_probe(dev, PTR_ERR(gc0308->clk),
drivers/media/i2c/gc0308.c
1306
gc0308->vdd = devm_regulator_get(dev, "vdd28");
drivers/media/i2c/gc0308.c
1307
if (IS_ERR(gc0308->vdd))
drivers/media/i2c/gc0308.c
1308
return dev_err_probe(dev, PTR_ERR(gc0308->vdd),
drivers/media/i2c/gc0308.c
1311
gc0308->pwdn_gpio = devm_gpiod_get(dev, "powerdown", GPIOD_OUT_LOW);
drivers/media/i2c/gc0308.c
1312
if (IS_ERR(gc0308->pwdn_gpio))
drivers/media/i2c/gc0308.c
1313
return dev_err_probe(dev, PTR_ERR(gc0308->pwdn_gpio),
drivers/media/i2c/gc0308.c
1316
gc0308->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
drivers/media/i2c/gc0308.c
1317
if (IS_ERR(gc0308->reset_gpio))
drivers/media/i2c/gc0308.c
1318
return dev_err_probe(dev, PTR_ERR(gc0308->reset_gpio),
drivers/media/i2c/gc0308.c
1326
gc0308->regmap = devm_regmap_init_i2c(client, &gc0308_regmap_config);
drivers/media/i2c/gc0308.c
1327
if (IS_ERR(gc0308->regmap))
drivers/media/i2c/gc0308.c
1328
return dev_err_probe(dev, PTR_ERR(gc0308->regmap),
drivers/media/i2c/gc0308.c
1331
v4l2_i2c_subdev_init(&gc0308->sd, client, &gc0308_subdev_ops);
drivers/media/i2c/gc0308.c
1332
gc0308->sd.internal_ops = &gc0308_internal_ops;
drivers/media/i2c/gc0308.c
1333
gc0308->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/gc0308.c
1335
ret = gc0308_init_controls(gc0308);
drivers/media/i2c/gc0308.c
1339
gc0308->sd.state_lock = gc0308->hdl.lock;
drivers/media/i2c/gc0308.c
1340
gc0308->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/gc0308.c
1341
gc0308->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/gc0308.c
1342
ret = media_entity_pads_init(&gc0308->sd.entity, 1, &gc0308->pad);
drivers/media/i2c/gc0308.c
1346
ret = v4l2_subdev_init_finalize(&gc0308->sd);
drivers/media/i2c/gc0308.c
1354
if (gc0308->clk) {
drivers/media/i2c/gc0308.c
1355
clkrate = clk_get_rate(gc0308->clk);
drivers/media/i2c/gc0308.c
1360
ret = cci_read(gc0308->regmap, GC0308_CHIP_ID, &regval, NULL);
drivers/media/i2c/gc0308.c
1383
ret = v4l2_async_register_subdev(&gc0308->sd);
drivers/media/i2c/gc0308.c
1397
v4l2_subdev_cleanup(&gc0308->sd);
drivers/media/i2c/gc0308.c
1399
media_entity_cleanup(&gc0308->sd.entity);
drivers/media/i2c/gc0308.c
1401
v4l2_ctrl_handler_free(&gc0308->hdl);
drivers/media/i2c/gc0308.c
1407
struct gc0308 *gc0308 = i2c_get_clientdata(client);
drivers/media/i2c/gc0308.c
1410
v4l2_async_unregister_subdev(&gc0308->sd);
drivers/media/i2c/gc0308.c
1411
v4l2_ctrl_handler_free(&gc0308->hdl);
drivers/media/i2c/gc0308.c
1412
media_entity_cleanup(&gc0308->sd.entity);
drivers/media/i2c/gc0308.c
450
static inline struct gc0308 *to_gc0308(struct v4l2_subdev *sd)
drivers/media/i2c/gc0308.c
452
return container_of(sd, struct gc0308, sd);
drivers/media/i2c/gc0308.c
770
struct gc0308 *gc0308 = dev_get_drvdata(dev);
drivers/media/i2c/gc0308.c
773
ret = regulator_enable(gc0308->vdd);
drivers/media/i2c/gc0308.c
777
ret = clk_prepare_enable(gc0308->clk);
drivers/media/i2c/gc0308.c
781
gpiod_set_value_cansleep(gc0308->pwdn_gpio, 0);
drivers/media/i2c/gc0308.c
784
gpiod_set_value_cansleep(gc0308->reset_gpio, 1);
drivers/media/i2c/gc0308.c
786
gpiod_set_value_cansleep(gc0308->reset_gpio, 0);
drivers/media/i2c/gc0308.c
792
regulator_disable(gc0308->vdd);
drivers/media/i2c/gc0308.c
798
struct gc0308 *gc0308 = dev_get_drvdata(dev);
drivers/media/i2c/gc0308.c
800
gpiod_set_value_cansleep(gc0308->pwdn_gpio, 1);
drivers/media/i2c/gc0308.c
801
clk_disable_unprepare(gc0308->clk);
drivers/media/i2c/gc0308.c
802
regulator_disable(gc0308->vdd);
drivers/media/i2c/gc0308.c
811
struct gc0308 *gc0308 = to_gc0308(sd);
drivers/media/i2c/gc0308.c
813
return cci_read(gc0308->regmap, CCI_REG8(reg->reg), &reg->val, NULL);
drivers/media/i2c/gc0308.c
819
struct gc0308 *gc0308 = to_gc0308(sd);
drivers/media/i2c/gc0308.c
821
return cci_write(gc0308->regmap, CCI_REG8(reg->reg), reg->val, NULL);
drivers/media/i2c/gc0308.c
825
static int gc0308_set_exposure(struct gc0308 *gc0308, enum gc0308_exp_val exp)
drivers/media/i2c/gc0308.c
833
return cci_multi_reg_write(gc0308->regmap, exposure_reg_seq,
drivers/media/i2c/gc0308.c
837
static int gc0308_set_awb_mode(struct gc0308 *gc0308,
drivers/media/i2c/gc0308.c
848
ret = cci_update_bits(gc0308->regmap, GC0308_AAAA_EN,
drivers/media/i2c/gc0308.c
850
ret = cci_multi_reg_write(gc0308->regmap, awb_reg_seq,
drivers/media/i2c/gc0308.c
856
static int gc0308_set_colormode(struct gc0308 *gc0308, enum v4l2_colorfx mode)
drivers/media/i2c/gc0308.c
872
return cci_multi_reg_write(gc0308->regmap, colormode_reg_seq,
drivers/media/i2c/gc0308.c
876
static int gc0308_set_power_line_freq(struct gc0308 *gc0308, int frequency)
drivers/media/i2c/gc0308.c
895
return cci_multi_reg_write(gc0308->regmap, pwr_line_60hz,
drivers/media/i2c/gc0308.c
898
return cci_multi_reg_write(gc0308->regmap, pwr_line_50hz,
drivers/media/i2c/gc0308.c
905
static int gc0308_update_mirror(struct gc0308 *gc0308)
drivers/media/i2c/gc0308.c
909
if (gc0308->vflip->val)
drivers/media/i2c/gc0308.c
912
if (gc0308->hflip->val)
drivers/media/i2c/gc0308.c
915
return cci_update_bits(gc0308->regmap, GC0308_CISCTL_MODE1,
drivers/media/i2c/gc0308.c
919
static int gc0308_update_blanking(struct gc0308 *gc0308)
drivers/media/i2c/gc0308.c
921
u16 vblank = gc0308->vblank->val;
drivers/media/i2c/gc0308.c
922
u16 hblank = gc0308->hblank->val;
drivers/media/i2c/gc0308.c
926
cci_write(gc0308->regmap, GC0308_VB_HB, vbhb, &ret);
drivers/media/i2c/gc0308.c
927
cci_write(gc0308->regmap, GC0308_HBLANK, hblank & 0xff, &ret);
drivers/media/i2c/gc0308.c
928
cci_write(gc0308->regmap, GC0308_VBLANK, vblank & 0xff, &ret);
drivers/media/i2c/gc0308.c
935
struct gc0308 *gc0308 = container_of(ctrl->handler, struct gc0308, hdl);
drivers/media/i2c/gc0308.c
941
return gc0308_update_blanking(gc0308);
drivers/media/i2c/gc0308.c
944
return gc0308_update_mirror(gc0308);
drivers/media/i2c/gc0308.c
946
return cci_update_bits(gc0308->regmap, GC0308_AAAA_EN,
drivers/media/i2c/gc0308.c
949
return gc0308_set_awb_mode(gc0308, ctrl->val);
drivers/media/i2c/gc0308.c
951
return gc0308_set_power_line_freq(gc0308, ctrl->val);
drivers/media/i2c/gc0308.c
953
return gc0308_set_colormode(gc0308, ctrl->val);
drivers/media/i2c/gc0308.c
955
return cci_update_bits(gc0308->regmap, GC0308_DEBUG_MODE2,
drivers/media/i2c/gc0308.c
958
return gc0308_set_exposure(gc0308, ctrl->val);
drivers/media/i2c/gc0308.c
966
struct gc0308 *gc0308 = container_of(ctrl->handler, struct gc0308, hdl);
drivers/media/i2c/gc0308.c
969
if (!pm_runtime_get_if_in_use(gc0308->dev))
drivers/media/i2c/gc0308.c
974
dev_err(gc0308->dev, "failed to set control: %d\n", ret);
drivers/media/i2c/gc0308.c
976
pm_runtime_put_autosuspend(gc0308->dev);