diff options
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_crtc.c')
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_crtc.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c index 4f03f74685f0..dccd03726796 100644 --- a/drivers/gpu/drm/omapdrm/omap_crtc.c +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c | |||
@@ -573,6 +573,8 @@ static const char *channel_names[] = { | |||
573 | 573 | ||
574 | void omap_crtc_pre_init(void) | 574 | void omap_crtc_pre_init(void) |
575 | { | 575 | { |
576 | memset(omap_crtcs, 0, sizeof(omap_crtcs)); | ||
577 | |||
576 | dss_install_mgr_ops(&mgr_ops); | 578 | dss_install_mgr_ops(&mgr_ops); |
577 | } | 579 | } |
578 | 580 | ||
@@ -583,18 +585,28 @@ void omap_crtc_pre_uninit(void) | |||
583 | 585 | ||
584 | /* initialize crtc */ | 586 | /* initialize crtc */ |
585 | struct drm_crtc *omap_crtc_init(struct drm_device *dev, | 587 | struct drm_crtc *omap_crtc_init(struct drm_device *dev, |
586 | struct drm_plane *plane, enum omap_channel channel, int id) | 588 | struct drm_plane *plane, struct omap_dss_device *dssdev) |
587 | { | 589 | { |
588 | struct omap_drm_private *priv = dev->dev_private; | 590 | struct omap_drm_private *priv = dev->dev_private; |
589 | struct drm_crtc *crtc = NULL; | 591 | struct drm_crtc *crtc = NULL; |
590 | struct omap_crtc *omap_crtc; | 592 | struct omap_crtc *omap_crtc; |
593 | enum omap_channel channel; | ||
594 | struct omap_dss_device *out; | ||
591 | int ret; | 595 | int ret; |
592 | 596 | ||
597 | out = omapdss_find_output_from_display(dssdev); | ||
598 | channel = out->dispc_channel; | ||
599 | omap_dss_put_device(out); | ||
600 | |||
593 | DBG("%s", channel_names[channel]); | 601 | DBG("%s", channel_names[channel]); |
594 | 602 | ||
603 | /* Multiple displays on same channel is not allowed */ | ||
604 | if (WARN_ON(omap_crtcs[channel] != NULL)) | ||
605 | return ERR_PTR(-EINVAL); | ||
606 | |||
595 | omap_crtc = kzalloc(sizeof(*omap_crtc), GFP_KERNEL); | 607 | omap_crtc = kzalloc(sizeof(*omap_crtc), GFP_KERNEL); |
596 | if (!omap_crtc) | 608 | if (!omap_crtc) |
597 | return NULL; | 609 | return ERR_PTR(-ENOMEM); |
598 | 610 | ||
599 | crtc = &omap_crtc->base; | 611 | crtc = &omap_crtc->base; |
600 | 612 | ||
@@ -606,8 +618,10 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev, | |||
606 | ret = drm_crtc_init_with_planes(dev, crtc, plane, NULL, | 618 | ret = drm_crtc_init_with_planes(dev, crtc, plane, NULL, |
607 | &omap_crtc_funcs, NULL); | 619 | &omap_crtc_funcs, NULL); |
608 | if (ret < 0) { | 620 | if (ret < 0) { |
621 | dev_err(dev->dev, "%s(): could not init crtc for: %s\n", | ||
622 | __func__, dssdev->name); | ||
609 | kfree(omap_crtc); | 623 | kfree(omap_crtc); |
610 | return NULL; | 624 | return ERR_PTR(ret); |
611 | } | 625 | } |
612 | 626 | ||
613 | drm_crtc_helper_add(crtc, &omap_crtc_helper_funcs); | 627 | drm_crtc_helper_add(crtc, &omap_crtc_helper_funcs); |