]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/gma500: Make cdv lvds use ddc adapter from drm_connector
authorPatrik Jakobsson <patrik.r.jakobsson@gmail.com>
Wed, 1 Jun 2022 09:23:06 +0000 (11:23 +0200)
committerPatrik Jakobsson <patrik.r.jakobsson@gmail.com>
Thu, 2 Jun 2022 08:06:28 +0000 (10:06 +0200)
We're moving all uses of ddc_bus to drm_connector where they belong.
Also, add missing call to destroy ddc bus when destroying the connector
and cleanup the error handling in cdv_intel_lvds_init().

Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20220601092311.22648-4-patrik.r.jakobsson@gmail.com
drivers/gpu/drm/gma500/cdv_intel_lvds.c

index d76c3ecc951ce019f27b9176854e55a8ed182f7a..846ce15460300654a5045151b62a06615a278b8d 100644 (file)
@@ -317,18 +317,12 @@ static int cdv_intel_lvds_get_modes(struct drm_connector *connector)
        return 0;
 }
 
-/**
- * cdv_intel_lvds_destroy - unregister and free LVDS structures
- * @connector: connector to free
- *
- * Unregister the DDC bus for this connector then free the driver private
- * structure.
- */
 static void cdv_intel_lvds_destroy(struct drm_connector *connector)
 {
        struct gma_connector *gma_connector = to_gma_connector(connector);
        struct gma_encoder *gma_encoder = gma_attached_encoder(connector);
 
+       gma_i2c_destroy(to_gma_i2c_chan(connector->ddc));
        gma_i2c_destroy(gma_encoder->i2c_bus);
        drm_connector_cleanup(connector);
        kfree(gma_connector);
@@ -487,8 +481,10 @@ void cdv_intel_lvds_init(struct drm_device *dev,
        struct drm_display_mode *scan;
        struct drm_crtc *crtc;
        struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
+       struct gma_i2c_chan *ddc_bus;
        u32 lvds;
        int pipe;
+       int ret;
        u8 pin;
 
        if (!dev_priv->lvds_enabled_in_vbt)
@@ -508,11 +504,11 @@ void cdv_intel_lvds_init(struct drm_device *dev,
        gma_connector = kzalloc(sizeof(struct gma_connector),
                                      GFP_KERNEL);
        if (!gma_connector)
-               goto failed_connector;
+               goto err_free_encoder;
 
        lvds_priv = kzalloc(sizeof(struct cdv_intel_lvds_priv), GFP_KERNEL);
        if (!lvds_priv)
-               goto failed_lvds_priv;
+               goto err_free_connector;
 
        gma_encoder->dev_priv = lvds_priv;
 
@@ -521,12 +517,24 @@ void cdv_intel_lvds_init(struct drm_device *dev,
        gma_connector->restore = cdv_intel_lvds_restore;
        encoder = &gma_encoder->base;
 
+       /* Set up the DDC bus. */
+       ddc_bus = gma_i2c_create(dev, GPIOC, "LVDSDDC_C");
+       if (!ddc_bus) {
+               dev_printk(KERN_ERR, dev->dev,
+                          "DDC bus registration " "failed.\n");
+               goto err_free_lvds_priv;
+       }
 
-       drm_connector_init(dev, connector,
-                          &cdv_intel_lvds_connector_funcs,
-                          DRM_MODE_CONNECTOR_LVDS);
+       ret = drm_connector_init_with_ddc(dev, connector,
+                                         &cdv_intel_lvds_connector_funcs,
+                                         DRM_MODE_CONNECTOR_LVDS,
+                                         &ddc_bus->base);
+       if (ret)
+               goto err_destroy_ddc;
 
-       drm_simple_encoder_init(dev, encoder, DRM_MODE_ENCODER_LVDS);
+       ret = drm_simple_encoder_init(dev, encoder, DRM_MODE_ENCODER_LVDS);
+       if (ret)
+               goto err_connector_cleanup;
 
        gma_connector_attach_encoder(gma_connector, gma_encoder);
        gma_encoder->type = INTEL_OUTPUT_LVDS;
@@ -554,7 +562,7 @@ void cdv_intel_lvds_init(struct drm_device *dev,
        if (!gma_encoder->i2c_bus) {
                dev_printk(KERN_ERR,
                        dev->dev, "I2C bus registration failed.\n");
-               goto failed_blc_i2c;
+               goto err_encoder_cleanup;
        }
        gma_encoder->i2c_bus->slave_addr = 0x2C;
        dev_priv->lvds_i2c_bus = gma_encoder->i2c_bus;
@@ -569,21 +577,13 @@ void cdv_intel_lvds_init(struct drm_device *dev,
         *    if closed, act like it's not there for now
         */
 
-       /* Set up the DDC bus. */
-       gma_encoder->ddc_bus = gma_i2c_create(dev, GPIOC, "LVDSDDC_C");
-       if (!gma_encoder->ddc_bus) {
-               dev_printk(KERN_ERR, dev->dev,
-                          "DDC bus registration " "failed.\n");
-               goto failed_ddc;
-       }
-
        /*
         * Attempt to get the fixed panel mode from DDC.  Assume that the
         * preferred mode is the right one.
         */
        mutex_lock(&dev->mode_config.mutex);
-       psb_intel_ddc_get_modes(connector,
-                               &gma_encoder->ddc_bus->base);
+       psb_intel_ddc_get_modes(connector, &ddc_bus->base);
+
        list_for_each_entry(scan, &connector->probed_modes, head) {
                if (scan->type & DRM_MODE_TYPE_PREFERRED) {
                        mode_dev->panel_fixed_mode =
@@ -625,7 +625,7 @@ void cdv_intel_lvds_init(struct drm_device *dev,
        if (!mode_dev->panel_fixed_mode) {
                DRM_DEBUG
                        ("Found no modes on the lvds, ignoring the LVDS\n");
-               goto failed_find;
+               goto err_unlock;
        }
 
        /* setup PWM */
@@ -645,20 +645,19 @@ out:
        mutex_unlock(&dev->mode_config.mutex);
        return;
 
-failed_find:
+err_unlock:
        mutex_unlock(&dev->mode_config.mutex);
-       pr_err("Failed find\n");
-       gma_i2c_destroy(gma_encoder->ddc_bus);
-failed_ddc:
-       pr_err("Failed DDC\n");
        gma_i2c_destroy(gma_encoder->i2c_bus);
-failed_blc_i2c:
-       pr_err("Failed BLC\n");
+err_encoder_cleanup:
        drm_encoder_cleanup(encoder);
+err_connector_cleanup:
        drm_connector_cleanup(connector);
+err_destroy_ddc:
+       gma_i2c_destroy(ddc_bus);
+err_free_lvds_priv:
        kfree(lvds_priv);
-failed_lvds_priv:
+err_free_connector:
        kfree(gma_connector);
-failed_connector:
+err_free_encoder:
        kfree(gma_encoder);
 }