drm/radeon/kms: more r4xx lvds fixes
authorAlex Deucher <alexdeucher@gmail.com>
Fri, 4 Dec 2009 21:35:57 +0000 (16:35 -0500)
committerDave Airlie <airlied@redhat.com>
Mon, 7 Dec 2009 22:53:25 +0000 (08:53 +1000)
Grab pll ref div from regs at driver init.  r4xx seems very
picky about the dividers for the pll driving lvds.

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

index 89ac438..fba3c96 100644 (file)
@@ -457,9 +457,8 @@ void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode)
                                if (encoder->encoder_type !=
                                    DRM_MODE_ENCODER_DAC)
                                        pll_flags |= RADEON_PLL_NO_ODD_POST_DIV;
-                               if (!ASIC_IS_AVIVO(rdev)
-                                   && (encoder->encoder_type ==
-                                       DRM_MODE_ENCODER_LVDS))
+                               if (encoder->encoder_type ==
+                                       DRM_MODE_ENCODER_LVDS)
                                        pll_flags |= RADEON_PLL_USE_REF_DIV;
                        }
                        radeon_encoder = to_radeon_encoder(encoder);
index 2c541e0..b062109 100644 (file)
@@ -106,8 +106,19 @@ void radeon_get_clock_info(struct drm_device *dev)
                ret = radeon_combios_get_clock_info(dev);
 
        if (ret) {
-               if (p1pll->reference_div < 2)
-                       p1pll->reference_div = 12;
+               if (p1pll->reference_div < 2) {
+                       if (!ASIC_IS_AVIVO(rdev)) {
+                               u32 tmp = RREG32_PLL(RADEON_PPLL_REF_DIV);
+                               if (ASIC_IS_R300(rdev))
+                                       p1pll->reference_div =
+                                               (tmp & R300_PPLL_REF_DIV_ACC_MASK) >> R300_PPLL_REF_DIV_ACC_SHIFT;
+                               else
+                                       p1pll->reference_div = tmp & RADEON_PPLL_REF_DIV_MASK;
+                               if (p1pll->reference_div < 2)
+                                       p1pll->reference_div = 12;
+                       } else
+                               p1pll->reference_div = 12;
+               }
                if (p2pll->reference_div < 2)
                        p2pll->reference_div = 12;
                if (rdev->family < CHIP_RS600) {
index 1058ed0..b82ede9 100644 (file)
@@ -819,8 +819,8 @@ static void radeon_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode)
                                                        use_bios_divs = true;
                                                }
                                        }
-                                       pll_flags |= RADEON_PLL_USE_REF_DIV;
                                }
+                               pll_flags |= RADEON_PLL_USE_REF_DIV;
                        }
                }
        }