• Home
  • Raw
  • Download

Lines Matching full:ov7251

3  * Driver for the OV7251 camera sensor.
62 struct ov7251 { struct
97 static inline struct ov7251 *to_ov7251(struct v4l2_subdev *sd) in to_ov7251() argument
99 return container_of(sd, struct ov7251, sd); in to_ov7251()
570 static int ov7251_regulators_enable(struct ov7251 *ov7251) in ov7251_regulators_enable() argument
574 /* OV7251 power up sequence requires core regulator in ov7251_regulators_enable()
578 ret = regulator_enable(ov7251->io_regulator); in ov7251_regulators_enable()
580 dev_err(ov7251->dev, "set io voltage failed\n"); in ov7251_regulators_enable()
584 ret = regulator_enable(ov7251->analog_regulator); in ov7251_regulators_enable()
586 dev_err(ov7251->dev, "set analog voltage failed\n"); in ov7251_regulators_enable()
590 ret = regulator_enable(ov7251->core_regulator); in ov7251_regulators_enable()
592 dev_err(ov7251->dev, "set core voltage failed\n"); in ov7251_regulators_enable()
599 regulator_disable(ov7251->analog_regulator); in ov7251_regulators_enable()
602 regulator_disable(ov7251->io_regulator); in ov7251_regulators_enable()
607 static void ov7251_regulators_disable(struct ov7251 *ov7251) in ov7251_regulators_disable() argument
611 ret = regulator_disable(ov7251->core_regulator); in ov7251_regulators_disable()
613 dev_err(ov7251->dev, "core regulator disable failed\n"); in ov7251_regulators_disable()
615 ret = regulator_disable(ov7251->analog_regulator); in ov7251_regulators_disable()
617 dev_err(ov7251->dev, "analog regulator disable failed\n"); in ov7251_regulators_disable()
619 ret = regulator_disable(ov7251->io_regulator); in ov7251_regulators_disable()
621 dev_err(ov7251->dev, "io regulator disable failed\n"); in ov7251_regulators_disable()
624 static int ov7251_write_reg(struct ov7251 *ov7251, u16 reg, u8 val) in ov7251_write_reg() argument
633 ret = i2c_master_send(ov7251->i2c_client, regbuf, 3); in ov7251_write_reg()
635 dev_err(ov7251->dev, "%s: write reg error %d: reg=%x, val=%x\n", in ov7251_write_reg()
643 static int ov7251_write_seq_regs(struct ov7251 *ov7251, u16 reg, u8 *val, in ov7251_write_seq_regs() argument
658 ret = i2c_master_send(ov7251->i2c_client, regbuf, nregbuf); in ov7251_write_seq_regs()
660 dev_err(ov7251->dev, in ov7251_write_seq_regs()
669 static int ov7251_read_reg(struct ov7251 *ov7251, u16 reg, u8 *val) in ov7251_read_reg() argument
677 ret = i2c_master_send(ov7251->i2c_client, regbuf, 2); in ov7251_read_reg()
679 dev_err(ov7251->dev, "%s: write reg error %d: reg=%x\n", in ov7251_read_reg()
684 ret = i2c_master_recv(ov7251->i2c_client, val, 1); in ov7251_read_reg()
686 dev_err(ov7251->dev, "%s: read reg error %d: reg=%x\n", in ov7251_read_reg()
694 static int ov7251_set_exposure(struct ov7251 *ov7251, s32 exposure) in ov7251_set_exposure() argument
704 return ov7251_write_seq_regs(ov7251, reg, val, 3); in ov7251_set_exposure()
707 static int ov7251_set_gain(struct ov7251 *ov7251, s32 gain) in ov7251_set_gain() argument
716 return ov7251_write_seq_regs(ov7251, reg, val, 2); in ov7251_set_gain()
719 static int ov7251_set_register_array(struct ov7251 *ov7251, in ov7251_set_register_array() argument
727 ret = ov7251_write_reg(ov7251, settings->reg, settings->val); in ov7251_set_register_array()
735 static int ov7251_set_power_on(struct ov7251 *ov7251) in ov7251_set_power_on() argument
740 ret = ov7251_regulators_enable(ov7251); in ov7251_set_power_on()
744 ret = clk_prepare_enable(ov7251->xclk); in ov7251_set_power_on()
746 dev_err(ov7251->dev, "clk prepare enable failed\n"); in ov7251_set_power_on()
747 ov7251_regulators_disable(ov7251); in ov7251_set_power_on()
751 gpiod_set_value_cansleep(ov7251->enable_gpio, 1); in ov7251_set_power_on()
755 DIV_ROUND_UP(ov7251->xclk_freq, 1000)); in ov7251_set_power_on()
761 static void ov7251_set_power_off(struct ov7251 *ov7251) in ov7251_set_power_off() argument
763 clk_disable_unprepare(ov7251->xclk); in ov7251_set_power_off()
764 gpiod_set_value_cansleep(ov7251->enable_gpio, 0); in ov7251_set_power_off()
765 ov7251_regulators_disable(ov7251); in ov7251_set_power_off()
770 struct ov7251 *ov7251 = to_ov7251(sd); in ov7251_s_power() local
773 mutex_lock(&ov7251->lock); in ov7251_s_power()
776 if (ov7251->power_on == !!on) in ov7251_s_power()
780 ret = ov7251_set_power_on(ov7251); in ov7251_s_power()
784 ret = ov7251_set_register_array(ov7251, in ov7251_s_power()
788 dev_err(ov7251->dev, "could not set init registers\n"); in ov7251_s_power()
789 ov7251_set_power_off(ov7251); in ov7251_s_power()
793 ov7251->power_on = true; in ov7251_s_power()
795 ov7251_set_power_off(ov7251); in ov7251_s_power()
796 ov7251->power_on = false; in ov7251_s_power()
800 mutex_unlock(&ov7251->lock); in ov7251_s_power()
805 static int ov7251_set_hflip(struct ov7251 *ov7251, s32 value) in ov7251_set_hflip() argument
807 u8 val = ov7251->timing_format2; in ov7251_set_hflip()
815 ret = ov7251_write_reg(ov7251, OV7251_TIMING_FORMAT2, val); in ov7251_set_hflip()
817 ov7251->timing_format2 = val; in ov7251_set_hflip()
822 static int ov7251_set_vflip(struct ov7251 *ov7251, s32 value) in ov7251_set_vflip() argument
824 u8 val = ov7251->timing_format1; in ov7251_set_vflip()
832 ret = ov7251_write_reg(ov7251, OV7251_TIMING_FORMAT1, val); in ov7251_set_vflip()
834 ov7251->timing_format1 = val; in ov7251_set_vflip()
839 static int ov7251_set_test_pattern(struct ov7251 *ov7251, s32 value) in ov7251_set_test_pattern() argument
841 u8 val = ov7251->pre_isp_00; in ov7251_set_test_pattern()
849 ret = ov7251_write_reg(ov7251, OV7251_PRE_ISP_00, val); in ov7251_set_test_pattern()
851 ov7251->pre_isp_00 = val; in ov7251_set_test_pattern()
863 struct ov7251 *ov7251 = container_of(ctrl->handler, in ov7251_s_ctrl() local
864 struct ov7251, ctrls); in ov7251_s_ctrl()
869 if (!ov7251->power_on) in ov7251_s_ctrl()
874 ret = ov7251_set_exposure(ov7251, ctrl->val); in ov7251_s_ctrl()
877 ret = ov7251_set_gain(ov7251, ctrl->val); in ov7251_s_ctrl()
880 ret = ov7251_set_test_pattern(ov7251, ctrl->val); in ov7251_s_ctrl()
883 ret = ov7251_set_hflip(ov7251, ctrl->val); in ov7251_s_ctrl()
886 ret = ov7251_set_vflip(ov7251, ctrl->val); in ov7251_s_ctrl()
952 __ov7251_get_pad_format(struct ov7251 *ov7251, in __ov7251_get_pad_format() argument
959 return v4l2_subdev_get_try_format(&ov7251->sd, cfg, pad); in __ov7251_get_pad_format()
961 return &ov7251->fmt; in __ov7251_get_pad_format()
971 struct ov7251 *ov7251 = to_ov7251(sd); in ov7251_get_format() local
973 mutex_lock(&ov7251->lock); in ov7251_get_format()
974 format->format = *__ov7251_get_pad_format(ov7251, cfg, format->pad, in ov7251_get_format()
976 mutex_unlock(&ov7251->lock); in ov7251_get_format()
982 __ov7251_get_pad_crop(struct ov7251 *ov7251, struct v4l2_subdev_pad_config *cfg, in __ov7251_get_pad_crop() argument
987 return v4l2_subdev_get_try_crop(&ov7251->sd, cfg, pad); in __ov7251_get_pad_crop()
989 return &ov7251->crop; in __ov7251_get_pad_crop()
1001 ov7251_find_mode_by_ival(struct ov7251 *ov7251, struct v4l2_fract *timeperframe) in ov7251_find_mode_by_ival() argument
1003 const struct ov7251_mode_info *mode = ov7251->current_mode; in ov7251_find_mode_by_ival()
1033 struct ov7251 *ov7251 = to_ov7251(sd); in ov7251_set_format() local
1039 mutex_lock(&ov7251->lock); in ov7251_set_format()
1041 __crop = __ov7251_get_pad_crop(ov7251, cfg, format->pad, format->which); in ov7251_set_format()
1052 ret = __v4l2_ctrl_s_ctrl_int64(ov7251->pixel_clock, in ov7251_set_format()
1057 ret = __v4l2_ctrl_s_ctrl(ov7251->link_freq, in ov7251_set_format()
1062 ret = __v4l2_ctrl_modify_range(ov7251->exposure, in ov7251_set_format()
1068 ret = __v4l2_ctrl_s_ctrl(ov7251->exposure, in ov7251_set_format()
1073 ret = __v4l2_ctrl_s_ctrl(ov7251->gain, 16); in ov7251_set_format()
1077 ov7251->current_mode = new_mode; in ov7251_set_format()
1080 __format = __ov7251_get_pad_format(ov7251, cfg, format->pad, in ov7251_set_format()
1095 mutex_unlock(&ov7251->lock); in ov7251_set_format()
1121 struct ov7251 *ov7251 = to_ov7251(sd); in ov7251_get_selection() local
1126 mutex_lock(&ov7251->lock); in ov7251_get_selection()
1127 sel->r = *__ov7251_get_pad_crop(ov7251, cfg, sel->pad, in ov7251_get_selection()
1129 mutex_unlock(&ov7251->lock); in ov7251_get_selection()
1136 struct ov7251 *ov7251 = to_ov7251(subdev); in ov7251_s_stream() local
1139 mutex_lock(&ov7251->lock); in ov7251_s_stream()
1142 ret = ov7251_set_register_array(ov7251, in ov7251_s_stream()
1143 ov7251->current_mode->data, in ov7251_s_stream()
1144 ov7251->current_mode->data_size); in ov7251_s_stream()
1146 dev_err(ov7251->dev, "could not set mode %dx%d\n", in ov7251_s_stream()
1147 ov7251->current_mode->width, in ov7251_s_stream()
1148 ov7251->current_mode->height); in ov7251_s_stream()
1151 ret = __v4l2_ctrl_handler_setup(&ov7251->ctrls); in ov7251_s_stream()
1153 dev_err(ov7251->dev, "could not sync v4l2 controls\n"); in ov7251_s_stream()
1156 ret = ov7251_write_reg(ov7251, OV7251_SC_MODE_SELECT, in ov7251_s_stream()
1159 ret = ov7251_write_reg(ov7251, OV7251_SC_MODE_SELECT, in ov7251_s_stream()
1164 mutex_unlock(&ov7251->lock); in ov7251_s_stream()
1172 struct ov7251 *ov7251 = to_ov7251(subdev); in ov7251_get_frame_interval() local
1174 mutex_lock(&ov7251->lock); in ov7251_get_frame_interval()
1175 fi->interval = ov7251->current_mode->timeperframe; in ov7251_get_frame_interval()
1176 mutex_unlock(&ov7251->lock); in ov7251_get_frame_interval()
1184 struct ov7251 *ov7251 = to_ov7251(subdev); in ov7251_set_frame_interval() local
1188 mutex_lock(&ov7251->lock); in ov7251_set_frame_interval()
1189 new_mode = ov7251_find_mode_by_ival(ov7251, &fi->interval); in ov7251_set_frame_interval()
1191 if (new_mode != ov7251->current_mode) { in ov7251_set_frame_interval()
1192 ret = __v4l2_ctrl_s_ctrl_int64(ov7251->pixel_clock, in ov7251_set_frame_interval()
1197 ret = __v4l2_ctrl_s_ctrl(ov7251->link_freq, in ov7251_set_frame_interval()
1202 ret = __v4l2_ctrl_modify_range(ov7251->exposure, in ov7251_set_frame_interval()
1208 ret = __v4l2_ctrl_s_ctrl(ov7251->exposure, in ov7251_set_frame_interval()
1213 ret = __v4l2_ctrl_s_ctrl(ov7251->gain, 16); in ov7251_set_frame_interval()
1217 ov7251->current_mode = new_mode; in ov7251_set_frame_interval()
1220 fi->interval = ov7251->current_mode->timeperframe; in ov7251_set_frame_interval()
1223 mutex_unlock(&ov7251->lock); in ov7251_set_frame_interval()
1258 struct ov7251 *ov7251; in ov7251_probe() local
1262 ov7251 = devm_kzalloc(dev, sizeof(struct ov7251), GFP_KERNEL); in ov7251_probe()
1263 if (!ov7251) in ov7251_probe()
1266 ov7251->i2c_client = client; in ov7251_probe()
1267 ov7251->dev = dev; in ov7251_probe()
1275 ret = v4l2_fwnode_endpoint_parse(endpoint, &ov7251->ep); in ov7251_probe()
1282 if (ov7251->ep.bus_type != V4L2_MBUS_CSI2_DPHY) { in ov7251_probe()
1284 ov7251->ep.bus_type, V4L2_MBUS_CSI2_DPHY); in ov7251_probe()
1289 ov7251->xclk = devm_clk_get(dev, "xclk"); in ov7251_probe()
1290 if (IS_ERR(ov7251->xclk)) { in ov7251_probe()
1292 return PTR_ERR(ov7251->xclk); in ov7251_probe()
1296 &ov7251->xclk_freq); in ov7251_probe()
1303 if (ov7251->xclk_freq < 23760000 || ov7251->xclk_freq > 24240000) { in ov7251_probe()
1305 ov7251->xclk_freq); in ov7251_probe()
1309 ret = clk_set_rate(ov7251->xclk, ov7251->xclk_freq); in ov7251_probe()
1315 ov7251->io_regulator = devm_regulator_get(dev, "vdddo"); in ov7251_probe()
1316 if (IS_ERR(ov7251->io_regulator)) { in ov7251_probe()
1318 return PTR_ERR(ov7251->io_regulator); in ov7251_probe()
1321 ov7251->core_regulator = devm_regulator_get(dev, "vddd"); in ov7251_probe()
1322 if (IS_ERR(ov7251->core_regulator)) { in ov7251_probe()
1324 return PTR_ERR(ov7251->core_regulator); in ov7251_probe()
1327 ov7251->analog_regulator = devm_regulator_get(dev, "vdda"); in ov7251_probe()
1328 if (IS_ERR(ov7251->analog_regulator)) { in ov7251_probe()
1330 return PTR_ERR(ov7251->analog_regulator); in ov7251_probe()
1333 ov7251->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_HIGH); in ov7251_probe()
1334 if (IS_ERR(ov7251->enable_gpio)) { in ov7251_probe()
1336 return PTR_ERR(ov7251->enable_gpio); in ov7251_probe()
1339 mutex_init(&ov7251->lock); in ov7251_probe()
1341 v4l2_ctrl_handler_init(&ov7251->ctrls, 7); in ov7251_probe()
1342 ov7251->ctrls.lock = &ov7251->lock; in ov7251_probe()
1344 v4l2_ctrl_new_std(&ov7251->ctrls, &ov7251_ctrl_ops, in ov7251_probe()
1346 v4l2_ctrl_new_std(&ov7251->ctrls, &ov7251_ctrl_ops, in ov7251_probe()
1348 ov7251->exposure = v4l2_ctrl_new_std(&ov7251->ctrls, &ov7251_ctrl_ops, in ov7251_probe()
1350 ov7251->gain = v4l2_ctrl_new_std(&ov7251->ctrls, &ov7251_ctrl_ops, in ov7251_probe()
1352 v4l2_ctrl_new_std_menu_items(&ov7251->ctrls, &ov7251_ctrl_ops, in ov7251_probe()
1356 ov7251->pixel_clock = v4l2_ctrl_new_std(&ov7251->ctrls, in ov7251_probe()
1360 ov7251->link_freq = v4l2_ctrl_new_int_menu(&ov7251->ctrls, in ov7251_probe()
1365 if (ov7251->link_freq) in ov7251_probe()
1366 ov7251->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; in ov7251_probe()
1368 ov7251->sd.ctrl_handler = &ov7251->ctrls; in ov7251_probe()
1370 if (ov7251->ctrls.error) { in ov7251_probe()
1372 __func__, ov7251->ctrls.error); in ov7251_probe()
1373 ret = ov7251->ctrls.error; in ov7251_probe()
1377 v4l2_i2c_subdev_init(&ov7251->sd, client, &ov7251_subdev_ops); in ov7251_probe()
1378 ov7251->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in ov7251_probe()
1379 ov7251->pad.flags = MEDIA_PAD_FL_SOURCE; in ov7251_probe()
1380 ov7251->sd.dev = &client->dev; in ov7251_probe()
1381 ov7251->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in ov7251_probe()
1383 ret = media_entity_pads_init(&ov7251->sd.entity, 1, &ov7251->pad); in ov7251_probe()
1389 ret = ov7251_s_power(&ov7251->sd, true); in ov7251_probe()
1391 dev_err(dev, "could not power up OV7251\n"); in ov7251_probe()
1395 ret = ov7251_read_reg(ov7251, OV7251_CHIP_ID_HIGH, &chip_id_high); in ov7251_probe()
1401 ret = ov7251_read_reg(ov7251, OV7251_CHIP_ID_LOW, &chip_id_low); in ov7251_probe()
1408 ret = ov7251_read_reg(ov7251, OV7251_SC_GP_IO_IN1, &chip_rev); in ov7251_probe()
1416 dev_info(dev, "OV7251 revision %x (%s) detected at address 0x%02x\n", in ov7251_probe()
1424 ret = ov7251_read_reg(ov7251, OV7251_PRE_ISP_00, in ov7251_probe()
1425 &ov7251->pre_isp_00); in ov7251_probe()
1432 ret = ov7251_read_reg(ov7251, OV7251_TIMING_FORMAT1, in ov7251_probe()
1433 &ov7251->timing_format1); in ov7251_probe()
1440 ret = ov7251_read_reg(ov7251, OV7251_TIMING_FORMAT2, in ov7251_probe()
1441 &ov7251->timing_format2); in ov7251_probe()
1448 ov7251_s_power(&ov7251->sd, false); in ov7251_probe()
1450 ret = v4l2_async_register_subdev(&ov7251->sd); in ov7251_probe()
1456 ov7251_entity_init_cfg(&ov7251->sd, NULL); in ov7251_probe()
1461 ov7251_s_power(&ov7251->sd, false); in ov7251_probe()
1463 media_entity_cleanup(&ov7251->sd.entity); in ov7251_probe()
1465 v4l2_ctrl_handler_free(&ov7251->ctrls); in ov7251_probe()
1466 mutex_destroy(&ov7251->lock); in ov7251_probe()
1474 struct ov7251 *ov7251 = to_ov7251(sd); in ov7251_remove() local
1476 v4l2_async_unregister_subdev(&ov7251->sd); in ov7251_remove()
1477 media_entity_cleanup(&ov7251->sd.entity); in ov7251_remove()
1478 v4l2_ctrl_handler_free(&ov7251->ctrls); in ov7251_remove()
1479 mutex_destroy(&ov7251->lock); in ov7251_remove()
1485 { .compatible = "ovti,ov7251" },
1493 .name = "ov7251",
1501 MODULE_DESCRIPTION("Omnivision OV7251 Camera Driver");