ipu_crtc
struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc);
enable_irq(ipu_crtc->irq);
struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc);
disable_irq_nosync(ipu_crtc->irq);
struct ipu_crtc *ipu_crtc = dev_id;
struct drm_crtc *crtc = &ipu_crtc->base;
if (ipu_crtc->event) {
for (i = 0; i < ARRAY_SIZE(ipu_crtc->plane); i++) {
struct ipu_plane *plane = ipu_crtc->plane[i];
if (i == ARRAY_SIZE(ipu_crtc->plane)) {
drm_crtc_send_vblank_event(crtc, ipu_crtc->event);
ipu_crtc->event = NULL;
struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc);
ret = ipu_di_adjust_videomode(ipu_crtc->di, &vm);
struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc);
ipu_crtc->event = crtc->state->event;
struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc);
dev_dbg(ipu_crtc->dev, "%s: mode->hdisplay: %d\n", __func__,
dev_dbg(ipu_crtc->dev, "%s: mode->vdisplay: %d\n", __func__,
dev_dbg(ipu_crtc->dev, "%s: attached to encoder types 0x%lx\n",
dev_warn(ipu_crtc->dev, "8-pixel align hactive %d -> %d\n",
ipu_dc_init_sync(ipu_crtc->dc, ipu_crtc->di,
ipu_di_init_sync_panel(ipu_crtc->di, &sig_cfg);
struct ipu_crtc *ipu_crtc = ptr;
if (!IS_ERR_OR_NULL(ipu_crtc->dc))
ipu_dc_put(ipu_crtc->dc);
if (!IS_ERR_OR_NULL(ipu_crtc->di))
ipu_di_put(ipu_crtc->di);
static int ipu_get_resources(struct drm_device *dev, struct ipu_crtc *ipu_crtc,
struct ipu_soc *ipu = dev_get_drvdata(ipu_crtc->dev->parent);
ipu_crtc->dc = ipu_dc_get(ipu, pdata->dc);
if (IS_ERR(ipu_crtc->dc))
return PTR_ERR(ipu_crtc->dc);
ret = drmm_add_action_or_reset(dev, ipu_put_resources, ipu_crtc);
ipu_crtc->di = ipu_di_get(ipu, pdata->di);
if (IS_ERR(ipu_crtc->di))
return PTR_ERR(ipu_crtc->di);
struct ipu_crtc *ipu_crtc;
ipu_crtc = drmm_crtc_alloc_with_planes(drm, struct ipu_crtc, base,
if (IS_ERR(ipu_crtc))
return PTR_ERR(ipu_crtc);
ipu_crtc->dev = dev;
ipu_crtc->plane[0] = primary_plane;
crtc = &ipu_crtc->base;
ret = ipu_get_resources(drm, ipu_crtc, pdata);
dev_err(ipu_crtc->dev, "getting resources failed with %d.\n",
ipu_crtc->plane[1] = ipu_plane_init(drm, ipu, pdata->dma[1],
drm_crtc_mask(&ipu_crtc->base),
if (IS_ERR(ipu_crtc->plane[1]))
ipu_crtc->plane[1] = NULL;
ipu_crtc->irq = ipu_plane_irq(ipu_crtc->plane[0]);
ret = devm_request_irq(ipu_crtc->dev, ipu_crtc->irq, ipu_irq_handler,
IRQF_NO_AUTOEN, "imx_drm", ipu_crtc);
dev_err(ipu_crtc->dev, "irq request failed with %d.\n", ret);
static inline struct ipu_crtc *to_ipu_crtc(struct drm_crtc *crtc)
return container_of(crtc, struct ipu_crtc, base);
struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc);
struct ipu_soc *ipu = dev_get_drvdata(ipu_crtc->dev->parent);
ipu_dc_enable_channel(ipu_crtc->dc);
ipu_di_enable(ipu_crtc->di);
static void ipu_crtc_disable_planes(struct ipu_crtc *ipu_crtc,
if (plane == &ipu_crtc->plane[0]->base)
if (ipu_crtc->plane[1] && plane == &ipu_crtc->plane[1]->base)
ipu_plane_disable(ipu_crtc->plane[1], true);
ipu_plane_disable(ipu_crtc->plane[0], true);
struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc);
struct ipu_soc *ipu = dev_get_drvdata(ipu_crtc->dev->parent);
ipu_dc_disable_channel(ipu_crtc->dc);
ipu_di_disable(ipu_crtc->di);
ipu_crtc_disable_planes(ipu_crtc, old_crtc_state);