2 * tda18271c2dd: Driver for the TDA18271C2 tuner
4 * Copyright (C) 2010 Digital Devices GmbH
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * version 2 only, as published by the Free Software Foundation.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22 * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
25 #include <linux/kernel.h>
26 #include <linux/module.h>
27 #include <linux/moduleparam.h>
28 #include <linux/init.h>
29 #include <linux/delay.h>
30 #include <linux/firmware.h>
31 #include <linux/i2c.h>
32 #include <linux/version.h>
33 #include <asm/div64.h>
35 #include "dvb_frontend.h"
37 struct SStandardParam
{
71 EP1
, EP2
, EP3
, EP4
, EP5
,
74 EB1
, EB2
, EB3
, EB4
, EB5
, EB6
, EB7
, EB8
, EB9
, EB10
,
75 EB11
, EB12
, EB13
, EB14
, EB15
, EB16
, EB17
, EB18
, EB19
, EB20
,
81 struct i2c_adapter
*i2c
;
101 /* Tracking filter settings for band 0..6 */
110 u8 m_TMValue_RFCal
; /* Calibration temperatur */
112 bool m_bFMInput
; /* true to use Pin 8 for FM Radio */
116 static int PowerScan(struct tda_state
*state
,
117 u8 RFBand
, u32 RF_in
,
118 u32
*pRF_Out
, bool *pbcal
);
120 static int i2c_readn(struct i2c_adapter
*adapter
, u8 adr
, u8
*data
, int len
)
122 struct i2c_msg msgs
[1] = {{.addr
= adr
, .flags
= I2C_M_RD
,
123 .buf
= data
, .len
= len
} };
124 return (i2c_transfer(adapter
, msgs
, 1) == 1) ? 0 : -1;
127 static int i2c_write(struct i2c_adapter
*adap
, u8 adr
, u8
*data
, int len
)
129 struct i2c_msg msg
= {.addr
= adr
, .flags
= 0,
130 .buf
= data
, .len
= len
};
132 if (i2c_transfer(adap
, &msg
, 1) != 1) {
133 printk(KERN_ERR
"tda18271c2dd: i2c write error at addr %i\n", adr
);
139 static int WriteRegs(struct tda_state
*state
,
140 u8 SubAddr
, u8
*Regs
, u16 nRegs
)
145 memcpy(data
+ 1, Regs
, nRegs
);
146 return i2c_write(state
->i2c
, state
->adr
, data
, nRegs
+1);
149 static int WriteReg(struct tda_state
*state
, u8 SubAddr
, u8 Reg
)
151 u8 msg
[2] = {SubAddr
, Reg
};
153 return i2c_write(state
->i2c
, state
->adr
, msg
, 2);
156 static int Read(struct tda_state
*state
, u8
* Regs
)
158 return i2c_readn(state
->i2c
, state
->adr
, Regs
, 16);
161 static int ReadExtented(struct tda_state
*state
, u8
* Regs
)
163 return i2c_readn(state
->i2c
, state
->adr
, Regs
, NUM_REGS
);
166 static int UpdateRegs(struct tda_state
*state
, u8 RegFrom
, u8 RegTo
)
168 return WriteRegs(state
, RegFrom
,
169 &state
->m_Regs
[RegFrom
], RegTo
-RegFrom
+1);
171 static int UpdateReg(struct tda_state
*state
, u8 Reg
)
173 return WriteReg(state
, Reg
, state
->m_Regs
[Reg
]);
176 #include "tda18271c2dd_maps.h"
178 static void reset(struct tda_state
*state
)
180 u32 ulIFLevelAnalog
= 0;
181 u32 ulIFLevelDigital
= 2;
182 u32 ulIFLevelDVBC
= 7;
183 u32 ulIFLevelDVBT
= 6;
185 u32 ulStandbyMode
= 0x06; /* Send in stdb, but leave osc on */
188 u32 ulSettlingTime
= 100;
190 state
->m_Frequency
= 0;
191 state
->m_SettlingTime
= 100;
192 state
->m_IFLevelAnalog
= (ulIFLevelAnalog
& 0x07) << 2;
193 state
->m_IFLevelDigital
= (ulIFLevelDigital
& 0x07) << 2;
194 state
->m_IFLevelDVBC
= (ulIFLevelDVBC
& 0x07) << 2;
195 state
->m_IFLevelDVBT
= (ulIFLevelDVBT
& 0x07) << 2;
199 state
->m_EP4
|= 0x40;
201 state
->m_EP3_Standby
= ((ulStandbyMode
& 0x07) << 5) | 0x0F;
202 state
->m_bMaster
= (ulSlave
== 0);
204 state
->m_SettlingTime
= ulSettlingTime
;
206 state
->m_bFMInput
= (ulFMInput
== 2);
209 static bool SearchMap1(struct SMap Map
[],
210 u32 Frequency
, u8
*pParam
)
214 while ((Map
[i
].m_Frequency
!= 0) && (Frequency
> Map
[i
].m_Frequency
))
216 if (Map
[i
].m_Frequency
== 0)
218 *pParam
= Map
[i
].m_Param
;
222 static bool SearchMap2(struct SMapI Map
[],
223 u32 Frequency
, s32
*pParam
)
227 while ((Map
[i
].m_Frequency
!= 0) &&
228 (Frequency
> Map
[i
].m_Frequency
))
230 if (Map
[i
].m_Frequency
== 0)
232 *pParam
= Map
[i
].m_Param
;
236 static bool SearchMap3(struct SMap2 Map
[], u32 Frequency
,
237 u8
*pParam1
, u8
*pParam2
)
241 while ((Map
[i
].m_Frequency
!= 0) &&
242 (Frequency
> Map
[i
].m_Frequency
))
244 if (Map
[i
].m_Frequency
== 0)
246 *pParam1
= Map
[i
].m_Param1
;
247 *pParam2
= Map
[i
].m_Param2
;
251 static bool SearchMap4(struct SRFBandMap Map
[],
252 u32 Frequency
, u8
*pRFBand
)
256 while (i
< 7 && (Frequency
> Map
[i
].m_RF_max
))
264 static int ThermometerRead(struct tda_state
*state
, u8
*pTM_Value
)
270 state
->m_Regs
[TM
] |= 0x10;
271 status
= UpdateReg(state
, TM
);
274 status
= Read(state
, Regs
);
277 if (((Regs
[TM
] & 0x0F) == 0 && (Regs
[TM
] & 0x20) == 0x20) ||
278 ((Regs
[TM
] & 0x0F) == 8 && (Regs
[TM
] & 0x20) == 0x00)) {
279 state
->m_Regs
[TM
] ^= 0x20;
280 status
= UpdateReg(state
, TM
);
284 status
= Read(state
, Regs
);
288 *pTM_Value
= (Regs
[TM
] & 0x20)
289 ? m_Thermometer_Map_2
[Regs
[TM
] & 0x0F]
290 : m_Thermometer_Map_1
[Regs
[TM
] & 0x0F] ;
291 state
->m_Regs
[TM
] &= ~0x10; /* Thermometer off */
292 status
= UpdateReg(state
, TM
);
295 state
->m_Regs
[EP4
] &= ~0x03; /* CAL_mode = 0 ????????? */
296 status
= UpdateReg(state
, EP4
);
304 static int StandBy(struct tda_state
*state
)
308 state
->m_Regs
[EB12
] &= ~0x20; /* PD_AGC1_Det = 0 */
309 status
= UpdateReg(state
, EB12
);
312 state
->m_Regs
[EB18
] &= ~0x83; /* AGC1_loop_off = 0, AGC1_Gain = 6 dB */
313 status
= UpdateReg(state
, EB18
);
316 state
->m_Regs
[EB21
] |= 0x03; /* AGC2_Gain = -6 dB */
317 state
->m_Regs
[EP3
] = state
->m_EP3_Standby
;
318 status
= UpdateReg(state
, EP3
);
321 state
->m_Regs
[EB23
] &= ~0x06; /* ForceLP_Fc2_En = 0, LP_Fc[2] = 0 */
322 status
= UpdateRegs(state
, EB21
, EB23
);
329 static int CalcMainPLL(struct tda_state
*state
, u32 freq
)
337 if (!SearchMap3(m_Main_PLL_Map
, freq
, &PostDiv
, &Div
))
340 OscFreq
= (u64
) freq
* (u64
) Div
;
341 OscFreq
*= (u64
) 16384;
342 do_div(OscFreq
, (u64
)16000000);
345 state
->m_Regs
[MPD
] = PostDiv
& 0x77;
346 state
->m_Regs
[MD1
] = ((MainDiv
>> 16) & 0x7F);
347 state
->m_Regs
[MD2
] = ((MainDiv
>> 8) & 0xFF);
348 state
->m_Regs
[MD3
] = (MainDiv
& 0xFF);
350 return UpdateRegs(state
, MPD
, MD3
);
353 static int CalcCalPLL(struct tda_state
*state
, u32 freq
)
360 if (!SearchMap3(m_Cal_PLL_Map
, freq
, &PostDiv
, &Div
))
363 OscFreq
= (u64
)freq
* (u64
)Div
;
364 /* CalDiv = u32( OscFreq * 16384 / 16000000 ); */
365 OscFreq
*= (u64
)16384;
366 do_div(OscFreq
, (u64
)16000000);
369 state
->m_Regs
[CPD
] = PostDiv
;
370 state
->m_Regs
[CD1
] = ((CalDiv
>> 16) & 0xFF);
371 state
->m_Regs
[CD2
] = ((CalDiv
>> 8) & 0xFF);
372 state
->m_Regs
[CD3
] = (CalDiv
& 0xFF);
374 return UpdateRegs(state
, CPD
, CD3
);
377 static int CalibrateRF(struct tda_state
*state
,
378 u8 RFBand
, u32 freq
, s32
*pCprog
)
388 state
->m_Regs
[EP4
] &= ~0x03; /* CAL_mode = 0 */
389 status
= UpdateReg(state
, EP4
);
392 state
->m_Regs
[EB18
] |= 0x03; /* AGC1_Gain = 3 */
393 status
= UpdateReg(state
, EB18
);
397 /* Switching off LT (as datasheet says) causes calibration on C1 to fail */
398 /* (Readout of Cprog is allways 255) */
399 if (state
->m_Regs
[ID
] != 0x83) /* C1: ID == 83, C2: ID == 84 */
400 state
->m_Regs
[EP3
] |= 0x40; /* SM_LT = 1 */
402 if (!(SearchMap1(m_BP_Filter_Map
, freq
, &BP_Filter
) &&
403 SearchMap1(m_GainTaper_Map
, freq
, &GainTaper
) &&
404 SearchMap3(m_KM_Map
, freq
, &RFC_K
, &RFC_M
)))
407 state
->m_Regs
[EP1
] = (state
->m_Regs
[EP1
] & ~0x07) | BP_Filter
;
408 state
->m_Regs
[EP2
] = (RFBand
<< 5) | GainTaper
;
410 state
->m_Regs
[EB13
] = (state
->m_Regs
[EB13
] & ~0x7C) | (RFC_K
<< 4) | (RFC_M
<< 2);
412 status
= UpdateRegs(state
, EP1
, EP3
);
415 status
= UpdateReg(state
, EB13
);
419 state
->m_Regs
[EB4
] |= 0x20; /* LO_ForceSrce = 1 */
420 status
= UpdateReg(state
, EB4
);
424 state
->m_Regs
[EB7
] |= 0x20; /* CAL_ForceSrce = 1 */
425 status
= UpdateReg(state
, EB7
);
429 state
->m_Regs
[EB14
] = 0; /* RFC_Cprog = 0 */
430 status
= UpdateReg(state
, EB14
);
434 state
->m_Regs
[EB20
] &= ~0x20; /* ForceLock = 0; */
435 status
= UpdateReg(state
, EB20
);
439 state
->m_Regs
[EP4
] |= 0x03; /* CAL_Mode = 3 */
440 status
= UpdateRegs(state
, EP4
, EP5
);
444 status
= CalcCalPLL(state
, freq
);
447 status
= CalcMainPLL(state
, freq
+ 1000000);
452 status
= UpdateReg(state
, EP2
);
455 status
= UpdateReg(state
, EP1
);
458 status
= UpdateReg(state
, EP2
);
461 status
= UpdateReg(state
, EP1
);
465 state
->m_Regs
[EB4
] &= ~0x20; /* LO_ForceSrce = 0 */
466 status
= UpdateReg(state
, EB4
);
470 state
->m_Regs
[EB7
] &= ~0x20; /* CAL_ForceSrce = 0 */
471 status
= UpdateReg(state
, EB7
);
476 state
->m_Regs
[EB20
] |= 0x20; /* ForceLock = 1; */
477 status
= UpdateReg(state
, EB20
);
482 state
->m_Regs
[EP4
] &= ~0x03; /* CAL_Mode = 0 */
483 state
->m_Regs
[EP3
] &= ~0x40; /* SM_LT = 0 */
484 state
->m_Regs
[EB18
] &= ~0x03; /* AGC1_Gain = 0 */
485 status
= UpdateReg(state
, EB18
);
488 status
= UpdateRegs(state
, EP3
, EP4
);
491 status
= UpdateReg(state
, EP1
);
495 status
= ReadExtented(state
, Regs
);
499 *pCprog
= Regs
[EB14
];
505 static int RFTrackingFiltersInit(struct tda_state
*state
,
510 u32 RF1
= m_RF_Band_Map
[RFBand
].m_RF1_Default
;
511 u32 RF2
= m_RF_Band_Map
[RFBand
].m_RF2_Default
;
512 u32 RF3
= m_RF_Band_Map
[RFBand
].m_RF3_Default
;
516 s32 Cprog_table1
= 0;
518 s32 Cprog_table2
= 0;
520 s32 Cprog_table3
= 0;
522 state
->m_RF_A1
[RFBand
] = 0;
523 state
->m_RF_B1
[RFBand
] = 0;
524 state
->m_RF_A2
[RFBand
] = 0;
525 state
->m_RF_B2
[RFBand
] = 0;
528 status
= PowerScan(state
, RFBand
, RF1
, &RF1
, &bcal
);
532 status
= CalibrateRF(state
, RFBand
, RF1
, &Cprog_cal1
);
536 SearchMap2(m_RF_Cal_Map
, RF1
, &Cprog_table1
);
538 Cprog_cal1
= Cprog_table1
;
539 state
->m_RF_B1
[RFBand
] = Cprog_cal1
- Cprog_table1
;
540 /* state->m_RF_A1[RF_Band] = ???? */
545 status
= PowerScan(state
, RFBand
, RF2
, &RF2
, &bcal
);
549 status
= CalibrateRF(state
, RFBand
, RF2
, &Cprog_cal2
);
553 SearchMap2(m_RF_Cal_Map
, RF2
, &Cprog_table2
);
555 Cprog_cal2
= Cprog_table2
;
557 state
->m_RF_A1
[RFBand
] =
558 (Cprog_cal2
- Cprog_table2
- Cprog_cal1
+ Cprog_table1
) /
559 ((s32
)(RF2
) - (s32
)(RF1
));
564 status
= PowerScan(state
, RFBand
, RF3
, &RF3
, &bcal
);
568 status
= CalibrateRF(state
, RFBand
, RF3
, &Cprog_cal3
);
572 SearchMap2(m_RF_Cal_Map
, RF3
, &Cprog_table3
);
574 Cprog_cal3
= Cprog_table3
;
575 state
->m_RF_A2
[RFBand
] = (Cprog_cal3
- Cprog_table3
- Cprog_cal2
+ Cprog_table2
) / ((s32
)(RF3
) - (s32
)(RF2
));
576 state
->m_RF_B2
[RFBand
] = Cprog_cal2
- Cprog_table2
;
580 state
->m_RF1
[RFBand
] = RF1
;
581 state
->m_RF2
[RFBand
] = RF2
;
582 state
->m_RF3
[RFBand
] = RF3
;
585 printk(KERN_ERR
"tda18271c2dd: %s %d RF1 = %d A1 = %d B1 = %d RF2 = %d A2 = %d B2 = %d RF3 = %d\n", __func__
,
586 RFBand
, RF1
, state
->m_RF_A1
[RFBand
], state
->m_RF_B1
[RFBand
], RF2
,
587 state
->m_RF_A2
[RFBand
], state
->m_RF_B2
[RFBand
], RF3
);
593 static int PowerScan(struct tda_state
*state
,
594 u8 RFBand
, u32 RF_in
, u32
*pRF_Out
, bool *pbcal
)
609 if (!(SearchMap2(m_RF_Cal_Map
, RF_in
, &RFC_Cprog
) &&
610 SearchMap1(m_GainTaper_Map
, RF_in
, &Gain_Taper
) &&
611 SearchMap3(m_CID_Target_Map
, RF_in
, &CID_Target
, &CountLimit
))) {
613 printk(KERN_ERR
"tda18271c2dd: %s Search map failed\n", __func__
);
617 state
->m_Regs
[EP2
] = (RFBand
<< 5) | Gain_Taper
;
618 state
->m_Regs
[EB14
] = (RFC_Cprog
);
619 status
= UpdateReg(state
, EP2
);
622 status
= UpdateReg(state
, EB14
);
626 freq_MainPLL
= RF_in
+ 1000000;
627 status
= CalcMainPLL(state
, freq_MainPLL
);
631 state
->m_Regs
[EP4
] = (state
->m_Regs
[EP4
] & ~0x03) | 1; /* CAL_mode = 1 */
632 status
= UpdateReg(state
, EP4
);
635 status
= UpdateReg(state
, EP2
); /* Launch power measurement */
638 status
= ReadExtented(state
, Regs
);
641 CID_Gain
= Regs
[EB10
] & 0x3F;
642 state
->m_Regs
[ID
] = Regs
[ID
]; /* Chip version, (needed for C1 workarround in CalibrateRF) */
646 while (CID_Gain
< CID_Target
) {
647 freq_MainPLL
= RF_in
+ sign
* Count
+ 1000000;
648 status
= CalcMainPLL(state
, freq_MainPLL
);
651 msleep(wait
? 5 : 1);
653 status
= UpdateReg(state
, EP2
); /* Launch power measurement */
656 status
= ReadExtented(state
, Regs
);
659 CID_Gain
= Regs
[EB10
] & 0x3F;
662 if (Count
< CountLimit
* 100000)
674 if (CID_Gain
>= CID_Target
) {
676 *pRF_Out
= freq_MainPLL
- 1000000;
684 static int PowerScanInit(struct tda_state
*state
)
688 state
->m_Regs
[EP3
] = (state
->m_Regs
[EP3
] & ~0x1F) | 0x12;
689 state
->m_Regs
[EP4
] = (state
->m_Regs
[EP4
] & ~0x1F); /* If level = 0, Cal mode = 0 */
690 status
= UpdateRegs(state
, EP3
, EP4
);
693 state
->m_Regs
[EB18
] = (state
->m_Regs
[EB18
] & ~0x03); /* AGC 1 Gain = 0 */
694 status
= UpdateReg(state
, EB18
);
697 state
->m_Regs
[EB21
] = (state
->m_Regs
[EB21
] & ~0x03); /* AGC 2 Gain = 0 (Datasheet = 3) */
698 state
->m_Regs
[EB23
] = (state
->m_Regs
[EB23
] | 0x06); /* ForceLP_Fc2_En = 1, LPFc[2] = 1 */
699 status
= UpdateRegs(state
, EB21
, EB23
);
706 static int CalcRFFilterCurve(struct tda_state
*state
)
710 msleep(200); /* Temperature stabilisation */
711 status
= PowerScanInit(state
);
714 status
= RFTrackingFiltersInit(state
, 0);
717 status
= RFTrackingFiltersInit(state
, 1);
720 status
= RFTrackingFiltersInit(state
, 2);
723 status
= RFTrackingFiltersInit(state
, 3);
726 status
= RFTrackingFiltersInit(state
, 4);
729 status
= RFTrackingFiltersInit(state
, 5);
732 status
= RFTrackingFiltersInit(state
, 6);
735 status
= ThermometerRead(state
, &state
->m_TMValue_RFCal
); /* also switches off Cal mode !!! */
743 static int FixedContentsI2CUpdate(struct tda_state
*state
)
745 static u8 InitRegs
[] = {
747 0xDF, 0x16, 0x60, 0x80,
748 0x80, 0x00, 0x00, 0x00,
749 0x00, 0x00, 0x00, 0x00,
750 0xFC, 0x01, 0x84, 0x41,
751 0x01, 0x84, 0x40, 0x07,
752 0x00, 0x00, 0x96, 0x3F,
753 0xC1, 0x00, 0x8F, 0x00,
754 0x00, 0x8C, 0x00, 0x20,
758 memcpy(&state
->m_Regs
[TM
], InitRegs
, EB23
- TM
+ 1);
760 status
= UpdateRegs(state
, TM
, EB23
);
764 /* AGC1 gain setup */
765 state
->m_Regs
[EB17
] = 0x00;
766 status
= UpdateReg(state
, EB17
);
769 state
->m_Regs
[EB17
] = 0x03;
770 status
= UpdateReg(state
, EB17
);
773 state
->m_Regs
[EB17
] = 0x43;
774 status
= UpdateReg(state
, EB17
);
777 state
->m_Regs
[EB17
] = 0x4C;
778 status
= UpdateReg(state
, EB17
);
782 /* IRC Cal Low band */
783 state
->m_Regs
[EP3
] = 0x1F;
784 state
->m_Regs
[EP4
] = 0x66;
785 state
->m_Regs
[EP5
] = 0x81;
786 state
->m_Regs
[CPD
] = 0xCC;
787 state
->m_Regs
[CD1
] = 0x6C;
788 state
->m_Regs
[CD2
] = 0x00;
789 state
->m_Regs
[CD3
] = 0x00;
790 state
->m_Regs
[MPD
] = 0xC5;
791 state
->m_Regs
[MD1
] = 0x77;
792 state
->m_Regs
[MD2
] = 0x08;
793 state
->m_Regs
[MD3
] = 0x00;
794 status
= UpdateRegs(state
, EP2
, MD3
); /* diff between sw and datasheet (ep3-md3) */
799 state
->m_Regs
[EB4
] = 0x61; /* missing in sw */
800 status
= UpdateReg(state
, EB4
);
804 state
->m_Regs
[EB4
] = 0x41;
805 status
= UpdateReg(state
, EB4
);
811 status
= UpdateReg(state
, EP1
);
816 state
->m_Regs
[EP5
] = 0x85;
817 state
->m_Regs
[CPD
] = 0xCB;
818 state
->m_Regs
[CD1
] = 0x66;
819 state
->m_Regs
[CD2
] = 0x70;
820 status
= UpdateRegs(state
, EP3
, CD3
);
824 status
= UpdateReg(state
, EP2
);
829 /* IRC Cal mid band */
830 state
->m_Regs
[EP5
] = 0x82;
831 state
->m_Regs
[CPD
] = 0xA8;
832 state
->m_Regs
[CD2
] = 0x00;
833 state
->m_Regs
[MPD
] = 0xA1; /* Datasheet = 0xA9 */
834 state
->m_Regs
[MD1
] = 0x73;
835 state
->m_Regs
[MD2
] = 0x1A;
836 status
= UpdateRegs(state
, EP3
, MD3
);
841 status
= UpdateReg(state
, EP1
);
846 state
->m_Regs
[EP5
] = 0x86;
847 state
->m_Regs
[CPD
] = 0xA8;
848 state
->m_Regs
[CD1
] = 0x66;
849 state
->m_Regs
[CD2
] = 0xA0;
850 status
= UpdateRegs(state
, EP3
, CD3
);
854 status
= UpdateReg(state
, EP2
);
859 /* IRC Cal high band */
860 state
->m_Regs
[EP5
] = 0x83;
861 state
->m_Regs
[CPD
] = 0x98;
862 state
->m_Regs
[CD1
] = 0x65;
863 state
->m_Regs
[CD2
] = 0x00;
864 state
->m_Regs
[MPD
] = 0x91; /* Datasheet = 0x91 */
865 state
->m_Regs
[MD1
] = 0x71;
866 state
->m_Regs
[MD2
] = 0xCD;
867 status
= UpdateRegs(state
, EP3
, MD3
);
871 status
= UpdateReg(state
, EP1
);
875 state
->m_Regs
[EP5
] = 0x87;
876 state
->m_Regs
[CD1
] = 0x65;
877 state
->m_Regs
[CD2
] = 0x50;
878 status
= UpdateRegs(state
, EP3
, CD3
);
882 status
= UpdateReg(state
, EP2
);
888 state
->m_Regs
[EP4
] = 0x64;
889 status
= UpdateReg(state
, EP4
);
892 status
= UpdateReg(state
, EP1
);
900 static int InitCal(struct tda_state
*state
)
905 status
= FixedContentsI2CUpdate(state
);
908 status
= CalcRFFilterCurve(state
);
911 status
= StandBy(state
);
914 /* m_bInitDone = true; */
919 static int RFTrackingFiltersCorrection(struct tda_state
*state
,
927 if (!SearchMap2(m_RF_Cal_Map
, Frequency
, &Cprog_table
) ||
928 !SearchMap4(m_RF_Band_Map
, Frequency
, &RFBand
) ||
929 !SearchMap1(m_RF_Cal_DC_Over_DT_Map
, Frequency
, &dCoverdT
))
935 u32 RF1
= state
->m_RF1
[RFBand
];
936 u32 RF2
= state
->m_RF1
[RFBand
];
937 u32 RF3
= state
->m_RF1
[RFBand
];
938 s32 RF_A1
= state
->m_RF_A1
[RFBand
];
939 s32 RF_B1
= state
->m_RF_B1
[RFBand
];
940 s32 RF_A2
= state
->m_RF_A2
[RFBand
];
941 s32 RF_B2
= state
->m_RF_B2
[RFBand
];
945 state
->m_Regs
[EP3
] &= ~0xE0; /* Power up */
946 status
= UpdateReg(state
, EP3
);
950 status
= ThermometerRead(state
, &TMValue_Current
);
954 if (RF3
== 0 || Frequency
< RF2
)
955 Capprox
= RF_A1
* ((s32
)(Frequency
) - (s32
)(RF1
)) + RF_B1
+ Cprog_table
;
957 Capprox
= RF_A2
* ((s32
)(Frequency
) - (s32
)(RF2
)) + RF_B2
+ Cprog_table
;
959 TComp
= (int)(dCoverdT
) * ((int)(TMValue_Current
) - (int)(state
->m_TMValue_RFCal
))/1000;
965 else if (Capprox
> 255)
969 /* TODO Temperature compensation. There is defenitely a scale factor */
970 /* missing in the datasheet, so leave it out for now. */
971 state
->m_Regs
[EB14
] = Capprox
;
973 status
= UpdateReg(state
, EB14
);
981 static int ChannelConfiguration(struct tda_state
*state
,
982 u32 Frequency
, int Standard
)
985 s32 IntermediateFrequency
= m_StandardTable
[Standard
].m_IFFrequency
;
993 state
->IF
= IntermediateFrequency
;
994 /* printk("tda18271c2dd: %s Freq = %d Standard = %d IF = %d\n", __func__, Frequency, Standard, IntermediateFrequency); */
995 /* get values from tables */
997 if (!(SearchMap1(m_BP_Filter_Map
, Frequency
, &BP_Filter
) &&
998 SearchMap1(m_GainTaper_Map
, Frequency
, &GainTaper
) &&
999 SearchMap1(m_IR_Meas_Map
, Frequency
, &IR_Meas
) &&
1000 SearchMap4(m_RF_Band_Map
, Frequency
, &RF_Band
))) {
1002 printk(KERN_ERR
"tda18271c2dd: %s SearchMap failed\n", __func__
);
1007 state
->m_Regs
[EP3
] = (state
->m_Regs
[EP3
] & ~0x1F) | m_StandardTable
[Standard
].m_EP3_4_0
;
1008 state
->m_Regs
[EP3
] &= ~0x04; /* switch RFAGC to high speed mode */
1010 /* m_EP4 default for XToutOn, CAL_Mode (0) */
1011 state
->m_Regs
[EP4
] = state
->m_EP4
| ((Standard
> HF_AnalogMax
) ? state
->m_IFLevelDigital
: state
->m_IFLevelAnalog
);
1012 /* state->m_Regs[EP4] = state->m_EP4 | state->m_IFLevelDigital; */
1013 if (Standard
<= HF_AnalogMax
)
1014 state
->m_Regs
[EP4
] = state
->m_EP4
| state
->m_IFLevelAnalog
;
1015 else if (Standard
<= HF_ATSC
)
1016 state
->m_Regs
[EP4
] = state
->m_EP4
| state
->m_IFLevelDVBT
;
1017 else if (Standard
<= HF_DVBC
)
1018 state
->m_Regs
[EP4
] = state
->m_EP4
| state
->m_IFLevelDVBC
;
1020 state
->m_Regs
[EP4
] = state
->m_EP4
| state
->m_IFLevelDigital
;
1022 if ((Standard
== HF_FM_Radio
) && state
->m_bFMInput
)
1023 state
->m_Regs
[EP4
] |= 80;
1025 state
->m_Regs
[MPD
] &= ~0x80;
1026 if (Standard
> HF_AnalogMax
)
1027 state
->m_Regs
[MPD
] |= 0x80; /* Add IF_notch for digital */
1029 state
->m_Regs
[EB22
] = m_StandardTable
[Standard
].m_EB22
;
1031 /* Note: This is missing from flowchart in TDA18271 specification ( 1.5 MHz cutoff for FM ) */
1032 if (Standard
== HF_FM_Radio
)
1033 state
->m_Regs
[EB23
] |= 0x06; /* ForceLP_Fc2_En = 1, LPFc[2] = 1 */
1035 state
->m_Regs
[EB23
] &= ~0x06; /* ForceLP_Fc2_En = 0, LPFc[2] = 0 */
1037 status
= UpdateRegs(state
, EB22
, EB23
);
1041 state
->m_Regs
[EP1
] = (state
->m_Regs
[EP1
] & ~0x07) | 0x40 | BP_Filter
; /* Dis_Power_level = 1, Filter */
1042 state
->m_Regs
[EP5
] = (state
->m_Regs
[EP5
] & ~0x07) | IR_Meas
;
1043 state
->m_Regs
[EP2
] = (RF_Band
<< 5) | GainTaper
;
1045 state
->m_Regs
[EB1
] = (state
->m_Regs
[EB1
] & ~0x07) |
1046 (state
->m_bMaster
? 0x04 : 0x00); /* CALVCO_FortLOn = MS */
1047 /* AGC1_always_master = 0 */
1048 /* AGC_firstn = 0 */
1049 status
= UpdateReg(state
, EB1
);
1053 if (state
->m_bMaster
) {
1054 status
= CalcMainPLL(state
, Frequency
+ IntermediateFrequency
);
1057 status
= UpdateRegs(state
, TM
, EP5
);
1060 state
->m_Regs
[EB4
] |= 0x20; /* LO_forceSrce = 1 */
1061 status
= UpdateReg(state
, EB4
);
1065 state
->m_Regs
[EB4
] &= ~0x20; /* LO_forceSrce = 0 */
1066 status
= UpdateReg(state
, EB4
);
1072 status
= CalcCalPLL(state
, Frequency
+ IntermediateFrequency
);
1076 SearchMap3(m_Cal_PLL_Map
, Frequency
+ IntermediateFrequency
, &PostDiv
, &Div
);
1077 state
->m_Regs
[MPD
] = (state
->m_Regs
[MPD
] & ~0x7F) | (PostDiv
& 0x77);
1078 status
= UpdateReg(state
, MPD
);
1081 status
= UpdateRegs(state
, TM
, EP5
);
1085 state
->m_Regs
[EB7
] |= 0x20; /* CAL_forceSrce = 1 */
1086 status
= UpdateReg(state
, EB7
);
1090 state
->m_Regs
[EB7
] &= ~0x20; /* CAL_forceSrce = 0 */
1091 status
= UpdateReg(state
, EB7
);
1096 if (Standard
!= HF_FM_Radio
)
1097 state
->m_Regs
[EP3
] |= 0x04; /* RFAGC to normal mode */
1098 status
= UpdateReg(state
, EP3
);
1106 static int sleep(struct dvb_frontend
*fe
)
1108 struct tda_state
*state
= fe
->tuner_priv
;
1114 static int init(struct dvb_frontend
*fe
)
1119 static int release(struct dvb_frontend
*fe
)
1121 kfree(fe
->tuner_priv
);
1122 fe
->tuner_priv
= NULL
;
1127 * As defined on EN 300 429 Annex A and on ITU-T J.83 annex A, the DVB-C
1128 * roll-off factor is 0.15.
1129 * According with the specs, the amount of the needed bandwith is given by:
1130 * Bw = Symbol_rate * (1 + 0.15)
1131 * As such, the maximum symbol rate supported by 6 MHz is
1132 * max_symbol_rate = 6 MHz / 1.15 = 5217391 Bauds
1133 *NOTE: For ITU-T J.83 Annex C, the roll-off factor is 0.13. So:
1134 * max_symbol_rate = 6 MHz / 1.13 = 5309735 Baud
1135 * That means that an adjustment is needed for Japan,
1136 * but, as currently DRX-K is hardcoded to Annex A, let's stick
1137 * with 0.15 roll-off factor.
1139 #define MAX_SYMBOL_RATE_6MHz 5217391
1141 static int set_params(struct dvb_frontend
*fe
,
1142 struct dvb_frontend_parameters
*params
)
1144 struct tda_state
*state
= fe
->tuner_priv
;
1148 state
->m_Frequency
= params
->frequency
;
1150 if (fe
->ops
.info
.type
== FE_OFDM
)
1151 switch (params
->u
.ofdm
.bandwidth
) {
1152 case BANDWIDTH_6_MHZ
:
1153 Standard
= HF_DVBT_6MHZ
;
1155 case BANDWIDTH_7_MHZ
:
1156 Standard
= HF_DVBT_7MHZ
;
1159 case BANDWIDTH_8_MHZ
:
1160 Standard
= HF_DVBT_8MHZ
;
1163 else if (fe
->ops
.info
.type
== FE_QAM
) {
1164 if (params
->u
.qam
.symbol_rate
<= MAX_SYMBOL_RATE_6MHz
)
1165 Standard
= HF_DVBC_6MHZ
;
1167 Standard
= HF_DVBC_8MHZ
;
1171 status
= RFTrackingFiltersCorrection(state
, params
->frequency
);
1174 status
= ChannelConfiguration(state
, params
->frequency
, Standard
);
1178 msleep(state
->m_SettlingTime
); /* Allow AGC's to settle down */
1184 static int GetSignalStrength(s32
*pSignalStrength
, u32 RFAgc
, u32 IFAgc
)
1187 /* Scale this from 0 to 50000 */
1188 *pSignalStrength
= IFAgc
* 100;
1190 /* Scale range 500-1500 to 50000-80000 */
1191 *pSignalStrength
= 50000 + (IFAgc
- 500) * 30;
1198 static int get_frequency(struct dvb_frontend
*fe
, u32
*frequency
)
1200 struct tda_state
*state
= fe
->tuner_priv
;
1202 *frequency
= state
->IF
;
1206 static int get_bandwidth(struct dvb_frontend
*fe
, u32
*bandwidth
)
1208 /* struct tda_state *state = fe->tuner_priv; */
1209 /* *bandwidth = priv->bandwidth; */
1214 static struct dvb_tuner_ops tuner_ops
= {
1216 .name
= "NXP TDA18271C2D",
1217 .frequency_min
= 47125000,
1218 .frequency_max
= 865000000,
1219 .frequency_step
= 62500
1223 .set_params
= set_params
,
1225 .get_frequency
= get_frequency
,
1226 .get_bandwidth
= get_bandwidth
,
1229 struct dvb_frontend
*tda18271c2dd_attach(struct dvb_frontend
*fe
,
1230 struct i2c_adapter
*i2c
, u8 adr
)
1232 struct tda_state
*state
;
1234 state
= kzalloc(sizeof(struct tda_state
), GFP_KERNEL
);
1238 fe
->tuner_priv
= state
;
1241 memcpy(&fe
->ops
.tuner_ops
, &tuner_ops
, sizeof(struct dvb_tuner_ops
));
1247 EXPORT_SYMBOL_GPL(tda18271c2dd_attach
);
1249 MODULE_DESCRIPTION("TDA18271C2 driver");
1250 MODULE_AUTHOR("DD");
1251 MODULE_LICENSE("GPL");