root/drivers/media/dvb-frontends/tda18271c2dd.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. i2c_readn
  2. i2c_write
  3. WriteRegs
  4. WriteReg
  5. Read
  6. ReadExtented
  7. UpdateRegs
  8. UpdateReg
  9. reset
  10. SearchMap1
  11. SearchMap2
  12. SearchMap3
  13. SearchMap4
  14. ThermometerRead
  15. StandBy
  16. CalcMainPLL
  17. CalcCalPLL
  18. CalibrateRF
  19. RFTrackingFiltersInit
  20. PowerScan
  21. PowerScanInit
  22. CalcRFFilterCurve
  23. FixedContentsI2CUpdate
  24. InitCal
  25. RFTrackingFiltersCorrection
  26. ChannelConfiguration
  27. sleep
  28. init
  29. release
  30. set_params
  31. GetSignalStrength
  32. get_if_frequency
  33. get_bandwidth
  34. tda18271c2dd_attach

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * tda18271c2dd: Driver for the TDA18271C2 tuner
   4  *
   5  * Copyright (C) 2010 Digital Devices GmbH
   6  */
   7 
   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>
  15 
  16 #include <media/dvb_frontend.h>
  17 #include "tda18271c2dd.h"
  18 
  19 /* Max transfer size done by I2C transfer functions */
  20 #define MAX_XFER_SIZE  64
  21 
  22 struct SStandardParam {
  23         s32   m_IFFrequency;
  24         u32   m_BandWidth;
  25         u8    m_EP3_4_0;
  26         u8    m_EB22;
  27 };
  28 
  29 struct SMap {
  30         u32   m_Frequency;
  31         u8    m_Param;
  32 };
  33 
  34 struct SMapI {
  35         u32   m_Frequency;
  36         s32    m_Param;
  37 };
  38 
  39 struct SMap2 {
  40         u32   m_Frequency;
  41         u8    m_Param1;
  42         u8    m_Param2;
  43 };
  44 
  45 struct SRFBandMap {
  46         u32   m_RF_max;
  47         u32   m_RF1_Default;
  48         u32   m_RF2_Default;
  49         u32   m_RF3_Default;
  50 };
  51 
  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
  63 };
  64 
  65 struct tda_state {
  66         struct i2c_adapter *i2c;
  67         u8 adr;
  68 
  69         u32   m_Frequency;
  70         u32   IF;
  71 
  72         u8    m_IFLevelAnalog;
  73         u8    m_IFLevelDigital;
  74         u8    m_IFLevelDVBC;
  75         u8    m_IFLevelDVBT;
  76 
  77         u8    m_EP4;
  78         u8    m_EP3_Standby;
  79 
  80         bool  m_bMaster;
  81 
  82         s32   m_SettlingTime;
  83 
  84         u8    m_Regs[NUM_REGS];
  85 
  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];
  94 
  95         u8    m_TMValue_RFCal;    /* Calibration temperature */
  96 
  97         bool  m_bFMInput;         /* true to use Pin 8 for FM Radio */
  98 
  99 };
 100 
 101 static int PowerScan(struct tda_state *state,
 102                      u8 RFBand, u32 RF_in,
 103                      u32 *pRF_Out, bool *pbcal);
 104 
 105 static int i2c_readn(struct i2c_adapter *adapter, u8 adr, u8 *data, int len)
 106 {
 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;
 110 }
 111 
 112 static int i2c_write(struct i2c_adapter *adap, u8 adr, u8 *data, int len)
 113 {
 114         struct i2c_msg msg = {.addr = adr, .flags = 0,
 115                               .buf = data, .len = len};
 116 
 117         if (i2c_transfer(adap, &msg, 1) != 1) {
 118                 printk(KERN_ERR "tda18271c2dd: i2c write error at addr %i\n", adr);
 119                 return -1;
 120         }
 121         return 0;
 122 }
 123 
 124 static int WriteRegs(struct tda_state *state,
 125                      u8 SubAddr, u8 *Regs, u16 nRegs)
 126 {
 127         u8 data[MAX_XFER_SIZE];
 128 
 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;
 134         }
 135 
 136         data[0] = SubAddr;
 137         memcpy(data + 1, Regs, nRegs);
 138         return i2c_write(state->i2c, state->adr, data, nRegs + 1);
 139 }
 140 
 141 static int WriteReg(struct tda_state *state, u8 SubAddr, u8 Reg)
 142 {
 143         u8 msg[2] = {SubAddr, Reg};
 144 
 145         return i2c_write(state->i2c, state->adr, msg, 2);
 146 }
 147 
 148 static int Read(struct tda_state *state, u8 * Regs)
 149 {
 150         return i2c_readn(state->i2c, state->adr, Regs, 16);
 151 }
 152 
 153 static int ReadExtented(struct tda_state *state, u8 * Regs)
 154 {
 155         return i2c_readn(state->i2c, state->adr, Regs, NUM_REGS);
 156 }
 157 
 158 static int UpdateRegs(struct tda_state *state, u8 RegFrom, u8 RegTo)
 159 {
 160         return WriteRegs(state, RegFrom,
 161                          &state->m_Regs[RegFrom], RegTo-RegFrom+1);
 162 }
 163 static int UpdateReg(struct tda_state *state, u8 Reg)
 164 {
 165         return WriteReg(state, Reg, state->m_Regs[Reg]);
 166 }
 167 
 168 #include "tda18271c2dd_maps.h"
 169 
 170 static void reset(struct tda_state *state)
 171 {
 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;
 181 
 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;
 188 
 189         state->m_EP4 = 0x20;
 190         if (ulXTOut != 0)
 191                 state->m_EP4 |= 0x40;
 192 
 193         state->m_EP3_Standby = ((ulStandbyMode & 0x07) << 5) | 0x0F;
 194         state->m_bMaster = (ulSlave == 0);
 195 
 196         state->m_SettlingTime = ulSettlingTime;
 197 
 198         state->m_bFMInput = (ulFMInput == 2);
 199 }
 200 
 201 static bool SearchMap1(struct SMap Map[],
 202                        u32 Frequency, u8 *pParam)
 203 {
 204         int i = 0;
 205 
 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;
 212 }
 213 
 214 static bool SearchMap2(struct SMapI Map[],
 215                        u32 Frequency, s32 *pParam)
 216 {
 217         int i = 0;
 218 
 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;
 226 }
 227 
 228 static bool SearchMap3(struct SMap2 Map[], u32 Frequency,
 229                        u8 *pParam1, u8 *pParam2)
 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         *pParam1 = Map[i].m_Param1;
 239         *pParam2 = Map[i].m_Param2;
 240         return true;
 241 }
 242 
 243 static bool SearchMap4(struct SRFBandMap Map[],
 244                        u32 Frequency, u8 *pRFBand)
 245 {
 246         int i = 0;
 247 
 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;
 254 }
 255 
 256 static int ThermometerRead(struct tda_state *state, u8 *pTM_Value)
 257 {
 258         int status = 0;
 259 
 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;
 279                 }
 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);
 292 
 293         return status;
 294 }
 295 
 296 static int StandBy(struct tda_state *state)
 297 {
 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;
 319 }
 320 
 321 static int CalcMainPLL(struct tda_state *state, u32 freq)
 322 {
 323 
 324         u8  PostDiv;
 325         u8  Div;
 326         u64 OscFreq;
 327         u32 MainDiv;
 328 
 329         if (!SearchMap3(m_Main_PLL_Map, freq, &PostDiv, &Div))
 330                 return -EINVAL;
 331 
 332         OscFreq = (u64) freq * (u64) Div;
 333         OscFreq *= (u64) 16384;
 334         do_div(OscFreq, (u64)16000000);
 335         MainDiv = OscFreq;
 336 
 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);
 341 
 342         return UpdateRegs(state, MPD, MD3);
 343 }
 344 
 345 static int CalcCalPLL(struct tda_state *state, u32 freq)
 346 {
 347         u8 PostDiv;
 348         u8 Div;
 349         u64 OscFreq;
 350         u32 CalDiv;
 351 
 352         if (!SearchMap3(m_Cal_PLL_Map, freq, &PostDiv, &Div))
 353                 return -EINVAL;
 354 
 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;
 360 
 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);
 365 
 366         return UpdateRegs(state, CPD, CD3);
 367 }
 368 
 369 static int CalibrateRF(struct tda_state *state,
 370                        u8 RFBand, u32 freq, s32 *pCprog)
 371 {
 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;
 379 
 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;
 388 
 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 */
 393 
 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;
 398 
 399                 state->m_Regs[EP1] = (state->m_Regs[EP1] & ~0x07) | BP_Filter;
 400                 state->m_Regs[EP2] = (RFBand << 5) | GainTaper;
 401 
 402                 state->m_Regs[EB13] = (state->m_Regs[EB13] & ~0x7C) | (RFC_K << 4) | (RFC_M << 2);
 403 
 404                 status = UpdateRegs(state, EP1, EP3);
 405                 if (status < 0)
 406                         break;
 407                 status = UpdateReg(state, EB13);
 408                 if (status < 0)
 409                         break;
 410 
 411                 state->m_Regs[EB4] |= 0x20;    /* LO_ForceSrce = 1 */
 412                 status = UpdateReg(state, EB4);
 413                 if (status < 0)
 414                         break;
 415 
 416                 state->m_Regs[EB7] |= 0x20;    /* CAL_ForceSrce = 1 */
 417                 status = UpdateReg(state, EB7);
 418                 if (status < 0)
 419                         break;
 420 
 421                 state->m_Regs[EB14] = 0; /* RFC_Cprog = 0 */
 422                 status = UpdateReg(state, EB14);
 423                 if (status < 0)
 424                         break;
 425 
 426                 state->m_Regs[EB20] &= ~0x20;  /* ForceLock = 0; */
 427                 status = UpdateReg(state, EB20);
 428                 if (status < 0)
 429                         break;
 430 
 431                 state->m_Regs[EP4] |= 0x03;  /* CAL_Mode = 3 */
 432                 status = UpdateRegs(state, EP4, EP5);
 433                 if (status < 0)
 434                         break;
 435 
 436                 status = CalcCalPLL(state, freq);
 437                 if (status < 0)
 438                         break;
 439                 status = CalcMainPLL(state, freq + 1000000);
 440                 if (status < 0)
 441                         break;
 442 
 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;
 456 
 457                 state->m_Regs[EB4] &= ~0x20;    /* LO_ForceSrce = 0 */
 458                 status = UpdateReg(state, EB4);
 459                 if (status < 0)
 460                         break;
 461 
 462                 state->m_Regs[EB7] &= ~0x20;    /* CAL_ForceSrce = 0 */
 463                 status = UpdateReg(state, EB7);
 464                 if (status < 0)
 465                         break;
 466                 msleep(10);
 467 
 468                 state->m_Regs[EB20] |= 0x20;  /* ForceLock = 1; */
 469                 status = UpdateReg(state, EB20);
 470                 if (status < 0)
 471                         break;
 472                 msleep(60);
 473 
 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;
 486 
 487                 status = ReadExtented(state, Regs);
 488                 if (status < 0)
 489                         break;
 490 
 491                 *pCprog = Regs[EB14];
 492 
 493         } while (0);
 494         return status;
 495 }
 496 
 497 static int RFTrackingFiltersInit(struct tda_state *state,
 498                                  u8 RFBand)
 499 {
 500         int status = 0;
 501 
 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;
 506 
 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;
 513 
 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;
 518 
 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;
 527                 }
 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] = ???? */
 533 
 534                 if (RF2 == 0)
 535                         break;
 536 
 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;
 544                 }
 545                 SearchMap2(m_RF_Cal_Map, RF2, &Cprog_table2);
 546                 if (!bcal)
 547                         Cprog_cal2 = Cprog_table2;
 548 
 549                 state->m_RF_A1[RFBand] =
 550                         (Cprog_cal2 - Cprog_table2 - Cprog_cal1 + Cprog_table1) /
 551                         ((s32)(RF2) - (s32)(RF1));
 552 
 553                 if (RF3 == 0)
 554                         break;
 555 
 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;
 563                 }
 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;
 569 
 570         } while (0);
 571 
 572         state->m_RF1[RFBand] = RF1;
 573         state->m_RF2[RFBand] = RF2;
 574         state->m_RF3[RFBand] = RF3;
 575 
 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
 581 
 582         return status;
 583 }
 584 
 585 static int PowerScan(struct tda_state *state,
 586                      u8 RFBand, u32 RF_in, u32 *pRF_Out, bool *pbcal)
 587 {
 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;
 600 
 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))) {
 604 
 605                         printk(KERN_ERR "tda18271c2dd: %s Search map failed\n", __func__);
 606                         return -EINVAL;
 607                 }
 608 
 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;
 617 
 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) */
 635 
 636                 *pRF_Out = RF_in;
 637 
 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;
 653 
 654                         if (Count < CountLimit * 100000)
 655                                 continue;
 656                         if (sign < 0)
 657                                 break;
 658 
 659                         sign = -sign;
 660                         Count = 200000;
 661                         wait = true;
 662                 }
 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);
 671 
 672         return status;
 673 }
 674 
 675 static int PowerScanInit(struct tda_state *state)
 676 {
 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;
 695 }
 696 
 697 static int CalcRFFilterCurve(struct tda_state *state)
 698 {
 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);
 730 
 731         return status;
 732 }
 733 
 734 static int FixedContentsI2CUpdate(struct tda_state *state)
 735 {
 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,
 747         };
 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;
 754 
 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;
 772 
 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;
 788 
 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
 800 
 801                 msleep(5);
 802                 status = UpdateReg(state, EP1);
 803                 if (status < 0)
 804                         break;
 805                 msleep(5);
 806 
 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);
 819 
 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;
 830 
 831                 msleep(5);
 832                 status = UpdateReg(state, EP1);
 833                 if (status < 0)
 834                         break;
 835                 msleep(5);
 836 
 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);
 849 
 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);
 877 
 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;
 886 
 887         } while (0);
 888         return status;
 889 }
 890 
 891 static int InitCal(struct tda_state *state)
 892 {
 893         int status = 0;
 894 
 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;
 908 };
 909 
 910 static int RFTrackingFiltersCorrection(struct tda_state *state,
 911                                        u32 Frequency)
 912 {
 913         int status = 0;
 914         s32 Cprog_table;
 915         u8 RFBand;
 916         u8 dCoverdT;
 917 
 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))
 921 
 922                 return -EINVAL;
 923 
 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;
 935 
 936                 state->m_Regs[EP3] &= ~0xE0;  /* Power up */
 937                 status = UpdateReg(state, EP3);
 938                 if (status < 0)
 939                         break;
 940 
 941                 status = ThermometerRead(state, &TMValue_Current);
 942                 if (status < 0)
 943                         break;
 944 
 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;
 949 
 950                 TComp = (int)(dCoverdT) * ((int)(TMValue_Current) - (int)(state->m_TMValue_RFCal))/1000;
 951 
 952                 Capprox += TComp;
 953 
 954                 if (Capprox < 0)
 955                         Capprox = 0;
 956                 else if (Capprox > 255)
 957                         Capprox = 255;
 958 
 959 
 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;
 963 
 964                 status = UpdateReg(state, EB14);
 965                 if (status < 0)
 966                         break;
 967 
 968         } while (0);
 969         return status;
 970 }
 971 
 972 static int ChannelConfiguration(struct tda_state *state,
 973                                 u32 Frequency, int Standard)
 974 {
 975 
 976         s32 IntermediateFrequency = m_StandardTable[Standard].m_IFFrequency;
 977         int status = 0;
 978 
 979         u8 BP_Filter = 0;
 980         u8 RF_Band = 0;
 981         u8 GainTaper = 0;
 982         u8 IR_Meas = 0;
 983 
 984         state->IF = IntermediateFrequency;
 985         /* printk("tda18271c2dd: %s Freq = %d Standard = %d IF = %d\n", __func__, Frequency, Standard, IntermediateFrequency); */
 986         /* get values from tables */
 987 
 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))) {
 992 
 993                 printk(KERN_ERR "tda18271c2dd: %s SearchMap failed\n", __func__);
 994                 return -EINVAL;
 995         }
 996 
 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 */
1000 
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;
1012 
1013                 if ((Standard == HF_FM_Radio) && state->m_bFMInput)
1014                         state->m_Regs[EP4] |= 0x80;
1015 
1016                 state->m_Regs[MPD] &= ~0x80;
1017                 if (Standard > HF_AnalogMax)
1018                         state->m_Regs[MPD] |= 0x80; /* Add IF_notch for digital */
1019 
1020                 state->m_Regs[EB22] = m_StandardTable[Standard].m_EB22;
1021 
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 */
1027 
1028                 status = UpdateRegs(state, EB22, EB23);
1029                 if (status < 0)
1030                         break;
1031 
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;
1035 
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;
1043 
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;
1066 
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;
1075 
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;
1085                 }
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;
1092 
1093         } while (0);
1094         return status;
1095 }
1096 
1097 static int sleep(struct dvb_frontend *fe)
1098 {
1099         struct tda_state *state = fe->tuner_priv;
1100 
1101         StandBy(state);
1102         return 0;
1103 }
1104 
1105 static int init(struct dvb_frontend *fe)
1106 {
1107         return 0;
1108 }
1109 
1110 static void release(struct dvb_frontend *fe)
1111 {
1112         kfree(fe->tuner_priv);
1113         fe->tuner_priv = NULL;
1114 }
1115 
1116 
1117 static int set_params(struct dvb_frontend *fe)
1118 {
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;
1124 
1125         state->m_Frequency = fe->dtv_property_cache.frequency;
1126 
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;
1142                 }
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;
1155         }
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;
1164 
1165                 msleep(state->m_SettlingTime);  /* Allow AGC's to settle down */
1166         } while (0);
1167         return status;
1168 }
1169 
1170 #if 0
1171 static int GetSignalStrength(s32 *pSignalStrength, u32 RFAgc, u32 IFAgc)
1172 {
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;
1179         }
1180 
1181         return 0;
1182 }
1183 #endif
1184 
1185 static int get_if_frequency(struct dvb_frontend *fe, u32 *frequency)
1186 {
1187         struct tda_state *state = fe->tuner_priv;
1188 
1189         *frequency = state->IF;
1190         return 0;
1191 }
1192 
1193 static int get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
1194 {
1195         /* struct tda_state *state = fe->tuner_priv; */
1196         /* *bandwidth = priv->bandwidth; */
1197         return 0;
1198 }
1199 
1200 
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
1207         },
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,
1214 };
1215 
1216 struct dvb_frontend *tda18271c2dd_attach(struct dvb_frontend *fe,
1217                                          struct i2c_adapter *i2c, u8 adr)
1218 {
1219         struct tda_state *state;
1220 
1221         state = kzalloc(sizeof(struct tda_state), GFP_KERNEL);
1222         if (!state)
1223                 return NULL;
1224 
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);
1231 
1232         return fe;
1233 }
1234 EXPORT_SYMBOL_GPL(tda18271c2dd_attach);
1235 
1236 MODULE_DESCRIPTION("TDA18271C2 driver");
1237 MODULE_AUTHOR("DD");
1238 MODULE_LICENSE("GPL");

/* [<][>][^][v][top][bottom][index][help] */