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