drm/ast: Fail probing if DDC channel could not be initialized
authorThomas Zimmermann <tzimmermann@suse.de>
Mon, 25 Mar 2024 20:06:47 +0000 (21:06 +0100)
committerThomas Zimmermann <tzimmermann@suse.de>
Tue, 2 Apr 2024 08:40:44 +0000 (10:40 +0200)
Expect the hardware to provide a DDC channel. Fail probing if its
initialization fails. Failing to initialize the DDC indicates a
larger problem, so there's no point in continuing.

v4:
* give a rational in the commit message

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240325200855.21150-3-tzimmermann@suse.de
drivers/gpu/drm/ast/ast_drv.h
drivers/gpu/drm/ast/ast_i2c.c
drivers/gpu/drm/ast/ast_mode.c

index 3be5ccf1f5f4d5d32ee9f8f18e147a65b90b32a5..cb0e4f332be80cae6d4ef7d0890bbed375db56f7 100644 (file)
@@ -160,7 +160,6 @@ struct ast_i2c_chan {
 
 struct ast_vga_connector {
        struct drm_connector base;
-       struct ast_i2c_chan *i2c;
 };
 
 static inline struct ast_vga_connector *
@@ -171,7 +170,6 @@ to_ast_vga_connector(struct drm_connector *connector)
 
 struct ast_sil164_connector {
        struct drm_connector base;
-       struct ast_i2c_chan *i2c;
 };
 
 static inline struct ast_sil164_connector *
index e5d3f7121de4206f4d1af450e450411e349eb1d8..c3046223a49194de09a834e8b0b9d6a09698899f 100644 (file)
@@ -117,7 +117,7 @@ struct ast_i2c_chan *ast_i2c_create(struct drm_device *dev)
 
        i2c = kzalloc(sizeof(struct ast_i2c_chan), GFP_KERNEL);
        if (!i2c)
-               return NULL;
+               return ERR_PTR(-ENOMEM);
 
        i2c->adapter.owner = THIS_MODULE;
        i2c->adapter.dev.parent = dev->dev;
@@ -142,10 +142,11 @@ struct ast_i2c_chan *ast_i2c_create(struct drm_device *dev)
 
        ret = drmm_add_action_or_reset(dev, ast_i2c_release, i2c);
        if (ret)
-               return NULL;
+               return ERR_PTR(ret);
+
        return i2c;
 
 out_kfree:
        kfree(i2c);
-       return NULL;
+       return ERR_PTR(ret);
 }
index a718646a66b8fd519b255783204bd0ca77228e33..38c31a7283a6904a2c7a0b6752135b4ab089137e 100644 (file)
@@ -1345,22 +1345,18 @@ static int ast_crtc_init(struct drm_device *dev)
 
 static int ast_vga_connector_helper_get_modes(struct drm_connector *connector)
 {
-       struct ast_vga_connector *ast_vga_connector = to_ast_vga_connector(connector);
        struct drm_device *dev = connector->dev;
        struct ast_device *ast = to_ast_device(dev);
        struct edid *edid;
        int count;
 
-       if (!ast_vga_connector->i2c)
-               goto err_drm_connector_update_edid_property;
-
        /*
         * Protect access to I/O registers from concurrent modesetting
         * by acquiring the I/O-register lock.
         */
        mutex_lock(&ast->modeset_lock);
 
-       edid = drm_get_edid(connector, &ast_vga_connector->i2c->adapter);
+       edid = drm_get_edid(connector, connector->ddc);
        if (!edid)
                goto err_mutex_unlock;
 
@@ -1373,7 +1369,6 @@ static int ast_vga_connector_helper_get_modes(struct drm_connector *connector)
 
 err_mutex_unlock:
        mutex_unlock(&ast->modeset_lock);
-err_drm_connector_update_edid_property:
        drm_connector_update_edid_property(connector, NULL);
        return 0;
 }
@@ -1394,19 +1389,18 @@ static int ast_vga_connector_init(struct drm_device *dev,
                                  struct ast_vga_connector *ast_vga_connector)
 {
        struct drm_connector *connector = &ast_vga_connector->base;
+       struct ast_i2c_chan *i2c;
        int ret;
 
-       ast_vga_connector->i2c = ast_i2c_create(dev);
-       if (!ast_vga_connector->i2c)
-               drm_err(dev, "failed to add ddc bus for connector\n");
+       i2c = ast_i2c_create(dev);
+       if (IS_ERR(i2c)) {
+               ret = PTR_ERR(i2c);
+               drm_err(dev, "failed to add ddc bus for connector; ret=%d\n", ret);
+               return ret;
+       }
 
-       if (ast_vga_connector->i2c)
-               ret = drm_connector_init_with_ddc(dev, connector, &ast_vga_connector_funcs,
-                                                 DRM_MODE_CONNECTOR_VGA,
-                                                 &ast_vga_connector->i2c->adapter);
-       else
-               ret = drm_connector_init(dev, connector, &ast_vga_connector_funcs,
-                                        DRM_MODE_CONNECTOR_VGA);
+       ret = drm_connector_init_with_ddc(dev, connector, &ast_vga_connector_funcs,
+                                         DRM_MODE_CONNECTOR_VGA, &i2c->adapter);
        if (ret)
                return ret;
 
@@ -1451,22 +1445,18 @@ static int ast_vga_output_init(struct ast_device *ast)
 
 static int ast_sil164_connector_helper_get_modes(struct drm_connector *connector)
 {
-       struct ast_sil164_connector *ast_sil164_connector = to_ast_sil164_connector(connector);
        struct drm_device *dev = connector->dev;
        struct ast_device *ast = to_ast_device(dev);
        struct edid *edid;
        int count;
 
-       if (!ast_sil164_connector->i2c)
-               goto err_drm_connector_update_edid_property;
-
        /*
         * Protect access to I/O registers from concurrent modesetting
         * by acquiring the I/O-register lock.
         */
        mutex_lock(&ast->modeset_lock);
 
-       edid = drm_get_edid(connector, &ast_sil164_connector->i2c->adapter);
+       edid = drm_get_edid(connector, connector->ddc);
        if (!edid)
                goto err_mutex_unlock;
 
@@ -1479,7 +1469,6 @@ static int ast_sil164_connector_helper_get_modes(struct drm_connector *connector
 
 err_mutex_unlock:
        mutex_unlock(&ast->modeset_lock);
-err_drm_connector_update_edid_property:
        drm_connector_update_edid_property(connector, NULL);
        return 0;
 }
@@ -1500,19 +1489,18 @@ static int ast_sil164_connector_init(struct drm_device *dev,
                                     struct ast_sil164_connector *ast_sil164_connector)
 {
        struct drm_connector *connector = &ast_sil164_connector->base;
+       struct ast_i2c_chan *i2c;
        int ret;
 
-       ast_sil164_connector->i2c = ast_i2c_create(dev);
-       if (!ast_sil164_connector->i2c)
-               drm_err(dev, "failed to add ddc bus for connector\n");
+       i2c = ast_i2c_create(dev);
+       if (IS_ERR(i2c)) {
+               ret = PTR_ERR(i2c);
+               drm_err(dev, "failed to add ddc bus for connector; ret=%d\n", ret);
+               return ret;
+       }
 
-       if (ast_sil164_connector->i2c)
-               ret = drm_connector_init_with_ddc(dev, connector, &ast_sil164_connector_funcs,
-                                                 DRM_MODE_CONNECTOR_DVII,
-                                                 &ast_sil164_connector->i2c->adapter);
-       else
-               ret = drm_connector_init(dev, connector, &ast_sil164_connector_funcs,
-                                        DRM_MODE_CONNECTOR_DVII);
+       ret = drm_connector_init_with_ddc(dev, connector, &ast_sil164_connector_funcs,
+                                         DRM_MODE_CONNECTOR_DVII, &i2c->adapter);
        if (ret)
                return ret;