diff mbox

drm/radeon/kms/atom: fix PHY init

Message ID 1307133546-7538-1-git-send-email-alexdeucher@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Alex Deucher June 3, 2011, 8:39 p.m. UTC
The PHY was not initialized correctly after
ac89af1e1010640db072416c786f97391b85790f since
the function bailed early as an encoder was not
assigned.  The encoder isn't necessary for PHY init
so just assign to 0 for init so that the table
is executed.

Reported-by: Ari Savolainen <ari.m.savolainen@gmail.com>

Cc: Ari Savolainen <ari.m.savolainen@gmail.com>
Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
---
 drivers/gpu/drm/radeon/radeon_encoders.c |   17 +++++++++++------
 1 files changed, 11 insertions(+), 6 deletions(-)

Comments

Ari Savolainen June 3, 2011, 8:53 p.m. UTC | #1
I tested the patch and it fixed the problem.

Thanks,
Ari

2011/6/3 Alex Deucher <alexdeucher@gmail.com>:
> The PHY was not initialized correctly after
> ac89af1e1010640db072416c786f97391b85790f since
> the function bailed early as an encoder was not
> assigned.  The encoder isn't necessary for PHY init
> so just assign to 0 for init so that the table
> is executed.
>
> Reported-by: Ari Savolainen <ari.m.savolainen@gmail.com>
>
> Cc: Ari Savolainen <ari.m.savolainen@gmail.com>
> Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
> ---
>  drivers/gpu/drm/radeon/radeon_encoders.c |   17 +++++++++++------
>  1 files changed, 11 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c
> index 13e4fa0..302248b 100644
> --- a/drivers/gpu/drm/radeon/radeon_encoders.c
> +++ b/drivers/gpu/drm/radeon/radeon_encoders.c
> @@ -949,10 +949,15 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
>        int dp_lane_count = 0;
>        int connector_object_id = 0;
>        int igp_lane_info = 0;
> +       int dig_encoder = dig->dig_encoder;
>
> -       if (action == ATOM_TRANSMITTER_ACTION_INIT)
> +       if (action == ATOM_TRANSMITTER_ACTION_INIT) {
>                connector = radeon_get_connector_for_encoder_init(encoder);
> -       else
> +               /* just needed to avoid bailing in the encoder check.  the encoder
> +                * isn't used for init
> +                */
> +               dig_encoder = 0;
> +       } else
>                connector = radeon_get_connector_for_encoder(encoder);
>
>        if (connector) {
> @@ -968,7 +973,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
>        }
>
>        /* no dig encoder assigned */
> -       if (dig->dig_encoder == -1)
> +       if (dig_encoder == -1)
>                return;
>
>        if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP)
> @@ -1018,7 +1023,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
>
>                if (dig->linkb)
>                        args.v3.acConfig.ucLinkSel = 1;
> -               if (dig->dig_encoder & 1)
> +               if (dig_encoder & 1)
>                        args.v3.acConfig.ucEncoderSel = 1;
>
>                /* Select the PLL for the PHY
> @@ -1068,7 +1073,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
>                                args.v3.acConfig.fDualLinkConnector = 1;
>                }
>        } else if (ASIC_IS_DCE32(rdev)) {
> -               args.v2.acConfig.ucEncoderSel = dig->dig_encoder;
> +               args.v2.acConfig.ucEncoderSel = dig_encoder;
>                if (dig->linkb)
>                        args.v2.acConfig.ucLinkSel = 1;
>
> @@ -1095,7 +1100,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
>        } else {
>                args.v1.ucConfig = ATOM_TRANSMITTER_CONFIG_CLKSRC_PPLL;
>
> -               if (dig->dig_encoder)
> +               if (dig_encoder)
>                        args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG2_ENCODER;
>                else
>                        args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG1_ENCODER;
> --
> 1.7.1.1
>
>
diff mbox

Patch

diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c
index 13e4fa0..302248b 100644
--- a/drivers/gpu/drm/radeon/radeon_encoders.c
+++ b/drivers/gpu/drm/radeon/radeon_encoders.c
@@ -949,10 +949,15 @@  atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
 	int dp_lane_count = 0;
 	int connector_object_id = 0;
 	int igp_lane_info = 0;
+	int dig_encoder = dig->dig_encoder;
 
-	if (action == ATOM_TRANSMITTER_ACTION_INIT)
+	if (action == ATOM_TRANSMITTER_ACTION_INIT) {
 		connector = radeon_get_connector_for_encoder_init(encoder);
-	else
+		/* just needed to avoid bailing in the encoder check.  the encoder
+		 * isn't used for init
+		 */
+		dig_encoder = 0;
+	} else
 		connector = radeon_get_connector_for_encoder(encoder);
 
 	if (connector) {
@@ -968,7 +973,7 @@  atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
 	}
 
 	/* no dig encoder assigned */
-	if (dig->dig_encoder == -1)
+	if (dig_encoder == -1)
 		return;
 
 	if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP)
@@ -1018,7 +1023,7 @@  atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
 
 		if (dig->linkb)
 			args.v3.acConfig.ucLinkSel = 1;
-		if (dig->dig_encoder & 1)
+		if (dig_encoder & 1)
 			args.v3.acConfig.ucEncoderSel = 1;
 
 		/* Select the PLL for the PHY
@@ -1068,7 +1073,7 @@  atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
 				args.v3.acConfig.fDualLinkConnector = 1;
 		}
 	} else if (ASIC_IS_DCE32(rdev)) {
-		args.v2.acConfig.ucEncoderSel = dig->dig_encoder;
+		args.v2.acConfig.ucEncoderSel = dig_encoder;
 		if (dig->linkb)
 			args.v2.acConfig.ucLinkSel = 1;
 
@@ -1095,7 +1100,7 @@  atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
 	} else {
 		args.v1.ucConfig = ATOM_TRANSMITTER_CONFIG_CLKSRC_PPLL;
 
-		if (dig->dig_encoder)
+		if (dig_encoder)
 			args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG2_ENCODER;
 		else
 			args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG1_ENCODER;