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 strscpy(cap->driver, KBUILD_MODNAME, sizeof(cap->driver)); in sun4i_csi_querycap()
57 strscpy(cap->card, "sun4i-csi", sizeof(cap->card)); in sun4i_csi_querycap()
65 if (inp->index != 0) in sun4i_csi_enum_input()
66 return -EINVAL; in sun4i_csi_enum_input()
68 inp->type = V4L2_INPUT_TYPE_CAMERA; in sun4i_csi_enum_input()
69 strscpy(inp->name, "Camera", sizeof(inp->name)); in sun4i_csi_enum_input()
86 return -EINVAL; in sun4i_csi_s_input()
91 static void _sun4i_csi_try_fmt(struct sun4i_csi *csi, in _sun4i_csi_try_fmt() argument
98 _fmt = sun4i_csi_find_format(&pix->pixelformat, NULL); in _sun4i_csi_try_fmt()
102 pix->field = V4L2_FIELD_NONE; in _sun4i_csi_try_fmt()
103 pix->colorspace = V4L2_COLORSPACE_SRGB; in _sun4i_csi_try_fmt()
104 pix->xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(pix->colorspace); in _sun4i_csi_try_fmt()
105 pix->ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(pix->colorspace); in _sun4i_csi_try_fmt()
106 pix->quantization = V4L2_MAP_QUANTIZATION_DEFAULT(true, pix->colorspace, in _sun4i_csi_try_fmt()
107 pix->ycbcr_enc); in _sun4i_csi_try_fmt()
109 pix->num_planes = _fmt->num_planes; in _sun4i_csi_try_fmt()
110 pix->pixelformat = _fmt->fourcc; in _sun4i_csi_try_fmt()
113 width = ALIGN(pix->width, _fmt->hsub); in _sun4i_csi_try_fmt()
114 height = ALIGN(pix->height, _fmt->vsub); in _sun4i_csi_try_fmt()
117 pix->width = clamp(width, _fmt->hsub, CSI_MAX_WIDTH); in _sun4i_csi_try_fmt()
118 pix->height = clamp(height, _fmt->vsub, CSI_MAX_HEIGHT); in _sun4i_csi_try_fmt()
120 for (i = 0; i < _fmt->num_planes; i++) { in _sun4i_csi_try_fmt()
121 unsigned int hsub = i > 0 ? _fmt->hsub : 1; in _sun4i_csi_try_fmt()
122 unsigned int vsub = i > 0 ? _fmt->vsub : 1; in _sun4i_csi_try_fmt()
125 bpl = pix->width / hsub * _fmt->bpp[i] / 8; in _sun4i_csi_try_fmt()
126 pix->plane_fmt[i].bytesperline = bpl; in _sun4i_csi_try_fmt()
127 pix->plane_fmt[i].sizeimage = bpl * pix->height / vsub; in _sun4i_csi_try_fmt()
134 struct sun4i_csi *csi = video_drvdata(file); in sun4i_csi_try_fmt_vid_cap() local
136 _sun4i_csi_try_fmt(csi, &f->fmt.pix_mp); in sun4i_csi_try_fmt_vid_cap()
144 struct sun4i_csi *csi = video_drvdata(file); in sun4i_csi_s_fmt_vid_cap() local
146 _sun4i_csi_try_fmt(csi, &f->fmt.pix_mp); in sun4i_csi_s_fmt_vid_cap()
147 csi->fmt = f->fmt.pix_mp; in sun4i_csi_s_fmt_vid_cap()
155 struct sun4i_csi *csi = video_drvdata(file); in sun4i_csi_g_fmt_vid_cap() local
157 f->fmt.pix_mp = csi->fmt; in sun4i_csi_g_fmt_vid_cap()
165 if (f->index >= ARRAY_SIZE(sun4i_csi_formats)) in sun4i_csi_enum_fmt_vid_cap()
166 return -EINVAL; in sun4i_csi_enum_fmt_vid_cap()
168 f->pixelformat = sun4i_csi_formats[f->index].fourcc; in sun4i_csi_enum_fmt_vid_cap()
198 struct sun4i_csi *csi = video_drvdata(file); in sun4i_csi_open() local
201 ret = mutex_lock_interruptible(&csi->lock); in sun4i_csi_open()
205 ret = pm_runtime_resume_and_get(csi->dev); in sun4i_csi_open()
209 ret = v4l2_pipeline_pm_get(&csi->vdev.entity); in sun4i_csi_open()
217 mutex_unlock(&csi->lock); in sun4i_csi_open()
222 v4l2_pipeline_pm_put(&csi->vdev.entity); in sun4i_csi_open()
225 pm_runtime_put(csi->dev); in sun4i_csi_open()
228 mutex_unlock(&csi->lock); in sun4i_csi_open()
235 struct sun4i_csi *csi = video_drvdata(file); in sun4i_csi_release() local
237 mutex_lock(&csi->lock); in sun4i_csi_release()
241 v4l2_pipeline_pm_put(&csi->vdev.entity); in sun4i_csi_release()
242 pm_runtime_put(csi->dev); in sun4i_csi_release()
244 mutex_unlock(&csi->lock); in sun4i_csi_release()
284 struct sun4i_csi *csi = container_of(subdev, struct sun4i_csi, subdev); in sun4i_csi_subdev_get_fmt() local
287 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) in sun4i_csi_subdev_get_fmt()
288 subdev_fmt = v4l2_subdev_state_get_format(sd_state, fmt->pad); in sun4i_csi_subdev_get_fmt()
290 subdev_fmt = &csi->subdev_fmt; in sun4i_csi_subdev_get_fmt()
292 fmt->format = *subdev_fmt; in sun4i_csi_subdev_get_fmt()
301 struct sun4i_csi *csi = container_of(subdev, struct sun4i_csi, subdev); in sun4i_csi_subdev_set_fmt() local
304 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) in sun4i_csi_subdev_set_fmt()
305 subdev_fmt = v4l2_subdev_state_get_format(sd_state, fmt->pad); in sun4i_csi_subdev_set_fmt()
307 subdev_fmt = &csi->subdev_fmt; in sun4i_csi_subdev_set_fmt()
310 if (fmt->pad == CSI_SUBDEV_SINK) { in sun4i_csi_subdev_set_fmt()
312 subdev_fmt->width = fmt->format.width; in sun4i_csi_subdev_set_fmt()
313 subdev_fmt->height = fmt->format.height; in sun4i_csi_subdev_set_fmt()
314 subdev_fmt->code = fmt->format.code; in sun4i_csi_subdev_set_fmt()
317 fmt->format = *subdev_fmt; in sun4i_csi_subdev_set_fmt()
327 if (mbus->index >= ARRAY_SIZE(sun4i_csi_formats)) in sun4i_csi_subdev_enum_mbus_code()
328 return -EINVAL; in sun4i_csi_subdev_enum_mbus_code()
330 mbus->code = sun4i_csi_formats[mbus->index].mbus; in sun4i_csi_subdev_enum_mbus_code()
350 int sun4i_csi_v4l2_register(struct sun4i_csi *csi) in sun4i_csi_v4l2_register() argument
352 struct video_device *vdev = &csi->vdev; in sun4i_csi_v4l2_register()
355 vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE_MPLANE | V4L2_CAP_STREAMING; in sun4i_csi_v4l2_register()
356 vdev->v4l2_dev = &csi->v4l; in sun4i_csi_v4l2_register()
357 vdev->queue = &csi->queue; in sun4i_csi_v4l2_register()
358 strscpy(vdev->name, KBUILD_MODNAME, sizeof(vdev->name)); in sun4i_csi_v4l2_register()
359 vdev->release = video_device_release_empty; in sun4i_csi_v4l2_register()
360 vdev->lock = &csi->lock; in sun4i_csi_v4l2_register()
363 csi->fmt.pixelformat = sun4i_csi_formats[0].fourcc; in sun4i_csi_v4l2_register()
364 csi->fmt.width = CSI_DEFAULT_WIDTH; in sun4i_csi_v4l2_register()
365 csi->fmt.height = CSI_DEFAULT_HEIGHT; in sun4i_csi_v4l2_register()
366 _sun4i_csi_try_fmt(csi, &csi->fmt); in sun4i_csi_v4l2_register()
367 csi->subdev_fmt = sun4i_csi_pad_fmt_default; in sun4i_csi_v4l2_register()
369 vdev->fops = &sun4i_csi_fops; in sun4i_csi_v4l2_register()
370 vdev->ioctl_ops = &sun4i_csi_ioctl_ops; in sun4i_csi_v4l2_register()
371 video_set_drvdata(vdev, csi); in sun4i_csi_v4l2_register()
373 ret = video_register_device(&csi->vdev, VFL_TYPE_VIDEO, -1); in sun4i_csi_v4l2_register()
377 dev_info(csi->dev, "Device registered as %s\n", in sun4i_csi_v4l2_register()