drivers/media/platform/qcom/iris/iris_vb2.c

Source file repositories/reference/linux-study-clean/drivers/media/platform/qcom/iris/iris_vb2.c

File Facts

System
Linux kernel
Corpus path
drivers/media/platform/qcom/iris/iris_vb2.c
Extension
.c
Size
7786 bytes
Lines
346
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 (ret) {
			ret = -EINVAL;
			dev_err(core->dev, "session open failed\n");
			goto unlock;
		}

		ret = iris_inst_change_state(inst, IRIS_INST_INIT);
		if (ret)
			goto unlock;
	}

	*num_planes = 1;
	sizes[0] = f->fmt.pix_mp.plane_fmt[0].sizeimage;

unlock:
	mutex_unlock(&inst->lock);

	return ret;
}

int iris_vb2_start_streaming(struct vb2_queue *q, unsigned int count)
{
	enum iris_buffer_type buf_type;
	struct iris_inst *inst;
	int ret = 0;

	inst = vb2_get_drv_priv(q);

	mutex_lock(&inst->lock);
	if (inst->state == IRIS_INST_ERROR) {
		ret = -EBUSY;
		goto error;
	}

	if (!V4L2_TYPE_IS_OUTPUT(q->type) &&
	    !V4L2_TYPE_IS_CAPTURE(q->type)) {
		ret = -EINVAL;
		goto error;
	}

	iris_scale_power(inst);

	ret = iris_check_session_supported(inst);
	if (ret)
		goto error;

	if (V4L2_TYPE_IS_OUTPUT(q->type)) {
		if (inst->domain == DECODER)
			ret = iris_vdec_streamon_input(inst);
		else
			ret = iris_venc_streamon_input(inst);
	} else if (V4L2_TYPE_IS_CAPTURE(q->type)) {
		if (inst->domain == DECODER)
			ret = iris_vdec_streamon_output(inst);
		else
			ret = iris_venc_streamon_output(inst);
	}
	if (ret)
		goto error;

	buf_type = iris_v4l2_type_to_driver(q->type);

	if (inst->domain == DECODER) {
		if (buf_type == BUF_INPUT)
			ret = iris_queue_deferred_buffers(inst, BUF_INPUT);

		if (!ret && inst->state == IRIS_INST_STREAMING) {
			ret = iris_queue_internal_deferred_buffers(inst, BUF_DPB);
			if (!ret)
				ret = iris_queue_deferred_buffers(inst, BUF_OUTPUT);
		}
	} else {
		if (inst->state == IRIS_INST_STREAMING) {
			ret = iris_queue_deferred_buffers(inst, BUF_INPUT);
			if (!ret)
				ret = iris_queue_deferred_buffers(inst, BUF_OUTPUT);
		}
	}

	if (ret)
		goto error;

	mutex_unlock(&inst->lock);

	return ret;

error:
	iris_helper_buffers_done(inst, q->type, VB2_BUF_STATE_QUEUED);
	iris_inst_change_state(inst, IRIS_INST_ERROR);
	mutex_unlock(&inst->lock);

Annotation

Implementation Notes