drivers/gpu/drm/xlnx/zynqmp_dp.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/xlnx/zynqmp_dp.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/xlnx/zynqmp_dp.c
Extension
.c
Size
70202 bytes
Lines
2529
Domain
Driver Families
Bucket
drivers/gpu
Inferred role
Driver Families: operation-table or driver-model contract
Status
pattern 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

static const struct file_operations fops_zynqmp_dp_pattern = {
	.read = zynqmp_dp_pattern_read,
	.write = zynqmp_dp_pattern_write,
	.open = simple_open,
	.llseek = noop_llseek,
};

static int zynqmp_dp_enhanced_get(void *data, u64 *val)
{
	struct zynqmp_dp *dp = data;

	guard(mutex)(&dp->lock);
	*val = dp->test.enhanced;
	return 0;
}

static int zynqmp_dp_enhanced_set(void *data, u64 val)
{
	struct zynqmp_dp *dp = data;

	guard(mutex)(&dp->lock);
	dp->test.enhanced = val;
	return dp->test.active ? zynqmp_dp_test_setup(dp) : 0;
}

DEFINE_DEBUGFS_ATTRIBUTE(fops_zynqmp_dp_enhanced, zynqmp_dp_enhanced_get,
			 zynqmp_dp_enhanced_set, "%llu\n");

static int zynqmp_dp_downspread_get(void *data, u64 *val)
{
	struct zynqmp_dp *dp = data;

	guard(mutex)(&dp->lock);
	*val = dp->test.downspread;
	return 0;
}

static int zynqmp_dp_downspread_set(void *data, u64 val)
{
	struct zynqmp_dp *dp = data;

	guard(mutex)(&dp->lock);
	dp->test.downspread = val;

	return dp->test.active ? zynqmp_dp_test_setup(dp) : 0;
}

DEFINE_DEBUGFS_ATTRIBUTE(fops_zynqmp_dp_downspread, zynqmp_dp_downspread_get,
			 zynqmp_dp_downspread_set, "%llu\n");

static int zynqmp_dp_active_get(void *data, u64 *val)
{
	struct zynqmp_dp *dp = data;

	guard(mutex)(&dp->lock);
	*val = dp->test.active;
	return 0;
}

static int zynqmp_dp_active_set(void *data, u64 val)
{
	struct zynqmp_dp *dp = data;
	int ret;

	guard(mutex)(&dp->lock);
	if (val) {
		if (val < 2) {
			ret = zynqmp_dp_test_setup(dp);
			if (ret)
				return ret;
		}

		ret = zynqmp_dp_set_test_pattern(dp, dp->test.pattern,
						 dp->test.custom);
		if (ret)
			return ret;

		ret = zynqmp_dp_update_vs_emph(dp, dp->test.train_set);
		if (ret)
			return ret;

		dp->test.active = true;
	} else {
		int err;

		dp->test.active = false;
		err = zynqmp_dp_set_test_pattern(dp, TEST_VIDEO, NULL);
		if (err)
			dev_warn(dp->dev, "could not clear test pattern: %d\n",
				 err);

Annotation

Implementation Notes