#include #include unsigned long nv05_pramdacPllCalc(struct _lnvrm_objNv01Device *hw , unsigned long long clock) { unsigned long long refClock = hw->refClock ; unsigned long long vcoMax = 350000000 ; unsigned long long vcoMin = 0 ; unsigned long long nMax = 255 ; unsigned long long nMin = 1 ; unsigned long long mMax = 14 ; unsigned long long mMin = 1 ; unsigned long long pMax = 4 ; unsigned long long pMin = 1 ; unsigned long long f ; unsigned long long fDif ; unsigned long long fDifBest = ~0x00 ; unsigned long long fBest = 0 ; unsigned long long nBest = nMin ; unsigned long long mBest = mMax ; unsigned long long pBest = pMax ; unsigned long long vco ; unsigned long long n ; unsigned long long m ; unsigned long long p ; if(clock > vcoMax) clock = vco ; for(p = pMin ; p <= pMax ; p++) { vco = clock * (1 << p) ; for(m = mMin ; m <= mMax ; m++) { n = vco / (refClock / m) ; if((n >= nMin) & (n <= nMax)) { f = refClock / m * n ; if(vco > f) fDif = vco - f ; else fDif = f - vco ; if(fDif < fDifBest) { fDifBest = fDif ; fBest = f ; nBest = n ; mBest = m ; pBest = p ; } } } } printk("nv05_pramdacPllCalc: M:N:P %2.2LX:%2.2LX:%2.2LX f = %Ld Hz out = %Ld Hz\n", mBest, nBest, pBest, clock, fBest / (1 << pBest)); return((pBest << 16) | (nBest << 8) | mBest) ; } void nv05_pramdacSetPllNv(struct _lnvrm_objNv01Device *hw , unsigned long long clock) { unsigned long value ; value = nv05_pramdacPllCalc(hw,clock) ; nvr_regw(NV04_PRAMDAC_NVPLL_COEFF , value) ; } void nv05_pramdacSetPllMem(struct _lnvrm_objNv01Device *hw , unsigned long long clock) { unsigned long value ; value = nv05_pramdacPllCalc(hw,clock) ; nvr_regw(NV04_PRAMDAC_MPLL_COEFF , value) ; } void nv05_pramdacSetPllPixel(struct _lnvrm_objNv01Device *hw , unsigned long long clock) { unsigned long value ; value = nv05_pramdacPllCalc(hw,clock) ; nvr_regw(NV04_PRAMDAC_VPLL_COEFF , value) ; }