drm/nva3/pm: pll disabled if bit 0 of ctrl not set
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
6b70e48167
commit
93e692dc5f
|
@ -72,19 +72,21 @@ static u32
|
||||||
read_pll(struct drm_device *dev, int clk, u32 pll)
|
read_pll(struct drm_device *dev, int clk, u32 pll)
|
||||||
{
|
{
|
||||||
u32 ctrl = nv_rd32(dev, pll + 0);
|
u32 ctrl = nv_rd32(dev, pll + 0);
|
||||||
u32 sclk, P = 1, N = 1, M = 1;
|
u32 sclk = 0, P = 1, N = 1, M = 1;
|
||||||
|
|
||||||
if (!(ctrl & 0x00000008)) {
|
if (!(ctrl & 0x00000008)) {
|
||||||
u32 coef = nv_rd32(dev, pll + 4);
|
if (ctrl & 0x00000001) {
|
||||||
M = (coef & 0x000000ff) >> 0;
|
u32 coef = nv_rd32(dev, pll + 4);
|
||||||
N = (coef & 0x0000ff00) >> 8;
|
M = (coef & 0x000000ff) >> 0;
|
||||||
P = (coef & 0x003f0000) >> 16;
|
N = (coef & 0x0000ff00) >> 8;
|
||||||
|
P = (coef & 0x003f0000) >> 16;
|
||||||
|
|
||||||
/* not post-divider on these.. */
|
/* no post-divider on these.. */
|
||||||
if ((pll & 0x00ff00) == 0x00e800)
|
if ((pll & 0x00ff00) == 0x00e800)
|
||||||
P = 1;
|
P = 1;
|
||||||
|
|
||||||
sclk = read_clk(dev, 0x00 + clk, false);
|
sclk = read_clk(dev, 0x00 + clk, false);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
sclk = read_clk(dev, 0x10 + clk, false);
|
sclk = read_clk(dev, 0x10 + clk, false);
|
||||||
}
|
}
|
||||||
|
@ -306,16 +308,18 @@ nva3_pm_clocks_set(struct drm_device *dev, void *pre_state)
|
||||||
prog_clk(dev, 0x20, &info->unka0);
|
prog_clk(dev, 0x20, &info->unka0);
|
||||||
prog_clk(dev, 0x21, &info->vdec);
|
prog_clk(dev, 0x21, &info->vdec);
|
||||||
|
|
||||||
nv_wr32(dev, 0x100210, 0);
|
if (info->mclk.clk || info->mclk.pll) {
|
||||||
nv_wr32(dev, 0x1002dc, 1);
|
nv_wr32(dev, 0x100210, 0);
|
||||||
nv_wr32(dev, 0x004018, 0x00001000);
|
nv_wr32(dev, 0x1002dc, 1);
|
||||||
prog_pll(dev, 0x02, 0x004000, &info->mclk);
|
nv_wr32(dev, 0x004018, 0x00001000);
|
||||||
if (nv_rd32(dev, 0x4000) & 0x00000008)
|
prog_pll(dev, 0x02, 0x004000, &info->mclk);
|
||||||
nv_wr32(dev, 0x004018, 0x1000d000);
|
if (nv_rd32(dev, 0x4000) & 0x00000008)
|
||||||
else
|
nv_wr32(dev, 0x004018, 0x1000d000);
|
||||||
nv_wr32(dev, 0x004018, 0x10005000);
|
else
|
||||||
nv_wr32(dev, 0x1002dc, 0);
|
nv_wr32(dev, 0x004018, 0x10005000);
|
||||||
nv_wr32(dev, 0x100210, 0x80000000);
|
nv_wr32(dev, 0x1002dc, 0);
|
||||||
|
nv_wr32(dev, 0x100210, 0x80000000);
|
||||||
|
}
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
/* unfreeze PFIFO */
|
/* unfreeze PFIFO */
|
||||||
|
|
Loading…
Reference in New Issue