treewide: remove redundant IS_ERR() before error code check
[linux/fpc-iii.git] / drivers / media / dvb-frontends / tda18271c2dd.c
blob43312bba1aec5e1371bc12688eb62075a0365b0f
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * tda18271c2dd: Driver for the TDA18271C2 tuner
5 * Copyright (C) 2010 Digital Devices GmbH
6 */
8 #include <linux/kernel.h>
9 #include <linux/module.h>
10 #include <linux/init.h>
11 #include <linux/delay.h>
12 #include <linux/firmware.h>
13 #include <linux/i2c.h>
14 #include <asm/div64.h>
16 #include <media/dvb_frontend.h>
17 #include "tda18271c2dd.h"
19 /* Max transfer size done by I2C transfer functions */
20 #define MAX_XFER_SIZE 64
22 struct SStandardParam {
23 s32 m_IFFrequency;
24 u32 m_BandWidth;
25 u8 m_EP3_4_0;
26 u8 m_EB22;
29 struct SMap {
30 u32 m_Frequency;
31 u8 m_Param;
34 struct SMapI {
35 u32 m_Frequency;
36 s32 m_Param;
39 struct SMap2 {
40 u32 m_Frequency;
41 u8 m_Param1;
42 u8 m_Param2;
45 struct SRFBandMap {
46 u32 m_RF_max;
47 u32 m_RF1_Default;
48 u32 m_RF2_Default;
49 u32 m_RF3_Default;
52 enum ERegister {
53 ID = 0,
54 TM,
55 PL,
56 EP1, EP2, EP3, EP4, EP5,
57 CPD, CD1, CD2, CD3,
58 MPD, MD1, MD2, MD3,
59 EB1, EB2, EB3, EB4, EB5, EB6, EB7, EB8, EB9, EB10,
60 EB11, EB12, EB13, EB14, EB15, EB16, EB17, EB18, EB19, EB20,
61 EB21, EB22, EB23,
62 NUM_REGS
65 struct tda_state {
66 struct i2c_adapter *i2c;
67 u8 adr;
69 u32 m_Frequency;
70 u32 IF;
72 u8 m_IFLevelAnalog;
73 u8 m_IFLevelDigital;
74 u8 m_IFLevelDVBC;
75 u8 m_IFLevelDVBT;
77 u8 m_EP4;
78 u8 m_EP3_Standby;
80 bool m_bMaster;
82 s32 m_SettlingTime;
84 u8 m_Regs[NUM_REGS];
86 /* Tracking filter settings for band 0..6 */
87 u32 m_RF1[7];
88 s32 m_RF_A1[7];
89 s32 m_RF_B1[7];
90 u32 m_RF2[7];
91 s32 m_RF_A2[7];
92 s32 m_RF_B2[7];
93 u32 m_RF3[7];
95 u8 m_TMValue_RFCal; /* Calibration temperature */
97 bool m_bFMInput; /* true to use Pin 8 for FM Radio */
101 static int PowerScan(struct tda_state *state,
102 u8 RFBand, u32 RF_in,
103 u32 *pRF_Out, bool *pbcal);
105 static int i2c_readn(struct i2c_adapter *adapter, u8 adr, u8 *data, int len)
107 struct i2c_msg msgs[1] = {{.addr = adr, .flags = I2C_M_RD,
108 .buf = data, .len = len} };
109 return (i2c_transfer(adapter, msgs, 1) == 1) ? 0 : -1;
112 static int i2c_write(struct i2c_adapter *adap, u8 adr, u8 *data, int len)
114 struct i2c_msg msg = {.addr = adr, .flags = 0,
115 .buf = data, .len = len};
117 if (i2c_transfer(adap, &msg, 1) != 1) {
118 printk(KERN_ERR "tda18271c2dd: i2c write error at addr %i\n", adr);
119 return -1;
121 return 0;
124 static int WriteRegs(struct tda_state *state,
125 u8 SubAddr, u8 *Regs, u16 nRegs)
127 u8 data[MAX_XFER_SIZE];
129 if (1 + nRegs > sizeof(data)) {
130 printk(KERN_WARNING
131 "%s: i2c wr: len=%d is too big!\n",
132 KBUILD_MODNAME, nRegs);
133 return -EINVAL;
136 data[0] = SubAddr;
137 memcpy(data + 1, Regs, nRegs);
138 return i2c_write(state->i2c, state->adr, data, nRegs + 1);
141 static int WriteReg(struct tda_state *state, u8 SubAddr, u8 Reg)
143 u8 msg[2] = {SubAddr, Reg};
145 return i2c_write(state->i2c, state->adr, msg, 2);
148 static int Read(struct tda_state *state, u8 * Regs)
150 return i2c_readn(state->i2c, state->adr, Regs, 16);
153 static int ReadExtented(struct tda_state *state, u8 * Regs)
155 return i2c_readn(state->i2c, state->adr, Regs, NUM_REGS);
158 static int UpdateRegs(struct tda_state *state, u8 RegFrom, u8 RegTo)
160 return WriteRegs(state, RegFrom,
161 &state->m_Regs[RegFrom], RegTo-RegFrom+1);
163 static int UpdateReg(struct tda_state *state, u8 Reg)
165 return WriteReg(state, Reg, state->m_Regs[Reg]);
168 #include "tda18271c2dd_maps.h"
170 static void reset(struct tda_state *state)
172 u32 ulIFLevelAnalog = 0;
173 u32 ulIFLevelDigital = 2;
174 u32 ulIFLevelDVBC = 7;
175 u32 ulIFLevelDVBT = 6;
176 u32 ulXTOut = 0;
177 u32 ulStandbyMode = 0x06; /* Send in stdb, but leave osc on */
178 u32 ulSlave = 0;
179 u32 ulFMInput = 0;
180 u32 ulSettlingTime = 100;
182 state->m_Frequency = 0;
183 state->m_SettlingTime = 100;
184 state->m_IFLevelAnalog = (ulIFLevelAnalog & 0x07) << 2;
185 state->m_IFLevelDigital = (ulIFLevelDigital & 0x07) << 2;
186 state->m_IFLevelDVBC = (ulIFLevelDVBC & 0x07) << 2;
187 state->m_IFLevelDVBT = (ulIFLevelDVBT & 0x07) << 2;
189 state->m_EP4 = 0x20;
190 if (ulXTOut != 0)
191 state->m_EP4 |= 0x40;
193 state->m_EP3_Standby = ((ulStandbyMode & 0x07) << 5) | 0x0F;
194 state->m_bMaster = (ulSlave == 0);
196 state->m_SettlingTime = ulSettlingTime;
198 state->m_bFMInput = (ulFMInput == 2);
201 static bool SearchMap1(struct SMap Map[],
202 u32 Frequency, u8 *pParam)
204 int i = 0;
206 while ((Map[i].m_Frequency != 0) && (Frequency > Map[i].m_Frequency))
207 i += 1;
208 if (Map[i].m_Frequency == 0)
209 return false;
210 *pParam = Map[i].m_Param;
211 return true;
214 static bool SearchMap2(struct SMapI Map[],
215 u32 Frequency, s32 *pParam)
217 int i = 0;
219 while ((Map[i].m_Frequency != 0) &&
220 (Frequency > Map[i].m_Frequency))
221 i += 1;
222 if (Map[i].m_Frequency == 0)
223 return false;
224 *pParam = Map[i].m_Param;
225 return true;
228 static bool SearchMap3(struct SMap2 Map[], u32 Frequency,
229 u8 *pParam1, u8 *pParam2)
231 int i = 0;
233 while ((Map[i].m_Frequency != 0) &&
234 (Frequency > Map[i].m_Frequency))
235 i += 1;
236 if (Map[i].m_Frequency == 0)
237 return false;
238 *pParam1 = Map[i].m_Param1;
239 *pParam2 = Map[i].m_Param2;
240 return true;
243 static bool SearchMap4(struct SRFBandMap Map[],
244 u32 Frequency, u8 *pRFBand)
246 int i = 0;
248 while (i < 7 && (Frequency > Map[i].m_RF_max))
249 i += 1;
250 if (i == 7)
251 return false;
252 *pRFBand = i;
253 return true;
256 static int ThermometerRead(struct tda_state *state, u8 *pTM_Value)
258 int status = 0;
260 do {
261 u8 Regs[16];
262 state->m_Regs[TM] |= 0x10;
263 status = UpdateReg(state, TM);
264 if (status < 0)
265 break;
266 status = Read(state, Regs);
267 if (status < 0)
268 break;
269 if (((Regs[TM] & 0x0F) == 0 && (Regs[TM] & 0x20) == 0x20) ||
270 ((Regs[TM] & 0x0F) == 8 && (Regs[TM] & 0x20) == 0x00)) {
271 state->m_Regs[TM] ^= 0x20;
272 status = UpdateReg(state, TM);
273 if (status < 0)
274 break;
275 msleep(10);
276 status = Read(state, Regs);
277 if (status < 0)
278 break;
280 *pTM_Value = (Regs[TM] & 0x20)
281 ? m_Thermometer_Map_2[Regs[TM] & 0x0F]
282 : m_Thermometer_Map_1[Regs[TM] & 0x0F] ;
283 state->m_Regs[TM] &= ~0x10; /* Thermometer off */
284 status = UpdateReg(state, TM);
285 if (status < 0)
286 break;
287 state->m_Regs[EP4] &= ~0x03; /* CAL_mode = 0 ????????? */
288 status = UpdateReg(state, EP4);
289 if (status < 0)
290 break;
291 } while (0);
293 return status;
296 static int StandBy(struct tda_state *state)
298 int status = 0;
299 do {
300 state->m_Regs[EB12] &= ~0x20; /* PD_AGC1_Det = 0 */
301 status = UpdateReg(state, EB12);
302 if (status < 0)
303 break;
304 state->m_Regs[EB18] &= ~0x83; /* AGC1_loop_off = 0, AGC1_Gain = 6 dB */
305 status = UpdateReg(state, EB18);
306 if (status < 0)
307 break;
308 state->m_Regs[EB21] |= 0x03; /* AGC2_Gain = -6 dB */
309 state->m_Regs[EP3] = state->m_EP3_Standby;
310 status = UpdateReg(state, EP3);
311 if (status < 0)
312 break;
313 state->m_Regs[EB23] &= ~0x06; /* ForceLP_Fc2_En = 0, LP_Fc[2] = 0 */
314 status = UpdateRegs(state, EB21, EB23);
315 if (status < 0)
316 break;
317 } while (0);
318 return status;
321 static int CalcMainPLL(struct tda_state *state, u32 freq)
324 u8 PostDiv;
325 u8 Div;
326 u64 OscFreq;
327 u32 MainDiv;
329 if (!SearchMap3(m_Main_PLL_Map, freq, &PostDiv, &Div))
330 return -EINVAL;
332 OscFreq = (u64) freq * (u64) Div;
333 OscFreq *= (u64) 16384;
334 do_div(OscFreq, (u64)16000000);
335 MainDiv = OscFreq;
337 state->m_Regs[MPD] = PostDiv & 0x77;
338 state->m_Regs[MD1] = ((MainDiv >> 16) & 0x7F);
339 state->m_Regs[MD2] = ((MainDiv >> 8) & 0xFF);
340 state->m_Regs[MD3] = (MainDiv & 0xFF);
342 return UpdateRegs(state, MPD, MD3);
345 static int CalcCalPLL(struct tda_state *state, u32 freq)
347 u8 PostDiv;
348 u8 Div;
349 u64 OscFreq;
350 u32 CalDiv;
352 if (!SearchMap3(m_Cal_PLL_Map, freq, &PostDiv, &Div))
353 return -EINVAL;
355 OscFreq = (u64)freq * (u64)Div;
356 /* CalDiv = u32( OscFreq * 16384 / 16000000 ); */
357 OscFreq *= (u64)16384;
358 do_div(OscFreq, (u64)16000000);
359 CalDiv = OscFreq;
361 state->m_Regs[CPD] = PostDiv;
362 state->m_Regs[CD1] = ((CalDiv >> 16) & 0xFF);
363 state->m_Regs[CD2] = ((CalDiv >> 8) & 0xFF);
364 state->m_Regs[CD3] = (CalDiv & 0xFF);
366 return UpdateRegs(state, CPD, CD3);
369 static int CalibrateRF(struct tda_state *state,
370 u8 RFBand, u32 freq, s32 *pCprog)
372 int status = 0;
373 u8 Regs[NUM_REGS];
374 do {
375 u8 BP_Filter = 0;
376 u8 GainTaper = 0;
377 u8 RFC_K = 0;
378 u8 RFC_M = 0;
380 state->m_Regs[EP4] &= ~0x03; /* CAL_mode = 0 */
381 status = UpdateReg(state, EP4);
382 if (status < 0)
383 break;
384 state->m_Regs[EB18] |= 0x03; /* AGC1_Gain = 3 */
385 status = UpdateReg(state, EB18);
386 if (status < 0)
387 break;
389 /* Switching off LT (as datasheet says) causes calibration on C1 to fail */
390 /* (Readout of Cprog is always 255) */
391 if (state->m_Regs[ID] != 0x83) /* C1: ID == 83, C2: ID == 84 */
392 state->m_Regs[EP3] |= 0x40; /* SM_LT = 1 */
394 if (!(SearchMap1(m_BP_Filter_Map, freq, &BP_Filter) &&
395 SearchMap1(m_GainTaper_Map, freq, &GainTaper) &&
396 SearchMap3(m_KM_Map, freq, &RFC_K, &RFC_M)))
397 return -EINVAL;
399 state->m_Regs[EP1] = (state->m_Regs[EP1] & ~0x07) | BP_Filter;
400 state->m_Regs[EP2] = (RFBand << 5) | GainTaper;
402 state->m_Regs[EB13] = (state->m_Regs[EB13] & ~0x7C) | (RFC_K << 4) | (RFC_M << 2);
404 status = UpdateRegs(state, EP1, EP3);
405 if (status < 0)
406 break;
407 status = UpdateReg(state, EB13);
408 if (status < 0)
409 break;
411 state->m_Regs[EB4] |= 0x20; /* LO_ForceSrce = 1 */
412 status = UpdateReg(state, EB4);
413 if (status < 0)
414 break;
416 state->m_Regs[EB7] |= 0x20; /* CAL_ForceSrce = 1 */
417 status = UpdateReg(state, EB7);
418 if (status < 0)
419 break;
421 state->m_Regs[EB14] = 0; /* RFC_Cprog = 0 */
422 status = UpdateReg(state, EB14);
423 if (status < 0)
424 break;
426 state->m_Regs[EB20] &= ~0x20; /* ForceLock = 0; */
427 status = UpdateReg(state, EB20);
428 if (status < 0)
429 break;
431 state->m_Regs[EP4] |= 0x03; /* CAL_Mode = 3 */
432 status = UpdateRegs(state, EP4, EP5);
433 if (status < 0)
434 break;
436 status = CalcCalPLL(state, freq);
437 if (status < 0)
438 break;
439 status = CalcMainPLL(state, freq + 1000000);
440 if (status < 0)
441 break;
443 msleep(5);
444 status = UpdateReg(state, EP2);
445 if (status < 0)
446 break;
447 status = UpdateReg(state, EP1);
448 if (status < 0)
449 break;
450 status = UpdateReg(state, EP2);
451 if (status < 0)
452 break;
453 status = UpdateReg(state, EP1);
454 if (status < 0)
455 break;
457 state->m_Regs[EB4] &= ~0x20; /* LO_ForceSrce = 0 */
458 status = UpdateReg(state, EB4);
459 if (status < 0)
460 break;
462 state->m_Regs[EB7] &= ~0x20; /* CAL_ForceSrce = 0 */
463 status = UpdateReg(state, EB7);
464 if (status < 0)
465 break;
466 msleep(10);
468 state->m_Regs[EB20] |= 0x20; /* ForceLock = 1; */
469 status = UpdateReg(state, EB20);
470 if (status < 0)
471 break;
472 msleep(60);
474 state->m_Regs[EP4] &= ~0x03; /* CAL_Mode = 0 */
475 state->m_Regs[EP3] &= ~0x40; /* SM_LT = 0 */
476 state->m_Regs[EB18] &= ~0x03; /* AGC1_Gain = 0 */
477 status = UpdateReg(state, EB18);
478 if (status < 0)
479 break;
480 status = UpdateRegs(state, EP3, EP4);
481 if (status < 0)
482 break;
483 status = UpdateReg(state, EP1);
484 if (status < 0)
485 break;
487 status = ReadExtented(state, Regs);
488 if (status < 0)
489 break;
491 *pCprog = Regs[EB14];
493 } while (0);
494 return status;
497 static int RFTrackingFiltersInit(struct tda_state *state,
498 u8 RFBand)
500 int status = 0;
502 u32 RF1 = m_RF_Band_Map[RFBand].m_RF1_Default;
503 u32 RF2 = m_RF_Band_Map[RFBand].m_RF2_Default;
504 u32 RF3 = m_RF_Band_Map[RFBand].m_RF3_Default;
505 bool bcal = false;
507 s32 Cprog_cal1 = 0;
508 s32 Cprog_table1 = 0;
509 s32 Cprog_cal2 = 0;
510 s32 Cprog_table2 = 0;
511 s32 Cprog_cal3 = 0;
512 s32 Cprog_table3 = 0;
514 state->m_RF_A1[RFBand] = 0;
515 state->m_RF_B1[RFBand] = 0;
516 state->m_RF_A2[RFBand] = 0;
517 state->m_RF_B2[RFBand] = 0;
519 do {
520 status = PowerScan(state, RFBand, RF1, &RF1, &bcal);
521 if (status < 0)
522 break;
523 if (bcal) {
524 status = CalibrateRF(state, RFBand, RF1, &Cprog_cal1);
525 if (status < 0)
526 break;
528 SearchMap2(m_RF_Cal_Map, RF1, &Cprog_table1);
529 if (!bcal)
530 Cprog_cal1 = Cprog_table1;
531 state->m_RF_B1[RFBand] = Cprog_cal1 - Cprog_table1;
532 /* state->m_RF_A1[RF_Band] = ???? */
534 if (RF2 == 0)
535 break;
537 status = PowerScan(state, RFBand, RF2, &RF2, &bcal);
538 if (status < 0)
539 break;
540 if (bcal) {
541 status = CalibrateRF(state, RFBand, RF2, &Cprog_cal2);
542 if (status < 0)
543 break;
545 SearchMap2(m_RF_Cal_Map, RF2, &Cprog_table2);
546 if (!bcal)
547 Cprog_cal2 = Cprog_table2;
549 state->m_RF_A1[RFBand] =
550 (Cprog_cal2 - Cprog_table2 - Cprog_cal1 + Cprog_table1) /
551 ((s32)(RF2) - (s32)(RF1));
553 if (RF3 == 0)
554 break;
556 status = PowerScan(state, RFBand, RF3, &RF3, &bcal);
557 if (status < 0)
558 break;
559 if (bcal) {
560 status = CalibrateRF(state, RFBand, RF3, &Cprog_cal3);
561 if (status < 0)
562 break;
564 SearchMap2(m_RF_Cal_Map, RF3, &Cprog_table3);
565 if (!bcal)
566 Cprog_cal3 = Cprog_table3;
567 state->m_RF_A2[RFBand] = (Cprog_cal3 - Cprog_table3 - Cprog_cal2 + Cprog_table2) / ((s32)(RF3) - (s32)(RF2));
568 state->m_RF_B2[RFBand] = Cprog_cal2 - Cprog_table2;
570 } while (0);
572 state->m_RF1[RFBand] = RF1;
573 state->m_RF2[RFBand] = RF2;
574 state->m_RF3[RFBand] = RF3;
576 #if 0
577 printk(KERN_ERR "tda18271c2dd: %s %d RF1 = %d A1 = %d B1 = %d RF2 = %d A2 = %d B2 = %d RF3 = %d\n", __func__,
578 RFBand, RF1, state->m_RF_A1[RFBand], state->m_RF_B1[RFBand], RF2,
579 state->m_RF_A2[RFBand], state->m_RF_B2[RFBand], RF3);
580 #endif
582 return status;
585 static int PowerScan(struct tda_state *state,
586 u8 RFBand, u32 RF_in, u32 *pRF_Out, bool *pbcal)
588 int status = 0;
589 do {
590 u8 Gain_Taper = 0;
591 s32 RFC_Cprog = 0;
592 u8 CID_Target = 0;
593 u8 CountLimit = 0;
594 u32 freq_MainPLL;
595 u8 Regs[NUM_REGS];
596 u8 CID_Gain;
597 s32 Count = 0;
598 int sign = 1;
599 bool wait = false;
601 if (!(SearchMap2(m_RF_Cal_Map, RF_in, &RFC_Cprog) &&
602 SearchMap1(m_GainTaper_Map, RF_in, &Gain_Taper) &&
603 SearchMap3(m_CID_Target_Map, RF_in, &CID_Target, &CountLimit))) {
605 printk(KERN_ERR "tda18271c2dd: %s Search map failed\n", __func__);
606 return -EINVAL;
609 state->m_Regs[EP2] = (RFBand << 5) | Gain_Taper;
610 state->m_Regs[EB14] = (RFC_Cprog);
611 status = UpdateReg(state, EP2);
612 if (status < 0)
613 break;
614 status = UpdateReg(state, EB14);
615 if (status < 0)
616 break;
618 freq_MainPLL = RF_in + 1000000;
619 status = CalcMainPLL(state, freq_MainPLL);
620 if (status < 0)
621 break;
622 msleep(5);
623 state->m_Regs[EP4] = (state->m_Regs[EP4] & ~0x03) | 1; /* CAL_mode = 1 */
624 status = UpdateReg(state, EP4);
625 if (status < 0)
626 break;
627 status = UpdateReg(state, EP2); /* Launch power measurement */
628 if (status < 0)
629 break;
630 status = ReadExtented(state, Regs);
631 if (status < 0)
632 break;
633 CID_Gain = Regs[EB10] & 0x3F;
634 state->m_Regs[ID] = Regs[ID]; /* Chip version, (needed for C1 workaround in CalibrateRF) */
636 *pRF_Out = RF_in;
638 while (CID_Gain < CID_Target) {
639 freq_MainPLL = RF_in + sign * Count + 1000000;
640 status = CalcMainPLL(state, freq_MainPLL);
641 if (status < 0)
642 break;
643 msleep(wait ? 5 : 1);
644 wait = false;
645 status = UpdateReg(state, EP2); /* Launch power measurement */
646 if (status < 0)
647 break;
648 status = ReadExtented(state, Regs);
649 if (status < 0)
650 break;
651 CID_Gain = Regs[EB10] & 0x3F;
652 Count += 200000;
654 if (Count < CountLimit * 100000)
655 continue;
656 if (sign < 0)
657 break;
659 sign = -sign;
660 Count = 200000;
661 wait = true;
663 if (status < 0)
664 break;
665 if (CID_Gain >= CID_Target) {
666 *pbcal = true;
667 *pRF_Out = freq_MainPLL - 1000000;
668 } else
669 *pbcal = false;
670 } while (0);
672 return status;
675 static int PowerScanInit(struct tda_state *state)
677 int status = 0;
678 do {
679 state->m_Regs[EP3] = (state->m_Regs[EP3] & ~0x1F) | 0x12;
680 state->m_Regs[EP4] = (state->m_Regs[EP4] & ~0x1F); /* If level = 0, Cal mode = 0 */
681 status = UpdateRegs(state, EP3, EP4);
682 if (status < 0)
683 break;
684 state->m_Regs[EB18] = (state->m_Regs[EB18] & ~0x03); /* AGC 1 Gain = 0 */
685 status = UpdateReg(state, EB18);
686 if (status < 0)
687 break;
688 state->m_Regs[EB21] = (state->m_Regs[EB21] & ~0x03); /* AGC 2 Gain = 0 (Datasheet = 3) */
689 state->m_Regs[EB23] = (state->m_Regs[EB23] | 0x06); /* ForceLP_Fc2_En = 1, LPFc[2] = 1 */
690 status = UpdateRegs(state, EB21, EB23);
691 if (status < 0)
692 break;
693 } while (0);
694 return status;
697 static int CalcRFFilterCurve(struct tda_state *state)
699 int status = 0;
700 do {
701 msleep(200); /* Temperature stabilisation */
702 status = PowerScanInit(state);
703 if (status < 0)
704 break;
705 status = RFTrackingFiltersInit(state, 0);
706 if (status < 0)
707 break;
708 status = RFTrackingFiltersInit(state, 1);
709 if (status < 0)
710 break;
711 status = RFTrackingFiltersInit(state, 2);
712 if (status < 0)
713 break;
714 status = RFTrackingFiltersInit(state, 3);
715 if (status < 0)
716 break;
717 status = RFTrackingFiltersInit(state, 4);
718 if (status < 0)
719 break;
720 status = RFTrackingFiltersInit(state, 5);
721 if (status < 0)
722 break;
723 status = RFTrackingFiltersInit(state, 6);
724 if (status < 0)
725 break;
726 status = ThermometerRead(state, &state->m_TMValue_RFCal); /* also switches off Cal mode !!! */
727 if (status < 0)
728 break;
729 } while (0);
731 return status;
734 static int FixedContentsI2CUpdate(struct tda_state *state)
736 static u8 InitRegs[] = {
737 0x08, 0x80, 0xC6,
738 0xDF, 0x16, 0x60, 0x80,
739 0x80, 0x00, 0x00, 0x00,
740 0x00, 0x00, 0x00, 0x00,
741 0xFC, 0x01, 0x84, 0x41,
742 0x01, 0x84, 0x40, 0x07,
743 0x00, 0x00, 0x96, 0x3F,
744 0xC1, 0x00, 0x8F, 0x00,
745 0x00, 0x8C, 0x00, 0x20,
746 0xB3, 0x48, 0xB0,
748 int status = 0;
749 memcpy(&state->m_Regs[TM], InitRegs, EB23 - TM + 1);
750 do {
751 status = UpdateRegs(state, TM, EB23);
752 if (status < 0)
753 break;
755 /* AGC1 gain setup */
756 state->m_Regs[EB17] = 0x00;
757 status = UpdateReg(state, EB17);
758 if (status < 0)
759 break;
760 state->m_Regs[EB17] = 0x03;
761 status = UpdateReg(state, EB17);
762 if (status < 0)
763 break;
764 state->m_Regs[EB17] = 0x43;
765 status = UpdateReg(state, EB17);
766 if (status < 0)
767 break;
768 state->m_Regs[EB17] = 0x4C;
769 status = UpdateReg(state, EB17);
770 if (status < 0)
771 break;
773 /* IRC Cal Low band */
774 state->m_Regs[EP3] = 0x1F;
775 state->m_Regs[EP4] = 0x66;
776 state->m_Regs[EP5] = 0x81;
777 state->m_Regs[CPD] = 0xCC;
778 state->m_Regs[CD1] = 0x6C;
779 state->m_Regs[CD2] = 0x00;
780 state->m_Regs[CD3] = 0x00;
781 state->m_Regs[MPD] = 0xC5;
782 state->m_Regs[MD1] = 0x77;
783 state->m_Regs[MD2] = 0x08;
784 state->m_Regs[MD3] = 0x00;
785 status = UpdateRegs(state, EP2, MD3); /* diff between sw and datasheet (ep3-md3) */
786 if (status < 0)
787 break;
789 #if 0
790 state->m_Regs[EB4] = 0x61; /* missing in sw */
791 status = UpdateReg(state, EB4);
792 if (status < 0)
793 break;
794 msleep(1);
795 state->m_Regs[EB4] = 0x41;
796 status = UpdateReg(state, EB4);
797 if (status < 0)
798 break;
799 #endif
801 msleep(5);
802 status = UpdateReg(state, EP1);
803 if (status < 0)
804 break;
805 msleep(5);
807 state->m_Regs[EP5] = 0x85;
808 state->m_Regs[CPD] = 0xCB;
809 state->m_Regs[CD1] = 0x66;
810 state->m_Regs[CD2] = 0x70;
811 status = UpdateRegs(state, EP3, CD3);
812 if (status < 0)
813 break;
814 msleep(5);
815 status = UpdateReg(state, EP2);
816 if (status < 0)
817 break;
818 msleep(30);
820 /* IRC Cal mid band */
821 state->m_Regs[EP5] = 0x82;
822 state->m_Regs[CPD] = 0xA8;
823 state->m_Regs[CD2] = 0x00;
824 state->m_Regs[MPD] = 0xA1; /* Datasheet = 0xA9 */
825 state->m_Regs[MD1] = 0x73;
826 state->m_Regs[MD2] = 0x1A;
827 status = UpdateRegs(state, EP3, MD3);
828 if (status < 0)
829 break;
831 msleep(5);
832 status = UpdateReg(state, EP1);
833 if (status < 0)
834 break;
835 msleep(5);
837 state->m_Regs[EP5] = 0x86;
838 state->m_Regs[CPD] = 0xA8;
839 state->m_Regs[CD1] = 0x66;
840 state->m_Regs[CD2] = 0xA0;
841 status = UpdateRegs(state, EP3, CD3);
842 if (status < 0)
843 break;
844 msleep(5);
845 status = UpdateReg(state, EP2);
846 if (status < 0)
847 break;
848 msleep(30);
850 /* IRC Cal high band */
851 state->m_Regs[EP5] = 0x83;
852 state->m_Regs[CPD] = 0x98;
853 state->m_Regs[CD1] = 0x65;
854 state->m_Regs[CD2] = 0x00;
855 state->m_Regs[MPD] = 0x91; /* Datasheet = 0x91 */
856 state->m_Regs[MD1] = 0x71;
857 state->m_Regs[MD2] = 0xCD;
858 status = UpdateRegs(state, EP3, MD3);
859 if (status < 0)
860 break;
861 msleep(5);
862 status = UpdateReg(state, EP1);
863 if (status < 0)
864 break;
865 msleep(5);
866 state->m_Regs[EP5] = 0x87;
867 state->m_Regs[CD1] = 0x65;
868 state->m_Regs[CD2] = 0x50;
869 status = UpdateRegs(state, EP3, CD3);
870 if (status < 0)
871 break;
872 msleep(5);
873 status = UpdateReg(state, EP2);
874 if (status < 0)
875 break;
876 msleep(30);
878 /* Back to normal */
879 state->m_Regs[EP4] = 0x64;
880 status = UpdateReg(state, EP4);
881 if (status < 0)
882 break;
883 status = UpdateReg(state, EP1);
884 if (status < 0)
885 break;
887 } while (0);
888 return status;
891 static int InitCal(struct tda_state *state)
893 int status = 0;
895 do {
896 status = FixedContentsI2CUpdate(state);
897 if (status < 0)
898 break;
899 status = CalcRFFilterCurve(state);
900 if (status < 0)
901 break;
902 status = StandBy(state);
903 if (status < 0)
904 break;
905 /* m_bInitDone = true; */
906 } while (0);
907 return status;
910 static int RFTrackingFiltersCorrection(struct tda_state *state,
911 u32 Frequency)
913 int status = 0;
914 s32 Cprog_table;
915 u8 RFBand;
916 u8 dCoverdT;
918 if (!SearchMap2(m_RF_Cal_Map, Frequency, &Cprog_table) ||
919 !SearchMap4(m_RF_Band_Map, Frequency, &RFBand) ||
920 !SearchMap1(m_RF_Cal_DC_Over_DT_Map, Frequency, &dCoverdT))
922 return -EINVAL;
924 do {
925 u8 TMValue_Current;
926 u32 RF1 = state->m_RF1[RFBand];
927 u32 RF2 = state->m_RF1[RFBand];
928 u32 RF3 = state->m_RF1[RFBand];
929 s32 RF_A1 = state->m_RF_A1[RFBand];
930 s32 RF_B1 = state->m_RF_B1[RFBand];
931 s32 RF_A2 = state->m_RF_A2[RFBand];
932 s32 RF_B2 = state->m_RF_B2[RFBand];
933 s32 Capprox = 0;
934 int TComp;
936 state->m_Regs[EP3] &= ~0xE0; /* Power up */
937 status = UpdateReg(state, EP3);
938 if (status < 0)
939 break;
941 status = ThermometerRead(state, &TMValue_Current);
942 if (status < 0)
943 break;
945 if (RF3 == 0 || Frequency < RF2)
946 Capprox = RF_A1 * ((s32)(Frequency) - (s32)(RF1)) + RF_B1 + Cprog_table;
947 else
948 Capprox = RF_A2 * ((s32)(Frequency) - (s32)(RF2)) + RF_B2 + Cprog_table;
950 TComp = (int)(dCoverdT) * ((int)(TMValue_Current) - (int)(state->m_TMValue_RFCal))/1000;
952 Capprox += TComp;
954 if (Capprox < 0)
955 Capprox = 0;
956 else if (Capprox > 255)
957 Capprox = 255;
960 /* TODO Temperature compensation. There is defenitely a scale factor */
961 /* missing in the datasheet, so leave it out for now. */
962 state->m_Regs[EB14] = Capprox;
964 status = UpdateReg(state, EB14);
965 if (status < 0)
966 break;
968 } while (0);
969 return status;
972 static int ChannelConfiguration(struct tda_state *state,
973 u32 Frequency, int Standard)
976 s32 IntermediateFrequency = m_StandardTable[Standard].m_IFFrequency;
977 int status = 0;
979 u8 BP_Filter = 0;
980 u8 RF_Band = 0;
981 u8 GainTaper = 0;
982 u8 IR_Meas = 0;
984 state->IF = IntermediateFrequency;
985 /* printk("tda18271c2dd: %s Freq = %d Standard = %d IF = %d\n", __func__, Frequency, Standard, IntermediateFrequency); */
986 /* get values from tables */
988 if (!(SearchMap1(m_BP_Filter_Map, Frequency, &BP_Filter) &&
989 SearchMap1(m_GainTaper_Map, Frequency, &GainTaper) &&
990 SearchMap1(m_IR_Meas_Map, Frequency, &IR_Meas) &&
991 SearchMap4(m_RF_Band_Map, Frequency, &RF_Band))) {
993 printk(KERN_ERR "tda18271c2dd: %s SearchMap failed\n", __func__);
994 return -EINVAL;
997 do {
998 state->m_Regs[EP3] = (state->m_Regs[EP3] & ~0x1F) | m_StandardTable[Standard].m_EP3_4_0;
999 state->m_Regs[EP3] &= ~0x04; /* switch RFAGC to high speed mode */
1001 /* m_EP4 default for XToutOn, CAL_Mode (0) */
1002 state->m_Regs[EP4] = state->m_EP4 | ((Standard > HF_AnalogMax) ? state->m_IFLevelDigital : state->m_IFLevelAnalog);
1003 /* state->m_Regs[EP4] = state->m_EP4 | state->m_IFLevelDigital; */
1004 if (Standard <= HF_AnalogMax)
1005 state->m_Regs[EP4] = state->m_EP4 | state->m_IFLevelAnalog;
1006 else if (Standard <= HF_ATSC)
1007 state->m_Regs[EP4] = state->m_EP4 | state->m_IFLevelDVBT;
1008 else if (Standard <= HF_DVBC)
1009 state->m_Regs[EP4] = state->m_EP4 | state->m_IFLevelDVBC;
1010 else
1011 state->m_Regs[EP4] = state->m_EP4 | state->m_IFLevelDigital;
1013 if ((Standard == HF_FM_Radio) && state->m_bFMInput)
1014 state->m_Regs[EP4] |= 0x80;
1016 state->m_Regs[MPD] &= ~0x80;
1017 if (Standard > HF_AnalogMax)
1018 state->m_Regs[MPD] |= 0x80; /* Add IF_notch for digital */
1020 state->m_Regs[EB22] = m_StandardTable[Standard].m_EB22;
1022 /* Note: This is missing from flowchart in TDA18271 specification ( 1.5 MHz cutoff for FM ) */
1023 if (Standard == HF_FM_Radio)
1024 state->m_Regs[EB23] |= 0x06; /* ForceLP_Fc2_En = 1, LPFc[2] = 1 */
1025 else
1026 state->m_Regs[EB23] &= ~0x06; /* ForceLP_Fc2_En = 0, LPFc[2] = 0 */
1028 status = UpdateRegs(state, EB22, EB23);
1029 if (status < 0)
1030 break;
1032 state->m_Regs[EP1] = (state->m_Regs[EP1] & ~0x07) | 0x40 | BP_Filter; /* Dis_Power_level = 1, Filter */
1033 state->m_Regs[EP5] = (state->m_Regs[EP5] & ~0x07) | IR_Meas;
1034 state->m_Regs[EP2] = (RF_Band << 5) | GainTaper;
1036 state->m_Regs[EB1] = (state->m_Regs[EB1] & ~0x07) |
1037 (state->m_bMaster ? 0x04 : 0x00); /* CALVCO_FortLOn = MS */
1038 /* AGC1_always_master = 0 */
1039 /* AGC_firstn = 0 */
1040 status = UpdateReg(state, EB1);
1041 if (status < 0)
1042 break;
1044 if (state->m_bMaster) {
1045 status = CalcMainPLL(state, Frequency + IntermediateFrequency);
1046 if (status < 0)
1047 break;
1048 status = UpdateRegs(state, TM, EP5);
1049 if (status < 0)
1050 break;
1051 state->m_Regs[EB4] |= 0x20; /* LO_forceSrce = 1 */
1052 status = UpdateReg(state, EB4);
1053 if (status < 0)
1054 break;
1055 msleep(1);
1056 state->m_Regs[EB4] &= ~0x20; /* LO_forceSrce = 0 */
1057 status = UpdateReg(state, EB4);
1058 if (status < 0)
1059 break;
1060 } else {
1061 u8 PostDiv = 0;
1062 u8 Div;
1063 status = CalcCalPLL(state, Frequency + IntermediateFrequency);
1064 if (status < 0)
1065 break;
1067 SearchMap3(m_Cal_PLL_Map, Frequency + IntermediateFrequency, &PostDiv, &Div);
1068 state->m_Regs[MPD] = (state->m_Regs[MPD] & ~0x7F) | (PostDiv & 0x77);
1069 status = UpdateReg(state, MPD);
1070 if (status < 0)
1071 break;
1072 status = UpdateRegs(state, TM, EP5);
1073 if (status < 0)
1074 break;
1076 state->m_Regs[EB7] |= 0x20; /* CAL_forceSrce = 1 */
1077 status = UpdateReg(state, EB7);
1078 if (status < 0)
1079 break;
1080 msleep(1);
1081 state->m_Regs[EB7] &= ~0x20; /* CAL_forceSrce = 0 */
1082 status = UpdateReg(state, EB7);
1083 if (status < 0)
1084 break;
1086 msleep(20);
1087 if (Standard != HF_FM_Radio)
1088 state->m_Regs[EP3] |= 0x04; /* RFAGC to normal mode */
1089 status = UpdateReg(state, EP3);
1090 if (status < 0)
1091 break;
1093 } while (0);
1094 return status;
1097 static int sleep(struct dvb_frontend *fe)
1099 struct tda_state *state = fe->tuner_priv;
1101 StandBy(state);
1102 return 0;
1105 static int init(struct dvb_frontend *fe)
1107 return 0;
1110 static void release(struct dvb_frontend *fe)
1112 kfree(fe->tuner_priv);
1113 fe->tuner_priv = NULL;
1117 static int set_params(struct dvb_frontend *fe)
1119 struct tda_state *state = fe->tuner_priv;
1120 int status = 0;
1121 int Standard;
1122 u32 bw = fe->dtv_property_cache.bandwidth_hz;
1123 u32 delsys = fe->dtv_property_cache.delivery_system;
1125 state->m_Frequency = fe->dtv_property_cache.frequency;
1127 switch (delsys) {
1128 case SYS_DVBT:
1129 case SYS_DVBT2:
1130 switch (bw) {
1131 case 6000000:
1132 Standard = HF_DVBT_6MHZ;
1133 break;
1134 case 7000000:
1135 Standard = HF_DVBT_7MHZ;
1136 break;
1137 case 8000000:
1138 Standard = HF_DVBT_8MHZ;
1139 break;
1140 default:
1141 return -EINVAL;
1143 break;
1144 case SYS_DVBC_ANNEX_A:
1145 case SYS_DVBC_ANNEX_C:
1146 if (bw <= 6000000)
1147 Standard = HF_DVBC_6MHZ;
1148 else if (bw <= 7000000)
1149 Standard = HF_DVBC_7MHZ;
1150 else
1151 Standard = HF_DVBC_8MHZ;
1152 break;
1153 default:
1154 return -EINVAL;
1156 do {
1157 status = RFTrackingFiltersCorrection(state, state->m_Frequency);
1158 if (status < 0)
1159 break;
1160 status = ChannelConfiguration(state, state->m_Frequency,
1161 Standard);
1162 if (status < 0)
1163 break;
1165 msleep(state->m_SettlingTime); /* Allow AGC's to settle down */
1166 } while (0);
1167 return status;
1170 #if 0
1171 static int GetSignalStrength(s32 *pSignalStrength, u32 RFAgc, u32 IFAgc)
1173 if (IFAgc < 500) {
1174 /* Scale this from 0 to 50000 */
1175 *pSignalStrength = IFAgc * 100;
1176 } else {
1177 /* Scale range 500-1500 to 50000-80000 */
1178 *pSignalStrength = 50000 + (IFAgc - 500) * 30;
1181 return 0;
1183 #endif
1185 static int get_if_frequency(struct dvb_frontend *fe, u32 *frequency)
1187 struct tda_state *state = fe->tuner_priv;
1189 *frequency = state->IF;
1190 return 0;
1193 static int get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
1195 /* struct tda_state *state = fe->tuner_priv; */
1196 /* *bandwidth = priv->bandwidth; */
1197 return 0;
1201 static const struct dvb_tuner_ops tuner_ops = {
1202 .info = {
1203 .name = "NXP TDA18271C2D",
1204 .frequency_min_hz = 47125 * kHz,
1205 .frequency_max_hz = 865 * MHz,
1206 .frequency_step_hz = 62500
1208 .init = init,
1209 .sleep = sleep,
1210 .set_params = set_params,
1211 .release = release,
1212 .get_if_frequency = get_if_frequency,
1213 .get_bandwidth = get_bandwidth,
1216 struct dvb_frontend *tda18271c2dd_attach(struct dvb_frontend *fe,
1217 struct i2c_adapter *i2c, u8 adr)
1219 struct tda_state *state;
1221 state = kzalloc(sizeof(struct tda_state), GFP_KERNEL);
1222 if (!state)
1223 return NULL;
1225 fe->tuner_priv = state;
1226 state->adr = adr;
1227 state->i2c = i2c;
1228 memcpy(&fe->ops.tuner_ops, &tuner_ops, sizeof(struct dvb_tuner_ops));
1229 reset(state);
1230 InitCal(state);
1232 return fe;
1234 EXPORT_SYMBOL_GPL(tda18271c2dd_attach);
1236 MODULE_DESCRIPTION("TDA18271C2 driver");
1237 MODULE_AUTHOR("DD");
1238 MODULE_LICENSE("GPL");