diff options
author | Konstantin Dimitrov <kosio.dimitrov@gmail.com> | 2012-12-23 17:25:09 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-12-27 16:26:09 -0500 |
commit | c1965eae65f0db2eee574f72aab4e8b34ecf8f9c (patch) | |
tree | 7f036407f93d7be02657f8c369313ced9fd0e935 | |
parent | 10a5c9148ee6841004cb7e6f4b09022eba94c7be (diff) |
[media] ds3000: remove ts2020 tuner related code
remove ts2020 tuner related code from ds3000 driver
prepare ds3000 driver for using external tuner driver
Signed-off-by: Konstantin Dimitrov <kosio.dimitrov@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r-- | drivers/media/dvb-frontends/ds3000.c | 242 | ||||
-rw-r--r-- | drivers/media/dvb-frontends/ds3000.h | 8 |
2 files changed, 27 insertions, 223 deletions
diff --git a/drivers/media/dvb-frontends/ds3000.c b/drivers/media/dvb-frontends/ds3000.c index 60a529e3833f..cd84fbd78a5b 100644 --- a/drivers/media/dvb-frontends/ds3000.c +++ b/drivers/media/dvb-frontends/ds3000.c | |||
@@ -1,8 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | Montage Technology DS3000/TS2020 - DVBS/S2 Demodulator/Tuner driver | 2 | Montage Technology DS3000 - DVBS/S2 Demodulator driver |
3 | Copyright (C) 2009 Konstantin Dimitrov <kosio.dimitrov@gmail.com> | 3 | Copyright (C) 2009-2012 Konstantin Dimitrov <kosio.dimitrov@gmail.com> |
4 | 4 | ||
5 | Copyright (C) 2009 TurboSight.com | 5 | Copyright (C) 2009-2012 TurboSight.com |
6 | 6 | ||
7 | This program is free software; you can redistribute it and/or modify | 7 | This program is free software; you can redistribute it and/or modify |
8 | it under the terms of the GNU General Public License as published by | 8 | it under the terms of the GNU General Public License as published by |
@@ -42,7 +42,6 @@ static int debug; | |||
42 | #define DS3000_DEFAULT_FIRMWARE "dvb-fe-ds3000.fw" | 42 | #define DS3000_DEFAULT_FIRMWARE "dvb-fe-ds3000.fw" |
43 | 43 | ||
44 | #define DS3000_SAMPLE_RATE 96000 /* in kHz */ | 44 | #define DS3000_SAMPLE_RATE 96000 /* in kHz */ |
45 | #define DS3000_XTAL_FREQ 27000 /* in kHz */ | ||
46 | 45 | ||
47 | /* Register values to initialise the demod in DVB-S mode */ | 46 | /* Register values to initialise the demod in DVB-S mode */ |
48 | static u8 ds3000_dvbs_init_tab[] = { | 47 | static u8 ds3000_dvbs_init_tab[] = { |
@@ -256,22 +255,14 @@ static int ds3000_writereg(struct ds3000_state *state, int reg, int data) | |||
256 | return 0; | 255 | return 0; |
257 | } | 256 | } |
258 | 257 | ||
259 | static int ds3000_tuner_writereg(struct ds3000_state *state, int reg, int data) | 258 | static int ds3000_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) |
260 | { | 259 | { |
261 | u8 buf[] = { reg, data }; | 260 | struct ds3000_state *state = fe->demodulator_priv; |
262 | struct i2c_msg msg = { .addr = 0x60, | ||
263 | .flags = 0, .buf = buf, .len = 2 }; | ||
264 | int err; | ||
265 | |||
266 | dprintk("%s: write reg 0x%02x, value 0x%02x\n", __func__, reg, data); | ||
267 | 261 | ||
268 | ds3000_writereg(state, 0x03, 0x11); | 262 | if (enable) |
269 | err = i2c_transfer(state->i2c, &msg, 1); | 263 | ds3000_writereg(state, 0x03, 0x12); |
270 | if (err != 1) { | 264 | else |
271 | printk("%s: writereg error(err == %i, reg == 0x%02x," | 265 | ds3000_writereg(state, 0x03, 0x02); |
272 | " value == 0x%02x)\n", __func__, err, reg, data); | ||
273 | return -EREMOTEIO; | ||
274 | } | ||
275 | 266 | ||
276 | return 0; | 267 | return 0; |
277 | } | 268 | } |
@@ -348,38 +339,6 @@ static int ds3000_readreg(struct ds3000_state *state, u8 reg) | |||
348 | return b1[0]; | 339 | return b1[0]; |
349 | } | 340 | } |
350 | 341 | ||
351 | static int ds3000_tuner_readreg(struct ds3000_state *state, u8 reg) | ||
352 | { | ||
353 | int ret; | ||
354 | u8 b0[] = { reg }; | ||
355 | u8 b1[] = { 0 }; | ||
356 | struct i2c_msg msg[] = { | ||
357 | { | ||
358 | .addr = 0x60, | ||
359 | .flags = 0, | ||
360 | .buf = b0, | ||
361 | .len = 1 | ||
362 | }, { | ||
363 | .addr = 0x60, | ||
364 | .flags = I2C_M_RD, | ||
365 | .buf = b1, | ||
366 | .len = 1 | ||
367 | } | ||
368 | }; | ||
369 | |||
370 | ds3000_writereg(state, 0x03, 0x12); | ||
371 | ret = i2c_transfer(state->i2c, msg, 2); | ||
372 | |||
373 | if (ret != 2) { | ||
374 | printk(KERN_ERR "%s: reg=0x%x(error=%d)\n", __func__, reg, ret); | ||
375 | return ret; | ||
376 | } | ||
377 | |||
378 | dprintk("%s: read reg 0x%02x, value 0x%02x\n", __func__, reg, b1[0]); | ||
379 | |||
380 | return b1[0]; | ||
381 | } | ||
382 | |||
383 | static int ds3000_load_firmware(struct dvb_frontend *fe, | 342 | static int ds3000_load_firmware(struct dvb_frontend *fe, |
384 | const struct firmware *fw); | 343 | const struct firmware *fw); |
385 | 344 | ||
@@ -568,37 +527,6 @@ static int ds3000_read_ber(struct dvb_frontend *fe, u32* ber) | |||
568 | return 0; | 527 | return 0; |
569 | } | 528 | } |
570 | 529 | ||
571 | /* read TS2020 signal strength */ | ||
572 | static int ds3000_read_signal_strength(struct dvb_frontend *fe, | ||
573 | u16 *signal_strength) | ||
574 | { | ||
575 | struct ds3000_state *state = fe->demodulator_priv; | ||
576 | u16 sig_reading, sig_strength; | ||
577 | u8 rfgain, bbgain; | ||
578 | |||
579 | dprintk("%s()\n", __func__); | ||
580 | |||
581 | rfgain = ds3000_tuner_readreg(state, 0x3d) & 0x1f; | ||
582 | bbgain = ds3000_tuner_readreg(state, 0x21) & 0x1f; | ||
583 | |||
584 | if (rfgain > 15) | ||
585 | rfgain = 15; | ||
586 | if (bbgain > 13) | ||
587 | bbgain = 13; | ||
588 | |||
589 | sig_reading = rfgain * 2 + bbgain * 3; | ||
590 | |||
591 | sig_strength = 40 + (64 - sig_reading) * 50 / 64 ; | ||
592 | |||
593 | /* cook the value to be suitable for szap-s2 human readable output */ | ||
594 | *signal_strength = sig_strength * 1000; | ||
595 | |||
596 | dprintk("%s: raw / cooked = 0x%04x / 0x%04x\n", __func__, | ||
597 | sig_reading, *signal_strength); | ||
598 | |||
599 | return 0; | ||
600 | } | ||
601 | |||
602 | /* calculate DS3000 snr value in dB */ | 530 | /* calculate DS3000 snr value in dB */ |
603 | static int ds3000_read_snr(struct dvb_frontend *fe, u16 *snr) | 531 | static int ds3000_read_snr(struct dvb_frontend *fe, u16 *snr) |
604 | { | 532 | { |
@@ -952,133 +880,17 @@ static int ds3000_set_frontend(struct dvb_frontend *fe) | |||
952 | 880 | ||
953 | int i; | 881 | int i; |
954 | fe_status_t status; | 882 | fe_status_t status; |
955 | u8 mlpf, mlpf_new, mlpf_max, mlpf_min, nlpf, div4; | ||
956 | s32 offset_khz; | 883 | s32 offset_khz; |
957 | u16 value, ndiv; | 884 | u32 frequency; |
958 | u32 f3db; | 885 | u16 value; |
959 | 886 | ||
960 | dprintk("%s() ", __func__); | 887 | dprintk("%s() ", __func__); |
961 | 888 | ||
962 | if (state->config->set_ts_params) | 889 | if (state->config->set_ts_params) |
963 | state->config->set_ts_params(fe, 0); | 890 | state->config->set_ts_params(fe, 0); |
964 | /* Tune */ | 891 | /* Tune */ |
965 | /* unknown */ | 892 | if (fe->ops.tuner_ops.set_params) |
966 | ds3000_tuner_writereg(state, 0x07, 0x02); | 893 | fe->ops.tuner_ops.set_params(fe); |
967 | ds3000_tuner_writereg(state, 0x10, 0x00); | ||
968 | ds3000_tuner_writereg(state, 0x60, 0x79); | ||
969 | ds3000_tuner_writereg(state, 0x08, 0x01); | ||
970 | ds3000_tuner_writereg(state, 0x00, 0x01); | ||
971 | div4 = 0; | ||
972 | |||
973 | /* calculate and set freq divider */ | ||
974 | if (c->frequency < 1146000) { | ||
975 | ds3000_tuner_writereg(state, 0x10, 0x11); | ||
976 | div4 = 1; | ||
977 | ndiv = ((c->frequency * (6 + 8) * 4) + | ||
978 | (DS3000_XTAL_FREQ / 2)) / | ||
979 | DS3000_XTAL_FREQ - 1024; | ||
980 | } else { | ||
981 | ds3000_tuner_writereg(state, 0x10, 0x01); | ||
982 | ndiv = ((c->frequency * (6 + 8) * 2) + | ||
983 | (DS3000_XTAL_FREQ / 2)) / | ||
984 | DS3000_XTAL_FREQ - 1024; | ||
985 | } | ||
986 | |||
987 | ds3000_tuner_writereg(state, 0x01, (ndiv & 0x0f00) >> 8); | ||
988 | ds3000_tuner_writereg(state, 0x02, ndiv & 0x00ff); | ||
989 | |||
990 | /* set pll */ | ||
991 | ds3000_tuner_writereg(state, 0x03, 0x06); | ||
992 | ds3000_tuner_writereg(state, 0x51, 0x0f); | ||
993 | ds3000_tuner_writereg(state, 0x51, 0x1f); | ||
994 | ds3000_tuner_writereg(state, 0x50, 0x10); | ||
995 | ds3000_tuner_writereg(state, 0x50, 0x00); | ||
996 | msleep(5); | ||
997 | |||
998 | /* unknown */ | ||
999 | ds3000_tuner_writereg(state, 0x51, 0x17); | ||
1000 | ds3000_tuner_writereg(state, 0x51, 0x1f); | ||
1001 | ds3000_tuner_writereg(state, 0x50, 0x08); | ||
1002 | ds3000_tuner_writereg(state, 0x50, 0x00); | ||
1003 | msleep(5); | ||
1004 | |||
1005 | value = ds3000_tuner_readreg(state, 0x3d); | ||
1006 | value &= 0x0f; | ||
1007 | if ((value > 4) && (value < 15)) { | ||
1008 | value -= 3; | ||
1009 | if (value < 4) | ||
1010 | value = 4; | ||
1011 | value = ((value << 3) | 0x01) & 0x79; | ||
1012 | } | ||
1013 | |||
1014 | ds3000_tuner_writereg(state, 0x60, value); | ||
1015 | ds3000_tuner_writereg(state, 0x51, 0x17); | ||
1016 | ds3000_tuner_writereg(state, 0x51, 0x1f); | ||
1017 | ds3000_tuner_writereg(state, 0x50, 0x08); | ||
1018 | ds3000_tuner_writereg(state, 0x50, 0x00); | ||
1019 | |||
1020 | /* set low-pass filter period */ | ||
1021 | ds3000_tuner_writereg(state, 0x04, 0x2e); | ||
1022 | ds3000_tuner_writereg(state, 0x51, 0x1b); | ||
1023 | ds3000_tuner_writereg(state, 0x51, 0x1f); | ||
1024 | ds3000_tuner_writereg(state, 0x50, 0x04); | ||
1025 | ds3000_tuner_writereg(state, 0x50, 0x00); | ||
1026 | msleep(5); | ||
1027 | |||
1028 | f3db = ((c->symbol_rate / 1000) << 2) / 5 + 2000; | ||
1029 | if ((c->symbol_rate / 1000) < 5000) | ||
1030 | f3db += 3000; | ||
1031 | if (f3db < 7000) | ||
1032 | f3db = 7000; | ||
1033 | if (f3db > 40000) | ||
1034 | f3db = 40000; | ||
1035 | |||
1036 | /* set low-pass filter baseband */ | ||
1037 | value = ds3000_tuner_readreg(state, 0x26); | ||
1038 | mlpf = 0x2e * 207 / ((value << 1) + 151); | ||
1039 | mlpf_max = mlpf * 135 / 100; | ||
1040 | mlpf_min = mlpf * 78 / 100; | ||
1041 | if (mlpf_max > 63) | ||
1042 | mlpf_max = 63; | ||
1043 | |||
1044 | /* rounded to the closest integer */ | ||
1045 | nlpf = ((mlpf * f3db * 1000) + (2766 * DS3000_XTAL_FREQ / 2)) | ||
1046 | / (2766 * DS3000_XTAL_FREQ); | ||
1047 | if (nlpf > 23) | ||
1048 | nlpf = 23; | ||
1049 | if (nlpf < 1) | ||
1050 | nlpf = 1; | ||
1051 | |||
1052 | /* rounded to the closest integer */ | ||
1053 | mlpf_new = ((DS3000_XTAL_FREQ * nlpf * 2766) + | ||
1054 | (1000 * f3db / 2)) / (1000 * f3db); | ||
1055 | |||
1056 | if (mlpf_new < mlpf_min) { | ||
1057 | nlpf++; | ||
1058 | mlpf_new = ((DS3000_XTAL_FREQ * nlpf * 2766) + | ||
1059 | (1000 * f3db / 2)) / (1000 * f3db); | ||
1060 | } | ||
1061 | |||
1062 | if (mlpf_new > mlpf_max) | ||
1063 | mlpf_new = mlpf_max; | ||
1064 | |||
1065 | ds3000_tuner_writereg(state, 0x04, mlpf_new); | ||
1066 | ds3000_tuner_writereg(state, 0x06, nlpf); | ||
1067 | ds3000_tuner_writereg(state, 0x51, 0x1b); | ||
1068 | ds3000_tuner_writereg(state, 0x51, 0x1f); | ||
1069 | ds3000_tuner_writereg(state, 0x50, 0x04); | ||
1070 | ds3000_tuner_writereg(state, 0x50, 0x00); | ||
1071 | msleep(5); | ||
1072 | |||
1073 | /* unknown */ | ||
1074 | ds3000_tuner_writereg(state, 0x51, 0x1e); | ||
1075 | ds3000_tuner_writereg(state, 0x51, 0x1f); | ||
1076 | ds3000_tuner_writereg(state, 0x50, 0x01); | ||
1077 | ds3000_tuner_writereg(state, 0x50, 0x00); | ||
1078 | msleep(60); | ||
1079 | |||
1080 | offset_khz = (ndiv - ndiv % 2 + 1024) * DS3000_XTAL_FREQ | ||
1081 | / (6 + 8) / (div4 + 1) / 2 - c->frequency; | ||
1082 | 894 | ||
1083 | /* ds3000 global reset */ | 895 | /* ds3000 global reset */ |
1084 | ds3000_writereg(state, 0x07, 0x80); | 896 | ds3000_writereg(state, 0x07, 0x80); |
@@ -1186,7 +998,11 @@ static int ds3000_set_frontend(struct dvb_frontend *fe) | |||
1186 | /* start ds3000 build-in uC */ | 998 | /* start ds3000 build-in uC */ |
1187 | ds3000_writereg(state, 0xb2, 0x00); | 999 | ds3000_writereg(state, 0xb2, 0x00); |
1188 | 1000 | ||
1189 | ds3000_set_carrier_offset(fe, offset_khz); | 1001 | if (fe->ops.tuner_ops.get_frequency) { |
1002 | fe->ops.tuner_ops.get_frequency(fe, &frequency); | ||
1003 | offset_khz = frequency - c->frequency; | ||
1004 | ds3000_set_carrier_offset(fe, offset_khz); | ||
1005 | } | ||
1190 | 1006 | ||
1191 | for (i = 0; i < 30 ; i++) { | 1007 | for (i = 0; i < 30 ; i++) { |
1192 | ds3000_read_status(fe, &status); | 1008 | ds3000_read_status(fe, &status); |
@@ -1237,10 +1053,6 @@ static int ds3000_initfe(struct dvb_frontend *fe) | |||
1237 | ds3000_writereg(state, 0x08, 0x01 | ds3000_readreg(state, 0x08)); | 1053 | ds3000_writereg(state, 0x08, 0x01 | ds3000_readreg(state, 0x08)); |
1238 | msleep(1); | 1054 | msleep(1); |
1239 | 1055 | ||
1240 | /* TS2020 init */ | ||
1241 | ds3000_tuner_writereg(state, 0x42, 0x73); | ||
1242 | ds3000_tuner_writereg(state, 0x05, 0x01); | ||
1243 | ds3000_tuner_writereg(state, 0x62, 0xf5); | ||
1244 | /* Load the firmware if required */ | 1056 | /* Load the firmware if required */ |
1245 | ret = ds3000_firmware_ondemand(fe); | 1057 | ret = ds3000_firmware_ondemand(fe); |
1246 | if (ret != 0) { | 1058 | if (ret != 0) { |
@@ -1251,17 +1063,10 @@ static int ds3000_initfe(struct dvb_frontend *fe) | |||
1251 | return 0; | 1063 | return 0; |
1252 | } | 1064 | } |
1253 | 1065 | ||
1254 | /* Put device to sleep */ | ||
1255 | static int ds3000_sleep(struct dvb_frontend *fe) | ||
1256 | { | ||
1257 | dprintk("%s()\n", __func__); | ||
1258 | return 0; | ||
1259 | } | ||
1260 | |||
1261 | static struct dvb_frontend_ops ds3000_ops = { | 1066 | static struct dvb_frontend_ops ds3000_ops = { |
1262 | .delsys = { SYS_DVBS, SYS_DVBS2}, | 1067 | .delsys = { SYS_DVBS, SYS_DVBS2 }, |
1263 | .info = { | 1068 | .info = { |
1264 | .name = "Montage Technology DS3000/TS2020", | 1069 | .name = "Montage Technology DS3000", |
1265 | .frequency_min = 950000, | 1070 | .frequency_min = 950000, |
1266 | .frequency_max = 2150000, | 1071 | .frequency_max = 2150000, |
1267 | .frequency_stepsize = 1011, /* kHz for QPSK frontends */ | 1072 | .frequency_stepsize = 1011, /* kHz for QPSK frontends */ |
@@ -1279,10 +1084,9 @@ static struct dvb_frontend_ops ds3000_ops = { | |||
1279 | .release = ds3000_release, | 1084 | .release = ds3000_release, |
1280 | 1085 | ||
1281 | .init = ds3000_initfe, | 1086 | .init = ds3000_initfe, |
1282 | .sleep = ds3000_sleep, | 1087 | .i2c_gate_ctrl = ds3000_i2c_gate_ctrl, |
1283 | .read_status = ds3000_read_status, | 1088 | .read_status = ds3000_read_status, |
1284 | .read_ber = ds3000_read_ber, | 1089 | .read_ber = ds3000_read_ber, |
1285 | .read_signal_strength = ds3000_read_signal_strength, | ||
1286 | .read_snr = ds3000_read_snr, | 1090 | .read_snr = ds3000_read_snr, |
1287 | .read_ucblocks = ds3000_read_ucblocks, | 1091 | .read_ucblocks = ds3000_read_ucblocks, |
1288 | .set_voltage = ds3000_set_voltage, | 1092 | .set_voltage = ds3000_set_voltage, |
@@ -1299,7 +1103,7 @@ module_param(debug, int, 0644); | |||
1299 | MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)"); | 1103 | MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)"); |
1300 | 1104 | ||
1301 | MODULE_DESCRIPTION("DVB Frontend module for Montage Technology " | 1105 | MODULE_DESCRIPTION("DVB Frontend module for Montage Technology " |
1302 | "DS3000/TS2020 hardware"); | 1106 | "DS3000 hardware"); |
1303 | MODULE_AUTHOR("Konstantin Dimitrov"); | 1107 | MODULE_AUTHOR("Konstantin Dimitrov <kosio.dimitrov@gmail.com>"); |
1304 | MODULE_LICENSE("GPL"); | 1108 | MODULE_LICENSE("GPL"); |
1305 | MODULE_FIRMWARE(DS3000_DEFAULT_FIRMWARE); | 1109 | MODULE_FIRMWARE(DS3000_DEFAULT_FIRMWARE); |
diff --git a/drivers/media/dvb-frontends/ds3000.h b/drivers/media/dvb-frontends/ds3000.h index 1b736888ea37..67eeaf9bdbce 100644 --- a/drivers/media/dvb-frontends/ds3000.h +++ b/drivers/media/dvb-frontends/ds3000.h | |||
@@ -1,8 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | Montage Technology DS3000/TS2020 - DVBS/S2 Satellite demod/tuner driver | 2 | Montage Technology DS3000 - DVBS/S2 Demodulator driver |
3 | Copyright (C) 2009 Konstantin Dimitrov <kosio.dimitrov@gmail.com> | 3 | Copyright (C) 2009-2012 Konstantin Dimitrov <kosio.dimitrov@gmail.com> |
4 | 4 | ||
5 | Copyright (C) 2009 TurboSight.com | 5 | Copyright (C) 2009-2012 TurboSight.com |
6 | 6 | ||
7 | This program is free software; you can redistribute it and/or modify | 7 | This program is free software; you can redistribute it and/or modify |
8 | it under the terms of the GNU General Public License as published by | 8 | it under the terms of the GNU General Public License as published by |
@@ -17,7 +17,7 @@ | |||
17 | You should have received a copy of the GNU General Public License | 17 | You should have received a copy of the GNU General Public License |
18 | along with this program; if not, write to the Free Software | 18 | along with this program; if not, write to the Free Software |
19 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 19 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #ifndef DS3000_H | 22 | #ifndef DS3000_H |
23 | #define DS3000_H | 23 | #define DS3000_H |