drivers/media/i2c/ov08d10.c
1000
ov08d10->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/ov08d10.c
1005
static void ov08d10_update_pad_format(struct ov08d10 *ov08d10,
drivers/media/i2c/ov08d10.c
1011
fmt->code = ov08d10_get_format_code(ov08d10);
drivers/media/i2c/ov08d10.c
1015
static int ov08d10_start_streaming(struct ov08d10 *ov08d10)
drivers/media/i2c/ov08d10.c
1017
struct i2c_client *client = v4l2_get_subdevdata(&ov08d10->sd);
drivers/media/i2c/ov08d10.c
1021
link_freq_index = ov08d10->cur_mode->link_freq_index;
drivers/media/i2c/ov08d10.c
1023
&ov08d10->priv_lane->link_freq_configs[link_freq_index].reg_list;
drivers/media/i2c/ov08d10.c
1028
dev_err(ov08d10->dev, "failed to reset sensor");
drivers/media/i2c/ov08d10.c
1033
dev_err(ov08d10->dev, "failed to reset sensor");
drivers/media/i2c/ov08d10.c
1039
dev_err(ov08d10->dev, "failed to reset sensor");
drivers/media/i2c/ov08d10.c
1044
ret = ov08d10_write_reg_list(ov08d10, reg_list);
drivers/media/i2c/ov08d10.c
1046
dev_err(ov08d10->dev, "failed to set plls");
drivers/media/i2c/ov08d10.c
1050
reg_list = &ov08d10->cur_mode->reg_list;
drivers/media/i2c/ov08d10.c
1051
ret = ov08d10_write_reg_list(ov08d10, reg_list);
drivers/media/i2c/ov08d10.c
1053
dev_err(ov08d10->dev, "failed to set mode");
drivers/media/i2c/ov08d10.c
1057
ret = __v4l2_ctrl_handler_setup(ov08d10->sd.ctrl_handler);
drivers/media/i2c/ov08d10.c
1073
static void ov08d10_stop_streaming(struct ov08d10 *ov08d10)
drivers/media/i2c/ov08d10.c
1075
struct i2c_client *client = v4l2_get_subdevdata(&ov08d10->sd);
drivers/media/i2c/ov08d10.c
1080
dev_err(ov08d10->dev, "failed to stop streaming");
drivers/media/i2c/ov08d10.c
1086
dev_err(ov08d10->dev, "failed to stop streaming");
drivers/media/i2c/ov08d10.c
1092
dev_err(ov08d10->dev, "failed to stop streaming");
drivers/media/i2c/ov08d10.c
1099
struct ov08d10 *ov08d10 = to_ov08d10(sd);
drivers/media/i2c/ov08d10.c
1102
mutex_lock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1104
ret = pm_runtime_resume_and_get(ov08d10->dev);
drivers/media/i2c/ov08d10.c
1106
mutex_unlock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1110
ret = ov08d10_start_streaming(ov08d10);
drivers/media/i2c/ov08d10.c
1113
ov08d10_stop_streaming(ov08d10);
drivers/media/i2c/ov08d10.c
1114
pm_runtime_put(ov08d10->dev);
drivers/media/i2c/ov08d10.c
1117
ov08d10_stop_streaming(ov08d10);
drivers/media/i2c/ov08d10.c
1118
pm_runtime_put(ov08d10->dev);
drivers/media/i2c/ov08d10.c
1122
__v4l2_ctrl_grab(ov08d10->vflip, enable);
drivers/media/i2c/ov08d10.c
1123
__v4l2_ctrl_grab(ov08d10->hflip, enable);
drivers/media/i2c/ov08d10.c
1125
mutex_unlock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1134
struct ov08d10 *ov08d10 = to_ov08d10(sd);
drivers/media/i2c/ov08d10.c
1139
mode = v4l2_find_nearest_size(ov08d10->priv_lane->sp_modes,
drivers/media/i2c/ov08d10.c
1140
ov08d10->modes_size,
drivers/media/i2c/ov08d10.c
1144
mutex_lock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1145
ov08d10_update_pad_format(ov08d10, mode, &fmt->format);
drivers/media/i2c/ov08d10.c
1150
ov08d10->cur_mode = mode;
drivers/media/i2c/ov08d10.c
1151
__v4l2_ctrl_s_ctrl(ov08d10->link_freq, mode->link_freq_index);
drivers/media/i2c/ov08d10.c
1152
pixel_rate = to_rate(ov08d10->priv_lane->link_freq_menu,
drivers/media/i2c/ov08d10.c
1154
ov08d10->cur_mode->data_lanes);
drivers/media/i2c/ov08d10.c
1155
__v4l2_ctrl_s_ctrl_int64(ov08d10->pixel_rate, pixel_rate);
drivers/media/i2c/ov08d10.c
1159
__v4l2_ctrl_modify_range(ov08d10->vblank,
drivers/media/i2c/ov08d10.c
1163
__v4l2_ctrl_s_ctrl(ov08d10->vblank, vblank_def);
drivers/media/i2c/ov08d10.c
1164
h_blank = to_pixels_per_line(ov08d10->priv_lane->link_freq_menu,
drivers/media/i2c/ov08d10.c
1167
ov08d10->cur_mode->data_lanes)
drivers/media/i2c/ov08d10.c
1169
__v4l2_ctrl_modify_range(ov08d10->hblank, h_blank, h_blank, 1,
drivers/media/i2c/ov08d10.c
1173
mutex_unlock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1182
struct ov08d10 *ov08d10 = to_ov08d10(sd);
drivers/media/i2c/ov08d10.c
1184
mutex_lock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1189
ov08d10_update_pad_format(ov08d10, ov08d10->cur_mode,
drivers/media/i2c/ov08d10.c
1192
mutex_unlock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1201
struct ov08d10 *ov08d10 = to_ov08d10(sd);
drivers/media/i2c/ov08d10.c
1206
mutex_lock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1207
code->code = ov08d10_get_format_code(ov08d10);
drivers/media/i2c/ov08d10.c
1208
mutex_unlock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1217
struct ov08d10 *ov08d10 = to_ov08d10(sd);
drivers/media/i2c/ov08d10.c
1219
if (fse->index >= ov08d10->modes_size)
drivers/media/i2c/ov08d10.c
1222
mutex_lock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1223
if (fse->code != ov08d10_get_format_code(ov08d10)) {
drivers/media/i2c/ov08d10.c
1224
mutex_unlock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1227
mutex_unlock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1229
fse->min_width = ov08d10->priv_lane->sp_modes[fse->index].width;
drivers/media/i2c/ov08d10.c
1231
fse->min_height = ov08d10->priv_lane->sp_modes[fse->index].height;
drivers/media/i2c/ov08d10.c
1239
struct ov08d10 *ov08d10 = to_ov08d10(sd);
drivers/media/i2c/ov08d10.c
1241
mutex_lock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1242
ov08d10_update_pad_format(ov08d10, &ov08d10->priv_lane->sp_modes[0],
drivers/media/i2c/ov08d10.c
1244
mutex_unlock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1269
static int ov08d10_identify_module(struct ov08d10 *ov08d10)
drivers/media/i2c/ov08d10.c
1271
struct i2c_client *client = v4l2_get_subdevdata(&ov08d10->sd);
drivers/media/i2c/ov08d10.c
1295
dev_err(ov08d10->dev, "unexpected sensor id(0x%04x)\n",
drivers/media/i2c/ov08d10.c
1303
static int ov08d10_get_hwcfg(struct ov08d10 *ov08d10)
drivers/media/i2c/ov08d10.c
1305
struct device *dev = ov08d10->dev;
drivers/media/i2c/ov08d10.c
1334
dev_dbg(dev, "Using %u data lanes\n", ov08d10->cur_mode->data_lanes);
drivers/media/i2c/ov08d10.c
1336
ov08d10->priv_lane = &lane_cfg_2;
drivers/media/i2c/ov08d10.c
1337
ov08d10->modes_size = ov08d10_modes_num(ov08d10);
drivers/media/i2c/ov08d10.c
1345
for (i = 0; i < ARRAY_SIZE(ov08d10->priv_lane->link_freq_menu); i++) {
drivers/media/i2c/ov08d10.c
1347
if (ov08d10->priv_lane->link_freq_menu[i] ==
drivers/media/i2c/ov08d10.c
1354
ov08d10->priv_lane->link_freq_menu[i]);
drivers/media/i2c/ov08d10.c
1369
struct ov08d10 *ov08d10 = to_ov08d10(sd);
drivers/media/i2c/ov08d10.c
1374
pm_runtime_disable(ov08d10->dev);
drivers/media/i2c/ov08d10.c
1375
mutex_destroy(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1380
struct ov08d10 *ov08d10;
drivers/media/i2c/ov08d10.c
1384
ov08d10 = devm_kzalloc(&client->dev, sizeof(*ov08d10), GFP_KERNEL);
drivers/media/i2c/ov08d10.c
1385
if (!ov08d10)
drivers/media/i2c/ov08d10.c
1388
ov08d10->dev = &client->dev;
drivers/media/i2c/ov08d10.c
1390
ov08d10->clk = devm_v4l2_sensor_clk_get(ov08d10->dev, NULL);
drivers/media/i2c/ov08d10.c
1391
if (IS_ERR(ov08d10->clk))
drivers/media/i2c/ov08d10.c
1392
return dev_err_probe(ov08d10->dev, PTR_ERR(ov08d10->clk),
drivers/media/i2c/ov08d10.c
1395
freq = clk_get_rate(ov08d10->clk);
drivers/media/i2c/ov08d10.c
1397
dev_warn(ov08d10->dev,
drivers/media/i2c/ov08d10.c
1400
ret = ov08d10_get_hwcfg(ov08d10);
drivers/media/i2c/ov08d10.c
1402
dev_err(ov08d10->dev, "failed to get HW configuration: %d",
drivers/media/i2c/ov08d10.c
1407
v4l2_i2c_subdev_init(&ov08d10->sd, client, &ov08d10_subdev_ops);
drivers/media/i2c/ov08d10.c
1409
ret = ov08d10_identify_module(ov08d10);
drivers/media/i2c/ov08d10.c
1411
dev_err(ov08d10->dev, "failed to find sensor: %d", ret);
drivers/media/i2c/ov08d10.c
1415
mutex_init(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1416
ov08d10->cur_mode = &ov08d10->priv_lane->sp_modes[0];
drivers/media/i2c/ov08d10.c
1417
ret = ov08d10_init_controls(ov08d10);
drivers/media/i2c/ov08d10.c
1419
dev_err(ov08d10->dev, "failed to init controls: %d", ret);
drivers/media/i2c/ov08d10.c
1423
ov08d10->sd.internal_ops = &ov08d10_internal_ops;
drivers/media/i2c/ov08d10.c
1424
ov08d10->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/ov08d10.c
1425
ov08d10->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/ov08d10.c
1426
ov08d10->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/ov08d10.c
1427
ret = media_entity_pads_init(&ov08d10->sd.entity, 1, &ov08d10->pad);
drivers/media/i2c/ov08d10.c
1429
dev_err(ov08d10->dev, "failed to init entity pads: %d", ret);
drivers/media/i2c/ov08d10.c
1433
ret = v4l2_async_register_subdev_sensor(&ov08d10->sd);
drivers/media/i2c/ov08d10.c
1435
dev_err(ov08d10->dev, "failed to register V4L2 subdev: %d",
drivers/media/i2c/ov08d10.c
1444
pm_runtime_set_active(ov08d10->dev);
drivers/media/i2c/ov08d10.c
1445
pm_runtime_enable(ov08d10->dev);
drivers/media/i2c/ov08d10.c
1446
pm_runtime_idle(ov08d10->dev);
drivers/media/i2c/ov08d10.c
1451
media_entity_cleanup(&ov08d10->sd.entity);
drivers/media/i2c/ov08d10.c
1454
v4l2_ctrl_handler_free(ov08d10->sd.ctrl_handler);
drivers/media/i2c/ov08d10.c
1455
mutex_destroy(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
613
static u32 ov08d10_get_format_code(struct ov08d10 *ov08d10)
drivers/media/i2c/ov08d10.c
620
return codes[ov08d10->vflip->val][ov08d10->hflip->val];
drivers/media/i2c/ov08d10.c
623
static unsigned int ov08d10_modes_num(const struct ov08d10 *ov08d10)
drivers/media/i2c/ov08d10.c
627
for (i = 0; i < ARRAY_SIZE(ov08d10->priv_lane->sp_modes); i++) {
drivers/media/i2c/ov08d10.c
628
if (ov08d10->priv_lane->sp_modes[i].width == 0)
drivers/media/i2c/ov08d10.c
656
static int ov08d10_write_reg_list(struct ov08d10 *ov08d10,
drivers/media/i2c/ov08d10.c
659
struct i2c_client *client = v4l2_get_subdevdata(&ov08d10->sd);
drivers/media/i2c/ov08d10.c
667
dev_err_ratelimited(ov08d10->dev,
drivers/media/i2c/ov08d10.c
677
static int ov08d10_update_analog_gain(struct ov08d10 *ov08d10, u32 a_gain)
drivers/media/i2c/ov08d10.c
679
struct i2c_client *client = v4l2_get_subdevdata(&ov08d10->sd);
drivers/media/i2c/ov08d10.c
68
#define to_ov08d10(_sd) container_of(_sd, struct ov08d10, sd)
drivers/media/i2c/ov08d10.c
698
static int ov08d10_update_digital_gain(struct ov08d10 *ov08d10, u32 d_gain)
drivers/media/i2c/ov08d10.c
700
struct i2c_client *client = v4l2_get_subdevdata(&ov08d10->sd);
drivers/media/i2c/ov08d10.c
725
static int ov08d10_set_exposure(struct ov08d10 *ov08d10, u32 exposure)
drivers/media/i2c/ov08d10.c
727
struct i2c_client *client = v4l2_get_subdevdata(&ov08d10->sd);
drivers/media/i2c/ov08d10.c
733
cur_vts = ov08d10->cur_mode->vts_def;
drivers/media/i2c/ov08d10.c
768
static int ov08d10_set_vblank(struct ov08d10 *ov08d10, u32 vblank)
drivers/media/i2c/ov08d10.c
770
struct i2c_client *client = v4l2_get_subdevdata(&ov08d10->sd);
drivers/media/i2c/ov08d10.c
794
static int ov08d10_test_pattern(struct ov08d10 *ov08d10, u32 pattern)
drivers/media/i2c/ov08d10.c
796
struct i2c_client *client = v4l2_get_subdevdata(&ov08d10->sd);
drivers/media/i2c/ov08d10.c
819
static int ov08d10_set_ctrl_flip(struct ov08d10 *ov08d10, u32 ctrl_val)
drivers/media/i2c/ov08d10.c
821
struct i2c_client *client = v4l2_get_subdevdata(&ov08d10->sd);
drivers/media/i2c/ov08d10.c
851
struct ov08d10 *ov08d10 = container_of(ctrl->handler,
drivers/media/i2c/ov08d10.c
852
struct ov08d10, ctrl_handler);
drivers/media/i2c/ov08d10.c
859
exposure_max = ov08d10->cur_mode->height + ctrl->val -
drivers/media/i2c/ov08d10.c
861
__v4l2_ctrl_modify_range(ov08d10->exposure,
drivers/media/i2c/ov08d10.c
862
ov08d10->exposure->minimum,
drivers/media/i2c/ov08d10.c
863
exposure_max, ov08d10->exposure->step,
drivers/media/i2c/ov08d10.c
868
if (!pm_runtime_get_if_in_use(ov08d10->dev))
drivers/media/i2c/ov08d10.c
873
ret = ov08d10_update_analog_gain(ov08d10, ctrl->val);
drivers/media/i2c/ov08d10.c
877
ret = ov08d10_update_digital_gain(ov08d10, ctrl->val);
drivers/media/i2c/ov08d10.c
881
ret = ov08d10_set_exposure(ov08d10, ctrl->val);
drivers/media/i2c/ov08d10.c
885
ret = ov08d10_set_vblank(ov08d10, ctrl->val);
drivers/media/i2c/ov08d10.c
889
ret = ov08d10_test_pattern(ov08d10, ctrl->val);
drivers/media/i2c/ov08d10.c
894
ret = ov08d10_set_ctrl_flip(ov08d10,
drivers/media/i2c/ov08d10.c
895
ov08d10->hflip->val |
drivers/media/i2c/ov08d10.c
896
ov08d10->vflip->val << 1);
drivers/media/i2c/ov08d10.c
904
pm_runtime_put(ov08d10->dev);
drivers/media/i2c/ov08d10.c
913
static int ov08d10_init_controls(struct ov08d10 *ov08d10)
drivers/media/i2c/ov08d10.c
925
ctrl_hdlr = &ov08d10->ctrl_handler;
drivers/media/i2c/ov08d10.c
930
ctrl_hdlr->lock = &ov08d10->mutex;
drivers/media/i2c/ov08d10.c
931
link_freq_size = ARRAY_SIZE(ov08d10->priv_lane->link_freq_menu);
drivers/media/i2c/ov08d10.c
932
ov08d10->link_freq =
drivers/media/i2c/ov08d10.c
937
ov08d10->priv_lane->link_freq_menu);
drivers/media/i2c/ov08d10.c
938
if (ov08d10->link_freq)
drivers/media/i2c/ov08d10.c
939
ov08d10->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/ov08d10.c
941
pixel_rate_max = to_rate(ov08d10->priv_lane->link_freq_menu, 0,
drivers/media/i2c/ov08d10.c
942
ov08d10->cur_mode->data_lanes);
drivers/media/i2c/ov08d10.c
943
ov08d10->pixel_rate =
drivers/media/i2c/ov08d10.c
948
mode = ov08d10->cur_mode;
drivers/media/i2c/ov08d10.c
951
ov08d10->vblank =
drivers/media/i2c/ov08d10.c
957
h_blank = to_pixels_per_line(ov08d10->priv_lane->link_freq_menu,
drivers/media/i2c/ov08d10.c
961
ov08d10->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov08d10_ctrl_ops,
drivers/media/i2c/ov08d10.c
964
if (ov08d10->hblank)
drivers/media/i2c/ov08d10.c
965
ov08d10->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/ov08d10.c
976
ov08d10->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &ov08d10_ctrl_ops,
drivers/media/i2c/ov08d10.c
988
ov08d10->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &ov08d10_ctrl_ops,
drivers/media/i2c/ov08d10.c
990
if (ov08d10->hflip)
drivers/media/i2c/ov08d10.c
991
ov08d10->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/ov08d10.c
992
ov08d10->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &ov08d10_ctrl_ops,
drivers/media/i2c/ov08d10.c
994
if (ov08d10->vflip)
drivers/media/i2c/ov08d10.c
995
ov08d10->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;