Lines Matching +full:input +full:- +full:sel
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"
27 * NOTE: MIPI controller and input MUX are also configured in this file.
28 * This is because ISP Subdev describes not only ISP submodule (input size,
40 * +---------------------------------------------------------+
42 * | +---------------------------------------------------+ |
45 * | | +--------------------------------------------+ | |
48 * | | | +---------------------------------+ | | |
51 * | | | +---------------------------------+ | | |
52 * | | +--------------------------------------------+ | |
53 * | +---------------------------------------------------+ |
54 * +---------------------------------------------------------+
57 /* -----------------------------------------------------------------------------
97 * Configure and enable the gasket with the CSI-2 data type. Set the
100 * ISP has a 16-bit wide input and expects data to be left-aligned.
103 source_sd = media_entity_to_v4l2_subdev(source->entity);
105 source->index, &fd);
107 dev_err(rkisp1->dev,
109 source_sd->name, 0, ret);
114 dev_err(rkisp1->dev, "invalid frame descriptor for '%s':%u\n",
115 source_sd->name, 0);
116 return -EINVAL;
121 if (rkisp1->gasket_id == 0) {
141 regmap_update_bits(rkisp1->gasket, ISP_DEWARP_CONTROL, mask, val);
151 if (rkisp1->gasket_id == 1) {
163 regmap_update_bits(rkisp1->gasket, ISP_DEWARP_CONTROL, mask, val);
166 /* ----------------------------------------------------------------------------
181 struct rkisp1_device *rkisp1 = isp->rkisp1;
188 rkisp1_write(rkisp1, RKISP1_CIF_ISP_IS_H_OFFS, src_crop->left);
189 rkisp1_write(rkisp1, RKISP1_CIF_ISP_IS_V_OFFS, src_crop->top);
190 rkisp1_write(rkisp1, RKISP1_CIF_ISP_IS_H_SIZE, src_crop->width);
191 rkisp1_write(rkisp1, RKISP1_CIF_ISP_IS_V_SIZE, src_crop->height);
201 * configure ISP blocks with input format, size......
207 struct rkisp1_device *rkisp1 = isp->rkisp1;
222 sink_fmt = rkisp1_mbus_info_get_by_code(sink_frm->code);
223 src_fmt = rkisp1_mbus_info_get_by_code(src_frm->code);
225 if (sink_fmt->pixel_enc == V4L2_PIXEL_ENC_BAYER) {
227 if (src_fmt->pixel_enc == V4L2_PIXEL_ENC_BAYER) {
241 } else if (sink_fmt->pixel_enc == V4L2_PIXEL_ENC_YUV) {
255 /* Set up input acquisition properties */
260 switch (sink_fmt->bus_width) {
271 dev_err(rkisp1->dev, "Invalid bus width %u\n",
272 sink_fmt->bus_width);
273 return -EINVAL;
287 acq_prop | sink_fmt->yuv_seq |
288 RKISP1_CIF_ISP_ACQ_PROP_BAYER_PAT(sink_fmt->bayer_pat) |
296 acq_mult * sink_frm->width);
297 rkisp1_write(rkisp1, RKISP1_CIF_ISP_ACQ_V_SIZE, sink_frm->height);
300 rkisp1_write(rkisp1, RKISP1_CIF_ISP_OUT_H_OFFS, sink_crop->left);
301 rkisp1_write(rkisp1, RKISP1_CIF_ISP_OUT_V_OFFS, sink_crop->top);
302 rkisp1_write(rkisp1, RKISP1_CIF_ISP_OUT_H_SIZE, sink_crop->width);
303 rkisp1_write(rkisp1, RKISP1_CIF_ISP_OUT_V_SIZE, sink_crop->height);
309 if (src_fmt->pixel_enc == V4L2_PIXEL_ENC_BAYER) {
310 rkisp1_params_disable(&rkisp1->params);
316 rkisp1_params_pre_configure(&rkisp1->params, sink_fmt->bayer_pat,
317 src_frm->quantization,
318 src_frm->ycbcr_enc);
321 isp->sink_fmt = sink_fmt;
330 struct rkisp1_device *rkisp1 = isp->rkisp1;
360 struct rkisp1_device *rkisp1 = isp->rkisp1;
364 * ISP(mi) stop in mi frame end -> Stop ISP(mipi) ->
365 * Stop ISP(isp) ->wait for ISP isp off
380 synchronize_irq(rkisp1->irqs[RKISP1_IRQ_ISP]);
381 if (rkisp1->irqs[RKISP1_IRQ_ISP] != rkisp1->irqs[RKISP1_IRQ_MI])
382 synchronize_irq(rkisp1->irqs[RKISP1_IRQ_MI]);
398 readx_poll_timeout(readl, rkisp1->base_addr + RKISP1_CIF_ISP_RIS,
405 if (rkisp1->info->isp_ver == RKISP1_V_IMX8MP)
411 struct rkisp1_device *rkisp1 = isp->rkisp1;
422 if (rkisp1->info->isp_ver == RKISP1_V12) {
435 struct rkisp1_device *rkisp1 = isp->rkisp1;
443 if (rkisp1->info->isp_ver == RKISP1_V_IMX8MP) {
458 src_info = rkisp1_mbus_info_get_by_code(src_fmt->code);
460 if (src_info->pixel_enc != V4L2_PIXEL_ENC_BAYER)
461 rkisp1_params_post_configure(&rkisp1->params);
466 /* ----------------------------------------------------------------------------
482 if (code->pad == RKISP1_ISP_PAD_SINK_VIDEO) {
484 } else if (code->pad == RKISP1_ISP_PAD_SOURCE_VIDEO) {
487 if (code->index > 0)
488 return -EINVAL;
489 code->code = MEDIA_BUS_FMT_METADATA_FIXED;
498 return -EINVAL;
500 if (fmt->direction & dir)
503 if (code->index == pos - 1) {
504 code->code = fmt->mbus_code;
505 if (fmt->pixel_enc == V4L2_PIXEL_ENC_YUV &&
507 code->flags =
513 return -EINVAL;
523 if (fse->pad == RKISP1_ISP_PAD_SINK_PARAMS ||
524 fse->pad == RKISP1_ISP_PAD_SOURCE_STATS)
525 return -ENOTTY;
527 if (fse->index > 0)
528 return -EINVAL;
530 mbus_info = rkisp1_mbus_info_get_by_code(fse->code);
532 return -EINVAL;
534 if (!(mbus_info->direction & RKISP1_ISP_SD_SINK) &&
535 fse->pad == RKISP1_ISP_PAD_SINK_VIDEO)
536 return -EINVAL;
538 if (!(mbus_info->direction & RKISP1_ISP_SD_SRC) &&
539 fse->pad == RKISP1_ISP_PAD_SOURCE_VIDEO)
540 return -EINVAL;
542 fse->min_width = RKISP1_ISP_MIN_WIDTH;
543 fse->max_width = isp->rkisp1->info->max_width;
544 fse->min_height = RKISP1_ISP_MIN_HEIGHT;
545 fse->max_height = isp->rkisp1->info->max_height;
559 sink_fmt->width = RKISP1_DEFAULT_WIDTH;
560 sink_fmt->height = RKISP1_DEFAULT_HEIGHT;
561 sink_fmt->field = V4L2_FIELD_NONE;
562 sink_fmt->code = RKISP1_DEF_SINK_PAD_FMT;
563 sink_fmt->colorspace = V4L2_COLORSPACE_RAW;
564 sink_fmt->xfer_func = V4L2_XFER_FUNC_NONE;
565 sink_fmt->ycbcr_enc = V4L2_YCBCR_ENC_601;
566 sink_fmt->quantization = V4L2_QUANTIZATION_FULL_RANGE;
570 sink_crop->width = RKISP1_DEFAULT_WIDTH;
571 sink_crop->height = RKISP1_DEFAULT_HEIGHT;
572 sink_crop->left = 0;
573 sink_crop->top = 0;
578 src_fmt->code = RKISP1_DEF_SRC_PAD_FMT;
579 src_fmt->colorspace = V4L2_COLORSPACE_SRGB;
580 src_fmt->xfer_func = V4L2_XFER_FUNC_SRGB;
581 src_fmt->ycbcr_enc = V4L2_YCBCR_ENC_601;
582 src_fmt->quantization = V4L2_QUANTIZATION_LIM_RANGE;
593 sink_fmt->width = 0;
594 sink_fmt->height = 0;
595 sink_fmt->field = V4L2_FIELD_NONE;
596 sink_fmt->code = MEDIA_BUS_FMT_METADATA_FIXED;
621 * Media bus code. The ISP can operate in pass-through mode (Bayer in,
625 sink_info = rkisp1_mbus_info_get_by_code(sink_fmt->code);
627 src_fmt->code = format->code;
628 src_info = rkisp1_mbus_info_get_by_code(src_fmt->code);
629 if (!src_info || !(src_info->direction & RKISP1_ISP_SD_SRC)) {
630 src_fmt->code = RKISP1_DEF_SRC_PAD_FMT;
631 src_info = rkisp1_mbus_info_get_by_code(src_fmt->code);
634 if (sink_info->pixel_enc == V4L2_PIXEL_ENC_YUV &&
635 src_info->pixel_enc == V4L2_PIXEL_ENC_BAYER) {
636 src_fmt->code = sink_fmt->code;
644 src_fmt->width = src_crop->width;
645 src_fmt->height = src_crop->height;
651 src_fmt->colorspace = sink_fmt->colorspace;
652 src_fmt->xfer_func = sink_fmt->xfer_func;
653 src_fmt->ycbcr_enc = sink_fmt->ycbcr_enc;
655 if (sink_info->pixel_enc == V4L2_PIXEL_ENC_BAYER &&
656 src_info->pixel_enc == V4L2_PIXEL_ENC_YUV)
657 src_fmt->quantization = V4L2_QUANTIZATION_LIM_RANGE;
659 src_fmt->quantization = sink_fmt->quantization;
669 * cross-talk matrix and tone curve respectively. Settings for those
677 set_csc = format->flags & V4L2_MBUS_FRAMEFMT_SET_CSC;
679 if (set_csc && src_info->pixel_enc == V4L2_PIXEL_ENC_YUV) {
680 if (sink_info->pixel_enc == V4L2_PIXEL_ENC_BAYER) {
681 if (format->colorspace != V4L2_COLORSPACE_DEFAULT)
682 src_fmt->colorspace = format->colorspace;
683 if (format->xfer_func != V4L2_XFER_FUNC_DEFAULT)
684 src_fmt->xfer_func = format->xfer_func;
685 if (format->ycbcr_enc != V4L2_YCBCR_ENC_DEFAULT)
686 src_fmt->ycbcr_enc = format->ycbcr_enc;
689 if (format->quantization != V4L2_QUANTIZATION_DEFAULT)
690 src_fmt->quantization = format->quantization;
700 format->flags |= V4L2_MBUS_FRAMEFMT_SET_CSC;
716 src_crop->left = ALIGN(r->left, 2);
717 src_crop->width = ALIGN(r->width, 2);
718 src_crop->top = r->top;
719 src_crop->height = r->height;
742 sink_crop->left = ALIGN(r->left, 2);
743 sink_crop->width = ALIGN(r->width, 2);
744 sink_crop->top = r->top;
745 sink_crop->height = r->height;
767 sink_fmt->code = format->code;
768 mbus_info = rkisp1_mbus_info_get_by_code(sink_fmt->code);
769 if (!mbus_info || !(mbus_info->direction & RKISP1_ISP_SD_SINK)) {
770 sink_fmt->code = RKISP1_DEF_SINK_PAD_FMT;
771 mbus_info = rkisp1_mbus_info_get_by_code(sink_fmt->code);
774 sink_fmt->width = clamp_t(u32, format->width,
776 isp->rkisp1->info->max_width);
777 sink_fmt->height = clamp_t(u32, format->height,
779 isp->rkisp1->info->max_height);
788 is_yuv = mbus_info->pixel_enc == V4L2_PIXEL_ENC_YUV;
790 sink_fmt->colorspace = format->colorspace ? :
793 sink_fmt->xfer_func = format->xfer_func ? :
794 V4L2_MAP_XFER_FUNC_DEFAULT(sink_fmt->colorspace);
796 sink_fmt->ycbcr_enc = format->ycbcr_enc ? :
797 V4L2_MAP_YCBCR_ENC_DEFAULT(sink_fmt->colorspace);
798 sink_fmt->quantization = format->quantization ? :
799 V4L2_MAP_QUANTIZATION_DEFAULT(false, sink_fmt->colorspace,
800 sink_fmt->ycbcr_enc);
803 * The YCbCr encoding isn't applicable for non-YUV formats, but
807 sink_fmt->ycbcr_enc = V4L2_YCBCR_ENC_601;
808 sink_fmt->quantization = V4L2_QUANTIZATION_FULL_RANGE;
825 if (fmt->pad == RKISP1_ISP_PAD_SINK_VIDEO)
826 rkisp1_isp_set_sink_fmt(isp, sd_state, &fmt->format);
827 else if (fmt->pad == RKISP1_ISP_PAD_SOURCE_VIDEO)
828 rkisp1_isp_set_src_fmt(isp, sd_state, &fmt->format);
830 fmt->format = *v4l2_subdev_state_get_format(sd_state,
831 fmt->pad);
838 struct v4l2_subdev_selection *sel)
842 if (sel->pad != RKISP1_ISP_PAD_SOURCE_VIDEO &&
843 sel->pad != RKISP1_ISP_PAD_SINK_VIDEO)
844 return -EINVAL;
846 switch (sel->target) {
848 if (sel->pad == RKISP1_ISP_PAD_SINK_VIDEO) {
851 fmt = v4l2_subdev_state_get_format(sd_state, sel->pad);
852 sel->r.height = fmt->height;
853 sel->r.width = fmt->width;
854 sel->r.left = 0;
855 sel->r.top = 0;
857 sel->r = *v4l2_subdev_state_get_crop(sd_state,
863 sel->r = *v4l2_subdev_state_get_crop(sd_state, sel->pad);
867 ret = -EINVAL;
876 struct v4l2_subdev_selection *sel)
881 if (sel->target != V4L2_SEL_TGT_CROP)
882 return -EINVAL;
884 dev_dbg(isp->rkisp1->dev, "%s: pad: %d sel(%d,%d)/%ux%u\n", __func__,
885 sel->pad, sel->r.left, sel->r.top, sel->r.width, sel->r.height);
887 if (sel->pad == RKISP1_ISP_PAD_SINK_VIDEO)
888 rkisp1_isp_set_sink_crop(isp, sd_state, &sel->r);
889 else if (sel->pad == RKISP1_ISP_PAD_SOURCE_VIDEO)
890 rkisp1_isp_set_src_crop(isp, sd_state, &sel->r);
892 ret = -EINVAL;
899 if (link->sink->index == RKISP1_ISP_PAD_SINK_PARAMS)
915 /* ----------------------------------------------------------------------------
922 struct rkisp1_device *rkisp1 = isp->rkisp1;
931 v4l2_subdev_call(rkisp1->source, video, s_stream, false);
936 sink_pad = &isp->pads[RKISP1_ISP_PAD_SINK_VIDEO];
939 dev_dbg(rkisp1->dev, "Failed to get source for ISP: %ld\n",
941 return -EPIPE;
944 rkisp1->source = media_entity_to_v4l2_subdev(source_pad->entity);
945 if (!rkisp1->source) {
947 return -EPIPE;
950 if (rkisp1->source == &rkisp1->csi.sd) {
957 asc = v4l2_async_connection_unique(rkisp1->source);
959 return -EPIPE;
963 mbus_type = asd->mbus_type;
964 mbus_flags = asd->mbus_flags;
967 isp->frame_sequence = -1;
979 ret = v4l2_subdev_call(rkisp1->source, video, s_stream, true);
993 if (sub->type != V4L2_EVENT_FRAME_SYNC)
994 return -EINVAL;
997 if (sub->id != 0)
998 return -EINVAL;
1028 struct rkisp1_isp *isp = &rkisp1->isp;
1029 struct media_pad *pads = isp->pads;
1030 struct v4l2_subdev *sd = &isp->sd;
1033 isp->rkisp1 = rkisp1;
1036 sd->internal_ops = &rkisp1_isp_internal_ops;
1037 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
1038 sd->entity.ops = &rkisp1_isp_media_ops;
1039 sd->entity.function = MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER;
1040 sd->owner = THIS_MODULE;
1041 strscpy(sd->name, RKISP1_ISP_DEV_NAME, sizeof(sd->name));
1049 ret = media_entity_pads_init(&sd->entity, RKISP1_ISP_PAD_MAX, pads);
1057 ret = v4l2_device_register_subdev(&rkisp1->v4l2_dev, sd);
1059 dev_err(rkisp1->dev, "Failed to register isp subdev\n");
1068 media_entity_cleanup(&sd->entity);
1069 isp->sd.v4l2_dev = NULL;
1075 struct rkisp1_isp *isp = &rkisp1->isp;
1077 if (!isp->sd.v4l2_dev)
1080 v4l2_device_unregister_subdev(&isp->sd);
1081 v4l2_subdev_cleanup(&isp->sd);
1082 media_entity_cleanup(&isp->sd.entity);
1085 /* ----------------------------------------------------------------------------
1095 event.u.frame_sync.frame_sequence = isp->frame_sequence;
1096 v4l2_event_queue(isp->sd.devnode, &event);
1105 if (!rkisp1->irqs_enabled)
1116 rkisp1->isp.frame_sequence++;
1117 rkisp1_isp_queue_event_sof(&rkisp1->isp);
1120 rkisp1->debug.irq_delay++;
1127 rkisp1->debug.inform_size_error++;
1129 rkisp1->debug.img_stabilization_size_error++;
1131 rkisp1->debug.outform_size_error++;
1135 rkisp1->debug.data_loss++;
1141 rkisp1->debug.complete_frames++;
1146 rkisp1_stats_isr(&rkisp1->stats, isp_ris);