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

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

File Facts

System
Linux kernel
Corpus path
drivers/media/platform/qcom/iris/iris_probe.c
Extension
.c
Size
9368 bytes
Lines
408
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

of_device_is_compatible(core->dev->of_node, "qcom,sm8250-venus")) {
		iris_opp_pd_data.num_pd_names--;
		ret = devm_pm_domain_attach_list(core->dev, &iris_opp_pd_data,
						 &core->opp_pmdomain_tbl);
	}
	if (ret < 0)
		return ret;

	ret = devm_pm_opp_set_config(core->dev, &iris_opp_clk_data);
	if (ret)
		return ret;

	return devm_pm_opp_of_add_table(core->dev);
}

static int iris_init_clocks(struct iris_core *core)
{
	int ret;

	ret = devm_clk_bulk_get_all(core->dev, &core->clock_tbl);
	if (ret < 0)
		return ret;

	core->clk_count = ret;

	return 0;
}

static int iris_init_reset_table(struct iris_core *core,
				 struct reset_control_bulk_data **resets,
				 const char * const *rst_tbl, u32 rst_tbl_size)
{
	u32 i = 0;

	*resets = devm_kzalloc(core->dev,
			       sizeof(struct reset_control_bulk_data) * rst_tbl_size,
			       GFP_KERNEL);
	if (!*resets)
		return -ENOMEM;

	for (i = 0; i < rst_tbl_size; i++)
		(*resets)[i].id = rst_tbl[i];

	return devm_reset_control_bulk_get_exclusive(core->dev, rst_tbl_size, *resets);
}

static int iris_init_resets(struct iris_core *core)
{
	int ret;

	ret = iris_init_reset_table(core, &core->resets,
				    core->iris_platform_data->clk_rst_tbl,
				    core->iris_platform_data->clk_rst_tbl_size);
	if (ret)
		return ret;

	if (!core->iris_platform_data->controller_rst_tbl_size)
		return 0;

	return iris_init_reset_table(core, &core->controller_resets,
				     core->iris_platform_data->controller_rst_tbl,
				     core->iris_platform_data->controller_rst_tbl_size);
}

static int iris_init_resources(struct iris_core *core)
{
	int ret;

	ret = iris_init_icc(core);
	if (ret)
		return ret;

	ret = iris_init_power_domains(core);
	if (ret)
		return ret;

	ret = iris_init_clocks(core);
	if (ret)
		return ret;

	return iris_init_resets(core);
}

static int iris_register_video_device(struct iris_core *core, enum domain_type type)
{
	struct video_device *vdev;
	int ret;

	vdev = video_device_alloc();
	if (!vdev)

Annotation

Implementation Notes