drivers/media/platform/amlogic/c3/isp/c3-isp-dev.c

Source file repositories/reference/linux-study-clean/drivers/media/platform/amlogic/c3/isp/c3-isp-dev.c

File Facts

System
Linux kernel
Corpus path
drivers/media/platform/amlogic/c3/isp/c3-isp-dev.c
Extension
.c
Size
9825 bytes
Lines
422
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) {
			dev_err(isp->dev,
				"Failed to link rsz %u and cap %u\n", i, i);
			goto err_remove_links;
		}

		ret = media_create_pad_link(&isp->core.sd.entity,
					    C3_ISP_CORE_PAD_SOURCE_VIDEO_0 + i,
					    &isp->resizers[i].sd.entity,
					    C3_ISP_RSZ_PAD_SINK,
					    MEDIA_LNK_FL_ENABLED);
		if (ret) {
			dev_err(isp->dev,
				"Failed to link core and rsz %u\n", i);
			goto err_remove_links;
		}
	}

	ret = media_create_pad_link(&isp->core.sd.entity,
				    C3_ISP_CORE_PAD_SOURCE_STATS,
				    &isp->stats.vdev.entity,
				    0, MEDIA_LNK_FL_ENABLED);
	if (ret) {
		dev_err(isp->dev, "Failed to link core and stats\n");
		goto err_remove_links;
	}

	ret = media_create_pad_link(&isp->params.vdev.entity, 0,
				    &isp->core.sd.entity,
				    C3_ISP_CORE_PAD_SINK_PARAMS,
				    MEDIA_LNK_FL_ENABLED);
	if (ret) {
		dev_err(isp->dev, "Failed to link params and core\n");
		goto err_remove_links;
	}

	return 0;

err_remove_links:
	c3_isp_remove_links(isp);
	return ret;
}

static int c3_isp_videos_register(struct c3_isp_device *isp)
{
	int ret;

	ret = c3_isp_captures_register(isp);
	if (ret)
		return ret;

	ret = c3_isp_stats_register(isp);
	if (ret)
		goto err_captures_unregister;

	ret = c3_isp_params_register(isp);
	if (ret)
		goto err_stats_unregister;

	ret = c3_isp_create_links(isp);
	if (ret)
		goto err_params_unregister;

	return 0;

err_params_unregister:
	c3_isp_params_unregister(isp);
err_stats_unregister:
	c3_isp_stats_unregister(isp);
err_captures_unregister:
	c3_isp_captures_unregister(isp);
	return ret;
}

static void c3_isp_videos_unregister(struct c3_isp_device *isp)
{
	c3_isp_remove_links(isp);
	c3_isp_params_unregister(isp);
	c3_isp_stats_unregister(isp);
	c3_isp_captures_unregister(isp);
}

static int c3_isp_get_clocks(struct c3_isp_device *isp)
{
	const struct c3_isp_info *info = isp->info;

	for (unsigned int i = 0; i < info->clock_num; i++)
		isp->clks[i].id = info->clocks[i];

	return devm_clk_bulk_get(isp->dev, info->clock_num, isp->clks);

Annotation

Implementation Notes