Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/mgag200: Store positions of I2C data and clock bits in device info

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

+27 -38
+11 -1
drivers/gpu/drm/mgag200/mgag200_drv.h
··· 203 203 /* HW has external source (e.g., BMC) to synchronize with */ 204 204 bool has_vidrst:1; 205 205 206 + struct { 207 + unsigned data_bit:3; 208 + unsigned clock_bit:3; 209 + } i2c; 210 + 206 211 /* 207 212 * HW does not handle 'startadd' register correctly. Always set 208 213 * it's value to 0. ··· 216 211 }; 217 212 218 213 #define MGAG200_DEVICE_INFO_INIT(_max_hdisplay, _max_vdisplay, _max_mem_bandwidth, \ 219 - _has_vidrst, _bug_no_startadd) \ 214 + _has_vidrst, _i2c_data_bit, _i2c_clock_bit, \ 215 + _bug_no_startadd) \ 220 216 { \ 221 217 .max_hdisplay = (_max_hdisplay), \ 222 218 .max_vdisplay = (_max_vdisplay), \ 223 219 .max_mem_bandwidth = (_max_mem_bandwidth), \ 224 220 .has_vidrst = (_has_vidrst), \ 221 + .i2c = { \ 222 + .data_bit = (_i2c_data_bit), \ 223 + .clock_bit = (_i2c_clock_bit), \ 224 + }, \ 225 225 .bug_no_startadd = (_bug_no_startadd), \ 226 226 } 227 227
+1 -1
drivers/gpu/drm/mgag200/mgag200_g200.c
··· 34 34 */ 35 35 36 36 static const struct mgag200_device_info mgag200_g200_device_info = 37 - MGAG200_DEVICE_INFO_INIT(2048, 2048, 0, false, false); 37 + MGAG200_DEVICE_INFO_INIT(2048, 2048, 0, false, 1, 3, false); 38 38 39 39 static void mgag200_g200_interpret_bios(struct mgag200_g200_device *g200, 40 40 const unsigned char *bios, size_t size)
+1 -1
drivers/gpu/drm/mgag200/mgag200_g200eh.c
··· 11 11 */ 12 12 13 13 static const struct mgag200_device_info mgag200_g200eh_device_info = 14 - MGAG200_DEVICE_INFO_INIT(2048, 2048, 37500, false, false); 14 + MGAG200_DEVICE_INFO_INIT(2048, 2048, 37500, false, 1, 0, false); 15 15 16 16 struct mga_device *mgag200_g200eh_device_create(struct pci_dev *pdev, const struct drm_driver *drv, 17 17 enum mga_type type)
+1 -1
drivers/gpu/drm/mgag200/mgag200_g200eh3.c
··· 11 11 */ 12 12 13 13 static const struct mgag200_device_info mgag200_g200eh3_device_info = 14 - MGAG200_DEVICE_INFO_INIT(2048, 2048, 0, false, false); 14 + MGAG200_DEVICE_INFO_INIT(2048, 2048, 0, false, 1, 0, false); 15 15 16 16 struct mga_device *mgag200_g200eh3_device_create(struct pci_dev *pdev, 17 17 const struct drm_driver *drv,
+1 -1
drivers/gpu/drm/mgag200/mgag200_g200er.c
··· 11 11 */ 12 12 13 13 static const struct mgag200_device_info mgag200_g200er_device_info = 14 - MGAG200_DEVICE_INFO_INIT(2048, 2048, 55000, false, false); 14 + MGAG200_DEVICE_INFO_INIT(2048, 2048, 55000, false, 1, 0, false); 15 15 16 16 struct mga_device *mgag200_g200er_device_create(struct pci_dev *pdev, const struct drm_driver *drv, 17 17 enum mga_type type)
+1 -1
drivers/gpu/drm/mgag200/mgag200_g200ev.c
··· 11 11 */ 12 12 13 13 static const struct mgag200_device_info mgag200_g200ev_device_info = 14 - MGAG200_DEVICE_INFO_INIT(2048, 2048, 32700, false, false); 14 + MGAG200_DEVICE_INFO_INIT(2048, 2048, 32700, false, 0, 1, false); 15 15 16 16 struct mga_device *mgag200_g200ev_device_create(struct pci_dev *pdev, const struct drm_driver *drv, 17 17 enum mga_type type)
+1 -1
drivers/gpu/drm/mgag200/mgag200_g200ew3.c
··· 11 11 */ 12 12 13 13 static const struct mgag200_device_info mgag200_g200ew3_device_info = 14 - MGAG200_DEVICE_INFO_INIT(2048, 2048, 0, true, false); 14 + MGAG200_DEVICE_INFO_INIT(2048, 2048, 0, true, 0, 1, false); 15 15 16 16 static resource_size_t mgag200_g200ew3_device_probe_vram(struct mga_device *mdev) 17 17 {
+6 -6
drivers/gpu/drm/mgag200/mgag200_g200se.c
··· 33 33 */ 34 34 35 35 static const struct mgag200_device_info mgag200_g200se_a_01_device_info = 36 - MGAG200_DEVICE_INFO_INIT(1600, 1200, 24400, false, true); 36 + MGAG200_DEVICE_INFO_INIT(1600, 1200, 24400, false, 0, 1, true); 37 37 38 38 static const struct mgag200_device_info mgag200_g200se_a_02_device_info = 39 - MGAG200_DEVICE_INFO_INIT(1920, 1200, 30100, false, true); 39 + MGAG200_DEVICE_INFO_INIT(1920, 1200, 30100, false, 0, 1, true); 40 40 41 41 static const struct mgag200_device_info mgag200_g200se_a_03_device_info = 42 - MGAG200_DEVICE_INFO_INIT(2048, 2048, 55000, false, false); 42 + MGAG200_DEVICE_INFO_INIT(2048, 2048, 55000, false, 0, 1, false); 43 43 44 44 static const struct mgag200_device_info mgag200_g200se_b_01_device_info = 45 - MGAG200_DEVICE_INFO_INIT(1600, 1200, 24400, false, false); 45 + MGAG200_DEVICE_INFO_INIT(1600, 1200, 24400, false, 0, 1, false); 46 46 47 47 static const struct mgag200_device_info mgag200_g200se_b_02_device_info = 48 - MGAG200_DEVICE_INFO_INIT(1920, 1200, 30100, false, false); 48 + MGAG200_DEVICE_INFO_INIT(1920, 1200, 30100, false, 0, 1, false); 49 49 50 50 static const struct mgag200_device_info mgag200_g200se_b_03_device_info = 51 - MGAG200_DEVICE_INFO_INIT(2048, 2048, 55000, false, false); 51 + MGAG200_DEVICE_INFO_INIT(2048, 2048, 55000, false, 0, 1, false); 52 52 53 53 static int mgag200_g200se_init_unique_rev_id(struct mgag200_g200se_device *g200se) 54 54 {
+1 -1
drivers/gpu/drm/mgag200/mgag200_g200wb.c
··· 11 11 */ 12 12 13 13 static const struct mgag200_device_info mgag200_g200wb_device_info = 14 - MGAG200_DEVICE_INFO_INIT(1280, 1024, 31877, true, false); 14 + MGAG200_DEVICE_INFO_INIT(1280, 1024, 31877, true, 0, 1, false); 15 15 16 16 struct mga_device *mgag200_g200wb_device_create(struct pci_dev *pdev, const struct drm_driver *drv, 17 17 enum mga_type type)
+3 -24
drivers/gpu/drm/mgag200/mgag200_i2c.c
··· 96 96 int mgag200_i2c_init(struct mga_device *mdev, struct mga_i2c_chan *i2c) 97 97 { 98 98 struct drm_device *dev = &mdev->base; 99 + const struct mgag200_device_info *info = mdev->info; 99 100 int ret; 100 - int data, clock; 101 101 102 102 WREG_DAC(MGA1064_GEN_IO_CTL2, 1); 103 103 WREG_DAC(MGA1064_GEN_IO_DATA, 0xff); 104 104 WREG_DAC(MGA1064_GEN_IO_CTL, 0); 105 105 106 - switch (mdev->type) { 107 - case G200_SE_A: 108 - case G200_SE_B: 109 - case G200_EV: 110 - case G200_WB: 111 - case G200_EW3: 112 - data = 1; 113 - clock = 2; 114 - break; 115 - case G200_EH: 116 - case G200_EH3: 117 - case G200_ER: 118 - data = 2; 119 - clock = 1; 120 - break; 121 - default: 122 - data = 2; 123 - clock = 8; 124 - break; 125 - } 126 - 127 - i2c->data = data; 128 - i2c->clock = clock; 106 + i2c->data = BIT(info->i2c.data_bit); 107 + i2c->clock = BIT(info->i2c.clock_bit); 129 108 i2c->adapter.owner = THIS_MODULE; 130 109 i2c->adapter.class = I2C_CLASS_DDC; 131 110 i2c->adapter.dev.parent = dev->dev;