drivers/media/platform/amd/isp4/isp4_video.c

Source file repositories/reference/linux-study-clean/drivers/media/platform/amd/isp4/isp4_video.c

File Facts

System
Linux kernel
Corpus path
drivers/media/platform/amd/isp4/isp4_video.c
Extension
.c
Size
21247 bytes
Lines
798
Domain
Driver Families
Bucket
drivers/media
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (vbuf != img_buf->planes[0].sys_addr) {
			dev_err(isp_vdev->dev, "Invalid vbuf\n");
			return;
		}

		list_del(&isp4vid_buf->list);
	}

	/* Fill the buffer */
	isp4vid_buf->vb2.vb2_buf.timestamp = ktime_get_ns();
	isp4vid_buf->vb2.sequence = isp_vdev->sequence++;
	isp4vid_buf->vb2.field = V4L2_FIELD_ANY;

	vb2_set_plane_payload(&isp4vid_buf->vb2.vb2_buf,
			      0, isp_vdev->format.sizeimage);

	vb2_buffer_done(&isp4vid_buf->vb2.vb2_buf, VB2_BUF_STATE_DONE);

	dev_dbg(isp_vdev->dev, "call vb2_buffer_done(size=%u)\n",
		isp_vdev->format.sizeimage);
}

static const struct v4l2_pix_format isp4vid_fmt_default = {
	.width = 1920,
	.height = 1080,
	.pixelformat = ISP4VID_DEFAULT_FMT,
	.field = V4L2_FIELD_NONE,
	.colorspace = V4L2_COLORSPACE_SRGB,
};

static void isp4vid_capture_return_all_buffers(struct isp4vid_dev *isp_vdev,
					       enum vb2_buffer_state state)
{
	struct isp4vid_capture_buffer *vbuf, *node;

	scoped_guard(mutex, &isp_vdev->buf_list_lock) {
		list_for_each_entry_safe(vbuf, node, &isp_vdev->buf_list, list)
			vb2_buffer_done(&vbuf->vb2.vb2_buf, state);
		INIT_LIST_HEAD(&isp_vdev->buf_list);
	}

	dev_dbg(isp_vdev->dev, "call vb2_buffer_done(%d)\n", state);
}

static int isp4vid_vdev_link_validate(struct media_link *link)
{
	return 0;
}

static const struct media_entity_operations isp4vid_vdev_ent_ops = {
	.link_validate = isp4vid_vdev_link_validate,
};

static const struct v4l2_file_operations isp4vid_vdev_fops = {
	.owner = THIS_MODULE,
	.open = v4l2_fh_open,
	.release = vb2_fop_release,
	.read = vb2_fop_read,
	.poll = vb2_fop_poll,
	.unlocked_ioctl = video_ioctl2,
	.mmap = vb2_fop_mmap,
};

static int isp4vid_ioctl_querycap(struct file *file, void *fh,
				  struct v4l2_capability *cap)
{
	struct isp4vid_dev *isp_vdev = video_drvdata(file);

	strscpy(cap->driver, ISP4VID_ISP_DRV_NAME, sizeof(cap->driver));
	snprintf(cap->card, sizeof(cap->card), "%s", ISP4VID_ISP_DRV_NAME);
	cap->capabilities |= V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_CAPTURE;

	dev_dbg(isp_vdev->dev, "%s|capabilities=0x%X\n", isp_vdev->vdev.name,
		cap->capabilities);

	return 0;
}

static int isp4vid_g_fmt_vid_cap(struct file *file, void *priv,
				 struct v4l2_format *f)
{
	struct isp4vid_dev *isp_vdev = video_drvdata(file);

	f->fmt.pix = isp_vdev->format;

	return 0;
}

static int isp4vid_fill_buffer_size(struct v4l2_pix_format *fmt)
{

Annotation

Implementation Notes