aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/omapdrm
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2015-01-11 09:30:44 -0500
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2015-03-20 08:30:16 -0400
commitfb9a35f89fac2ca97597ce212439d2997f2caf7e (patch)
treee717f6973dc9f7e8769135827d6a7d71d16a05e9 /drivers/gpu/drm/omapdrm
parent222025e42d7f77133b8c3a2355d20a6004096c4b (diff)
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>
Diffstat (limited to 'drivers/gpu/drm/omapdrm')
-rw-r--r--drivers/gpu/drm/omapdrm/omap_drv.c76
-rw-r--r--drivers/gpu/drm/omapdrm/omap_plane.c2
2 files changed, 45 insertions, 33 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index 642748cb7a4e..021855605a1f 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -128,6 +128,29 @@ cleanup:
128 return r; 128 return r;
129} 129}
130 130
131static int omap_modeset_create_crtc(struct drm_device *dev, int id,
132 enum omap_channel channel)
133{
134 struct omap_drm_private *priv = dev->dev_private;
135 struct drm_plane *plane;
136 struct drm_crtc *crtc;
137
138 plane = omap_plane_init(dev, id, true);
139 if (IS_ERR(plane))
140 return PTR_ERR(plane);
141
142 crtc = omap_crtc_init(dev, plane, channel, id);
143
144 BUG_ON(priv->num_crtcs >= ARRAY_SIZE(priv->crtcs));
145 priv->crtcs[id] = crtc;
146 priv->num_crtcs++;
147
148 priv->planes[id] = plane;
149 priv->num_planes++;
150
151 return 0;
152}
153
131static int omap_modeset_init(struct drm_device *dev) 154static int omap_modeset_init(struct drm_device *dev)
132{ 155{
133 struct omap_drm_private *priv = dev->dev_private; 156 struct omap_drm_private *priv = dev->dev_private;
@@ -136,6 +159,7 @@ static int omap_modeset_init(struct drm_device *dev)
136 int num_mgrs = dss_feat_get_num_mgrs(); 159 int num_mgrs = dss_feat_get_num_mgrs();
137 int num_crtcs; 160 int num_crtcs;
138 int i, id = 0; 161 int i, id = 0;
162 int ret;
139 163
140 drm_mode_config_init(dev); 164 drm_mode_config_init(dev);
141 165
@@ -209,18 +233,13 @@ static int omap_modeset_init(struct drm_device *dev)
209 * allocated crtc, we create a new crtc for it 233 * allocated crtc, we create a new crtc for it
210 */ 234 */
211 if (!channel_used(dev, channel)) { 235 if (!channel_used(dev, channel)) {
212 struct drm_plane *plane; 236 ret = omap_modeset_create_crtc(dev, id, channel);
213 struct drm_crtc *crtc; 237 if (ret < 0) {
214 238 dev_err(dev->dev,
215 plane = omap_plane_init(dev, id, true); 239 "could not create CRTC (channel %u)\n",
216 crtc = omap_crtc_init(dev, plane, channel, id); 240 channel);
217 241 return ret;
218 BUG_ON(priv->num_crtcs >= ARRAY_SIZE(priv->crtcs)); 242 }
219 priv->crtcs[id] = crtc;
220 priv->num_crtcs++;
221
222 priv->planes[id] = plane;
223 priv->num_planes++;
224 243
225 id++; 244 id++;
226 } 245 }
@@ -234,26 +253,8 @@ static int omap_modeset_init(struct drm_device *dev)
234 253
235 /* find a free manager for this crtc */ 254 /* find a free manager for this crtc */
236 for (i = 0; i < num_mgrs; i++) { 255 for (i = 0; i < num_mgrs; i++) {
237 if (!channel_used(dev, i)) { 256 if (!channel_used(dev, i))
238 struct drm_plane *plane;
239 struct drm_crtc *crtc;
240
241 plane = omap_plane_init(dev, id, true);
242 crtc = omap_crtc_init(dev, plane, i, id);
243
244 BUG_ON(priv->num_crtcs >=
245 ARRAY_SIZE(priv->crtcs));
246
247 priv->crtcs[id] = crtc;
248 priv->num_crtcs++;
249
250 priv->planes[id] = plane;
251 priv->num_planes++;
252
253 break; 257 break;
254 } else {
255 continue;
256 }
257 } 258 }
258 259
259 if (i == num_mgrs) { 260 if (i == num_mgrs) {
@@ -261,13 +262,24 @@ static int omap_modeset_init(struct drm_device *dev)
261 dev_err(dev->dev, "no managers left for crtc\n"); 262 dev_err(dev->dev, "no managers left for crtc\n");
262 return -ENOMEM; 263 return -ENOMEM;
263 } 264 }
265
266 ret = omap_modeset_create_crtc(dev, id, i);
267 if (ret < 0) {
268 dev_err(dev->dev,
269 "could not create CRTC (channel %u)\n", i);
270 return ret;
271 }
264 } 272 }
265 273
266 /* 274 /*
267 * Create normal planes for the remaining overlays: 275 * Create normal planes for the remaining overlays:
268 */ 276 */
269 for (; id < num_ovls; id++) { 277 for (; id < num_ovls; id++) {
270 struct drm_plane *plane = omap_plane_init(dev, id, false); 278 struct drm_plane *plane;
279
280 plane = omap_plane_init(dev, id, false);
281 if (IS_ERR(plane))
282 return PTR_ERR(plane);
271 283
272 BUG_ON(priv->num_planes >= ARRAY_SIZE(priv->planes)); 284 BUG_ON(priv->num_planes >= ARRAY_SIZE(priv->planes));
273 priv->planes[priv->num_planes++] = plane; 285 priv->planes[priv->num_planes++] = plane;
diff --git a/drivers/gpu/drm/omapdrm/omap_plane.c b/drivers/gpu/drm/omapdrm/omap_plane.c
index a418fa7e5d0e..056ded8280f8 100644
--- a/drivers/gpu/drm/omapdrm/omap_plane.c
+++ b/drivers/gpu/drm/omapdrm/omap_plane.c
@@ -393,7 +393,7 @@ struct drm_plane *omap_plane_init(struct drm_device *dev,
393 393
394 omap_plane = kzalloc(sizeof(*omap_plane), GFP_KERNEL); 394 omap_plane = kzalloc(sizeof(*omap_plane), GFP_KERNEL);
395 if (!omap_plane) 395 if (!omap_plane)
396 return NULL; 396 return ERR_PTR(-ENOMEM);
397 397
398 drm_flip_work_init(&omap_plane->unpin_work, 398 drm_flip_work_init(&omap_plane->unpin_work,
399 "unpin", unpin_worker); 399 "unpin", unpin_worker);