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

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

File Facts

System
Linux kernel
Corpus path
drivers/media/platform/qcom/iris/iris_ctrls.c
Extension
.c
Size
46905 bytes
Lines
1502
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 (ctrl_idx >= num_ctrls) {
			ret = -EINVAL;
			goto error;
		}

		if (cap[idx].flags & CAP_FLAG_MENU) {
			ctrl = v4l2_ctrl_new_std_menu(&inst->ctrl_handler,
						      &iris_ctrl_ops,
						      v4l2_id,
						      cap[idx].max,
						      ~(cap[idx].step_or_mask),
						      cap[idx].value);
		} else {
			ctrl = v4l2_ctrl_new_std(&inst->ctrl_handler,
						 &iris_ctrl_ops,
						 v4l2_id,
						 cap[idx].min,
						 cap[idx].max,
						 cap[idx].step_or_mask,
						 cap[idx].value);
		}
		if (!ctrl) {
			ret = -EINVAL;
			goto error;
		}

		ctrl_idx++;
	}

	if (inst->domain == DECODER) {
		v4l2_ctrl_new_std(&inst->ctrl_handler, NULL,
				  V4L2_CID_MIN_BUFFERS_FOR_CAPTURE, 1, 32, 1, 4);
	} else {
		v4l2_ctrl_new_std(&inst->ctrl_handler, NULL,
				  V4L2_CID_MIN_BUFFERS_FOR_OUTPUT, 1, 32, 1, 4);
	}

	ret = inst->ctrl_handler.error;
	if (ret)
		goto error;

	return 0;
error:
	v4l2_ctrl_handler_free(&inst->ctrl_handler);

	return ret;
}

void iris_session_init_caps(struct iris_core *core)
{
	const struct platform_inst_fw_cap *caps;
	u32 i, num_cap, cap_id;

	caps = core->iris_firmware_data->inst_fw_caps_dec;
	num_cap = core->iris_firmware_data->inst_fw_caps_dec_size;

	for (i = 0; i < num_cap; i++) {
		cap_id = caps[i].cap_id;
		if (!iris_valid_cap_id(cap_id))
			continue;

		core->inst_fw_caps_dec[cap_id].cap_id = caps[i].cap_id;
		core->inst_fw_caps_dec[cap_id].step_or_mask = caps[i].step_or_mask;
		core->inst_fw_caps_dec[cap_id].flags = caps[i].flags;
		core->inst_fw_caps_dec[cap_id].hfi_id = caps[i].hfi_id;
		core->inst_fw_caps_dec[cap_id].set = caps[i].set;

		if (cap_id == PIPE) {
			core->inst_fw_caps_dec[cap_id].value =
				core->iris_platform_data->num_vpp_pipe;
			core->inst_fw_caps_dec[cap_id].min =
				core->iris_platform_data->num_vpp_pipe;
			core->inst_fw_caps_dec[cap_id].max =
				core->iris_platform_data->num_vpp_pipe;
		} else {
			core->inst_fw_caps_dec[cap_id].min = caps[i].min;
			core->inst_fw_caps_dec[cap_id].max = caps[i].max;
			core->inst_fw_caps_dec[cap_id].value = caps[i].value;
		}
	}

	caps = core->iris_firmware_data->inst_fw_caps_enc;
	num_cap = core->iris_firmware_data->inst_fw_caps_enc_size;

	for (i = 0; i < num_cap; i++) {
		cap_id = caps[i].cap_id;
		if (!iris_valid_cap_id(cap_id))
			continue;

		core->inst_fw_caps_enc[cap_id].cap_id = caps[i].cap_id;

Annotation

Implementation Notes