diff options
author | Hartmut Hackmann <hartmut.hackmann@t-online.de> | 2005-07-07 20:57:43 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-07-07 21:23:54 -0400 |
commit | f03cbea36ab9412dcea58e953be4933b36c9b7be (patch) | |
tree | 3ecffeccbd499ee2e3d7cd6bdc4094d989004968 /drivers/media | |
parent | 0c744b010078bd65724477e75261e51712d290a0 (diff) |
[PATCH] dvb: frontend: tda1004x: support tda827x tuners
o added preliminary support for tda827x tuners
o set parameters for drift compensation to 0
makes no sense for DVB-T but can prevent lock
Signed-off-by: Hartmut Hackmann <hartmut.hackmann@t-online.de>
Signed-off-by: Johannes Stezenbach <js@linuxtv.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/dvb/frontends/tda1004x.c | 44 | ||||
-rw-r--r-- | drivers/media/dvb/frontends/tda1004x.h | 4 |
2 files changed, 44 insertions, 4 deletions
diff --git a/drivers/media/dvb/frontends/tda1004x.c b/drivers/media/dvb/frontends/tda1004x.c index 2d5f56cbf506..ab0c032472cc 100644 --- a/drivers/media/dvb/frontends/tda1004x.c +++ b/drivers/media/dvb/frontends/tda1004x.c | |||
@@ -120,6 +120,8 @@ static int debug; | |||
120 | #define TDA10046H_GPIO_OUT_SEL 0x41 | 120 | #define TDA10046H_GPIO_OUT_SEL 0x41 |
121 | #define TDA10046H_GPIO_SELECT 0x42 | 121 | #define TDA10046H_GPIO_SELECT 0x42 |
122 | #define TDA10046H_AGC_CONF 0x43 | 122 | #define TDA10046H_AGC_CONF 0x43 |
123 | #define TDA10046H_AGC_THR 0x44 | ||
124 | #define TDA10046H_AGC_RENORM 0x45 | ||
123 | #define TDA10046H_AGC_GAINS 0x46 | 125 | #define TDA10046H_AGC_GAINS 0x46 |
124 | #define TDA10046H_AGC_TUN_MIN 0x47 | 126 | #define TDA10046H_AGC_TUN_MIN 0x47 |
125 | #define TDA10046H_AGC_TUN_MAX 0x48 | 127 | #define TDA10046H_AGC_TUN_MAX 0x48 |
@@ -272,14 +274,26 @@ static int tda10046h_set_bandwidth(struct tda1004x_state *state, | |||
272 | switch (bandwidth) { | 274 | switch (bandwidth) { |
273 | case BANDWIDTH_6_MHZ: | 275 | case BANDWIDTH_6_MHZ: |
274 | tda1004x_write_buf(state, TDA10046H_TIME_WREF1, bandwidth_6mhz, sizeof(bandwidth_6mhz)); | 276 | tda1004x_write_buf(state, TDA10046H_TIME_WREF1, bandwidth_6mhz, sizeof(bandwidth_6mhz)); |
277 | if (state->config->if_freq == TDA10046_FREQ_045) { | ||
278 | tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_MSB, 0x09); | ||
279 | tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_LSB, 0x4f); | ||
280 | } | ||
275 | break; | 281 | break; |
276 | 282 | ||
277 | case BANDWIDTH_7_MHZ: | 283 | case BANDWIDTH_7_MHZ: |
278 | tda1004x_write_buf(state, TDA10046H_TIME_WREF1, bandwidth_7mhz, sizeof(bandwidth_7mhz)); | 284 | tda1004x_write_buf(state, TDA10046H_TIME_WREF1, bandwidth_7mhz, sizeof(bandwidth_7mhz)); |
285 | if (state->config->if_freq == TDA10046_FREQ_045) { | ||
286 | tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_MSB, 0x0a); | ||
287 | tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_LSB, 0x79); | ||
288 | } | ||
279 | break; | 289 | break; |
280 | 290 | ||
281 | case BANDWIDTH_8_MHZ: | 291 | case BANDWIDTH_8_MHZ: |
282 | tda1004x_write_buf(state, TDA10046H_TIME_WREF1, bandwidth_8mhz, sizeof(bandwidth_8mhz)); | 292 | tda1004x_write_buf(state, TDA10046H_TIME_WREF1, bandwidth_8mhz, sizeof(bandwidth_8mhz)); |
293 | if (state->config->if_freq == TDA10046_FREQ_045) { | ||
294 | tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_MSB, 0x0b); | ||
295 | tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_LSB, 0xa3); | ||
296 | } | ||
283 | break; | 297 | break; |
284 | 298 | ||
285 | default: | 299 | default: |
@@ -420,6 +434,14 @@ static void tda10046_init_plls(struct dvb_frontend* fe) | |||
420 | tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_MSB, 0xd4); | 434 | tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_MSB, 0xd4); |
421 | tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_LSB, 0x13); | 435 | tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_LSB, 0x13); |
422 | break; | 436 | break; |
437 | case TDA10046_FREQ_045: | ||
438 | tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_MSB, 0x0b); | ||
439 | tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_LSB, 0xa3); | ||
440 | break; | ||
441 | case TDA10046_FREQ_052: | ||
442 | tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_MSB, 0x0c); | ||
443 | tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_LSB, 0x06); | ||
444 | break; | ||
423 | } | 445 | } |
424 | tda10046h_set_bandwidth(state, BANDWIDTH_8_MHZ); // default bandwidth 8 MHz | 446 | tda10046h_set_bandwidth(state, BANDWIDTH_8_MHZ); // default bandwidth 8 MHz |
425 | } | 447 | } |
@@ -590,6 +612,16 @@ static int tda10046_init(struct dvb_frontend* fe) | |||
590 | tda1004x_write_byteI(state, TDA10046H_AGC_CONF, 0x0a); // AGC setup | 612 | tda1004x_write_byteI(state, TDA10046H_AGC_CONF, 0x0a); // AGC setup |
591 | tda1004x_write_byteI(state, TDA10046H_CONF_POLARITY, 0x60); // set AGC polarities | 613 | tda1004x_write_byteI(state, TDA10046H_CONF_POLARITY, 0x60); // set AGC polarities |
592 | break; | 614 | break; |
615 | case TDA10046_AGC_IFO_AUTO_POS: | ||
616 | tda1004x_write_byteI(state, TDA10046H_AGC_CONF, 0x0a); // AGC setup | ||
617 | tda1004x_write_byteI(state, TDA10046H_CONF_POLARITY, 0x00); // set AGC polarities | ||
618 | break; | ||
619 | case TDA10046_AGC_TDA827X: | ||
620 | tda1004x_write_byteI(state, TDA10046H_AGC_CONF, 0x02); // AGC setup | ||
621 | tda1004x_write_byteI(state, TDA10046H_AGC_THR, 0x70); // AGC Threshold | ||
622 | tda1004x_write_byteI(state, TDA10046H_AGC_RENORM, 0x0E); // Gain Renormalize | ||
623 | tda1004x_write_byteI(state, TDA10046H_CONF_POLARITY, 0x60); // set AGC polarities | ||
624 | break; | ||
593 | } | 625 | } |
594 | tda1004x_write_byteI(state, TDA10046H_CONF_TRISTATE1, 0x61); // Turn both AGC outputs on | 626 | tda1004x_write_byteI(state, TDA10046H_CONF_TRISTATE1, 0x61); // Turn both AGC outputs on |
595 | tda1004x_write_byteI(state, TDA10046H_AGC_TUN_MIN, 0); // } | 627 | tda1004x_write_byteI(state, TDA10046H_AGC_TUN_MIN, 0); // } |
@@ -1091,9 +1123,12 @@ static int tda1004x_sleep(struct dvb_frontend* fe) | |||
1091 | break; | 1123 | break; |
1092 | 1124 | ||
1093 | case TDA1004X_DEMOD_TDA10046: | 1125 | case TDA1004X_DEMOD_TDA10046: |
1094 | tda1004x_write_mask(state, TDA1004X_CONFC4, 1, 1); | 1126 | if (state->config->pll_sleep != NULL) { |
1095 | if (state->config->pll_sleep != NULL) | 1127 | tda1004x_enable_tuner_i2c(state); |
1096 | state->config->pll_sleep(fe); | 1128 | state->config->pll_sleep(fe); |
1129 | tda1004x_disable_tuner_i2c(state); | ||
1130 | } | ||
1131 | tda1004x_write_mask(state, TDA1004X_CONFC4, 1, 1); | ||
1097 | break; | 1132 | break; |
1098 | } | 1133 | } |
1099 | state->initialised = 0; | 1134 | state->initialised = 0; |
@@ -1104,8 +1139,9 @@ static int tda1004x_sleep(struct dvb_frontend* fe) | |||
1104 | static int tda1004x_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fesettings) | 1139 | static int tda1004x_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fesettings) |
1105 | { | 1140 | { |
1106 | fesettings->min_delay_ms = 800; | 1141 | fesettings->min_delay_ms = 800; |
1107 | fesettings->step_size = 166667; | 1142 | /* Drift compensation makes no sense for DVB-T */ |
1108 | fesettings->max_drift = 166667*2; | 1143 | fesettings->step_size = 0; |
1144 | fesettings->max_drift = 0; | ||
1109 | return 0; | 1145 | return 0; |
1110 | } | 1146 | } |
1111 | 1147 | ||
diff --git a/drivers/media/dvb/frontends/tda1004x.h b/drivers/media/dvb/frontends/tda1004x.h index 103d08ff7b5d..8659c52647ad 100644 --- a/drivers/media/dvb/frontends/tda1004x.h +++ b/drivers/media/dvb/frontends/tda1004x.h | |||
@@ -34,11 +34,15 @@ enum tda10046_xtal { | |||
34 | enum tda10046_agc { | 34 | enum tda10046_agc { |
35 | TDA10046_AGC_DEFAULT, /* original configuration */ | 35 | TDA10046_AGC_DEFAULT, /* original configuration */ |
36 | TDA10046_AGC_IFO_AUTO_NEG, /* IF AGC only, automatic, negtive */ | 36 | TDA10046_AGC_IFO_AUTO_NEG, /* IF AGC only, automatic, negtive */ |
37 | TDA10046_AGC_IFO_AUTO_POS, /* IF AGC only, automatic, positive */ | ||
38 | TDA10046_AGC_TDA827X, /* IF AGC only, special setup for tda827x */ | ||
37 | }; | 39 | }; |
38 | 40 | ||
39 | enum tda10046_if { | 41 | enum tda10046_if { |
40 | TDA10046_FREQ_3617, /* original config, 36,166 MHZ */ | 42 | TDA10046_FREQ_3617, /* original config, 36,166 MHZ */ |
41 | TDA10046_FREQ_3613, /* 36,13 MHZ */ | 43 | TDA10046_FREQ_3613, /* 36,13 MHZ */ |
44 | TDA10046_FREQ_045, /* low IF, 4.0, 4.5, or 5.0 MHZ */ | ||
45 | TDA10046_FREQ_052, /* low IF, 5.1667 MHZ for tda9889 */ | ||
42 | }; | 46 | }; |
43 | 47 | ||
44 | struct tda1004x_config | 48 | struct tda1004x_config |