drivers/gpu/drm/imx/dc/dc-crtc.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/imx/dc/dc-crtc.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/imx/dc/dc-crtc.c
Extension
.c
Size
14406 bytes
Lines
550
Domain
Driver Families
Bucket
drivers/gpu
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(irqs[i].dev, "failed to request irq(%u): %d\n",
				irqs[i].irq, ret);
			return ret;
		}

		irq->dc_crtc = dc_crtc;
		irq->irq = irqs[i].irq;
	}

	return 0;
}

int dc_crtc_init(struct dc_drm_device *dc_drm, int crtc_index)
{
	struct dc_crtc *dc_crtc = &dc_drm->dc_crtc[crtc_index];
	struct drm_device *drm = &dc_drm->base;
	struct dc_de *de = dc_drm->de[crtc_index];
	struct dc_pe *pe = dc_drm->pe;
	struct dc_plane *dc_primary;
	int ret;

	dc_crtc->de = de;

	init_completion(&dc_crtc->dec_seqcomplete_done);
	init_completion(&dc_crtc->dec_shdload_done);
	init_completion(&dc_crtc->ed_cont_shdload_done);
	init_completion(&dc_crtc->ed_safe_shdload_done);

	dc_crtc->cf_cont = pe->cf_cont[crtc_index];
	dc_crtc->cf_safe = pe->cf_safe[crtc_index];
	dc_crtc->ed_cont = pe->ed_cont[crtc_index];
	dc_crtc->ed_safe = pe->ed_safe[crtc_index];
	dc_crtc->fg = de->fg;

	dc_crtc->irq_dec_framecomplete = de->irq_framecomplete;
	dc_crtc->irq_dec_seqcomplete = de->irq_seqcomplete;
	dc_crtc->irq_dec_shdload = de->irq_shdload;
	dc_crtc->irq_ed_safe_shdload = dc_crtc->ed_safe->irq_shdload;
	dc_crtc->irq_ed_cont_shdload = dc_crtc->ed_cont->irq_shdload;

	dc_primary = &dc_drm->dc_primary[crtc_index];
	ret = dc_plane_init(dc_drm, dc_primary);
	if (ret) {
		dev_err(de->dev, "failed to initialize primary plane: %d\n",
			ret);
		return ret;
	}

	drm_crtc_helper_add(&dc_crtc->base, &dc_helper_funcs);

	ret = drm_crtc_init_with_planes(drm, &dc_crtc->base, &dc_primary->base,
					NULL, &dc_crtc_funcs, NULL);
	if (ret)
		dev_err(de->dev, "failed to add CRTC: %d\n", ret);

	return ret;
}

int dc_crtc_post_init(struct dc_drm_device *dc_drm, int crtc_index)
{
	struct dc_crtc *dc_crtc = &dc_drm->dc_crtc[crtc_index];
	struct drm_device *drm = &dc_drm->base;

	return dc_crtc_request_irqs(drm, dc_crtc);
}

Annotation

Implementation Notes