Lines Matching refs:ipu_crtc
34 struct ipu_crtc { struct
53 #define to_ipu_crtc(x) container_of(x, struct ipu_crtc, base) argument
55 static void ipu_fb_enable(struct ipu_crtc *ipu_crtc) in ipu_fb_enable() argument
57 struct ipu_soc *ipu = dev_get_drvdata(ipu_crtc->dev->parent); in ipu_fb_enable()
59 if (ipu_crtc->enabled) in ipu_fb_enable()
63 ipu_plane_enable(ipu_crtc->plane[0]); in ipu_fb_enable()
65 ipu_dc_enable_channel(ipu_crtc->dc); in ipu_fb_enable()
66 ipu_di_enable(ipu_crtc->di); in ipu_fb_enable()
68 ipu_crtc->enabled = 1; in ipu_fb_enable()
71 static void ipu_fb_disable(struct ipu_crtc *ipu_crtc) in ipu_fb_disable() argument
73 struct ipu_soc *ipu = dev_get_drvdata(ipu_crtc->dev->parent); in ipu_fb_disable()
75 if (!ipu_crtc->enabled) in ipu_fb_disable()
79 ipu_dc_disable_channel(ipu_crtc->dc); in ipu_fb_disable()
80 ipu_di_disable(ipu_crtc->di); in ipu_fb_disable()
81 ipu_plane_disable(ipu_crtc->plane[0]); in ipu_fb_disable()
84 ipu_crtc->enabled = 0; in ipu_fb_disable()
89 struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc); in ipu_crtc_dpms() local
91 dev_dbg(ipu_crtc->dev, "%s mode: %d\n", __func__, mode); in ipu_crtc_dpms()
95 ipu_fb_enable(ipu_crtc); in ipu_crtc_dpms()
100 ipu_fb_disable(ipu_crtc); in ipu_crtc_dpms()
110 struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc); in ipu_page_flip() local
113 if (ipu_crtc->newfb) in ipu_page_flip()
116 ret = imx_drm_crtc_vblank_get(ipu_crtc->imx_crtc); in ipu_page_flip()
118 dev_dbg(ipu_crtc->dev, "failed to acquire vblank counter\n"); in ipu_page_flip()
124 ipu_crtc->newfb = fb; in ipu_page_flip()
125 ipu_crtc->page_flip_event = event; in ipu_page_flip()
145 struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc); in ipu_crtc_mode_set() local
150 dev_dbg(ipu_crtc->dev, "%s: mode->hdisplay: %d\n", __func__, in ipu_crtc_mode_set()
152 dev_dbg(ipu_crtc->dev, "%s: mode->vdisplay: %d\n", __func__, in ipu_crtc_mode_set()
159 dev_dbg(ipu_crtc->dev, "%s: attached to encoder types 0x%lx\n", in ipu_crtc_mode_set()
177 sig_cfg.bus_format = ipu_crtc->bus_format; in ipu_crtc_mode_set()
179 sig_cfg.hsync_pin = ipu_crtc->di_hsync_pin; in ipu_crtc_mode_set()
180 sig_cfg.vsync_pin = ipu_crtc->di_vsync_pin; in ipu_crtc_mode_set()
184 ret = ipu_dc_init_sync(ipu_crtc->dc, ipu_crtc->di, in ipu_crtc_mode_set()
186 ipu_crtc->bus_format, mode->hdisplay); in ipu_crtc_mode_set()
188 dev_err(ipu_crtc->dev, in ipu_crtc_mode_set()
194 ret = ipu_di_init_sync_panel(ipu_crtc->di, &sig_cfg); in ipu_crtc_mode_set()
196 dev_err(ipu_crtc->dev, in ipu_crtc_mode_set()
201 return ipu_plane_mode_set(ipu_crtc->plane[0], crtc, mode, in ipu_crtc_mode_set()
208 static void ipu_crtc_handle_pageflip(struct ipu_crtc *ipu_crtc) in ipu_crtc_handle_pageflip() argument
211 struct drm_device *drm = ipu_crtc->base.dev; in ipu_crtc_handle_pageflip()
214 if (ipu_crtc->page_flip_event) in ipu_crtc_handle_pageflip()
215 drm_send_vblank_event(drm, -1, ipu_crtc->page_flip_event); in ipu_crtc_handle_pageflip()
216 ipu_crtc->page_flip_event = NULL; in ipu_crtc_handle_pageflip()
217 imx_drm_crtc_vblank_put(ipu_crtc->imx_crtc); in ipu_crtc_handle_pageflip()
223 struct ipu_crtc *ipu_crtc = dev_id; in ipu_irq_handler() local
225 imx_drm_handle_vblank(ipu_crtc->imx_crtc); in ipu_irq_handler()
227 if (ipu_crtc->newfb) { in ipu_irq_handler()
228 struct ipu_plane *plane = ipu_crtc->plane[0]; in ipu_irq_handler()
230 ipu_crtc->newfb = NULL; in ipu_irq_handler()
231 ipu_plane_set_base(plane, ipu_crtc->base.primary->fb, in ipu_irq_handler()
233 ipu_crtc_handle_pageflip(ipu_crtc); in ipu_irq_handler()
243 struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc); in ipu_crtc_mode_fixup() local
249 ret = ipu_di_adjust_videomode(ipu_crtc->di, &vm); in ipu_crtc_mode_fixup()
260 struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc); in ipu_crtc_prepare() local
262 ipu_fb_disable(ipu_crtc); in ipu_crtc_prepare()
267 struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc); in ipu_crtc_commit() local
269 ipu_fb_enable(ipu_crtc); in ipu_crtc_commit()
287 struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc); in ipu_disable_vblank() local
289 ipu_crtc->page_flip_event = NULL; in ipu_disable_vblank()
290 ipu_crtc->newfb = NULL; in ipu_disable_vblank()
296 struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc); in ipu_set_interface_pix_fmt() local
298 ipu_crtc->bus_format = bus_format; in ipu_set_interface_pix_fmt()
299 ipu_crtc->di_hsync_pin = hsync_pin; in ipu_set_interface_pix_fmt()
300 ipu_crtc->di_vsync_pin = vsync_pin; in ipu_set_interface_pix_fmt()
313 static void ipu_put_resources(struct ipu_crtc *ipu_crtc) in ipu_put_resources() argument
315 if (!IS_ERR_OR_NULL(ipu_crtc->dc)) in ipu_put_resources()
316 ipu_dc_put(ipu_crtc->dc); in ipu_put_resources()
317 if (!IS_ERR_OR_NULL(ipu_crtc->di)) in ipu_put_resources()
318 ipu_di_put(ipu_crtc->di); in ipu_put_resources()
321 static int ipu_get_resources(struct ipu_crtc *ipu_crtc, in ipu_get_resources() argument
324 struct ipu_soc *ipu = dev_get_drvdata(ipu_crtc->dev->parent); in ipu_get_resources()
327 ipu_crtc->dc = ipu_dc_get(ipu, pdata->dc); in ipu_get_resources()
328 if (IS_ERR(ipu_crtc->dc)) { in ipu_get_resources()
329 ret = PTR_ERR(ipu_crtc->dc); in ipu_get_resources()
333 ipu_crtc->di = ipu_di_get(ipu, pdata->di); in ipu_get_resources()
334 if (IS_ERR(ipu_crtc->di)) { in ipu_get_resources()
335 ret = PTR_ERR(ipu_crtc->di); in ipu_get_resources()
341 ipu_put_resources(ipu_crtc); in ipu_get_resources()
346 static int ipu_crtc_init(struct ipu_crtc *ipu_crtc, in ipu_crtc_init() argument
349 struct ipu_soc *ipu = dev_get_drvdata(ipu_crtc->dev->parent); in ipu_crtc_init()
354 ret = ipu_get_resources(ipu_crtc, pdata); in ipu_crtc_init()
356 dev_err(ipu_crtc->dev, "getting resources failed with %d.\n", in ipu_crtc_init()
361 ret = imx_drm_add_crtc(drm, &ipu_crtc->base, &ipu_crtc->imx_crtc, in ipu_crtc_init()
362 &ipu_crtc_helper_funcs, ipu_crtc->dev->of_node); in ipu_crtc_init()
364 dev_err(ipu_crtc->dev, "adding crtc failed with %d.\n", ret); in ipu_crtc_init()
370 id = imx_drm_crtc_id(ipu_crtc->imx_crtc); in ipu_crtc_init()
371 ipu_crtc->plane[0] = ipu_plane_init(ipu_crtc->base.dev, ipu, in ipu_crtc_init()
373 ret = ipu_plane_get_resources(ipu_crtc->plane[0]); in ipu_crtc_init()
375 dev_err(ipu_crtc->dev, "getting plane 0 resources failed with %d.\n", in ipu_crtc_init()
382 ipu_crtc->plane[1] = ipu_plane_init(ipu_crtc->base.dev, ipu, in ipu_crtc_init()
386 if (IS_ERR(ipu_crtc->plane[1])) in ipu_crtc_init()
387 ipu_crtc->plane[1] = NULL; in ipu_crtc_init()
390 ipu_crtc->irq = ipu_plane_irq(ipu_crtc->plane[0]); in ipu_crtc_init()
391 ret = devm_request_irq(ipu_crtc->dev, ipu_crtc->irq, ipu_irq_handler, 0, in ipu_crtc_init()
392 "imx_drm", ipu_crtc); in ipu_crtc_init()
394 dev_err(ipu_crtc->dev, "irq request failed with %d.\n", ret); in ipu_crtc_init()
401 ipu_plane_put_resources(ipu_crtc->plane[0]); in ipu_crtc_init()
403 imx_drm_remove_crtc(ipu_crtc->imx_crtc); in ipu_crtc_init()
405 ipu_put_resources(ipu_crtc); in ipu_crtc_init()
436 struct ipu_crtc *ipu_crtc; in ipu_drm_bind() local
439 ipu_crtc = devm_kzalloc(dev, sizeof(*ipu_crtc), GFP_KERNEL); in ipu_drm_bind()
440 if (!ipu_crtc) in ipu_drm_bind()
443 ipu_crtc->dev = dev; in ipu_drm_bind()
445 ret = ipu_crtc_init(ipu_crtc, pdata, drm); in ipu_drm_bind()
449 dev_set_drvdata(dev, ipu_crtc); in ipu_drm_bind()
457 struct ipu_crtc *ipu_crtc = dev_get_drvdata(dev); in ipu_drm_unbind() local
459 imx_drm_remove_crtc(ipu_crtc->imx_crtc); in ipu_drm_unbind()
461 ipu_plane_put_resources(ipu_crtc->plane[0]); in ipu_drm_unbind()
462 ipu_put_resources(ipu_crtc); in ipu_drm_unbind()