Lines Matching full:sensor
3 * Driver for VGXY61 global shutter sensor family driver
483 static s32 get_pixel_rate(struct vgxy61_dev *sensor) in get_pixel_rate() argument
485 return div64_u64((u64)sensor->data_rate_in_mbps * sensor->nb_of_lane, in get_pixel_rate()
486 get_bpp_by_code(sensor->fmt.code)); in get_pixel_rate()
500 static unsigned int get_chunk_size(struct vgxy61_dev *sensor) in get_chunk_size() argument
502 struct i2c_adapter *adapter = sensor->i2c_client->adapter; in get_chunk_size()
513 static int vgxy61_read_multiple(struct vgxy61_dev *sensor, u32 reg, in vgxy61_read_multiple() argument
516 struct i2c_client *client = sensor->i2c_client; in vgxy61_read_multiple()
547 static inline int vgxy61_read_reg(struct vgxy61_dev *sensor, u32 reg) in vgxy61_read_reg() argument
549 return vgxy61_read_multiple(sensor, reg & VGXY61_REG_ADDR_MASK, in vgxy61_read_reg()
553 static int vgxy61_write_multiple(struct vgxy61_dev *sensor, u32 reg, in vgxy61_write_multiple() argument
556 struct i2c_client *client = sensor->i2c_client; in vgxy61_write_multiple()
589 static int vgxy61_write_array(struct vgxy61_dev *sensor, u32 reg, in vgxy61_write_array() argument
592 const unsigned int chunk_size = get_chunk_size(sensor); in vgxy61_write_array()
598 ret = vgxy61_write_multiple(sensor, reg, array, sz, NULL); in vgxy61_write_array()
609 static inline int vgxy61_write_reg(struct vgxy61_dev *sensor, u32 reg, u32 val, in vgxy61_write_reg() argument
612 return vgxy61_write_multiple(sensor, reg & VGXY61_REG_ADDR_MASK, in vgxy61_write_reg()
617 static int vgxy61_poll_reg(struct vgxy61_dev *sensor, u32 reg, u8 poll_val, in vgxy61_poll_reg() argument
626 false, sensor, reg); in vgxy61_poll_reg()
629 static int vgxy61_wait_state(struct vgxy61_dev *sensor, int state, in vgxy61_wait_state() argument
632 return vgxy61_poll_reg(sensor, VGXY61_REG_SYSTEM_FSM, state, in vgxy61_wait_state()
636 static int vgxy61_check_bw(struct vgxy61_dev *sensor) in vgxy61_check_bw() argument
642 * is a mipi IP constant for the sensor. in vgxy61_check_bw()
645 unsigned int binning_scale = sensor->current_mode->crop.height / in vgxy61_check_bw()
646 sensor->current_mode->height; in vgxy61_check_bw()
647 u8 bpp = get_bpp_by_code(sensor->fmt.code); in vgxy61_check_bw()
652 line_rate = sensor->nb_of_lane * (u64)sensor->data_rate_in_mbps * in vgxy61_check_bw()
653 sensor->line_length; in vgxy61_check_bw()
654 max_bit_per_line = div64_u64(line_rate, sensor->pclk) - mipi_margin; in vgxy61_check_bw()
655 bit_per_line = (bpp * sensor->current_mode->width) / binning_scale; in vgxy61_check_bw()
660 static int vgxy61_apply_exposure(struct vgxy61_dev *sensor) in vgxy61_apply_exposure() argument
665 vgxy61_write_reg(sensor, VGXY61_REG_COARSE_EXPOSURE_SHORT, 0, &ret); in vgxy61_apply_exposure()
666 vgxy61_write_reg(sensor, VGXY61_REG_COARSE_EXPOSURE_LONG, in vgxy61_apply_exposure()
667 sensor->expo_long, &ret); in vgxy61_apply_exposure()
668 vgxy61_write_reg(sensor, VGXY61_REG_COARSE_EXPOSURE_SHORT, in vgxy61_apply_exposure()
669 sensor->expo_short, &ret); in vgxy61_apply_exposure()
674 static int vgxy61_get_regulators(struct vgxy61_dev *sensor) in vgxy61_get_regulators() argument
679 sensor->supplies[i].supply = vgxy61_supply_name[i]; in vgxy61_get_regulators()
681 return devm_regulator_bulk_get(&sensor->i2c_client->dev, in vgxy61_get_regulators()
683 sensor->supplies); in vgxy61_get_regulators()
686 static int vgxy61_apply_reset(struct vgxy61_dev *sensor) in vgxy61_apply_reset() argument
688 gpiod_set_value_cansleep(sensor->reset_gpio, 0); in vgxy61_apply_reset()
690 gpiod_set_value_cansleep(sensor->reset_gpio, 1); in vgxy61_apply_reset()
692 gpiod_set_value_cansleep(sensor->reset_gpio, 0); in vgxy61_apply_reset()
694 return vgxy61_wait_state(sensor, VGXY61_SYSTEM_FSM_SW_STBY, in vgxy61_apply_reset()
698 static void vgxy61_fill_framefmt(struct vgxy61_dev *sensor, in vgxy61_fill_framefmt() argument
716 struct vgxy61_dev *sensor = to_vgxy61_dev(sd); in vgxy61_try_fmt_internal() local
717 const struct vgxy61_mode_info *mode = sensor->sensor_modes; in vgxy61_try_fmt_internal()
727 mode = v4l2_find_nearest_size(sensor->sensor_modes, in vgxy61_try_fmt_internal()
728 sensor->sensor_modes_nb, width, height, in vgxy61_try_fmt_internal()
733 vgxy61_fill_framefmt(sensor, mode, fmt, in vgxy61_try_fmt_internal()
743 struct vgxy61_dev *sensor = to_vgxy61_dev(sd); in vgxy61_get_selection() local
747 sel->r = sensor->current_mode->crop; in vgxy61_get_selection()
754 sel->r.width = sensor->sensor_width; in vgxy61_get_selection()
755 sel->r.height = sensor->sensor_height; in vgxy61_get_selection()
778 struct vgxy61_dev *sensor = to_vgxy61_dev(sd); in vgxy61_get_fmt() local
781 mutex_lock(&sensor->lock); in vgxy61_get_fmt()
786 fmt = &sensor->fmt; in vgxy61_get_fmt()
790 mutex_unlock(&sensor->lock); in vgxy61_get_fmt()
795 static u16 vgxy61_get_vblank_min(struct vgxy61_dev *sensor, in vgxy61_get_vblank_min() argument
799 sensor->current_mode->crop.height; in vgxy61_get_vblank_min()
801 u16 min_vblank_hdr = VGXY61_MIN_EXPOSURE + sensor->rot_term + 1; in vgxy61_get_vblank_min()
812 struct vgxy61_dev *sensor = to_vgxy61_dev(sd); in vgxy61_enum_frame_size() local
814 if (fse->index >= sensor->sensor_modes_nb) in vgxy61_enum_frame_size()
817 fse->min_width = sensor->sensor_modes[fse->index].width; in vgxy61_enum_frame_size()
819 fse->min_height = sensor->sensor_modes[fse->index].height; in vgxy61_enum_frame_size()
825 static int vgxy61_update_analog_gain(struct vgxy61_dev *sensor, u32 target) in vgxy61_update_analog_gain() argument
827 sensor->analog_gain = target; in vgxy61_update_analog_gain()
829 if (sensor->streaming) in vgxy61_update_analog_gain()
830 return vgxy61_write_reg(sensor, VGXY61_REG_ANALOG_GAIN, target, in vgxy61_update_analog_gain()
835 static int vgxy61_apply_digital_gain(struct vgxy61_dev *sensor, in vgxy61_apply_digital_gain() argument
845 vgxy61_write_reg(sensor, VGXY61_REG_DIGITAL_GAIN_LONG, digital_gain, in vgxy61_apply_digital_gain()
847 vgxy61_write_reg(sensor, VGXY61_REG_DIGITAL_GAIN_SHORT, digital_gain, in vgxy61_apply_digital_gain()
853 static int vgxy61_update_digital_gain(struct vgxy61_dev *sensor, u32 target) in vgxy61_update_digital_gain() argument
855 sensor->digital_gain = target; in vgxy61_update_digital_gain()
857 if (sensor->streaming) in vgxy61_update_digital_gain()
858 return vgxy61_apply_digital_gain(sensor, sensor->digital_gain); in vgxy61_update_digital_gain()
862 static int vgxy61_apply_patgen(struct vgxy61_dev *sensor, u32 index) in vgxy61_apply_patgen() argument
873 return vgxy61_write_reg(sensor, VGXY61_REG_PATGEN_CTRL, reg, NULL); in vgxy61_apply_patgen()
876 static int vgxy61_update_patgen(struct vgxy61_dev *sensor, u32 pattern) in vgxy61_update_patgen() argument
878 sensor->pattern = pattern; in vgxy61_update_patgen()
880 if (sensor->streaming) in vgxy61_update_patgen()
881 return vgxy61_apply_patgen(sensor, sensor->pattern); in vgxy61_update_patgen()
885 static int vgxy61_apply_gpiox_strobe_mode(struct vgxy61_dev *sensor, in vgxy61_apply_gpiox_strobe_mode() argument
892 reg = vgxy61_read_reg(sensor, VGXY61_REG_SIGNALS_CTRL); in vgxy61_apply_gpiox_strobe_mode()
898 return vgxy61_write_reg(sensor, VGXY61_REG_SIGNALS_CTRL, reg, NULL); in vgxy61_apply_gpiox_strobe_mode()
901 static int vgxy61_update_gpios_strobe_mode(struct vgxy61_dev *sensor, in vgxy61_update_gpios_strobe_mode() argument
909 sensor->strobe_mode = VGXY61_STROBE_ENABLED; in vgxy61_update_gpios_strobe_mode()
913 sensor->strobe_mode = VGXY61_STROBE_LONG; in vgxy61_update_gpios_strobe_mode()
921 if (!sensor->streaming) in vgxy61_update_gpios_strobe_mode()
925 ret = vgxy61_apply_gpiox_strobe_mode(sensor, in vgxy61_update_gpios_strobe_mode()
926 sensor->strobe_mode, in vgxy61_update_gpios_strobe_mode()
935 static int vgxy61_update_gpios_strobe_polarity(struct vgxy61_dev *sensor, in vgxy61_update_gpios_strobe_polarity() argument
940 if (sensor->streaming) in vgxy61_update_gpios_strobe_polarity()
943 vgxy61_write_reg(sensor, VGXY61_REG_GPIO_0_CTRL, polarity << 1, &ret); in vgxy61_update_gpios_strobe_polarity()
944 vgxy61_write_reg(sensor, VGXY61_REG_GPIO_1_CTRL, polarity << 1, &ret); in vgxy61_update_gpios_strobe_polarity()
945 vgxy61_write_reg(sensor, VGXY61_REG_GPIO_2_CTRL, polarity << 1, &ret); in vgxy61_update_gpios_strobe_polarity()
946 vgxy61_write_reg(sensor, VGXY61_REG_GPIO_3_CTRL, polarity << 1, &ret); in vgxy61_update_gpios_strobe_polarity()
947 vgxy61_write_reg(sensor, VGXY61_REG_SIGNALS_POLARITY_CTRL, polarity, in vgxy61_update_gpios_strobe_polarity()
953 static u32 vgxy61_get_expo_long_max(struct vgxy61_dev *sensor, in vgxy61_get_expo_long_max() argument
958 /* Apply sensor's rules of thumb */ in vgxy61_get_expo_long_max()
964 ((sensor->frame_length - sensor->current_mode->crop.height - in vgxy61_get_expo_long_max()
965 sensor->rot_term) * short_expo_ratio) - 1; in vgxy61_get_expo_long_max()
968 * Total exposition time must be less than frame length to avoid sensor in vgxy61_get_expo_long_max()
972 (((sensor->frame_length - VGXY61_EXPOS_ROT_TERM) * in vgxy61_get_expo_long_max()
977 * sensor crash in vgxy61_get_expo_long_max()
979 third_rot_max_expo = (sensor->frame_length / 71) * short_expo_ratio; in vgxy61_get_expo_long_max()
986 static int vgxy61_update_exposure(struct vgxy61_dev *sensor, u16 new_expo_long, in vgxy61_update_exposure() argument
989 struct i2c_client *client = sensor->i2c_client; in vgxy61_update_exposure()
1006 vgxy61_get_expo_long_max(sensor, in vgxy61_update_exposure()
1018 expo_long_max = vgxy61_get_expo_long_max(sensor, 1); in vgxy61_update_exposure()
1030 expo_long_max = sensor->frame_length - VGXY61_EXPOS_ROT_TERM; in vgxy61_update_exposure()
1048 sensor->expo_long = new_expo_long; in vgxy61_update_exposure()
1049 sensor->expo_short = new_expo_short; in vgxy61_update_exposure()
1050 sensor->expo_max = expo_long_max; in vgxy61_update_exposure()
1051 sensor->expo_min = expo_long_min; in vgxy61_update_exposure()
1053 if (sensor->streaming) in vgxy61_update_exposure()
1054 return vgxy61_apply_exposure(sensor); in vgxy61_update_exposure()
1058 static int vgxy61_apply_framelength(struct vgxy61_dev *sensor) in vgxy61_apply_framelength() argument
1060 return vgxy61_write_reg(sensor, VGXY61_REG_FRAME_LENGTH, in vgxy61_apply_framelength()
1061 sensor->frame_length, NULL); in vgxy61_apply_framelength()
1064 static int vgxy61_update_vblank(struct vgxy61_dev *sensor, u16 vblank, in vgxy61_update_vblank() argument
1069 sensor->vblank_min = vgxy61_get_vblank_min(sensor, hdr); in vgxy61_update_vblank()
1070 sensor->vblank = max(sensor->vblank_min, vblank); in vgxy61_update_vblank()
1071 sensor->frame_length = sensor->current_mode->crop.height + in vgxy61_update_vblank()
1072 sensor->vblank; in vgxy61_update_vblank()
1075 ret = vgxy61_update_exposure(sensor, sensor->expo_long, hdr); in vgxy61_update_vblank()
1079 if (sensor->streaming) in vgxy61_update_vblank()
1080 return vgxy61_apply_framelength(sensor); in vgxy61_update_vblank()
1084 static int vgxy61_apply_hdr(struct vgxy61_dev *sensor, in vgxy61_apply_hdr() argument
1089 return vgxy61_write_reg(sensor, VGXY61_REG_HDR_CTRL, index2val[index], in vgxy61_apply_hdr()
1093 static int vgxy61_update_hdr(struct vgxy61_dev *sensor, in vgxy61_update_hdr() argument
1103 ret = vgxy61_update_vblank(sensor, sensor->vblank, index); in vgxy61_update_hdr()
1108 ret = vgxy61_update_gpios_strobe_mode(sensor, index); in vgxy61_update_hdr()
1112 sensor->hdr = index; in vgxy61_update_hdr()
1114 if (sensor->streaming) in vgxy61_update_hdr()
1115 return vgxy61_apply_hdr(sensor, sensor->hdr); in vgxy61_update_hdr()
1119 static int vgxy61_apply_settings(struct vgxy61_dev *sensor) in vgxy61_apply_settings() argument
1124 ret = vgxy61_apply_hdr(sensor, sensor->hdr); in vgxy61_apply_settings()
1128 ret = vgxy61_apply_framelength(sensor); in vgxy61_apply_settings()
1132 ret = vgxy61_apply_exposure(sensor); in vgxy61_apply_settings()
1136 ret = vgxy61_write_reg(sensor, VGXY61_REG_ANALOG_GAIN, in vgxy61_apply_settings()
1137 sensor->analog_gain, NULL); in vgxy61_apply_settings()
1140 ret = vgxy61_apply_digital_gain(sensor, sensor->digital_gain); in vgxy61_apply_settings()
1144 ret = vgxy61_write_reg(sensor, VGXY61_REG_ORIENTATION, in vgxy61_apply_settings()
1145 sensor->hflip | (sensor->vflip << 1), NULL); in vgxy61_apply_settings()
1149 ret = vgxy61_apply_patgen(sensor, sensor->pattern); in vgxy61_apply_settings()
1154 ret = vgxy61_apply_gpiox_strobe_mode(sensor, in vgxy61_apply_settings()
1155 sensor->strobe_mode, i); in vgxy61_apply_settings()
1163 static int vgxy61_stream_enable(struct vgxy61_dev *sensor) in vgxy61_stream_enable() argument
1165 struct i2c_client *client = v4l2_get_subdevdata(&sensor->sd); in vgxy61_stream_enable()
1166 const struct v4l2_rect *crop = &sensor->current_mode->crop; in vgxy61_stream_enable()
1169 ret = vgxy61_check_bw(sensor); in vgxy61_stream_enable()
1177 vgxy61_write_reg(sensor, VGXY61_REG_FORMAT_CTRL, in vgxy61_stream_enable()
1178 get_bpp_by_code(sensor->fmt.code), &ret); in vgxy61_stream_enable()
1179 vgxy61_write_reg(sensor, VGXY61_REG_OIF_ROI0_CTRL, in vgxy61_stream_enable()
1180 get_data_type_by_code(sensor->fmt.code), &ret); in vgxy61_stream_enable()
1182 vgxy61_write_reg(sensor, VGXY61_REG_READOUT_CTRL, in vgxy61_stream_enable()
1183 sensor->current_mode->bin_mode, &ret); in vgxy61_stream_enable()
1184 vgxy61_write_reg(sensor, VGXY61_REG_ROI0_START_H, crop->left, &ret); in vgxy61_stream_enable()
1185 vgxy61_write_reg(sensor, VGXY61_REG_ROI0_END_H, in vgxy61_stream_enable()
1187 vgxy61_write_reg(sensor, VGXY61_REG_ROI0_START_V, crop->top, &ret); in vgxy61_stream_enable()
1188 vgxy61_write_reg(sensor, VGXY61_REG_ROI0_END_V, in vgxy61_stream_enable()
1193 ret = vgxy61_apply_settings(sensor); in vgxy61_stream_enable()
1197 ret = vgxy61_write_reg(sensor, VGXY61_REG_STREAMING, in vgxy61_stream_enable()
1202 ret = vgxy61_poll_reg(sensor, VGXY61_REG_STREAMING, in vgxy61_stream_enable()
1207 ret = vgxy61_wait_state(sensor, VGXY61_SYSTEM_FSM_STREAMING, in vgxy61_stream_enable()
1213 __v4l2_ctrl_grab(sensor->vflip_ctrl, true); in vgxy61_stream_enable()
1214 __v4l2_ctrl_grab(sensor->hflip_ctrl, true); in vgxy61_stream_enable()
1223 static int vgxy61_stream_disable(struct vgxy61_dev *sensor) in vgxy61_stream_disable() argument
1225 struct i2c_client *client = v4l2_get_subdevdata(&sensor->sd); in vgxy61_stream_disable()
1228 ret = vgxy61_write_reg(sensor, VGXY61_REG_STREAMING, in vgxy61_stream_disable()
1233 ret = vgxy61_poll_reg(sensor, VGXY61_REG_STREAMING, in vgxy61_stream_disable()
1238 ret = vgxy61_wait_state(sensor, VGXY61_SYSTEM_FSM_SW_STBY, in vgxy61_stream_disable()
1243 __v4l2_ctrl_grab(sensor->vflip_ctrl, false); in vgxy61_stream_disable()
1244 __v4l2_ctrl_grab(sensor->hflip_ctrl, false); in vgxy61_stream_disable()
1256 struct vgxy61_dev *sensor = to_vgxy61_dev(sd); in vgxy61_s_stream() local
1259 mutex_lock(&sensor->lock); in vgxy61_s_stream()
1261 ret = enable ? vgxy61_stream_enable(sensor) : in vgxy61_s_stream()
1262 vgxy61_stream_disable(sensor); in vgxy61_s_stream()
1264 sensor->streaming = enable; in vgxy61_s_stream()
1266 mutex_unlock(&sensor->lock); in vgxy61_s_stream()
1275 struct vgxy61_dev *sensor = to_vgxy61_dev(sd); in vgxy61_set_fmt() local
1280 mutex_lock(&sensor->lock); in vgxy61_set_fmt()
1282 if (sensor->streaming) { in vgxy61_set_fmt()
1294 } else if (sensor->current_mode != new_mode || in vgxy61_set_fmt()
1295 sensor->fmt.code != format->format.code) { in vgxy61_set_fmt()
1296 fmt = &sensor->fmt; in vgxy61_set_fmt()
1299 sensor->current_mode = new_mode; in vgxy61_set_fmt()
1302 ret = vgxy61_update_vblank(sensor, in vgxy61_set_fmt()
1305 sensor->hdr); in vgxy61_set_fmt()
1308 __v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_ctrl, in vgxy61_set_fmt()
1309 get_pixel_rate(sensor)); in vgxy61_set_fmt()
1310 __v4l2_ctrl_modify_range(sensor->vblank_ctrl, in vgxy61_set_fmt()
1311 sensor->vblank_min, in vgxy61_set_fmt()
1313 1, sensor->vblank); in vgxy61_set_fmt()
1314 __v4l2_ctrl_s_ctrl(sensor->vblank_ctrl, sensor->vblank); in vgxy61_set_fmt()
1315 __v4l2_ctrl_modify_range(sensor->expo_ctrl, sensor->expo_min, in vgxy61_set_fmt()
1316 sensor->expo_max, 1, in vgxy61_set_fmt()
1317 sensor->expo_long); in vgxy61_set_fmt()
1321 mutex_unlock(&sensor->lock); in vgxy61_set_fmt()
1329 struct vgxy61_dev *sensor = to_vgxy61_dev(sd); in vgxy61_init_state() local
1332 vgxy61_fill_framefmt(sensor, sensor->current_mode, &fmt.format, in vgxy61_init_state()
1341 struct vgxy61_dev *sensor = to_vgxy61_dev(sd); in vgxy61_s_ctrl() local
1342 const struct vgxy61_mode_info *cur_mode = sensor->current_mode; in vgxy61_s_ctrl()
1347 ret = vgxy61_update_exposure(sensor, ctrl->val, sensor->hdr); in vgxy61_s_ctrl()
1348 ctrl->val = sensor->expo_long; in vgxy61_s_ctrl()
1351 ret = vgxy61_update_analog_gain(sensor, ctrl->val); in vgxy61_s_ctrl()
1354 ret = vgxy61_update_digital_gain(sensor, ctrl->val); in vgxy61_s_ctrl()
1358 if (sensor->streaming) { in vgxy61_s_ctrl()
1363 sensor->vflip = ctrl->val; in vgxy61_s_ctrl()
1365 sensor->hflip = ctrl->val; in vgxy61_s_ctrl()
1369 ret = vgxy61_update_patgen(sensor, ctrl->val); in vgxy61_s_ctrl()
1372 ret = vgxy61_update_hdr(sensor, ctrl->val); in vgxy61_s_ctrl()
1374 __v4l2_ctrl_modify_range(sensor->vblank_ctrl, in vgxy61_s_ctrl()
1375 sensor->vblank_min, in vgxy61_s_ctrl()
1377 1, sensor->vblank); in vgxy61_s_ctrl()
1378 __v4l2_ctrl_modify_range(sensor->expo_ctrl, sensor->expo_min, in vgxy61_s_ctrl()
1379 sensor->expo_max, 1, in vgxy61_s_ctrl()
1380 sensor->expo_long); in vgxy61_s_ctrl()
1383 ret = vgxy61_update_vblank(sensor, ctrl->val, sensor->hdr); in vgxy61_s_ctrl()
1385 __v4l2_ctrl_modify_range(sensor->expo_ctrl, sensor->expo_min, in vgxy61_s_ctrl()
1386 sensor->expo_max, 1, in vgxy61_s_ctrl()
1387 sensor->expo_long); in vgxy61_s_ctrl()
1401 static int vgxy61_init_controls(struct vgxy61_dev *sensor) in vgxy61_init_controls() argument
1404 struct v4l2_ctrl_handler *hdl = &sensor->ctrl_handler; in vgxy61_init_controls()
1405 const struct vgxy61_mode_info *cur_mode = sensor->current_mode; in vgxy61_init_controls()
1412 hdl->lock = &sensor->lock; in vgxy61_init_controls()
1414 sensor->analog_gain); in vgxy61_init_controls()
1416 sensor->digital_gain); in vgxy61_init_controls()
1421 sensor->line_length, 1, in vgxy61_init_controls()
1422 sensor->line_length - cur_mode->width); in vgxy61_init_controls()
1437 sensor->pixel_rate_ctrl = v4l2_ctrl_new_std(hdl, ops, in vgxy61_init_controls()
1440 get_pixel_rate(sensor)); in vgxy61_init_controls()
1441 if (sensor->pixel_rate_ctrl) in vgxy61_init_controls()
1442 sensor->pixel_rate_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; in vgxy61_init_controls()
1443 sensor->expo_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_EXPOSURE, in vgxy61_init_controls()
1444 sensor->expo_min, in vgxy61_init_controls()
1445 sensor->expo_max, 1, in vgxy61_init_controls()
1446 sensor->expo_long); in vgxy61_init_controls()
1447 sensor->vblank_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_VBLANK, in vgxy61_init_controls()
1448 sensor->vblank_min, in vgxy61_init_controls()
1450 1, sensor->vblank); in vgxy61_init_controls()
1451 sensor->vflip_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_VFLIP, in vgxy61_init_controls()
1452 0, 1, 1, sensor->vflip); in vgxy61_init_controls()
1453 sensor->hflip_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_HFLIP, in vgxy61_init_controls()
1454 0, 1, 1, sensor->hflip); in vgxy61_init_controls()
1461 ret = v4l2_fwnode_device_parse(&sensor->i2c_client->dev, &props); in vgxy61_init_controls()
1469 sensor->sd.ctrl_handler = hdl; in vgxy61_init_controls()
1508 static int vgxy61_tx_from_ep(struct vgxy61_dev *sensor, in vgxy61_tx_from_ep() argument
1512 struct i2c_client *client = sensor->i2c_client; in vgxy61_tx_from_ep()
1555 sensor->oif_ctrl = (polarities[4] << 15) + ((phy2log[4] - 1) << 13) + in vgxy61_tx_from_ep()
1561 sensor->nb_of_lane = l_nb; in vgxy61_tx_from_ep()
1569 dev_dbg(&client->dev, "oif_ctrl = 0x%04x\n", sensor->oif_ctrl); in vgxy61_tx_from_ep()
1581 static int vgxy61_configure(struct vgxy61_dev *sensor) in vgxy61_configure() argument
1588 compute_pll_parameters_by_freq(sensor->clk_freq, &prediv, &mult); in vgxy61_configure()
1589 sensor_freq = (mult * sensor->clk_freq) / prediv; in vgxy61_configure()
1591 sensor->data_rate_in_mbps = sensor_freq; in vgxy61_configure()
1593 sensor->pclk = sensor_freq / 5; in vgxy61_configure()
1595 line_length = vgxy61_read_reg(sensor, VGXY61_REG_LINE_LENGTH); in vgxy61_configure()
1598 sensor->line_length = line_length; in vgxy61_configure()
1599 vgxy61_write_reg(sensor, VGXY61_REG_EXT_CLOCK, sensor->clk_freq, &ret); in vgxy61_configure()
1600 vgxy61_write_reg(sensor, VGXY61_REG_CLK_PLL_PREDIV, prediv, &ret); in vgxy61_configure()
1601 vgxy61_write_reg(sensor, VGXY61_REG_CLK_SYS_PLL_MULT, mult, &ret); in vgxy61_configure()
1602 vgxy61_write_reg(sensor, VGXY61_REG_OIF_CTRL, sensor->oif_ctrl, &ret); in vgxy61_configure()
1603 vgxy61_write_reg(sensor, VGXY61_REG_FRAME_CONTENT_CTRL, 0, &ret); in vgxy61_configure()
1604 vgxy61_write_reg(sensor, VGXY61_REG_BYPASS_CTRL, 4, &ret); in vgxy61_configure()
1607 vgxy61_update_gpios_strobe_polarity(sensor, sensor->gpios_polarity); in vgxy61_configure()
1609 vgxy61_write_reg(sensor, VGXY61_REG_PATGEN_LONG_DATA_GR, 0x800, &ret); in vgxy61_configure()
1610 vgxy61_write_reg(sensor, VGXY61_REG_PATGEN_LONG_DATA_R, 0x800, &ret); in vgxy61_configure()
1611 vgxy61_write_reg(sensor, VGXY61_REG_PATGEN_LONG_DATA_B, 0x800, &ret); in vgxy61_configure()
1612 vgxy61_write_reg(sensor, VGXY61_REG_PATGEN_LONG_DATA_GB, 0x800, &ret); in vgxy61_configure()
1613 vgxy61_write_reg(sensor, VGXY61_REG_PATGEN_SHORT_DATA_GR, 0x800, &ret); in vgxy61_configure()
1614 vgxy61_write_reg(sensor, VGXY61_REG_PATGEN_SHORT_DATA_R, 0x800, &ret); in vgxy61_configure()
1615 vgxy61_write_reg(sensor, VGXY61_REG_PATGEN_SHORT_DATA_B, 0x800, &ret); in vgxy61_configure()
1616 vgxy61_write_reg(sensor, VGXY61_REG_PATGEN_SHORT_DATA_GB, 0x800, &ret); in vgxy61_configure()
1623 static int vgxy61_patch(struct vgxy61_dev *sensor) in vgxy61_patch() argument
1625 struct i2c_client *client = sensor->i2c_client; in vgxy61_patch()
1628 ret = vgxy61_write_array(sensor, VGXY61_REG_FWPATCH_START_ADDR, in vgxy61_patch()
1633 ret = vgxy61_write_reg(sensor, VGXY61_REG_STBY, 0x10, NULL); in vgxy61_patch()
1637 ret = vgxy61_poll_reg(sensor, VGXY61_REG_STBY, 0, VGXY61_TIMEOUT_MS); in vgxy61_patch()
1641 patch = vgxy61_read_reg(sensor, VGXY61_REG_FWPATCH_REVISION); in vgxy61_patch()
1661 static int vgxy61_detect_cut_version(struct vgxy61_dev *sensor) in vgxy61_detect_cut_version() argument
1663 struct i2c_client *client = sensor->i2c_client; in vgxy61_detect_cut_version()
1666 device_rev = vgxy61_read_reg(sensor, VGXY61_REG_REVISION); in vgxy61_detect_cut_version()
1687 static int vgxy61_detect(struct vgxy61_dev *sensor) in vgxy61_detect() argument
1689 struct i2c_client *client = sensor->i2c_client; in vgxy61_detect()
1693 id = vgxy61_read_reg(sensor, VGXY61_REG_MODEL_ID); in vgxy61_detect()
1697 dev_warn(&client->dev, "Unsupported sensor id %x\n", id); in vgxy61_detect()
1700 dev_dbg(&client->dev, "detected sensor id = 0x%04x\n", id); in vgxy61_detect()
1701 sensor->id = id; in vgxy61_detect()
1703 ret = vgxy61_wait_state(sensor, VGXY61_SYSTEM_FSM_SW_STBY, in vgxy61_detect()
1708 st = vgxy61_read_reg(sensor, VGXY61_REG_NVM); in vgxy61_detect()
1714 ret = vgxy61_detect_cut_version(sensor); in vgxy61_detect()
1726 struct vgxy61_dev *sensor = to_vgxy61_dev(sd); in vgxy61_power_on() local
1730 sensor->supplies); in vgxy61_power_on()
1736 ret = clk_prepare_enable(sensor->xclk); in vgxy61_power_on()
1742 if (sensor->reset_gpio) { in vgxy61_power_on()
1743 ret = vgxy61_apply_reset(sensor); in vgxy61_power_on()
1745 dev_err(&client->dev, "sensor reset failed %d\n", ret); in vgxy61_power_on()
1750 ret = vgxy61_detect(sensor); in vgxy61_power_on()
1752 dev_err(&client->dev, "sensor detect failed %d\n", ret); in vgxy61_power_on()
1756 ret = vgxy61_patch(sensor); in vgxy61_power_on()
1758 dev_err(&client->dev, "sensor patch failed %d\n", ret); in vgxy61_power_on()
1762 ret = vgxy61_configure(sensor); in vgxy61_power_on()
1764 dev_err(&client->dev, "sensor configuration failed %d\n", ret); in vgxy61_power_on()
1771 clk_disable_unprepare(sensor->xclk); in vgxy61_power_on()
1774 sensor->supplies); in vgxy61_power_on()
1783 struct vgxy61_dev *sensor = to_vgxy61_dev(sd); in vgxy61_power_off() local
1785 clk_disable_unprepare(sensor->xclk); in vgxy61_power_off()
1787 sensor->supplies); in vgxy61_power_off()
1791 static void vgxy61_fill_sensor_param(struct vgxy61_dev *sensor) in vgxy61_fill_sensor_param() argument
1793 if (sensor->id == VG5761_MODEL_ID) { in vgxy61_fill_sensor_param()
1794 sensor->sensor_width = VGX761_WIDTH; in vgxy61_fill_sensor_param()
1795 sensor->sensor_height = VGX761_HEIGHT; in vgxy61_fill_sensor_param()
1796 sensor->sensor_modes = vgx761_mode_data; in vgxy61_fill_sensor_param()
1797 sensor->sensor_modes_nb = ARRAY_SIZE(vgx761_mode_data); in vgxy61_fill_sensor_param()
1798 sensor->default_mode = &vgx761_mode_data[VGX761_DEFAULT_MODE]; in vgxy61_fill_sensor_param()
1799 sensor->rot_term = VGX761_SHORT_ROT_TERM; in vgxy61_fill_sensor_param()
1800 } else if (sensor->id == VG5661_MODEL_ID) { in vgxy61_fill_sensor_param()
1801 sensor->sensor_width = VGX661_WIDTH; in vgxy61_fill_sensor_param()
1802 sensor->sensor_height = VGX661_HEIGHT; in vgxy61_fill_sensor_param()
1803 sensor->sensor_modes = vgx661_mode_data; in vgxy61_fill_sensor_param()
1804 sensor->sensor_modes_nb = ARRAY_SIZE(vgx661_mode_data); in vgxy61_fill_sensor_param()
1805 sensor->default_mode = &vgx661_mode_data[VGX661_DEFAULT_MODE]; in vgxy61_fill_sensor_param()
1806 sensor->rot_term = VGX661_SHORT_ROT_TERM; in vgxy61_fill_sensor_param()
1811 sensor->current_mode = sensor->default_mode; in vgxy61_fill_sensor_param()
1818 struct vgxy61_dev *sensor; in vgxy61_probe() local
1821 sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL); in vgxy61_probe()
1822 if (!sensor) in vgxy61_probe()
1825 sensor->i2c_client = client; in vgxy61_probe()
1826 sensor->streaming = false; in vgxy61_probe()
1827 sensor->hdr = VGXY61_NO_HDR; in vgxy61_probe()
1828 sensor->expo_long = 200; in vgxy61_probe()
1829 sensor->expo_short = 0; in vgxy61_probe()
1830 sensor->hflip = false; in vgxy61_probe()
1831 sensor->vflip = false; in vgxy61_probe()
1832 sensor->analog_gain = 0; in vgxy61_probe()
1833 sensor->digital_gain = 256; in vgxy61_probe()
1841 ret = vgxy61_tx_from_ep(sensor, handle); in vgxy61_probe()
1848 sensor->xclk = devm_clk_get(dev, NULL); in vgxy61_probe()
1849 if (IS_ERR(sensor->xclk)) { in vgxy61_probe()
1851 return PTR_ERR(sensor->xclk); in vgxy61_probe()
1853 sensor->clk_freq = clk_get_rate(sensor->xclk); in vgxy61_probe()
1854 if (sensor->clk_freq < 6 * HZ_PER_MHZ || in vgxy61_probe()
1855 sensor->clk_freq > 27 * HZ_PER_MHZ) { in vgxy61_probe()
1857 sensor->clk_freq / HZ_PER_MHZ); in vgxy61_probe()
1860 sensor->gpios_polarity = in vgxy61_probe()
1863 v4l2_i2c_subdev_init(&sensor->sd, client, &vgxy61_subdev_ops); in vgxy61_probe()
1864 sensor->sd.internal_ops = &vgxy61_internal_ops; in vgxy61_probe()
1865 sensor->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | in vgxy61_probe()
1867 sensor->pad.flags = MEDIA_PAD_FL_SOURCE; in vgxy61_probe()
1868 sensor->sd.entity.ops = &vgxy61_subdev_entity_ops; in vgxy61_probe()
1869 sensor->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in vgxy61_probe()
1871 sensor->reset_gpio = devm_gpiod_get_optional(dev, "reset", in vgxy61_probe()
1874 ret = vgxy61_get_regulators(sensor); in vgxy61_probe()
1884 vgxy61_fill_sensor_param(sensor); in vgxy61_probe()
1885 vgxy61_fill_framefmt(sensor, sensor->current_mode, &sensor->fmt, in vgxy61_probe()
1888 mutex_init(&sensor->lock); in vgxy61_probe()
1890 ret = vgxy61_update_hdr(sensor, sensor->hdr); in vgxy61_probe()
1894 ret = vgxy61_init_controls(sensor); in vgxy61_probe()
1901 ret = media_entity_pads_init(&sensor->sd.entity, 1, &sensor->pad); in vgxy61_probe()
1912 ret = v4l2_async_register_subdev(&sensor->sd); in vgxy61_probe()
1928 media_entity_cleanup(&sensor->sd.entity); in vgxy61_probe()
1930 v4l2_ctrl_handler_free(sensor->sd.ctrl_handler); in vgxy61_probe()
1932 mutex_destroy(&sensor->lock); in vgxy61_probe()
1941 struct vgxy61_dev *sensor = to_vgxy61_dev(sd); in vgxy61_remove() local
1943 v4l2_async_unregister_subdev(&sensor->sd); in vgxy61_remove()
1944 mutex_destroy(&sensor->lock); in vgxy61_remove()
1945 media_entity_cleanup(&sensor->sd.entity); in vgxy61_remove()