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