]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/mgag200: Allocate instance of struct mga_i2c_chan dynamically
authorThomas Zimmermann <tzimmermann@suse.de>
Mon, 13 May 2024 12:51:09 +0000 (14:51 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Fri, 17 May 2024 15:20:08 +0000 (17:20 +0200)
Allocate instances of struct mga_i2c_chan in mgag200_ddc_create()
and return a pointer to the contained i2c adapter. The callers of
the function are now independent from struct mga_i2c_chan.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240513125620.6337-5-tzimmermann@suse.de
12 files changed:
drivers/gpu/drm/mgag200/mgag200_ddc.h [new file with mode: 0644]
drivers/gpu/drm/mgag200/mgag200_drv.h
drivers/gpu/drm/mgag200/mgag200_g200.c
drivers/gpu/drm/mgag200/mgag200_g200eh.c
drivers/gpu/drm/mgag200/mgag200_g200eh3.c
drivers/gpu/drm/mgag200/mgag200_g200er.c
drivers/gpu/drm/mgag200/mgag200_g200ev.c
drivers/gpu/drm/mgag200/mgag200_g200ew3.c
drivers/gpu/drm/mgag200/mgag200_g200se.c
drivers/gpu/drm/mgag200/mgag200_g200wb.c
drivers/gpu/drm/mgag200/mgag200_i2c.c
drivers/gpu/drm/mgag200/mgag200_mode.c

diff --git a/drivers/gpu/drm/mgag200/mgag200_ddc.h b/drivers/gpu/drm/mgag200/mgag200_ddc.h
new file mode 100644 (file)
index 0000000..fa21d19
--- /dev/null
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef __MGAG200_DDC_H__
+#define __MGAG200_DDC_H__
+
+struct i2c_adapter;
+struct mga_device;
+
+struct i2c_adapter *mgag200_ddc_create(struct mga_device *mdev);
+
+#endif
index c7d4047301bfb6f7b12f0e750a023e87acd0dc48..3c834bfd82cf42ed3369cc37187921a1c41fa338 100644 (file)
@@ -294,7 +294,6 @@ struct mga_device {
        struct drm_plane primary_plane;
        struct drm_crtc crtc;
        struct drm_encoder encoder;
-       struct mga_i2c_chan i2c;
        struct drm_connector connector;
 };
 
@@ -453,7 +452,4 @@ int mgag200_mode_config_init(struct mga_device *mdev, resource_size_t vram_avail
 void mgag200_bmc_disable_vidrst(struct mga_device *mdev);
 void mgag200_bmc_enable_vidrst(struct mga_device *mdev);
 
-                               /* mgag200_i2c.c */
-int mgag200_i2c_init(struct mga_device *mdev, struct mga_i2c_chan *i2c);
-
 #endif                         /* __MGAG200_DRV_H__ */
index bf5d7fe525a3fd036f8c32460b6797fe905a72f9..39a29d8ffca6e5fe33cd493ea1319bb92654bcc0 100644 (file)
@@ -9,6 +9,7 @@
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_probe_helper.h>
 
+#include "mgag200_ddc.h"
 #include "mgag200_drv.h"
 
 static int mgag200_g200_init_pci_options(struct pci_dev *pdev)
@@ -201,8 +202,8 @@ static int mgag200_g200_pipeline_init(struct mga_device *mdev)
        struct drm_plane *primary_plane = &mdev->primary_plane;
        struct drm_crtc *crtc = &mdev->crtc;
        struct drm_encoder *encoder = &mdev->encoder;
-       struct mga_i2c_chan *i2c = &mdev->i2c;
        struct drm_connector *connector = &mdev->connector;
+       struct i2c_adapter *ddc;
        int ret;
 
        ret = drm_universal_plane_init(dev, primary_plane, 0,
@@ -238,16 +239,16 @@ static int mgag200_g200_pipeline_init(struct mga_device *mdev)
                return ret;
        }
 
-       ret = mgag200_i2c_init(mdev, i2c);
-       if (ret) {
+       ddc = mgag200_ddc_create(mdev);
+       if (IS_ERR(ddc)) {
+               ret = PTR_ERR(ddc);
                drm_err(dev, "failed to add DDC bus: %d\n", ret);
                return ret;
        }
 
        ret = drm_connector_init_with_ddc(dev, connector,
                                          &mgag200_g200_vga_connector_funcs,
-                                         DRM_MODE_CONNECTOR_VGA,
-                                         &i2c->adapter);
+                                         DRM_MODE_CONNECTOR_VGA, ddc);
        if (ret) {
                drm_err(dev, "drm_connector_init_with_ddc() failed: %d\n", ret);
                return ret;
index fad62453a91db713947e1ef0d6b591cdb2a58b2d..619fee7ffdf5ec987b3087355f6955ad46667d18 100644 (file)
@@ -9,6 +9,7 @@
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_probe_helper.h>
 
+#include "mgag200_ddc.h"
 #include "mgag200_drv.h"
 
 void mgag200_g200eh_init_registers(struct mga_device *mdev)
@@ -200,8 +201,8 @@ static int mgag200_g200eh_pipeline_init(struct mga_device *mdev)
        struct drm_plane *primary_plane = &mdev->primary_plane;
        struct drm_crtc *crtc = &mdev->crtc;
        struct drm_encoder *encoder = &mdev->encoder;
-       struct mga_i2c_chan *i2c = &mdev->i2c;
        struct drm_connector *connector = &mdev->connector;
+       struct i2c_adapter *ddc;
        int ret;
 
        ret = drm_universal_plane_init(dev, primary_plane, 0,
@@ -237,16 +238,16 @@ static int mgag200_g200eh_pipeline_init(struct mga_device *mdev)
                return ret;
        }
 
-       ret = mgag200_i2c_init(mdev, i2c);
-       if (ret) {
+       ddc = mgag200_ddc_create(mdev);
+       if (IS_ERR(ddc)) {
+               ret = PTR_ERR(ddc);
                drm_err(dev, "failed to add DDC bus: %d\n", ret);
                return ret;
        }
 
        ret = drm_connector_init_with_ddc(dev, connector,
                                          &mgag200_g200eh_vga_connector_funcs,
-                                         DRM_MODE_CONNECTOR_VGA,
-                                         &i2c->adapter);
+                                         DRM_MODE_CONNECTOR_VGA, ddc);
        if (ret) {
                drm_err(dev, "drm_connector_init_with_ddc() failed: %d\n", ret);
                return ret;
index 0f7d8112cd49fcd88b6cd281f38757a8f2fed19a..a172b8a4500a0e19e17775e77a0f24e4105b2214 100644 (file)
@@ -8,6 +8,7 @@
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_probe_helper.h>
 
+#include "mgag200_ddc.h"
 #include "mgag200_drv.h"
 
 /*
@@ -104,8 +105,8 @@ static int mgag200_g200eh3_pipeline_init(struct mga_device *mdev)
        struct drm_plane *primary_plane = &mdev->primary_plane;
        struct drm_crtc *crtc = &mdev->crtc;
        struct drm_encoder *encoder = &mdev->encoder;
-       struct mga_i2c_chan *i2c = &mdev->i2c;
        struct drm_connector *connector = &mdev->connector;
+       struct i2c_adapter *ddc;
        int ret;
 
        ret = drm_universal_plane_init(dev, primary_plane, 0,
@@ -141,16 +142,16 @@ static int mgag200_g200eh3_pipeline_init(struct mga_device *mdev)
                return ret;
        }
 
-       ret = mgag200_i2c_init(mdev, i2c);
-       if (ret) {
+       ddc = mgag200_ddc_create(mdev);
+       if (IS_ERR(ddc)) {
+               ret = PTR_ERR(ddc);
                drm_err(dev, "failed to add DDC bus: %d\n", ret);
                return ret;
        }
 
        ret = drm_connector_init_with_ddc(dev, connector,
                                          &mgag200_g200eh3_vga_connector_funcs,
-                                         DRM_MODE_CONNECTOR_VGA,
-                                         &i2c->adapter);
+                                         DRM_MODE_CONNECTOR_VGA, ddc);
        if (ret) {
                drm_err(dev, "drm_connector_init_with_ddc() failed: %d\n", ret);
                return ret;
index 8d4538b71047764d79e02bd70b533ca866c2a830..a11c91331e43e5c32e0adf9ad4c2a6a06d2a72c2 100644 (file)
@@ -9,6 +9,7 @@
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_probe_helper.h>
 
+#include "mgag200_ddc.h"
 #include "mgag200_drv.h"
 
 static void mgag200_g200er_init_registers(struct mga_device *mdev)
@@ -243,8 +244,8 @@ static int mgag200_g200er_pipeline_init(struct mga_device *mdev)
        struct drm_plane *primary_plane = &mdev->primary_plane;
        struct drm_crtc *crtc = &mdev->crtc;
        struct drm_encoder *encoder = &mdev->encoder;
-       struct mga_i2c_chan *i2c = &mdev->i2c;
        struct drm_connector *connector = &mdev->connector;
+       struct i2c_adapter *ddc;
        int ret;
 
        ret = drm_universal_plane_init(dev, primary_plane, 0,
@@ -280,16 +281,16 @@ static int mgag200_g200er_pipeline_init(struct mga_device *mdev)
                return ret;
        }
 
-       ret = mgag200_i2c_init(mdev, i2c);
-       if (ret) {
+       ddc = mgag200_ddc_create(mdev);
+       if (IS_ERR(ddc)) {
+               ret = PTR_ERR(ddc);
                drm_err(dev, "failed to add DDC bus: %d\n", ret);
                return ret;
        }
 
        ret = drm_connector_init_with_ddc(dev, connector,
                                          &mgag200_g200er_vga_connector_funcs,
-                                         DRM_MODE_CONNECTOR_VGA,
-                                         &i2c->adapter);
+                                         DRM_MODE_CONNECTOR_VGA, ddc);
        if (ret) {
                drm_err(dev, "drm_connector_init_with_ddc() failed: %d\n", ret);
                return ret;
index 56e6f986bff31114207fcd3f48590ddc135900ff..dfb641b83842ae339a41b8d05d700c39593d232c 100644 (file)
@@ -9,6 +9,7 @@
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_probe_helper.h>
 
+#include "mgag200_ddc.h"
 #include "mgag200_drv.h"
 
 static void mgag200_g200ev_init_registers(struct mga_device *mdev)
@@ -244,8 +245,8 @@ static int mgag200_g200ev_pipeline_init(struct mga_device *mdev)
        struct drm_plane *primary_plane = &mdev->primary_plane;
        struct drm_crtc *crtc = &mdev->crtc;
        struct drm_encoder *encoder = &mdev->encoder;
-       struct mga_i2c_chan *i2c = &mdev->i2c;
        struct drm_connector *connector = &mdev->connector;
+       struct i2c_adapter *ddc;
        int ret;
 
        ret = drm_universal_plane_init(dev, primary_plane, 0,
@@ -281,16 +282,16 @@ static int mgag200_g200ev_pipeline_init(struct mga_device *mdev)
                return ret;
        }
 
-       ret = mgag200_i2c_init(mdev, i2c);
-       if (ret) {
+       ddc = mgag200_ddc_create(mdev);
+       if (IS_ERR(ddc)) {
+               ret = PTR_ERR(ddc);
                drm_err(dev, "failed to add DDC bus: %d\n", ret);
                return ret;
        }
 
        ret = drm_connector_init_with_ddc(dev, connector,
                                          &mgag200_g200ev_vga_connector_funcs,
-                                         DRM_MODE_CONNECTOR_VGA,
-                                         &i2c->adapter);
+                                         DRM_MODE_CONNECTOR_VGA, ddc);
        if (ret) {
                drm_err(dev, "drm_connector_init_with_ddc() failed: %d\n", ret);
                return ret;
index 170934414d7dd7f0ec72eedcbcd55cd0693fe18b..525b7f75e62280e2c4a56e5e94311f5aa7a5350a 100644 (file)
@@ -8,6 +8,7 @@
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_probe_helper.h>
 
+#include "mgag200_ddc.h"
 #include "mgag200_drv.h"
 
 static void mgag200_g200ew3_init_registers(struct mga_device *mdev)
@@ -113,8 +114,8 @@ static int mgag200_g200ew3_pipeline_init(struct mga_device *mdev)
        struct drm_plane *primary_plane = &mdev->primary_plane;
        struct drm_crtc *crtc = &mdev->crtc;
        struct drm_encoder *encoder = &mdev->encoder;
-       struct mga_i2c_chan *i2c = &mdev->i2c;
        struct drm_connector *connector = &mdev->connector;
+       struct i2c_adapter *ddc;
        int ret;
 
        ret = drm_universal_plane_init(dev, primary_plane, 0,
@@ -150,16 +151,16 @@ static int mgag200_g200ew3_pipeline_init(struct mga_device *mdev)
                return ret;
        }
 
-       ret = mgag200_i2c_init(mdev, i2c);
-       if (ret) {
+       ddc = mgag200_ddc_create(mdev);
+       if (IS_ERR(ddc)) {
+               ret = PTR_ERR(ddc);
                drm_err(dev, "failed to add DDC bus: %d\n", ret);
                return ret;
        }
 
        ret = drm_connector_init_with_ddc(dev, connector,
                                          &mgag200_g200ew3_vga_connector_funcs,
-                                         DRM_MODE_CONNECTOR_VGA,
-                                         &i2c->adapter);
+                                         DRM_MODE_CONNECTOR_VGA, ddc);
        if (ret) {
                drm_err(dev, "drm_connector_init_with_ddc() failed: %d\n", ret);
                return ret;
index ff2b3c6622e7aa5f85b87626587c9a0e5d90a964..ef7606b529ea1c6b6179944e8573a897b36a381c 100644 (file)
@@ -9,6 +9,7 @@
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_probe_helper.h>
 
+#include "mgag200_ddc.h"
 #include "mgag200_drv.h"
 
 static int mgag200_g200se_init_pci_options(struct pci_dev *pdev)
@@ -375,8 +376,8 @@ static int mgag200_g200se_pipeline_init(struct mga_device *mdev)
        struct drm_plane *primary_plane = &mdev->primary_plane;
        struct drm_crtc *crtc = &mdev->crtc;
        struct drm_encoder *encoder = &mdev->encoder;
-       struct mga_i2c_chan *i2c = &mdev->i2c;
        struct drm_connector *connector = &mdev->connector;
+       struct i2c_adapter *ddc;
        int ret;
 
        ret = drm_universal_plane_init(dev, primary_plane, 0,
@@ -412,16 +413,16 @@ static int mgag200_g200se_pipeline_init(struct mga_device *mdev)
                return ret;
        }
 
-       ret = mgag200_i2c_init(mdev, i2c);
-       if (ret) {
+       ddc = mgag200_ddc_create(mdev);
+       if (IS_ERR(ddc)) {
+               ret = PTR_ERR(ddc);
                drm_err(dev, "failed to add DDC bus: %d\n", ret);
                return ret;
        }
 
        ret = drm_connector_init_with_ddc(dev, connector,
                                          &mgag200_g200se_vga_connector_funcs,
-                                         DRM_MODE_CONNECTOR_VGA,
-                                         &i2c->adapter);
+                                         DRM_MODE_CONNECTOR_VGA, ddc);
        if (ret) {
                drm_err(dev, "drm_connector_init_with_ddc() failed: %d\n", ret);
                return ret;
index 9baa727ac6f9f9fcdc0dd3cdf3f0300667ee9f8b..e4def62b1e5758e11a6961ac9fe3f8f97cef464e 100644 (file)
@@ -9,6 +9,7 @@
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_probe_helper.h>
 
+#include "mgag200_ddc.h"
 #include "mgag200_drv.h"
 
 void mgag200_g200wb_init_registers(struct mga_device *mdev)
@@ -247,8 +248,8 @@ static int mgag200_g200wb_pipeline_init(struct mga_device *mdev)
        struct drm_plane *primary_plane = &mdev->primary_plane;
        struct drm_crtc *crtc = &mdev->crtc;
        struct drm_encoder *encoder = &mdev->encoder;
-       struct mga_i2c_chan *i2c = &mdev->i2c;
        struct drm_connector *connector = &mdev->connector;
+       struct i2c_adapter *ddc;
        int ret;
 
        ret = drm_universal_plane_init(dev, primary_plane, 0,
@@ -284,16 +285,16 @@ static int mgag200_g200wb_pipeline_init(struct mga_device *mdev)
                return ret;
        }
 
-       ret = mgag200_i2c_init(mdev, i2c);
-       if (ret) {
+       ddc = mgag200_ddc_create(mdev);
+       if (IS_ERR(ddc)) {
+               ret = PTR_ERR(ddc);
                drm_err(dev, "failed to add DDC bus: %d\n", ret);
                return ret;
        }
 
        ret = drm_connector_init_with_ddc(dev, connector,
                                          &mgag200_g200wb_vga_connector_funcs,
-                                         DRM_MODE_CONNECTOR_VGA,
-                                         &i2c->adapter);
+                                         DRM_MODE_CONNECTOR_VGA, ddc);
        if (ret) {
                drm_err(dev, "drm_connector_init_with_ddc() failed: %d\n", ret);
                return ret;
index effd7c057fce00be6107d13e7417a73ee36bae36..46fa9f1b4e46912c2515fb5263c9889c3c5b2270 100644 (file)
@@ -33,6 +33,7 @@
 
 #include <drm/drm_managed.h>
 
+#include "mgag200_ddc.h"
 #include "mgag200_drv.h"
 
 static int mga_i2c_read_gpio(struct mga_device *mdev)
@@ -95,7 +96,7 @@ static void mgag200_i2c_release(struct drm_device *dev, void *res)
        i2c_del_adapter(&i2c->adapter);
 }
 
-int mgag200_i2c_init(struct mga_device *mdev, struct mga_i2c_chan *i2c)
+static int mgag200_i2c_init(struct mga_device *mdev, struct mga_i2c_chan *i2c)
 {
        struct drm_device *dev = &mdev->base;
        const struct mgag200_device_info *info = mdev->info;
@@ -129,3 +130,20 @@ int mgag200_i2c_init(struct mga_device *mdev, struct mga_i2c_chan *i2c)
 
        return drmm_add_action_or_reset(dev, mgag200_i2c_release, i2c);
 }
+
+struct i2c_adapter *mgag200_ddc_create(struct mga_device *mdev)
+{
+       struct mga_i2c_chan *i2c;
+       struct drm_device *dev = &mdev->base;
+       int ret;
+
+       i2c = drmm_kzalloc(dev, sizeof(*i2c), GFP_KERNEL);
+       if (!i2c)
+               return ERR_PTR(-ENOMEM);
+
+       ret = mgag200_i2c_init(mdev, i2c);
+       if (ret)
+               return ERR_PTR(ret);
+
+       return &i2c->adapter;
+}
index fc54851d3384d17c31f1482331a2e4c2893dd457..cd1f48b2f998646a8a35399497a6b179016a83c7 100644 (file)
@@ -24,6 +24,7 @@
 #include <drm/drm_panic.h>
 #include <drm/drm_print.h>
 
+#include "mgag200_ddc.h"
 #include "mgag200_drv.h"
 
 /*