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