drm/radeon/kms/atom: fix potential oops in spread spectrum code
authorAlex Deucher <alexdeucher@gmail.com>
Wed, 28 Oct 2009 04:51:20 +0000 (00:51 -0400)
committerDave Airlie <airlied@redhat.com>
Wed, 28 Oct 2009 05:30:03 +0000 (15:30 +1000)
Make sure we have an LVDS encoder before casting enc_priv.

[airlied: also fix two missing cpu_to_le16 casts we noticed on irc]

Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/radeon/atombios_crtc.c

index 8516e1b..c15287a 100644 (file)
@@ -368,14 +368,17 @@ static void atombios_set_ss(struct drm_crtc *crtc, int enable)
        list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
                if (encoder->crtc == crtc) {
                        radeon_encoder = to_radeon_encoder(encoder);
-                       dig = radeon_encoder->enc_priv;
                        /* only enable spread spectrum on LVDS */
-                       if (dig && dig->ss) {
-                               percentage = dig->ss->percentage;
-                               type = dig->ss->type;
-                               step = dig->ss->step;
-                               delay = dig->ss->delay;
-                               range = dig->ss->range;
+                       if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
+                               dig = radeon_encoder->enc_priv;
+                               if (dig && dig->ss) {
+                                       percentage = dig->ss->percentage;
+                                       type = dig->ss->type;
+                                       step = dig->ss->step;
+                                       delay = dig->ss->delay;
+                                       range = dig->ss->range;
+                               } else if (enable)
+                                       return;
                        } else if (enable)
                                return;
                        break;
@@ -387,7 +390,7 @@ static void atombios_set_ss(struct drm_crtc *crtc, int enable)
 
        if (ASIC_IS_AVIVO(rdev)) {
                memset(&args, 0, sizeof(args));
-               args.usSpreadSpectrumPercentage = percentage;
+               args.usSpreadSpectrumPercentage = cpu_to_le16(percentage);
                args.ucSpreadSpectrumType = type;
                args.ucSpreadSpectrumStep = step;
                args.ucSpreadSpectrumDelay = delay;
@@ -397,7 +400,7 @@ static void atombios_set_ss(struct drm_crtc *crtc, int enable)
                atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
        } else {
                memset(&legacy_args, 0, sizeof(legacy_args));
-               legacy_args.usSpreadSpectrumPercentage = percentage;
+               legacy_args.usSpreadSpectrumPercentage = cpu_to_le16(percentage);
                legacy_args.ucSpreadSpectrumType = type;
                legacy_args.ucSpreadSpectrumStepSize_Delay = (step & 3) << 2;
                legacy_args.ucSpreadSpectrumStepSize_Delay |= (delay & 7) << 4;