diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index 92e6886..30893ef 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c -887,6 +887,12 @@ bool radeon_atom_get_clock_info(struct drm_device *dev) p1pll->pll_out_max = le32_to_cpu(firmware_info->info.ulMaxPixelClockPLL_Output); + DRM_INFO("crev %d, lcdmin %d, lcdmax %d, min %d, max %d\n", + crev, + le16_to_cpu(firmware_info->info_14.usLcdMinPixelClockPLL_Output), + le16_to_cpu(firmware_info->info_14.usLcdMaxPixelClockPLL_Output), + p1pll->pll_out_min, p1pll->pll_out_max); + if (crev >= 4) { p1pll->lcd_pll_out_min = le16_to_cpu(firmware_info->info_14.usLcdMinPixelClockPLL_Output) * 100; -1150,6 +1156,24 @@ static void radeon_atom_apply_lvds_quirks(struct drm_device *dev, lvds->pll_algo = PLL_ALGO_LEGACY; } + /* Lenovo T500 laptop seems to have invalid pll clocks */ + if ((dev->pdev->device == 0x9591) && + (dev->pdev->subsystem_vendor == 0x17aa) && + (dev->pdev->subsystem_device == 0x2117)) { + if ((lvds->native_mode.hdisplay == 1680) && + (lvds->native_mode.vdisplay == 1050)) { + struct radeon_device *rdev = dev->dev_private; + struct radeon_pll *p1pll = &rdev->clock.p1pll; + struct radeon_pll *p2pll = &rdev->clock.p2pll; + struct radeon_pll *dcpll = &rdev->clock.dcpll; + p1pll->lcd_pll_out_min = p1pll->pll_out_min; + p1pll->lcd_pll_out_max = p1pll->pll_out_max; + *p2pll = *p1pll; + *dcpll = *p1pll; + DRM_INFO("Lenovo T500 detected\n"); + } + + } } union lvds_info {