aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Palosaari <crope@iki.fi>2014-01-27 01:13:19 -0500
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-03-14 04:25:02 -0400
commit0ed0b22dc594a533a959ed8995e69e2275af40d9 (patch)
treebed38f3c49388190ccf27337adaee3997da00af6
parentadaa616ffb697f00db9b4ccb638c5e9e719dbb7f (diff)
[media] e4000: fix PLL calc to allow higher frequencies
There was 32-bit overflow on VCO frequency calculation which blocks tuning to 1073 - 1104 MHz. Use 64 bit number in order to avoid VCO frequency overflow. After that fix device in question tunes to following range: 60 - 1104 MHz 1250 - 2207 MHz Signed-off-by: Antti Palosaari <crope@iki.fi> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
-rw-r--r--drivers/media/tuners/e4000.c14
1 files changed, 5 insertions, 9 deletions
diff --git a/drivers/media/tuners/e4000.c b/drivers/media/tuners/e4000.c
index 3a03b026eb0c..ae52a1f4bb13 100644
--- a/drivers/media/tuners/e4000.c
+++ b/drivers/media/tuners/e4000.c
@@ -221,11 +221,11 @@ static int e4000_set_params(struct dvb_frontend *fe)
221 struct e4000_priv *priv = fe->tuner_priv; 221 struct e4000_priv *priv = fe->tuner_priv;
222 struct dtv_frontend_properties *c = &fe->dtv_property_cache; 222 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
223 int ret, i, sigma_delta; 223 int ret, i, sigma_delta;
224 unsigned int f_vco; 224 u64 f_vco;
225 u8 buf[5], i_data[4], q_data[4]; 225 u8 buf[5], i_data[4], q_data[4];
226 226
227 dev_dbg(&priv->client->dev, 227 dev_dbg(&priv->client->dev,
228 "%s: delivery_system=%d frequency=%d bandwidth_hz=%d\n", 228 "%s: delivery_system=%d frequency=%u bandwidth_hz=%u\n",
229 __func__, c->delivery_system, c->frequency, 229 __func__, c->delivery_system, c->frequency,
230 c->bandwidth_hz); 230 c->bandwidth_hz);
231 231
@@ -248,20 +248,16 @@ static int e4000_set_params(struct dvb_frontend *fe)
248 goto err; 248 goto err;
249 } 249 }
250 250
251 /* 251 f_vco = 1ull * c->frequency * e4000_pll_lut[i].mul;
252 * Note: Currently f_vco overflows when c->frequency is 1 073 741 824 Hz
253 * or more.
254 */
255 f_vco = c->frequency * e4000_pll_lut[i].mul;
256 sigma_delta = div_u64(0x10000ULL * (f_vco % priv->clock), priv->clock); 252 sigma_delta = div_u64(0x10000ULL * (f_vco % priv->clock), priv->clock);
257 buf[0] = f_vco / priv->clock; 253 buf[0] = div_u64(f_vco, priv->clock);
258 buf[1] = (sigma_delta >> 0) & 0xff; 254 buf[1] = (sigma_delta >> 0) & 0xff;
259 buf[2] = (sigma_delta >> 8) & 0xff; 255 buf[2] = (sigma_delta >> 8) & 0xff;
260 buf[3] = 0x00; 256 buf[3] = 0x00;
261 buf[4] = e4000_pll_lut[i].div; 257 buf[4] = e4000_pll_lut[i].div;
262 258
263 dev_dbg(&priv->client->dev, 259 dev_dbg(&priv->client->dev,
264 "%s: f_vco=%u pll div=%d sigma_delta=%04x\n", 260 "%s: f_vco=%llu pll div=%d sigma_delta=%04x\n",
265 __func__, f_vco, buf[0], sigma_delta); 261 __func__, f_vco, buf[0], sigma_delta);
266 262
267 ret = e4000_wr_regs(priv, 0x09, buf, 5); 263 ret = e4000_wr_regs(priv, 0x09, buf, 5);