1/*
2 * Driver for DiBcom DiB3000MC/P-demodulator.
3 *
4 * Copyright (C) 2004-7 DiBcom (http://www.dibcom.fr/)
5 * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de)
6 *
7 * This code is partially based on the previous dib3000mc.c .
8 *
9 * This program is free software; you can redistribute it and/or
10 *	modify it under the terms of the GNU General Public License as
11 *	published by the Free Software Foundation, version 2.
12 */
13
14#include <linux/kernel.h>
15#include <linux/slab.h>
16#include <linux/i2c.h>
17
18#include "dvb_frontend.h"
19
20#include "dib3000mc.h"
21
22static int debug;
23module_param(debug, int, 0644);
24MODULE_PARM_DESC(debug, "turn on debugging (default: 0)");
25
26static int buggy_sfn_workaround;
27module_param(buggy_sfn_workaround, int, 0644);
28MODULE_PARM_DESC(buggy_sfn_workaround, "Enable work-around for buggy SFNs (default: 0)");
29
30#define dprintk(args...) do { if (debug) { printk(KERN_DEBUG "DiB3000MC/P:"); printk(args); printk("\n"); } } while (0)
31
32struct dib3000mc_state {
33	struct dvb_frontend demod;
34	struct dib3000mc_config *cfg;
35
36	u8 i2c_addr;
37	struct i2c_adapter *i2c_adap;
38
39	struct dibx000_i2c_master i2c_master;
40
41	u32 timf;
42
43	u32 current_bandwidth;
44
45	u16 dev_id;
46
47	u8 sfn_workaround_active :1;
48};
49
50static u16 dib3000mc_read_word(struct dib3000mc_state *state, u16 reg)
51{
52	u8 wb[2] = { (reg >> 8) | 0x80, reg & 0xff };
53	u8 rb[2];
54	struct i2c_msg msg[2] = {
55		{ .addr = state->i2c_addr >> 1, .flags = 0,        .buf = wb, .len = 2 },
56		{ .addr = state->i2c_addr >> 1, .flags = I2C_M_RD, .buf = rb, .len = 2 },
57	};
58
59	if (i2c_transfer(state->i2c_adap, msg, 2) != 2)
60		dprintk("i2c read error on %d\n",reg);
61
62	return (rb[0] << 8) | rb[1];
63}
64
65static int dib3000mc_write_word(struct dib3000mc_state *state, u16 reg, u16 val)
66{
67	u8 b[4] = {
68		(reg >> 8) & 0xff, reg & 0xff,
69		(val >> 8) & 0xff, val & 0xff,
70	};
71	struct i2c_msg msg = {
72		.addr = state->i2c_addr >> 1, .flags = 0, .buf = b, .len = 4
73	};
74	return i2c_transfer(state->i2c_adap, &msg, 1) != 1 ? -EREMOTEIO : 0;
75}
76
77static int dib3000mc_identify(struct dib3000mc_state *state)
78{
79	u16 value;
80	if ((value = dib3000mc_read_word(state, 1025)) != 0x01b3) {
81		dprintk("-E-  DiB3000MC/P: wrong Vendor ID (read=0x%x)\n",value);
82		return -EREMOTEIO;
83	}
84
85	value = dib3000mc_read_word(state, 1026);
86	if (value != 0x3001 && value != 0x3002) {
87		dprintk("-E-  DiB3000MC/P: wrong Device ID (%x)\n",value);
88		return -EREMOTEIO;
89	}
90	state->dev_id = value;
91
92	dprintk("-I-  found DiB3000MC/P: %x\n",state->dev_id);
93
94	return 0;
95}
96
97static int dib3000mc_set_timing(struct dib3000mc_state *state, s16 nfft, u32 bw, u8 update_offset)
98{
99	u32 timf;
100
101	if (state->timf == 0) {
102		timf = 1384402; // default value for 8MHz
103		if (update_offset)
104			msleep(200); // first time we do an update
105	} else
106		timf = state->timf;
107
108	timf *= (bw / 1000);
109
110	if (update_offset) {
111		s16 tim_offs = dib3000mc_read_word(state, 416);
112
113		if (tim_offs &  0x2000)
114			tim_offs -= 0x4000;
115
116		if (nfft == TRANSMISSION_MODE_2K)
117			tim_offs *= 4;
118
119		timf += tim_offs;
120		state->timf = timf / (bw / 1000);
121	}
122
123	dprintk("timf: %d\n", timf);
124
125	dib3000mc_write_word(state, 23, (u16) (timf >> 16));
126	dib3000mc_write_word(state, 24, (u16) (timf      ) & 0xffff);
127
128	return 0;
129}
130
131static int dib3000mc_setup_pwm_state(struct dib3000mc_state *state)
132{
133	u16 reg_51, reg_52 = state->cfg->agc->setup & 0xfefb;
134    if (state->cfg->pwm3_inversion) {
135		reg_51 =  (2 << 14) | (0 << 10) | (7 << 6) | (2 << 2) | (2 << 0);
136		reg_52 |= (1 << 2);
137	} else {
138		reg_51 = (2 << 14) | (4 << 10) | (7 << 6) | (2 << 2) | (2 << 0);
139		reg_52 |= (1 << 8);
140	}
141	dib3000mc_write_word(state, 51, reg_51);
142	dib3000mc_write_word(state, 52, reg_52);
143
144    if (state->cfg->use_pwm3)
145		dib3000mc_write_word(state, 245, (1 << 3) | (1 << 0));
146	else
147		dib3000mc_write_word(state, 245, 0);
148
149    dib3000mc_write_word(state, 1040, 0x3);
150	return 0;
151}
152
153static int dib3000mc_set_output_mode(struct dib3000mc_state *state, int mode)
154{
155	int    ret = 0;
156	u16 fifo_threshold = 1792;
157	u16 outreg = 0;
158	u16 outmode = 0;
159	u16 elecout = 1;
160	u16 smo_reg = dib3000mc_read_word(state, 206) & 0x0010; /* keep the pid_parse bit */
161
162	dprintk("-I-  Setting output mode for demod %p to %d\n",
163			&state->demod, mode);
164
165	switch (mode) {
166		case OUTMODE_HIGH_Z:  // disable
167			elecout = 0;
168			break;
169		case OUTMODE_MPEG2_PAR_GATED_CLK:   // STBs with parallel gated clock
170			outmode = 0;
171			break;
172		case OUTMODE_MPEG2_PAR_CONT_CLK:    // STBs with parallel continues clock
173			outmode = 1;
174			break;
175		case OUTMODE_MPEG2_SERIAL:          // STBs with serial input
176			outmode = 2;
177			break;
178		case OUTMODE_MPEG2_FIFO:            // e.g. USB feeding
179			elecout = 3;
180			/*ADDR @ 206 :
181			P_smo_error_discard  [1;6:6] = 0
182			P_smo_rs_discard     [1;5:5] = 0
183			P_smo_pid_parse      [1;4:4] = 0
184			P_smo_fifo_flush     [1;3:3] = 0
185			P_smo_mode           [2;2:1] = 11
186			P_smo_ovf_prot       [1;0:0] = 0
187			*/
188			smo_reg |= 3 << 1;
189			fifo_threshold = 512;
190			outmode = 5;
191			break;
192		case OUTMODE_DIVERSITY:
193			outmode = 4;
194			elecout = 1;
195			break;
196		default:
197			dprintk("Unhandled output_mode passed to be set for demod %p\n",&state->demod);
198			outmode = 0;
199			break;
200	}
201
202	if ((state->cfg->output_mpeg2_in_188_bytes))
203		smo_reg |= (1 << 5); // P_smo_rs_discard     [1;5:5] = 1
204
205	outreg = dib3000mc_read_word(state, 244) & 0x07FF;
206	outreg |= (outmode << 11);
207	ret |= dib3000mc_write_word(state,  244, outreg);
208	ret |= dib3000mc_write_word(state,  206, smo_reg);   /*smo_ mode*/
209	ret |= dib3000mc_write_word(state,  207, fifo_threshold); /* synchronous fread */
210	ret |= dib3000mc_write_word(state, 1040, elecout);         /* P_out_cfg */
211	return ret;
212}
213
214static int dib3000mc_set_bandwidth(struct dib3000mc_state *state, u32 bw)
215{
216	u16 bw_cfg[6] = { 0 };
217	u16 imp_bw_cfg[3] = { 0 };
218	u16 reg;
219
220/* settings here are for 27.7MHz */
221	switch (bw) {
222		case 8000:
223			bw_cfg[0] = 0x0019; bw_cfg[1] = 0x5c30; bw_cfg[2] = 0x0054; bw_cfg[3] = 0x88a0; bw_cfg[4] = 0x01a6; bw_cfg[5] = 0xab20;
224			imp_bw_cfg[0] = 0x04db; imp_bw_cfg[1] = 0x00db; imp_bw_cfg[2] = 0x00b7;
225			break;
226
227		case 7000:
228			bw_cfg[0] = 0x001c; bw_cfg[1] = 0xfba5; bw_cfg[2] = 0x0060; bw_cfg[3] = 0x9c25; bw_cfg[4] = 0x01e3; bw_cfg[5] = 0x0cb7;
229			imp_bw_cfg[0] = 0x04c0; imp_bw_cfg[1] = 0x00c0; imp_bw_cfg[2] = 0x00a0;
230			break;
231
232		case 6000:
233			bw_cfg[0] = 0x0021; bw_cfg[1] = 0xd040; bw_cfg[2] = 0x0070; bw_cfg[3] = 0xb62b; bw_cfg[4] = 0x0233; bw_cfg[5] = 0x8ed5;
234			imp_bw_cfg[0] = 0x04a5; imp_bw_cfg[1] = 0x00a5; imp_bw_cfg[2] = 0x0089;
235			break;
236
237		case 5000:
238			bw_cfg[0] = 0x0028; bw_cfg[1] = 0x9380; bw_cfg[2] = 0x0087; bw_cfg[3] = 0x4100; bw_cfg[4] = 0x02a4; bw_cfg[5] = 0x4500;
239			imp_bw_cfg[0] = 0x0489; imp_bw_cfg[1] = 0x0089; imp_bw_cfg[2] = 0x0072;
240			break;
241
242		default: return -EINVAL;
243	}
244
245	for (reg = 6; reg < 12; reg++)
246		dib3000mc_write_word(state, reg, bw_cfg[reg - 6]);
247	dib3000mc_write_word(state, 12, 0x0000);
248	dib3000mc_write_word(state, 13, 0x03e8);
249	dib3000mc_write_word(state, 14, 0x0000);
250	dib3000mc_write_word(state, 15, 0x03f2);
251	dib3000mc_write_word(state, 16, 0x0001);
252	dib3000mc_write_word(state, 17, 0xb0d0);
253	// P_sec_len
254	dib3000mc_write_word(state, 18, 0x0393);
255	dib3000mc_write_word(state, 19, 0x8700);
256
257	for (reg = 55; reg < 58; reg++)
258		dib3000mc_write_word(state, reg, imp_bw_cfg[reg - 55]);
259
260	// Timing configuration
261	dib3000mc_set_timing(state, TRANSMISSION_MODE_2K, bw, 0);
262
263	return 0;
264}
265
266static u16 impulse_noise_val[29] =
267
268{
269	0x38, 0x6d9, 0x3f28, 0x7a7, 0x3a74, 0x196, 0x32a, 0x48c, 0x3ffe, 0x7f3,
270	0x2d94, 0x76, 0x53d, 0x3ff8, 0x7e3, 0x3320, 0x76, 0x5b3, 0x3feb, 0x7d2,
271	0x365e, 0x76, 0x48c, 0x3ffe, 0x5b3, 0x3feb, 0x76, 0x0000, 0xd
272};
273
274static void dib3000mc_set_impulse_noise(struct dib3000mc_state *state, u8 mode, s16 nfft)
275{
276	u16 i;
277	for (i = 58; i < 87; i++)
278		dib3000mc_write_word(state, i, impulse_noise_val[i-58]);
279
280	if (nfft == TRANSMISSION_MODE_8K) {
281		dib3000mc_write_word(state, 58, 0x3b);
282		dib3000mc_write_word(state, 84, 0x00);
283		dib3000mc_write_word(state, 85, 0x8200);
284	}
285
286	dib3000mc_write_word(state, 34, 0x1294);
287	dib3000mc_write_word(state, 35, 0x1ff8);
288	if (mode == 1)
289		dib3000mc_write_word(state, 55, dib3000mc_read_word(state, 55) | (1 << 10));
290}
291
292static int dib3000mc_init(struct dvb_frontend *demod)
293{
294	struct dib3000mc_state *state = demod->demodulator_priv;
295	struct dibx000_agc_config *agc = state->cfg->agc;
296
297	// Restart Configuration
298	dib3000mc_write_word(state, 1027, 0x8000);
299	dib3000mc_write_word(state, 1027, 0x0000);
300
301	// power up the demod + mobility configuration
302	dib3000mc_write_word(state, 140, 0x0000);
303	dib3000mc_write_word(state, 1031, 0);
304
305	if (state->cfg->mobile_mode) {
306		dib3000mc_write_word(state, 139,  0x0000);
307		dib3000mc_write_word(state, 141,  0x0000);
308		dib3000mc_write_word(state, 175,  0x0002);
309		dib3000mc_write_word(state, 1032, 0x0000);
310	} else {
311		dib3000mc_write_word(state, 139,  0x0001);
312		dib3000mc_write_word(state, 141,  0x0000);
313		dib3000mc_write_word(state, 175,  0x0000);
314		dib3000mc_write_word(state, 1032, 0x012C);
315	}
316	dib3000mc_write_word(state, 1033, 0x0000);
317
318	// P_clk_cfg
319	dib3000mc_write_word(state, 1037, 0x3130);
320
321	// other configurations
322
323	// P_ctrl_sfreq
324	dib3000mc_write_word(state, 33, (5 << 0));
325	dib3000mc_write_word(state, 88, (1 << 10) | (0x10 << 0));
326
327	// Phase noise control
328	// P_fft_phacor_inh, P_fft_phacor_cpe, P_fft_powrange
329	dib3000mc_write_word(state, 99, (1 << 9) | (0x20 << 0));
330
331	if (state->cfg->phase_noise_mode == 0)
332		dib3000mc_write_word(state, 111, 0x00);
333	else
334		dib3000mc_write_word(state, 111, 0x02);
335
336	// P_agc_global
337	dib3000mc_write_word(state, 50, 0x8000);
338
339	// agc setup misc
340	dib3000mc_setup_pwm_state(state);
341
342	// P_agc_counter_lock
343	dib3000mc_write_word(state, 53, 0x87);
344	// P_agc_counter_unlock
345	dib3000mc_write_word(state, 54, 0x87);
346
347	/* agc */
348	dib3000mc_write_word(state, 36, state->cfg->max_time);
349	dib3000mc_write_word(state, 37, (state->cfg->agc_command1 << 13) | (state->cfg->agc_command2 << 12) | (0x1d << 0));
350	dib3000mc_write_word(state, 38, state->cfg->pwm3_value);
351	dib3000mc_write_word(state, 39, state->cfg->ln_adc_level);
352
353	// set_agc_loop_Bw
354	dib3000mc_write_word(state, 40, 0x0179);
355	dib3000mc_write_word(state, 41, 0x03f0);
356
357	dib3000mc_write_word(state, 42, agc->agc1_max);
358	dib3000mc_write_word(state, 43, agc->agc1_min);
359	dib3000mc_write_word(state, 44, agc->agc2_max);
360	dib3000mc_write_word(state, 45, agc->agc2_min);
361	dib3000mc_write_word(state, 46, (agc->agc1_pt1 << 8) | agc->agc1_pt2);
362	dib3000mc_write_word(state, 47, (agc->agc1_slope1 << 8) | agc->agc1_slope2);
363	dib3000mc_write_word(state, 48, (agc->agc2_pt1 << 8) | agc->agc2_pt2);
364	dib3000mc_write_word(state, 49, (agc->agc2_slope1 << 8) | agc->agc2_slope2);
365
366// Begin: TimeOut registers
367	// P_pha3_thres
368	dib3000mc_write_word(state, 110, 3277);
369	// P_timf_alpha = 6, P_corm_alpha = 6, P_corm_thres = 0x80
370	dib3000mc_write_word(state,  26, 0x6680);
371	// lock_mask0
372	dib3000mc_write_word(state, 1, 4);
373	// lock_mask1
374	dib3000mc_write_word(state, 2, 4);
375	// lock_mask2
376	dib3000mc_write_word(state, 3, 0x1000);
377	// P_search_maxtrial=1
378	dib3000mc_write_word(state, 5, 1);
379
380	dib3000mc_set_bandwidth(state, 8000);
381
382	// div_lock_mask
383	dib3000mc_write_word(state,  4, 0x814);
384
385	dib3000mc_write_word(state, 21, (1 << 9) | 0x164);
386	dib3000mc_write_word(state, 22, 0x463d);
387
388	// Spurious rm cfg
389	// P_cspu_regul, P_cspu_win_cut
390	dib3000mc_write_word(state, 120, 0x200f);
391	// P_adp_selec_monit
392	dib3000mc_write_word(state, 134, 0);
393
394	// Fec cfg
395	dib3000mc_write_word(state, 195, 0x10);
396
397	// diversity register: P_dvsy_sync_wait..
398	dib3000mc_write_word(state, 180, 0x2FF0);
399
400	// Impulse noise configuration
401	dib3000mc_set_impulse_noise(state, 0, TRANSMISSION_MODE_8K);
402
403	// output mode set-up
404	dib3000mc_set_output_mode(state, OUTMODE_HIGH_Z);
405
406	/* close the i2c-gate */
407	dib3000mc_write_word(state, 769, (1 << 7) );
408
409	return 0;
410}
411
412static int dib3000mc_sleep(struct dvb_frontend *demod)
413{
414	struct dib3000mc_state *state = demod->demodulator_priv;
415
416	dib3000mc_write_word(state, 1031, 0xFFFF);
417	dib3000mc_write_word(state, 1032, 0xFFFF);
418	dib3000mc_write_word(state, 1033, 0xFFF0);
419
420    return 0;
421}
422
423static void dib3000mc_set_adp_cfg(struct dib3000mc_state *state, s16 qam)
424{
425	u16 cfg[4] = { 0 },reg;
426	switch (qam) {
427		case QPSK:
428			cfg[0] = 0x099a; cfg[1] = 0x7fae; cfg[2] = 0x0333; cfg[3] = 0x7ff0;
429			break;
430		case QAM_16:
431			cfg[0] = 0x023d; cfg[1] = 0x7fdf; cfg[2] = 0x00a4; cfg[3] = 0x7ff0;
432			break;
433		case QAM_64:
434			cfg[0] = 0x0148; cfg[1] = 0x7ff0; cfg[2] = 0x00a4; cfg[3] = 0x7ff8;
435			break;
436	}
437	for (reg = 129; reg < 133; reg++)
438		dib3000mc_write_word(state, reg, cfg[reg - 129]);
439}
440
441static void dib3000mc_set_channel_cfg(struct dib3000mc_state *state,
442				      struct dtv_frontend_properties *ch, u16 seq)
443{
444	u16 value;
445	u32 bw = BANDWIDTH_TO_KHZ(ch->bandwidth_hz);
446
447	dib3000mc_set_bandwidth(state, bw);
448	dib3000mc_set_timing(state, ch->transmission_mode, bw, 0);
449
450//	if (boost)
451//		dib3000mc_write_word(state, 100, (11 << 6) + 6);
452//	else
453		dib3000mc_write_word(state, 100, (16 << 6) + 9);
454
455	dib3000mc_write_word(state, 1027, 0x0800);
456	dib3000mc_write_word(state, 1027, 0x0000);
457
458	//Default cfg isi offset adp
459	dib3000mc_write_word(state, 26,  0x6680);
460	dib3000mc_write_word(state, 29,  0x1273);
461	dib3000mc_write_word(state, 33,       5);
462	dib3000mc_set_adp_cfg(state, QAM_16);
463	dib3000mc_write_word(state, 133,  15564);
464
465	dib3000mc_write_word(state, 12 , 0x0);
466	dib3000mc_write_word(state, 13 , 0x3e8);
467	dib3000mc_write_word(state, 14 , 0x0);
468	dib3000mc_write_word(state, 15 , 0x3f2);
469
470	dib3000mc_write_word(state, 93,0);
471	dib3000mc_write_word(state, 94,0);
472	dib3000mc_write_word(state, 95,0);
473	dib3000mc_write_word(state, 96,0);
474	dib3000mc_write_word(state, 97,0);
475	dib3000mc_write_word(state, 98,0);
476
477	dib3000mc_set_impulse_noise(state, 0, ch->transmission_mode);
478
479	value = 0;
480	switch (ch->transmission_mode) {
481		case TRANSMISSION_MODE_2K: value |= (0 << 7); break;
482		default:
483		case TRANSMISSION_MODE_8K: value |= (1 << 7); break;
484	}
485	switch (ch->guard_interval) {
486		case GUARD_INTERVAL_1_32: value |= (0 << 5); break;
487		case GUARD_INTERVAL_1_16: value |= (1 << 5); break;
488		case GUARD_INTERVAL_1_4:  value |= (3 << 5); break;
489		default:
490		case GUARD_INTERVAL_1_8:  value |= (2 << 5); break;
491	}
492	switch (ch->modulation) {
493		case QPSK:  value |= (0 << 3); break;
494		case QAM_16: value |= (1 << 3); break;
495		default:
496		case QAM_64: value |= (2 << 3); break;
497	}
498	switch (HIERARCHY_1) {
499		case HIERARCHY_2: value |= 2; break;
500		case HIERARCHY_4: value |= 4; break;
501		default:
502		case HIERARCHY_1: value |= 1; break;
503	}
504	dib3000mc_write_word(state, 0, value);
505	dib3000mc_write_word(state, 5, (1 << 8) | ((seq & 0xf) << 4));
506
507	value = 0;
508	if (ch->hierarchy == 1)
509		value |= (1 << 4);
510	if (1 == 1)
511		value |= 1;
512	switch ((ch->hierarchy == 0 || 1 == 1) ? ch->code_rate_HP : ch->code_rate_LP) {
513		case FEC_2_3: value |= (2 << 1); break;
514		case FEC_3_4: value |= (3 << 1); break;
515		case FEC_5_6: value |= (5 << 1); break;
516		case FEC_7_8: value |= (7 << 1); break;
517		default:
518		case FEC_1_2: value |= (1 << 1); break;
519	}
520	dib3000mc_write_word(state, 181, value);
521
522	// diversity synchro delay add 50% SFN margin
523	switch (ch->transmission_mode) {
524		case TRANSMISSION_MODE_8K: value = 256; break;
525		case TRANSMISSION_MODE_2K:
526		default: value = 64; break;
527	}
528	switch (ch->guard_interval) {
529		case GUARD_INTERVAL_1_16: value *= 2; break;
530		case GUARD_INTERVAL_1_8:  value *= 4; break;
531		case GUARD_INTERVAL_1_4:  value *= 8; break;
532		default:
533		case GUARD_INTERVAL_1_32: value *= 1; break;
534	}
535	value <<= 4;
536	value |= dib3000mc_read_word(state, 180) & 0x000f;
537	dib3000mc_write_word(state, 180, value);
538
539	// restart demod
540	value = dib3000mc_read_word(state, 0);
541	dib3000mc_write_word(state, 0, value | (1 << 9));
542	dib3000mc_write_word(state, 0, value);
543
544	msleep(30);
545
546	dib3000mc_set_impulse_noise(state, state->cfg->impulse_noise_mode, ch->transmission_mode);
547}
548
549static int dib3000mc_autosearch_start(struct dvb_frontend *demod)
550{
551	struct dtv_frontend_properties *chan = &demod->dtv_property_cache;
552	struct dib3000mc_state *state = demod->demodulator_priv;
553	u16 reg;
554//	u32 val;
555	struct dtv_frontend_properties schan;
556
557	schan = *chan;
558
559	/* TODO what is that ? */
560
561	/* a channel for autosearch */
562	schan.transmission_mode = TRANSMISSION_MODE_8K;
563	schan.guard_interval = GUARD_INTERVAL_1_32;
564	schan.modulation = QAM_64;
565	schan.code_rate_HP = FEC_2_3;
566	schan.code_rate_LP = FEC_2_3;
567	schan.hierarchy = 0;
568
569	dib3000mc_set_channel_cfg(state, &schan, 11);
570
571	reg = dib3000mc_read_word(state, 0);
572	dib3000mc_write_word(state, 0, reg | (1 << 8));
573	dib3000mc_read_word(state, 511);
574	dib3000mc_write_word(state, 0, reg);
575
576	return 0;
577}
578
579static int dib3000mc_autosearch_is_irq(struct dvb_frontend *demod)
580{
581	struct dib3000mc_state *state = demod->demodulator_priv;
582	u16 irq_pending = dib3000mc_read_word(state, 511);
583
584	if (irq_pending & 0x1) // failed
585		return 1;
586
587	if (irq_pending & 0x2) // succeeded
588		return 2;
589
590	return 0; // still pending
591}
592
593static int dib3000mc_tune(struct dvb_frontend *demod)
594{
595	struct dtv_frontend_properties *ch = &demod->dtv_property_cache;
596	struct dib3000mc_state *state = demod->demodulator_priv;
597
598	// ** configure demod **
599	dib3000mc_set_channel_cfg(state, ch, 0);
600
601	// activates isi
602	if (state->sfn_workaround_active) {
603		dprintk("SFN workaround is active\n");
604		dib3000mc_write_word(state, 29, 0x1273);
605		dib3000mc_write_word(state, 108, 0x4000); // P_pha3_force_pha_shift
606	} else {
607		dib3000mc_write_word(state, 29, 0x1073);
608		dib3000mc_write_word(state, 108, 0x0000); // P_pha3_force_pha_shift
609	}
610
611	dib3000mc_set_adp_cfg(state, (u8)ch->modulation);
612	if (ch->transmission_mode == TRANSMISSION_MODE_8K) {
613		dib3000mc_write_word(state, 26, 38528);
614		dib3000mc_write_word(state, 33, 8);
615	} else {
616		dib3000mc_write_word(state, 26, 30336);
617		dib3000mc_write_word(state, 33, 6);
618	}
619
620	if (dib3000mc_read_word(state, 509) & 0x80)
621		dib3000mc_set_timing(state, ch->transmission_mode,
622				     BANDWIDTH_TO_KHZ(ch->bandwidth_hz), 1);
623
624	return 0;
625}
626
627struct i2c_adapter * dib3000mc_get_tuner_i2c_master(struct dvb_frontend *demod, int gating)
628{
629	struct dib3000mc_state *st = demod->demodulator_priv;
630	return dibx000_get_i2c_adapter(&st->i2c_master, DIBX000_I2C_INTERFACE_TUNER, gating);
631}
632
633EXPORT_SYMBOL(dib3000mc_get_tuner_i2c_master);
634
635static int dib3000mc_get_frontend(struct dvb_frontend* fe)
636{
637	struct dtv_frontend_properties *fep = &fe->dtv_property_cache;
638	struct dib3000mc_state *state = fe->demodulator_priv;
639	u16 tps = dib3000mc_read_word(state,458);
640
641	fep->inversion = INVERSION_AUTO;
642
643	fep->bandwidth_hz = state->current_bandwidth;
644
645	switch ((tps >> 8) & 0x1) {
646		case 0: fep->transmission_mode = TRANSMISSION_MODE_2K; break;
647		case 1: fep->transmission_mode = TRANSMISSION_MODE_8K; break;
648	}
649
650	switch (tps & 0x3) {
651		case 0: fep->guard_interval = GUARD_INTERVAL_1_32; break;
652		case 1: fep->guard_interval = GUARD_INTERVAL_1_16; break;
653		case 2: fep->guard_interval = GUARD_INTERVAL_1_8; break;
654		case 3: fep->guard_interval = GUARD_INTERVAL_1_4; break;
655	}
656
657	switch ((tps >> 13) & 0x3) {
658		case 0: fep->modulation = QPSK; break;
659		case 1: fep->modulation = QAM_16; break;
660		case 2:
661		default: fep->modulation = QAM_64; break;
662	}
663
664	/* as long as the frontend_param structure is fixed for hierarchical transmission I refuse to use it */
665	/* (tps >> 12) & 0x1 == hrch is used, (tps >> 9) & 0x7 == alpha */
666
667	fep->hierarchy = HIERARCHY_NONE;
668	switch ((tps >> 5) & 0x7) {
669		case 1: fep->code_rate_HP = FEC_1_2; break;
670		case 2: fep->code_rate_HP = FEC_2_3; break;
671		case 3: fep->code_rate_HP = FEC_3_4; break;
672		case 5: fep->code_rate_HP = FEC_5_6; break;
673		case 7:
674		default: fep->code_rate_HP = FEC_7_8; break;
675
676	}
677
678	switch ((tps >> 2) & 0x7) {
679		case 1: fep->code_rate_LP = FEC_1_2; break;
680		case 2: fep->code_rate_LP = FEC_2_3; break;
681		case 3: fep->code_rate_LP = FEC_3_4; break;
682		case 5: fep->code_rate_LP = FEC_5_6; break;
683		case 7:
684		default: fep->code_rate_LP = FEC_7_8; break;
685	}
686
687	return 0;
688}
689
690static int dib3000mc_set_frontend(struct dvb_frontend *fe)
691{
692	struct dtv_frontend_properties *fep = &fe->dtv_property_cache;
693	struct dib3000mc_state *state = fe->demodulator_priv;
694	int ret;
695
696	dib3000mc_set_output_mode(state, OUTMODE_HIGH_Z);
697
698	state->current_bandwidth = fep->bandwidth_hz;
699	dib3000mc_set_bandwidth(state, BANDWIDTH_TO_KHZ(fep->bandwidth_hz));
700
701	/* maybe the parameter has been changed */
702	state->sfn_workaround_active = buggy_sfn_workaround;
703
704	if (fe->ops.tuner_ops.set_params) {
705		fe->ops.tuner_ops.set_params(fe);
706		msleep(100);
707	}
708
709	if (fep->transmission_mode  == TRANSMISSION_MODE_AUTO ||
710	    fep->guard_interval == GUARD_INTERVAL_AUTO ||
711	    fep->modulation     == QAM_AUTO ||
712	    fep->code_rate_HP   == FEC_AUTO) {
713		int i = 1000, found;
714
715		dib3000mc_autosearch_start(fe);
716		do {
717			msleep(1);
718			found = dib3000mc_autosearch_is_irq(fe);
719		} while (found == 0 && i--);
720
721		dprintk("autosearch returns: %d\n",found);
722		if (found == 0 || found == 1)
723			return 0; // no channel found
724
725		dib3000mc_get_frontend(fe);
726	}
727
728	ret = dib3000mc_tune(fe);
729
730	/* make this a config parameter */
731	dib3000mc_set_output_mode(state, OUTMODE_MPEG2_FIFO);
732	return ret;
733}
734
735static int dib3000mc_read_status(struct dvb_frontend *fe, fe_status_t *stat)
736{
737	struct dib3000mc_state *state = fe->demodulator_priv;
738	u16 lock = dib3000mc_read_word(state, 509);
739
740	*stat = 0;
741
742	if (lock & 0x8000)
743		*stat |= FE_HAS_SIGNAL;
744	if (lock & 0x3000)
745		*stat |= FE_HAS_CARRIER;
746	if (lock & 0x0100)
747		*stat |= FE_HAS_VITERBI;
748	if (lock & 0x0010)
749		*stat |= FE_HAS_SYNC;
750	if (lock & 0x0008)
751		*stat |= FE_HAS_LOCK;
752
753	return 0;
754}
755
756static int dib3000mc_read_ber(struct dvb_frontend *fe, u32 *ber)
757{
758	struct dib3000mc_state *state = fe->demodulator_priv;
759	*ber = (dib3000mc_read_word(state, 500) << 16) | dib3000mc_read_word(state, 501);
760	return 0;
761}
762
763static int dib3000mc_read_unc_blocks(struct dvb_frontend *fe, u32 *unc)
764{
765	struct dib3000mc_state *state = fe->demodulator_priv;
766	*unc = dib3000mc_read_word(state, 508);
767	return 0;
768}
769
770static int dib3000mc_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
771{
772	struct dib3000mc_state *state = fe->demodulator_priv;
773	u16 val = dib3000mc_read_word(state, 392);
774	*strength = 65535 - val;
775	return 0;
776}
777
778static int dib3000mc_read_snr(struct dvb_frontend* fe, u16 *snr)
779{
780	*snr = 0x0000;
781	return 0;
782}
783
784static int dib3000mc_fe_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings *tune)
785{
786	tune->min_delay_ms = 1000;
787	return 0;
788}
789
790static void dib3000mc_release(struct dvb_frontend *fe)
791{
792	struct dib3000mc_state *state = fe->demodulator_priv;
793	dibx000_exit_i2c_master(&state->i2c_master);
794	kfree(state);
795}
796
797int dib3000mc_pid_control(struct dvb_frontend *fe, int index, int pid,int onoff)
798{
799	struct dib3000mc_state *state = fe->demodulator_priv;
800	dib3000mc_write_word(state, 212 + index,  onoff ? (1 << 13) | pid : 0);
801	return 0;
802}
803EXPORT_SYMBOL(dib3000mc_pid_control);
804
805int dib3000mc_pid_parse(struct dvb_frontend *fe, int onoff)
806{
807	struct dib3000mc_state *state = fe->demodulator_priv;
808	u16 tmp = dib3000mc_read_word(state, 206) & ~(1 << 4);
809	tmp |= (onoff << 4);
810	return dib3000mc_write_word(state, 206, tmp);
811}
812EXPORT_SYMBOL(dib3000mc_pid_parse);
813
814void dib3000mc_set_config(struct dvb_frontend *fe, struct dib3000mc_config *cfg)
815{
816	struct dib3000mc_state *state = fe->demodulator_priv;
817	state->cfg = cfg;
818}
819EXPORT_SYMBOL(dib3000mc_set_config);
820
821int dib3000mc_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, struct dib3000mc_config cfg[])
822{
823	struct dib3000mc_state *dmcst;
824	int k;
825	u8 new_addr;
826
827	static u8 DIB3000MC_I2C_ADDRESS[] = {20,22,24,26};
828
829	dmcst = kzalloc(sizeof(struct dib3000mc_state), GFP_KERNEL);
830	if (dmcst == NULL)
831		return -ENOMEM;
832
833	dmcst->i2c_adap = i2c;
834
835	for (k = no_of_demods-1; k >= 0; k--) {
836		dmcst->cfg = &cfg[k];
837
838		/* designated i2c address */
839		new_addr          = DIB3000MC_I2C_ADDRESS[k];
840		dmcst->i2c_addr = new_addr;
841		if (dib3000mc_identify(dmcst) != 0) {
842			dmcst->i2c_addr = default_addr;
843			if (dib3000mc_identify(dmcst) != 0) {
844				dprintk("-E-  DiB3000P/MC #%d: not identified\n", k);
845				kfree(dmcst);
846				return -ENODEV;
847			}
848		}
849
850		dib3000mc_set_output_mode(dmcst, OUTMODE_MPEG2_PAR_CONT_CLK);
851
852		// set new i2c address and force divstr (Bit 1) to value 0 (Bit 0)
853		dib3000mc_write_word(dmcst, 1024, (new_addr << 3) | 0x1);
854		dmcst->i2c_addr = new_addr;
855	}
856
857	for (k = 0; k < no_of_demods; k++) {
858		dmcst->cfg = &cfg[k];
859		dmcst->i2c_addr = DIB3000MC_I2C_ADDRESS[k];
860
861		dib3000mc_write_word(dmcst, 1024, dmcst->i2c_addr << 3);
862
863		/* turn off data output */
864		dib3000mc_set_output_mode(dmcst, OUTMODE_HIGH_Z);
865	}
866
867	kfree(dmcst);
868	return 0;
869}
870EXPORT_SYMBOL(dib3000mc_i2c_enumeration);
871
872static struct dvb_frontend_ops dib3000mc_ops;
873
874struct dvb_frontend * dib3000mc_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib3000mc_config *cfg)
875{
876	struct dvb_frontend *demod;
877	struct dib3000mc_state *st;
878	st = kzalloc(sizeof(struct dib3000mc_state), GFP_KERNEL);
879	if (st == NULL)
880		return NULL;
881
882	st->cfg = cfg;
883	st->i2c_adap = i2c_adap;
884	st->i2c_addr = i2c_addr;
885
886	demod                   = &st->demod;
887	demod->demodulator_priv = st;
888	memcpy(&st->demod.ops, &dib3000mc_ops, sizeof(struct dvb_frontend_ops));
889
890	if (dib3000mc_identify(st) != 0)
891		goto error;
892
893	dibx000_init_i2c_master(&st->i2c_master, DIB3000MC, st->i2c_adap, st->i2c_addr);
894
895	dib3000mc_write_word(st, 1037, 0x3130);
896
897	return demod;
898
899error:
900	kfree(st);
901	return NULL;
902}
903EXPORT_SYMBOL(dib3000mc_attach);
904
905static struct dvb_frontend_ops dib3000mc_ops = {
906	.delsys = { SYS_DVBT },
907	.info = {
908		.name = "DiBcom 3000MC/P",
909		.frequency_min      = 44250000,
910		.frequency_max      = 867250000,
911		.frequency_stepsize = 62500,
912		.caps = FE_CAN_INVERSION_AUTO |
913			FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
914			FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
915			FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
916			FE_CAN_TRANSMISSION_MODE_AUTO |
917			FE_CAN_GUARD_INTERVAL_AUTO |
918			FE_CAN_RECOVER |
919			FE_CAN_HIERARCHY_AUTO,
920	},
921
922	.release              = dib3000mc_release,
923
924	.init                 = dib3000mc_init,
925	.sleep                = dib3000mc_sleep,
926
927	.set_frontend         = dib3000mc_set_frontend,
928	.get_tune_settings    = dib3000mc_fe_get_tune_settings,
929	.get_frontend         = dib3000mc_get_frontend,
930
931	.read_status          = dib3000mc_read_status,
932	.read_ber             = dib3000mc_read_ber,
933	.read_signal_strength = dib3000mc_read_signal_strength,
934	.read_snr             = dib3000mc_read_snr,
935	.read_ucblocks        = dib3000mc_read_unc_blocks,
936};
937
938MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
939MODULE_DESCRIPTION("Driver for the DiBcom 3000MC/P COFDM demodulator");
940MODULE_LICENSE("GPL");
941