|
|
@ -423,7 +423,7 @@ static uint64_t compute_fvco(uint32_t f_osc, uint8_t z, uint16_t x) |
|
|
|
return fvco; |
|
|
|
return fvco; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static int compute_flo(uint32_t f_osc, uint8_t z, uint16_t x, uint8_t r) |
|
|
|
static uint32_t compute_flo(uint32_t f_osc, uint8_t z, uint16_t x, uint8_t r) |
|
|
|
{ |
|
|
|
{ |
|
|
|
uint64_t fvco = compute_fvco(f_osc, z, x); |
|
|
|
uint64_t fvco = compute_fvco(f_osc, z, x); |
|
|
|
if (fvco == 0) |
|
|
|
if (fvco == 0) |
|
|
@ -459,9 +459,9 @@ static int e4k_band_set(struct e4k_state *e4k, enum e4k_band band) |
|
|
|
* \param[in] fosc Clock input frequency applied to the chip (Hz) |
|
|
|
* \param[in] fosc Clock input frequency applied to the chip (Hz) |
|
|
|
* \param[in] intended_flo target tuning frequency (Hz) |
|
|
|
* \param[in] intended_flo target tuning frequency (Hz) |
|
|
|
* \returns actual PLL frequency, as close as possible to intended_flo, |
|
|
|
* \returns actual PLL frequency, as close as possible to intended_flo, |
|
|
|
* negative in case of error |
|
|
|
* 0 in case of error |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
int e4k_compute_pll_params(struct e4k_pll_params *oscp, uint32_t fosc, uint32_t intended_flo) |
|
|
|
uint32_t e4k_compute_pll_params(struct e4k_pll_params *oscp, uint32_t fosc, uint32_t intended_flo) |
|
|
|
{ |
|
|
|
{ |
|
|
|
uint32_t i; |
|
|
|
uint32_t i; |
|
|
|
uint8_t r = 2; |
|
|
|
uint8_t r = 2; |
|
|
@ -473,7 +473,7 @@ int e4k_compute_pll_params(struct e4k_pll_params *oscp, uint32_t fosc, uint32_t |
|
|
|
oscp->r_idx = 0; |
|
|
|
oscp->r_idx = 0; |
|
|
|
|
|
|
|
|
|
|
|
if (!is_fosc_valid(fosc)) |
|
|
|
if (!is_fosc_valid(fosc)) |
|
|
|
return -EINVAL; |
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
|
|
for(i = 0; i < ARRAY_SIZE(pll_vars); ++i) { |
|
|
|
for(i = 0; i < ARRAY_SIZE(pll_vars); ++i) { |
|
|
|
if(intended_flo < pll_vars[i].freq) { |
|
|
|
if(intended_flo < pll_vars[i].freq) { |
|
|
@ -556,13 +556,13 @@ int e4k_tune_params(struct e4k_state *e4k, struct e4k_pll_params *p) |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
int e4k_tune_freq(struct e4k_state *e4k, uint32_t freq) |
|
|
|
int e4k_tune_freq(struct e4k_state *e4k, uint32_t freq) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int rc, i; |
|
|
|
uint32_t rc; |
|
|
|
struct e4k_pll_params p; |
|
|
|
struct e4k_pll_params p; |
|
|
|
|
|
|
|
|
|
|
|
/* determine PLL parameters */ |
|
|
|
/* determine PLL parameters */ |
|
|
|
rc = e4k_compute_pll_params(&p, e4k->vco.fosc, freq); |
|
|
|
rc = e4k_compute_pll_params(&p, e4k->vco.fosc, freq); |
|
|
|
if (rc < 0) |
|
|
|
if (!rc) |
|
|
|
return rc; |
|
|
|
return -EINVAL; |
|
|
|
|
|
|
|
|
|
|
|
/* actually tune to those parameters */ |
|
|
|
/* actually tune to those parameters */ |
|
|
|
rc = e4k_tune_params(e4k, &p); |
|
|
|
rc = e4k_tune_params(e4k, &p); |
|
|
|