Lines Matching full:sensor
12 * Based on smia-sensor.c by Tuukka Toivonen <tuukkat76@gmail.com>
60 static u32 smiapp_get_limit(struct smiapp_sensor *sensor, in smiapp_get_limit() argument
66 return sensor->limits[limit]; in smiapp_get_limit()
69 #define SMIA_LIM(sensor, limit) \ argument
70 smiapp_get_limit(sensor, SMIAPP_LIMIT_##limit)
72 static int smiapp_read_all_smia_limits(struct smiapp_sensor *sensor) in smiapp_read_all_smia_limits() argument
74 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_read_all_smia_limits()
82 sensor, smiapp_reg_limits[i].addr, &val); in smiapp_read_all_smia_limits()
86 sensor->limits[i] = val; in smiapp_read_all_smia_limits()
93 if (SMIA_LIM(sensor, SCALER_N_MIN) == 0) in smiapp_read_all_smia_limits()
94 smiapp_replace_limit(sensor, SMIAPP_LIMIT_SCALER_N_MIN, 16); in smiapp_read_all_smia_limits()
99 static int smiapp_read_frame_fmt(struct smiapp_sensor *sensor) in smiapp_read_frame_fmt() argument
101 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_read_frame_fmt()
108 rval = smiapp_read(sensor, SMIAPP_REG_U8_FRAME_FORMAT_MODEL_TYPE, in smiapp_read_frame_fmt()
113 rval = smiapp_read(sensor, SMIAPP_REG_U8_FRAME_FORMAT_MODEL_SUBTYPE, in smiapp_read_frame_fmt()
140 rval = smiapp_read(sensor, reg, &desc); in smiapp_read_frame_fmt()
152 rval = smiapp_read(sensor, reg, &desc); in smiapp_read_frame_fmt()
201 sensor->visible_pixel_start = pixel_count; in smiapp_read_frame_fmt()
209 if (sensor->embedded_end) in smiapp_read_frame_fmt()
211 sensor->embedded_start = line_count; in smiapp_read_frame_fmt()
212 sensor->embedded_end = line_count + pixels; in smiapp_read_frame_fmt()
215 sensor->image_start = line_count; in smiapp_read_frame_fmt()
221 if (sensor->embedded_end > sensor->image_start) { in smiapp_read_frame_fmt()
224 sensor->embedded_end, sensor->image_start); in smiapp_read_frame_fmt()
225 sensor->image_start = sensor->embedded_end; in smiapp_read_frame_fmt()
229 sensor->embedded_start, sensor->embedded_end); in smiapp_read_frame_fmt()
231 sensor->image_start); in smiapp_read_frame_fmt()
236 static int smiapp_pll_configure(struct smiapp_sensor *sensor) in smiapp_pll_configure() argument
238 struct smiapp_pll *pll = &sensor->pll; in smiapp_pll_configure()
242 sensor, SMIAPP_REG_U16_VT_PIX_CLK_DIV, pll->vt.pix_clk_div); in smiapp_pll_configure()
247 sensor, SMIAPP_REG_U16_VT_SYS_CLK_DIV, pll->vt.sys_clk_div); in smiapp_pll_configure()
252 sensor, SMIAPP_REG_U16_PRE_PLL_CLK_DIV, pll->pre_pll_clk_div); in smiapp_pll_configure()
257 sensor, SMIAPP_REG_U16_PLL_MULTIPLIER, pll->pll_multiplier); in smiapp_pll_configure()
263 sensor, SMIAPP_REG_U32_REQUESTED_LINK_BIT_RATE_MBPS, in smiapp_pll_configure()
265 if (rval < 0 || sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0) in smiapp_pll_configure()
269 sensor, SMIAPP_REG_U16_OP_PIX_CLK_DIV, pll->op.pix_clk_div); in smiapp_pll_configure()
274 sensor, SMIAPP_REG_U16_OP_SYS_CLK_DIV, pll->op.sys_clk_div); in smiapp_pll_configure()
277 static int smiapp_pll_try(struct smiapp_sensor *sensor, in smiapp_pll_try() argument
280 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_pll_try()
282 .min_pre_pll_clk_div = SMIA_LIM(sensor, MIN_PRE_PLL_CLK_DIV), in smiapp_pll_try()
283 .max_pre_pll_clk_div = SMIA_LIM(sensor, MAX_PRE_PLL_CLK_DIV), in smiapp_pll_try()
284 .min_pll_ip_freq_hz = SMIA_LIM(sensor, MIN_PLL_IP_FREQ_HZ), in smiapp_pll_try()
285 .max_pll_ip_freq_hz = SMIA_LIM(sensor, MAX_PLL_IP_FREQ_HZ), in smiapp_pll_try()
286 .min_pll_multiplier = SMIA_LIM(sensor, MIN_PLL_MULTIPLIER), in smiapp_pll_try()
287 .max_pll_multiplier = SMIA_LIM(sensor, MAX_PLL_MULTIPLIER), in smiapp_pll_try()
288 .min_pll_op_freq_hz = SMIA_LIM(sensor, MIN_PLL_OP_FREQ_HZ), in smiapp_pll_try()
289 .max_pll_op_freq_hz = SMIA_LIM(sensor, MAX_PLL_OP_FREQ_HZ), in smiapp_pll_try()
291 .op.min_sys_clk_div = SMIA_LIM(sensor, MIN_OP_SYS_CLK_DIV), in smiapp_pll_try()
292 .op.max_sys_clk_div = SMIA_LIM(sensor, MAX_OP_SYS_CLK_DIV), in smiapp_pll_try()
293 .op.min_pix_clk_div = SMIA_LIM(sensor, MIN_OP_PIX_CLK_DIV), in smiapp_pll_try()
294 .op.max_pix_clk_div = SMIA_LIM(sensor, MAX_OP_PIX_CLK_DIV), in smiapp_pll_try()
295 .op.min_sys_clk_freq_hz = SMIA_LIM(sensor, MIN_OP_SYS_CLK_FREQ_HZ), in smiapp_pll_try()
296 .op.max_sys_clk_freq_hz = SMIA_LIM(sensor, MAX_OP_SYS_CLK_FREQ_HZ), in smiapp_pll_try()
297 .op.min_pix_clk_freq_hz = SMIA_LIM(sensor, MIN_OP_PIX_CLK_FREQ_HZ), in smiapp_pll_try()
298 .op.max_pix_clk_freq_hz = SMIA_LIM(sensor, MAX_OP_PIX_CLK_FREQ_HZ), in smiapp_pll_try()
300 .vt.min_sys_clk_div = SMIA_LIM(sensor, MIN_VT_SYS_CLK_DIV), in smiapp_pll_try()
301 .vt.max_sys_clk_div = SMIA_LIM(sensor, MAX_VT_SYS_CLK_DIV), in smiapp_pll_try()
302 .vt.min_pix_clk_div = SMIA_LIM(sensor, MIN_VT_PIX_CLK_DIV), in smiapp_pll_try()
303 .vt.max_pix_clk_div = SMIA_LIM(sensor, MAX_VT_PIX_CLK_DIV), in smiapp_pll_try()
304 .vt.min_sys_clk_freq_hz = SMIA_LIM(sensor, MIN_VT_SYS_CLK_FREQ_HZ), in smiapp_pll_try()
305 .vt.max_sys_clk_freq_hz = SMIA_LIM(sensor, MAX_VT_SYS_CLK_FREQ_HZ), in smiapp_pll_try()
306 .vt.min_pix_clk_freq_hz = SMIA_LIM(sensor, MIN_VT_PIX_CLK_FREQ_HZ), in smiapp_pll_try()
307 .vt.max_pix_clk_freq_hz = SMIA_LIM(sensor, MAX_VT_PIX_CLK_FREQ_HZ), in smiapp_pll_try()
309 .min_line_length_pck_bin = SMIA_LIM(sensor, MIN_LINE_LENGTH_PCK_BIN), in smiapp_pll_try()
310 .min_line_length_pck = SMIA_LIM(sensor, MIN_LINE_LENGTH_PCK), in smiapp_pll_try()
316 static int smiapp_pll_update(struct smiapp_sensor *sensor) in smiapp_pll_update() argument
318 struct smiapp_pll *pll = &sensor->pll; in smiapp_pll_update()
321 pll->binning_horizontal = sensor->binning_horizontal; in smiapp_pll_update()
322 pll->binning_vertical = sensor->binning_vertical; in smiapp_pll_update()
324 sensor->link_freq->qmenu_int[sensor->link_freq->val]; in smiapp_pll_update()
325 pll->scale_m = sensor->scale_m; in smiapp_pll_update()
326 pll->bits_per_pixel = sensor->csi_format->compressed; in smiapp_pll_update()
328 rval = smiapp_pll_try(sensor, pll); in smiapp_pll_update()
332 __v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_parray, in smiapp_pll_update()
334 __v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_csi, pll->pixel_rate_csi); in smiapp_pll_update()
346 static void __smiapp_update_exposure_limits(struct smiapp_sensor *sensor) in __smiapp_update_exposure_limits() argument
348 struct v4l2_ctrl *ctrl = sensor->exposure; in __smiapp_update_exposure_limits()
351 max = sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height in __smiapp_update_exposure_limits()
352 + sensor->vblank->val in __smiapp_update_exposure_limits()
353 - SMIA_LIM(sensor, COARSE_INTEGRATION_TIME_MAX_MARGIN); in __smiapp_update_exposure_limits()
399 static u32 smiapp_pixel_order(struct smiapp_sensor *sensor) in smiapp_pixel_order() argument
401 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_pixel_order()
404 if (sensor->hflip) { in smiapp_pixel_order()
405 if (sensor->hflip->val) in smiapp_pixel_order()
408 if (sensor->vflip->val) in smiapp_pixel_order()
412 flip ^= sensor->hvflip_inv_mask; in smiapp_pixel_order()
415 return sensor->default_pixel_order ^ flip; in smiapp_pixel_order()
418 static void smiapp_update_mbus_formats(struct smiapp_sensor *sensor) in smiapp_update_mbus_formats() argument
420 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_update_mbus_formats()
422 to_csi_format_idx(sensor->csi_format) & ~3; in smiapp_update_mbus_formats()
424 to_csi_format_idx(sensor->internal_csi_format) & ~3; in smiapp_update_mbus_formats()
425 unsigned int pixel_order = smiapp_pixel_order(sensor); in smiapp_update_mbus_formats()
427 sensor->mbus_frame_fmts = in smiapp_update_mbus_formats()
428 sensor->default_mbus_frame_fmts << pixel_order; in smiapp_update_mbus_formats()
429 sensor->csi_format = in smiapp_update_mbus_formats()
431 sensor->internal_csi_format = in smiapp_update_mbus_formats()
452 struct smiapp_sensor *sensor = in smiapp_set_ctrl() local
454 ->sensor; in smiapp_set_ctrl()
455 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_set_ctrl()
465 if (sensor->streaming) in smiapp_set_ctrl()
468 if (sensor->hflip->val) in smiapp_set_ctrl()
471 if (sensor->vflip->val) in smiapp_set_ctrl()
474 orient ^= sensor->hvflip_inv_mask; in smiapp_set_ctrl()
476 smiapp_update_mbus_formats(sensor); in smiapp_set_ctrl()
480 exposure = sensor->exposure->val; in smiapp_set_ctrl()
482 __smiapp_update_exposure_limits(sensor); in smiapp_set_ctrl()
484 if (exposure > sensor->exposure->maximum) { in smiapp_set_ctrl()
485 sensor->exposure->val = sensor->exposure->maximum; in smiapp_set_ctrl()
486 rval = smiapp_set_ctrl(sensor->exposure); in smiapp_set_ctrl()
493 if (sensor->streaming) in smiapp_set_ctrl()
496 rval = smiapp_pll_update(sensor); in smiapp_set_ctrl()
502 for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++) in smiapp_set_ctrl()
504 sensor->test_data[i], in smiapp_set_ctrl()
518 sensor, in smiapp_set_ctrl()
524 sensor, in smiapp_set_ctrl()
530 rval = smiapp_write(sensor, SMIAPP_REG_U8_IMAGE_ORIENTATION, in smiapp_set_ctrl()
536 sensor, SMIAPP_REG_U16_FRAME_LENGTH_LINES, in smiapp_set_ctrl()
537 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height in smiapp_set_ctrl()
543 sensor, SMIAPP_REG_U16_LINE_LENGTH_PCK, in smiapp_set_ctrl()
544 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width in smiapp_set_ctrl()
550 sensor, SMIAPP_REG_U16_TEST_PATTERN_MODE, ctrl->val); in smiapp_set_ctrl()
555 sensor, SMIAPP_REG_U16_TEST_DATA_RED, ctrl->val); in smiapp_set_ctrl()
560 sensor, SMIAPP_REG_U16_TEST_DATA_GREENR, ctrl->val); in smiapp_set_ctrl()
565 sensor, SMIAPP_REG_U16_TEST_DATA_BLUE, ctrl->val); in smiapp_set_ctrl()
570 sensor, SMIAPP_REG_U16_TEST_DATA_GREENB, ctrl->val); in smiapp_set_ctrl()
594 static int smiapp_init_controls(struct smiapp_sensor *sensor) in smiapp_init_controls() argument
596 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_init_controls()
599 rval = v4l2_ctrl_handler_init(&sensor->pixel_array->ctrl_handler, 12); in smiapp_init_controls()
603 sensor->pixel_array->ctrl_handler.lock = &sensor->mutex; in smiapp_init_controls()
605 sensor->analog_gain = v4l2_ctrl_new_std( in smiapp_init_controls()
606 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
608 SMIA_LIM(sensor, ANALOGUE_GAIN_CODE_MIN), in smiapp_init_controls()
609 SMIA_LIM(sensor, ANALOGUE_GAIN_CODE_MAX), in smiapp_init_controls()
610 max(SMIA_LIM(sensor, ANALOGUE_GAIN_CODE_STEP), 1U), in smiapp_init_controls()
611 SMIA_LIM(sensor, ANALOGUE_GAIN_CODE_MIN)); in smiapp_init_controls()
614 sensor->exposure = v4l2_ctrl_new_std( in smiapp_init_controls()
615 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
618 sensor->hflip = v4l2_ctrl_new_std( in smiapp_init_controls()
619 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
621 sensor->vflip = v4l2_ctrl_new_std( in smiapp_init_controls()
622 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
625 sensor->vblank = v4l2_ctrl_new_std( in smiapp_init_controls()
626 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
629 if (sensor->vblank) in smiapp_init_controls()
630 sensor->vblank->flags |= V4L2_CTRL_FLAG_UPDATE; in smiapp_init_controls()
632 sensor->hblank = v4l2_ctrl_new_std( in smiapp_init_controls()
633 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
636 if (sensor->hblank) in smiapp_init_controls()
637 sensor->hblank->flags |= V4L2_CTRL_FLAG_UPDATE; in smiapp_init_controls()
639 sensor->pixel_rate_parray = v4l2_ctrl_new_std( in smiapp_init_controls()
640 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
643 v4l2_ctrl_new_std_menu_items(&sensor->pixel_array->ctrl_handler, in smiapp_init_controls()
648 if (sensor->pixel_array->ctrl_handler.error) { in smiapp_init_controls()
651 sensor->pixel_array->ctrl_handler.error); in smiapp_init_controls()
652 return sensor->pixel_array->ctrl_handler.error; in smiapp_init_controls()
655 sensor->pixel_array->sd.ctrl_handler = in smiapp_init_controls()
656 &sensor->pixel_array->ctrl_handler; in smiapp_init_controls()
658 v4l2_ctrl_cluster(2, &sensor->hflip); in smiapp_init_controls()
660 rval = v4l2_ctrl_handler_init(&sensor->src->ctrl_handler, 0); in smiapp_init_controls()
664 sensor->src->ctrl_handler.lock = &sensor->mutex; in smiapp_init_controls()
666 sensor->pixel_rate_csi = v4l2_ctrl_new_std( in smiapp_init_controls()
667 &sensor->src->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
670 if (sensor->src->ctrl_handler.error) { in smiapp_init_controls()
673 sensor->src->ctrl_handler.error); in smiapp_init_controls()
674 return sensor->src->ctrl_handler.error; in smiapp_init_controls()
677 sensor->src->sd.ctrl_handler = &sensor->src->ctrl_handler; in smiapp_init_controls()
686 static int smiapp_init_late_controls(struct smiapp_sensor *sensor) in smiapp_init_late_controls() argument
688 unsigned long *valid_link_freqs = &sensor->valid_link_freqs[ in smiapp_init_late_controls()
689 sensor->csi_format->compressed - sensor->compressed_min_bpp]; in smiapp_init_late_controls()
692 for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++) { in smiapp_init_late_controls()
693 int max_value = (1 << sensor->csi_format->width) - 1; in smiapp_init_late_controls()
695 sensor->test_data[i] = v4l2_ctrl_new_std( in smiapp_init_late_controls()
696 &sensor->pixel_array->ctrl_handler, in smiapp_init_late_controls()
701 sensor->link_freq = v4l2_ctrl_new_int_menu( in smiapp_init_late_controls()
702 &sensor->src->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_late_controls()
704 __ffs(*valid_link_freqs), sensor->hwcfg->op_sys_clock); in smiapp_init_late_controls()
706 return sensor->src->ctrl_handler.error; in smiapp_init_late_controls()
709 static void smiapp_free_controls(struct smiapp_sensor *sensor) in smiapp_free_controls() argument
713 for (i = 0; i < sensor->ssds_used; i++) in smiapp_free_controls()
714 v4l2_ctrl_handler_free(&sensor->ssds[i].ctrl_handler); in smiapp_free_controls()
717 static int smiapp_get_mbus_formats(struct smiapp_sensor *sensor) in smiapp_get_mbus_formats() argument
719 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_get_mbus_formats()
720 struct smiapp_pll *pll = &sensor->pll; in smiapp_get_mbus_formats()
727 sensor, SMIAPP_REG_U8_DATA_FORMAT_MODEL_TYPE, &type); in smiapp_get_mbus_formats()
733 rval = smiapp_read(sensor, SMIAPP_REG_U8_PIXEL_ORDER, in smiapp_get_mbus_formats()
757 sensor->default_pixel_order = pixel_order; in smiapp_get_mbus_formats()
758 sensor->mbus_frame_fmts = 0; in smiapp_get_mbus_formats()
764 sensor, in smiapp_get_mbus_formats()
784 sensor->default_mbus_frame_fmts |= 1 << j; in smiapp_get_mbus_formats()
791 pll->scale_m = sensor->scale_m; in smiapp_get_mbus_formats()
794 sensor->compressed_min_bpp = in smiapp_get_mbus_formats()
796 sensor->compressed_min_bpp); in smiapp_get_mbus_formats()
802 sensor->valid_link_freqs = devm_kcalloc( in smiapp_get_mbus_formats()
804 compressed_max_bpp - sensor->compressed_min_bpp + 1, in smiapp_get_mbus_formats()
805 sizeof(*sensor->valid_link_freqs), GFP_KERNEL); in smiapp_get_mbus_formats()
806 if (!sensor->valid_link_freqs) in smiapp_get_mbus_formats()
813 &sensor->valid_link_freqs[ in smiapp_get_mbus_formats()
814 f->compressed - sensor->compressed_min_bpp]; in smiapp_get_mbus_formats()
817 if (!(sensor->default_mbus_frame_fmts & 1 << i)) in smiapp_get_mbus_formats()
822 for (j = 0; sensor->hwcfg->op_sys_clock[j]; j++) { in smiapp_get_mbus_formats()
823 pll->link_freq = sensor->hwcfg->op_sys_clock[j]; in smiapp_get_mbus_formats()
825 rval = smiapp_pll_try(sensor, pll); in smiapp_get_mbus_formats()
839 sensor->default_mbus_frame_fmts &= ~BIT(i); in smiapp_get_mbus_formats()
843 if (!sensor->csi_format in smiapp_get_mbus_formats()
844 || f->width > sensor->csi_format->width in smiapp_get_mbus_formats()
845 || (f->width == sensor->csi_format->width in smiapp_get_mbus_formats()
846 && f->compressed > sensor->csi_format->compressed)) { in smiapp_get_mbus_formats()
847 sensor->csi_format = f; in smiapp_get_mbus_formats()
848 sensor->internal_csi_format = f; in smiapp_get_mbus_formats()
852 if (!sensor->csi_format) { in smiapp_get_mbus_formats()
857 smiapp_update_mbus_formats(sensor); in smiapp_get_mbus_formats()
862 static void smiapp_update_blanking(struct smiapp_sensor *sensor) in smiapp_update_blanking() argument
864 struct v4l2_ctrl *vblank = sensor->vblank; in smiapp_update_blanking()
865 struct v4l2_ctrl *hblank = sensor->hblank; in smiapp_update_blanking()
869 if (sensor->binning_vertical > 1 || sensor->binning_horizontal > 1) { in smiapp_update_blanking()
870 min_fll = SMIA_LIM(sensor, MIN_FRAME_LENGTH_LINES_BIN); in smiapp_update_blanking()
871 max_fll = SMIA_LIM(sensor, MAX_FRAME_LENGTH_LINES_BIN); in smiapp_update_blanking()
872 min_llp = SMIA_LIM(sensor, MIN_LINE_LENGTH_PCK_BIN); in smiapp_update_blanking()
873 max_llp = SMIA_LIM(sensor, MAX_LINE_LENGTH_PCK_BIN); in smiapp_update_blanking()
874 min_lbp = SMIA_LIM(sensor, MIN_LINE_BLANKING_PCK_BIN); in smiapp_update_blanking()
876 min_fll = SMIA_LIM(sensor, MIN_FRAME_LENGTH_LINES); in smiapp_update_blanking()
877 max_fll = SMIA_LIM(sensor, MAX_FRAME_LENGTH_LINES); in smiapp_update_blanking()
878 min_llp = SMIA_LIM(sensor, MIN_LINE_LENGTH_PCK); in smiapp_update_blanking()
879 max_llp = SMIA_LIM(sensor, MAX_LINE_LENGTH_PCK); in smiapp_update_blanking()
880 min_lbp = SMIA_LIM(sensor, MIN_LINE_BLANKING_PCK); in smiapp_update_blanking()
884 SMIA_LIM(sensor, MIN_FRAME_BLANKING_LINES), in smiapp_update_blanking()
886 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height); in smiapp_update_blanking()
887 max = max_fll - sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height; in smiapp_update_blanking()
893 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width, in smiapp_update_blanking()
895 max = max_llp - sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width; in smiapp_update_blanking()
899 __smiapp_update_exposure_limits(sensor); in smiapp_update_blanking()
902 static int smiapp_pll_blanking_update(struct smiapp_sensor *sensor) in smiapp_pll_blanking_update() argument
904 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_pll_blanking_update()
907 rval = smiapp_pll_update(sensor); in smiapp_pll_blanking_update()
912 smiapp_update_blanking(sensor); in smiapp_pll_blanking_update()
914 dev_dbg(&client->dev, "vblank\t\t%d\n", sensor->vblank->val); in smiapp_pll_blanking_update()
915 dev_dbg(&client->dev, "hblank\t\t%d\n", sensor->hblank->val); in smiapp_pll_blanking_update()
918 sensor->pll.pixel_rate_pixel_array / in smiapp_pll_blanking_update()
919 ((sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width in smiapp_pll_blanking_update()
920 + sensor->hblank->val) * in smiapp_pll_blanking_update()
921 (sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height in smiapp_pll_blanking_update()
922 + sensor->vblank->val) / 100)); in smiapp_pll_blanking_update()
933 static int smiapp_read_nvm_page(struct smiapp_sensor *sensor, u32 p, u8 *nvm, in smiapp_read_nvm_page() argument
942 rval = smiapp_write(sensor, in smiapp_read_nvm_page()
947 rval = smiapp_write(sensor, SMIAPP_REG_U8_DATA_TRANSFER_IF_1_CTRL, in smiapp_read_nvm_page()
952 rval = smiapp_read(sensor, SMIAPP_REG_U8_DATA_TRANSFER_IF_1_STATUS, in smiapp_read_nvm_page()
962 if (SMIA_LIM(sensor, DATA_TRANSFER_IF_CAPABILITY) & in smiapp_read_nvm_page()
969 sensor, in smiapp_read_nvm_page()
984 rval = smiapp_read(sensor, in smiapp_read_nvm_page()
996 static int smiapp_read_nvm(struct smiapp_sensor *sensor, unsigned char *nvm, in smiapp_read_nvm() argument
1004 rval = smiapp_read_nvm_page(sensor, p, nvm, &status); in smiapp_read_nvm()
1012 rval2 = smiapp_write(sensor, SMIAPP_REG_U8_DATA_TRANSFER_IF_1_CTRL, 0); in smiapp_read_nvm()
1024 static int smiapp_change_cci_addr(struct smiapp_sensor *sensor) in smiapp_change_cci_addr() argument
1026 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_change_cci_addr()
1030 client->addr = sensor->hwcfg->i2c_addr_dfl; in smiapp_change_cci_addr()
1032 rval = smiapp_write(sensor, in smiapp_change_cci_addr()
1034 sensor->hwcfg->i2c_addr_alt << 1); in smiapp_change_cci_addr()
1038 client->addr = sensor->hwcfg->i2c_addr_alt; in smiapp_change_cci_addr()
1041 rval = smiapp_read(sensor, SMIAPP_REG_U8_CCI_ADDRESS_CONTROL, &val); in smiapp_change_cci_addr()
1045 if (val != sensor->hwcfg->i2c_addr_alt << 1) in smiapp_change_cci_addr()
1056 static int smiapp_setup_flash_strobe(struct smiapp_sensor *sensor) in smiapp_setup_flash_strobe() argument
1059 unsigned int ext_freq = sensor->hwcfg->ext_clk; in smiapp_setup_flash_strobe()
1065 strobe_setup = sensor->hwcfg->strobe_setup; in smiapp_setup_flash_strobe()
1147 rval = smiapp_write(sensor, SMIAPP_REG_U8_FLASH_MODE_RS, in smiapp_setup_flash_strobe()
1152 rval = smiapp_write(sensor, SMIAPP_REG_U8_FLASH_STROBE_ADJUSTMENT, in smiapp_setup_flash_strobe()
1158 sensor, SMIAPP_REG_U16_TFLASH_STROBE_WIDTH_HIGH_RS_CTRL, in smiapp_setup_flash_strobe()
1163 rval = smiapp_write(sensor, SMIAPP_REG_U16_TFLASH_STROBE_DELAY_RS_CTRL, in smiapp_setup_flash_strobe()
1168 rval = smiapp_write(sensor, SMIAPP_REG_U16_FLASH_STROBE_START_POINT, in smiapp_setup_flash_strobe()
1173 rval = smiapp_write(sensor, SMIAPP_REG_U8_FLASH_TRIGGER_RS, in smiapp_setup_flash_strobe()
1177 sensor->hwcfg->strobe_setup->trigger = 0; in smiapp_setup_flash_strobe()
1195 struct smiapp_sensor *sensor = in smiapp_power_on() local
1200 rval = regulator_enable(sensor->vana); in smiapp_power_on()
1207 rval = clk_prepare_enable(sensor->ext_clk); in smiapp_power_on()
1214 gpiod_set_value(sensor->xshutdown, 1); in smiapp_power_on()
1216 sleep = SMIAPP_RESET_DELAY(sensor->hwcfg->ext_clk); in smiapp_power_on()
1221 * Those failures seem to be caused by the sensor requiring a longer in smiapp_power_on()
1230 if (sensor->hwcfg->i2c_addr_alt) { in smiapp_power_on()
1231 rval = smiapp_change_cci_addr(sensor); in smiapp_power_on()
1238 rval = smiapp_write(sensor, SMIAPP_REG_U8_SOFTWARE_RESET, in smiapp_power_on()
1245 if (sensor->hwcfg->i2c_addr_alt) { in smiapp_power_on()
1246 rval = smiapp_change_cci_addr(sensor); in smiapp_power_on()
1253 rval = smiapp_write(sensor, SMIAPP_REG_U16_COMPRESSION_MODE, in smiapp_power_on()
1261 sensor, SMIAPP_REG_U16_EXTCLK_FREQUENCY_MHZ, in smiapp_power_on()
1262 sensor->hwcfg->ext_clk / (1000000 / (1 << 8))); in smiapp_power_on()
1268 rval = smiapp_write(sensor, SMIAPP_REG_U8_CSI_LANE_MODE, in smiapp_power_on()
1269 sensor->hwcfg->lanes - 1); in smiapp_power_on()
1275 rval = smiapp_write(sensor, SMIAPP_REG_U8_FAST_STANDBY_CTRL, in smiapp_power_on()
1282 rval = smiapp_write(sensor, SMIAPP_REG_U8_CSI_SIGNALLING_MODE, in smiapp_power_on()
1283 sensor->hwcfg->csi_signalling_mode); in smiapp_power_on()
1289 /* DPHY control done by sensor based on requested link rate */ in smiapp_power_on()
1290 rval = smiapp_write(sensor, SMIAPP_REG_U8_DPHY_CTRL, in smiapp_power_on()
1295 rval = smiapp_call_quirk(sensor, post_poweron); in smiapp_power_on()
1304 gpiod_set_value(sensor->xshutdown, 0); in smiapp_power_on()
1305 clk_disable_unprepare(sensor->ext_clk); in smiapp_power_on()
1308 regulator_disable(sensor->vana); in smiapp_power_on()
1318 struct smiapp_sensor *sensor = in smiapp_power_off() local
1323 * but they are essentially the same signals. So if the sensor is in smiapp_power_off()
1324 * powered off while the lens is powered on the sensor does not in smiapp_power_off()
1328 if (sensor->hwcfg->i2c_addr_alt) in smiapp_power_off()
1329 smiapp_write(sensor, in smiapp_power_off()
1333 gpiod_set_value(sensor->xshutdown, 0); in smiapp_power_off()
1334 clk_disable_unprepare(sensor->ext_clk); in smiapp_power_off()
1336 regulator_disable(sensor->vana); in smiapp_power_off()
1337 sensor->streaming = false; in smiapp_power_off()
1346 static int smiapp_start_streaming(struct smiapp_sensor *sensor) in smiapp_start_streaming() argument
1348 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_start_streaming()
1352 mutex_lock(&sensor->mutex); in smiapp_start_streaming()
1354 rval = smiapp_write(sensor, SMIAPP_REG_U16_CSI_DATA_FORMAT, in smiapp_start_streaming()
1355 (sensor->csi_format->width << 8) | in smiapp_start_streaming()
1356 sensor->csi_format->compressed); in smiapp_start_streaming()
1361 if (sensor->binning_horizontal == 1 && in smiapp_start_streaming()
1362 sensor->binning_vertical == 1) { in smiapp_start_streaming()
1366 (sensor->binning_horizontal << 4) in smiapp_start_streaming()
1367 | sensor->binning_vertical; in smiapp_start_streaming()
1370 sensor, SMIAPP_REG_U8_BINNING_TYPE, binning_type); in smiapp_start_streaming()
1376 rval = smiapp_write(sensor, SMIAPP_REG_U8_BINNING_MODE, binning_mode); in smiapp_start_streaming()
1381 rval = smiapp_pll_configure(sensor); in smiapp_start_streaming()
1386 rval = smiapp_write(sensor, SMIAPP_REG_U16_X_ADDR_START, in smiapp_start_streaming()
1387 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].left); in smiapp_start_streaming()
1391 rval = smiapp_write(sensor, SMIAPP_REG_U16_Y_ADDR_START, in smiapp_start_streaming()
1392 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].top); in smiapp_start_streaming()
1398 sensor, SMIAPP_REG_U16_X_ADDR_END, in smiapp_start_streaming()
1399 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].left in smiapp_start_streaming()
1400 + sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width - 1); in smiapp_start_streaming()
1405 sensor, SMIAPP_REG_U16_Y_ADDR_END, in smiapp_start_streaming()
1406 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].top in smiapp_start_streaming()
1407 + sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height - 1); in smiapp_start_streaming()
1417 if (SMIA_LIM(sensor, DIGITAL_CROP_CAPABILITY) in smiapp_start_streaming()
1420 sensor, SMIAPP_REG_U16_DIGITAL_CROP_X_OFFSET, in smiapp_start_streaming()
1421 sensor->scaler->crop[SMIAPP_PAD_SINK].left); in smiapp_start_streaming()
1426 sensor, SMIAPP_REG_U16_DIGITAL_CROP_Y_OFFSET, in smiapp_start_streaming()
1427 sensor->scaler->crop[SMIAPP_PAD_SINK].top); in smiapp_start_streaming()
1432 sensor, SMIAPP_REG_U16_DIGITAL_CROP_IMAGE_WIDTH, in smiapp_start_streaming()
1433 sensor->scaler->crop[SMIAPP_PAD_SINK].width); in smiapp_start_streaming()
1438 sensor, SMIAPP_REG_U16_DIGITAL_CROP_IMAGE_HEIGHT, in smiapp_start_streaming()
1439 sensor->scaler->crop[SMIAPP_PAD_SINK].height); in smiapp_start_streaming()
1445 if (SMIA_LIM(sensor, SCALING_CAPABILITY) in smiapp_start_streaming()
1447 rval = smiapp_write(sensor, SMIAPP_REG_U16_SCALING_MODE, in smiapp_start_streaming()
1448 sensor->scaling_mode); in smiapp_start_streaming()
1452 rval = smiapp_write(sensor, SMIAPP_REG_U16_SCALE_M, in smiapp_start_streaming()
1453 sensor->scale_m); in smiapp_start_streaming()
1458 /* Output size from sensor */ in smiapp_start_streaming()
1459 rval = smiapp_write(sensor, SMIAPP_REG_U16_X_OUTPUT_SIZE, in smiapp_start_streaming()
1460 sensor->src->crop[SMIAPP_PAD_SRC].width); in smiapp_start_streaming()
1463 rval = smiapp_write(sensor, SMIAPP_REG_U16_Y_OUTPUT_SIZE, in smiapp_start_streaming()
1464 sensor->src->crop[SMIAPP_PAD_SRC].height); in smiapp_start_streaming()
1468 if ((SMIA_LIM(sensor, FLASH_MODE_CAPABILITY) & in smiapp_start_streaming()
1471 sensor->hwcfg->strobe_setup != NULL && in smiapp_start_streaming()
1472 sensor->hwcfg->strobe_setup->trigger != 0) { in smiapp_start_streaming()
1473 rval = smiapp_setup_flash_strobe(sensor); in smiapp_start_streaming()
1478 rval = smiapp_call_quirk(sensor, pre_streamon); in smiapp_start_streaming()
1484 rval = smiapp_write(sensor, SMIAPP_REG_U8_MODE_SELECT, in smiapp_start_streaming()
1488 mutex_unlock(&sensor->mutex); in smiapp_start_streaming()
1493 static int smiapp_stop_streaming(struct smiapp_sensor *sensor) in smiapp_stop_streaming() argument
1495 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_stop_streaming()
1498 mutex_lock(&sensor->mutex); in smiapp_stop_streaming()
1499 rval = smiapp_write(sensor, SMIAPP_REG_U8_MODE_SELECT, in smiapp_stop_streaming()
1504 rval = smiapp_call_quirk(sensor, post_streamoff); in smiapp_stop_streaming()
1509 mutex_unlock(&sensor->mutex); in smiapp_stop_streaming()
1517 static int smiapp_pm_get_init(struct smiapp_sensor *sensor) in smiapp_pm_get_init() argument
1519 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_pm_get_init()
1530 rval = v4l2_ctrl_handler_setup(&sensor->pixel_array-> in smiapp_pm_get_init()
1535 return v4l2_ctrl_handler_setup(&sensor->src->ctrl_handler); in smiapp_pm_get_init()
1543 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_stream() local
1544 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_set_stream()
1547 if (sensor->streaming == enable) in smiapp_set_stream()
1551 smiapp_stop_streaming(sensor); in smiapp_set_stream()
1552 sensor->streaming = false; in smiapp_set_stream()
1559 rval = smiapp_pm_get_init(sensor); in smiapp_set_stream()
1563 sensor->streaming = true; in smiapp_set_stream()
1565 rval = smiapp_start_streaming(sensor); in smiapp_set_stream()
1567 sensor->streaming = false; in smiapp_set_stream()
1580 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_enum_mbus_code() local
1585 mutex_lock(&sensor->mutex); in smiapp_enum_mbus_code()
1590 if (subdev != &sensor->src->sd || code->pad != SMIAPP_PAD_SRC) { in smiapp_enum_mbus_code()
1594 code->code = sensor->internal_csi_format->code; in smiapp_enum_mbus_code()
1600 if (sensor->mbus_frame_fmts & (1 << i)) in smiapp_enum_mbus_code()
1613 mutex_unlock(&sensor->mutex); in smiapp_enum_mbus_code()
1621 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in __smiapp_get_mbus_code() local
1623 if (subdev == &sensor->src->sd && pad == SMIAPP_PAD_SRC) in __smiapp_get_mbus_code()
1624 return sensor->csi_format->code; in __smiapp_get_mbus_code()
1626 return sensor->internal_csi_format->code; in __smiapp_get_mbus_code()
1659 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_get_format() local
1662 mutex_lock(&sensor->mutex); in smiapp_get_format()
1664 mutex_unlock(&sensor->mutex); in smiapp_get_format()
1703 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_propagate() local
1714 if (ssd == sensor->scaler) { in smiapp_propagate()
1715 sensor->scale_m = in smiapp_propagate()
1716 SMIA_LIM(sensor, SCALER_N_MIN); in smiapp_propagate()
1717 sensor->scaling_mode = in smiapp_propagate()
1719 } else if (ssd == sensor->binner) { in smiapp_propagate()
1720 sensor->binning_horizontal = 1; in smiapp_propagate()
1721 sensor->binning_vertical = 1; in smiapp_propagate()
1734 *smiapp_validate_csi_data_format(struct smiapp_sensor *sensor, u32 code) in smiapp_validate_csi_data_format() argument
1739 if (sensor->mbus_frame_fmts & (1 << i) in smiapp_validate_csi_data_format()
1744 return sensor->csi_format; in smiapp_validate_csi_data_format()
1751 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_format_source() local
1753 *old_csi_format = sensor->csi_format; in smiapp_set_format_source()
1767 if (subdev != &sensor->src->sd) in smiapp_set_format_source()
1770 csi_format = smiapp_validate_csi_data_format(sensor, code); in smiapp_set_format_source()
1777 sensor->csi_format = csi_format; in smiapp_set_format_source()
1780 for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++) in smiapp_set_format_source()
1782 sensor->test_data[i], 0, in smiapp_set_format_source()
1789 &sensor->valid_link_freqs[sensor->csi_format->compressed in smiapp_set_format_source()
1790 - sensor->compressed_min_bpp]; in smiapp_set_format_source()
1793 sensor->link_freq, 0, in smiapp_set_format_source()
1797 return smiapp_pll_update(sensor); in smiapp_set_format_source()
1804 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_format() local
1808 mutex_lock(&sensor->mutex); in smiapp_set_format()
1815 mutex_unlock(&sensor->mutex); in smiapp_set_format()
1828 SMIA_LIM(sensor, MIN_X_OUTPUT_SIZE), in smiapp_set_format()
1829 SMIA_LIM(sensor, MAX_X_OUTPUT_SIZE)); in smiapp_set_format()
1832 SMIA_LIM(sensor, MIN_Y_OUTPUT_SIZE), in smiapp_set_format()
1833 SMIA_LIM(sensor, MAX_Y_OUTPUT_SIZE)); in smiapp_set_format()
1846 mutex_unlock(&sensor->mutex); in smiapp_set_format()
1860 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in scaling_goodness() local
1886 if (w < SMIA_LIM(sensor, MIN_X_OUTPUT_SIZE)) in scaling_goodness()
1901 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_compose_binner() local
1909 for (i = 0; i < sensor->nbinning_subtypes; i++) { in smiapp_set_compose_binner()
1913 / sensor->binning_subtypes[i].horizontal, in smiapp_set_compose_binner()
1916 / sensor->binning_subtypes[i].vertical, in smiapp_set_compose_binner()
1920 binh = sensor->binning_subtypes[i].horizontal; in smiapp_set_compose_binner()
1921 binv = sensor->binning_subtypes[i].vertical; in smiapp_set_compose_binner()
1926 sensor->binning_vertical = binv; in smiapp_set_compose_binner()
1927 sensor->binning_horizontal = binh; in smiapp_set_compose_binner()
1950 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_compose_scaler() local
1952 u32 scale_m = SMIA_LIM(sensor, SCALER_N_MIN); in smiapp_set_compose_scaler()
1965 * SMIA_LIM(sensor, SCALER_N_MIN) / sel->r.width; in smiapp_set_compose_scaler()
1967 * SMIA_LIM(sensor, SCALER_N_MIN) / sel->r.height; in smiapp_set_compose_scaler()
1969 * SMIA_LIM(sensor, SCALER_N_MIN) in smiapp_set_compose_scaler()
1970 / SMIA_LIM(sensor, MIN_X_OUTPUT_SIZE); in smiapp_set_compose_scaler()
1972 a = clamp(a, SMIA_LIM(sensor, SCALER_M_MIN), in smiapp_set_compose_scaler()
1973 SMIA_LIM(sensor, SCALER_M_MAX)); in smiapp_set_compose_scaler()
1974 b = clamp(b, SMIA_LIM(sensor, SCALER_M_MIN), in smiapp_set_compose_scaler()
1975 SMIA_LIM(sensor, SCALER_M_MAX)); in smiapp_set_compose_scaler()
1976 max_m = clamp(max_m, SMIA_LIM(sensor, SCALER_M_MIN), in smiapp_set_compose_scaler()
1977 SMIA_LIM(sensor, SCALER_M_MAX)); in smiapp_set_compose_scaler()
2004 * SMIA_LIM(sensor, SCALER_N_MIN), in smiapp_set_compose_scaler()
2018 if (SMIA_LIM(sensor, SCALING_CAPABILITY) in smiapp_set_compose_scaler()
2025 * SMIA_LIM(sensor, SCALER_N_MIN), in smiapp_set_compose_scaler()
2029 * SMIA_LIM(sensor, SCALER_N_MIN), in smiapp_set_compose_scaler()
2043 * SMIA_LIM(sensor, SCALER_N_MIN)) & ~1; in smiapp_set_compose_scaler()
2048 * SMIA_LIM(sensor, SCALER_N_MIN)) in smiapp_set_compose_scaler()
2054 sensor->scale_m = scale_m; in smiapp_set_compose_scaler()
2055 sensor->scaling_mode = mode; in smiapp_set_compose_scaler()
2063 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_compose() local
2072 if (ssd == sensor->binner) in smiapp_set_compose()
2081 return smiapp_pll_blanking_update(sensor); in smiapp_set_compose()
2089 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in __smiapp_sel_supported() local
2096 if (ssd == sensor->pixel_array in __smiapp_sel_supported()
2099 if (ssd == sensor->src in __smiapp_sel_supported()
2102 if (ssd == sensor->scaler in __smiapp_sel_supported()
2104 && SMIA_LIM(sensor, DIGITAL_CROP_CAPABILITY) in __smiapp_sel_supported()
2109 if (ssd == sensor->pixel_array in __smiapp_sel_supported()
2117 if (ssd == sensor->binner) in __smiapp_sel_supported()
2119 if (ssd == sensor->scaler in __smiapp_sel_supported()
2120 && SMIA_LIM(sensor, SCALING_CAPABILITY) in __smiapp_sel_supported()
2133 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_crop() local
2160 if (ssd == sensor->src && sel->pad == SMIAPP_PAD_SRC) { in smiapp_set_crop()
2173 if (ssd != sensor->pixel_array && sel->pad == SMIAPP_PAD_SINK) in smiapp_set_crop()
2185 r->width = SMIA_LIM(ssd->sensor, X_ADDR_MAX) + 1; in smiapp_get_native_size()
2186 r->height = SMIA_LIM(ssd->sensor, Y_ADDR_MAX) + 1; in smiapp_get_native_size()
2193 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in __smiapp_get_selection() local
2220 if (ssd == sensor->pixel_array) in __smiapp_get_selection()
2243 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_get_selection() local
2246 mutex_lock(&sensor->mutex); in smiapp_get_selection()
2248 mutex_unlock(&sensor->mutex); in smiapp_get_selection()
2256 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_selection() local
2263 mutex_lock(&sensor->mutex); in smiapp_set_selection()
2271 SMIA_LIM(sensor, MIN_X_OUTPUT_SIZE), in smiapp_set_selection()
2274 SMIA_LIM(sensor, MIN_Y_OUTPUT_SIZE), in smiapp_set_selection()
2288 mutex_unlock(&sensor->mutex); in smiapp_set_selection()
2294 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_get_skip_frames() local
2296 *frames = sensor->frame_skip; in smiapp_get_skip_frames()
2302 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_get_skip_top_lines() local
2304 *lines = sensor->image_start; in smiapp_get_skip_top_lines()
2319 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_sysfs_nvm_read() local
2322 if (!sensor->dev_init_done) in smiapp_sysfs_nvm_read()
2325 rval = smiapp_pm_get_init(sensor); in smiapp_sysfs_nvm_read()
2329 rval = smiapp_read_nvm(sensor, buf, PAGE_SIZE); in smiapp_sysfs_nvm_read()
2352 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_sysfs_ident_read() local
2353 struct smiapp_module_info *minfo = &sensor->minfo; in smiapp_sysfs_ident_read()
2366 static int smiapp_identify_module(struct smiapp_sensor *sensor) in smiapp_identify_module() argument
2368 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_identify_module()
2369 struct smiapp_module_info *minfo = &sensor->minfo; in smiapp_identify_module()
2376 rval = smiapp_read_8only(sensor, SMIAPP_REG_U8_MANUFACTURER_ID, in smiapp_identify_module()
2379 rval = smiapp_read_8only(sensor, SMIAPP_REG_U16_MODEL_ID, in smiapp_identify_module()
2382 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2386 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2390 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2394 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2398 rval = smiapp_read_8only(sensor, SMIAPP_REG_U8_MODULE_DATE_DAY, in smiapp_identify_module()
2401 /* Sensor info */ in smiapp_identify_module()
2403 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2407 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2411 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2415 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2421 rval = smiapp_read_8only(sensor, SMIAPP_REG_U8_SMIA_VERSION, in smiapp_identify_module()
2424 rval = smiapp_read_8only(sensor, SMIAPP_REG_U8_SMIAPP_VERSION, in smiapp_identify_module()
2428 dev_err(&client->dev, "sensor detection failed\n"); in smiapp_identify_module()
2440 dev_dbg(&client->dev, "sensor 0x%2.2x-0x%4.4x\n", in smiapp_identify_module()
2444 "sensor revision 0x%2.2x firmware version 0x%2.2x\n", in smiapp_identify_module()
2453 * parameters whereas the rvalues are sensor parameters. in smiapp_identify_module()
2487 dev_dbg(&client->dev, "the sensor is called %s, ident %2.2x%4.4x%2.2x\n", in smiapp_identify_module()
2498 static int smiapp_register_subdev(struct smiapp_sensor *sensor, in smiapp_register_subdev() argument
2503 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_register_subdev()
2517 rval = v4l2_device_register_subdev(sensor->src->sd.v4l2_dev, in smiapp_register_subdev()
2540 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_unregistered() local
2543 for (i = 1; i < sensor->ssds_used; i++) in smiapp_unregistered()
2544 v4l2_device_unregister_subdev(&sensor->ssds[i].sd); in smiapp_unregistered()
2549 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_registered() local
2552 if (sensor->scaler) { in smiapp_registered()
2554 sensor, sensor->binner, sensor->scaler, in smiapp_registered()
2562 sensor, sensor->pixel_array, sensor->binner, in smiapp_registered()
2576 static void smiapp_cleanup(struct smiapp_sensor *sensor) in smiapp_cleanup() argument
2578 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_cleanup()
2583 smiapp_free_controls(sensor); in smiapp_cleanup()
2586 static void smiapp_create_subdev(struct smiapp_sensor *sensor, in smiapp_create_subdev() argument
2590 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_create_subdev()
2595 if (ssd != sensor->src) in smiapp_create_subdev()
2599 ssd->sensor = sensor; in smiapp_create_subdev()
2604 v4l2_i2c_subdev_set_name(&ssd->sd, client, sensor->minfo.name, name); in smiapp_create_subdev()
2612 if (ssd != sensor->pixel_array) { in smiapp_create_subdev()
2619 if (ssd == sensor->src) in smiapp_create_subdev()
2631 struct smiapp_sensor *sensor = ssd->sensor; in smiapp_open() local
2634 mutex_lock(&sensor->mutex); in smiapp_open()
2647 try_fmt->code = sensor->internal_csi_format->code; in smiapp_open()
2650 if (ssd != sensor->pixel_array) in smiapp_open()
2657 mutex_unlock(&sensor->mutex); in smiapp_open()
2682 .sensor = &smiapp_sensor_ops,
2707 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_suspend() local
2708 bool streaming = sensor->streaming; in smiapp_suspend()
2719 if (sensor->streaming) in smiapp_suspend()
2720 smiapp_stop_streaming(sensor); in smiapp_suspend()
2723 sensor->streaming = streaming; in smiapp_suspend()
2732 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_resume() local
2737 if (sensor->streaming) in smiapp_resume()
2738 rval = smiapp_start_streaming(sensor); in smiapp_resume()
2843 struct smiapp_sensor *sensor; in smiapp_probe() local
2851 sensor = devm_kzalloc(&client->dev, sizeof(*sensor), GFP_KERNEL); in smiapp_probe()
2852 if (sensor == NULL) in smiapp_probe()
2855 sensor->hwcfg = hwcfg; in smiapp_probe()
2856 sensor->src = &sensor->ssds[sensor->ssds_used]; in smiapp_probe()
2858 v4l2_i2c_subdev_init(&sensor->src->sd, client, &smiapp_ops); in smiapp_probe()
2859 sensor->src->sd.internal_ops = &smiapp_internal_src_ops; in smiapp_probe()
2861 sensor->vana = devm_regulator_get(&client->dev, "vana"); in smiapp_probe()
2862 if (IS_ERR(sensor->vana)) { in smiapp_probe()
2864 return PTR_ERR(sensor->vana); in smiapp_probe()
2867 sensor->ext_clk = devm_clk_get(&client->dev, NULL); in smiapp_probe()
2868 if (PTR_ERR(sensor->ext_clk) == -ENOENT) { in smiapp_probe()
2870 sensor->ext_clk = NULL; in smiapp_probe()
2871 } else if (IS_ERR(sensor->ext_clk)) { in smiapp_probe()
2873 PTR_ERR(sensor->ext_clk)); in smiapp_probe()
2877 if (sensor->ext_clk) { in smiapp_probe()
2878 if (sensor->hwcfg->ext_clk) { in smiapp_probe()
2881 rval = clk_set_rate(sensor->ext_clk, in smiapp_probe()
2882 sensor->hwcfg->ext_clk); in smiapp_probe()
2886 sensor->hwcfg->ext_clk); in smiapp_probe()
2890 rate = clk_get_rate(sensor->ext_clk); in smiapp_probe()
2891 if (rate != sensor->hwcfg->ext_clk) { in smiapp_probe()
2894 sensor->hwcfg->ext_clk, rate); in smiapp_probe()
2898 sensor->hwcfg->ext_clk = clk_get_rate(sensor->ext_clk); in smiapp_probe()
2900 sensor->hwcfg->ext_clk); in smiapp_probe()
2902 } else if (sensor->hwcfg->ext_clk) { in smiapp_probe()
2904 sensor->hwcfg->ext_clk); in smiapp_probe()
2910 sensor->xshutdown = devm_gpiod_get_optional(&client->dev, "xshutdown", in smiapp_probe()
2912 if (IS_ERR(sensor->xshutdown)) in smiapp_probe()
2913 return PTR_ERR(sensor->xshutdown); in smiapp_probe()
2919 mutex_init(&sensor->mutex); in smiapp_probe()
2921 rval = smiapp_identify_module(sensor); in smiapp_probe()
2927 rval = smiapp_read_all_smia_limits(sensor); in smiapp_probe()
2933 rval = smiapp_read_frame_fmt(sensor); in smiapp_probe()
2940 * Handle Sensor Module orientation on the board. in smiapp_probe()
2942 * The application of H-FLIP and V-FLIP on the sensor is modified by in smiapp_probe()
2943 * the sensor orientation on the board. in smiapp_probe()
2952 if (sensor->hwcfg->module_board_orient == in smiapp_probe()
2954 sensor->hvflip_inv_mask = SMIAPP_IMAGE_ORIENTATION_HFLIP | in smiapp_probe()
2957 rval = smiapp_call_quirk(sensor, limits); in smiapp_probe()
2963 if (SMIA_LIM(sensor, BINNING_CAPABILITY)) { in smiapp_probe()
2966 rval = smiapp_read(sensor, in smiapp_probe()
2972 sensor->nbinning_subtypes = min_t(u8, val, in smiapp_probe()
2975 for (i = 0; i < sensor->nbinning_subtypes; i++) { in smiapp_probe()
2977 sensor, SMIAPP_REG_U8_BINNING_TYPE_n(i), &val); in smiapp_probe()
2982 sensor->binning_subtypes[i] = in smiapp_probe()
2986 sensor->binning_subtypes[i].horizontal, in smiapp_probe()
2987 sensor->binning_subtypes[i].vertical); in smiapp_probe()
2990 sensor->binning_horizontal = 1; in smiapp_probe()
2991 sensor->binning_vertical = 1; in smiapp_probe()
2999 if (sensor->minfo.smiapp_version && in smiapp_probe()
3000 SMIA_LIM(sensor, DATA_TRANSFER_IF_CAPABILITY) & in smiapp_probe()
3009 /* We consider this as profile 0 sensor if any of these are zero. */ in smiapp_probe()
3010 if (!SMIA_LIM(sensor, MIN_OP_SYS_CLK_DIV) || in smiapp_probe()
3011 !SMIA_LIM(sensor, MAX_OP_SYS_CLK_DIV) || in smiapp_probe()
3012 !SMIA_LIM(sensor, MIN_OP_PIX_CLK_DIV) || in smiapp_probe()
3013 !SMIA_LIM(sensor, MAX_OP_PIX_CLK_DIV)) { in smiapp_probe()
3014 sensor->minfo.smiapp_profile = SMIAPP_PROFILE_0; in smiapp_probe()
3015 } else if (SMIA_LIM(sensor, SCALING_CAPABILITY) in smiapp_probe()
3017 if (SMIA_LIM(sensor, SCALING_CAPABILITY) in smiapp_probe()
3019 sensor->minfo.smiapp_profile = SMIAPP_PROFILE_1; in smiapp_probe()
3021 sensor->minfo.smiapp_profile = SMIAPP_PROFILE_2; in smiapp_probe()
3022 sensor->scaler = &sensor->ssds[sensor->ssds_used]; in smiapp_probe()
3023 sensor->ssds_used++; in smiapp_probe()
3024 } else if (SMIA_LIM(sensor, DIGITAL_CROP_CAPABILITY) in smiapp_probe()
3026 sensor->scaler = &sensor->ssds[sensor->ssds_used]; in smiapp_probe()
3027 sensor->ssds_used++; in smiapp_probe()
3029 sensor->binner = &sensor->ssds[sensor->ssds_used]; in smiapp_probe()
3030 sensor->ssds_used++; in smiapp_probe()
3031 sensor->pixel_array = &sensor->ssds[sensor->ssds_used]; in smiapp_probe()
3032 sensor->ssds_used++; in smiapp_probe()
3034 sensor->scale_m = SMIA_LIM(sensor, SCALER_N_MIN); in smiapp_probe()
3037 sensor->pll.bus_type = SMIAPP_PLL_BUS_TYPE_CSI2; in smiapp_probe()
3038 sensor->pll.csi2.lanes = sensor->hwcfg->lanes; in smiapp_probe()
3039 sensor->pll.ext_clk_freq_hz = sensor->hwcfg->ext_clk; in smiapp_probe()
3040 sensor->pll.scale_n = SMIA_LIM(sensor, SCALER_N_MIN); in smiapp_probe()
3042 if (sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0) in smiapp_probe()
3043 sensor->pll.flags |= SMIAPP_PLL_FLAG_NO_OP_CLOCKS; in smiapp_probe()
3045 smiapp_create_subdev(sensor, sensor->scaler, " scaler", 2); in smiapp_probe()
3046 smiapp_create_subdev(sensor, sensor->binner, " binner", 2); in smiapp_probe()
3047 smiapp_create_subdev(sensor, sensor->pixel_array, " pixel_array", 1); in smiapp_probe()
3049 dev_dbg(&client->dev, "profile %d\n", sensor->minfo.smiapp_profile); in smiapp_probe()
3051 sensor->pixel_array->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in smiapp_probe()
3053 rval = smiapp_init_controls(sensor); in smiapp_probe()
3057 rval = smiapp_call_quirk(sensor, init); in smiapp_probe()
3061 rval = smiapp_get_mbus_formats(sensor); in smiapp_probe()
3067 rval = smiapp_init_late_controls(sensor); in smiapp_probe()
3073 mutex_lock(&sensor->mutex); in smiapp_probe()
3074 rval = smiapp_pll_blanking_update(sensor); in smiapp_probe()
3075 mutex_unlock(&sensor->mutex); in smiapp_probe()
3081 sensor->streaming = false; in smiapp_probe()
3082 sensor->dev_init_done = true; in smiapp_probe()
3084 rval = media_entity_pads_init(&sensor->src->sd.entity, 2, in smiapp_probe()
3085 sensor->src->pads); in smiapp_probe()
3093 rval = v4l2_async_register_subdev_sensor_common(&sensor->src->sd); in smiapp_probe()
3108 media_entity_cleanup(&sensor->src->sd.entity); in smiapp_probe()
3111 smiapp_cleanup(sensor); in smiapp_probe()
3115 mutex_destroy(&sensor->mutex); in smiapp_probe()
3123 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_remove() local
3133 for (i = 0; i < sensor->ssds_used; i++) { in smiapp_remove()
3134 v4l2_device_unregister_subdev(&sensor->ssds[i].sd); in smiapp_remove()
3135 media_entity_cleanup(&sensor->ssds[i].sd.entity); in smiapp_remove()
3137 smiapp_cleanup(sensor); in smiapp_remove()
3138 mutex_destroy(&sensor->mutex); in smiapp_remove()