drivers/staging/media/atomisp/pci/atomisp_ioctl.c

Source file repositories/reference/linux-study-clean/drivers/staging/media/atomisp/pci/atomisp_ioctl.c

File Facts

System
Linux kernel
Corpus path
drivers/staging/media/atomisp/pci/atomisp_ioctl.c
Extension
.c
Size
41389 bytes
Lines
1581
Domain
Driver Families
Bucket
drivers/staging
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 (*valid_sizes == fsize->index) {
			fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
			fsize->discrete = frame_sizes[i];
			return 0;
		}

		(*valid_sizes)++;
	}

	return -EINVAL;
}

static int atomisp_enum_framesizes_crop(struct atomisp_device *isp,
					struct v4l2_frmsizeenum *fsize)
{
	struct atomisp_input_subdev *input = &isp->inputs[isp->asd.input_curr];
	struct v4l2_rect active = input->active_rect;
	struct v4l2_rect native = input->native_rect;
	int ret, valid_sizes = 0;

	ret = atomisp_enum_framesizes_crop_inner(isp, fsize, &active, &native, &valid_sizes);
	if (ret == 0)
		return 0;

	if (!input->binning_support)
		return -EINVAL;

	active.width /= 2;
	active.height /= 2;
	native.width /= 2;
	native.height /= 2;

	return atomisp_enum_framesizes_crop_inner(isp, fsize, &active, &native, &valid_sizes);
}

static int atomisp_enum_framesizes(struct file *file, void *priv,
				   struct v4l2_frmsizeenum *fsize)
{
	struct video_device *vdev = video_devdata(file);
	struct atomisp_device *isp = video_get_drvdata(vdev);
	struct atomisp_sub_device *asd = atomisp_to_video_pipe(vdev)->asd;
	struct atomisp_input_subdev *input = &isp->inputs[asd->input_curr];
	struct v4l2_subdev_frame_size_enum fse = {
		.index = fsize->index,
		.which = V4L2_SUBDEV_FORMAT_ACTIVE,
		.code = input->code,
	};
	struct v4l2_subdev_state *act_sd_state;
	int ret;

	if (!input->sensor)
		return -EINVAL;

	if (input->crop_support)
		return atomisp_enum_framesizes_crop(isp, fsize);

	act_sd_state = v4l2_subdev_lock_and_get_active_state(input->sensor);
	ret = v4l2_subdev_call(input->sensor, pad, enum_frame_size,
			       act_sd_state, &fse);
	if (act_sd_state)
		v4l2_subdev_unlock_state(act_sd_state);
	if (ret)
		return ret;

	fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
	fsize->discrete.width = fse.max_width - pad_w;
	fsize->discrete.height = fse.max_height - pad_h;

	return 0;
}

static int atomisp_enum_frameintervals(struct file *file, void *priv,
				       struct v4l2_frmivalenum *fival)
{
	struct video_device *vdev = video_devdata(file);
	struct atomisp_device *isp = video_get_drvdata(vdev);
	struct atomisp_sub_device *asd = atomisp_to_video_pipe(vdev)->asd;
	struct atomisp_input_subdev *input = &isp->inputs[asd->input_curr];
	struct v4l2_subdev_frame_interval_enum fie = {
		.code = atomisp_in_fmt_conv[0].code,
		.index = fival->index,
		.width = fival->width,
		.height = fival->height,
		.which = V4L2_SUBDEV_FORMAT_ACTIVE,
	};
	struct v4l2_subdev_state *act_sd_state;
	int ret;

	if (!input->sensor)
		return -EINVAL;

Annotation

Implementation Notes