Merge tag 'please-pull-fix-ia64-warnings' of git://git.kernel.org/pub/scm/linux/kerne...
[cascardo/linux.git] / drivers / gpu / drm / omapdrm / omap_drv.c
index 826586f..a3004f1 100644 (file)
@@ -65,10 +65,8 @@ static int get_connector_type(struct omap_dss_device *dssdev)
        switch (dssdev->type) {
        case OMAP_DISPLAY_TYPE_HDMI:
                return DRM_MODE_CONNECTOR_HDMIA;
-       case OMAP_DISPLAY_TYPE_DPI:
-               if (!strcmp(dssdev->name, "dvi"))
-                       return DRM_MODE_CONNECTOR_DVID;
-               /* fallthrough */
+       case OMAP_DISPLAY_TYPE_DVI:
+               return DRM_MODE_CONNECTOR_DVID;
        default:
                return DRM_MODE_CONNECTOR_Unknown;
        }
@@ -97,6 +95,9 @@ 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 r;
+
+       omap_crtc_pre_init();
 
        drm_mode_config_init(dev);
 
@@ -116,6 +117,7 @@ static int omap_modeset_init(struct drm_device *dev)
                struct drm_connector *connector;
                struct drm_encoder *encoder;
                enum omap_channel channel;
+               struct omap_overlay_manager *mgr;
 
                if (!dssdev->driver) {
                        dev_warn(dev->dev, "%s has no driver.. skipping it\n",
@@ -131,6 +133,13 @@ static int omap_modeset_init(struct drm_device *dev)
                        continue;
                }
 
+               r = dssdev->driver->connect(dssdev);
+               if (r) {
+                       dev_err(dev->dev, "could not connect display: %s\n",
+                                       dssdev->name);
+                       continue;
+               }
+
                encoder = omap_encoder_init(dev, dssdev);
 
                if (!encoder) {
@@ -172,8 +181,9 @@ static int omap_modeset_init(struct drm_device *dev)
                 * other possible channels to which the encoder can connect are
                 * not considered.
                 */
-               channel = dssdev->output->dispc_channel;
 
+               mgr = omapdss_find_mgr_from_display(dssdev);
+               channel = mgr->id;
                /*
                 * if this channel hasn't already been taken by a previously
                 * allocated crtc, we create a new crtc for it
@@ -247,6 +257,9 @@ static int omap_modeset_init(struct drm_device *dev)
                struct drm_encoder *encoder = priv->encoders[i];
                struct omap_dss_device *dssdev =
                                        omap_encoder_get_dssdev(encoder);
+               struct omap_dss_device *output;
+
+               output = omapdss_find_output_from_display(dssdev);
 
                /* figure out which crtc's we can connect the encoder to: */
                encoder->possible_crtcs = 0;
@@ -259,9 +272,11 @@ static int omap_modeset_init(struct drm_device *dev)
                        supported_outputs =
                                dss_feat_get_supported_outputs(crtc_channel);
 
-                       if (supported_outputs & dssdev->output->id)
+                       if (supported_outputs & output->id)
                                encoder->possible_crtcs |= (1 << id);
                }
+
+               omap_dss_put_device(output);
        }
 
        DBG("registered %d planes, %d crtcs, %d encoders and %d connectors\n",