aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb/frontends/tda827x.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/dvb/frontends/tda827x.c')
-rw-r--r--drivers/media/dvb/frontends/tda827x.c85
1 files changed, 53 insertions, 32 deletions
diff --git a/drivers/media/dvb/frontends/tda827x.c b/drivers/media/dvb/frontends/tda827x.c
index 8176a9b5898f..256fc4bf500b 100644
--- a/drivers/media/dvb/frontends/tda827x.c
+++ b/drivers/media/dvb/frontends/tda827x.c
@@ -91,6 +91,7 @@ static int tda827xo_set_params(struct dvb_frontend *fe,
91 int i, tuner_freq, if_freq; 91 int i, tuner_freq, if_freq;
92 u32 N; 92 u32 N;
93 93
94 dprintk("%s:\n", __FUNCTION__);
94 switch (params->u.ofdm.bandwidth) { 95 switch (params->u.ofdm.bandwidth) {
95 case BANDWIDTH_6_MHZ: 96 case BANDWIDTH_6_MHZ:
96 if_freq = 4000000; 97 if_freq = 4000000;
@@ -159,6 +160,7 @@ static int tda827xo_sleep(struct dvb_frontend *fe)
159 struct i2c_msg msg = { .addr = priv->i2c_addr, .flags = 0, 160 struct i2c_msg msg = { .addr = priv->i2c_addr, .flags = 0,
160 .buf = buf, .len = sizeof(buf) }; 161 .buf = buf, .len = sizeof(buf) };
161 162
163 dprintk("%s:\n", __FUNCTION__);
162 if (fe->ops.i2c_gate_ctrl) 164 if (fe->ops.i2c_gate_ctrl)
163 fe->ops.i2c_gate_ctrl(fe, 1); 165 fe->ops.i2c_gate_ctrl(fe, 1);
164 i2c_transfer(priv->i2c_adap, &msg, 1); 166 i2c_transfer(priv->i2c_adap, &msg, 1);
@@ -222,6 +224,7 @@ static int tda827xa_set_params(struct dvb_frontend *fe,
222 int i, tuner_freq, if_freq; 224 int i, tuner_freq, if_freq;
223 u32 N; 225 u32 N;
224 226
227 dprintk("%s:\n", __FUNCTION__);
225 if (priv->cfg && priv->cfg->lna_gain) 228 if (priv->cfg && priv->cfg->lna_gain)
226 priv->cfg->lna_gain(fe, 1); 229 priv->cfg->lna_gain(fe, 1);
227 msleep(20); 230 msleep(20);
@@ -350,6 +353,7 @@ static int tda827xa_sleep(struct dvb_frontend *fe)
350 struct i2c_msg msg = { .addr = priv->i2c_addr, .flags = 0, 353 struct i2c_msg msg = { .addr = priv->i2c_addr, .flags = 0,
351 .buf = buf, .len = sizeof(buf) }; 354 .buf = buf, .len = sizeof(buf) };
352 355
356 dprintk("%s:\n", __FUNCTION__);
353 if (fe->ops.i2c_gate_ctrl) 357 if (fe->ops.i2c_gate_ctrl)
354 fe->ops.i2c_gate_ctrl(fe, 1); 358 fe->ops.i2c_gate_ctrl(fe, 1);
355 359
@@ -388,13 +392,32 @@ static int tda827x_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
388static int tda827x_init(struct dvb_frontend *fe) 392static int tda827x_init(struct dvb_frontend *fe)
389{ 393{
390 struct tda827x_priv *priv = fe->tuner_priv; 394 struct tda827x_priv *priv = fe->tuner_priv;
391 395 dprintk("%s:\n", __FUNCTION__);
392 if (priv->cfg && priv->cfg->init) 396 if (priv->cfg && priv->cfg->init)
393 priv->cfg->init(fe); 397 priv->cfg->init(fe);
394 398
395 return 0; 399 return 0;
396} 400}
397 401
402static int tda827x_probe_version(struct dvb_frontend *fe);
403
404static int tda827x_initial_init(struct dvb_frontend *fe)
405{
406 int ret;
407 ret = tda827x_probe_version(fe);
408 if (ret)
409 return ret;
410 return fe->ops.tuner_ops.init(fe);
411}
412
413static int tda827x_initial_sleep(struct dvb_frontend *fe)
414{
415 int ret;
416 ret = tda827x_probe_version(fe);
417 if (ret)
418 return ret;
419 return fe->ops.tuner_ops.sleep(fe);
420}
398 421
399static struct dvb_tuner_ops tda827xo_tuner_ops = { 422static struct dvb_tuner_ops tda827xo_tuner_ops = {
400 .info = { 423 .info = {
@@ -404,8 +427,8 @@ static struct dvb_tuner_ops tda827xo_tuner_ops = {
404 .frequency_step = 250000 427 .frequency_step = 250000
405 }, 428 },
406 .release = tda827x_release, 429 .release = tda827x_release,
407 .init = tda827x_init, 430 .init = tda827x_initial_init,
408 .sleep = tda827xo_sleep, 431 .sleep = tda827x_initial_sleep,
409 .set_params = tda827xo_set_params, 432 .set_params = tda827xo_set_params,
410 .get_frequency = tda827x_get_frequency, 433 .get_frequency = tda827x_get_frequency,
411 .get_bandwidth = tda827x_get_bandwidth, 434 .get_bandwidth = tda827x_get_bandwidth,
@@ -426,26 +449,36 @@ static struct dvb_tuner_ops tda827xa_tuner_ops = {
426 .get_bandwidth = tda827x_get_bandwidth, 449 .get_bandwidth = tda827x_get_bandwidth,
427}; 450};
428 451
429struct dvb_frontend *tda827x_attach(struct dvb_frontend *fe, int addr, 452static int tda827x_probe_version(struct dvb_frontend *fe)
430 struct i2c_adapter *i2c, 453{ u8 data;
431 struct tda827x_config *cfg) 454 struct tda827x_priv *priv = fe->tuner_priv;
432{ 455 struct i2c_msg msg = { .addr = priv->i2c_addr, .flags = I2C_M_RD,
433 struct tda827x_priv *priv = NULL;
434 u8 data;
435 u8 sb_msg[] = { 0x30, 0xd0 };
436 struct i2c_msg msg = { .addr = addr, .flags = I2C_M_RD,
437 .buf = &data, .len = 1 }; 456 .buf = &data, .len = 1 };
438 dprintk("%s:\n", __FUNCTION__);
439
440 if (fe->ops.i2c_gate_ctrl) 457 if (fe->ops.i2c_gate_ctrl)
441 fe->ops.i2c_gate_ctrl(fe, 1); 458 fe->ops.i2c_gate_ctrl(fe, 1);
442 459 if (i2c_transfer(priv->i2c_adap, &msg, 1) != 1) {
443 if (i2c_transfer(i2c, &msg, 1) != 1) {
444 printk("%s: could not read from tuner at addr: 0x%02x\n", 460 printk("%s: could not read from tuner at addr: 0x%02x\n",
445 __FUNCTION__, addr << 1); 461 __FUNCTION__, msg.addr << 1);
446 return NULL; 462 return -EIO;
463 }
464 if ((data & 0x3c) == 0) {
465 dprintk("tda827x tuner found\n");
466 fe->ops.tuner_ops.init = tda827x_init;
467 fe->ops.tuner_ops.sleep = tda827xo_sleep;
468 } else {
469 dprintk("tda827xa tuner found\n");
470 memcpy(&fe->ops.tuner_ops, &tda827xa_tuner_ops, sizeof(struct dvb_tuner_ops));
447 } 471 }
472 return 0;
473}
474
475struct dvb_frontend *tda827x_attach(struct dvb_frontend *fe, int addr,
476 struct i2c_adapter *i2c,
477 struct tda827x_config *cfg)
478{
479 struct tda827x_priv *priv = NULL;
448 480
481 dprintk("%s:\n", __FUNCTION__);
449 priv = kzalloc(sizeof(struct tda827x_priv), GFP_KERNEL); 482 priv = kzalloc(sizeof(struct tda827x_priv), GFP_KERNEL);
450 if (priv == NULL) 483 if (priv == NULL)
451 return NULL; 484 return NULL;
@@ -453,25 +486,13 @@ struct dvb_frontend *tda827x_attach(struct dvb_frontend *fe, int addr,
453 priv->i2c_addr = addr; 486 priv->i2c_addr = addr;
454 priv->i2c_adap = i2c; 487 priv->i2c_adap = i2c;
455 priv->cfg = cfg; 488 priv->cfg = cfg;
489 memcpy(&fe->ops.tuner_ops, &tda827xo_tuner_ops, sizeof(struct dvb_tuner_ops));
456 490
457 msg.flags = 0;
458 msg.buf = sb_msg;
459 msg.len = sizeof(sb_msg);
460
461 if ((data & 0x3c) == 0) {
462 dprintk("tda827x tuner found\n");
463 memcpy(&fe->ops.tuner_ops, &tda827xo_tuner_ops, sizeof(struct dvb_tuner_ops));
464 } else {
465 dprintk("tda827xa tuner found\n");
466 memcpy(&fe->ops.tuner_ops, &tda827xa_tuner_ops, sizeof(struct dvb_tuner_ops));
467 sb_msg[1] = 0x90;
468 }
469 fe->tuner_priv = priv; 491 fe->tuner_priv = priv;
470 if (fe->ops.i2c_gate_ctrl) 492
471 fe->ops.i2c_gate_ctrl(fe, 1);
472 i2c_transfer(i2c, &msg, 1);
473 return fe; 493 return fe;
474} 494}
495
475EXPORT_SYMBOL(tda827x_attach); 496EXPORT_SYMBOL(tda827x_attach);
476 497
477module_param(debug, int, 0644); 498module_param(debug, int, 0644);