Merge tag 'v3.3.7' into 3.3/master
[zen-stable.git] / drivers / media / dvb / frontends / tda18271c2dd.c
blobad7c72e8f517728539f93adde89f63ddf980d137
1 /*
2 * tda18271c2dd: Driver for the TDA18271C2 tuner
4 * Copyright (C) 2010 Digital Devices GmbH
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.
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.
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
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>
34 #include "dvb_frontend.h"
36 struct SStandardParam {
37 s32 m_IFFrequency;
38 u32 m_BandWidth;
39 u8 m_EP3_4_0;
40 u8 m_EB22;
43 struct SMap {
44 u32 m_Frequency;
45 u8 m_Param;
48 struct SMapI {
49 u32 m_Frequency;
50 s32 m_Param;
53 struct SMap2 {
54 u32 m_Frequency;
55 u8 m_Param1;
56 u8 m_Param2;
59 struct SRFBandMap {
60 u32 m_RF_max;
61 u32 m_RF1_Default;
62 u32 m_RF2_Default;
63 u32 m_RF3_Default;
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,
73 EB1, EB2, EB3, EB4, EB5, EB6, EB7, EB8, EB9, EB10,
74 EB11, EB12, EB13, EB14, EB15, EB16, EB17, EB18, EB19, EB20,
75 EB21, EB22, EB23,
76 NUM_REGS
79 struct tda_state {
80 struct i2c_adapter *i2c;
81 u8 adr;
83 u32 m_Frequency;
84 u32 IF;
86 u8 m_IFLevelAnalog;
87 u8 m_IFLevelDigital;
88 u8 m_IFLevelDVBC;
89 u8 m_IFLevelDVBT;
91 u8 m_EP4;
92 u8 m_EP3_Standby;
94 bool m_bMaster;
96 s32 m_SettlingTime;
98 u8 m_Regs[NUM_REGS];
100 /* Tracking filter settings for band 0..6 */
101 u32 m_RF1[7];
102 s32 m_RF_A1[7];
103 s32 m_RF_B1[7];
104 u32 m_RF2[7];
105 s32 m_RF_A2[7];
106 s32 m_RF_B2[7];
107 u32 m_RF3[7];
109 u8 m_TMValue_RFCal; /* Calibration temperatur */
111 bool m_bFMInput; /* true to use Pin 8 for FM Radio */
115 static int PowerScan(struct tda_state *state,
116 u8 RFBand, u32 RF_in,
117 u32 *pRF_Out, bool *pbcal);
119 static int i2c_readn(struct i2c_adapter *adapter, u8 adr, u8 *data, int len)
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;
126 static int i2c_write(struct i2c_adapter *adap, u8 adr, u8 *data, int len)
128 struct i2c_msg msg = {.addr = adr, .flags = 0,
129 .buf = data, .len = len};
131 if (i2c_transfer(adap, &msg, 1) != 1) {
132 printk(KERN_ERR "tda18271c2dd: i2c write error at addr %i\n", adr);
133 return -1;
135 return 0;
138 static int WriteRegs(struct tda_state *state,
139 u8 SubAddr, u8 *Regs, u16 nRegs)
141 u8 data[nRegs+1];
143 data[0] = SubAddr;
144 memcpy(data + 1, Regs, nRegs);
145 return i2c_write(state->i2c, state->adr, data, nRegs+1);
148 static int WriteReg(struct tda_state *state, u8 SubAddr, u8 Reg)
150 u8 msg[2] = {SubAddr, Reg};
152 return i2c_write(state->i2c, state->adr, msg, 2);
155 static int Read(struct tda_state *state, u8 * Regs)
157 return i2c_readn(state->i2c, state->adr, Regs, 16);
160 static int ReadExtented(struct tda_state *state, u8 * Regs)
162 return i2c_readn(state->i2c, state->adr, Regs, NUM_REGS);
165 static int UpdateRegs(struct tda_state *state, u8 RegFrom, u8 RegTo)
167 return WriteRegs(state, RegFrom,
168 &state->m_Regs[RegFrom], RegTo-RegFrom+1);
170 static int UpdateReg(struct tda_state *state, u8 Reg)
172 return WriteReg(state, Reg, state->m_Regs[Reg]);
175 #include "tda18271c2dd_maps.h"
177 static void reset(struct tda_state *state)
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;
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;
196 state->m_EP4 = 0x20;
197 if (ulXTOut != 0)
198 state->m_EP4 |= 0x40;
200 state->m_EP3_Standby = ((ulStandbyMode & 0x07) << 5) | 0x0F;
201 state->m_bMaster = (ulSlave == 0);
203 state->m_SettlingTime = ulSettlingTime;
205 state->m_bFMInput = (ulFMInput == 2);
208 static bool SearchMap1(struct SMap Map[],
209 u32 Frequency, u8 *pParam)
211 int i = 0;
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;
221 static bool SearchMap2(struct SMapI Map[],
222 u32 Frequency, s32 *pParam)
224 int i = 0;
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;
235 static bool SearchMap3(struct SMap2 Map[], u32 Frequency,
236 u8 *pParam1, u8 *pParam2)
238 int i = 0;
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;
250 static bool SearchMap4(struct SRFBandMap Map[],
251 u32 Frequency, u8 *pRFBand)
253 int i = 0;
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;
263 static int ThermometerRead(struct tda_state *state, u8 *pTM_Value)
265 int status = 0;
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;
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);
300 return status;
303 static int StandBy(struct tda_state *state)
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;
328 static int CalcMainPLL(struct tda_state *state, u32 freq)
331 u8 PostDiv;
332 u8 Div;
333 u64 OscFreq;
334 u32 MainDiv;
336 if (!SearchMap3(m_Main_PLL_Map, freq, &PostDiv, &Div))
337 return -EINVAL;
339 OscFreq = (u64) freq * (u64) Div;
340 OscFreq *= (u64) 16384;
341 do_div(OscFreq, (u64)16000000);
342 MainDiv = OscFreq;
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);
349 return UpdateRegs(state, MPD, MD3);
352 static int CalcCalPLL(struct tda_state *state, u32 freq)
354 u8 PostDiv;
355 u8 Div;
356 u64 OscFreq;
357 u32 CalDiv;
359 if (!SearchMap3(m_Cal_PLL_Map, freq, &PostDiv, &Div))
360 return -EINVAL;
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;
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);
373 return UpdateRegs(state, CPD, CD3);
376 static int CalibrateRF(struct tda_state *state,
377 u8 RFBand, u32 freq, s32 *pCprog)
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;
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;
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 */
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;
406 state->m_Regs[EP1] = (state->m_Regs[EP1] & ~0x07) | BP_Filter;
407 state->m_Regs[EP2] = (RFBand << 5) | GainTaper;
409 state->m_Regs[EB13] = (state->m_Regs[EB13] & ~0x7C) | (RFC_K << 4) | (RFC_M << 2);
411 status = UpdateRegs(state, EP1, EP3);
412 if (status < 0)
413 break;
414 status = UpdateReg(state, EB13);
415 if (status < 0)
416 break;
418 state->m_Regs[EB4] |= 0x20; /* LO_ForceSrce = 1 */
419 status = UpdateReg(state, EB4);
420 if (status < 0)
421 break;
423 state->m_Regs[EB7] |= 0x20; /* CAL_ForceSrce = 1 */
424 status = UpdateReg(state, EB7);
425 if (status < 0)
426 break;
428 state->m_Regs[EB14] = 0; /* RFC_Cprog = 0 */
429 status = UpdateReg(state, EB14);
430 if (status < 0)
431 break;
433 state->m_Regs[EB20] &= ~0x20; /* ForceLock = 0; */
434 status = UpdateReg(state, EB20);
435 if (status < 0)
436 break;
438 state->m_Regs[EP4] |= 0x03; /* CAL_Mode = 3 */
439 status = UpdateRegs(state, EP4, EP5);
440 if (status < 0)
441 break;
443 status = CalcCalPLL(state, freq);
444 if (status < 0)
445 break;
446 status = CalcMainPLL(state, freq + 1000000);
447 if (status < 0)
448 break;
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;
464 state->m_Regs[EB4] &= ~0x20; /* LO_ForceSrce = 0 */
465 status = UpdateReg(state, EB4);
466 if (status < 0)
467 break;
469 state->m_Regs[EB7] &= ~0x20; /* CAL_ForceSrce = 0 */
470 status = UpdateReg(state, EB7);
471 if (status < 0)
472 break;
473 msleep(10);
475 state->m_Regs[EB20] |= 0x20; /* ForceLock = 1; */
476 status = UpdateReg(state, EB20);
477 if (status < 0)
478 break;
479 msleep(60);
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;
494 status = ReadExtented(state, Regs);
495 if (status < 0)
496 break;
498 *pCprog = Regs[EB14];
500 } while (0);
501 return status;
504 static int RFTrackingFiltersInit(struct tda_state *state,
505 u8 RFBand)
507 int status = 0;
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;
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;
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;
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;
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] = ???? */
541 if (RF2 == 0)
542 break;
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;
552 SearchMap2(m_RF_Cal_Map, RF2, &Cprog_table2);
553 if (!bcal)
554 Cprog_cal2 = Cprog_table2;
556 state->m_RF_A1[RFBand] =
557 (Cprog_cal2 - Cprog_table2 - Cprog_cal1 + Cprog_table1) /
558 ((s32)(RF2) - (s32)(RF1));
560 if (RF3 == 0)
561 break;
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;
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;
577 } while (0);
579 state->m_RF1[RFBand] = RF1;
580 state->m_RF2[RFBand] = RF2;
581 state->m_RF3[RFBand] = RF3;
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
589 return status;
592 static int PowerScan(struct tda_state *state,
593 u8 RFBand, u32 RF_in, u32 *pRF_Out, bool *pbcal)
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;
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))) {
612 printk(KERN_ERR "tda18271c2dd: %s Search map failed\n", __func__);
613 return -EINVAL;
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;
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) */
643 *pRF_Out = RF_in;
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;
661 if (Count < CountLimit * 100000)
662 continue;
663 if (sign < 0)
664 break;
666 sign = -sign;
667 Count = 200000;
668 wait = true;
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);
680 return status;
683 static int PowerScanInit(struct tda_state *state)
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;
705 static int CalcRFFilterCurve(struct tda_state *state)
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);
739 return status;
742 static int FixedContentsI2CUpdate(struct tda_state *state)
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,
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;
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;
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;
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
809 msleep(5);
810 status = UpdateReg(state, EP1);
811 if (status < 0)
812 break;
813 msleep(5);
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);
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;
839 msleep(5);
840 status = UpdateReg(state, EP1);
841 if (status < 0)
842 break;
843 msleep(5);
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);
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);
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;
895 } while (0);
896 return status;
899 static int InitCal(struct tda_state *state)
901 int status = 0;
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;
918 static int RFTrackingFiltersCorrection(struct tda_state *state,
919 u32 Frequency)
921 int status = 0;
922 s32 Cprog_table;
923 u8 RFBand;
924 u8 dCoverdT;
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))
930 return -EINVAL;
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;
944 state->m_Regs[EP3] &= ~0xE0; /* Power up */
945 status = UpdateReg(state, EP3);
946 if (status < 0)
947 break;
949 status = ThermometerRead(state, &TMValue_Current);
950 if (status < 0)
951 break;
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;
958 TComp = (int)(dCoverdT) * ((int)(TMValue_Current) - (int)(state->m_TMValue_RFCal))/1000;
960 Capprox += TComp;
962 if (Capprox < 0)
963 Capprox = 0;
964 else if (Capprox > 255)
965 Capprox = 255;
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;
972 status = UpdateReg(state, EB14);
973 if (status < 0)
974 break;
976 } while (0);
977 return status;
980 static int ChannelConfiguration(struct tda_state *state,
981 u32 Frequency, int Standard)
984 s32 IntermediateFrequency = m_StandardTable[Standard].m_IFFrequency;
985 int status = 0;
987 u8 BP_Filter = 0;
988 u8 RF_Band = 0;
989 u8 GainTaper = 0;
990 u8 IR_Meas = 0;
992 state->IF = IntermediateFrequency;
993 /* printk("tda18271c2dd: %s Freq = %d Standard = %d IF = %d\n", __func__, Frequency, Standard, IntermediateFrequency); */
994 /* get values from tables */
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))) {
1001 printk(KERN_ERR "tda18271c2dd: %s SearchMap failed\n", __func__);
1002 return -EINVAL;
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 */
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;
1021 if ((Standard == HF_FM_Radio) && state->m_bFMInput)
1022 state->m_Regs[EP4] |= 80;
1024 state->m_Regs[MPD] &= ~0x80;
1025 if (Standard > HF_AnalogMax)
1026 state->m_Regs[MPD] |= 0x80; /* Add IF_notch for digital */
1028 state->m_Regs[EB22] = m_StandardTable[Standard].m_EB22;
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 */
1036 status = UpdateRegs(state, EB22, EB23);
1037 if (status < 0)
1038 break;
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;
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;
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;
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;
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;
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;
1101 } while (0);
1102 return status;
1105 static int sleep(struct dvb_frontend *fe)
1107 struct tda_state *state = fe->tuner_priv;
1109 StandBy(state);
1110 return 0;
1113 static int init(struct dvb_frontend *fe)
1115 return 0;
1118 static int release(struct dvb_frontend *fe)
1120 kfree(fe->tuner_priv);
1121 fe->tuner_priv = NULL;
1122 return 0;
1126 static int set_params(struct dvb_frontend *fe)
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;
1134 state->m_Frequency = fe->dtv_property_cache.frequency;
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;
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;
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;
1173 msleep(state->m_SettlingTime); /* Allow AGC's to settle down */
1174 } while (0);
1175 return status;
1178 #if 0
1179 static int GetSignalStrength(s32 *pSignalStrength, u32 RFAgc, u32 IFAgc)
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;
1189 return 0;
1191 #endif
1193 static int get_if_frequency(struct dvb_frontend *fe, u32 *frequency)
1195 struct tda_state *state = fe->tuner_priv;
1197 *frequency = state->IF;
1198 return 0;
1201 static int get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
1203 /* struct tda_state *state = fe->tuner_priv; */
1204 /* *bandwidth = priv->bandwidth; */
1205 return 0;
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
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,
1224 struct dvb_frontend *tda18271c2dd_attach(struct dvb_frontend *fe,
1225 struct i2c_adapter *i2c, u8 adr)
1227 struct tda_state *state;
1229 state = kzalloc(sizeof(struct tda_state), GFP_KERNEL);
1230 if (!state)
1231 return NULL;
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);
1240 return fe;
1242 EXPORT_SYMBOL_GPL(tda18271c2dd_attach);
1244 MODULE_DESCRIPTION("TDA18271C2 driver");
1245 MODULE_AUTHOR("DD");
1246 MODULE_LICENSE("GPL");