1 /*
2     Conexant cx24116/cx24118 - DVBS/S2 Satellite demod/tuner driver
3 
4     Copyright (C) 2006-2008 Steven Toth <stoth@hauppauge.com>
5     Copyright (C) 2006-2007 Georg Acher
6     Copyright (C) 2007-2008 Darron Broad
7 	March 2007
8 	    Fixed some bugs.
9 	    Added diseqc support.
10 	    Added corrected signal strength support.
11 	August 2007
12 	    Sync with legacy version.
13 	    Some clean ups.
14     Copyright (C) 2008 Igor Liplianin
15 	September, 9th 2008
16 	    Fixed locking on high symbol rates (>30000).
17 	    Implement MPEG initialization parameter.
18 	January, 17th 2009
19 	    Fill set_voltage with actually control voltage code.
20 	    Correct set tone to not affect voltage.
21 
22     This program is free software; you can redistribute it and/or modify
23     it under the terms of the GNU General Public License as published by
24     the Free Software Foundation; either version 2 of the License, or
25     (at your option) any later version.
26 
27     This program is distributed in the hope that it will be useful,
28     but WITHOUT ANY WARRANTY; without even the implied warranty of
29     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
30     GNU General Public License for more details.
31 
32     You should have received a copy of the GNU General Public License
33     along with this program; if not, write to the Free Software
34     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
35 */
36 
37 #include <linux/slab.h>
38 #include <linux/kernel.h>
39 #include <linux/module.h>
40 #include <linux/moduleparam.h>
41 #include <linux/init.h>
42 #include <linux/firmware.h>
43 
44 #include "dvb_frontend.h"
45 #include "cx24116.h"
46 
47 static int debug;
48 module_param(debug, int, 0644);
49 MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)");
50 
51 #define dprintk(args...) \
52 	do { \
53 		if (debug) \
54 			printk(KERN_INFO "cx24116: " args); \
55 	} while (0)
56 
57 #define CX24116_DEFAULT_FIRMWARE "dvb-fe-cx24116.fw"
58 #define CX24116_SEARCH_RANGE_KHZ 5000
59 
60 /* known registers */
61 #define CX24116_REG_COMMAND (0x00)      /* command args 0x00..0x1e */
62 #define CX24116_REG_EXECUTE (0x1f)      /* execute command */
63 #define CX24116_REG_MAILBOX (0x96)      /* FW or multipurpose mailbox? */
64 #define CX24116_REG_RESET   (0x20)      /* reset status > 0     */
65 #define CX24116_REG_SIGNAL  (0x9e)      /* signal low           */
66 #define CX24116_REG_SSTATUS (0x9d)      /* signal high / status */
67 #define CX24116_REG_QUALITY8 (0xa3)
68 #define CX24116_REG_QSTATUS (0xbc)
69 #define CX24116_REG_QUALITY0 (0xd5)
70 #define CX24116_REG_BER0    (0xc9)
71 #define CX24116_REG_BER8    (0xc8)
72 #define CX24116_REG_BER16   (0xc7)
73 #define CX24116_REG_BER24   (0xc6)
74 #define CX24116_REG_UCB0    (0xcb)
75 #define CX24116_REG_UCB8    (0xca)
76 #define CX24116_REG_CLKDIV  (0xf3)
77 #define CX24116_REG_RATEDIV (0xf9)
78 
79 /* configured fec (not tuned) or actual FEC (tuned) 1=1/2 2=2/3 etc */
80 #define CX24116_REG_FECSTATUS (0x9c)
81 
82 /* FECSTATUS bits */
83 /* mask to determine configured fec (not tuned) or actual fec (tuned) */
84 #define CX24116_FEC_FECMASK   (0x1f)
85 
86 /* Select DVB-S demodulator, else DVB-S2 */
87 #define CX24116_FEC_DVBS      (0x20)
88 #define CX24116_FEC_UNKNOWN   (0x40)    /* Unknown/unused */
89 
90 /* Pilot mode requested when tuning else always reset when tuned */
91 #define CX24116_FEC_PILOT     (0x80)
92 
93 /* arg buffer size */
94 #define CX24116_ARGLEN (0x1e)
95 
96 /* rolloff */
97 #define CX24116_ROLLOFF_020 (0x00)
98 #define CX24116_ROLLOFF_025 (0x01)
99 #define CX24116_ROLLOFF_035 (0x02)
100 
101 /* pilot bit */
102 #define CX24116_PILOT_OFF (0x00)
103 #define CX24116_PILOT_ON (0x40)
104 
105 /* signal status */
106 #define CX24116_HAS_SIGNAL   (0x01)
107 #define CX24116_HAS_CARRIER  (0x02)
108 #define CX24116_HAS_VITERBI  (0x04)
109 #define CX24116_HAS_SYNCLOCK (0x08)
110 #define CX24116_HAS_UNKNOWN1 (0x10)
111 #define CX24116_HAS_UNKNOWN2 (0x20)
112 #define CX24116_STATUS_MASK  (0x0f)
113 #define CX24116_SIGNAL_MASK  (0xc0)
114 
115 #define CX24116_DISEQC_TONEOFF   (0)    /* toneburst never sent */
116 #define CX24116_DISEQC_TONECACHE (1)    /* toneburst cached     */
117 #define CX24116_DISEQC_MESGCACHE (2)    /* message cached       */
118 
119 /* arg offset for DiSEqC */
120 #define CX24116_DISEQC_BURST  (1)
121 #define CX24116_DISEQC_ARG2_2 (2)   /* unknown value=2 */
122 #define CX24116_DISEQC_ARG3_0 (3)   /* unknown value=0 */
123 #define CX24116_DISEQC_ARG4_0 (4)   /* unknown value=0 */
124 #define CX24116_DISEQC_MSGLEN (5)
125 #define CX24116_DISEQC_MSGOFS (6)
126 
127 /* DiSEqC burst */
128 #define CX24116_DISEQC_MINI_A (0)
129 #define CX24116_DISEQC_MINI_B (1)
130 
131 /* DiSEqC tone burst */
132 static int toneburst = 1;
133 module_param(toneburst, int, 0644);
134 MODULE_PARM_DESC(toneburst, "DiSEqC toneburst 0=OFF, 1=TONE CACHE, "\
135 	"2=MESSAGE CACHE (default:1)");
136 
137 /* SNR measurements */
138 static int esno_snr;
139 module_param(esno_snr, int, 0644);
140 MODULE_PARM_DESC(esno_snr, "SNR return units, 0=PERCENTAGE 0-100, "\
141 	"1=ESNO(db * 10) (default:0)");
142 
143 enum cmds {
144 	CMD_SET_VCO     = 0x10,
145 	CMD_TUNEREQUEST = 0x11,
146 	CMD_MPEGCONFIG  = 0x13,
147 	CMD_TUNERINIT   = 0x14,
148 	CMD_BANDWIDTH   = 0x15,
149 	CMD_GETAGC      = 0x19,
150 	CMD_LNBCONFIG   = 0x20,
151 	CMD_LNBSEND     = 0x21, /* Formerly CMD_SEND_DISEQC */
152 	CMD_LNBDCLEVEL  = 0x22,
153 	CMD_SET_TONE    = 0x23,
154 	CMD_UPDFWVERS   = 0x35,
155 	CMD_TUNERSLEEP  = 0x36,
156 	CMD_AGCCONTROL  = 0x3b, /* Unknown */
157 };
158 
159 /* The Demod/Tuner can't easily provide these, we cache them */
160 struct cx24116_tuning {
161 	u32 frequency;
162 	u32 symbol_rate;
163 	fe_spectral_inversion_t inversion;
164 	fe_code_rate_t fec;
165 
166 	fe_delivery_system_t delsys;
167 	fe_modulation_t modulation;
168 	fe_pilot_t pilot;
169 	fe_rolloff_t rolloff;
170 
171 	/* Demod values */
172 	u8 fec_val;
173 	u8 fec_mask;
174 	u8 inversion_val;
175 	u8 pilot_val;
176 	u8 rolloff_val;
177 };
178 
179 /* Basic commands that are sent to the firmware */
180 struct cx24116_cmd {
181 	u8 len;
182 	u8 args[CX24116_ARGLEN];
183 };
184 
185 struct cx24116_state {
186 	struct i2c_adapter *i2c;
187 	const struct cx24116_config *config;
188 
189 	struct dvb_frontend frontend;
190 
191 	struct cx24116_tuning dcur;
192 	struct cx24116_tuning dnxt;
193 
194 	u8 skip_fw_load;
195 	u8 burst;
196 	struct cx24116_cmd dsec_cmd;
197 };
198 
199 static int cx24116_writereg(struct cx24116_state *state, int reg, int data)
200 {
201 	u8 buf[] = { reg, data };
202 	struct i2c_msg msg = { .addr = state->config->demod_address,
203 		.flags = 0, .buf = buf, .len = 2 };
204 	int err;
205 
206 	if (debug > 1)
207 		printk("cx24116: %s: write reg 0x%02x, value 0x%02x\n",
208 			__func__, reg, data);
209 
210 	err = i2c_transfer(state->i2c, &msg, 1);
211 	if (err != 1) {
212 		printk(KERN_ERR "%s: writereg error(err == %i, reg == 0x%02x,"
213 			 " value == 0x%02x)\n", __func__, err, reg, data);
214 		return -EREMOTEIO;
215 	}
216 
217 	return 0;
218 }
219 
220 /* Bulk byte writes to a single I2C address, for 32k firmware load */
221 static int cx24116_writeregN(struct cx24116_state *state, int reg,
222 			     const u8 *data, u16 len)
223 {
224 	int ret = -EREMOTEIO;
225 	struct i2c_msg msg;
226 	u8 *buf;
227 
228 	buf = kmalloc(len + 1, GFP_KERNEL);
229 	if (buf == NULL) {
230 		printk("Unable to kmalloc\n");
231 		ret = -ENOMEM;
232 		goto error;
233 	}
234 
235 	*(buf) = reg;
236 	memcpy(buf + 1, data, len);
237 
238 	msg.addr = state->config->demod_address;
239 	msg.flags = 0;
240 	msg.buf = buf;
241 	msg.len = len + 1;
242 
243 	if (debug > 1)
244 		printk(KERN_INFO "cx24116: %s:  write regN 0x%02x, len = %d\n",
245 			__func__, reg, len);
246 
247 	ret = i2c_transfer(state->i2c, &msg, 1);
248 	if (ret != 1) {
249 		printk(KERN_ERR "%s: writereg error(err == %i, reg == 0x%02x\n",
250 			 __func__, ret, reg);
251 		ret = -EREMOTEIO;
252 	}
253 
254 error:
255 	kfree(buf);
256 
257 	return ret;
258 }
259 
260 static int cx24116_readreg(struct cx24116_state *state, u8 reg)
261 {
262 	int ret;
263 	u8 b0[] = { reg };
264 	u8 b1[] = { 0 };
265 	struct i2c_msg msg[] = {
266 		{ .addr = state->config->demod_address, .flags = 0,
267 			.buf = b0, .len = 1 },
268 		{ .addr = state->config->demod_address, .flags = I2C_M_RD,
269 			.buf = b1, .len = 1 }
270 	};
271 
272 	ret = i2c_transfer(state->i2c, msg, 2);
273 
274 	if (ret != 2) {
275 		printk(KERN_ERR "%s: reg=0x%x (error=%d)\n",
276 			__func__, reg, ret);
277 		return ret;
278 	}
279 
280 	if (debug > 1)
281 		printk(KERN_INFO "cx24116: read reg 0x%02x, value 0x%02x\n",
282 			reg, b1[0]);
283 
284 	return b1[0];
285 }
286 
287 static int cx24116_set_inversion(struct cx24116_state *state,
288 	fe_spectral_inversion_t inversion)
289 {
290 	dprintk("%s(%d)\n", __func__, inversion);
291 
292 	switch (inversion) {
293 	case INVERSION_OFF:
294 		state->dnxt.inversion_val = 0x00;
295 		break;
296 	case INVERSION_ON:
297 		state->dnxt.inversion_val = 0x04;
298 		break;
299 	case INVERSION_AUTO:
300 		state->dnxt.inversion_val = 0x0C;
301 		break;
302 	default:
303 		return -EINVAL;
304 	}
305 
306 	state->dnxt.inversion = inversion;
307 
308 	return 0;
309 }
310 
311 /*
312  * modfec (modulation and FEC)
313  * ===========================
314  *
315  * MOD          FEC             mask/val    standard
316  * ----         --------        ----------- --------
317  * QPSK         FEC_1_2         0x02 0x02+X DVB-S
318  * QPSK         FEC_2_3         0x04 0x02+X DVB-S
319  * QPSK         FEC_3_4         0x08 0x02+X DVB-S
320  * QPSK         FEC_4_5         0x10 0x02+X DVB-S (?)
321  * QPSK         FEC_5_6         0x20 0x02+X DVB-S
322  * QPSK         FEC_6_7         0x40 0x02+X DVB-S
323  * QPSK         FEC_7_8         0x80 0x02+X DVB-S
324  * QPSK         FEC_8_9         0x01 0x02+X DVB-S (?) (NOT SUPPORTED?)
325  * QPSK         AUTO            0xff 0x02+X DVB-S
326  *
327  * For DVB-S high byte probably represents FEC
328  * and low byte selects the modulator. The high
329  * byte is search range mask. Bit 5 may turn
330  * on DVB-S and remaining bits represent some
331  * kind of calibration (how/what i do not know).
332  *
333  * Eg.(2/3) szap "Zone Horror"
334  *
335  * mask/val = 0x04, 0x20
336  * status 1f | signal c3c0 | snr a333 | ber 00000098 | unc 0 | FE_HAS_LOCK
337  *
338  * mask/val = 0x04, 0x30
339  * status 1f | signal c3c0 | snr a333 | ber 00000000 | unc 0 | FE_HAS_LOCK
340  *
341  * After tuning FECSTATUS contains actual FEC
342  * in use numbered 1 through to 8 for 1/2 .. 2/3 etc
343  *
344  * NBC=NOT/NON BACKWARD COMPATIBLE WITH DVB-S (DVB-S2 only)
345  *
346  * NBC-QPSK     FEC_1_2         0x00, 0x04      DVB-S2
347  * NBC-QPSK     FEC_3_5         0x00, 0x05      DVB-S2
348  * NBC-QPSK     FEC_2_3         0x00, 0x06      DVB-S2
349  * NBC-QPSK     FEC_3_4         0x00, 0x07      DVB-S2
350  * NBC-QPSK     FEC_4_5         0x00, 0x08      DVB-S2
351  * NBC-QPSK     FEC_5_6         0x00, 0x09      DVB-S2
352  * NBC-QPSK     FEC_8_9         0x00, 0x0a      DVB-S2
353  * NBC-QPSK     FEC_9_10        0x00, 0x0b      DVB-S2
354  *
355  * NBC-8PSK     FEC_3_5         0x00, 0x0c      DVB-S2
356  * NBC-8PSK     FEC_2_3         0x00, 0x0d      DVB-S2
357  * NBC-8PSK     FEC_3_4         0x00, 0x0e      DVB-S2
358  * NBC-8PSK     FEC_5_6         0x00, 0x0f      DVB-S2
359  * NBC-8PSK     FEC_8_9         0x00, 0x10      DVB-S2
360  * NBC-8PSK     FEC_9_10        0x00, 0x11      DVB-S2
361  *
362  * For DVB-S2 low bytes selects both modulator
363  * and FEC. High byte is meaningless here. To
364  * set pilot, bit 6 (0x40) is set. When inspecting
365  * FECSTATUS bit 7 (0x80) represents the pilot
366  * selection whilst not tuned. When tuned, actual FEC
367  * in use is found in FECSTATUS as per above. Pilot
368  * value is reset.
369  */
370 
371 /* A table of modulation, fec and configuration bytes for the demod.
372  * Not all S2 mmodulation schemes are support and not all rates with
373  * a scheme are support. Especially, no auto detect when in S2 mode.
374  */
375 static struct cx24116_modfec {
376 	fe_delivery_system_t delivery_system;
377 	fe_modulation_t modulation;
378 	fe_code_rate_t fec;
379 	u8 mask;	/* In DVBS mode this is used to autodetect */
380 	u8 val;		/* Passed to the firmware to indicate mode selection */
381 } CX24116_MODFEC_MODES[] = {
382  /* QPSK. For unknown rates we set hardware to auto detect 0xfe 0x30 */
383 
384  /*mod   fec       mask  val */
385  { SYS_DVBS, QPSK, FEC_NONE, 0xfe, 0x30 },
386  { SYS_DVBS, QPSK, FEC_1_2,  0x02, 0x2e }, /* 00000010 00101110 */
387  { SYS_DVBS, QPSK, FEC_2_3,  0x04, 0x2f }, /* 00000100 00101111 */
388  { SYS_DVBS, QPSK, FEC_3_4,  0x08, 0x30 }, /* 00001000 00110000 */
389  { SYS_DVBS, QPSK, FEC_4_5,  0xfe, 0x30 }, /* 000?0000 ?        */
390  { SYS_DVBS, QPSK, FEC_5_6,  0x20, 0x31 }, /* 00100000 00110001 */
391  { SYS_DVBS, QPSK, FEC_6_7,  0xfe, 0x30 }, /* 0?000000 ?        */
392  { SYS_DVBS, QPSK, FEC_7_8,  0x80, 0x32 }, /* 10000000 00110010 */
393  { SYS_DVBS, QPSK, FEC_8_9,  0xfe, 0x30 }, /* 0000000? ?        */
394  { SYS_DVBS, QPSK, FEC_AUTO, 0xfe, 0x30 },
395  /* NBC-QPSK */
396  { SYS_DVBS2, QPSK, FEC_1_2,  0x00, 0x04 },
397  { SYS_DVBS2, QPSK, FEC_3_5,  0x00, 0x05 },
398  { SYS_DVBS2, QPSK, FEC_2_3,  0x00, 0x06 },
399  { SYS_DVBS2, QPSK, FEC_3_4,  0x00, 0x07 },
400  { SYS_DVBS2, QPSK, FEC_4_5,  0x00, 0x08 },
401  { SYS_DVBS2, QPSK, FEC_5_6,  0x00, 0x09 },
402  { SYS_DVBS2, QPSK, FEC_8_9,  0x00, 0x0a },
403  { SYS_DVBS2, QPSK, FEC_9_10, 0x00, 0x0b },
404  /* 8PSK */
405  { SYS_DVBS2, PSK_8, FEC_3_5,  0x00, 0x0c },
406  { SYS_DVBS2, PSK_8, FEC_2_3,  0x00, 0x0d },
407  { SYS_DVBS2, PSK_8, FEC_3_4,  0x00, 0x0e },
408  { SYS_DVBS2, PSK_8, FEC_5_6,  0x00, 0x0f },
409  { SYS_DVBS2, PSK_8, FEC_8_9,  0x00, 0x10 },
410  { SYS_DVBS2, PSK_8, FEC_9_10, 0x00, 0x11 },
411  /*
412   * `val' can be found in the FECSTATUS register when tuning.
413   * FECSTATUS will give the actual FEC in use if tuning was successful.
414   */
415 };
416 
417 static int cx24116_lookup_fecmod(struct cx24116_state *state,
418 	fe_delivery_system_t d, fe_modulation_t m, fe_code_rate_t f)
419 {
420 	int i, ret = -EOPNOTSUPP;
421 
422 	dprintk("%s(0x%02x,0x%02x)\n", __func__, m, f);
423 
424 	for (i = 0; i < ARRAY_SIZE(CX24116_MODFEC_MODES); i++) {
425 		if ((d == CX24116_MODFEC_MODES[i].delivery_system) &&
426 			(m == CX24116_MODFEC_MODES[i].modulation) &&
427 			(f == CX24116_MODFEC_MODES[i].fec)) {
428 				ret = i;
429 				break;
430 			}
431 	}
432 
433 	return ret;
434 }
435 
436 static int cx24116_set_fec(struct cx24116_state *state,
437 	fe_delivery_system_t delsys, fe_modulation_t mod, fe_code_rate_t fec)
438 {
439 	int ret = 0;
440 
441 	dprintk("%s(0x%02x,0x%02x)\n", __func__, mod, fec);
442 
443 	ret = cx24116_lookup_fecmod(state, delsys, mod, fec);
444 
445 	if (ret < 0)
446 		return ret;
447 
448 	state->dnxt.fec = fec;
449 	state->dnxt.fec_val = CX24116_MODFEC_MODES[ret].val;
450 	state->dnxt.fec_mask = CX24116_MODFEC_MODES[ret].mask;
451 	dprintk("%s() mask/val = 0x%02x/0x%02x\n", __func__,
452 		state->dnxt.fec_mask, state->dnxt.fec_val);
453 
454 	return 0;
455 }
456 
457 static int cx24116_set_symbolrate(struct cx24116_state *state, u32 rate)
458 {
459 	dprintk("%s(%d)\n", __func__, rate);
460 
461 	/*  check if symbol rate is within limits */
462 	if ((rate > state->frontend.ops.info.symbol_rate_max) ||
463 	    (rate < state->frontend.ops.info.symbol_rate_min)) {
464 		dprintk("%s() unsupported symbol_rate = %d\n", __func__, rate);
465 		return -EOPNOTSUPP;
466 	}
467 
468 	state->dnxt.symbol_rate = rate;
469 	dprintk("%s() symbol_rate = %d\n", __func__, rate);
470 
471 	return 0;
472 }
473 
474 static int cx24116_load_firmware(struct dvb_frontend *fe,
475 	const struct firmware *fw);
476 
477 static int cx24116_firmware_ondemand(struct dvb_frontend *fe)
478 {
479 	struct cx24116_state *state = fe->demodulator_priv;
480 	const struct firmware *fw;
481 	int ret = 0;
482 
483 	dprintk("%s()\n", __func__);
484 
485 	if (cx24116_readreg(state, 0x20) > 0) {
486 
487 		if (state->skip_fw_load)
488 			return 0;
489 
490 		/* Load firmware */
491 		/* request the firmware, this will block until loaded */
492 		printk(KERN_INFO "%s: Waiting for firmware upload (%s)...\n",
493 			__func__, CX24116_DEFAULT_FIRMWARE);
494 		ret = request_firmware(&fw, CX24116_DEFAULT_FIRMWARE,
495 			state->i2c->dev.parent);
496 		printk(KERN_INFO "%s: Waiting for firmware upload(2)...\n",
497 			__func__);
498 		if (ret) {
499 			printk(KERN_ERR "%s: No firmware uploaded "
500 				"(timeout or file not found?)\n", __func__);
501 			return ret;
502 		}
503 
504 		/* Make sure we don't recurse back through here
505 		 * during loading */
506 		state->skip_fw_load = 1;
507 
508 		ret = cx24116_load_firmware(fe, fw);
509 		if (ret)
510 			printk(KERN_ERR "%s: Writing firmware to device failed\n",
511 				__func__);
512 
513 		release_firmware(fw);
514 
515 		printk(KERN_INFO "%s: Firmware upload %s\n", __func__,
516 			ret == 0 ? "complete" : "failed");
517 
518 		/* Ensure firmware is always loaded if required */
519 		state->skip_fw_load = 0;
520 	}
521 
522 	return ret;
523 }
524 
525 /* Take a basic firmware command structure, format it
526  * and forward it for processing
527  */
528 static int cx24116_cmd_execute(struct dvb_frontend *fe, struct cx24116_cmd *cmd)
529 {
530 	struct cx24116_state *state = fe->demodulator_priv;
531 	int i, ret;
532 
533 	dprintk("%s()\n", __func__);
534 
535 	/* Load the firmware if required */
536 	ret = cx24116_firmware_ondemand(fe);
537 	if (ret != 0) {
538 		printk(KERN_ERR "%s(): Unable initialise the firmware\n",
539 			__func__);
540 		return ret;
541 	}
542 
543 	/* Write the command */
544 	for (i = 0; i < cmd->len ; i++) {
545 		dprintk("%s: 0x%02x == 0x%02x\n", __func__, i, cmd->args[i]);
546 		cx24116_writereg(state, i, cmd->args[i]);
547 	}
548 
549 	/* Start execution and wait for cmd to terminate */
550 	cx24116_writereg(state, CX24116_REG_EXECUTE, 0x01);
551 	while (cx24116_readreg(state, CX24116_REG_EXECUTE)) {
552 		msleep(10);
553 		if (i++ > 64) {
554 			/* Avoid looping forever if the firmware does
555 				not respond */
556 			printk(KERN_WARNING "%s() Firmware not responding\n",
557 				__func__);
558 			return -EREMOTEIO;
559 		}
560 	}
561 	return 0;
562 }
563 
564 static int cx24116_load_firmware(struct dvb_frontend *fe,
565 	const struct firmware *fw)
566 {
567 	struct cx24116_state *state = fe->demodulator_priv;
568 	struct cx24116_cmd cmd;
569 	int i, ret, len, max, remaining;
570 	unsigned char vers[4];
571 
572 	dprintk("%s\n", __func__);
573 	dprintk("Firmware is %zu bytes (%02x %02x .. %02x %02x)\n",
574 			fw->size,
575 			fw->data[0],
576 			fw->data[1],
577 			fw->data[fw->size-2],
578 			fw->data[fw->size-1]);
579 
580 	/* Toggle 88x SRST pin to reset demod */
581 	if (state->config->reset_device)
582 		state->config->reset_device(fe);
583 
584 	/* Begin the firmware load process */
585 	/* Prepare the demod, load the firmware, cleanup after load */
586 
587 	/* Init PLL */
588 	cx24116_writereg(state, 0xE5, 0x00);
589 	cx24116_writereg(state, 0xF1, 0x08);
590 	cx24116_writereg(state, 0xF2, 0x13);
591 
592 	/* Start PLL */
593 	cx24116_writereg(state, 0xe0, 0x03);
594 	cx24116_writereg(state, 0xe0, 0x00);
595 
596 	/* Unknown */
597 	cx24116_writereg(state, CX24116_REG_CLKDIV, 0x46);
598 	cx24116_writereg(state, CX24116_REG_RATEDIV, 0x00);
599 
600 	/* Unknown */
601 	cx24116_writereg(state, 0xF0, 0x03);
602 	cx24116_writereg(state, 0xF4, 0x81);
603 	cx24116_writereg(state, 0xF5, 0x00);
604 	cx24116_writereg(state, 0xF6, 0x00);
605 
606 	/* Split firmware to the max I2C write len and write.
607 	 * Writes whole firmware as one write when i2c_wr_max is set to 0. */
608 	if (state->config->i2c_wr_max)
609 		max = state->config->i2c_wr_max;
610 	else
611 		max = INT_MAX; /* enough for 32k firmware */
612 
613 	for (remaining = fw->size; remaining > 0; remaining -= max - 1) {
614 		len = remaining;
615 		if (len > max - 1)
616 			len = max - 1;
617 
618 		cx24116_writeregN(state, 0xF7, &fw->data[fw->size - remaining],
619 			len);
620 	}
621 
622 	cx24116_writereg(state, 0xF4, 0x10);
623 	cx24116_writereg(state, 0xF0, 0x00);
624 	cx24116_writereg(state, 0xF8, 0x06);
625 
626 	/* Firmware CMD 10: VCO config */
627 	cmd.args[0x00] = CMD_SET_VCO;
628 	cmd.args[0x01] = 0x05;
629 	cmd.args[0x02] = 0xdc;
630 	cmd.args[0x03] = 0xda;
631 	cmd.args[0x04] = 0xae;
632 	cmd.args[0x05] = 0xaa;
633 	cmd.args[0x06] = 0x04;
634 	cmd.args[0x07] = 0x9d;
635 	cmd.args[0x08] = 0xfc;
636 	cmd.args[0x09] = 0x06;
637 	cmd.len = 0x0a;
638 	ret = cx24116_cmd_execute(fe, &cmd);
639 	if (ret != 0)
640 		return ret;
641 
642 	cx24116_writereg(state, CX24116_REG_SSTATUS, 0x00);
643 
644 	/* Firmware CMD 14: Tuner config */
645 	cmd.args[0x00] = CMD_TUNERINIT;
646 	cmd.args[0x01] = 0x00;
647 	cmd.args[0x02] = 0x00;
648 	cmd.len = 0x03;
649 	ret = cx24116_cmd_execute(fe, &cmd);
650 	if (ret != 0)
651 		return ret;
652 
653 	cx24116_writereg(state, 0xe5, 0x00);
654 
655 	/* Firmware CMD 13: MPEG config */
656 	cmd.args[0x00] = CMD_MPEGCONFIG;
657 	cmd.args[0x01] = 0x01;
658 	cmd.args[0x02] = 0x75;
659 	cmd.args[0x03] = 0x00;
660 	if (state->config->mpg_clk_pos_pol)
661 		cmd.args[0x04] = state->config->mpg_clk_pos_pol;
662 	else
663 		cmd.args[0x04] = 0x02;
664 	cmd.args[0x05] = 0x00;
665 	cmd.len = 0x06;
666 	ret = cx24116_cmd_execute(fe, &cmd);
667 	if (ret != 0)
668 		return ret;
669 
670 	/* Firmware CMD 35: Get firmware version */
671 	cmd.args[0x00] = CMD_UPDFWVERS;
672 	cmd.len = 0x02;
673 	for (i = 0; i < 4; i++) {
674 		cmd.args[0x01] = i;
675 		ret = cx24116_cmd_execute(fe, &cmd);
676 		if (ret != 0)
677 			return ret;
678 		vers[i] = cx24116_readreg(state, CX24116_REG_MAILBOX);
679 	}
680 	printk(KERN_INFO "%s: FW version %i.%i.%i.%i\n", __func__,
681 		vers[0], vers[1], vers[2], vers[3]);
682 
683 	return 0;
684 }
685 
686 static int cx24116_read_status(struct dvb_frontend *fe, fe_status_t *status)
687 {
688 	struct cx24116_state *state = fe->demodulator_priv;
689 
690 	int lock = cx24116_readreg(state, CX24116_REG_SSTATUS) &
691 		CX24116_STATUS_MASK;
692 
693 	dprintk("%s: status = 0x%02x\n", __func__, lock);
694 
695 	*status = 0;
696 
697 	if (lock & CX24116_HAS_SIGNAL)
698 		*status |= FE_HAS_SIGNAL;
699 	if (lock & CX24116_HAS_CARRIER)
700 		*status |= FE_HAS_CARRIER;
701 	if (lock & CX24116_HAS_VITERBI)
702 		*status |= FE_HAS_VITERBI;
703 	if (lock & CX24116_HAS_SYNCLOCK)
704 		*status |= FE_HAS_SYNC | FE_HAS_LOCK;
705 
706 	return 0;
707 }
708 
709 static int cx24116_read_ber(struct dvb_frontend *fe, u32 *ber)
710 {
711 	struct cx24116_state *state = fe->demodulator_priv;
712 
713 	dprintk("%s()\n", __func__);
714 
715 	*ber =  (cx24116_readreg(state, CX24116_REG_BER24) << 24) |
716 		(cx24116_readreg(state, CX24116_REG_BER16) << 16) |
717 		(cx24116_readreg(state, CX24116_REG_BER8)  << 8)  |
718 		 cx24116_readreg(state, CX24116_REG_BER0);
719 
720 	return 0;
721 }
722 
723 /* TODO Determine function and scale appropriately */
724 static int cx24116_read_signal_strength(struct dvb_frontend *fe,
725 	u16 *signal_strength)
726 {
727 	struct cx24116_state *state = fe->demodulator_priv;
728 	struct cx24116_cmd cmd;
729 	int ret;
730 	u16 sig_reading;
731 
732 	dprintk("%s()\n", __func__);
733 
734 	/* Firmware CMD 19: Get AGC */
735 	cmd.args[0x00] = CMD_GETAGC;
736 	cmd.len = 0x01;
737 	ret = cx24116_cmd_execute(fe, &cmd);
738 	if (ret != 0)
739 		return ret;
740 
741 	sig_reading =
742 		(cx24116_readreg(state,
743 			CX24116_REG_SSTATUS) & CX24116_SIGNAL_MASK) |
744 		(cx24116_readreg(state, CX24116_REG_SIGNAL) << 6);
745 	*signal_strength = 0 - sig_reading;
746 
747 	dprintk("%s: raw / cooked = 0x%04x / 0x%04x\n",
748 		__func__, sig_reading, *signal_strength);
749 
750 	return 0;
751 }
752 
753 /* SNR (0..100)% = (sig & 0xf0) * 10 + (sig & 0x0f) * 10 / 16 */
754 static int cx24116_read_snr_pct(struct dvb_frontend *fe, u16 *snr)
755 {
756 	struct cx24116_state *state = fe->demodulator_priv;
757 	u8 snr_reading;
758 	static const u32 snr_tab[] = { /* 10 x Table (rounded up) */
759 		0x00000, 0x0199A, 0x03333, 0x04ccD, 0x06667,
760 		0x08000, 0x0999A, 0x0b333, 0x0cccD, 0x0e667,
761 		0x10000, 0x1199A, 0x13333, 0x14ccD, 0x16667,
762 		0x18000 };
763 
764 	dprintk("%s()\n", __func__);
765 
766 	snr_reading = cx24116_readreg(state, CX24116_REG_QUALITY0);
767 
768 	if (snr_reading >= 0xa0 /* 100% */)
769 		*snr = 0xffff;
770 	else
771 		*snr = snr_tab[(snr_reading & 0xf0) >> 4] +
772 			(snr_tab[(snr_reading & 0x0f)] >> 4);
773 
774 	dprintk("%s: raw / cooked = 0x%02x / 0x%04x\n", __func__,
775 		snr_reading, *snr);
776 
777 	return 0;
778 }
779 
780 /* The reelbox patches show the value in the registers represents
781  * ESNO, from 0->30db (values 0->300). We provide this value by
782  * default.
783  */
784 static int cx24116_read_snr_esno(struct dvb_frontend *fe, u16 *snr)
785 {
786 	struct cx24116_state *state = fe->demodulator_priv;
787 
788 	dprintk("%s()\n", __func__);
789 
790 	*snr = cx24116_readreg(state, CX24116_REG_QUALITY8) << 8 |
791 		cx24116_readreg(state, CX24116_REG_QUALITY0);
792 
793 	dprintk("%s: raw 0x%04x\n", __func__, *snr);
794 
795 	return 0;
796 }
797 
798 static int cx24116_read_snr(struct dvb_frontend *fe, u16 *snr)
799 {
800 	if (esno_snr == 1)
801 		return cx24116_read_snr_esno(fe, snr);
802 	else
803 		return cx24116_read_snr_pct(fe, snr);
804 }
805 
806 static int cx24116_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
807 {
808 	struct cx24116_state *state = fe->demodulator_priv;
809 
810 	dprintk("%s()\n", __func__);
811 
812 	*ucblocks = (cx24116_readreg(state, CX24116_REG_UCB8) << 8) |
813 		cx24116_readreg(state, CX24116_REG_UCB0);
814 
815 	return 0;
816 }
817 
818 /* Overwrite the current tuning params, we are about to tune */
819 static void cx24116_clone_params(struct dvb_frontend *fe)
820 {
821 	struct cx24116_state *state = fe->demodulator_priv;
822 	state->dcur = state->dnxt;
823 }
824 
825 /* Wait for LNB */
826 static int cx24116_wait_for_lnb(struct dvb_frontend *fe)
827 {
828 	struct cx24116_state *state = fe->demodulator_priv;
829 	int i;
830 
831 	dprintk("%s() qstatus = 0x%02x\n", __func__,
832 		cx24116_readreg(state, CX24116_REG_QSTATUS));
833 
834 	/* Wait for up to 300 ms */
835 	for (i = 0; i < 30 ; i++) {
836 		if (cx24116_readreg(state, CX24116_REG_QSTATUS) & 0x20)
837 			return 0;
838 		msleep(10);
839 	}
840 
841 	dprintk("%s(): LNB not ready\n", __func__);
842 
843 	return -ETIMEDOUT; /* -EBUSY ? */
844 }
845 
846 static int cx24116_set_voltage(struct dvb_frontend *fe,
847 	fe_sec_voltage_t voltage)
848 {
849 	struct cx24116_cmd cmd;
850 	int ret;
851 
852 	dprintk("%s: %s\n", __func__,
853 		voltage == SEC_VOLTAGE_13 ? "SEC_VOLTAGE_13" :
854 		voltage == SEC_VOLTAGE_18 ? "SEC_VOLTAGE_18" : "??");
855 
856 	/* Wait for LNB ready */
857 	ret = cx24116_wait_for_lnb(fe);
858 	if (ret != 0)
859 		return ret;
860 
861 	/* Wait for voltage/min repeat delay */
862 	msleep(100);
863 
864 	cmd.args[0x00] = CMD_LNBDCLEVEL;
865 	cmd.args[0x01] = (voltage == SEC_VOLTAGE_18 ? 0x01 : 0x00);
866 	cmd.len = 0x02;
867 
868 	/* Min delay time before DiSEqC send */
869 	msleep(15);
870 
871 	return cx24116_cmd_execute(fe, &cmd);
872 }
873 
874 static int cx24116_set_tone(struct dvb_frontend *fe,
875 	fe_sec_tone_mode_t tone)
876 {
877 	struct cx24116_cmd cmd;
878 	int ret;
879 
880 	dprintk("%s(%d)\n", __func__, tone);
881 	if ((tone != SEC_TONE_ON) && (tone != SEC_TONE_OFF)) {
882 		printk(KERN_ERR "%s: Invalid, tone=%d\n", __func__, tone);
883 		return -EINVAL;
884 	}
885 
886 	/* Wait for LNB ready */
887 	ret = cx24116_wait_for_lnb(fe);
888 	if (ret != 0)
889 		return ret;
890 
891 	/* Min delay time after DiSEqC send */
892 	msleep(15); /* XXX determine is FW does this, see send_diseqc/burst */
893 
894 	/* Now we set the tone */
895 	cmd.args[0x00] = CMD_SET_TONE;
896 	cmd.args[0x01] = 0x00;
897 	cmd.args[0x02] = 0x00;
898 
899 	switch (tone) {
900 	case SEC_TONE_ON:
901 		dprintk("%s: setting tone on\n", __func__);
902 		cmd.args[0x03] = 0x01;
903 		break;
904 	case SEC_TONE_OFF:
905 		dprintk("%s: setting tone off\n", __func__);
906 		cmd.args[0x03] = 0x00;
907 		break;
908 	}
909 	cmd.len = 0x04;
910 
911 	/* Min delay time before DiSEqC send */
912 	msleep(15); /* XXX determine is FW does this, see send_diseqc/burst */
913 
914 	return cx24116_cmd_execute(fe, &cmd);
915 }
916 
917 /* Initialise DiSEqC */
918 static int cx24116_diseqc_init(struct dvb_frontend *fe)
919 {
920 	struct cx24116_state *state = fe->demodulator_priv;
921 	struct cx24116_cmd cmd;
922 	int ret;
923 
924 	/* Firmware CMD 20: LNB/DiSEqC config */
925 	cmd.args[0x00] = CMD_LNBCONFIG;
926 	cmd.args[0x01] = 0x00;
927 	cmd.args[0x02] = 0x10;
928 	cmd.args[0x03] = 0x00;
929 	cmd.args[0x04] = 0x8f;
930 	cmd.args[0x05] = 0x28;
931 	cmd.args[0x06] = (toneburst == CX24116_DISEQC_TONEOFF) ? 0x00 : 0x01;
932 	cmd.args[0x07] = 0x01;
933 	cmd.len = 0x08;
934 	ret = cx24116_cmd_execute(fe, &cmd);
935 	if (ret != 0)
936 		return ret;
937 
938 	/* Prepare a DiSEqC command */
939 	state->dsec_cmd.args[0x00] = CMD_LNBSEND;
940 
941 	/* DiSEqC burst */
942 	state->dsec_cmd.args[CX24116_DISEQC_BURST]  = CX24116_DISEQC_MINI_A;
943 
944 	/* Unknown */
945 	state->dsec_cmd.args[CX24116_DISEQC_ARG2_2] = 0x02;
946 	state->dsec_cmd.args[CX24116_DISEQC_ARG3_0] = 0x00;
947 	/* Continuation flag? */
948 	state->dsec_cmd.args[CX24116_DISEQC_ARG4_0] = 0x00;
949 
950 	/* DiSEqC message length */
951 	state->dsec_cmd.args[CX24116_DISEQC_MSGLEN] = 0x00;
952 
953 	/* Command length */
954 	state->dsec_cmd.len = CX24116_DISEQC_MSGOFS;
955 
956 	return 0;
957 }
958 
959 /* Send DiSEqC message with derived burst (hack) || previous burst */
960 static int cx24116_send_diseqc_msg(struct dvb_frontend *fe,
961 	struct dvb_diseqc_master_cmd *d)
962 {
963 	struct cx24116_state *state = fe->demodulator_priv;
964 	int i, ret;
965 
966 	/* Dump DiSEqC message */
967 	if (debug) {
968 		printk(KERN_INFO "cx24116: %s(", __func__);
969 		for (i = 0 ; i < d->msg_len ;) {
970 			printk(KERN_INFO "0x%02x", d->msg[i]);
971 			if (++i < d->msg_len)
972 				printk(KERN_INFO ", ");
973 		}
974 		printk(") toneburst=%d\n", toneburst);
975 	}
976 
977 	/* Validate length */
978 	if (d->msg_len > (CX24116_ARGLEN - CX24116_DISEQC_MSGOFS))
979 		return -EINVAL;
980 
981 	/* DiSEqC message */
982 	for (i = 0; i < d->msg_len; i++)
983 		state->dsec_cmd.args[CX24116_DISEQC_MSGOFS + i] = d->msg[i];
984 
985 	/* DiSEqC message length */
986 	state->dsec_cmd.args[CX24116_DISEQC_MSGLEN] = d->msg_len;
987 
988 	/* Command length */
989 	state->dsec_cmd.len = CX24116_DISEQC_MSGOFS +
990 		state->dsec_cmd.args[CX24116_DISEQC_MSGLEN];
991 
992 	/* DiSEqC toneburst */
993 	if (toneburst == CX24116_DISEQC_MESGCACHE)
994 		/* Message is cached */
995 		return 0;
996 
997 	else if (toneburst == CX24116_DISEQC_TONEOFF)
998 		/* Message is sent without burst */
999 		state->dsec_cmd.args[CX24116_DISEQC_BURST] = 0;
1000 
1001 	else if (toneburst == CX24116_DISEQC_TONECACHE) {
1002 		/*
1003 		 * Message is sent with derived else cached burst
1004 		 *
1005 		 * WRITE PORT GROUP COMMAND 38
1006 		 *
1007 		 * 0/A/A: E0 10 38 F0..F3
1008 		 * 1/B/B: E0 10 38 F4..F7
1009 		 * 2/C/A: E0 10 38 F8..FB
1010 		 * 3/D/B: E0 10 38 FC..FF
1011 		 *
1012 		 * databyte[3]= 8421:8421
1013 		 *              ABCD:WXYZ
1014 		 *              CLR :SET
1015 		 *
1016 		 *              WX= PORT SELECT 0..3    (X=TONEBURST)
1017 		 *              Y = VOLTAGE             (0=13V, 1=18V)
1018 		 *              Z = BAND                (0=LOW, 1=HIGH(22K))
1019 		 */
1020 		if (d->msg_len >= 4 && d->msg[2] == 0x38)
1021 			state->dsec_cmd.args[CX24116_DISEQC_BURST] =
1022 				((d->msg[3] & 4) >> 2);
1023 		if (debug)
1024 			dprintk("%s burst=%d\n", __func__,
1025 				state->dsec_cmd.args[CX24116_DISEQC_BURST]);
1026 	}
1027 
1028 	/* Wait for LNB ready */
1029 	ret = cx24116_wait_for_lnb(fe);
1030 	if (ret != 0)
1031 		return ret;
1032 
1033 	/* Wait for voltage/min repeat delay */
1034 	msleep(100);
1035 
1036 	/* Command */
1037 	ret = cx24116_cmd_execute(fe, &state->dsec_cmd);
1038 	if (ret != 0)
1039 		return ret;
1040 	/*
1041 	 * Wait for send
1042 	 *
1043 	 * Eutelsat spec:
1044 	 * >15ms delay          + (XXX determine if FW does this, see set_tone)
1045 	 *  13.5ms per byte     +
1046 	 * >15ms delay          +
1047 	 *  12.5ms burst        +
1048 	 * >15ms delay            (XXX determine if FW does this, see set_tone)
1049 	 */
1050 	msleep((state->dsec_cmd.args[CX24116_DISEQC_MSGLEN] << 4) +
1051 		((toneburst == CX24116_DISEQC_TONEOFF) ? 30 : 60));
1052 
1053 	return 0;
1054 }
1055 
1056 /* Send DiSEqC burst */
1057 static int cx24116_diseqc_send_burst(struct dvb_frontend *fe,
1058 	fe_sec_mini_cmd_t burst)
1059 {
1060 	struct cx24116_state *state = fe->demodulator_priv;
1061 	int ret;
1062 
1063 	dprintk("%s(%d) toneburst=%d\n", __func__, burst, toneburst);
1064 
1065 	/* DiSEqC burst */
1066 	if (burst == SEC_MINI_A)
1067 		state->dsec_cmd.args[CX24116_DISEQC_BURST] =
1068 			CX24116_DISEQC_MINI_A;
1069 	else if (burst == SEC_MINI_B)
1070 		state->dsec_cmd.args[CX24116_DISEQC_BURST] =
1071 			CX24116_DISEQC_MINI_B;
1072 	else
1073 		return -EINVAL;
1074 
1075 	/* DiSEqC toneburst */
1076 	if (toneburst != CX24116_DISEQC_MESGCACHE)
1077 		/* Burst is cached */
1078 		return 0;
1079 
1080 	/* Burst is to be sent with cached message */
1081 
1082 	/* Wait for LNB ready */
1083 	ret = cx24116_wait_for_lnb(fe);
1084 	if (ret != 0)
1085 		return ret;
1086 
1087 	/* Wait for voltage/min repeat delay */
1088 	msleep(100);
1089 
1090 	/* Command */
1091 	ret = cx24116_cmd_execute(fe, &state->dsec_cmd);
1092 	if (ret != 0)
1093 		return ret;
1094 
1095 	/*
1096 	 * Wait for send
1097 	 *
1098 	 * Eutelsat spec:
1099 	 * >15ms delay          + (XXX determine if FW does this, see set_tone)
1100 	 *  13.5ms per byte     +
1101 	 * >15ms delay          +
1102 	 *  12.5ms burst        +
1103 	 * >15ms delay            (XXX determine if FW does this, see set_tone)
1104 	 */
1105 	msleep((state->dsec_cmd.args[CX24116_DISEQC_MSGLEN] << 4) + 60);
1106 
1107 	return 0;
1108 }
1109 
1110 static void cx24116_release(struct dvb_frontend *fe)
1111 {
1112 	struct cx24116_state *state = fe->demodulator_priv;
1113 	dprintk("%s\n", __func__);
1114 	kfree(state);
1115 }
1116 
1117 static struct dvb_frontend_ops cx24116_ops;
1118 
1119 struct dvb_frontend *cx24116_attach(const struct cx24116_config *config,
1120 	struct i2c_adapter *i2c)
1121 {
1122 	struct cx24116_state *state = NULL;
1123 	int ret;
1124 
1125 	dprintk("%s\n", __func__);
1126 
1127 	/* allocate memory for the internal state */
1128 	state = kzalloc(sizeof(struct cx24116_state), GFP_KERNEL);
1129 	if (state == NULL)
1130 		goto error1;
1131 
1132 	state->config = config;
1133 	state->i2c = i2c;
1134 
1135 	/* check if the demod is present */
1136 	ret = (cx24116_readreg(state, 0xFF) << 8) |
1137 		cx24116_readreg(state, 0xFE);
1138 	if (ret != 0x0501) {
1139 		printk(KERN_INFO "Invalid probe, probably not a CX24116 device\n");
1140 		goto error2;
1141 	}
1142 
1143 	/* create dvb_frontend */
1144 	memcpy(&state->frontend.ops, &cx24116_ops,
1145 		sizeof(struct dvb_frontend_ops));
1146 	state->frontend.demodulator_priv = state;
1147 	return &state->frontend;
1148 
1149 error2: kfree(state);
1150 error1: return NULL;
1151 }
1152 EXPORT_SYMBOL(cx24116_attach);
1153 
1154 /*
1155  * Initialise or wake up device
1156  *
1157  * Power config will reset and load initial firmware if required
1158  */
1159 static int cx24116_initfe(struct dvb_frontend *fe)
1160 {
1161 	struct cx24116_state *state = fe->demodulator_priv;
1162 	struct cx24116_cmd cmd;
1163 	int ret;
1164 
1165 	dprintk("%s()\n", __func__);
1166 
1167 	/* Power on */
1168 	cx24116_writereg(state, 0xe0, 0);
1169 	cx24116_writereg(state, 0xe1, 0);
1170 	cx24116_writereg(state, 0xea, 0);
1171 
1172 	/* Firmware CMD 36: Power config */
1173 	cmd.args[0x00] = CMD_TUNERSLEEP;
1174 	cmd.args[0x01] = 0;
1175 	cmd.len = 0x02;
1176 	ret = cx24116_cmd_execute(fe, &cmd);
1177 	if (ret != 0)
1178 		return ret;
1179 
1180 	ret = cx24116_diseqc_init(fe);
1181 	if (ret != 0)
1182 		return ret;
1183 
1184 	/* HVR-4000 needs this */
1185 	return cx24116_set_voltage(fe, SEC_VOLTAGE_13);
1186 }
1187 
1188 /*
1189  * Put device to sleep
1190  */
1191 static int cx24116_sleep(struct dvb_frontend *fe)
1192 {
1193 	struct cx24116_state *state = fe->demodulator_priv;
1194 	struct cx24116_cmd cmd;
1195 	int ret;
1196 
1197 	dprintk("%s()\n", __func__);
1198 
1199 	/* Firmware CMD 36: Power config */
1200 	cmd.args[0x00] = CMD_TUNERSLEEP;
1201 	cmd.args[0x01] = 1;
1202 	cmd.len = 0x02;
1203 	ret = cx24116_cmd_execute(fe, &cmd);
1204 	if (ret != 0)
1205 		return ret;
1206 
1207 	/* Power off (Shutdown clocks) */
1208 	cx24116_writereg(state, 0xea, 0xff);
1209 	cx24116_writereg(state, 0xe1, 1);
1210 	cx24116_writereg(state, 0xe0, 1);
1211 
1212 	return 0;
1213 }
1214 
1215 /* dvb-core told us to tune, the tv property cache will be complete,
1216  * it's safe for is to pull values and use them for tuning purposes.
1217  */
1218 static int cx24116_set_frontend(struct dvb_frontend *fe)
1219 {
1220 	struct cx24116_state *state = fe->demodulator_priv;
1221 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1222 	struct cx24116_cmd cmd;
1223 	fe_status_t tunerstat;
1224 	int i, status, ret, retune = 1;
1225 
1226 	dprintk("%s()\n", __func__);
1227 
1228 	switch (c->delivery_system) {
1229 	case SYS_DVBS:
1230 		dprintk("%s: DVB-S delivery system selected\n", __func__);
1231 
1232 		/* Only QPSK is supported for DVB-S */
1233 		if (c->modulation != QPSK) {
1234 			dprintk("%s: unsupported modulation selected (%d)\n",
1235 				__func__, c->modulation);
1236 			return -EOPNOTSUPP;
1237 		}
1238 
1239 		/* Pilot doesn't exist in DVB-S, turn bit off */
1240 		state->dnxt.pilot_val = CX24116_PILOT_OFF;
1241 
1242 		/* DVB-S only supports 0.35 */
1243 		if (c->rolloff != ROLLOFF_35) {
1244 			dprintk("%s: unsupported rolloff selected (%d)\n",
1245 				__func__, c->rolloff);
1246 			return -EOPNOTSUPP;
1247 		}
1248 		state->dnxt.rolloff_val = CX24116_ROLLOFF_035;
1249 		break;
1250 
1251 	case SYS_DVBS2:
1252 		dprintk("%s: DVB-S2 delivery system selected\n", __func__);
1253 
1254 		/*
1255 		 * NBC 8PSK/QPSK with DVB-S is supported for DVB-S2,
1256 		 * but not hardware auto detection
1257 		 */
1258 		if (c->modulation != PSK_8 && c->modulation != QPSK) {
1259 			dprintk("%s: unsupported modulation selected (%d)\n",
1260 				__func__, c->modulation);
1261 			return -EOPNOTSUPP;
1262 		}
1263 
1264 		switch (c->pilot) {
1265 		case PILOT_AUTO:	/* Not supported but emulated */
1266 			state->dnxt.pilot_val = (c->modulation == QPSK)
1267 				? CX24116_PILOT_OFF : CX24116_PILOT_ON;
1268 			retune++;
1269 			break;
1270 		case PILOT_OFF:
1271 			state->dnxt.pilot_val = CX24116_PILOT_OFF;
1272 			break;
1273 		case PILOT_ON:
1274 			state->dnxt.pilot_val = CX24116_PILOT_ON;
1275 			break;
1276 		default:
1277 			dprintk("%s: unsupported pilot mode selected (%d)\n",
1278 				__func__, c->pilot);
1279 			return -EOPNOTSUPP;
1280 		}
1281 
1282 		switch (c->rolloff) {
1283 		case ROLLOFF_20:
1284 			state->dnxt.rolloff_val = CX24116_ROLLOFF_020;
1285 			break;
1286 		case ROLLOFF_25:
1287 			state->dnxt.rolloff_val = CX24116_ROLLOFF_025;
1288 			break;
1289 		case ROLLOFF_35:
1290 			state->dnxt.rolloff_val = CX24116_ROLLOFF_035;
1291 			break;
1292 		case ROLLOFF_AUTO:	/* Rolloff must be explicit */
1293 		default:
1294 			dprintk("%s: unsupported rolloff selected (%d)\n",
1295 				__func__, c->rolloff);
1296 			return -EOPNOTSUPP;
1297 		}
1298 		break;
1299 
1300 	default:
1301 		dprintk("%s: unsupported delivery system selected (%d)\n",
1302 			__func__, c->delivery_system);
1303 		return -EOPNOTSUPP;
1304 	}
1305 	state->dnxt.delsys = c->delivery_system;
1306 	state->dnxt.modulation = c->modulation;
1307 	state->dnxt.frequency = c->frequency;
1308 	state->dnxt.pilot = c->pilot;
1309 	state->dnxt.rolloff = c->rolloff;
1310 
1311 	ret = cx24116_set_inversion(state, c->inversion);
1312 	if (ret !=  0)
1313 		return ret;
1314 
1315 	/* FEC_NONE/AUTO for DVB-S2 is not supported and detected here */
1316 	ret = cx24116_set_fec(state, c->delivery_system, c->modulation, c->fec_inner);
1317 	if (ret !=  0)
1318 		return ret;
1319 
1320 	ret = cx24116_set_symbolrate(state, c->symbol_rate);
1321 	if (ret !=  0)
1322 		return ret;
1323 
1324 	/* discard the 'current' tuning parameters and prepare to tune */
1325 	cx24116_clone_params(fe);
1326 
1327 	dprintk("%s:   delsys      = %d\n", __func__, state->dcur.delsys);
1328 	dprintk("%s:   modulation  = %d\n", __func__, state->dcur.modulation);
1329 	dprintk("%s:   frequency   = %d\n", __func__, state->dcur.frequency);
1330 	dprintk("%s:   pilot       = %d (val = 0x%02x)\n", __func__,
1331 		state->dcur.pilot, state->dcur.pilot_val);
1332 	dprintk("%s:   retune      = %d\n", __func__, retune);
1333 	dprintk("%s:   rolloff     = %d (val = 0x%02x)\n", __func__,
1334 		state->dcur.rolloff, state->dcur.rolloff_val);
1335 	dprintk("%s:   symbol_rate = %d\n", __func__, state->dcur.symbol_rate);
1336 	dprintk("%s:   FEC         = %d (mask/val = 0x%02x/0x%02x)\n", __func__,
1337 		state->dcur.fec, state->dcur.fec_mask, state->dcur.fec_val);
1338 	dprintk("%s:   Inversion   = %d (val = 0x%02x)\n", __func__,
1339 		state->dcur.inversion, state->dcur.inversion_val);
1340 
1341 	/* This is also done in advise/acquire on HVR4000 but not on LITE */
1342 	if (state->config->set_ts_params)
1343 		state->config->set_ts_params(fe, 0);
1344 
1345 	/* Set/Reset B/W */
1346 	cmd.args[0x00] = CMD_BANDWIDTH;
1347 	cmd.args[0x01] = 0x01;
1348 	cmd.len = 0x02;
1349 	ret = cx24116_cmd_execute(fe, &cmd);
1350 	if (ret != 0)
1351 		return ret;
1352 
1353 	/* Prepare a tune request */
1354 	cmd.args[0x00] = CMD_TUNEREQUEST;
1355 
1356 	/* Frequency */
1357 	cmd.args[0x01] = (state->dcur.frequency & 0xff0000) >> 16;
1358 	cmd.args[0x02] = (state->dcur.frequency & 0x00ff00) >> 8;
1359 	cmd.args[0x03] = (state->dcur.frequency & 0x0000ff);
1360 
1361 	/* Symbol Rate */
1362 	cmd.args[0x04] = ((state->dcur.symbol_rate / 1000) & 0xff00) >> 8;
1363 	cmd.args[0x05] = ((state->dcur.symbol_rate / 1000) & 0x00ff);
1364 
1365 	/* Automatic Inversion */
1366 	cmd.args[0x06] = state->dcur.inversion_val;
1367 
1368 	/* Modulation / FEC / Pilot */
1369 	cmd.args[0x07] = state->dcur.fec_val | state->dcur.pilot_val;
1370 
1371 	cmd.args[0x08] = CX24116_SEARCH_RANGE_KHZ >> 8;
1372 	cmd.args[0x09] = CX24116_SEARCH_RANGE_KHZ & 0xff;
1373 	cmd.args[0x0a] = 0x00;
1374 	cmd.args[0x0b] = 0x00;
1375 	cmd.args[0x0c] = state->dcur.rolloff_val;
1376 	cmd.args[0x0d] = state->dcur.fec_mask;
1377 
1378 	if (state->dcur.symbol_rate > 30000000) {
1379 		cmd.args[0x0e] = 0x04;
1380 		cmd.args[0x0f] = 0x00;
1381 		cmd.args[0x10] = 0x01;
1382 		cmd.args[0x11] = 0x77;
1383 		cmd.args[0x12] = 0x36;
1384 		cx24116_writereg(state, CX24116_REG_CLKDIV, 0x44);
1385 		cx24116_writereg(state, CX24116_REG_RATEDIV, 0x01);
1386 	} else {
1387 		cmd.args[0x0e] = 0x06;
1388 		cmd.args[0x0f] = 0x00;
1389 		cmd.args[0x10] = 0x00;
1390 		cmd.args[0x11] = 0xFA;
1391 		cmd.args[0x12] = 0x24;
1392 		cx24116_writereg(state, CX24116_REG_CLKDIV, 0x46);
1393 		cx24116_writereg(state, CX24116_REG_RATEDIV, 0x00);
1394 	}
1395 
1396 	cmd.len = 0x13;
1397 
1398 	/* We need to support pilot and non-pilot tuning in the
1399 	 * driver automatically. This is a workaround for because
1400 	 * the demod does not support autodetect.
1401 	 */
1402 	do {
1403 		/* Reset status register */
1404 		status = cx24116_readreg(state, CX24116_REG_SSTATUS)
1405 			& CX24116_SIGNAL_MASK;
1406 		cx24116_writereg(state, CX24116_REG_SSTATUS, status);
1407 
1408 		/* Tune */
1409 		ret = cx24116_cmd_execute(fe, &cmd);
1410 		if (ret != 0)
1411 			break;
1412 
1413 		/*
1414 		 * Wait for up to 500 ms before retrying
1415 		 *
1416 		 * If we are able to tune then generally it occurs within 100ms.
1417 		 * If it takes longer, try a different toneburst setting.
1418 		 */
1419 		for (i = 0; i < 50 ; i++) {
1420 			cx24116_read_status(fe, &tunerstat);
1421 			status = tunerstat & (FE_HAS_SIGNAL | FE_HAS_SYNC);
1422 			if (status == (FE_HAS_SIGNAL | FE_HAS_SYNC)) {
1423 				dprintk("%s: Tuned\n", __func__);
1424 				goto tuned;
1425 			}
1426 			msleep(10);
1427 		}
1428 
1429 		dprintk("%s: Not tuned\n", __func__);
1430 
1431 		/* Toggle pilot bit when in auto-pilot */
1432 		if (state->dcur.pilot == PILOT_AUTO)
1433 			cmd.args[0x07] ^= CX24116_PILOT_ON;
1434 	} while (--retune);
1435 
1436 tuned:  /* Set/Reset B/W */
1437 	cmd.args[0x00] = CMD_BANDWIDTH;
1438 	cmd.args[0x01] = 0x00;
1439 	cmd.len = 0x02;
1440 	return cx24116_cmd_execute(fe, &cmd);
1441 }
1442 
1443 static int cx24116_tune(struct dvb_frontend *fe, bool re_tune,
1444 	unsigned int mode_flags, unsigned int *delay, fe_status_t *status)
1445 {
1446 	/*
1447 	 * It is safe to discard "params" here, as the DVB core will sync
1448 	 * fe->dtv_property_cache with fepriv->parameters_in, where the
1449 	 * DVBv3 params are stored. The only practical usage for it indicate
1450 	 * that re-tuning is needed, e. g. (fepriv->state & FESTATE_RETUNE) is
1451 	 * true.
1452 	 */
1453 
1454 	*delay = HZ / 5;
1455 	if (re_tune) {
1456 		int ret = cx24116_set_frontend(fe);
1457 		if (ret)
1458 			return ret;
1459 	}
1460 	return cx24116_read_status(fe, status);
1461 }
1462 
1463 static int cx24116_get_algo(struct dvb_frontend *fe)
1464 {
1465 	return DVBFE_ALGO_HW;
1466 }
1467 
1468 static struct dvb_frontend_ops cx24116_ops = {
1469 	.delsys = { SYS_DVBS, SYS_DVBS2 },
1470 	.info = {
1471 		.name = "Conexant CX24116/CX24118",
1472 		.frequency_min = 950000,
1473 		.frequency_max = 2150000,
1474 		.frequency_stepsize = 1011, /* kHz for QPSK frontends */
1475 		.frequency_tolerance = 5000,
1476 		.symbol_rate_min = 1000000,
1477 		.symbol_rate_max = 45000000,
1478 		.caps = FE_CAN_INVERSION_AUTO |
1479 			FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
1480 			FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
1481 			FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
1482 			FE_CAN_2G_MODULATION |
1483 			FE_CAN_QPSK | FE_CAN_RECOVER
1484 	},
1485 
1486 	.release = cx24116_release,
1487 
1488 	.init = cx24116_initfe,
1489 	.sleep = cx24116_sleep,
1490 	.read_status = cx24116_read_status,
1491 	.read_ber = cx24116_read_ber,
1492 	.read_signal_strength = cx24116_read_signal_strength,
1493 	.read_snr = cx24116_read_snr,
1494 	.read_ucblocks = cx24116_read_ucblocks,
1495 	.set_tone = cx24116_set_tone,
1496 	.set_voltage = cx24116_set_voltage,
1497 	.diseqc_send_master_cmd = cx24116_send_diseqc_msg,
1498 	.diseqc_send_burst = cx24116_diseqc_send_burst,
1499 	.get_frontend_algo = cx24116_get_algo,
1500 	.tune = cx24116_tune,
1501 
1502 	.set_frontend = cx24116_set_frontend,
1503 };
1504 
1505 MODULE_DESCRIPTION("DVB Frontend module for Conexant cx24116/cx24118 hardware");
1506 MODULE_AUTHOR("Steven Toth");
1507 MODULE_LICENSE("GPL");
1508 
1509