diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2012-01-20 15:01:29 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-01-24 12:35:50 -0500 |
commit | 386d4d751e8e0b4b693bb724f09aae064ee5297d (patch) | |
tree | bf8cbf3afd693cd913bcdf4cff4709da431685c7 | |
parent | 3fa47d9efa6a0f5123e26e2c3ad54e3e1a1d108d (diff) |
drm/radeon/kms: move panel mode setup into encoder mode set
Needs to happen earlier in the mode set.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r-- | drivers/gpu/drm/radeon/atombios_dp.c | 22 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/atombios_encoders.c | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_mode.h | 3 |
3 files changed, 24 insertions, 12 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c index 6fb335a4fdda..a71557ce01dc 100644 --- a/drivers/gpu/drm/radeon/atombios_dp.c +++ b/drivers/gpu/drm/radeon/atombios_dp.c | |||
@@ -549,8 +549,8 @@ bool radeon_dp_getdpcd(struct radeon_connector *radeon_connector) | |||
549 | return false; | 549 | return false; |
550 | } | 550 | } |
551 | 551 | ||
552 | static void radeon_dp_set_panel_mode(struct drm_encoder *encoder, | 552 | int radeon_dp_get_panel_mode(struct drm_encoder *encoder, |
553 | struct drm_connector *connector) | 553 | struct drm_connector *connector) |
554 | { | 554 | { |
555 | struct drm_device *dev = encoder->dev; | 555 | struct drm_device *dev = encoder->dev; |
556 | struct radeon_device *rdev = dev->dev_private; | 556 | struct radeon_device *rdev = dev->dev_private; |
@@ -558,7 +558,7 @@ static void radeon_dp_set_panel_mode(struct drm_encoder *encoder, | |||
558 | int panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE; | 558 | int panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE; |
559 | 559 | ||
560 | if (!ASIC_IS_DCE4(rdev)) | 560 | if (!ASIC_IS_DCE4(rdev)) |
561 | return; | 561 | return panel_mode; |
562 | 562 | ||
563 | if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) == | 563 | if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) == |
564 | ENCODER_OBJECT_ID_NUTMEG) | 564 | ENCODER_OBJECT_ID_NUTMEG) |
@@ -572,14 +572,7 @@ static void radeon_dp_set_panel_mode(struct drm_encoder *encoder, | |||
572 | panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE; | 572 | panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE; |
573 | } | 573 | } |
574 | 574 | ||
575 | atombios_dig_encoder_setup(encoder, | 575 | return panel_mode; |
576 | ATOM_ENCODER_CMD_SETUP_PANEL_MODE, | ||
577 | panel_mode); | ||
578 | |||
579 | if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) && | ||
580 | (panel_mode == DP_PANEL_MODE_INTERNAL_DP2_MODE)) { | ||
581 | radeon_write_dpcd_reg(radeon_connector, DP_EDP_CONFIGURATION_SET, 1); | ||
582 | } | ||
583 | } | 576 | } |
584 | 577 | ||
585 | void radeon_dp_set_link_config(struct drm_connector *connector, | 578 | void radeon_dp_set_link_config(struct drm_connector *connector, |
@@ -717,6 +710,8 @@ static void radeon_dp_set_tp(struct radeon_dp_link_train_info *dp_info, int tp) | |||
717 | 710 | ||
718 | static int radeon_dp_link_train_init(struct radeon_dp_link_train_info *dp_info) | 711 | static int radeon_dp_link_train_init(struct radeon_dp_link_train_info *dp_info) |
719 | { | 712 | { |
713 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(dp_info->encoder); | ||
714 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | ||
720 | u8 tmp; | 715 | u8 tmp; |
721 | 716 | ||
722 | /* power up the sink */ | 717 | /* power up the sink */ |
@@ -732,7 +727,10 @@ static int radeon_dp_link_train_init(struct radeon_dp_link_train_info *dp_info) | |||
732 | radeon_write_dpcd_reg(dp_info->radeon_connector, | 727 | radeon_write_dpcd_reg(dp_info->radeon_connector, |
733 | DP_DOWNSPREAD_CTRL, 0); | 728 | DP_DOWNSPREAD_CTRL, 0); |
734 | 729 | ||
735 | radeon_dp_set_panel_mode(dp_info->encoder, dp_info->connector); | 730 | if ((dp_info->connector->connector_type == DRM_MODE_CONNECTOR_eDP) && |
731 | (dig->panel_mode == DP_PANEL_MODE_INTERNAL_DP2_MODE)) { | ||
732 | radeon_write_dpcd_reg(dp_info->radeon_connector, DP_EDP_CONFIGURATION_SET, 1); | ||
733 | } | ||
736 | 734 | ||
737 | /* set the lane count on the sink */ | 735 | /* set the lane count on the sink */ |
738 | tmp = dp_info->dp_lane_count; | 736 | tmp = dp_info->dp_lane_count; |
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c index f1f06ca9f1f5..a3a9166f1ecb 100644 --- a/drivers/gpu/drm/radeon/atombios_encoders.c +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | |||
@@ -1811,10 +1811,21 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, | |||
1811 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: | 1811 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: |
1812 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: | 1812 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: |
1813 | if (ASIC_IS_DCE4(rdev)) { | 1813 | if (ASIC_IS_DCE4(rdev)) { |
1814 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); | ||
1815 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | ||
1816 | |||
1817 | if (!connector) | ||
1818 | dig->panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE; | ||
1819 | else | ||
1820 | dig->panel_mode = radeon_dp_get_panel_mode(encoder, connector); | ||
1821 | |||
1814 | /* disable the transmitter */ | 1822 | /* disable the transmitter */ |
1815 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); | 1823 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); |
1816 | /* setup and enable the encoder */ | 1824 | /* setup and enable the encoder */ |
1817 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0); | 1825 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0); |
1826 | atombios_dig_encoder_setup(encoder, | ||
1827 | ATOM_ENCODER_CMD_SETUP_PANEL_MODE, | ||
1828 | dig->panel_mode); | ||
1818 | 1829 | ||
1819 | /* enable the transmitter */ | 1830 | /* enable the transmitter */ |
1820 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); | 1831 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 8cb19f38f8da..d34dcb6ac384 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
@@ -362,6 +362,7 @@ struct radeon_encoder_atom_dig { | |||
362 | struct backlight_device *bl_dev; | 362 | struct backlight_device *bl_dev; |
363 | int dpms_mode; | 363 | int dpms_mode; |
364 | uint8_t backlight_level; | 364 | uint8_t backlight_level; |
365 | int panel_mode; | ||
365 | }; | 366 | }; |
366 | 367 | ||
367 | struct radeon_encoder_atom_dac { | 368 | struct radeon_encoder_atom_dac { |
@@ -482,6 +483,8 @@ extern void radeon_dp_link_train(struct drm_encoder *encoder, | |||
482 | extern bool radeon_dp_needs_link_train(struct radeon_connector *radeon_connector); | 483 | extern bool radeon_dp_needs_link_train(struct radeon_connector *radeon_connector); |
483 | extern u8 radeon_dp_getsinktype(struct radeon_connector *radeon_connector); | 484 | extern u8 radeon_dp_getsinktype(struct radeon_connector *radeon_connector); |
484 | extern bool radeon_dp_getdpcd(struct radeon_connector *radeon_connector); | 485 | extern bool radeon_dp_getdpcd(struct radeon_connector *radeon_connector); |
486 | extern int radeon_dp_get_panel_mode(struct drm_encoder *encoder, | ||
487 | struct drm_connector *connector); | ||
485 | extern void atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mode); | 488 | extern void atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mode); |
486 | extern void radeon_atom_encoder_init(struct radeon_device *rdev); | 489 | extern void radeon_atom_encoder_init(struct radeon_device *rdev); |
487 | extern void radeon_atom_dcpll_init(struct radeon_device *rdev); | 490 | extern void radeon_atom_dcpll_init(struct radeon_device *rdev); |