drm/i915/cnl: Simplify dco_fraction calculation.
I confess I never fully understood that previous calculation, so this is not a "fix". But let's simplify this math so poor brains like mine can read and make some sense of it in the future. v2: Don't follow the spec since that gives invalid values and it is also confusing. This Ville's version is much simpler. v3: Use u64 cast instead of declaring a u64 dco. (Ville). Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Cc: Mika Kahola <mika.kahola@intel.com> Cc: Manasi Navare <manasi.d.navare@intel.com> Cc: James Ausmus <james.ausmus@intel.com> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20171115184257.8633-1-rodrigo.vivi@intel.com
This commit is contained in:
parent
cacf6fe7c6
commit
8a00678a09
@ -2153,6 +2153,8 @@ static void cnl_wrpll_params_populate(struct skl_wrpll_params *params,
|
||||
u32 dco_freq, u32 ref_freq,
|
||||
int pdiv, int qdiv, int kdiv)
|
||||
{
|
||||
u32 dco;
|
||||
|
||||
switch (kdiv) {
|
||||
case 1:
|
||||
params->kdiv = 1;
|
||||
@ -2189,9 +2191,10 @@ static void cnl_wrpll_params_populate(struct skl_wrpll_params *params,
|
||||
params->qdiv_ratio = qdiv;
|
||||
params->qdiv_mode = (qdiv == 1) ? 0 : 1;
|
||||
|
||||
params->dco_integer = div_u64(dco_freq, ref_freq);
|
||||
params->dco_fraction = div_u64((div_u64((uint64_t)dco_freq<<15, (uint64_t)ref_freq) -
|
||||
((uint64_t)params->dco_integer<<15)) * 0x8000, 0x8000);
|
||||
dco = div_u64((u64)dco_freq << 15, ref_freq);
|
||||
|
||||
params->dco_integer = dco >> 15;
|
||||
params->dco_fraction = dco & 0x7fff;
|
||||
}
|
||||
|
||||
static bool
|
||||
|
Loading…
x
Reference in New Issue
Block a user