tda18271c2dd.c 28 KB

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