stv0900_sw.c 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025
  1. /*
  2. * stv0900_sw.c
  3. *
  4. * Driver for ST STV0900 satellite demodulator IC.
  5. *
  6. * Copyright (C) ST Microelectronics.
  7. * Copyright (C) 2009 NetUP Inc.
  8. * Copyright (C) 2009 Igor M. Liplianin <liplianin@netup.ru>
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation; either version 2 of the License, or
  13. * (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. *
  19. * GNU General Public License for more details.
  20. */
  21. #include "stv0900.h"
  22. #include "stv0900_reg.h"
  23. #include "stv0900_priv.h"
  24. s32 shiftx(s32 x, int demod, s32 shift)
  25. {
  26. if (demod == 1)
  27. return x - shift;
  28. return x;
  29. }
  30. int stv0900_check_signal_presence(struct stv0900_internal *intp,
  31. enum fe_stv0900_demod_num demod)
  32. {
  33. s32 carr_offset,
  34. agc2_integr,
  35. max_carrier;
  36. int no_signal = FALSE;
  37. carr_offset = (stv0900_read_reg(intp, CFR2) << 8)
  38. | stv0900_read_reg(intp, CFR1);
  39. carr_offset = ge2comp(carr_offset, 16);
  40. agc2_integr = (stv0900_read_reg(intp, AGC2I1) << 8)
  41. | stv0900_read_reg(intp, AGC2I0);
  42. max_carrier = intp->srch_range[demod] / 1000;
  43. max_carrier += (max_carrier / 10);
  44. max_carrier = 65536 * (max_carrier / 2);
  45. max_carrier /= intp->mclk / 1000;
  46. if (max_carrier > 0x4000)
  47. max_carrier = 0x4000;
  48. if ((agc2_integr > 0x2000)
  49. || (carr_offset > (2 * max_carrier))
  50. || (carr_offset < (-2 * max_carrier)))
  51. no_signal = TRUE;
  52. return no_signal;
  53. }
  54. static void stv0900_get_sw_loop_params(struct stv0900_internal *intp,
  55. s32 *frequency_inc, s32 *sw_timeout,
  56. s32 *steps,
  57. enum fe_stv0900_demod_num demod)
  58. {
  59. s32 timeout, freq_inc, max_steps, srate, max_carrier;
  60. enum fe_stv0900_search_standard standard;
  61. srate = intp->symbol_rate[demod];
  62. max_carrier = intp->srch_range[demod] / 1000;
  63. max_carrier += max_carrier / 10;
  64. standard = intp->srch_standard[demod];
  65. max_carrier = 65536 * (max_carrier / 2);
  66. max_carrier /= intp->mclk / 1000;
  67. if (max_carrier > 0x4000)
  68. max_carrier = 0x4000;
  69. freq_inc = srate;
  70. freq_inc /= intp->mclk >> 10;
  71. freq_inc = freq_inc << 6;
  72. switch (standard) {
  73. case STV0900_SEARCH_DVBS1:
  74. case STV0900_SEARCH_DSS:
  75. freq_inc *= 3;
  76. timeout = 20;
  77. break;
  78. case STV0900_SEARCH_DVBS2:
  79. freq_inc *= 4;
  80. timeout = 25;
  81. break;
  82. case STV0900_AUTO_SEARCH:
  83. default:
  84. freq_inc *= 3;
  85. timeout = 25;
  86. break;
  87. }
  88. freq_inc /= 100;
  89. if ((freq_inc > max_carrier) || (freq_inc < 0))
  90. freq_inc = max_carrier / 2;
  91. timeout *= 27500;
  92. if (srate > 0)
  93. timeout /= srate / 1000;
  94. if ((timeout > 100) || (timeout < 0))
  95. timeout = 100;
  96. max_steps = (max_carrier / freq_inc) + 1;
  97. if ((max_steps > 100) || (max_steps < 0)) {
  98. max_steps = 100;
  99. freq_inc = max_carrier / max_steps;
  100. }
  101. *frequency_inc = freq_inc;
  102. *sw_timeout = timeout;
  103. *steps = max_steps;
  104. }
  105. static int stv0900_search_carr_sw_loop(struct stv0900_internal *intp,
  106. s32 FreqIncr, s32 Timeout, int zigzag,
  107. s32 MaxStep, enum fe_stv0900_demod_num demod)
  108. {
  109. int no_signal,
  110. lock = FALSE;
  111. s32 stepCpt,
  112. freqOffset,
  113. max_carrier;
  114. max_carrier = intp->srch_range[demod] / 1000;
  115. max_carrier += (max_carrier / 10);
  116. max_carrier = 65536 * (max_carrier / 2);
  117. max_carrier /= intp->mclk / 1000;
  118. if (max_carrier > 0x4000)
  119. max_carrier = 0x4000;
  120. if (zigzag == TRUE)
  121. freqOffset = 0;
  122. else
  123. freqOffset = -max_carrier + FreqIncr;
  124. stepCpt = 0;
  125. do {
  126. stv0900_write_reg(intp, DMDISTATE, 0x1c);
  127. stv0900_write_reg(intp, CFRINIT1, (freqOffset / 256) & 0xff);
  128. stv0900_write_reg(intp, CFRINIT0, freqOffset & 0xff);
  129. stv0900_write_reg(intp, DMDISTATE, 0x18);
  130. stv0900_write_bits(intp, ALGOSWRST, 1);
  131. if (intp->chip_id == 0x12) {
  132. stv0900_write_bits(intp, RST_HWARE, 1);
  133. stv0900_write_bits(intp, RST_HWARE, 0);
  134. }
  135. if (zigzag == TRUE) {
  136. if (freqOffset >= 0)
  137. freqOffset = -freqOffset - 2 * FreqIncr;
  138. else
  139. freqOffset = -freqOffset;
  140. } else
  141. freqOffset += + 2 * FreqIncr;
  142. stepCpt++;
  143. lock = stv0900_get_demod_lock(intp, demod, Timeout);
  144. no_signal = stv0900_check_signal_presence(intp, demod);
  145. } while ((lock == FALSE)
  146. && (no_signal == FALSE)
  147. && ((freqOffset - FreqIncr) < max_carrier)
  148. && ((freqOffset + FreqIncr) > -max_carrier)
  149. && (stepCpt < MaxStep));
  150. stv0900_write_bits(intp, ALGOSWRST, 0);
  151. return lock;
  152. }
  153. static int stv0900_sw_algo(struct stv0900_internal *intp,
  154. enum fe_stv0900_demod_num demod)
  155. {
  156. int lock = FALSE,
  157. no_signal,
  158. zigzag;
  159. s32 s2fw,
  160. fqc_inc,
  161. sft_stp_tout,
  162. trial_cntr,
  163. max_steps;
  164. stv0900_get_sw_loop_params(intp, &fqc_inc, &sft_stp_tout,
  165. &max_steps, demod);
  166. switch (intp->srch_standard[demod]) {
  167. case STV0900_SEARCH_DVBS1:
  168. case STV0900_SEARCH_DSS:
  169. if (intp->chip_id >= 0x20)
  170. stv0900_write_reg(intp, CARFREQ, 0x3b);
  171. else
  172. stv0900_write_reg(intp, CARFREQ, 0xef);
  173. stv0900_write_reg(intp, DMDCFGMD, 0x49);
  174. zigzag = FALSE;
  175. break;
  176. case STV0900_SEARCH_DVBS2:
  177. if (intp->chip_id >= 0x20)
  178. stv0900_write_reg(intp, CORRELABS, 0x79);
  179. else
  180. stv0900_write_reg(intp, CORRELABS, 0x68);
  181. stv0900_write_reg(intp, DMDCFGMD, 0x89);
  182. zigzag = TRUE;
  183. break;
  184. case STV0900_AUTO_SEARCH:
  185. default:
  186. if (intp->chip_id >= 0x20) {
  187. stv0900_write_reg(intp, CARFREQ, 0x3b);
  188. stv0900_write_reg(intp, CORRELABS, 0x79);
  189. } else {
  190. stv0900_write_reg(intp, CARFREQ, 0xef);
  191. stv0900_write_reg(intp, CORRELABS, 0x68);
  192. }
  193. stv0900_write_reg(intp, DMDCFGMD, 0xc9);
  194. zigzag = FALSE;
  195. break;
  196. }
  197. trial_cntr = 0;
  198. do {
  199. lock = stv0900_search_carr_sw_loop(intp,
  200. fqc_inc,
  201. sft_stp_tout,
  202. zigzag,
  203. max_steps,
  204. demod);
  205. no_signal = stv0900_check_signal_presence(intp, demod);
  206. trial_cntr++;
  207. if ((lock == TRUE)
  208. || (no_signal == TRUE)
  209. || (trial_cntr == 2)) {
  210. if (intp->chip_id >= 0x20) {
  211. stv0900_write_reg(intp, CARFREQ, 0x49);
  212. stv0900_write_reg(intp, CORRELABS, 0x9e);
  213. } else {
  214. stv0900_write_reg(intp, CARFREQ, 0xed);
  215. stv0900_write_reg(intp, CORRELABS, 0x88);
  216. }
  217. if ((stv0900_get_bits(intp, HEADER_MODE) ==
  218. STV0900_DVBS2_FOUND) &&
  219. (lock == TRUE)) {
  220. msleep(sft_stp_tout);
  221. s2fw = stv0900_get_bits(intp, FLYWHEEL_CPT);
  222. if (s2fw < 0xd) {
  223. msleep(sft_stp_tout);
  224. s2fw = stv0900_get_bits(intp,
  225. FLYWHEEL_CPT);
  226. }
  227. if (s2fw < 0xd) {
  228. lock = FALSE;
  229. if (trial_cntr < 2) {
  230. if (intp->chip_id >= 0x20)
  231. stv0900_write_reg(intp,
  232. CORRELABS,
  233. 0x79);
  234. else
  235. stv0900_write_reg(intp,
  236. CORRELABS,
  237. 0x68);
  238. stv0900_write_reg(intp,
  239. DMDCFGMD,
  240. 0x89);
  241. }
  242. }
  243. }
  244. }
  245. } while ((lock == FALSE)
  246. && (trial_cntr < 2)
  247. && (no_signal == FALSE));
  248. return lock;
  249. }
  250. static u32 stv0900_get_symbol_rate(struct stv0900_internal *intp,
  251. u32 mclk,
  252. enum fe_stv0900_demod_num demod)
  253. {
  254. s32 rem1, rem2, intval1, intval2, srate;
  255. srate = (stv0900_get_bits(intp, SYMB_FREQ3) << 24) +
  256. (stv0900_get_bits(intp, SYMB_FREQ2) << 16) +
  257. (stv0900_get_bits(intp, SYMB_FREQ1) << 8) +
  258. (stv0900_get_bits(intp, SYMB_FREQ0));
  259. dprintk("lock: srate=%d r0=0x%x r1=0x%x r2=0x%x r3=0x%x \n",
  260. srate, stv0900_get_bits(intp, SYMB_FREQ0),
  261. stv0900_get_bits(intp, SYMB_FREQ1),
  262. stv0900_get_bits(intp, SYMB_FREQ2),
  263. stv0900_get_bits(intp, SYMB_FREQ3));
  264. intval1 = (mclk) >> 16;
  265. intval2 = (srate) >> 16;
  266. rem1 = (mclk) % 0x10000;
  267. rem2 = (srate) % 0x10000;
  268. srate = (intval1 * intval2) +
  269. ((intval1 * rem2) >> 16) +
  270. ((intval2 * rem1) >> 16);
  271. return srate;
  272. }
  273. static void stv0900_set_symbol_rate(struct stv0900_internal *intp,
  274. u32 mclk, u32 srate,
  275. enum fe_stv0900_demod_num demod)
  276. {
  277. u32 symb;
  278. dprintk("%s: Mclk %d, SR %d, Dmd %d\n", __func__, mclk,
  279. srate, demod);
  280. if (srate > 60000000) {
  281. symb = srate << 4;
  282. symb /= (mclk >> 12);
  283. } else if (srate > 6000000) {
  284. symb = srate << 6;
  285. symb /= (mclk >> 10);
  286. } else {
  287. symb = srate << 9;
  288. symb /= (mclk >> 7);
  289. }
  290. stv0900_write_reg(intp, SFRINIT1, (symb >> 8) & 0x7f);
  291. stv0900_write_reg(intp, SFRINIT1 + 1, (symb & 0xff));
  292. }
  293. static void stv0900_set_max_symbol_rate(struct stv0900_internal *intp,
  294. u32 mclk, u32 srate,
  295. enum fe_stv0900_demod_num demod)
  296. {
  297. u32 symb;
  298. srate = 105 * (srate / 100);
  299. if (srate > 60000000) {
  300. symb = srate << 4;
  301. symb /= (mclk >> 12);
  302. } else if (srate > 6000000) {
  303. symb = srate << 6;
  304. symb /= (mclk >> 10);
  305. } else {
  306. symb = srate << 9;
  307. symb /= (mclk >> 7);
  308. }
  309. if (symb < 0x7fff) {
  310. stv0900_write_reg(intp, SFRUP1, (symb >> 8) & 0x7f);
  311. stv0900_write_reg(intp, SFRUP1 + 1, (symb & 0xff));
  312. } else {
  313. stv0900_write_reg(intp, SFRUP1, 0x7f);
  314. stv0900_write_reg(intp, SFRUP1 + 1, 0xff);
  315. }
  316. }
  317. static void stv0900_set_min_symbol_rate(struct stv0900_internal *intp,
  318. u32 mclk, u32 srate,
  319. enum fe_stv0900_demod_num demod)
  320. {
  321. u32 symb;
  322. srate = 95 * (srate / 100);
  323. if (srate > 60000000) {
  324. symb = srate << 4;
  325. symb /= (mclk >> 12);
  326. } else if (srate > 6000000) {
  327. symb = srate << 6;
  328. symb /= (mclk >> 10);
  329. } else {
  330. symb = srate << 9;
  331. symb /= (mclk >> 7);
  332. }
  333. stv0900_write_reg(intp, SFRLOW1, (symb >> 8) & 0xff);
  334. stv0900_write_reg(intp, SFRLOW1 + 1, (symb & 0xff));
  335. }
  336. static s32 stv0900_get_timing_offst(struct stv0900_internal *intp,
  337. u32 srate,
  338. enum fe_stv0900_demod_num demod)
  339. {
  340. s32 timingoffset;
  341. timingoffset = (stv0900_read_reg(intp, TMGREG2) << 16) +
  342. (stv0900_read_reg(intp, TMGREG2 + 1) << 8) +
  343. (stv0900_read_reg(intp, TMGREG2 + 2));
  344. timingoffset = ge2comp(timingoffset, 24);
  345. if (timingoffset == 0)
  346. timingoffset = 1;
  347. timingoffset = ((s32)srate * 10) / ((s32)0x1000000 / timingoffset);
  348. timingoffset /= 320;
  349. return timingoffset;
  350. }
  351. static void stv0900_set_dvbs2_rolloff(struct stv0900_internal *intp,
  352. enum fe_stv0900_demod_num demod)
  353. {
  354. s32 rolloff;
  355. if (intp->chip_id == 0x10) {
  356. stv0900_write_bits(intp, MANUALSX_ROLLOFF, 1);
  357. rolloff = stv0900_read_reg(intp, MATSTR1) & 0x03;
  358. stv0900_write_bits(intp, ROLLOFF_CONTROL, rolloff);
  359. } else if (intp->chip_id <= 0x20)
  360. stv0900_write_bits(intp, MANUALSX_ROLLOFF, 0);
  361. else /* cut 3.0 */
  362. stv0900_write_bits(intp, MANUALS2_ROLLOFF, 0);
  363. }
  364. static u32 stv0900_carrier_width(u32 srate, enum fe_stv0900_rolloff ro)
  365. {
  366. u32 rolloff;
  367. switch (ro) {
  368. case STV0900_20:
  369. rolloff = 20;
  370. break;
  371. case STV0900_25:
  372. rolloff = 25;
  373. break;
  374. case STV0900_35:
  375. default:
  376. rolloff = 35;
  377. break;
  378. }
  379. return srate + (srate * rolloff) / 100;
  380. }
  381. static int stv0900_check_timing_lock(struct stv0900_internal *intp,
  382. enum fe_stv0900_demod_num demod)
  383. {
  384. int timingLock = FALSE;
  385. s32 i,
  386. timingcpt = 0;
  387. u8 car_freq,
  388. tmg_th_high,
  389. tmg_th_low;
  390. car_freq = stv0900_read_reg(intp, CARFREQ);
  391. tmg_th_high = stv0900_read_reg(intp, TMGTHRISE);
  392. tmg_th_low = stv0900_read_reg(intp, TMGTHFALL);
  393. stv0900_write_reg(intp, TMGTHRISE, 0x20);
  394. stv0900_write_reg(intp, TMGTHFALL, 0x0);
  395. stv0900_write_bits(intp, CFR_AUTOSCAN, 0);
  396. stv0900_write_reg(intp, RTC, 0x80);
  397. stv0900_write_reg(intp, RTCS2, 0x40);
  398. stv0900_write_reg(intp, CARFREQ, 0x0);
  399. stv0900_write_reg(intp, CFRINIT1, 0x0);
  400. stv0900_write_reg(intp, CFRINIT0, 0x0);
  401. stv0900_write_reg(intp, AGC2REF, 0x65);
  402. stv0900_write_reg(intp, DMDISTATE, 0x18);
  403. msleep(7);
  404. for (i = 0; i < 10; i++) {
  405. if (stv0900_get_bits(intp, TMGLOCK_QUALITY) >= 2)
  406. timingcpt++;
  407. msleep(1);
  408. }
  409. if (timingcpt >= 3)
  410. timingLock = TRUE;
  411. stv0900_write_reg(intp, AGC2REF, 0x38);
  412. stv0900_write_reg(intp, RTC, 0x88);
  413. stv0900_write_reg(intp, RTCS2, 0x68);
  414. stv0900_write_reg(intp, CARFREQ, car_freq);
  415. stv0900_write_reg(intp, TMGTHRISE, tmg_th_high);
  416. stv0900_write_reg(intp, TMGTHFALL, tmg_th_low);
  417. return timingLock;
  418. }
  419. static int stv0900_get_demod_cold_lock(struct dvb_frontend *fe,
  420. s32 demod_timeout)
  421. {
  422. struct stv0900_state *state = fe->demodulator_priv;
  423. struct stv0900_internal *intp = state->internal;
  424. enum fe_stv0900_demod_num demod = state->demod;
  425. int lock = FALSE,
  426. d = demod;
  427. s32 srate,
  428. search_range,
  429. locktimeout,
  430. currier_step,
  431. nb_steps,
  432. current_step,
  433. direction,
  434. tuner_freq,
  435. timeout,
  436. freq;
  437. srate = intp->symbol_rate[d];
  438. search_range = intp->srch_range[d];
  439. if (srate >= 10000000)
  440. locktimeout = demod_timeout / 3;
  441. else
  442. locktimeout = demod_timeout / 2;
  443. lock = stv0900_get_demod_lock(intp, d, locktimeout);
  444. if (lock != FALSE)
  445. return lock;
  446. if (srate >= 10000000) {
  447. if (stv0900_check_timing_lock(intp, d) == TRUE) {
  448. stv0900_write_reg(intp, DMDISTATE, 0x1f);
  449. stv0900_write_reg(intp, DMDISTATE, 0x15);
  450. lock = stv0900_get_demod_lock(intp, d, demod_timeout);
  451. } else
  452. lock = FALSE;
  453. return lock;
  454. }
  455. if (intp->chip_id <= 0x20) {
  456. if (srate <= 1000000)
  457. currier_step = 500;
  458. else if (srate <= 4000000)
  459. currier_step = 1000;
  460. else if (srate <= 7000000)
  461. currier_step = 2000;
  462. else if (srate <= 10000000)
  463. currier_step = 3000;
  464. else
  465. currier_step = 5000;
  466. if (srate >= 2000000) {
  467. timeout = (demod_timeout / 3);
  468. if (timeout > 1000)
  469. timeout = 1000;
  470. } else
  471. timeout = (demod_timeout / 2);
  472. } else {
  473. /*cut 3.0 */
  474. currier_step = srate / 4000;
  475. timeout = (demod_timeout * 3) / 4;
  476. }
  477. nb_steps = ((search_range / 1000) / currier_step);
  478. if ((nb_steps % 2) != 0)
  479. nb_steps += 1;
  480. if (nb_steps <= 0)
  481. nb_steps = 2;
  482. else if (nb_steps > 12)
  483. nb_steps = 12;
  484. current_step = 1;
  485. direction = 1;
  486. if (intp->chip_id <= 0x20) {
  487. tuner_freq = intp->freq[d];
  488. intp->bw[d] = stv0900_carrier_width(intp->symbol_rate[d],
  489. intp->rolloff) + intp->symbol_rate[d];
  490. } else
  491. tuner_freq = 0;
  492. while ((current_step <= nb_steps) && (lock == FALSE)) {
  493. if (direction > 0)
  494. tuner_freq += (current_step * currier_step);
  495. else
  496. tuner_freq -= (current_step * currier_step);
  497. if (intp->chip_id <= 0x20) {
  498. if (intp->tuner_type[d] == 3)
  499. stv0900_set_tuner_auto(intp, tuner_freq,
  500. intp->bw[d], demod);
  501. else
  502. stv0900_set_tuner(fe, tuner_freq, intp->bw[d]);
  503. stv0900_write_reg(intp, DMDISTATE, 0x1c);
  504. stv0900_write_reg(intp, CFRINIT1, 0);
  505. stv0900_write_reg(intp, CFRINIT0, 0);
  506. stv0900_write_reg(intp, DMDISTATE, 0x1f);
  507. stv0900_write_reg(intp, DMDISTATE, 0x15);
  508. } else {
  509. stv0900_write_reg(intp, DMDISTATE, 0x1c);
  510. freq = (tuner_freq * 65536) / (intp->mclk / 1000);
  511. stv0900_write_bits(intp, CFR_INIT1, MSB(freq));
  512. stv0900_write_bits(intp, CFR_INIT0, LSB(freq));
  513. stv0900_write_reg(intp, DMDISTATE, 0x1f);
  514. stv0900_write_reg(intp, DMDISTATE, 0x05);
  515. }
  516. lock = stv0900_get_demod_lock(intp, d, timeout);
  517. direction *= -1;
  518. current_step++;
  519. }
  520. return lock;
  521. }
  522. static void stv0900_get_lock_timeout(s32 *demod_timeout, s32 *fec_timeout,
  523. s32 srate,
  524. enum fe_stv0900_search_algo algo)
  525. {
  526. switch (algo) {
  527. case STV0900_BLIND_SEARCH:
  528. if (srate <= 1500000) {
  529. (*demod_timeout) = 1500;
  530. (*fec_timeout) = 400;
  531. } else if (srate <= 5000000) {
  532. (*demod_timeout) = 1000;
  533. (*fec_timeout) = 300;
  534. } else {
  535. (*demod_timeout) = 700;
  536. (*fec_timeout) = 100;
  537. }
  538. break;
  539. case STV0900_COLD_START:
  540. case STV0900_WARM_START:
  541. default:
  542. if (srate <= 1000000) {
  543. (*demod_timeout) = 3000;
  544. (*fec_timeout) = 1700;
  545. } else if (srate <= 2000000) {
  546. (*demod_timeout) = 2500;
  547. (*fec_timeout) = 1100;
  548. } else if (srate <= 5000000) {
  549. (*demod_timeout) = 1000;
  550. (*fec_timeout) = 550;
  551. } else if (srate <= 10000000) {
  552. (*demod_timeout) = 700;
  553. (*fec_timeout) = 250;
  554. } else if (srate <= 20000000) {
  555. (*demod_timeout) = 400;
  556. (*fec_timeout) = 130;
  557. } else {
  558. (*demod_timeout) = 300;
  559. (*fec_timeout) = 100;
  560. }
  561. break;
  562. }
  563. if (algo == STV0900_WARM_START)
  564. (*demod_timeout) /= 2;
  565. }
  566. static void stv0900_set_viterbi_tracq(struct stv0900_internal *intp,
  567. enum fe_stv0900_demod_num demod)
  568. {
  569. s32 vth_reg = VTH12;
  570. dprintk("%s\n", __func__);
  571. stv0900_write_reg(intp, vth_reg++, 0xd0);
  572. stv0900_write_reg(intp, vth_reg++, 0x7d);
  573. stv0900_write_reg(intp, vth_reg++, 0x53);
  574. stv0900_write_reg(intp, vth_reg++, 0x2f);
  575. stv0900_write_reg(intp, vth_reg++, 0x24);
  576. stv0900_write_reg(intp, vth_reg++, 0x1f);
  577. }
  578. static void stv0900_set_viterbi_standard(struct stv0900_internal *intp,
  579. enum fe_stv0900_search_standard standard,
  580. enum fe_stv0900_fec fec,
  581. enum fe_stv0900_demod_num demod)
  582. {
  583. dprintk("%s: ViterbiStandard = ", __func__);
  584. switch (standard) {
  585. case STV0900_AUTO_SEARCH:
  586. dprintk("Auto\n");
  587. stv0900_write_reg(intp, FECM, 0x10);
  588. stv0900_write_reg(intp, PRVIT, 0x3f);
  589. break;
  590. case STV0900_SEARCH_DVBS1:
  591. dprintk("DVBS1\n");
  592. stv0900_write_reg(intp, FECM, 0x00);
  593. switch (fec) {
  594. case STV0900_FEC_UNKNOWN:
  595. default:
  596. stv0900_write_reg(intp, PRVIT, 0x2f);
  597. break;
  598. case STV0900_FEC_1_2:
  599. stv0900_write_reg(intp, PRVIT, 0x01);
  600. break;
  601. case STV0900_FEC_2_3:
  602. stv0900_write_reg(intp, PRVIT, 0x02);
  603. break;
  604. case STV0900_FEC_3_4:
  605. stv0900_write_reg(intp, PRVIT, 0x04);
  606. break;
  607. case STV0900_FEC_5_6:
  608. stv0900_write_reg(intp, PRVIT, 0x08);
  609. break;
  610. case STV0900_FEC_7_8:
  611. stv0900_write_reg(intp, PRVIT, 0x20);
  612. break;
  613. }
  614. break;
  615. case STV0900_SEARCH_DSS:
  616. dprintk("DSS\n");
  617. stv0900_write_reg(intp, FECM, 0x80);
  618. switch (fec) {
  619. case STV0900_FEC_UNKNOWN:
  620. default:
  621. stv0900_write_reg(intp, PRVIT, 0x13);
  622. break;
  623. case STV0900_FEC_1_2:
  624. stv0900_write_reg(intp, PRVIT, 0x01);
  625. break;
  626. case STV0900_FEC_2_3:
  627. stv0900_write_reg(intp, PRVIT, 0x02);
  628. break;
  629. case STV0900_FEC_6_7:
  630. stv0900_write_reg(intp, PRVIT, 0x10);
  631. break;
  632. }
  633. break;
  634. default:
  635. break;
  636. }
  637. }
  638. static enum fe_stv0900_fec stv0900_get_vit_fec(struct stv0900_internal *intp,
  639. enum fe_stv0900_demod_num demod)
  640. {
  641. enum fe_stv0900_fec prate;
  642. s32 rate_fld = stv0900_get_bits(intp, VIT_CURPUN);
  643. switch (rate_fld) {
  644. case 13:
  645. prate = STV0900_FEC_1_2;
  646. break;
  647. case 18:
  648. prate = STV0900_FEC_2_3;
  649. break;
  650. case 21:
  651. prate = STV0900_FEC_3_4;
  652. break;
  653. case 24:
  654. prate = STV0900_FEC_5_6;
  655. break;
  656. case 25:
  657. prate = STV0900_FEC_6_7;
  658. break;
  659. case 26:
  660. prate = STV0900_FEC_7_8;
  661. break;
  662. default:
  663. prate = STV0900_FEC_UNKNOWN;
  664. break;
  665. }
  666. return prate;
  667. }
  668. static void stv0900_set_dvbs1_track_car_loop(struct stv0900_internal *intp,
  669. enum fe_stv0900_demod_num demod,
  670. u32 srate)
  671. {
  672. if (intp->chip_id >= 0x30) {
  673. if (srate >= 15000000) {
  674. stv0900_write_reg(intp, ACLC, 0x2b);
  675. stv0900_write_reg(intp, BCLC, 0x1a);
  676. } else if ((srate >= 7000000) && (15000000 > srate)) {
  677. stv0900_write_reg(intp, ACLC, 0x0c);
  678. stv0900_write_reg(intp, BCLC, 0x1b);
  679. } else if (srate < 7000000) {
  680. stv0900_write_reg(intp, ACLC, 0x2c);
  681. stv0900_write_reg(intp, BCLC, 0x1c);
  682. }
  683. } else { /*cut 2.0 and 1.x*/
  684. stv0900_write_reg(intp, ACLC, 0x1a);
  685. stv0900_write_reg(intp, BCLC, 0x09);
  686. }
  687. }
  688. static void stv0900_track_optimization(struct dvb_frontend *fe)
  689. {
  690. struct stv0900_state *state = fe->demodulator_priv;
  691. struct stv0900_internal *intp = state->internal;
  692. enum fe_stv0900_demod_num demod = state->demod;
  693. s32 srate,
  694. pilots,
  695. aclc,
  696. freq1,
  697. freq0,
  698. i = 0,
  699. timed,
  700. timef,
  701. blind_tun_sw = 0,
  702. modulation;
  703. enum fe_stv0900_modcode foundModcod;
  704. dprintk("%s\n", __func__);
  705. srate = stv0900_get_symbol_rate(intp, intp->mclk, demod);
  706. srate += stv0900_get_timing_offst(intp, srate, demod);
  707. switch (intp->result[demod].standard) {
  708. case STV0900_DVBS1_STANDARD:
  709. case STV0900_DSS_STANDARD:
  710. dprintk("%s: found DVB-S or DSS\n", __func__);
  711. if (intp->srch_standard[demod] == STV0900_AUTO_SEARCH) {
  712. stv0900_write_bits(intp, DVBS1_ENABLE, 1);
  713. stv0900_write_bits(intp, DVBS2_ENABLE, 0);
  714. }
  715. stv0900_write_bits(intp, ROLLOFF_CONTROL, intp->rolloff);
  716. stv0900_write_bits(intp, MANUALSX_ROLLOFF, 1);
  717. if (intp->chip_id < 0x30) {
  718. stv0900_write_reg(intp, ERRCTRL1, 0x75);
  719. break;
  720. }
  721. if (stv0900_get_vit_fec(intp, demod) == STV0900_FEC_1_2) {
  722. stv0900_write_reg(intp, GAUSSR0, 0x98);
  723. stv0900_write_reg(intp, CCIR0, 0x18);
  724. } else {
  725. stv0900_write_reg(intp, GAUSSR0, 0x18);
  726. stv0900_write_reg(intp, CCIR0, 0x18);
  727. }
  728. stv0900_write_reg(intp, ERRCTRL1, 0x75);
  729. break;
  730. case STV0900_DVBS2_STANDARD:
  731. dprintk("%s: found DVB-S2\n", __func__);
  732. stv0900_write_bits(intp, DVBS1_ENABLE, 0);
  733. stv0900_write_bits(intp, DVBS2_ENABLE, 1);
  734. stv0900_write_reg(intp, ACLC, 0);
  735. stv0900_write_reg(intp, BCLC, 0);
  736. if (intp->result[demod].frame_len == STV0900_LONG_FRAME) {
  737. foundModcod = stv0900_get_bits(intp, DEMOD_MODCOD);
  738. pilots = stv0900_get_bits(intp, DEMOD_TYPE) & 0x01;
  739. aclc = stv0900_get_optim_carr_loop(srate,
  740. foundModcod,
  741. pilots,
  742. intp->chip_id);
  743. if (foundModcod <= STV0900_QPSK_910)
  744. stv0900_write_reg(intp, ACLC2S2Q, aclc);
  745. else if (foundModcod <= STV0900_8PSK_910) {
  746. stv0900_write_reg(intp, ACLC2S2Q, 0x2a);
  747. stv0900_write_reg(intp, ACLC2S28, aclc);
  748. }
  749. if ((intp->demod_mode == STV0900_SINGLE) &&
  750. (foundModcod > STV0900_8PSK_910)) {
  751. if (foundModcod <= STV0900_16APSK_910) {
  752. stv0900_write_reg(intp, ACLC2S2Q, 0x2a);
  753. stv0900_write_reg(intp, ACLC2S216A,
  754. aclc);
  755. } else if (foundModcod <= STV0900_32APSK_910) {
  756. stv0900_write_reg(intp, ACLC2S2Q, 0x2a);
  757. stv0900_write_reg(intp, ACLC2S232A,
  758. aclc);
  759. }
  760. }
  761. } else {
  762. modulation = intp->result[demod].modulation;
  763. aclc = stv0900_get_optim_short_carr_loop(srate,
  764. modulation, intp->chip_id);
  765. if (modulation == STV0900_QPSK)
  766. stv0900_write_reg(intp, ACLC2S2Q, aclc);
  767. else if (modulation == STV0900_8PSK) {
  768. stv0900_write_reg(intp, ACLC2S2Q, 0x2a);
  769. stv0900_write_reg(intp, ACLC2S28, aclc);
  770. } else if (modulation == STV0900_16APSK) {
  771. stv0900_write_reg(intp, ACLC2S2Q, 0x2a);
  772. stv0900_write_reg(intp, ACLC2S216A, aclc);
  773. } else if (modulation == STV0900_32APSK) {
  774. stv0900_write_reg(intp, ACLC2S2Q, 0x2a);
  775. stv0900_write_reg(intp, ACLC2S232A, aclc);
  776. }
  777. }
  778. if (intp->chip_id <= 0x11) {
  779. if (intp->demod_mode != STV0900_SINGLE)
  780. stv0900_activate_s2_modcod(intp, demod);
  781. }
  782. stv0900_write_reg(intp, ERRCTRL1, 0x67);
  783. break;
  784. case STV0900_UNKNOWN_STANDARD:
  785. default:
  786. dprintk("%s: found unknown standard\n", __func__);
  787. stv0900_write_bits(intp, DVBS1_ENABLE, 1);
  788. stv0900_write_bits(intp, DVBS2_ENABLE, 1);
  789. break;
  790. }
  791. freq1 = stv0900_read_reg(intp, CFR2);
  792. freq0 = stv0900_read_reg(intp, CFR1);
  793. if (intp->srch_algo[demod] == STV0900_BLIND_SEARCH) {
  794. stv0900_write_reg(intp, SFRSTEP, 0x00);
  795. stv0900_write_bits(intp, SCAN_ENABLE, 0);
  796. stv0900_write_bits(intp, CFR_AUTOSCAN, 0);
  797. stv0900_write_reg(intp, TMGCFG2, 0xc1);
  798. stv0900_set_symbol_rate(intp, intp->mclk, srate, demod);
  799. blind_tun_sw = 1;
  800. if (intp->result[demod].standard != STV0900_DVBS2_STANDARD)
  801. stv0900_set_dvbs1_track_car_loop(intp, demod, srate);
  802. }
  803. if (intp->chip_id >= 0x20) {
  804. if ((intp->srch_standard[demod] == STV0900_SEARCH_DVBS1) ||
  805. (intp->srch_standard[demod] ==
  806. STV0900_SEARCH_DSS) ||
  807. (intp->srch_standard[demod] ==
  808. STV0900_AUTO_SEARCH)) {
  809. stv0900_write_reg(intp, VAVSRVIT, 0x0a);
  810. stv0900_write_reg(intp, VITSCALE, 0x0);
  811. }
  812. }
  813. if (intp->chip_id < 0x20)
  814. stv0900_write_reg(intp, CARHDR, 0x08);
  815. if (intp->chip_id == 0x10)
  816. stv0900_write_reg(intp, CORRELEXP, 0x0a);
  817. stv0900_write_reg(intp, AGC2REF, 0x38);
  818. if ((intp->chip_id >= 0x20) ||
  819. (blind_tun_sw == 1) ||
  820. (intp->symbol_rate[demod] < 10000000)) {
  821. stv0900_write_reg(intp, CFRINIT1, freq1);
  822. stv0900_write_reg(intp, CFRINIT0, freq0);
  823. intp->bw[demod] = stv0900_carrier_width(srate,
  824. intp->rolloff) + 10000000;
  825. if ((intp->chip_id >= 0x20) || (blind_tun_sw == 1)) {
  826. if (intp->srch_algo[demod] != STV0900_WARM_START) {
  827. if (intp->tuner_type[demod] == 3)
  828. stv0900_set_tuner_auto(intp,
  829. intp->freq[demod],
  830. intp->bw[demod],
  831. demod);
  832. else
  833. stv0900_set_bandwidth(fe,
  834. intp->bw[demod]);
  835. }
  836. }
  837. if ((intp->srch_algo[demod] == STV0900_BLIND_SEARCH) ||
  838. (intp->symbol_rate[demod] < 10000000))
  839. msleep(50);
  840. else
  841. msleep(5);
  842. stv0900_get_lock_timeout(&timed, &timef, srate,
  843. STV0900_WARM_START);
  844. if (stv0900_get_demod_lock(intp, demod, timed / 2) == FALSE) {
  845. stv0900_write_reg(intp, DMDISTATE, 0x1f);
  846. stv0900_write_reg(intp, CFRINIT1, freq1);
  847. stv0900_write_reg(intp, CFRINIT0, freq0);
  848. stv0900_write_reg(intp, DMDISTATE, 0x18);
  849. i = 0;
  850. while ((stv0900_get_demod_lock(intp,
  851. demod,
  852. timed / 2) == FALSE) &&
  853. (i <= 2)) {
  854. stv0900_write_reg(intp, DMDISTATE, 0x1f);
  855. stv0900_write_reg(intp, CFRINIT1, freq1);
  856. stv0900_write_reg(intp, CFRINIT0, freq0);
  857. stv0900_write_reg(intp, DMDISTATE, 0x18);
  858. i++;
  859. }
  860. }
  861. }
  862. if (intp->chip_id >= 0x20)
  863. stv0900_write_reg(intp, CARFREQ, 0x49);
  864. if ((intp->result[demod].standard == STV0900_DVBS1_STANDARD) ||
  865. (intp->result[demod].standard == STV0900_DSS_STANDARD))
  866. stv0900_set_viterbi_tracq(intp, demod);
  867. }
  868. static int stv0900_get_fec_lock(struct stv0900_internal *intp,
  869. enum fe_stv0900_demod_num demod, s32 time_out)
  870. {
  871. s32 timer = 0, lock = 0;
  872. enum fe_stv0900_search_state dmd_state;
  873. dprintk("%s\n", __func__);
  874. dmd_state = stv0900_get_bits(intp, HEADER_MODE);
  875. while ((timer < time_out) && (lock == 0)) {
  876. switch (dmd_state) {
  877. case STV0900_SEARCH:
  878. case STV0900_PLH_DETECTED:
  879. default:
  880. lock = 0;
  881. break;
  882. case STV0900_DVBS2_FOUND:
  883. lock = stv0900_get_bits(intp, PKTDELIN_LOCK);
  884. break;
  885. case STV0900_DVBS_FOUND:
  886. lock = stv0900_get_bits(intp, LOCKEDVIT);
  887. break;
  888. }
  889. if (lock == 0) {
  890. msleep(10);
  891. timer += 10;
  892. }
  893. }
  894. if (lock)
  895. dprintk("%s: DEMOD FEC LOCK OK\n", __func__);
  896. else
  897. dprintk("%s: DEMOD FEC LOCK FAIL\n", __func__);
  898. return lock;
  899. }
  900. static int stv0900_wait_for_lock(struct stv0900_internal *intp,
  901. enum fe_stv0900_demod_num demod,
  902. s32 dmd_timeout, s32 fec_timeout)
  903. {
  904. s32 timer = 0, lock = 0;
  905. dprintk("%s\n", __func__);
  906. lock = stv0900_get_demod_lock(intp, demod, dmd_timeout);
  907. if (lock)
  908. lock = stv0900_get_fec_lock(intp, demod, fec_timeout);
  909. if (lock) {
  910. lock = 0;
  911. dprintk("%s: Timer = %d, time_out = %d\n",
  912. __func__, timer, fec_timeout);
  913. while ((timer < fec_timeout) && (lock == 0)) {
  914. lock = stv0900_get_bits(intp, TSFIFO_LINEOK);
  915. msleep(1);
  916. timer++;
  917. }
  918. }
  919. if (lock)
  920. dprintk("%s: DEMOD LOCK OK\n", __func__);
  921. else
  922. dprintk("%s: DEMOD LOCK FAIL\n", __func__);
  923. if (lock)
  924. return TRUE;
  925. else
  926. return FALSE;
  927. }
  928. enum fe_stv0900_tracking_standard stv0900_get_standard(struct dvb_frontend *fe,
  929. enum fe_stv0900_demod_num demod)
  930. {
  931. struct stv0900_state *state = fe->demodulator_priv;
  932. struct stv0900_internal *intp = state->internal;
  933. enum fe_stv0900_tracking_standard fnd_standard;
  934. int hdr_mode = stv0900_get_bits(intp, HEADER_MODE);
  935. switch (hdr_mode) {
  936. case 2:
  937. fnd_standard = STV0900_DVBS2_STANDARD;
  938. break;
  939. case 3:
  940. if (stv0900_get_bits(intp, DSS_DVB) == 1)
  941. fnd_standard = STV0900_DSS_STANDARD;
  942. else
  943. fnd_standard = STV0900_DVBS1_STANDARD;
  944. break;
  945. default:
  946. fnd_standard = STV0900_UNKNOWN_STANDARD;
  947. }
  948. dprintk("%s: standard %d\n", __func__, fnd_standard);
  949. return fnd_standard;
  950. }
  951. static s32 stv0900_get_carr_freq(struct stv0900_internal *intp, u32 mclk,
  952. enum fe_stv0900_demod_num demod)
  953. {
  954. s32 derot,
  955. rem1,
  956. rem2,
  957. intval1,
  958. intval2;
  959. derot = (stv0900_get_bits(intp, CAR_FREQ2) << 16) +
  960. (stv0900_get_bits(intp, CAR_FREQ1) << 8) +
  961. (stv0900_get_bits(intp, CAR_FREQ0));
  962. derot = ge2comp(derot, 24);
  963. intval1 = mclk >> 12;
  964. intval2 = derot >> 12;
  965. rem1 = mclk % 0x1000;
  966. rem2 = derot % 0x1000;
  967. derot = (intval1 * intval2) +
  968. ((intval1 * rem2) >> 12) +
  969. ((intval2 * rem1) >> 12);
  970. return derot;
  971. }
  972. static u32 stv0900_get_tuner_freq(struct dvb_frontend *fe)
  973. {
  974. struct dvb_frontend_ops *frontend_ops = NULL;
  975. struct dvb_tuner_ops *tuner_ops = NULL;
  976. u32 freq = 0;
  977. frontend_ops = &fe->ops;
  978. tuner_ops = &frontend_ops->tuner_ops;
  979. if (tuner_ops->get_frequency) {
  980. if ((tuner_ops->get_frequency(fe, &freq)) < 0)
  981. dprintk("%s: Invalid parameter\n", __func__);
  982. else
  983. dprintk("%s: Frequency=%d\n", __func__, freq);
  984. }
  985. return freq;
  986. }
  987. static enum
  988. fe_stv0900_signal_type stv0900_get_signal_params(struct dvb_frontend *fe)
  989. {
  990. struct stv0900_state *state = fe->demodulator_priv;
  991. struct stv0900_internal *intp = state->internal;
  992. enum fe_stv0900_demod_num demod = state->demod;
  993. enum fe_stv0900_signal_type range = STV0900_OUTOFRANGE;
  994. struct stv0900_signal_info *result = &intp->result[demod];
  995. s32 offsetFreq,
  996. srate_offset;
  997. int i = 0,
  998. d = demod;
  999. u8 timing;
  1000. msleep(5);
  1001. if (intp->srch_algo[d] == STV0900_BLIND_SEARCH) {
  1002. timing = stv0900_read_reg(intp, TMGREG2);
  1003. i = 0;
  1004. stv0900_write_reg(intp, SFRSTEP, 0x5c);
  1005. while ((i <= 50) && (timing != 0) && (timing != 0xff)) {
  1006. timing = stv0900_read_reg(intp, TMGREG2);
  1007. msleep(5);
  1008. i += 5;
  1009. }
  1010. }
  1011. result->standard = stv0900_get_standard(fe, d);
  1012. if (intp->tuner_type[demod] == 3)
  1013. result->frequency = stv0900_get_freq_auto(intp, d);
  1014. else
  1015. result->frequency = stv0900_get_tuner_freq(fe);
  1016. offsetFreq = stv0900_get_carr_freq(intp, intp->mclk, d) / 1000;
  1017. result->frequency += offsetFreq;
  1018. result->symbol_rate = stv0900_get_symbol_rate(intp, intp->mclk, d);
  1019. srate_offset = stv0900_get_timing_offst(intp, result->symbol_rate, d);
  1020. result->symbol_rate += srate_offset;
  1021. result->fec = stv0900_get_vit_fec(intp, d);
  1022. result->modcode = stv0900_get_bits(intp, DEMOD_MODCOD);
  1023. result->pilot = stv0900_get_bits(intp, DEMOD_TYPE) & 0x01;
  1024. result->frame_len = ((u32)stv0900_get_bits(intp, DEMOD_TYPE)) >> 1;
  1025. result->rolloff = stv0900_get_bits(intp, ROLLOFF_STATUS);
  1026. dprintk("%s: modcode=0x%x \n", __func__, result->modcode);
  1027. switch (result->standard) {
  1028. case STV0900_DVBS2_STANDARD:
  1029. result->spectrum = stv0900_get_bits(intp, SPECINV_DEMOD);
  1030. if (result->modcode <= STV0900_QPSK_910)
  1031. result->modulation = STV0900_QPSK;
  1032. else if (result->modcode <= STV0900_8PSK_910)
  1033. result->modulation = STV0900_8PSK;
  1034. else if (result->modcode <= STV0900_16APSK_910)
  1035. result->modulation = STV0900_16APSK;
  1036. else if (result->modcode <= STV0900_32APSK_910)
  1037. result->modulation = STV0900_32APSK;
  1038. else
  1039. result->modulation = STV0900_UNKNOWN;
  1040. break;
  1041. case STV0900_DVBS1_STANDARD:
  1042. case STV0900_DSS_STANDARD:
  1043. result->spectrum = stv0900_get_bits(intp, IQINV);
  1044. result->modulation = STV0900_QPSK;
  1045. break;
  1046. default:
  1047. break;
  1048. }
  1049. if ((intp->srch_algo[d] == STV0900_BLIND_SEARCH) ||
  1050. (intp->symbol_rate[d] < 10000000)) {
  1051. offsetFreq = result->frequency - intp->freq[d];
  1052. if (intp->tuner_type[demod] == 3)
  1053. intp->freq[d] = stv0900_get_freq_auto(intp, d);
  1054. else
  1055. intp->freq[d] = stv0900_get_tuner_freq(fe);
  1056. if (ABS(offsetFreq) <= ((intp->srch_range[d] / 2000) + 500))
  1057. range = STV0900_RANGEOK;
  1058. else if (ABS(offsetFreq) <=
  1059. (stv0900_carrier_width(result->symbol_rate,
  1060. result->rolloff) / 2000))
  1061. range = STV0900_RANGEOK;
  1062. } else if (ABS(offsetFreq) <= ((intp->srch_range[d] / 2000) + 500))
  1063. range = STV0900_RANGEOK;
  1064. dprintk("%s: range %d\n", __func__, range);
  1065. return range;
  1066. }
  1067. static enum
  1068. fe_stv0900_signal_type stv0900_dvbs1_acq_workaround(struct dvb_frontend *fe)
  1069. {
  1070. struct stv0900_state *state = fe->demodulator_priv;
  1071. struct stv0900_internal *intp = state->internal;
  1072. enum fe_stv0900_demod_num demod = state->demod;
  1073. enum fe_stv0900_signal_type signal_type = STV0900_NODATA;
  1074. s32 srate,
  1075. demod_timeout,
  1076. fec_timeout,
  1077. freq1,
  1078. freq0;
  1079. intp->result[demod].locked = FALSE;
  1080. if (stv0900_get_bits(intp, HEADER_MODE) == STV0900_DVBS_FOUND) {
  1081. srate = stv0900_get_symbol_rate(intp, intp->mclk, demod);
  1082. srate += stv0900_get_timing_offst(intp, srate, demod);
  1083. if (intp->srch_algo[demod] == STV0900_BLIND_SEARCH)
  1084. stv0900_set_symbol_rate(intp, intp->mclk, srate, demod);
  1085. stv0900_get_lock_timeout(&demod_timeout, &fec_timeout,
  1086. srate, STV0900_WARM_START);
  1087. freq1 = stv0900_read_reg(intp, CFR2);
  1088. freq0 = stv0900_read_reg(intp, CFR1);
  1089. stv0900_write_bits(intp, CFR_AUTOSCAN, 0);
  1090. stv0900_write_bits(intp, SPECINV_CONTROL,
  1091. STV0900_IQ_FORCE_SWAPPED);
  1092. stv0900_write_reg(intp, DMDISTATE, 0x1c);
  1093. stv0900_write_reg(intp, CFRINIT1, freq1);
  1094. stv0900_write_reg(intp, CFRINIT0, freq0);
  1095. stv0900_write_reg(intp, DMDISTATE, 0x18);
  1096. if (stv0900_wait_for_lock(intp, demod,
  1097. demod_timeout, fec_timeout) == TRUE) {
  1098. intp->result[demod].locked = TRUE;
  1099. signal_type = stv0900_get_signal_params(fe);
  1100. stv0900_track_optimization(fe);
  1101. } else {
  1102. stv0900_write_bits(intp, SPECINV_CONTROL,
  1103. STV0900_IQ_FORCE_NORMAL);
  1104. stv0900_write_reg(intp, DMDISTATE, 0x1c);
  1105. stv0900_write_reg(intp, CFRINIT1, freq1);
  1106. stv0900_write_reg(intp, CFRINIT0, freq0);
  1107. stv0900_write_reg(intp, DMDISTATE, 0x18);
  1108. if (stv0900_wait_for_lock(intp, demod,
  1109. demod_timeout, fec_timeout) == TRUE) {
  1110. intp->result[demod].locked = TRUE;
  1111. signal_type = stv0900_get_signal_params(fe);
  1112. stv0900_track_optimization(fe);
  1113. }
  1114. }
  1115. } else
  1116. intp->result[demod].locked = FALSE;
  1117. return signal_type;
  1118. }
  1119. static u16 stv0900_blind_check_agc2_min_level(struct stv0900_internal *intp,
  1120. enum fe_stv0900_demod_num demod)
  1121. {
  1122. u32 minagc2level = 0xffff,
  1123. agc2level,
  1124. init_freq, freq_step;
  1125. s32 i, j, nb_steps, direction;
  1126. dprintk("%s\n", __func__);
  1127. stv0900_write_reg(intp, AGC2REF, 0x38);
  1128. stv0900_write_bits(intp, SCAN_ENABLE, 0);
  1129. stv0900_write_bits(intp, CFR_AUTOSCAN, 0);
  1130. stv0900_write_bits(intp, AUTO_GUP, 1);
  1131. stv0900_write_bits(intp, AUTO_GLOW, 1);
  1132. stv0900_write_reg(intp, DMDT0M, 0x0);
  1133. stv0900_set_symbol_rate(intp, intp->mclk, 1000000, demod);
  1134. nb_steps = -1 + (intp->srch_range[demod] / 1000000);
  1135. nb_steps /= 2;
  1136. nb_steps = (2 * nb_steps) + 1;
  1137. if (nb_steps < 0)
  1138. nb_steps = 1;
  1139. direction = 1;
  1140. freq_step = (1000000 << 8) / (intp->mclk >> 8);
  1141. init_freq = 0;
  1142. for (i = 0; i < nb_steps; i++) {
  1143. if (direction > 0)
  1144. init_freq = init_freq + (freq_step * i);
  1145. else
  1146. init_freq = init_freq - (freq_step * i);
  1147. direction *= -1;
  1148. stv0900_write_reg(intp, DMDISTATE, 0x5C);
  1149. stv0900_write_reg(intp, CFRINIT1, (init_freq >> 8) & 0xff);
  1150. stv0900_write_reg(intp, CFRINIT0, init_freq & 0xff);
  1151. stv0900_write_reg(intp, DMDISTATE, 0x58);
  1152. msleep(10);
  1153. agc2level = 0;
  1154. for (j = 0; j < 10; j++)
  1155. agc2level += (stv0900_read_reg(intp, AGC2I1) << 8)
  1156. | stv0900_read_reg(intp, AGC2I0);
  1157. agc2level /= 10;
  1158. if (agc2level < minagc2level)
  1159. minagc2level = agc2level;
  1160. }
  1161. return (u16)minagc2level;
  1162. }
  1163. static u32 stv0900_search_srate_coarse(struct dvb_frontend *fe)
  1164. {
  1165. struct stv0900_state *state = fe->demodulator_priv;
  1166. struct stv0900_internal *intp = state->internal;
  1167. enum fe_stv0900_demod_num demod = state->demod;
  1168. int timing_lck = FALSE;
  1169. s32 i, timingcpt = 0,
  1170. direction = 1,
  1171. nb_steps,
  1172. current_step = 0,
  1173. tuner_freq;
  1174. u32 agc2_th,
  1175. coarse_srate = 0,
  1176. agc2_integr = 0,
  1177. currier_step = 1200;
  1178. if (intp->chip_id >= 0x30)
  1179. agc2_th = 0x2e00;
  1180. else
  1181. agc2_th = 0x1f00;
  1182. stv0900_write_bits(intp, DEMOD_MODE, 0x1f);
  1183. stv0900_write_reg(intp, TMGCFG, 0x12);
  1184. stv0900_write_reg(intp, TMGTHRISE, 0xf0);
  1185. stv0900_write_reg(intp, TMGTHFALL, 0xe0);
  1186. stv0900_write_bits(intp, SCAN_ENABLE, 1);
  1187. stv0900_write_bits(intp, CFR_AUTOSCAN, 1);
  1188. stv0900_write_reg(intp, SFRUP1, 0x83);
  1189. stv0900_write_reg(intp, SFRUP0, 0xc0);
  1190. stv0900_write_reg(intp, SFRLOW1, 0x82);
  1191. stv0900_write_reg(intp, SFRLOW0, 0xa0);
  1192. stv0900_write_reg(intp, DMDT0M, 0x0);
  1193. stv0900_write_reg(intp, AGC2REF, 0x50);
  1194. if (intp->chip_id >= 0x30) {
  1195. stv0900_write_reg(intp, CARFREQ, 0x99);
  1196. stv0900_write_reg(intp, SFRSTEP, 0x98);
  1197. } else if (intp->chip_id >= 0x20) {
  1198. stv0900_write_reg(intp, CARFREQ, 0x6a);
  1199. stv0900_write_reg(intp, SFRSTEP, 0x95);
  1200. } else {
  1201. stv0900_write_reg(intp, CARFREQ, 0xed);
  1202. stv0900_write_reg(intp, SFRSTEP, 0x73);
  1203. }
  1204. if (intp->symbol_rate[demod] <= 2000000)
  1205. currier_step = 1000;
  1206. else if (intp->symbol_rate[demod] <= 5000000)
  1207. currier_step = 2000;
  1208. else if (intp->symbol_rate[demod] <= 12000000)
  1209. currier_step = 3000;
  1210. else
  1211. currier_step = 5000;
  1212. nb_steps = -1 + ((intp->srch_range[demod] / 1000) / currier_step);
  1213. nb_steps /= 2;
  1214. nb_steps = (2 * nb_steps) + 1;
  1215. if (nb_steps < 0)
  1216. nb_steps = 1;
  1217. else if (nb_steps > 10) {
  1218. nb_steps = 11;
  1219. currier_step = (intp->srch_range[demod] / 1000) / 10;
  1220. }
  1221. current_step = 0;
  1222. direction = 1;
  1223. tuner_freq = intp->freq[demod];
  1224. while ((timing_lck == FALSE) && (current_step < nb_steps)) {
  1225. stv0900_write_reg(intp, DMDISTATE, 0x5f);
  1226. stv0900_write_bits(intp, DEMOD_MODE, 0);
  1227. msleep(50);
  1228. for (i = 0; i < 10; i++) {
  1229. if (stv0900_get_bits(intp, TMGLOCK_QUALITY) >= 2)
  1230. timingcpt++;
  1231. agc2_integr += (stv0900_read_reg(intp, AGC2I1) << 8) |
  1232. stv0900_read_reg(intp, AGC2I0);
  1233. }
  1234. agc2_integr /= 10;
  1235. coarse_srate = stv0900_get_symbol_rate(intp, intp->mclk, demod);
  1236. current_step++;
  1237. direction *= -1;
  1238. dprintk("lock: I2C_DEMOD_MODE_FIELD =0. Search started. tuner freq=%d agc2=0x%x srate_coarse=%d tmg_cpt=%d\n",
  1239. tuner_freq, agc2_integr, coarse_srate, timingcpt);
  1240. if ((timingcpt >= 5) &&
  1241. (agc2_integr < agc2_th) &&
  1242. (coarse_srate < 55000000) &&
  1243. (coarse_srate > 850000))
  1244. timing_lck = TRUE;
  1245. else if (current_step < nb_steps) {
  1246. if (direction > 0)
  1247. tuner_freq += (current_step * currier_step);
  1248. else
  1249. tuner_freq -= (current_step * currier_step);
  1250. if (intp->tuner_type[demod] == 3)
  1251. stv0900_set_tuner_auto(intp, tuner_freq,
  1252. intp->bw[demod], demod);
  1253. else
  1254. stv0900_set_tuner(fe, tuner_freq,
  1255. intp->bw[demod]);
  1256. }
  1257. }
  1258. if (timing_lck == FALSE)
  1259. coarse_srate = 0;
  1260. else
  1261. coarse_srate = stv0900_get_symbol_rate(intp, intp->mclk, demod);
  1262. return coarse_srate;
  1263. }
  1264. static u32 stv0900_search_srate_fine(struct dvb_frontend *fe)
  1265. {
  1266. struct stv0900_state *state = fe->demodulator_priv;
  1267. struct stv0900_internal *intp = state->internal;
  1268. enum fe_stv0900_demod_num demod = state->demod;
  1269. u32 coarse_srate,
  1270. coarse_freq,
  1271. symb,
  1272. symbmax,
  1273. symbmin,
  1274. symbcomp;
  1275. coarse_srate = stv0900_get_symbol_rate(intp, intp->mclk, demod);
  1276. if (coarse_srate > 3000000) {
  1277. symbmax = 13 * (coarse_srate / 10);
  1278. symbmax = (symbmax / 1000) * 65536;
  1279. symbmax /= (intp->mclk / 1000);
  1280. symbmin = 10 * (coarse_srate / 13);
  1281. symbmin = (symbmin / 1000)*65536;
  1282. symbmin /= (intp->mclk / 1000);
  1283. symb = (coarse_srate / 1000) * 65536;
  1284. symb /= (intp->mclk / 1000);
  1285. } else {
  1286. symbmax = 13 * (coarse_srate / 10);
  1287. symbmax = (symbmax / 100) * 65536;
  1288. symbmax /= (intp->mclk / 100);
  1289. symbmin = 10 * (coarse_srate / 14);
  1290. symbmin = (symbmin / 100) * 65536;
  1291. symbmin /= (intp->mclk / 100);
  1292. symb = (coarse_srate / 100) * 65536;
  1293. symb /= (intp->mclk / 100);
  1294. }
  1295. symbcomp = 13 * (coarse_srate / 10);
  1296. coarse_freq = (stv0900_read_reg(intp, CFR2) << 8)
  1297. | stv0900_read_reg(intp, CFR1);
  1298. if (symbcomp < intp->symbol_rate[demod])
  1299. coarse_srate = 0;
  1300. else {
  1301. stv0900_write_reg(intp, DMDISTATE, 0x1f);
  1302. stv0900_write_reg(intp, TMGCFG2, 0xc1);
  1303. stv0900_write_reg(intp, TMGTHRISE, 0x20);
  1304. stv0900_write_reg(intp, TMGTHFALL, 0x00);
  1305. stv0900_write_reg(intp, TMGCFG, 0xd2);
  1306. stv0900_write_bits(intp, CFR_AUTOSCAN, 0);
  1307. stv0900_write_reg(intp, AGC2REF, 0x38);
  1308. if (intp->chip_id >= 0x30)
  1309. stv0900_write_reg(intp, CARFREQ, 0x79);
  1310. else if (intp->chip_id >= 0x20)
  1311. stv0900_write_reg(intp, CARFREQ, 0x49);
  1312. else
  1313. stv0900_write_reg(intp, CARFREQ, 0xed);
  1314. stv0900_write_reg(intp, SFRUP1, (symbmax >> 8) & 0x7f);
  1315. stv0900_write_reg(intp, SFRUP0, (symbmax & 0xff));
  1316. stv0900_write_reg(intp, SFRLOW1, (symbmin >> 8) & 0x7f);
  1317. stv0900_write_reg(intp, SFRLOW0, (symbmin & 0xff));
  1318. stv0900_write_reg(intp, SFRINIT1, (symb >> 8) & 0xff);
  1319. stv0900_write_reg(intp, SFRINIT0, (symb & 0xff));
  1320. stv0900_write_reg(intp, DMDT0M, 0x20);
  1321. stv0900_write_reg(intp, CFRINIT1, (coarse_freq >> 8) & 0xff);
  1322. stv0900_write_reg(intp, CFRINIT0, coarse_freq & 0xff);
  1323. stv0900_write_reg(intp, DMDISTATE, 0x15);
  1324. }
  1325. return coarse_srate;
  1326. }
  1327. static int stv0900_blind_search_algo(struct dvb_frontend *fe)
  1328. {
  1329. struct stv0900_state *state = fe->demodulator_priv;
  1330. struct stv0900_internal *intp = state->internal;
  1331. enum fe_stv0900_demod_num demod = state->demod;
  1332. u8 k_ref_tmg,
  1333. k_ref_tmg_max,
  1334. k_ref_tmg_min;
  1335. u32 coarse_srate,
  1336. agc2_th;
  1337. int lock = FALSE,
  1338. coarse_fail = FALSE;
  1339. s32 demod_timeout = 500,
  1340. fec_timeout = 50,
  1341. fail_cpt,
  1342. i,
  1343. agc2_overflow;
  1344. u16 agc2_int;
  1345. u8 dstatus2;
  1346. dprintk("%s\n", __func__);
  1347. if (intp->chip_id < 0x20) {
  1348. k_ref_tmg_max = 233;
  1349. k_ref_tmg_min = 143;
  1350. } else {
  1351. k_ref_tmg_max = 110;
  1352. k_ref_tmg_min = 10;
  1353. }
  1354. if (intp->chip_id <= 0x20)
  1355. agc2_th = STV0900_BLIND_SEARCH_AGC2_TH;
  1356. else
  1357. agc2_th = STV0900_BLIND_SEARCH_AGC2_TH_CUT30;
  1358. agc2_int = stv0900_blind_check_agc2_min_level(intp, demod);
  1359. dprintk("%s agc2_int=%d agc2_th=%d \n", __func__, agc2_int, agc2_th);
  1360. if (agc2_int > agc2_th)
  1361. return FALSE;
  1362. if (intp->chip_id == 0x10)
  1363. stv0900_write_reg(intp, CORRELEXP, 0xaa);
  1364. if (intp->chip_id < 0x20)
  1365. stv0900_write_reg(intp, CARHDR, 0x55);
  1366. else
  1367. stv0900_write_reg(intp, CARHDR, 0x20);
  1368. if (intp->chip_id <= 0x20)
  1369. stv0900_write_reg(intp, CARCFG, 0xc4);
  1370. else
  1371. stv0900_write_reg(intp, CARCFG, 0x6);
  1372. stv0900_write_reg(intp, RTCS2, 0x44);
  1373. if (intp->chip_id >= 0x20) {
  1374. stv0900_write_reg(intp, EQUALCFG, 0x41);
  1375. stv0900_write_reg(intp, FFECFG, 0x41);
  1376. stv0900_write_reg(intp, VITSCALE, 0x82);
  1377. stv0900_write_reg(intp, VAVSRVIT, 0x0);
  1378. }
  1379. k_ref_tmg = k_ref_tmg_max;
  1380. do {
  1381. stv0900_write_reg(intp, KREFTMG, k_ref_tmg);
  1382. if (stv0900_search_srate_coarse(fe) != 0) {
  1383. coarse_srate = stv0900_search_srate_fine(fe);
  1384. if (coarse_srate != 0) {
  1385. stv0900_get_lock_timeout(&demod_timeout,
  1386. &fec_timeout,
  1387. coarse_srate,
  1388. STV0900_BLIND_SEARCH);
  1389. lock = stv0900_get_demod_lock(intp,
  1390. demod,
  1391. demod_timeout);
  1392. } else
  1393. lock = FALSE;
  1394. } else {
  1395. fail_cpt = 0;
  1396. agc2_overflow = 0;
  1397. for (i = 0; i < 10; i++) {
  1398. agc2_int = (stv0900_read_reg(intp, AGC2I1) << 8)
  1399. | stv0900_read_reg(intp, AGC2I0);
  1400. if (agc2_int >= 0xff00)
  1401. agc2_overflow++;
  1402. dstatus2 = stv0900_read_reg(intp, DSTATUS2);
  1403. if (((dstatus2 & 0x1) == 0x1) &&
  1404. ((dstatus2 >> 7) == 1))
  1405. fail_cpt++;
  1406. }
  1407. if ((fail_cpt > 7) || (agc2_overflow > 7))
  1408. coarse_fail = TRUE;
  1409. lock = FALSE;
  1410. }
  1411. k_ref_tmg -= 30;
  1412. } while ((k_ref_tmg >= k_ref_tmg_min) &&
  1413. (lock == FALSE) &&
  1414. (coarse_fail == FALSE));
  1415. return lock;
  1416. }
  1417. static void stv0900_set_viterbi_acq(struct stv0900_internal *intp,
  1418. enum fe_stv0900_demod_num demod)
  1419. {
  1420. s32 vth_reg = VTH12;
  1421. dprintk("%s\n", __func__);
  1422. stv0900_write_reg(intp, vth_reg++, 0x96);
  1423. stv0900_write_reg(intp, vth_reg++, 0x64);
  1424. stv0900_write_reg(intp, vth_reg++, 0x36);
  1425. stv0900_write_reg(intp, vth_reg++, 0x23);
  1426. stv0900_write_reg(intp, vth_reg++, 0x1e);
  1427. stv0900_write_reg(intp, vth_reg++, 0x19);
  1428. }
  1429. static void stv0900_set_search_standard(struct stv0900_internal *intp,
  1430. enum fe_stv0900_demod_num demod)
  1431. {
  1432. dprintk("%s\n", __func__);
  1433. switch (intp->srch_standard[demod]) {
  1434. case STV0900_SEARCH_DVBS1:
  1435. dprintk("Search Standard = DVBS1\n");
  1436. break;
  1437. case STV0900_SEARCH_DSS:
  1438. dprintk("Search Standard = DSS\n");
  1439. break;
  1440. case STV0900_SEARCH_DVBS2:
  1441. dprintk("Search Standard = DVBS2\n");
  1442. break;
  1443. case STV0900_AUTO_SEARCH:
  1444. default:
  1445. dprintk("Search Standard = AUTO\n");
  1446. break;
  1447. }
  1448. switch (intp->srch_standard[demod]) {
  1449. case STV0900_SEARCH_DVBS1:
  1450. case STV0900_SEARCH_DSS:
  1451. stv0900_write_bits(intp, DVBS1_ENABLE, 1);
  1452. stv0900_write_bits(intp, DVBS2_ENABLE, 0);
  1453. stv0900_write_bits(intp, STOP_CLKVIT, 0);
  1454. stv0900_set_dvbs1_track_car_loop(intp,
  1455. demod,
  1456. intp->symbol_rate[demod]);
  1457. stv0900_write_reg(intp, CAR2CFG, 0x22);
  1458. stv0900_set_viterbi_acq(intp, demod);
  1459. stv0900_set_viterbi_standard(intp,
  1460. intp->srch_standard[demod],
  1461. intp->fec[demod], demod);
  1462. break;
  1463. case STV0900_SEARCH_DVBS2:
  1464. stv0900_write_bits(intp, DVBS1_ENABLE, 0);
  1465. stv0900_write_bits(intp, DVBS2_ENABLE, 1);
  1466. stv0900_write_bits(intp, STOP_CLKVIT, 1);
  1467. stv0900_write_reg(intp, ACLC, 0x1a);
  1468. stv0900_write_reg(intp, BCLC, 0x09);
  1469. if (intp->chip_id <= 0x20) /*cut 1.x and 2.0*/
  1470. stv0900_write_reg(intp, CAR2CFG, 0x26);
  1471. else
  1472. stv0900_write_reg(intp, CAR2CFG, 0x66);
  1473. if (intp->demod_mode != STV0900_SINGLE) {
  1474. if (intp->chip_id <= 0x11)
  1475. stv0900_stop_all_s2_modcod(intp, demod);
  1476. else
  1477. stv0900_activate_s2_modcod(intp, demod);
  1478. } else
  1479. stv0900_activate_s2_modcod_single(intp, demod);
  1480. stv0900_set_viterbi_tracq(intp, demod);
  1481. break;
  1482. case STV0900_AUTO_SEARCH:
  1483. default:
  1484. stv0900_write_bits(intp, DVBS1_ENABLE, 1);
  1485. stv0900_write_bits(intp, DVBS2_ENABLE, 1);
  1486. stv0900_write_bits(intp, STOP_CLKVIT, 0);
  1487. stv0900_write_reg(intp, ACLC, 0x1a);
  1488. stv0900_write_reg(intp, BCLC, 0x09);
  1489. stv0900_set_dvbs1_track_car_loop(intp,
  1490. demod,
  1491. intp->symbol_rate[demod]);
  1492. if (intp->chip_id <= 0x20) /*cut 1.x and 2.0*/
  1493. stv0900_write_reg(intp, CAR2CFG, 0x26);
  1494. else
  1495. stv0900_write_reg(intp, CAR2CFG, 0x66);
  1496. if (intp->demod_mode != STV0900_SINGLE) {
  1497. if (intp->chip_id <= 0x11)
  1498. stv0900_stop_all_s2_modcod(intp, demod);
  1499. else
  1500. stv0900_activate_s2_modcod(intp, demod);
  1501. } else
  1502. stv0900_activate_s2_modcod_single(intp, demod);
  1503. stv0900_set_viterbi_tracq(intp, demod);
  1504. stv0900_set_viterbi_standard(intp,
  1505. intp->srch_standard[demod],
  1506. intp->fec[demod], demod);
  1507. break;
  1508. }
  1509. }
  1510. enum fe_stv0900_signal_type stv0900_algo(struct dvb_frontend *fe)
  1511. {
  1512. struct stv0900_state *state = fe->demodulator_priv;
  1513. struct stv0900_internal *intp = state->internal;
  1514. enum fe_stv0900_demod_num demod = state->demod;
  1515. s32 demod_timeout = 500, fec_timeout = 50;
  1516. s32 aq_power, agc1_power, i;
  1517. int lock = FALSE, low_sr = FALSE;
  1518. enum fe_stv0900_signal_type signal_type = STV0900_NOCARRIER;
  1519. enum fe_stv0900_search_algo algo;
  1520. int no_signal = FALSE;
  1521. dprintk("%s\n", __func__);
  1522. algo = intp->srch_algo[demod];
  1523. stv0900_write_bits(intp, RST_HWARE, 1);
  1524. stv0900_write_reg(intp, DMDISTATE, 0x5c);
  1525. if (intp->chip_id >= 0x20) {
  1526. if (intp->symbol_rate[demod] > 5000000)
  1527. stv0900_write_reg(intp, CORRELABS, 0x9e);
  1528. else
  1529. stv0900_write_reg(intp, CORRELABS, 0x82);
  1530. } else
  1531. stv0900_write_reg(intp, CORRELABS, 0x88);
  1532. stv0900_get_lock_timeout(&demod_timeout, &fec_timeout,
  1533. intp->symbol_rate[demod],
  1534. intp->srch_algo[demod]);
  1535. if (intp->srch_algo[demod] == STV0900_BLIND_SEARCH) {
  1536. intp->bw[demod] = 2 * 36000000;
  1537. stv0900_write_reg(intp, TMGCFG2, 0xc0);
  1538. stv0900_write_reg(intp, CORRELMANT, 0x70);
  1539. stv0900_set_symbol_rate(intp, intp->mclk, 1000000, demod);
  1540. } else {
  1541. stv0900_write_reg(intp, DMDT0M, 0x20);
  1542. stv0900_write_reg(intp, TMGCFG, 0xd2);
  1543. if (intp->symbol_rate[demod] < 2000000)
  1544. stv0900_write_reg(intp, CORRELMANT, 0x63);
  1545. else
  1546. stv0900_write_reg(intp, CORRELMANT, 0x70);
  1547. stv0900_write_reg(intp, AGC2REF, 0x38);
  1548. intp->bw[demod] =
  1549. stv0900_carrier_width(intp->symbol_rate[demod],
  1550. intp->rolloff);
  1551. if (intp->chip_id >= 0x20) {
  1552. stv0900_write_reg(intp, KREFTMG, 0x5a);
  1553. if (intp->srch_algo[demod] == STV0900_COLD_START) {
  1554. intp->bw[demod] += 10000000;
  1555. intp->bw[demod] *= 15;
  1556. intp->bw[demod] /= 10;
  1557. } else if (intp->srch_algo[demod] == STV0900_WARM_START)
  1558. intp->bw[demod] += 10000000;
  1559. } else {
  1560. stv0900_write_reg(intp, KREFTMG, 0xc1);
  1561. intp->bw[demod] += 10000000;
  1562. intp->bw[demod] *= 15;
  1563. intp->bw[demod] /= 10;
  1564. }
  1565. stv0900_write_reg(intp, TMGCFG2, 0xc1);
  1566. stv0900_set_symbol_rate(intp, intp->mclk,
  1567. intp->symbol_rate[demod], demod);
  1568. stv0900_set_max_symbol_rate(intp, intp->mclk,
  1569. intp->symbol_rate[demod], demod);
  1570. stv0900_set_min_symbol_rate(intp, intp->mclk,
  1571. intp->symbol_rate[demod], demod);
  1572. if (intp->symbol_rate[demod] >= 10000000)
  1573. low_sr = FALSE;
  1574. else
  1575. low_sr = TRUE;
  1576. }
  1577. if (intp->tuner_type[demod] == 3)
  1578. stv0900_set_tuner_auto(intp, intp->freq[demod],
  1579. intp->bw[demod], demod);
  1580. else
  1581. stv0900_set_tuner(fe, intp->freq[demod], intp->bw[demod]);
  1582. agc1_power = MAKEWORD(stv0900_get_bits(intp, AGCIQ_VALUE1),
  1583. stv0900_get_bits(intp, AGCIQ_VALUE0));
  1584. aq_power = 0;
  1585. if (agc1_power == 0) {
  1586. for (i = 0; i < 5; i++)
  1587. aq_power += (stv0900_get_bits(intp, POWER_I) +
  1588. stv0900_get_bits(intp, POWER_Q)) / 2;
  1589. aq_power /= 5;
  1590. }
  1591. if ((agc1_power == 0) && (aq_power < IQPOWER_THRESHOLD)) {
  1592. intp->result[demod].locked = FALSE;
  1593. signal_type = STV0900_NOAGC1;
  1594. dprintk("%s: NO AGC1, POWERI, POWERQ\n", __func__);
  1595. } else {
  1596. stv0900_write_bits(intp, SPECINV_CONTROL,
  1597. intp->srch_iq_inv[demod]);
  1598. if (intp->chip_id <= 0x20) /*cut 2.0*/
  1599. stv0900_write_bits(intp, MANUALSX_ROLLOFF, 1);
  1600. else /*cut 3.0*/
  1601. stv0900_write_bits(intp, MANUALS2_ROLLOFF, 1);
  1602. stv0900_set_search_standard(intp, demod);
  1603. if (intp->srch_algo[demod] != STV0900_BLIND_SEARCH)
  1604. stv0900_start_search(intp, demod);
  1605. }
  1606. if (signal_type == STV0900_NOAGC1)
  1607. return signal_type;
  1608. if (intp->chip_id == 0x12) {
  1609. stv0900_write_bits(intp, RST_HWARE, 0);
  1610. msleep(3);
  1611. stv0900_write_bits(intp, RST_HWARE, 1);
  1612. stv0900_write_bits(intp, RST_HWARE, 0);
  1613. }
  1614. if (algo == STV0900_BLIND_SEARCH)
  1615. lock = stv0900_blind_search_algo(fe);
  1616. else if (algo == STV0900_COLD_START)
  1617. lock = stv0900_get_demod_cold_lock(fe, demod_timeout);
  1618. else if (algo == STV0900_WARM_START)
  1619. lock = stv0900_get_demod_lock(intp, demod, demod_timeout);
  1620. if ((lock == FALSE) && (algo == STV0900_COLD_START)) {
  1621. if (low_sr == FALSE) {
  1622. if (stv0900_check_timing_lock(intp, demod) == TRUE)
  1623. lock = stv0900_sw_algo(intp, demod);
  1624. }
  1625. }
  1626. if (lock == TRUE)
  1627. signal_type = stv0900_get_signal_params(fe);
  1628. if ((lock == TRUE) && (signal_type == STV0900_RANGEOK)) {
  1629. stv0900_track_optimization(fe);
  1630. if (intp->chip_id <= 0x11) {
  1631. if ((stv0900_get_standard(fe, 0) ==
  1632. STV0900_DVBS1_STANDARD) &&
  1633. (stv0900_get_standard(fe, 1) ==
  1634. STV0900_DVBS1_STANDARD)) {
  1635. msleep(20);
  1636. stv0900_write_bits(intp, RST_HWARE, 0);
  1637. } else {
  1638. stv0900_write_bits(intp, RST_HWARE, 0);
  1639. msleep(3);
  1640. stv0900_write_bits(intp, RST_HWARE, 1);
  1641. stv0900_write_bits(intp, RST_HWARE, 0);
  1642. }
  1643. } else if (intp->chip_id >= 0x20) {
  1644. stv0900_write_bits(intp, RST_HWARE, 0);
  1645. msleep(3);
  1646. stv0900_write_bits(intp, RST_HWARE, 1);
  1647. stv0900_write_bits(intp, RST_HWARE, 0);
  1648. }
  1649. if (stv0900_wait_for_lock(intp, demod,
  1650. fec_timeout, fec_timeout) == TRUE) {
  1651. lock = TRUE;
  1652. intp->result[demod].locked = TRUE;
  1653. if (intp->result[demod].standard ==
  1654. STV0900_DVBS2_STANDARD) {
  1655. stv0900_set_dvbs2_rolloff(intp, demod);
  1656. stv0900_write_bits(intp, RESET_UPKO_COUNT, 1);
  1657. stv0900_write_bits(intp, RESET_UPKO_COUNT, 0);
  1658. stv0900_write_reg(intp, ERRCTRL1, 0x67);
  1659. } else {
  1660. stv0900_write_reg(intp, ERRCTRL1, 0x75);
  1661. }
  1662. stv0900_write_reg(intp, FBERCPT4, 0);
  1663. stv0900_write_reg(intp, ERRCTRL2, 0xc1);
  1664. } else {
  1665. lock = FALSE;
  1666. signal_type = STV0900_NODATA;
  1667. no_signal = stv0900_check_signal_presence(intp, demod);
  1668. intp->result[demod].locked = FALSE;
  1669. }
  1670. }
  1671. if ((signal_type != STV0900_NODATA) || (no_signal != FALSE))
  1672. return signal_type;
  1673. if (intp->chip_id > 0x11) {
  1674. intp->result[demod].locked = FALSE;
  1675. return signal_type;
  1676. }
  1677. if ((stv0900_get_bits(intp, HEADER_MODE) == STV0900_DVBS_FOUND) &&
  1678. (intp->srch_iq_inv[demod] <= STV0900_IQ_AUTO_NORMAL_FIRST))
  1679. signal_type = stv0900_dvbs1_acq_workaround(fe);
  1680. return signal_type;
  1681. }