]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/gma500/oaktrail_lvds.c
drm/gma500: add support for atom e6xx lpc lvds i2c
[karo-tx-linux.git] / drivers / gpu / drm / gma500 / oaktrail_lvds.c
index 0d39da6e8b7a0627d7923d70b795a3f31db69e04..83bbc271bcfb5e92e1321a5a5842ea1fab26830a 100644 (file)
@@ -359,22 +359,26 @@ void oaktrail_lvds_init(struct drm_device *dev,
         *    if closed, act like it's not there for now
         */
 
+       edid = NULL;
        mutex_lock(&dev->mode_config.mutex);
        i2c_adap = i2c_get_adapter(dev_priv->ops->i2c_bus);
-       if (i2c_adap == NULL)
-               dev_err(dev->dev, "No ddc adapter available!\n");
+       if (i2c_adap)
+               edid = drm_get_edid(connector, i2c_adap);
+       if (edid == NULL && dev_priv->lpc_gpio_base) {
+               oaktrail_lvds_i2c_init(encoder);
+               if (gma_encoder->ddc_bus != NULL) {
+                       i2c_adap = &gma_encoder->ddc_bus->adapter;
+                       edid = drm_get_edid(connector, i2c_adap);
+               }
+       }
        /*
         * Attempt to get the fixed panel mode from DDC.  Assume that the
         * preferred mode is the right one.
         */
-       if (i2c_adap) {
-               edid = drm_get_edid(connector, i2c_adap);
-               if (edid) {
-                       drm_mode_connector_update_edid_property(connector,
-                                                                       edid);
-                       drm_add_edid_modes(connector, edid);
-                       kfree(edid);
-               }
+       if (edid) {
+               drm_mode_connector_update_edid_property(connector, edid);
+               drm_add_edid_modes(connector, edid);
+               kfree(edid);
 
                list_for_each_entry(scan, &connector->probed_modes, head) {
                        if (scan->type & DRM_MODE_TYPE_PREFERRED) {
@@ -383,7 +387,8 @@ void oaktrail_lvds_init(struct drm_device *dev,
                                goto out;       /* FIXME: check for quirks */
                        }
                }
-       }
+       } else
+               dev_err(dev->dev, "No ddc adapter available!\n");
        /*
         * If we didn't get EDID, try geting panel timing
         * from configuration data
@@ -411,8 +416,10 @@ failed_find:
        mutex_unlock(&dev->mode_config.mutex);
 
        dev_dbg(dev->dev, "No LVDS modes found, disabling.\n");
-       if (gma_encoder->ddc_bus)
+       if (gma_encoder->ddc_bus) {
                psb_intel_i2c_destroy(gma_encoder->ddc_bus);
+               gma_encoder->ddc_bus = NULL;
+       }
 
 /* failed_ddc: */