From fb65e9f2f648e53602e5d4d34b9a1686daed8c85 Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Sun, 30 Oct 2011 23:10:55 +1000 Subject: [PATCH] --- yaml --- r: 282607 b: refs/heads/master c: 463464eb9bf7d0254f3effa8050246fa4e009ace h: refs/heads/master i: 282605: d65bca894e98f3cbdd62366022c9e74b35882f29 282603: 0a8448bf1c5b8193bb3d2d3ec53cb6b98e75812a 282599: 837f40d6b861a6bb9ca7cd8b0d2662c622099074 282591: 770a13c44c55d57982f3c08be447b572cb44c10c v: v3 --- [refs] | 2 +- trunk/drivers/gpu/drm/nouveau/nv50_pm.c | 46 +++++++++++++------------ 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/[refs] b/[refs] index 54b8d7b768a0..a8e5917378b6 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6805979fa9090b2c69c645cf19bba9a2849f336b +refs/heads/master: 463464eb9bf7d0254f3effa8050246fa4e009ace diff --git a/trunk/drivers/gpu/drm/nouveau/nv50_pm.c b/trunk/drivers/gpu/drm/nouveau/nv50_pm.c index ab8cfad5a9b0..9d61bd45c47e 100644 --- a/trunk/drivers/gpu/drm/nouveau/nv50_pm.c +++ b/trunk/drivers/gpu/drm/nouveau/nv50_pm.c @@ -66,7 +66,7 @@ read_div(struct drm_device *dev) } static u32 -read_pll_ref(struct drm_device *dev, u32 base) +read_pll_src(struct drm_device *dev, u32 base) { struct drm_nouveau_private *dev_priv = dev->dev_private; u32 coef, ref = read_clk(dev, clk_src_crystal); @@ -137,21 +137,12 @@ read_pll_ref(struct drm_device *dev, u32 base) } static u32 -read_pll(struct drm_device *dev, u32 base) +read_pll_ref(struct drm_device *dev, u32 base) { - struct drm_nouveau_private *dev_priv = dev->dev_private; - u32 mast = nv_rd32(dev, 0x00c040); - u32 src = 0, ref = 0, clk = 0; - u32 ctrl, coef; - int N1, N2, M1, M2; + u32 src, mast = nv_rd32(dev, 0x00c040); switch (base) { case 0x004028: - if (mast & 0x00100000) { - /* wtf, appears to only disable post-divider on nva0 */ - if (dev_priv->chipset != 0xa0) - return read_clk(dev, clk_src_dom6); - } src = !!(mast & 0x00200000); break; case 0x004020: @@ -164,22 +155,33 @@ read_pll(struct drm_device *dev, u32 base) src = !!(mast & 0x02000000); break; case 0x00e810: - ref = read_clk(dev, clk_src_crystal); - break; + return read_clk(dev, clk_src_crystal); default: NV_ERROR(dev, "bad pll 0x%06x\n", base); return 0; } - if (ref == 0) { - if (src) - ref = read_clk(dev, clk_src_href); - else - ref = read_pll_ref(dev, base); - } + if (src) + return read_clk(dev, clk_src_href); + return read_pll_src(dev, base); +} - ctrl = nv_rd32(dev, base + 0); - coef = nv_rd32(dev, base + 4); +static u32 +read_pll(struct drm_device *dev, u32 base) +{ + struct drm_nouveau_private *dev_priv = dev->dev_private; + u32 mast = nv_rd32(dev, 0x00c040); + u32 ctrl = nv_rd32(dev, base + 0); + u32 coef = nv_rd32(dev, base + 4); + u32 ref = read_pll_ref(dev, base); + u32 clk = 0; + int N1, N2, M1, M2; + + if (base == 0x004028 && (mast & 0x00100000)) { + /* wtf, appears to only disable post-divider on nva0 */ + if (dev_priv->chipset != 0xa0) + return read_clk(dev, clk_src_dom6); + } N2 = (coef & 0xff000000) >> 24; M2 = (coef & 0x00ff0000) >> 16;