Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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>

authored by

Konstantin Dimitrov and committed by
Mauro Carvalho Chehab
c1965eae 10a5c914

+27 -223
+23 -219
drivers/media/dvb-frontends/ds3000.c
··· 1 1 /* 2 - Montage Technology DS3000/TS2020 - DVBS/S2 Demodulator/Tuner driver 3 - Copyright (C) 2009 Konstantin Dimitrov <kosio.dimitrov@gmail.com> 2 + Montage Technology DS3000 - DVBS/S2 Demodulator driver 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 7 This program is free software; you can redistribute it and/or modify 8 8 it under the terms of the GNU General Public License as published by ··· 42 42 #define DS3000_DEFAULT_FIRMWARE "dvb-fe-ds3000.fw" 43 43 44 44 #define DS3000_SAMPLE_RATE 96000 /* in kHz */ 45 - #define DS3000_XTAL_FREQ 27000 /* in kHz */ 46 45 47 46 /* Register values to initialise the demod in DVB-S mode */ 48 47 static u8 ds3000_dvbs_init_tab[] = { ··· 255 256 return 0; 256 257 } 257 258 258 - static int ds3000_tuner_writereg(struct ds3000_state *state, int reg, int data) 259 + static int ds3000_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) 259 260 { 260 - u8 buf[] = { reg, data }; 261 - struct i2c_msg msg = { .addr = 0x60, 262 - .flags = 0, .buf = buf, .len = 2 }; 263 - int err; 261 + struct ds3000_state *state = fe->demodulator_priv; 264 262 265 - dprintk("%s: write reg 0x%02x, value 0x%02x\n", __func__, reg, data); 266 - 267 - ds3000_writereg(state, 0x03, 0x11); 268 - err = i2c_transfer(state->i2c, &msg, 1); 269 - if (err != 1) { 270 - printk("%s: writereg error(err == %i, reg == 0x%02x," 271 - " value == 0x%02x)\n", __func__, err, reg, data); 272 - return -EREMOTEIO; 273 - } 263 + if (enable) 264 + ds3000_writereg(state, 0x03, 0x12); 265 + else 266 + ds3000_writereg(state, 0x03, 0x02); 274 267 275 268 return 0; 276 269 } ··· 327 336 } 328 337 }; 329 338 330 - ret = i2c_transfer(state->i2c, msg, 2); 331 - 332 - if (ret != 2) { 333 - printk(KERN_ERR "%s: reg=0x%x(error=%d)\n", __func__, reg, ret); 334 - return ret; 335 - } 336 - 337 - dprintk("%s: read reg 0x%02x, value 0x%02x\n", __func__, reg, b1[0]); 338 - 339 - return b1[0]; 340 - } 341 - 342 - static int ds3000_tuner_readreg(struct ds3000_state *state, u8 reg) 343 - { 344 - int ret; 345 - u8 b0[] = { reg }; 346 - u8 b1[] = { 0 }; 347 - struct i2c_msg msg[] = { 348 - { 349 - .addr = 0x60, 350 - .flags = 0, 351 - .buf = b0, 352 - .len = 1 353 - }, { 354 - .addr = 0x60, 355 - .flags = I2C_M_RD, 356 - .buf = b1, 357 - .len = 1 358 - } 359 - }; 360 - 361 - ds3000_writereg(state, 0x03, 0x12); 362 339 ret = i2c_transfer(state->i2c, msg, 2); 363 340 364 341 if (ret != 2) { ··· 523 564 default: 524 565 return 1; 525 566 } 526 - 527 - return 0; 528 - } 529 - 530 - /* read TS2020 signal strength */ 531 - static int ds3000_read_signal_strength(struct dvb_frontend *fe, 532 - u16 *signal_strength) 533 - { 534 - struct ds3000_state *state = fe->demodulator_priv; 535 - u16 sig_reading, sig_strength; 536 - u8 rfgain, bbgain; 537 - 538 - dprintk("%s()\n", __func__); 539 - 540 - rfgain = ds3000_tuner_readreg(state, 0x3d) & 0x1f; 541 - bbgain = ds3000_tuner_readreg(state, 0x21) & 0x1f; 542 - 543 - if (rfgain > 15) 544 - rfgain = 15; 545 - if (bbgain > 13) 546 - bbgain = 13; 547 - 548 - sig_reading = rfgain * 2 + bbgain * 3; 549 - 550 - sig_strength = 40 + (64 - sig_reading) * 50 / 64 ; 551 - 552 - /* cook the value to be suitable for szap-s2 human readable output */ 553 - *signal_strength = sig_strength * 1000; 554 - 555 - dprintk("%s: raw / cooked = 0x%04x / 0x%04x\n", __func__, 556 - sig_reading, *signal_strength); 557 567 558 568 return 0; 559 569 } ··· 880 952 881 953 int i; 882 954 fe_status_t status; 883 - u8 mlpf, mlpf_new, mlpf_max, mlpf_min, nlpf, div4; 884 955 s32 offset_khz; 885 - u16 value, ndiv; 886 - u32 f3db; 956 + u32 frequency; 957 + u16 value; 887 958 888 959 dprintk("%s() ", __func__); 889 960 890 961 if (state->config->set_ts_params) 891 962 state->config->set_ts_params(fe, 0); 892 963 /* Tune */ 893 - /* unknown */ 894 - ds3000_tuner_writereg(state, 0x07, 0x02); 895 - ds3000_tuner_writereg(state, 0x10, 0x00); 896 - ds3000_tuner_writereg(state, 0x60, 0x79); 897 - ds3000_tuner_writereg(state, 0x08, 0x01); 898 - ds3000_tuner_writereg(state, 0x00, 0x01); 899 - div4 = 0; 900 - 901 - /* calculate and set freq divider */ 902 - if (c->frequency < 1146000) { 903 - ds3000_tuner_writereg(state, 0x10, 0x11); 904 - div4 = 1; 905 - ndiv = ((c->frequency * (6 + 8) * 4) + 906 - (DS3000_XTAL_FREQ / 2)) / 907 - DS3000_XTAL_FREQ - 1024; 908 - } else { 909 - ds3000_tuner_writereg(state, 0x10, 0x01); 910 - ndiv = ((c->frequency * (6 + 8) * 2) + 911 - (DS3000_XTAL_FREQ / 2)) / 912 - DS3000_XTAL_FREQ - 1024; 913 - } 914 - 915 - ds3000_tuner_writereg(state, 0x01, (ndiv & 0x0f00) >> 8); 916 - ds3000_tuner_writereg(state, 0x02, ndiv & 0x00ff); 917 - 918 - /* set pll */ 919 - ds3000_tuner_writereg(state, 0x03, 0x06); 920 - ds3000_tuner_writereg(state, 0x51, 0x0f); 921 - ds3000_tuner_writereg(state, 0x51, 0x1f); 922 - ds3000_tuner_writereg(state, 0x50, 0x10); 923 - ds3000_tuner_writereg(state, 0x50, 0x00); 924 - msleep(5); 925 - 926 - /* unknown */ 927 - ds3000_tuner_writereg(state, 0x51, 0x17); 928 - ds3000_tuner_writereg(state, 0x51, 0x1f); 929 - ds3000_tuner_writereg(state, 0x50, 0x08); 930 - ds3000_tuner_writereg(state, 0x50, 0x00); 931 - msleep(5); 932 - 933 - value = ds3000_tuner_readreg(state, 0x3d); 934 - value &= 0x0f; 935 - if ((value > 4) && (value < 15)) { 936 - value -= 3; 937 - if (value < 4) 938 - value = 4; 939 - value = ((value << 3) | 0x01) & 0x79; 940 - } 941 - 942 - ds3000_tuner_writereg(state, 0x60, value); 943 - ds3000_tuner_writereg(state, 0x51, 0x17); 944 - ds3000_tuner_writereg(state, 0x51, 0x1f); 945 - ds3000_tuner_writereg(state, 0x50, 0x08); 946 - ds3000_tuner_writereg(state, 0x50, 0x00); 947 - 948 - /* set low-pass filter period */ 949 - ds3000_tuner_writereg(state, 0x04, 0x2e); 950 - ds3000_tuner_writereg(state, 0x51, 0x1b); 951 - ds3000_tuner_writereg(state, 0x51, 0x1f); 952 - ds3000_tuner_writereg(state, 0x50, 0x04); 953 - ds3000_tuner_writereg(state, 0x50, 0x00); 954 - msleep(5); 955 - 956 - f3db = ((c->symbol_rate / 1000) << 2) / 5 + 2000; 957 - if ((c->symbol_rate / 1000) < 5000) 958 - f3db += 3000; 959 - if (f3db < 7000) 960 - f3db = 7000; 961 - if (f3db > 40000) 962 - f3db = 40000; 963 - 964 - /* set low-pass filter baseband */ 965 - value = ds3000_tuner_readreg(state, 0x26); 966 - mlpf = 0x2e * 207 / ((value << 1) + 151); 967 - mlpf_max = mlpf * 135 / 100; 968 - mlpf_min = mlpf * 78 / 100; 969 - if (mlpf_max > 63) 970 - mlpf_max = 63; 971 - 972 - /* rounded to the closest integer */ 973 - nlpf = ((mlpf * f3db * 1000) + (2766 * DS3000_XTAL_FREQ / 2)) 974 - / (2766 * DS3000_XTAL_FREQ); 975 - if (nlpf > 23) 976 - nlpf = 23; 977 - if (nlpf < 1) 978 - nlpf = 1; 979 - 980 - /* rounded to the closest integer */ 981 - mlpf_new = ((DS3000_XTAL_FREQ * nlpf * 2766) + 982 - (1000 * f3db / 2)) / (1000 * f3db); 983 - 984 - if (mlpf_new < mlpf_min) { 985 - nlpf++; 986 - mlpf_new = ((DS3000_XTAL_FREQ * nlpf * 2766) + 987 - (1000 * f3db / 2)) / (1000 * f3db); 988 - } 989 - 990 - if (mlpf_new > mlpf_max) 991 - mlpf_new = mlpf_max; 992 - 993 - ds3000_tuner_writereg(state, 0x04, mlpf_new); 994 - ds3000_tuner_writereg(state, 0x06, nlpf); 995 - ds3000_tuner_writereg(state, 0x51, 0x1b); 996 - ds3000_tuner_writereg(state, 0x51, 0x1f); 997 - ds3000_tuner_writereg(state, 0x50, 0x04); 998 - ds3000_tuner_writereg(state, 0x50, 0x00); 999 - msleep(5); 1000 - 1001 - /* unknown */ 1002 - ds3000_tuner_writereg(state, 0x51, 0x1e); 1003 - ds3000_tuner_writereg(state, 0x51, 0x1f); 1004 - ds3000_tuner_writereg(state, 0x50, 0x01); 1005 - ds3000_tuner_writereg(state, 0x50, 0x00); 1006 - msleep(60); 1007 - 1008 - offset_khz = (ndiv - ndiv % 2 + 1024) * DS3000_XTAL_FREQ 1009 - / (6 + 8) / (div4 + 1) / 2 - c->frequency; 964 + if (fe->ops.tuner_ops.set_params) 965 + fe->ops.tuner_ops.set_params(fe); 1010 966 1011 967 /* ds3000 global reset */ 1012 968 ds3000_writereg(state, 0x07, 0x80); ··· 998 1186 /* start ds3000 build-in uC */ 999 1187 ds3000_writereg(state, 0xb2, 0x00); 1000 1188 1001 - ds3000_set_carrier_offset(fe, offset_khz); 1189 + if (fe->ops.tuner_ops.get_frequency) { 1190 + fe->ops.tuner_ops.get_frequency(fe, &frequency); 1191 + offset_khz = frequency - c->frequency; 1192 + ds3000_set_carrier_offset(fe, offset_khz); 1193 + } 1002 1194 1003 1195 for (i = 0; i < 30 ; i++) { 1004 1196 ds3000_read_status(fe, &status); ··· 1053 1237 ds3000_writereg(state, 0x08, 0x01 | ds3000_readreg(state, 0x08)); 1054 1238 msleep(1); 1055 1239 1056 - /* TS2020 init */ 1057 - ds3000_tuner_writereg(state, 0x42, 0x73); 1058 - ds3000_tuner_writereg(state, 0x05, 0x01); 1059 - ds3000_tuner_writereg(state, 0x62, 0xf5); 1060 1240 /* Load the firmware if required */ 1061 1241 ret = ds3000_firmware_ondemand(fe); 1062 1242 if (ret != 0) { ··· 1063 1251 return 0; 1064 1252 } 1065 1253 1066 - /* Put device to sleep */ 1067 - static int ds3000_sleep(struct dvb_frontend *fe) 1068 - { 1069 - dprintk("%s()\n", __func__); 1070 - return 0; 1071 - } 1072 - 1073 1254 static struct dvb_frontend_ops ds3000_ops = { 1074 - .delsys = { SYS_DVBS, SYS_DVBS2}, 1255 + .delsys = { SYS_DVBS, SYS_DVBS2 }, 1075 1256 .info = { 1076 - .name = "Montage Technology DS3000/TS2020", 1257 + .name = "Montage Technology DS3000", 1077 1258 .frequency_min = 950000, 1078 1259 .frequency_max = 2150000, 1079 1260 .frequency_stepsize = 1011, /* kHz for QPSK frontends */ ··· 1084 1279 .release = ds3000_release, 1085 1280 1086 1281 .init = ds3000_initfe, 1087 - .sleep = ds3000_sleep, 1282 + .i2c_gate_ctrl = ds3000_i2c_gate_ctrl, 1088 1283 .read_status = ds3000_read_status, 1089 1284 .read_ber = ds3000_read_ber, 1090 - .read_signal_strength = ds3000_read_signal_strength, 1091 1285 .read_snr = ds3000_read_snr, 1092 1286 .read_ucblocks = ds3000_read_ucblocks, 1093 1287 .set_voltage = ds3000_set_voltage, ··· 1103 1299 MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)"); 1104 1300 1105 1301 MODULE_DESCRIPTION("DVB Frontend module for Montage Technology " 1106 - "DS3000/TS2020 hardware"); 1107 - MODULE_AUTHOR("Konstantin Dimitrov"); 1302 + "DS3000 hardware"); 1303 + MODULE_AUTHOR("Konstantin Dimitrov <kosio.dimitrov@gmail.com>"); 1108 1304 MODULE_LICENSE("GPL"); 1109 1305 MODULE_FIRMWARE(DS3000_DEFAULT_FIRMWARE);
+4 -4
drivers/media/dvb-frontends/ds3000.h
··· 1 1 /* 2 - Montage Technology DS3000/TS2020 - DVBS/S2 Satellite demod/tuner driver 3 - Copyright (C) 2009 Konstantin Dimitrov <kosio.dimitrov@gmail.com> 2 + Montage Technology DS3000 - DVBS/S2 Demodulator driver 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 7 This program is free software; you can redistribute it and/or modify 8 8 it under the terms of the GNU General Public License as published by ··· 17 17 You should have received a copy of the GNU General Public License 18 18 along with this program; if not, write to the Free Software 19 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 - */ 20 + */ 21 21 22 22 #ifndef DS3000_H 23 23 #define DS3000_H