Lines Matching refs:sensor
60 static int smiapp_read_frame_fmt(struct smiapp_sensor *sensor) in smiapp_read_frame_fmt() argument
62 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_read_frame_fmt()
69 rval = smiapp_read(sensor, SMIAPP_REG_U8_FRAME_FORMAT_MODEL_TYPE, in smiapp_read_frame_fmt()
74 rval = smiapp_read(sensor, SMIAPP_REG_U8_FRAME_FORMAT_MODEL_SUBTYPE, in smiapp_read_frame_fmt()
101 rval = smiapp_read(sensor, reg, &desc); in smiapp_read_frame_fmt()
113 rval = smiapp_read(sensor, reg, &desc); in smiapp_read_frame_fmt()
162 sensor->visible_pixel_start = pixel_count; in smiapp_read_frame_fmt()
170 if (sensor->embedded_end) in smiapp_read_frame_fmt()
172 sensor->embedded_start = line_count; in smiapp_read_frame_fmt()
173 sensor->embedded_end = line_count + pixels; in smiapp_read_frame_fmt()
176 sensor->image_start = line_count; in smiapp_read_frame_fmt()
182 if (sensor->embedded_end > sensor->image_start) { in smiapp_read_frame_fmt()
185 sensor->embedded_end, sensor->image_start); in smiapp_read_frame_fmt()
186 sensor->image_start = sensor->embedded_end; in smiapp_read_frame_fmt()
190 sensor->embedded_start, sensor->embedded_end); in smiapp_read_frame_fmt()
192 sensor->image_start); in smiapp_read_frame_fmt()
197 static int smiapp_pll_configure(struct smiapp_sensor *sensor) in smiapp_pll_configure() argument
199 struct smiapp_pll *pll = &sensor->pll; in smiapp_pll_configure()
203 sensor, SMIAPP_REG_U16_VT_PIX_CLK_DIV, pll->vt.pix_clk_div); in smiapp_pll_configure()
208 sensor, SMIAPP_REG_U16_VT_SYS_CLK_DIV, pll->vt.sys_clk_div); in smiapp_pll_configure()
213 sensor, SMIAPP_REG_U16_PRE_PLL_CLK_DIV, pll->pre_pll_clk_div); in smiapp_pll_configure()
218 sensor, SMIAPP_REG_U16_PLL_MULTIPLIER, pll->pll_multiplier); in smiapp_pll_configure()
224 sensor, SMIAPP_REG_U32_REQUESTED_LINK_BIT_RATE_MBPS, in smiapp_pll_configure()
226 if (rval < 0 || sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0) in smiapp_pll_configure()
230 sensor, SMIAPP_REG_U16_OP_PIX_CLK_DIV, pll->op.pix_clk_div); in smiapp_pll_configure()
235 sensor, SMIAPP_REG_U16_OP_SYS_CLK_DIV, pll->op.sys_clk_div); in smiapp_pll_configure()
238 static int smiapp_pll_try(struct smiapp_sensor *sensor, in smiapp_pll_try() argument
241 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_pll_try()
243 .min_pre_pll_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_PRE_PLL_CLK_DIV], in smiapp_pll_try()
244 .max_pre_pll_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_PRE_PLL_CLK_DIV], in smiapp_pll_try()
245 .min_pll_ip_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_PLL_IP_FREQ_HZ], in smiapp_pll_try()
246 .max_pll_ip_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_PLL_IP_FREQ_HZ], in smiapp_pll_try()
247 .min_pll_multiplier = sensor->limits[SMIAPP_LIMIT_MIN_PLL_MULTIPLIER], in smiapp_pll_try()
248 .max_pll_multiplier = sensor->limits[SMIAPP_LIMIT_MAX_PLL_MULTIPLIER], in smiapp_pll_try()
249 .min_pll_op_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_PLL_OP_FREQ_HZ], in smiapp_pll_try()
250 .max_pll_op_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_PLL_OP_FREQ_HZ], in smiapp_pll_try()
252 .op.min_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_OP_SYS_CLK_DIV], in smiapp_pll_try()
253 .op.max_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_OP_SYS_CLK_DIV], in smiapp_pll_try()
254 .op.min_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_OP_PIX_CLK_DIV], in smiapp_pll_try()
255 .op.max_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_OP_PIX_CLK_DIV], in smiapp_pll_try()
256 .op.min_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_OP_SYS_CLK_FREQ_HZ], in smiapp_pll_try()
257 .op.max_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_OP_SYS_CLK_FREQ_HZ], in smiapp_pll_try()
258 .op.min_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_OP_PIX_CLK_FREQ_HZ], in smiapp_pll_try()
259 .op.max_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_OP_PIX_CLK_FREQ_HZ], in smiapp_pll_try()
261 .vt.min_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_VT_SYS_CLK_DIV], in smiapp_pll_try()
262 .vt.max_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_VT_SYS_CLK_DIV], in smiapp_pll_try()
263 .vt.min_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_VT_PIX_CLK_DIV], in smiapp_pll_try()
264 .vt.max_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_VT_PIX_CLK_DIV], in smiapp_pll_try()
265 .vt.min_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_VT_SYS_CLK_FREQ_HZ], in smiapp_pll_try()
266 .vt.max_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_VT_SYS_CLK_FREQ_HZ], in smiapp_pll_try()
267 .vt.min_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_VT_PIX_CLK_FREQ_HZ], in smiapp_pll_try()
268 .vt.max_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_VT_PIX_CLK_FREQ_HZ], in smiapp_pll_try()
270 .min_line_length_pck_bin = sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN], in smiapp_pll_try()
271 .min_line_length_pck = sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK], in smiapp_pll_try()
277 static int smiapp_pll_update(struct smiapp_sensor *sensor) in smiapp_pll_update() argument
279 struct smiapp_pll *pll = &sensor->pll; in smiapp_pll_update()
282 pll->binning_horizontal = sensor->binning_horizontal; in smiapp_pll_update()
283 pll->binning_vertical = sensor->binning_vertical; in smiapp_pll_update()
285 sensor->link_freq->qmenu_int[sensor->link_freq->val]; in smiapp_pll_update()
286 pll->scale_m = sensor->scale_m; in smiapp_pll_update()
287 pll->bits_per_pixel = sensor->csi_format->compressed; in smiapp_pll_update()
289 rval = smiapp_pll_try(sensor, pll); in smiapp_pll_update()
293 __v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_parray, in smiapp_pll_update()
295 __v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_csi, pll->pixel_rate_csi); in smiapp_pll_update()
307 static void __smiapp_update_exposure_limits(struct smiapp_sensor *sensor) in __smiapp_update_exposure_limits() argument
309 struct v4l2_ctrl *ctrl = sensor->exposure; in __smiapp_update_exposure_limits()
312 max = sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height in __smiapp_update_exposure_limits()
313 + sensor->vblank->val in __smiapp_update_exposure_limits()
314 - sensor->limits[SMIAPP_LIMIT_COARSE_INTEGRATION_TIME_MAX_MARGIN]; in __smiapp_update_exposure_limits()
360 static u32 smiapp_pixel_order(struct smiapp_sensor *sensor) in smiapp_pixel_order() argument
362 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_pixel_order()
365 if (sensor->hflip) { in smiapp_pixel_order()
366 if (sensor->hflip->val) in smiapp_pixel_order()
369 if (sensor->vflip->val) in smiapp_pixel_order()
373 flip ^= sensor->hvflip_inv_mask; in smiapp_pixel_order()
376 return sensor->default_pixel_order ^ flip; in smiapp_pixel_order()
379 static void smiapp_update_mbus_formats(struct smiapp_sensor *sensor) in smiapp_update_mbus_formats() argument
381 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_update_mbus_formats()
383 to_csi_format_idx(sensor->csi_format) & ~3; in smiapp_update_mbus_formats()
385 to_csi_format_idx(sensor->internal_csi_format) & ~3; in smiapp_update_mbus_formats()
386 unsigned int pixel_order = smiapp_pixel_order(sensor); in smiapp_update_mbus_formats()
388 sensor->mbus_frame_fmts = in smiapp_update_mbus_formats()
389 sensor->default_mbus_frame_fmts << pixel_order; in smiapp_update_mbus_formats()
390 sensor->csi_format = in smiapp_update_mbus_formats()
392 sensor->internal_csi_format = in smiapp_update_mbus_formats()
413 struct smiapp_sensor *sensor = in smiapp_set_ctrl() local
415 ->sensor; in smiapp_set_ctrl()
423 sensor, in smiapp_set_ctrl()
428 sensor, in smiapp_set_ctrl()
433 if (sensor->streaming) in smiapp_set_ctrl()
436 if (sensor->hflip->val) in smiapp_set_ctrl()
439 if (sensor->vflip->val) in smiapp_set_ctrl()
442 orient ^= sensor->hvflip_inv_mask; in smiapp_set_ctrl()
443 rval = smiapp_write(sensor, SMIAPP_REG_U8_IMAGE_ORIENTATION, in smiapp_set_ctrl()
448 smiapp_update_mbus_formats(sensor); in smiapp_set_ctrl()
453 exposure = sensor->exposure->val; in smiapp_set_ctrl()
455 __smiapp_update_exposure_limits(sensor); in smiapp_set_ctrl()
457 if (exposure > sensor->exposure->maximum) { in smiapp_set_ctrl()
458 sensor->exposure->val = sensor->exposure->maximum; in smiapp_set_ctrl()
459 rval = smiapp_set_ctrl(sensor->exposure); in smiapp_set_ctrl()
465 sensor, SMIAPP_REG_U16_FRAME_LENGTH_LINES, in smiapp_set_ctrl()
466 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height in smiapp_set_ctrl()
471 sensor, SMIAPP_REG_U16_LINE_LENGTH_PCK, in smiapp_set_ctrl()
472 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width in smiapp_set_ctrl()
476 if (sensor->streaming) in smiapp_set_ctrl()
479 return smiapp_pll_update(sensor); in smiapp_set_ctrl()
484 for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++) in smiapp_set_ctrl()
486 sensor->test_data[i], in smiapp_set_ctrl()
491 sensor, SMIAPP_REG_U16_TEST_PATTERN_MODE, ctrl->val); in smiapp_set_ctrl()
496 sensor, SMIAPP_REG_U16_TEST_DATA_RED, ctrl->val); in smiapp_set_ctrl()
500 sensor, SMIAPP_REG_U16_TEST_DATA_GREENR, ctrl->val); in smiapp_set_ctrl()
504 sensor, SMIAPP_REG_U16_TEST_DATA_BLUE, ctrl->val); in smiapp_set_ctrl()
508 sensor, SMIAPP_REG_U16_TEST_DATA_GREENB, ctrl->val); in smiapp_set_ctrl()
523 static int smiapp_init_controls(struct smiapp_sensor *sensor) in smiapp_init_controls() argument
525 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_init_controls()
528 rval = v4l2_ctrl_handler_init(&sensor->pixel_array->ctrl_handler, 12); in smiapp_init_controls()
532 sensor->pixel_array->ctrl_handler.lock = &sensor->mutex; in smiapp_init_controls()
534 sensor->analog_gain = v4l2_ctrl_new_std( in smiapp_init_controls()
535 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
537 sensor->limits[SMIAPP_LIMIT_ANALOGUE_GAIN_CODE_MIN], in smiapp_init_controls()
538 sensor->limits[SMIAPP_LIMIT_ANALOGUE_GAIN_CODE_MAX], in smiapp_init_controls()
539 max(sensor->limits[SMIAPP_LIMIT_ANALOGUE_GAIN_CODE_STEP], 1U), in smiapp_init_controls()
540 sensor->limits[SMIAPP_LIMIT_ANALOGUE_GAIN_CODE_MIN]); in smiapp_init_controls()
543 sensor->exposure = v4l2_ctrl_new_std( in smiapp_init_controls()
544 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
547 sensor->hflip = v4l2_ctrl_new_std( in smiapp_init_controls()
548 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
550 sensor->vflip = v4l2_ctrl_new_std( in smiapp_init_controls()
551 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
554 sensor->vblank = v4l2_ctrl_new_std( in smiapp_init_controls()
555 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
558 if (sensor->vblank) in smiapp_init_controls()
559 sensor->vblank->flags |= V4L2_CTRL_FLAG_UPDATE; in smiapp_init_controls()
561 sensor->hblank = v4l2_ctrl_new_std( in smiapp_init_controls()
562 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
565 if (sensor->hblank) in smiapp_init_controls()
566 sensor->hblank->flags |= V4L2_CTRL_FLAG_UPDATE; in smiapp_init_controls()
568 sensor->pixel_rate_parray = v4l2_ctrl_new_std( in smiapp_init_controls()
569 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
572 v4l2_ctrl_new_std_menu_items(&sensor->pixel_array->ctrl_handler, in smiapp_init_controls()
577 if (sensor->pixel_array->ctrl_handler.error) { in smiapp_init_controls()
580 sensor->pixel_array->ctrl_handler.error); in smiapp_init_controls()
581 return sensor->pixel_array->ctrl_handler.error; in smiapp_init_controls()
584 sensor->pixel_array->sd.ctrl_handler = in smiapp_init_controls()
585 &sensor->pixel_array->ctrl_handler; in smiapp_init_controls()
587 v4l2_ctrl_cluster(2, &sensor->hflip); in smiapp_init_controls()
589 rval = v4l2_ctrl_handler_init(&sensor->src->ctrl_handler, 0); in smiapp_init_controls()
593 sensor->src->ctrl_handler.lock = &sensor->mutex; in smiapp_init_controls()
595 sensor->pixel_rate_csi = v4l2_ctrl_new_std( in smiapp_init_controls()
596 &sensor->src->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
599 if (sensor->src->ctrl_handler.error) { in smiapp_init_controls()
602 sensor->src->ctrl_handler.error); in smiapp_init_controls()
603 return sensor->src->ctrl_handler.error; in smiapp_init_controls()
606 sensor->src->sd.ctrl_handler = &sensor->src->ctrl_handler; in smiapp_init_controls()
615 static int smiapp_init_late_controls(struct smiapp_sensor *sensor) in smiapp_init_late_controls() argument
617 unsigned long *valid_link_freqs = &sensor->valid_link_freqs[ in smiapp_init_late_controls()
618 sensor->csi_format->compressed - sensor->compressed_min_bpp]; in smiapp_init_late_controls()
621 for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++) { in smiapp_init_late_controls()
622 int max_value = (1 << sensor->csi_format->width) - 1; in smiapp_init_late_controls()
624 sensor->test_data[i] = v4l2_ctrl_new_std( in smiapp_init_late_controls()
625 &sensor->pixel_array->ctrl_handler, in smiapp_init_late_controls()
630 sensor->link_freq = v4l2_ctrl_new_int_menu( in smiapp_init_late_controls()
631 &sensor->src->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_late_controls()
633 __ffs(*valid_link_freqs), sensor->hwcfg->op_sys_clock); in smiapp_init_late_controls()
635 return sensor->src->ctrl_handler.error; in smiapp_init_late_controls()
638 static void smiapp_free_controls(struct smiapp_sensor *sensor) in smiapp_free_controls() argument
642 for (i = 0; i < sensor->ssds_used; i++) in smiapp_free_controls()
643 v4l2_ctrl_handler_free(&sensor->ssds[i].ctrl_handler); in smiapp_free_controls()
646 static int smiapp_get_limits(struct smiapp_sensor *sensor, int const *limit, in smiapp_get_limits() argument
649 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_get_limits()
656 sensor, smiapp_reg_limits[limit[i]].addr, &val); in smiapp_get_limits()
659 sensor->limits[limit[i]] = val; in smiapp_get_limits()
668 static int smiapp_get_all_limits(struct smiapp_sensor *sensor) in smiapp_get_all_limits() argument
674 rval = smiapp_get_limits(sensor, &i, 1); in smiapp_get_all_limits()
679 if (sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN] == 0) in smiapp_get_all_limits()
680 smiapp_replace_limit(sensor, SMIAPP_LIMIT_SCALER_N_MIN, 16); in smiapp_get_all_limits()
685 static int smiapp_get_limits_binning(struct smiapp_sensor *sensor) in smiapp_get_limits_binning() argument
687 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_get_limits_binning()
709 if (sensor->limits[SMIAPP_LIMIT_BINNING_CAPABILITY] == in smiapp_get_limits_binning()
712 sensor->limits[limits[i]] = in smiapp_get_limits_binning()
713 sensor->limits[limits_replace[i]]; in smiapp_get_limits_binning()
718 rval = smiapp_get_limits(sensor, limits, ARRAY_SIZE(limits)); in smiapp_get_limits_binning()
726 if (sensor->limits[SMIAPP_LIMIT_MIN_FRAME_LENGTH_LINES_BIN] in smiapp_get_limits_binning()
727 && sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN] in smiapp_get_limits_binning()
728 && sensor->limits[SMIAPP_LIMIT_MIN_LINE_BLANKING_PCK_BIN]) in smiapp_get_limits_binning()
736 sensor->limits[limits_replace[i]], in smiapp_get_limits_binning()
737 sensor->limits[limits_replace[i]]); in smiapp_get_limits_binning()
738 sensor->limits[limits[i]] = in smiapp_get_limits_binning()
739 sensor->limits[limits_replace[i]]; in smiapp_get_limits_binning()
745 static int smiapp_get_mbus_formats(struct smiapp_sensor *sensor) in smiapp_get_mbus_formats() argument
747 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_get_mbus_formats()
748 struct smiapp_pll *pll = &sensor->pll; in smiapp_get_mbus_formats()
755 sensor, SMIAPP_REG_U8_DATA_FORMAT_MODEL_TYPE, &type); in smiapp_get_mbus_formats()
761 rval = smiapp_read(sensor, SMIAPP_REG_U8_PIXEL_ORDER, in smiapp_get_mbus_formats()
785 sensor->default_pixel_order = pixel_order; in smiapp_get_mbus_formats()
786 sensor->mbus_frame_fmts = 0; in smiapp_get_mbus_formats()
792 sensor, in smiapp_get_mbus_formats()
812 sensor->default_mbus_frame_fmts |= 1 << j; in smiapp_get_mbus_formats()
819 pll->scale_m = sensor->scale_m; in smiapp_get_mbus_formats()
822 sensor->compressed_min_bpp = in smiapp_get_mbus_formats()
824 sensor->compressed_min_bpp); in smiapp_get_mbus_formats()
830 sensor->valid_link_freqs = devm_kcalloc( in smiapp_get_mbus_formats()
832 compressed_max_bpp - sensor->compressed_min_bpp + 1, in smiapp_get_mbus_formats()
833 sizeof(*sensor->valid_link_freqs), GFP_KERNEL); in smiapp_get_mbus_formats()
834 if (!sensor->valid_link_freqs) in smiapp_get_mbus_formats()
841 &sensor->valid_link_freqs[ in smiapp_get_mbus_formats()
842 f->compressed - sensor->compressed_min_bpp]; in smiapp_get_mbus_formats()
845 if (!(sensor->default_mbus_frame_fmts & 1 << i)) in smiapp_get_mbus_formats()
850 for (j = 0; sensor->hwcfg->op_sys_clock[j]; j++) { in smiapp_get_mbus_formats()
851 pll->link_freq = sensor->hwcfg->op_sys_clock[j]; in smiapp_get_mbus_formats()
853 rval = smiapp_pll_try(sensor, pll); in smiapp_get_mbus_formats()
867 sensor->default_mbus_frame_fmts &= ~BIT(i); in smiapp_get_mbus_formats()
871 if (!sensor->csi_format in smiapp_get_mbus_formats()
872 || f->width > sensor->csi_format->width in smiapp_get_mbus_formats()
873 || (f->width == sensor->csi_format->width in smiapp_get_mbus_formats()
874 && f->compressed > sensor->csi_format->compressed)) { in smiapp_get_mbus_formats()
875 sensor->csi_format = f; in smiapp_get_mbus_formats()
876 sensor->internal_csi_format = f; in smiapp_get_mbus_formats()
880 if (!sensor->csi_format) { in smiapp_get_mbus_formats()
885 smiapp_update_mbus_formats(sensor); in smiapp_get_mbus_formats()
890 static void smiapp_update_blanking(struct smiapp_sensor *sensor) in smiapp_update_blanking() argument
892 struct v4l2_ctrl *vblank = sensor->vblank; in smiapp_update_blanking()
893 struct v4l2_ctrl *hblank = sensor->hblank; in smiapp_update_blanking()
897 sensor->limits[SMIAPP_LIMIT_MIN_FRAME_BLANKING_LINES], in smiapp_update_blanking()
898 sensor->limits[SMIAPP_LIMIT_MIN_FRAME_LENGTH_LINES_BIN] - in smiapp_update_blanking()
899 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height); in smiapp_update_blanking()
900 max = sensor->limits[SMIAPP_LIMIT_MAX_FRAME_LENGTH_LINES_BIN] - in smiapp_update_blanking()
901 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height; in smiapp_update_blanking()
906 sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN] - in smiapp_update_blanking()
907 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width, in smiapp_update_blanking()
908 sensor->limits[SMIAPP_LIMIT_MIN_LINE_BLANKING_PCK_BIN]); in smiapp_update_blanking()
909 max = sensor->limits[SMIAPP_LIMIT_MAX_LINE_LENGTH_PCK_BIN] - in smiapp_update_blanking()
910 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width; in smiapp_update_blanking()
914 __smiapp_update_exposure_limits(sensor); in smiapp_update_blanking()
917 static int smiapp_update_mode(struct smiapp_sensor *sensor) in smiapp_update_mode() argument
919 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_update_mode()
924 if (sensor->binning_horizontal == 1 && in smiapp_update_mode()
925 sensor->binning_vertical == 1) { in smiapp_update_mode()
929 (sensor->binning_horizontal << 4) in smiapp_update_mode()
930 | sensor->binning_vertical; in smiapp_update_mode()
933 sensor, SMIAPP_REG_U8_BINNING_TYPE, binning_type); in smiapp_update_mode()
939 rval = smiapp_write(sensor, SMIAPP_REG_U8_BINNING_MODE, binning_mode); in smiapp_update_mode()
944 rval = smiapp_get_limits_binning(sensor); in smiapp_update_mode()
948 rval = smiapp_pll_update(sensor); in smiapp_update_mode()
953 smiapp_update_blanking(sensor); in smiapp_update_mode()
955 dev_dbg(&client->dev, "vblank\t\t%d\n", sensor->vblank->val); in smiapp_update_mode()
956 dev_dbg(&client->dev, "hblank\t\t%d\n", sensor->hblank->val); in smiapp_update_mode()
959 sensor->pll.pixel_rate_pixel_array / in smiapp_update_mode()
960 ((sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width in smiapp_update_mode()
961 + sensor->hblank->val) * in smiapp_update_mode()
962 (sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height in smiapp_update_mode()
963 + sensor->vblank->val) / 100)); in smiapp_update_mode()
973 static int smiapp_read_nvm(struct smiapp_sensor *sensor, in smiapp_read_nvm() argument
979 np = sensor->nvm_size / SMIAPP_NVM_PAGE_SIZE; in smiapp_read_nvm()
982 sensor, in smiapp_read_nvm()
987 rval = smiapp_write(sensor, in smiapp_read_nvm()
996 sensor, in smiapp_read_nvm()
1013 sensor, in smiapp_read_nvm()
1024 rval2 = smiapp_write(sensor, SMIAPP_REG_U8_DATA_TRANSFER_IF_1_CTRL, 0); in smiapp_read_nvm()
1036 static int smiapp_change_cci_addr(struct smiapp_sensor *sensor) in smiapp_change_cci_addr() argument
1038 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_change_cci_addr()
1042 client->addr = sensor->hwcfg->i2c_addr_dfl; in smiapp_change_cci_addr()
1044 rval = smiapp_write(sensor, in smiapp_change_cci_addr()
1046 sensor->hwcfg->i2c_addr_alt << 1); in smiapp_change_cci_addr()
1050 client->addr = sensor->hwcfg->i2c_addr_alt; in smiapp_change_cci_addr()
1053 rval = smiapp_read(sensor, SMIAPP_REG_U8_CCI_ADDRESS_CONTROL, &val); in smiapp_change_cci_addr()
1057 if (val != sensor->hwcfg->i2c_addr_alt << 1) in smiapp_change_cci_addr()
1068 static int smiapp_setup_flash_strobe(struct smiapp_sensor *sensor) in smiapp_setup_flash_strobe() argument
1071 unsigned int ext_freq = sensor->hwcfg->ext_clk; in smiapp_setup_flash_strobe()
1077 strobe_setup = sensor->hwcfg->strobe_setup; in smiapp_setup_flash_strobe()
1159 rval = smiapp_write(sensor, SMIAPP_REG_U8_FLASH_MODE_RS, in smiapp_setup_flash_strobe()
1164 rval = smiapp_write(sensor, SMIAPP_REG_U8_FLASH_STROBE_ADJUSTMENT, in smiapp_setup_flash_strobe()
1170 sensor, SMIAPP_REG_U16_TFLASH_STROBE_WIDTH_HIGH_RS_CTRL, in smiapp_setup_flash_strobe()
1175 rval = smiapp_write(sensor, SMIAPP_REG_U16_TFLASH_STROBE_DELAY_RS_CTRL, in smiapp_setup_flash_strobe()
1180 rval = smiapp_write(sensor, SMIAPP_REG_U16_FLASH_STROBE_START_POINT, in smiapp_setup_flash_strobe()
1185 rval = smiapp_write(sensor, SMIAPP_REG_U8_FLASH_TRIGGER_RS, in smiapp_setup_flash_strobe()
1189 sensor->hwcfg->strobe_setup->trigger = 0; in smiapp_setup_flash_strobe()
1207 struct smiapp_sensor *sensor = in smiapp_power_on() local
1212 rval = regulator_enable(sensor->vana); in smiapp_power_on()
1219 rval = clk_prepare_enable(sensor->ext_clk); in smiapp_power_on()
1226 gpiod_set_value(sensor->xshutdown, 1); in smiapp_power_on()
1228 sleep = SMIAPP_RESET_DELAY(sensor->hwcfg->ext_clk); in smiapp_power_on()
1231 mutex_lock(&sensor->mutex); in smiapp_power_on()
1233 sensor->active = true; in smiapp_power_on()
1246 if (sensor->hwcfg->i2c_addr_alt) { in smiapp_power_on()
1247 rval = smiapp_change_cci_addr(sensor); in smiapp_power_on()
1254 rval = smiapp_write(sensor, SMIAPP_REG_U8_SOFTWARE_RESET, in smiapp_power_on()
1261 if (sensor->hwcfg->i2c_addr_alt) { in smiapp_power_on()
1262 rval = smiapp_change_cci_addr(sensor); in smiapp_power_on()
1269 rval = smiapp_write(sensor, SMIAPP_REG_U16_COMPRESSION_MODE, in smiapp_power_on()
1277 sensor, SMIAPP_REG_U16_EXTCLK_FREQUENCY_MHZ, in smiapp_power_on()
1278 sensor->hwcfg->ext_clk / (1000000 / (1 << 8))); in smiapp_power_on()
1284 rval = smiapp_write(sensor, SMIAPP_REG_U8_CSI_LANE_MODE, in smiapp_power_on()
1285 sensor->hwcfg->lanes - 1); in smiapp_power_on()
1291 rval = smiapp_write(sensor, SMIAPP_REG_U8_FAST_STANDBY_CTRL, in smiapp_power_on()
1298 rval = smiapp_write(sensor, SMIAPP_REG_U8_CSI_SIGNALLING_MODE, in smiapp_power_on()
1299 sensor->hwcfg->csi_signalling_mode); in smiapp_power_on()
1306 rval = smiapp_write(sensor, SMIAPP_REG_U8_DPHY_CTRL, in smiapp_power_on()
1311 rval = smiapp_call_quirk(sensor, post_poweron); in smiapp_power_on()
1318 if (sensor->pixel_array) { in smiapp_power_on()
1320 &sensor->pixel_array->ctrl_handler); in smiapp_power_on()
1324 rval = __v4l2_ctrl_handler_setup(&sensor->src->ctrl_handler); in smiapp_power_on()
1328 rval = smiapp_update_mode(sensor); in smiapp_power_on()
1333 mutex_unlock(&sensor->mutex); in smiapp_power_on()
1338 mutex_unlock(&sensor->mutex); in smiapp_power_on()
1339 gpiod_set_value(sensor->xshutdown, 0); in smiapp_power_on()
1340 clk_disable_unprepare(sensor->ext_clk); in smiapp_power_on()
1343 regulator_disable(sensor->vana); in smiapp_power_on()
1353 struct smiapp_sensor *sensor = in smiapp_power_off() local
1356 mutex_lock(&sensor->mutex); in smiapp_power_off()
1365 if (sensor->hwcfg->i2c_addr_alt) in smiapp_power_off()
1366 smiapp_write(sensor, in smiapp_power_off()
1370 sensor->active = false; in smiapp_power_off()
1372 mutex_unlock(&sensor->mutex); in smiapp_power_off()
1374 gpiod_set_value(sensor->xshutdown, 0); in smiapp_power_off()
1375 clk_disable_unprepare(sensor->ext_clk); in smiapp_power_off()
1377 regulator_disable(sensor->vana); in smiapp_power_off()
1378 sensor->streaming = false; in smiapp_power_off()
1387 static int smiapp_start_streaming(struct smiapp_sensor *sensor) in smiapp_start_streaming() argument
1389 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_start_streaming()
1392 mutex_lock(&sensor->mutex); in smiapp_start_streaming()
1394 rval = smiapp_write(sensor, SMIAPP_REG_U16_CSI_DATA_FORMAT, in smiapp_start_streaming()
1395 (sensor->csi_format->width << 8) | in smiapp_start_streaming()
1396 sensor->csi_format->compressed); in smiapp_start_streaming()
1400 rval = smiapp_pll_configure(sensor); in smiapp_start_streaming()
1405 rval = smiapp_write(sensor, SMIAPP_REG_U16_X_ADDR_START, in smiapp_start_streaming()
1406 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].left); in smiapp_start_streaming()
1410 rval = smiapp_write(sensor, SMIAPP_REG_U16_Y_ADDR_START, in smiapp_start_streaming()
1411 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].top); in smiapp_start_streaming()
1417 sensor, SMIAPP_REG_U16_X_ADDR_END, in smiapp_start_streaming()
1418 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].left in smiapp_start_streaming()
1419 + sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width - 1); in smiapp_start_streaming()
1424 sensor, SMIAPP_REG_U16_Y_ADDR_END, in smiapp_start_streaming()
1425 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].top in smiapp_start_streaming()
1426 + sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height - 1); in smiapp_start_streaming()
1436 if (sensor->limits[SMIAPP_LIMIT_DIGITAL_CROP_CAPABILITY] in smiapp_start_streaming()
1439 sensor, SMIAPP_REG_U16_DIGITAL_CROP_X_OFFSET, in smiapp_start_streaming()
1440 sensor->scaler->crop[SMIAPP_PAD_SINK].left); in smiapp_start_streaming()
1445 sensor, SMIAPP_REG_U16_DIGITAL_CROP_Y_OFFSET, in smiapp_start_streaming()
1446 sensor->scaler->crop[SMIAPP_PAD_SINK].top); in smiapp_start_streaming()
1451 sensor, SMIAPP_REG_U16_DIGITAL_CROP_IMAGE_WIDTH, in smiapp_start_streaming()
1452 sensor->scaler->crop[SMIAPP_PAD_SINK].width); in smiapp_start_streaming()
1457 sensor, SMIAPP_REG_U16_DIGITAL_CROP_IMAGE_HEIGHT, in smiapp_start_streaming()
1458 sensor->scaler->crop[SMIAPP_PAD_SINK].height); in smiapp_start_streaming()
1464 if (sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY] in smiapp_start_streaming()
1466 rval = smiapp_write(sensor, SMIAPP_REG_U16_SCALING_MODE, in smiapp_start_streaming()
1467 sensor->scaling_mode); in smiapp_start_streaming()
1471 rval = smiapp_write(sensor, SMIAPP_REG_U16_SCALE_M, in smiapp_start_streaming()
1472 sensor->scale_m); in smiapp_start_streaming()
1478 rval = smiapp_write(sensor, SMIAPP_REG_U16_X_OUTPUT_SIZE, in smiapp_start_streaming()
1479 sensor->src->crop[SMIAPP_PAD_SRC].width); in smiapp_start_streaming()
1482 rval = smiapp_write(sensor, SMIAPP_REG_U16_Y_OUTPUT_SIZE, in smiapp_start_streaming()
1483 sensor->src->crop[SMIAPP_PAD_SRC].height); in smiapp_start_streaming()
1487 if ((sensor->limits[SMIAPP_LIMIT_FLASH_MODE_CAPABILITY] & in smiapp_start_streaming()
1490 sensor->hwcfg->strobe_setup != NULL && in smiapp_start_streaming()
1491 sensor->hwcfg->strobe_setup->trigger != 0) { in smiapp_start_streaming()
1492 rval = smiapp_setup_flash_strobe(sensor); in smiapp_start_streaming()
1497 rval = smiapp_call_quirk(sensor, pre_streamon); in smiapp_start_streaming()
1503 rval = smiapp_write(sensor, SMIAPP_REG_U8_MODE_SELECT, in smiapp_start_streaming()
1507 mutex_unlock(&sensor->mutex); in smiapp_start_streaming()
1512 static int smiapp_stop_streaming(struct smiapp_sensor *sensor) in smiapp_stop_streaming() argument
1514 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_stop_streaming()
1517 mutex_lock(&sensor->mutex); in smiapp_stop_streaming()
1518 rval = smiapp_write(sensor, SMIAPP_REG_U8_MODE_SELECT, in smiapp_stop_streaming()
1523 rval = smiapp_call_quirk(sensor, post_streamoff); in smiapp_stop_streaming()
1528 mutex_unlock(&sensor->mutex); in smiapp_stop_streaming()
1538 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_stream() local
1539 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_set_stream()
1542 if (sensor->streaming == enable) in smiapp_set_stream()
1554 sensor->streaming = true; in smiapp_set_stream()
1556 rval = smiapp_start_streaming(sensor); in smiapp_set_stream()
1558 sensor->streaming = false; in smiapp_set_stream()
1560 rval = smiapp_stop_streaming(sensor); in smiapp_set_stream()
1561 sensor->streaming = false; in smiapp_set_stream()
1574 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_enum_mbus_code() local
1579 mutex_lock(&sensor->mutex); in smiapp_enum_mbus_code()
1584 if (subdev != &sensor->src->sd || code->pad != SMIAPP_PAD_SRC) { in smiapp_enum_mbus_code()
1588 code->code = sensor->internal_csi_format->code; in smiapp_enum_mbus_code()
1594 if (sensor->mbus_frame_fmts & (1 << i)) in smiapp_enum_mbus_code()
1607 mutex_unlock(&sensor->mutex); in smiapp_enum_mbus_code()
1615 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in __smiapp_get_mbus_code() local
1617 if (subdev == &sensor->src->sd && pad == SMIAPP_PAD_SRC) in __smiapp_get_mbus_code()
1618 return sensor->csi_format->code; in __smiapp_get_mbus_code()
1620 return sensor->internal_csi_format->code; in __smiapp_get_mbus_code()
1653 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_get_format() local
1656 mutex_lock(&sensor->mutex); in smiapp_get_format()
1658 mutex_unlock(&sensor->mutex); in smiapp_get_format()
1697 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_propagate() local
1708 if (ssd == sensor->scaler) { in smiapp_propagate()
1709 sensor->scale_m = in smiapp_propagate()
1710 sensor->limits[ in smiapp_propagate()
1712 sensor->scaling_mode = in smiapp_propagate()
1714 } else if (ssd == sensor->binner) { in smiapp_propagate()
1715 sensor->binning_horizontal = 1; in smiapp_propagate()
1716 sensor->binning_vertical = 1; in smiapp_propagate()
1729 *smiapp_validate_csi_data_format(struct smiapp_sensor *sensor, u32 code) in smiapp_validate_csi_data_format() argument
1734 if (sensor->mbus_frame_fmts & (1 << i) in smiapp_validate_csi_data_format()
1739 return sensor->csi_format; in smiapp_validate_csi_data_format()
1746 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_format_source() local
1748 *old_csi_format = sensor->csi_format; in smiapp_set_format_source()
1762 if (subdev != &sensor->src->sd) in smiapp_set_format_source()
1765 csi_format = smiapp_validate_csi_data_format(sensor, code); in smiapp_set_format_source()
1772 sensor->csi_format = csi_format; in smiapp_set_format_source()
1775 for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++) in smiapp_set_format_source()
1777 sensor->test_data[i], 0, in smiapp_set_format_source()
1784 &sensor->valid_link_freqs[sensor->csi_format->compressed in smiapp_set_format_source()
1785 - sensor->compressed_min_bpp]; in smiapp_set_format_source()
1788 sensor->link_freq, 0, in smiapp_set_format_source()
1792 return smiapp_pll_update(sensor); in smiapp_set_format_source()
1799 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_format() local
1803 mutex_lock(&sensor->mutex); in smiapp_set_format()
1810 mutex_unlock(&sensor->mutex); in smiapp_set_format()
1823 sensor->limits[SMIAPP_LIMIT_MIN_X_OUTPUT_SIZE], in smiapp_set_format()
1824 sensor->limits[SMIAPP_LIMIT_MAX_X_OUTPUT_SIZE]); in smiapp_set_format()
1827 sensor->limits[SMIAPP_LIMIT_MIN_Y_OUTPUT_SIZE], in smiapp_set_format()
1828 sensor->limits[SMIAPP_LIMIT_MAX_Y_OUTPUT_SIZE]); in smiapp_set_format()
1841 mutex_unlock(&sensor->mutex); in smiapp_set_format()
1855 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in scaling_goodness() local
1881 if (w < sensor->limits[SMIAPP_LIMIT_MIN_X_OUTPUT_SIZE]) in scaling_goodness()
1896 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_compose_binner() local
1904 for (i = 0; i < sensor->nbinning_subtypes; i++) { in smiapp_set_compose_binner()
1908 / sensor->binning_subtypes[i].horizontal, in smiapp_set_compose_binner()
1911 / sensor->binning_subtypes[i].vertical, in smiapp_set_compose_binner()
1915 binh = sensor->binning_subtypes[i].horizontal; in smiapp_set_compose_binner()
1916 binv = sensor->binning_subtypes[i].vertical; in smiapp_set_compose_binner()
1921 sensor->binning_vertical = binv; in smiapp_set_compose_binner()
1922 sensor->binning_horizontal = binh; in smiapp_set_compose_binner()
1945 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_compose_scaler() local
1947 u32 scale_m = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN]; in smiapp_set_compose_scaler()
1960 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN] / sel->r.width; in smiapp_set_compose_scaler()
1962 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN] / sel->r.height; in smiapp_set_compose_scaler()
1964 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN] in smiapp_set_compose_scaler()
1965 / sensor->limits[SMIAPP_LIMIT_MIN_X_OUTPUT_SIZE]; in smiapp_set_compose_scaler()
1967 a = clamp(a, sensor->limits[SMIAPP_LIMIT_SCALER_M_MIN], in smiapp_set_compose_scaler()
1968 sensor->limits[SMIAPP_LIMIT_SCALER_M_MAX]); in smiapp_set_compose_scaler()
1969 b = clamp(b, sensor->limits[SMIAPP_LIMIT_SCALER_M_MIN], in smiapp_set_compose_scaler()
1970 sensor->limits[SMIAPP_LIMIT_SCALER_M_MAX]); in smiapp_set_compose_scaler()
1971 max_m = clamp(max_m, sensor->limits[SMIAPP_LIMIT_SCALER_M_MIN], in smiapp_set_compose_scaler()
1972 sensor->limits[SMIAPP_LIMIT_SCALER_M_MAX]); in smiapp_set_compose_scaler()
1999 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN], in smiapp_set_compose_scaler()
2013 if (sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY] in smiapp_set_compose_scaler()
2020 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN], in smiapp_set_compose_scaler()
2024 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN], in smiapp_set_compose_scaler()
2038 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN]) & ~1; in smiapp_set_compose_scaler()
2043 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN]) in smiapp_set_compose_scaler()
2049 sensor->scale_m = scale_m; in smiapp_set_compose_scaler()
2050 sensor->scaling_mode = mode; in smiapp_set_compose_scaler()
2058 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_compose() local
2067 if (ssd == sensor->binner) in smiapp_set_compose()
2076 return smiapp_update_mode(sensor); in smiapp_set_compose()
2084 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in __smiapp_sel_supported() local
2091 if (ssd == sensor->pixel_array in __smiapp_sel_supported()
2094 if (ssd == sensor->src in __smiapp_sel_supported()
2097 if (ssd == sensor->scaler in __smiapp_sel_supported()
2099 && sensor->limits[SMIAPP_LIMIT_DIGITAL_CROP_CAPABILITY] in __smiapp_sel_supported()
2104 if (ssd == sensor->pixel_array in __smiapp_sel_supported()
2112 if (ssd == sensor->binner) in __smiapp_sel_supported()
2114 if (ssd == sensor->scaler in __smiapp_sel_supported()
2115 && sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY] in __smiapp_sel_supported()
2128 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_crop() local
2155 if (ssd == sensor->src && sel->pad == SMIAPP_PAD_SRC) { in smiapp_set_crop()
2168 if (ssd != sensor->pixel_array && sel->pad == SMIAPP_PAD_SINK) in smiapp_set_crop()
2180 r->width = ssd->sensor->limits[SMIAPP_LIMIT_X_ADDR_MAX] + 1; in smiapp_get_native_size()
2181 r->height = ssd->sensor->limits[SMIAPP_LIMIT_Y_ADDR_MAX] + 1; in smiapp_get_native_size()
2188 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in __smiapp_get_selection() local
2215 if (ssd == sensor->pixel_array) in __smiapp_get_selection()
2238 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_get_selection() local
2241 mutex_lock(&sensor->mutex); in smiapp_get_selection()
2243 mutex_unlock(&sensor->mutex); in smiapp_get_selection()
2251 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_selection() local
2258 mutex_lock(&sensor->mutex); in smiapp_set_selection()
2266 sensor->limits[SMIAPP_LIMIT_MIN_X_OUTPUT_SIZE], in smiapp_set_selection()
2269 sensor->limits[SMIAPP_LIMIT_MIN_Y_OUTPUT_SIZE], in smiapp_set_selection()
2283 mutex_unlock(&sensor->mutex); in smiapp_set_selection()
2289 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_get_skip_frames() local
2291 *frames = sensor->frame_skip; in smiapp_get_skip_frames()
2297 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_get_skip_top_lines() local
2299 *lines = sensor->image_start; in smiapp_get_skip_top_lines()
2314 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_sysfs_nvm_read() local
2317 if (!sensor->dev_init_done) in smiapp_sysfs_nvm_read()
2320 if (!sensor->nvm_size) { in smiapp_sysfs_nvm_read()
2324 sensor->nvm_size = sensor->hwcfg->nvm_size; in smiapp_sysfs_nvm_read()
2334 if (smiapp_read_nvm(sensor, sensor->nvm)) { in smiapp_sysfs_nvm_read()
2346 nbytes = min_t(unsigned int, sensor->nvm_size, PAGE_SIZE); in smiapp_sysfs_nvm_read()
2347 memcpy(buf, sensor->nvm, nbytes); in smiapp_sysfs_nvm_read()
2358 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_sysfs_ident_read() local
2359 struct smiapp_module_info *minfo = &sensor->minfo; in smiapp_sysfs_ident_read()
2372 static int smiapp_identify_module(struct smiapp_sensor *sensor) in smiapp_identify_module() argument
2374 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_identify_module()
2375 struct smiapp_module_info *minfo = &sensor->minfo; in smiapp_identify_module()
2382 rval = smiapp_read_8only(sensor, SMIAPP_REG_U8_MANUFACTURER_ID, in smiapp_identify_module()
2385 rval = smiapp_read_8only(sensor, SMIAPP_REG_U16_MODEL_ID, in smiapp_identify_module()
2388 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2392 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2396 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2400 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2404 rval = smiapp_read_8only(sensor, SMIAPP_REG_U8_MODULE_DATE_DAY, in smiapp_identify_module()
2409 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2413 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2417 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2421 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2427 rval = smiapp_read_8only(sensor, SMIAPP_REG_U8_SMIA_VERSION, in smiapp_identify_module()
2430 rval = smiapp_read_8only(sensor, SMIAPP_REG_U8_SMIAPP_VERSION, in smiapp_identify_module()
2504 static int smiapp_register_subdev(struct smiapp_sensor *sensor, in smiapp_register_subdev() argument
2509 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_register_subdev()
2523 rval = v4l2_device_register_subdev(sensor->src->sd.v4l2_dev, in smiapp_register_subdev()
2546 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_unregistered() local
2549 for (i = 1; i < sensor->ssds_used; i++) in smiapp_unregistered()
2550 v4l2_device_unregister_subdev(&sensor->ssds[i].sd); in smiapp_unregistered()
2555 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_registered() local
2558 if (sensor->scaler) { in smiapp_registered()
2560 sensor, sensor->binner, sensor->scaler, in smiapp_registered()
2568 sensor, sensor->pixel_array, sensor->binner, in smiapp_registered()
2582 static void smiapp_cleanup(struct smiapp_sensor *sensor) in smiapp_cleanup() argument
2584 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_cleanup()
2589 smiapp_free_controls(sensor); in smiapp_cleanup()
2592 static void smiapp_create_subdev(struct smiapp_sensor *sensor, in smiapp_create_subdev() argument
2596 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_create_subdev()
2601 if (ssd != sensor->src) in smiapp_create_subdev()
2605 ssd->sensor = sensor; in smiapp_create_subdev()
2610 v4l2_i2c_subdev_set_name(&ssd->sd, client, sensor->minfo.name, name); in smiapp_create_subdev()
2618 if (ssd != sensor->pixel_array) { in smiapp_create_subdev()
2625 if (ssd == sensor->src) in smiapp_create_subdev()
2637 struct smiapp_sensor *sensor = ssd->sensor; in smiapp_open() local
2640 mutex_lock(&sensor->mutex); in smiapp_open()
2653 try_fmt->code = sensor->internal_csi_format->code; in smiapp_open()
2656 if (ssd != sensor->pixel_array) in smiapp_open()
2663 mutex_unlock(&sensor->mutex); in smiapp_open()
2688 .sensor = &smiapp_sensor_ops,
2713 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_suspend() local
2714 bool streaming = sensor->streaming; in smiapp_suspend()
2725 if (sensor->streaming) in smiapp_suspend()
2726 smiapp_stop_streaming(sensor); in smiapp_suspend()
2729 sensor->streaming = streaming; in smiapp_suspend()
2738 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_resume() local
2743 if (sensor->streaming) in smiapp_resume()
2744 rval = smiapp_start_streaming(sensor); in smiapp_resume()
2852 struct smiapp_sensor *sensor; in smiapp_probe() local
2860 sensor = devm_kzalloc(&client->dev, sizeof(*sensor), GFP_KERNEL); in smiapp_probe()
2861 if (sensor == NULL) in smiapp_probe()
2864 sensor->hwcfg = hwcfg; in smiapp_probe()
2865 mutex_init(&sensor->mutex); in smiapp_probe()
2866 sensor->src = &sensor->ssds[sensor->ssds_used]; in smiapp_probe()
2868 v4l2_i2c_subdev_init(&sensor->src->sd, client, &smiapp_ops); in smiapp_probe()
2869 sensor->src->sd.internal_ops = &smiapp_internal_src_ops; in smiapp_probe()
2871 sensor->vana = devm_regulator_get(&client->dev, "vana"); in smiapp_probe()
2872 if (IS_ERR(sensor->vana)) { in smiapp_probe()
2874 return PTR_ERR(sensor->vana); in smiapp_probe()
2877 sensor->ext_clk = devm_clk_get(&client->dev, NULL); in smiapp_probe()
2878 if (PTR_ERR(sensor->ext_clk) == -ENOENT) { in smiapp_probe()
2880 sensor->ext_clk = NULL; in smiapp_probe()
2881 } else if (IS_ERR(sensor->ext_clk)) { in smiapp_probe()
2883 PTR_ERR(sensor->ext_clk)); in smiapp_probe()
2887 if (sensor->ext_clk) { in smiapp_probe()
2888 if (sensor->hwcfg->ext_clk) { in smiapp_probe()
2891 rval = clk_set_rate(sensor->ext_clk, in smiapp_probe()
2892 sensor->hwcfg->ext_clk); in smiapp_probe()
2896 sensor->hwcfg->ext_clk); in smiapp_probe()
2900 rate = clk_get_rate(sensor->ext_clk); in smiapp_probe()
2901 if (rate != sensor->hwcfg->ext_clk) { in smiapp_probe()
2904 sensor->hwcfg->ext_clk, rate); in smiapp_probe()
2908 sensor->hwcfg->ext_clk = clk_get_rate(sensor->ext_clk); in smiapp_probe()
2910 sensor->hwcfg->ext_clk); in smiapp_probe()
2912 } else if (sensor->hwcfg->ext_clk) { in smiapp_probe()
2914 sensor->hwcfg->ext_clk); in smiapp_probe()
2920 sensor->xshutdown = devm_gpiod_get_optional(&client->dev, "xshutdown", in smiapp_probe()
2922 if (IS_ERR(sensor->xshutdown)) in smiapp_probe()
2923 return PTR_ERR(sensor->xshutdown); in smiapp_probe()
2929 rval = smiapp_identify_module(sensor); in smiapp_probe()
2935 rval = smiapp_get_all_limits(sensor); in smiapp_probe()
2941 rval = smiapp_read_frame_fmt(sensor); in smiapp_probe()
2960 if (sensor->hwcfg->module_board_orient == in smiapp_probe()
2962 sensor->hvflip_inv_mask = SMIAPP_IMAGE_ORIENTATION_HFLIP | in smiapp_probe()
2965 rval = smiapp_call_quirk(sensor, limits); in smiapp_probe()
2971 if (sensor->limits[SMIAPP_LIMIT_BINNING_CAPABILITY]) { in smiapp_probe()
2974 rval = smiapp_read(sensor, in smiapp_probe()
2980 sensor->nbinning_subtypes = min_t(u8, val, in smiapp_probe()
2983 for (i = 0; i < sensor->nbinning_subtypes; i++) { in smiapp_probe()
2985 sensor, SMIAPP_REG_U8_BINNING_TYPE_n(i), &val); in smiapp_probe()
2990 sensor->binning_subtypes[i] = in smiapp_probe()
2994 sensor->binning_subtypes[i].horizontal, in smiapp_probe()
2995 sensor->binning_subtypes[i].vertical); in smiapp_probe()
2998 sensor->binning_horizontal = 1; in smiapp_probe()
2999 sensor->binning_vertical = 1; in smiapp_probe()
3009 if (sensor->minfo.smiapp_version && sensor->hwcfg->nvm_size) { in smiapp_probe()
3010 sensor->nvm = devm_kzalloc(&client->dev, in smiapp_probe()
3011 sensor->hwcfg->nvm_size, GFP_KERNEL); in smiapp_probe()
3012 if (sensor->nvm == NULL) { in smiapp_probe()
3025 if (!sensor->limits[SMIAPP_LIMIT_MIN_OP_SYS_CLK_DIV] || in smiapp_probe()
3026 !sensor->limits[SMIAPP_LIMIT_MAX_OP_SYS_CLK_DIV] || in smiapp_probe()
3027 !sensor->limits[SMIAPP_LIMIT_MIN_OP_PIX_CLK_DIV] || in smiapp_probe()
3028 !sensor->limits[SMIAPP_LIMIT_MAX_OP_PIX_CLK_DIV]) { in smiapp_probe()
3029 sensor->minfo.smiapp_profile = SMIAPP_PROFILE_0; in smiapp_probe()
3030 } else if (sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY] in smiapp_probe()
3032 if (sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY] in smiapp_probe()
3034 sensor->minfo.smiapp_profile = SMIAPP_PROFILE_1; in smiapp_probe()
3036 sensor->minfo.smiapp_profile = SMIAPP_PROFILE_2; in smiapp_probe()
3037 sensor->scaler = &sensor->ssds[sensor->ssds_used]; in smiapp_probe()
3038 sensor->ssds_used++; in smiapp_probe()
3039 } else if (sensor->limits[SMIAPP_LIMIT_DIGITAL_CROP_CAPABILITY] in smiapp_probe()
3041 sensor->scaler = &sensor->ssds[sensor->ssds_used]; in smiapp_probe()
3042 sensor->ssds_used++; in smiapp_probe()
3044 sensor->binner = &sensor->ssds[sensor->ssds_used]; in smiapp_probe()
3045 sensor->ssds_used++; in smiapp_probe()
3046 sensor->pixel_array = &sensor->ssds[sensor->ssds_used]; in smiapp_probe()
3047 sensor->ssds_used++; in smiapp_probe()
3049 sensor->scale_m = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN]; in smiapp_probe()
3052 sensor->pll.bus_type = SMIAPP_PLL_BUS_TYPE_CSI2; in smiapp_probe()
3053 sensor->pll.csi2.lanes = sensor->hwcfg->lanes; in smiapp_probe()
3054 sensor->pll.ext_clk_freq_hz = sensor->hwcfg->ext_clk; in smiapp_probe()
3055 sensor->pll.scale_n = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN]; in smiapp_probe()
3057 if (sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0) in smiapp_probe()
3058 sensor->pll.flags |= SMIAPP_PLL_FLAG_NO_OP_CLOCKS; in smiapp_probe()
3060 smiapp_create_subdev(sensor, sensor->scaler, " scaler", 2); in smiapp_probe()
3061 smiapp_create_subdev(sensor, sensor->binner, " binner", 2); in smiapp_probe()
3062 smiapp_create_subdev(sensor, sensor->pixel_array, " pixel_array", 1); in smiapp_probe()
3064 dev_dbg(&client->dev, "profile %d\n", sensor->minfo.smiapp_profile); in smiapp_probe()
3066 sensor->pixel_array->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in smiapp_probe()
3068 rval = smiapp_init_controls(sensor); in smiapp_probe()
3072 rval = smiapp_call_quirk(sensor, init); in smiapp_probe()
3076 rval = smiapp_get_mbus_formats(sensor); in smiapp_probe()
3082 rval = smiapp_init_late_controls(sensor); in smiapp_probe()
3088 mutex_lock(&sensor->mutex); in smiapp_probe()
3089 rval = smiapp_update_mode(sensor); in smiapp_probe()
3090 mutex_unlock(&sensor->mutex); in smiapp_probe()
3096 sensor->streaming = false; in smiapp_probe()
3097 sensor->dev_init_done = true; in smiapp_probe()
3099 rval = media_entity_pads_init(&sensor->src->sd.entity, 2, in smiapp_probe()
3100 sensor->src->pads); in smiapp_probe()
3104 rval = v4l2_async_register_subdev_sensor_common(&sensor->src->sd); in smiapp_probe()
3118 media_entity_cleanup(&sensor->src->sd.entity); in smiapp_probe()
3121 smiapp_cleanup(sensor); in smiapp_probe()
3132 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_remove() local
3142 for (i = 0; i < sensor->ssds_used; i++) { in smiapp_remove()
3143 v4l2_device_unregister_subdev(&sensor->ssds[i].sd); in smiapp_remove()
3144 media_entity_cleanup(&sensor->ssds[i].sd.entity); in smiapp_remove()
3146 smiapp_cleanup(sensor); in smiapp_remove()