staticint
gv100_devinit_pll_set(struct nvkm_devinit *init, u32 type, u32 freq)
{ struct nvkm_subdev *subdev = &init->subdev; struct nvkm_device *device = subdev->device; struct nvbios_pll info; int head = type - PLL_VPLL0; int N, fN, M, P; int ret;
ret = nvbios_pll_parse(device->bios, type, &info); if (ret) return ret;
ret = gt215_pll_calc(subdev, &info, freq, &N, &fN, &M, &P); if (ret < 0) return ret;
switch (info.type) { case PLL_VPLL0: case PLL_VPLL1: case PLL_VPLL2: case PLL_VPLL3:
nvkm_wr32(device, 0x00ef10 + (head * 0x40), fN << 16);
nvkm_wr32(device, 0x00ef04 + (head * 0x40), (P << 16) |
(N << 8) |
(M << 0)); break; default:
nvkm_warn(subdev, "%08x/%dKhz unimplemented\n", type, freq);
ret = -EINVAL; break;
}