diff options
author | Alex Deucher <alexdeucher@gmail.com> | 2009-11-23 17:39:28 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2009-12-07 19:22:41 -0500 |
commit | 6a93cb250a60af1bb7b4070949f8546a2fdc52ef (patch) | |
tree | 2c734dcc0a4c39ec5c626b17912845eae1448828 /drivers/gpu/drm | |
parent | 1a66c95a64c9ae0bc8382254f544b24b23f498ec (diff) |
drm/radeon/kms: i2c reorg
- keep the atom i2c id in the i2c rec
- fix gpio regs for GPIO and MDGPIO on pre-avivo chips
- track whether the i2c line is hw capable
- track whether the i2c line uses the multimedia i2c block
Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r-- | drivers/gpu/drm/radeon/atombios_dp.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_atombios.c | 62 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_combios.c | 158 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_i2c.c | 27 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_mode.h | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_reg.h | 12 |
7 files changed, 166 insertions, 120 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c index d1c144be9734..fc5a2df4544b 100644 --- a/drivers/gpu/drm/radeon/atombios_dp.c +++ b/drivers/gpu/drm/radeon/atombios_dp.c | |||
@@ -52,7 +52,7 @@ bool radeon_process_aux_ch(struct radeon_i2c_chan *chan, u8 *req_bytes, | |||
52 | args.lpAuxRequest = 0; | 52 | args.lpAuxRequest = 0; |
53 | args.lpDataOut = 16; | 53 | args.lpDataOut = 16; |
54 | args.ucDataOutLen = 0; | 54 | args.ucDataOutLen = 0; |
55 | args.ucChannelID = chan->i2c_id; | 55 | args.ucChannelID = chan->rec.i2c_id; |
56 | args.ucDelay = delay / 10; | 56 | args.ucDelay = delay / 10; |
57 | 57 | ||
58 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | 58 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); |
@@ -60,7 +60,7 @@ bool radeon_process_aux_ch(struct radeon_i2c_chan *chan, u8 *req_bytes, | |||
60 | if (args.ucReplyStatus) { | 60 | if (args.ucReplyStatus) { |
61 | DRM_ERROR("failed to get auxch %02x%02x %02x %02x 0x%02x %02x\n", | 61 | DRM_ERROR("failed to get auxch %02x%02x %02x %02x 0x%02x %02x\n", |
62 | req_bytes[1], req_bytes[0], req_bytes[2], req_bytes[3], | 62 | req_bytes[1], req_bytes[0], req_bytes[2], req_bytes[3], |
63 | chan->i2c_id, args.ucReplyStatus); | 63 | chan->rec.i2c_id, args.ucReplyStatus); |
64 | return false; | 64 | return false; |
65 | } | 65 | } |
66 | 66 | ||
@@ -102,7 +102,7 @@ int radeon_dp_getsinktype(struct radeon_connector *radeon_connector) | |||
102 | struct radeon_device *rdev = dev->dev_private; | 102 | struct radeon_device *rdev = dev->dev_private; |
103 | 103 | ||
104 | return radeon_dp_encoder_service(rdev, ATOM_DP_ACTION_GET_SINK_TYPE, 0, | 104 | return radeon_dp_encoder_service(rdev, ATOM_DP_ACTION_GET_SINK_TYPE, 0, |
105 | radeon_dig_connector->uc_i2c_id, 0); | 105 | radeon_dig_connector->dp_i2c_bus->rec.i2c_id, 0); |
106 | } | 106 | } |
107 | 107 | ||
108 | union dig_transmitter_control { | 108 | union dig_transmitter_control { |
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index de05ac976472..87bf6b9d10a4 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
@@ -47,7 +47,7 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
47 | int connector_type, | 47 | int connector_type, |
48 | struct radeon_i2c_bus_rec *i2c_bus, | 48 | struct radeon_i2c_bus_rec *i2c_bus, |
49 | bool linkb, uint32_t igp_lane_info, | 49 | bool linkb, uint32_t igp_lane_info, |
50 | uint16_t connector_object_id, uint8_t uc_i2c_id); | 50 | uint16_t connector_object_id); |
51 | 51 | ||
52 | /* from radeon_legacy_encoder.c */ | 52 | /* from radeon_legacy_encoder.c */ |
53 | extern void | 53 | extern void |
@@ -65,7 +65,7 @@ static inline struct radeon_i2c_bus_rec radeon_lookup_gpio(struct drm_device *de | |||
65 | { | 65 | { |
66 | struct radeon_device *rdev = dev->dev_private; | 66 | struct radeon_device *rdev = dev->dev_private; |
67 | struct atom_context *ctx = rdev->mode_info.atom_context; | 67 | struct atom_context *ctx = rdev->mode_info.atom_context; |
68 | ATOM_GPIO_I2C_ASSIGMENT gpio; | 68 | ATOM_GPIO_I2C_ASSIGMENT *gpio; |
69 | struct radeon_i2c_bus_rec i2c; | 69 | struct radeon_i2c_bus_rec i2c; |
70 | int index = GetIndexIntoMasterTable(DATA, GPIO_I2C_Info); | 70 | int index = GetIndexIntoMasterTable(DATA, GPIO_I2C_Info); |
71 | struct _ATOM_GPIO_I2C_INFO *i2c_info; | 71 | struct _ATOM_GPIO_I2C_INFO *i2c_info; |
@@ -78,24 +78,37 @@ static inline struct radeon_i2c_bus_rec radeon_lookup_gpio(struct drm_device *de | |||
78 | 78 | ||
79 | i2c_info = (struct _ATOM_GPIO_I2C_INFO *)(ctx->bios + data_offset); | 79 | i2c_info = (struct _ATOM_GPIO_I2C_INFO *)(ctx->bios + data_offset); |
80 | 80 | ||
81 | gpio = i2c_info->asGPIO_Info[id]; | 81 | gpio = &i2c_info->asGPIO_Info[id]; |
82 | 82 | ||
83 | i2c.mask_clk_reg = le16_to_cpu(gpio.usClkMaskRegisterIndex) * 4; | 83 | i2c.mask_clk_reg = le16_to_cpu(gpio->usClkMaskRegisterIndex) * 4; |
84 | i2c.mask_data_reg = le16_to_cpu(gpio.usDataMaskRegisterIndex) * 4; | 84 | i2c.mask_data_reg = le16_to_cpu(gpio->usDataMaskRegisterIndex) * 4; |
85 | i2c.en_clk_reg = le16_to_cpu(gpio.usClkEnRegisterIndex) * 4; | 85 | i2c.en_clk_reg = le16_to_cpu(gpio->usClkEnRegisterIndex) * 4; |
86 | i2c.en_data_reg = le16_to_cpu(gpio.usDataEnRegisterIndex) * 4; | 86 | i2c.en_data_reg = le16_to_cpu(gpio->usDataEnRegisterIndex) * 4; |
87 | i2c.y_clk_reg = le16_to_cpu(gpio.usClkY_RegisterIndex) * 4; | 87 | i2c.y_clk_reg = le16_to_cpu(gpio->usClkY_RegisterIndex) * 4; |
88 | i2c.y_data_reg = le16_to_cpu(gpio.usDataY_RegisterIndex) * 4; | 88 | i2c.y_data_reg = le16_to_cpu(gpio->usDataY_RegisterIndex) * 4; |
89 | i2c.a_clk_reg = le16_to_cpu(gpio.usClkA_RegisterIndex) * 4; | 89 | i2c.a_clk_reg = le16_to_cpu(gpio->usClkA_RegisterIndex) * 4; |
90 | i2c.a_data_reg = le16_to_cpu(gpio.usDataA_RegisterIndex) * 4; | 90 | i2c.a_data_reg = le16_to_cpu(gpio->usDataA_RegisterIndex) * 4; |
91 | i2c.mask_clk_mask = (1 << gpio.ucClkMaskShift); | 91 | i2c.mask_clk_mask = (1 << gpio->ucClkMaskShift); |
92 | i2c.mask_data_mask = (1 << gpio.ucDataMaskShift); | 92 | i2c.mask_data_mask = (1 << gpio->ucDataMaskShift); |
93 | i2c.en_clk_mask = (1 << gpio.ucClkEnShift); | 93 | i2c.en_clk_mask = (1 << gpio->ucClkEnShift); |
94 | i2c.en_data_mask = (1 << gpio.ucDataEnShift); | 94 | i2c.en_data_mask = (1 << gpio->ucDataEnShift); |
95 | i2c.y_clk_mask = (1 << gpio.ucClkY_Shift); | 95 | i2c.y_clk_mask = (1 << gpio->ucClkY_Shift); |
96 | i2c.y_data_mask = (1 << gpio.ucDataY_Shift); | 96 | i2c.y_data_mask = (1 << gpio->ucDataY_Shift); |
97 | i2c.a_clk_mask = (1 << gpio.ucClkA_Shift); | 97 | i2c.a_clk_mask = (1 << gpio->ucClkA_Shift); |
98 | i2c.a_data_mask = (1 << gpio.ucDataA_Shift); | 98 | i2c.a_data_mask = (1 << gpio->ucDataA_Shift); |
99 | |||
100 | if (gpio->sucI2cId.sbfAccess.bfHW_Capable) | ||
101 | i2c.hw_capable = true; | ||
102 | else | ||
103 | i2c.hw_capable = false; | ||
104 | |||
105 | if (gpio->sucI2cId.ucAccess == 0xa0) | ||
106 | i2c.mm_i2c = true; | ||
107 | else | ||
108 | i2c.mm_i2c = false; | ||
109 | |||
110 | i2c.i2c_id = gpio->sucI2cId.ucAccess; | ||
111 | |||
99 | i2c.valid = true; | 112 | i2c.valid = true; |
100 | 113 | ||
101 | return i2c; | 114 | return i2c; |
@@ -276,7 +289,6 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev) | |||
276 | uint16_t igp_lane_info, conn_id, connector_object_id; | 289 | uint16_t igp_lane_info, conn_id, connector_object_id; |
277 | bool linkb; | 290 | bool linkb; |
278 | struct radeon_i2c_bus_rec ddc_bus; | 291 | struct radeon_i2c_bus_rec ddc_bus; |
279 | ATOM_I2C_ID_CONFIG_ACCESS i2c_id; | ||
280 | atom_parse_data_header(ctx, index, &size, &frev, &crev, &data_offset); | 292 | atom_parse_data_header(ctx, index, &size, &frev, &crev, &data_offset); |
281 | 293 | ||
282 | if (data_offset == 0) | 294 | if (data_offset == 0) |
@@ -302,7 +314,6 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev) | |||
302 | path = (ATOM_DISPLAY_OBJECT_PATH *) addr; | 314 | path = (ATOM_DISPLAY_OBJECT_PATH *) addr; |
303 | path_size += le16_to_cpu(path->usSize); | 315 | path_size += le16_to_cpu(path->usSize); |
304 | linkb = false; | 316 | linkb = false; |
305 | i2c_id.ucAccess = 0; | ||
306 | if (device_support & le16_to_cpu(path->usDeviceTag)) { | 317 | if (device_support & le16_to_cpu(path->usDeviceTag)) { |
307 | uint8_t con_obj_id, con_obj_num, con_obj_type; | 318 | uint8_t con_obj_id, con_obj_num, con_obj_type; |
308 | 319 | ||
@@ -420,7 +431,7 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev) | |||
420 | asObjects[j]. | 431 | asObjects[j]. |
421 | usRecordOffset)); | 432 | usRecordOffset)); |
422 | ATOM_I2C_RECORD *i2c_record; | 433 | ATOM_I2C_RECORD *i2c_record; |
423 | 434 | ||
424 | while (record->ucRecordType > 0 | 435 | while (record->ucRecordType > 0 |
425 | && record-> | 436 | && record-> |
426 | ucRecordType <= | 437 | ucRecordType <= |
@@ -431,7 +442,6 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev) | |||
431 | i2c_record = | 442 | i2c_record = |
432 | (ATOM_I2C_RECORD | 443 | (ATOM_I2C_RECORD |
433 | *) record; | 444 | *) record; |
434 | i2c_id.sbfAccess = i2c_record->sucI2cId; | ||
435 | line_mux = | 445 | line_mux = |
436 | i2c_record-> | 446 | i2c_record-> |
437 | sucI2cId. | 447 | sucI2cId. |
@@ -474,7 +484,7 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev) | |||
474 | usDeviceTag), | 484 | usDeviceTag), |
475 | connector_type, &ddc_bus, | 485 | connector_type, &ddc_bus, |
476 | linkb, igp_lane_info, | 486 | linkb, igp_lane_info, |
477 | connector_object_id, i2c_id.ucAccess); | 487 | connector_object_id); |
478 | 488 | ||
479 | } | 489 | } |
480 | } | 490 | } |
@@ -693,7 +703,7 @@ bool radeon_get_atom_connector_info_from_supported_devices_table(struct | |||
693 | connector_type, | 703 | connector_type, |
694 | &bios_connectors[i].ddc_bus, | 704 | &bios_connectors[i].ddc_bus, |
695 | false, 0, | 705 | false, 0, |
696 | connector_object_id, 0); | 706 | connector_object_id); |
697 | } | 707 | } |
698 | } | 708 | } |
699 | 709 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index 14d3555e4afe..b6761cde1ecb 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
@@ -442,29 +442,39 @@ static uint16_t combios_get_table_offset(struct drm_device *dev, | |||
442 | 442 | ||
443 | } | 443 | } |
444 | 444 | ||
445 | struct radeon_i2c_bus_rec combios_setup_i2c_bus(int ddc_line) | 445 | static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rdev, |
446 | int ddc_line) | ||
446 | { | 447 | { |
447 | struct radeon_i2c_bus_rec i2c; | 448 | struct radeon_i2c_bus_rec i2c; |
448 | 449 | ||
449 | i2c.mask_clk_mask = RADEON_GPIO_EN_1; | 450 | if (ddc_line == RADEON_GPIOPAD_MASK) { |
450 | i2c.mask_data_mask = RADEON_GPIO_EN_0; | 451 | i2c.mask_clk_reg = RADEON_GPIOPAD_MASK; |
451 | i2c.a_clk_mask = RADEON_GPIO_A_1; | 452 | i2c.mask_data_reg = RADEON_GPIOPAD_MASK; |
452 | i2c.a_data_mask = RADEON_GPIO_A_0; | 453 | i2c.a_clk_reg = RADEON_GPIOPAD_A; |
453 | i2c.en_clk_mask = RADEON_GPIO_EN_1; | 454 | i2c.a_data_reg = RADEON_GPIOPAD_A; |
454 | i2c.en_data_mask = RADEON_GPIO_EN_0; | 455 | i2c.en_clk_reg = RADEON_GPIOPAD_EN; |
455 | i2c.y_clk_mask = RADEON_GPIO_Y_1; | 456 | i2c.en_data_reg = RADEON_GPIOPAD_EN; |
456 | i2c.y_data_mask = RADEON_GPIO_Y_0; | 457 | i2c.y_clk_reg = RADEON_GPIOPAD_Y; |
457 | if ((ddc_line == RADEON_LCD_GPIO_MASK) || | 458 | i2c.y_data_reg = RADEON_GPIOPAD_Y; |
458 | (ddc_line == RADEON_MDGPIO_EN_REG)) { | 459 | } else if (ddc_line == RADEON_MDGPIO_MASK) { |
459 | i2c.mask_clk_reg = ddc_line; | 460 | i2c.mask_clk_reg = RADEON_MDGPIO_MASK; |
460 | i2c.mask_data_reg = ddc_line; | 461 | i2c.mask_data_reg = RADEON_MDGPIO_MASK; |
461 | i2c.a_clk_reg = ddc_line; | 462 | i2c.a_clk_reg = RADEON_MDGPIO_A; |
462 | i2c.a_data_reg = ddc_line; | 463 | i2c.a_data_reg = RADEON_MDGPIO_A; |
463 | i2c.en_clk_reg = ddc_line; | 464 | i2c.en_clk_reg = RADEON_MDGPIO_EN; |
464 | i2c.en_data_reg = ddc_line; | 465 | i2c.en_data_reg = RADEON_MDGPIO_EN; |
465 | i2c.y_clk_reg = ddc_line + 4; | 466 | i2c.y_clk_reg = RADEON_MDGPIO_Y; |
466 | i2c.y_data_reg = ddc_line + 4; | 467 | i2c.y_data_reg = RADEON_MDGPIO_Y; |
467 | } else { | 468 | } else { |
469 | i2c.mask_clk_mask = RADEON_GPIO_EN_1; | ||
470 | i2c.mask_data_mask = RADEON_GPIO_EN_0; | ||
471 | i2c.a_clk_mask = RADEON_GPIO_A_1; | ||
472 | i2c.a_data_mask = RADEON_GPIO_A_0; | ||
473 | i2c.en_clk_mask = RADEON_GPIO_EN_1; | ||
474 | i2c.en_data_mask = RADEON_GPIO_EN_0; | ||
475 | i2c.y_clk_mask = RADEON_GPIO_Y_1; | ||
476 | i2c.y_data_mask = RADEON_GPIO_Y_0; | ||
477 | |||
468 | i2c.mask_clk_reg = ddc_line; | 478 | i2c.mask_clk_reg = ddc_line; |
469 | i2c.mask_data_reg = ddc_line; | 479 | i2c.mask_data_reg = ddc_line; |
470 | i2c.a_clk_reg = ddc_line; | 480 | i2c.a_clk_reg = ddc_line; |
@@ -475,6 +485,28 @@ struct radeon_i2c_bus_rec combios_setup_i2c_bus(int ddc_line) | |||
475 | i2c.y_data_reg = ddc_line; | 485 | i2c.y_data_reg = ddc_line; |
476 | } | 486 | } |
477 | 487 | ||
488 | if (rdev->family < CHIP_R200) | ||
489 | i2c.hw_capable = false; | ||
490 | else { | ||
491 | switch (ddc_line) { | ||
492 | case RADEON_GPIO_VGA_DDC: | ||
493 | case RADEON_GPIO_DVI_DDC: | ||
494 | i2c.hw_capable = true; | ||
495 | break; | ||
496 | case RADEON_GPIO_MONID: | ||
497 | /* hw i2c on RADEON_GPIO_MONID doesn't seem to work | ||
498 | * reliably on some pre-r4xx hardware; not sure why. | ||
499 | */ | ||
500 | i2c.hw_capable = false; | ||
501 | break; | ||
502 | default: | ||
503 | i2c.hw_capable = false; | ||
504 | break; | ||
505 | } | ||
506 | } | ||
507 | i2c.mm_i2c = false; | ||
508 | i2c.i2c_id = 0; | ||
509 | |||
478 | if (ddc_line) | 510 | if (ddc_line) |
479 | i2c.valid = true; | 511 | i2c.valid = true; |
480 | else | 512 | else |
@@ -1077,7 +1109,7 @@ bool radeon_legacy_get_ext_tmds_info_from_table(struct radeon_encoder *encoder, | |||
1077 | struct radeon_i2c_bus_rec i2c_bus; | 1109 | struct radeon_i2c_bus_rec i2c_bus; |
1078 | 1110 | ||
1079 | /* default for macs */ | 1111 | /* default for macs */ |
1080 | i2c_bus = combios_setup_i2c_bus(RADEON_GPIO_MONID); | 1112 | i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_MONID); |
1081 | tmds->i2c_bus = radeon_i2c_create(dev, &i2c_bus, "DVO"); | 1113 | tmds->i2c_bus = radeon_i2c_create(dev, &i2c_bus, "DVO"); |
1082 | 1114 | ||
1083 | /* XXX some macs have duallink chips */ | 1115 | /* XXX some macs have duallink chips */ |
@@ -1153,23 +1185,23 @@ bool radeon_legacy_get_ext_tmds_info_from_combios(struct radeon_encoder *encoder | |||
1153 | gpio = RBIOS8(offset + 4 + 3); | 1185 | gpio = RBIOS8(offset + 4 + 3); |
1154 | switch (gpio) { | 1186 | switch (gpio) { |
1155 | case DDC_MONID: | 1187 | case DDC_MONID: |
1156 | i2c_bus = combios_setup_i2c_bus(RADEON_GPIO_MONID); | 1188 | i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_MONID); |
1157 | tmds->i2c_bus = radeon_i2c_create(dev, &i2c_bus, "DVO"); | 1189 | tmds->i2c_bus = radeon_i2c_create(dev, &i2c_bus, "DVO"); |
1158 | break; | 1190 | break; |
1159 | case DDC_DVI: | 1191 | case DDC_DVI: |
1160 | i2c_bus = combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC); | 1192 | i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC); |
1161 | tmds->i2c_bus = radeon_i2c_create(dev, &i2c_bus, "DVO"); | 1193 | tmds->i2c_bus = radeon_i2c_create(dev, &i2c_bus, "DVO"); |
1162 | break; | 1194 | break; |
1163 | case DDC_VGA: | 1195 | case DDC_VGA: |
1164 | i2c_bus = combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC); | 1196 | i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); |
1165 | tmds->i2c_bus = radeon_i2c_create(dev, &i2c_bus, "DVO"); | 1197 | tmds->i2c_bus = radeon_i2c_create(dev, &i2c_bus, "DVO"); |
1166 | break; | 1198 | break; |
1167 | case DDC_CRT2: | 1199 | case DDC_CRT2: |
1168 | /* R3xx+ chips don't have GPIO_CRT2_DDC gpio pad */ | 1200 | /* R3xx+ chips don't have GPIO_CRT2_DDC gpio pad */ |
1169 | if (rdev->family >= CHIP_R300) | 1201 | if (rdev->family >= CHIP_R300) |
1170 | i2c_bus = combios_setup_i2c_bus(RADEON_GPIO_MONID); | 1202 | i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_MONID); |
1171 | else | 1203 | else |
1172 | i2c_bus = combios_setup_i2c_bus(RADEON_GPIO_CRT2_DDC); | 1204 | i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_CRT2_DDC); |
1173 | tmds->i2c_bus = radeon_i2c_create(dev, &i2c_bus, "DVO"); | 1205 | tmds->i2c_bus = radeon_i2c_create(dev, &i2c_bus, "DVO"); |
1174 | break; | 1206 | break; |
1175 | case DDC_LCD: /* MM i2c */ | 1207 | case DDC_LCD: /* MM i2c */ |
@@ -1254,7 +1286,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
1254 | /* these are the most common settings */ | 1286 | /* these are the most common settings */ |
1255 | if (rdev->flags & RADEON_SINGLE_CRTC) { | 1287 | if (rdev->flags & RADEON_SINGLE_CRTC) { |
1256 | /* VGA - primary dac */ | 1288 | /* VGA - primary dac */ |
1257 | ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC); | 1289 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); |
1258 | radeon_add_legacy_encoder(dev, | 1290 | radeon_add_legacy_encoder(dev, |
1259 | radeon_get_encoder_id(dev, | 1291 | radeon_get_encoder_id(dev, |
1260 | ATOM_DEVICE_CRT1_SUPPORT, | 1292 | ATOM_DEVICE_CRT1_SUPPORT, |
@@ -1267,7 +1299,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
1267 | CONNECTOR_OBJECT_ID_VGA); | 1299 | CONNECTOR_OBJECT_ID_VGA); |
1268 | } else if (rdev->flags & RADEON_IS_MOBILITY) { | 1300 | } else if (rdev->flags & RADEON_IS_MOBILITY) { |
1269 | /* LVDS */ | 1301 | /* LVDS */ |
1270 | ddc_i2c = combios_setup_i2c_bus(RADEON_LCD_GPIO_MASK); | 1302 | ddc_i2c = combios_setup_i2c_bus(rdev, 0); |
1271 | radeon_add_legacy_encoder(dev, | 1303 | radeon_add_legacy_encoder(dev, |
1272 | radeon_get_encoder_id(dev, | 1304 | radeon_get_encoder_id(dev, |
1273 | ATOM_DEVICE_LCD1_SUPPORT, | 1305 | ATOM_DEVICE_LCD1_SUPPORT, |
@@ -1280,7 +1312,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
1280 | CONNECTOR_OBJECT_ID_LVDS); | 1312 | CONNECTOR_OBJECT_ID_LVDS); |
1281 | 1313 | ||
1282 | /* VGA - primary dac */ | 1314 | /* VGA - primary dac */ |
1283 | ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC); | 1315 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); |
1284 | radeon_add_legacy_encoder(dev, | 1316 | radeon_add_legacy_encoder(dev, |
1285 | radeon_get_encoder_id(dev, | 1317 | radeon_get_encoder_id(dev, |
1286 | ATOM_DEVICE_CRT1_SUPPORT, | 1318 | ATOM_DEVICE_CRT1_SUPPORT, |
@@ -1293,7 +1325,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
1293 | CONNECTOR_OBJECT_ID_VGA); | 1325 | CONNECTOR_OBJECT_ID_VGA); |
1294 | } else { | 1326 | } else { |
1295 | /* DVI-I - tv dac, int tmds */ | 1327 | /* DVI-I - tv dac, int tmds */ |
1296 | ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC); | 1328 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC); |
1297 | radeon_add_legacy_encoder(dev, | 1329 | radeon_add_legacy_encoder(dev, |
1298 | radeon_get_encoder_id(dev, | 1330 | radeon_get_encoder_id(dev, |
1299 | ATOM_DEVICE_DFP1_SUPPORT, | 1331 | ATOM_DEVICE_DFP1_SUPPORT, |
@@ -1312,7 +1344,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
1312 | CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I); | 1344 | CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I); |
1313 | 1345 | ||
1314 | /* VGA - primary dac */ | 1346 | /* VGA - primary dac */ |
1315 | ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC); | 1347 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); |
1316 | radeon_add_legacy_encoder(dev, | 1348 | radeon_add_legacy_encoder(dev, |
1317 | radeon_get_encoder_id(dev, | 1349 | radeon_get_encoder_id(dev, |
1318 | ATOM_DEVICE_CRT1_SUPPORT, | 1350 | ATOM_DEVICE_CRT1_SUPPORT, |
@@ -1343,7 +1375,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
1343 | DRM_INFO("Connector Table: %d (ibook)\n", | 1375 | DRM_INFO("Connector Table: %d (ibook)\n", |
1344 | rdev->mode_info.connector_table); | 1376 | rdev->mode_info.connector_table); |
1345 | /* LVDS */ | 1377 | /* LVDS */ |
1346 | ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC); | 1378 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC); |
1347 | radeon_add_legacy_encoder(dev, | 1379 | radeon_add_legacy_encoder(dev, |
1348 | radeon_get_encoder_id(dev, | 1380 | radeon_get_encoder_id(dev, |
1349 | ATOM_DEVICE_LCD1_SUPPORT, | 1381 | ATOM_DEVICE_LCD1_SUPPORT, |
@@ -1353,7 +1385,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
1353 | DRM_MODE_CONNECTOR_LVDS, &ddc_i2c, | 1385 | DRM_MODE_CONNECTOR_LVDS, &ddc_i2c, |
1354 | CONNECTOR_OBJECT_ID_LVDS); | 1386 | CONNECTOR_OBJECT_ID_LVDS); |
1355 | /* VGA - TV DAC */ | 1387 | /* VGA - TV DAC */ |
1356 | ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC); | 1388 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); |
1357 | radeon_add_legacy_encoder(dev, | 1389 | radeon_add_legacy_encoder(dev, |
1358 | radeon_get_encoder_id(dev, | 1390 | radeon_get_encoder_id(dev, |
1359 | ATOM_DEVICE_CRT2_SUPPORT, | 1391 | ATOM_DEVICE_CRT2_SUPPORT, |
@@ -1377,7 +1409,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
1377 | DRM_INFO("Connector Table: %d (powerbook external tmds)\n", | 1409 | DRM_INFO("Connector Table: %d (powerbook external tmds)\n", |
1378 | rdev->mode_info.connector_table); | 1410 | rdev->mode_info.connector_table); |
1379 | /* LVDS */ | 1411 | /* LVDS */ |
1380 | ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC); | 1412 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC); |
1381 | radeon_add_legacy_encoder(dev, | 1413 | radeon_add_legacy_encoder(dev, |
1382 | radeon_get_encoder_id(dev, | 1414 | radeon_get_encoder_id(dev, |
1383 | ATOM_DEVICE_LCD1_SUPPORT, | 1415 | ATOM_DEVICE_LCD1_SUPPORT, |
@@ -1387,7 +1419,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
1387 | DRM_MODE_CONNECTOR_LVDS, &ddc_i2c, | 1419 | DRM_MODE_CONNECTOR_LVDS, &ddc_i2c, |
1388 | CONNECTOR_OBJECT_ID_LVDS); | 1420 | CONNECTOR_OBJECT_ID_LVDS); |
1389 | /* DVI-I - primary dac, ext tmds */ | 1421 | /* DVI-I - primary dac, ext tmds */ |
1390 | ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC); | 1422 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); |
1391 | radeon_add_legacy_encoder(dev, | 1423 | radeon_add_legacy_encoder(dev, |
1392 | radeon_get_encoder_id(dev, | 1424 | radeon_get_encoder_id(dev, |
1393 | ATOM_DEVICE_DFP2_SUPPORT, | 1425 | ATOM_DEVICE_DFP2_SUPPORT, |
@@ -1419,7 +1451,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
1419 | DRM_INFO("Connector Table: %d (powerbook internal tmds)\n", | 1451 | DRM_INFO("Connector Table: %d (powerbook internal tmds)\n", |
1420 | rdev->mode_info.connector_table); | 1452 | rdev->mode_info.connector_table); |
1421 | /* LVDS */ | 1453 | /* LVDS */ |
1422 | ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC); | 1454 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC); |
1423 | radeon_add_legacy_encoder(dev, | 1455 | radeon_add_legacy_encoder(dev, |
1424 | radeon_get_encoder_id(dev, | 1456 | radeon_get_encoder_id(dev, |
1425 | ATOM_DEVICE_LCD1_SUPPORT, | 1457 | ATOM_DEVICE_LCD1_SUPPORT, |
@@ -1429,7 +1461,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
1429 | DRM_MODE_CONNECTOR_LVDS, &ddc_i2c, | 1461 | DRM_MODE_CONNECTOR_LVDS, &ddc_i2c, |
1430 | CONNECTOR_OBJECT_ID_LVDS); | 1462 | CONNECTOR_OBJECT_ID_LVDS); |
1431 | /* DVI-I - primary dac, int tmds */ | 1463 | /* DVI-I - primary dac, int tmds */ |
1432 | ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC); | 1464 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); |
1433 | radeon_add_legacy_encoder(dev, | 1465 | radeon_add_legacy_encoder(dev, |
1434 | radeon_get_encoder_id(dev, | 1466 | radeon_get_encoder_id(dev, |
1435 | ATOM_DEVICE_DFP1_SUPPORT, | 1467 | ATOM_DEVICE_DFP1_SUPPORT, |
@@ -1460,7 +1492,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
1460 | DRM_INFO("Connector Table: %d (powerbook vga)\n", | 1492 | DRM_INFO("Connector Table: %d (powerbook vga)\n", |
1461 | rdev->mode_info.connector_table); | 1493 | rdev->mode_info.connector_table); |
1462 | /* LVDS */ | 1494 | /* LVDS */ |
1463 | ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC); | 1495 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC); |
1464 | radeon_add_legacy_encoder(dev, | 1496 | radeon_add_legacy_encoder(dev, |
1465 | radeon_get_encoder_id(dev, | 1497 | radeon_get_encoder_id(dev, |
1466 | ATOM_DEVICE_LCD1_SUPPORT, | 1498 | ATOM_DEVICE_LCD1_SUPPORT, |
@@ -1470,7 +1502,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
1470 | DRM_MODE_CONNECTOR_LVDS, &ddc_i2c, | 1502 | DRM_MODE_CONNECTOR_LVDS, &ddc_i2c, |
1471 | CONNECTOR_OBJECT_ID_LVDS); | 1503 | CONNECTOR_OBJECT_ID_LVDS); |
1472 | /* VGA - primary dac */ | 1504 | /* VGA - primary dac */ |
1473 | ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC); | 1505 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); |
1474 | radeon_add_legacy_encoder(dev, | 1506 | radeon_add_legacy_encoder(dev, |
1475 | radeon_get_encoder_id(dev, | 1507 | radeon_get_encoder_id(dev, |
1476 | ATOM_DEVICE_CRT1_SUPPORT, | 1508 | ATOM_DEVICE_CRT1_SUPPORT, |
@@ -1494,7 +1526,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
1494 | DRM_INFO("Connector Table: %d (mini external tmds)\n", | 1526 | DRM_INFO("Connector Table: %d (mini external tmds)\n", |
1495 | rdev->mode_info.connector_table); | 1527 | rdev->mode_info.connector_table); |
1496 | /* DVI-I - tv dac, ext tmds */ | 1528 | /* DVI-I - tv dac, ext tmds */ |
1497 | ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_CRT2_DDC); | 1529 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_CRT2_DDC); |
1498 | radeon_add_legacy_encoder(dev, | 1530 | radeon_add_legacy_encoder(dev, |
1499 | radeon_get_encoder_id(dev, | 1531 | radeon_get_encoder_id(dev, |
1500 | ATOM_DEVICE_DFP2_SUPPORT, | 1532 | ATOM_DEVICE_DFP2_SUPPORT, |
@@ -1526,7 +1558,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
1526 | DRM_INFO("Connector Table: %d (mini internal tmds)\n", | 1558 | DRM_INFO("Connector Table: %d (mini internal tmds)\n", |
1527 | rdev->mode_info.connector_table); | 1559 | rdev->mode_info.connector_table); |
1528 | /* DVI-I - tv dac, int tmds */ | 1560 | /* DVI-I - tv dac, int tmds */ |
1529 | ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_CRT2_DDC); | 1561 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_CRT2_DDC); |
1530 | radeon_add_legacy_encoder(dev, | 1562 | radeon_add_legacy_encoder(dev, |
1531 | radeon_get_encoder_id(dev, | 1563 | radeon_get_encoder_id(dev, |
1532 | ATOM_DEVICE_DFP1_SUPPORT, | 1564 | ATOM_DEVICE_DFP1_SUPPORT, |
@@ -1557,7 +1589,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
1557 | DRM_INFO("Connector Table: %d (imac g5 isight)\n", | 1589 | DRM_INFO("Connector Table: %d (imac g5 isight)\n", |
1558 | rdev->mode_info.connector_table); | 1590 | rdev->mode_info.connector_table); |
1559 | /* DVI-D - int tmds */ | 1591 | /* DVI-D - int tmds */ |
1560 | ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_MONID); | 1592 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_MONID); |
1561 | radeon_add_legacy_encoder(dev, | 1593 | radeon_add_legacy_encoder(dev, |
1562 | radeon_get_encoder_id(dev, | 1594 | radeon_get_encoder_id(dev, |
1563 | ATOM_DEVICE_DFP1_SUPPORT, | 1595 | ATOM_DEVICE_DFP1_SUPPORT, |
@@ -1567,7 +1599,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
1567 | DRM_MODE_CONNECTOR_DVID, &ddc_i2c, | 1599 | DRM_MODE_CONNECTOR_DVID, &ddc_i2c, |
1568 | CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D); | 1600 | CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D); |
1569 | /* VGA - tv dac */ | 1601 | /* VGA - tv dac */ |
1570 | ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC); | 1602 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC); |
1571 | radeon_add_legacy_encoder(dev, | 1603 | radeon_add_legacy_encoder(dev, |
1572 | radeon_get_encoder_id(dev, | 1604 | radeon_get_encoder_id(dev, |
1573 | ATOM_DEVICE_CRT2_SUPPORT, | 1605 | ATOM_DEVICE_CRT2_SUPPORT, |
@@ -1591,7 +1623,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
1591 | DRM_INFO("Connector Table: %d (emac)\n", | 1623 | DRM_INFO("Connector Table: %d (emac)\n", |
1592 | rdev->mode_info.connector_table); | 1624 | rdev->mode_info.connector_table); |
1593 | /* VGA - primary dac */ | 1625 | /* VGA - primary dac */ |
1594 | ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC); | 1626 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); |
1595 | radeon_add_legacy_encoder(dev, | 1627 | radeon_add_legacy_encoder(dev, |
1596 | radeon_get_encoder_id(dev, | 1628 | radeon_get_encoder_id(dev, |
1597 | ATOM_DEVICE_CRT1_SUPPORT, | 1629 | ATOM_DEVICE_CRT1_SUPPORT, |
@@ -1601,7 +1633,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
1601 | DRM_MODE_CONNECTOR_VGA, &ddc_i2c, | 1633 | DRM_MODE_CONNECTOR_VGA, &ddc_i2c, |
1602 | CONNECTOR_OBJECT_ID_VGA); | 1634 | CONNECTOR_OBJECT_ID_VGA); |
1603 | /* VGA - tv dac */ | 1635 | /* VGA - tv dac */ |
1604 | ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_CRT2_DDC); | 1636 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_CRT2_DDC); |
1605 | radeon_add_legacy_encoder(dev, | 1637 | radeon_add_legacy_encoder(dev, |
1606 | radeon_get_encoder_id(dev, | 1638 | radeon_get_encoder_id(dev, |
1607 | ATOM_DEVICE_CRT2_SUPPORT, | 1639 | ATOM_DEVICE_CRT2_SUPPORT, |
@@ -1644,11 +1676,11 @@ static bool radeon_apply_legacy_quirks(struct drm_device *dev, | |||
1644 | if ((rdev->family == CHIP_RS400 || | 1676 | if ((rdev->family == CHIP_RS400 || |
1645 | rdev->family == CHIP_RS480) && | 1677 | rdev->family == CHIP_RS480) && |
1646 | ddc_i2c->mask_clk_reg == RADEON_GPIO_CRT2_DDC) | 1678 | ddc_i2c->mask_clk_reg == RADEON_GPIO_CRT2_DDC) |
1647 | *ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_MONID); | 1679 | *ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_MONID); |
1648 | else if ((rdev->family == CHIP_RS400 || | 1680 | else if ((rdev->family == CHIP_RS400 || |
1649 | rdev->family == CHIP_RS480) && | 1681 | rdev->family == CHIP_RS480) && |
1650 | ddc_i2c->mask_clk_reg == RADEON_GPIO_MONID) { | 1682 | ddc_i2c->mask_clk_reg == RADEON_GPIO_MONID) { |
1651 | ddc_i2c->valid = true; | 1683 | *ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIOPAD_MASK); |
1652 | ddc_i2c->mask_clk_mask = (0x20 << 8); | 1684 | ddc_i2c->mask_clk_mask = (0x20 << 8); |
1653 | ddc_i2c->mask_data_mask = 0x80; | 1685 | ddc_i2c->mask_data_mask = 0x80; |
1654 | ddc_i2c->a_clk_mask = (0x20 << 8); | 1686 | ddc_i2c->a_clk_mask = (0x20 << 8); |
@@ -1657,20 +1689,12 @@ static bool radeon_apply_legacy_quirks(struct drm_device *dev, | |||
1657 | ddc_i2c->en_data_mask = 0x80; | 1689 | ddc_i2c->en_data_mask = 0x80; |
1658 | ddc_i2c->y_clk_mask = (0x20 << 8); | 1690 | ddc_i2c->y_clk_mask = (0x20 << 8); |
1659 | ddc_i2c->y_data_mask = 0x80; | 1691 | ddc_i2c->y_data_mask = 0x80; |
1660 | ddc_i2c->mask_clk_reg = RADEON_GPIOPAD_MASK; | ||
1661 | ddc_i2c->mask_data_reg = RADEON_GPIOPAD_MASK; | ||
1662 | ddc_i2c->a_clk_reg = RADEON_GPIOPAD_A; | ||
1663 | ddc_i2c->a_data_reg = RADEON_GPIOPAD_A; | ||
1664 | ddc_i2c->en_clk_reg = RADEON_GPIOPAD_EN; | ||
1665 | ddc_i2c->en_data_reg = RADEON_GPIOPAD_EN; | ||
1666 | ddc_i2c->y_clk_reg = RADEON_GPIOPAD_Y; | ||
1667 | ddc_i2c->y_data_reg = RADEON_GPIOPAD_Y; | ||
1668 | } | 1692 | } |
1669 | 1693 | ||
1670 | /* R3xx+ chips don't have GPIO_CRT2_DDC gpio pad */ | 1694 | /* R3xx+ chips don't have GPIO_CRT2_DDC gpio pad */ |
1671 | if ((rdev->family >= CHIP_R300) && | 1695 | if ((rdev->family >= CHIP_R300) && |
1672 | ddc_i2c->mask_clk_reg == RADEON_GPIO_CRT2_DDC) | 1696 | ddc_i2c->mask_clk_reg == RADEON_GPIO_CRT2_DDC) |
1673 | *ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC); | 1697 | *ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC); |
1674 | 1698 | ||
1675 | /* Certain IBM chipset RN50s have a BIOS reporting two VGAs, | 1699 | /* Certain IBM chipset RN50s have a BIOS reporting two VGAs, |
1676 | one with VGA DDC and one with CRT2 DDC. - kill the CRT2 DDC one */ | 1700 | one with VGA DDC and one with CRT2 DDC. - kill the CRT2 DDC one */ |
@@ -1788,19 +1812,19 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev) | |||
1788 | switch (ddc_type) { | 1812 | switch (ddc_type) { |
1789 | case DDC_MONID: | 1813 | case DDC_MONID: |
1790 | ddc_i2c = | 1814 | ddc_i2c = |
1791 | combios_setup_i2c_bus(RADEON_GPIO_MONID); | 1815 | combios_setup_i2c_bus(rdev, RADEON_GPIO_MONID); |
1792 | break; | 1816 | break; |
1793 | case DDC_DVI: | 1817 | case DDC_DVI: |
1794 | ddc_i2c = | 1818 | ddc_i2c = |
1795 | combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC); | 1819 | combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC); |
1796 | break; | 1820 | break; |
1797 | case DDC_VGA: | 1821 | case DDC_VGA: |
1798 | ddc_i2c = | 1822 | ddc_i2c = |
1799 | combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC); | 1823 | combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); |
1800 | break; | 1824 | break; |
1801 | case DDC_CRT2: | 1825 | case DDC_CRT2: |
1802 | ddc_i2c = | 1826 | ddc_i2c = |
1803 | combios_setup_i2c_bus(RADEON_GPIO_CRT2_DDC); | 1827 | combios_setup_i2c_bus(rdev, RADEON_GPIO_CRT2_DDC); |
1804 | break; | 1828 | break; |
1805 | default: | 1829 | default: |
1806 | break; | 1830 | break; |
@@ -1955,7 +1979,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev) | |||
1955 | 0), | 1979 | 0), |
1956 | ATOM_DEVICE_DFP1_SUPPORT); | 1980 | ATOM_DEVICE_DFP1_SUPPORT); |
1957 | 1981 | ||
1958 | ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC); | 1982 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC); |
1959 | radeon_add_legacy_connector(dev, | 1983 | radeon_add_legacy_connector(dev, |
1960 | 0, | 1984 | 0, |
1961 | ATOM_DEVICE_CRT1_SUPPORT | | 1985 | ATOM_DEVICE_CRT1_SUPPORT | |
@@ -1973,7 +1997,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev) | |||
1973 | ATOM_DEVICE_CRT1_SUPPORT, | 1997 | ATOM_DEVICE_CRT1_SUPPORT, |
1974 | 1), | 1998 | 1), |
1975 | ATOM_DEVICE_CRT1_SUPPORT); | 1999 | ATOM_DEVICE_CRT1_SUPPORT); |
1976 | ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC); | 2000 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); |
1977 | radeon_add_legacy_connector(dev, | 2001 | radeon_add_legacy_connector(dev, |
1978 | 0, | 2002 | 0, |
1979 | ATOM_DEVICE_CRT1_SUPPORT, | 2003 | ATOM_DEVICE_CRT1_SUPPORT, |
@@ -2007,27 +2031,27 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev) | |||
2007 | case DDC_MONID: | 2031 | case DDC_MONID: |
2008 | ddc_i2c = | 2032 | ddc_i2c = |
2009 | combios_setup_i2c_bus | 2033 | combios_setup_i2c_bus |
2010 | (RADEON_GPIO_MONID); | 2034 | (rdev, RADEON_GPIO_MONID); |
2011 | break; | 2035 | break; |
2012 | case DDC_DVI: | 2036 | case DDC_DVI: |
2013 | ddc_i2c = | 2037 | ddc_i2c = |
2014 | combios_setup_i2c_bus | 2038 | combios_setup_i2c_bus |
2015 | (RADEON_GPIO_DVI_DDC); | 2039 | (rdev, RADEON_GPIO_DVI_DDC); |
2016 | break; | 2040 | break; |
2017 | case DDC_VGA: | 2041 | case DDC_VGA: |
2018 | ddc_i2c = | 2042 | ddc_i2c = |
2019 | combios_setup_i2c_bus | 2043 | combios_setup_i2c_bus |
2020 | (RADEON_GPIO_VGA_DDC); | 2044 | (rdev, RADEON_GPIO_VGA_DDC); |
2021 | break; | 2045 | break; |
2022 | case DDC_CRT2: | 2046 | case DDC_CRT2: |
2023 | ddc_i2c = | 2047 | ddc_i2c = |
2024 | combios_setup_i2c_bus | 2048 | combios_setup_i2c_bus |
2025 | (RADEON_GPIO_CRT2_DDC); | 2049 | (rdev, RADEON_GPIO_CRT2_DDC); |
2026 | break; | 2050 | break; |
2027 | case DDC_LCD: | 2051 | case DDC_LCD: |
2028 | ddc_i2c = | 2052 | ddc_i2c = |
2029 | combios_setup_i2c_bus | 2053 | combios_setup_i2c_bus |
2030 | (RADEON_LCD_GPIO_MASK); | 2054 | (rdev, RADEON_GPIOPAD_MASK); |
2031 | ddc_i2c.mask_clk_mask = | 2055 | ddc_i2c.mask_clk_mask = |
2032 | RBIOS32(lcd_ddc_info + 3); | 2056 | RBIOS32(lcd_ddc_info + 3); |
2033 | ddc_i2c.mask_data_mask = | 2057 | ddc_i2c.mask_data_mask = |
@@ -2048,7 +2072,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev) | |||
2048 | case DDC_GPIO: | 2072 | case DDC_GPIO: |
2049 | ddc_i2c = | 2073 | ddc_i2c = |
2050 | combios_setup_i2c_bus | 2074 | combios_setup_i2c_bus |
2051 | (RADEON_MDGPIO_EN_REG); | 2075 | (rdev, RADEON_MDGPIO_MASK); |
2052 | ddc_i2c.mask_clk_mask = | 2076 | ddc_i2c.mask_clk_mask = |
2053 | RBIOS32(lcd_ddc_info + 3); | 2077 | RBIOS32(lcd_ddc_info + 3); |
2054 | ddc_i2c.mask_data_mask = | 2078 | ddc_i2c.mask_data_mask = |
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 4d457bc90141..98634ce5ba10 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
@@ -952,7 +952,7 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
952 | struct radeon_i2c_bus_rec *i2c_bus, | 952 | struct radeon_i2c_bus_rec *i2c_bus, |
953 | bool linkb, | 953 | bool linkb, |
954 | uint32_t igp_lane_info, | 954 | uint32_t igp_lane_info, |
955 | uint16_t connector_object_id, uint8_t uc_i2c_id) | 955 | uint16_t connector_object_id) |
956 | { | 956 | { |
957 | struct radeon_device *rdev = dev->dev_private; | 957 | struct radeon_device *rdev = dev->dev_private; |
958 | struct drm_connector *connector; | 958 | struct drm_connector *connector; |
@@ -1083,8 +1083,7 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1083 | if (ret) | 1083 | if (ret) |
1084 | goto failed; | 1084 | goto failed; |
1085 | /* add DP i2c bus */ | 1085 | /* add DP i2c bus */ |
1086 | radeon_dig_connector->uc_i2c_id = uc_i2c_id; | 1086 | radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch"); |
1087 | radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, "DP-auxch", true, uc_i2c_id); | ||
1088 | if (i2c_bus->valid) { | 1087 | if (i2c_bus->valid) { |
1089 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DP"); | 1088 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DP"); |
1090 | if (!radeon_connector->ddc_bus) | 1089 | if (!radeon_connector->ddc_bus) |
diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c b/drivers/gpu/drm/radeon/radeon_i2c.c index f200312dd5df..da3da1e89d00 100644 --- a/drivers/gpu/drm/radeon/radeon_i2c.c +++ b/drivers/gpu/drm/radeon/radeon_i2c.c | |||
@@ -69,13 +69,15 @@ void radeon_i2c_do_lock(struct radeon_i2c_chan *i2c, int lock_state) | |||
69 | * holds the i2c port in a bad state - switch hw i2c away before | 69 | * holds the i2c port in a bad state - switch hw i2c away before |
70 | * doing DDC - do this for all r200s/r300s/r400s for safety sake | 70 | * doing DDC - do this for all r200s/r300s/r400s for safety sake |
71 | */ | 71 | */ |
72 | if ((rdev->family >= CHIP_R200) && !ASIC_IS_AVIVO(rdev)) { | 72 | if (rec->hw_capable) { |
73 | if (rec->a_clk_reg == RADEON_GPIO_MONID) { | 73 | if ((rdev->family >= CHIP_R200) && !ASIC_IS_AVIVO(rdev)) { |
74 | WREG32(RADEON_DVI_I2C_CNTL_0, (RADEON_I2C_SOFT_RST | | 74 | if (rec->a_clk_reg == RADEON_GPIO_MONID) { |
75 | R200_DVI_I2C_PIN_SEL(R200_SEL_DDC1))); | 75 | WREG32(RADEON_DVI_I2C_CNTL_0, (RADEON_I2C_SOFT_RST | |
76 | } else { | 76 | R200_DVI_I2C_PIN_SEL(R200_SEL_DDC1))); |
77 | WREG32(RADEON_DVI_I2C_CNTL_0, (RADEON_I2C_SOFT_RST | | 77 | } else { |
78 | R200_DVI_I2C_PIN_SEL(R200_SEL_DDC3))); | 78 | WREG32(RADEON_DVI_I2C_CNTL_0, (RADEON_I2C_SOFT_RST | |
79 | R200_DVI_I2C_PIN_SEL(R200_SEL_DDC3))); | ||
80 | } | ||
79 | } | 81 | } |
80 | } | 82 | } |
81 | 83 | ||
@@ -86,6 +88,12 @@ void radeon_i2c_do_lock(struct radeon_i2c_chan *i2c, int lock_state) | |||
86 | temp = RREG32(rec->a_data_reg) & ~rec->a_data_mask; | 88 | temp = RREG32(rec->a_data_reg) & ~rec->a_data_mask; |
87 | WREG32(rec->a_data_reg, temp); | 89 | WREG32(rec->a_data_reg, temp); |
88 | 90 | ||
91 | /* set the pins to input */ | ||
92 | temp = RREG32(rec->en_clk_reg) & ~rec->en_clk_mask; | ||
93 | WREG32(rec->en_clk_reg, temp); | ||
94 | |||
95 | temp = RREG32(rec->en_data_reg) & ~rec->en_data_mask; | ||
96 | WREG32(rec->en_data_reg, temp); | ||
89 | 97 | ||
90 | /* mask the gpio pins for software use */ | 98 | /* mask the gpio pins for software use */ |
91 | temp = RREG32(rec->mask_clk_reg); | 99 | temp = RREG32(rec->mask_clk_reg); |
@@ -199,7 +207,8 @@ out_free: | |||
199 | } | 207 | } |
200 | 208 | ||
201 | struct radeon_i2c_chan *radeon_i2c_create_dp(struct drm_device *dev, | 209 | struct radeon_i2c_chan *radeon_i2c_create_dp(struct drm_device *dev, |
202 | const char *name, bool dp, u8 i2c_id) | 210 | struct radeon_i2c_bus_rec *rec, |
211 | const char *name) | ||
203 | { | 212 | { |
204 | struct radeon_i2c_chan *i2c; | 213 | struct radeon_i2c_chan *i2c; |
205 | int ret; | 214 | int ret; |
@@ -208,7 +217,7 @@ struct radeon_i2c_chan *radeon_i2c_create_dp(struct drm_device *dev, | |||
208 | if (i2c == NULL) | 217 | if (i2c == NULL) |
209 | return NULL; | 218 | return NULL; |
210 | 219 | ||
211 | i2c->i2c_id = i2c_id; | 220 | i2c->rec = *rec; |
212 | i2c->adapter.owner = THIS_MODULE; | 221 | i2c->adapter.owner = THIS_MODULE; |
213 | i2c->dev = dev; | 222 | i2c->dev = dev; |
214 | i2c_set_adapdata(&i2c->adapter, i2c); | 223 | i2c_set_adapdata(&i2c->adapter, i2c); |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 166f75395f52..1964afb94dbc 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
@@ -106,6 +106,13 @@ enum radeon_tv_std { | |||
106 | */ | 106 | */ |
107 | struct radeon_i2c_bus_rec { | 107 | struct radeon_i2c_bus_rec { |
108 | bool valid; | 108 | bool valid; |
109 | /* id used by atom */ | ||
110 | uint8_t i2c_id; | ||
111 | /* can be used with hw i2c engine */ | ||
112 | bool hw_capable; | ||
113 | /* uses multi-media i2c engine */ | ||
114 | bool mm_i2c; | ||
115 | /* regs and bits */ | ||
109 | uint32_t mask_clk_reg; | 116 | uint32_t mask_clk_reg; |
110 | uint32_t mask_data_reg; | 117 | uint32_t mask_data_reg; |
111 | uint32_t a_clk_reg; | 118 | uint32_t a_clk_reg; |
@@ -172,7 +179,6 @@ struct radeon_i2c_chan { | |||
172 | struct i2c_algo_bit_data bit; | 179 | struct i2c_algo_bit_data bit; |
173 | } algo; | 180 | } algo; |
174 | struct radeon_i2c_bus_rec rec; | 181 | struct radeon_i2c_bus_rec rec; |
175 | uint8_t i2c_id; | ||
176 | }; | 182 | }; |
177 | 183 | ||
178 | /* mostly for macs, but really any system without connector tables */ | 184 | /* mostly for macs, but really any system without connector tables */ |
@@ -333,7 +339,6 @@ struct radeon_encoder { | |||
333 | struct radeon_connector_atom_dig { | 339 | struct radeon_connector_atom_dig { |
334 | uint32_t igp_lane_info; | 340 | uint32_t igp_lane_info; |
335 | bool linkb; | 341 | bool linkb; |
336 | uint16_t uc_i2c_id; | ||
337 | struct radeon_i2c_chan *dp_i2c_bus; | 342 | struct radeon_i2c_chan *dp_i2c_bus; |
338 | u8 dpcd[8]; | 343 | u8 dpcd[8]; |
339 | }; | 344 | }; |
@@ -352,8 +357,6 @@ struct radeon_connector { | |||
352 | void *con_priv; | 357 | void *con_priv; |
353 | bool dac_load_detect; | 358 | bool dac_load_detect; |
354 | uint16_t connector_object_id; | 359 | uint16_t connector_object_id; |
355 | /* need to keep this for display port */ | ||
356 | // | ||
357 | }; | 360 | }; |
358 | 361 | ||
359 | struct radeon_framebuffer { | 362 | struct radeon_framebuffer { |
@@ -362,12 +365,13 @@ struct radeon_framebuffer { | |||
362 | }; | 365 | }; |
363 | 366 | ||
364 | extern int radeon_dp_getsinktype(struct radeon_connector *radeon_connector); | 367 | extern int radeon_dp_getsinktype(struct radeon_connector *radeon_connector); |
365 | extern void radeon_dp_getdpcd(struct radeon_connector *connector); | 368 | extern void radeon_dp_getdpcd(struct radeon_connector *radeon_connector); |
366 | extern int radeon_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode, | 369 | extern int radeon_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode, |
367 | uint8_t write_byte, uint8_t *read_byte); | 370 | uint8_t write_byte, uint8_t *read_byte); |
368 | 371 | ||
369 | extern struct radeon_i2c_chan *radeon_i2c_create_dp(struct drm_device *dev, | 372 | extern struct radeon_i2c_chan *radeon_i2c_create_dp(struct drm_device *dev, |
370 | const char *name, bool dp, u8 i2c_id); | 373 | struct radeon_i2c_bus_rec *rec, |
374 | const char *name); | ||
371 | extern struct radeon_i2c_chan *radeon_i2c_create(struct drm_device *dev, | 375 | extern struct radeon_i2c_chan *radeon_i2c_create(struct drm_device *dev, |
372 | struct radeon_i2c_bus_rec *rec, | 376 | struct radeon_i2c_bus_rec *rec, |
373 | const char *name); | 377 | const char *name); |
diff --git a/drivers/gpu/drm/radeon/radeon_reg.h b/drivers/gpu/drm/radeon/radeon_reg.h index c4c41c8d908c..b8116401ffae 100644 --- a/drivers/gpu/drm/radeon/radeon_reg.h +++ b/drivers/gpu/drm/radeon/radeon_reg.h | |||
@@ -1148,16 +1148,16 @@ | |||
1148 | # define RADEON_IO_MCLK_MAX_DYN_STOP_LAT (1 << 13) | 1148 | # define RADEON_IO_MCLK_MAX_DYN_STOP_LAT (1 << 13) |
1149 | # define RADEON_MC_MCLK_DYN_ENABLE (1 << 14) | 1149 | # define RADEON_MC_MCLK_DYN_ENABLE (1 << 14) |
1150 | # define RADEON_IO_MCLK_DYN_ENABLE (1 << 15) | 1150 | # define RADEON_IO_MCLK_DYN_ENABLE (1 << 15) |
1151 | |||
1151 | #define RADEON_GPIOPAD_MASK 0x0198 | 1152 | #define RADEON_GPIOPAD_MASK 0x0198 |
1152 | #define RADEON_GPIOPAD_A 0x019c | 1153 | #define RADEON_GPIOPAD_A 0x019c |
1153 | #define RADEON_GPIOPAD_EN 0x01a0 | 1154 | #define RADEON_GPIOPAD_EN 0x01a0 |
1154 | #define RADEON_GPIOPAD_Y 0x01a4 | 1155 | #define RADEON_GPIOPAD_Y 0x01a4 |
1155 | #define RADEON_LCD_GPIO_MASK 0x01a0 | 1156 | #define RADEON_MDGPIO_MASK 0x01a8 |
1156 | #define RADEON_LCD_GPIO_Y_REG 0x01a4 | 1157 | #define RADEON_MDGPIO_A 0x01ac |
1157 | #define RADEON_MDGPIO_A_REG 0x01ac | 1158 | #define RADEON_MDGPIO_EN 0x01b0 |
1158 | #define RADEON_MDGPIO_EN_REG 0x01b0 | 1159 | #define RADEON_MDGPIO_Y 0x01b4 |
1159 | #define RADEON_MDGPIO_MASK 0x0198 | 1160 | |
1160 | #define RADEON_MDGPIO_Y_REG 0x01b4 | ||
1161 | #define RADEON_MEM_ADDR_CONFIG 0x0148 | 1161 | #define RADEON_MEM_ADDR_CONFIG 0x0148 |
1162 | #define RADEON_MEM_BASE 0x0f10 /* PCI */ | 1162 | #define RADEON_MEM_BASE 0x0f10 /* PCI */ |
1163 | #define RADEON_MEM_CNTL 0x0140 | 1163 | #define RADEON_MEM_CNTL 0x0140 |