stv0900_sw.c 87 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847
  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. * You should have received a copy of the GNU General Public License
  22. * along with this program; if not, write to the Free Software
  23. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  24. */
  25. #include "stv0900.h"
  26. #include "stv0900_reg.h"
  27. #include "stv0900_priv.h"
  28. int stv0900_check_signal_presence(struct stv0900_internal *i_params,
  29. enum fe_stv0900_demod_num demod)
  30. {
  31. s32 carr_offset,
  32. agc2_integr,
  33. max_carrier;
  34. int no_signal;
  35. switch (demod) {
  36. case STV0900_DEMOD_1:
  37. default:
  38. carr_offset = (stv0900_read_reg(i_params, R0900_P1_CFR2) << 8)
  39. | stv0900_read_reg(i_params,
  40. R0900_P1_CFR1);
  41. carr_offset = ge2comp(carr_offset, 16);
  42. agc2_integr = (stv0900_read_reg(i_params, R0900_P1_AGC2I1) << 8)
  43. | stv0900_read_reg(i_params,
  44. R0900_P1_AGC2I0);
  45. max_carrier = i_params->dmd1_srch_range / 1000;
  46. break;
  47. case STV0900_DEMOD_2:
  48. carr_offset = (stv0900_read_reg(i_params, R0900_P2_CFR2) << 8)
  49. | stv0900_read_reg(i_params,
  50. R0900_P2_CFR1);
  51. carr_offset = ge2comp(carr_offset, 16);
  52. agc2_integr = (stv0900_read_reg(i_params, R0900_P2_AGC2I1) << 8)
  53. | stv0900_read_reg(i_params,
  54. R0900_P2_AGC2I0);
  55. max_carrier = i_params->dmd2_srch_range / 1000;
  56. break;
  57. }
  58. max_carrier += (max_carrier / 10);
  59. max_carrier = 65536 * (max_carrier / 2);
  60. max_carrier /= i_params->mclk / 1000;
  61. if (max_carrier > 0x4000)
  62. max_carrier = 0x4000;
  63. if ((agc2_integr > 0x2000)
  64. || (carr_offset > + 2*max_carrier)
  65. || (carr_offset < -2*max_carrier))
  66. no_signal = TRUE;
  67. else
  68. no_signal = FALSE;
  69. return no_signal;
  70. }
  71. static void stv0900_get_sw_loop_params(struct stv0900_internal *i_params,
  72. s32 *frequency_inc, s32 *sw_timeout,
  73. s32 *steps,
  74. enum fe_stv0900_demod_num demod)
  75. {
  76. s32 timeout, freq_inc, max_steps, srate, max_carrier;
  77. enum fe_stv0900_search_standard standard;
  78. switch (demod) {
  79. case STV0900_DEMOD_1:
  80. default:
  81. srate = i_params->dmd1_symbol_rate;
  82. max_carrier = i_params->dmd1_srch_range / 1000;
  83. max_carrier += max_carrier / 10;
  84. standard = i_params->dmd1_srch_standard;
  85. break;
  86. case STV0900_DEMOD_2:
  87. srate = i_params->dmd2_symbol_rate;
  88. max_carrier = i_params->dmd2_srch_range / 1000;
  89. max_carrier += max_carrier / 10;
  90. standard = i_params->dmd2_srch_stndrd;
  91. break;
  92. }
  93. max_carrier = 65536 * (max_carrier / 2);
  94. max_carrier /= i_params->mclk / 1000;
  95. if (max_carrier > 0x4000)
  96. max_carrier = 0x4000;
  97. freq_inc = srate;
  98. freq_inc /= i_params->mclk >> 10;
  99. freq_inc = freq_inc << 6;
  100. switch (standard) {
  101. case STV0900_SEARCH_DVBS1:
  102. case STV0900_SEARCH_DSS:
  103. freq_inc *= 3;
  104. timeout = 20;
  105. break;
  106. case STV0900_SEARCH_DVBS2:
  107. freq_inc *= 4;
  108. timeout = 25;
  109. break;
  110. case STV0900_AUTO_SEARCH:
  111. default:
  112. freq_inc *= 3;
  113. timeout = 25;
  114. break;
  115. }
  116. freq_inc /= 100;
  117. if ((freq_inc > max_carrier) || (freq_inc < 0))
  118. freq_inc = max_carrier / 2;
  119. timeout *= 27500;
  120. if (srate > 0)
  121. timeout /= srate / 1000;
  122. if ((timeout > 100) || (timeout < 0))
  123. timeout = 100;
  124. max_steps = (max_carrier / freq_inc) + 1;
  125. if ((max_steps > 100) || (max_steps < 0)) {
  126. max_steps = 100;
  127. freq_inc = max_carrier / max_steps;
  128. }
  129. *frequency_inc = freq_inc;
  130. *sw_timeout = timeout;
  131. *steps = max_steps;
  132. }
  133. static int stv0900_search_carr_sw_loop(struct stv0900_internal *i_params,
  134. s32 FreqIncr, s32 Timeout, int zigzag,
  135. s32 MaxStep, enum fe_stv0900_demod_num demod)
  136. {
  137. int no_signal,
  138. lock = FALSE;
  139. s32 stepCpt,
  140. freqOffset,
  141. max_carrier;
  142. switch (demod) {
  143. case STV0900_DEMOD_1:
  144. default:
  145. max_carrier = i_params->dmd1_srch_range / 1000;
  146. max_carrier += (max_carrier / 10);
  147. break;
  148. case STV0900_DEMOD_2:
  149. max_carrier = i_params->dmd2_srch_range / 1000;
  150. max_carrier += (max_carrier / 10);
  151. break;
  152. }
  153. max_carrier = 65536 * (max_carrier / 2);
  154. max_carrier /= i_params->mclk / 1000;
  155. if (max_carrier > 0x4000)
  156. max_carrier = 0x4000;
  157. if (zigzag == TRUE)
  158. freqOffset = 0;
  159. else
  160. freqOffset = -max_carrier + FreqIncr;
  161. stepCpt = 0;
  162. do {
  163. switch (demod) {
  164. case STV0900_DEMOD_1:
  165. default:
  166. stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1C);
  167. stv0900_write_reg(i_params, R0900_P1_CFRINIT1,
  168. (freqOffset / 256) & 0xFF);
  169. stv0900_write_reg(i_params, R0900_P1_CFRINIT0,
  170. freqOffset & 0xFF);
  171. stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x18);
  172. stv0900_write_bits(i_params, F0900_P1_ALGOSWRST, 1);
  173. if (i_params->chip_id == 0x12) {
  174. stv0900_write_bits(i_params,
  175. F0900_P1_RST_HWARE, 1);
  176. stv0900_write_bits(i_params,
  177. F0900_P1_RST_HWARE, 0);
  178. }
  179. break;
  180. case STV0900_DEMOD_2:
  181. stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1C);
  182. stv0900_write_reg(i_params, R0900_P2_CFRINIT1,
  183. (freqOffset / 256) & 0xFF);
  184. stv0900_write_reg(i_params, R0900_P2_CFRINIT0,
  185. freqOffset & 0xFF);
  186. stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x18);
  187. stv0900_write_bits(i_params, F0900_P2_ALGOSWRST, 1);
  188. if (i_params->chip_id == 0x12) {
  189. stv0900_write_bits(i_params,
  190. F0900_P2_RST_HWARE, 1);
  191. stv0900_write_bits(i_params,
  192. F0900_P2_RST_HWARE, 0);
  193. }
  194. break;
  195. }
  196. if (zigzag == TRUE) {
  197. if (freqOffset >= 0)
  198. freqOffset = -freqOffset - 2 * FreqIncr;
  199. else
  200. freqOffset = -freqOffset;
  201. } else
  202. freqOffset += + 2 * FreqIncr;
  203. stepCpt++;
  204. lock = stv0900_get_demod_lock(i_params, demod, Timeout);
  205. no_signal = stv0900_check_signal_presence(i_params, demod);
  206. } while ((lock == FALSE)
  207. && (no_signal == FALSE)
  208. && ((freqOffset - FreqIncr) < max_carrier)
  209. && ((freqOffset + FreqIncr) > -max_carrier)
  210. && (stepCpt < MaxStep));
  211. switch (demod) {
  212. case STV0900_DEMOD_1:
  213. default:
  214. stv0900_write_bits(i_params, F0900_P1_ALGOSWRST, 0);
  215. break;
  216. case STV0900_DEMOD_2:
  217. stv0900_write_bits(i_params, F0900_P2_ALGOSWRST, 0);
  218. break;
  219. }
  220. return lock;
  221. }
  222. int stv0900_sw_algo(struct stv0900_internal *i_params,
  223. enum fe_stv0900_demod_num demod)
  224. {
  225. int lock = FALSE;
  226. int no_signal,
  227. zigzag;
  228. s32 dvbs2_fly_wheel;
  229. s32 freqIncrement, softStepTimeout, trialCounter, max_steps;
  230. stv0900_get_sw_loop_params(i_params, &freqIncrement, &softStepTimeout,
  231. &max_steps, demod);
  232. switch (demod) {
  233. case STV0900_DEMOD_1:
  234. default:
  235. switch (i_params->dmd1_srch_standard) {
  236. case STV0900_SEARCH_DVBS1:
  237. case STV0900_SEARCH_DSS:
  238. if (i_params->chip_id >= 0x20)
  239. stv0900_write_reg(i_params, R0900_P1_CARFREQ,
  240. 0x3B);
  241. else
  242. stv0900_write_reg(i_params, R0900_P1_CARFREQ,
  243. 0xef);
  244. stv0900_write_reg(i_params, R0900_P1_DMDCFGMD, 0x49);
  245. zigzag = FALSE;
  246. break;
  247. case STV0900_SEARCH_DVBS2:
  248. if (i_params->chip_id >= 0x20)
  249. stv0900_write_reg(i_params, R0900_P1_CORRELABS,
  250. 0x79);
  251. else
  252. stv0900_write_reg(i_params, R0900_P1_CORRELABS,
  253. 0x68);
  254. stv0900_write_reg(i_params, R0900_P1_DMDCFGMD,
  255. 0x89);
  256. zigzag = TRUE;
  257. break;
  258. case STV0900_AUTO_SEARCH:
  259. default:
  260. if (i_params->chip_id >= 0x20) {
  261. stv0900_write_reg(i_params, R0900_P1_CARFREQ,
  262. 0x3B);
  263. stv0900_write_reg(i_params, R0900_P1_CORRELABS,
  264. 0x79);
  265. } else {
  266. stv0900_write_reg(i_params, R0900_P1_CARFREQ,
  267. 0xef);
  268. stv0900_write_reg(i_params, R0900_P1_CORRELABS,
  269. 0x68);
  270. }
  271. stv0900_write_reg(i_params, R0900_P1_DMDCFGMD,
  272. 0xc9);
  273. zigzag = FALSE;
  274. break;
  275. }
  276. trialCounter = 0;
  277. do {
  278. lock = stv0900_search_carr_sw_loop(i_params,
  279. freqIncrement,
  280. softStepTimeout,
  281. zigzag,
  282. max_steps,
  283. demod);
  284. no_signal = stv0900_check_signal_presence(i_params,
  285. demod);
  286. trialCounter++;
  287. if ((lock == TRUE)
  288. || (no_signal == TRUE)
  289. || (trialCounter == 2)) {
  290. if (i_params->chip_id >= 0x20) {
  291. stv0900_write_reg(i_params,
  292. R0900_P1_CARFREQ,
  293. 0x49);
  294. stv0900_write_reg(i_params,
  295. R0900_P1_CORRELABS,
  296. 0x9e);
  297. } else {
  298. stv0900_write_reg(i_params,
  299. R0900_P1_CARFREQ,
  300. 0xed);
  301. stv0900_write_reg(i_params,
  302. R0900_P1_CORRELABS,
  303. 0x88);
  304. }
  305. if ((lock == TRUE) && (stv0900_get_bits(i_params, F0900_P1_HEADER_MODE) == STV0900_DVBS2_FOUND)) {
  306. msleep(softStepTimeout);
  307. dvbs2_fly_wheel = stv0900_get_bits(i_params, F0900_P1_FLYWHEEL_CPT);
  308. if (dvbs2_fly_wheel < 0xd) {
  309. msleep(softStepTimeout);
  310. dvbs2_fly_wheel = stv0900_get_bits(i_params, F0900_P1_FLYWHEEL_CPT);
  311. }
  312. if (dvbs2_fly_wheel < 0xd) {
  313. lock = FALSE;
  314. if (trialCounter < 2) {
  315. if (i_params->chip_id >= 0x20)
  316. stv0900_write_reg(i_params, R0900_P1_CORRELABS, 0x79);
  317. else
  318. stv0900_write_reg(i_params, R0900_P1_CORRELABS, 0x68);
  319. stv0900_write_reg(i_params, R0900_P1_DMDCFGMD, 0x89);
  320. }
  321. }
  322. }
  323. }
  324. } while ((lock == FALSE)
  325. && (trialCounter < 2)
  326. && (no_signal == FALSE));
  327. break;
  328. case STV0900_DEMOD_2:
  329. switch (i_params->dmd2_srch_stndrd) {
  330. case STV0900_SEARCH_DVBS1:
  331. case STV0900_SEARCH_DSS:
  332. if (i_params->chip_id >= 0x20)
  333. stv0900_write_reg(i_params, R0900_P2_CARFREQ,
  334. 0x3b);
  335. else
  336. stv0900_write_reg(i_params, R0900_P2_CARFREQ,
  337. 0xef);
  338. stv0900_write_reg(i_params, R0900_P2_DMDCFGMD,
  339. 0x49);
  340. zigzag = FALSE;
  341. break;
  342. case STV0900_SEARCH_DVBS2:
  343. if (i_params->chip_id >= 0x20)
  344. stv0900_write_reg(i_params, R0900_P2_CORRELABS,
  345. 0x79);
  346. else
  347. stv0900_write_reg(i_params, R0900_P2_CORRELABS,
  348. 0x68);
  349. stv0900_write_reg(i_params, R0900_P2_DMDCFGMD, 0x89);
  350. zigzag = TRUE;
  351. break;
  352. case STV0900_AUTO_SEARCH:
  353. default:
  354. if (i_params->chip_id >= 0x20) {
  355. stv0900_write_reg(i_params, R0900_P2_CARFREQ,
  356. 0x3b);
  357. stv0900_write_reg(i_params, R0900_P2_CORRELABS,
  358. 0x79);
  359. } else {
  360. stv0900_write_reg(i_params, R0900_P2_CARFREQ,
  361. 0xef);
  362. stv0900_write_reg(i_params, R0900_P2_CORRELABS,
  363. 0x68);
  364. }
  365. stv0900_write_reg(i_params, R0900_P2_DMDCFGMD, 0xc9);
  366. zigzag = FALSE;
  367. break;
  368. }
  369. trialCounter = 0;
  370. do {
  371. lock = stv0900_search_carr_sw_loop(i_params,
  372. freqIncrement,
  373. softStepTimeout,
  374. zigzag,
  375. max_steps,
  376. demod);
  377. no_signal = stv0900_check_signal_presence(i_params,
  378. demod);
  379. trialCounter++;
  380. if ((lock == TRUE)
  381. || (no_signal == TRUE)
  382. || (trialCounter == 2)) {
  383. if (i_params->chip_id >= 0x20) {
  384. stv0900_write_reg(i_params,
  385. R0900_P2_CARFREQ,
  386. 0x49);
  387. stv0900_write_reg(i_params,
  388. R0900_P2_CORRELABS,
  389. 0x9e);
  390. } else {
  391. stv0900_write_reg(i_params,
  392. R0900_P2_CARFREQ,
  393. 0xed);
  394. stv0900_write_reg(i_params,
  395. R0900_P2_CORRELABS,
  396. 0x88);
  397. }
  398. if ((lock == TRUE) && (stv0900_get_bits(i_params, F0900_P2_HEADER_MODE) == STV0900_DVBS2_FOUND)) {
  399. msleep(softStepTimeout);
  400. dvbs2_fly_wheel = stv0900_get_bits(i_params, F0900_P2_FLYWHEEL_CPT);
  401. if (dvbs2_fly_wheel < 0xd) {
  402. msleep(softStepTimeout);
  403. dvbs2_fly_wheel = stv0900_get_bits(i_params, F0900_P2_FLYWHEEL_CPT);
  404. }
  405. if (dvbs2_fly_wheel < 0xd) {
  406. lock = FALSE;
  407. if (trialCounter < 2) {
  408. if (i_params->chip_id >= 0x20)
  409. stv0900_write_reg(i_params, R0900_P2_CORRELABS, 0x79);
  410. else
  411. stv0900_write_reg(i_params, R0900_P2_CORRELABS, 0x68);
  412. stv0900_write_reg(i_params, R0900_P2_DMDCFGMD, 0x89);
  413. }
  414. }
  415. }
  416. }
  417. } while ((lock == FALSE) && (trialCounter < 2) && (no_signal == FALSE));
  418. break;
  419. }
  420. return lock;
  421. }
  422. static u32 stv0900_get_symbol_rate(struct stv0900_internal *i_params,
  423. u32 mclk,
  424. enum fe_stv0900_demod_num demod)
  425. {
  426. s32 sfr_field3, sfr_field2, sfr_field1, sfr_field0,
  427. rem1, rem2, intval1, intval2, srate;
  428. dmd_reg(sfr_field3, F0900_P1_SYMB_FREQ3, F0900_P2_SYMB_FREQ3);
  429. dmd_reg(sfr_field2, F0900_P1_SYMB_FREQ2, F0900_P2_SYMB_FREQ2);
  430. dmd_reg(sfr_field1, F0900_P1_SYMB_FREQ1, F0900_P2_SYMB_FREQ1);
  431. dmd_reg(sfr_field0, F0900_P1_SYMB_FREQ0, F0900_P2_SYMB_FREQ0);
  432. srate = (stv0900_get_bits(i_params, sfr_field3) << 24) +
  433. (stv0900_get_bits(i_params, sfr_field2) << 16) +
  434. (stv0900_get_bits(i_params, sfr_field1) << 8) +
  435. (stv0900_get_bits(i_params, sfr_field0));
  436. dprintk("lock: srate=%d r0=0x%x r1=0x%x r2=0x%x r3=0x%x \n",
  437. srate, stv0900_get_bits(i_params, sfr_field0),
  438. stv0900_get_bits(i_params, sfr_field1),
  439. stv0900_get_bits(i_params, sfr_field2),
  440. stv0900_get_bits(i_params, sfr_field3));
  441. intval1 = (mclk) >> 16;
  442. intval2 = (srate) >> 16;
  443. rem1 = (mclk) % 0x10000;
  444. rem2 = (srate) % 0x10000;
  445. srate = (intval1 * intval2) +
  446. ((intval1 * rem2) >> 16) +
  447. ((intval2 * rem1) >> 16);
  448. return srate;
  449. }
  450. static void stv0900_set_symbol_rate(struct stv0900_internal *i_params,
  451. u32 mclk, u32 srate,
  452. enum fe_stv0900_demod_num demod)
  453. {
  454. s32 sfr_init_reg;
  455. u32 symb;
  456. dprintk(KERN_INFO "%s: Mclk %d, SR %d, Dmd %d\n", __func__, mclk,
  457. srate, demod);
  458. dmd_reg(sfr_init_reg, R0900_P1_SFRINIT1, R0900_P2_SFRINIT1);
  459. if (srate > 60000000) {
  460. symb = srate << 4;
  461. symb /= (mclk >> 12);
  462. } else if (srate > 6000000) {
  463. symb = srate << 6;
  464. symb /= (mclk >> 10);
  465. } else {
  466. symb = srate << 9;
  467. symb /= (mclk >> 7);
  468. }
  469. stv0900_write_reg(i_params, sfr_init_reg, (symb >> 8) & 0x7F);
  470. stv0900_write_reg(i_params, sfr_init_reg + 1, (symb & 0xFF));
  471. }
  472. static void stv0900_set_max_symbol_rate(struct stv0900_internal *i_params,
  473. u32 mclk, u32 srate,
  474. enum fe_stv0900_demod_num demod)
  475. {
  476. s32 sfr_max_reg;
  477. u32 symb;
  478. dmd_reg(sfr_max_reg, R0900_P1_SFRUP1, R0900_P2_SFRUP1);
  479. srate = 105 * (srate / 100);
  480. if (srate > 60000000) {
  481. symb = srate << 4;
  482. symb /= (mclk >> 12);
  483. } else if (srate > 6000000) {
  484. symb = srate << 6;
  485. symb /= (mclk >> 10);
  486. } else {
  487. symb = srate << 9;
  488. symb /= (mclk >> 7);
  489. }
  490. if (symb < 0x7fff) {
  491. stv0900_write_reg(i_params, sfr_max_reg, (symb >> 8) & 0x7F);
  492. stv0900_write_reg(i_params, sfr_max_reg + 1, (symb & 0xFF));
  493. } else {
  494. stv0900_write_reg(i_params, sfr_max_reg, 0x7F);
  495. stv0900_write_reg(i_params, sfr_max_reg + 1, 0xFF);
  496. }
  497. }
  498. static void stv0900_set_min_symbol_rate(struct stv0900_internal *i_params,
  499. u32 mclk, u32 srate,
  500. enum fe_stv0900_demod_num demod)
  501. {
  502. s32 sfr_min_reg;
  503. u32 symb;
  504. dmd_reg(sfr_min_reg, R0900_P1_SFRLOW1, R0900_P2_SFRLOW1);
  505. srate = 95 * (srate / 100);
  506. if (srate > 60000000) {
  507. symb = srate << 4;
  508. symb /= (mclk >> 12);
  509. } else if (srate > 6000000) {
  510. symb = srate << 6;
  511. symb /= (mclk >> 10);
  512. } else {
  513. symb = srate << 9;
  514. symb /= (mclk >> 7);
  515. }
  516. stv0900_write_reg(i_params, sfr_min_reg, (symb >> 8) & 0xFF);
  517. stv0900_write_reg(i_params, sfr_min_reg + 1, (symb & 0xFF));
  518. }
  519. static s32 stv0900_get_timing_offst(struct stv0900_internal *i_params,
  520. u32 srate,
  521. enum fe_stv0900_demod_num demod)
  522. {
  523. s32 tmgreg,
  524. timingoffset;
  525. dmd_reg(tmgreg, R0900_P1_TMGREG2, R0900_P2_TMGREG2);
  526. timingoffset = (stv0900_read_reg(i_params, tmgreg) << 16) +
  527. (stv0900_read_reg(i_params, tmgreg + 1) << 8) +
  528. (stv0900_read_reg(i_params, tmgreg + 2));
  529. timingoffset = ge2comp(timingoffset, 24);
  530. if (timingoffset == 0)
  531. timingoffset = 1;
  532. timingoffset = ((s32)srate * 10) / ((s32)0x1000000 / timingoffset);
  533. timingoffset /= 320;
  534. return timingoffset;
  535. }
  536. static void stv0900_set_dvbs2_rolloff(struct stv0900_internal *i_params,
  537. enum fe_stv0900_demod_num demod)
  538. {
  539. s32 rolloff, man_fld, matstr_reg, rolloff_ctl_fld;
  540. dmd_reg(man_fld, F0900_P1_MANUAL_ROLLOFF, F0900_P2_MANUAL_ROLLOFF);
  541. dmd_reg(matstr_reg, R0900_P1_MATSTR1, R0900_P2_MATSTR1);
  542. dmd_reg(rolloff_ctl_fld, F0900_P1_ROLLOFF_CONTROL,
  543. F0900_P2_ROLLOFF_CONTROL);
  544. if (i_params->chip_id == 0x10) {
  545. stv0900_write_bits(i_params, man_fld, 1);
  546. rolloff = stv0900_read_reg(i_params, matstr_reg) & 0x03;
  547. stv0900_write_bits(i_params, rolloff_ctl_fld, rolloff);
  548. } else
  549. stv0900_write_bits(i_params, man_fld, 0);
  550. }
  551. static u32 stv0900_carrier_width(u32 srate, enum fe_stv0900_rolloff ro)
  552. {
  553. u32 rolloff;
  554. switch (ro) {
  555. case STV0900_20:
  556. rolloff = 20;
  557. break;
  558. case STV0900_25:
  559. rolloff = 25;
  560. break;
  561. case STV0900_35:
  562. default:
  563. rolloff = 35;
  564. break;
  565. }
  566. return srate + (srate * rolloff) / 100;
  567. }
  568. static int stv0900_check_timing_lock(struct stv0900_internal *i_params,
  569. enum fe_stv0900_demod_num demod)
  570. {
  571. int timingLock = FALSE;
  572. s32 i,
  573. timingcpt = 0;
  574. u8 carFreq,
  575. tmgTHhigh,
  576. tmgTHLow;
  577. switch (demod) {
  578. case STV0900_DEMOD_1:
  579. default:
  580. carFreq = stv0900_read_reg(i_params, R0900_P1_CARFREQ);
  581. tmgTHhigh = stv0900_read_reg(i_params, R0900_P1_TMGTHRISE);
  582. tmgTHLow = stv0900_read_reg(i_params, R0900_P1_TMGTHFALL);
  583. stv0900_write_reg(i_params, R0900_P1_TMGTHRISE, 0x20);
  584. stv0900_write_reg(i_params, R0900_P1_TMGTHFALL, 0x0);
  585. stv0900_write_bits(i_params, F0900_P1_CFR_AUTOSCAN, 0);
  586. stv0900_write_reg(i_params, R0900_P1_RTC, 0x80);
  587. stv0900_write_reg(i_params, R0900_P1_RTCS2, 0x40);
  588. stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0x0);
  589. stv0900_write_reg(i_params, R0900_P1_CFRINIT1, 0x0);
  590. stv0900_write_reg(i_params, R0900_P1_CFRINIT0, 0x0);
  591. stv0900_write_reg(i_params, R0900_P1_AGC2REF, 0x65);
  592. stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x18);
  593. msleep(7);
  594. for (i = 0; i < 10; i++) {
  595. if (stv0900_get_bits(i_params, F0900_P1_TMGLOCK_QUALITY) >= 2)
  596. timingcpt++;
  597. msleep(1);
  598. }
  599. if (timingcpt >= 3)
  600. timingLock = TRUE;
  601. stv0900_write_reg(i_params, R0900_P1_AGC2REF, 0x38);
  602. stv0900_write_reg(i_params, R0900_P1_RTC, 0x88);
  603. stv0900_write_reg(i_params, R0900_P1_RTCS2, 0x68);
  604. stv0900_write_reg(i_params, R0900_P1_CARFREQ, carFreq);
  605. stv0900_write_reg(i_params, R0900_P1_TMGTHRISE, tmgTHhigh);
  606. stv0900_write_reg(i_params, R0900_P1_TMGTHFALL, tmgTHLow);
  607. break;
  608. case STV0900_DEMOD_2:
  609. carFreq = stv0900_read_reg(i_params, R0900_P2_CARFREQ);
  610. tmgTHhigh = stv0900_read_reg(i_params, R0900_P2_TMGTHRISE);
  611. tmgTHLow = stv0900_read_reg(i_params, R0900_P2_TMGTHFALL);
  612. stv0900_write_reg(i_params, R0900_P2_TMGTHRISE, 0x20);
  613. stv0900_write_reg(i_params, R0900_P2_TMGTHFALL, 0);
  614. stv0900_write_bits(i_params, F0900_P2_CFR_AUTOSCAN, 0);
  615. stv0900_write_reg(i_params, R0900_P2_RTC, 0x80);
  616. stv0900_write_reg(i_params, R0900_P2_RTCS2, 0x40);
  617. stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0x0);
  618. stv0900_write_reg(i_params, R0900_P2_CFRINIT1, 0x0);
  619. stv0900_write_reg(i_params, R0900_P2_CFRINIT0, 0x0);
  620. stv0900_write_reg(i_params, R0900_P2_AGC2REF, 0x65);
  621. stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x18);
  622. msleep(5);
  623. for (i = 0; i < 10; i++) {
  624. if (stv0900_get_bits(i_params, F0900_P2_TMGLOCK_QUALITY) >= 2)
  625. timingcpt++;
  626. msleep(1);
  627. }
  628. if (timingcpt >= 3)
  629. timingLock = TRUE;
  630. stv0900_write_reg(i_params, R0900_P2_AGC2REF, 0x38);
  631. stv0900_write_reg(i_params, R0900_P2_RTC, 0x88);
  632. stv0900_write_reg(i_params, R0900_P2_RTCS2, 0x68);
  633. stv0900_write_reg(i_params, R0900_P2_CARFREQ, carFreq);
  634. stv0900_write_reg(i_params, R0900_P2_TMGTHRISE, tmgTHhigh);
  635. stv0900_write_reg(i_params, R0900_P2_TMGTHFALL, tmgTHLow);
  636. break;
  637. }
  638. return timingLock;
  639. }
  640. static int stv0900_get_demod_cold_lock(struct dvb_frontend *fe,
  641. s32 demod_timeout)
  642. {
  643. struct stv0900_state *state = fe->demodulator_priv;
  644. struct stv0900_internal *i_params = state->internal;
  645. enum fe_stv0900_demod_num demod = state->demod;
  646. int lock = FALSE;
  647. s32 srate, search_range, locktimeout,
  648. currier_step, nb_steps, current_step,
  649. direction, tuner_freq, timeout;
  650. switch (demod) {
  651. case STV0900_DEMOD_1:
  652. default:
  653. srate = i_params->dmd1_symbol_rate;
  654. search_range = i_params->dmd1_srch_range;
  655. break;
  656. case STV0900_DEMOD_2:
  657. srate = i_params->dmd2_symbol_rate;
  658. search_range = i_params->dmd2_srch_range;
  659. break;
  660. }
  661. if (srate >= 10000000)
  662. locktimeout = demod_timeout / 3;
  663. else
  664. locktimeout = demod_timeout / 2;
  665. lock = stv0900_get_demod_lock(i_params, demod, locktimeout);
  666. if (lock == FALSE) {
  667. if (srate >= 10000000) {
  668. if (stv0900_check_timing_lock(i_params, demod) == TRUE) {
  669. switch (demod) {
  670. case STV0900_DEMOD_1:
  671. default:
  672. stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1f);
  673. stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x15);
  674. break;
  675. case STV0900_DEMOD_2:
  676. stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1f);
  677. stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x15);
  678. break;
  679. }
  680. lock = stv0900_get_demod_lock(i_params, demod, demod_timeout);
  681. } else
  682. lock = FALSE;
  683. } else {
  684. if (srate <= 4000000)
  685. currier_step = 1000;
  686. else if (srate <= 7000000)
  687. currier_step = 2000;
  688. else if (srate <= 10000000)
  689. currier_step = 3000;
  690. else
  691. currier_step = 5000;
  692. nb_steps = ((search_range / 1000) / currier_step);
  693. nb_steps /= 2;
  694. nb_steps = (2 * (nb_steps + 1));
  695. if (nb_steps < 0)
  696. nb_steps = 2;
  697. else if (nb_steps > 12)
  698. nb_steps = 12;
  699. current_step = 1;
  700. direction = 1;
  701. timeout = (demod_timeout / 3);
  702. if (timeout > 1000)
  703. timeout = 1000;
  704. switch (demod) {
  705. case STV0900_DEMOD_1:
  706. default:
  707. if (lock == FALSE) {
  708. tuner_freq = i_params->tuner1_freq;
  709. i_params->tuner1_bw = stv0900_carrier_width(i_params->dmd1_symbol_rate, i_params->rolloff) + i_params->dmd1_symbol_rate;
  710. while ((current_step <= nb_steps) && (lock == FALSE)) {
  711. if (direction > 0)
  712. tuner_freq += (current_step * currier_step);
  713. else
  714. tuner_freq -= (current_step * currier_step);
  715. stv0900_set_tuner(fe, tuner_freq, i_params->tuner1_bw);
  716. stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1C);
  717. if (i_params->dmd1_srch_standard == STV0900_SEARCH_DVBS2) {
  718. stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 0);
  719. stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 0);
  720. stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 1);
  721. stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 1);
  722. }
  723. stv0900_write_reg(i_params, R0900_P1_CFRINIT1, 0);
  724. stv0900_write_reg(i_params, R0900_P1_CFRINIT0, 0);
  725. stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1F);
  726. stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x15);
  727. lock = stv0900_get_demod_lock(i_params, demod, timeout);
  728. direction *= -1;
  729. current_step++;
  730. }
  731. }
  732. break;
  733. case STV0900_DEMOD_2:
  734. if (lock == FALSE) {
  735. tuner_freq = i_params->tuner2_freq;
  736. i_params->tuner2_bw = stv0900_carrier_width(srate, i_params->rolloff) + srate;
  737. while ((current_step <= nb_steps) && (lock == FALSE)) {
  738. if (direction > 0)
  739. tuner_freq += (current_step * currier_step);
  740. else
  741. tuner_freq -= (current_step * currier_step);
  742. stv0900_set_tuner(fe, tuner_freq, i_params->tuner2_bw);
  743. stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1C);
  744. if (i_params->dmd2_srch_stndrd == STV0900_SEARCH_DVBS2) {
  745. stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 0);
  746. stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 0);
  747. stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 1);
  748. stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 1);
  749. }
  750. stv0900_write_reg(i_params, R0900_P2_CFRINIT1, 0);
  751. stv0900_write_reg(i_params, R0900_P2_CFRINIT0, 0);
  752. stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1F);
  753. stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x15);
  754. lock = stv0900_get_demod_lock(i_params, demod, timeout);
  755. direction *= -1;
  756. current_step++;
  757. }
  758. }
  759. break;
  760. }
  761. }
  762. }
  763. return lock;
  764. }
  765. static void stv0900_get_lock_timeout(s32 *demod_timeout, s32 *fec_timeout,
  766. s32 srate,
  767. enum fe_stv0900_search_algo algo)
  768. {
  769. switch (algo) {
  770. case STV0900_BLIND_SEARCH:
  771. if (srate <= 1500000) {
  772. (*demod_timeout) = 1500;
  773. (*fec_timeout) = 400;
  774. } else if (srate <= 5000000) {
  775. (*demod_timeout) = 1000;
  776. (*fec_timeout) = 300;
  777. } else {
  778. (*demod_timeout) = 700;
  779. (*fec_timeout) = 100;
  780. }
  781. break;
  782. case STV0900_COLD_START:
  783. case STV0900_WARM_START:
  784. default:
  785. if (srate <= 1000000) {
  786. (*demod_timeout) = 3000;
  787. (*fec_timeout) = 1700;
  788. } else if (srate <= 2000000) {
  789. (*demod_timeout) = 2500;
  790. (*fec_timeout) = 1100;
  791. } else if (srate <= 5000000) {
  792. (*demod_timeout) = 1000;
  793. (*fec_timeout) = 550;
  794. } else if (srate <= 10000000) {
  795. (*demod_timeout) = 700;
  796. (*fec_timeout) = 250;
  797. } else if (srate <= 20000000) {
  798. (*demod_timeout) = 400;
  799. (*fec_timeout) = 130;
  800. }
  801. else {
  802. (*demod_timeout) = 300;
  803. (*fec_timeout) = 100;
  804. }
  805. break;
  806. }
  807. if (algo == STV0900_WARM_START)
  808. (*demod_timeout) /= 2;
  809. }
  810. static void stv0900_set_viterbi_tracq(struct stv0900_internal *i_params,
  811. enum fe_stv0900_demod_num demod)
  812. {
  813. s32 vth_reg;
  814. dprintk(KERN_INFO "%s\n", __func__);
  815. dmd_reg(vth_reg, R0900_P1_VTH12, R0900_P2_VTH12);
  816. stv0900_write_reg(i_params, vth_reg++, 0xd0);
  817. stv0900_write_reg(i_params, vth_reg++, 0x7d);
  818. stv0900_write_reg(i_params, vth_reg++, 0x53);
  819. stv0900_write_reg(i_params, vth_reg++, 0x2F);
  820. stv0900_write_reg(i_params, vth_reg++, 0x24);
  821. stv0900_write_reg(i_params, vth_reg++, 0x1F);
  822. }
  823. static void stv0900_set_viterbi_standard(struct stv0900_internal *i_params,
  824. enum fe_stv0900_search_standard Standard,
  825. enum fe_stv0900_fec PunctureRate,
  826. enum fe_stv0900_demod_num demod)
  827. {
  828. s32 fecmReg,
  829. prvitReg;
  830. dprintk(KERN_INFO "%s: ViterbiStandard = ", __func__);
  831. switch (demod) {
  832. case STV0900_DEMOD_1:
  833. default:
  834. fecmReg = R0900_P1_FECM;
  835. prvitReg = R0900_P1_PRVIT;
  836. break;
  837. case STV0900_DEMOD_2:
  838. fecmReg = R0900_P2_FECM;
  839. prvitReg = R0900_P2_PRVIT;
  840. break;
  841. }
  842. switch (Standard) {
  843. case STV0900_AUTO_SEARCH:
  844. dprintk("Auto\n");
  845. stv0900_write_reg(i_params, fecmReg, 0x10);
  846. stv0900_write_reg(i_params, prvitReg, 0x3F);
  847. break;
  848. case STV0900_SEARCH_DVBS1:
  849. dprintk("DVBS1\n");
  850. stv0900_write_reg(i_params, fecmReg, 0x00);
  851. switch (PunctureRate) {
  852. case STV0900_FEC_UNKNOWN:
  853. default:
  854. stv0900_write_reg(i_params, prvitReg, 0x2F);
  855. break;
  856. case STV0900_FEC_1_2:
  857. stv0900_write_reg(i_params, prvitReg, 0x01);
  858. break;
  859. case STV0900_FEC_2_3:
  860. stv0900_write_reg(i_params, prvitReg, 0x02);
  861. break;
  862. case STV0900_FEC_3_4:
  863. stv0900_write_reg(i_params, prvitReg, 0x04);
  864. break;
  865. case STV0900_FEC_5_6:
  866. stv0900_write_reg(i_params, prvitReg, 0x08);
  867. break;
  868. case STV0900_FEC_7_8:
  869. stv0900_write_reg(i_params, prvitReg, 0x20);
  870. break;
  871. }
  872. break;
  873. case STV0900_SEARCH_DSS:
  874. dprintk("DSS\n");
  875. stv0900_write_reg(i_params, fecmReg, 0x80);
  876. switch (PunctureRate) {
  877. case STV0900_FEC_UNKNOWN:
  878. default:
  879. stv0900_write_reg(i_params, prvitReg, 0x13);
  880. break;
  881. case STV0900_FEC_1_2:
  882. stv0900_write_reg(i_params, prvitReg, 0x01);
  883. break;
  884. case STV0900_FEC_2_3:
  885. stv0900_write_reg(i_params, prvitReg, 0x02);
  886. break;
  887. case STV0900_FEC_6_7:
  888. stv0900_write_reg(i_params, prvitReg, 0x10);
  889. break;
  890. }
  891. break;
  892. default:
  893. break;
  894. }
  895. }
  896. static void stv0900_track_optimization(struct dvb_frontend *fe)
  897. {
  898. struct stv0900_state *state = fe->demodulator_priv;
  899. struct stv0900_internal *i_params = state->internal;
  900. enum fe_stv0900_demod_num demod = state->demod;
  901. s32 srate, pilots, aclc, freq1, freq0,
  902. i = 0, timed, timef, blindTunSw = 0;
  903. enum fe_stv0900_rolloff rolloff;
  904. enum fe_stv0900_modcode foundModcod;
  905. dprintk(KERN_INFO "%s\n", __func__);
  906. srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod);
  907. srate += stv0900_get_timing_offst(i_params, srate, demod);
  908. switch (demod) {
  909. case STV0900_DEMOD_1:
  910. default:
  911. switch (i_params->dmd1_rslts.standard) {
  912. case STV0900_DVBS1_STANDARD:
  913. if (i_params->dmd1_srch_standard == STV0900_AUTO_SEARCH) {
  914. stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 1);
  915. stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 0);
  916. }
  917. stv0900_write_bits(i_params, F0900_P1_ROLLOFF_CONTROL, i_params->rolloff);
  918. stv0900_write_bits(i_params, F0900_P1_MANUAL_ROLLOFF, 1);
  919. stv0900_write_reg(i_params, R0900_P1_ERRCTRL1, 0x75);
  920. break;
  921. case STV0900_DSS_STANDARD:
  922. if (i_params->dmd1_srch_standard == STV0900_AUTO_SEARCH) {
  923. stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 1);
  924. stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 0);
  925. }
  926. stv0900_write_bits(i_params, F0900_P1_ROLLOFF_CONTROL, i_params->rolloff);
  927. stv0900_write_bits(i_params, F0900_P1_MANUAL_ROLLOFF, 1);
  928. stv0900_write_reg(i_params, R0900_P1_ERRCTRL1, 0x75);
  929. break;
  930. case STV0900_DVBS2_STANDARD:
  931. stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 0);
  932. stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 1);
  933. stv0900_write_reg(i_params, R0900_P1_ACLC, 0);
  934. stv0900_write_reg(i_params, R0900_P1_BCLC, 0);
  935. if (i_params->dmd1_rslts.frame_length == STV0900_LONG_FRAME) {
  936. foundModcod = stv0900_get_bits(i_params, F0900_P1_DEMOD_MODCOD);
  937. pilots = stv0900_get_bits(i_params, F0900_P1_DEMOD_TYPE) & 0x01;
  938. aclc = stv0900_get_optim_carr_loop(srate, foundModcod, pilots, i_params->chip_id);
  939. if (foundModcod <= STV0900_QPSK_910)
  940. stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, aclc);
  941. else if (foundModcod <= STV0900_8PSK_910) {
  942. stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, 0x2a);
  943. stv0900_write_reg(i_params, R0900_P1_ACLC2S28, aclc);
  944. }
  945. if ((i_params->demod_mode == STV0900_SINGLE) && (foundModcod > STV0900_8PSK_910)) {
  946. if (foundModcod <= STV0900_16APSK_910) {
  947. stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, 0x2a);
  948. stv0900_write_reg(i_params, R0900_P1_ACLC2S216A, aclc);
  949. } else if (foundModcod <= STV0900_32APSK_910) {
  950. stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, 0x2a);
  951. stv0900_write_reg(i_params, R0900_P1_ACLC2S232A, aclc);
  952. }
  953. }
  954. } else {
  955. aclc = stv0900_get_optim_short_carr_loop(srate, i_params->dmd1_rslts.modulation, i_params->chip_id);
  956. if (i_params->dmd1_rslts.modulation == STV0900_QPSK)
  957. stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, aclc);
  958. else if (i_params->dmd1_rslts.modulation == STV0900_8PSK) {
  959. stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, 0x2a);
  960. stv0900_write_reg(i_params, R0900_P1_ACLC2S28, aclc);
  961. } else if (i_params->dmd1_rslts.modulation == STV0900_16APSK) {
  962. stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, 0x2a);
  963. stv0900_write_reg(i_params, R0900_P1_ACLC2S216A, aclc);
  964. } else if (i_params->dmd1_rslts.modulation == STV0900_32APSK) {
  965. stv0900_write_reg(i_params, R0900_P1_ACLC2S2Q, 0x2a);
  966. stv0900_write_reg(i_params, R0900_P1_ACLC2S232A, aclc);
  967. }
  968. }
  969. if (i_params->chip_id <= 0x11) {
  970. if (i_params->demod_mode != STV0900_SINGLE)
  971. stv0900_activate_s2_modcode(i_params, demod);
  972. }
  973. stv0900_write_reg(i_params, R0900_P1_ERRCTRL1, 0x67);
  974. break;
  975. case STV0900_UNKNOWN_STANDARD:
  976. default:
  977. stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 1);
  978. stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 1);
  979. break;
  980. }
  981. freq1 = stv0900_read_reg(i_params, R0900_P1_CFR2);
  982. freq0 = stv0900_read_reg(i_params, R0900_P1_CFR1);
  983. rolloff = stv0900_get_bits(i_params, F0900_P1_ROLLOFF_STATUS);
  984. if (i_params->dmd1_srch_algo == STV0900_BLIND_SEARCH) {
  985. stv0900_write_reg(i_params, R0900_P1_SFRSTEP, 0x00);
  986. stv0900_write_bits(i_params, F0900_P1_SCAN_ENABLE, 0);
  987. stv0900_write_bits(i_params, F0900_P1_CFR_AUTOSCAN, 0);
  988. stv0900_write_reg(i_params, R0900_P1_TMGCFG2, 0x01);
  989. stv0900_set_symbol_rate(i_params, i_params->mclk, srate, demod);
  990. stv0900_set_max_symbol_rate(i_params, i_params->mclk, srate, demod);
  991. stv0900_set_min_symbol_rate(i_params, i_params->mclk, srate, demod);
  992. blindTunSw = 1;
  993. }
  994. if (i_params->chip_id >= 0x20) {
  995. if ((i_params->dmd1_srch_standard == STV0900_SEARCH_DVBS1) || (i_params->dmd1_srch_standard == STV0900_SEARCH_DSS) || (i_params->dmd1_srch_standard == STV0900_AUTO_SEARCH)) {
  996. stv0900_write_reg(i_params, R0900_P1_VAVSRVIT, 0x0a);
  997. stv0900_write_reg(i_params, R0900_P1_VITSCALE, 0x0);
  998. }
  999. }
  1000. if (i_params->chip_id < 0x20)
  1001. stv0900_write_reg(i_params, R0900_P1_CARHDR, 0x08);
  1002. if (i_params->chip_id == 0x10)
  1003. stv0900_write_reg(i_params, R0900_P1_CORRELEXP, 0x0A);
  1004. stv0900_write_reg(i_params, R0900_P1_AGC2REF, 0x38);
  1005. if ((i_params->chip_id >= 0x20) || (blindTunSw == 1) || (i_params->dmd1_symbol_rate < 10000000)) {
  1006. stv0900_write_reg(i_params, R0900_P1_CFRINIT1, freq1);
  1007. stv0900_write_reg(i_params, R0900_P1_CFRINIT0, freq0);
  1008. i_params->tuner1_bw = stv0900_carrier_width(srate, i_params->rolloff) + 10000000;
  1009. if ((i_params->chip_id >= 0x20) || (blindTunSw == 1)) {
  1010. if (i_params->dmd1_srch_algo != STV0900_WARM_START)
  1011. stv0900_set_bandwidth(fe, i_params->tuner1_bw);
  1012. }
  1013. if ((i_params->dmd1_srch_algo == STV0900_BLIND_SEARCH) || (i_params->dmd1_symbol_rate < 10000000))
  1014. msleep(50);
  1015. else
  1016. msleep(5);
  1017. stv0900_get_lock_timeout(&timed, &timef, srate, STV0900_WARM_START);
  1018. if (stv0900_get_demod_lock(i_params, demod, timed / 2) == FALSE) {
  1019. stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1F);
  1020. stv0900_write_reg(i_params, R0900_P1_CFRINIT1, freq1);
  1021. stv0900_write_reg(i_params, R0900_P1_CFRINIT0, freq0);
  1022. stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x18);
  1023. i = 0;
  1024. while ((stv0900_get_demod_lock(i_params, demod, timed / 2) == FALSE) && (i <= 2)) {
  1025. stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1F);
  1026. stv0900_write_reg(i_params, R0900_P1_CFRINIT1, freq1);
  1027. stv0900_write_reg(i_params, R0900_P1_CFRINIT0, freq0);
  1028. stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x18);
  1029. i++;
  1030. }
  1031. }
  1032. }
  1033. if (i_params->chip_id >= 0x20)
  1034. stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0x49);
  1035. if ((i_params->dmd1_rslts.standard == STV0900_DVBS1_STANDARD) || (i_params->dmd1_rslts.standard == STV0900_DSS_STANDARD))
  1036. stv0900_set_viterbi_tracq(i_params, demod);
  1037. break;
  1038. case STV0900_DEMOD_2:
  1039. switch (i_params->dmd2_rslts.standard) {
  1040. case STV0900_DVBS1_STANDARD:
  1041. if (i_params->dmd2_srch_stndrd == STV0900_AUTO_SEARCH) {
  1042. stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 1);
  1043. stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 0);
  1044. }
  1045. stv0900_write_bits(i_params, F0900_P2_ROLLOFF_CONTROL, i_params->rolloff);
  1046. stv0900_write_bits(i_params, F0900_P2_MANUAL_ROLLOFF, 1);
  1047. stv0900_write_reg(i_params, R0900_P2_ERRCTRL1, 0x75);
  1048. break;
  1049. case STV0900_DSS_STANDARD:
  1050. if (i_params->dmd2_srch_stndrd == STV0900_AUTO_SEARCH) {
  1051. stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 1);
  1052. stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 0);
  1053. }
  1054. stv0900_write_bits(i_params, F0900_P2_ROLLOFF_CONTROL, i_params->rolloff);
  1055. stv0900_write_bits(i_params, F0900_P2_MANUAL_ROLLOFF, 1);
  1056. stv0900_write_reg(i_params, R0900_P2_ERRCTRL1, 0x75);
  1057. break;
  1058. case STV0900_DVBS2_STANDARD:
  1059. stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 0);
  1060. stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 1);
  1061. stv0900_write_reg(i_params, R0900_P2_ACLC, 0);
  1062. stv0900_write_reg(i_params, R0900_P2_BCLC, 0);
  1063. if (i_params->dmd2_rslts.frame_length == STV0900_LONG_FRAME) {
  1064. foundModcod = stv0900_get_bits(i_params, F0900_P2_DEMOD_MODCOD);
  1065. pilots = stv0900_get_bits(i_params, F0900_P2_DEMOD_TYPE) & 0x01;
  1066. aclc = stv0900_get_optim_carr_loop(srate, foundModcod, pilots, i_params->chip_id);
  1067. if (foundModcod <= STV0900_QPSK_910)
  1068. stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, aclc);
  1069. else if (foundModcod <= STV0900_8PSK_910) {
  1070. stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, 0x2a);
  1071. stv0900_write_reg(i_params, R0900_P2_ACLC2S28, aclc);
  1072. }
  1073. if ((i_params->demod_mode == STV0900_SINGLE) && (foundModcod > STV0900_8PSK_910)) {
  1074. if (foundModcod <= STV0900_16APSK_910) {
  1075. stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, 0x2a);
  1076. stv0900_write_reg(i_params, R0900_P2_ACLC2S216A, aclc);
  1077. } else if (foundModcod <= STV0900_32APSK_910) {
  1078. stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, 0x2a);
  1079. stv0900_write_reg(i_params, R0900_P2_ACLC2S232A, aclc);
  1080. }
  1081. }
  1082. } else {
  1083. aclc = stv0900_get_optim_short_carr_loop(srate,
  1084. i_params->dmd2_rslts.modulation,
  1085. i_params->chip_id);
  1086. if (i_params->dmd2_rslts.modulation == STV0900_QPSK)
  1087. stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, aclc);
  1088. else if (i_params->dmd2_rslts.modulation == STV0900_8PSK) {
  1089. stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, 0x2a);
  1090. stv0900_write_reg(i_params, R0900_P2_ACLC2S28, aclc);
  1091. } else if (i_params->dmd2_rslts.modulation == STV0900_16APSK) {
  1092. stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, 0x2a);
  1093. stv0900_write_reg(i_params, R0900_P2_ACLC2S216A, aclc);
  1094. } else if (i_params->dmd2_rslts.modulation == STV0900_32APSK) {
  1095. stv0900_write_reg(i_params, R0900_P2_ACLC2S2Q, 0x2a);
  1096. stv0900_write_reg(i_params, R0900_P2_ACLC2S232A, aclc);
  1097. }
  1098. }
  1099. stv0900_write_reg(i_params, R0900_P2_ERRCTRL1, 0x67);
  1100. break;
  1101. case STV0900_UNKNOWN_STANDARD:
  1102. default:
  1103. stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 1);
  1104. stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 1);
  1105. break;
  1106. }
  1107. freq1 = stv0900_read_reg(i_params, R0900_P2_CFR2);
  1108. freq0 = stv0900_read_reg(i_params, R0900_P2_CFR1);
  1109. rolloff = stv0900_get_bits(i_params, F0900_P2_ROLLOFF_STATUS);
  1110. if (i_params->dmd2_srch_algo == STV0900_BLIND_SEARCH) {
  1111. stv0900_write_reg(i_params, R0900_P2_SFRSTEP, 0x00);
  1112. stv0900_write_bits(i_params, F0900_P2_SCAN_ENABLE, 0);
  1113. stv0900_write_bits(i_params, F0900_P2_CFR_AUTOSCAN, 0);
  1114. stv0900_write_reg(i_params, R0900_P2_TMGCFG2, 0x01);
  1115. stv0900_set_symbol_rate(i_params, i_params->mclk, srate, demod);
  1116. stv0900_set_max_symbol_rate(i_params, i_params->mclk, srate, demod);
  1117. stv0900_set_min_symbol_rate(i_params, i_params->mclk, srate, demod);
  1118. blindTunSw = 1;
  1119. }
  1120. if (i_params->chip_id >= 0x20) {
  1121. if ((i_params->dmd2_srch_stndrd == STV0900_SEARCH_DVBS1) || (i_params->dmd2_srch_stndrd == STV0900_SEARCH_DSS) || (i_params->dmd2_srch_stndrd == STV0900_AUTO_SEARCH)) {
  1122. stv0900_write_reg(i_params, R0900_P2_VAVSRVIT, 0x0a);
  1123. stv0900_write_reg(i_params, R0900_P2_VITSCALE, 0x0);
  1124. }
  1125. }
  1126. if (i_params->chip_id < 0x20)
  1127. stv0900_write_reg(i_params, R0900_P2_CARHDR, 0x08);
  1128. if (i_params->chip_id == 0x10)
  1129. stv0900_write_reg(i_params, R0900_P2_CORRELEXP, 0x0a);
  1130. stv0900_write_reg(i_params, R0900_P2_AGC2REF, 0x38);
  1131. if ((i_params->chip_id >= 0x20) || (blindTunSw == 1) || (i_params->dmd2_symbol_rate < 10000000)) {
  1132. stv0900_write_reg(i_params, R0900_P2_CFRINIT1, freq1);
  1133. stv0900_write_reg(i_params, R0900_P2_CFRINIT0, freq0);
  1134. i_params->tuner2_bw = stv0900_carrier_width(srate, i_params->rolloff) + 10000000;
  1135. if ((i_params->chip_id >= 0x20) || (blindTunSw == 1)) {
  1136. if (i_params->dmd2_srch_algo != STV0900_WARM_START)
  1137. stv0900_set_bandwidth(fe, i_params->tuner2_bw);
  1138. }
  1139. if ((i_params->dmd2_srch_algo == STV0900_BLIND_SEARCH) || (i_params->dmd2_symbol_rate < 10000000))
  1140. msleep(50);
  1141. else
  1142. msleep(5);
  1143. stv0900_get_lock_timeout(&timed, &timef, srate, STV0900_WARM_START);
  1144. if (stv0900_get_demod_lock(i_params, demod, timed / 2) == FALSE) {
  1145. stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1F);
  1146. stv0900_write_reg(i_params, R0900_P2_CFRINIT1, freq1);
  1147. stv0900_write_reg(i_params, R0900_P2_CFRINIT0, freq0);
  1148. stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x18);
  1149. i = 0;
  1150. while ((stv0900_get_demod_lock(i_params, demod, timed / 2) == FALSE) && (i <= 2)) {
  1151. stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1F);
  1152. stv0900_write_reg(i_params, R0900_P2_CFRINIT1, freq1);
  1153. stv0900_write_reg(i_params, R0900_P2_CFRINIT0, freq0);
  1154. stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x18);
  1155. i++;
  1156. }
  1157. }
  1158. }
  1159. if (i_params->chip_id >= 0x20)
  1160. stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0x49);
  1161. if ((i_params->dmd2_rslts.standard == STV0900_DVBS1_STANDARD) || (i_params->dmd2_rslts.standard == STV0900_DSS_STANDARD))
  1162. stv0900_set_viterbi_tracq(i_params, demod);
  1163. break;
  1164. }
  1165. }
  1166. static int stv0900_get_fec_lock(struct stv0900_internal *i_params, enum fe_stv0900_demod_num demod, s32 time_out)
  1167. {
  1168. s32 timer = 0, lock = 0, header_field, pktdelin_field, lock_vit_field;
  1169. enum fe_stv0900_search_state dmd_state;
  1170. dprintk(KERN_INFO "%s\n", __func__);
  1171. dmd_reg(header_field, F0900_P1_HEADER_MODE, F0900_P2_HEADER_MODE);
  1172. dmd_reg(pktdelin_field, F0900_P1_PKTDELIN_LOCK, F0900_P2_PKTDELIN_LOCK);
  1173. dmd_reg(lock_vit_field, F0900_P1_LOCKEDVIT, F0900_P2_LOCKEDVIT);
  1174. dmd_state = stv0900_get_bits(i_params, header_field);
  1175. while ((timer < time_out) && (lock == 0)) {
  1176. switch (dmd_state) {
  1177. case STV0900_SEARCH:
  1178. case STV0900_PLH_DETECTED:
  1179. default:
  1180. lock = 0;
  1181. break;
  1182. case STV0900_DVBS2_FOUND:
  1183. lock = stv0900_get_bits(i_params, pktdelin_field);
  1184. break;
  1185. case STV0900_DVBS_FOUND:
  1186. lock = stv0900_get_bits(i_params, lock_vit_field);
  1187. break;
  1188. }
  1189. if (lock == 0) {
  1190. msleep(10);
  1191. timer += 10;
  1192. }
  1193. }
  1194. if (lock)
  1195. dprintk("DEMOD FEC LOCK OK\n");
  1196. else
  1197. dprintk("DEMOD FEC LOCK FAIL\n");
  1198. return lock;
  1199. }
  1200. static int stv0900_wait_for_lock(struct stv0900_internal *i_params,
  1201. enum fe_stv0900_demod_num demod,
  1202. s32 dmd_timeout, s32 fec_timeout)
  1203. {
  1204. s32 timer = 0, lock = 0, str_merg_rst_fld, str_merg_lock_fld;
  1205. dprintk(KERN_INFO "%s\n", __func__);
  1206. dmd_reg(str_merg_rst_fld, F0900_P1_RST_HWARE, F0900_P2_RST_HWARE);
  1207. dmd_reg(str_merg_lock_fld, F0900_P1_TSFIFO_LINEOK, F0900_P2_TSFIFO_LINEOK);
  1208. lock = stv0900_get_demod_lock(i_params, demod, dmd_timeout);
  1209. if (lock)
  1210. lock = lock && stv0900_get_fec_lock(i_params, demod, fec_timeout);
  1211. if (lock) {
  1212. lock = 0;
  1213. dprintk(KERN_INFO "%s: Timer = %d, time_out = %d\n", __func__, timer, fec_timeout);
  1214. while ((timer < fec_timeout) && (lock == 0)) {
  1215. lock = stv0900_get_bits(i_params, str_merg_lock_fld);
  1216. msleep(1);
  1217. timer++;
  1218. }
  1219. }
  1220. if (lock)
  1221. dprintk(KERN_INFO "%s: DEMOD LOCK OK\n", __func__);
  1222. else
  1223. dprintk(KERN_INFO "%s: DEMOD LOCK FAIL\n", __func__);
  1224. if (lock)
  1225. return TRUE;
  1226. else
  1227. return FALSE;
  1228. }
  1229. enum fe_stv0900_tracking_standard stv0900_get_standard(struct dvb_frontend *fe,
  1230. enum fe_stv0900_demod_num demod)
  1231. {
  1232. struct stv0900_state *state = fe->demodulator_priv;
  1233. struct stv0900_internal *i_params = state->internal;
  1234. enum fe_stv0900_tracking_standard fnd_standard;
  1235. s32 state_field,
  1236. dss_dvb_field;
  1237. dprintk(KERN_INFO "%s\n", __func__);
  1238. dmd_reg(state_field, F0900_P1_HEADER_MODE, F0900_P2_HEADER_MODE);
  1239. dmd_reg(dss_dvb_field, F0900_P1_DSS_DVB, F0900_P2_DSS_DVB);
  1240. if (stv0900_get_bits(i_params, state_field) == 2)
  1241. fnd_standard = STV0900_DVBS2_STANDARD;
  1242. else if (stv0900_get_bits(i_params, state_field) == 3) {
  1243. if (stv0900_get_bits(i_params, dss_dvb_field) == 1)
  1244. fnd_standard = STV0900_DSS_STANDARD;
  1245. else
  1246. fnd_standard = STV0900_DVBS1_STANDARD;
  1247. } else
  1248. fnd_standard = STV0900_UNKNOWN_STANDARD;
  1249. return fnd_standard;
  1250. }
  1251. static s32 stv0900_get_carr_freq(struct stv0900_internal *i_params, u32 mclk,
  1252. enum fe_stv0900_demod_num demod)
  1253. {
  1254. s32 cfr_field2, cfr_field1, cfr_field0,
  1255. derot, rem1, rem2, intval1, intval2;
  1256. dmd_reg(cfr_field2, F0900_P1_CAR_FREQ2, F0900_P2_CAR_FREQ2);
  1257. dmd_reg(cfr_field1, F0900_P1_CAR_FREQ1, F0900_P2_CAR_FREQ1);
  1258. dmd_reg(cfr_field0, F0900_P1_CAR_FREQ0, F0900_P2_CAR_FREQ0);
  1259. derot = (stv0900_get_bits(i_params, cfr_field2) << 16) +
  1260. (stv0900_get_bits(i_params, cfr_field1) << 8) +
  1261. (stv0900_get_bits(i_params, cfr_field0));
  1262. derot = ge2comp(derot, 24);
  1263. intval1 = mclk >> 12;
  1264. intval2 = derot >> 12;
  1265. rem1 = mclk % 0x1000;
  1266. rem2 = derot % 0x1000;
  1267. derot = (intval1 * intval2) +
  1268. ((intval1 * rem2) >> 12) +
  1269. ((intval2 * rem1) >> 12);
  1270. return derot;
  1271. }
  1272. static u32 stv0900_get_tuner_freq(struct dvb_frontend *fe)
  1273. {
  1274. struct dvb_frontend_ops *frontend_ops = NULL;
  1275. struct dvb_tuner_ops *tuner_ops = NULL;
  1276. u32 frequency = 0;
  1277. if (&fe->ops)
  1278. frontend_ops = &fe->ops;
  1279. if (&frontend_ops->tuner_ops)
  1280. tuner_ops = &frontend_ops->tuner_ops;
  1281. if (tuner_ops->get_frequency) {
  1282. if ((tuner_ops->get_frequency(fe, &frequency)) < 0)
  1283. dprintk("%s: Invalid parameter\n", __func__);
  1284. else
  1285. dprintk("%s: Frequency=%d\n", __func__, frequency);
  1286. }
  1287. return frequency;
  1288. }
  1289. static enum fe_stv0900_fec stv0900_get_vit_fec(struct stv0900_internal *i_params,
  1290. enum fe_stv0900_demod_num demod)
  1291. {
  1292. s32 rate_fld, vit_curpun_fld;
  1293. enum fe_stv0900_fec prate;
  1294. dmd_reg(vit_curpun_fld, F0900_P1_VIT_CURPUN, F0900_P2_VIT_CURPUN);
  1295. rate_fld = stv0900_get_bits(i_params, vit_curpun_fld);
  1296. switch (rate_fld) {
  1297. case 13:
  1298. prate = STV0900_FEC_1_2;
  1299. break;
  1300. case 18:
  1301. prate = STV0900_FEC_2_3;
  1302. break;
  1303. case 21:
  1304. prate = STV0900_FEC_3_4;
  1305. break;
  1306. case 24:
  1307. prate = STV0900_FEC_5_6;
  1308. break;
  1309. case 25:
  1310. prate = STV0900_FEC_6_7;
  1311. break;
  1312. case 26:
  1313. prate = STV0900_FEC_7_8;
  1314. break;
  1315. default:
  1316. prate = STV0900_FEC_UNKNOWN;
  1317. break;
  1318. }
  1319. return prate;
  1320. }
  1321. static enum fe_stv0900_signal_type stv0900_get_signal_params(struct dvb_frontend *fe)
  1322. {
  1323. struct stv0900_state *state = fe->demodulator_priv;
  1324. struct stv0900_internal *i_params = state->internal;
  1325. enum fe_stv0900_demod_num demod = state->demod;
  1326. enum fe_stv0900_signal_type range = STV0900_OUTOFRANGE;
  1327. s32 offsetFreq,
  1328. srate_offset,
  1329. i = 0;
  1330. u8 timing;
  1331. msleep(5);
  1332. switch (demod) {
  1333. case STV0900_DEMOD_1:
  1334. default:
  1335. if (i_params->dmd1_srch_algo == STV0900_BLIND_SEARCH) {
  1336. timing = stv0900_read_reg(i_params, R0900_P1_TMGREG2);
  1337. i = 0;
  1338. stv0900_write_reg(i_params, R0900_P1_SFRSTEP, 0x5c);
  1339. while ((i <= 50) && (timing != 0) && (timing != 0xFF)) {
  1340. timing = stv0900_read_reg(i_params, R0900_P1_TMGREG2);
  1341. msleep(5);
  1342. i += 5;
  1343. }
  1344. }
  1345. i_params->dmd1_rslts.standard = stv0900_get_standard(fe, demod);
  1346. i_params->dmd1_rslts.frequency = stv0900_get_tuner_freq(fe);
  1347. offsetFreq = stv0900_get_carr_freq(i_params, i_params->mclk, demod) / 1000;
  1348. i_params->dmd1_rslts.frequency += offsetFreq;
  1349. i_params->dmd1_rslts.symbol_rate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod);
  1350. srate_offset = stv0900_get_timing_offst(i_params, i_params->dmd1_rslts.symbol_rate, demod);
  1351. i_params->dmd1_rslts.symbol_rate += srate_offset;
  1352. i_params->dmd1_rslts.fec = stv0900_get_vit_fec(i_params, demod);
  1353. i_params->dmd1_rslts.modcode = stv0900_get_bits(i_params, F0900_P1_DEMOD_MODCOD);
  1354. i_params->dmd1_rslts.pilot = stv0900_get_bits(i_params, F0900_P1_DEMOD_TYPE) & 0x01;
  1355. i_params->dmd1_rslts.frame_length = ((u32)stv0900_get_bits(i_params, F0900_P1_DEMOD_TYPE)) >> 1;
  1356. i_params->dmd1_rslts.rolloff = stv0900_get_bits(i_params, F0900_P1_ROLLOFF_STATUS);
  1357. switch (i_params->dmd1_rslts.standard) {
  1358. case STV0900_DVBS2_STANDARD:
  1359. i_params->dmd1_rslts.spectrum = stv0900_get_bits(i_params, F0900_P1_SPECINV_DEMOD);
  1360. if (i_params->dmd1_rslts.modcode <= STV0900_QPSK_910)
  1361. i_params->dmd1_rslts.modulation = STV0900_QPSK;
  1362. else if (i_params->dmd1_rslts.modcode <= STV0900_8PSK_910)
  1363. i_params->dmd1_rslts.modulation = STV0900_8PSK;
  1364. else if (i_params->dmd1_rslts.modcode <= STV0900_16APSK_910)
  1365. i_params->dmd1_rslts.modulation = STV0900_16APSK;
  1366. else if (i_params->dmd1_rslts.modcode <= STV0900_32APSK_910)
  1367. i_params->dmd1_rslts.modulation = STV0900_32APSK;
  1368. else
  1369. i_params->dmd1_rslts.modulation = STV0900_UNKNOWN;
  1370. break;
  1371. case STV0900_DVBS1_STANDARD:
  1372. case STV0900_DSS_STANDARD:
  1373. i_params->dmd1_rslts.spectrum = stv0900_get_bits(i_params, F0900_P1_IQINV);
  1374. i_params->dmd1_rslts.modulation = STV0900_QPSK;
  1375. break;
  1376. default:
  1377. break;
  1378. }
  1379. if ((i_params->dmd1_srch_algo == STV0900_BLIND_SEARCH) || (i_params->dmd1_symbol_rate < 10000000)) {
  1380. offsetFreq = i_params->dmd1_rslts.frequency - i_params->tuner1_freq;
  1381. i_params->tuner1_freq = stv0900_get_tuner_freq(fe);
  1382. if (ABS(offsetFreq) <= ((i_params->dmd1_srch_range / 2000) + 500))
  1383. range = STV0900_RANGEOK;
  1384. else
  1385. if (ABS(offsetFreq) <= (stv0900_carrier_width(i_params->dmd1_rslts.symbol_rate, i_params->dmd1_rslts.rolloff) / 2000))
  1386. range = STV0900_RANGEOK;
  1387. else
  1388. range = STV0900_OUTOFRANGE;
  1389. } else {
  1390. if (ABS(offsetFreq) <= ((i_params->dmd1_srch_range / 2000) + 500))
  1391. range = STV0900_RANGEOK;
  1392. else
  1393. range = STV0900_OUTOFRANGE;
  1394. }
  1395. break;
  1396. case STV0900_DEMOD_2:
  1397. if (i_params->dmd2_srch_algo == STV0900_BLIND_SEARCH) {
  1398. timing = stv0900_read_reg(i_params, R0900_P2_TMGREG2);
  1399. i = 0;
  1400. stv0900_write_reg(i_params, R0900_P2_SFRSTEP, 0x5c);
  1401. while ((i <= 50) && (timing != 0) && (timing != 0xff)) {
  1402. timing = stv0900_read_reg(i_params, R0900_P2_TMGREG2);
  1403. msleep(5);
  1404. i += 5;
  1405. }
  1406. }
  1407. i_params->dmd2_rslts.standard = stv0900_get_standard(fe, demod);
  1408. i_params->dmd2_rslts.frequency = stv0900_get_tuner_freq(fe);
  1409. offsetFreq = stv0900_get_carr_freq(i_params, i_params->mclk, demod) / 1000;
  1410. i_params->dmd2_rslts.frequency += offsetFreq;
  1411. i_params->dmd2_rslts.symbol_rate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod);
  1412. srate_offset = stv0900_get_timing_offst(i_params, i_params->dmd2_rslts.symbol_rate, demod);
  1413. i_params->dmd2_rslts.symbol_rate += srate_offset;
  1414. i_params->dmd2_rslts.fec = stv0900_get_vit_fec(i_params, demod);
  1415. i_params->dmd2_rslts.modcode = stv0900_get_bits(i_params, F0900_P2_DEMOD_MODCOD);
  1416. i_params->dmd2_rslts.pilot = stv0900_get_bits(i_params, F0900_P2_DEMOD_TYPE) & 0x01;
  1417. i_params->dmd2_rslts.frame_length = ((u32)stv0900_get_bits(i_params, F0900_P2_DEMOD_TYPE)) >> 1;
  1418. i_params->dmd2_rslts.rolloff = stv0900_get_bits(i_params, F0900_P2_ROLLOFF_STATUS);
  1419. switch (i_params->dmd2_rslts.standard) {
  1420. case STV0900_DVBS2_STANDARD:
  1421. i_params->dmd2_rslts.spectrum = stv0900_get_bits(i_params, F0900_P2_SPECINV_DEMOD);
  1422. if (i_params->dmd2_rslts.modcode <= STV0900_QPSK_910)
  1423. i_params->dmd2_rslts.modulation = STV0900_QPSK;
  1424. else if (i_params->dmd2_rslts.modcode <= STV0900_8PSK_910)
  1425. i_params->dmd2_rslts.modulation = STV0900_8PSK;
  1426. else if (i_params->dmd2_rslts.modcode <= STV0900_16APSK_910)
  1427. i_params->dmd2_rslts.modulation = STV0900_16APSK;
  1428. else if (i_params->dmd2_rslts.modcode <= STV0900_32APSK_910)
  1429. i_params->dmd2_rslts.modulation = STV0900_32APSK;
  1430. else
  1431. i_params->dmd2_rslts.modulation = STV0900_UNKNOWN;
  1432. break;
  1433. case STV0900_DVBS1_STANDARD:
  1434. case STV0900_DSS_STANDARD:
  1435. i_params->dmd2_rslts.spectrum = stv0900_get_bits(i_params, F0900_P2_IQINV);
  1436. i_params->dmd2_rslts.modulation = STV0900_QPSK;
  1437. break;
  1438. default:
  1439. break;
  1440. }
  1441. if ((i_params->dmd2_srch_algo == STV0900_BLIND_SEARCH) || (i_params->dmd2_symbol_rate < 10000000)) {
  1442. offsetFreq = i_params->dmd2_rslts.frequency - i_params->tuner2_freq;
  1443. i_params->tuner2_freq = stv0900_get_tuner_freq(fe);
  1444. if (ABS(offsetFreq) <= ((i_params->dmd2_srch_range / 2000) + 500))
  1445. range = STV0900_RANGEOK;
  1446. else
  1447. if (ABS(offsetFreq) <= (stv0900_carrier_width(i_params->dmd2_rslts.symbol_rate, i_params->dmd2_rslts.rolloff) / 2000))
  1448. range = STV0900_RANGEOK;
  1449. else
  1450. range = STV0900_OUTOFRANGE;
  1451. } else {
  1452. if (ABS(offsetFreq) <= ((i_params->dmd2_srch_range / 2000) + 500))
  1453. range = STV0900_RANGEOK;
  1454. else
  1455. range = STV0900_OUTOFRANGE;
  1456. }
  1457. break;
  1458. }
  1459. return range;
  1460. }
  1461. static enum fe_stv0900_signal_type stv0900_dvbs1_acq_workaround(struct dvb_frontend *fe)
  1462. {
  1463. struct stv0900_state *state = fe->demodulator_priv;
  1464. struct stv0900_internal *i_params = state->internal;
  1465. enum fe_stv0900_demod_num demod = state->demod;
  1466. s32 srate, demod_timeout,
  1467. fec_timeout, freq1, freq0;
  1468. enum fe_stv0900_signal_type signal_type = STV0900_NODATA;;
  1469. switch (demod) {
  1470. case STV0900_DEMOD_1:
  1471. default:
  1472. i_params->dmd1_rslts.locked = FALSE;
  1473. if (stv0900_get_bits(i_params, F0900_P1_HEADER_MODE) == STV0900_DVBS_FOUND) {
  1474. srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod);
  1475. srate += stv0900_get_timing_offst(i_params, srate, demod);
  1476. if (i_params->dmd1_srch_algo == STV0900_BLIND_SEARCH)
  1477. stv0900_set_symbol_rate(i_params, i_params->mclk, srate, demod);
  1478. stv0900_get_lock_timeout(&demod_timeout, &fec_timeout, srate, STV0900_WARM_START);
  1479. freq1 = stv0900_read_reg(i_params, R0900_P1_CFR2);
  1480. freq0 = stv0900_read_reg(i_params, R0900_P1_CFR1);
  1481. stv0900_write_bits(i_params, F0900_P1_CFR_AUTOSCAN, 0);
  1482. stv0900_write_bits(i_params, F0900_P1_SPECINV_CONTROL, STV0900_IQ_FORCE_SWAPPED);
  1483. stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1C);
  1484. stv0900_write_reg(i_params, R0900_P1_CFRINIT1, freq1);
  1485. stv0900_write_reg(i_params, R0900_P1_CFRINIT0, freq0);
  1486. stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x18);
  1487. if (stv0900_wait_for_lock(i_params, demod, demod_timeout, fec_timeout) == TRUE) {
  1488. i_params->dmd1_rslts.locked = TRUE;
  1489. signal_type = stv0900_get_signal_params(fe);
  1490. stv0900_track_optimization(fe);
  1491. } else {
  1492. stv0900_write_bits(i_params, F0900_P1_SPECINV_CONTROL, STV0900_IQ_FORCE_NORMAL);
  1493. stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1c);
  1494. stv0900_write_reg(i_params, R0900_P1_CFRINIT1, freq1);
  1495. stv0900_write_reg(i_params, R0900_P1_CFRINIT0, freq0);
  1496. stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x18);
  1497. if (stv0900_wait_for_lock(i_params, demod, demod_timeout, fec_timeout) == TRUE) {
  1498. i_params->dmd1_rslts.locked = TRUE;
  1499. signal_type = stv0900_get_signal_params(fe);
  1500. stv0900_track_optimization(fe);
  1501. }
  1502. }
  1503. } else
  1504. i_params->dmd1_rslts.locked = FALSE;
  1505. break;
  1506. case STV0900_DEMOD_2:
  1507. i_params->dmd2_rslts.locked = FALSE;
  1508. if (stv0900_get_bits(i_params, F0900_P2_HEADER_MODE) == STV0900_DVBS_FOUND) {
  1509. srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod);
  1510. srate += stv0900_get_timing_offst(i_params, srate, demod);
  1511. if (i_params->dmd2_srch_algo == STV0900_BLIND_SEARCH)
  1512. stv0900_set_symbol_rate(i_params, i_params->mclk, srate, demod);
  1513. stv0900_get_lock_timeout(&demod_timeout, &fec_timeout, srate, STV0900_WARM_START);
  1514. freq1 = stv0900_read_reg(i_params, R0900_P2_CFR2);
  1515. freq0 = stv0900_read_reg(i_params, R0900_P2_CFR1);
  1516. stv0900_write_bits(i_params, F0900_P2_CFR_AUTOSCAN, 0);
  1517. stv0900_write_bits(i_params, F0900_P2_SPECINV_CONTROL, STV0900_IQ_FORCE_SWAPPED);
  1518. stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1C);
  1519. stv0900_write_reg(i_params, R0900_P2_CFRINIT1, freq1);
  1520. stv0900_write_reg(i_params, R0900_P2_CFRINIT0, freq0);
  1521. stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x18);
  1522. if (stv0900_wait_for_lock(i_params, demod, demod_timeout, fec_timeout) == TRUE) {
  1523. i_params->dmd2_rslts.locked = TRUE;
  1524. signal_type = stv0900_get_signal_params(fe);
  1525. stv0900_track_optimization(fe);
  1526. } else {
  1527. stv0900_write_bits(i_params, F0900_P2_SPECINV_CONTROL, STV0900_IQ_FORCE_NORMAL);
  1528. stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1c);
  1529. stv0900_write_reg(i_params, R0900_P2_CFRINIT1, freq1);
  1530. stv0900_write_reg(i_params, R0900_P2_CFRINIT0, freq0);
  1531. stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x18);
  1532. if (stv0900_wait_for_lock(i_params, demod, demod_timeout, fec_timeout) == TRUE) {
  1533. i_params->dmd2_rslts.locked = TRUE;
  1534. signal_type = stv0900_get_signal_params(fe);
  1535. stv0900_track_optimization(fe);
  1536. }
  1537. }
  1538. } else
  1539. i_params->dmd1_rslts.locked = FALSE;
  1540. break;
  1541. }
  1542. return signal_type;
  1543. }
  1544. static u16 stv0900_blind_check_agc2_min_level(struct stv0900_internal *i_params,
  1545. enum fe_stv0900_demod_num demod)
  1546. {
  1547. u32 minagc2level = 0xffff,
  1548. agc2level,
  1549. init_freq, freq_step;
  1550. s32 i, j, nb_steps, direction;
  1551. dprintk(KERN_INFO "%s\n", __func__);
  1552. switch (demod) {
  1553. case STV0900_DEMOD_1:
  1554. default:
  1555. stv0900_write_reg(i_params, R0900_P1_AGC2REF, 0x38);
  1556. stv0900_write_bits(i_params, F0900_P1_SCAN_ENABLE, 1);
  1557. stv0900_write_bits(i_params, F0900_P1_CFR_AUTOSCAN, 1);
  1558. stv0900_write_reg(i_params, R0900_P1_SFRUP1, 0x83);
  1559. stv0900_write_reg(i_params, R0900_P1_SFRUP0, 0xc0);
  1560. stv0900_write_reg(i_params, R0900_P1_SFRLOW1, 0x82);
  1561. stv0900_write_reg(i_params, R0900_P1_SFRLOW0, 0xa0);
  1562. stv0900_write_reg(i_params, R0900_P1_DMDT0M, 0x0);
  1563. stv0900_set_symbol_rate(i_params, i_params->mclk, 1000000, demod);
  1564. nb_steps = -1 + (i_params->dmd1_srch_range / 1000000);
  1565. nb_steps /= 2;
  1566. nb_steps = (2 * nb_steps) + 1;
  1567. if (nb_steps < 0)
  1568. nb_steps = 1;
  1569. direction = 1;
  1570. freq_step = (1000000 << 8) / (i_params->mclk >> 8);
  1571. init_freq = 0;
  1572. for (i = 0; i < nb_steps; i++) {
  1573. if (direction > 0)
  1574. init_freq = init_freq + (freq_step * i);
  1575. else
  1576. init_freq = init_freq - (freq_step * i);
  1577. direction *= -1;
  1578. stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x5C);
  1579. stv0900_write_reg(i_params, R0900_P1_CFRINIT1, (init_freq >> 8) & 0xff);
  1580. stv0900_write_reg(i_params, R0900_P1_CFRINIT0, init_freq & 0xff);
  1581. stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x58);
  1582. msleep(10);
  1583. agc2level = 0;
  1584. for (j = 0; j < 10; j++)
  1585. agc2level += (stv0900_read_reg(i_params, R0900_P1_AGC2I1) << 8)
  1586. | stv0900_read_reg(i_params, R0900_P1_AGC2I0);
  1587. agc2level /= 10;
  1588. if (agc2level < minagc2level)
  1589. minagc2level = agc2level;
  1590. }
  1591. break;
  1592. case STV0900_DEMOD_2:
  1593. stv0900_write_reg(i_params, R0900_P2_AGC2REF, 0x38);
  1594. stv0900_write_bits(i_params, F0900_P2_SCAN_ENABLE, 1);
  1595. stv0900_write_bits(i_params, F0900_P2_CFR_AUTOSCAN, 1);
  1596. stv0900_write_reg(i_params, R0900_P2_SFRUP1, 0x83);
  1597. stv0900_write_reg(i_params, R0900_P2_SFRUP0, 0xc0);
  1598. stv0900_write_reg(i_params, R0900_P2_SFRLOW1, 0x82);
  1599. stv0900_write_reg(i_params, R0900_P2_SFRLOW0, 0xa0);
  1600. stv0900_write_reg(i_params, R0900_P2_DMDT0M, 0x0);
  1601. stv0900_set_symbol_rate(i_params, i_params->mclk, 1000000, demod);
  1602. nb_steps = -1 + (i_params->dmd2_srch_range / 1000000);
  1603. nb_steps /= 2;
  1604. nb_steps = (2 * nb_steps) + 1;
  1605. if (nb_steps < 0)
  1606. nb_steps = 1;
  1607. direction = 1;
  1608. freq_step = (1000000 << 8) / (i_params->mclk >> 8);
  1609. init_freq = 0;
  1610. for (i = 0; i < nb_steps; i++) {
  1611. if (direction > 0)
  1612. init_freq = init_freq + (freq_step * i);
  1613. else
  1614. init_freq = init_freq - (freq_step * i);
  1615. direction *= -1;
  1616. stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x5C);
  1617. stv0900_write_reg(i_params, R0900_P2_CFRINIT1, (init_freq >> 8) & 0xff);
  1618. stv0900_write_reg(i_params, R0900_P2_CFRINIT0, init_freq & 0xff);
  1619. stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x58);
  1620. msleep(10);
  1621. agc2level = 0;
  1622. for (j = 0; j < 10; j++)
  1623. agc2level += (stv0900_read_reg(i_params, R0900_P2_AGC2I1) << 8)
  1624. | stv0900_read_reg(i_params, R0900_P2_AGC2I0);
  1625. agc2level /= 10;
  1626. if (agc2level < minagc2level)
  1627. minagc2level = agc2level;
  1628. }
  1629. break;
  1630. }
  1631. return (u16)minagc2level;
  1632. }
  1633. static u32 stv0900_search_srate_coarse(struct dvb_frontend *fe)
  1634. {
  1635. struct stv0900_state *state = fe->demodulator_priv;
  1636. struct stv0900_internal *i_params = state->internal;
  1637. enum fe_stv0900_demod_num demod = state->demod;
  1638. int timingLock = FALSE;
  1639. s32 i, timingcpt = 0,
  1640. direction = 1,
  1641. nb_steps,
  1642. current_step = 0,
  1643. tuner_freq;
  1644. u32 coarse_srate = 0, agc2_integr = 0, currier_step = 1200;
  1645. switch (demod) {
  1646. case STV0900_DEMOD_1:
  1647. default:
  1648. stv0900_write_bits(i_params, F0900_P1_I2C_DEMOD_MODE, 0x1F);
  1649. stv0900_write_reg(i_params, R0900_P1_TMGCFG, 0x12);
  1650. stv0900_write_reg(i_params, R0900_P1_TMGTHRISE, 0xf0);
  1651. stv0900_write_reg(i_params, R0900_P1_TMGTHFALL, 0xe0);
  1652. stv0900_write_bits(i_params, F0900_P1_SCAN_ENABLE, 1);
  1653. stv0900_write_bits(i_params, F0900_P1_CFR_AUTOSCAN, 1);
  1654. stv0900_write_reg(i_params, R0900_P1_SFRUP1, 0x83);
  1655. stv0900_write_reg(i_params, R0900_P1_SFRUP0, 0xc0);
  1656. stv0900_write_reg(i_params, R0900_P1_SFRLOW1, 0x82);
  1657. stv0900_write_reg(i_params, R0900_P1_SFRLOW0, 0xa0);
  1658. stv0900_write_reg(i_params, R0900_P1_DMDT0M, 0x0);
  1659. stv0900_write_reg(i_params, R0900_P1_AGC2REF, 0x50);
  1660. if (i_params->chip_id >= 0x20) {
  1661. stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0x6a);
  1662. stv0900_write_reg(i_params, R0900_P1_SFRSTEP, 0x95);
  1663. } else {
  1664. stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0xed);
  1665. stv0900_write_reg(i_params, R0900_P1_SFRSTEP, 0x73);
  1666. }
  1667. if (i_params->dmd1_symbol_rate <= 2000000)
  1668. currier_step = 1000;
  1669. else if (i_params->dmd1_symbol_rate <= 5000000)
  1670. currier_step = 2000;
  1671. else if (i_params->dmd1_symbol_rate <= 12000000)
  1672. currier_step = 3000;
  1673. else
  1674. currier_step = 5000;
  1675. nb_steps = -1 + ((i_params->dmd1_srch_range / 1000) / currier_step);
  1676. nb_steps /= 2;
  1677. nb_steps = (2 * nb_steps) + 1;
  1678. if (nb_steps < 0)
  1679. nb_steps = 1;
  1680. else if (nb_steps > 10) {
  1681. nb_steps = 11;
  1682. currier_step = (i_params->dmd1_srch_range / 1000) / 10;
  1683. }
  1684. current_step = 0;
  1685. direction = 1;
  1686. tuner_freq = i_params->tuner1_freq;
  1687. while ((timingLock == FALSE) && (current_step < nb_steps)) {
  1688. stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x5F);
  1689. stv0900_write_bits(i_params, F0900_P1_I2C_DEMOD_MODE, 0x0);
  1690. msleep(50);
  1691. for (i = 0; i < 10; i++) {
  1692. if (stv0900_get_bits(i_params, F0900_P1_TMGLOCK_QUALITY) >= 2)
  1693. timingcpt++;
  1694. agc2_integr += (stv0900_read_reg(i_params, R0900_P1_AGC2I1) << 8) | stv0900_read_reg(i_params, R0900_P1_AGC2I0);
  1695. }
  1696. agc2_integr /= 10;
  1697. coarse_srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod);
  1698. current_step++;
  1699. direction *= -1;
  1700. dprintk("lock: I2C_DEMOD_MODE_FIELD =0. Search started. tuner freq=%d agc2=0x%x srate_coarse=%d tmg_cpt=%d\n", tuner_freq, agc2_integr, coarse_srate, timingcpt);
  1701. if ((timingcpt >= 5) && (agc2_integr < 0x1F00) && (coarse_srate < 55000000) && (coarse_srate > 850000)) {
  1702. timingLock = TRUE;
  1703. }
  1704. else if (current_step < nb_steps) {
  1705. if (direction > 0)
  1706. tuner_freq += (current_step * currier_step);
  1707. else
  1708. tuner_freq -= (current_step * currier_step);
  1709. stv0900_set_tuner(fe, tuner_freq, i_params->tuner1_bw);
  1710. }
  1711. }
  1712. if (timingLock == FALSE)
  1713. coarse_srate = 0;
  1714. else
  1715. coarse_srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod);
  1716. break;
  1717. case STV0900_DEMOD_2:
  1718. stv0900_write_bits(i_params, F0900_P2_I2C_DEMOD_MODE, 0x1F);
  1719. stv0900_write_reg(i_params, R0900_P2_TMGCFG, 0x12);
  1720. stv0900_write_reg(i_params, R0900_P2_TMGTHRISE, 0xf0);
  1721. stv0900_write_reg(i_params, R0900_P2_TMGTHFALL, 0xe0);
  1722. stv0900_write_bits(i_params, F0900_P2_SCAN_ENABLE, 1);
  1723. stv0900_write_bits(i_params, F0900_P2_CFR_AUTOSCAN, 1);
  1724. stv0900_write_reg(i_params, R0900_P2_SFRUP1, 0x83);
  1725. stv0900_write_reg(i_params, R0900_P2_SFRUP0, 0xc0);
  1726. stv0900_write_reg(i_params, R0900_P2_SFRLOW1, 0x82);
  1727. stv0900_write_reg(i_params, R0900_P2_SFRLOW0, 0xa0);
  1728. stv0900_write_reg(i_params, R0900_P2_DMDT0M, 0x0);
  1729. stv0900_write_reg(i_params, R0900_P2_AGC2REF, 0x50);
  1730. if (i_params->chip_id >= 0x20) {
  1731. stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0x6a);
  1732. stv0900_write_reg(i_params, R0900_P2_SFRSTEP, 0x95);
  1733. } else {
  1734. stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0xed);
  1735. stv0900_write_reg(i_params, R0900_P2_SFRSTEP, 0x73);
  1736. }
  1737. if (i_params->dmd2_symbol_rate <= 2000000)
  1738. currier_step = 1000;
  1739. else if (i_params->dmd2_symbol_rate <= 5000000)
  1740. currier_step = 2000;
  1741. else if (i_params->dmd2_symbol_rate <= 12000000)
  1742. currier_step = 3000;
  1743. else
  1744. currier_step = 5000;
  1745. nb_steps = -1 + ((i_params->dmd2_srch_range / 1000) / currier_step);
  1746. nb_steps /= 2;
  1747. nb_steps = (2 * nb_steps) + 1;
  1748. if (nb_steps < 0)
  1749. nb_steps = 1;
  1750. else if (nb_steps > 10) {
  1751. nb_steps = 11;
  1752. currier_step = (i_params->dmd2_srch_range / 1000) / 10;
  1753. }
  1754. current_step = 0;
  1755. direction = 1;
  1756. tuner_freq = i_params->tuner2_freq;
  1757. while ((timingLock == FALSE) && (current_step < nb_steps)) {
  1758. stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x5F);
  1759. stv0900_write_bits(i_params, F0900_P2_I2C_DEMOD_MODE, 0x0);
  1760. msleep(50);
  1761. timingcpt = 0;
  1762. for (i = 0; i < 20; i++) {
  1763. if (stv0900_get_bits(i_params, F0900_P2_TMGLOCK_QUALITY) >= 2)
  1764. timingcpt++;
  1765. agc2_integr += (stv0900_read_reg(i_params, R0900_P2_AGC2I1) << 8)
  1766. | stv0900_read_reg(i_params, R0900_P2_AGC2I0);
  1767. }
  1768. agc2_integr /= 20;
  1769. coarse_srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod);
  1770. if ((timingcpt >= 10) && (agc2_integr < 0x1F00) && (coarse_srate < 55000000) && (coarse_srate > 850000))
  1771. timingLock = TRUE;
  1772. else {
  1773. current_step++;
  1774. direction *= -1;
  1775. if (direction > 0)
  1776. tuner_freq += (current_step * currier_step);
  1777. else
  1778. tuner_freq -= (current_step * currier_step);
  1779. stv0900_set_tuner(fe, tuner_freq, i_params->tuner2_bw);
  1780. }
  1781. }
  1782. if (timingLock == FALSE)
  1783. coarse_srate = 0;
  1784. else
  1785. coarse_srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod);
  1786. break;
  1787. }
  1788. return coarse_srate;
  1789. }
  1790. static u32 stv0900_search_srate_fine(struct dvb_frontend *fe)
  1791. {
  1792. struct stv0900_state *state = fe->demodulator_priv;
  1793. struct stv0900_internal *i_params = state->internal;
  1794. enum fe_stv0900_demod_num demod = state->demod;
  1795. u32 coarse_srate,
  1796. coarse_freq,
  1797. symb;
  1798. coarse_srate = stv0900_get_symbol_rate(i_params, i_params->mclk, demod);
  1799. switch (demod) {
  1800. case STV0900_DEMOD_1:
  1801. default:
  1802. coarse_freq = (stv0900_read_reg(i_params, R0900_P1_CFR2) << 8)
  1803. | stv0900_read_reg(i_params, R0900_P1_CFR1);
  1804. symb = 13 * (coarse_srate / 10);
  1805. if (symb < i_params->dmd1_symbol_rate)
  1806. coarse_srate = 0;
  1807. else {
  1808. stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x1F);
  1809. stv0900_write_reg(i_params, R0900_P1_TMGCFG2, 0x01);
  1810. stv0900_write_reg(i_params, R0900_P1_TMGTHRISE, 0x20);
  1811. stv0900_write_reg(i_params, R0900_P1_TMGTHFALL, 0x00);
  1812. stv0900_write_reg(i_params, R0900_P1_TMGCFG, 0xd2);
  1813. stv0900_write_bits(i_params, F0900_P1_CFR_AUTOSCAN, 0);
  1814. if (i_params->chip_id >= 0x20)
  1815. stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0x49);
  1816. else
  1817. stv0900_write_reg(i_params, R0900_P1_CARFREQ, 0xed);
  1818. if (coarse_srate > 3000000) {
  1819. symb = 13 * (coarse_srate / 10);
  1820. symb = (symb / 1000) * 65536;
  1821. symb /= (i_params->mclk / 1000);
  1822. stv0900_write_reg(i_params, R0900_P1_SFRUP1, (symb >> 8) & 0x7F);
  1823. stv0900_write_reg(i_params, R0900_P1_SFRUP0, (symb & 0xFF));
  1824. symb = 10 * (coarse_srate / 13);
  1825. symb = (symb / 1000) * 65536;
  1826. symb /= (i_params->mclk / 1000);
  1827. stv0900_write_reg(i_params, R0900_P1_SFRLOW1, (symb >> 8) & 0x7F);
  1828. stv0900_write_reg(i_params, R0900_P1_SFRLOW0, (symb & 0xFF));
  1829. symb = (coarse_srate / 1000) * 65536;
  1830. symb /= (i_params->mclk / 1000);
  1831. stv0900_write_reg(i_params, R0900_P1_SFRINIT1, (symb >> 8) & 0xFF);
  1832. stv0900_write_reg(i_params, R0900_P1_SFRINIT0, (symb & 0xFF));
  1833. } else {
  1834. symb = 13 * (coarse_srate / 10);
  1835. symb = (symb / 100) * 65536;
  1836. symb /= (i_params->mclk / 100);
  1837. stv0900_write_reg(i_params, R0900_P1_SFRUP1, (symb >> 8) & 0x7F);
  1838. stv0900_write_reg(i_params, R0900_P1_SFRUP0, (symb & 0xFF));
  1839. symb = 10 * (coarse_srate / 14);
  1840. symb = (symb / 100) * 65536;
  1841. symb /= (i_params->mclk / 100);
  1842. stv0900_write_reg(i_params, R0900_P1_SFRLOW1, (symb >> 8) & 0x7F);
  1843. stv0900_write_reg(i_params, R0900_P1_SFRLOW0, (symb & 0xFF));
  1844. symb = (coarse_srate / 100) * 65536;
  1845. symb /= (i_params->mclk / 100);
  1846. stv0900_write_reg(i_params, R0900_P1_SFRINIT1, (symb >> 8) & 0xFF);
  1847. stv0900_write_reg(i_params, R0900_P1_SFRINIT0, (symb & 0xFF));
  1848. }
  1849. stv0900_write_reg(i_params, R0900_P1_DMDT0M, 0x20);
  1850. stv0900_write_reg(i_params, R0900_P1_CFRINIT1, (coarse_freq >> 8) & 0xff);
  1851. stv0900_write_reg(i_params, R0900_P1_CFRINIT0, coarse_freq & 0xff);
  1852. stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x15);
  1853. }
  1854. break;
  1855. case STV0900_DEMOD_2:
  1856. coarse_freq = (stv0900_read_reg(i_params, R0900_P2_CFR2) << 8)
  1857. | stv0900_read_reg(i_params, R0900_P2_CFR1);
  1858. symb = 13 * (coarse_srate / 10);
  1859. if (symb < i_params->dmd2_symbol_rate)
  1860. coarse_srate = 0;
  1861. else {
  1862. stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x1F);
  1863. stv0900_write_reg(i_params, R0900_P2_TMGCFG2, 0x01);
  1864. stv0900_write_reg(i_params, R0900_P2_TMGTHRISE, 0x20);
  1865. stv0900_write_reg(i_params, R0900_P2_TMGTHFALL, 0x00);
  1866. stv0900_write_reg(i_params, R0900_P2_TMGCFG, 0xd2);
  1867. stv0900_write_bits(i_params, F0900_P2_CFR_AUTOSCAN, 0);
  1868. if (i_params->chip_id >= 0x20)
  1869. stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0x49);
  1870. else
  1871. stv0900_write_reg(i_params, R0900_P2_CARFREQ, 0xed);
  1872. if (coarse_srate > 3000000) {
  1873. symb = 13 * (coarse_srate / 10);
  1874. symb = (symb / 1000) * 65536;
  1875. symb /= (i_params->mclk / 1000);
  1876. stv0900_write_reg(i_params, R0900_P2_SFRUP1, (symb >> 8) & 0x7F);
  1877. stv0900_write_reg(i_params, R0900_P2_SFRUP0, (symb & 0xFF));
  1878. symb = 10 * (coarse_srate / 13);
  1879. symb = (symb / 1000) * 65536;
  1880. symb /= (i_params->mclk / 1000);
  1881. stv0900_write_reg(i_params, R0900_P2_SFRLOW1, (symb >> 8) & 0x7F);
  1882. stv0900_write_reg(i_params, R0900_P2_SFRLOW0, (symb & 0xFF));
  1883. symb = (coarse_srate / 1000) * 65536;
  1884. symb /= (i_params->mclk / 1000);
  1885. stv0900_write_reg(i_params, R0900_P2_SFRINIT1, (symb >> 8) & 0xFF);
  1886. stv0900_write_reg(i_params, R0900_P2_SFRINIT0, (symb & 0xFF));
  1887. } else {
  1888. symb = 13 * (coarse_srate / 10);
  1889. symb = (symb / 100) * 65536;
  1890. symb /= (i_params->mclk / 100);
  1891. stv0900_write_reg(i_params, R0900_P2_SFRUP1, (symb >> 8) & 0x7F);
  1892. stv0900_write_reg(i_params, R0900_P2_SFRUP0, (symb & 0xFF));
  1893. symb = 10 * (coarse_srate / 14);
  1894. symb = (symb / 100) * 65536;
  1895. symb /= (i_params->mclk / 100);
  1896. stv0900_write_reg(i_params, R0900_P2_SFRLOW1, (symb >> 8) & 0x7F);
  1897. stv0900_write_reg(i_params, R0900_P2_SFRLOW0, (symb & 0xFF));
  1898. symb = (coarse_srate / 100) * 65536;
  1899. symb /= (i_params->mclk / 100);
  1900. stv0900_write_reg(i_params, R0900_P2_SFRINIT1, (symb >> 8) & 0xFF);
  1901. stv0900_write_reg(i_params, R0900_P2_SFRINIT0, (symb & 0xFF));
  1902. }
  1903. stv0900_write_reg(i_params, R0900_P2_DMDT0M, 0x20);
  1904. stv0900_write_reg(i_params, R0900_P2_CFRINIT1, (coarse_freq >> 8) & 0xff);
  1905. stv0900_write_reg(i_params, R0900_P2_CFRINIT0, coarse_freq & 0xff);
  1906. stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x15);
  1907. }
  1908. break;
  1909. }
  1910. return coarse_srate;
  1911. }
  1912. static int stv0900_blind_search_algo(struct dvb_frontend *fe)
  1913. {
  1914. struct stv0900_state *state = fe->demodulator_priv;
  1915. struct stv0900_internal *i_params = state->internal;
  1916. enum fe_stv0900_demod_num demod = state->demod;
  1917. u8 k_ref_tmg, k_ref_tmg_max, k_ref_tmg_min;
  1918. u32 coarse_srate;
  1919. int lock = FALSE, coarse_fail = FALSE;
  1920. s32 demod_timeout = 500, fec_timeout = 50, kref_tmg_reg, fail_cpt, i, agc2_overflow;
  1921. u16 agc2_integr;
  1922. u8 dstatus2;
  1923. dprintk(KERN_INFO "%s\n", __func__);
  1924. if (i_params->chip_id < 0x20) {
  1925. k_ref_tmg_max = 233;
  1926. k_ref_tmg_min = 143;
  1927. } else {
  1928. k_ref_tmg_max = 120;
  1929. k_ref_tmg_min = 30;
  1930. }
  1931. agc2_integr = stv0900_blind_check_agc2_min_level(i_params, demod);
  1932. if (agc2_integr > STV0900_BLIND_SEARCH_AGC2_TH) {
  1933. lock = FALSE;
  1934. } else {
  1935. switch (demod) {
  1936. case STV0900_DEMOD_1:
  1937. default:
  1938. if (i_params->chip_id == 0x10)
  1939. stv0900_write_reg(i_params, R0900_P1_CORRELEXP, 0xAA);
  1940. if (i_params->chip_id < 0x20)
  1941. stv0900_write_reg(i_params, R0900_P1_CARHDR, 0x55);
  1942. stv0900_write_reg(i_params, R0900_P1_CARCFG, 0xC4);
  1943. stv0900_write_reg(i_params, R0900_P1_RTCS2, 0x44);
  1944. if (i_params->chip_id >= 0x20) {
  1945. stv0900_write_reg(i_params, R0900_P1_EQUALCFG, 0x41);
  1946. stv0900_write_reg(i_params, R0900_P1_FFECFG, 0x41);
  1947. stv0900_write_reg(i_params, R0900_P1_VITSCALE, 0x82);
  1948. stv0900_write_reg(i_params, R0900_P1_VAVSRVIT, 0x0);
  1949. }
  1950. kref_tmg_reg = R0900_P1_KREFTMG;
  1951. break;
  1952. case STV0900_DEMOD_2:
  1953. if (i_params->chip_id == 0x10)
  1954. stv0900_write_reg(i_params, R0900_P2_CORRELEXP, 0xAA);
  1955. if (i_params->chip_id < 0x20)
  1956. stv0900_write_reg(i_params, R0900_P2_CARHDR, 0x55);
  1957. stv0900_write_reg(i_params, R0900_P2_CARCFG, 0xC4);
  1958. stv0900_write_reg(i_params, R0900_P2_RTCS2, 0x44);
  1959. if (i_params->chip_id >= 0x20) {
  1960. stv0900_write_reg(i_params, R0900_P2_EQUALCFG, 0x41);
  1961. stv0900_write_reg(i_params, R0900_P2_FFECFG, 0x41);
  1962. stv0900_write_reg(i_params, R0900_P2_VITSCALE, 0x82);
  1963. stv0900_write_reg(i_params, R0900_P2_VAVSRVIT, 0x0);
  1964. }
  1965. kref_tmg_reg = R0900_P2_KREFTMG;
  1966. break;
  1967. }
  1968. k_ref_tmg = k_ref_tmg_max;
  1969. do {
  1970. stv0900_write_reg(i_params, kref_tmg_reg, k_ref_tmg);
  1971. if (stv0900_search_srate_coarse(fe) != 0) {
  1972. coarse_srate = stv0900_search_srate_fine(fe);
  1973. if (coarse_srate != 0) {
  1974. stv0900_get_lock_timeout(&demod_timeout, &fec_timeout, coarse_srate, STV0900_BLIND_SEARCH);
  1975. lock = stv0900_get_demod_lock(i_params, demod, demod_timeout);
  1976. } else
  1977. lock = FALSE;
  1978. } else {
  1979. fail_cpt = 0;
  1980. agc2_overflow = 0;
  1981. switch (demod) {
  1982. case STV0900_DEMOD_1:
  1983. default:
  1984. for (i = 0; i < 10; i++) {
  1985. agc2_integr = (stv0900_read_reg(i_params, R0900_P1_AGC2I1) << 8)
  1986. | stv0900_read_reg(i_params, R0900_P1_AGC2I0);
  1987. if (agc2_integr >= 0xff00)
  1988. agc2_overflow++;
  1989. dstatus2 = stv0900_read_reg(i_params, R0900_P1_DSTATUS2);
  1990. if (((dstatus2 & 0x1) == 0x1) && ((dstatus2 >> 7) == 1))
  1991. fail_cpt++;
  1992. }
  1993. break;
  1994. case STV0900_DEMOD_2:
  1995. for (i = 0; i < 10; i++) {
  1996. agc2_integr = (stv0900_read_reg(i_params, R0900_P2_AGC2I1) << 8)
  1997. | stv0900_read_reg(i_params, R0900_P2_AGC2I0);
  1998. if (agc2_integr >= 0xff00)
  1999. agc2_overflow++;
  2000. dstatus2 = stv0900_read_reg(i_params, R0900_P2_DSTATUS2);
  2001. if (((dstatus2 & 0x1) == 0x1) && ((dstatus2 >> 7) == 1))
  2002. fail_cpt++;
  2003. }
  2004. break;
  2005. }
  2006. if ((fail_cpt > 7) || (agc2_overflow > 7))
  2007. coarse_fail = TRUE;
  2008. lock = FALSE;
  2009. }
  2010. k_ref_tmg -= 30;
  2011. } while ((k_ref_tmg >= k_ref_tmg_min) && (lock == FALSE) && (coarse_fail == FALSE));
  2012. }
  2013. return lock;
  2014. }
  2015. static void stv0900_set_viterbi_acq(struct stv0900_internal *i_params,
  2016. enum fe_stv0900_demod_num demod)
  2017. {
  2018. s32 vth_reg;
  2019. dprintk(KERN_INFO "%s\n", __func__);
  2020. dmd_reg(vth_reg, R0900_P1_VTH12, R0900_P2_VTH12);
  2021. stv0900_write_reg(i_params, vth_reg++, 0x96);
  2022. stv0900_write_reg(i_params, vth_reg++, 0x64);
  2023. stv0900_write_reg(i_params, vth_reg++, 0x36);
  2024. stv0900_write_reg(i_params, vth_reg++, 0x23);
  2025. stv0900_write_reg(i_params, vth_reg++, 0x1E);
  2026. stv0900_write_reg(i_params, vth_reg++, 0x19);
  2027. }
  2028. static void stv0900_set_search_standard(struct stv0900_internal *i_params,
  2029. enum fe_stv0900_demod_num demod)
  2030. {
  2031. int sstndrd;
  2032. dprintk(KERN_INFO "%s\n", __func__);
  2033. sstndrd = i_params->dmd1_srch_standard;
  2034. if (demod == 1)
  2035. sstndrd = i_params->dmd2_srch_stndrd;
  2036. switch (sstndrd) {
  2037. case STV0900_SEARCH_DVBS1:
  2038. dprintk("Search Standard = DVBS1\n");
  2039. break;
  2040. case STV0900_SEARCH_DSS:
  2041. dprintk("Search Standard = DSS\n");
  2042. case STV0900_SEARCH_DVBS2:
  2043. break;
  2044. dprintk("Search Standard = DVBS2\n");
  2045. case STV0900_AUTO_SEARCH:
  2046. default:
  2047. dprintk("Search Standard = AUTO\n");
  2048. break;
  2049. }
  2050. switch (demod) {
  2051. case STV0900_DEMOD_1:
  2052. default:
  2053. switch (i_params->dmd1_srch_standard) {
  2054. case STV0900_SEARCH_DVBS1:
  2055. case STV0900_SEARCH_DSS:
  2056. stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 1);
  2057. stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 0);
  2058. stv0900_write_bits(i_params, F0900_STOP_CLKVIT1, 0);
  2059. stv0900_write_reg(i_params, R0900_P1_ACLC, 0x1a);
  2060. stv0900_write_reg(i_params, R0900_P1_BCLC, 0x09);
  2061. stv0900_write_reg(i_params, R0900_P1_CAR2CFG, 0x22);
  2062. stv0900_set_viterbi_acq(i_params, demod);
  2063. stv0900_set_viterbi_standard(i_params,
  2064. i_params->dmd1_srch_standard,
  2065. i_params->dmd1_fec, demod);
  2066. break;
  2067. case STV0900_SEARCH_DVBS2:
  2068. stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 0);
  2069. stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 0);
  2070. stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 1);
  2071. stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 1);
  2072. stv0900_write_bits(i_params, F0900_STOP_CLKVIT1, 1);
  2073. stv0900_write_reg(i_params, R0900_P1_ACLC, 0x1a);
  2074. stv0900_write_reg(i_params, R0900_P1_BCLC, 0x09);
  2075. stv0900_write_reg(i_params, R0900_P1_CAR2CFG, 0x26);
  2076. if (i_params->demod_mode != STV0900_SINGLE) {
  2077. if (i_params->chip_id <= 0x11)
  2078. stv0900_stop_all_s2_modcod(i_params, demod);
  2079. else
  2080. stv0900_activate_s2_modcode(i_params, demod);
  2081. } else
  2082. stv0900_activate_s2_modcode_single(i_params, demod);
  2083. stv0900_set_viterbi_tracq(i_params, demod);
  2084. break;
  2085. case STV0900_AUTO_SEARCH:
  2086. default:
  2087. stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 0);
  2088. stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 0);
  2089. stv0900_write_bits(i_params, F0900_P1_DVBS1_ENABLE, 1);
  2090. stv0900_write_bits(i_params, F0900_P1_DVBS2_ENABLE, 1);
  2091. stv0900_write_bits(i_params, F0900_STOP_CLKVIT1, 0);
  2092. stv0900_write_reg(i_params, R0900_P1_ACLC, 0x1a);
  2093. stv0900_write_reg(i_params, R0900_P1_BCLC, 0x09);
  2094. stv0900_write_reg(i_params, R0900_P1_CAR2CFG, 0x26);
  2095. if (i_params->demod_mode != STV0900_SINGLE) {
  2096. if (i_params->chip_id <= 0x11)
  2097. stv0900_stop_all_s2_modcod(i_params, demod);
  2098. else
  2099. stv0900_activate_s2_modcode(i_params, demod);
  2100. } else
  2101. stv0900_activate_s2_modcode_single(i_params, demod);
  2102. if (i_params->dmd1_symbol_rate >= 2000000)
  2103. stv0900_set_viterbi_acq(i_params, demod);
  2104. else
  2105. stv0900_set_viterbi_tracq(i_params, demod);
  2106. stv0900_set_viterbi_standard(i_params, i_params->dmd1_srch_standard, i_params->dmd1_fec, demod);
  2107. break;
  2108. }
  2109. break;
  2110. case STV0900_DEMOD_2:
  2111. switch (i_params->dmd2_srch_stndrd) {
  2112. case STV0900_SEARCH_DVBS1:
  2113. case STV0900_SEARCH_DSS:
  2114. stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 1);
  2115. stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 0);
  2116. stv0900_write_bits(i_params, F0900_STOP_CLKVIT2, 0);
  2117. stv0900_write_reg(i_params, R0900_P2_ACLC, 0x1a);
  2118. stv0900_write_reg(i_params, R0900_P2_BCLC, 0x09);
  2119. stv0900_write_reg(i_params, R0900_P2_CAR2CFG, 0x22);
  2120. stv0900_set_viterbi_acq(i_params, demod);
  2121. stv0900_set_viterbi_standard(i_params, i_params->dmd2_srch_stndrd, i_params->dmd2_fec, demod);
  2122. break;
  2123. case STV0900_SEARCH_DVBS2:
  2124. stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 0);
  2125. stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 0);
  2126. stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 1);
  2127. stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 1);
  2128. stv0900_write_bits(i_params, F0900_STOP_CLKVIT2, 1);
  2129. stv0900_write_reg(i_params, R0900_P2_ACLC, 0x1a);
  2130. stv0900_write_reg(i_params, R0900_P2_BCLC, 0x09);
  2131. stv0900_write_reg(i_params, R0900_P2_CAR2CFG, 0x26);
  2132. if (i_params->demod_mode != STV0900_SINGLE)
  2133. stv0900_activate_s2_modcode(i_params, demod);
  2134. else
  2135. stv0900_activate_s2_modcode_single(i_params, demod);
  2136. stv0900_set_viterbi_tracq(i_params, demod);
  2137. break;
  2138. case STV0900_AUTO_SEARCH:
  2139. default:
  2140. stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 0);
  2141. stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 0);
  2142. stv0900_write_bits(i_params, F0900_P2_DVBS1_ENABLE, 1);
  2143. stv0900_write_bits(i_params, F0900_P2_DVBS2_ENABLE, 1);
  2144. stv0900_write_bits(i_params, F0900_STOP_CLKVIT2, 0);
  2145. stv0900_write_reg(i_params, R0900_P2_ACLC, 0x1a);
  2146. stv0900_write_reg(i_params, R0900_P2_BCLC, 0x09);
  2147. stv0900_write_reg(i_params, R0900_P2_CAR2CFG, 0x26);
  2148. if (i_params->demod_mode != STV0900_SINGLE)
  2149. stv0900_activate_s2_modcode(i_params, demod);
  2150. else
  2151. stv0900_activate_s2_modcode_single(i_params, demod);
  2152. if (i_params->dmd2_symbol_rate >= 2000000)
  2153. stv0900_set_viterbi_acq(i_params, demod);
  2154. else
  2155. stv0900_set_viterbi_tracq(i_params, demod);
  2156. stv0900_set_viterbi_standard(i_params, i_params->dmd2_srch_stndrd, i_params->dmd2_fec, demod);
  2157. break;
  2158. }
  2159. break;
  2160. }
  2161. }
  2162. enum fe_stv0900_signal_type stv0900_algo(struct dvb_frontend *fe)
  2163. {
  2164. struct stv0900_state *state = fe->demodulator_priv;
  2165. struct stv0900_internal *i_params = state->internal;
  2166. enum fe_stv0900_demod_num demod = state->demod;
  2167. s32 demod_timeout = 500, fec_timeout = 50, stream_merger_field;
  2168. int lock = FALSE, low_sr = FALSE;
  2169. enum fe_stv0900_signal_type signal_type = STV0900_NOCARRIER;
  2170. enum fe_stv0900_search_algo algo;
  2171. int no_signal = FALSE;
  2172. dprintk(KERN_INFO "%s\n", __func__);
  2173. switch (demod) {
  2174. case STV0900_DEMOD_1:
  2175. default:
  2176. algo = i_params->dmd1_srch_algo;
  2177. stv0900_write_bits(i_params, F0900_P1_RST_HWARE, 1);
  2178. stream_merger_field = F0900_P1_RST_HWARE;
  2179. stv0900_write_reg(i_params, R0900_P1_DMDISTATE, 0x5C);
  2180. if (i_params->chip_id >= 0x20)
  2181. stv0900_write_reg(i_params, R0900_P1_CORRELABS, 0x9e);
  2182. else
  2183. stv0900_write_reg(i_params, R0900_P1_CORRELABS, 0x88);
  2184. stv0900_get_lock_timeout(&demod_timeout, &fec_timeout, i_params->dmd1_symbol_rate, i_params->dmd1_srch_algo);
  2185. if (i_params->dmd1_srch_algo == STV0900_BLIND_SEARCH) {
  2186. i_params->tuner1_bw = 2 * 36000000;
  2187. stv0900_write_reg(i_params, R0900_P1_TMGCFG2, 0x00);
  2188. stv0900_write_reg(i_params, R0900_P1_CORRELMANT, 0x70);
  2189. stv0900_set_symbol_rate(i_params, i_params->mclk, 1000000, demod);
  2190. } else {
  2191. stv0900_write_reg(i_params, R0900_P1_DMDT0M, 0x20);
  2192. stv0900_write_reg(i_params, R0900_P1_TMGCFG, 0xd2);
  2193. if (i_params->dmd1_symbol_rate < 2000000)
  2194. stv0900_write_reg(i_params, R0900_P1_CORRELMANT, 0x63);
  2195. else
  2196. stv0900_write_reg(i_params, R0900_P1_CORRELMANT, 0x70);
  2197. stv0900_write_reg(i_params, R0900_P1_AGC2REF, 0x38);
  2198. if (i_params->chip_id >= 0x20) {
  2199. stv0900_write_reg(i_params, R0900_P1_KREFTMG, 0x5a);
  2200. if (i_params->dmd1_srch_algo == STV0900_COLD_START)
  2201. i_params->tuner1_bw = (15 * (stv0900_carrier_width(i_params->dmd1_symbol_rate, i_params->rolloff) + 10000000)) / 10;
  2202. else if (i_params->dmd1_srch_algo == STV0900_WARM_START)
  2203. i_params->tuner1_bw = stv0900_carrier_width(i_params->dmd1_symbol_rate, i_params->rolloff) + 10000000;
  2204. } else {
  2205. stv0900_write_reg(i_params, R0900_P1_KREFTMG, 0xc1);
  2206. i_params->tuner1_bw = (15 * (stv0900_carrier_width(i_params->dmd1_symbol_rate, i_params->rolloff) + 10000000)) / 10;
  2207. }
  2208. stv0900_write_reg(i_params, R0900_P1_TMGCFG2, 0x01);
  2209. stv0900_set_symbol_rate(i_params, i_params->mclk, i_params->dmd1_symbol_rate, demod);
  2210. stv0900_set_max_symbol_rate(i_params, i_params->mclk, i_params->dmd1_symbol_rate, demod);
  2211. stv0900_set_min_symbol_rate(i_params, i_params->mclk, i_params->dmd1_symbol_rate, demod);
  2212. if (i_params->dmd1_symbol_rate >= 10000000)
  2213. low_sr = FALSE;
  2214. else
  2215. low_sr = TRUE;
  2216. }
  2217. stv0900_set_tuner(fe, i_params->tuner1_freq, i_params->tuner1_bw);
  2218. stv0900_write_bits(i_params, F0900_P1_SPECINV_CONTROL, i_params->dmd1_srch_iq_inv);
  2219. stv0900_write_bits(i_params, F0900_P1_MANUAL_ROLLOFF, 1);
  2220. stv0900_set_search_standard(i_params, demod);
  2221. if (i_params->dmd1_srch_algo != STV0900_BLIND_SEARCH)
  2222. stv0900_start_search(i_params, demod);
  2223. break;
  2224. case STV0900_DEMOD_2:
  2225. algo = i_params->dmd2_srch_algo;
  2226. stv0900_write_bits(i_params, F0900_P2_RST_HWARE, 1);
  2227. stream_merger_field = F0900_P2_RST_HWARE;
  2228. stv0900_write_reg(i_params, R0900_P2_DMDISTATE, 0x5C);
  2229. if (i_params->chip_id >= 0x20)
  2230. stv0900_write_reg(i_params, R0900_P2_CORRELABS, 0x9e);
  2231. else
  2232. stv0900_write_reg(i_params, R0900_P2_CORRELABS, 0x88);
  2233. stv0900_get_lock_timeout(&demod_timeout, &fec_timeout, i_params->dmd2_symbol_rate, i_params->dmd2_srch_algo);
  2234. if (i_params->dmd2_srch_algo == STV0900_BLIND_SEARCH) {
  2235. i_params->tuner2_bw = 2 * 36000000;
  2236. stv0900_write_reg(i_params, R0900_P2_TMGCFG2, 0x00);
  2237. stv0900_write_reg(i_params, R0900_P2_CORRELMANT, 0x70);
  2238. stv0900_set_symbol_rate(i_params, i_params->mclk, 1000000, demod);
  2239. } else {
  2240. stv0900_write_reg(i_params, R0900_P2_DMDT0M, 0x20);
  2241. stv0900_write_reg(i_params, R0900_P2_TMGCFG, 0xd2);
  2242. if (i_params->dmd2_symbol_rate < 2000000)
  2243. stv0900_write_reg(i_params, R0900_P2_CORRELMANT, 0x63);
  2244. else
  2245. stv0900_write_reg(i_params, R0900_P2_CORRELMANT, 0x70);
  2246. if (i_params->dmd2_symbol_rate >= 10000000)
  2247. stv0900_write_reg(i_params, R0900_P2_AGC2REF, 0x38);
  2248. else
  2249. stv0900_write_reg(i_params, R0900_P2_AGC2REF, 0x60);
  2250. if (i_params->chip_id >= 0x20) {
  2251. stv0900_write_reg(i_params, R0900_P2_KREFTMG, 0x5a);
  2252. if (i_params->dmd2_srch_algo == STV0900_COLD_START)
  2253. i_params->tuner2_bw = (15 * (stv0900_carrier_width(i_params->dmd2_symbol_rate,
  2254. i_params->rolloff) + 10000000)) / 10;
  2255. else if (i_params->dmd2_srch_algo == STV0900_WARM_START)
  2256. i_params->tuner2_bw = stv0900_carrier_width(i_params->dmd2_symbol_rate,
  2257. i_params->rolloff) + 10000000;
  2258. } else {
  2259. stv0900_write_reg(i_params, R0900_P2_KREFTMG, 0xc1);
  2260. i_params->tuner2_bw = (15 * (stv0900_carrier_width(i_params->dmd2_symbol_rate,
  2261. i_params->rolloff) + 10000000)) / 10;
  2262. }
  2263. stv0900_write_reg(i_params, R0900_P2_TMGCFG2, 0x01);
  2264. stv0900_set_symbol_rate(i_params, i_params->mclk, i_params->dmd2_symbol_rate, demod);
  2265. stv0900_set_max_symbol_rate(i_params, i_params->mclk, i_params->dmd2_symbol_rate, demod);
  2266. stv0900_set_min_symbol_rate(i_params, i_params->mclk, i_params->dmd2_symbol_rate, demod);
  2267. if (i_params->dmd2_symbol_rate >= 10000000)
  2268. low_sr = FALSE;
  2269. else
  2270. low_sr = TRUE;
  2271. }
  2272. stv0900_set_tuner(fe, i_params->tuner2_freq, i_params->tuner2_bw);
  2273. stv0900_write_bits(i_params, F0900_P2_SPECINV_CONTROL, i_params->dmd2_srch_iq_inv);
  2274. stv0900_write_bits(i_params, F0900_P2_MANUAL_ROLLOFF, 1);
  2275. stv0900_set_search_standard(i_params, demod);
  2276. if (i_params->dmd2_srch_algo != STV0900_BLIND_SEARCH)
  2277. stv0900_start_search(i_params, demod);
  2278. break;
  2279. }
  2280. if (i_params->chip_id == 0x12) {
  2281. stv0900_write_bits(i_params, stream_merger_field, 0);
  2282. msleep(3);
  2283. stv0900_write_bits(i_params, stream_merger_field, 1);
  2284. stv0900_write_bits(i_params, stream_merger_field, 0);
  2285. }
  2286. if (algo == STV0900_BLIND_SEARCH)
  2287. lock = stv0900_blind_search_algo(fe);
  2288. else if (algo == STV0900_COLD_START)
  2289. lock = stv0900_get_demod_cold_lock(fe, demod_timeout);
  2290. else if (algo == STV0900_WARM_START)
  2291. lock = stv0900_get_demod_lock(i_params, demod, demod_timeout);
  2292. if ((lock == FALSE) && (algo == STV0900_COLD_START)) {
  2293. if (low_sr == FALSE) {
  2294. if (stv0900_check_timing_lock(i_params, demod) == TRUE)
  2295. lock = stv0900_sw_algo(i_params, demod);
  2296. }
  2297. }
  2298. if (lock == TRUE)
  2299. signal_type = stv0900_get_signal_params(fe);
  2300. if ((lock == TRUE) && (signal_type == STV0900_RANGEOK)) {
  2301. stv0900_track_optimization(fe);
  2302. if (i_params->chip_id <= 0x11) {
  2303. if ((stv0900_get_standard(fe, STV0900_DEMOD_1) == STV0900_DVBS1_STANDARD) && (stv0900_get_standard(fe, STV0900_DEMOD_2) == STV0900_DVBS1_STANDARD)) {
  2304. msleep(20);
  2305. stv0900_write_bits(i_params, stream_merger_field, 0);
  2306. } else {
  2307. stv0900_write_bits(i_params, stream_merger_field, 0);
  2308. msleep(3);
  2309. stv0900_write_bits(i_params, stream_merger_field, 1);
  2310. stv0900_write_bits(i_params, stream_merger_field, 0);
  2311. }
  2312. } else if (i_params->chip_id == 0x20) {
  2313. stv0900_write_bits(i_params, stream_merger_field, 0);
  2314. msleep(3);
  2315. stv0900_write_bits(i_params, stream_merger_field, 1);
  2316. stv0900_write_bits(i_params, stream_merger_field, 0);
  2317. }
  2318. if (stv0900_wait_for_lock(i_params, demod, fec_timeout, fec_timeout) == TRUE) {
  2319. lock = TRUE;
  2320. switch (demod) {
  2321. case STV0900_DEMOD_1:
  2322. default:
  2323. i_params->dmd1_rslts.locked = TRUE;
  2324. if (i_params->dmd1_rslts.standard == STV0900_DVBS2_STANDARD) {
  2325. stv0900_set_dvbs2_rolloff(i_params, demod);
  2326. stv0900_write_reg(i_params, R0900_P1_PDELCTRL2, 0x40);
  2327. stv0900_write_reg(i_params, R0900_P1_PDELCTRL2, 0);
  2328. stv0900_write_reg(i_params, R0900_P1_ERRCTRL1, 0x67);
  2329. } else {
  2330. stv0900_write_reg(i_params, R0900_P1_ERRCTRL1, 0x75);
  2331. }
  2332. stv0900_write_reg(i_params, R0900_P1_FBERCPT4, 0);
  2333. stv0900_write_reg(i_params, R0900_P1_ERRCTRL2, 0xc1);
  2334. break;
  2335. case STV0900_DEMOD_2:
  2336. i_params->dmd2_rslts.locked = TRUE;
  2337. if (i_params->dmd2_rslts.standard == STV0900_DVBS2_STANDARD) {
  2338. stv0900_set_dvbs2_rolloff(i_params, demod);
  2339. stv0900_write_reg(i_params, R0900_P2_PDELCTRL2, 0x60);
  2340. stv0900_write_reg(i_params, R0900_P2_PDELCTRL2, 0x20);
  2341. stv0900_write_reg(i_params, R0900_P2_ERRCTRL1, 0x67);
  2342. } else {
  2343. stv0900_write_reg(i_params, R0900_P2_ERRCTRL1, 0x75);
  2344. }
  2345. stv0900_write_reg(i_params, R0900_P2_FBERCPT4, 0);
  2346. stv0900_write_reg(i_params, R0900_P2_ERRCTRL2, 0xc1);
  2347. break;
  2348. }
  2349. } else {
  2350. lock = FALSE;
  2351. signal_type = STV0900_NODATA;
  2352. no_signal = stv0900_check_signal_presence(i_params, demod);
  2353. switch (demod) {
  2354. case STV0900_DEMOD_1:
  2355. default:
  2356. i_params->dmd1_rslts.locked = FALSE;
  2357. break;
  2358. case STV0900_DEMOD_2:
  2359. i_params->dmd2_rslts.locked = FALSE;
  2360. break;
  2361. }
  2362. }
  2363. }
  2364. if ((signal_type == STV0900_NODATA) && (no_signal == FALSE)) {
  2365. switch (demod) {
  2366. case STV0900_DEMOD_1:
  2367. default:
  2368. if (i_params->chip_id <= 0x11) {
  2369. if ((stv0900_get_bits(i_params, F0900_P1_HEADER_MODE) == STV0900_DVBS_FOUND) &&
  2370. (i_params->dmd1_srch_iq_inv <= STV0900_IQ_AUTO_NORMAL_FIRST))
  2371. signal_type = stv0900_dvbs1_acq_workaround(fe);
  2372. } else
  2373. i_params->dmd1_rslts.locked = FALSE;
  2374. break;
  2375. case STV0900_DEMOD_2:
  2376. if (i_params->chip_id <= 0x11) {
  2377. if ((stv0900_get_bits(i_params, F0900_P2_HEADER_MODE) == STV0900_DVBS_FOUND) &&
  2378. (i_params->dmd2_srch_iq_inv <= STV0900_IQ_AUTO_NORMAL_FIRST))
  2379. signal_type = stv0900_dvbs1_acq_workaround(fe);
  2380. } else
  2381. i_params->dmd2_rslts.locked = FALSE;
  2382. break;
  2383. }
  2384. }
  2385. return signal_type;
  2386. }