drivers/remoteproc/qcom_wcnss_iris.c

Source file repositories/reference/linux-study-clean/drivers/remoteproc/qcom_wcnss_iris.c

File Facts

System
Linux kernel
Corpus path
drivers/remoteproc/qcom_wcnss_iris.c
Extension
.c
Size
4803 bytes
Lines
209
Domain
Driver Families
Bucket
drivers/remoteproc
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

ret = device_add(&iris->dev);
	if (ret) {
		put_device(&iris->dev);
		return ERR_PTR(ret);
	}

	match = of_match_device(iris_of_match, &iris->dev);
	if (!match) {
		dev_err(&iris->dev, "no matching compatible for iris\n");
		ret = -EINVAL;
		goto err_device_del;
	}

	data = match->data;

	iris->xo_clk = devm_clk_get(&iris->dev, "xo");
	if (IS_ERR(iris->xo_clk)) {
		ret = dev_err_probe(&iris->dev, PTR_ERR(iris->xo_clk),
				    "failed to acquire xo clk\n");
		goto err_device_del;
	}

	iris->num_vregs = data->num_vregs;
	iris->vregs = devm_kcalloc(&iris->dev,
				   iris->num_vregs,
				   sizeof(struct regulator_bulk_data),
				   GFP_KERNEL);
	if (!iris->vregs) {
		ret = -ENOMEM;
		goto err_device_del;
	}

	for (i = 0; i < iris->num_vregs; i++)
		iris->vregs[i].supply = data->vregs[i].name;

	ret = devm_regulator_bulk_get(&iris->dev, iris->num_vregs, iris->vregs);
	if (ret) {
		dev_err(&iris->dev, "failed to get regulators\n");
		goto err_device_del;
	}

	for (i = 0; i < iris->num_vregs; i++) {
		if (data->vregs[i].max_voltage)
			regulator_set_voltage(iris->vregs[i].consumer,
					      data->vregs[i].min_voltage,
					      data->vregs[i].max_voltage);

		if (data->vregs[i].load_uA)
			regulator_set_load(iris->vregs[i].consumer,
					   data->vregs[i].load_uA);
	}

	*use_48mhz_xo = data->use_48mhz_xo;

	return iris;

err_device_del:
	device_del(&iris->dev);
	put_device(&iris->dev);

	return ERR_PTR(ret);
}

void qcom_iris_remove(struct qcom_iris *iris)
{
	device_del(&iris->dev);
	put_device(&iris->dev);
}

Annotation

Implementation Notes