Lines Matching refs:ipu_crtc
31 struct ipu_crtc { struct
44 static inline struct ipu_crtc *to_ipu_crtc(struct drm_crtc *crtc) in to_ipu_crtc() argument
46 return container_of(crtc, struct ipu_crtc, base); in to_ipu_crtc()
52 struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc); in ipu_crtc_atomic_enable() local
53 struct ipu_soc *ipu = dev_get_drvdata(ipu_crtc->dev->parent); in ipu_crtc_atomic_enable()
57 ipu_dc_enable_channel(ipu_crtc->dc); in ipu_crtc_atomic_enable()
58 ipu_di_enable(ipu_crtc->di); in ipu_crtc_atomic_enable()
61 static void ipu_crtc_disable_planes(struct ipu_crtc *ipu_crtc, in ipu_crtc_disable_planes() argument
69 if (plane == &ipu_crtc->plane[0]->base) in ipu_crtc_disable_planes()
71 if (ipu_crtc->plane[1] && plane == &ipu_crtc->plane[1]->base) in ipu_crtc_disable_planes()
76 ipu_plane_disable(ipu_crtc->plane[1], true); in ipu_crtc_disable_planes()
78 ipu_plane_disable(ipu_crtc->plane[0], true); in ipu_crtc_disable_planes()
84 struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc); in ipu_crtc_atomic_disable() local
85 struct ipu_soc *ipu = dev_get_drvdata(ipu_crtc->dev->parent); in ipu_crtc_atomic_disable()
87 ipu_dc_disable_channel(ipu_crtc->dc); in ipu_crtc_atomic_disable()
88 ipu_di_disable(ipu_crtc->di); in ipu_crtc_atomic_disable()
94 ipu_crtc_disable_planes(ipu_crtc, old_crtc_state); in ipu_crtc_atomic_disable()
148 struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc); in ipu_enable_vblank() local
150 enable_irq(ipu_crtc->irq); in ipu_enable_vblank()
157 struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc); in ipu_disable_vblank() local
159 disable_irq_nosync(ipu_crtc->irq); in ipu_disable_vblank()
175 struct ipu_crtc *ipu_crtc = dev_id; in ipu_irq_handler() local
176 struct drm_crtc *crtc = &ipu_crtc->base; in ipu_irq_handler()
182 if (ipu_crtc->event) { in ipu_irq_handler()
183 for (i = 0; i < ARRAY_SIZE(ipu_crtc->plane); i++) { in ipu_irq_handler()
184 struct ipu_plane *plane = ipu_crtc->plane[i]; in ipu_irq_handler()
193 if (i == ARRAY_SIZE(ipu_crtc->plane)) { in ipu_irq_handler()
195 drm_crtc_send_vblank_event(crtc, ipu_crtc->event); in ipu_irq_handler()
196 ipu_crtc->event = NULL; in ipu_irq_handler()
209 struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc); in ipu_crtc_mode_fixup() local
215 ret = ipu_di_adjust_videomode(ipu_crtc->di, &vm); in ipu_crtc_mode_fixup()
249 struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc); in ipu_crtc_atomic_flush() local
252 ipu_crtc->event = crtc->state->event; in ipu_crtc_atomic_flush()
262 struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc); in ipu_crtc_mode_set_nofb() local
268 dev_dbg(ipu_crtc->dev, "%s: mode->hdisplay: %d\n", __func__, in ipu_crtc_mode_set_nofb()
270 dev_dbg(ipu_crtc->dev, "%s: mode->vdisplay: %d\n", __func__, in ipu_crtc_mode_set_nofb()
278 dev_dbg(ipu_crtc->dev, "%s: attached to encoder types 0x%lx\n", in ipu_crtc_mode_set_nofb()
305 ipu_dc_init_sync(ipu_crtc->dc, ipu_crtc->di, in ipu_crtc_mode_set_nofb()
308 ipu_di_init_sync_panel(ipu_crtc->di, &sig_cfg); in ipu_crtc_mode_set_nofb()
321 static void ipu_put_resources(struct ipu_crtc *ipu_crtc) in ipu_put_resources() argument
323 if (!IS_ERR_OR_NULL(ipu_crtc->dc)) in ipu_put_resources()
324 ipu_dc_put(ipu_crtc->dc); in ipu_put_resources()
325 if (!IS_ERR_OR_NULL(ipu_crtc->di)) in ipu_put_resources()
326 ipu_di_put(ipu_crtc->di); in ipu_put_resources()
329 static int ipu_get_resources(struct ipu_crtc *ipu_crtc, in ipu_get_resources() argument
332 struct ipu_soc *ipu = dev_get_drvdata(ipu_crtc->dev->parent); in ipu_get_resources()
335 ipu_crtc->dc = ipu_dc_get(ipu, pdata->dc); in ipu_get_resources()
336 if (IS_ERR(ipu_crtc->dc)) { in ipu_get_resources()
337 ret = PTR_ERR(ipu_crtc->dc); in ipu_get_resources()
341 ipu_crtc->di = ipu_di_get(ipu, pdata->di); in ipu_get_resources()
342 if (IS_ERR(ipu_crtc->di)) { in ipu_get_resources()
343 ret = PTR_ERR(ipu_crtc->di); in ipu_get_resources()
349 ipu_put_resources(ipu_crtc); in ipu_get_resources()
354 static int ipu_crtc_init(struct ipu_crtc *ipu_crtc, in ipu_crtc_init() argument
357 struct ipu_soc *ipu = dev_get_drvdata(ipu_crtc->dev->parent); in ipu_crtc_init()
358 struct drm_crtc *crtc = &ipu_crtc->base; in ipu_crtc_init()
362 ret = ipu_get_resources(ipu_crtc, pdata); in ipu_crtc_init()
364 dev_err(ipu_crtc->dev, "getting resources failed with %d.\n", in ipu_crtc_init()
371 ipu_crtc->plane[0] = ipu_plane_init(drm, ipu, pdata->dma[0], dp, 0, in ipu_crtc_init()
373 if (IS_ERR(ipu_crtc->plane[0])) { in ipu_crtc_init()
374 ret = PTR_ERR(ipu_crtc->plane[0]); in ipu_crtc_init()
380 drm_crtc_init_with_planes(drm, crtc, &ipu_crtc->plane[0]->base, NULL, in ipu_crtc_init()
383 ret = ipu_plane_get_resources(ipu_crtc->plane[0]); in ipu_crtc_init()
385 dev_err(ipu_crtc->dev, "getting plane 0 resources failed with %d.\n", in ipu_crtc_init()
392 ipu_crtc->plane[1] = ipu_plane_init(drm, ipu, pdata->dma[1], in ipu_crtc_init()
394 drm_crtc_mask(&ipu_crtc->base), in ipu_crtc_init()
396 if (IS_ERR(ipu_crtc->plane[1])) { in ipu_crtc_init()
397 ipu_crtc->plane[1] = NULL; in ipu_crtc_init()
399 ret = ipu_plane_get_resources(ipu_crtc->plane[1]); in ipu_crtc_init()
401 dev_err(ipu_crtc->dev, "getting plane 1 " in ipu_crtc_init()
408 ipu_crtc->irq = ipu_plane_irq(ipu_crtc->plane[0]); in ipu_crtc_init()
409 ret = devm_request_irq(ipu_crtc->dev, ipu_crtc->irq, ipu_irq_handler, 0, in ipu_crtc_init()
410 "imx_drm", ipu_crtc); in ipu_crtc_init()
412 dev_err(ipu_crtc->dev, "irq request failed with %d.\n", ret); in ipu_crtc_init()
416 disable_irq(ipu_crtc->irq); in ipu_crtc_init()
421 if (ipu_crtc->plane[1]) in ipu_crtc_init()
422 ipu_plane_put_resources(ipu_crtc->plane[1]); in ipu_crtc_init()
424 ipu_plane_put_resources(ipu_crtc->plane[0]); in ipu_crtc_init()
426 ipu_put_resources(ipu_crtc); in ipu_crtc_init()
435 struct ipu_crtc *ipu_crtc; in ipu_drm_bind() local
437 ipu_crtc = dev_get_drvdata(dev); in ipu_drm_bind()
438 memset(ipu_crtc, 0, sizeof(*ipu_crtc)); in ipu_drm_bind()
440 ipu_crtc->dev = dev; in ipu_drm_bind()
442 return ipu_crtc_init(ipu_crtc, pdata, drm); in ipu_drm_bind()
448 struct ipu_crtc *ipu_crtc = dev_get_drvdata(dev); in ipu_drm_unbind() local
450 ipu_put_resources(ipu_crtc); in ipu_drm_unbind()
451 if (ipu_crtc->plane[1]) in ipu_drm_unbind()
452 ipu_plane_put_resources(ipu_crtc->plane[1]); in ipu_drm_unbind()
453 ipu_plane_put_resources(ipu_crtc->plane[0]); in ipu_drm_unbind()
464 struct ipu_crtc *ipu_crtc; in ipu_drm_probe() local
474 ipu_crtc = devm_kzalloc(dev, sizeof(*ipu_crtc), GFP_KERNEL); in ipu_drm_probe()
475 if (!ipu_crtc) in ipu_drm_probe()
478 dev_set_drvdata(dev, ipu_crtc); in ipu_drm_probe()