Lines Matching refs:sensor
66 static int smiapp_read_frame_fmt(struct smiapp_sensor *sensor) in smiapp_read_frame_fmt() argument
68 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_read_frame_fmt()
76 rval = smiapp_read(sensor, SMIAPP_REG_U8_FRAME_FORMAT_MODEL_TYPE, in smiapp_read_frame_fmt()
81 rval = smiapp_read(sensor, SMIAPP_REG_U8_FRAME_FORMAT_MODEL_SUBTYPE, in smiapp_read_frame_fmt()
107 sensor, in smiapp_read_frame_fmt()
121 sensor, in smiapp_read_frame_fmt()
178 || pixels >= sensor->limits[SMIAPP_LIMIT_MIN_FRAME_LENGTH_LINES] / 2) in smiapp_read_frame_fmt()
198 static int smiapp_pll_configure(struct smiapp_sensor *sensor) in smiapp_pll_configure() argument
200 struct smiapp_pll *pll = &sensor->pll; in smiapp_pll_configure()
204 sensor, SMIAPP_REG_U16_VT_PIX_CLK_DIV, pll->vt.pix_clk_div); in smiapp_pll_configure()
209 sensor, SMIAPP_REG_U16_VT_SYS_CLK_DIV, pll->vt.sys_clk_div); in smiapp_pll_configure()
214 sensor, SMIAPP_REG_U16_PRE_PLL_CLK_DIV, pll->pre_pll_clk_div); in smiapp_pll_configure()
219 sensor, SMIAPP_REG_U16_PLL_MULTIPLIER, pll->pll_multiplier); in smiapp_pll_configure()
225 sensor, SMIAPP_REG_U32_REQUESTED_LINK_BIT_RATE_MBPS, in smiapp_pll_configure()
227 if (rval < 0 || sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0) in smiapp_pll_configure()
231 sensor, SMIAPP_REG_U16_OP_PIX_CLK_DIV, pll->op.pix_clk_div); in smiapp_pll_configure()
236 sensor, SMIAPP_REG_U16_OP_SYS_CLK_DIV, pll->op.sys_clk_div); in smiapp_pll_configure()
239 static int smiapp_pll_try(struct smiapp_sensor *sensor, in smiapp_pll_try() argument
242 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_pll_try()
244 .min_pre_pll_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_PRE_PLL_CLK_DIV], in smiapp_pll_try()
245 .max_pre_pll_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_PRE_PLL_CLK_DIV], in smiapp_pll_try()
246 .min_pll_ip_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_PLL_IP_FREQ_HZ], in smiapp_pll_try()
247 .max_pll_ip_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_PLL_IP_FREQ_HZ], in smiapp_pll_try()
248 .min_pll_multiplier = sensor->limits[SMIAPP_LIMIT_MIN_PLL_MULTIPLIER], in smiapp_pll_try()
249 .max_pll_multiplier = sensor->limits[SMIAPP_LIMIT_MAX_PLL_MULTIPLIER], in smiapp_pll_try()
250 .min_pll_op_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_PLL_OP_FREQ_HZ], in smiapp_pll_try()
251 .max_pll_op_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_PLL_OP_FREQ_HZ], in smiapp_pll_try()
253 .op.min_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_OP_SYS_CLK_DIV], in smiapp_pll_try()
254 .op.max_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_OP_SYS_CLK_DIV], in smiapp_pll_try()
255 .op.min_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_OP_PIX_CLK_DIV], in smiapp_pll_try()
256 .op.max_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_OP_PIX_CLK_DIV], in smiapp_pll_try()
257 .op.min_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_OP_SYS_CLK_FREQ_HZ], in smiapp_pll_try()
258 .op.max_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_OP_SYS_CLK_FREQ_HZ], in smiapp_pll_try()
259 .op.min_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_OP_PIX_CLK_FREQ_HZ], in smiapp_pll_try()
260 .op.max_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_OP_PIX_CLK_FREQ_HZ], in smiapp_pll_try()
262 .vt.min_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_VT_SYS_CLK_DIV], in smiapp_pll_try()
263 .vt.max_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_VT_SYS_CLK_DIV], in smiapp_pll_try()
264 .vt.min_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_VT_PIX_CLK_DIV], in smiapp_pll_try()
265 .vt.max_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_VT_PIX_CLK_DIV], in smiapp_pll_try()
266 .vt.min_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_VT_SYS_CLK_FREQ_HZ], in smiapp_pll_try()
267 .vt.max_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_VT_SYS_CLK_FREQ_HZ], in smiapp_pll_try()
268 .vt.min_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_VT_PIX_CLK_FREQ_HZ], in smiapp_pll_try()
269 .vt.max_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_VT_PIX_CLK_FREQ_HZ], in smiapp_pll_try()
271 .min_line_length_pck_bin = sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN], in smiapp_pll_try()
272 .min_line_length_pck = sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK], in smiapp_pll_try()
278 static int smiapp_pll_update(struct smiapp_sensor *sensor) in smiapp_pll_update() argument
280 struct smiapp_pll *pll = &sensor->pll; in smiapp_pll_update()
283 pll->binning_horizontal = sensor->binning_horizontal; in smiapp_pll_update()
284 pll->binning_vertical = sensor->binning_vertical; in smiapp_pll_update()
286 sensor->link_freq->qmenu_int[sensor->link_freq->val]; in smiapp_pll_update()
287 pll->scale_m = sensor->scale_m; in smiapp_pll_update()
288 pll->bits_per_pixel = sensor->csi_format->compressed; in smiapp_pll_update()
290 rval = smiapp_pll_try(sensor, pll); in smiapp_pll_update()
294 __v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_parray, in smiapp_pll_update()
296 __v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_csi, pll->pixel_rate_csi); in smiapp_pll_update()
308 static void __smiapp_update_exposure_limits(struct smiapp_sensor *sensor) in __smiapp_update_exposure_limits() argument
310 struct v4l2_ctrl *ctrl = sensor->exposure; in __smiapp_update_exposure_limits()
313 max = sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height in __smiapp_update_exposure_limits()
314 + sensor->vblank->val in __smiapp_update_exposure_limits()
315 - sensor->limits[SMIAPP_LIMIT_COARSE_INTEGRATION_TIME_MAX_MARGIN]; in __smiapp_update_exposure_limits()
353 static u32 smiapp_pixel_order(struct smiapp_sensor *sensor) in smiapp_pixel_order() argument
355 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_pixel_order()
358 if (sensor->hflip) { in smiapp_pixel_order()
359 if (sensor->hflip->val) in smiapp_pixel_order()
362 if (sensor->vflip->val) in smiapp_pixel_order()
366 flip ^= sensor->hvflip_inv_mask; in smiapp_pixel_order()
369 return sensor->default_pixel_order ^ flip; in smiapp_pixel_order()
372 static void smiapp_update_mbus_formats(struct smiapp_sensor *sensor) in smiapp_update_mbus_formats() argument
374 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_update_mbus_formats()
376 to_csi_format_idx(sensor->csi_format) & ~3; in smiapp_update_mbus_formats()
378 to_csi_format_idx(sensor->internal_csi_format) & ~3; in smiapp_update_mbus_formats()
379 unsigned int pixel_order = smiapp_pixel_order(sensor); in smiapp_update_mbus_formats()
381 sensor->mbus_frame_fmts = in smiapp_update_mbus_formats()
382 sensor->default_mbus_frame_fmts << pixel_order; in smiapp_update_mbus_formats()
383 sensor->csi_format = in smiapp_update_mbus_formats()
385 sensor->internal_csi_format = in smiapp_update_mbus_formats()
406 struct smiapp_sensor *sensor = in smiapp_set_ctrl() local
408 ->sensor; in smiapp_set_ctrl()
416 sensor, in smiapp_set_ctrl()
421 sensor, in smiapp_set_ctrl()
426 if (sensor->streaming) in smiapp_set_ctrl()
429 if (sensor->hflip->val) in smiapp_set_ctrl()
432 if (sensor->vflip->val) in smiapp_set_ctrl()
435 orient ^= sensor->hvflip_inv_mask; in smiapp_set_ctrl()
436 rval = smiapp_write(sensor, in smiapp_set_ctrl()
442 smiapp_update_mbus_formats(sensor); in smiapp_set_ctrl()
447 exposure = sensor->exposure->val; in smiapp_set_ctrl()
449 __smiapp_update_exposure_limits(sensor); in smiapp_set_ctrl()
451 if (exposure > sensor->exposure->maximum) { in smiapp_set_ctrl()
452 sensor->exposure->val = in smiapp_set_ctrl()
453 sensor->exposure->maximum; in smiapp_set_ctrl()
455 sensor->exposure); in smiapp_set_ctrl()
461 sensor, SMIAPP_REG_U16_FRAME_LENGTH_LINES, in smiapp_set_ctrl()
462 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height in smiapp_set_ctrl()
467 sensor, SMIAPP_REG_U16_LINE_LENGTH_PCK, in smiapp_set_ctrl()
468 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width in smiapp_set_ctrl()
472 if (sensor->streaming) in smiapp_set_ctrl()
475 return smiapp_pll_update(sensor); in smiapp_set_ctrl()
480 for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++) in smiapp_set_ctrl()
482 sensor->test_data[i], in smiapp_set_ctrl()
487 sensor, SMIAPP_REG_U16_TEST_PATTERN_MODE, ctrl->val); in smiapp_set_ctrl()
492 sensor, SMIAPP_REG_U16_TEST_DATA_RED, ctrl->val); in smiapp_set_ctrl()
496 sensor, SMIAPP_REG_U16_TEST_DATA_GREENR, ctrl->val); in smiapp_set_ctrl()
500 sensor, SMIAPP_REG_U16_TEST_DATA_BLUE, ctrl->val); in smiapp_set_ctrl()
504 sensor, SMIAPP_REG_U16_TEST_DATA_GREENB, ctrl->val); in smiapp_set_ctrl()
519 static int smiapp_init_controls(struct smiapp_sensor *sensor) in smiapp_init_controls() argument
521 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_init_controls()
524 rval = v4l2_ctrl_handler_init(&sensor->pixel_array->ctrl_handler, 12); in smiapp_init_controls()
528 sensor->pixel_array->ctrl_handler.lock = &sensor->mutex; in smiapp_init_controls()
530 sensor->analog_gain = v4l2_ctrl_new_std( in smiapp_init_controls()
531 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
533 sensor->limits[SMIAPP_LIMIT_ANALOGUE_GAIN_CODE_MIN], in smiapp_init_controls()
534 sensor->limits[SMIAPP_LIMIT_ANALOGUE_GAIN_CODE_MAX], in smiapp_init_controls()
535 max(sensor->limits[SMIAPP_LIMIT_ANALOGUE_GAIN_CODE_STEP], 1U), in smiapp_init_controls()
536 sensor->limits[SMIAPP_LIMIT_ANALOGUE_GAIN_CODE_MIN]); in smiapp_init_controls()
539 sensor->exposure = v4l2_ctrl_new_std( in smiapp_init_controls()
540 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
543 sensor->hflip = v4l2_ctrl_new_std( in smiapp_init_controls()
544 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
546 sensor->vflip = v4l2_ctrl_new_std( in smiapp_init_controls()
547 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
550 sensor->vblank = v4l2_ctrl_new_std( in smiapp_init_controls()
551 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
554 if (sensor->vblank) in smiapp_init_controls()
555 sensor->vblank->flags |= V4L2_CTRL_FLAG_UPDATE; in smiapp_init_controls()
557 sensor->hblank = v4l2_ctrl_new_std( in smiapp_init_controls()
558 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
561 if (sensor->hblank) in smiapp_init_controls()
562 sensor->hblank->flags |= V4L2_CTRL_FLAG_UPDATE; in smiapp_init_controls()
564 sensor->pixel_rate_parray = v4l2_ctrl_new_std( in smiapp_init_controls()
565 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
568 v4l2_ctrl_new_std_menu_items(&sensor->pixel_array->ctrl_handler, in smiapp_init_controls()
573 if (sensor->pixel_array->ctrl_handler.error) { in smiapp_init_controls()
576 sensor->pixel_array->ctrl_handler.error); in smiapp_init_controls()
577 return sensor->pixel_array->ctrl_handler.error; in smiapp_init_controls()
580 sensor->pixel_array->sd.ctrl_handler = in smiapp_init_controls()
581 &sensor->pixel_array->ctrl_handler; in smiapp_init_controls()
583 v4l2_ctrl_cluster(2, &sensor->hflip); in smiapp_init_controls()
585 rval = v4l2_ctrl_handler_init(&sensor->src->ctrl_handler, 0); in smiapp_init_controls()
589 sensor->src->ctrl_handler.lock = &sensor->mutex; in smiapp_init_controls()
591 sensor->pixel_rate_csi = v4l2_ctrl_new_std( in smiapp_init_controls()
592 &sensor->src->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_controls()
595 if (sensor->src->ctrl_handler.error) { in smiapp_init_controls()
598 sensor->src->ctrl_handler.error); in smiapp_init_controls()
599 return sensor->src->ctrl_handler.error; in smiapp_init_controls()
602 sensor->src->sd.ctrl_handler = &sensor->src->ctrl_handler; in smiapp_init_controls()
611 static int smiapp_init_late_controls(struct smiapp_sensor *sensor) in smiapp_init_late_controls() argument
613 unsigned long *valid_link_freqs = &sensor->valid_link_freqs[ in smiapp_init_late_controls()
614 sensor->csi_format->compressed - SMIAPP_COMPRESSED_BASE]; in smiapp_init_late_controls()
617 for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++) { in smiapp_init_late_controls()
618 int max_value = (1 << sensor->csi_format->width) - 1; in smiapp_init_late_controls()
620 sensor->test_data[i] = v4l2_ctrl_new_std( in smiapp_init_late_controls()
621 &sensor->pixel_array->ctrl_handler, in smiapp_init_late_controls()
626 for (max = 0; sensor->platform_data->op_sys_clock[max + 1]; max++); in smiapp_init_late_controls()
628 sensor->link_freq = v4l2_ctrl_new_int_menu( in smiapp_init_late_controls()
629 &sensor->src->ctrl_handler, &smiapp_ctrl_ops, in smiapp_init_late_controls()
631 __ffs(*valid_link_freqs), sensor->platform_data->op_sys_clock); in smiapp_init_late_controls()
633 return sensor->src->ctrl_handler.error; in smiapp_init_late_controls()
636 static void smiapp_free_controls(struct smiapp_sensor *sensor) in smiapp_free_controls() argument
640 for (i = 0; i < sensor->ssds_used; i++) in smiapp_free_controls()
641 v4l2_ctrl_handler_free(&sensor->ssds[i].ctrl_handler); in smiapp_free_controls()
644 static int smiapp_get_limits(struct smiapp_sensor *sensor, int const *limit, in smiapp_get_limits() argument
647 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_get_limits()
654 sensor, smiapp_reg_limits[limit[i]].addr, &val); in smiapp_get_limits()
657 sensor->limits[limit[i]] = val; in smiapp_get_limits()
666 static int smiapp_get_all_limits(struct smiapp_sensor *sensor) in smiapp_get_all_limits() argument
672 rval = smiapp_get_limits(sensor, &i, 1); in smiapp_get_all_limits()
677 if (sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN] == 0) in smiapp_get_all_limits()
678 smiapp_replace_limit(sensor, SMIAPP_LIMIT_SCALER_N_MIN, 16); in smiapp_get_all_limits()
683 static int smiapp_get_limits_binning(struct smiapp_sensor *sensor) in smiapp_get_limits_binning() argument
685 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_get_limits_binning()
707 if (sensor->limits[SMIAPP_LIMIT_BINNING_CAPABILITY] == in smiapp_get_limits_binning()
710 sensor->limits[limits[i]] = in smiapp_get_limits_binning()
711 sensor->limits[limits_replace[i]]; in smiapp_get_limits_binning()
716 rval = smiapp_get_limits(sensor, limits, ARRAY_SIZE(limits)); in smiapp_get_limits_binning()
724 if (sensor->limits[SMIAPP_LIMIT_MIN_FRAME_LENGTH_LINES_BIN] in smiapp_get_limits_binning()
725 && sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN] in smiapp_get_limits_binning()
726 && sensor->limits[SMIAPP_LIMIT_MIN_LINE_BLANKING_PCK_BIN]) in smiapp_get_limits_binning()
734 sensor->limits[limits_replace[i]], in smiapp_get_limits_binning()
735 sensor->limits[limits_replace[i]]); in smiapp_get_limits_binning()
736 sensor->limits[limits[i]] = in smiapp_get_limits_binning()
737 sensor->limits[limits_replace[i]]; in smiapp_get_limits_binning()
743 static int smiapp_get_mbus_formats(struct smiapp_sensor *sensor) in smiapp_get_mbus_formats() argument
745 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_get_mbus_formats()
746 struct smiapp_pll *pll = &sensor->pll; in smiapp_get_mbus_formats()
752 sensor, SMIAPP_REG_U8_DATA_FORMAT_MODEL_TYPE, &type); in smiapp_get_mbus_formats()
758 rval = smiapp_read(sensor, SMIAPP_REG_U8_PIXEL_ORDER, in smiapp_get_mbus_formats()
782 sensor->default_pixel_order = pixel_order; in smiapp_get_mbus_formats()
783 sensor->mbus_frame_fmts = 0; in smiapp_get_mbus_formats()
789 sensor, in smiapp_get_mbus_formats()
809 sensor->default_mbus_frame_fmts |= 1 << j; in smiapp_get_mbus_formats()
816 pll->scale_m = sensor->scale_m; in smiapp_get_mbus_formats()
822 &sensor->valid_link_freqs[ in smiapp_get_mbus_formats()
829 if (!(sensor->default_mbus_frame_fmts & 1 << i)) in smiapp_get_mbus_formats()
834 for (j = 0; sensor->platform_data->op_sys_clock[j]; j++) { in smiapp_get_mbus_formats()
835 pll->link_freq = sensor->platform_data->op_sys_clock[j]; in smiapp_get_mbus_formats()
837 rval = smiapp_pll_try(sensor, pll); in smiapp_get_mbus_formats()
851 sensor->default_mbus_frame_fmts &= ~BIT(i); in smiapp_get_mbus_formats()
855 if (!sensor->csi_format in smiapp_get_mbus_formats()
856 || f->width > sensor->csi_format->width in smiapp_get_mbus_formats()
857 || (f->width == sensor->csi_format->width in smiapp_get_mbus_formats()
858 && f->compressed > sensor->csi_format->compressed)) { in smiapp_get_mbus_formats()
859 sensor->csi_format = f; in smiapp_get_mbus_formats()
860 sensor->internal_csi_format = f; in smiapp_get_mbus_formats()
864 if (!sensor->csi_format) { in smiapp_get_mbus_formats()
869 smiapp_update_mbus_formats(sensor); in smiapp_get_mbus_formats()
874 static void smiapp_update_blanking(struct smiapp_sensor *sensor) in smiapp_update_blanking() argument
876 struct v4l2_ctrl *vblank = sensor->vblank; in smiapp_update_blanking()
877 struct v4l2_ctrl *hblank = sensor->hblank; in smiapp_update_blanking()
881 sensor->limits[SMIAPP_LIMIT_MIN_FRAME_BLANKING_LINES], in smiapp_update_blanking()
882 sensor->limits[SMIAPP_LIMIT_MIN_FRAME_LENGTH_LINES_BIN] - in smiapp_update_blanking()
883 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height); in smiapp_update_blanking()
884 max = sensor->limits[SMIAPP_LIMIT_MAX_FRAME_LENGTH_LINES_BIN] - in smiapp_update_blanking()
885 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height; in smiapp_update_blanking()
890 sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN] - in smiapp_update_blanking()
891 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width, in smiapp_update_blanking()
892 sensor->limits[SMIAPP_LIMIT_MIN_LINE_BLANKING_PCK_BIN]); in smiapp_update_blanking()
893 max = sensor->limits[SMIAPP_LIMIT_MAX_LINE_LENGTH_PCK_BIN] - in smiapp_update_blanking()
894 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width; in smiapp_update_blanking()
898 __smiapp_update_exposure_limits(sensor); in smiapp_update_blanking()
901 static int smiapp_update_mode(struct smiapp_sensor *sensor) in smiapp_update_mode() argument
903 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_update_mode()
908 sensor->src->crop[SMIAPP_PAD_SRC].width, in smiapp_update_mode()
909 sensor->src->crop[SMIAPP_PAD_SRC].height); in smiapp_update_mode()
911 sensor->csi_format->width); in smiapp_update_mode()
914 if (sensor->binning_horizontal == 1 && in smiapp_update_mode()
915 sensor->binning_vertical == 1) { in smiapp_update_mode()
919 (sensor->binning_horizontal << 4) in smiapp_update_mode()
920 | sensor->binning_vertical; in smiapp_update_mode()
923 sensor, SMIAPP_REG_U8_BINNING_TYPE, binning_type); in smiapp_update_mode()
929 rval = smiapp_write(sensor, SMIAPP_REG_U8_BINNING_MODE, binning_mode); in smiapp_update_mode()
934 rval = smiapp_get_limits_binning(sensor); in smiapp_update_mode()
938 rval = smiapp_pll_update(sensor); in smiapp_update_mode()
943 smiapp_update_blanking(sensor); in smiapp_update_mode()
945 dev_dbg(&client->dev, "vblank\t\t%d\n", sensor->vblank->val); in smiapp_update_mode()
946 dev_dbg(&client->dev, "hblank\t\t%d\n", sensor->hblank->val); in smiapp_update_mode()
949 sensor->pll.pixel_rate_pixel_array / in smiapp_update_mode()
950 ((sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width in smiapp_update_mode()
951 + sensor->hblank->val) * in smiapp_update_mode()
952 (sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height in smiapp_update_mode()
953 + sensor->vblank->val) / 100)); in smiapp_update_mode()
963 static int smiapp_read_nvm(struct smiapp_sensor *sensor, in smiapp_read_nvm() argument
969 np = sensor->nvm_size / SMIAPP_NVM_PAGE_SIZE; in smiapp_read_nvm()
972 sensor, in smiapp_read_nvm()
977 rval = smiapp_write(sensor, in smiapp_read_nvm()
986 sensor, in smiapp_read_nvm()
1004 sensor, in smiapp_read_nvm()
1015 rval2 = smiapp_write(sensor, SMIAPP_REG_U8_DATA_TRANSFER_IF_1_CTRL, 0); in smiapp_read_nvm()
1027 static int smiapp_change_cci_addr(struct smiapp_sensor *sensor) in smiapp_change_cci_addr() argument
1029 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_change_cci_addr()
1033 client->addr = sensor->platform_data->i2c_addr_dfl; in smiapp_change_cci_addr()
1035 rval = smiapp_write(sensor, in smiapp_change_cci_addr()
1037 sensor->platform_data->i2c_addr_alt << 1); in smiapp_change_cci_addr()
1041 client->addr = sensor->platform_data->i2c_addr_alt; in smiapp_change_cci_addr()
1044 rval = smiapp_read(sensor, SMIAPP_REG_U8_CCI_ADDRESS_CONTROL, &val); in smiapp_change_cci_addr()
1048 if (val != sensor->platform_data->i2c_addr_alt << 1) in smiapp_change_cci_addr()
1059 static int smiapp_setup_flash_strobe(struct smiapp_sensor *sensor) in smiapp_setup_flash_strobe() argument
1062 unsigned int ext_freq = sensor->platform_data->ext_clk; in smiapp_setup_flash_strobe()
1068 strobe_setup = sensor->platform_data->strobe_setup; in smiapp_setup_flash_strobe()
1150 rval = smiapp_write(sensor, SMIAPP_REG_U8_FLASH_MODE_RS, in smiapp_setup_flash_strobe()
1155 rval = smiapp_write(sensor, SMIAPP_REG_U8_FLASH_STROBE_ADJUSTMENT, in smiapp_setup_flash_strobe()
1161 sensor, SMIAPP_REG_U16_TFLASH_STROBE_WIDTH_HIGH_RS_CTRL, in smiapp_setup_flash_strobe()
1166 rval = smiapp_write(sensor, SMIAPP_REG_U16_TFLASH_STROBE_DELAY_RS_CTRL, in smiapp_setup_flash_strobe()
1171 rval = smiapp_write(sensor, SMIAPP_REG_U16_FLASH_STROBE_START_POINT, in smiapp_setup_flash_strobe()
1176 rval = smiapp_write(sensor, SMIAPP_REG_U8_FLASH_TRIGGER_RS, in smiapp_setup_flash_strobe()
1180 sensor->platform_data->strobe_setup->trigger = 0; in smiapp_setup_flash_strobe()
1189 static int smiapp_power_on(struct smiapp_sensor *sensor) in smiapp_power_on() argument
1191 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_power_on()
1195 rval = regulator_enable(sensor->vana); in smiapp_power_on()
1202 if (sensor->platform_data->set_xclk) in smiapp_power_on()
1203 rval = sensor->platform_data->set_xclk( in smiapp_power_on()
1204 &sensor->src->sd, sensor->platform_data->ext_clk); in smiapp_power_on()
1206 rval = clk_prepare_enable(sensor->ext_clk); in smiapp_power_on()
1213 if (gpio_is_valid(sensor->platform_data->xshutdown)) in smiapp_power_on()
1214 gpio_set_value(sensor->platform_data->xshutdown, 1); in smiapp_power_on()
1216 sleep = SMIAPP_RESET_DELAY(sensor->platform_data->ext_clk); in smiapp_power_on()
1230 if (sensor->platform_data->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->platform_data->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->platform_data->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->platform_data->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->platform_data->csi_signalling_mode); 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()
1302 if (!sensor->pixel_array) in smiapp_power_on()
1306 &sensor->pixel_array->ctrl_handler); in smiapp_power_on()
1310 rval = v4l2_ctrl_handler_setup(&sensor->src->ctrl_handler); in smiapp_power_on()
1314 mutex_lock(&sensor->mutex); in smiapp_power_on()
1315 rval = smiapp_update_mode(sensor); in smiapp_power_on()
1316 mutex_unlock(&sensor->mutex); in smiapp_power_on()
1323 if (gpio_is_valid(sensor->platform_data->xshutdown)) in smiapp_power_on()
1324 gpio_set_value(sensor->platform_data->xshutdown, 0); in smiapp_power_on()
1325 if (sensor->platform_data->set_xclk) in smiapp_power_on()
1326 sensor->platform_data->set_xclk(&sensor->src->sd, 0); in smiapp_power_on()
1328 clk_disable_unprepare(sensor->ext_clk); in smiapp_power_on()
1331 regulator_disable(sensor->vana); in smiapp_power_on()
1335 static void smiapp_power_off(struct smiapp_sensor *sensor) in smiapp_power_off() argument
1344 if (sensor->platform_data->i2c_addr_alt) in smiapp_power_off()
1345 smiapp_write(sensor, in smiapp_power_off()
1349 if (gpio_is_valid(sensor->platform_data->xshutdown)) in smiapp_power_off()
1350 gpio_set_value(sensor->platform_data->xshutdown, 0); in smiapp_power_off()
1351 if (sensor->platform_data->set_xclk) in smiapp_power_off()
1352 sensor->platform_data->set_xclk(&sensor->src->sd, 0); in smiapp_power_off()
1354 clk_disable_unprepare(sensor->ext_clk); in smiapp_power_off()
1356 regulator_disable(sensor->vana); in smiapp_power_off()
1357 sensor->streaming = false; in smiapp_power_off()
1362 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_power() local
1365 mutex_lock(&sensor->power_mutex); in smiapp_set_power()
1367 if (on && !sensor->power_count) { in smiapp_set_power()
1369 ret = smiapp_power_on(sensor); in smiapp_set_power()
1372 } else if (!on && sensor->power_count == 1) { in smiapp_set_power()
1373 smiapp_power_off(sensor); in smiapp_set_power()
1377 sensor->power_count += on ? 1 : -1; in smiapp_set_power()
1378 WARN_ON(sensor->power_count < 0); in smiapp_set_power()
1381 mutex_unlock(&sensor->power_mutex); in smiapp_set_power()
1389 static int smiapp_start_streaming(struct smiapp_sensor *sensor) in smiapp_start_streaming() argument
1391 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_start_streaming()
1394 mutex_lock(&sensor->mutex); in smiapp_start_streaming()
1396 rval = smiapp_write(sensor, SMIAPP_REG_U16_CSI_DATA_FORMAT, in smiapp_start_streaming()
1397 (sensor->csi_format->width << 8) | in smiapp_start_streaming()
1398 sensor->csi_format->compressed); in smiapp_start_streaming()
1402 rval = smiapp_pll_configure(sensor); in smiapp_start_streaming()
1407 rval = smiapp_write(sensor, SMIAPP_REG_U16_X_ADDR_START, in smiapp_start_streaming()
1408 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].left); in smiapp_start_streaming()
1412 rval = smiapp_write(sensor, SMIAPP_REG_U16_Y_ADDR_START, in smiapp_start_streaming()
1413 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].top); in smiapp_start_streaming()
1419 sensor, SMIAPP_REG_U16_X_ADDR_END, in smiapp_start_streaming()
1420 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].left in smiapp_start_streaming()
1421 + sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width - 1); in smiapp_start_streaming()
1426 sensor, SMIAPP_REG_U16_Y_ADDR_END, in smiapp_start_streaming()
1427 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].top in smiapp_start_streaming()
1428 + sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height - 1); in smiapp_start_streaming()
1438 if (sensor->limits[SMIAPP_LIMIT_DIGITAL_CROP_CAPABILITY] in smiapp_start_streaming()
1441 sensor, SMIAPP_REG_U16_DIGITAL_CROP_X_OFFSET, in smiapp_start_streaming()
1442 sensor->scaler->crop[SMIAPP_PAD_SINK].left); in smiapp_start_streaming()
1447 sensor, SMIAPP_REG_U16_DIGITAL_CROP_Y_OFFSET, in smiapp_start_streaming()
1448 sensor->scaler->crop[SMIAPP_PAD_SINK].top); in smiapp_start_streaming()
1453 sensor, SMIAPP_REG_U16_DIGITAL_CROP_IMAGE_WIDTH, in smiapp_start_streaming()
1454 sensor->scaler->crop[SMIAPP_PAD_SINK].width); in smiapp_start_streaming()
1459 sensor, SMIAPP_REG_U16_DIGITAL_CROP_IMAGE_HEIGHT, in smiapp_start_streaming()
1460 sensor->scaler->crop[SMIAPP_PAD_SINK].height); in smiapp_start_streaming()
1466 if (sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY] in smiapp_start_streaming()
1468 rval = smiapp_write(sensor, SMIAPP_REG_U16_SCALING_MODE, in smiapp_start_streaming()
1469 sensor->scaling_mode); in smiapp_start_streaming()
1473 rval = smiapp_write(sensor, SMIAPP_REG_U16_SCALE_M, in smiapp_start_streaming()
1474 sensor->scale_m); in smiapp_start_streaming()
1480 rval = smiapp_write(sensor, SMIAPP_REG_U16_X_OUTPUT_SIZE, in smiapp_start_streaming()
1481 sensor->src->crop[SMIAPP_PAD_SRC].width); in smiapp_start_streaming()
1484 rval = smiapp_write(sensor, SMIAPP_REG_U16_Y_OUTPUT_SIZE, in smiapp_start_streaming()
1485 sensor->src->crop[SMIAPP_PAD_SRC].height); in smiapp_start_streaming()
1489 if ((sensor->limits[SMIAPP_LIMIT_FLASH_MODE_CAPABILITY] & in smiapp_start_streaming()
1492 sensor->platform_data->strobe_setup != NULL && in smiapp_start_streaming()
1493 sensor->platform_data->strobe_setup->trigger != 0) { in smiapp_start_streaming()
1494 rval = smiapp_setup_flash_strobe(sensor); in smiapp_start_streaming()
1499 rval = smiapp_call_quirk(sensor, pre_streamon); in smiapp_start_streaming()
1505 rval = smiapp_write(sensor, SMIAPP_REG_U8_MODE_SELECT, in smiapp_start_streaming()
1509 mutex_unlock(&sensor->mutex); in smiapp_start_streaming()
1514 static int smiapp_stop_streaming(struct smiapp_sensor *sensor) in smiapp_stop_streaming() argument
1516 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_stop_streaming()
1519 mutex_lock(&sensor->mutex); in smiapp_stop_streaming()
1520 rval = smiapp_write(sensor, SMIAPP_REG_U8_MODE_SELECT, in smiapp_stop_streaming()
1525 rval = smiapp_call_quirk(sensor, post_streamoff); in smiapp_stop_streaming()
1530 mutex_unlock(&sensor->mutex); in smiapp_stop_streaming()
1540 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_stream() local
1543 if (sensor->streaming == enable) in smiapp_set_stream()
1547 sensor->streaming = true; in smiapp_set_stream()
1548 rval = smiapp_start_streaming(sensor); in smiapp_set_stream()
1550 sensor->streaming = false; in smiapp_set_stream()
1552 rval = smiapp_stop_streaming(sensor); in smiapp_set_stream()
1553 sensor->streaming = false; in smiapp_set_stream()
1564 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_enum_mbus_code() local
1569 mutex_lock(&sensor->mutex); in smiapp_enum_mbus_code()
1574 if (subdev != &sensor->src->sd || code->pad != SMIAPP_PAD_SRC) { in smiapp_enum_mbus_code()
1578 code->code = sensor->internal_csi_format->code; in smiapp_enum_mbus_code()
1584 if (sensor->mbus_frame_fmts & (1 << i)) in smiapp_enum_mbus_code()
1597 mutex_unlock(&sensor->mutex); in smiapp_enum_mbus_code()
1605 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in __smiapp_get_mbus_code() local
1607 if (subdev == &sensor->src->sd && pad == SMIAPP_PAD_SRC) in __smiapp_get_mbus_code()
1608 return sensor->csi_format->code; in __smiapp_get_mbus_code()
1610 return sensor->internal_csi_format->code; in __smiapp_get_mbus_code()
1642 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_get_format() local
1645 mutex_lock(&sensor->mutex); in smiapp_get_format()
1647 mutex_unlock(&sensor->mutex); in smiapp_get_format()
1686 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_propagate() local
1697 if (ssd == sensor->scaler) { in smiapp_propagate()
1698 sensor->scale_m = in smiapp_propagate()
1699 sensor->limits[ in smiapp_propagate()
1701 sensor->scaling_mode = in smiapp_propagate()
1703 } else if (ssd == sensor->binner) { in smiapp_propagate()
1704 sensor->binning_horizontal = 1; in smiapp_propagate()
1705 sensor->binning_vertical = 1; in smiapp_propagate()
1718 *smiapp_validate_csi_data_format(struct smiapp_sensor *sensor, u32 code) in smiapp_validate_csi_data_format() argument
1720 const struct smiapp_csi_data_format *csi_format = sensor->csi_format; in smiapp_validate_csi_data_format()
1724 if (sensor->mbus_frame_fmts & (1 << i) in smiapp_validate_csi_data_format()
1736 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_format_source() local
1738 *old_csi_format = sensor->csi_format; in smiapp_set_format_source()
1752 if (subdev != &sensor->src->sd) in smiapp_set_format_source()
1755 csi_format = smiapp_validate_csi_data_format(sensor, code); in smiapp_set_format_source()
1762 sensor->csi_format = csi_format; in smiapp_set_format_source()
1765 for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++) in smiapp_set_format_source()
1767 sensor->test_data[i], 0, in smiapp_set_format_source()
1774 &sensor->valid_link_freqs[sensor->csi_format->compressed in smiapp_set_format_source()
1778 sensor->link_freq, 0, in smiapp_set_format_source()
1782 return smiapp_pll_update(sensor); in smiapp_set_format_source()
1789 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_format() local
1793 mutex_lock(&sensor->mutex); in smiapp_set_format()
1800 mutex_unlock(&sensor->mutex); in smiapp_set_format()
1813 sensor->limits[SMIAPP_LIMIT_MIN_X_OUTPUT_SIZE], in smiapp_set_format()
1814 sensor->limits[SMIAPP_LIMIT_MAX_X_OUTPUT_SIZE]); in smiapp_set_format()
1817 sensor->limits[SMIAPP_LIMIT_MIN_Y_OUTPUT_SIZE], in smiapp_set_format()
1818 sensor->limits[SMIAPP_LIMIT_MAX_Y_OUTPUT_SIZE]); in smiapp_set_format()
1831 mutex_unlock(&sensor->mutex); in smiapp_set_format()
1845 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in scaling_goodness() local
1871 if (w < sensor->limits[SMIAPP_LIMIT_MIN_X_OUTPUT_SIZE]) in scaling_goodness()
1886 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_compose_binner() local
1894 for (i = 0; i < sensor->nbinning_subtypes; i++) { in smiapp_set_compose_binner()
1898 / sensor->binning_subtypes[i].horizontal, in smiapp_set_compose_binner()
1901 / sensor->binning_subtypes[i].vertical, in smiapp_set_compose_binner()
1905 binh = sensor->binning_subtypes[i].horizontal; in smiapp_set_compose_binner()
1906 binv = sensor->binning_subtypes[i].vertical; in smiapp_set_compose_binner()
1911 sensor->binning_vertical = binv; in smiapp_set_compose_binner()
1912 sensor->binning_horizontal = binh; in smiapp_set_compose_binner()
1935 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_compose_scaler() local
1937 u32 scale_m = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN]; in smiapp_set_compose_scaler()
1950 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN] / sel->r.width; in smiapp_set_compose_scaler()
1952 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN] / sel->r.height; in smiapp_set_compose_scaler()
1954 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN] in smiapp_set_compose_scaler()
1955 / sensor->limits[SMIAPP_LIMIT_MIN_X_OUTPUT_SIZE]; in smiapp_set_compose_scaler()
1957 a = clamp(a, sensor->limits[SMIAPP_LIMIT_SCALER_M_MIN], in smiapp_set_compose_scaler()
1958 sensor->limits[SMIAPP_LIMIT_SCALER_M_MAX]); in smiapp_set_compose_scaler()
1959 b = clamp(b, sensor->limits[SMIAPP_LIMIT_SCALER_M_MIN], in smiapp_set_compose_scaler()
1960 sensor->limits[SMIAPP_LIMIT_SCALER_M_MAX]); in smiapp_set_compose_scaler()
1961 max_m = clamp(max_m, sensor->limits[SMIAPP_LIMIT_SCALER_M_MIN], in smiapp_set_compose_scaler()
1962 sensor->limits[SMIAPP_LIMIT_SCALER_M_MAX]); in smiapp_set_compose_scaler()
1989 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN], in smiapp_set_compose_scaler()
2003 if (sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY] in smiapp_set_compose_scaler()
2010 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN], in smiapp_set_compose_scaler()
2014 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN], in smiapp_set_compose_scaler()
2028 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN]) & ~1; in smiapp_set_compose_scaler()
2033 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN]) in smiapp_set_compose_scaler()
2039 sensor->scale_m = scale_m; in smiapp_set_compose_scaler()
2040 sensor->scaling_mode = mode; in smiapp_set_compose_scaler()
2048 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_compose() local
2057 if (ssd == sensor->binner) in smiapp_set_compose()
2067 return smiapp_update_mode(sensor); in smiapp_set_compose()
2075 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in __smiapp_sel_supported() local
2082 if (ssd == sensor->pixel_array in __smiapp_sel_supported()
2085 if (ssd == sensor->src in __smiapp_sel_supported()
2088 if (ssd == sensor->scaler in __smiapp_sel_supported()
2090 && sensor->limits[SMIAPP_LIMIT_DIGITAL_CROP_CAPABILITY] in __smiapp_sel_supported()
2095 if (ssd == sensor->pixel_array in __smiapp_sel_supported()
2103 if (ssd == sensor->binner) in __smiapp_sel_supported()
2105 if (ssd == sensor->scaler in __smiapp_sel_supported()
2106 && sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY] in __smiapp_sel_supported()
2119 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_crop() local
2147 if (ssd == sensor->src && sel->pad == SMIAPP_PAD_SRC) { in smiapp_set_crop()
2160 if (ssd != sensor->pixel_array && sel->pad == SMIAPP_PAD_SINK) in smiapp_set_crop()
2171 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in __smiapp_get_selection() local
2198 if (ssd == sensor->pixel_array) { in __smiapp_get_selection()
2201 sensor->limits[SMIAPP_LIMIT_X_ADDR_MAX] + 1; in __smiapp_get_selection()
2203 sensor->limits[SMIAPP_LIMIT_Y_ADDR_MAX] + 1; in __smiapp_get_selection()
2226 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_get_selection() local
2229 mutex_lock(&sensor->mutex); in smiapp_get_selection()
2231 mutex_unlock(&sensor->mutex); in smiapp_get_selection()
2239 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_set_selection() local
2246 mutex_lock(&sensor->mutex); in smiapp_set_selection()
2254 sensor->limits[SMIAPP_LIMIT_MIN_X_OUTPUT_SIZE], in smiapp_set_selection()
2257 sensor->limits[SMIAPP_LIMIT_MIN_Y_OUTPUT_SIZE], in smiapp_set_selection()
2271 mutex_unlock(&sensor->mutex); in smiapp_set_selection()
2277 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_get_skip_frames() local
2279 *frames = sensor->frame_skip; in smiapp_get_skip_frames()
2293 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_sysfs_nvm_read() local
2296 if (!sensor->dev_init_done) in smiapp_sysfs_nvm_read()
2299 if (!sensor->nvm_size) { in smiapp_sysfs_nvm_read()
2301 sensor->nvm_size = sensor->platform_data->nvm_size; in smiapp_sysfs_nvm_read()
2304 if (smiapp_read_nvm(sensor, sensor->nvm)) { in smiapp_sysfs_nvm_read()
2314 nbytes = min_t(unsigned int, sensor->nvm_size, PAGE_SIZE); in smiapp_sysfs_nvm_read()
2315 memcpy(buf, sensor->nvm, nbytes); in smiapp_sysfs_nvm_read()
2326 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_sysfs_ident_read() local
2327 struct smiapp_module_info *minfo = &sensor->minfo; in smiapp_sysfs_ident_read()
2340 static int smiapp_identify_module(struct smiapp_sensor *sensor) in smiapp_identify_module() argument
2342 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_identify_module()
2343 struct smiapp_module_info *minfo = &sensor->minfo; in smiapp_identify_module()
2350 rval = smiapp_read_8only(sensor, SMIAPP_REG_U8_MANUFACTURER_ID, in smiapp_identify_module()
2353 rval = smiapp_read_8only(sensor, SMIAPP_REG_U16_MODEL_ID, in smiapp_identify_module()
2356 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2360 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2364 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2368 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2372 rval = smiapp_read_8only(sensor, SMIAPP_REG_U8_MODULE_DATE_DAY, in smiapp_identify_module()
2377 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2381 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2385 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2389 rval = smiapp_read_8only(sensor, in smiapp_identify_module()
2395 rval = smiapp_read_8only(sensor, SMIAPP_REG_U8_SMIA_VERSION, in smiapp_identify_module()
2398 rval = smiapp_read_8only(sensor, SMIAPP_REG_U8_SMIAPP_VERSION, in smiapp_identify_module()
2472 static int smiapp_register_subdevs(struct smiapp_sensor *sensor) in smiapp_register_subdevs() argument
2474 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_register_subdevs()
2476 sensor->scaler, in smiapp_register_subdevs()
2477 sensor->binner, in smiapp_register_subdevs()
2478 sensor->pixel_array, in smiapp_register_subdevs()
2510 rval = v4l2_device_register_subdev(sensor->src->sd.v4l2_dev, in smiapp_register_subdevs()
2522 static void smiapp_cleanup(struct smiapp_sensor *sensor) in smiapp_cleanup() argument
2524 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_cleanup()
2529 smiapp_free_controls(sensor); in smiapp_cleanup()
2532 static int smiapp_init(struct smiapp_sensor *sensor) in smiapp_init() argument
2534 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); in smiapp_init()
2535 struct smiapp_pll *pll = &sensor->pll; in smiapp_init()
2540 sensor->vana = devm_regulator_get(&client->dev, "vana"); in smiapp_init()
2541 if (IS_ERR(sensor->vana)) { in smiapp_init()
2543 return PTR_ERR(sensor->vana); in smiapp_init()
2546 if (!sensor->platform_data->set_xclk) { in smiapp_init()
2547 sensor->ext_clk = devm_clk_get(&client->dev, NULL); in smiapp_init()
2548 if (IS_ERR(sensor->ext_clk)) { in smiapp_init()
2550 return PTR_ERR(sensor->ext_clk); in smiapp_init()
2553 rval = clk_set_rate(sensor->ext_clk, in smiapp_init()
2554 sensor->platform_data->ext_clk); in smiapp_init()
2558 sensor->platform_data->ext_clk); in smiapp_init()
2563 if (gpio_is_valid(sensor->platform_data->xshutdown)) { in smiapp_init()
2565 &client->dev, sensor->platform_data->xshutdown, 0, in smiapp_init()
2570 sensor->platform_data->xshutdown); in smiapp_init()
2575 rval = smiapp_power_on(sensor); in smiapp_init()
2579 rval = smiapp_identify_module(sensor); in smiapp_init()
2585 rval = smiapp_get_all_limits(sensor); in smiapp_init()
2604 if (sensor->platform_data->module_board_orient == in smiapp_init()
2606 sensor->hvflip_inv_mask = SMIAPP_IMAGE_ORIENTATION_HFLIP | in smiapp_init()
2609 rval = smiapp_call_quirk(sensor, limits); in smiapp_init()
2615 if (sensor->limits[SMIAPP_LIMIT_BINNING_CAPABILITY]) { in smiapp_init()
2618 rval = smiapp_read(sensor, in smiapp_init()
2624 sensor->nbinning_subtypes = min_t(u8, val, in smiapp_init()
2627 for (i = 0; i < sensor->nbinning_subtypes; i++) { in smiapp_init()
2629 sensor, SMIAPP_REG_U8_BINNING_TYPE_n(i), &val); in smiapp_init()
2634 sensor->binning_subtypes[i] = in smiapp_init()
2638 sensor->binning_subtypes[i].horizontal, in smiapp_init()
2639 sensor->binning_subtypes[i].vertical); in smiapp_init()
2642 sensor->binning_horizontal = 1; in smiapp_init()
2643 sensor->binning_vertical = 1; in smiapp_init()
2653 if (sensor->minfo.smiapp_version && sensor->platform_data->nvm_size) { in smiapp_init()
2654 sensor->nvm = devm_kzalloc(&client->dev, in smiapp_init()
2655 sensor->platform_data->nvm_size, GFP_KERNEL); in smiapp_init()
2656 if (sensor->nvm == NULL) { in smiapp_init()
2670 if (!sensor->limits[SMIAPP_LIMIT_MIN_OP_SYS_CLK_DIV] || in smiapp_init()
2671 !sensor->limits[SMIAPP_LIMIT_MAX_OP_SYS_CLK_DIV] || in smiapp_init()
2672 !sensor->limits[SMIAPP_LIMIT_MIN_OP_PIX_CLK_DIV] || in smiapp_init()
2673 !sensor->limits[SMIAPP_LIMIT_MAX_OP_PIX_CLK_DIV]) { in smiapp_init()
2674 sensor->minfo.smiapp_profile = SMIAPP_PROFILE_0; in smiapp_init()
2675 } else if (sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY] in smiapp_init()
2677 if (sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY] in smiapp_init()
2679 sensor->minfo.smiapp_profile = SMIAPP_PROFILE_1; in smiapp_init()
2681 sensor->minfo.smiapp_profile = SMIAPP_PROFILE_2; in smiapp_init()
2682 sensor->scaler = &sensor->ssds[sensor->ssds_used]; in smiapp_init()
2683 sensor->ssds_used++; in smiapp_init()
2684 } else if (sensor->limits[SMIAPP_LIMIT_DIGITAL_CROP_CAPABILITY] in smiapp_init()
2686 sensor->scaler = &sensor->ssds[sensor->ssds_used]; in smiapp_init()
2687 sensor->ssds_used++; in smiapp_init()
2689 sensor->binner = &sensor->ssds[sensor->ssds_used]; in smiapp_init()
2690 sensor->ssds_used++; in smiapp_init()
2691 sensor->pixel_array = &sensor->ssds[sensor->ssds_used]; in smiapp_init()
2692 sensor->ssds_used++; in smiapp_init()
2694 sensor->scale_m = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN]; in smiapp_init()
2698 pll->csi2.lanes = sensor->platform_data->lanes; in smiapp_init()
2699 pll->ext_clk_freq_hz = sensor->platform_data->ext_clk; in smiapp_init()
2700 pll->scale_n = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN]; in smiapp_init()
2702 if (sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0) in smiapp_init()
2710 { sensor->scaler, "scaler", }, in smiapp_init()
2711 { sensor->binner, "binner", }, in smiapp_init()
2712 { sensor->pixel_array, "pixel array", }, in smiapp_init()
2719 if (this != sensor->src) in smiapp_init()
2722 this->sensor = sensor; in smiapp_init()
2724 if (this == sensor->pixel_array) { in smiapp_init()
2733 sensor->minfo.name, _this->name, in smiapp_init()
2737 sensor->limits[SMIAPP_LIMIT_X_ADDR_MAX] + 1; in smiapp_init()
2739 sensor->limits[SMIAPP_LIMIT_Y_ADDR_MAX] + 1; in smiapp_init()
2744 if (this != sensor->pixel_array) { in smiapp_init()
2764 dev_dbg(&client->dev, "profile %d\n", sensor->minfo.smiapp_profile); in smiapp_init()
2766 sensor->pixel_array->sd.entity.type = MEDIA_ENT_T_V4L2_SUBDEV_SENSOR; in smiapp_init()
2769 smiapp_read_frame_fmt(sensor); in smiapp_init()
2770 rval = smiapp_init_controls(sensor); in smiapp_init()
2774 rval = smiapp_call_quirk(sensor, init); in smiapp_init()
2778 rval = smiapp_get_mbus_formats(sensor); in smiapp_init()
2784 rval = smiapp_init_late_controls(sensor); in smiapp_init()
2790 mutex_lock(&sensor->mutex); in smiapp_init()
2791 rval = smiapp_update_mode(sensor); in smiapp_init()
2792 mutex_unlock(&sensor->mutex); in smiapp_init()
2798 sensor->streaming = false; in smiapp_init()
2799 sensor->dev_init_done = true; in smiapp_init()
2801 smiapp_power_off(sensor); in smiapp_init()
2806 smiapp_cleanup(sensor); in smiapp_init()
2809 smiapp_power_off(sensor); in smiapp_init()
2815 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_registered() local
2820 rval = smiapp_init(sensor); in smiapp_registered()
2825 rval = smiapp_register_subdevs(sensor); in smiapp_registered()
2827 smiapp_cleanup(sensor); in smiapp_registered()
2835 struct smiapp_sensor *sensor = ssd->sensor; in smiapp_open() local
2837 smiapp_csi_data_formats[smiapp_pixel_order(sensor)].code; in smiapp_open()
2840 mutex_lock(&sensor->mutex); in smiapp_open()
2848 try_fmt->width = sensor->limits[SMIAPP_LIMIT_X_ADDR_MAX] + 1; in smiapp_open()
2849 try_fmt->height = sensor->limits[SMIAPP_LIMIT_Y_ADDR_MAX] + 1; in smiapp_open()
2858 if (ssd != sensor->pixel_array) in smiapp_open()
2865 mutex_unlock(&sensor->mutex); in smiapp_open()
2899 .sensor = &smiapp_sensor_ops,
2927 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_suspend() local
2930 BUG_ON(mutex_is_locked(&sensor->mutex)); in smiapp_suspend()
2932 if (sensor->power_count == 0) in smiapp_suspend()
2935 if (sensor->streaming) in smiapp_suspend()
2936 smiapp_stop_streaming(sensor); in smiapp_suspend()
2938 streaming = sensor->streaming; in smiapp_suspend()
2940 smiapp_power_off(sensor); in smiapp_suspend()
2943 sensor->streaming = streaming; in smiapp_suspend()
2952 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_resume() local
2955 if (sensor->power_count == 0) in smiapp_resume()
2958 rval = smiapp_power_on(sensor); in smiapp_resume()
2962 if (sensor->streaming) in smiapp_resume()
2963 rval = smiapp_start_streaming(sensor); in smiapp_resume()
3058 struct smiapp_sensor *sensor; in smiapp_probe() local
3065 sensor = devm_kzalloc(&client->dev, sizeof(*sensor), GFP_KERNEL); in smiapp_probe()
3066 if (sensor == NULL) in smiapp_probe()
3069 sensor->platform_data = pdata; in smiapp_probe()
3070 mutex_init(&sensor->mutex); in smiapp_probe()
3071 mutex_init(&sensor->power_mutex); in smiapp_probe()
3072 sensor->src = &sensor->ssds[sensor->ssds_used]; in smiapp_probe()
3074 v4l2_i2c_subdev_init(&sensor->src->sd, client, &smiapp_ops); in smiapp_probe()
3075 sensor->src->sd.internal_ops = &smiapp_internal_src_ops; in smiapp_probe()
3076 sensor->src->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in smiapp_probe()
3077 sensor->src->sensor = sensor; in smiapp_probe()
3079 sensor->src->pads[0].flags = MEDIA_PAD_FL_SOURCE; in smiapp_probe()
3080 rval = media_entity_init(&sensor->src->sd.entity, 2, in smiapp_probe()
3081 sensor->src->pads, 0); in smiapp_probe()
3086 rval = smiapp_init(sensor); in smiapp_probe()
3091 rval = v4l2_async_register_subdev(&sensor->src->sd); in smiapp_probe()
3098 media_entity_cleanup(&sensor->src->sd.entity); in smiapp_probe()
3106 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); in smiapp_remove() local
3111 if (sensor->power_count) { in smiapp_remove()
3112 if (gpio_is_valid(sensor->platform_data->xshutdown)) in smiapp_remove()
3113 gpio_set_value(sensor->platform_data->xshutdown, 0); in smiapp_remove()
3114 if (sensor->platform_data->set_xclk) in smiapp_remove()
3115 sensor->platform_data->set_xclk(&sensor->src->sd, 0); in smiapp_remove()
3117 clk_disable_unprepare(sensor->ext_clk); in smiapp_remove()
3118 sensor->power_count = 0; in smiapp_remove()
3121 for (i = 0; i < sensor->ssds_used; i++) { in smiapp_remove()
3122 v4l2_device_unregister_subdev(&sensor->ssds[i].sd); in smiapp_remove()
3123 media_entity_cleanup(&sensor->ssds[i].sd.entity); in smiapp_remove()
3125 smiapp_cleanup(sensor); in smiapp_remove()