Symbol: ov08d10
drivers/media/i2c/ov08d10.c
1000
ov08d10->vblank =
drivers/media/i2c/ov08d10.c
1006
h_blank = to_pixels_per_line(ov08d10->priv_lane->link_freq_menu,
drivers/media/i2c/ov08d10.c
1010
ov08d10->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov08d10_ctrl_ops,
drivers/media/i2c/ov08d10.c
1013
if (ov08d10->hblank)
drivers/media/i2c/ov08d10.c
1014
ov08d10->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/ov08d10.c
1025
ov08d10->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &ov08d10_ctrl_ops,
drivers/media/i2c/ov08d10.c
1037
ov08d10->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &ov08d10_ctrl_ops,
drivers/media/i2c/ov08d10.c
1039
if (ov08d10->hflip)
drivers/media/i2c/ov08d10.c
1040
ov08d10->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/ov08d10.c
1041
ov08d10->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &ov08d10_ctrl_ops,
drivers/media/i2c/ov08d10.c
1043
if (ov08d10->vflip)
drivers/media/i2c/ov08d10.c
1044
ov08d10->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
drivers/media/i2c/ov08d10.c
1049
ov08d10->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/ov08d10.c
1054
static void ov08d10_update_pad_format(struct ov08d10 *ov08d10,
drivers/media/i2c/ov08d10.c
1060
fmt->code = ov08d10_get_format_code(ov08d10);
drivers/media/i2c/ov08d10.c
1064
static int ov08d10_start_streaming(struct ov08d10 *ov08d10)
drivers/media/i2c/ov08d10.c
1066
struct i2c_client *client = v4l2_get_subdevdata(&ov08d10->sd);
drivers/media/i2c/ov08d10.c
1070
link_freq_index = ov08d10->cur_mode->link_freq_index;
drivers/media/i2c/ov08d10.c
1072
&ov08d10->priv_lane->link_freq_configs[link_freq_index]
drivers/media/i2c/ov08d10.c
1073
.reg_list[ov08d10->xvclk_index];
drivers/media/i2c/ov08d10.c
1078
dev_err(ov08d10->dev, "failed to reset sensor\n");
drivers/media/i2c/ov08d10.c
1083
dev_err(ov08d10->dev, "failed to reset sensor\n");
drivers/media/i2c/ov08d10.c
1089
dev_err(ov08d10->dev, "failed to reset sensor\n");
drivers/media/i2c/ov08d10.c
1094
ret = ov08d10_write_reg_list(ov08d10, reg_list);
drivers/media/i2c/ov08d10.c
1096
dev_err(ov08d10->dev, "failed to set plls\n");
drivers/media/i2c/ov08d10.c
1100
reg_list = &ov08d10->cur_mode->reg_list;
drivers/media/i2c/ov08d10.c
1101
ret = ov08d10_write_reg_list(ov08d10, reg_list);
drivers/media/i2c/ov08d10.c
1103
dev_err(ov08d10->dev, "failed to set mode\n");
drivers/media/i2c/ov08d10.c
1107
ret = __v4l2_ctrl_handler_setup(ov08d10->sd.ctrl_handler);
drivers/media/i2c/ov08d10.c
1123
static void ov08d10_stop_streaming(struct ov08d10 *ov08d10)
drivers/media/i2c/ov08d10.c
1125
struct i2c_client *client = v4l2_get_subdevdata(&ov08d10->sd);
drivers/media/i2c/ov08d10.c
1130
dev_err(ov08d10->dev, "failed to stop streaming\n");
drivers/media/i2c/ov08d10.c
1136
dev_err(ov08d10->dev, "failed to stop streaming\n");
drivers/media/i2c/ov08d10.c
1142
dev_err(ov08d10->dev, "failed to stop streaming\n");
drivers/media/i2c/ov08d10.c
1149
struct ov08d10 *ov08d10 = to_ov08d10(sd);
drivers/media/i2c/ov08d10.c
1152
mutex_lock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1154
ret = pm_runtime_resume_and_get(ov08d10->dev);
drivers/media/i2c/ov08d10.c
1156
mutex_unlock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1160
ret = ov08d10_start_streaming(ov08d10);
drivers/media/i2c/ov08d10.c
1163
ov08d10_stop_streaming(ov08d10);
drivers/media/i2c/ov08d10.c
1164
pm_runtime_put(ov08d10->dev);
drivers/media/i2c/ov08d10.c
1167
ov08d10_stop_streaming(ov08d10);
drivers/media/i2c/ov08d10.c
1168
pm_runtime_put(ov08d10->dev);
drivers/media/i2c/ov08d10.c
1172
__v4l2_ctrl_grab(ov08d10->vflip, enable);
drivers/media/i2c/ov08d10.c
1173
__v4l2_ctrl_grab(ov08d10->hflip, enable);
drivers/media/i2c/ov08d10.c
1175
mutex_unlock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1184
struct ov08d10 *ov08d10 = to_ov08d10(sd);
drivers/media/i2c/ov08d10.c
1189
mode = v4l2_find_nearest_size(ov08d10->priv_lane->sp_modes,
drivers/media/i2c/ov08d10.c
1190
ov08d10->modes_size,
drivers/media/i2c/ov08d10.c
1194
mutex_lock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1195
ov08d10_update_pad_format(ov08d10, mode, &fmt->format);
drivers/media/i2c/ov08d10.c
1200
ov08d10->cur_mode = mode;
drivers/media/i2c/ov08d10.c
1201
__v4l2_ctrl_s_ctrl(ov08d10->link_freq, mode->link_freq_index);
drivers/media/i2c/ov08d10.c
1202
pixel_rate = to_rate(ov08d10->priv_lane->link_freq_menu,
drivers/media/i2c/ov08d10.c
1204
ov08d10->cur_mode->data_lanes);
drivers/media/i2c/ov08d10.c
1205
__v4l2_ctrl_s_ctrl_int64(ov08d10->pixel_rate, pixel_rate);
drivers/media/i2c/ov08d10.c
1209
__v4l2_ctrl_modify_range(ov08d10->vblank,
drivers/media/i2c/ov08d10.c
1213
__v4l2_ctrl_s_ctrl(ov08d10->vblank, vblank_def);
drivers/media/i2c/ov08d10.c
1214
h_blank = to_pixels_per_line(ov08d10->priv_lane->link_freq_menu,
drivers/media/i2c/ov08d10.c
1217
ov08d10->cur_mode->data_lanes)
drivers/media/i2c/ov08d10.c
1219
__v4l2_ctrl_modify_range(ov08d10->hblank, h_blank, h_blank, 1,
drivers/media/i2c/ov08d10.c
1223
mutex_unlock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1232
struct ov08d10 *ov08d10 = to_ov08d10(sd);
drivers/media/i2c/ov08d10.c
1234
mutex_lock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1239
ov08d10_update_pad_format(ov08d10, ov08d10->cur_mode,
drivers/media/i2c/ov08d10.c
1242
mutex_unlock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1251
struct ov08d10 *ov08d10 = to_ov08d10(sd);
drivers/media/i2c/ov08d10.c
1256
mutex_lock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1257
code->code = ov08d10_get_format_code(ov08d10);
drivers/media/i2c/ov08d10.c
1258
mutex_unlock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1267
struct ov08d10 *ov08d10 = to_ov08d10(sd);
drivers/media/i2c/ov08d10.c
1269
if (fse->index >= ov08d10->modes_size)
drivers/media/i2c/ov08d10.c
1272
mutex_lock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1273
if (fse->code != ov08d10_get_format_code(ov08d10)) {
drivers/media/i2c/ov08d10.c
1274
mutex_unlock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1277
mutex_unlock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1279
fse->min_width = ov08d10->priv_lane->sp_modes[fse->index].width;
drivers/media/i2c/ov08d10.c
1281
fse->min_height = ov08d10->priv_lane->sp_modes[fse->index].height;
drivers/media/i2c/ov08d10.c
1289
struct ov08d10 *ov08d10 = to_ov08d10(sd);
drivers/media/i2c/ov08d10.c
1291
mutex_lock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1292
ov08d10_update_pad_format(ov08d10, &ov08d10->priv_lane->sp_modes[0],
drivers/media/i2c/ov08d10.c
1294
mutex_unlock(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1322
struct ov08d10 *ov08d10 = to_ov08d10(sd);
drivers/media/i2c/ov08d10.c
1324
reset_control_assert(ov08d10->reset);
drivers/media/i2c/ov08d10.c
1326
regulator_bulk_disable(ARRAY_SIZE(ov08d10->supplies),
drivers/media/i2c/ov08d10.c
1327
ov08d10->supplies);
drivers/media/i2c/ov08d10.c
1329
clk_disable_unprepare(ov08d10->clk);
drivers/media/i2c/ov08d10.c
1337
struct ov08d10 *ov08d10 = to_ov08d10(sd);
drivers/media/i2c/ov08d10.c
1340
ret = regulator_bulk_enable(ARRAY_SIZE(ov08d10->supplies),
drivers/media/i2c/ov08d10.c
1341
ov08d10->supplies);
drivers/media/i2c/ov08d10.c
1347
ret = clk_prepare_enable(ov08d10->clk);
drivers/media/i2c/ov08d10.c
1349
regulator_bulk_disable(ARRAY_SIZE(ov08d10->supplies),
drivers/media/i2c/ov08d10.c
1350
ov08d10->supplies);
drivers/media/i2c/ov08d10.c
1356
if (ov08d10->reset) {
drivers/media/i2c/ov08d10.c
1360
reset_control_deassert(ov08d10->reset);
drivers/media/i2c/ov08d10.c
1369
static int ov08d10_identify_module(struct ov08d10 *ov08d10)
drivers/media/i2c/ov08d10.c
1371
struct i2c_client *client = v4l2_get_subdevdata(&ov08d10->sd);
drivers/media/i2c/ov08d10.c
1395
dev_err(ov08d10->dev, "unexpected sensor id(0x%04x)\n",
drivers/media/i2c/ov08d10.c
1403
static int ov08d10_get_hwcfg(struct ov08d10 *ov08d10)
drivers/media/i2c/ov08d10.c
1405
struct device *dev = ov08d10->dev;
drivers/media/i2c/ov08d10.c
1434
dev_dbg(dev, "Using %u data lanes\n", ov08d10->cur_mode->data_lanes);
drivers/media/i2c/ov08d10.c
1436
ov08d10->priv_lane = &lane_cfg_2;
drivers/media/i2c/ov08d10.c
1437
ov08d10->modes_size = ov08d10_modes_num(ov08d10);
drivers/media/i2c/ov08d10.c
1445
for (i = 0; i < ARRAY_SIZE(ov08d10->priv_lane->link_freq_menu); i++) {
drivers/media/i2c/ov08d10.c
1447
if (ov08d10->priv_lane->link_freq_menu[i] ==
drivers/media/i2c/ov08d10.c
1454
ov08d10->priv_lane->link_freq_menu[i]);
drivers/media/i2c/ov08d10.c
1469
struct ov08d10 *ov08d10 = to_ov08d10(sd);
drivers/media/i2c/ov08d10.c
1474
pm_runtime_disable(ov08d10->dev);
drivers/media/i2c/ov08d10.c
1475
if (!pm_runtime_status_suspended(ov08d10->dev)) {
drivers/media/i2c/ov08d10.c
1476
ov08d10_power_off(ov08d10->dev);
drivers/media/i2c/ov08d10.c
1477
pm_runtime_set_suspended(ov08d10->dev);
drivers/media/i2c/ov08d10.c
1479
mutex_destroy(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1484
struct ov08d10 *ov08d10;
drivers/media/i2c/ov08d10.c
1489
ov08d10 = devm_kzalloc(&client->dev, sizeof(*ov08d10), GFP_KERNEL);
drivers/media/i2c/ov08d10.c
1490
if (!ov08d10)
drivers/media/i2c/ov08d10.c
1493
ov08d10->dev = &client->dev;
drivers/media/i2c/ov08d10.c
1495
ov08d10->clk = devm_v4l2_sensor_clk_get(ov08d10->dev, NULL);
drivers/media/i2c/ov08d10.c
1496
if (IS_ERR(ov08d10->clk))
drivers/media/i2c/ov08d10.c
1497
return dev_err_probe(ov08d10->dev, PTR_ERR(ov08d10->clk),
drivers/media/i2c/ov08d10.c
1500
freq = clk_get_rate(ov08d10->clk);
drivers/media/i2c/ov08d10.c
1506
return dev_err_probe(ov08d10->dev, -EINVAL,
drivers/media/i2c/ov08d10.c
1509
ov08d10->xvclk_index = i;
drivers/media/i2c/ov08d10.c
1511
ret = ov08d10_get_hwcfg(ov08d10);
drivers/media/i2c/ov08d10.c
1513
dev_err(ov08d10->dev, "failed to get HW configuration: %d\n",
drivers/media/i2c/ov08d10.c
1518
ov08d10->reset = devm_reset_control_get_optional_exclusive(ov08d10->dev, NULL);
drivers/media/i2c/ov08d10.c
1519
if (IS_ERR(ov08d10->reset))
drivers/media/i2c/ov08d10.c
1520
return dev_err_probe(ov08d10->dev, PTR_ERR(ov08d10->reset),
drivers/media/i2c/ov08d10.c
1522
reset_control_assert(ov08d10->reset);
drivers/media/i2c/ov08d10.c
1525
ov08d10->supplies[i].supply = ov08d10_supply_names[i];
drivers/media/i2c/ov08d10.c
1527
ret = devm_regulator_bulk_get(ov08d10->dev,
drivers/media/i2c/ov08d10.c
1528
ARRAY_SIZE(ov08d10->supplies),
drivers/media/i2c/ov08d10.c
1529
ov08d10->supplies);
drivers/media/i2c/ov08d10.c
1531
return dev_err_probe(ov08d10->dev, ret,
drivers/media/i2c/ov08d10.c
1534
v4l2_i2c_subdev_init(&ov08d10->sd, client, &ov08d10_subdev_ops);
drivers/media/i2c/ov08d10.c
1536
ret = ov08d10_power_on(ov08d10->dev);
drivers/media/i2c/ov08d10.c
1538
return dev_err_probe(ov08d10->dev, ret, "failed to power on\n");
drivers/media/i2c/ov08d10.c
1540
ret = ov08d10_identify_module(ov08d10);
drivers/media/i2c/ov08d10.c
1542
dev_err(ov08d10->dev, "failed to find sensor: %d\n", ret);
drivers/media/i2c/ov08d10.c
1546
mutex_init(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1547
ov08d10->cur_mode = &ov08d10->priv_lane->sp_modes[0];
drivers/media/i2c/ov08d10.c
1548
ret = ov08d10_init_controls(ov08d10);
drivers/media/i2c/ov08d10.c
1550
dev_err(ov08d10->dev, "failed to init controls: %d\n", ret);
drivers/media/i2c/ov08d10.c
1554
ov08d10->sd.internal_ops = &ov08d10_internal_ops;
drivers/media/i2c/ov08d10.c
1555
ov08d10->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/ov08d10.c
1556
ov08d10->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/ov08d10.c
1557
ov08d10->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/ov08d10.c
1558
ret = media_entity_pads_init(&ov08d10->sd.entity, 1, &ov08d10->pad);
drivers/media/i2c/ov08d10.c
1560
dev_err(ov08d10->dev, "failed to init entity pads: %d\n", ret);
drivers/media/i2c/ov08d10.c
1564
pm_runtime_set_active(ov08d10->dev);
drivers/media/i2c/ov08d10.c
1565
pm_runtime_enable(ov08d10->dev);
drivers/media/i2c/ov08d10.c
1567
ret = v4l2_async_register_subdev_sensor(&ov08d10->sd);
drivers/media/i2c/ov08d10.c
1569
dev_err(ov08d10->dev, "failed to register V4L2 subdev: %d\n",
drivers/media/i2c/ov08d10.c
1574
pm_runtime_idle(ov08d10->dev);
drivers/media/i2c/ov08d10.c
1579
pm_runtime_disable(ov08d10->dev);
drivers/media/i2c/ov08d10.c
1580
pm_runtime_set_suspended(ov08d10->dev);
drivers/media/i2c/ov08d10.c
1581
media_entity_cleanup(&ov08d10->sd.entity);
drivers/media/i2c/ov08d10.c
1584
v4l2_ctrl_handler_free(ov08d10->sd.ctrl_handler);
drivers/media/i2c/ov08d10.c
1585
mutex_destroy(&ov08d10->mutex);
drivers/media/i2c/ov08d10.c
1588
ov08d10_power_off(ov08d10->dev);
drivers/media/i2c/ov08d10.c
662
static u32 ov08d10_get_format_code(struct ov08d10 *ov08d10)
drivers/media/i2c/ov08d10.c
669
return codes[ov08d10->vflip->val][ov08d10->hflip->val];
drivers/media/i2c/ov08d10.c
672
static unsigned int ov08d10_modes_num(const struct ov08d10 *ov08d10)
drivers/media/i2c/ov08d10.c
676
for (i = 0; i < ARRAY_SIZE(ov08d10->priv_lane->sp_modes); i++) {
drivers/media/i2c/ov08d10.c
677
if (ov08d10->priv_lane->sp_modes[i].width == 0)
drivers/media/i2c/ov08d10.c
68
#define to_ov08d10(_sd) container_of(_sd, struct ov08d10, sd)
drivers/media/i2c/ov08d10.c
705
static int ov08d10_write_reg_list(struct ov08d10 *ov08d10,
drivers/media/i2c/ov08d10.c
708
struct i2c_client *client = v4l2_get_subdevdata(&ov08d10->sd);
drivers/media/i2c/ov08d10.c
716
dev_err_ratelimited(ov08d10->dev,
drivers/media/i2c/ov08d10.c
726
static int ov08d10_update_analog_gain(struct ov08d10 *ov08d10, u32 a_gain)
drivers/media/i2c/ov08d10.c
728
struct i2c_client *client = v4l2_get_subdevdata(&ov08d10->sd);
drivers/media/i2c/ov08d10.c
747
static int ov08d10_update_digital_gain(struct ov08d10 *ov08d10, u32 d_gain)
drivers/media/i2c/ov08d10.c
749
struct i2c_client *client = v4l2_get_subdevdata(&ov08d10->sd);
drivers/media/i2c/ov08d10.c
774
static int ov08d10_set_exposure(struct ov08d10 *ov08d10, u32 exposure)
drivers/media/i2c/ov08d10.c
776
struct i2c_client *client = v4l2_get_subdevdata(&ov08d10->sd);
drivers/media/i2c/ov08d10.c
782
cur_vts = ov08d10->cur_mode->vts_def;
drivers/media/i2c/ov08d10.c
817
static int ov08d10_set_vblank(struct ov08d10 *ov08d10, u32 vblank)
drivers/media/i2c/ov08d10.c
819
struct i2c_client *client = v4l2_get_subdevdata(&ov08d10->sd);
drivers/media/i2c/ov08d10.c
843
static int ov08d10_test_pattern(struct ov08d10 *ov08d10, u32 pattern)
drivers/media/i2c/ov08d10.c
845
struct i2c_client *client = v4l2_get_subdevdata(&ov08d10->sd);
drivers/media/i2c/ov08d10.c
868
static int ov08d10_set_ctrl_flip(struct ov08d10 *ov08d10, u32 ctrl_val)
drivers/media/i2c/ov08d10.c
870
struct i2c_client *client = v4l2_get_subdevdata(&ov08d10->sd);
drivers/media/i2c/ov08d10.c
900
struct ov08d10 *ov08d10 = container_of(ctrl->handler,
drivers/media/i2c/ov08d10.c
901
struct ov08d10, ctrl_handler);
drivers/media/i2c/ov08d10.c
908
exposure_max = ov08d10->cur_mode->height + ctrl->val -
drivers/media/i2c/ov08d10.c
910
__v4l2_ctrl_modify_range(ov08d10->exposure,
drivers/media/i2c/ov08d10.c
911
ov08d10->exposure->minimum,
drivers/media/i2c/ov08d10.c
912
exposure_max, ov08d10->exposure->step,
drivers/media/i2c/ov08d10.c
917
if (!pm_runtime_get_if_in_use(ov08d10->dev))
drivers/media/i2c/ov08d10.c
922
ret = ov08d10_update_analog_gain(ov08d10, ctrl->val);
drivers/media/i2c/ov08d10.c
926
ret = ov08d10_update_digital_gain(ov08d10, ctrl->val);
drivers/media/i2c/ov08d10.c
930
ret = ov08d10_set_exposure(ov08d10, ctrl->val);
drivers/media/i2c/ov08d10.c
934
ret = ov08d10_set_vblank(ov08d10, ctrl->val);
drivers/media/i2c/ov08d10.c
938
ret = ov08d10_test_pattern(ov08d10, ctrl->val);
drivers/media/i2c/ov08d10.c
943
ret = ov08d10_set_ctrl_flip(ov08d10,
drivers/media/i2c/ov08d10.c
944
ov08d10->hflip->val |
drivers/media/i2c/ov08d10.c
945
ov08d10->vflip->val << 1);
drivers/media/i2c/ov08d10.c
953
pm_runtime_put(ov08d10->dev);
drivers/media/i2c/ov08d10.c
962
static int ov08d10_init_controls(struct ov08d10 *ov08d10)
drivers/media/i2c/ov08d10.c
974
ctrl_hdlr = &ov08d10->ctrl_handler;
drivers/media/i2c/ov08d10.c
979
ctrl_hdlr->lock = &ov08d10->mutex;
drivers/media/i2c/ov08d10.c
980
link_freq_size = ARRAY_SIZE(ov08d10->priv_lane->link_freq_menu);
drivers/media/i2c/ov08d10.c
981
ov08d10->link_freq =
drivers/media/i2c/ov08d10.c
986
ov08d10->priv_lane->link_freq_menu);
drivers/media/i2c/ov08d10.c
987
if (ov08d10->link_freq)
drivers/media/i2c/ov08d10.c
988
ov08d10->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/ov08d10.c
990
pixel_rate_max = to_rate(ov08d10->priv_lane->link_freq_menu, 0,
drivers/media/i2c/ov08d10.c
991
ov08d10->cur_mode->data_lanes);
drivers/media/i2c/ov08d10.c
992
ov08d10->pixel_rate =
drivers/media/i2c/ov08d10.c
997
mode = ov08d10->cur_mode;