aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/dvb/frontends/sp887x.c34
-rw-r--r--drivers/media/dvb/frontends/sp887x.h6
2 files changed, 22 insertions, 18 deletions
diff --git a/drivers/media/dvb/frontends/sp887x.c b/drivers/media/dvb/frontends/sp887x.c
index eb8a602198ca..543dfa145090 100644
--- a/drivers/media/dvb/frontends/sp887x.c
+++ b/drivers/media/dvb/frontends/sp887x.c
@@ -208,15 +208,6 @@ static int sp887x_initial_setup (struct dvb_frontend* fe, const struct firmware
208 /* bit 0x010: enable data valid signal */ 208 /* bit 0x010: enable data valid signal */
209 sp887x_writereg(state, 0xd00, 0x010); 209 sp887x_writereg(state, 0xd00, 0x010);
210 sp887x_writereg(state, 0x0d1, 0x000); 210 sp887x_writereg(state, 0x0d1, 0x000);
211
212 /* setup the PLL */
213 if (state->config->pll_init) {
214 sp887x_writereg(state, 0x206, 0x001);
215 state->config->pll_init(fe);
216 sp887x_writereg(state, 0x206, 0x000);
217 }
218
219 printk ("done.\n");
220 return 0; 211 return 0;
221}; 212};
222 213
@@ -362,9 +353,16 @@ static int sp887x_setup_frontend_parameters (struct dvb_frontend* fe,
362 sp887x_microcontroller_stop(state); 353 sp887x_microcontroller_stop(state);
363 354
364 /* setup the PLL */ 355 /* setup the PLL */
365 sp887x_writereg(state, 0x206, 0x001); 356 if (fe->ops->tuner_ops.set_params) {
366 actual_freq = state->config->pll_set(fe, p); 357 fe->ops->tuner_ops.set_params(fe, p);
367 sp887x_writereg(state, 0x206, 0x000); 358 if (fe->ops->i2c_gate_ctrl) fe->ops->i2c_gate_ctrl(fe, 0);
359 }
360 if (fe->ops->tuner_ops.get_frequency) {
361 fe->ops->tuner_ops.get_frequency(fe, &actual_freq);
362 if (fe->ops->i2c_gate_ctrl) fe->ops->i2c_gate_ctrl(fe, 0);
363 } else {
364 actual_freq = p->frequency;
365 }
368 366
369 /* read status reg in order to clear <pending irqs */ 367 /* read status reg in order to clear <pending irqs */
370 sp887x_readreg(state, 0x200); 368 sp887x_readreg(state, 0x200);
@@ -486,6 +484,17 @@ static int sp887x_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
486 return 0; 484 return 0;
487} 485}
488 486
487static int sp887x_i2c_gate_ctrl(struct dvb_frontend* fe, int enable)
488{
489 struct sp887x_state* state = fe->demodulator_priv;
490
491 if (enable) {
492 return sp887x_writereg(state, 0x206, 0x001);
493 } else {
494 return sp887x_writereg(state, 0x206, 0x000);
495 }
496}
497
489static int sp887x_sleep(struct dvb_frontend* fe) 498static int sp887x_sleep(struct dvb_frontend* fe)
490{ 499{
491 struct sp887x_state* state = fe->demodulator_priv; 500 struct sp887x_state* state = fe->demodulator_priv;
@@ -589,6 +598,7 @@ static struct dvb_frontend_ops sp887x_ops = {
589 598
590 .init = sp887x_init, 599 .init = sp887x_init,
591 .sleep = sp887x_sleep, 600 .sleep = sp887x_sleep,
601 .i2c_gate_ctrl = sp887x_i2c_gate_ctrl,
592 602
593 .set_frontend = sp887x_setup_frontend_parameters, 603 .set_frontend = sp887x_setup_frontend_parameters,
594 .get_tune_settings = sp887x_get_tune_settings, 604 .get_tune_settings = sp887x_get_tune_settings,
diff --git a/drivers/media/dvb/frontends/sp887x.h b/drivers/media/dvb/frontends/sp887x.h
index 6a05d8f8e8cc..c44b0ebdf1e2 100644
--- a/drivers/media/dvb/frontends/sp887x.h
+++ b/drivers/media/dvb/frontends/sp887x.h
@@ -13,12 +13,6 @@ struct sp887x_config
13 /* the demodulator's i2c address */ 13 /* the demodulator's i2c address */
14 u8 demod_address; 14 u8 demod_address;
15 15
16 /* PLL maintenance */
17 int (*pll_init)(struct dvb_frontend* fe);
18
19 /* this should return the actual frequency tuned to */
20 int (*pll_set)(struct dvb_frontend* fe, struct dvb_frontend_parameters* params);
21
22 /* request firmware for device */ 16 /* request firmware for device */
23 int (*request_firmware)(struct dvb_frontend* fe, const struct firmware **fw, char* name); 17 int (*request_firmware)(struct dvb_frontend* fe, const struct firmware **fw, char* name);
24}; 18};