drivers/media/i2c/ov5675.c
1006
gpiod_set_value_cansleep(ov5675->reset_gpio, 0);
drivers/media/i2c/ov5675.c
1021
struct ov5675 *ov5675 = to_ov5675(sd);
drivers/media/i2c/ov5675.c
1030
mutex_lock(&ov5675->mutex);
drivers/media/i2c/ov5675.c
1035
ov5675->cur_mode = mode;
drivers/media/i2c/ov5675.c
1036
__v4l2_ctrl_s_ctrl(ov5675->link_freq, mode->link_freq_index);
drivers/media/i2c/ov5675.c
1037
__v4l2_ctrl_s_ctrl_int64(ov5675->pixel_rate,
drivers/media/i2c/ov5675.c
1042
__v4l2_ctrl_modify_range(ov5675->vblank,
drivers/media/i2c/ov5675.c
1046
__v4l2_ctrl_s_ctrl(ov5675->vblank, vblank_def);
drivers/media/i2c/ov5675.c
1049
__v4l2_ctrl_modify_range(ov5675->hblank, h_blank, h_blank, 1,
drivers/media/i2c/ov5675.c
1053
mutex_unlock(&ov5675->mutex);
drivers/media/i2c/ov5675.c
1062
struct ov5675 *ov5675 = to_ov5675(sd);
drivers/media/i2c/ov5675.c
1064
mutex_lock(&ov5675->mutex);
drivers/media/i2c/ov5675.c
1069
ov5675_update_pad_format(ov5675->cur_mode, &fmt->format);
drivers/media/i2c/ov5675.c
1071
mutex_unlock(&ov5675->mutex);
drivers/media/i2c/ov5675.c
1133
struct ov5675 *ov5675 = to_ov5675(sd);
drivers/media/i2c/ov5675.c
1135
mutex_lock(&ov5675->mutex);
drivers/media/i2c/ov5675.c
1138
mutex_unlock(&ov5675->mutex);
drivers/media/i2c/ov5675.c
1168
static int ov5675_get_hwcfg(struct ov5675 *ov5675)
drivers/media/i2c/ov5675.c
1170
struct device *dev = ov5675->dev;
drivers/media/i2c/ov5675.c
1190
ov5675->xvclk = devm_v4l2_sensor_clk_get(dev, NULL);
drivers/media/i2c/ov5675.c
1191
if (IS_ERR(ov5675->xvclk)) {
drivers/media/i2c/ov5675.c
1192
ret = dev_err_probe(dev, PTR_ERR(ov5675->xvclk),
drivers/media/i2c/ov5675.c
1197
xvclk_rate = clk_get_rate(ov5675->xvclk);
drivers/media/i2c/ov5675.c
1205
ov5675->reset_gpio = devm_gpiod_get_optional(dev, "reset",
drivers/media/i2c/ov5675.c
1207
if (IS_ERR(ov5675->reset_gpio)) {
drivers/media/i2c/ov5675.c
1208
ret = PTR_ERR(ov5675->reset_gpio);
drivers/media/i2c/ov5675.c
1214
ov5675->supplies[i].supply = ov5675_supply_names[i];
drivers/media/i2c/ov5675.c
1217
ov5675->supplies);
drivers/media/i2c/ov5675.c
1258
struct ov5675 *ov5675 = to_ov5675(sd);
drivers/media/i2c/ov5675.c
1263
pm_runtime_disable(ov5675->dev);
drivers/media/i2c/ov5675.c
1264
mutex_destroy(&ov5675->mutex);
drivers/media/i2c/ov5675.c
1266
if (!pm_runtime_status_suspended(ov5675->dev))
drivers/media/i2c/ov5675.c
1267
ov5675_power_off(ov5675->dev);
drivers/media/i2c/ov5675.c
1268
pm_runtime_set_suspended(ov5675->dev);
drivers/media/i2c/ov5675.c
1273
struct ov5675 *ov5675;
drivers/media/i2c/ov5675.c
1277
ov5675 = devm_kzalloc(&client->dev, sizeof(*ov5675), GFP_KERNEL);
drivers/media/i2c/ov5675.c
1278
if (!ov5675)
drivers/media/i2c/ov5675.c
1281
ov5675->dev = &client->dev;
drivers/media/i2c/ov5675.c
1283
ret = ov5675_get_hwcfg(ov5675);
drivers/media/i2c/ov5675.c
1287
v4l2_i2c_subdev_init(&ov5675->sd, client, &ov5675_subdev_ops);
drivers/media/i2c/ov5675.c
1289
ret = ov5675_power_on(ov5675->dev);
drivers/media/i2c/ov5675.c
1291
dev_err(ov5675->dev, "failed to power on: %d\n", ret);
drivers/media/i2c/ov5675.c
1295
full_power = acpi_dev_state_d0(ov5675->dev);
drivers/media/i2c/ov5675.c
1297
ret = ov5675_identify_module(ov5675);
drivers/media/i2c/ov5675.c
1299
dev_err(ov5675->dev, "failed to find sensor: %d", ret);
drivers/media/i2c/ov5675.c
1304
mutex_init(&ov5675->mutex);
drivers/media/i2c/ov5675.c
1305
ov5675->cur_mode = &supported_modes[0];
drivers/media/i2c/ov5675.c
1306
ret = ov5675_init_controls(ov5675);
drivers/media/i2c/ov5675.c
1308
dev_err(ov5675->dev, "failed to init controls: %d", ret);
drivers/media/i2c/ov5675.c
1312
ov5675->sd.internal_ops = &ov5675_internal_ops;
drivers/media/i2c/ov5675.c
1313
ov5675->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/ov5675.c
1314
ov5675->sd.entity.ops = &ov5675_subdev_entity_ops;
drivers/media/i2c/ov5675.c
1315
ov5675->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/ov5675.c
1316
ov5675->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/ov5675.c
1317
ret = media_entity_pads_init(&ov5675->sd.entity, 1, &ov5675->pad);
drivers/media/i2c/ov5675.c
1319
dev_err(ov5675->dev, "failed to init entity pads: %d", ret);
drivers/media/i2c/ov5675.c
1323
ret = v4l2_async_register_subdev_sensor(&ov5675->sd);
drivers/media/i2c/ov5675.c
1325
dev_err(ov5675->dev, "failed to register V4L2 subdev: %d",
drivers/media/i2c/ov5675.c
1332
pm_runtime_set_active(ov5675->dev);
drivers/media/i2c/ov5675.c
1333
pm_runtime_enable(ov5675->dev);
drivers/media/i2c/ov5675.c
1334
pm_runtime_idle(ov5675->dev);
drivers/media/i2c/ov5675.c
1339
media_entity_cleanup(&ov5675->sd.entity);
drivers/media/i2c/ov5675.c
1342
v4l2_ctrl_handler_free(ov5675->sd.ctrl_handler);
drivers/media/i2c/ov5675.c
1343
mutex_destroy(&ov5675->mutex);
drivers/media/i2c/ov5675.c
1345
ov5675_power_off(ov5675->dev);
drivers/media/i2c/ov5675.c
540
static int ov5675_read_reg(struct ov5675 *ov5675, u16 reg, u16 len, u32 *val)
drivers/media/i2c/ov5675.c
542
struct i2c_client *client = v4l2_get_subdevdata(&ov5675->sd);
drivers/media/i2c/ov5675.c
570
static int ov5675_write_reg(struct ov5675 *ov5675, u16 reg, u16 len, u32 val)
drivers/media/i2c/ov5675.c
572
struct i2c_client *client = v4l2_get_subdevdata(&ov5675->sd);
drivers/media/i2c/ov5675.c
586
static int ov5675_write_reg_list(struct ov5675 *ov5675,
drivers/media/i2c/ov5675.c
593
ret = ov5675_write_reg(ov5675, r_list->regs[i].address, 1,
drivers/media/i2c/ov5675.c
596
dev_err_ratelimited(ov5675->dev,
drivers/media/i2c/ov5675.c
606
static int ov5675_update_digital_gain(struct ov5675 *ov5675, u32 d_gain)
drivers/media/i2c/ov5675.c
610
ret = ov5675_write_reg(ov5675, OV5675_REG_GROUP_ACCESS,
drivers/media/i2c/ov5675.c
616
ret = ov5675_write_reg(ov5675, OV5675_REG_MWB_R_GAIN,
drivers/media/i2c/ov5675.c
621
ret = ov5675_write_reg(ov5675, OV5675_REG_MWB_G_GAIN,
drivers/media/i2c/ov5675.c
626
ret = ov5675_write_reg(ov5675, OV5675_REG_MWB_B_GAIN,
drivers/media/i2c/ov5675.c
631
ret = ov5675_write_reg(ov5675, OV5675_REG_GROUP_ACCESS,
drivers/media/i2c/ov5675.c
637
ret = ov5675_write_reg(ov5675, OV5675_REG_GROUP_ACCESS,
drivers/media/i2c/ov5675.c
643
static int ov5675_test_pattern(struct ov5675 *ov5675, u32 pattern)
drivers/media/i2c/ov5675.c
649
return ov5675_write_reg(ov5675, OV5675_REG_TEST_PATTERN,
drivers/media/i2c/ov5675.c
657
static int ov5675_set_ctrl_hflip(struct ov5675 *ov5675, u32 ctrl_val)
drivers/media/i2c/ov5675.c
662
ret = ov5675_read_reg(ov5675, OV5675_REG_FORMAT1,
drivers/media/i2c/ov5675.c
667
return ov5675_write_reg(ov5675, OV5675_REG_FORMAT1,
drivers/media/i2c/ov5675.c
672
static int ov5675_set_ctrl_vflip(struct ov5675 *ov5675, u8 ctrl_val)
drivers/media/i2c/ov5675.c
677
ret = ov5675_read_reg(ov5675, OV5675_REG_FORMAT1,
drivers/media/i2c/ov5675.c
682
ret = ov5675_write_reg(ov5675, OV5675_REG_FORMAT1,
drivers/media/i2c/ov5675.c
689
ret = ov5675_read_reg(ov5675, OV5675_REG_FORMAT2,
drivers/media/i2c/ov5675.c
695
return ov5675_write_reg(ov5675, OV5675_REG_FORMAT2,
drivers/media/i2c/ov5675.c
702
struct ov5675 *ov5675 = container_of(ctrl->handler,
drivers/media/i2c/ov5675.c
703
struct ov5675, ctrl_handler);
drivers/media/i2c/ov5675.c
710
exposure_max = ov5675->cur_mode->height + ctrl->val -
drivers/media/i2c/ov5675.c
712
__v4l2_ctrl_modify_range(ov5675->exposure,
drivers/media/i2c/ov5675.c
713
ov5675->exposure->minimum,
drivers/media/i2c/ov5675.c
714
exposure_max, ov5675->exposure->step,
drivers/media/i2c/ov5675.c
719
if (!pm_runtime_get_if_in_use(ov5675->dev))
drivers/media/i2c/ov5675.c
724
ret = ov5675_write_reg(ov5675, OV5675_REG_ANALOG_GAIN,
drivers/media/i2c/ov5675.c
729
ret = ov5675_update_digital_gain(ov5675, ctrl->val);
drivers/media/i2c/ov5675.c
740
ret = ov5675_write_reg(ov5675, OV5675_REG_EXPOSURE,
drivers/media/i2c/ov5675.c
745
ret = ov5675_write_reg(ov5675, OV5675_REG_VTS,
drivers/media/i2c/ov5675.c
747
ov5675->cur_mode->height + ctrl->val +
drivers/media/i2c/ov5675.c
752
ret = ov5675_test_pattern(ov5675, ctrl->val);
drivers/media/i2c/ov5675.c
756
ov5675_set_ctrl_hflip(ov5675, ctrl->val);
drivers/media/i2c/ov5675.c
760
ov5675_set_ctrl_vflip(ov5675, ctrl->val);
drivers/media/i2c/ov5675.c
768
pm_runtime_put(ov5675->dev);
drivers/media/i2c/ov5675.c
777
static int ov5675_init_controls(struct ov5675 *ov5675)
drivers/media/i2c/ov5675.c
784
ctrl_hdlr = &ov5675->ctrl_handler;
drivers/media/i2c/ov5675.c
789
ctrl_hdlr->lock = &ov5675->mutex;
drivers/media/i2c/ov5675.c
790
ov5675->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &ov5675_ctrl_ops,
drivers/media/i2c/ov5675.c
794
if (ov5675->link_freq)
drivers/media/i2c/ov5675.c
795
ov5675->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/ov5675.c
797
ov5675->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &ov5675_ctrl_ops,
drivers/media/i2c/ov5675.c
802
ov5675->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov5675_ctrl_ops,
drivers/media/i2c/ov5675.c
804
ov5675->cur_mode->vts_min - ov5675->cur_mode->height,
drivers/media/i2c/ov5675.c
805
OV5675_VTS_MAX - ov5675->cur_mode->height, 1,
drivers/media/i2c/ov5675.c
806
ov5675->cur_mode->vts_def - ov5675->cur_mode->height);
drivers/media/i2c/ov5675.c
807
h_blank = to_pixels_per_line(ov5675->cur_mode->hts,
drivers/media/i2c/ov5675.c
808
ov5675->cur_mode->link_freq_index) - ov5675->cur_mode->width;
drivers/media/i2c/ov5675.c
809
ov5675->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov5675_ctrl_ops,
drivers/media/i2c/ov5675.c
81
#define to_ov5675(_sd) container_of(_sd, struct ov5675, sd)
drivers/media/i2c/ov5675.c
812
if (ov5675->hblank)
drivers/media/i2c/ov5675.c
813
ov5675->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/ov5675.c
821
exposure_max = (ov5675->cur_mode->vts_def - OV5675_EXPOSURE_MAX_MARGIN);
drivers/media/i2c/ov5675.c
822
ov5675->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &ov5675_ctrl_ops,
drivers/media/i2c/ov5675.c
841
ret = v4l2_fwnode_device_parse(ov5675->dev, &props);
drivers/media/i2c/ov5675.c
850
ov5675->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/ov5675.c
869
static int ov5675_identify_module(struct ov5675 *ov5675)
drivers/media/i2c/ov5675.c
874
if (ov5675->identified)
drivers/media/i2c/ov5675.c
877
ret = ov5675_read_reg(ov5675, OV5675_REG_CHIP_ID,
drivers/media/i2c/ov5675.c
883
dev_err(ov5675->dev, "chip id mismatch: %x!=%x",
drivers/media/i2c/ov5675.c
888
ov5675->identified = true;
drivers/media/i2c/ov5675.c
893
static int ov5675_start_streaming(struct ov5675 *ov5675)
drivers/media/i2c/ov5675.c
898
ret = ov5675_identify_module(ov5675);
drivers/media/i2c/ov5675.c
902
link_freq_index = ov5675->cur_mode->link_freq_index;
drivers/media/i2c/ov5675.c
904
ret = ov5675_write_reg_list(ov5675, reg_list);
drivers/media/i2c/ov5675.c
906
dev_err(ov5675->dev, "failed to set plls");
drivers/media/i2c/ov5675.c
910
reg_list = &ov5675->cur_mode->reg_list;
drivers/media/i2c/ov5675.c
911
ret = ov5675_write_reg_list(ov5675, reg_list);
drivers/media/i2c/ov5675.c
913
dev_err(ov5675->dev, "failed to set mode");
drivers/media/i2c/ov5675.c
917
ret = __v4l2_ctrl_handler_setup(ov5675->sd.ctrl_handler);
drivers/media/i2c/ov5675.c
921
ret = ov5675_write_reg(ov5675, OV5675_REG_MODE_SELECT,
drivers/media/i2c/ov5675.c
924
dev_err(ov5675->dev, "failed to set stream");
drivers/media/i2c/ov5675.c
931
static void ov5675_stop_streaming(struct ov5675 *ov5675)
drivers/media/i2c/ov5675.c
933
if (ov5675_write_reg(ov5675, OV5675_REG_MODE_SELECT,
drivers/media/i2c/ov5675.c
935
dev_err(ov5675->dev, "failed to set stream");
drivers/media/i2c/ov5675.c
940
struct ov5675 *ov5675 = to_ov5675(sd);
drivers/media/i2c/ov5675.c
943
mutex_lock(&ov5675->mutex);
drivers/media/i2c/ov5675.c
945
ret = pm_runtime_resume_and_get(ov5675->dev);
drivers/media/i2c/ov5675.c
947
mutex_unlock(&ov5675->mutex);
drivers/media/i2c/ov5675.c
951
ret = ov5675_start_streaming(ov5675);
drivers/media/i2c/ov5675.c
954
ov5675_stop_streaming(ov5675);
drivers/media/i2c/ov5675.c
955
pm_runtime_put(ov5675->dev);
drivers/media/i2c/ov5675.c
958
ov5675_stop_streaming(ov5675);
drivers/media/i2c/ov5675.c
959
pm_runtime_put(ov5675->dev);
drivers/media/i2c/ov5675.c
962
mutex_unlock(&ov5675->mutex);
drivers/media/i2c/ov5675.c
970
struct ov5675 *ov5675 = to_ov5675(sd);
drivers/media/i2c/ov5675.c
974
clk_disable_unprepare(ov5675->xvclk);
drivers/media/i2c/ov5675.c
975
gpiod_set_value_cansleep(ov5675->reset_gpio, 1);
drivers/media/i2c/ov5675.c
976
regulator_bulk_disable(OV5675_NUM_SUPPLIES, ov5675->supplies);
drivers/media/i2c/ov5675.c
984
struct ov5675 *ov5675 = to_ov5675(sd);
drivers/media/i2c/ov5675.c
987
ret = clk_prepare_enable(ov5675->xvclk);
drivers/media/i2c/ov5675.c
993
gpiod_set_value_cansleep(ov5675->reset_gpio, 1);
drivers/media/i2c/ov5675.c
995
ret = regulator_bulk_enable(OV5675_NUM_SUPPLIES, ov5675->supplies);
drivers/media/i2c/ov5675.c
997
clk_disable_unprepare(ov5675->xvclk);