aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb-frontends
diff options
context:
space:
mode:
authorOlivier Grenie <olivier.grenie@parrot.com>2012-12-31 07:23:26 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2013-04-22 16:13:43 -0400
commit6fe1099c7aecc54ebf2fcf8e3af2225cd7bfa550 (patch)
tree7d7f88a275200cafffb96027b94b750afc761951 /drivers/media/dvb-frontends
parent173a64cb3fcff1993b2aa8113e53fd379f6a968f (diff)
[media] dib7000p: enhancement
The intend of this patch is to improve the support of the dib7000p. It is now possible to set the minimum value for the AGC1. Also, the driver takes into account the frequency offset introduced in the tuned frequency. Signed-off-by: Olivier Grenie <olivier.grenie@parrot.com> Signed-off-by: Patrick Boettcher <patrick.boettcher@parrot.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/dvb-frontends')
-rw-r--r--drivers/media/dvb-frontends/dib7000p.c17
-rw-r--r--drivers/media/dvb-frontends/dib7000p.h7
2 files changed, 23 insertions, 1 deletions
diff --git a/drivers/media/dvb-frontends/dib7000p.c b/drivers/media/dvb-frontends/dib7000p.c
index 3e1eefada0e8..effb87f773b0 100644
--- a/drivers/media/dvb-frontends/dib7000p.c
+++ b/drivers/media/dvb-frontends/dib7000p.c
@@ -429,6 +429,13 @@ int dib7000p_get_agc_values(struct dvb_frontend *fe,
429} 429}
430EXPORT_SYMBOL(dib7000p_get_agc_values); 430EXPORT_SYMBOL(dib7000p_get_agc_values);
431 431
432int dib7000p_set_agc1_min(struct dvb_frontend *fe, u16 v)
433{
434 struct dib7000p_state *state = fe->demodulator_priv;
435 return dib7000p_write_word(state, 108, v);
436}
437EXPORT_SYMBOL(dib7000p_set_agc1_min);
438
432static void dib7000p_reset_pll(struct dib7000p_state *state) 439static void dib7000p_reset_pll(struct dib7000p_state *state)
433{ 440{
434 struct dibx000_bandwidth_config *bw = &state->cfg.bw[0]; 441 struct dibx000_bandwidth_config *bw = &state->cfg.bw[0];
@@ -821,6 +828,7 @@ static int dib7000p_agc_startup(struct dvb_frontend *demod)
821 u8 agc_split; 828 u8 agc_split;
822 u16 reg; 829 u16 reg;
823 u32 upd_demod_gain_period = 0x1000; 830 u32 upd_demod_gain_period = 0x1000;
831 s32 frequency_offset = 0;
824 832
825 switch (state->agc_state) { 833 switch (state->agc_state) {
826 case 0: 834 case 0:
@@ -841,7 +849,14 @@ static int dib7000p_agc_startup(struct dvb_frontend *demod)
841 if (dib7000p_set_agc_config(state, BAND_OF_FREQUENCY(ch->frequency / 1000)) != 0) 849 if (dib7000p_set_agc_config(state, BAND_OF_FREQUENCY(ch->frequency / 1000)) != 0)
842 return -1; 850 return -1;
843 851
844 dib7000p_set_dds(state, 0); 852 if (demod->ops.tuner_ops.get_frequency) {
853 u32 frequency_tuner;
854
855 demod->ops.tuner_ops.get_frequency(demod, &frequency_tuner);
856 frequency_offset = (s32)frequency_tuner / 1000 - ch->frequency / 1000;
857 }
858
859 dib7000p_set_dds(state, frequency_offset);
845 ret = 7; 860 ret = 7;
846 (*agc_state)++; 861 (*agc_state)++;
847 break; 862 break;
diff --git a/drivers/media/dvb-frontends/dib7000p.h b/drivers/media/dvb-frontends/dib7000p.h
index cf5e77956a1f..d08cdff59bdf 100644
--- a/drivers/media/dvb-frontends/dib7000p.h
+++ b/drivers/media/dvb-frontends/dib7000p.h
@@ -63,6 +63,7 @@ extern struct i2c_adapter *dib7090_get_i2c_tuner(struct dvb_frontend *fe);
63extern int dib7090_slave_reset(struct dvb_frontend *fe); 63extern int dib7090_slave_reset(struct dvb_frontend *fe);
64extern int dib7000p_get_agc_values(struct dvb_frontend *fe, 64extern int dib7000p_get_agc_values(struct dvb_frontend *fe,
65 u16 *agc_global, u16 *agc1, u16 *agc2, u16 *wbd); 65 u16 *agc_global, u16 *agc1, u16 *agc2, u16 *wbd);
66extern int dib7000p_set_agc1_min(struct dvb_frontend *fe, u16 v);
66#else 67#else
67static inline struct dvb_frontend *dib7000p_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib7000p_config *cfg) 68static inline struct dvb_frontend *dib7000p_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib7000p_config *cfg)
68{ 69{
@@ -154,6 +155,12 @@ static inline int dib7000p_get_agc_values(struct dvb_frontend *fe,
154 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); 155 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
155 return -ENODEV; 156 return -ENODEV;
156} 157}
158
159static inline int dib7000p_set_agc1_min(struct dvb_frontend *fe, u16 v)
160{
161 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
162 return -ENODEV;
163}
157#endif 164#endif
158 165
159#endif 166#endif