diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2011-10-25 20:17:45 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-11-01 12:04:53 -0400 |
commit | c41384f8279f6eeecfe186976f67c2a513f3c81b (patch) | |
tree | 17b83521392921cb46edbe6ee3e9212b924a0a61 | |
parent | fdca78c3b8876e47f1c92b3b28693b261bfd913a (diff) |
drm/radeon/kms/atom: rework encoder dpms
The existing function was getting too big and complex.
Break it down into a more manageable set of functions.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_encoders.c | 338 |
1 files changed, 186 insertions, 152 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index 9838865e223b..f01b6b135b99 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c | |||
@@ -1356,45 +1356,25 @@ atombios_yuv_setup(struct drm_encoder *encoder, bool enable) | |||
1356 | } | 1356 | } |
1357 | 1357 | ||
1358 | static void | 1358 | static void |
1359 | radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode) | 1359 | radeon_atom_encoder_dpms_avivo(struct drm_encoder *encoder, int mode) |
1360 | { | 1360 | { |
1361 | struct drm_device *dev = encoder->dev; | 1361 | struct drm_device *dev = encoder->dev; |
1362 | struct radeon_device *rdev = dev->dev_private; | 1362 | struct radeon_device *rdev = dev->dev_private; |
1363 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 1363 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
1364 | struct drm_encoder *ext_encoder = radeon_atom_get_external_encoder(encoder); | ||
1365 | DISPLAY_DEVICE_OUTPUT_CONTROL_PS_ALLOCATION args; | 1364 | DISPLAY_DEVICE_OUTPUT_CONTROL_PS_ALLOCATION args; |
1366 | int index = 0; | 1365 | int index = 0; |
1367 | bool is_dig = false; | ||
1368 | bool is_dce5_dac = false; | ||
1369 | bool is_dce5_dvo = false; | ||
1370 | 1366 | ||
1371 | memset(&args, 0, sizeof(args)); | 1367 | memset(&args, 0, sizeof(args)); |
1372 | 1368 | ||
1373 | DRM_DEBUG_KMS("encoder dpms %d to mode %d, devices %08x, active_devices %08x\n", | ||
1374 | radeon_encoder->encoder_id, mode, radeon_encoder->devices, | ||
1375 | radeon_encoder->active_device); | ||
1376 | switch (radeon_encoder->encoder_id) { | 1369 | switch (radeon_encoder->encoder_id) { |
1377 | case ENCODER_OBJECT_ID_INTERNAL_TMDS1: | 1370 | case ENCODER_OBJECT_ID_INTERNAL_TMDS1: |
1378 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: | 1371 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: |
1379 | index = GetIndexIntoMasterTable(COMMAND, TMDSAOutputControl); | 1372 | index = GetIndexIntoMasterTable(COMMAND, TMDSAOutputControl); |
1380 | break; | 1373 | break; |
1381 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: | ||
1382 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: | ||
1383 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: | ||
1384 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: | ||
1385 | is_dig = true; | ||
1386 | break; | ||
1387 | case ENCODER_OBJECT_ID_INTERNAL_DVO1: | 1374 | case ENCODER_OBJECT_ID_INTERNAL_DVO1: |
1388 | case ENCODER_OBJECT_ID_INTERNAL_DDI: | 1375 | case ENCODER_OBJECT_ID_INTERNAL_DDI: |
1389 | index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl); | ||
1390 | break; | ||
1391 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: | 1376 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: |
1392 | if (ASIC_IS_DCE5(rdev)) | 1377 | index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl); |
1393 | is_dce5_dvo = true; | ||
1394 | else if (ASIC_IS_DCE3(rdev)) | ||
1395 | is_dig = true; | ||
1396 | else | ||
1397 | index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl); | ||
1398 | break; | 1378 | break; |
1399 | case ENCODER_OBJECT_ID_INTERNAL_LVDS: | 1379 | case ENCODER_OBJECT_ID_INTERNAL_LVDS: |
1400 | index = GetIndexIntoMasterTable(COMMAND, LCD1OutputControl); | 1380 | index = GetIndexIntoMasterTable(COMMAND, LCD1OutputControl); |
@@ -1407,16 +1387,12 @@ radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode) | |||
1407 | break; | 1387 | break; |
1408 | case ENCODER_OBJECT_ID_INTERNAL_DAC1: | 1388 | case ENCODER_OBJECT_ID_INTERNAL_DAC1: |
1409 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: | 1389 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: |
1410 | if (ASIC_IS_DCE5(rdev)) | 1390 | if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) |
1411 | is_dce5_dac = true; | 1391 | index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl); |
1412 | else { | 1392 | else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT)) |
1413 | if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) | 1393 | index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl); |
1414 | index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl); | 1394 | else |
1415 | else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT)) | 1395 | index = GetIndexIntoMasterTable(COMMAND, DAC1OutputControl); |
1416 | index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl); | ||
1417 | else | ||
1418 | index = GetIndexIntoMasterTable(COMMAND, DAC1OutputControl); | ||
1419 | } | ||
1420 | break; | 1396 | break; |
1421 | case ENCODER_OBJECT_ID_INTERNAL_DAC2: | 1397 | case ENCODER_OBJECT_ID_INTERNAL_DAC2: |
1422 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2: | 1398 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2: |
@@ -1427,138 +1403,196 @@ radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode) | |||
1427 | else | 1403 | else |
1428 | index = GetIndexIntoMasterTable(COMMAND, DAC2OutputControl); | 1404 | index = GetIndexIntoMasterTable(COMMAND, DAC2OutputControl); |
1429 | break; | 1405 | break; |
1406 | default: | ||
1407 | return; | ||
1430 | } | 1408 | } |
1431 | 1409 | ||
1432 | if (is_dig) { | 1410 | switch (mode) { |
1433 | switch (mode) { | 1411 | case DRM_MODE_DPMS_ON: |
1434 | case DRM_MODE_DPMS_ON: | 1412 | args.ucAction = ATOM_ENABLE; |
1435 | /* some early dce3.2 boards have a bug in their transmitter control table */ | 1413 | /* workaround for DVOOutputControl on some RS690 systems */ |
1436 | if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730)) | 1414 | if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DDI) { |
1437 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); | 1415 | u32 reg = RREG32(RADEON_BIOS_3_SCRATCH); |
1438 | else | 1416 | WREG32(RADEON_BIOS_3_SCRATCH, reg & ~ATOM_S3_DFP2I_ACTIVE); |
1439 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); | 1417 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); |
1440 | if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP) { | 1418 | WREG32(RADEON_BIOS_3_SCRATCH, reg); |
1441 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); | 1419 | } else |
1420 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | ||
1421 | if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { | ||
1422 | args.ucAction = ATOM_LCD_BLON; | ||
1423 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | ||
1424 | } | ||
1425 | break; | ||
1426 | case DRM_MODE_DPMS_STANDBY: | ||
1427 | case DRM_MODE_DPMS_SUSPEND: | ||
1428 | case DRM_MODE_DPMS_OFF: | ||
1429 | args.ucAction = ATOM_DISABLE; | ||
1430 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | ||
1431 | if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { | ||
1432 | args.ucAction = ATOM_LCD_BLOFF; | ||
1433 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | ||
1434 | } | ||
1435 | break; | ||
1436 | } | ||
1437 | } | ||
1442 | 1438 | ||
1443 | if (connector && | 1439 | static void |
1444 | (connector->connector_type == DRM_MODE_CONNECTOR_eDP)) { | 1440 | radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) |
1445 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); | 1441 | { |
1446 | struct radeon_connector_atom_dig *radeon_dig_connector = | 1442 | struct drm_device *dev = encoder->dev; |
1447 | radeon_connector->con_priv; | 1443 | struct radeon_device *rdev = dev->dev_private; |
1448 | atombios_set_edp_panel_power(connector, | 1444 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
1449 | ATOM_TRANSMITTER_ACTION_POWER_ON); | 1445 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
1450 | radeon_dig_connector->edp_on = true; | 1446 | struct radeon_connector *radeon_connector = NULL; |
1451 | } | 1447 | struct radeon_connector_atom_dig *radeon_dig_connector = NULL; |
1452 | if (ASIC_IS_DCE4(rdev)) | ||
1453 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0); | ||
1454 | radeon_dp_link_train(encoder, connector); | ||
1455 | if (ASIC_IS_DCE4(rdev)) | ||
1456 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0); | ||
1457 | } | ||
1458 | if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) | ||
1459 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_LCD_BLON, 0, 0); | ||
1460 | break; | ||
1461 | case DRM_MODE_DPMS_STANDBY: | ||
1462 | case DRM_MODE_DPMS_SUSPEND: | ||
1463 | case DRM_MODE_DPMS_OFF: | ||
1464 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT, 0, 0); | ||
1465 | if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP) { | ||
1466 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); | ||
1467 | 1448 | ||
1468 | if (ASIC_IS_DCE4(rdev)) | 1449 | if (connector) { |
1469 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0); | 1450 | radeon_connector = to_radeon_connector(connector); |
1470 | if (connector && | 1451 | radeon_dig_connector = radeon_connector->con_priv; |
1471 | (connector->connector_type == DRM_MODE_CONNECTOR_eDP)) { | 1452 | } |
1472 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); | 1453 | |
1473 | struct radeon_connector_atom_dig *radeon_dig_connector = | 1454 | switch (mode) { |
1474 | radeon_connector->con_priv; | 1455 | case DRM_MODE_DPMS_ON: |
1475 | atombios_set_edp_panel_power(connector, | 1456 | /* some early dce3.2 boards have a bug in their transmitter control table */ |
1476 | ATOM_TRANSMITTER_ACTION_POWER_OFF); | 1457 | if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730)) |
1477 | radeon_dig_connector->edp_on = false; | 1458 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); |
1478 | } | 1459 | else |
1460 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); | ||
1461 | if ((atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP) && connector) { | ||
1462 | if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { | ||
1463 | atombios_set_edp_panel_power(connector, | ||
1464 | ATOM_TRANSMITTER_ACTION_POWER_ON); | ||
1465 | radeon_dig_connector->edp_on = true; | ||
1479 | } | 1466 | } |
1480 | if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) | 1467 | if (ASIC_IS_DCE4(rdev)) |
1481 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_LCD_BLOFF, 0, 0); | 1468 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0); |
1482 | break; | 1469 | radeon_dp_link_train(encoder, connector); |
1483 | } | 1470 | if (ASIC_IS_DCE4(rdev)) |
1484 | } else if (is_dce5_dac) { | 1471 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0); |
1485 | switch (mode) { | ||
1486 | case DRM_MODE_DPMS_ON: | ||
1487 | atombios_dac_setup(encoder, ATOM_ENABLE); | ||
1488 | break; | ||
1489 | case DRM_MODE_DPMS_STANDBY: | ||
1490 | case DRM_MODE_DPMS_SUSPEND: | ||
1491 | case DRM_MODE_DPMS_OFF: | ||
1492 | atombios_dac_setup(encoder, ATOM_DISABLE); | ||
1493 | break; | ||
1494 | } | ||
1495 | } else if (is_dce5_dvo) { | ||
1496 | switch (mode) { | ||
1497 | case DRM_MODE_DPMS_ON: | ||
1498 | atombios_dvo_setup(encoder, ATOM_ENABLE); | ||
1499 | break; | ||
1500 | case DRM_MODE_DPMS_STANDBY: | ||
1501 | case DRM_MODE_DPMS_SUSPEND: | ||
1502 | case DRM_MODE_DPMS_OFF: | ||
1503 | atombios_dvo_setup(encoder, ATOM_DISABLE); | ||
1504 | break; | ||
1505 | } | 1472 | } |
1506 | } else { | 1473 | if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) |
1507 | switch (mode) { | 1474 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_LCD_BLON, 0, 0); |
1508 | case DRM_MODE_DPMS_ON: | 1475 | break; |
1509 | args.ucAction = ATOM_ENABLE; | 1476 | case DRM_MODE_DPMS_STANDBY: |
1510 | /* workaround for DVOOutputControl on some RS690 systems */ | 1477 | case DRM_MODE_DPMS_SUSPEND: |
1511 | if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DDI) { | 1478 | case DRM_MODE_DPMS_OFF: |
1512 | u32 reg = RREG32(RADEON_BIOS_3_SCRATCH); | 1479 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT, 0, 0); |
1513 | WREG32(RADEON_BIOS_3_SCRATCH, reg & ~ATOM_S3_DFP2I_ACTIVE); | 1480 | if ((atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP) && connector) { |
1514 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | 1481 | if (ASIC_IS_DCE4(rdev)) |
1515 | WREG32(RADEON_BIOS_3_SCRATCH, reg); | 1482 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0); |
1516 | } else | 1483 | if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { |
1517 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | 1484 | atombios_set_edp_panel_power(connector, |
1518 | if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { | 1485 | ATOM_TRANSMITTER_ACTION_POWER_OFF); |
1519 | args.ucAction = ATOM_LCD_BLON; | 1486 | radeon_dig_connector->edp_on = false; |
1520 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | ||
1521 | } | ||
1522 | break; | ||
1523 | case DRM_MODE_DPMS_STANDBY: | ||
1524 | case DRM_MODE_DPMS_SUSPEND: | ||
1525 | case DRM_MODE_DPMS_OFF: | ||
1526 | args.ucAction = ATOM_DISABLE; | ||
1527 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | ||
1528 | if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { | ||
1529 | args.ucAction = ATOM_LCD_BLOFF; | ||
1530 | atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); | ||
1531 | } | 1487 | } |
1532 | break; | ||
1533 | } | 1488 | } |
1489 | if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) | ||
1490 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_LCD_BLOFF, 0, 0); | ||
1491 | break; | ||
1534 | } | 1492 | } |
1493 | } | ||
1535 | 1494 | ||
1536 | if (ext_encoder) { | 1495 | static void |
1537 | switch (mode) { | 1496 | radeon_atom_encoder_dpms_ext(struct drm_encoder *encoder, |
1538 | case DRM_MODE_DPMS_ON: | 1497 | struct drm_encoder *ext_encoder, |
1539 | default: | 1498 | int mode) |
1540 | if (ASIC_IS_DCE41(rdev)) { | 1499 | { |
1541 | atombios_external_encoder_setup(encoder, ext_encoder, | 1500 | struct drm_device *dev = encoder->dev; |
1542 | EXTERNAL_ENCODER_ACTION_V3_ENABLE_OUTPUT); | 1501 | struct radeon_device *rdev = dev->dev_private; |
1543 | atombios_external_encoder_setup(encoder, ext_encoder, | 1502 | |
1544 | EXTERNAL_ENCODER_ACTION_V3_ENCODER_BLANKING_OFF); | 1503 | switch (mode) { |
1545 | } else | 1504 | case DRM_MODE_DPMS_ON: |
1546 | atombios_external_encoder_setup(encoder, ext_encoder, ATOM_ENABLE); | 1505 | default: |
1547 | break; | 1506 | if (ASIC_IS_DCE41(rdev)) { |
1548 | case DRM_MODE_DPMS_STANDBY: | 1507 | atombios_external_encoder_setup(encoder, ext_encoder, |
1549 | case DRM_MODE_DPMS_SUSPEND: | 1508 | EXTERNAL_ENCODER_ACTION_V3_ENABLE_OUTPUT); |
1550 | case DRM_MODE_DPMS_OFF: | 1509 | atombios_external_encoder_setup(encoder, ext_encoder, |
1551 | if (ASIC_IS_DCE41(rdev)) { | 1510 | EXTERNAL_ENCODER_ACTION_V3_ENCODER_BLANKING_OFF); |
1552 | atombios_external_encoder_setup(encoder, ext_encoder, | 1511 | } else |
1553 | EXTERNAL_ENCODER_ACTION_V3_ENCODER_BLANKING); | 1512 | atombios_external_encoder_setup(encoder, ext_encoder, ATOM_ENABLE); |
1554 | atombios_external_encoder_setup(encoder, ext_encoder, | 1513 | break; |
1555 | EXTERNAL_ENCODER_ACTION_V3_DISABLE_OUTPUT); | 1514 | case DRM_MODE_DPMS_STANDBY: |
1556 | } else | 1515 | case DRM_MODE_DPMS_SUSPEND: |
1557 | atombios_external_encoder_setup(encoder, ext_encoder, ATOM_DISABLE); | 1516 | case DRM_MODE_DPMS_OFF: |
1558 | break; | 1517 | if (ASIC_IS_DCE41(rdev)) { |
1559 | } | 1518 | atombios_external_encoder_setup(encoder, ext_encoder, |
1519 | EXTERNAL_ENCODER_ACTION_V3_ENCODER_BLANKING); | ||
1520 | atombios_external_encoder_setup(encoder, ext_encoder, | ||
1521 | EXTERNAL_ENCODER_ACTION_V3_DISABLE_OUTPUT); | ||
1522 | } else | ||
1523 | atombios_external_encoder_setup(encoder, ext_encoder, ATOM_DISABLE); | ||
1524 | break; | ||
1525 | } | ||
1526 | } | ||
1527 | |||
1528 | static void | ||
1529 | radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode) | ||
1530 | { | ||
1531 | struct drm_device *dev = encoder->dev; | ||
1532 | struct radeon_device *rdev = dev->dev_private; | ||
1533 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | ||
1534 | struct drm_encoder *ext_encoder = radeon_atom_get_external_encoder(encoder); | ||
1535 | |||
1536 | DRM_DEBUG_KMS("encoder dpms %d to mode %d, devices %08x, active_devices %08x\n", | ||
1537 | radeon_encoder->encoder_id, mode, radeon_encoder->devices, | ||
1538 | radeon_encoder->active_device); | ||
1539 | switch (radeon_encoder->encoder_id) { | ||
1540 | case ENCODER_OBJECT_ID_INTERNAL_TMDS1: | ||
1541 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: | ||
1542 | case ENCODER_OBJECT_ID_INTERNAL_LVDS: | ||
1543 | case ENCODER_OBJECT_ID_INTERNAL_LVTM1: | ||
1544 | case ENCODER_OBJECT_ID_INTERNAL_DVO1: | ||
1545 | case ENCODER_OBJECT_ID_INTERNAL_DDI: | ||
1546 | case ENCODER_OBJECT_ID_INTERNAL_DAC2: | ||
1547 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2: | ||
1548 | radeon_atom_encoder_dpms_avivo(encoder, mode); | ||
1549 | break; | ||
1550 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: | ||
1551 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: | ||
1552 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: | ||
1553 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: | ||
1554 | radeon_atom_encoder_dpms_dig(encoder, mode); | ||
1555 | break; | ||
1556 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: | ||
1557 | if (ASIC_IS_DCE5(rdev)) { | ||
1558 | switch (mode) { | ||
1559 | case DRM_MODE_DPMS_ON: | ||
1560 | atombios_dvo_setup(encoder, ATOM_ENABLE); | ||
1561 | break; | ||
1562 | case DRM_MODE_DPMS_STANDBY: | ||
1563 | case DRM_MODE_DPMS_SUSPEND: | ||
1564 | case DRM_MODE_DPMS_OFF: | ||
1565 | atombios_dvo_setup(encoder, ATOM_DISABLE); | ||
1566 | break; | ||
1567 | } | ||
1568 | } else if (ASIC_IS_DCE3(rdev)) | ||
1569 | radeon_atom_encoder_dpms_dig(encoder, mode); | ||
1570 | else | ||
1571 | radeon_atom_encoder_dpms_avivo(encoder, mode); | ||
1572 | break; | ||
1573 | case ENCODER_OBJECT_ID_INTERNAL_DAC1: | ||
1574 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: | ||
1575 | if (ASIC_IS_DCE5(rdev)) { | ||
1576 | switch (mode) { | ||
1577 | case DRM_MODE_DPMS_ON: | ||
1578 | atombios_dac_setup(encoder, ATOM_ENABLE); | ||
1579 | break; | ||
1580 | case DRM_MODE_DPMS_STANDBY: | ||
1581 | case DRM_MODE_DPMS_SUSPEND: | ||
1582 | case DRM_MODE_DPMS_OFF: | ||
1583 | atombios_dac_setup(encoder, ATOM_DISABLE); | ||
1584 | break; | ||
1585 | } | ||
1586 | } else | ||
1587 | radeon_atom_encoder_dpms_avivo(encoder, mode); | ||
1588 | break; | ||
1589 | default: | ||
1590 | return; | ||
1560 | } | 1591 | } |
1561 | 1592 | ||
1593 | if (ext_encoder) | ||
1594 | radeon_atom_encoder_dpms_ext(encoder, ext_encoder, mode); | ||
1595 | |||
1562 | radeon_atombios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false); | 1596 | radeon_atombios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false); |
1563 | 1597 | ||
1564 | } | 1598 | } |