drivers/media/platform/amlogic/c3/isp/c3-isp-capture.c

Source file repositories/reference/linux-study-clean/drivers/media/platform/amlogic/c3/isp/c3-isp-capture.c

File Facts

System
Linux kernel
Corpus path
drivers/media/platform/amlogic/c3/isp/c3-isp-capture.c
Extension
.c
Size
22683 bytes
Lines
805
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 (index++ == f->index) {
			f->pixelformat = cap_formats[i].fourcc;
			return 0;
		}
	}

	return -EINVAL;
}

static int c3_isp_cap_g_fmt_mplane(struct file *file, void *fh,
				   struct v4l2_format *f)
{
	struct c3_isp_capture *cap = video_drvdata(file);

	f->fmt.pix_mp = cap->format.pix_mp;

	return 0;
}

static int c3_isp_cap_s_fmt_mplane(struct file *file, void *fh,
				   struct v4l2_format *f)
{
	struct c3_isp_capture *cap = video_drvdata(file);

	c3_cap_try_fmt(&f->fmt.pix_mp);

	cap->format.pix_mp = f->fmt.pix_mp;
	cap->format.info = c3_cap_find_fmt(f->fmt.pix_mp.pixelformat);

	return 0;
}

static int c3_isp_cap_try_fmt_mplane(struct file *file, void *fh,
				     struct v4l2_format *f)
{
	c3_cap_try_fmt(&f->fmt.pix_mp);

	return 0;
}

static int c3_isp_cap_enum_frmsize(struct file *file, void *fh,
				   struct v4l2_frmsizeenum *fsize)
{
	const struct c3_isp_cap_format_info *fmt;

	if (fsize->index)
		return -EINVAL;

	fmt = c3_cap_find_fmt(fsize->pixel_format);
	if (!fmt)
		return -EINVAL;

	fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE;
	fsize->stepwise.min_width = C3_ISP_MIN_WIDTH;
	fsize->stepwise.min_height = C3_ISP_MIN_HEIGHT;
	fsize->stepwise.max_width = C3_ISP_MAX_WIDTH;
	fsize->stepwise.max_height = C3_ISP_MAX_HEIGHT;
	fsize->stepwise.step_width = 2;
	fsize->stepwise.step_height = 2;

	return 0;
}

static const struct v4l2_ioctl_ops isp_cap_v4l2_ioctl_ops = {
	.vidioc_querycap		= c3_isp_cap_querycap,
	.vidioc_enum_fmt_vid_cap	= c3_isp_cap_enum_fmt,
	.vidioc_g_fmt_vid_cap_mplane	= c3_isp_cap_g_fmt_mplane,
	.vidioc_s_fmt_vid_cap_mplane	= c3_isp_cap_s_fmt_mplane,
	.vidioc_try_fmt_vid_cap_mplane	= c3_isp_cap_try_fmt_mplane,
	.vidioc_reqbufs			= vb2_ioctl_reqbufs,
	.vidioc_querybuf		= vb2_ioctl_querybuf,
	.vidioc_qbuf			= vb2_ioctl_qbuf,
	.vidioc_expbuf			= vb2_ioctl_expbuf,
	.vidioc_dqbuf			= vb2_ioctl_dqbuf,
	.vidioc_prepare_buf		= vb2_ioctl_prepare_buf,
	.vidioc_create_bufs		= vb2_ioctl_create_bufs,
	.vidioc_streamon		= vb2_ioctl_streamon,
	.vidioc_streamoff		= vb2_ioctl_streamoff,
	.vidioc_enum_framesizes         = c3_isp_cap_enum_frmsize,
	.vidioc_subscribe_event		= v4l2_ctrl_subscribe_event,
	.vidioc_unsubscribe_event	= v4l2_event_unsubscribe,
};

static const struct v4l2_file_operations isp_cap_v4l2_fops = {
	.open = v4l2_fh_open,
	.release = vb2_fop_release,
	.poll = vb2_fop_poll,
	.unlocked_ioctl = video_ioctl2,
	.mmap = vb2_fop_mmap,
};

Annotation

Implementation Notes