dst.c 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386
  1. /*
  2. Frontend/Card driver for TwinHan DST Frontend
  3. Copyright (C) 2003 Jamie Honan
  4. Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. */
  17. #include <linux/kernel.h>
  18. #include <linux/module.h>
  19. #include <linux/init.h>
  20. #include <linux/string.h>
  21. #include <linux/slab.h>
  22. #include <linux/vmalloc.h>
  23. #include <linux/delay.h>
  24. #include <asm/div64.h>
  25. #include "dvb_frontend.h"
  26. #include "dst_priv.h"
  27. #include "dst_common.h"
  28. static unsigned int verbose = 1;
  29. module_param(verbose, int, 0644);
  30. MODULE_PARM_DESC(verbose, "verbose startup messages, default is 1 (yes)");
  31. static unsigned int debug = 1;
  32. module_param(debug, int, 0644);
  33. MODULE_PARM_DESC(debug, "debug messages, default is 0 (yes)");
  34. static unsigned int dst_addons;
  35. module_param(dst_addons, int, 0644);
  36. MODULE_PARM_DESC(dst_addons, "CA daughterboard, default is 0 (No addons)");
  37. #define dprintk if (debug) printk
  38. #define HAS_LOCK 1
  39. #define ATTEMPT_TUNE 2
  40. #define HAS_POWER 4
  41. static void dst_packsize(struct dst_state* state, int psize)
  42. {
  43. union dst_gpio_packet bits;
  44. bits.psize = psize;
  45. bt878_device_control(state->bt, DST_IG_TS, &bits);
  46. }
  47. int dst_gpio_outb(struct dst_state* state, u32 mask, u32 enbb, u32 outhigh, int delay)
  48. {
  49. union dst_gpio_packet enb;
  50. union dst_gpio_packet bits;
  51. int err;
  52. enb.enb.mask = mask;
  53. enb.enb.enable = enbb;
  54. if (verbose > 4)
  55. dprintk("%s: mask=[%04x], enbb=[%04x], outhigh=[%04x]\n", __FUNCTION__, mask, enbb, outhigh);
  56. if ((err = bt878_device_control(state->bt, DST_IG_ENABLE, &enb)) < 0) {
  57. dprintk("%s: dst_gpio_enb error (err == %i, mask == %02x, enb == %02x)\n", __FUNCTION__, err, mask, enbb);
  58. return -EREMOTEIO;
  59. }
  60. udelay(1000);
  61. /* because complete disabling means no output, no need to do output packet */
  62. if (enbb == 0)
  63. return 0;
  64. if (delay)
  65. msleep(10);
  66. bits.outp.mask = enbb;
  67. bits.outp.highvals = outhigh;
  68. if ((err = bt878_device_control(state->bt, DST_IG_WRITE, &bits)) < 0) {
  69. dprintk("%s: dst_gpio_outb error (err == %i, enbb == %02x, outhigh == %02x)\n", __FUNCTION__, err, enbb, outhigh);
  70. return -EREMOTEIO;
  71. }
  72. return 0;
  73. }
  74. EXPORT_SYMBOL(dst_gpio_outb);
  75. int dst_gpio_inb(struct dst_state *state, u8 * result)
  76. {
  77. union dst_gpio_packet rd_packet;
  78. int err;
  79. *result = 0;
  80. if ((err = bt878_device_control(state->bt, DST_IG_READ, &rd_packet)) < 0) {
  81. dprintk("%s: dst_gpio_inb error (err == %i)\n", __FUNCTION__, err);
  82. return -EREMOTEIO;
  83. }
  84. *result = (u8) rd_packet.rd.value;
  85. return 0;
  86. }
  87. EXPORT_SYMBOL(dst_gpio_inb);
  88. int rdc_reset_state(struct dst_state *state)
  89. {
  90. if (verbose > 1)
  91. dprintk("%s: Resetting state machine\n", __FUNCTION__);
  92. if (dst_gpio_outb(state, RDC_8820_INT, RDC_8820_INT, 0, NO_DELAY) < 0) {
  93. dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
  94. return -1;
  95. }
  96. msleep(10);
  97. if (dst_gpio_outb(state, RDC_8820_INT, RDC_8820_INT, RDC_8820_INT, NO_DELAY) < 0) {
  98. dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
  99. msleep(10);
  100. return -1;
  101. }
  102. return 0;
  103. }
  104. EXPORT_SYMBOL(rdc_reset_state);
  105. int rdc_8820_reset(struct dst_state *state)
  106. {
  107. if (verbose > 1)
  108. dprintk("%s: Resetting DST\n", __FUNCTION__);
  109. if (dst_gpio_outb(state, RDC_8820_RESET, RDC_8820_RESET, 0, NO_DELAY) < 0) {
  110. dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
  111. return -1;
  112. }
  113. udelay(1000);
  114. if (dst_gpio_outb(state, RDC_8820_RESET, RDC_8820_RESET, RDC_8820_RESET, DELAY) < 0) {
  115. dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
  116. return -1;
  117. }
  118. return 0;
  119. }
  120. EXPORT_SYMBOL(rdc_8820_reset);
  121. int dst_pio_enable(struct dst_state *state)
  122. {
  123. if (dst_gpio_outb(state, ~0, RDC_8820_PIO_0_ENABLE, 0, NO_DELAY) < 0) {
  124. dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
  125. return -1;
  126. }
  127. udelay(1000);
  128. return 0;
  129. }
  130. EXPORT_SYMBOL(dst_pio_enable);
  131. int dst_pio_disable(struct dst_state *state)
  132. {
  133. if (dst_gpio_outb(state, ~0, RDC_8820_PIO_0_DISABLE, RDC_8820_PIO_0_DISABLE, NO_DELAY) < 0) {
  134. dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
  135. return -1;
  136. }
  137. if (state->type_flags & DST_TYPE_HAS_FW_1)
  138. udelay(1000);
  139. return 0;
  140. }
  141. EXPORT_SYMBOL(dst_pio_disable);
  142. int dst_wait_dst_ready(struct dst_state *state, u8 delay_mode)
  143. {
  144. u8 reply;
  145. int i;
  146. for (i = 0; i < 200; i++) {
  147. if (dst_gpio_inb(state, &reply) < 0) {
  148. dprintk("%s: dst_gpio_inb ERROR !\n", __FUNCTION__);
  149. return -1;
  150. }
  151. if ((reply & RDC_8820_PIO_0_ENABLE) == 0) {
  152. if (verbose > 4)
  153. dprintk("%s: dst wait ready after %d\n", __FUNCTION__, i);
  154. return 1;
  155. }
  156. msleep(10);
  157. }
  158. if (verbose > 1)
  159. dprintk("%s: dst wait NOT ready after %d\n", __FUNCTION__, i);
  160. return 0;
  161. }
  162. EXPORT_SYMBOL(dst_wait_dst_ready);
  163. int dst_error_recovery(struct dst_state *state)
  164. {
  165. dprintk("%s: Trying to return from previous errors...\n", __FUNCTION__);
  166. dst_pio_disable(state);
  167. msleep(10);
  168. dst_pio_enable(state);
  169. msleep(10);
  170. return 0;
  171. }
  172. EXPORT_SYMBOL(dst_error_recovery);
  173. int dst_error_bailout(struct dst_state *state)
  174. {
  175. dprintk("%s: Trying to bailout from previous error...\n", __FUNCTION__);
  176. rdc_8820_reset(state);
  177. dst_pio_disable(state);
  178. msleep(10);
  179. return 0;
  180. }
  181. EXPORT_SYMBOL(dst_error_bailout);
  182. int dst_comm_init(struct dst_state* state)
  183. {
  184. if (verbose > 1)
  185. dprintk ("%s: Initializing DST..\n", __FUNCTION__);
  186. if ((dst_pio_enable(state)) < 0) {
  187. dprintk("%s: PIO Enable Failed.\n", __FUNCTION__);
  188. return -1;
  189. }
  190. if ((rdc_reset_state(state)) < 0) {
  191. dprintk("%s: RDC 8820 State RESET Failed.\n", __FUNCTION__);
  192. return -1;
  193. }
  194. if (state->type_flags & DST_TYPE_HAS_FW_1)
  195. msleep(100);
  196. else
  197. msleep(5);
  198. return 0;
  199. }
  200. EXPORT_SYMBOL(dst_comm_init);
  201. int write_dst(struct dst_state *state, u8 *data, u8 len)
  202. {
  203. struct i2c_msg msg = {
  204. .addr = state->config->demod_address,.flags = 0,.buf = data,.len = len
  205. };
  206. int err;
  207. int cnt;
  208. if (debug && (verbose > 4)) {
  209. u8 i;
  210. if (verbose > 4) {
  211. dprintk("%s writing", __FUNCTION__);
  212. for (i = 0; i < len; i++)
  213. dprintk(" %02x", data[i]);
  214. dprintk("\n");
  215. }
  216. }
  217. for (cnt = 0; cnt < 2; cnt++) {
  218. if ((err = i2c_transfer(state->i2c, &msg, 1)) < 0) {
  219. dprintk("%s: _write_dst error (err == %i, len == 0x%02x, b0 == 0x%02x)\n", __FUNCTION__, err, len, data[0]);
  220. dst_error_recovery(state);
  221. continue;
  222. } else
  223. break;
  224. }
  225. if (cnt >= 2) {
  226. if (verbose > 1)
  227. printk("%s: RDC 8820 RESET...\n", __FUNCTION__);
  228. dst_error_bailout(state);
  229. return -1;
  230. }
  231. return 0;
  232. }
  233. EXPORT_SYMBOL(write_dst);
  234. int read_dst(struct dst_state *state, u8 * ret, u8 len)
  235. {
  236. struct i2c_msg msg = {.addr = state->config->demod_address,.flags = I2C_M_RD,.buf = ret,.len = len };
  237. int err;
  238. int cnt;
  239. for (cnt = 0; cnt < 2; cnt++) {
  240. if ((err = i2c_transfer(state->i2c, &msg, 1)) < 0) {
  241. dprintk("%s: read_dst error (err == %i, len == 0x%02x, b0 == 0x%02x)\n", __FUNCTION__, err, len, ret[0]);
  242. dst_error_recovery(state);
  243. continue;
  244. } else
  245. break;
  246. }
  247. if (cnt >= 2) {
  248. if (verbose > 1)
  249. printk("%s: RDC 8820 RESET...\n", __FUNCTION__);
  250. dst_error_bailout(state);
  251. return -1;
  252. }
  253. if (debug && (verbose > 4)) {
  254. dprintk("%s reply is 0x%x\n", __FUNCTION__, ret[0]);
  255. for (err = 1; err < len; err++)
  256. dprintk(" 0x%x", ret[err]);
  257. if (err > 1)
  258. dprintk("\n");
  259. }
  260. return 0;
  261. }
  262. EXPORT_SYMBOL(read_dst);
  263. static int dst_set_freq(struct dst_state *state, u32 freq)
  264. {
  265. u8 *val;
  266. state->frequency = freq;
  267. if (debug > 4)
  268. dprintk("%s: set Frequency %u\n", __FUNCTION__, freq);
  269. if (state->dst_type == DST_TYPE_IS_SAT) {
  270. freq = freq / 1000;
  271. if (freq < 950 || freq > 2150)
  272. return -EINVAL;
  273. val = &state->tx_tuna[0];
  274. val[2] = (freq >> 8) & 0x7f;
  275. val[3] = (u8) freq;
  276. val[4] = 1;
  277. val[8] &= ~4;
  278. if (freq < 1531)
  279. val[8] |= 4;
  280. } else if (state->dst_type == DST_TYPE_IS_TERR) {
  281. freq = freq / 1000;
  282. if (freq < 137000 || freq > 858000)
  283. return -EINVAL;
  284. val = &state->tx_tuna[0];
  285. val[2] = (freq >> 16) & 0xff;
  286. val[3] = (freq >> 8) & 0xff;
  287. val[4] = (u8) freq;
  288. val[5] = 0;
  289. switch (state->bandwidth) {
  290. case BANDWIDTH_6_MHZ:
  291. val[6] = 6;
  292. break;
  293. case BANDWIDTH_7_MHZ:
  294. case BANDWIDTH_AUTO:
  295. val[6] = 7;
  296. break;
  297. case BANDWIDTH_8_MHZ:
  298. val[6] = 8;
  299. break;
  300. }
  301. val[7] = 0;
  302. val[8] = 0;
  303. } else if (state->dst_type == DST_TYPE_IS_CABLE) {
  304. /* guess till will get one */
  305. freq = freq / 1000;
  306. val = &state->tx_tuna[0];
  307. val[2] = (freq >> 16) & 0xff;
  308. val[3] = (freq >> 8) & 0xff;
  309. val[4] = (u8) freq;
  310. } else
  311. return -EINVAL;
  312. return 0;
  313. }
  314. static int dst_set_bandwidth(struct dst_state* state, fe_bandwidth_t bandwidth)
  315. {
  316. u8 *val;
  317. state->bandwidth = bandwidth;
  318. if (state->dst_type != DST_TYPE_IS_TERR)
  319. return 0;
  320. val = &state->tx_tuna[0];
  321. switch (bandwidth) {
  322. case BANDWIDTH_6_MHZ:
  323. val[6] = 6;
  324. break;
  325. case BANDWIDTH_7_MHZ:
  326. val[6] = 7;
  327. break;
  328. case BANDWIDTH_8_MHZ:
  329. val[6] = 8;
  330. break;
  331. default:
  332. return -EINVAL;
  333. }
  334. return 0;
  335. }
  336. static int dst_set_inversion(struct dst_state* state, fe_spectral_inversion_t inversion)
  337. {
  338. u8 *val;
  339. state->inversion = inversion;
  340. val = &state->tx_tuna[0];
  341. val[8] &= ~0x80;
  342. switch (inversion) {
  343. case INVERSION_OFF:
  344. break;
  345. case INVERSION_ON:
  346. val[8] |= 0x80;
  347. break;
  348. default:
  349. return -EINVAL;
  350. }
  351. return 0;
  352. }
  353. static int dst_set_fec(struct dst_state* state, fe_code_rate_t fec)
  354. {
  355. state->fec = fec;
  356. return 0;
  357. }
  358. static fe_code_rate_t dst_get_fec(struct dst_state* state)
  359. {
  360. return state->fec;
  361. }
  362. static int dst_set_symbolrate(struct dst_state* state, u32 srate)
  363. {
  364. u8 *val;
  365. u32 symcalc;
  366. u64 sval;
  367. state->symbol_rate = srate;
  368. if (state->dst_type == DST_TYPE_IS_TERR) {
  369. return 0;
  370. }
  371. if (debug > 4)
  372. dprintk("%s: set symrate %u\n", __FUNCTION__, srate);
  373. srate /= 1000;
  374. val = &state->tx_tuna[0];
  375. if (state->type_flags & DST_TYPE_HAS_SYMDIV) {
  376. sval = srate;
  377. sval <<= 20;
  378. do_div(sval, 88000);
  379. symcalc = (u32) sval;
  380. if (debug > 4)
  381. dprintk("%s: set symcalc %u\n", __FUNCTION__, symcalc);
  382. val[5] = (u8) (symcalc >> 12);
  383. val[6] = (u8) (symcalc >> 4);
  384. val[7] = (u8) (symcalc << 4);
  385. } else {
  386. val[5] = (u8) (srate >> 16) & 0x7f;
  387. val[6] = (u8) (srate >> 8);
  388. val[7] = (u8) srate;
  389. }
  390. val[8] &= ~0x20;
  391. if (srate > 8000)
  392. val[8] |= 0x20;
  393. return 0;
  394. }
  395. u8 dst_check_sum(u8 * buf, u32 len)
  396. {
  397. u32 i;
  398. u8 val = 0;
  399. if (!len)
  400. return 0;
  401. for (i = 0; i < len; i++) {
  402. val += buf[i];
  403. }
  404. return ((~val) + 1);
  405. }
  406. EXPORT_SYMBOL(dst_check_sum);
  407. static void dst_type_flags_print(u32 type_flags)
  408. {
  409. printk("DST type flags :");
  410. if (type_flags & DST_TYPE_HAS_NEWTUNE)
  411. printk(" 0x%x newtuner", DST_TYPE_HAS_NEWTUNE);
  412. if (type_flags & DST_TYPE_HAS_TS204)
  413. printk(" 0x%x ts204", DST_TYPE_HAS_TS204);
  414. if (type_flags & DST_TYPE_HAS_SYMDIV)
  415. printk(" 0x%x symdiv", DST_TYPE_HAS_SYMDIV);
  416. if (type_flags & DST_TYPE_HAS_FW_1)
  417. printk(" 0x%x firmware version = 1", DST_TYPE_HAS_FW_1);
  418. if (type_flags & DST_TYPE_HAS_FW_2)
  419. printk(" 0x%x firmware version = 2", DST_TYPE_HAS_FW_2);
  420. if (type_flags & DST_TYPE_HAS_FW_3)
  421. printk(" 0x%x firmware version = 3", DST_TYPE_HAS_FW_3);
  422. // if ((type_flags & DST_TYPE_HAS_FW_BUILD) && new_fw)
  423. printk("\n");
  424. }
  425. static int dst_type_print (u8 type)
  426. {
  427. char *otype;
  428. switch (type) {
  429. case DST_TYPE_IS_SAT:
  430. otype = "satellite";
  431. break;
  432. case DST_TYPE_IS_TERR:
  433. otype = "terrestrial";
  434. break;
  435. case DST_TYPE_IS_CABLE:
  436. otype = "cable";
  437. break;
  438. default:
  439. printk("%s: invalid dst type %d\n", __FUNCTION__, type);
  440. return -EINVAL;
  441. }
  442. printk("DST type : %s\n", otype);
  443. return 0;
  444. }
  445. /*
  446. Known cards list
  447. Satellite
  448. -------------------
  449. 200103A
  450. VP-1020 DST-MOT LG(old), TS=188
  451. VP-1020 DST-03T LG(new), TS=204
  452. VP-1022 DST-03T LG(new), TS=204
  453. VP-1025 DST-03T LG(new), TS=204
  454. VP-1030 DSTMCI, LG(new), TS=188
  455. VP-1032 DSTMCI, LG(new), TS=188
  456. Cable
  457. -------------------
  458. VP-2030 DCT-CI, Samsung, TS=204
  459. VP-2021 DCT-CI, Unknown, TS=204
  460. VP-2031 DCT-CI, Philips, TS=188
  461. VP-2040 DCT-CI, Philips, TS=188, with CA daughter board
  462. VP-2040 DCT-CI, Philips, TS=204, without CA daughter board
  463. Terrestrial
  464. -------------------
  465. VP-3050 DTTNXT TS=188
  466. VP-3040 DTT-CI, Philips, TS=188
  467. VP-3040 DTT-CI, Philips, TS=204
  468. ATSC
  469. -------------------
  470. VP-3220 ATSCDI, TS=188
  471. VP-3250 ATSCAD, TS=188
  472. */
  473. struct dst_types dst_tlist[] = {
  474. {
  475. .device_id = "200103A",
  476. .offset = 0,
  477. .dst_type = DST_TYPE_IS_SAT,
  478. .type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_FW_1,
  479. .dst_feature = 0
  480. }, /* obsolete */
  481. {
  482. .device_id = "DST-020",
  483. .offset = 0,
  484. .dst_type = DST_TYPE_IS_SAT,
  485. .type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_FW_1,
  486. .dst_feature = 0
  487. }, /* obsolete */
  488. {
  489. .device_id = "DST-030",
  490. .offset = 0,
  491. .dst_type = DST_TYPE_IS_SAT,
  492. .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1,
  493. .dst_feature = 0
  494. }, /* obsolete */
  495. {
  496. .device_id = "DST-03T",
  497. .offset = 0,
  498. .dst_type = DST_TYPE_IS_SAT,
  499. .type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_TS204 | DST_TYPE_HAS_FW_2,
  500. .dst_feature = DST_TYPE_HAS_DISEQC3 | DST_TYPE_HAS_DISEQC4 | DST_TYPE_HAS_DISEQC5
  501. | DST_TYPE_HAS_MAC | DST_TYPE_HAS_MOTO
  502. },
  503. {
  504. .device_id = "DST-MOT",
  505. .offset = 0,
  506. .dst_type = DST_TYPE_IS_SAT,
  507. .type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_FW_1,
  508. .dst_feature = 0
  509. }, /* obsolete */
  510. {
  511. .device_id = "DST-CI",
  512. .offset = 1,
  513. .dst_type = DST_TYPE_IS_SAT,
  514. .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1,
  515. .dst_feature = DST_TYPE_HAS_CA
  516. }, /* An OEM board */
  517. {
  518. .device_id = "DSTMCI",
  519. .offset = 1,
  520. .dst_type = DST_TYPE_IS_SAT,
  521. .type_flags = DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD,
  522. .dst_feature = DST_TYPE_HAS_CA | DST_TYPE_HAS_DISEQC3 | DST_TYPE_HAS_DISEQC4
  523. | DST_TYPE_HAS_MOTO | DST_TYPE_HAS_MAC
  524. },
  525. {
  526. .device_id = "DSTFCI",
  527. .offset = 1,
  528. .dst_type = DST_TYPE_IS_SAT,
  529. .type_flags = DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1,
  530. .dst_feature = 0
  531. }, /* unknown to vendor */
  532. {
  533. .device_id = "DCT-CI",
  534. .offset = 1,
  535. .dst_type = DST_TYPE_IS_CABLE,
  536. .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1
  537. | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD,
  538. .dst_feature = DST_TYPE_HAS_CA
  539. },
  540. {
  541. .device_id = "DCTNEW",
  542. .offset = 1,
  543. .dst_type = DST_TYPE_IS_CABLE,
  544. .type_flags = DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_3,
  545. .dst_feature = 0
  546. },
  547. {
  548. .device_id = "DTT-CI",
  549. .offset = 1,
  550. .dst_type = DST_TYPE_IS_TERR,
  551. .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD,
  552. .dst_feature = 0
  553. },
  554. {
  555. .device_id = "DTTDIG",
  556. .offset = 1,
  557. .dst_type = DST_TYPE_IS_TERR,
  558. .type_flags = DST_TYPE_HAS_FW_2,
  559. .dst_feature = 0
  560. },
  561. {
  562. .device_id = "DTTNXT",
  563. .offset = 1,
  564. .dst_type = DST_TYPE_IS_TERR,
  565. .type_flags = DST_TYPE_HAS_FW_2,
  566. .dst_feature = DST_TYPE_HAS_ANALOG
  567. },
  568. {
  569. .device_id = "ATSCDI",
  570. .offset = 1,
  571. .dst_type = DST_TYPE_IS_ATSC,
  572. .type_flags = DST_TYPE_HAS_FW_2,
  573. .dst_feature = 0
  574. },
  575. {
  576. .device_id = "ATSCAD",
  577. .offset = 1,
  578. .dst_type = DST_TYPE_IS_ATSC,
  579. .type_flags = DST_TYPE_HAS_FW_2,
  580. .dst_feature = 0
  581. },
  582. { }
  583. };
  584. static int dst_get_device_id(struct dst_state *state)
  585. {
  586. u8 reply;
  587. int i;
  588. struct dst_types *p_dst_type;
  589. u8 use_dst_type = 0;
  590. u32 use_type_flags = 0;
  591. static u8 device_type[8] = {0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff};
  592. device_type[7] = dst_check_sum(device_type, 7);
  593. if (write_dst(state, device_type, FIXED_COMM))
  594. return -1; /* Write failed */
  595. if ((dst_pio_disable(state)) < 0)
  596. return -1;
  597. if (read_dst(state, &reply, GET_ACK))
  598. return -1; /* Read failure */
  599. if (reply != ACK) {
  600. dprintk("%s: Write not Acknowledged! [Reply=0x%02x]\n", __FUNCTION__, reply);
  601. return -1; /* Unack'd write */
  602. }
  603. if (!dst_wait_dst_ready(state, DEVICE_INIT))
  604. return -1; /* DST not ready yet */
  605. if (read_dst(state, state->rxbuffer, FIXED_COMM))
  606. return -1;
  607. dst_pio_disable(state);
  608. if (state->rxbuffer[7] != dst_check_sum(state->rxbuffer, 7)) {
  609. dprintk("%s: Checksum failure! \n", __FUNCTION__);
  610. return -1; /* Checksum failure */
  611. }
  612. state->rxbuffer[7] = '\0';
  613. for (i = 0, p_dst_type = dst_tlist; i < ARRAY_SIZE (dst_tlist); i++, p_dst_type++) {
  614. if (!strncmp (&state->rxbuffer[p_dst_type->offset], p_dst_type->device_id, strlen (p_dst_type->device_id))) {
  615. use_type_flags = p_dst_type->type_flags;
  616. use_dst_type = p_dst_type->dst_type;
  617. /* Card capabilities */
  618. state->dst_hw_cap = p_dst_type->dst_feature;
  619. printk ("%s: Recognise [%s]\n", __FUNCTION__, p_dst_type->device_id);
  620. break;
  621. }
  622. }
  623. if (i >= sizeof (dst_tlist) / sizeof (dst_tlist [0])) {
  624. printk("%s: Unable to recognize %s or %s\n", __FUNCTION__, &state->rxbuffer[0], &state->rxbuffer[1]);
  625. printk("%s: please email linux-dvb@linuxtv.org with this type in\n", __FUNCTION__);
  626. use_dst_type = DST_TYPE_IS_SAT;
  627. use_type_flags = DST_TYPE_HAS_SYMDIV;
  628. }
  629. dst_type_print(use_dst_type);
  630. state->type_flags = use_type_flags;
  631. state->dst_type = use_dst_type;
  632. dst_type_flags_print(state->type_flags);
  633. if (state->type_flags & DST_TYPE_HAS_TS204) {
  634. dst_packsize(state, 204);
  635. }
  636. return 0;
  637. }
  638. static int dst_probe(struct dst_state *state)
  639. {
  640. if ((rdc_8820_reset(state)) < 0) {
  641. dprintk("%s: RDC 8820 RESET Failed.\n", __FUNCTION__);
  642. return -1;
  643. }
  644. if (dst_addons & DST_TYPE_HAS_CA)
  645. msleep(4000);
  646. else
  647. msleep(100);
  648. if ((dst_comm_init(state)) < 0) {
  649. dprintk("%s: DST Initialization Failed.\n", __FUNCTION__);
  650. return -1;
  651. }
  652. msleep(100);
  653. if (dst_get_device_id(state) < 0) {
  654. dprintk("%s: unknown device.\n", __FUNCTION__);
  655. return -1;
  656. }
  657. return 0;
  658. }
  659. int dst_command(struct dst_state* state, u8 * data, u8 len)
  660. {
  661. u8 reply;
  662. if ((dst_comm_init(state)) < 0) {
  663. dprintk("%s: DST Communication Initialization Failed.\n", __FUNCTION__);
  664. return -1;
  665. }
  666. if (write_dst(state, data, len)) {
  667. if (verbose > 1)
  668. dprintk("%s: Tring to recover.. \n", __FUNCTION__);
  669. if ((dst_error_recovery(state)) < 0) {
  670. dprintk("%s: Recovery Failed.\n", __FUNCTION__);
  671. return -1;
  672. }
  673. return -1;
  674. }
  675. if ((dst_pio_disable(state)) < 0) {
  676. dprintk("%s: PIO Disable Failed.\n", __FUNCTION__);
  677. return -1;
  678. }
  679. if (state->type_flags & DST_TYPE_HAS_FW_1)
  680. udelay(3000);
  681. if (read_dst(state, &reply, GET_ACK)) {
  682. if (verbose > 1)
  683. dprintk("%s: Trying to recover.. \n", __FUNCTION__);
  684. if ((dst_error_recovery(state)) < 0) {
  685. dprintk("%s: Recovery Failed.\n", __FUNCTION__);
  686. return -1;
  687. }
  688. return -1;
  689. }
  690. if (reply != ACK) {
  691. dprintk("%s: write not acknowledged 0x%02x \n", __FUNCTION__, reply);
  692. return -1;
  693. }
  694. if (len >= 2 && data[0] == 0 && (data[1] == 1 || data[1] == 3))
  695. return 0;
  696. // udelay(3000);
  697. if (state->type_flags & DST_TYPE_HAS_FW_1)
  698. udelay(3000);
  699. else
  700. udelay(2000);
  701. if (!dst_wait_dst_ready(state, NO_DELAY))
  702. return -1;
  703. if (read_dst(state, state->rxbuffer, FIXED_COMM)) {
  704. if (verbose > 1)
  705. dprintk("%s: Trying to recover.. \n", __FUNCTION__);
  706. if ((dst_error_recovery(state)) < 0) {
  707. dprintk("%s: Recovery failed.\n", __FUNCTION__);
  708. return -1;
  709. }
  710. return -1;
  711. }
  712. if (state->rxbuffer[7] != dst_check_sum(state->rxbuffer, 7)) {
  713. dprintk("%s: checksum failure\n", __FUNCTION__);
  714. return -1;
  715. }
  716. return 0;
  717. }
  718. EXPORT_SYMBOL(dst_command);
  719. static int dst_get_signal(struct dst_state* state)
  720. {
  721. int retval;
  722. u8 get_signal[] = { 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb };
  723. if ((state->diseq_flags & ATTEMPT_TUNE) == 0) {
  724. state->decode_lock = state->decode_strength = state->decode_snr = 0;
  725. return 0;
  726. }
  727. if (0 == (state->diseq_flags & HAS_LOCK)) {
  728. state->decode_lock = state->decode_strength = state->decode_snr = 0;
  729. return 0;
  730. }
  731. if (time_after_eq(jiffies, state->cur_jiff + (HZ / 5))) {
  732. retval = dst_command(state, get_signal, 8);
  733. if (retval < 0)
  734. return retval;
  735. if (state->dst_type == DST_TYPE_IS_SAT) {
  736. state->decode_lock = ((state->rxbuffer[6] & 0x10) == 0) ? 1 : 0;
  737. state->decode_strength = state->rxbuffer[5] << 8;
  738. state->decode_snr = state->rxbuffer[2] << 8 | state->rxbuffer[3];
  739. } else if ((state->dst_type == DST_TYPE_IS_TERR) || (state->dst_type == DST_TYPE_IS_CABLE)) {
  740. state->decode_lock = (state->rxbuffer[1]) ? 1 : 0;
  741. state->decode_strength = state->rxbuffer[4] << 8;
  742. state->decode_snr = state->rxbuffer[3] << 8;
  743. }
  744. state->cur_jiff = jiffies;
  745. }
  746. return 0;
  747. }
  748. static int dst_tone_power_cmd(struct dst_state* state)
  749. {
  750. u8 paket[8] = { 0x00, 0x09, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00 };
  751. if (state->dst_type == DST_TYPE_IS_TERR)
  752. return 0;
  753. paket[4] = state->tx_tuna[4];
  754. paket[2] = state->tx_tuna[2];
  755. paket[3] = state->tx_tuna[3];
  756. paket[7] = dst_check_sum (paket, 7);
  757. dst_command(state, paket, 8);
  758. return 0;
  759. }
  760. static int dst_get_tuna(struct dst_state* state)
  761. {
  762. int retval;
  763. if ((state->diseq_flags & ATTEMPT_TUNE) == 0)
  764. return 0;
  765. state->diseq_flags &= ~(HAS_LOCK);
  766. if (!dst_wait_dst_ready(state, NO_DELAY))
  767. return 0;
  768. if (state->type_flags & DST_TYPE_HAS_NEWTUNE) {
  769. /* how to get variable length reply ???? */
  770. retval = read_dst(state, state->rx_tuna, 10);
  771. } else {
  772. retval = read_dst(state, &state->rx_tuna[2], FIXED_COMM);
  773. }
  774. if (retval < 0) {
  775. dprintk("%s: read not successful\n", __FUNCTION__);
  776. return 0;
  777. }
  778. if (state->type_flags & DST_TYPE_HAS_NEWTUNE) {
  779. if (state->rx_tuna[9] != dst_check_sum(&state->rx_tuna[0], 9)) {
  780. dprintk("%s: checksum failure?\n", __FUNCTION__);
  781. return 0;
  782. }
  783. } else {
  784. if (state->rx_tuna[9] != dst_check_sum(&state->rx_tuna[2], 7)) {
  785. dprintk("%s: checksum failure?\n", __FUNCTION__);
  786. return 0;
  787. }
  788. }
  789. if (state->rx_tuna[2] == 0 && state->rx_tuna[3] == 0)
  790. return 0;
  791. state->decode_freq = ((state->rx_tuna[2] & 0x7f) << 8) + state->rx_tuna[3];
  792. state->decode_lock = 1;
  793. /*
  794. dst->decode_n1 = (dst->rx_tuna[4] << 8) +
  795. (dst->rx_tuna[5]);
  796. dst->decode_n2 = (dst->rx_tuna[8] << 8) +
  797. (dst->rx_tuna[7]);
  798. */
  799. state->diseq_flags |= HAS_LOCK;
  800. /* dst->cur_jiff = jiffies; */
  801. return 1;
  802. }
  803. static int dst_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage);
  804. static int dst_write_tuna(struct dvb_frontend* fe)
  805. {
  806. struct dst_state* state = fe->demodulator_priv;
  807. int retval;
  808. u8 reply;
  809. if (debug > 4)
  810. dprintk("%s: type_flags 0x%x \n", __FUNCTION__, state->type_flags);
  811. state->decode_freq = 0;
  812. state->decode_lock = state->decode_strength = state->decode_snr = 0;
  813. if (state->dst_type == DST_TYPE_IS_SAT) {
  814. if (!(state->diseq_flags & HAS_POWER))
  815. dst_set_voltage(fe, SEC_VOLTAGE_13);
  816. }
  817. state->diseq_flags &= ~(HAS_LOCK | ATTEMPT_TUNE);
  818. if ((dst_comm_init(state)) < 0) {
  819. dprintk("%s: DST Communication initialization failed.\n", __FUNCTION__);
  820. return -1;
  821. }
  822. if (state->type_flags & DST_TYPE_HAS_NEWTUNE) {
  823. state->tx_tuna[9] = dst_check_sum(&state->tx_tuna[0], 9);
  824. retval = write_dst(state, &state->tx_tuna[0], 10);
  825. } else {
  826. state->tx_tuna[9] = dst_check_sum(&state->tx_tuna[2], 7);
  827. retval = write_dst(state, &state->tx_tuna[2], FIXED_COMM);
  828. }
  829. if (retval < 0) {
  830. dst_pio_disable(state);
  831. dprintk("%s: write not successful\n", __FUNCTION__);
  832. return retval;
  833. }
  834. if ((dst_pio_disable(state)) < 0) {
  835. dprintk("%s: DST PIO disable failed !\n", __FUNCTION__);
  836. return -1;
  837. }
  838. if ((read_dst(state, &reply, GET_ACK) < 0)) {
  839. dprintk("%s: read verify not successful.\n", __FUNCTION__);
  840. return -1;
  841. }
  842. if (reply != ACK) {
  843. dprintk("%s: write not acknowledged 0x%02x \n", __FUNCTION__, reply);
  844. return 0;
  845. }
  846. state->diseq_flags |= ATTEMPT_TUNE;
  847. return dst_get_tuna(state);
  848. }
  849. /*
  850. * line22k0 0x00, 0x09, 0x00, 0xff, 0x01, 0x00, 0x00, 0x00
  851. * line22k1 0x00, 0x09, 0x01, 0xff, 0x01, 0x00, 0x00, 0x00
  852. * line22k2 0x00, 0x09, 0x02, 0xff, 0x01, 0x00, 0x00, 0x00
  853. * tone 0x00, 0x09, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00
  854. * data 0x00, 0x09, 0xff, 0x01, 0x01, 0x00, 0x00, 0x00
  855. * power_off 0x00, 0x09, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00
  856. * power_on 0x00, 0x09, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00
  857. * Diseqc 1 0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf0, 0xec
  858. * Diseqc 2 0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf4, 0xe8
  859. * Diseqc 3 0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf8, 0xe4
  860. * Diseqc 4 0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xfc, 0xe0
  861. */
  862. static int dst_set_diseqc(struct dvb_frontend* fe, struct dvb_diseqc_master_cmd* cmd)
  863. {
  864. struct dst_state* state = fe->demodulator_priv;
  865. u8 paket[8] = { 0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf0, 0xec };
  866. if (state->dst_type != DST_TYPE_IS_SAT)
  867. return 0;
  868. if (cmd->msg_len == 0 || cmd->msg_len > 4)
  869. return -EINVAL;
  870. memcpy(&paket[3], cmd->msg, cmd->msg_len);
  871. paket[7] = dst_check_sum(&paket[0], 7);
  872. dst_command(state, paket, 8);
  873. return 0;
  874. }
  875. static int dst_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage)
  876. {
  877. int need_cmd;
  878. struct dst_state* state = fe->demodulator_priv;
  879. state->voltage = voltage;
  880. if (state->dst_type != DST_TYPE_IS_SAT)
  881. return 0;
  882. need_cmd = 0;
  883. switch (voltage) {
  884. case SEC_VOLTAGE_13:
  885. case SEC_VOLTAGE_18:
  886. if ((state->diseq_flags & HAS_POWER) == 0)
  887. need_cmd = 1;
  888. state->diseq_flags |= HAS_POWER;
  889. state->tx_tuna[4] = 0x01;
  890. break;
  891. case SEC_VOLTAGE_OFF:
  892. need_cmd = 1;
  893. state->diseq_flags &= ~(HAS_POWER | HAS_LOCK | ATTEMPT_TUNE);
  894. state->tx_tuna[4] = 0x00;
  895. break;
  896. default:
  897. return -EINVAL;
  898. }
  899. if (need_cmd)
  900. dst_tone_power_cmd(state);
  901. return 0;
  902. }
  903. static int dst_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
  904. {
  905. struct dst_state* state = fe->demodulator_priv;
  906. state->tone = tone;
  907. if (state->dst_type != DST_TYPE_IS_SAT)
  908. return 0;
  909. switch (tone) {
  910. case SEC_TONE_OFF:
  911. state->tx_tuna[2] = 0xff;
  912. break;
  913. case SEC_TONE_ON:
  914. state->tx_tuna[2] = 0x02;
  915. break;
  916. default:
  917. return -EINVAL;
  918. }
  919. dst_tone_power_cmd(state);
  920. return 0;
  921. }
  922. static int dst_send_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t minicmd)
  923. {
  924. struct dst_state *state = fe->demodulator_priv;
  925. if (state->dst_type != DST_TYPE_IS_SAT)
  926. return 0;
  927. state->minicmd = minicmd;
  928. switch (minicmd) {
  929. case SEC_MINI_A:
  930. state->tx_tuna[3] = 0x02;
  931. break;
  932. case SEC_MINI_B:
  933. state->tx_tuna[3] = 0xff;
  934. break;
  935. }
  936. dst_tone_power_cmd(state);
  937. return 0;
  938. }
  939. static int dst_init(struct dvb_frontend* fe)
  940. {
  941. struct dst_state* state = fe->demodulator_priv;
  942. static u8 ini_satci_tuna[] = { 9, 0, 3, 0xb6, 1, 0, 0x73, 0x21, 0, 0 };
  943. static u8 ini_satfta_tuna[] = { 0, 0, 3, 0xb6, 1, 0x55, 0xbd, 0x50, 0, 0 };
  944. static u8 ini_tvfta_tuna[] = { 0, 0, 3, 0xb6, 1, 7, 0x0, 0x0, 0, 0 };
  945. static u8 ini_tvci_tuna[] = { 9, 0, 3, 0xb6, 1, 7, 0x0, 0x0, 0, 0 };
  946. static u8 ini_cabfta_tuna[] = { 0, 0, 3, 0xb6, 1, 7, 0x0, 0x0, 0, 0 };
  947. static u8 ini_cabci_tuna[] = { 9, 0, 3, 0xb6, 1, 7, 0x0, 0x0, 0, 0 };
  948. state->inversion = INVERSION_ON;
  949. state->voltage = SEC_VOLTAGE_13;
  950. state->tone = SEC_TONE_OFF;
  951. state->symbol_rate = 29473000;
  952. state->fec = FEC_AUTO;
  953. state->diseq_flags = 0;
  954. state->k22 = 0x02;
  955. state->bandwidth = BANDWIDTH_7_MHZ;
  956. state->cur_jiff = jiffies;
  957. if (state->dst_type == DST_TYPE_IS_SAT) {
  958. state->frequency = 950000;
  959. memcpy(state->tx_tuna, ((state->type_flags & DST_TYPE_HAS_NEWTUNE) ? ini_satci_tuna : ini_satfta_tuna), sizeof(ini_satfta_tuna));
  960. } else if (state->dst_type == DST_TYPE_IS_TERR) {
  961. state->frequency = 137000000;
  962. memcpy(state->tx_tuna, ((state->type_flags & DST_TYPE_HAS_NEWTUNE) ? ini_tvci_tuna : ini_tvfta_tuna), sizeof(ini_tvfta_tuna));
  963. } else if (state->dst_type == DST_TYPE_IS_CABLE) {
  964. state->frequency = 51000000;
  965. memcpy(state->tx_tuna, ((state->type_flags & DST_TYPE_HAS_NEWTUNE) ? ini_cabci_tuna : ini_cabfta_tuna), sizeof(ini_cabfta_tuna));
  966. }
  967. return 0;
  968. }
  969. static int dst_read_status(struct dvb_frontend* fe, fe_status_t* status)
  970. {
  971. struct dst_state* state = fe->demodulator_priv;
  972. *status = 0;
  973. if (state->diseq_flags & HAS_LOCK) {
  974. dst_get_signal(state);
  975. if (state->decode_lock)
  976. *status |= FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_SYNC | FE_HAS_VITERBI;
  977. }
  978. return 0;
  979. }
  980. static int dst_read_signal_strength(struct dvb_frontend* fe, u16* strength)
  981. {
  982. struct dst_state* state = fe->demodulator_priv;
  983. dst_get_signal(state);
  984. *strength = state->decode_strength;
  985. return 0;
  986. }
  987. static int dst_read_snr(struct dvb_frontend* fe, u16* snr)
  988. {
  989. struct dst_state* state = fe->demodulator_priv;
  990. dst_get_signal(state);
  991. *snr = state->decode_snr;
  992. return 0;
  993. }
  994. static int dst_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
  995. {
  996. struct dst_state* state = fe->demodulator_priv;
  997. dst_set_freq(state, p->frequency);
  998. if (verbose > 4)
  999. dprintk("Set Frequency = [%d]\n", p->frequency);
  1000. dst_set_inversion(state, p->inversion);
  1001. if (state->dst_type == DST_TYPE_IS_SAT) {
  1002. dst_set_fec(state, p->u.qpsk.fec_inner);
  1003. dst_set_symbolrate(state, p->u.qpsk.symbol_rate);
  1004. if (verbose > 4)
  1005. dprintk("Set Symbolrate = [%d]\n", p->u.qpsk.symbol_rate);
  1006. } else if (state->dst_type == DST_TYPE_IS_TERR) {
  1007. dst_set_bandwidth(state, p->u.ofdm.bandwidth);
  1008. } else if (state->dst_type == DST_TYPE_IS_CABLE) {
  1009. dst_set_fec(state, p->u.qam.fec_inner);
  1010. dst_set_symbolrate(state, p->u.qam.symbol_rate);
  1011. }
  1012. dst_write_tuna(fe);
  1013. return 0;
  1014. }
  1015. static int dst_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
  1016. {
  1017. struct dst_state* state = fe->demodulator_priv;
  1018. p->frequency = state->decode_freq;
  1019. p->inversion = state->inversion;
  1020. if (state->dst_type == DST_TYPE_IS_SAT) {
  1021. p->u.qpsk.symbol_rate = state->symbol_rate;
  1022. p->u.qpsk.fec_inner = dst_get_fec(state);
  1023. } else if (state->dst_type == DST_TYPE_IS_TERR) {
  1024. p->u.ofdm.bandwidth = state->bandwidth;
  1025. } else if (state->dst_type == DST_TYPE_IS_CABLE) {
  1026. p->u.qam.symbol_rate = state->symbol_rate;
  1027. p->u.qam.fec_inner = dst_get_fec(state);
  1028. p->u.qam.modulation = QAM_AUTO;
  1029. }
  1030. return 0;
  1031. }
  1032. static void dst_release(struct dvb_frontend* fe)
  1033. {
  1034. struct dst_state* state = fe->demodulator_priv;
  1035. kfree(state);
  1036. }
  1037. static struct dvb_frontend_ops dst_dvbt_ops;
  1038. static struct dvb_frontend_ops dst_dvbs_ops;
  1039. static struct dvb_frontend_ops dst_dvbc_ops;
  1040. struct dst_state* dst_attach(struct dst_state *state, struct dvb_adapter *dvb_adapter)
  1041. {
  1042. /* check if the ASIC is there */
  1043. if (dst_probe(state) < 0) {
  1044. if (state)
  1045. kfree(state);
  1046. return NULL;
  1047. }
  1048. /* determine settings based on type */
  1049. switch (state->dst_type) {
  1050. case DST_TYPE_IS_TERR:
  1051. memcpy(&state->ops, &dst_dvbt_ops, sizeof(struct dvb_frontend_ops));
  1052. break;
  1053. case DST_TYPE_IS_CABLE:
  1054. memcpy(&state->ops, &dst_dvbc_ops, sizeof(struct dvb_frontend_ops));
  1055. break;
  1056. case DST_TYPE_IS_SAT:
  1057. memcpy(&state->ops, &dst_dvbs_ops, sizeof(struct dvb_frontend_ops));
  1058. break;
  1059. default:
  1060. printk("%s: unknown DST type. please report to the LinuxTV.org DVB mailinglist.\n", __FUNCTION__);
  1061. if (state)
  1062. kfree(state);
  1063. return NULL;
  1064. }
  1065. /* create dvb_frontend */
  1066. state->frontend.ops = &state->ops;
  1067. state->frontend.demodulator_priv = state;
  1068. return state; /* Manu (DST is a card not a frontend) */
  1069. }
  1070. EXPORT_SYMBOL(dst_attach);
  1071. static struct dvb_frontend_ops dst_dvbt_ops = {
  1072. .info = {
  1073. .name = "DST DVB-T",
  1074. .type = FE_OFDM,
  1075. .frequency_min = 137000000,
  1076. .frequency_max = 858000000,
  1077. .frequency_stepsize = 166667,
  1078. .caps = FE_CAN_FEC_AUTO | FE_CAN_QAM_AUTO | FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO
  1079. },
  1080. .release = dst_release,
  1081. .init = dst_init,
  1082. .set_frontend = dst_set_frontend,
  1083. .get_frontend = dst_get_frontend,
  1084. .read_status = dst_read_status,
  1085. .read_signal_strength = dst_read_signal_strength,
  1086. .read_snr = dst_read_snr,
  1087. };
  1088. static struct dvb_frontend_ops dst_dvbs_ops = {
  1089. .info = {
  1090. .name = "DST DVB-S",
  1091. .type = FE_QPSK,
  1092. .frequency_min = 950000,
  1093. .frequency_max = 2150000,
  1094. .frequency_stepsize = 1000, /* kHz for QPSK frontends */
  1095. .frequency_tolerance = 29500,
  1096. .symbol_rate_min = 1000000,
  1097. .symbol_rate_max = 45000000,
  1098. /* . symbol_rate_tolerance = ???,*/
  1099. .caps = FE_CAN_FEC_AUTO | FE_CAN_QPSK
  1100. },
  1101. .release = dst_release,
  1102. .init = dst_init,
  1103. .set_frontend = dst_set_frontend,
  1104. .get_frontend = dst_get_frontend,
  1105. .read_status = dst_read_status,
  1106. .read_signal_strength = dst_read_signal_strength,
  1107. .read_snr = dst_read_snr,
  1108. .diseqc_send_burst = dst_send_burst,
  1109. .diseqc_send_master_cmd = dst_set_diseqc,
  1110. .set_voltage = dst_set_voltage,
  1111. .set_tone = dst_set_tone,
  1112. };
  1113. static struct dvb_frontend_ops dst_dvbc_ops = {
  1114. .info = {
  1115. .name = "DST DVB-C",
  1116. .type = FE_QAM,
  1117. .frequency_stepsize = 62500,
  1118. .frequency_min = 51000000,
  1119. .frequency_max = 858000000,
  1120. .symbol_rate_min = 1000000,
  1121. .symbol_rate_max = 45000000,
  1122. /* . symbol_rate_tolerance = ???,*/
  1123. .caps = FE_CAN_FEC_AUTO | FE_CAN_QAM_AUTO
  1124. },
  1125. .release = dst_release,
  1126. .init = dst_init,
  1127. .set_frontend = dst_set_frontend,
  1128. .get_frontend = dst_get_frontend,
  1129. .read_status = dst_read_status,
  1130. .read_signal_strength = dst_read_signal_strength,
  1131. .read_snr = dst_read_snr,
  1132. };
  1133. MODULE_DESCRIPTION("DST DVB-S/T/C Combo Frontend driver");
  1134. MODULE_AUTHOR("Jamie Honan, Manu Abraham");
  1135. MODULE_LICENSE("GPL");