/* initialize plane */ struct drm_plane *mdp4_plane_init(struct drm_device *dev, enum mpd4_pipe pipe_id, bool private_plane) { struct msm_drm_private *priv = dev->dev_private; struct drm_plane *plane = NULL; struct mdp4_plane *mdp4_plane; int ret; mdp4_plane = kzalloc(sizeof(*mdp4_plane), GFP_KERNEL); if (!mdp4_plane) { ret = -ENOMEM; goto fail; } plane = &mdp4_plane->base; mdp4_plane->pipe = pipe_id; mdp4_plane->name = pipe_names[pipe_id]; drm_plane_init(dev, plane, (1 << priv->num_crtcs) - 1, &mdp4_plane_funcs, mdp4_plane->formats, mdp4_plane->nformats, private_plane); mdp4_plane_install_properties(plane, &plane->base); return plane; fail: if (plane) mdp4_plane_destroy(plane); return ERR_PTR(ret); }
/* initialize plane */ struct drm_plane *mdp4_plane_init(struct drm_device *dev, enum mdp4_pipe pipe_id, bool private_plane) { struct drm_plane *plane = NULL; struct mdp4_plane *mdp4_plane; int ret; mdp4_plane = kzalloc(sizeof(*mdp4_plane), GFP_KERNEL); if (!mdp4_plane) { ret = -ENOMEM; goto fail; } plane = &mdp4_plane->base; mdp4_plane->pipe = pipe_id; mdp4_plane->name = pipe_names[pipe_id]; mdp4_plane->nformats = mdp4_get_formats(pipe_id, mdp4_plane->formats, ARRAY_SIZE(mdp4_plane->formats)); drm_plane_init(dev, plane, 0xff, &mdp4_plane_funcs, mdp4_plane->formats, mdp4_plane->nformats, private_plane); mdp4_plane_install_properties(plane, &plane->base); return plane; fail: if (plane) mdp4_plane_destroy(plane); return ERR_PTR(ret); }
/* initialize crtc */ struct drm_crtc *mdp4_crtc_init(struct drm_device *dev, struct drm_plane *plane, int id, int ovlp_id, enum mdp4_dma dma_id) { struct drm_crtc *crtc = NULL; struct mdp4_crtc *mdp4_crtc; int ret; mdp4_crtc = kzalloc(sizeof(*mdp4_crtc), GFP_KERNEL); if (!mdp4_crtc) { ret = -ENOMEM; goto fail; } crtc = &mdp4_crtc->base; mdp4_crtc->plane = plane; mdp4_crtc->id = id; mdp4_crtc->ovlp = ovlp_id; mdp4_crtc->dma = dma_id; mdp4_crtc->vblank.irqmask = dma2irq(mdp4_crtc->dma); mdp4_crtc->vblank.irq = mdp4_crtc_vblank_irq; mdp4_crtc->err.irqmask = dma2err(mdp4_crtc->dma); mdp4_crtc->err.irq = mdp4_crtc_err_irq; snprintf(mdp4_crtc->name, sizeof(mdp4_crtc->name), "%s:%d", dma_names[dma_id], ovlp_id); spin_lock_init(&mdp4_crtc->cursor.lock); ret = drm_flip_work_init(&mdp4_crtc->unref_fb_work, 16, "unref fb", unref_fb_worker); if (ret) goto fail; ret = drm_flip_work_init(&mdp4_crtc->unref_cursor_work, 64, "unref cursor", unref_cursor_worker); INIT_FENCE_CB(&mdp4_crtc->pageflip_cb, pageflip_cb); drm_crtc_init_with_planes(dev, crtc, plane, NULL, &mdp4_crtc_funcs); drm_crtc_helper_add(crtc, &mdp4_crtc_helper_funcs); mdp4_plane_install_properties(mdp4_crtc->plane, &crtc->base); return crtc; fail: if (crtc) mdp4_crtc_destroy(crtc); return ERR_PTR(ret); }
/* initialize plane */ struct drm_plane *mdp4_plane_init(struct drm_device *dev, enum mdp4_pipe pipe_id, bool private_plane) { struct drm_plane *plane = NULL; struct mdp4_plane *mdp4_plane; int ret; enum drm_plane_type type; mdp4_plane = kzalloc(sizeof(*mdp4_plane), GFP_KERNEL); if (!mdp4_plane) { ret = -ENOMEM; goto fail; } plane = &mdp4_plane->base; mdp4_plane->pipe = pipe_id; mdp4_plane->name = pipe_names[pipe_id]; mdp4_plane->caps = mdp4_pipe_caps(pipe_id); mdp4_plane->nformats = mdp_get_formats(mdp4_plane->formats, ARRAY_SIZE(mdp4_plane->formats), !pipe_supports_yuv(mdp4_plane->caps)); type = private_plane ? DRM_PLANE_TYPE_PRIMARY : DRM_PLANE_TYPE_OVERLAY; ret = drm_universal_plane_init(dev, plane, 0xff, &mdp4_plane_funcs, mdp4_plane->formats, mdp4_plane->nformats, type, NULL); if (ret) goto fail; drm_plane_helper_add(plane, &mdp4_plane_helper_funcs); mdp4_plane_install_properties(plane, &plane->base); return plane; fail: if (plane) mdp4_plane_destroy(plane); return ERR_PTR(ret); }