drivers/media/platform/qcom/venus/core.c

Source file repositories/reference/linux-study-clean/drivers/media/platform/qcom/venus/core.c

File Facts

System
Linux kernel
Corpus path
drivers/media/platform/qcom/venus/core.c
Extension
.c
Size
31858 bytes
Lines
1205
Domain
Driver Families
Bucket
drivers/media
Inferred role
Driver Families: exported/initcall integration point
Status
integration 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 (IS_AR50_LITE(core)) {
			core->vbif_base = NULL;
			core->aon_base = NULL;
		} else {
			core->vbif_base = core->base + VBIF_BASE;
			core->aon_base = core->base + AON_BASE_V6;
		}
	} else {
		core->vbif_base = core->base + VBIF_BASE;
		core->cpu_base = core->base + CPU_BASE;
		core->cpu_cs_base = core->base + CPU_CS_BASE;
		core->cpu_ic_base = core->base + CPU_IC_BASE;
		core->wrapper_base = core->base + WRAPPER_BASE;
		core->wrapper_tz_base = NULL;
		core->aon_base = NULL;
	}
}

static irqreturn_t venus_isr_thread(int irq, void *dev_id)
{
	struct venus_core *core = dev_id;
	irqreturn_t ret;

	ret = hfi_isr_thread(irq, dev_id);

	if (ret == IRQ_HANDLED && venus_fault_inject_ssr())
		hfi_core_trigger_ssr(core, HFI_TEST_SSR_SW_ERR_FATAL);

	return ret;
}

#if defined(CONFIG_OF_DYNAMIC)
static int venus_add_video_core(struct venus_core *core, const char *node_name,
				const char *compat)
{
	struct of_changeset *ocs = core->ocs;
	struct device *dev = core->dev;
	struct device_node *np, *enp;
	int ret;

	if (!node_name)
		return 0;

	enp = of_find_node_by_name(dev->of_node, node_name);
	if (enp) {
		of_node_put(enp);
		return 0;
	}

	np = of_changeset_create_node(ocs, dev->of_node, node_name);
	if (!np) {
		dev_err(dev, "Unable to create new node\n");
		return -ENODEV;
	}

	ret = of_changeset_add_prop_string(ocs, np, "compatible", compat);
	if (ret)
		dev_err(dev, "unable to add %s\n", compat);

	of_node_put(np);

	return ret;
}

static int venus_add_dynamic_nodes(struct venus_core *core)
{
	struct device *dev = core->dev;
	int ret;

	core->ocs = kmalloc_obj(*core->ocs);
	if (!core->ocs)
		return -ENOMEM;

	of_changeset_init(core->ocs);

	ret = venus_add_video_core(core, core->res->dec_nodename, "venus-decoder");
	if (ret)
		goto err;

	ret = venus_add_video_core(core, core->res->enc_nodename, "venus-encoder");
	if (ret)
		goto err;

	ret = of_changeset_apply(core->ocs);
	if (ret) {
		dev_err(dev, "applying changeset fail ret %d\n", ret);
		goto err;
	}

	return 0;

Annotation

Implementation Notes