drm/mgag200: Store positions of I2C data and clock bits in device info
authorThomas Zimmermann <tzimmermann@suse.de>
Wed, 1 Jun 2022 11:25:22 +0000 (13:25 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Tue, 7 Jun 2022 07:40:11 +0000 (09:40 +0200)
The bits for accessing I2C data and clock channels varies among
models. Store them in the device-info structure for consumption
by the DDC code.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
Tested-by: Jocelyn Falempe <jfalempe@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220601112522.5774-11-tzimmermann@suse.de
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

index 1ceb19a987e29bca3df4e78d8a5862816456b79c..301c4ab46539befd94f5f3ad4eaf7df7718cef70 100644 (file)
@@ -203,6 +203,11 @@ struct mgag200_device_info {
        /* HW has external source (e.g., BMC) to synchronize with */
        bool has_vidrst:1;
 
+       struct {
+               unsigned data_bit:3;
+               unsigned clock_bit:3;
+       } i2c;
+
        /*
         * HW does not handle 'startadd' register correctly. Always set
         * it's value to 0.
@@ -211,12 +216,17 @@ struct mgag200_device_info {
 };
 
 #define MGAG200_DEVICE_INFO_INIT(_max_hdisplay, _max_vdisplay, _max_mem_bandwidth, \
-                                _has_vidrst, _bug_no_startadd) \
+                                _has_vidrst, _i2c_data_bit, _i2c_clock_bit, \
+                                _bug_no_startadd) \
        { \
                .max_hdisplay = (_max_hdisplay), \
                .max_vdisplay = (_max_vdisplay), \
                .max_mem_bandwidth = (_max_mem_bandwidth), \
                .has_vidrst = (_has_vidrst), \
+               .i2c = { \
+                       .data_bit = (_i2c_data_bit), \
+                       .clock_bit = (_i2c_clock_bit), \
+               }, \
                .bug_no_startadd = (_bug_no_startadd), \
        }
 
index 58ae5d0672634aac466792102e3486bd72a82a15..616e11391e0206756594798fbd4edf121485fe1f 100644 (file)
@@ -34,7 +34,7 @@ static int mgag200_g200_init_pci_options(struct pci_dev *pdev)
  */
 
 static const struct mgag200_device_info mgag200_g200_device_info =
-       MGAG200_DEVICE_INFO_INIT(2048, 2048, 0, false, false);
+       MGAG200_DEVICE_INFO_INIT(2048, 2048, 0, false, 1, 3, false);
 
 static void mgag200_g200_interpret_bios(struct mgag200_g200_device *g200,
                                        const unsigned char *bios, size_t size)
index ee38d918c7277e3dbdd5699efcd48c019b620aff..1b9a2272874460f05d3584d9f887f3a8bde27b3c 100644 (file)
@@ -11,7 +11,7 @@
  */
 
 static const struct mgag200_device_info mgag200_g200eh_device_info =
-       MGAG200_DEVICE_INFO_INIT(2048, 2048, 37500, false, false);
+       MGAG200_DEVICE_INFO_INIT(2048, 2048, 37500, false, 1, 0, false);
 
 struct mga_device *mgag200_g200eh_device_create(struct pci_dev *pdev, const struct drm_driver *drv,
                                                enum mga_type type)
index 4b69206296ee53a36086b11938e0be27a256bfd2..438cda1b14c900ec7cff63dc100af2f56232f018 100644 (file)
@@ -11,7 +11,7 @@
  */
 
 static const struct mgag200_device_info mgag200_g200eh3_device_info =
-       MGAG200_DEVICE_INFO_INIT(2048, 2048, 0, false, false);
+       MGAG200_DEVICE_INFO_INIT(2048, 2048, 0, false, 1, 0, false);
 
 struct mga_device *mgag200_g200eh3_device_create(struct pci_dev *pdev,
                                                 const struct drm_driver *drv,
index 7e44fcc7bb59bbe5237e3237f1b58dcd7396674b..0790d4e6463de5b12507b656c2c586b41980d600 100644 (file)
@@ -11,7 +11,7 @@
  */
 
 static const struct mgag200_device_info mgag200_g200er_device_info =
-       MGAG200_DEVICE_INFO_INIT(2048, 2048, 55000, false, false);
+       MGAG200_DEVICE_INFO_INIT(2048, 2048, 55000, false, 1, 0, false);
 
 struct mga_device *mgag200_g200er_device_create(struct pci_dev *pdev, const struct drm_driver *drv,
                                                enum mga_type type)
index 87a9497ab8057c008774b8ab5359950d09027b46..5353422d0eef1f56f573d8a9e291cec5a02dbb8f 100644 (file)
@@ -11,7 +11,7 @@
  */
 
 static const struct mgag200_device_info mgag200_g200ev_device_info =
-       MGAG200_DEVICE_INFO_INIT(2048, 2048, 32700, false, false);
+       MGAG200_DEVICE_INFO_INIT(2048, 2048, 32700, false, 0, 1, false);
 
 struct mga_device *mgag200_g200ev_device_create(struct pci_dev *pdev, const struct drm_driver *drv,
                                                enum mga_type type)
index 61f944319bc9f4fb0a881f5ccfb23330df019214..3bfc1324cf78cee43c309a12c9b3faeb2b4eed6d 100644 (file)
@@ -11,7 +11,7 @@
  */
 
 static const struct mgag200_device_info mgag200_g200ew3_device_info =
-       MGAG200_DEVICE_INFO_INIT(2048, 2048, 0, true, false);
+       MGAG200_DEVICE_INFO_INIT(2048, 2048, 0, true, 0, 1, false);
 
 static resource_size_t mgag200_g200ew3_device_probe_vram(struct mga_device *mdev)
 {
index 0ccec93585293bbe7ee92f122ff34439c442aa86..0a3e66695e2297a9cea05af50edc6d3f14b6bfb8 100644 (file)
@@ -33,22 +33,22 @@ static int mgag200_g200se_init_pci_options(struct pci_dev *pdev)
  */
 
 static const struct mgag200_device_info mgag200_g200se_a_01_device_info =
-       MGAG200_DEVICE_INFO_INIT(1600, 1200, 24400, false, true);
+       MGAG200_DEVICE_INFO_INIT(1600, 1200, 24400, false, 0, 1, true);
 
 static const struct mgag200_device_info mgag200_g200se_a_02_device_info =
-       MGAG200_DEVICE_INFO_INIT(1920, 1200, 30100, false, true);
+       MGAG200_DEVICE_INFO_INIT(1920, 1200, 30100, false, 0, 1, true);
 
 static const struct mgag200_device_info mgag200_g200se_a_03_device_info =
-       MGAG200_DEVICE_INFO_INIT(2048, 2048, 55000, false, false);
+       MGAG200_DEVICE_INFO_INIT(2048, 2048, 55000, false, 0, 1, false);
 
 static const struct mgag200_device_info mgag200_g200se_b_01_device_info =
-       MGAG200_DEVICE_INFO_INIT(1600, 1200, 24400, false, false);
+       MGAG200_DEVICE_INFO_INIT(1600, 1200, 24400, false, 0, 1, false);
 
 static const struct mgag200_device_info mgag200_g200se_b_02_device_info =
-       MGAG200_DEVICE_INFO_INIT(1920, 1200, 30100, false, false);
+       MGAG200_DEVICE_INFO_INIT(1920, 1200, 30100, false, 0, 1, false);
 
 static const struct mgag200_device_info mgag200_g200se_b_03_device_info =
-       MGAG200_DEVICE_INFO_INIT(2048, 2048, 55000, false, false);
+       MGAG200_DEVICE_INFO_INIT(2048, 2048, 55000, false, 0, 1, false);
 
 static int mgag200_g200se_init_unique_rev_id(struct mgag200_g200se_device *g200se)
 {
index 97002c08da418fc70f8c0f72be1bb6b4b217395e..c8450ac8eaeca335280f5b989fc17459f7ff5104 100644 (file)
@@ -11,7 +11,7 @@
  */
 
 static const struct mgag200_device_info mgag200_g200wb_device_info =
-       MGAG200_DEVICE_INFO_INIT(1280, 1024, 31877, true, false);
+       MGAG200_DEVICE_INFO_INIT(1280, 1024, 31877, true, 0, 1, false);
 
 struct mga_device *mgag200_g200wb_device_create(struct pci_dev *pdev, const struct drm_driver *drv,
                                                enum mga_type type)
index f57b33917152de9c811e29dd19870947dac28001..0c48bdf3e7f800a02a00fcbf06b4d5737475e003 100644 (file)
@@ -96,36 +96,15 @@ static void mgag200_i2c_release(void *res)
 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;
        int ret;
-       int data, clock;
 
        WREG_DAC(MGA1064_GEN_IO_CTL2, 1);
        WREG_DAC(MGA1064_GEN_IO_DATA, 0xff);
        WREG_DAC(MGA1064_GEN_IO_CTL, 0);
 
-       switch (mdev->type) {
-       case G200_SE_A:
-       case G200_SE_B:
-       case G200_EV:
-       case G200_WB:
-       case G200_EW3:
-               data = 1;
-               clock = 2;
-               break;
-       case G200_EH:
-       case G200_EH3:
-       case G200_ER:
-               data = 2;
-               clock = 1;
-               break;
-       default:
-               data = 2;
-               clock = 8;
-               break;
-       }
-
-       i2c->data = data;
-       i2c->clock = clock;
+       i2c->data = BIT(info->i2c.data_bit);
+       i2c->clock = BIT(info->i2c.clock_bit);
        i2c->adapter.owner = THIS_MODULE;
        i2c->adapter.class = I2C_CLASS_DDC;
        i2c->adapter.dev.parent = dev->dev;