tda18271c2dd.c 27 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063
  1. /*
  2. * tda18271c2dd: Driver for the TDA18271C2 tuner
  3. *
  4. * Copyright (C) 2010 Digital Devices GmbH
  5. *
  6. *
  7. * This program is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU General Public License
  9. * version 2 only, as published by the Free Software Foundation.
  10. *
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  21. * 02110-1301, USA
  22. * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
  23. */
  24. #include <linux/kernel.h>
  25. #include <linux/module.h>
  26. #include <linux/moduleparam.h>
  27. #include <linux/init.h>
  28. #include <linux/delay.h>
  29. #include <linux/firmware.h>
  30. #include <linux/i2c.h>
  31. #include <linux/version.h>
  32. #include <asm/div64.h>
  33. #include "dvb_frontend.h"
  34. struct SStandardParam {
  35. s32 m_IFFrequency;
  36. u32 m_BandWidth;
  37. u8 m_EP3_4_0;
  38. u8 m_EB22;
  39. };
  40. struct SMap {
  41. u32 m_Frequency;
  42. u8 m_Param;
  43. };
  44. struct SMapI {
  45. u32 m_Frequency;
  46. s32 m_Param;
  47. };
  48. struct SMap2 {
  49. u32 m_Frequency;
  50. u8 m_Param1;
  51. u8 m_Param2;
  52. };
  53. struct SRFBandMap {
  54. u32 m_RF_max;
  55. u32 m_RF1_Default;
  56. u32 m_RF2_Default;
  57. u32 m_RF3_Default;
  58. };
  59. enum ERegister
  60. {
  61. ID = 0,
  62. TM,
  63. PL,
  64. EP1, EP2, EP3, EP4, EP5,
  65. CPD, CD1, CD2, CD3,
  66. MPD, MD1, MD2, MD3,
  67. EB1, EB2, EB3, EB4, EB5, EB6, EB7, EB8, EB9, EB10,
  68. EB11, EB12, EB13, EB14, EB15, EB16, EB17, EB18, EB19, EB20,
  69. EB21, EB22, EB23,
  70. NUM_REGS
  71. };
  72. struct tda_state {
  73. struct i2c_adapter *i2c;
  74. u8 adr;
  75. u32 m_Frequency;
  76. u32 IF;
  77. u8 m_IFLevelAnalog;
  78. u8 m_IFLevelDigital;
  79. u8 m_IFLevelDVBC;
  80. u8 m_IFLevelDVBT;
  81. u8 m_EP4;
  82. u8 m_EP3_Standby;
  83. bool m_bMaster;
  84. s32 m_SettlingTime;
  85. u8 m_Regs[NUM_REGS];
  86. /* Tracking filter settings for band 0..6 */
  87. u32 m_RF1[7];
  88. s32 m_RF_A1[7];
  89. s32 m_RF_B1[7];
  90. u32 m_RF2[7];
  91. s32 m_RF_A2[7];
  92. s32 m_RF_B2[7];
  93. u32 m_RF3[7];
  94. u8 m_TMValue_RFCal; /* Calibration temperatur */
  95. bool m_bFMInput; /* true to use Pin 8 for FM Radio */
  96. };
  97. static int PowerScan(struct tda_state *state,
  98. u8 RFBand,u32 RF_in,
  99. u32 * pRF_Out, bool *pbcal);
  100. static int i2c_readn(struct i2c_adapter *adapter, u8 adr, u8 *data, int len)
  101. {
  102. struct i2c_msg msgs[1] = {{.addr = adr, .flags = I2C_M_RD,
  103. .buf = data, .len = len}};
  104. return (i2c_transfer(adapter, msgs, 1) == 1) ? 0 : -1;
  105. }
  106. static int i2c_write(struct i2c_adapter *adap, u8 adr, u8 *data, int len)
  107. {
  108. struct i2c_msg msg = {.addr = adr, .flags = 0,
  109. .buf = data, .len = len};
  110. if (i2c_transfer(adap, &msg, 1) != 1) {
  111. printk("i2c_write error\n");
  112. return -1;
  113. }
  114. return 0;
  115. }
  116. static int WriteRegs(struct tda_state *state,
  117. u8 SubAddr, u8 *Regs, u16 nRegs)
  118. {
  119. u8 data[nRegs+1];
  120. data[0] = SubAddr;
  121. memcpy(data + 1, Regs, nRegs);
  122. return i2c_write(state->i2c, state->adr, data, nRegs+1);
  123. }
  124. static int WriteReg(struct tda_state *state, u8 SubAddr,u8 Reg)
  125. {
  126. u8 msg[2] = {SubAddr, Reg};
  127. return i2c_write(state->i2c, state->adr, msg, 2);
  128. }
  129. static int Read(struct tda_state *state, u8 * Regs)
  130. {
  131. return i2c_readn(state->i2c, state->adr, Regs, 16);
  132. }
  133. static int ReadExtented(struct tda_state *state, u8 * Regs)
  134. {
  135. return i2c_readn(state->i2c, state->adr, Regs, NUM_REGS);
  136. }
  137. static int UpdateRegs(struct tda_state *state, u8 RegFrom,u8 RegTo)
  138. {
  139. return WriteRegs(state, RegFrom,
  140. &state->m_Regs[RegFrom], RegTo-RegFrom+1);
  141. }
  142. static int UpdateReg(struct tda_state *state, u8 Reg)
  143. {
  144. return WriteReg(state, Reg,state->m_Regs[Reg]);
  145. }
  146. #include "tda18271c2dd_maps.h"
  147. #undef CHK_ERROR
  148. #define CHK_ERROR(s) if ((status = s) < 0) break
  149. static void reset(struct tda_state *state)
  150. {
  151. u32 ulIFLevelAnalog = 0;
  152. u32 ulIFLevelDigital = 2;
  153. u32 ulIFLevelDVBC = 7;
  154. u32 ulIFLevelDVBT = 6;
  155. u32 ulXTOut = 0;
  156. u32 ulStandbyMode = 0x06; // Send in stdb, but leave osc on
  157. u32 ulSlave = 0;
  158. u32 ulFMInput = 0;
  159. u32 ulSettlingTime = 100;
  160. state->m_Frequency = 0;
  161. state->m_SettlingTime = 100;
  162. state->m_IFLevelAnalog = (ulIFLevelAnalog & 0x07) << 2;
  163. state->m_IFLevelDigital = (ulIFLevelDigital & 0x07) << 2;
  164. state->m_IFLevelDVBC = (ulIFLevelDVBC & 0x07) << 2;
  165. state->m_IFLevelDVBT = (ulIFLevelDVBT & 0x07) << 2;
  166. state->m_EP4 = 0x20;
  167. if( ulXTOut != 0 ) state->m_EP4 |= 0x40;
  168. state->m_EP3_Standby = ((ulStandbyMode & 0x07) << 5) | 0x0F;
  169. state->m_bMaster = (ulSlave == 0);
  170. state->m_SettlingTime = ulSettlingTime;
  171. state->m_bFMInput = (ulFMInput == 2);
  172. }
  173. static bool SearchMap1(struct SMap Map[],
  174. u32 Frequency, u8 *pParam)
  175. {
  176. int i = 0;
  177. while ((Map[i].m_Frequency != 0) && (Frequency > Map[i].m_Frequency) )
  178. i += 1;
  179. if (Map[i].m_Frequency == 0)
  180. return false;
  181. *pParam = Map[i].m_Param;
  182. return true;
  183. }
  184. static bool SearchMap2(struct SMapI Map[],
  185. u32 Frequency, s32 *pParam)
  186. {
  187. int i = 0;
  188. while ((Map[i].m_Frequency != 0) &&
  189. (Frequency > Map[i].m_Frequency) )
  190. i += 1;
  191. if (Map[i].m_Frequency == 0)
  192. return false;
  193. *pParam = Map[i].m_Param;
  194. return true;
  195. }
  196. static bool SearchMap3(struct SMap2 Map[],u32 Frequency,
  197. u8 *pParam1, u8 *pParam2)
  198. {
  199. int i = 0;
  200. while ((Map[i].m_Frequency != 0) &&
  201. (Frequency > Map[i].m_Frequency) )
  202. i += 1;
  203. if (Map[i].m_Frequency == 0)
  204. return false;
  205. *pParam1 = Map[i].m_Param1;
  206. *pParam2 = Map[i].m_Param2;
  207. return true;
  208. }
  209. static bool SearchMap4(struct SRFBandMap Map[],
  210. u32 Frequency, u8 *pRFBand)
  211. {
  212. int i = 0;
  213. while (i < 7 && (Frequency > Map[i].m_RF_max))
  214. i += 1;
  215. if (i == 7)
  216. return false;
  217. *pRFBand = i;
  218. return true;
  219. }
  220. static int ThermometerRead(struct tda_state *state, u8 *pTM_Value)
  221. {
  222. int status = 0;
  223. do {
  224. u8 Regs[16];
  225. state->m_Regs[TM] |= 0x10;
  226. CHK_ERROR(UpdateReg(state,TM));
  227. CHK_ERROR(Read(state,Regs));
  228. if( ( (Regs[TM] & 0x0F) == 0 && (Regs[TM] & 0x20) == 0x20 ) ||
  229. ( (Regs[TM] & 0x0F) == 8 && (Regs[TM] & 0x20) == 0x00 ) ) {
  230. state->m_Regs[TM] ^= 0x20;
  231. CHK_ERROR(UpdateReg(state,TM));
  232. msleep(10);
  233. CHK_ERROR(Read(state,Regs));
  234. }
  235. *pTM_Value = (Regs[TM] & 0x20 ) ? m_Thermometer_Map_2[Regs[TM] & 0x0F] :
  236. m_Thermometer_Map_1[Regs[TM] & 0x0F] ;
  237. state->m_Regs[TM] &= ~0x10; // Thermometer off
  238. CHK_ERROR(UpdateReg(state,TM));
  239. state->m_Regs[EP4] &= ~0x03; // CAL_mode = 0 ?????????
  240. CHK_ERROR(UpdateReg(state,EP4));
  241. } while(0);
  242. return status;
  243. }
  244. static int StandBy(struct tda_state *state)
  245. {
  246. int status = 0;
  247. do {
  248. state->m_Regs[EB12] &= ~0x20; // PD_AGC1_Det = 0
  249. CHK_ERROR(UpdateReg(state,EB12));
  250. state->m_Regs[EB18] &= ~0x83; // AGC1_loop_off = 0, AGC1_Gain = 6 dB
  251. CHK_ERROR(UpdateReg(state,EB18));
  252. state->m_Regs[EB21] |= 0x03; // AGC2_Gain = -6 dB
  253. state->m_Regs[EP3] = state->m_EP3_Standby;
  254. CHK_ERROR(UpdateReg(state,EP3));
  255. state->m_Regs[EB23] &= ~0x06; // ForceLP_Fc2_En = 0, LP_Fc[2] = 0
  256. CHK_ERROR(UpdateRegs(state,EB21,EB23));
  257. } while(0);
  258. return status;
  259. }
  260. static int CalcMainPLL(struct tda_state *state, u32 freq)
  261. {
  262. u8 PostDiv;
  263. u8 Div;
  264. u64 OscFreq;
  265. u32 MainDiv;
  266. if (!SearchMap3(m_Main_PLL_Map, freq, &PostDiv, &Div)) {
  267. return -EINVAL;
  268. }
  269. OscFreq = (u64) freq * (u64) Div;
  270. OscFreq *= (u64) 16384;
  271. do_div(OscFreq, (u64)16000000);
  272. MainDiv = OscFreq;
  273. state->m_Regs[MPD] = PostDiv & 0x77;
  274. state->m_Regs[MD1] = ((MainDiv >> 16) & 0x7F);
  275. state->m_Regs[MD2] = ((MainDiv >> 8) & 0xFF);
  276. state->m_Regs[MD3] = ((MainDiv ) & 0xFF);
  277. return UpdateRegs(state, MPD, MD3);
  278. }
  279. static int CalcCalPLL(struct tda_state *state, u32 freq)
  280. {
  281. //KdPrintEx((MSG_TRACE " - " __FUNCTION__ "(%d)\n",freq));
  282. u8 PostDiv;
  283. u8 Div;
  284. u64 OscFreq;
  285. u32 CalDiv;
  286. if( !SearchMap3(m_Cal_PLL_Map,freq,&PostDiv,&Div) )
  287. {
  288. return -EINVAL;
  289. }
  290. OscFreq = (u64)freq * (u64)Div;
  291. //CalDiv = u32( OscFreq * 16384 / 16000000 );
  292. OscFreq*=(u64)16384;
  293. do_div(OscFreq, (u64)16000000);
  294. CalDiv=OscFreq;
  295. state->m_Regs[CPD] = PostDiv;
  296. state->m_Regs[CD1] = ((CalDiv >> 16) & 0xFF);
  297. state->m_Regs[CD2] = ((CalDiv >> 8) & 0xFF);
  298. state->m_Regs[CD3] = ((CalDiv ) & 0xFF);
  299. return UpdateRegs(state,CPD,CD3);
  300. }
  301. static int CalibrateRF(struct tda_state *state,
  302. u8 RFBand,u32 freq, s32 * pCprog)
  303. {
  304. //KdPrintEx((MSG_TRACE " - " __FUNCTION__ " ID = %02x\n",state->m_Regs[ID]));
  305. int status = 0;
  306. u8 Regs[NUM_REGS];
  307. do {
  308. u8 BP_Filter=0;
  309. u8 GainTaper=0;
  310. u8 RFC_K=0;
  311. u8 RFC_M=0;
  312. state->m_Regs[EP4] &= ~0x03; // CAL_mode = 0
  313. CHK_ERROR(UpdateReg(state,EP4));
  314. state->m_Regs[EB18] |= 0x03; // AGC1_Gain = 3
  315. CHK_ERROR(UpdateReg(state,EB18));
  316. // Switching off LT (as datasheet says) causes calibration on C1 to fail
  317. // (Readout of Cprog is allways 255)
  318. if( state->m_Regs[ID] != 0x83 ) // C1: ID == 83, C2: ID == 84
  319. {
  320. state->m_Regs[EP3] |= 0x40; // SM_LT = 1
  321. }
  322. if( ! ( SearchMap1(m_BP_Filter_Map,freq,&BP_Filter) &&
  323. SearchMap1(m_GainTaper_Map,freq,&GainTaper) &&
  324. SearchMap3(m_KM_Map,freq,&RFC_K,&RFC_M)) )
  325. {
  326. return -EINVAL;
  327. }
  328. state->m_Regs[EP1] = (state->m_Regs[EP1] & ~0x07) | BP_Filter;
  329. state->m_Regs[EP2] = (RFBand << 5) | GainTaper;
  330. state->m_Regs[EB13] = (state->m_Regs[EB13] & ~0x7C) | (RFC_K << 4) | (RFC_M << 2);
  331. CHK_ERROR(UpdateRegs(state,EP1,EP3));
  332. CHK_ERROR(UpdateReg(state,EB13));
  333. state->m_Regs[EB4] |= 0x20; // LO_ForceSrce = 1
  334. CHK_ERROR(UpdateReg(state,EB4));
  335. state->m_Regs[EB7] |= 0x20; // CAL_ForceSrce = 1
  336. CHK_ERROR(UpdateReg(state,EB7));
  337. state->m_Regs[EB14] = 0; // RFC_Cprog = 0
  338. CHK_ERROR(UpdateReg(state,EB14));
  339. state->m_Regs[EB20] &= ~0x20; // ForceLock = 0;
  340. CHK_ERROR(UpdateReg(state,EB20));
  341. state->m_Regs[EP4] |= 0x03; // CAL_Mode = 3
  342. CHK_ERROR(UpdateRegs(state,EP4,EP5));
  343. CHK_ERROR(CalcCalPLL(state,freq));
  344. CHK_ERROR(CalcMainPLL(state,freq + 1000000));
  345. msleep(5);
  346. CHK_ERROR(UpdateReg(state,EP2));
  347. CHK_ERROR(UpdateReg(state,EP1));
  348. CHK_ERROR(UpdateReg(state,EP2));
  349. CHK_ERROR(UpdateReg(state,EP1));
  350. state->m_Regs[EB4] &= ~0x20; // LO_ForceSrce = 0
  351. CHK_ERROR(UpdateReg(state,EB4));
  352. state->m_Regs[EB7] &= ~0x20; // CAL_ForceSrce = 0
  353. CHK_ERROR(UpdateReg(state,EB7));
  354. msleep(10);
  355. state->m_Regs[EB20] |= 0x20; // ForceLock = 1;
  356. CHK_ERROR(UpdateReg(state,EB20));
  357. msleep(60);
  358. state->m_Regs[EP4] &= ~0x03; // CAL_Mode = 0
  359. state->m_Regs[EP3] &= ~0x40; // SM_LT = 0
  360. state->m_Regs[EB18] &= ~0x03; // AGC1_Gain = 0
  361. CHK_ERROR(UpdateReg(state,EB18));
  362. CHK_ERROR(UpdateRegs(state,EP3,EP4));
  363. CHK_ERROR(UpdateReg(state,EP1));
  364. CHK_ERROR(ReadExtented(state,Regs));
  365. *pCprog = Regs[EB14];
  366. //KdPrintEx((MSG_TRACE " - " __FUNCTION__ " Cprog = %d\n",Regs[EB14]));
  367. } while(0);
  368. return status;
  369. }
  370. static int RFTrackingFiltersInit(struct tda_state *state,
  371. u8 RFBand)
  372. {
  373. //KdPrintEx((MSG_TRACE " - " __FUNCTION__ "\n"));
  374. int status = 0;
  375. u32 RF1 = m_RF_Band_Map[RFBand].m_RF1_Default;
  376. u32 RF2 = m_RF_Band_Map[RFBand].m_RF2_Default;
  377. u32 RF3 = m_RF_Band_Map[RFBand].m_RF3_Default;
  378. bool bcal = false;
  379. s32 Cprog_cal1 = 0;
  380. s32 Cprog_table1 = 0;
  381. s32 Cprog_cal2 = 0;
  382. s32 Cprog_table2 = 0;
  383. s32 Cprog_cal3 = 0;
  384. s32 Cprog_table3 = 0;
  385. state->m_RF_A1[RFBand] = 0;
  386. state->m_RF_B1[RFBand] = 0;
  387. state->m_RF_A2[RFBand] = 0;
  388. state->m_RF_B2[RFBand] = 0;
  389. do {
  390. CHK_ERROR(PowerScan(state,RFBand,RF1,&RF1,&bcal));
  391. if( bcal ) {
  392. CHK_ERROR(CalibrateRF(state,RFBand,RF1,&Cprog_cal1));
  393. }
  394. SearchMap2(m_RF_Cal_Map,RF1,&Cprog_table1);
  395. if( !bcal ) {
  396. Cprog_cal1 = Cprog_table1;
  397. }
  398. state->m_RF_B1[RFBand] = Cprog_cal1 - Cprog_table1;
  399. //state->m_RF_A1[RF_Band] = ????
  400. if( RF2 == 0 ) break;
  401. CHK_ERROR(PowerScan(state,RFBand,RF2,&RF2,&bcal));
  402. if( bcal ) {
  403. CHK_ERROR(CalibrateRF(state,RFBand,RF2,&Cprog_cal2));
  404. }
  405. SearchMap2(m_RF_Cal_Map,RF2,&Cprog_table2);
  406. if( !bcal )
  407. {
  408. Cprog_cal2 = Cprog_table2;
  409. }
  410. state->m_RF_A1[RFBand] =
  411. (Cprog_cal2 - Cprog_table2 - Cprog_cal1 + Cprog_table1) /
  412. ((s32)(RF2)-(s32)(RF1));
  413. if( RF3 == 0 ) break;
  414. CHK_ERROR(PowerScan(state,RFBand,RF3,&RF3,&bcal));
  415. if( bcal )
  416. {
  417. CHK_ERROR(CalibrateRF(state,RFBand,RF3,&Cprog_cal3));
  418. }
  419. SearchMap2(m_RF_Cal_Map,RF3,&Cprog_table3);
  420. if( !bcal )
  421. {
  422. Cprog_cal3 = Cprog_table3;
  423. }
  424. state->m_RF_A2[RFBand] = (Cprog_cal3 - Cprog_table3 - Cprog_cal2 + Cprog_table2) / ((s32)(RF3)-(s32)(RF2));
  425. state->m_RF_B2[RFBand] = Cprog_cal2 - Cprog_table2;
  426. } while(0);
  427. state->m_RF1[RFBand] = RF1;
  428. state->m_RF2[RFBand] = RF2;
  429. state->m_RF3[RFBand] = RF3;
  430. #if 0
  431. printk("%s %d RF1 = %d A1 = %d B1 = %d RF2 = %d A2 = %d B2 = %d RF3 = %d\n", __FUNCTION__,
  432. RFBand,RF1,state->m_RF_A1[RFBand],state->m_RF_B1[RFBand],RF2,
  433. state->m_RF_A2[RFBand],state->m_RF_B2[RFBand],RF3);
  434. #endif
  435. return status;
  436. }
  437. static int PowerScan(struct tda_state *state,
  438. u8 RFBand,u32 RF_in, u32 * pRF_Out, bool *pbcal)
  439. {
  440. //KdPrintEx((MSG_TRACE " - " __FUNCTION__ "(%d,%d)\n",RFBand,RF_in));
  441. int status = 0;
  442. do {
  443. u8 Gain_Taper=0;
  444. s32 RFC_Cprog=0;
  445. u8 CID_Target=0;
  446. u8 CountLimit=0;
  447. u32 freq_MainPLL;
  448. u8 Regs[NUM_REGS];
  449. u8 CID_Gain;
  450. s32 Count = 0;
  451. int sign = 1;
  452. bool wait = false;
  453. if( ! (SearchMap2(m_RF_Cal_Map,RF_in,&RFC_Cprog) &&
  454. SearchMap1(m_GainTaper_Map,RF_in,&Gain_Taper) &&
  455. SearchMap3(m_CID_Target_Map,RF_in,&CID_Target,&CountLimit) )) {
  456. printk("%s Search map failed\n", __FUNCTION__);
  457. return -EINVAL;
  458. }
  459. state->m_Regs[EP2] = (RFBand << 5) | Gain_Taper;
  460. state->m_Regs[EB14] = (RFC_Cprog);
  461. CHK_ERROR(UpdateReg(state,EP2));
  462. CHK_ERROR(UpdateReg(state,EB14));
  463. freq_MainPLL = RF_in + 1000000;
  464. CHK_ERROR(CalcMainPLL(state,freq_MainPLL));
  465. msleep(5);
  466. state->m_Regs[EP4] = (state->m_Regs[EP4] & ~0x03) | 1; // CAL_mode = 1
  467. CHK_ERROR(UpdateReg(state,EP4));
  468. CHK_ERROR(UpdateReg(state,EP2)); // Launch power measurement
  469. CHK_ERROR(ReadExtented(state,Regs));
  470. CID_Gain = Regs[EB10] & 0x3F;
  471. state->m_Regs[ID] = Regs[ID]; // Chip version, (needed for C1 workarround in CalibrateRF )
  472. *pRF_Out = RF_in;
  473. while( CID_Gain < CID_Target ) {
  474. freq_MainPLL = RF_in + sign * Count + 1000000;
  475. CHK_ERROR(CalcMainPLL(state,freq_MainPLL));
  476. msleep( wait ? 5 : 1 );
  477. wait = false;
  478. CHK_ERROR(UpdateReg(state,EP2)); // Launch power measurement
  479. CHK_ERROR(ReadExtented(state,Regs));
  480. CID_Gain = Regs[EB10] & 0x3F;
  481. Count += 200000;
  482. if( Count < CountLimit * 100000 ) continue;
  483. if( sign < 0 ) break;
  484. sign = -sign;
  485. Count = 200000;
  486. wait = true;
  487. }
  488. CHK_ERROR(status);
  489. if( CID_Gain >= CID_Target )
  490. {
  491. *pbcal = true;
  492. *pRF_Out = freq_MainPLL - 1000000;
  493. }
  494. else
  495. {
  496. *pbcal = false;
  497. }
  498. } while(0);
  499. //KdPrintEx((MSG_TRACE " - " __FUNCTION__ " Found = %d RF = %d\n",*pbcal,*pRF_Out));
  500. return status;
  501. }
  502. static int PowerScanInit(struct tda_state *state)
  503. {
  504. //KdPrintEx((MSG_TRACE " - " __FUNCTION__ "\n"));
  505. int status = 0;
  506. do
  507. {
  508. state->m_Regs[EP3] = (state->m_Regs[EP3] & ~0x1F) | 0x12;
  509. state->m_Regs[EP4] = (state->m_Regs[EP4] & ~0x1F); // If level = 0, Cal mode = 0
  510. CHK_ERROR(UpdateRegs(state,EP3,EP4));
  511. state->m_Regs[EB18] = (state->m_Regs[EB18] & ~0x03 ); // AGC 1 Gain = 0
  512. CHK_ERROR(UpdateReg(state,EB18));
  513. state->m_Regs[EB21] = (state->m_Regs[EB21] & ~0x03 ); // AGC 2 Gain = 0 (Datasheet = 3)
  514. state->m_Regs[EB23] = (state->m_Regs[EB23] | 0x06 ); // ForceLP_Fc2_En = 1, LPFc[2] = 1
  515. CHK_ERROR(UpdateRegs(state,EB21,EB23));
  516. } while(0);
  517. return status;
  518. }
  519. static int CalcRFFilterCurve(struct tda_state *state)
  520. {
  521. //KdPrintEx((MSG_TRACE " - " __FUNCTION__ "\n"));
  522. int status = 0;
  523. do
  524. {
  525. msleep(200); // Temperature stabilisation
  526. CHK_ERROR(PowerScanInit(state));
  527. CHK_ERROR(RFTrackingFiltersInit(state,0));
  528. CHK_ERROR(RFTrackingFiltersInit(state,1));
  529. CHK_ERROR(RFTrackingFiltersInit(state,2));
  530. CHK_ERROR(RFTrackingFiltersInit(state,3));
  531. CHK_ERROR(RFTrackingFiltersInit(state,4));
  532. CHK_ERROR(RFTrackingFiltersInit(state,5));
  533. CHK_ERROR(RFTrackingFiltersInit(state,6));
  534. CHK_ERROR(ThermometerRead(state,&state->m_TMValue_RFCal)); // also switches off Cal mode !!!
  535. } while(0);
  536. return status;
  537. }
  538. static int FixedContentsI2CUpdate(struct tda_state *state)
  539. {
  540. static u8 InitRegs[] = {
  541. 0x08,0x80,0xC6,
  542. 0xDF,0x16,0x60,0x80,
  543. 0x80,0x00,0x00,0x00,
  544. 0x00,0x00,0x00,0x00,
  545. 0xFC,0x01,0x84,0x41,
  546. 0x01,0x84,0x40,0x07,
  547. 0x00,0x00,0x96,0x3F,
  548. 0xC1,0x00,0x8F,0x00,
  549. 0x00,0x8C,0x00,0x20,
  550. 0xB3,0x48,0xB0,
  551. };
  552. int status = 0;
  553. memcpy(&state->m_Regs[TM],InitRegs,EB23-TM+1);
  554. do {
  555. CHK_ERROR(UpdateRegs(state,TM,EB23));
  556. // AGC1 gain setup
  557. state->m_Regs[EB17] = 0x00;
  558. CHK_ERROR(UpdateReg(state,EB17));
  559. state->m_Regs[EB17] = 0x03;
  560. CHK_ERROR(UpdateReg(state,EB17));
  561. state->m_Regs[EB17] = 0x43;
  562. CHK_ERROR(UpdateReg(state,EB17));
  563. state->m_Regs[EB17] = 0x4C;
  564. CHK_ERROR(UpdateReg(state,EB17));
  565. // IRC Cal Low band
  566. state->m_Regs[EP3] = 0x1F;
  567. state->m_Regs[EP4] = 0x66;
  568. state->m_Regs[EP5] = 0x81;
  569. state->m_Regs[CPD] = 0xCC;
  570. state->m_Regs[CD1] = 0x6C;
  571. state->m_Regs[CD2] = 0x00;
  572. state->m_Regs[CD3] = 0x00;
  573. state->m_Regs[MPD] = 0xC5;
  574. state->m_Regs[MD1] = 0x77;
  575. state->m_Regs[MD2] = 0x08;
  576. state->m_Regs[MD3] = 0x00;
  577. CHK_ERROR(UpdateRegs(state,EP2,MD3)); // diff between sw and datasheet (ep3-md3)
  578. //state->m_Regs[EB4] = 0x61; // missing in sw
  579. //CHK_ERROR(UpdateReg(state,EB4));
  580. //msleep(1);
  581. //state->m_Regs[EB4] = 0x41;
  582. //CHK_ERROR(UpdateReg(state,EB4));
  583. msleep(5);
  584. CHK_ERROR(UpdateReg(state,EP1));
  585. msleep(5);
  586. state->m_Regs[EP5] = 0x85;
  587. state->m_Regs[CPD] = 0xCB;
  588. state->m_Regs[CD1] = 0x66;
  589. state->m_Regs[CD2] = 0x70;
  590. CHK_ERROR(UpdateRegs(state,EP3,CD3));
  591. msleep(5);
  592. CHK_ERROR(UpdateReg(state,EP2));
  593. msleep(30);
  594. // IRC Cal mid band
  595. state->m_Regs[EP5] = 0x82;
  596. state->m_Regs[CPD] = 0xA8;
  597. state->m_Regs[CD2] = 0x00;
  598. state->m_Regs[MPD] = 0xA1; // Datasheet = 0xA9
  599. state->m_Regs[MD1] = 0x73;
  600. state->m_Regs[MD2] = 0x1A;
  601. CHK_ERROR(UpdateRegs(state,EP3,MD3));
  602. msleep(5);
  603. CHK_ERROR(UpdateReg(state,EP1));
  604. msleep(5);
  605. state->m_Regs[EP5] = 0x86;
  606. state->m_Regs[CPD] = 0xA8;
  607. state->m_Regs[CD1] = 0x66;
  608. state->m_Regs[CD2] = 0xA0;
  609. CHK_ERROR(UpdateRegs(state,EP3,CD3));
  610. msleep(5);
  611. CHK_ERROR(UpdateReg(state,EP2));
  612. msleep(30);
  613. // IRC Cal high band
  614. state->m_Regs[EP5] = 0x83;
  615. state->m_Regs[CPD] = 0x98;
  616. state->m_Regs[CD1] = 0x65;
  617. state->m_Regs[CD2] = 0x00;
  618. state->m_Regs[MPD] = 0x91; // Datasheet = 0x91
  619. state->m_Regs[MD1] = 0x71;
  620. state->m_Regs[MD2] = 0xCD;
  621. CHK_ERROR(UpdateRegs(state,EP3,MD3));
  622. msleep(5);
  623. CHK_ERROR(UpdateReg(state,EP1));
  624. msleep(5);
  625. state->m_Regs[EP5] = 0x87;
  626. state->m_Regs[CD1] = 0x65;
  627. state->m_Regs[CD2] = 0x50;
  628. CHK_ERROR(UpdateRegs(state,EP3,CD3));
  629. msleep(5);
  630. CHK_ERROR(UpdateReg(state,EP2));
  631. msleep(30);
  632. // Back to normal
  633. state->m_Regs[EP4] = 0x64;
  634. CHK_ERROR(UpdateReg(state,EP4));
  635. CHK_ERROR(UpdateReg(state,EP1));
  636. } while(0);
  637. return status;
  638. }
  639. static int InitCal(struct tda_state *state)
  640. {
  641. int status = 0;
  642. do
  643. {
  644. CHK_ERROR(FixedContentsI2CUpdate(state));
  645. CHK_ERROR(CalcRFFilterCurve(state));
  646. CHK_ERROR(StandBy(state));
  647. //m_bInitDone = true;
  648. } while(0);
  649. return status;
  650. };
  651. static int RFTrackingFiltersCorrection(struct tda_state *state,
  652. u32 Frequency)
  653. {
  654. int status = 0;
  655. s32 Cprog_table;
  656. u8 RFBand;
  657. u8 dCoverdT;
  658. if( !SearchMap2(m_RF_Cal_Map,Frequency,&Cprog_table) ||
  659. !SearchMap4(m_RF_Band_Map,Frequency,&RFBand) ||
  660. !SearchMap1(m_RF_Cal_DC_Over_DT_Map,Frequency,&dCoverdT) )
  661. {
  662. return -EINVAL;
  663. }
  664. do
  665. {
  666. u8 TMValue_Current;
  667. u32 RF1 = state->m_RF1[RFBand];
  668. u32 RF2 = state->m_RF1[RFBand];
  669. u32 RF3 = state->m_RF1[RFBand];
  670. s32 RF_A1 = state->m_RF_A1[RFBand];
  671. s32 RF_B1 = state->m_RF_B1[RFBand];
  672. s32 RF_A2 = state->m_RF_A2[RFBand];
  673. s32 RF_B2 = state->m_RF_B2[RFBand];
  674. s32 Capprox = 0;
  675. int TComp;
  676. state->m_Regs[EP3] &= ~0xE0; // Power up
  677. CHK_ERROR(UpdateReg(state,EP3));
  678. CHK_ERROR(ThermometerRead(state,&TMValue_Current));
  679. if( RF3 == 0 || Frequency < RF2 )
  680. {
  681. Capprox = RF_A1 * ((s32)(Frequency) - (s32)(RF1)) + RF_B1 + Cprog_table;
  682. }
  683. else
  684. {
  685. Capprox = RF_A2 * ((s32)(Frequency) - (s32)(RF2)) + RF_B2 + Cprog_table;
  686. }
  687. TComp = (int)(dCoverdT) * ((int)(TMValue_Current) - (int)(state->m_TMValue_RFCal))/1000;
  688. Capprox += TComp;
  689. if( Capprox < 0 ) Capprox = 0;
  690. else if( Capprox > 255 ) Capprox = 255;
  691. // TODO Temperature compensation. There is defenitely a scale factor
  692. // missing in the datasheet, so leave it out for now.
  693. state->m_Regs[EB14] = (Capprox );
  694. CHK_ERROR(UpdateReg(state,EB14));
  695. } while(0);
  696. return status;
  697. }
  698. static int ChannelConfiguration(struct tda_state *state,
  699. u32 Frequency, int Standard)
  700. {
  701. s32 IntermediateFrequency = m_StandardTable[Standard].m_IFFrequency;
  702. int status = 0;
  703. u8 BP_Filter = 0;
  704. u8 RF_Band = 0;
  705. u8 GainTaper = 0;
  706. u8 IR_Meas;
  707. state->IF=IntermediateFrequency;
  708. //printk("%s Freq = %d Standard = %d IF = %d\n",__FUNCTION__,Frequency,Standard,IntermediateFrequency);
  709. // get values from tables
  710. if(! ( SearchMap1(m_BP_Filter_Map,Frequency,&BP_Filter) &&
  711. SearchMap1(m_GainTaper_Map,Frequency,&GainTaper) &&
  712. SearchMap1(m_IR_Meas_Map,Frequency,&IR_Meas) &&
  713. SearchMap4(m_RF_Band_Map,Frequency,&RF_Band) ) )
  714. {
  715. printk("%s SearchMap failed\n", __FUNCTION__);
  716. return -EINVAL;
  717. }
  718. do
  719. {
  720. state->m_Regs[EP3] = (state->m_Regs[EP3] & ~0x1F) | m_StandardTable[Standard].m_EP3_4_0;
  721. state->m_Regs[EP3] &= ~0x04; // switch RFAGC to high speed mode
  722. // m_EP4 default for XToutOn, CAL_Mode (0)
  723. state->m_Regs[EP4] = state->m_EP4 | ((Standard > HF_AnalogMax )? state->m_IFLevelDigital : state->m_IFLevelAnalog );
  724. //state->m_Regs[EP4] = state->m_EP4 | state->m_IFLevelDigital;
  725. if( Standard <= HF_AnalogMax ) state->m_Regs[EP4] = state->m_EP4 | state->m_IFLevelAnalog;
  726. else if( Standard <= HF_ATSC ) state->m_Regs[EP4] = state->m_EP4 | state->m_IFLevelDVBT;
  727. else if( Standard <= HF_DVBC ) state->m_Regs[EP4] = state->m_EP4 | state->m_IFLevelDVBC;
  728. else state->m_Regs[EP4] = state->m_EP4 | state->m_IFLevelDigital;
  729. if( (Standard == HF_FM_Radio) && state->m_bFMInput ) state->m_Regs[EP4] |= 80;
  730. state->m_Regs[MPD] &= ~0x80;
  731. if( Standard > HF_AnalogMax ) state->m_Regs[MPD] |= 0x80; // Add IF_notch for digital
  732. state->m_Regs[EB22] = m_StandardTable[Standard].m_EB22;
  733. // Note: This is missing from flowchart in TDA18271 specification ( 1.5 MHz cutoff for FM )
  734. if( Standard == HF_FM_Radio ) state->m_Regs[EB23] |= 0x06; // ForceLP_Fc2_En = 1, LPFc[2] = 1
  735. else state->m_Regs[EB23] &= ~0x06; // ForceLP_Fc2_En = 0, LPFc[2] = 0
  736. CHK_ERROR(UpdateRegs(state,EB22,EB23));
  737. state->m_Regs[EP1] = (state->m_Regs[EP1] & ~0x07) | 0x40 | BP_Filter; // Dis_Power_level = 1, Filter
  738. state->m_Regs[EP5] = (state->m_Regs[EP5] & ~0x07) | IR_Meas;
  739. state->m_Regs[EP2] = (RF_Band << 5) | GainTaper;
  740. state->m_Regs[EB1] = (state->m_Regs[EB1] & ~0x07) |
  741. (state->m_bMaster ? 0x04 : 0x00); // CALVCO_FortLOn = MS
  742. // AGC1_always_master = 0
  743. // AGC_firstn = 0
  744. CHK_ERROR(UpdateReg(state,EB1));
  745. if( state->m_bMaster )
  746. {
  747. CHK_ERROR(CalcMainPLL(state,Frequency + IntermediateFrequency));
  748. CHK_ERROR(UpdateRegs(state,TM,EP5));
  749. state->m_Regs[EB4] |= 0x20; // LO_forceSrce = 1
  750. CHK_ERROR(UpdateReg(state,EB4));
  751. msleep(1);
  752. state->m_Regs[EB4] &= ~0x20; // LO_forceSrce = 0
  753. CHK_ERROR(UpdateReg(state,EB4));
  754. }
  755. else
  756. {
  757. u8 PostDiv;
  758. u8 Div;
  759. CHK_ERROR(CalcCalPLL(state,Frequency + IntermediateFrequency));
  760. SearchMap3(m_Cal_PLL_Map,Frequency + IntermediateFrequency,&PostDiv,&Div);
  761. state->m_Regs[MPD] = (state->m_Regs[MPD] & ~0x7F) | (PostDiv & 0x77);
  762. CHK_ERROR(UpdateReg(state,MPD));
  763. CHK_ERROR(UpdateRegs(state,TM,EP5));
  764. state->m_Regs[EB7] |= 0x20; // CAL_forceSrce = 1
  765. CHK_ERROR(UpdateReg(state,EB7));
  766. msleep(1);
  767. state->m_Regs[EB7] &= ~0x20; // CAL_forceSrce = 0
  768. CHK_ERROR(UpdateReg(state,EB7));
  769. }
  770. msleep(20);
  771. if( Standard != HF_FM_Radio )
  772. {
  773. state->m_Regs[EP3] |= 0x04; // RFAGC to normal mode
  774. }
  775. CHK_ERROR(UpdateReg(state,EP3));
  776. } while(0);
  777. return status;
  778. }
  779. static int sleep(struct dvb_frontend* fe)
  780. {
  781. struct tda_state *state = fe->tuner_priv;
  782. StandBy(state);
  783. return 0;
  784. }
  785. static int init(struct dvb_frontend* fe)
  786. {
  787. //struct tda_state *state = fe->tuner_priv;
  788. return 0;
  789. }
  790. static int release(struct dvb_frontend* fe)
  791. {
  792. kfree(fe->tuner_priv);
  793. fe->tuner_priv = NULL;
  794. return 0;
  795. }
  796. static int set_params(struct dvb_frontend *fe,
  797. struct dvb_frontend_parameters *params)
  798. {
  799. struct tda_state *state = fe->tuner_priv;
  800. int status = 0;
  801. int Standard;
  802. state->m_Frequency = params->frequency;
  803. if (fe->ops.info.type == FE_OFDM)
  804. switch (params->u.ofdm.bandwidth) {
  805. case BANDWIDTH_6_MHZ:
  806. Standard = HF_DVBT_6MHZ;
  807. break;
  808. case BANDWIDTH_7_MHZ:
  809. Standard = HF_DVBT_7MHZ;
  810. break;
  811. default:
  812. case BANDWIDTH_8_MHZ:
  813. Standard = HF_DVBT_8MHZ;
  814. break;
  815. }
  816. else if (fe->ops.info.type == FE_QAM) {
  817. Standard = HF_DVBC_8MHZ;
  818. } else
  819. return -EINVAL;
  820. do {
  821. CHK_ERROR(RFTrackingFiltersCorrection(state,params->frequency));
  822. CHK_ERROR(ChannelConfiguration(state,params->frequency,Standard));
  823. msleep(state->m_SettlingTime); // Allow AGC's to settle down
  824. } while(0);
  825. return status;
  826. }
  827. #if 0
  828. static int GetSignalStrength(s32 * pSignalStrength,u32 RFAgc,u32 IFAgc)
  829. {
  830. if( IFAgc < 500 ) {
  831. // Scale this from 0 to 50000
  832. *pSignalStrength = IFAgc * 100;
  833. } else {
  834. // Scale range 500-1500 to 50000-80000
  835. *pSignalStrength = 50000 + (IFAgc - 500) * 30;
  836. }
  837. return 0;
  838. }
  839. #endif
  840. static int get_frequency(struct dvb_frontend *fe, u32 *frequency)
  841. {
  842. struct tda_state *state = fe->tuner_priv;
  843. *frequency = state->IF;
  844. return 0;
  845. }
  846. static int get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
  847. {
  848. //struct tda_state *state = fe->tuner_priv;
  849. //*bandwidth = priv->bandwidth;
  850. return 0;
  851. }
  852. static struct dvb_tuner_ops tuner_ops = {
  853. .info = {
  854. .name = "NXP TDA18271C2D",
  855. .frequency_min = 47125000,
  856. .frequency_max = 865000000,
  857. .frequency_step = 62500
  858. },
  859. .init = init,
  860. .sleep = sleep,
  861. .set_params = set_params,
  862. .release = release,
  863. .get_frequency = get_frequency,
  864. .get_bandwidth = get_bandwidth,
  865. };
  866. struct dvb_frontend *tda18271c2dd_attach(struct dvb_frontend *fe,
  867. struct i2c_adapter *i2c, u8 adr)
  868. {
  869. struct tda_state *state;
  870. state = kzalloc(sizeof(struct tda_state), GFP_KERNEL);
  871. if (!state)
  872. return NULL;
  873. fe->tuner_priv = state;
  874. state->adr = adr;
  875. state->i2c = i2c;
  876. memcpy(&fe->ops.tuner_ops, &tuner_ops, sizeof(struct dvb_tuner_ops));
  877. reset(state);
  878. InitCal(state);
  879. return fe;
  880. }
  881. EXPORT_SYMBOL_GPL(tda18271c2dd_attach);
  882. MODULE_DESCRIPTION("TDA18271C2 driver");
  883. MODULE_AUTHOR("DD");
  884. MODULE_LICENSE("GPL");
  885. /*
  886. * Local variables:
  887. * c-basic-offset: 8
  888. * End:
  889. */