Commit da1efdb2 authored by Thomas Zimmermann's avatar Thomas Zimmermann

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: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarJocelyn Falempe <jfalempe@redhat.com>
Tested-by: default avatarJocelyn Falempe <jfalempe@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220601112522.5774-11-tzimmermann@suse.de
parent d1e40d8e
...@@ -203,6 +203,11 @@ struct mgag200_device_info { ...@@ -203,6 +203,11 @@ struct mgag200_device_info {
/* HW has external source (e.g., BMC) to synchronize with */ /* HW has external source (e.g., BMC) to synchronize with */
bool has_vidrst:1; bool has_vidrst:1;
struct {
unsigned data_bit:3;
unsigned clock_bit:3;
} i2c;
/* /*
* HW does not handle 'startadd' register correctly. Always set * HW does not handle 'startadd' register correctly. Always set
* it's value to 0. * it's value to 0.
...@@ -211,12 +216,17 @@ struct mgag200_device_info { ...@@ -211,12 +216,17 @@ struct mgag200_device_info {
}; };
#define MGAG200_DEVICE_INFO_INIT(_max_hdisplay, _max_vdisplay, _max_mem_bandwidth, \ #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_hdisplay = (_max_hdisplay), \
.max_vdisplay = (_max_vdisplay), \ .max_vdisplay = (_max_vdisplay), \
.max_mem_bandwidth = (_max_mem_bandwidth), \ .max_mem_bandwidth = (_max_mem_bandwidth), \
.has_vidrst = (_has_vidrst), \ .has_vidrst = (_has_vidrst), \
.i2c = { \
.data_bit = (_i2c_data_bit), \
.clock_bit = (_i2c_clock_bit), \
}, \
.bug_no_startadd = (_bug_no_startadd), \ .bug_no_startadd = (_bug_no_startadd), \
} }
......
...@@ -34,7 +34,7 @@ static int mgag200_g200_init_pci_options(struct pci_dev *pdev) ...@@ -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 = 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, static void mgag200_g200_interpret_bios(struct mgag200_g200_device *g200,
const unsigned char *bios, size_t size) const unsigned char *bios, size_t size)
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
*/ */
static const struct mgag200_device_info mgag200_g200eh_device_info = 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, struct mga_device *mgag200_g200eh_device_create(struct pci_dev *pdev, const struct drm_driver *drv,
enum mga_type type) enum mga_type type)
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
*/ */
static const struct mgag200_device_info mgag200_g200eh3_device_info = 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, struct mga_device *mgag200_g200eh3_device_create(struct pci_dev *pdev,
const struct drm_driver *drv, const struct drm_driver *drv,
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
*/ */
static const struct mgag200_device_info mgag200_g200er_device_info = 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, struct mga_device *mgag200_g200er_device_create(struct pci_dev *pdev, const struct drm_driver *drv,
enum mga_type type) enum mga_type type)
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
*/ */
static const struct mgag200_device_info mgag200_g200ev_device_info = 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, struct mga_device *mgag200_g200ev_device_create(struct pci_dev *pdev, const struct drm_driver *drv,
enum mga_type type) enum mga_type type)
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
*/ */
static const struct mgag200_device_info mgag200_g200ew3_device_info = 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) static resource_size_t mgag200_g200ew3_device_probe_vram(struct mga_device *mdev)
{ {
......
...@@ -33,22 +33,22 @@ static int mgag200_g200se_init_pci_options(struct pci_dev *pdev) ...@@ -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 = 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 = 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 = 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 = 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 = 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 = 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) static int mgag200_g200se_init_unique_rev_id(struct mgag200_g200se_device *g200se)
{ {
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
*/ */
static const struct mgag200_device_info mgag200_g200wb_device_info = 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, struct mga_device *mgag200_g200wb_device_create(struct pci_dev *pdev, const struct drm_driver *drv,
enum mga_type type) enum mga_type type)
......
...@@ -96,36 +96,15 @@ static void mgag200_i2c_release(void *res) ...@@ -96,36 +96,15 @@ static void mgag200_i2c_release(void *res)
int mgag200_i2c_init(struct mga_device *mdev, struct mga_i2c_chan *i2c) int mgag200_i2c_init(struct mga_device *mdev, struct mga_i2c_chan *i2c)
{ {
struct drm_device *dev = &mdev->base; struct drm_device *dev = &mdev->base;
const struct mgag200_device_info *info = mdev->info;
int ret; int ret;
int data, clock;
WREG_DAC(MGA1064_GEN_IO_CTL2, 1); WREG_DAC(MGA1064_GEN_IO_CTL2, 1);
WREG_DAC(MGA1064_GEN_IO_DATA, 0xff); WREG_DAC(MGA1064_GEN_IO_DATA, 0xff);
WREG_DAC(MGA1064_GEN_IO_CTL, 0); WREG_DAC(MGA1064_GEN_IO_CTL, 0);
switch (mdev->type) { i2c->data = BIT(info->i2c.data_bit);
case G200_SE_A: i2c->clock = BIT(info->i2c.clock_bit);
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->adapter.owner = THIS_MODULE; i2c->adapter.owner = THIS_MODULE;
i2c->adapter.class = I2C_CLASS_DDC; i2c->adapter.class = I2C_CLASS_DDC;
i2c->adapter.dev.parent = dev->dev; i2c->adapter.dev.parent = dev->dev;
......
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