mb86a16.c 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772
  1. /*
  2. Fujitsu MB86A16 DVB-S/DSS DC Receiver driver
  3. Copyright (C) 2005, 2006 Manu Abraham (abraham.manu@gmail.com)
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 2 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. */
  16. #include <linux/init.h>
  17. #include <linux/kernel.h>
  18. #include <linux/module.h>
  19. #include <linux/moduleparam.h>
  20. #include "dvb_frontend.h"
  21. #include "mb86a16.h"
  22. #include "mb86a16_priv.h"
  23. unsigned int verbose = 5;
  24. module_param(verbose, int, 0644);
  25. #define ABS(x) ((x) < 0 ? (-x) : (x))
  26. struct mb86a16_state {
  27. struct i2c_adapter *i2c_adap;
  28. const struct mb86a16_config *config;
  29. struct dvb_frontend frontend;
  30. u8 signal;
  31. // tuning parameters
  32. int frequency;
  33. int srate;
  34. // Internal stuff
  35. int master_clk;
  36. int deci;
  37. int csel;
  38. int rsel;
  39. };
  40. #define MB86A16_ERROR 0
  41. #define MB86A16_NOTICE 1
  42. #define MB86A16_INFO 2
  43. #define MB86A16_DEBUG 3
  44. #define dprintk(x, y, z, format, arg...) do { \
  45. if (z) { \
  46. if ((x > MB86A16_ERROR) && (x > y)) \
  47. printk(KERN_ERR "%s: " format "\n", __func__, ##arg); \
  48. else if ((x > MB86A16_NOTICE) && (x > y)) \
  49. printk(KERN_NOTICE "%s: " format "\n", __func__, ##arg); \
  50. else if ((x > MB86A16_INFO) && (x > y)) \
  51. printk(KERN_INFO "%s: " format "\n", __func__, ##arg); \
  52. else if ((x > MB86A16_DEBUG) && (x > y)) \
  53. printk(KERN_DEBUG "%s: " format "\n", __func__, ##arg); \
  54. } else { \
  55. if (x > y) \
  56. printk(format, ##arg); \
  57. } \
  58. } while (0)
  59. #define TRACE_IN dprintk(verbose, MB86A16_DEBUG, 1, "-->()")
  60. #define TRACE_OUT dprintk(verbose, MB86A16_DEBUG, 1, "()-->")
  61. static int mb86a16_write(struct mb86a16_state *state, u8 reg, u8 val)
  62. {
  63. int ret;
  64. u8 buf[] = { reg, val };
  65. struct i2c_msg msg = {
  66. .addr = state->config->demod_address,
  67. .flags = 0,
  68. .buf = buf,
  69. .len = 2
  70. };
  71. dprintk(verbose, MB86A16_DEBUG, 1,
  72. "writing to [0x%02x],Reg[0x%02x],Data[0x%02x]",
  73. state->config->demod_address, buf[0], buf[1]);
  74. ret = i2c_transfer(state->i2c_adap, &msg, 1);
  75. return (ret != 1) ? -EREMOTEIO : 0;
  76. }
  77. static int mb86a16_read(struct mb86a16_state *state, u8 reg, u8 *val)
  78. {
  79. int ret;
  80. u8 b0[] = { reg };
  81. u8 b1[] = { 0 };
  82. struct i2c_msg msg[] = {
  83. {
  84. .addr = state->config->demod_address,
  85. .flags = 0,
  86. .buf = b0,
  87. .len = 1
  88. },{
  89. .addr = state->config->demod_address,
  90. .flags = I2C_M_RD,
  91. .buf = b1,
  92. .len = 1
  93. }
  94. };
  95. ret = i2c_transfer(state->i2c_adap, msg, 2);
  96. if (ret != 2) {
  97. dprintk(verbose, MB86A16_ERROR, 1, "read error(reg=0x%02x, ret=0x%i)",
  98. reg, ret);
  99. return -EREMOTEIO;
  100. }
  101. *val = b1[0];
  102. return ret;
  103. }
  104. static int CNTM_set(struct mb86a16_state *state,
  105. unsigned char timint1,
  106. unsigned char timint2,
  107. unsigned char cnext)
  108. {
  109. unsigned char val;
  110. val = (timint1 << 4) | (timint2 << 2) | cnext;
  111. if (mb86a16_write(state, MB86A16_CNTMR, val) < 0)
  112. goto err;
  113. return 0;
  114. err:
  115. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  116. return -EREMOTEIO;
  117. }
  118. static int smrt_set(struct mb86a16_state *state, int rate)
  119. {
  120. int tmp ;
  121. int m ;
  122. unsigned char STOFS0, STOFS1;
  123. m = 1 << state->deci;
  124. tmp = (8192 * state->master_clk - 2 * m * rate * 8192 + state->master_clk / 2) / state->master_clk;
  125. STOFS0 = tmp & 0x0ff;
  126. STOFS1 = (tmp & 0xf00) >> 8;
  127. if (mb86a16_write(state, MB86A16_SRATE1, (state->deci << 2) |
  128. (state->csel << 1) |
  129. state->rsel) < 0)
  130. goto err;
  131. if (mb86a16_write(state, MB86A16_SRATE2, STOFS0) < 0)
  132. goto err;
  133. if (mb86a16_write(state, MB86A16_SRATE3, STOFS1) < 0)
  134. goto err;
  135. return 0;
  136. err:
  137. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  138. return -1;
  139. }
  140. static int srst(struct mb86a16_state *state)
  141. {
  142. if (mb86a16_write(state, MB86A16_RESET, 0x04) < 0)
  143. goto err;
  144. return 0;
  145. err:
  146. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  147. return -EREMOTEIO;
  148. }
  149. static int afcex_data_set(struct mb86a16_state *state,
  150. unsigned char AFCEX_L,
  151. unsigned char AFCEX_H)
  152. {
  153. if (mb86a16_write(state, MB86A16_AFCEXL, AFCEX_L) < 0)
  154. goto err;
  155. if (mb86a16_write(state, MB86A16_AFCEXH, AFCEX_H) < 0)
  156. goto err;
  157. return 0;
  158. err:
  159. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  160. return -1;
  161. }
  162. static int afcofs_data_set(struct mb86a16_state *state,
  163. unsigned char AFCEX_L,
  164. unsigned char AFCEX_H)
  165. {
  166. if (mb86a16_write(state, 0x58, AFCEX_L) < 0)
  167. goto err;
  168. if (mb86a16_write(state, 0x59, AFCEX_H) < 0)
  169. goto err;
  170. return 0;
  171. err:
  172. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  173. return -EREMOTEIO;
  174. }
  175. static int stlp_set(struct mb86a16_state *state,
  176. unsigned char STRAS,
  177. unsigned char STRBS)
  178. {
  179. if (mb86a16_write(state, MB86A16_STRFILTCOEF1, (STRBS << 3) | (STRAS)) < 0)
  180. goto err;
  181. return 0;
  182. err:
  183. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  184. return -EREMOTEIO;
  185. }
  186. static int Vi_set(struct mb86a16_state *state, unsigned char ETH, unsigned char VIA)
  187. {
  188. if (mb86a16_write(state, MB86A16_VISET2, 0x04) < 0)
  189. goto err;
  190. if (mb86a16_write(state, MB86A16_VISET3, 0xf5) < 0)
  191. goto err;
  192. return 0;
  193. err:
  194. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  195. return -EREMOTEIO;
  196. }
  197. static int initial_set(struct mb86a16_state *state)
  198. {
  199. if (stlp_set(state, 5, 7))
  200. goto err;
  201. if (afcex_data_set(state, 0, 0))
  202. goto err;
  203. if (afcofs_data_set(state, 0, 0))
  204. goto err;
  205. if (mb86a16_write(state, MB86A16_CRLFILTCOEF1, 0x16) < 0)
  206. goto err;
  207. if (mb86a16_write(state, 0x2f, 0x21) < 0)
  208. goto err;
  209. if (mb86a16_write(state, MB86A16_VIMAG, 0x38) < 0)
  210. goto err;
  211. if (mb86a16_write(state, MB86A16_FAGCS1, 0x00) < 0)
  212. goto err;
  213. if (mb86a16_write(state, MB86A16_FAGCS2, 0x1c) < 0)
  214. goto err;
  215. if (mb86a16_write(state, MB86A16_FAGCS3, 0x20) < 0)
  216. goto err;
  217. if (mb86a16_write(state, MB86A16_FAGCS4, 0x1e) < 0)
  218. goto err;
  219. if (mb86a16_write(state, MB86A16_FAGCS5, 0x23) < 0)
  220. goto err;
  221. if (mb86a16_write(state, 0x54, 0xff) < 0)
  222. goto err;
  223. if (mb86a16_write(state, MB86A16_TSOUT, 0x00) < 0)
  224. goto err;
  225. return 0;
  226. err:
  227. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  228. return -EREMOTEIO;
  229. }
  230. static int S01T_set(struct mb86a16_state *state,
  231. unsigned char s1t,
  232. unsigned s0t)
  233. {
  234. if (mb86a16_write(state, 0x33, (s1t << 3) | s0t) < 0)
  235. goto err;
  236. return 0;
  237. err:
  238. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  239. return -EREMOTEIO;
  240. }
  241. static int EN_set(struct mb86a16_state *state,
  242. int cren,
  243. int afcen)
  244. {
  245. unsigned char val;
  246. val = 0x7a | (cren << 7) | (afcen << 2);
  247. if (mb86a16_write(state, 0x49, val) < 0)
  248. goto err;
  249. return 0;
  250. err:
  251. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  252. return -EREMOTEIO;
  253. }
  254. static int AFCEXEN_set(struct mb86a16_state *state,
  255. int afcexen,
  256. int smrt)
  257. {
  258. unsigned char AFCA ;
  259. if (smrt > 18875)
  260. AFCA = 4;
  261. else if (smrt > 9375)
  262. AFCA = 3;
  263. else if (smrt > 2250)
  264. AFCA = 2;
  265. else
  266. AFCA = 1;
  267. if (mb86a16_write(state, 0x2a, 0x02 | (afcexen << 5) | (AFCA << 2)) < 0)
  268. goto err;
  269. return 0;
  270. err:
  271. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  272. return -EREMOTEIO;
  273. }
  274. static int DAGC_data_set(struct mb86a16_state *state,
  275. unsigned char DAGCA,
  276. unsigned char DAGCW)
  277. {
  278. if (mb86a16_write(state, 0x2d, (DAGCA << 3) | DAGCW) < 0)
  279. goto err;
  280. return 0;
  281. err:
  282. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  283. return -EREMOTEIO;
  284. }
  285. static void smrt_info_get(struct mb86a16_state *state, int rate)
  286. {
  287. if (rate >= 37501) {
  288. state->deci = 0; state->csel = 0; state->rsel = 0;
  289. } else if (rate >= 30001) {
  290. state->deci = 0; state->csel = 0; state->rsel = 1;
  291. } else if (rate >= 26251) {
  292. state->deci = 0; state->csel = 1; state->rsel = 0;
  293. } else if (rate >= 22501) {
  294. state->deci = 0; state->csel = 1; state->rsel = 1;
  295. } else if (rate >= 18751) {
  296. state->deci = 1; state->csel = 0; state->rsel = 0;
  297. } else if (rate >= 15001) {
  298. state->deci = 1; state->csel = 0; state->rsel = 1;
  299. } else if (rate >= 13126) {
  300. state->deci = 1; state->csel = 1; state->rsel = 0;
  301. } else if (rate >= 11251) {
  302. state->deci = 1; state->csel = 1; state->rsel = 1;
  303. } else if (rate >= 9376) {
  304. state->deci = 2; state->csel = 0; state->rsel = 0;
  305. } else if (rate >= 7501) {
  306. state->deci = 2; state->csel = 0; state->rsel = 1;
  307. } else if (rate >= 6563) {
  308. state->deci = 2; state->csel = 1; state->rsel = 0;
  309. } else if (rate >= 5626) {
  310. state->deci = 2; state->csel = 1; state->rsel = 1;
  311. } else if (rate >= 4688) {
  312. state->deci = 3; state->csel = 0; state->rsel = 0;
  313. } else if (rate >= 3751) {
  314. state->deci = 3; state->csel = 0; state->rsel = 1;
  315. } else if (rate >= 3282) {
  316. state->deci = 3; state->csel = 1; state->rsel = 0;
  317. } else if (rate >= 2814) {
  318. state->deci = 3; state->csel = 1; state->rsel = 1;
  319. } else if (rate >= 2344) {
  320. state->deci = 4; state->csel = 0; state->rsel = 0;
  321. } else if (rate >= 1876) {
  322. state->deci = 4; state->csel = 0; state->rsel = 1;
  323. } else if (rate >= 1641) {
  324. state->deci = 4; state->csel = 1; state->rsel = 0;
  325. } else if (rate >= 1407) {
  326. state->deci = 4; state->csel = 1; state->rsel = 1;
  327. } else if (rate >= 1172) {
  328. state->deci = 5; state->csel = 0; state->rsel = 0;
  329. } else if (rate >= 939) {
  330. state->deci = 5; state->csel = 0; state->rsel = 1;
  331. } else if (rate >= 821) {
  332. state->deci = 5; state->csel = 1; state->rsel = 0;
  333. } else {
  334. state->deci = 5; state->csel = 1; state->rsel = 1;
  335. }
  336. if (state->csel == 0)
  337. state->master_clk = 92000;
  338. else
  339. state->master_clk = 61333;
  340. }
  341. static int signal_det(struct mb86a16_state *state,
  342. int smrt,
  343. unsigned char *SIG)
  344. {
  345. int ret ;
  346. int smrtd ;
  347. int wait_sym ;
  348. int wait_t ;
  349. unsigned char S[3] ;
  350. int i ;
  351. if (*SIG > 45) {
  352. if (CNTM_set(state, 2, 1, 2) < 0) {
  353. dprintk(verbose, MB86A16_ERROR, 1, "CNTM set Error");
  354. return -1;
  355. }
  356. wait_sym = 40000;
  357. } else {
  358. if (CNTM_set(state, 3, 1, 2) < 0) {
  359. dprintk(verbose, MB86A16_ERROR, 1, "CNTM set Error");
  360. return -1;
  361. }
  362. wait_sym = 80000;
  363. }
  364. for (i = 0; i < 3; i++) {
  365. if (i == 0 )
  366. smrtd = smrt * 98 / 100;
  367. else if (i == 1)
  368. smrtd = smrt;
  369. else
  370. smrtd = smrt * 102 / 100;
  371. smrt_info_get(state, smrtd);
  372. smrt_set(state, smrtd);
  373. srst(state);
  374. wait_t = (wait_sym + 99 * smrtd / 100) / smrtd;
  375. if (wait_t == 0)
  376. wait_t = 1;
  377. msleep_interruptible(10);
  378. if (mb86a16_read(state, 0x37, &(S[i])) != 2) {
  379. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  380. return -EREMOTEIO;
  381. }
  382. }
  383. if ((S[1] > S[0] * 112 / 100) &&
  384. (S[1] > S[2] * 112 / 100)) {
  385. ret = 1;
  386. } else {
  387. ret = 0;
  388. }
  389. *SIG = S[1];
  390. if (CNTM_set(state, 0, 1, 2) < 0) {
  391. dprintk(verbose, MB86A16_ERROR, 1, "CNTM set Error");
  392. return -1;
  393. }
  394. return ret;
  395. }
  396. static int rf_val_set(struct mb86a16_state *state,
  397. int f,
  398. int smrt,
  399. unsigned char R)
  400. {
  401. unsigned char C, F, B;
  402. int M;
  403. unsigned char rf_val[5];
  404. int ack = -1;
  405. if (smrt > 37750 )
  406. C = 1;
  407. else if (smrt > 18875)
  408. C = 2;
  409. else if (smrt > 5500 )
  410. C = 3;
  411. else
  412. C = 4;
  413. if (smrt > 30500)
  414. F = 3;
  415. else if (smrt > 9375)
  416. F = 1;
  417. else if (smrt > 4625)
  418. F = 0;
  419. else
  420. F = 2;
  421. if (f < 1060)
  422. B = 0;
  423. else if (f < 1175)
  424. B = 1;
  425. else if (f < 1305)
  426. B = 2;
  427. else if (f < 1435)
  428. B = 3;
  429. else if (f < 1570)
  430. B = 4;
  431. else if (f < 1715)
  432. B = 5;
  433. else if (f < 1845)
  434. B = 6;
  435. else if (f < 1980)
  436. B = 7;
  437. else if (f < 2080)
  438. B = 8;
  439. else
  440. B = 9;
  441. M = f * (1 << R) / 2;
  442. rf_val[0] = 0x01 | (C << 3) | (F << 1);
  443. rf_val[1] = (R << 5) | ((M & 0x1f000) >> 12);
  444. rf_val[2] = (M & 0x00ff0) >> 4;
  445. rf_val[3] = ((M & 0x0000f) << 4) | B;
  446. // Frequency Set
  447. if (mb86a16_write(state, 0x21, rf_val[0]) < 0)
  448. ack = 0;
  449. if (mb86a16_write(state, 0x22, rf_val[1]) < 0)
  450. ack = 0;
  451. if (mb86a16_write(state, 0x23, rf_val[2]) < 0)
  452. ack = 0;
  453. if (mb86a16_write(state, 0x24, rf_val[3]) < 0)
  454. ack = 0;
  455. if (mb86a16_write(state, 0x25, 0x01) < 0)
  456. ack = 0;
  457. if (ack == 0) {
  458. dprintk(verbose, MB86A16_ERROR, 1, "RF Setup - I2C transfer error");
  459. return -EREMOTEIO;
  460. }
  461. return 0;
  462. }
  463. static int afcerr_chk(struct mb86a16_state *state)
  464. {
  465. unsigned char AFCM_L, AFCM_H ;
  466. int AFCM ;
  467. int afcm, afcerr ;
  468. if (mb86a16_read(state, 0x0e, &AFCM_L) != 2)
  469. goto err;
  470. if (mb86a16_read(state, 0x0f, &AFCM_H) != 2)
  471. goto err;
  472. AFCM = (AFCM_H << 8) + AFCM_L;
  473. if (AFCM > 2048)
  474. afcm = AFCM - 4096;
  475. else
  476. afcm = AFCM;
  477. afcerr = afcm * state->master_clk / 8192;
  478. return afcerr;
  479. err:
  480. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  481. return -EREMOTEIO;
  482. }
  483. static int dagcm_val_get(struct mb86a16_state *state)
  484. {
  485. int DAGCM;
  486. unsigned char DAGCM_H, DAGCM_L;
  487. if (mb86a16_read(state, 0x45, &DAGCM_L) != 2)
  488. goto err;
  489. if (mb86a16_read(state, 0x46, &DAGCM_H) != 2)
  490. goto err;
  491. DAGCM = (DAGCM_H << 8) + DAGCM_L;
  492. return DAGCM;
  493. err:
  494. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  495. return -EREMOTEIO;
  496. }
  497. static int mb86a16_read_status(struct dvb_frontend *fe, fe_status_t *status)
  498. {
  499. struct mb86a16_state *state = fe->demodulator_priv;
  500. if (state->signal & 0x02)
  501. *status |= FE_HAS_VITERBI;
  502. if (state->signal & 0x01)
  503. *status |= FE_HAS_SYNC;
  504. if (state->signal & 0x03)
  505. *status |= FE_HAS_LOCK;
  506. return 0;
  507. }
  508. static int sync_chk(struct mb86a16_state *state,
  509. unsigned char *VIRM)
  510. {
  511. unsigned char val;
  512. int sync;
  513. if (mb86a16_read(state, 0x0d, &val) != 2)
  514. goto err;
  515. dprintk(verbose, MB86A16_INFO, 1, "Status = %02x,", val);
  516. sync = val & 0x01;
  517. *VIRM = (val & 0x1c) >> 2;
  518. return sync;
  519. err:
  520. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  521. return -EREMOTEIO;
  522. }
  523. static int freqerr_chk(struct mb86a16_state *state,
  524. int fTP,
  525. int smrt,
  526. int unit)
  527. {
  528. unsigned char CRM, AFCML, AFCMH;
  529. unsigned char temp1, temp2, temp3;
  530. int crm, afcm, AFCM;
  531. int crrerr, afcerr; // [kHz]
  532. int frqerr; // [MHz]
  533. int afcen, afcexen = 0;
  534. int R, M, fOSC, fOSC_OFS;
  535. if (mb86a16_read(state, 0x43, &CRM) != 2)
  536. goto err;
  537. if (CRM > 127)
  538. crm = CRM - 256;
  539. else
  540. crm = CRM;
  541. crrerr = smrt * crm / 256;
  542. if (mb86a16_read(state, 0x49, &temp1) != 2)
  543. goto err;
  544. afcen = (temp1 & 0x04) >> 2;
  545. if (afcen == 0) {
  546. if (mb86a16_read(state, 0x2a, &temp1) != 2)
  547. goto err;
  548. afcexen = (temp1 & 0x20) >> 5;
  549. }
  550. if (afcen == 1) {
  551. if (mb86a16_read(state, 0x0e, &AFCML) != 2)
  552. goto err;
  553. if (mb86a16_read(state, 0x0f, &AFCMH) != 2)
  554. goto err;
  555. } else if (afcexen == 1) {
  556. if (mb86a16_read(state, 0x2b, &AFCML) != 2)
  557. goto err;
  558. if (mb86a16_read(state, 0x2c, &AFCMH) != 2)
  559. goto err;
  560. }
  561. if ((afcen == 1) || (afcexen == 1)) {
  562. smrt_info_get(state, smrt);
  563. AFCM = ((AFCMH & 0x01) << 8) + AFCML;
  564. if (AFCM > 255)
  565. afcm = AFCM - 512;
  566. else
  567. afcm = AFCM;
  568. afcerr = afcm * state->master_clk / 8192;
  569. } else
  570. afcerr = 0;
  571. if (mb86a16_read(state, 0x22, &temp1) != 2)
  572. goto err;
  573. if (mb86a16_read(state, 0x23, &temp2) != 2)
  574. goto err;
  575. if (mb86a16_read(state, 0x24, &temp3) != 2)
  576. goto err;
  577. R = (temp1 & 0xe0) >> 5;
  578. M = ((temp1 & 0x1f) << 12) + (temp2 << 4) + (temp3 >> 4);
  579. if (R == 0)
  580. fOSC = 2 * M;
  581. else
  582. fOSC = M;
  583. fOSC_OFS = fOSC - fTP;
  584. if (unit == 0) { //[MHz]
  585. if (crrerr + afcerr + fOSC_OFS * 1000 >= 0)
  586. frqerr = (crrerr + afcerr + fOSC_OFS * 1000 + 500) / 1000;
  587. else
  588. frqerr = (crrerr + afcerr + fOSC_OFS * 1000 - 500) / 1000;
  589. } else { //[kHz]
  590. frqerr = crrerr + afcerr + fOSC_OFS * 1000;
  591. }
  592. return frqerr;
  593. err:
  594. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  595. return -EREMOTEIO;
  596. }
  597. static unsigned char vco_dev_get(struct mb86a16_state *state, int smrt)
  598. {
  599. unsigned char R;
  600. if (smrt > 9375)
  601. R = 0;
  602. else
  603. R = 1;
  604. return R;
  605. }
  606. static void swp_info_get(struct mb86a16_state *state,
  607. int fOSC_start,
  608. int smrt,
  609. int v, int R,
  610. int swp_ofs,
  611. int *fOSC,
  612. int *afcex_freq,
  613. unsigned char *AFCEX_L,
  614. unsigned char *AFCEX_H)
  615. {
  616. int AFCEX ;
  617. int crnt_swp_freq ;
  618. crnt_swp_freq = fOSC_start * 1000 + v * swp_ofs;
  619. if (R == 0 )
  620. *fOSC = (crnt_swp_freq + 1000) / 2000 * 2;
  621. else
  622. *fOSC = (crnt_swp_freq + 500) / 1000;
  623. if (*fOSC >= crnt_swp_freq)
  624. *afcex_freq = *fOSC *1000 - crnt_swp_freq;
  625. else
  626. *afcex_freq = crnt_swp_freq - *fOSC * 1000;
  627. AFCEX = *afcex_freq * 8192 / state->master_clk;
  628. *AFCEX_L = AFCEX & 0x00ff;
  629. *AFCEX_H = (AFCEX & 0x0f00) >> 8;
  630. }
  631. static int swp_freq_calcuation(struct mb86a16_state *state, int i, int v, int *V, int vmax, int vmin,
  632. int SIGMIN, int fOSC, int afcex_freq, int swp_ofs, unsigned char *SIG1)
  633. {
  634. int swp_freq ;
  635. if ((i % 2 == 1) && (v <= vmax)) {
  636. // positive v (case 1)
  637. if ((v - 1 == vmin) &&
  638. (*(V + 30 + v) >= 0) &&
  639. (*(V + 30 + v - 1) >= 0) &&
  640. (*(V + 30 + v - 1) > *(V + 30 + v)) &&
  641. (*(V + 30 + v - 1) > SIGMIN)) {
  642. swp_freq = fOSC * 1000 + afcex_freq - swp_ofs;
  643. *SIG1 = *(V + 30 + v - 1);
  644. } else if ((v == vmax) &&
  645. (*(V + 30 + v) >= 0) &&
  646. (*(V + 30 + v - 1) >= 0) &&
  647. (*(V + 30 + v) > *(V + 30 + v - 1)) &&
  648. (*(V + 30 + v) > SIGMIN)) {
  649. // (case 2)
  650. swp_freq = fOSC * 1000 + afcex_freq;
  651. *SIG1 = *(V + 30 + v);
  652. } else if ((*(V + 30 + v) > 0) &&
  653. (*(V + 30 + v - 1) > 0) &&
  654. (*(V + 30 + v - 2) > 0) &&
  655. (*(V + 30 + v - 3) > 0) &&
  656. (*(V + 30 + v - 1) > *(V + 30 + v)) &&
  657. (*(V + 30 + v - 2) > *(V + 30 + v - 3)) &&
  658. ((*(V + 30 + v - 1) > SIGMIN) ||
  659. (*(V + 30 + v - 2) > SIGMIN))) {
  660. // (case 3)
  661. if (*(V + 30 + v - 1) >= *(V + 30 + v - 2)) {
  662. swp_freq = fOSC * 1000 + afcex_freq - swp_ofs;
  663. *SIG1 = *(V + 30 + v - 1);
  664. } else {
  665. swp_freq = fOSC * 1000 + afcex_freq - swp_ofs * 2;
  666. *SIG1 = *(V + 30 + v - 2);
  667. }
  668. } else if ((v == vmax) &&
  669. (*(V + 30 + v) >= 0) &&
  670. (*(V + 30 + v - 1) >= 0) &&
  671. (*(V + 30 + v - 2) >= 0) &&
  672. (*(V + 30 + v) > *(V + 30 + v - 2)) &&
  673. (*(V + 30 + v - 1) > *(V + 30 + v - 2)) &&
  674. ((*(V + 30 + v) > SIGMIN) ||
  675. (*(V + 30 + v - 1) > SIGMIN))) {
  676. // (case 4)
  677. if (*(V + 30 + v) >= *(V + 30 + v - 1)) {
  678. swp_freq = fOSC * 1000 + afcex_freq;
  679. *SIG1 = *(V + 30 + v);
  680. } else {
  681. swp_freq = fOSC * 1000 + afcex_freq - swp_ofs;
  682. *SIG1 = *(V + 30 + v - 1);
  683. }
  684. } else {
  685. swp_freq = -1 ;
  686. }
  687. } else if ((i % 2 == 0) && (v >= vmin)) {
  688. // Negative v (case 1)
  689. if ((*(V + 30 + v) > 0) &&
  690. (*(V + 30 + v + 1) > 0) &&
  691. (*(V + 30 + v + 2) > 0) &&
  692. (*(V + 30 + v + 1) > *(V + 30 + v)) &&
  693. (*(V + 30 + v + 1) > *(V + 30 + v + 2)) &&
  694. (*(V + 30 + v + 1) > SIGMIN)) {
  695. swp_freq = fOSC * 1000 + afcex_freq + swp_ofs;
  696. *SIG1 = *(V + 30 + v + 1);
  697. } else if ((v + 1 == vmax) &&
  698. (*(V + 30 + v) >= 0) &&
  699. (*(V + 30 + v + 1) >= 0) &&
  700. (*(V + 30 + v + 1) > *(V + 30 + v)) &&
  701. (*(V + 30 + v + 1) > SIGMIN)) {
  702. // (case 2)
  703. swp_freq = fOSC * 1000 + afcex_freq + swp_ofs;
  704. *SIG1 = *(V + 30 + v);
  705. } else if ((v == vmin) &&
  706. (*(V + 30 + v) > 0) &&
  707. (*(V + 30 + v + 1) > 0) &&
  708. (*(V + 30 + v + 2) > 0) &&
  709. (*(V + 30 + v) > *(V + 30 + v + 1)) &&
  710. (*(V + 30 + v) > *(V + 30 + v + 2)) &&
  711. (*(V + 30 + v) > SIGMIN)) {
  712. // (case 3)
  713. swp_freq = fOSC * 1000 + afcex_freq;
  714. *SIG1 = *(V + 30 + v);
  715. } else if ((*(V + 30 + v) >= 0) &&
  716. (*(V + 30 + v + 1) >= 0) &&
  717. (*(V + 30 + v + 2) >= 0) &&
  718. (*(V +30 + v + 3) >= 0) &&
  719. (*(V + 30 + v + 1) > *(V + 30 + v)) &&
  720. (*(V + 30 + v + 2) > *(V + 30 + v + 3)) &&
  721. ((*(V + 30 + v + 1) > SIGMIN) ||
  722. (*(V + 30 + v + 2) > SIGMIN))) {
  723. // (case 4)
  724. if (*(V + 30 + v + 1) >= *(V + 30 + v + 2)) {
  725. swp_freq = fOSC * 1000 + afcex_freq + swp_ofs;
  726. *SIG1 = *(V + 30 + v + 1);
  727. } else {
  728. swp_freq = fOSC * 1000 + afcex_freq + swp_ofs * 2;
  729. *SIG1 = *(V + 30 + v + 2);
  730. }
  731. } else if ((*(V + 30 + v) >= 0) &&
  732. (*(V + 30 + v + 1) >= 0) &&
  733. (*(V + 30 + v + 2) >= 0) &&
  734. (*(V + 30 + v + 3) >= 0) &&
  735. (*(V + 30 + v) > *(V + 30 + v + 2)) &&
  736. (*(V + 30 + v + 1) > *(V + 30 + v + 2)) &&
  737. (*(V + 30 + v) > *(V + 30 + v + 3)) &&
  738. (*(V + 30 + v + 1) > *(V + 30 + v + 3)) &&
  739. ((*(V + 30 + v) > SIGMIN) ||
  740. (*(V + 30 + v + 1) > SIGMIN))) {
  741. // (case 5)
  742. if (*(V + 30 + v) >= *(V + 30 + v + 1)) {
  743. swp_freq = fOSC * 1000 + afcex_freq;
  744. *SIG1 = *(V + 30 + v);
  745. } else {
  746. swp_freq = fOSC * 1000 + afcex_freq + swp_ofs;
  747. *SIG1 = *(V + 30 + v + 1);
  748. }
  749. } else if ((v + 2 == vmin) &&
  750. (*(V + 30 + v) >= 0) &&
  751. (*(V + 30 + v + 1) >= 0) &&
  752. (*(V + 30 + v + 2) >= 0) &&
  753. (*(V + 30 + v + 1) > *(V + 30 + v)) &&
  754. (*(V + 30 + v + 2) > *(V + 30 + v)) &&
  755. ((*(V + 30 + v + 1) > SIGMIN) ||
  756. (*(V + 30 + v + 2) > SIGMIN))) {
  757. // (case 6)
  758. if (*(V + 30 + v + 1) >= *(V + 30 + v + 2)) {
  759. swp_freq = fOSC * 1000 + afcex_freq + swp_ofs;
  760. *SIG1 = *(V + 30 + v + 1);
  761. } else {
  762. swp_freq = fOSC * 1000 + afcex_freq + swp_ofs * 2;
  763. *SIG1 = *(V + 30 + v + 2);
  764. }
  765. } else if ((vmax == 0) && (vmin == 0) && (*(V + 30 + v) > SIGMIN)) {
  766. swp_freq = fOSC * 1000;
  767. *SIG1 = *(V + 30 + v);
  768. } else swp_freq = -1;
  769. } else swp_freq = -1;
  770. return swp_freq;
  771. }
  772. static void swp_info_get2(struct mb86a16_state *state,
  773. int smrt,
  774. int R,
  775. int swp_freq,
  776. int *afcex_freq,
  777. int *fOSC,
  778. unsigned char *AFCEX_L,
  779. unsigned char *AFCEX_H)
  780. {
  781. int AFCEX ;
  782. if (R == 0)
  783. *fOSC = (swp_freq + 1000) / 2000 * 2;
  784. else
  785. *fOSC = (swp_freq + 500) / 1000;
  786. if (*fOSC >= swp_freq)
  787. *afcex_freq = *fOSC * 1000 - swp_freq;
  788. else
  789. *afcex_freq = swp_freq - *fOSC * 1000;
  790. AFCEX = *afcex_freq * 8192 / state->master_clk;
  791. *AFCEX_L = AFCEX & 0x00ff;
  792. *AFCEX_H = (AFCEX & 0x0f00) >> 8;
  793. }
  794. static void afcex_info_get(struct mb86a16_state *state,
  795. int afcex_freq,
  796. unsigned char *AFCEX_L,
  797. unsigned char *AFCEX_H)
  798. {
  799. int AFCEX ;
  800. AFCEX = afcex_freq * 8192 / state->master_clk;
  801. *AFCEX_L = AFCEX & 0x00ff;
  802. *AFCEX_H = (AFCEX & 0x0f00) >> 8;
  803. }
  804. static int SEQ_set(struct mb86a16_state *state, unsigned char loop)
  805. {
  806. // SLOCK0 = 0
  807. if (mb86a16_write(state, 0x32, 0x02 | (loop << 2)) < 0) {
  808. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  809. return -EREMOTEIO;
  810. }
  811. return 0;
  812. }
  813. static int iq_vt_set(struct mb86a16_state *state, unsigned char IQINV)
  814. {
  815. // Viterbi Rate, IQ Settings
  816. if (mb86a16_write(state, 0x06, 0xdf | (IQINV << 5)) < 0) {
  817. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  818. return -EREMOTEIO;
  819. }
  820. return 0;
  821. }
  822. static int FEC_srst(struct mb86a16_state *state)
  823. {
  824. if (mb86a16_write(state, MB86A16_RESET, 0x02) < 0) {
  825. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  826. return -EREMOTEIO;
  827. }
  828. return 0;
  829. }
  830. static int S2T_set(struct mb86a16_state *state, unsigned char S2T)
  831. {
  832. if (mb86a16_write(state, 0x34, 0x70 | S2T) < 0) {
  833. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  834. return -EREMOTEIO;
  835. }
  836. return 0;
  837. }
  838. static int S45T_set(struct mb86a16_state *state, unsigned char S4T, unsigned char S5T)
  839. {
  840. if (mb86a16_write(state, 0x35, 0x00 | (S5T << 4) | S4T) < 0) {
  841. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  842. return -EREMOTEIO;
  843. }
  844. return 0;
  845. }
  846. static int mb86a16_set_fe(struct mb86a16_state *state)
  847. {
  848. u8 agcval, cnmval;
  849. int i, j;
  850. int fOSC = 0;
  851. int fOSC_start = 0;
  852. int wait_t;
  853. int fcp;
  854. int swp_ofs;
  855. int V[60];
  856. u8 SIG1MIN;
  857. unsigned char CREN, AFCEN, AFCEXEN;
  858. unsigned char SIG1;
  859. unsigned char TIMINT1, TIMINT2, TIMEXT;
  860. unsigned char S0T, S1T;
  861. unsigned char S2T;
  862. // unsigned char S2T, S3T;
  863. unsigned char S4T, S5T;
  864. unsigned char AFCEX_L, AFCEX_H;
  865. unsigned char R;
  866. unsigned char VIRM;
  867. unsigned char ETH, VIA;
  868. unsigned char junk;
  869. int loop;
  870. int ftemp;
  871. int v, vmax, vmin;
  872. int vmax_his, vmin_his;
  873. int swp_freq, prev_swp_freq[20];
  874. int prev_freq_num;
  875. int signal_dupl;
  876. int afcex_freq;
  877. int signal;
  878. int afcerr;
  879. int temp_freq, delta_freq;
  880. int dagcm[4];
  881. int smrt_d;
  882. // int freq_err;
  883. int n;
  884. int ret = -1;
  885. int sync;
  886. dprintk(verbose, MB86A16_INFO, 1, "freq=%d Mhz, symbrt=%d Ksps", state->frequency, state->srate);
  887. fcp = 5000; // (carrier recovery [kHz])
  888. // fcp = 3000;
  889. swp_ofs = state->srate / 4;
  890. for (i = 0; i < 60; i++)
  891. V[i] = -1;
  892. for (i = 0; i < 20; i++)
  893. prev_swp_freq[i] = 0;
  894. SIG1MIN = 25;
  895. for (n = 0; ((n < 3) && (ret == -1)); n++) {
  896. SEQ_set(state, 0);
  897. iq_vt_set(state, 0);
  898. CREN = 0;
  899. AFCEN = 0;
  900. AFCEXEN = 1;
  901. TIMINT1 = 0;
  902. TIMINT2 = 1;
  903. TIMEXT = 2;
  904. S1T = 0;
  905. S0T = 0;
  906. if (initial_set(state) < 0) {
  907. dprintk(verbose, MB86A16_ERROR, 1, "initial set failed");
  908. return -1;
  909. }
  910. if (DAGC_data_set(state, 3, 2) < 0) {
  911. dprintk(verbose, MB86A16_ERROR, 1, "DAGC data set error");
  912. return -1;
  913. }
  914. if (EN_set(state, CREN, AFCEN) < 0) {
  915. dprintk(verbose, MB86A16_ERROR, 1, "EN set error");
  916. return -1; // (0, 0)
  917. }
  918. if (AFCEXEN_set(state, AFCEXEN, state->srate) < 0) {
  919. dprintk(verbose, MB86A16_ERROR, 1, "AFCEXEN set error");
  920. return -1; // (1, smrt) = (1, symbolrate)
  921. }
  922. if (CNTM_set(state, TIMINT1, TIMINT2, TIMEXT) < 0) {
  923. dprintk(verbose, MB86A16_ERROR, 1, "CNTM set error");
  924. return -1; // (0, 1, 2)
  925. }
  926. if (S01T_set(state, S1T, S0T) < 0) {
  927. dprintk(verbose, MB86A16_ERROR, 1, "S01T set error");
  928. return -1; // (0, 0)
  929. }
  930. smrt_info_get(state, state->srate);
  931. if (smrt_set(state, state->srate) < 0) {
  932. dprintk(verbose, MB86A16_ERROR, 1, "smrt info get error");
  933. return -1;
  934. }
  935. R = vco_dev_get(state, state->srate);
  936. if (R == 1)
  937. fOSC_start = state->frequency;
  938. else if (R == 0) {
  939. if (state->frequency % 2 == 0) {
  940. fOSC_start = state->frequency;
  941. } else {
  942. fOSC_start = state->frequency + 1;
  943. if (fOSC_start > 2150)
  944. fOSC_start = state->frequency - 1;
  945. }
  946. }
  947. loop = 1;
  948. ftemp = fOSC_start * 1000;
  949. vmax = 0 ;
  950. while (loop == 1) {
  951. ftemp = ftemp + swp_ofs;
  952. vmax++;
  953. // Upper bound
  954. if (ftemp > 2150000) {
  955. loop = 0;
  956. vmax--;
  957. }
  958. else if ((ftemp == 2150000) || (ftemp - state->frequency * 1000 >= fcp + state->srate / 4))
  959. loop = 0;
  960. }
  961. loop = 1;
  962. ftemp = fOSC_start * 1000;
  963. vmin = 0 ;
  964. while (loop == 1) {
  965. ftemp = ftemp - swp_ofs;
  966. vmin--;
  967. // Lower bound
  968. if (ftemp < 950000) {
  969. loop = 0;
  970. vmin++;
  971. }
  972. else if ((ftemp == 950000) || (state->frequency * 1000 - ftemp >= fcp + state->srate / 4))
  973. loop = 0;
  974. }
  975. wait_t = (8000 + state->srate / 2) / state->srate;
  976. if (wait_t == 0)
  977. wait_t = 1;
  978. i = 0;
  979. j = 0;
  980. prev_freq_num = 0;
  981. loop = 1;
  982. signal = 0;
  983. vmax_his = 0;
  984. vmin_his = 0;
  985. v = 0;
  986. while (loop == 1) {
  987. swp_info_get(state, fOSC_start, state->srate,
  988. v, R, swp_ofs, &fOSC,
  989. &afcex_freq, &AFCEX_L, &AFCEX_H);
  990. if (rf_val_set(state, fOSC, state->srate, R) < 0) {
  991. dprintk(verbose, MB86A16_ERROR, 1, "rf val set error");
  992. return -1;
  993. }
  994. if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) {
  995. dprintk(verbose, MB86A16_ERROR, 1, "afcex data set error");
  996. return -1;
  997. }
  998. if (srst(state) < 0) {
  999. dprintk(verbose, MB86A16_ERROR, 1, "srst error");
  1000. return -1;
  1001. }
  1002. msleep_interruptible(wait_t);
  1003. if (mb86a16_read(state, 0x37, &SIG1) != 2) {
  1004. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  1005. return -1;
  1006. }
  1007. V[30 + v] = SIG1 ;
  1008. swp_freq = swp_freq_calcuation(state, i, v, V, vmax, vmin,
  1009. SIG1MIN, fOSC, afcex_freq,
  1010. swp_ofs, &SIG1); //changed
  1011. signal_dupl = 0;
  1012. for (j = 0; j < prev_freq_num; j++) {
  1013. if ((ABS(prev_swp_freq[j] - swp_freq)) < (swp_ofs * 3 / 2)) {
  1014. signal_dupl = 1;
  1015. dprintk(verbose, MB86A16_INFO, 1, "Probably Duplicate Signal, j = %d", j);
  1016. }
  1017. }
  1018. if ((signal_dupl == 0) && (swp_freq > 0) && (ABS(swp_freq - state->frequency * 1000) < fcp + state->srate / 6)) {
  1019. dprintk(verbose, MB86A16_DEBUG, 1, "------ Signal detect ------ [swp_freq=[%07d, srate=%05d]]", swp_freq, state->srate);
  1020. prev_swp_freq[prev_freq_num] = swp_freq;
  1021. prev_freq_num++;
  1022. swp_info_get2(state, state->srate, R, swp_freq,
  1023. &afcex_freq, &fOSC,
  1024. &AFCEX_L, &AFCEX_H);
  1025. if (rf_val_set(state, fOSC, state->srate, R) < 0) {
  1026. dprintk(verbose, MB86A16_ERROR, 1, "rf val set error");
  1027. return -1;
  1028. }
  1029. if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) {
  1030. dprintk(verbose, MB86A16_ERROR, 1, "afcex data set error");
  1031. return -1;
  1032. }
  1033. signal = signal_det(state, state->srate, &SIG1);
  1034. if (signal == 1) {
  1035. dprintk(verbose, MB86A16_ERROR, 1, "***** Signal Found *****");
  1036. loop = 0;
  1037. } else {
  1038. dprintk(verbose, MB86A16_ERROR, 1, "!!!!! No signal !!!!!, try again...");
  1039. smrt_info_get(state, state->srate);
  1040. if (smrt_set(state, state->srate) < 0) {
  1041. dprintk(verbose, MB86A16_ERROR, 1, "smrt set error");
  1042. return -1;
  1043. }
  1044. }
  1045. }
  1046. if (v > vmax)
  1047. vmax_his = 1 ;
  1048. if (v < vmin)
  1049. vmin_his = 1 ;
  1050. i++;
  1051. if ((i % 2 == 1) && (vmax_his == 1))
  1052. i++;
  1053. if ((i % 2 == 0) && (vmin_his == 1))
  1054. i++;
  1055. if (i % 2 == 1)
  1056. v = (i + 1) / 2;
  1057. else
  1058. v = -i / 2;
  1059. if ((vmax_his == 1) && (vmin_his == 1))
  1060. loop = 0 ;
  1061. }
  1062. if (signal == 1) {
  1063. dprintk(verbose, MB86A16_INFO, 1, " Start Freq Error Check");
  1064. S1T = 7 ;
  1065. S0T = 1 ;
  1066. CREN = 0 ;
  1067. AFCEN = 1 ;
  1068. AFCEXEN = 0 ;
  1069. if (S01T_set(state, S1T, S0T) < 0) {
  1070. dprintk(verbose, MB86A16_ERROR, 1, "S01T set error");
  1071. return -1;
  1072. }
  1073. smrt_info_get(state, state->srate);
  1074. if (smrt_set(state, state->srate) < 0) {
  1075. dprintk(verbose, MB86A16_ERROR, 1, "smrt set error");
  1076. return -1;
  1077. }
  1078. if (EN_set(state, CREN, AFCEN) < 0) {
  1079. dprintk(verbose, MB86A16_ERROR, 1, "EN set error");
  1080. return -1;
  1081. }
  1082. if (AFCEXEN_set(state, AFCEXEN, state->srate) < 0) {
  1083. dprintk(verbose, MB86A16_ERROR, 1, "AFCEXEN set error");
  1084. return -1;
  1085. }
  1086. afcex_info_get(state, afcex_freq, &AFCEX_L, &AFCEX_H);
  1087. if (afcofs_data_set(state, AFCEX_L, AFCEX_H) < 0) {
  1088. dprintk(verbose, MB86A16_ERROR, 1, "AFCOFS data set error");
  1089. return -1;
  1090. }
  1091. if (srst(state) < 0) {
  1092. dprintk(verbose, MB86A16_ERROR, 1, "srst error");
  1093. return -1;
  1094. }
  1095. // delay 4~200
  1096. wait_t = 200000 / state->master_clk + 200000 / state->srate;
  1097. msleep(wait_t);
  1098. afcerr = afcerr_chk(state);
  1099. if (afcerr == -1)
  1100. return -1;
  1101. swp_freq = fOSC * 1000 + afcerr ;
  1102. AFCEXEN = 1 ;
  1103. if (state->srate >= 1500)
  1104. smrt_d = state->srate / 3;
  1105. else
  1106. smrt_d = state->srate / 2;
  1107. smrt_info_get(state, smrt_d);
  1108. if (smrt_set(state, smrt_d) < 0) {
  1109. dprintk(verbose, MB86A16_ERROR, 1, "smrt set error");
  1110. return -1;
  1111. }
  1112. if (AFCEXEN_set(state, AFCEXEN, smrt_d) < 0) {
  1113. dprintk(verbose, MB86A16_ERROR, 1, "AFCEXEN set error");
  1114. return -1;
  1115. }
  1116. R = vco_dev_get(state, smrt_d);
  1117. if (DAGC_data_set(state, 2, 0) < 0) {
  1118. dprintk(verbose, MB86A16_ERROR, 1, "DAGC data set error");
  1119. return -1;
  1120. }
  1121. for (i = 0; i < 3; i++) {
  1122. temp_freq = swp_freq + (i - 1) * state->srate / 8;
  1123. swp_info_get2(state, smrt_d, R, temp_freq, &afcex_freq, &fOSC, &AFCEX_L, &AFCEX_H);
  1124. if (rf_val_set(state, fOSC, smrt_d, R) < 0) {
  1125. dprintk(verbose, MB86A16_ERROR, 1, "rf val set error");
  1126. return -1;
  1127. }
  1128. if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) {
  1129. dprintk(verbose, MB86A16_ERROR, 1, "afcex data set error");
  1130. return -1;
  1131. }
  1132. wait_t = 200000 / state->master_clk + 40000 / smrt_d;
  1133. msleep(wait_t);
  1134. dagcm[i] = dagcm_val_get(state);
  1135. }
  1136. if ((dagcm[0] > dagcm[1]) &&
  1137. (dagcm[0] > dagcm[2]) &&
  1138. (dagcm[0] - dagcm[1] > 2 * (dagcm[2] - dagcm[1]))) {
  1139. temp_freq = swp_freq - 2 * state->srate / 8;
  1140. swp_info_get2(state, smrt_d, R, temp_freq, &afcex_freq, &fOSC, &AFCEX_L, &AFCEX_H);
  1141. if (rf_val_set(state, fOSC, smrt_d, R) < 0) {
  1142. dprintk(verbose, MB86A16_ERROR, 1, "rf val set error");
  1143. return -1;
  1144. }
  1145. if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) {
  1146. dprintk(verbose, MB86A16_ERROR, 1, "afcex data set");
  1147. return -1;
  1148. }
  1149. wait_t = 200000 / state->master_clk + 40000 / smrt_d;
  1150. msleep(wait_t);
  1151. dagcm[3] = dagcm_val_get(state);
  1152. if (dagcm[3] > dagcm[1])
  1153. delta_freq = (dagcm[2] - dagcm[0] + dagcm[1] - dagcm[3]) * state->srate / 300;
  1154. else
  1155. delta_freq = 0;
  1156. } else if ((dagcm[2] > dagcm[1]) &&
  1157. (dagcm[2] > dagcm[0]) &&
  1158. (dagcm[2] - dagcm[1] > 2 * (dagcm[0] - dagcm[1]))) {
  1159. temp_freq = swp_freq + 2 * state->srate / 8;
  1160. swp_info_get2(state, smrt_d, R, temp_freq, &afcex_freq, &fOSC, &AFCEX_L, &AFCEX_H);
  1161. if (rf_val_set(state, fOSC, smrt_d, R) < 0) {
  1162. dprintk(verbose, MB86A16_ERROR, 1, "rf val set");
  1163. return -1;
  1164. }
  1165. if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) {
  1166. dprintk(verbose, MB86A16_ERROR, 1, "afcex data set");
  1167. return -1;
  1168. }
  1169. wait_t = 200000 / state->master_clk + 40000 / smrt_d;
  1170. msleep(wait_t);
  1171. dagcm[3] = dagcm_val_get(state);
  1172. if (dagcm[3] > dagcm[1])
  1173. delta_freq = (dagcm[2] - dagcm[0] + dagcm[3] - dagcm[1]) * state->srate / 300;
  1174. else
  1175. delta_freq = 0 ;
  1176. } else {
  1177. delta_freq = 0 ;
  1178. }
  1179. dprintk(verbose, MB86A16_INFO, 1, "SWEEP Frequency = %d", swp_freq);
  1180. swp_freq += delta_freq;
  1181. dprintk(verbose, MB86A16_INFO, 1, "Adjusting .., DELTA Freq = %d, SWEEP Freq=%d", delta_freq, swp_freq);
  1182. if (ABS(state->frequency * 1000 - swp_freq) > 3800) {
  1183. dprintk(verbose, MB86A16_INFO, 1, "NO -- SIGNAL !");
  1184. } else {
  1185. S1T = 0;
  1186. S0T = 3;
  1187. CREN = 1;
  1188. AFCEN = 0;
  1189. AFCEXEN = 1;
  1190. if (S01T_set(state, S1T, S0T) < 0) {
  1191. dprintk(verbose, MB86A16_ERROR, 1, "S01T set error");
  1192. return -1;
  1193. }
  1194. if (DAGC_data_set(state, 0, 0) < 0) {
  1195. dprintk(verbose, MB86A16_ERROR, 1, "DAGC data set error");
  1196. return -1;
  1197. }
  1198. R = vco_dev_get(state, state->srate);
  1199. smrt_info_get(state, state->srate);
  1200. if (smrt_set(state, state->srate) < 0) {
  1201. dprintk(verbose, MB86A16_ERROR, 1, "smrt set error");
  1202. return -1;
  1203. }
  1204. if (EN_set(state, CREN, AFCEN) < 0) {
  1205. dprintk(verbose, MB86A16_ERROR, 1, "EN set error");
  1206. return -1;
  1207. }
  1208. if (AFCEXEN_set(state, AFCEXEN, state->srate) < 0) {
  1209. dprintk(verbose, MB86A16_ERROR, 1, "AFCEXEN set error");
  1210. return -1;
  1211. }
  1212. swp_info_get2(state, state->srate, R, swp_freq, &afcex_freq, &fOSC, &AFCEX_L, &AFCEX_H);
  1213. if (rf_val_set(state, fOSC, state->srate, R) < 0) {
  1214. dprintk(verbose, MB86A16_ERROR, 1, "rf val set error");
  1215. return -1;
  1216. }
  1217. if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) {
  1218. dprintk(verbose, MB86A16_ERROR, 1, "afcex data set error");
  1219. return -1;
  1220. }
  1221. if (srst(state) < 0) {
  1222. dprintk(verbose, MB86A16_ERROR, 1, "srst error");
  1223. return -1;
  1224. }
  1225. wait_t = 7 + (10000 + state->srate / 2) / state->srate;
  1226. if (wait_t == 0)
  1227. wait_t = 1;
  1228. msleep_interruptible(wait_t);
  1229. if (mb86a16_read(state, 0x37, &SIG1) != 2) {
  1230. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  1231. return -EREMOTEIO;
  1232. }
  1233. if (SIG1 > 110) {
  1234. S2T = 4; S4T = 1; S5T = 6; ETH = 4; VIA = 6;
  1235. wait_t = 7 + (917504 + state->srate / 2) / state->srate;
  1236. } else if (SIG1 > 105) {
  1237. S2T = 4; S4T = 2; S5T = 8; ETH = 7; VIA = 2;
  1238. wait_t = 7 + (1048576 + state->srate / 2) / state->srate;
  1239. } else if (SIG1 > 85) {
  1240. S2T = 5; S4T = 2; S5T = 8; ETH = 7; VIA = 2;
  1241. wait_t = 7 + (1310720 + state->srate / 2) / state->srate;
  1242. } else if (SIG1 > 65) {
  1243. S2T = 6; S4T = 2; S5T = 8; ETH = 7; VIA = 2;
  1244. wait_t = 7 + (1572864 + state->srate / 2) / state->srate;
  1245. } else {
  1246. S2T = 7; S4T = 2; S5T = 8; ETH = 7; VIA = 2;
  1247. wait_t = 7 + (2097152 + state->srate / 2) / state->srate;
  1248. }
  1249. S2T_set(state, S2T);
  1250. S45T_set(state, S4T, S5T);
  1251. Vi_set(state, ETH, VIA);
  1252. srst(state);
  1253. msleep_interruptible(wait_t);
  1254. sync = sync_chk(state, &VIRM);
  1255. dprintk(verbose, MB86A16_INFO, 1, "-------- Viterbi=[%d] SYNC=[%d] ---------", VIRM, sync);
  1256. if (mb86a16_read(state, 0x0d, &state->signal) != 2) {
  1257. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  1258. return -EREMOTEIO;
  1259. }
  1260. if (VIRM) {
  1261. if (VIRM == 4) { // 5/6
  1262. if (SIG1 > 110)
  1263. wait_t = ( 786432 + state->srate / 2) / state->srate;
  1264. else
  1265. wait_t = (1572864 + state->srate / 2) / state->srate;
  1266. if (state->srate < 5000)
  1267. // FIXME ! , should be a long wait !
  1268. msleep_interruptible(wait_t);
  1269. else
  1270. msleep_interruptible(wait_t);
  1271. if (sync_chk(state, &junk) == 0) {
  1272. iq_vt_set(state, 1);
  1273. FEC_srst(state);
  1274. }
  1275. if (SIG1 > 110)
  1276. wait_t = ( 786432 + state->srate / 2) / state->srate;
  1277. else
  1278. wait_t = (1572864 + state->srate / 2) / state->srate;
  1279. msleep_interruptible(wait_t);
  1280. SEQ_set(state, 1);
  1281. } else { // 1/2, 2/3, 3/4, 7/8
  1282. if (SIG1 > 110)
  1283. wait_t = ( 786432 + state->srate / 2) / state->srate;
  1284. else
  1285. wait_t = (1572864 + state->srate / 2) / state->srate;
  1286. msleep_interruptible(wait_t);
  1287. SEQ_set(state, 1);
  1288. }
  1289. } else {
  1290. dprintk(verbose, MB86A16_INFO, 1, "NO -- SIGNAL");
  1291. SEQ_set(state, 1);
  1292. }
  1293. }
  1294. } else {
  1295. dprintk (verbose, MB86A16_INFO, 1, "NO -- SIGNAL");
  1296. }
  1297. sync = sync_chk(state, &junk);
  1298. if (sync) {
  1299. dprintk(verbose, MB86A16_INFO, 1, "******* SYNC *******");
  1300. freqerr_chk(state, state->frequency, state->srate, 1);
  1301. }
  1302. }
  1303. mb86a16_read(state, 0x15, &agcval);
  1304. mb86a16_read(state, 0x26, &cnmval);
  1305. dprintk(verbose, MB86A16_INFO, 1, "AGC = %02x CNM = %02x", agcval, cnmval);
  1306. return ret;
  1307. }
  1308. static int mb86a16_send_diseqc_msg(struct dvb_frontend *fe,
  1309. struct dvb_diseqc_master_cmd *cmd)
  1310. {
  1311. struct mb86a16_state *state = fe->demodulator_priv;
  1312. int i;
  1313. u8 regs;
  1314. if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA) < 0)
  1315. goto err;
  1316. if (mb86a16_write(state, MB86A16_DCCOUT, 0x00) < 0)
  1317. goto err;
  1318. if (mb86a16_write(state, MB86A16_TONEOUT2, 0x04) < 0)
  1319. goto err;
  1320. regs = 0x18;
  1321. if (cmd->msg_len > 5 || cmd->msg_len < 4)
  1322. return -EINVAL;
  1323. for (i = 0; i < cmd->msg_len; i++) {
  1324. if (mb86a16_write(state, regs, cmd->msg[i]) < 0)
  1325. goto err;
  1326. regs++;
  1327. }
  1328. i += 0x90;
  1329. msleep_interruptible(10);
  1330. if (mb86a16_write(state, MB86A16_DCC1, i) < 0)
  1331. goto err;
  1332. if (mb86a16_write(state, MB86A16_DCCOUT, MB86A16_DCCOUT_DISEN) < 0)
  1333. goto err;
  1334. return 0;
  1335. err:
  1336. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  1337. return -EREMOTEIO;
  1338. }
  1339. static int mb86a16_send_diseqc_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t burst)
  1340. {
  1341. struct mb86a16_state *state = fe->demodulator_priv;
  1342. switch (burst) {
  1343. case SEC_MINI_A:
  1344. if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA |
  1345. MB86A16_DCC1_TBEN |
  1346. MB86A16_DCC1_TBO) < 0)
  1347. goto err;
  1348. if (mb86a16_write(state, MB86A16_DCCOUT, MB86A16_DCCOUT_DISEN) < 0)
  1349. goto err;
  1350. break;
  1351. case SEC_MINI_B:
  1352. if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA |
  1353. MB86A16_DCC1_TBEN) < 0)
  1354. goto err;
  1355. if (mb86a16_write(state, MB86A16_DCCOUT, MB86A16_DCCOUT_DISEN) < 0)
  1356. goto err;
  1357. break;
  1358. }
  1359. return 0;
  1360. err:
  1361. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  1362. return -EREMOTEIO;
  1363. }
  1364. static int mb86a16_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone)
  1365. {
  1366. struct mb86a16_state *state = fe->demodulator_priv;
  1367. switch (tone) {
  1368. case SEC_TONE_ON:
  1369. if (mb86a16_write(state, MB86A16_TONEOUT2, 0x00) < 0)
  1370. goto err;
  1371. if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA |
  1372. MB86A16_DCC1_CTOE) < 0)
  1373. goto err;
  1374. if (mb86a16_write(state, MB86A16_DCCOUT, MB86A16_DCCOUT_DISEN) < 0)
  1375. goto err;
  1376. break;
  1377. case SEC_TONE_OFF:
  1378. if (mb86a16_write(state, MB86A16_TONEOUT2, 0x04) < 0)
  1379. goto err;
  1380. if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA) < 0)
  1381. goto err;
  1382. if (mb86a16_write(state, MB86A16_DCCOUT, 0x00) < 0)
  1383. goto err;
  1384. break;
  1385. default:
  1386. return -EINVAL;
  1387. }
  1388. return 0;
  1389. err:
  1390. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  1391. return -EREMOTEIO;
  1392. }
  1393. #define MB86A16_FE_ALGO 1
  1394. static int mb86a16_frontend_algo(struct dvb_frontend *fe)
  1395. {
  1396. return MB86A16_FE_ALGO;
  1397. }
  1398. static int mb86a16_set_frontend(struct dvb_frontend *fe,
  1399. struct dvb_frontend_parameters *p,
  1400. unsigned int mode_flags,
  1401. int *delay,
  1402. fe_status_t *status)
  1403. {
  1404. int ret = 0;
  1405. struct mb86a16_state *state = fe->demodulator_priv;
  1406. if (p != NULL) {
  1407. state->frequency = p->frequency / 1000;
  1408. state->srate = p->u.qpsk.symbol_rate / 1000;
  1409. ret = mb86a16_set_fe(state);
  1410. }
  1411. if (!(mode_flags & FE_TUNE_MODE_ONESHOT))
  1412. mb86a16_read_status(fe, status);
  1413. *delay = HZ/3000;
  1414. return ret;
  1415. }
  1416. static void mb86a16_release(struct dvb_frontend *fe)
  1417. {
  1418. struct mb86a16_state *state = fe->demodulator_priv;
  1419. kfree(state);
  1420. }
  1421. static int mb86a16_init(struct dvb_frontend *fe)
  1422. {
  1423. return 0;
  1424. }
  1425. static int mb86a16_sleep(struct dvb_frontend *fe)
  1426. {
  1427. return 0;
  1428. }
  1429. static int mb86a16_read_ber(struct dvb_frontend *fe, u32 *ber)
  1430. {
  1431. return 0;
  1432. }
  1433. static int mb86a16_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
  1434. {
  1435. *strength = 0;
  1436. return 0;
  1437. }
  1438. struct cnr {
  1439. u8 cn_reg;
  1440. u8 cn_val;
  1441. };
  1442. static const struct cnr cnr_tab[] = {
  1443. { 35, 2 },
  1444. { 40, 3 },
  1445. { 50, 4 },
  1446. { 60, 5 },
  1447. { 70, 6 },
  1448. { 80, 7 },
  1449. { 92, 8 },
  1450. { 103, 9 },
  1451. { 115, 10 },
  1452. { 138, 12 },
  1453. { 162, 15 },
  1454. { 180, 18 },
  1455. { 185, 19 },
  1456. { 189, 20 },
  1457. { 195, 22 },
  1458. { 199, 24 },
  1459. { 201, 25 },
  1460. { 202, 26 },
  1461. { 203, 27 },
  1462. { 205, 28 },
  1463. { 208, 30 }
  1464. };
  1465. static int mb86a16_read_snr(struct dvb_frontend *fe, u16 *snr)
  1466. {
  1467. struct mb86a16_state *state = fe->demodulator_priv;
  1468. int i = 0;
  1469. int low_tide = 2, high_tide = 30, q_level;
  1470. u8 cn;
  1471. if (mb86a16_read(state, 0x26, &cn) != 2) {
  1472. dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
  1473. return -EREMOTEIO;
  1474. }
  1475. for (i = 0; i < ARRAY_SIZE(cnr_tab); i++) {
  1476. if (cn < cnr_tab[i].cn_reg) {
  1477. *snr = cnr_tab[i].cn_val;
  1478. break;
  1479. }
  1480. }
  1481. q_level = (*snr * 100) / (high_tide - low_tide);
  1482. dprintk(verbose, MB86A16_ERROR, 1, "SNR (Quality) = [%d dB], Level=%d %%", *snr, q_level);
  1483. return 0;
  1484. }
  1485. static int mb86a16_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
  1486. {
  1487. return 0;
  1488. }
  1489. static struct dvb_frontend_ops mb86a16_ops = {
  1490. .info = {
  1491. .name = "Fujitsu MB86A16 DVB-S",
  1492. .type = FE_QPSK,
  1493. .frequency_min = 950000,
  1494. .frequency_max = 2150000,
  1495. .frequency_stepsize = 125,
  1496. .frequency_tolerance = 0,
  1497. .symbol_rate_min = 1000000,
  1498. .symbol_rate_max = 45000000,
  1499. .symbol_rate_tolerance = 500,
  1500. .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
  1501. FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 |
  1502. FE_CAN_FEC_7_8 | FE_CAN_QPSK |
  1503. FE_CAN_FEC_AUTO
  1504. },
  1505. .release = mb86a16_release,
  1506. .tune = mb86a16_set_frontend,
  1507. .read_status = mb86a16_read_status,
  1508. .get_frontend_algo = mb86a16_frontend_algo,
  1509. .init = mb86a16_init,
  1510. .sleep = mb86a16_sleep,
  1511. .read_status = mb86a16_read_status,
  1512. .read_ber = mb86a16_read_ber,
  1513. .read_signal_strength = mb86a16_read_signal_strength,
  1514. .read_snr = mb86a16_read_snr,
  1515. .read_ucblocks = mb86a16_read_ucblocks,
  1516. .diseqc_send_master_cmd = mb86a16_send_diseqc_msg,
  1517. .diseqc_send_burst = mb86a16_send_diseqc_burst,
  1518. .set_tone = mb86a16_set_tone,
  1519. };
  1520. struct dvb_frontend *mb86a16_attach(const struct mb86a16_config *config,
  1521. struct i2c_adapter *i2c_adap)
  1522. {
  1523. u8 dev_id = 0;
  1524. struct mb86a16_state *state = NULL;
  1525. state = kmalloc(sizeof (struct mb86a16_state), GFP_KERNEL);
  1526. if (state == NULL)
  1527. goto error;
  1528. state->config = config;
  1529. state->i2c_adap = i2c_adap;
  1530. mb86a16_read(state, 0x7f, &dev_id);
  1531. if (dev_id != 0xfe)
  1532. goto error;
  1533. memcpy(&state->frontend.ops, &mb86a16_ops, sizeof (struct dvb_frontend_ops));
  1534. state->frontend.demodulator_priv = state;
  1535. state->frontend.ops.set_voltage = state->config->set_voltage;
  1536. return &state->frontend;
  1537. error:
  1538. kfree(state);
  1539. return NULL;
  1540. }
  1541. EXPORT_SYMBOL(mb86a16_attach);
  1542. MODULE_LICENSE("GPL");
  1543. MODULE_AUTHOR("Manu Abraham");