Lines Matching refs:vin

20 #include "rcar-vin.h"
87 const struct rvin_video_format *rvin_format_from_pixel(struct rvin_dev *vin,
94 if (vin->info->model == RCAR_M1)
102 if (!vin->info->nv12 || !(BIT(vin->id) & 0x3333))
116 static u32 rvin_format_bytesperline(struct rvin_dev *vin,
122 fmt = rvin_format_from_pixel(vin, pix->pixelformat);
155 static void rvin_format_align(struct rvin_dev *vin, struct v4l2_pix_format *pix)
159 if (!rvin_format_from_pixel(vin, pix->pixelformat))
197 v4l_bound_align_image(&pix->width, 5, vin->info->max_width, walign,
198 &pix->height, 2, vin->info->max_height, 0, 0);
200 pix->bytesperline = rvin_format_bytesperline(vin, pix);
203 vin_dbg(vin, "Format %ux%u bpl: %u size: %u\n",
211 static int rvin_reset_format(struct rvin_dev *vin)
215 .pad = vin->parallel->source_pad,
219 ret = v4l2_subdev_call(vin_to_source(vin), pad, get_fmt, NULL, &fmt);
223 v4l2_fill_pix_format(&vin->format, &fmt.format);
225 vin->src_rect.top = 0;
226 vin->src_rect.left = 0;
227 vin->src_rect.width = vin->format.width;
228 vin->src_rect.height = vin->format.height;
231 if (vin->format.field == V4L2_FIELD_ALTERNATE) {
232 vin->format.field = V4L2_FIELD_INTERLACED;
233 vin->format.height *= 2;
236 rvin_format_align(vin, &vin->format);
238 vin->crop = vin->src_rect;
240 vin->compose.top = 0;
241 vin->compose.left = 0;
242 vin->compose.width = vin->format.width;
243 vin->compose.height = vin->format.height;
248 static int rvin_try_format(struct rvin_dev *vin, u32 which,
252 struct v4l2_subdev *sd = vin_to_source(vin);
256 .pad = vin->parallel->source_pad,
266 if (!rvin_format_from_pixel(vin, pix->pixelformat))
269 v4l2_fill_mbus_format(&format.format, pix, vin->mbus_code);
296 rvin_format_align(vin, pix);
306 struct rvin_dev *vin = video_drvdata(file);
311 dev_name(vin->dev));
318 struct rvin_dev *vin = video_drvdata(file);
320 return rvin_try_format(vin, V4L2_SUBDEV_FORMAT_TRY, &f->fmt.pix, NULL);
326 struct rvin_dev *vin = video_drvdata(file);
330 if (vb2_is_busy(&vin->queue))
333 ret = rvin_try_format(vin, V4L2_SUBDEV_FORMAT_ACTIVE, &f->fmt.pix,
338 vin->format = f->fmt.pix;
342 fmt_rect.width = vin->format.width;
343 fmt_rect.height = vin->format.height;
345 v4l2_rect_map_inside(&vin->crop, &src_rect);
346 v4l2_rect_map_inside(&vin->compose, &fmt_rect);
347 vin->src_rect = src_rect;
355 struct rvin_dev *vin = video_drvdata(file);
357 f->fmt.pix = vin->format;
365 struct rvin_dev *vin = video_drvdata(file);
414 if (rvin_format_from_pixel(vin, rvin_formats[i].fourcc))
429 struct rvin_dev *vin = video_drvdata(file);
438 s->r.width = vin->src_rect.width;
439 s->r.height = vin->src_rect.height;
442 s->r = vin->crop;
447 s->r.width = vin->format.width;
448 s->r.height = vin->format.height;
451 s->r = vin->compose;
463 struct rvin_dev *vin = video_drvdata(file);
481 max_rect.width = vin->src_rect.width;
482 max_rect.height = vin->src_rect.height;
485 v4l_bound_align_image(&r.width, 6, vin->src_rect.width, 0,
486 &r.height, 2, vin->src_rect.height, 0, 0);
489 vin->src_rect.height - r.height);
490 r.left = clamp_t(s32, r.left, 0, vin->src_rect.width - r.width);
492 vin->crop = s->r = r;
494 vin_dbg(vin, "Cropped %dx%d@%d:%d of %dx%d\n",
496 vin->src_rect.width, vin->src_rect.height);
501 max_rect.width = vin->format.width;
502 max_rect.height = vin->format.height;
510 while ((r.top * vin->format.bytesperline) & HW_BUFFER_MASK)
513 fmt = rvin_format_from_pixel(vin, vin->format.pixelformat);
517 vin->compose = s->r = r;
519 vin_dbg(vin, "Compose %dx%d@%d:%d in %dx%d\n",
521 vin->format.width, vin->format.height);
528 rvin_crop_scale_comp(vin);
536 struct rvin_dev *vin = video_drvdata(file);
537 struct v4l2_subdev *sd = vin_to_source(vin);
548 struct rvin_dev *vin = video_drvdata(file);
549 struct v4l2_subdev *sd = vin_to_source(vin);
566 i->std = vin->vdev.tvnorms;
589 struct rvin_dev *vin = video_drvdata(file);
590 struct v4l2_subdev *sd = vin_to_source(vin);
597 struct rvin_dev *vin = video_drvdata(file);
600 ret = v4l2_subdev_call(vin_to_source(vin), video, s_std, a);
604 vin->std = a;
607 return rvin_reset_format(vin);
612 struct rvin_dev *vin = video_drvdata(file);
614 if (v4l2_subdev_has_op(vin_to_source(vin), pad, dv_timings_cap))
617 *a = vin->std;
635 struct rvin_dev *vin = video_drvdata(file);
636 struct v4l2_subdev *sd = vin_to_source(vin);
642 timings->pad = vin->parallel->sink_pad;
654 struct rvin_dev *vin = video_drvdata(file);
655 struct v4l2_subdev *sd = vin_to_source(vin);
663 return rvin_reset_format(vin);
669 struct rvin_dev *vin = video_drvdata(file);
670 struct v4l2_subdev *sd = vin_to_source(vin);
678 struct rvin_dev *vin = video_drvdata(file);
679 struct v4l2_subdev *sd = vin_to_source(vin);
687 struct rvin_dev *vin = video_drvdata(file);
688 struct v4l2_subdev *sd = vin_to_source(vin);
694 cap->pad = vin->parallel->sink_pad;
705 struct rvin_dev *vin = video_drvdata(file);
706 struct v4l2_subdev *sd = vin_to_source(vin);
712 edid->pad = vin->parallel->sink_pad;
723 struct rvin_dev *vin = video_drvdata(file);
724 struct v4l2_subdev *sd = vin_to_source(vin);
730 edid->pad = vin->parallel->sink_pad;
787 static void rvin_mc_try_format(struct rvin_dev *vin,
802 rvin_format_align(vin, pix);
808 struct rvin_dev *vin = video_drvdata(file);
810 rvin_mc_try_format(vin, &f->fmt.pix);
818 struct rvin_dev *vin = video_drvdata(file);
820 if (vb2_is_busy(&vin->queue))
823 rvin_mc_try_format(vin, &f->fmt.pix);
825 vin->format = f->fmt.pix;
827 vin->crop.top = 0;
828 vin->crop.left = 0;
829 vin->crop.width = vin->format.width;
830 vin->crop.height = vin->format.height;
831 vin->compose = vin->crop;
862 static int rvin_power_parallel(struct rvin_dev *vin, bool on)
864 struct v4l2_subdev *sd = vin_to_source(vin);
877 struct rvin_dev *vin = video_drvdata(file);
880 ret = pm_runtime_get_sync(vin->dev);
882 pm_runtime_put_noidle(vin->dev);
886 ret = mutex_lock_interruptible(&vin->lock);
890 file->private_data = vin;
896 if (vin->info->use_mc)
897 ret = v4l2_pipeline_pm_get(&vin->vdev.entity);
899 ret = rvin_power_parallel(vin, true);
904 ret = v4l2_ctrl_handler_setup(&vin->ctrl_handler);
908 mutex_unlock(&vin->lock);
912 if (vin->info->use_mc)
913 v4l2_pipeline_pm_put(&vin->vdev.entity);
915 rvin_power_parallel(vin, false);
919 mutex_unlock(&vin->lock);
921 pm_runtime_put(vin->dev);
928 struct rvin_dev *vin = video_drvdata(file);
932 mutex_lock(&vin->lock);
940 if (vin->info->use_mc) {
941 v4l2_pipeline_pm_put(&vin->vdev.entity);
944 rvin_power_parallel(vin, false);
947 mutex_unlock(&vin->lock);
949 pm_runtime_put(vin->dev);
964 void rvin_v4l2_unregister(struct rvin_dev *vin)
966 if (!video_is_registered(&vin->vdev))
969 v4l2_info(&vin->v4l2_dev, "Removing %s\n",
970 video_device_node_name(&vin->vdev));
973 video_unregister_device(&vin->vdev);
979 struct rvin_dev *vin =
984 v4l2_event_queue(&vin->vdev, arg);
991 int rvin_v4l2_register(struct rvin_dev *vin)
993 struct video_device *vdev = &vin->vdev;
996 vin->v4l2_dev.notify = rvin_notify;
999 vdev->v4l2_dev = &vin->v4l2_dev;
1000 vdev->queue = &vin->queue;
1001 snprintf(vdev->name, sizeof(vdev->name), "VIN%u output", vin->id);
1003 vdev->lock = &vin->lock;
1009 vin->format.pixelformat = RVIN_DEFAULT_FORMAT;
1010 vin->format.width = RVIN_DEFAULT_WIDTH;
1011 vin->format.height = RVIN_DEFAULT_HEIGHT;
1012 vin->format.field = RVIN_DEFAULT_FIELD;
1013 vin->format.colorspace = RVIN_DEFAULT_COLORSPACE;
1015 if (vin->info->use_mc) {
1020 rvin_reset_format(vin);
1023 rvin_format_align(vin, &vin->format);
1025 ret = video_register_device(&vin->vdev, VFL_TYPE_VIDEO, -1);
1027 vin_err(vin, "Failed to register video device\n");
1031 video_set_drvdata(&vin->vdev, vin);
1033 v4l2_info(&vin->v4l2_dev, "Device registered as %s\n",
1034 video_device_node_name(&vin->vdev));