stv0297.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798
  1. /*
  2. Driver for STV0297 demodulator
  3. Copyright (C) 2004 Andrew de Quincey <adq_dvb@lidskialf.net>
  4. Copyright (C) 2003-2004 Dennis Noermann <dennis.noermann@noernet.de>
  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/init.h>
  18. #include <linux/kernel.h>
  19. #include <linux/module.h>
  20. #include <linux/string.h>
  21. #include <linux/delay.h>
  22. #include "dvb_frontend.h"
  23. #include "stv0297.h"
  24. struct stv0297_state {
  25. struct i2c_adapter *i2c;
  26. struct dvb_frontend_ops ops;
  27. const struct stv0297_config *config;
  28. struct dvb_frontend frontend;
  29. unsigned long base_freq;
  30. u8 pwm;
  31. };
  32. #if 1
  33. #define dprintk(x...) printk(x)
  34. #else
  35. #define dprintk(x...)
  36. #endif
  37. #define STV0297_CLOCK_KHZ 28900
  38. static u8 init_tab[] = {
  39. 0x00, 0x09,
  40. 0x01, 0x69,
  41. 0x03, 0x00,
  42. 0x04, 0x00,
  43. 0x07, 0x00,
  44. 0x08, 0x00,
  45. 0x20, 0x00,
  46. 0x21, 0x40,
  47. 0x22, 0x00,
  48. 0x23, 0x00,
  49. 0x24, 0x40,
  50. 0x25, 0x88,
  51. 0x30, 0xff,
  52. 0x31, 0x00,
  53. 0x32, 0xff,
  54. 0x33, 0x00,
  55. 0x34, 0x50,
  56. 0x35, 0x7f,
  57. 0x36, 0x00,
  58. 0x37, 0x20,
  59. 0x38, 0x00,
  60. 0x40, 0x1c,
  61. 0x41, 0xff,
  62. 0x42, 0x29,
  63. 0x43, 0x00,
  64. 0x44, 0xff,
  65. 0x45, 0x00,
  66. 0x46, 0x00,
  67. 0x49, 0x04,
  68. 0x4a, 0xff,
  69. 0x4b, 0x7f,
  70. 0x52, 0x30,
  71. 0x55, 0xae,
  72. 0x56, 0x47,
  73. 0x57, 0xe1,
  74. 0x58, 0x3a,
  75. 0x5a, 0x1e,
  76. 0x5b, 0x34,
  77. 0x60, 0x00,
  78. 0x63, 0x00,
  79. 0x64, 0x00,
  80. 0x65, 0x00,
  81. 0x66, 0x00,
  82. 0x67, 0x00,
  83. 0x68, 0x00,
  84. 0x69, 0x00,
  85. 0x6a, 0x02,
  86. 0x6b, 0x00,
  87. 0x70, 0xff,
  88. 0x71, 0x00,
  89. 0x72, 0x00,
  90. 0x73, 0x00,
  91. 0x74, 0x0c,
  92. 0x80, 0x00,
  93. 0x81, 0x00,
  94. 0x82, 0x00,
  95. 0x83, 0x00,
  96. 0x84, 0x04,
  97. 0x85, 0x80,
  98. 0x86, 0x24,
  99. 0x87, 0x78,
  100. 0x88, 0x00,
  101. 0x89, 0x00,
  102. 0x90, 0x01,
  103. 0x91, 0x01,
  104. 0xa0, 0x00,
  105. 0xa1, 0x00,
  106. 0xa2, 0x00,
  107. 0xb0, 0x91,
  108. 0xb1, 0x0b,
  109. 0xc0, 0x53,
  110. 0xc1, 0x70,
  111. 0xc2, 0x12,
  112. 0xd0, 0x00,
  113. 0xd1, 0x00,
  114. 0xd2, 0x00,
  115. 0xd3, 0x00,
  116. 0xd4, 0x00,
  117. 0xd5, 0x00,
  118. 0xde, 0x00,
  119. 0xdf, 0x00,
  120. 0x61, 0x49,
  121. 0x62, 0x0b,
  122. 0x53, 0x08,
  123. 0x59, 0x08,
  124. };
  125. static int stv0297_writereg(struct stv0297_state *state, u8 reg, u8 data)
  126. {
  127. int ret;
  128. u8 buf[] = { reg, data };
  129. struct i2c_msg msg = {.addr = state->config->demod_address,.flags = 0,.buf = buf,.len = 2 };
  130. ret = i2c_transfer(state->i2c, &msg, 1);
  131. if (ret != 1)
  132. dprintk("%s: writereg error (reg == 0x%02x, val == 0x%02x, "
  133. "ret == %i)\n", __FUNCTION__, reg, data, ret);
  134. return (ret != 1) ? -1 : 0;
  135. }
  136. static int stv0297_readreg(struct stv0297_state *state, u8 reg)
  137. {
  138. int ret;
  139. u8 b0[] = { reg };
  140. u8 b1[] = { 0 };
  141. struct i2c_msg msg[] = { {.addr = state->config->demod_address,.flags = 0,.buf = b0,.len =
  142. 1},
  143. {.addr = state->config->demod_address,.flags = I2C_M_RD,.buf = b1,.len = 1}
  144. };
  145. // this device needs a STOP between the register and data
  146. if ((ret = i2c_transfer(state->i2c, &msg[0], 1)) != 1) {
  147. dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg, ret);
  148. return -1;
  149. }
  150. if ((ret = i2c_transfer(state->i2c, &msg[1], 1)) != 1) {
  151. dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg, ret);
  152. return -1;
  153. }
  154. return b1[0];
  155. }
  156. static int stv0297_writereg_mask(struct stv0297_state *state, u8 reg, u8 mask, u8 data)
  157. {
  158. int val;
  159. val = stv0297_readreg(state, reg);
  160. val &= ~mask;
  161. val |= (data & mask);
  162. stv0297_writereg(state, reg, val);
  163. return 0;
  164. }
  165. static int stv0297_readregs(struct stv0297_state *state, u8 reg1, u8 * b, u8 len)
  166. {
  167. int ret;
  168. struct i2c_msg msg[] = { {.addr = state->config->demod_address,.flags = 0,.buf =
  169. &reg1,.len = 1},
  170. {.addr = state->config->demod_address,.flags = I2C_M_RD,.buf = b,.len = len}
  171. };
  172. // this device needs a STOP between the register and data
  173. if ((ret = i2c_transfer(state->i2c, &msg[0], 1)) != 1) {
  174. dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg1, ret);
  175. return -1;
  176. }
  177. if ((ret = i2c_transfer(state->i2c, &msg[1], 1)) != 1) {
  178. dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg1, ret);
  179. return -1;
  180. }
  181. return 0;
  182. }
  183. static u32 stv0297_get_symbolrate(struct stv0297_state *state)
  184. {
  185. u64 tmp;
  186. tmp = stv0297_readreg(state, 0x55);
  187. tmp |= stv0297_readreg(state, 0x56) << 8;
  188. tmp |= stv0297_readreg(state, 0x57) << 16;
  189. tmp |= stv0297_readreg(state, 0x58) << 24;
  190. tmp *= STV0297_CLOCK_KHZ;
  191. tmp >>= 32;
  192. return (u32) tmp;
  193. }
  194. static void stv0297_set_symbolrate(struct stv0297_state *state, u32 srate)
  195. {
  196. long tmp;
  197. tmp = 131072L * srate; /* 131072 = 2^17 */
  198. tmp = tmp / (STV0297_CLOCK_KHZ / 4); /* 1/4 = 2^-2 */
  199. tmp = tmp * 8192L; /* 8192 = 2^13 */
  200. stv0297_writereg(state, 0x55, (unsigned char) (tmp & 0xFF));
  201. stv0297_writereg(state, 0x56, (unsigned char) (tmp >> 8));
  202. stv0297_writereg(state, 0x57, (unsigned char) (tmp >> 16));
  203. stv0297_writereg(state, 0x58, (unsigned char) (tmp >> 24));
  204. }
  205. static void stv0297_set_sweeprate(struct stv0297_state *state, short fshift, long symrate)
  206. {
  207. long tmp;
  208. tmp = (long) fshift *262144L; /* 262144 = 2*18 */
  209. tmp /= symrate;
  210. tmp *= 1024; /* 1024 = 2*10 */
  211. // adjust
  212. if (tmp >= 0) {
  213. tmp += 500000;
  214. } else {
  215. tmp -= 500000;
  216. }
  217. tmp /= 1000000;
  218. stv0297_writereg(state, 0x60, tmp & 0xFF);
  219. stv0297_writereg_mask(state, 0x69, 0xF0, (tmp >> 4) & 0xf0);
  220. }
  221. static void stv0297_set_carrieroffset(struct stv0297_state *state, long offset)
  222. {
  223. long tmp;
  224. /* symrate is hardcoded to 10000 */
  225. tmp = offset * 26844L; /* (2**28)/10000 */
  226. if (tmp < 0)
  227. tmp += 0x10000000;
  228. tmp &= 0x0FFFFFFF;
  229. stv0297_writereg(state, 0x66, (unsigned char) (tmp & 0xFF));
  230. stv0297_writereg(state, 0x67, (unsigned char) (tmp >> 8));
  231. stv0297_writereg(state, 0x68, (unsigned char) (tmp >> 16));
  232. stv0297_writereg_mask(state, 0x69, 0x0F, (tmp >> 24) & 0x0f);
  233. }
  234. /*
  235. static long stv0297_get_carrieroffset(struct stv0297_state *state)
  236. {
  237. s64 tmp;
  238. stv0297_writereg(state, 0x6B, 0x00);
  239. tmp = stv0297_readreg(state, 0x66);
  240. tmp |= (stv0297_readreg(state, 0x67) << 8);
  241. tmp |= (stv0297_readreg(state, 0x68) << 16);
  242. tmp |= (stv0297_readreg(state, 0x69) & 0x0F) << 24;
  243. tmp *= stv0297_get_symbolrate(state);
  244. tmp >>= 28;
  245. return (s32) tmp;
  246. }
  247. */
  248. static void stv0297_set_initialdemodfreq(struct stv0297_state *state, long freq)
  249. {
  250. s32 tmp;
  251. if (freq > 10000)
  252. freq -= STV0297_CLOCK_KHZ;
  253. tmp = (STV0297_CLOCK_KHZ * 1000) / (1 << 16);
  254. tmp = (freq * 1000) / tmp;
  255. if (tmp > 0xffff)
  256. tmp = 0xffff;
  257. stv0297_writereg_mask(state, 0x25, 0x80, 0x80);
  258. stv0297_writereg(state, 0x21, tmp >> 8);
  259. stv0297_writereg(state, 0x20, tmp);
  260. }
  261. static int stv0297_set_qam(struct stv0297_state *state, fe_modulation_t modulation)
  262. {
  263. int val = 0;
  264. switch (modulation) {
  265. case QAM_16:
  266. val = 0;
  267. break;
  268. case QAM_32:
  269. val = 1;
  270. break;
  271. case QAM_64:
  272. val = 4;
  273. break;
  274. case QAM_128:
  275. val = 2;
  276. break;
  277. case QAM_256:
  278. val = 3;
  279. break;
  280. default:
  281. return -EINVAL;
  282. }
  283. stv0297_writereg_mask(state, 0x00, 0x70, val << 4);
  284. return 0;
  285. }
  286. static int stv0297_set_inversion(struct stv0297_state *state, fe_spectral_inversion_t inversion)
  287. {
  288. int val = 0;
  289. switch (inversion) {
  290. case INVERSION_OFF:
  291. val = 0;
  292. break;
  293. case INVERSION_ON:
  294. val = 1;
  295. break;
  296. default:
  297. return -EINVAL;
  298. }
  299. stv0297_writereg_mask(state, 0x83, 0x08, val << 3);
  300. return 0;
  301. }
  302. int stv0297_enable_plli2c(struct dvb_frontend *fe)
  303. {
  304. struct stv0297_state *state = fe->demodulator_priv;
  305. stv0297_writereg(state, 0x87, 0x78);
  306. stv0297_writereg(state, 0x86, 0xc8);
  307. return 0;
  308. }
  309. static int stv0297_init(struct dvb_frontend *fe)
  310. {
  311. struct stv0297_state *state = fe->demodulator_priv;
  312. int i;
  313. /* soft reset */
  314. stv0297_writereg_mask(state, 0x80, 1, 1);
  315. stv0297_writereg_mask(state, 0x80, 1, 0);
  316. /* reset deinterleaver */
  317. stv0297_writereg_mask(state, 0x81, 1, 1);
  318. stv0297_writereg_mask(state, 0x81, 1, 0);
  319. /* load init table */
  320. for (i = 0; i < sizeof(init_tab); i += 2) {
  321. stv0297_writereg(state, init_tab[i], init_tab[i + 1]);
  322. }
  323. /* set a dummy symbol rate */
  324. stv0297_set_symbolrate(state, 6900);
  325. /* invert AGC1 polarity */
  326. stv0297_writereg_mask(state, 0x88, 0x10, 0x10);
  327. /* setup bit error counting */
  328. stv0297_writereg_mask(state, 0xA0, 0x80, 0x00);
  329. stv0297_writereg_mask(state, 0xA0, 0x10, 0x00);
  330. stv0297_writereg_mask(state, 0xA0, 0x08, 0x00);
  331. stv0297_writereg_mask(state, 0xA0, 0x07, 0x04);
  332. /* min + max PWM */
  333. stv0297_writereg(state, 0x4a, 0x00);
  334. stv0297_writereg(state, 0x4b, state->pwm);
  335. msleep(200);
  336. if (state->config->pll_init)
  337. state->config->pll_init(fe);
  338. return 0;
  339. }
  340. static int stv0297_sleep(struct dvb_frontend *fe)
  341. {
  342. struct stv0297_state *state = fe->demodulator_priv;
  343. stv0297_writereg_mask(state, 0x80, 1, 1);
  344. return 0;
  345. }
  346. static int stv0297_read_status(struct dvb_frontend *fe, fe_status_t * status)
  347. {
  348. struct stv0297_state *state = fe->demodulator_priv;
  349. u8 sync = stv0297_readreg(state, 0xDF);
  350. *status = 0;
  351. if (sync & 0x80)
  352. *status |=
  353. FE_HAS_SYNC | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_LOCK;
  354. return 0;
  355. }
  356. static int stv0297_read_ber(struct dvb_frontend *fe, u32 * ber)
  357. {
  358. struct stv0297_state *state = fe->demodulator_priv;
  359. u8 BER[3];
  360. stv0297_writereg(state, 0xA0, 0x80); // Start Counting bit errors for 4096 Bytes
  361. mdelay(25); // Hopefully got 4096 Bytes
  362. stv0297_readregs(state, 0xA0, BER, 3);
  363. mdelay(25);
  364. *ber = (BER[2] << 8 | BER[1]) / (8 * 4096);
  365. return 0;
  366. }
  367. static int stv0297_read_signal_strength(struct dvb_frontend *fe, u16 * strength)
  368. {
  369. struct stv0297_state *state = fe->demodulator_priv;
  370. u8 STRENGTH[2];
  371. stv0297_readregs(state, 0x41, STRENGTH, 2);
  372. *strength = (STRENGTH[1] & 0x03) << 8 | STRENGTH[0];
  373. return 0;
  374. }
  375. static int stv0297_read_snr(struct dvb_frontend *fe, u16 * snr)
  376. {
  377. struct stv0297_state *state = fe->demodulator_priv;
  378. u8 SNR[2];
  379. stv0297_readregs(state, 0x07, SNR, 2);
  380. *snr = SNR[1] << 8 | SNR[0];
  381. return 0;
  382. }
  383. static int stv0297_read_ucblocks(struct dvb_frontend *fe, u32 * ucblocks)
  384. {
  385. struct stv0297_state *state = fe->demodulator_priv;
  386. *ucblocks = (stv0297_readreg(state, 0xD5) << 8)
  387. | stv0297_readreg(state, 0xD4);
  388. return 0;
  389. }
  390. static int stv0297_set_frontend(struct dvb_frontend *fe, struct dvb_frontend_parameters *p)
  391. {
  392. struct stv0297_state *state = fe->demodulator_priv;
  393. int u_threshold;
  394. int initial_u;
  395. int blind_u;
  396. int delay;
  397. int sweeprate;
  398. int carrieroffset;
  399. unsigned long starttime;
  400. unsigned long timeout;
  401. fe_spectral_inversion_t inversion;
  402. switch (p->u.qam.modulation) {
  403. case QAM_16:
  404. case QAM_32:
  405. case QAM_64:
  406. delay = 100;
  407. sweeprate = 1500;
  408. break;
  409. case QAM_128:
  410. delay = 150;
  411. sweeprate = 1000;
  412. break;
  413. case QAM_256:
  414. delay = 200;
  415. sweeprate = 500;
  416. break;
  417. default:
  418. return -EINVAL;
  419. }
  420. // determine inversion dependant parameters
  421. inversion = p->inversion;
  422. if (state->config->invert)
  423. inversion = (inversion == INVERSION_ON) ? INVERSION_OFF : INVERSION_ON;
  424. carrieroffset = -330;
  425. switch (inversion) {
  426. case INVERSION_OFF:
  427. break;
  428. case INVERSION_ON:
  429. sweeprate = -sweeprate;
  430. carrieroffset = -carrieroffset;
  431. break;
  432. default:
  433. return -EINVAL;
  434. }
  435. stv0297_init(fe);
  436. state->config->pll_set(fe, p);
  437. /* clear software interrupts */
  438. stv0297_writereg(state, 0x82, 0x0);
  439. /* set initial demodulation frequency */
  440. stv0297_set_initialdemodfreq(state, 7250);
  441. /* setup AGC */
  442. stv0297_writereg_mask(state, 0x43, 0x10, 0x00);
  443. stv0297_writereg(state, 0x41, 0x00);
  444. stv0297_writereg_mask(state, 0x42, 0x03, 0x01);
  445. stv0297_writereg_mask(state, 0x36, 0x60, 0x00);
  446. stv0297_writereg_mask(state, 0x36, 0x18, 0x00);
  447. stv0297_writereg_mask(state, 0x71, 0x80, 0x80);
  448. stv0297_writereg(state, 0x72, 0x00);
  449. stv0297_writereg(state, 0x73, 0x00);
  450. stv0297_writereg_mask(state, 0x74, 0x0F, 0x00);
  451. stv0297_writereg_mask(state, 0x43, 0x08, 0x00);
  452. stv0297_writereg_mask(state, 0x71, 0x80, 0x00);
  453. /* setup STL */
  454. stv0297_writereg_mask(state, 0x5a, 0x20, 0x20);
  455. stv0297_writereg_mask(state, 0x5b, 0x02, 0x02);
  456. stv0297_writereg_mask(state, 0x5b, 0x02, 0x00);
  457. stv0297_writereg_mask(state, 0x5b, 0x01, 0x00);
  458. stv0297_writereg_mask(state, 0x5a, 0x40, 0x40);
  459. /* disable frequency sweep */
  460. stv0297_writereg_mask(state, 0x6a, 0x01, 0x00);
  461. /* reset deinterleaver */
  462. stv0297_writereg_mask(state, 0x81, 0x01, 0x01);
  463. stv0297_writereg_mask(state, 0x81, 0x01, 0x00);
  464. /* ??? */
  465. stv0297_writereg_mask(state, 0x83, 0x20, 0x20);
  466. stv0297_writereg_mask(state, 0x83, 0x20, 0x00);
  467. /* reset equaliser */
  468. u_threshold = stv0297_readreg(state, 0x00) & 0xf;
  469. initial_u = stv0297_readreg(state, 0x01) >> 4;
  470. blind_u = stv0297_readreg(state, 0x01) & 0xf;
  471. stv0297_writereg_mask(state, 0x84, 0x01, 0x01);
  472. stv0297_writereg_mask(state, 0x84, 0x01, 0x00);
  473. stv0297_writereg_mask(state, 0x00, 0x0f, u_threshold);
  474. stv0297_writereg_mask(state, 0x01, 0xf0, initial_u << 4);
  475. stv0297_writereg_mask(state, 0x01, 0x0f, blind_u);
  476. /* data comes from internal A/D */
  477. stv0297_writereg_mask(state, 0x87, 0x80, 0x00);
  478. /* clear phase registers */
  479. stv0297_writereg(state, 0x63, 0x00);
  480. stv0297_writereg(state, 0x64, 0x00);
  481. stv0297_writereg(state, 0x65, 0x00);
  482. stv0297_writereg(state, 0x66, 0x00);
  483. stv0297_writereg(state, 0x67, 0x00);
  484. stv0297_writereg(state, 0x68, 0x00);
  485. stv0297_writereg_mask(state, 0x69, 0x0f, 0x00);
  486. /* set parameters */
  487. stv0297_set_qam(state, p->u.qam.modulation);
  488. stv0297_set_symbolrate(state, p->u.qam.symbol_rate / 1000);
  489. stv0297_set_sweeprate(state, sweeprate, p->u.qam.symbol_rate / 1000);
  490. stv0297_set_carrieroffset(state, carrieroffset);
  491. stv0297_set_inversion(state, inversion);
  492. /* kick off lock */
  493. stv0297_writereg_mask(state, 0x88, 0x08, 0x08);
  494. stv0297_writereg_mask(state, 0x5a, 0x20, 0x00);
  495. stv0297_writereg_mask(state, 0x6a, 0x01, 0x01);
  496. stv0297_writereg_mask(state, 0x43, 0x40, 0x40);
  497. stv0297_writereg_mask(state, 0x5b, 0x30, 0x00);
  498. stv0297_writereg_mask(state, 0x03, 0x0c, 0x0c);
  499. stv0297_writereg_mask(state, 0x03, 0x03, 0x03);
  500. stv0297_writereg_mask(state, 0x43, 0x10, 0x10);
  501. /* wait for WGAGC lock */
  502. starttime = jiffies;
  503. timeout = jiffies + (200 * HZ) / 1000;
  504. while (time_before(jiffies, timeout)) {
  505. msleep(10);
  506. if (stv0297_readreg(state, 0x43) & 0x08)
  507. break;
  508. }
  509. if (time_after(jiffies, timeout)) {
  510. goto timeout;
  511. }
  512. msleep(20);
  513. /* wait for equaliser partial convergence */
  514. timeout = jiffies + (50 * HZ) / 1000;
  515. while (time_before(jiffies, timeout)) {
  516. msleep(10);
  517. if (stv0297_readreg(state, 0x82) & 0x04) {
  518. break;
  519. }
  520. }
  521. if (time_after(jiffies, timeout)) {
  522. goto timeout;
  523. }
  524. /* wait for equaliser full convergence */
  525. timeout = jiffies + (delay * HZ) / 1000;
  526. while (time_before(jiffies, timeout)) {
  527. msleep(10);
  528. if (stv0297_readreg(state, 0x82) & 0x08) {
  529. break;
  530. }
  531. }
  532. if (time_after(jiffies, timeout)) {
  533. goto timeout;
  534. }
  535. /* disable sweep */
  536. stv0297_writereg_mask(state, 0x6a, 1, 0);
  537. stv0297_writereg_mask(state, 0x88, 8, 0);
  538. /* wait for main lock */
  539. timeout = jiffies + (20 * HZ) / 1000;
  540. while (time_before(jiffies, timeout)) {
  541. msleep(10);
  542. if (stv0297_readreg(state, 0xDF) & 0x80) {
  543. break;
  544. }
  545. }
  546. if (time_after(jiffies, timeout)) {
  547. goto timeout;
  548. }
  549. msleep(100);
  550. /* is it still locked after that delay? */
  551. if (!(stv0297_readreg(state, 0xDF) & 0x80)) {
  552. goto timeout;
  553. }
  554. /* success!! */
  555. stv0297_writereg_mask(state, 0x5a, 0x40, 0x00);
  556. state->base_freq = p->frequency;
  557. return 0;
  558. timeout:
  559. stv0297_writereg_mask(state, 0x6a, 0x01, 0x00);
  560. return 0;
  561. }
  562. static int stv0297_get_frontend(struct dvb_frontend *fe, struct dvb_frontend_parameters *p)
  563. {
  564. struct stv0297_state *state = fe->demodulator_priv;
  565. int reg_00, reg_83;
  566. reg_00 = stv0297_readreg(state, 0x00);
  567. reg_83 = stv0297_readreg(state, 0x83);
  568. p->frequency = state->base_freq;
  569. p->inversion = (reg_83 & 0x08) ? INVERSION_ON : INVERSION_OFF;
  570. if (state->config->invert)
  571. p->inversion = (p->inversion == INVERSION_ON) ? INVERSION_OFF : INVERSION_ON;
  572. p->u.qam.symbol_rate = stv0297_get_symbolrate(state) * 1000;
  573. p->u.qam.fec_inner = FEC_NONE;
  574. switch ((reg_00 >> 4) & 0x7) {
  575. case 0:
  576. p->u.qam.modulation = QAM_16;
  577. break;
  578. case 1:
  579. p->u.qam.modulation = QAM_32;
  580. break;
  581. case 2:
  582. p->u.qam.modulation = QAM_128;
  583. break;
  584. case 3:
  585. p->u.qam.modulation = QAM_256;
  586. break;
  587. case 4:
  588. p->u.qam.modulation = QAM_64;
  589. break;
  590. }
  591. return 0;
  592. }
  593. static void stv0297_release(struct dvb_frontend *fe)
  594. {
  595. struct stv0297_state *state = fe->demodulator_priv;
  596. kfree(state);
  597. }
  598. static struct dvb_frontend_ops stv0297_ops;
  599. struct dvb_frontend *stv0297_attach(const struct stv0297_config *config,
  600. struct i2c_adapter *i2c, int pwm)
  601. {
  602. struct stv0297_state *state = NULL;
  603. /* allocate memory for the internal state */
  604. state = kmalloc(sizeof(struct stv0297_state), GFP_KERNEL);
  605. if (state == NULL)
  606. goto error;
  607. /* setup the state */
  608. state->config = config;
  609. state->i2c = i2c;
  610. memcpy(&state->ops, &stv0297_ops, sizeof(struct dvb_frontend_ops));
  611. state->base_freq = 0;
  612. state->pwm = pwm;
  613. /* check if the demod is there */
  614. if ((stv0297_readreg(state, 0x80) & 0x70) != 0x20)
  615. goto error;
  616. /* create dvb_frontend */
  617. state->frontend.ops = &state->ops;
  618. state->frontend.demodulator_priv = state;
  619. return &state->frontend;
  620. error:
  621. kfree(state);
  622. return NULL;
  623. }
  624. static struct dvb_frontend_ops stv0297_ops = {
  625. .info = {
  626. .name = "ST STV0297 DVB-C",
  627. .type = FE_QAM,
  628. .frequency_min = 64000000,
  629. .frequency_max = 1300000000,
  630. .frequency_stepsize = 62500,
  631. .symbol_rate_min = 870000,
  632. .symbol_rate_max = 11700000,
  633. .caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
  634. FE_CAN_QAM_128 | FE_CAN_QAM_256 | FE_CAN_FEC_AUTO},
  635. .release = stv0297_release,
  636. .init = stv0297_init,
  637. .sleep = stv0297_sleep,
  638. .set_frontend = stv0297_set_frontend,
  639. .get_frontend = stv0297_get_frontend,
  640. .read_status = stv0297_read_status,
  641. .read_ber = stv0297_read_ber,
  642. .read_signal_strength = stv0297_read_signal_strength,
  643. .read_snr = stv0297_read_snr,
  644. .read_ucblocks = stv0297_read_ucblocks,
  645. };
  646. MODULE_DESCRIPTION("ST STV0297 DVB-C Demodulator driver");
  647. MODULE_AUTHOR("Dennis Noermann and Andrew de Quincey");
  648. MODULE_LICENSE("GPL");
  649. EXPORT_SYMBOL(stv0297_attach);
  650. EXPORT_SYMBOL(stv0297_enable_plli2c);