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

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
...@@ -317,18 +317,12 @@ static int cdv_intel_lvds_get_modes(struct drm_connector *connector) ...@@ -317,18 +317,12 @@ static int cdv_intel_lvds_get_modes(struct drm_connector *connector)
return 0; 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) static void cdv_intel_lvds_destroy(struct drm_connector *connector)
{ {
struct gma_connector *gma_connector = to_gma_connector(connector); struct gma_connector *gma_connector = to_gma_connector(connector);
struct gma_encoder *gma_encoder = gma_attached_encoder(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); gma_i2c_destroy(gma_encoder->i2c_bus);
drm_connector_cleanup(connector); drm_connector_cleanup(connector);
kfree(gma_connector); kfree(gma_connector);
...@@ -487,8 +481,10 @@ void cdv_intel_lvds_init(struct drm_device *dev, ...@@ -487,8 +481,10 @@ void cdv_intel_lvds_init(struct drm_device *dev,
struct drm_display_mode *scan; struct drm_display_mode *scan;
struct drm_crtc *crtc; struct drm_crtc *crtc;
struct drm_psb_private *dev_priv = to_drm_psb_private(dev); struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
struct gma_i2c_chan *ddc_bus;
u32 lvds; u32 lvds;
int pipe; int pipe;
int ret;
u8 pin; u8 pin;
if (!dev_priv->lvds_enabled_in_vbt) if (!dev_priv->lvds_enabled_in_vbt)
...@@ -508,11 +504,11 @@ void cdv_intel_lvds_init(struct drm_device *dev, ...@@ -508,11 +504,11 @@ void cdv_intel_lvds_init(struct drm_device *dev,
gma_connector = kzalloc(sizeof(struct gma_connector), gma_connector = kzalloc(sizeof(struct gma_connector),
GFP_KERNEL); GFP_KERNEL);
if (!gma_connector) if (!gma_connector)
goto failed_connector; goto err_free_encoder;
lvds_priv = kzalloc(sizeof(struct cdv_intel_lvds_priv), GFP_KERNEL); lvds_priv = kzalloc(sizeof(struct cdv_intel_lvds_priv), GFP_KERNEL);
if (!lvds_priv) if (!lvds_priv)
goto failed_lvds_priv; goto err_free_connector;
gma_encoder->dev_priv = lvds_priv; gma_encoder->dev_priv = lvds_priv;
...@@ -521,12 +517,24 @@ void cdv_intel_lvds_init(struct drm_device *dev, ...@@ -521,12 +517,24 @@ void cdv_intel_lvds_init(struct drm_device *dev,
gma_connector->restore = cdv_intel_lvds_restore; gma_connector->restore = cdv_intel_lvds_restore;
encoder = &gma_encoder->base; 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, &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_connector_attach_encoder(gma_connector, gma_encoder);
gma_encoder->type = INTEL_OUTPUT_LVDS; gma_encoder->type = INTEL_OUTPUT_LVDS;
...@@ -554,7 +562,7 @@ void cdv_intel_lvds_init(struct drm_device *dev, ...@@ -554,7 +562,7 @@ void cdv_intel_lvds_init(struct drm_device *dev,
if (!gma_encoder->i2c_bus) { if (!gma_encoder->i2c_bus) {
dev_printk(KERN_ERR, dev_printk(KERN_ERR,
dev->dev, "I2C bus registration failed.\n"); dev->dev, "I2C bus registration failed.\n");
goto failed_blc_i2c; goto err_encoder_cleanup;
} }
gma_encoder->i2c_bus->slave_addr = 0x2C; gma_encoder->i2c_bus->slave_addr = 0x2C;
dev_priv->lvds_i2c_bus = gma_encoder->i2c_bus; dev_priv->lvds_i2c_bus = gma_encoder->i2c_bus;
...@@ -569,21 +577,13 @@ void cdv_intel_lvds_init(struct drm_device *dev, ...@@ -569,21 +577,13 @@ void cdv_intel_lvds_init(struct drm_device *dev,
* if closed, act like it's not there for now * 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 * Attempt to get the fixed panel mode from DDC. Assume that the
* preferred mode is the right one. * preferred mode is the right one.
*/ */
mutex_lock(&dev->mode_config.mutex); mutex_lock(&dev->mode_config.mutex);
psb_intel_ddc_get_modes(connector, psb_intel_ddc_get_modes(connector, &ddc_bus->base);
&gma_encoder->ddc_bus->base);
list_for_each_entry(scan, &connector->probed_modes, head) { list_for_each_entry(scan, &connector->probed_modes, head) {
if (scan->type & DRM_MODE_TYPE_PREFERRED) { if (scan->type & DRM_MODE_TYPE_PREFERRED) {
mode_dev->panel_fixed_mode = mode_dev->panel_fixed_mode =
...@@ -625,7 +625,7 @@ void cdv_intel_lvds_init(struct drm_device *dev, ...@@ -625,7 +625,7 @@ void cdv_intel_lvds_init(struct drm_device *dev,
if (!mode_dev->panel_fixed_mode) { if (!mode_dev->panel_fixed_mode) {
DRM_DEBUG DRM_DEBUG
("Found no modes on the lvds, ignoring the LVDS\n"); ("Found no modes on the lvds, ignoring the LVDS\n");
goto failed_find; goto err_unlock;
} }
/* setup PWM */ /* setup PWM */
...@@ -645,20 +645,19 @@ void cdv_intel_lvds_init(struct drm_device *dev, ...@@ -645,20 +645,19 @@ void cdv_intel_lvds_init(struct drm_device *dev,
mutex_unlock(&dev->mode_config.mutex); mutex_unlock(&dev->mode_config.mutex);
return; return;
failed_find: err_unlock:
mutex_unlock(&dev->mode_config.mutex); 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); gma_i2c_destroy(gma_encoder->i2c_bus);
failed_blc_i2c: err_encoder_cleanup:
pr_err("Failed BLC\n");
drm_encoder_cleanup(encoder); drm_encoder_cleanup(encoder);
err_connector_cleanup:
drm_connector_cleanup(connector); drm_connector_cleanup(connector);
err_destroy_ddc:
gma_i2c_destroy(ddc_bus);
err_free_lvds_priv:
kfree(lvds_priv); kfree(lvds_priv);
failed_lvds_priv: err_free_connector:
kfree(gma_connector); kfree(gma_connector);
failed_connector: err_free_encoder:
kfree(gma_encoder); kfree(gma_encoder);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment