31 .addr = priv->
addr, .flags = 0, .buf =
buf, .len = 2
35 err(
"I2C write reg failed, reg: %02x, val: %02x", reg, val);
44 { .
addr = priv->
addr, .flags = 0, .buf = &
reg, .len = 1 },
49 err(
"I2C read reg failed, reg: %02x", reg);
66 unsigned char reg[] = {
106 if (fe->
ops.i2c_gate_ctrl)
107 fe->
ops.i2c_gate_ctrl(fe, 1);
109 for (i = 1; i <
sizeof(
reg); i++) {
110 ret = fc0013_writereg(priv, i, reg[i]);
115 if (fe->
ops.i2c_gate_ctrl)
116 fe->
ops.i2c_gate_ctrl(fe, 0);
119 err(
"fc0013_writereg failed: %d", ret);
137 if (fe->
ops.i2c_gate_ctrl)
138 fe->
ops.i2c_gate_ctrl(fe, 1);
141 ret = fc0013_writereg(priv, 0x10, 0x00);
146 ret = fc0013_readreg(priv, 0x10, &rc_cal);
152 val = (
int)rc_cal + rc_val;
155 ret = fc0013_writereg(priv, 0x0d, 0x11);
161 ret = fc0013_writereg(priv, 0x10, 0x0f);
163 ret = fc0013_writereg(priv, 0x10, 0x00);
165 ret = fc0013_writereg(priv, 0x10, (
u8)val);
168 if (fe->
ops.i2c_gate_ctrl)
169 fe->
ops.i2c_gate_ctrl(fe, 0);
180 if (fe->
ops.i2c_gate_ctrl)
181 fe->
ops.i2c_gate_ctrl(fe, 1);
183 ret = fc0013_writereg(priv, 0x0d, 0x01);
185 ret = fc0013_writereg(priv, 0x10, 0x00);
187 if (fe->
ops.i2c_gate_ctrl)
188 fe->
ops.i2c_gate_ctrl(fe, 0);
199 ret = fc0013_readreg(priv, 0x1d, &tmp);
203 if (freq <= 177500) {
204 ret = fc0013_writereg(priv, 0x1d, tmp | 0x1c);
205 }
else if (freq <= 184500) {
206 ret = fc0013_writereg(priv, 0x1d, tmp | 0x18);
207 }
else if (freq <= 191500) {
208 ret = fc0013_writereg(priv, 0x1d, tmp | 0x14);
209 }
else if (freq <= 198500) {
210 ret = fc0013_writereg(priv, 0x1d, tmp | 0x10);
211 }
else if (freq <= 205500) {
212 ret = fc0013_writereg(priv, 0x1d, tmp | 0x0c);
213 }
else if (freq <= 219500) {
214 ret = fc0013_writereg(priv, 0x1d, tmp | 0x08);
215 }
else if (freq < 300000) {
216 ret = fc0013_writereg(priv, 0x1d, tmp | 0x04);
218 ret = fc0013_writereg(priv, 0x1d, tmp | 0x1c);
235 unsigned short xtal_freq_khz_2, xin, xdiv;
236 int vco_select =
false;
247 xtal_freq_khz_2 = 27000 / 2;
250 xtal_freq_khz_2 = 36000 / 2;
254 xtal_freq_khz_2 = 28800 / 2;
258 if (fe->
ops.i2c_gate_ctrl)
259 fe->
ops.i2c_gate_ctrl(fe, 1);
262 ret = fc0013_set_vhf_track(priv, freq);
268 ret = fc0013_readreg(priv, 0x07, &tmp);
271 ret = fc0013_writereg(priv, 0x07, tmp | 0x10);
276 ret = fc0013_readreg(priv, 0x14, &tmp);
279 ret = fc0013_writereg(priv, 0x14, tmp & 0x1f);
282 }
else if (freq <= 862000) {
284 ret = fc0013_readreg(priv, 0x07, &tmp);
287 ret = fc0013_writereg(priv, 0x07, tmp & 0xef);
292 ret = fc0013_readreg(priv, 0x14, &tmp);
295 ret = fc0013_writereg(priv, 0x14, (tmp & 0x1f) | 0x40);
300 ret = fc0013_readreg(priv, 0x07, &tmp);
303 ret = fc0013_writereg(priv, 0x07, tmp & 0xef);
308 ret = fc0013_readreg(priv, 0x14, &tmp);
311 ret = fc0013_writereg(priv, 0x14, (tmp & 0x1f) | 0x20);
321 }
else if (freq < 55625) {
325 }
else if (freq < 74167) {
329 }
else if (freq < 111250) {
333 }
else if (freq < 148334) {
337 }
else if (freq < 222500) {
341 }
else if (freq < 296667) {
345 }
else if (freq < 445000) {
349 }
else if (freq < 593334) {
353 }
else if (freq < 950000) {
363 f_vco = freq *
multi;
365 if (f_vco >= 3060000) {
372 xdiv = (
unsigned short)(f_vco / xtal_freq_khz_2);
373 if ((f_vco - xdiv * xtal_freq_khz_2) >= (xtal_freq_khz_2 / 2))
376 pm = (
unsigned char)(xdiv / 8);
377 am = (
unsigned char)(xdiv - (8 * pm));
397 xin = (
unsigned short)(f_vco - (f_vco / xtal_freq_khz_2) * xtal_freq_khz_2);
398 xin = (xin << 15) / xtal_freq_khz_2;
419 err(
"%s: modulation type not supported!", __func__);
426 for (i = 1; i <= 6; i++) {
427 ret = fc0013_writereg(priv, i, reg[i]);
432 ret = fc0013_readreg(priv, 0x11, &tmp);
436 ret = fc0013_writereg(priv, 0x11, tmp | 0x04);
438 ret = fc0013_writereg(priv, 0x11, tmp & 0xfb);
443 ret = fc0013_writereg(priv, 0x0e, 0x80);
445 ret = fc0013_writereg(priv, 0x0e, 0x00);
449 ret = fc0013_writereg(priv, 0x0e, 0x00);
453 ret = fc0013_readreg(priv, 0x0e, &tmp);
464 ret = fc0013_writereg(priv, 0x06, reg[6]);
466 ret = fc0013_writereg(priv, 0x0e, 0x80);
468 ret = fc0013_writereg(priv, 0x0e, 0x00);
473 ret = fc0013_writereg(priv, 0x06, reg[6]);
475 ret = fc0013_writereg(priv, 0x0e, 0x80);
477 ret = fc0013_writereg(priv, 0x0e, 0x00);
485 if (fe->
ops.i2c_gate_ctrl)
486 fe->
ops.i2c_gate_ctrl(fe, 0);
488 warn(
"%s: failed: %d", __func__, ret);
513 #define INPUT_ADC_LEVEL -8
515 static int fc0013_get_rf_strength(
struct dvb_frontend *fe,
u16 *strength)
520 int int_temp, lna_gain, int_lna, tot_agc_gain, power;
521 const int fc0013_lna_gain_table[] = {
533 if (fe->
ops.i2c_gate_ctrl)
534 fe->
ops.i2c_gate_ctrl(fe, 1);
536 ret = fc0013_writereg(priv, 0x13, 0x00);
540 ret = fc0013_readreg(priv, 0x13, &tmp);
545 ret = fc0013_readreg(priv, 0x14, &tmp);
548 lna_gain = tmp & 0x1f;
550 if (fe->
ops.i2c_gate_ctrl)
551 fe->
ops.i2c_gate_ctrl(fe, 0);
553 if (lna_gain <
ARRAY_SIZE(fc0013_lna_gain_table)) {
554 int_lna = fc0013_lna_gain_table[lna_gain];
555 tot_agc_gain = (
abs((int_temp >> 5) - 7) - 2 +
556 (int_temp & 0x1f)) * 2;
561 else if (power < -95)
564 *strength = (power + 95) * 255 / 140;
566 *strength |= *strength << 8;
574 if (fe->
ops.i2c_gate_ctrl)
575 fe->
ops.i2c_gate_ctrl(fe, 0);
578 warn(
"%s: failed: %d", __func__, ret);
584 .name =
"Fitipower FC0013",
586 .frequency_min = 37000000,
587 .frequency_max = 1680000000,
591 .release = fc0013_release,
594 .sleep = fc0013_sleep,
596 .set_params = fc0013_set_params,
598 .get_frequency = fc0013_get_frequency,
599 .get_if_frequency = fc0013_get_if_frequency,
600 .get_bandwidth = fc0013_get_bandwidth,
602 .get_rf_strength = fc0013_get_rf_strength,
617 priv->
addr = i2c_address;
620 info(
"Fitipower FC0013 successfully attached.");
624 memcpy(&fe->
ops.tuner_ops, &fc0013_tuner_ops,