Commit 368eb57a authored by Patrik Jakobsson's avatar Patrik Jakobsson
Browse files

drm/gma500: Make cdv lvds use ddc adapter from drm_connector



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: default avatarPatrik Jakobsson <patrik.r.jakobsson@gmail.com>
Acked-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20220601092311.22648-4-patrik.r.jakobsson@gmail.com
parent ba1677f7
Loading
Loading
Loading
Loading
+33 −34
Original line number Diff line number Diff line
@@ -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,
	ret = drm_connector_init_with_ddc(dev, connector,
					  &cdv_intel_lvds_connector_funcs,
			   DRM_MODE_CONNECTOR_LVDS);
					  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 @@ void cdv_intel_lvds_init(struct drm_device *dev,
	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);
}