28 .addr = priv->
addr, .flags = 0, .buf =
buf, .len = 2
32 err(
"I2C write reg failed, reg: %02x, val: %02x", reg, val);
41 { .
addr = priv->
addr, .flags = 0, .buf = &
reg, .len = 1 },
46 err(
"I2C read reg failed, reg: %02x", reg);
63 unsigned char reg[] = {
104 if (fe->
ops.i2c_gate_ctrl)
105 fe->
ops.i2c_gate_ctrl(fe, 1);
107 for (i = 1; i <
sizeof(
reg); i++) {
108 ret = fc0012_writereg(priv, i, reg[i]);
113 if (fe->
ops.i2c_gate_ctrl)
114 fe->
ops.i2c_gate_ctrl(fe, 0);
117 err(
"fc0012_writereg failed: %d", ret);
137 unsigned short xtal_freq_khz_2, xin, xdiv;
138 int vco_select =
false;
149 xtal_freq_khz_2 = 27000 / 2;
152 xtal_freq_khz_2 = 36000 / 2;
156 xtal_freq_khz_2 = 28800 / 2;
165 }
else if (freq < 55625) {
169 }
else if (freq < 74167) {
173 }
else if (freq < 111250) {
177 }
else if (freq < 148334) {
181 }
else if (freq < 222500) {
185 }
else if (freq < 296667) {
189 }
else if (freq < 445000) {
193 }
else if (freq < 593334) {
203 f_vco = freq *
multi;
205 if (f_vco >= 3060000) {
212 xdiv = (
unsigned short)(f_vco / xtal_freq_khz_2);
213 if ((f_vco - xdiv * xtal_freq_khz_2) >= (xtal_freq_khz_2 / 2))
216 pm = (
unsigned char)(xdiv / 8);
217 am = (
unsigned char)(xdiv - (8 * pm));
237 xin = (
unsigned short)(f_vco - (f_vco / xtal_freq_khz_2) * xtal_freq_khz_2);
238 xin = (xin << 15) / xtal_freq_khz_2;
259 err(
"%s: modulation type not supported!", __func__);
266 if (fe->
ops.i2c_gate_ctrl)
267 fe->
ops.i2c_gate_ctrl(fe, 1);
269 for (i = 1; i <= 6; i++) {
270 ret = fc0012_writereg(priv, i, reg[i]);
276 ret = fc0012_writereg(priv, 0x0e, 0x80);
278 ret = fc0012_writereg(priv, 0x0e, 0x00);
282 ret = fc0012_writereg(priv, 0x0e, 0x00);
286 ret = fc0012_readreg(priv, 0x0e, &tmp);
297 ret = fc0012_writereg(priv, 0x06, reg[6]);
299 ret = fc0012_writereg(priv, 0x0e, 0x80);
301 ret = fc0012_writereg(priv, 0x0e, 0x00);
306 ret = fc0012_writereg(priv, 0x06, reg[6]);
308 ret = fc0012_writereg(priv, 0x0e, 0x80);
310 ret = fc0012_writereg(priv, 0x0e, 0x00);
318 if (fe->
ops.i2c_gate_ctrl)
319 fe->
ops.i2c_gate_ctrl(fe, 0);
321 warn(
"%s: failed: %d", __func__, ret);
346 #define INPUT_ADC_LEVEL -8
348 static int fc0012_get_rf_strength(
struct dvb_frontend *fe,
u16 *strength)
353 int int_temp, lna_gain, int_lna, tot_agc_gain, power;
354 const int fc0012_lna_gain_table[] = {
366 if (fe->
ops.i2c_gate_ctrl)
367 fe->
ops.i2c_gate_ctrl(fe, 1);
369 ret = fc0012_writereg(priv, 0x12, 0x00);
373 ret = fc0012_readreg(priv, 0x12, &tmp);
378 ret = fc0012_readreg(priv, 0x13, &tmp);
381 lna_gain = tmp & 0x1f;
383 if (fe->
ops.i2c_gate_ctrl)
384 fe->
ops.i2c_gate_ctrl(fe, 0);
386 if (lna_gain <
ARRAY_SIZE(fc0012_lna_gain_table)) {
387 int_lna = fc0012_lna_gain_table[lna_gain];
388 tot_agc_gain = (
abs((int_temp >> 5) - 7) - 2 +
389 (int_temp & 0x1f)) * 2;
394 else if (power < -95)
397 *strength = (power + 95) * 255 / 140;
399 *strength |= *strength << 8;
407 if (fe->
ops.i2c_gate_ctrl)
408 fe->
ops.i2c_gate_ctrl(fe, 0);
411 warn(
"%s: failed: %d", __func__, ret);
417 .name =
"Fitipower FC0012",
419 .frequency_min = 37000000,
420 .frequency_max = 862000000,
424 .release = fc0012_release,
427 .sleep = fc0012_sleep,
429 .set_params = fc0012_set_params,
431 .get_frequency = fc0012_get_frequency,
432 .get_if_frequency = fc0012_get_if_frequency,
433 .get_bandwidth = fc0012_get_bandwidth,
435 .get_rf_strength = fc0012_get_rf_strength,
450 priv->
addr = i2c_address;
453 info(
"Fitipower FC0012 successfully attached.");
457 memcpy(&fe->
ops.tuner_ops, &fc0012_tuner_ops,