aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2012-08-17 10:31:34 -0400
committerAlex Deucher <alexander.deucher@amd.com>2012-09-20 13:10:38 -0400
commit1f0e29435386e42c942ee8385d10dbfc814f5cfe (patch)
treedaf1dd775247307bef30621a63757f83ec944312
parent37e9b6a62fb775276f8edb5bd2b9f13a3102b9dd (diff)
drm/radeon/atom: add consolidate bpc code
Several encoder setup functions had the same duplicated code for selecting the proper bpc setting for various atom tables. Consolidate it. Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/radeon/atombios_encoders.c96
1 files changed, 29 insertions, 67 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c
index f9910f099e6e..dac32c8f76c4 100644
--- a/drivers/gpu/drm/radeon/atombios_encoders.c
+++ b/drivers/gpu/drm/radeon/atombios_encoders.c
@@ -439,6 +439,32 @@ atombios_tv_setup(struct drm_encoder *encoder, int action)
439 439
440} 440}
441 441
442static u8 radeon_atom_get_bpc(struct drm_encoder *encoder)
443{
444 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
445 int bpc = 8;
446
447 if (connector)
448 bpc = radeon_get_monitor_bpc(connector);
449
450 switch (bpc) {
451 case 0:
452 return PANEL_BPC_UNDEFINE;
453 case 6:
454 return PANEL_6BIT_PER_COLOR;
455 case 8:
456 default:
457 return PANEL_8BIT_PER_COLOR;
458 case 10:
459 return PANEL_10BIT_PER_COLOR;
460 case 12:
461 return PANEL_12BIT_PER_COLOR;
462 case 16:
463 return PANEL_16BIT_PER_COLOR;
464 }
465}
466
467
442union dvo_encoder_control { 468union dvo_encoder_control {
443 ENABLE_EXTERNAL_TMDS_ENCODER_PS_ALLOCATION ext_tmds; 469 ENABLE_EXTERNAL_TMDS_ENCODER_PS_ALLOCATION ext_tmds;
444 DVO_ENCODER_CONTROL_PS_ALLOCATION dvo; 470 DVO_ENCODER_CONTROL_PS_ALLOCATION dvo;
@@ -765,7 +791,6 @@ atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mo
765 int dp_clock = 0; 791 int dp_clock = 0;
766 int dp_lane_count = 0; 792 int dp_lane_count = 0;
767 int hpd_id = RADEON_HPD_NONE; 793 int hpd_id = RADEON_HPD_NONE;
768 int bpc = 8;
769 794
770 if (connector) { 795 if (connector) {
771 struct radeon_connector *radeon_connector = to_radeon_connector(connector); 796 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
@@ -775,7 +800,6 @@ atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mo
775 dp_clock = dig_connector->dp_clock; 800 dp_clock = dig_connector->dp_clock;
776 dp_lane_count = dig_connector->dp_lane_count; 801 dp_lane_count = dig_connector->dp_lane_count;
777 hpd_id = radeon_connector->hpd.hpd; 802 hpd_id = radeon_connector->hpd.hpd;
778 bpc = radeon_get_monitor_bpc(connector);
779 } 803 }
780 804
781 /* no dig encoder assigned */ 805 /* no dig encoder assigned */
@@ -852,27 +876,7 @@ atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mo
852 if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode) && (dp_clock == 270000)) 876 if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode) && (dp_clock == 270000))
853 args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V3_DPLINKRATE_2_70GHZ; 877 args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V3_DPLINKRATE_2_70GHZ;
854 args.v3.acConfig.ucDigSel = dig->dig_encoder; 878 args.v3.acConfig.ucDigSel = dig->dig_encoder;
855 switch (bpc) { 879 args.v3.ucBitPerColor = radeon_atom_get_bpc(encoder);
856 case 0:
857 args.v3.ucBitPerColor = PANEL_BPC_UNDEFINE;
858 break;
859 case 6:
860 args.v3.ucBitPerColor = PANEL_6BIT_PER_COLOR;
861 break;
862 case 8:
863 default:
864 args.v3.ucBitPerColor = PANEL_8BIT_PER_COLOR;
865 break;
866 case 10:
867 args.v3.ucBitPerColor = PANEL_10BIT_PER_COLOR;
868 break;
869 case 12:
870 args.v3.ucBitPerColor = PANEL_12BIT_PER_COLOR;
871 break;
872 case 16:
873 args.v3.ucBitPerColor = PANEL_16BIT_PER_COLOR;
874 break;
875 }
876 break; 880 break;
877 case 4: 881 case 4:
878 args.v4.ucAction = action; 882 args.v4.ucAction = action;
@@ -896,27 +900,7 @@ atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mo
896 args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_5_40GHZ; 900 args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_5_40GHZ;
897 } 901 }
898 args.v4.acConfig.ucDigSel = dig->dig_encoder; 902 args.v4.acConfig.ucDigSel = dig->dig_encoder;
899 switch (bpc) { 903 args.v4.ucBitPerColor = radeon_atom_get_bpc(encoder);
900 case 0:
901 args.v4.ucBitPerColor = PANEL_BPC_UNDEFINE;
902 break;
903 case 6:
904 args.v4.ucBitPerColor = PANEL_6BIT_PER_COLOR;
905 break;
906 case 8:
907 default:
908 args.v4.ucBitPerColor = PANEL_8BIT_PER_COLOR;
909 break;
910 case 10:
911 args.v4.ucBitPerColor = PANEL_10BIT_PER_COLOR;
912 break;
913 case 12:
914 args.v4.ucBitPerColor = PANEL_12BIT_PER_COLOR;
915 break;
916 case 16:
917 args.v4.ucBitPerColor = PANEL_16BIT_PER_COLOR;
918 break;
919 }
920 if (hpd_id == RADEON_HPD_NONE) 904 if (hpd_id == RADEON_HPD_NONE)
921 args.v4.ucHPD_ID = 0; 905 args.v4.ucHPD_ID = 0;
922 else 906 else
@@ -1377,7 +1361,6 @@ atombios_external_encoder_setup(struct drm_encoder *encoder,
1377 int dp_lane_count = 0; 1361 int dp_lane_count = 0;
1378 int connector_object_id = 0; 1362 int connector_object_id = 0;
1379 u32 ext_enum = (ext_radeon_encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT; 1363 u32 ext_enum = (ext_radeon_encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT;
1380 int bpc = 8;
1381 1364
1382 if (action == EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT) 1365 if (action == EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT)
1383 connector = radeon_get_connector_for_encoder_init(encoder); 1366 connector = radeon_get_connector_for_encoder_init(encoder);
@@ -1393,7 +1376,6 @@ atombios_external_encoder_setup(struct drm_encoder *encoder,
1393 dp_lane_count = dig_connector->dp_lane_count; 1376 dp_lane_count = dig_connector->dp_lane_count;
1394 connector_object_id = 1377 connector_object_id =
1395 (radeon_connector->connector_object_id & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; 1378 (radeon_connector->connector_object_id & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
1396 bpc = radeon_get_monitor_bpc(connector);
1397 } 1379 }
1398 1380
1399 memset(&args, 0, sizeof(args)); 1381 memset(&args, 0, sizeof(args));
@@ -1451,27 +1433,7 @@ atombios_external_encoder_setup(struct drm_encoder *encoder,
1451 args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_ENCODER3; 1433 args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_ENCODER3;
1452 break; 1434 break;
1453 } 1435 }
1454 switch (bpc) { 1436 args.v3.sExtEncoder.ucBitPerColor = radeon_atom_get_bpc(encoder);
1455 case 0:
1456 args.v3.sExtEncoder.ucBitPerColor = PANEL_BPC_UNDEFINE;
1457 break;
1458 case 6:
1459 args.v3.sExtEncoder.ucBitPerColor = PANEL_6BIT_PER_COLOR;
1460 break;
1461 case 8:
1462 default:
1463 args.v3.sExtEncoder.ucBitPerColor = PANEL_8BIT_PER_COLOR;
1464 break;
1465 case 10:
1466 args.v3.sExtEncoder.ucBitPerColor = PANEL_10BIT_PER_COLOR;
1467 break;
1468 case 12:
1469 args.v3.sExtEncoder.ucBitPerColor = PANEL_12BIT_PER_COLOR;
1470 break;
1471 case 16:
1472 args.v3.sExtEncoder.ucBitPerColor = PANEL_16BIT_PER_COLOR;
1473 break;
1474 }
1475 break; 1437 break;
1476 default: 1438 default:
1477 DRM_ERROR("Unknown table version: %d, %d\n", frev, crev); 1439 DRM_ERROR("Unknown table version: %d, %d\n", frev, crev);