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