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