drm: omapdrm: Refactor CRTC creation code
Create a omap_modeset_create_crtc() function to avoid duplicating plane and CRTC creation code. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Родитель
222025e42d
Коммит
fb9a35f89f
|
@ -128,6 +128,29 @@ cleanup:
|
|||
return r;
|
||||
}
|
||||
|
||||
static int omap_modeset_create_crtc(struct drm_device *dev, int id,
|
||||
enum omap_channel channel)
|
||||
{
|
||||
struct omap_drm_private *priv = dev->dev_private;
|
||||
struct drm_plane *plane;
|
||||
struct drm_crtc *crtc;
|
||||
|
||||
plane = omap_plane_init(dev, id, true);
|
||||
if (IS_ERR(plane))
|
||||
return PTR_ERR(plane);
|
||||
|
||||
crtc = omap_crtc_init(dev, plane, channel, id);
|
||||
|
||||
BUG_ON(priv->num_crtcs >= ARRAY_SIZE(priv->crtcs));
|
||||
priv->crtcs[id] = crtc;
|
||||
priv->num_crtcs++;
|
||||
|
||||
priv->planes[id] = plane;
|
||||
priv->num_planes++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int omap_modeset_init(struct drm_device *dev)
|
||||
{
|
||||
struct omap_drm_private *priv = dev->dev_private;
|
||||
|
@ -136,6 +159,7 @@ static int omap_modeset_init(struct drm_device *dev)
|
|||
int num_mgrs = dss_feat_get_num_mgrs();
|
||||
int num_crtcs;
|
||||
int i, id = 0;
|
||||
int ret;
|
||||
|
||||
drm_mode_config_init(dev);
|
||||
|
||||
|
@ -209,18 +233,13 @@ static int omap_modeset_init(struct drm_device *dev)
|
|||
* allocated crtc, we create a new crtc for it
|
||||
*/
|
||||
if (!channel_used(dev, channel)) {
|
||||
struct drm_plane *plane;
|
||||
struct drm_crtc *crtc;
|
||||
|
||||
plane = omap_plane_init(dev, id, true);
|
||||
crtc = omap_crtc_init(dev, plane, channel, id);
|
||||
|
||||
BUG_ON(priv->num_crtcs >= ARRAY_SIZE(priv->crtcs));
|
||||
priv->crtcs[id] = crtc;
|
||||
priv->num_crtcs++;
|
||||
|
||||
priv->planes[id] = plane;
|
||||
priv->num_planes++;
|
||||
ret = omap_modeset_create_crtc(dev, id, channel);
|
||||
if (ret < 0) {
|
||||
dev_err(dev->dev,
|
||||
"could not create CRTC (channel %u)\n",
|
||||
channel);
|
||||
return ret;
|
||||
}
|
||||
|
||||
id++;
|
||||
}
|
||||
|
@ -234,26 +253,8 @@ static int omap_modeset_init(struct drm_device *dev)
|
|||
|
||||
/* find a free manager for this crtc */
|
||||
for (i = 0; i < num_mgrs; i++) {
|
||||
if (!channel_used(dev, i)) {
|
||||
struct drm_plane *plane;
|
||||
struct drm_crtc *crtc;
|
||||
|
||||
plane = omap_plane_init(dev, id, true);
|
||||
crtc = omap_crtc_init(dev, plane, i, id);
|
||||
|
||||
BUG_ON(priv->num_crtcs >=
|
||||
ARRAY_SIZE(priv->crtcs));
|
||||
|
||||
priv->crtcs[id] = crtc;
|
||||
priv->num_crtcs++;
|
||||
|
||||
priv->planes[id] = plane;
|
||||
priv->num_planes++;
|
||||
|
||||
if (!channel_used(dev, i))
|
||||
break;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == num_mgrs) {
|
||||
|
@ -261,13 +262,24 @@ static int omap_modeset_init(struct drm_device *dev)
|
|||
dev_err(dev->dev, "no managers left for crtc\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ret = omap_modeset_create_crtc(dev, id, i);
|
||||
if (ret < 0) {
|
||||
dev_err(dev->dev,
|
||||
"could not create CRTC (channel %u)\n", i);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Create normal planes for the remaining overlays:
|
||||
*/
|
||||
for (; id < num_ovls; id++) {
|
||||
struct drm_plane *plane = omap_plane_init(dev, id, false);
|
||||
struct drm_plane *plane;
|
||||
|
||||
plane = omap_plane_init(dev, id, false);
|
||||
if (IS_ERR(plane))
|
||||
return PTR_ERR(plane);
|
||||
|
||||
BUG_ON(priv->num_planes >= ARRAY_SIZE(priv->planes));
|
||||
priv->planes[priv->num_planes++] = plane;
|
||||
|
|
|
@ -393,7 +393,7 @@ struct drm_plane *omap_plane_init(struct drm_device *dev,
|
|||
|
||||
omap_plane = kzalloc(sizeof(*omap_plane), GFP_KERNEL);
|
||||
if (!omap_plane)
|
||||
return NULL;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
drm_flip_work_init(&omap_plane->unpin_work,
|
||||
"unpin", unpin_worker);
|
||||
|
|
Загрузка…
Ссылка в новой задаче