Symbol: ov9282
drivers/media/i2c/ov9282.c
1000
ov9282->supplies);
drivers/media/i2c/ov9282.c
1009
static int ov9282_parse_hw_config(struct ov9282 *ov9282)
drivers/media/i2c/ov9282.c
1011
struct fwnode_handle *fwnode = dev_fwnode(ov9282->dev);
drivers/media/i2c/ov9282.c
1024
ov9282->reset_gpio = devm_gpiod_get_optional(ov9282->dev, "reset",
drivers/media/i2c/ov9282.c
1026
if (IS_ERR(ov9282->reset_gpio)) {
drivers/media/i2c/ov9282.c
1027
dev_err(ov9282->dev, "failed to get reset gpio %pe",
drivers/media/i2c/ov9282.c
1028
ov9282->reset_gpio);
drivers/media/i2c/ov9282.c
1029
return PTR_ERR(ov9282->reset_gpio);
drivers/media/i2c/ov9282.c
1033
ov9282->inclk = devm_v4l2_sensor_clk_get(ov9282->dev, NULL);
drivers/media/i2c/ov9282.c
1034
if (IS_ERR(ov9282->inclk))
drivers/media/i2c/ov9282.c
1035
return dev_err_probe(ov9282->dev, PTR_ERR(ov9282->inclk),
drivers/media/i2c/ov9282.c
1038
ret = ov9282_configure_regulators(ov9282);
drivers/media/i2c/ov9282.c
1040
return dev_err_probe(ov9282->dev, ret,
drivers/media/i2c/ov9282.c
1043
rate = clk_get_rate(ov9282->inclk);
drivers/media/i2c/ov9282.c
1045
dev_err(ov9282->dev, "inclk frequency mismatch");
drivers/media/i2c/ov9282.c
1058
ov9282->noncontinuous_clock =
drivers/media/i2c/ov9282.c
1062
dev_err(ov9282->dev,
drivers/media/i2c/ov9282.c
1070
dev_err(ov9282->dev, "no link frequencies defined");
drivers/media/i2c/ov9282.c
1120
struct ov9282 *ov9282 = to_ov9282(sd);
drivers/media/i2c/ov9282.c
1123
ret = regulator_bulk_enable(OV9282_NUM_SUPPLIES, ov9282->supplies);
drivers/media/i2c/ov9282.c
1131
gpiod_set_value_cansleep(ov9282->reset_gpio, 1);
drivers/media/i2c/ov9282.c
1133
ret = clk_prepare_enable(ov9282->inclk);
drivers/media/i2c/ov9282.c
1135
dev_err(ov9282->dev, "fail to enable inclk");
drivers/media/i2c/ov9282.c
1141
ret = cci_write(ov9282->regmap, OV9282_REG_MIPI_CTRL00,
drivers/media/i2c/ov9282.c
1142
ov9282->noncontinuous_clock ? OV9282_GATED_CLOCK : 0, NULL);
drivers/media/i2c/ov9282.c
1144
dev_err(ov9282->dev, "fail to write MIPI_CTRL00");
drivers/media/i2c/ov9282.c
1151
clk_disable_unprepare(ov9282->inclk);
drivers/media/i2c/ov9282.c
1153
gpiod_set_value_cansleep(ov9282->reset_gpio, 0);
drivers/media/i2c/ov9282.c
1155
regulator_bulk_disable(OV9282_NUM_SUPPLIES, ov9282->supplies);
drivers/media/i2c/ov9282.c
1163
struct ov9282 *ov9282 = to_ov9282(sd);
drivers/media/i2c/ov9282.c
1165
gpiod_set_value_cansleep(ov9282->reset_gpio, 0);
drivers/media/i2c/ov9282.c
1167
clk_disable_unprepare(ov9282->inclk);
drivers/media/i2c/ov9282.c
1169
regulator_bulk_disable(OV9282_NUM_SUPPLIES, ov9282->supplies);
drivers/media/i2c/ov9282.c
1180
static int ov9282_init_controls(struct ov9282 *ov9282)
drivers/media/i2c/ov9282.c
1182
struct v4l2_ctrl_handler *ctrl_hdlr = &ov9282->ctrl_handler;
drivers/media/i2c/ov9282.c
1183
const struct ov9282_mode *mode = ov9282->cur_mode;
drivers/media/i2c/ov9282.c
1196
ov9282->exp_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/ov9282.c
1204
ov9282->again_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/ov9282.c
1212
v4l2_ctrl_cluster(2, &ov9282->exp_ctrl);
drivers/media/i2c/ov9282.c
1214
ov9282->vblank_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/ov9282.c
1228
ov9282->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &ov9282_ctrl_ops,
drivers/media/i2c/ov9282.c
1234
ov9282->link_freq_ctrl = v4l2_ctrl_new_int_menu(ctrl_hdlr,
drivers/media/i2c/ov9282.c
1241
if (ov9282->link_freq_ctrl)
drivers/media/i2c/ov9282.c
1242
ov9282->link_freq_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/ov9282.c
1244
hblank_min = mode->hblank_min[ov9282->noncontinuous_clock ? 0 : 1];
drivers/media/i2c/ov9282.c
1245
ov9282->hblank_ctrl = v4l2_ctrl_new_std(ctrl_hdlr,
drivers/media/i2c/ov9282.c
1256
exposure_us = ov9282_exposure_to_us(ov9282, OV9282_EXPOSURE_DEFAULT);
drivers/media/i2c/ov9282.c
1257
ov9282->flash_duration =
drivers/media/i2c/ov9282.c
1262
ret = v4l2_fwnode_device_parse(ov9282->dev, &props);
drivers/media/i2c/ov9282.c
1270
dev_err(ov9282->dev, "control init failed: %d",
drivers/media/i2c/ov9282.c
1276
ov9282->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/ov9282.c
1283
struct ov9282 *ov9282;
drivers/media/i2c/ov9282.c
1286
ov9282 = devm_kzalloc(&client->dev, sizeof(*ov9282), GFP_KERNEL);
drivers/media/i2c/ov9282.c
1287
if (!ov9282)
drivers/media/i2c/ov9282.c
1290
ov9282->dev = &client->dev;
drivers/media/i2c/ov9282.c
1293
v4l2_i2c_subdev_init(&ov9282->sd, client, &ov9282_subdev_ops);
drivers/media/i2c/ov9282.c
1294
ov9282->sd.internal_ops = &ov9282_internal_ops;
drivers/media/i2c/ov9282.c
1295
v4l2_i2c_subdev_set_name(&ov9282->sd, client,
drivers/media/i2c/ov9282.c
1296
device_get_match_data(ov9282->dev), NULL);
drivers/media/i2c/ov9282.c
1298
ret = ov9282_parse_hw_config(ov9282);
drivers/media/i2c/ov9282.c
1300
dev_err(ov9282->dev, "HW configuration is not supported");
drivers/media/i2c/ov9282.c
1304
ov9282->regmap = devm_cci_regmap_init_i2c(client, 16);
drivers/media/i2c/ov9282.c
1305
if (IS_ERR(ov9282->regmap))
drivers/media/i2c/ov9282.c
1306
return dev_err_probe(ov9282->dev, PTR_ERR(ov9282->regmap),
drivers/media/i2c/ov9282.c
1309
ret = ov9282_power_on(ov9282->dev);
drivers/media/i2c/ov9282.c
1311
return dev_err_probe(ov9282->dev, ret,
drivers/media/i2c/ov9282.c
1315
ret = ov9282_detect(ov9282);
drivers/media/i2c/ov9282.c
1317
dev_err(ov9282->dev, "failed to find sensor: %d", ret);
drivers/media/i2c/ov9282.c
1322
ov9282->cur_mode = &supported_modes[DEFAULT_MODE];
drivers/media/i2c/ov9282.c
1323
ov9282->code = MEDIA_BUS_FMT_Y10_1X10;
drivers/media/i2c/ov9282.c
1324
ov9282->vblank = ov9282->cur_mode->vblank;
drivers/media/i2c/ov9282.c
1326
ret = ov9282_init_controls(ov9282);
drivers/media/i2c/ov9282.c
1328
dev_err(ov9282->dev, "failed to init controls: %d", ret);
drivers/media/i2c/ov9282.c
1333
ov9282->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
drivers/media/i2c/ov9282.c
1335
ov9282->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/ov9282.c
1338
ov9282->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/ov9282.c
1339
ret = media_entity_pads_init(&ov9282->sd.entity, 1, &ov9282->pad);
drivers/media/i2c/ov9282.c
1341
dev_err(ov9282->dev, "failed to init entity pads: %d", ret);
drivers/media/i2c/ov9282.c
1345
ov9282->sd.state_lock = ov9282->ctrl_handler.lock;
drivers/media/i2c/ov9282.c
1346
ret = v4l2_subdev_init_finalize(&ov9282->sd);
drivers/media/i2c/ov9282.c
1348
dev_err_probe(ov9282->dev, ret, "failed to init subdev\n");
drivers/media/i2c/ov9282.c
1352
pm_runtime_set_active(ov9282->dev);
drivers/media/i2c/ov9282.c
1353
pm_runtime_enable(ov9282->dev);
drivers/media/i2c/ov9282.c
1355
ret = v4l2_async_register_subdev_sensor(&ov9282->sd);
drivers/media/i2c/ov9282.c
1359
pm_runtime_idle(ov9282->dev);
drivers/media/i2c/ov9282.c
1364
v4l2_subdev_cleanup(&ov9282->sd);
drivers/media/i2c/ov9282.c
1365
pm_runtime_disable(ov9282->dev);
drivers/media/i2c/ov9282.c
1366
pm_runtime_set_suspended(ov9282->dev);
drivers/media/i2c/ov9282.c
1368
media_entity_cleanup(&ov9282->sd.entity);
drivers/media/i2c/ov9282.c
1370
v4l2_ctrl_handler_free(ov9282->sd.ctrl_handler);
drivers/media/i2c/ov9282.c
1372
ov9282_power_off(ov9282->dev);
drivers/media/i2c/ov9282.c
471
static inline struct ov9282 *to_ov9282(struct v4l2_subdev *subdev)
drivers/media/i2c/ov9282.c
473
return container_of(subdev, struct ov9282, sd);
drivers/media/i2c/ov9282.c
484
static int ov9282_update_controls(struct ov9282 *ov9282,
drivers/media/i2c/ov9282.c
492
ret = __v4l2_ctrl_s_ctrl(ov9282->link_freq_ctrl, mode->link_freq_idx);
drivers/media/i2c/ov9282.c
498
ret = __v4l2_ctrl_modify_range(ov9282->pixel_rate, pixel_rate,
drivers/media/i2c/ov9282.c
503
hblank_min = mode->hblank_min[ov9282->noncontinuous_clock ? 0 : 1];
drivers/media/i2c/ov9282.c
504
ret = __v4l2_ctrl_modify_range(ov9282->hblank_ctrl, hblank_min,
drivers/media/i2c/ov9282.c
510
return __v4l2_ctrl_modify_range(ov9282->vblank_ctrl, mode->vblank_min,
drivers/media/i2c/ov9282.c
514
static u32 ov9282_exposure_to_us(struct ov9282 *ov9282, u32 exposure)
drivers/media/i2c/ov9282.c
517
u32 frame_width = ov9282->cur_mode->width + ov9282->hblank_ctrl->val;
drivers/media/i2c/ov9282.c
518
u32 trow_us = frame_width / (ov9282->pixel_rate->val / 1000000UL);
drivers/media/i2c/ov9282.c
531
static int ov9282_update_exp_gain(struct ov9282 *ov9282, u32 exposure, u32 gain)
drivers/media/i2c/ov9282.c
533
u32 exposure_us = ov9282_exposure_to_us(ov9282, exposure);
drivers/media/i2c/ov9282.c
536
dev_dbg(ov9282->dev, "Set exp %u (~%u us), analog gain %u",
drivers/media/i2c/ov9282.c
539
ret = cci_write(ov9282->regmap, OV9282_REG_HOLD, 0x01, NULL);
drivers/media/i2c/ov9282.c
543
ret = cci_write(ov9282->regmap, OV9282_REG_EXPOSURE, exposure << 4, NULL);
drivers/media/i2c/ov9282.c
547
ret = cci_write(ov9282->regmap, OV9282_REG_AGAIN, gain, NULL);
drivers/media/i2c/ov9282.c
551
ret = __v4l2_ctrl_modify_range(ov9282->flash_duration,
drivers/media/i2c/ov9282.c
556
ret_hold = cci_write(ov9282->regmap, OV9282_REG_HOLD, 0, NULL);
drivers/media/i2c/ov9282.c
561
static u32 ov9282_us_to_flash_duration(struct ov9282 *ov9282, u32 value)
drivers/media/i2c/ov9282.c
572
u32 frame_width = ov9282->cur_mode->width + ov9282->hblank_ctrl->val;
drivers/media/i2c/ov9282.c
577
static u32 ov9282_flash_duration_to_us(struct ov9282 *ov9282, u32 value)
drivers/media/i2c/ov9282.c
584
u32 frame_width = ov9282->cur_mode->width + ov9282->hblank_ctrl->val;
drivers/media/i2c/ov9282.c
591
struct ov9282 *ov9282 =
drivers/media/i2c/ov9282.c
592
container_of(ctrl->handler, struct ov9282, ctrl_handler);
drivers/media/i2c/ov9282.c
600
ov9282->vblank = ov9282->vblank_ctrl->val;
drivers/media/i2c/ov9282.c
602
dev_dbg(ov9282->dev, "Received vblank %u, new lpfr %u",
drivers/media/i2c/ov9282.c
603
ov9282->vblank,
drivers/media/i2c/ov9282.c
604
ov9282->vblank + ov9282->cur_mode->height);
drivers/media/i2c/ov9282.c
606
ret = __v4l2_ctrl_modify_range(ov9282->exp_ctrl,
drivers/media/i2c/ov9282.c
608
ov9282->vblank +
drivers/media/i2c/ov9282.c
609
ov9282->cur_mode->height -
drivers/media/i2c/ov9282.c
616
if (!pm_runtime_get_if_in_use(ov9282->dev))
drivers/media/i2c/ov9282.c
622
analog_gain = ov9282->again_ctrl->val;
drivers/media/i2c/ov9282.c
624
dev_dbg(ov9282->dev, "Received exp %u, analog gain %u",
drivers/media/i2c/ov9282.c
627
ret = ov9282_update_exp_gain(ov9282, exposure, analog_gain);
drivers/media/i2c/ov9282.c
630
lpfr = ov9282->vblank + ov9282->cur_mode->height;
drivers/media/i2c/ov9282.c
631
ret = cci_write(ov9282->regmap, OV9282_REG_LPFR, lpfr, NULL);
drivers/media/i2c/ov9282.c
634
ret = cci_update_bits(ov9282->regmap, OV9282_REG_TIMING_FORMAT_2,
drivers/media/i2c/ov9282.c
638
ret = cci_update_bits(ov9282->regmap, OV9282_REG_TIMING_FORMAT_1,
drivers/media/i2c/ov9282.c
642
ret = cci_write(ov9282->regmap, OV9282_REG_TIMING_HTS,
drivers/media/i2c/ov9282.c
643
(ctrl->val + ov9282->cur_mode->width) >> 1, NULL);
drivers/media/i2c/ov9282.c
646
ret = cci_update_bits(ov9282->regmap, OV9282_REG_OUTPUT_ENABLE6,
drivers/media/i2c/ov9282.c
651
ret = cci_write(ov9282->regmap, OV9282_REG_STROBE_FRAME_SPAN, ctrl->val, NULL);
drivers/media/i2c/ov9282.c
654
dev_err(ov9282->dev, "Invalid control %d", ctrl->id);
drivers/media/i2c/ov9282.c
658
pm_runtime_put(ov9282->dev);
drivers/media/i2c/ov9282.c
665
struct ov9282 *ov9282 =
drivers/media/i2c/ov9282.c
666
container_of_const(ctrl->handler, struct ov9282, ctrl_handler);
drivers/media/i2c/ov9282.c
670
u32 fd = ov9282_us_to_flash_duration(ov9282, us);
drivers/media/i2c/ov9282.c
673
u32 us0 = ov9282_flash_duration_to_us(ov9282, fd);
drivers/media/i2c/ov9282.c
674
u32 us1 = ov9282_flash_duration_to_us(ov9282, fd + 1);
drivers/media/i2c/ov9282.c
682
dev_dbg(ov9282->dev, "using next valid strobe_duration %u instead of %u\n",
drivers/media/i2c/ov9282.c
748
static void ov9282_fill_pad_format(struct ov9282 *ov9282,
drivers/media/i2c/ov9282.c
767
struct ov9282 *ov9282 = to_ov9282(sd);
drivers/media/i2c/ov9282.c
775
ov9282_fill_pad_format(ov9282, ov9282->cur_mode, ov9282->code,
drivers/media/i2c/ov9282.c
786
struct ov9282 *ov9282 = to_ov9282(sd);
drivers/media/i2c/ov9282.c
801
ov9282_fill_pad_format(ov9282, mode, code, fmt);
drivers/media/i2c/ov9282.c
809
ret = ov9282_update_controls(ov9282, mode, fmt);
drivers/media/i2c/ov9282.c
811
ov9282->cur_mode = mode;
drivers/media/i2c/ov9282.c
812
ov9282->code = code;
drivers/media/i2c/ov9282.c
822
struct ov9282 *ov9282 = to_ov9282(sd);
drivers/media/i2c/ov9282.c
826
ov9282_fill_pad_format(ov9282, &supported_modes[DEFAULT_MODE],
drivers/media/i2c/ov9282.c
827
ov9282->code, &fmt);
drivers/media/i2c/ov9282.c
833
__ov9282_get_pad_crop(struct ov9282 *ov9282,
drivers/media/i2c/ov9282.c
841
return &ov9282->cur_mode->crop;
drivers/media/i2c/ov9282.c
853
struct ov9282 *ov9282 = to_ov9282(sd);
drivers/media/i2c/ov9282.c
855
sel->r = *__ov9282_get_pad_crop(ov9282, sd_state, sel->pad,
drivers/media/i2c/ov9282.c
895
struct ov9282 *ov9282 = to_ov9282(sd);
drivers/media/i2c/ov9282.c
900
ret = pm_runtime_resume_and_get(ov9282->dev);
drivers/media/i2c/ov9282.c
905
ret = cci_multi_reg_write(ov9282->regmap, common_regs,
drivers/media/i2c/ov9282.c
908
dev_err(ov9282->dev, "fail to write common registers");
drivers/media/i2c/ov9282.c
912
bitdepth_index = ov9282->code == MEDIA_BUS_FMT_Y10_1X10 ? 0 : 1;
drivers/media/i2c/ov9282.c
913
ret = cci_multi_reg_write(ov9282->regmap,
drivers/media/i2c/ov9282.c
916
dev_err(ov9282->dev, "fail to write bitdepth regs");
drivers/media/i2c/ov9282.c
921
reg_list = &ov9282->cur_mode->reg_list;
drivers/media/i2c/ov9282.c
922
ret = cci_multi_reg_write(ov9282->regmap, reg_list->regs,
drivers/media/i2c/ov9282.c
925
dev_err(ov9282->dev, "fail to write initial registers");
drivers/media/i2c/ov9282.c
930
ret = __v4l2_ctrl_handler_setup(ov9282->sd.ctrl_handler);
drivers/media/i2c/ov9282.c
932
dev_err(ov9282->dev, "fail to setup handler");
drivers/media/i2c/ov9282.c
937
ret = cci_write(ov9282->regmap, OV9282_REG_MODE_SELECT,
drivers/media/i2c/ov9282.c
940
dev_err(ov9282->dev, "fail to start streaming");
drivers/media/i2c/ov9282.c
947
pm_runtime_put(ov9282->dev);
drivers/media/i2c/ov9282.c
956
struct ov9282 *ov9282 = to_ov9282(sd);
drivers/media/i2c/ov9282.c
959
ret = cci_write(ov9282->regmap, OV9282_REG_MODE_SELECT,
drivers/media/i2c/ov9282.c
962
pm_runtime_put(ov9282->dev);
drivers/media/i2c/ov9282.c
973
static int ov9282_detect(struct ov9282 *ov9282)
drivers/media/i2c/ov9282.c
978
ret = cci_read(ov9282->regmap, OV9282_REG_ID, &val, NULL);
drivers/media/i2c/ov9282.c
983
dev_err(ov9282->dev, "chip id mismatch: %x!=%llx",
drivers/media/i2c/ov9282.c
991
static int ov9282_configure_regulators(struct ov9282 *ov9282)
drivers/media/i2c/ov9282.c
996
ov9282->supplies[i].supply = ov9282_supply_names[i];
drivers/media/i2c/ov9282.c
998
return devm_regulator_bulk_get(ov9282->dev,