Lines Matching +full:isp +full:- +full:0

1 // SPDX-License-Identifier: (GPL-2.0+ OR MIT)
3 * Rockchip ISP1 Driver - ISP Subdevice
17 #include <media/v4l2-event.h>
19 #include "rkisp1-common.h"
28 * This is because ISP Subdev describes not only ISP submodule (input size,
38 * Cropping regions of ISP
40 * +---------------------------------------------------------+
42 * | +---------------------------------------------------+ |
45 * | | +--------------------------------------------+ | |
48 * | | | +---------------------------------+ | | |
51 * | | | +---------------------------------+ | | |
52 * | | +--------------------------------------------+ | |
53 * | +---------------------------------------------------+ |
54 * +---------------------------------------------------------+
57 /* -----------------------------------------------------------------------------
61 #define ISP_DEWARP_CONTROL 0x0138
64 #define ISP_DEWARP_CONTROL_MIPI_CSI2_VS_SEL_RISING (0 << 20)
74 #define ISP_DEWARP_CONTROL_MIPI_CSI1_VS_SEL_RISING (0 << 10)
84 #define ISP_DEWARP_CONTROL_GPR_ISP_0_DISABLE BIT(0)
97 * Configure and enable the gasket with the CSI-2 data type. Set the in rkisp1_gasket_enable()
98 * vsync polarity as active high, as that is what the ISP is configured in rkisp1_gasket_enable()
100 * ISP has a 16-bit wide input and expects data to be left-aligned. in rkisp1_gasket_enable()
103 source_sd = media_entity_to_v4l2_subdev(source->entity); in rkisp1_gasket_enable()
105 source->index, &fd); in rkisp1_gasket_enable()
107 dev_err(rkisp1->dev, in rkisp1_gasket_enable()
109 source_sd->name, 0, ret); in rkisp1_gasket_enable()
114 dev_err(rkisp1->dev, "invalid frame descriptor for '%s':%u\n", in rkisp1_gasket_enable()
115 source_sd->name, 0); in rkisp1_gasket_enable()
116 return -EINVAL; in rkisp1_gasket_enable()
119 dt = fd.entry[0].bus.csi2.dt; in rkisp1_gasket_enable()
121 if (rkisp1->gasket_id == 0) { in rkisp1_gasket_enable()
141 regmap_update_bits(rkisp1->gasket, ISP_DEWARP_CONTROL, mask, val); in rkisp1_gasket_enable()
143 return 0; in rkisp1_gasket_enable()
151 if (rkisp1->gasket_id == 1) { in rkisp1_gasket_disable()
163 regmap_update_bits(rkisp1->gasket, ISP_DEWARP_CONTROL, mask, val); in rkisp1_gasket_disable()
166 /* ----------------------------------------------------------------------------
175 static void rkisp1_config_ism(struct rkisp1_isp *isp, in rkisp1_config_ism() argument
181 struct rkisp1_device *rkisp1 = isp->rkisp1; in rkisp1_config_ism()
184 rkisp1_write(rkisp1, RKISP1_CIF_ISP_IS_RECENTER, 0); in rkisp1_config_ism()
185 rkisp1_write(rkisp1, RKISP1_CIF_ISP_IS_MAX_DX, 0); in rkisp1_config_ism()
186 rkisp1_write(rkisp1, RKISP1_CIF_ISP_IS_MAX_DY, 0); in rkisp1_config_ism()
187 rkisp1_write(rkisp1, RKISP1_CIF_ISP_IS_DISPLACE, 0); in rkisp1_config_ism()
188 rkisp1_write(rkisp1, RKISP1_CIF_ISP_IS_H_OFFS, src_crop->left); in rkisp1_config_ism()
189 rkisp1_write(rkisp1, RKISP1_CIF_ISP_IS_V_OFFS, src_crop->top); in rkisp1_config_ism()
190 rkisp1_write(rkisp1, RKISP1_CIF_ISP_IS_H_SIZE, src_crop->width); in rkisp1_config_ism()
191 rkisp1_write(rkisp1, RKISP1_CIF_ISP_IS_V_SIZE, src_crop->height); in rkisp1_config_ism()
201 * configure ISP blocks with input format, size......
203 static int rkisp1_config_isp(struct rkisp1_isp *isp, in rkisp1_config_isp() argument
207 struct rkisp1_device *rkisp1 = isp->rkisp1; in rkisp1_config_isp()
208 u32 isp_ctrl = 0, irq_mask = 0, acq_mult = 0, acq_prop = 0; in rkisp1_config_isp()
222 sink_fmt = rkisp1_mbus_info_get_by_code(sink_frm->code); in rkisp1_config_isp()
223 src_fmt = rkisp1_mbus_info_get_by_code(src_frm->code); in rkisp1_config_isp()
225 if (sink_fmt->pixel_enc == V4L2_PIXEL_ENC_BAYER) { in rkisp1_config_isp()
227 if (src_fmt->pixel_enc == V4L2_PIXEL_ENC_BAYER) { in rkisp1_config_isp()
234 RKISP1_CIF_ISP_DEMOSAIC_TH(0xc)); in rkisp1_config_isp()
241 } else if (sink_fmt->pixel_enc == V4L2_PIXEL_ENC_YUV) { in rkisp1_config_isp()
260 switch (sink_fmt->bus_width) { in rkisp1_config_isp()
271 dev_err(rkisp1->dev, "Invalid bus width %u\n", in rkisp1_config_isp()
272 sink_fmt->bus_width); in rkisp1_config_isp()
273 return -EINVAL; in rkisp1_config_isp()
287 acq_prop | sink_fmt->yuv_seq | in rkisp1_config_isp()
288 RKISP1_CIF_ISP_ACQ_PROP_BAYER_PAT(sink_fmt->bayer_pat) | in rkisp1_config_isp()
290 rkisp1_write(rkisp1, RKISP1_CIF_ISP_ACQ_NR_FRAMES, 0); in rkisp1_config_isp()
293 rkisp1_write(rkisp1, RKISP1_CIF_ISP_ACQ_H_OFFS, 0); in rkisp1_config_isp()
294 rkisp1_write(rkisp1, RKISP1_CIF_ISP_ACQ_V_OFFS, 0); in rkisp1_config_isp()
296 acq_mult * sink_frm->width); in rkisp1_config_isp()
297 rkisp1_write(rkisp1, RKISP1_CIF_ISP_ACQ_V_SIZE, sink_frm->height); in rkisp1_config_isp()
299 /* ISP Out Area */ in rkisp1_config_isp()
300 rkisp1_write(rkisp1, RKISP1_CIF_ISP_OUT_H_OFFS, sink_crop->left); in rkisp1_config_isp()
301 rkisp1_write(rkisp1, RKISP1_CIF_ISP_OUT_V_OFFS, sink_crop->top); in rkisp1_config_isp()
302 rkisp1_write(rkisp1, RKISP1_CIF_ISP_OUT_H_SIZE, sink_crop->width); in rkisp1_config_isp()
303 rkisp1_write(rkisp1, RKISP1_CIF_ISP_OUT_V_SIZE, sink_crop->height); in rkisp1_config_isp()
309 if (src_fmt->pixel_enc == V4L2_PIXEL_ENC_BAYER) { in rkisp1_config_isp()
310 rkisp1_params_disable(&rkisp1->params); in rkisp1_config_isp()
316 rkisp1_params_pre_configure(&rkisp1->params, sink_fmt->bayer_pat, in rkisp1_config_isp()
317 src_frm->quantization, in rkisp1_config_isp()
318 src_frm->ycbcr_enc); in rkisp1_config_isp()
321 isp->sink_fmt = sink_fmt; in rkisp1_config_isp()
323 return 0; in rkisp1_config_isp()
327 static void rkisp1_config_path(struct rkisp1_isp *isp, in rkisp1_config_path() argument
330 struct rkisp1_device *rkisp1 = isp->rkisp1; in rkisp1_config_path()
342 static int rkisp1_config_cif(struct rkisp1_isp *isp, in rkisp1_config_cif() argument
348 ret = rkisp1_config_isp(isp, sd_state, mbus_type, mbus_flags); in rkisp1_config_cif()
352 rkisp1_config_path(isp, mbus_type); in rkisp1_config_cif()
353 rkisp1_config_ism(isp, sd_state); in rkisp1_config_cif()
355 return 0; in rkisp1_config_cif()
358 static void rkisp1_isp_stop(struct rkisp1_isp *isp) in rkisp1_isp_stop() argument
360 struct rkisp1_device *rkisp1 = isp->rkisp1; in rkisp1_isp_stop()
364 * ISP(mi) stop in mi frame end -> Stop ISP(mipi) -> in rkisp1_isp_stop()
365 * Stop ISP(isp) ->wait for ISP isp off in rkisp1_isp_stop()
368 /* Mask MI and ISP interrupts */ in rkisp1_isp_stop()
369 rkisp1_write(rkisp1, RKISP1_CIF_ISP_IMSC, 0); in rkisp1_isp_stop()
370 rkisp1_write(rkisp1, RKISP1_CIF_MI_IMSC, 0); in rkisp1_isp_stop()
377 * even after this, but it will return immediately as the MI and ISP in rkisp1_isp_stop()
380 synchronize_irq(rkisp1->irqs[RKISP1_IRQ_ISP]); in rkisp1_isp_stop()
381 if (rkisp1->irqs[RKISP1_IRQ_ISP] != rkisp1->irqs[RKISP1_IRQ_MI]) in rkisp1_isp_stop()
382 synchronize_irq(rkisp1->irqs[RKISP1_IRQ_MI]); in rkisp1_isp_stop()
384 /* Clear MI and ISP interrupt status */ in rkisp1_isp_stop()
385 rkisp1_write(rkisp1, RKISP1_CIF_ISP_ICR, ~0); in rkisp1_isp_stop()
386 rkisp1_write(rkisp1, RKISP1_CIF_MI_ICR, ~0); in rkisp1_isp_stop()
388 /* stop ISP */ in rkisp1_isp_stop()
398 readx_poll_timeout(readl, rkisp1->base_addr + RKISP1_CIF_ISP_RIS, in rkisp1_isp_stop()
403 rkisp1_write(rkisp1, RKISP1_CIF_VI_IRCL, 0x0); in rkisp1_isp_stop()
405 if (rkisp1->info->isp_ver == RKISP1_V_IMX8MP) in rkisp1_isp_stop()
409 static void rkisp1_config_clk(struct rkisp1_isp *isp) in rkisp1_config_clk() argument
411 struct rkisp1_device *rkisp1 = isp->rkisp1; in rkisp1_config_clk()
422 if (rkisp1->info->isp_ver == RKISP1_V12) { in rkisp1_config_clk()
431 static int rkisp1_isp_start(struct rkisp1_isp *isp, in rkisp1_isp_start() argument
435 struct rkisp1_device *rkisp1 = isp->rkisp1; in rkisp1_isp_start()
441 rkisp1_config_clk(isp); in rkisp1_isp_start()
443 if (rkisp1->info->isp_ver == RKISP1_V_IMX8MP) { in rkisp1_isp_start()
449 /* Activate ISP */ in rkisp1_isp_start()
458 src_info = rkisp1_mbus_info_get_by_code(src_fmt->code); in rkisp1_isp_start()
460 if (src_info->pixel_enc != V4L2_PIXEL_ENC_BAYER) in rkisp1_isp_start()
461 rkisp1_params_post_configure(&rkisp1->params); in rkisp1_isp_start()
463 return 0; in rkisp1_isp_start()
466 /* ----------------------------------------------------------------------------
480 int pos = 0; in rkisp1_isp_enum_mbus_code()
482 if (code->pad == RKISP1_ISP_PAD_SINK_VIDEO) { in rkisp1_isp_enum_mbus_code()
484 } else if (code->pad == RKISP1_ISP_PAD_SOURCE_VIDEO) { in rkisp1_isp_enum_mbus_code()
487 if (code->index > 0) in rkisp1_isp_enum_mbus_code()
488 return -EINVAL; in rkisp1_isp_enum_mbus_code()
489 code->code = MEDIA_BUS_FMT_METADATA_FIXED; in rkisp1_isp_enum_mbus_code()
490 return 0; in rkisp1_isp_enum_mbus_code()
493 for (i = 0; ; i++) { in rkisp1_isp_enum_mbus_code()
498 return -EINVAL; in rkisp1_isp_enum_mbus_code()
500 if (fmt->direction & dir) in rkisp1_isp_enum_mbus_code()
503 if (code->index == pos - 1) { in rkisp1_isp_enum_mbus_code()
504 code->code = fmt->mbus_code; in rkisp1_isp_enum_mbus_code()
505 if (fmt->pixel_enc == V4L2_PIXEL_ENC_YUV && in rkisp1_isp_enum_mbus_code()
507 code->flags = in rkisp1_isp_enum_mbus_code()
509 return 0; in rkisp1_isp_enum_mbus_code()
513 return -EINVAL; in rkisp1_isp_enum_mbus_code()
520 struct rkisp1_isp *isp = to_rkisp1_isp(sd); in rkisp1_isp_enum_frame_size() local
523 if (fse->pad == RKISP1_ISP_PAD_SINK_PARAMS || in rkisp1_isp_enum_frame_size()
524 fse->pad == RKISP1_ISP_PAD_SOURCE_STATS) in rkisp1_isp_enum_frame_size()
525 return -ENOTTY; in rkisp1_isp_enum_frame_size()
527 if (fse->index > 0) in rkisp1_isp_enum_frame_size()
528 return -EINVAL; in rkisp1_isp_enum_frame_size()
530 mbus_info = rkisp1_mbus_info_get_by_code(fse->code); in rkisp1_isp_enum_frame_size()
532 return -EINVAL; in rkisp1_isp_enum_frame_size()
534 if (!(mbus_info->direction & RKISP1_ISP_SD_SINK) && in rkisp1_isp_enum_frame_size()
535 fse->pad == RKISP1_ISP_PAD_SINK_VIDEO) in rkisp1_isp_enum_frame_size()
536 return -EINVAL; in rkisp1_isp_enum_frame_size()
538 if (!(mbus_info->direction & RKISP1_ISP_SD_SRC) && in rkisp1_isp_enum_frame_size()
539 fse->pad == RKISP1_ISP_PAD_SOURCE_VIDEO) in rkisp1_isp_enum_frame_size()
540 return -EINVAL; in rkisp1_isp_enum_frame_size()
542 fse->min_width = RKISP1_ISP_MIN_WIDTH; in rkisp1_isp_enum_frame_size()
543 fse->max_width = isp->rkisp1->info->max_width; in rkisp1_isp_enum_frame_size()
544 fse->min_height = RKISP1_ISP_MIN_HEIGHT; in rkisp1_isp_enum_frame_size()
545 fse->max_height = isp->rkisp1->info->max_height; in rkisp1_isp_enum_frame_size()
547 return 0; in rkisp1_isp_enum_frame_size()
559 sink_fmt->width = RKISP1_DEFAULT_WIDTH; in rkisp1_isp_init_state()
560 sink_fmt->height = RKISP1_DEFAULT_HEIGHT; in rkisp1_isp_init_state()
561 sink_fmt->field = V4L2_FIELD_NONE; in rkisp1_isp_init_state()
562 sink_fmt->code = RKISP1_DEF_SINK_PAD_FMT; in rkisp1_isp_init_state()
563 sink_fmt->colorspace = V4L2_COLORSPACE_RAW; in rkisp1_isp_init_state()
564 sink_fmt->xfer_func = V4L2_XFER_FUNC_NONE; in rkisp1_isp_init_state()
565 sink_fmt->ycbcr_enc = V4L2_YCBCR_ENC_601; in rkisp1_isp_init_state()
566 sink_fmt->quantization = V4L2_QUANTIZATION_FULL_RANGE; in rkisp1_isp_init_state()
570 sink_crop->width = RKISP1_DEFAULT_WIDTH; in rkisp1_isp_init_state()
571 sink_crop->height = RKISP1_DEFAULT_HEIGHT; in rkisp1_isp_init_state()
572 sink_crop->left = 0; in rkisp1_isp_init_state()
573 sink_crop->top = 0; in rkisp1_isp_init_state()
578 src_fmt->code = RKISP1_DEF_SRC_PAD_FMT; in rkisp1_isp_init_state()
579 src_fmt->colorspace = V4L2_COLORSPACE_SRGB; in rkisp1_isp_init_state()
580 src_fmt->xfer_func = V4L2_XFER_FUNC_SRGB; in rkisp1_isp_init_state()
581 src_fmt->ycbcr_enc = V4L2_YCBCR_ENC_601; in rkisp1_isp_init_state()
582 src_fmt->quantization = V4L2_QUANTIZATION_LIM_RANGE; in rkisp1_isp_init_state()
593 sink_fmt->width = 0; in rkisp1_isp_init_state()
594 sink_fmt->height = 0; in rkisp1_isp_init_state()
595 sink_fmt->field = V4L2_FIELD_NONE; in rkisp1_isp_init_state()
596 sink_fmt->code = MEDIA_BUS_FMT_METADATA_FIXED; in rkisp1_isp_init_state()
599 return 0; in rkisp1_isp_init_state()
602 static void rkisp1_isp_set_src_fmt(struct rkisp1_isp *isp, in rkisp1_isp_set_src_fmt() argument
621 * Media bus code. The ISP can operate in pass-through mode (Bayer in, in rkisp1_isp_set_src_fmt()
625 sink_info = rkisp1_mbus_info_get_by_code(sink_fmt->code); in rkisp1_isp_set_src_fmt()
627 src_fmt->code = format->code; in rkisp1_isp_set_src_fmt()
628 src_info = rkisp1_mbus_info_get_by_code(src_fmt->code); in rkisp1_isp_set_src_fmt()
629 if (!src_info || !(src_info->direction & RKISP1_ISP_SD_SRC)) { in rkisp1_isp_set_src_fmt()
630 src_fmt->code = RKISP1_DEF_SRC_PAD_FMT; in rkisp1_isp_set_src_fmt()
631 src_info = rkisp1_mbus_info_get_by_code(src_fmt->code); in rkisp1_isp_set_src_fmt()
634 if (sink_info->pixel_enc == V4L2_PIXEL_ENC_YUV && in rkisp1_isp_set_src_fmt()
635 src_info->pixel_enc == V4L2_PIXEL_ENC_BAYER) { in rkisp1_isp_set_src_fmt()
636 src_fmt->code = sink_fmt->code; in rkisp1_isp_set_src_fmt()
644 src_fmt->width = src_crop->width; in rkisp1_isp_set_src_fmt()
645 src_fmt->height = src_crop->height; in rkisp1_isp_set_src_fmt()
651 src_fmt->colorspace = sink_fmt->colorspace; in rkisp1_isp_set_src_fmt()
652 src_fmt->xfer_func = sink_fmt->xfer_func; in rkisp1_isp_set_src_fmt()
653 src_fmt->ycbcr_enc = sink_fmt->ycbcr_enc; in rkisp1_isp_set_src_fmt()
655 if (sink_info->pixel_enc == V4L2_PIXEL_ENC_BAYER && in rkisp1_isp_set_src_fmt()
656 src_info->pixel_enc == V4L2_PIXEL_ENC_YUV) in rkisp1_isp_set_src_fmt()
657 src_fmt->quantization = V4L2_QUANTIZATION_LIM_RANGE; in rkisp1_isp_set_src_fmt()
659 src_fmt->quantization = sink_fmt->quantization; in rkisp1_isp_set_src_fmt()
665 * ISP is bypassed in that case and passes YUV data through without in rkisp1_isp_set_src_fmt()
669 * cross-talk matrix and tone curve respectively. Settings for those in rkisp1_isp_set_src_fmt()
670 * hardware blocks are conveyed through the ISP parameters buffer, as in rkisp1_isp_set_src_fmt()
677 set_csc = format->flags & V4L2_MBUS_FRAMEFMT_SET_CSC; in rkisp1_isp_set_src_fmt()
679 if (set_csc && src_info->pixel_enc == V4L2_PIXEL_ENC_YUV) { in rkisp1_isp_set_src_fmt()
680 if (sink_info->pixel_enc == V4L2_PIXEL_ENC_BAYER) { in rkisp1_isp_set_src_fmt()
681 if (format->colorspace != V4L2_COLORSPACE_DEFAULT) in rkisp1_isp_set_src_fmt()
682 src_fmt->colorspace = format->colorspace; in rkisp1_isp_set_src_fmt()
683 if (format->xfer_func != V4L2_XFER_FUNC_DEFAULT) in rkisp1_isp_set_src_fmt()
684 src_fmt->xfer_func = format->xfer_func; in rkisp1_isp_set_src_fmt()
685 if (format->ycbcr_enc != V4L2_YCBCR_ENC_DEFAULT) in rkisp1_isp_set_src_fmt()
686 src_fmt->ycbcr_enc = format->ycbcr_enc; in rkisp1_isp_set_src_fmt()
689 if (format->quantization != V4L2_QUANTIZATION_DEFAULT) in rkisp1_isp_set_src_fmt()
690 src_fmt->quantization = format->quantization; in rkisp1_isp_set_src_fmt()
700 format->flags |= V4L2_MBUS_FRAMEFMT_SET_CSC; in rkisp1_isp_set_src_fmt()
703 static void rkisp1_isp_set_src_crop(struct rkisp1_isp *isp, in rkisp1_isp_set_src_crop() argument
716 src_crop->left = ALIGN(r->left, 2); in rkisp1_isp_set_src_crop()
717 src_crop->width = ALIGN(r->width, 2); in rkisp1_isp_set_src_crop()
718 src_crop->top = r->top; in rkisp1_isp_set_src_crop()
719 src_crop->height = r->height; in rkisp1_isp_set_src_crop()
727 rkisp1_isp_set_src_fmt(isp, sd_state, src_fmt); in rkisp1_isp_set_src_crop()
730 static void rkisp1_isp_set_sink_crop(struct rkisp1_isp *isp, in rkisp1_isp_set_sink_crop() argument
742 sink_crop->left = ALIGN(r->left, 2); in rkisp1_isp_set_sink_crop()
743 sink_crop->width = ALIGN(r->width, 2); in rkisp1_isp_set_sink_crop()
744 sink_crop->top = r->top; in rkisp1_isp_set_sink_crop()
745 sink_crop->height = r->height; in rkisp1_isp_set_sink_crop()
753 rkisp1_isp_set_src_crop(isp, sd_state, src_crop); in rkisp1_isp_set_sink_crop()
756 static void rkisp1_isp_set_sink_fmt(struct rkisp1_isp *isp, in rkisp1_isp_set_sink_fmt() argument
767 sink_fmt->code = format->code; in rkisp1_isp_set_sink_fmt()
768 mbus_info = rkisp1_mbus_info_get_by_code(sink_fmt->code); in rkisp1_isp_set_sink_fmt()
769 if (!mbus_info || !(mbus_info->direction & RKISP1_ISP_SD_SINK)) { in rkisp1_isp_set_sink_fmt()
770 sink_fmt->code = RKISP1_DEF_SINK_PAD_FMT; in rkisp1_isp_set_sink_fmt()
771 mbus_info = rkisp1_mbus_info_get_by_code(sink_fmt->code); in rkisp1_isp_set_sink_fmt()
774 sink_fmt->width = clamp_t(u32, format->width, in rkisp1_isp_set_sink_fmt()
776 isp->rkisp1->info->max_width); in rkisp1_isp_set_sink_fmt()
777 sink_fmt->height = clamp_t(u32, format->height, in rkisp1_isp_set_sink_fmt()
779 isp->rkisp1->info->max_height); in rkisp1_isp_set_sink_fmt()
788 is_yuv = mbus_info->pixel_enc == V4L2_PIXEL_ENC_YUV; in rkisp1_isp_set_sink_fmt()
790 sink_fmt->colorspace = format->colorspace ? : in rkisp1_isp_set_sink_fmt()
793 sink_fmt->xfer_func = format->xfer_func ? : in rkisp1_isp_set_sink_fmt()
794 V4L2_MAP_XFER_FUNC_DEFAULT(sink_fmt->colorspace); in rkisp1_isp_set_sink_fmt()
796 sink_fmt->ycbcr_enc = format->ycbcr_enc ? : in rkisp1_isp_set_sink_fmt()
797 V4L2_MAP_YCBCR_ENC_DEFAULT(sink_fmt->colorspace); in rkisp1_isp_set_sink_fmt()
798 sink_fmt->quantization = format->quantization ? : in rkisp1_isp_set_sink_fmt()
799 V4L2_MAP_QUANTIZATION_DEFAULT(false, sink_fmt->colorspace, in rkisp1_isp_set_sink_fmt()
800 sink_fmt->ycbcr_enc); in rkisp1_isp_set_sink_fmt()
803 * The YCbCr encoding isn't applicable for non-YUV formats, but in rkisp1_isp_set_sink_fmt()
807 sink_fmt->ycbcr_enc = V4L2_YCBCR_ENC_601; in rkisp1_isp_set_sink_fmt()
808 sink_fmt->quantization = V4L2_QUANTIZATION_FULL_RANGE; in rkisp1_isp_set_sink_fmt()
816 rkisp1_isp_set_sink_crop(isp, sd_state, sink_crop); in rkisp1_isp_set_sink_fmt()
823 struct rkisp1_isp *isp = to_rkisp1_isp(sd); in rkisp1_isp_set_fmt() local
825 if (fmt->pad == RKISP1_ISP_PAD_SINK_VIDEO) in rkisp1_isp_set_fmt()
826 rkisp1_isp_set_sink_fmt(isp, sd_state, &fmt->format); in rkisp1_isp_set_fmt()
827 else if (fmt->pad == RKISP1_ISP_PAD_SOURCE_VIDEO) in rkisp1_isp_set_fmt()
828 rkisp1_isp_set_src_fmt(isp, sd_state, &fmt->format); in rkisp1_isp_set_fmt()
830 fmt->format = *v4l2_subdev_state_get_format(sd_state, in rkisp1_isp_set_fmt()
831 fmt->pad); in rkisp1_isp_set_fmt()
833 return 0; in rkisp1_isp_set_fmt()
840 int ret = 0; in rkisp1_isp_get_selection()
842 if (sel->pad != RKISP1_ISP_PAD_SOURCE_VIDEO && in rkisp1_isp_get_selection()
843 sel->pad != RKISP1_ISP_PAD_SINK_VIDEO) in rkisp1_isp_get_selection()
844 return -EINVAL; in rkisp1_isp_get_selection()
846 switch (sel->target) { in rkisp1_isp_get_selection()
848 if (sel->pad == RKISP1_ISP_PAD_SINK_VIDEO) { in rkisp1_isp_get_selection()
851 fmt = v4l2_subdev_state_get_format(sd_state, sel->pad); in rkisp1_isp_get_selection()
852 sel->r.height = fmt->height; in rkisp1_isp_get_selection()
853 sel->r.width = fmt->width; in rkisp1_isp_get_selection()
854 sel->r.left = 0; in rkisp1_isp_get_selection()
855 sel->r.top = 0; in rkisp1_isp_get_selection()
857 sel->r = *v4l2_subdev_state_get_crop(sd_state, in rkisp1_isp_get_selection()
863 sel->r = *v4l2_subdev_state_get_crop(sd_state, sel->pad); in rkisp1_isp_get_selection()
867 ret = -EINVAL; in rkisp1_isp_get_selection()
878 struct rkisp1_isp *isp = to_rkisp1_isp(sd); in rkisp1_isp_set_selection() local
879 int ret = 0; in rkisp1_isp_set_selection()
881 if (sel->target != V4L2_SEL_TGT_CROP) in rkisp1_isp_set_selection()
882 return -EINVAL; in rkisp1_isp_set_selection()
884 dev_dbg(isp->rkisp1->dev, "%s: pad: %d sel(%d,%d)/%dx%d\n", __func__, in rkisp1_isp_set_selection()
885 sel->pad, sel->r.left, sel->r.top, sel->r.width, sel->r.height); in rkisp1_isp_set_selection()
887 if (sel->pad == RKISP1_ISP_PAD_SINK_VIDEO) in rkisp1_isp_set_selection()
888 rkisp1_isp_set_sink_crop(isp, sd_state, &sel->r); in rkisp1_isp_set_selection()
889 else if (sel->pad == RKISP1_ISP_PAD_SOURCE_VIDEO) in rkisp1_isp_set_selection()
890 rkisp1_isp_set_src_crop(isp, sd_state, &sel->r); in rkisp1_isp_set_selection()
892 ret = -EINVAL; in rkisp1_isp_set_selection()
899 if (link->sink->index == RKISP1_ISP_PAD_SINK_PARAMS) in rkisp1_subdev_link_validate()
900 return 0; in rkisp1_subdev_link_validate()
915 /* ----------------------------------------------------------------------------
921 struct rkisp1_isp *isp = to_rkisp1_isp(sd); in rkisp1_isp_s_stream() local
922 struct rkisp1_device *rkisp1 = isp->rkisp1; in rkisp1_isp_s_stream()
931 v4l2_subdev_call(rkisp1->source, video, s_stream, false); in rkisp1_isp_s_stream()
932 rkisp1_isp_stop(isp); in rkisp1_isp_s_stream()
933 return 0; in rkisp1_isp_s_stream()
936 sink_pad = &isp->pads[RKISP1_ISP_PAD_SINK_VIDEO]; in rkisp1_isp_s_stream()
939 dev_dbg(rkisp1->dev, "Failed to get source for ISP: %ld\n", in rkisp1_isp_s_stream()
941 return -EPIPE; in rkisp1_isp_s_stream()
944 rkisp1->source = media_entity_to_v4l2_subdev(source_pad->entity); in rkisp1_isp_s_stream()
945 if (!rkisp1->source) { in rkisp1_isp_s_stream()
947 return -EPIPE; in rkisp1_isp_s_stream()
950 if (rkisp1->source == &rkisp1->csi.sd) { in rkisp1_isp_s_stream()
952 mbus_flags = 0; in rkisp1_isp_s_stream()
957 asc = v4l2_async_connection_unique(rkisp1->source); in rkisp1_isp_s_stream()
959 return -EPIPE; in rkisp1_isp_s_stream()
963 mbus_type = asd->mbus_type; in rkisp1_isp_s_stream()
964 mbus_flags = asd->mbus_flags; in rkisp1_isp_s_stream()
967 isp->frame_sequence = -1; in rkisp1_isp_s_stream()
971 ret = rkisp1_config_cif(isp, sd_state, mbus_type, mbus_flags); in rkisp1_isp_s_stream()
975 ret = rkisp1_isp_start(isp, sd_state, source_pad); in rkisp1_isp_s_stream()
979 ret = v4l2_subdev_call(rkisp1->source, video, s_stream, true); in rkisp1_isp_s_stream()
981 rkisp1_isp_stop(isp); in rkisp1_isp_s_stream()
993 if (sub->type != V4L2_EVENT_FRAME_SYNC) in rkisp1_isp_subs_evt()
994 return -EINVAL; in rkisp1_isp_subs_evt()
997 if (sub->id != 0) in rkisp1_isp_subs_evt()
998 return -EINVAL; in rkisp1_isp_subs_evt()
1000 return v4l2_event_subscribe(fh, sub, 0, NULL); in rkisp1_isp_subs_evt()
1028 struct rkisp1_isp *isp = &rkisp1->isp; in rkisp1_isp_register() local
1029 struct media_pad *pads = isp->pads; in rkisp1_isp_register()
1030 struct v4l2_subdev *sd = &isp->sd; in rkisp1_isp_register()
1033 isp->rkisp1 = rkisp1; in rkisp1_isp_register()
1036 sd->internal_ops = &rkisp1_isp_internal_ops; in rkisp1_isp_register()
1037 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS; in rkisp1_isp_register()
1038 sd->entity.ops = &rkisp1_isp_media_ops; in rkisp1_isp_register()
1039 sd->entity.function = MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER; in rkisp1_isp_register()
1040 sd->owner = THIS_MODULE; in rkisp1_isp_register()
1041 strscpy(sd->name, RKISP1_ISP_DEV_NAME, sizeof(sd->name)); in rkisp1_isp_register()
1049 ret = media_entity_pads_init(&sd->entity, RKISP1_ISP_PAD_MAX, pads); in rkisp1_isp_register()
1057 ret = v4l2_device_register_subdev(&rkisp1->v4l2_dev, sd); in rkisp1_isp_register()
1059 dev_err(rkisp1->dev, "Failed to register isp subdev\n"); in rkisp1_isp_register()
1063 return 0; in rkisp1_isp_register()
1068 media_entity_cleanup(&sd->entity); in rkisp1_isp_register()
1069 isp->sd.v4l2_dev = NULL; in rkisp1_isp_register()
1075 struct rkisp1_isp *isp = &rkisp1->isp; in rkisp1_isp_unregister() local
1077 if (!isp->sd.v4l2_dev) in rkisp1_isp_unregister()
1080 v4l2_device_unregister_subdev(&isp->sd); in rkisp1_isp_unregister()
1081 v4l2_subdev_cleanup(&isp->sd); in rkisp1_isp_unregister()
1082 media_entity_cleanup(&isp->sd.entity); in rkisp1_isp_unregister()
1085 /* ----------------------------------------------------------------------------
1089 static void rkisp1_isp_queue_event_sof(struct rkisp1_isp *isp) in rkisp1_isp_queue_event_sof() argument
1095 event.u.frame_sync.frame_sequence = isp->frame_sequence; in rkisp1_isp_queue_event_sof()
1096 v4l2_event_queue(isp->sd.devnode, &event); in rkisp1_isp_queue_event_sof()
1105 if (!rkisp1->irqs_enabled) in rkisp1_isp_isr()
1116 rkisp1->isp.frame_sequence++; in rkisp1_isp_isr()
1117 rkisp1_isp_queue_event_sof(&rkisp1->isp); in rkisp1_isp_isr()
1120 rkisp1->debug.irq_delay++; in rkisp1_isp_isr()
1127 rkisp1->debug.inform_size_error++; in rkisp1_isp_isr()
1129 rkisp1->debug.img_stabilization_size_error++; in rkisp1_isp_isr()
1131 rkisp1->debug.outform_size_error++; in rkisp1_isp_isr()
1135 rkisp1->debug.data_loss++; in rkisp1_isp_isr()
1141 rkisp1->debug.complete_frames++; in rkisp1_isp_isr()
1146 rkisp1_stats_isr(&rkisp1->stats, isp_ris); in rkisp1_isp_isr()