Lines Matching +full:csi +full:- +full:2

1 // SPDX-License-Identifier: GPL-2.0+
4 * Copyright (C) 2016-2019 Bootlin
12 #include <media/v4l2-ioctl.h>
13 #include <media/v4l2-mc.h>
14 #include <media/videobuf2-v4l2.h>
30 .hsub = 2,
31 .vsub = 2,
56 struct sun4i_csi *csi = video_drvdata(file); in sun4i_csi_querycap() local
58 strscpy(cap->driver, KBUILD_MODNAME, sizeof(cap->driver)); in sun4i_csi_querycap()
59 strscpy(cap->card, "sun4i-csi", sizeof(cap->card)); in sun4i_csi_querycap()
60 snprintf(cap->bus_info, sizeof(cap->bus_info), "platform:%s", in sun4i_csi_querycap()
61 dev_name(csi->dev)); in sun4i_csi_querycap()
69 if (inp->index != 0) in sun4i_csi_enum_input()
70 return -EINVAL; in sun4i_csi_enum_input()
72 inp->type = V4L2_INPUT_TYPE_CAMERA; in sun4i_csi_enum_input()
73 strscpy(inp->name, "Camera", sizeof(inp->name)); in sun4i_csi_enum_input()
90 return -EINVAL; in sun4i_csi_s_input()
95 static void _sun4i_csi_try_fmt(struct sun4i_csi *csi, in _sun4i_csi_try_fmt() argument
102 _fmt = sun4i_csi_find_format(&pix->pixelformat, NULL); in _sun4i_csi_try_fmt()
106 pix->field = V4L2_FIELD_NONE; in _sun4i_csi_try_fmt()
107 pix->colorspace = V4L2_COLORSPACE_SRGB; in _sun4i_csi_try_fmt()
108 pix->xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(pix->colorspace); in _sun4i_csi_try_fmt()
109 pix->ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(pix->colorspace); in _sun4i_csi_try_fmt()
110 pix->quantization = V4L2_MAP_QUANTIZATION_DEFAULT(true, pix->colorspace, in _sun4i_csi_try_fmt()
111 pix->ycbcr_enc); in _sun4i_csi_try_fmt()
113 pix->num_planes = _fmt->num_planes; in _sun4i_csi_try_fmt()
114 pix->pixelformat = _fmt->fourcc; in _sun4i_csi_try_fmt()
116 memset(pix->reserved, 0, sizeof(pix->reserved)); in _sun4i_csi_try_fmt()
119 width = ALIGN(pix->width, _fmt->hsub); in _sun4i_csi_try_fmt()
120 height = ALIGN(pix->height, _fmt->vsub); in _sun4i_csi_try_fmt()
123 pix->width = clamp(width, _fmt->hsub, CSI_MAX_WIDTH); in _sun4i_csi_try_fmt()
124 pix->height = clamp(height, _fmt->vsub, CSI_MAX_HEIGHT); in _sun4i_csi_try_fmt()
126 for (i = 0; i < _fmt->num_planes; i++) { in _sun4i_csi_try_fmt()
127 unsigned int hsub = i > 0 ? _fmt->hsub : 1; in _sun4i_csi_try_fmt()
128 unsigned int vsub = i > 0 ? _fmt->vsub : 1; in _sun4i_csi_try_fmt()
131 bpl = pix->width / hsub * _fmt->bpp[i] / 8; in _sun4i_csi_try_fmt()
132 pix->plane_fmt[i].bytesperline = bpl; in _sun4i_csi_try_fmt()
133 pix->plane_fmt[i].sizeimage = bpl * pix->height / vsub; in _sun4i_csi_try_fmt()
134 memset(pix->plane_fmt[i].reserved, 0, in _sun4i_csi_try_fmt()
135 sizeof(pix->plane_fmt[i].reserved)); in _sun4i_csi_try_fmt()
142 struct sun4i_csi *csi = video_drvdata(file); in sun4i_csi_try_fmt_vid_cap() local
144 _sun4i_csi_try_fmt(csi, &f->fmt.pix_mp); in sun4i_csi_try_fmt_vid_cap()
152 struct sun4i_csi *csi = video_drvdata(file); in sun4i_csi_s_fmt_vid_cap() local
154 _sun4i_csi_try_fmt(csi, &f->fmt.pix_mp); in sun4i_csi_s_fmt_vid_cap()
155 csi->fmt = f->fmt.pix_mp; in sun4i_csi_s_fmt_vid_cap()
163 struct sun4i_csi *csi = video_drvdata(file); in sun4i_csi_g_fmt_vid_cap() local
165 f->fmt.pix_mp = csi->fmt; in sun4i_csi_g_fmt_vid_cap()
173 if (f->index >= ARRAY_SIZE(sun4i_csi_formats)) in sun4i_csi_enum_fmt_vid_cap()
174 return -EINVAL; in sun4i_csi_enum_fmt_vid_cap()
176 f->pixelformat = sun4i_csi_formats[f->index].fourcc; in sun4i_csi_enum_fmt_vid_cap()
206 struct sun4i_csi *csi = video_drvdata(file); in sun4i_csi_open() local
209 ret = mutex_lock_interruptible(&csi->lock); in sun4i_csi_open()
213 ret = pm_runtime_get_sync(csi->dev); in sun4i_csi_open()
217 ret = v4l2_pipeline_pm_get(&csi->vdev.entity); in sun4i_csi_open()
225 mutex_unlock(&csi->lock); in sun4i_csi_open()
230 v4l2_pipeline_pm_put(&csi->vdev.entity); in sun4i_csi_open()
233 pm_runtime_put(csi->dev); in sun4i_csi_open()
234 mutex_unlock(&csi->lock); in sun4i_csi_open()
241 struct sun4i_csi *csi = video_drvdata(file); in sun4i_csi_release() local
243 mutex_lock(&csi->lock); in sun4i_csi_release()
247 v4l2_pipeline_pm_put(&csi->vdev.entity); in sun4i_csi_release()
248 pm_runtime_put(csi->dev); in sun4i_csi_release()
250 mutex_unlock(&csi->lock); in sun4i_csi_release()
290 struct sun4i_csi *csi = container_of(subdev, struct sun4i_csi, subdev); in sun4i_csi_subdev_get_fmt() local
293 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) in sun4i_csi_subdev_get_fmt()
294 subdev_fmt = v4l2_subdev_get_try_format(subdev, cfg, fmt->pad); in sun4i_csi_subdev_get_fmt()
296 subdev_fmt = &csi->subdev_fmt; in sun4i_csi_subdev_get_fmt()
298 fmt->format = *subdev_fmt; in sun4i_csi_subdev_get_fmt()
307 struct sun4i_csi *csi = container_of(subdev, struct sun4i_csi, subdev); in sun4i_csi_subdev_set_fmt() local
310 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) in sun4i_csi_subdev_set_fmt()
311 subdev_fmt = v4l2_subdev_get_try_format(subdev, cfg, fmt->pad); in sun4i_csi_subdev_set_fmt()
313 subdev_fmt = &csi->subdev_fmt; in sun4i_csi_subdev_set_fmt()
316 if (fmt->pad == CSI_SUBDEV_SINK) { in sun4i_csi_subdev_set_fmt()
318 subdev_fmt->width = fmt->format.width; in sun4i_csi_subdev_set_fmt()
319 subdev_fmt->height = fmt->format.height; in sun4i_csi_subdev_set_fmt()
320 subdev_fmt->code = fmt->format.code; in sun4i_csi_subdev_set_fmt()
323 fmt->format = *subdev_fmt; in sun4i_csi_subdev_set_fmt()
333 if (mbus->index >= ARRAY_SIZE(sun4i_csi_formats)) in sun4i_csi_subdev_enum_mbus_code()
334 return -EINVAL; in sun4i_csi_subdev_enum_mbus_code()
336 mbus->code = sun4i_csi_formats[mbus->index].mbus; in sun4i_csi_subdev_enum_mbus_code()
353 int sun4i_csi_v4l2_register(struct sun4i_csi *csi) in sun4i_csi_v4l2_register() argument
355 struct video_device *vdev = &csi->vdev; in sun4i_csi_v4l2_register()
358 vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE_MPLANE | V4L2_CAP_STREAMING; in sun4i_csi_v4l2_register()
359 vdev->v4l2_dev = &csi->v4l; in sun4i_csi_v4l2_register()
360 vdev->queue = &csi->queue; in sun4i_csi_v4l2_register()
361 strscpy(vdev->name, KBUILD_MODNAME, sizeof(vdev->name)); in sun4i_csi_v4l2_register()
362 vdev->release = video_device_release_empty; in sun4i_csi_v4l2_register()
363 vdev->lock = &csi->lock; in sun4i_csi_v4l2_register()
366 csi->fmt.pixelformat = sun4i_csi_formats[0].fourcc, in sun4i_csi_v4l2_register()
367 csi->fmt.width = CSI_DEFAULT_WIDTH; in sun4i_csi_v4l2_register()
368 csi->fmt.height = CSI_DEFAULT_HEIGHT; in sun4i_csi_v4l2_register()
369 _sun4i_csi_try_fmt(csi, &csi->fmt); in sun4i_csi_v4l2_register()
370 csi->subdev_fmt = sun4i_csi_pad_fmt_default; in sun4i_csi_v4l2_register()
372 vdev->fops = &sun4i_csi_fops; in sun4i_csi_v4l2_register()
373 vdev->ioctl_ops = &sun4i_csi_ioctl_ops; in sun4i_csi_v4l2_register()
374 video_set_drvdata(vdev, csi); in sun4i_csi_v4l2_register()
376 ret = video_register_device(&csi->vdev, VFL_TYPE_VIDEO, -1); in sun4i_csi_v4l2_register()
380 dev_info(csi->dev, "Device registered as %s\n", in sun4i_csi_v4l2_register()