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 	enum fe_spectral_inversion inversion;
164 	enum fe_code_rate fec;
165 
166 	enum fe_delivery_system delsys;
167 	enum fe_modulation modulation;
168 	enum fe_pilot pilot;
169 	enum fe_rolloff 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 	enum fe_spectral_inversion 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 	enum fe_delivery_system delivery_system;
377 	enum fe_modulation modulation;
378 	enum fe_code_rate 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 	enum fe_delivery_system d, enum fe_modulation m, enum fe_code_rate 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 			   enum fe_delivery_system delsys,
438 			   enum fe_modulation mod,
439 			   enum fe_code_rate fec)
440 {
441 	int ret = 0;
442 
443 	dprintk("%s(0x%02x,0x%02x)\n", __func__, mod, fec);
444 
445 	ret = cx24116_lookup_fecmod(state, delsys, mod, fec);
446 
447 	if (ret < 0)
448 		return ret;
449 
450 	state->dnxt.fec = fec;
451 	state->dnxt.fec_val = CX24116_MODFEC_MODES[ret].val;
452 	state->dnxt.fec_mask = CX24116_MODFEC_MODES[ret].mask;
453 	dprintk("%s() mask/val = 0x%02x/0x%02x\n", __func__,
454 		state->dnxt.fec_mask, state->dnxt.fec_val);
455 
456 	return 0;
457 }
458 
459 static int cx24116_set_symbolrate(struct cx24116_state *state, u32 rate)
460 {
461 	dprintk("%s(%d)\n", __func__, rate);
462 
463 	/*  check if symbol rate is within limits */
464 	if ((rate > state->frontend.ops.info.symbol_rate_max) ||
465 	    (rate < state->frontend.ops.info.symbol_rate_min)) {
466 		dprintk("%s() unsupported symbol_rate = %d\n", __func__, rate);
467 		return -EOPNOTSUPP;
468 	}
469 
470 	state->dnxt.symbol_rate = rate;
471 	dprintk("%s() symbol_rate = %d\n", __func__, rate);
472 
473 	return 0;
474 }
475 
476 static int cx24116_load_firmware(struct dvb_frontend *fe,
477 	const struct firmware *fw);
478 
479 static int cx24116_firmware_ondemand(struct dvb_frontend *fe)
480 {
481 	struct cx24116_state *state = fe->demodulator_priv;
482 	const struct firmware *fw;
483 	int ret = 0;
484 
485 	dprintk("%s()\n", __func__);
486 
487 	if (cx24116_readreg(state, 0x20) > 0) {
488 
489 		if (state->skip_fw_load)
490 			return 0;
491 
492 		/* Load firmware */
493 		/* request the firmware, this will block until loaded */
494 		printk(KERN_INFO "%s: Waiting for firmware upload (%s)...\n",
495 			__func__, CX24116_DEFAULT_FIRMWARE);
496 		ret = request_firmware(&fw, CX24116_DEFAULT_FIRMWARE,
497 			state->i2c->dev.parent);
498 		printk(KERN_INFO "%s: Waiting for firmware upload(2)...\n",
499 			__func__);
500 		if (ret) {
501 			printk(KERN_ERR "%s: No firmware uploaded "
502 				"(timeout or file not found?)\n", __func__);
503 			return ret;
504 		}
505 
506 		/* Make sure we don't recurse back through here
507 		 * during loading */
508 		state->skip_fw_load = 1;
509 
510 		ret = cx24116_load_firmware(fe, fw);
511 		if (ret)
512 			printk(KERN_ERR "%s: Writing firmware to device failed\n",
513 				__func__);
514 
515 		release_firmware(fw);
516 
517 		printk(KERN_INFO "%s: Firmware upload %s\n", __func__,
518 			ret == 0 ? "complete" : "failed");
519 
520 		/* Ensure firmware is always loaded if required */
521 		state->skip_fw_load = 0;
522 	}
523 
524 	return ret;
525 }
526 
527 /* Take a basic firmware command structure, format it
528  * and forward it for processing
529  */
530 static int cx24116_cmd_execute(struct dvb_frontend *fe, struct cx24116_cmd *cmd)
531 {
532 	struct cx24116_state *state = fe->demodulator_priv;
533 	int i, ret;
534 
535 	dprintk("%s()\n", __func__);
536 
537 	/* Load the firmware if required */
538 	ret = cx24116_firmware_ondemand(fe);
539 	if (ret != 0) {
540 		printk(KERN_ERR "%s(): Unable initialise the firmware\n",
541 			__func__);
542 		return ret;
543 	}
544 
545 	/* Write the command */
546 	for (i = 0; i < cmd->len ; i++) {
547 		dprintk("%s: 0x%02x == 0x%02x\n", __func__, i, cmd->args[i]);
548 		cx24116_writereg(state, i, cmd->args[i]);
549 	}
550 
551 	/* Start execution and wait for cmd to terminate */
552 	cx24116_writereg(state, CX24116_REG_EXECUTE, 0x01);
553 	while (cx24116_readreg(state, CX24116_REG_EXECUTE)) {
554 		msleep(10);
555 		if (i++ > 64) {
556 			/* Avoid looping forever if the firmware does
557 				not respond */
558 			printk(KERN_WARNING "%s() Firmware not responding\n",
559 				__func__);
560 			return -EREMOTEIO;
561 		}
562 	}
563 	return 0;
564 }
565 
566 static int cx24116_load_firmware(struct dvb_frontend *fe,
567 	const struct firmware *fw)
568 {
569 	struct cx24116_state *state = fe->demodulator_priv;
570 	struct cx24116_cmd cmd;
571 	int i, ret, len, max, remaining;
572 	unsigned char vers[4];
573 
574 	dprintk("%s\n", __func__);
575 	dprintk("Firmware is %zu bytes (%02x %02x .. %02x %02x)\n",
576 			fw->size,
577 			fw->data[0],
578 			fw->data[1],
579 			fw->data[fw->size-2],
580 			fw->data[fw->size-1]);
581 
582 	/* Toggle 88x SRST pin to reset demod */
583 	if (state->config->reset_device)
584 		state->config->reset_device(fe);
585 
586 	/* Begin the firmware load process */
587 	/* Prepare the demod, load the firmware, cleanup after load */
588 
589 	/* Init PLL */
590 	cx24116_writereg(state, 0xE5, 0x00);
591 	cx24116_writereg(state, 0xF1, 0x08);
592 	cx24116_writereg(state, 0xF2, 0x13);
593 
594 	/* Start PLL */
595 	cx24116_writereg(state, 0xe0, 0x03);
596 	cx24116_writereg(state, 0xe0, 0x00);
597 
598 	/* Unknown */
599 	cx24116_writereg(state, CX24116_REG_CLKDIV, 0x46);
600 	cx24116_writereg(state, CX24116_REG_RATEDIV, 0x00);
601 
602 	/* Unknown */
603 	cx24116_writereg(state, 0xF0, 0x03);
604 	cx24116_writereg(state, 0xF4, 0x81);
605 	cx24116_writereg(state, 0xF5, 0x00);
606 	cx24116_writereg(state, 0xF6, 0x00);
607 
608 	/* Split firmware to the max I2C write len and write.
609 	 * Writes whole firmware as one write when i2c_wr_max is set to 0. */
610 	if (state->config->i2c_wr_max)
611 		max = state->config->i2c_wr_max;
612 	else
613 		max = INT_MAX; /* enough for 32k firmware */
614 
615 	for (remaining = fw->size; remaining > 0; remaining -= max - 1) {
616 		len = remaining;
617 		if (len > max - 1)
618 			len = max - 1;
619 
620 		cx24116_writeregN(state, 0xF7, &fw->data[fw->size - remaining],
621 			len);
622 	}
623 
624 	cx24116_writereg(state, 0xF4, 0x10);
625 	cx24116_writereg(state, 0xF0, 0x00);
626 	cx24116_writereg(state, 0xF8, 0x06);
627 
628 	/* Firmware CMD 10: VCO config */
629 	cmd.args[0x00] = CMD_SET_VCO;
630 	cmd.args[0x01] = 0x05;
631 	cmd.args[0x02] = 0xdc;
632 	cmd.args[0x03] = 0xda;
633 	cmd.args[0x04] = 0xae;
634 	cmd.args[0x05] = 0xaa;
635 	cmd.args[0x06] = 0x04;
636 	cmd.args[0x07] = 0x9d;
637 	cmd.args[0x08] = 0xfc;
638 	cmd.args[0x09] = 0x06;
639 	cmd.len = 0x0a;
640 	ret = cx24116_cmd_execute(fe, &cmd);
641 	if (ret != 0)
642 		return ret;
643 
644 	cx24116_writereg(state, CX24116_REG_SSTATUS, 0x00);
645 
646 	/* Firmware CMD 14: Tuner config */
647 	cmd.args[0x00] = CMD_TUNERINIT;
648 	cmd.args[0x01] = 0x00;
649 	cmd.args[0x02] = 0x00;
650 	cmd.len = 0x03;
651 	ret = cx24116_cmd_execute(fe, &cmd);
652 	if (ret != 0)
653 		return ret;
654 
655 	cx24116_writereg(state, 0xe5, 0x00);
656 
657 	/* Firmware CMD 13: MPEG config */
658 	cmd.args[0x00] = CMD_MPEGCONFIG;
659 	cmd.args[0x01] = 0x01;
660 	cmd.args[0x02] = 0x75;
661 	cmd.args[0x03] = 0x00;
662 	if (state->config->mpg_clk_pos_pol)
663 		cmd.args[0x04] = state->config->mpg_clk_pos_pol;
664 	else
665 		cmd.args[0x04] = 0x02;
666 	cmd.args[0x05] = 0x00;
667 	cmd.len = 0x06;
668 	ret = cx24116_cmd_execute(fe, &cmd);
669 	if (ret != 0)
670 		return ret;
671 
672 	/* Firmware CMD 35: Get firmware version */
673 	cmd.args[0x00] = CMD_UPDFWVERS;
674 	cmd.len = 0x02;
675 	for (i = 0; i < 4; i++) {
676 		cmd.args[0x01] = i;
677 		ret = cx24116_cmd_execute(fe, &cmd);
678 		if (ret != 0)
679 			return ret;
680 		vers[i] = cx24116_readreg(state, CX24116_REG_MAILBOX);
681 	}
682 	printk(KERN_INFO "%s: FW version %i.%i.%i.%i\n", __func__,
683 		vers[0], vers[1], vers[2], vers[3]);
684 
685 	return 0;
686 }
687 
688 static int cx24116_read_status(struct dvb_frontend *fe, enum fe_status *status)
689 {
690 	struct cx24116_state *state = fe->demodulator_priv;
691 
692 	int lock = cx24116_readreg(state, CX24116_REG_SSTATUS) &
693 		CX24116_STATUS_MASK;
694 
695 	dprintk("%s: status = 0x%02x\n", __func__, lock);
696 
697 	*status = 0;
698 
699 	if (lock & CX24116_HAS_SIGNAL)
700 		*status |= FE_HAS_SIGNAL;
701 	if (lock & CX24116_HAS_CARRIER)
702 		*status |= FE_HAS_CARRIER;
703 	if (lock & CX24116_HAS_VITERBI)
704 		*status |= FE_HAS_VITERBI;
705 	if (lock & CX24116_HAS_SYNCLOCK)
706 		*status |= FE_HAS_SYNC | FE_HAS_LOCK;
707 
708 	return 0;
709 }
710 
711 static int cx24116_read_ber(struct dvb_frontend *fe, u32 *ber)
712 {
713 	struct cx24116_state *state = fe->demodulator_priv;
714 
715 	dprintk("%s()\n", __func__);
716 
717 	*ber =  (cx24116_readreg(state, CX24116_REG_BER24) << 24) |
718 		(cx24116_readreg(state, CX24116_REG_BER16) << 16) |
719 		(cx24116_readreg(state, CX24116_REG_BER8)  << 8)  |
720 		 cx24116_readreg(state, CX24116_REG_BER0);
721 
722 	return 0;
723 }
724 
725 /* TODO Determine function and scale appropriately */
726 static int cx24116_read_signal_strength(struct dvb_frontend *fe,
727 	u16 *signal_strength)
728 {
729 	struct cx24116_state *state = fe->demodulator_priv;
730 	struct cx24116_cmd cmd;
731 	int ret;
732 	u16 sig_reading;
733 
734 	dprintk("%s()\n", __func__);
735 
736 	/* Firmware CMD 19: Get AGC */
737 	cmd.args[0x00] = CMD_GETAGC;
738 	cmd.len = 0x01;
739 	ret = cx24116_cmd_execute(fe, &cmd);
740 	if (ret != 0)
741 		return ret;
742 
743 	sig_reading =
744 		(cx24116_readreg(state,
745 			CX24116_REG_SSTATUS) & CX24116_SIGNAL_MASK) |
746 		(cx24116_readreg(state, CX24116_REG_SIGNAL) << 6);
747 	*signal_strength = 0 - sig_reading;
748 
749 	dprintk("%s: raw / cooked = 0x%04x / 0x%04x\n",
750 		__func__, sig_reading, *signal_strength);
751 
752 	return 0;
753 }
754 
755 /* SNR (0..100)% = (sig & 0xf0) * 10 + (sig & 0x0f) * 10 / 16 */
756 static int cx24116_read_snr_pct(struct dvb_frontend *fe, u16 *snr)
757 {
758 	struct cx24116_state *state = fe->demodulator_priv;
759 	u8 snr_reading;
760 	static const u32 snr_tab[] = { /* 10 x Table (rounded up) */
761 		0x00000, 0x0199A, 0x03333, 0x04ccD, 0x06667,
762 		0x08000, 0x0999A, 0x0b333, 0x0cccD, 0x0e667,
763 		0x10000, 0x1199A, 0x13333, 0x14ccD, 0x16667,
764 		0x18000 };
765 
766 	dprintk("%s()\n", __func__);
767 
768 	snr_reading = cx24116_readreg(state, CX24116_REG_QUALITY0);
769 
770 	if (snr_reading >= 0xa0 /* 100% */)
771 		*snr = 0xffff;
772 	else
773 		*snr = snr_tab[(snr_reading & 0xf0) >> 4] +
774 			(snr_tab[(snr_reading & 0x0f)] >> 4);
775 
776 	dprintk("%s: raw / cooked = 0x%02x / 0x%04x\n", __func__,
777 		snr_reading, *snr);
778 
779 	return 0;
780 }
781 
782 /* The reelbox patches show the value in the registers represents
783  * ESNO, from 0->30db (values 0->300). We provide this value by
784  * default.
785  */
786 static int cx24116_read_snr_esno(struct dvb_frontend *fe, u16 *snr)
787 {
788 	struct cx24116_state *state = fe->demodulator_priv;
789 
790 	dprintk("%s()\n", __func__);
791 
792 	*snr = cx24116_readreg(state, CX24116_REG_QUALITY8) << 8 |
793 		cx24116_readreg(state, CX24116_REG_QUALITY0);
794 
795 	dprintk("%s: raw 0x%04x\n", __func__, *snr);
796 
797 	return 0;
798 }
799 
800 static int cx24116_read_snr(struct dvb_frontend *fe, u16 *snr)
801 {
802 	if (esno_snr == 1)
803 		return cx24116_read_snr_esno(fe, snr);
804 	else
805 		return cx24116_read_snr_pct(fe, snr);
806 }
807 
808 static int cx24116_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
809 {
810 	struct cx24116_state *state = fe->demodulator_priv;
811 
812 	dprintk("%s()\n", __func__);
813 
814 	*ucblocks = (cx24116_readreg(state, CX24116_REG_UCB8) << 8) |
815 		cx24116_readreg(state, CX24116_REG_UCB0);
816 
817 	return 0;
818 }
819 
820 /* Overwrite the current tuning params, we are about to tune */
821 static void cx24116_clone_params(struct dvb_frontend *fe)
822 {
823 	struct cx24116_state *state = fe->demodulator_priv;
824 	state->dcur = state->dnxt;
825 }
826 
827 /* Wait for LNB */
828 static int cx24116_wait_for_lnb(struct dvb_frontend *fe)
829 {
830 	struct cx24116_state *state = fe->demodulator_priv;
831 	int i;
832 
833 	dprintk("%s() qstatus = 0x%02x\n", __func__,
834 		cx24116_readreg(state, CX24116_REG_QSTATUS));
835 
836 	/* Wait for up to 300 ms */
837 	for (i = 0; i < 30 ; i++) {
838 		if (cx24116_readreg(state, CX24116_REG_QSTATUS) & 0x20)
839 			return 0;
840 		msleep(10);
841 	}
842 
843 	dprintk("%s(): LNB not ready\n", __func__);
844 
845 	return -ETIMEDOUT; /* -EBUSY ? */
846 }
847 
848 static int cx24116_set_voltage(struct dvb_frontend *fe,
849 	enum fe_sec_voltage voltage)
850 {
851 	struct cx24116_cmd cmd;
852 	int ret;
853 
854 	dprintk("%s: %s\n", __func__,
855 		voltage == SEC_VOLTAGE_13 ? "SEC_VOLTAGE_13" :
856 		voltage == SEC_VOLTAGE_18 ? "SEC_VOLTAGE_18" : "??");
857 
858 	/* Wait for LNB ready */
859 	ret = cx24116_wait_for_lnb(fe);
860 	if (ret != 0)
861 		return ret;
862 
863 	/* Wait for voltage/min repeat delay */
864 	msleep(100);
865 
866 	cmd.args[0x00] = CMD_LNBDCLEVEL;
867 	cmd.args[0x01] = (voltage == SEC_VOLTAGE_18 ? 0x01 : 0x00);
868 	cmd.len = 0x02;
869 
870 	/* Min delay time before DiSEqC send */
871 	msleep(15);
872 
873 	return cx24116_cmd_execute(fe, &cmd);
874 }
875 
876 static int cx24116_set_tone(struct dvb_frontend *fe,
877 	enum fe_sec_tone_mode tone)
878 {
879 	struct cx24116_cmd cmd;
880 	int ret;
881 
882 	dprintk("%s(%d)\n", __func__, tone);
883 	if ((tone != SEC_TONE_ON) && (tone != SEC_TONE_OFF)) {
884 		printk(KERN_ERR "%s: Invalid, tone=%d\n", __func__, tone);
885 		return -EINVAL;
886 	}
887 
888 	/* Wait for LNB ready */
889 	ret = cx24116_wait_for_lnb(fe);
890 	if (ret != 0)
891 		return ret;
892 
893 	/* Min delay time after DiSEqC send */
894 	msleep(15); /* XXX determine is FW does this, see send_diseqc/burst */
895 
896 	/* Now we set the tone */
897 	cmd.args[0x00] = CMD_SET_TONE;
898 	cmd.args[0x01] = 0x00;
899 	cmd.args[0x02] = 0x00;
900 
901 	switch (tone) {
902 	case SEC_TONE_ON:
903 		dprintk("%s: setting tone on\n", __func__);
904 		cmd.args[0x03] = 0x01;
905 		break;
906 	case SEC_TONE_OFF:
907 		dprintk("%s: setting tone off\n", __func__);
908 		cmd.args[0x03] = 0x00;
909 		break;
910 	}
911 	cmd.len = 0x04;
912 
913 	/* Min delay time before DiSEqC send */
914 	msleep(15); /* XXX determine is FW does this, see send_diseqc/burst */
915 
916 	return cx24116_cmd_execute(fe, &cmd);
917 }
918 
919 /* Initialise DiSEqC */
920 static int cx24116_diseqc_init(struct dvb_frontend *fe)
921 {
922 	struct cx24116_state *state = fe->demodulator_priv;
923 	struct cx24116_cmd cmd;
924 	int ret;
925 
926 	/* Firmware CMD 20: LNB/DiSEqC config */
927 	cmd.args[0x00] = CMD_LNBCONFIG;
928 	cmd.args[0x01] = 0x00;
929 	cmd.args[0x02] = 0x10;
930 	cmd.args[0x03] = 0x00;
931 	cmd.args[0x04] = 0x8f;
932 	cmd.args[0x05] = 0x28;
933 	cmd.args[0x06] = (toneburst == CX24116_DISEQC_TONEOFF) ? 0x00 : 0x01;
934 	cmd.args[0x07] = 0x01;
935 	cmd.len = 0x08;
936 	ret = cx24116_cmd_execute(fe, &cmd);
937 	if (ret != 0)
938 		return ret;
939 
940 	/* Prepare a DiSEqC command */
941 	state->dsec_cmd.args[0x00] = CMD_LNBSEND;
942 
943 	/* DiSEqC burst */
944 	state->dsec_cmd.args[CX24116_DISEQC_BURST]  = CX24116_DISEQC_MINI_A;
945 
946 	/* Unknown */
947 	state->dsec_cmd.args[CX24116_DISEQC_ARG2_2] = 0x02;
948 	state->dsec_cmd.args[CX24116_DISEQC_ARG3_0] = 0x00;
949 	/* Continuation flag? */
950 	state->dsec_cmd.args[CX24116_DISEQC_ARG4_0] = 0x00;
951 
952 	/* DiSEqC message length */
953 	state->dsec_cmd.args[CX24116_DISEQC_MSGLEN] = 0x00;
954 
955 	/* Command length */
956 	state->dsec_cmd.len = CX24116_DISEQC_MSGOFS;
957 
958 	return 0;
959 }
960 
961 /* Send DiSEqC message with derived burst (hack) || previous burst */
962 static int cx24116_send_diseqc_msg(struct dvb_frontend *fe,
963 	struct dvb_diseqc_master_cmd *d)
964 {
965 	struct cx24116_state *state = fe->demodulator_priv;
966 	int i, ret;
967 
968 	/* Validate length */
969 	if (d->msg_len > sizeof(d->msg))
970                 return -EINVAL;
971 
972 	/* Dump DiSEqC message */
973 	if (debug) {
974 		printk(KERN_INFO "cx24116: %s(", __func__);
975 		for (i = 0 ; i < d->msg_len ;) {
976 			printk(KERN_INFO "0x%02x", d->msg[i]);
977 			if (++i < d->msg_len)
978 				printk(KERN_INFO ", ");
979 		}
980 		printk(") toneburst=%d\n", toneburst);
981 	}
982 
983 	/* DiSEqC message */
984 	for (i = 0; i < d->msg_len; i++)
985 		state->dsec_cmd.args[CX24116_DISEQC_MSGOFS + i] = d->msg[i];
986 
987 	/* DiSEqC message length */
988 	state->dsec_cmd.args[CX24116_DISEQC_MSGLEN] = d->msg_len;
989 
990 	/* Command length */
991 	state->dsec_cmd.len = CX24116_DISEQC_MSGOFS +
992 		state->dsec_cmd.args[CX24116_DISEQC_MSGLEN];
993 
994 	/* DiSEqC toneburst */
995 	if (toneburst == CX24116_DISEQC_MESGCACHE)
996 		/* Message is cached */
997 		return 0;
998 
999 	else if (toneburst == CX24116_DISEQC_TONEOFF)
1000 		/* Message is sent without burst */
1001 		state->dsec_cmd.args[CX24116_DISEQC_BURST] = 0;
1002 
1003 	else if (toneburst == CX24116_DISEQC_TONECACHE) {
1004 		/*
1005 		 * Message is sent with derived else cached burst
1006 		 *
1007 		 * WRITE PORT GROUP COMMAND 38
1008 		 *
1009 		 * 0/A/A: E0 10 38 F0..F3
1010 		 * 1/B/B: E0 10 38 F4..F7
1011 		 * 2/C/A: E0 10 38 F8..FB
1012 		 * 3/D/B: E0 10 38 FC..FF
1013 		 *
1014 		 * databyte[3]= 8421:8421
1015 		 *              ABCD:WXYZ
1016 		 *              CLR :SET
1017 		 *
1018 		 *              WX= PORT SELECT 0..3    (X=TONEBURST)
1019 		 *              Y = VOLTAGE             (0=13V, 1=18V)
1020 		 *              Z = BAND                (0=LOW, 1=HIGH(22K))
1021 		 */
1022 		if (d->msg_len >= 4 && d->msg[2] == 0x38)
1023 			state->dsec_cmd.args[CX24116_DISEQC_BURST] =
1024 				((d->msg[3] & 4) >> 2);
1025 		if (debug)
1026 			dprintk("%s burst=%d\n", __func__,
1027 				state->dsec_cmd.args[CX24116_DISEQC_BURST]);
1028 	}
1029 
1030 	/* Wait for LNB ready */
1031 	ret = cx24116_wait_for_lnb(fe);
1032 	if (ret != 0)
1033 		return ret;
1034 
1035 	/* Wait for voltage/min repeat delay */
1036 	msleep(100);
1037 
1038 	/* Command */
1039 	ret = cx24116_cmd_execute(fe, &state->dsec_cmd);
1040 	if (ret != 0)
1041 		return ret;
1042 	/*
1043 	 * Wait for send
1044 	 *
1045 	 * Eutelsat spec:
1046 	 * >15ms delay          + (XXX determine if FW does this, see set_tone)
1047 	 *  13.5ms per byte     +
1048 	 * >15ms delay          +
1049 	 *  12.5ms burst        +
1050 	 * >15ms delay            (XXX determine if FW does this, see set_tone)
1051 	 */
1052 	msleep((state->dsec_cmd.args[CX24116_DISEQC_MSGLEN] << 4) +
1053 		((toneburst == CX24116_DISEQC_TONEOFF) ? 30 : 60));
1054 
1055 	return 0;
1056 }
1057 
1058 /* Send DiSEqC burst */
1059 static int cx24116_diseqc_send_burst(struct dvb_frontend *fe,
1060 	enum fe_sec_mini_cmd burst)
1061 {
1062 	struct cx24116_state *state = fe->demodulator_priv;
1063 	int ret;
1064 
1065 	dprintk("%s(%d) toneburst=%d\n", __func__, burst, toneburst);
1066 
1067 	/* DiSEqC burst */
1068 	if (burst == SEC_MINI_A)
1069 		state->dsec_cmd.args[CX24116_DISEQC_BURST] =
1070 			CX24116_DISEQC_MINI_A;
1071 	else if (burst == SEC_MINI_B)
1072 		state->dsec_cmd.args[CX24116_DISEQC_BURST] =
1073 			CX24116_DISEQC_MINI_B;
1074 	else
1075 		return -EINVAL;
1076 
1077 	/* DiSEqC toneburst */
1078 	if (toneburst != CX24116_DISEQC_MESGCACHE)
1079 		/* Burst is cached */
1080 		return 0;
1081 
1082 	/* Burst is to be sent with cached message */
1083 
1084 	/* Wait for LNB ready */
1085 	ret = cx24116_wait_for_lnb(fe);
1086 	if (ret != 0)
1087 		return ret;
1088 
1089 	/* Wait for voltage/min repeat delay */
1090 	msleep(100);
1091 
1092 	/* Command */
1093 	ret = cx24116_cmd_execute(fe, &state->dsec_cmd);
1094 	if (ret != 0)
1095 		return ret;
1096 
1097 	/*
1098 	 * Wait for send
1099 	 *
1100 	 * Eutelsat spec:
1101 	 * >15ms delay          + (XXX determine if FW does this, see set_tone)
1102 	 *  13.5ms per byte     +
1103 	 * >15ms delay          +
1104 	 *  12.5ms burst        +
1105 	 * >15ms delay            (XXX determine if FW does this, see set_tone)
1106 	 */
1107 	msleep((state->dsec_cmd.args[CX24116_DISEQC_MSGLEN] << 4) + 60);
1108 
1109 	return 0;
1110 }
1111 
1112 static void cx24116_release(struct dvb_frontend *fe)
1113 {
1114 	struct cx24116_state *state = fe->demodulator_priv;
1115 	dprintk("%s\n", __func__);
1116 	kfree(state);
1117 }
1118 
1119 static struct dvb_frontend_ops cx24116_ops;
1120 
1121 struct dvb_frontend *cx24116_attach(const struct cx24116_config *config,
1122 	struct i2c_adapter *i2c)
1123 {
1124 	struct cx24116_state *state = NULL;
1125 	int ret;
1126 
1127 	dprintk("%s\n", __func__);
1128 
1129 	/* allocate memory for the internal state */
1130 	state = kzalloc(sizeof(struct cx24116_state), GFP_KERNEL);
1131 	if (state == NULL)
1132 		goto error1;
1133 
1134 	state->config = config;
1135 	state->i2c = i2c;
1136 
1137 	/* check if the demod is present */
1138 	ret = (cx24116_readreg(state, 0xFF) << 8) |
1139 		cx24116_readreg(state, 0xFE);
1140 	if (ret != 0x0501) {
1141 		printk(KERN_INFO "Invalid probe, probably not a CX24116 device\n");
1142 		goto error2;
1143 	}
1144 
1145 	/* create dvb_frontend */
1146 	memcpy(&state->frontend.ops, &cx24116_ops,
1147 		sizeof(struct dvb_frontend_ops));
1148 	state->frontend.demodulator_priv = state;
1149 	return &state->frontend;
1150 
1151 error2: kfree(state);
1152 error1: return NULL;
1153 }
1154 EXPORT_SYMBOL(cx24116_attach);
1155 
1156 /*
1157  * Initialise or wake up device
1158  *
1159  * Power config will reset and load initial firmware if required
1160  */
1161 static int cx24116_initfe(struct dvb_frontend *fe)
1162 {
1163 	struct cx24116_state *state = fe->demodulator_priv;
1164 	struct cx24116_cmd cmd;
1165 	int ret;
1166 
1167 	dprintk("%s()\n", __func__);
1168 
1169 	/* Power on */
1170 	cx24116_writereg(state, 0xe0, 0);
1171 	cx24116_writereg(state, 0xe1, 0);
1172 	cx24116_writereg(state, 0xea, 0);
1173 
1174 	/* Firmware CMD 36: Power config */
1175 	cmd.args[0x00] = CMD_TUNERSLEEP;
1176 	cmd.args[0x01] = 0;
1177 	cmd.len = 0x02;
1178 	ret = cx24116_cmd_execute(fe, &cmd);
1179 	if (ret != 0)
1180 		return ret;
1181 
1182 	ret = cx24116_diseqc_init(fe);
1183 	if (ret != 0)
1184 		return ret;
1185 
1186 	/* HVR-4000 needs this */
1187 	return cx24116_set_voltage(fe, SEC_VOLTAGE_13);
1188 }
1189 
1190 /*
1191  * Put device to sleep
1192  */
1193 static int cx24116_sleep(struct dvb_frontend *fe)
1194 {
1195 	struct cx24116_state *state = fe->demodulator_priv;
1196 	struct cx24116_cmd cmd;
1197 	int ret;
1198 
1199 	dprintk("%s()\n", __func__);
1200 
1201 	/* Firmware CMD 36: Power config */
1202 	cmd.args[0x00] = CMD_TUNERSLEEP;
1203 	cmd.args[0x01] = 1;
1204 	cmd.len = 0x02;
1205 	ret = cx24116_cmd_execute(fe, &cmd);
1206 	if (ret != 0)
1207 		return ret;
1208 
1209 	/* Power off (Shutdown clocks) */
1210 	cx24116_writereg(state, 0xea, 0xff);
1211 	cx24116_writereg(state, 0xe1, 1);
1212 	cx24116_writereg(state, 0xe0, 1);
1213 
1214 	return 0;
1215 }
1216 
1217 /* dvb-core told us to tune, the tv property cache will be complete,
1218  * it's safe for is to pull values and use them for tuning purposes.
1219  */
1220 static int cx24116_set_frontend(struct dvb_frontend *fe)
1221 {
1222 	struct cx24116_state *state = fe->demodulator_priv;
1223 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1224 	struct cx24116_cmd cmd;
1225 	enum fe_status tunerstat;
1226 	int i, status, ret, retune = 1;
1227 
1228 	dprintk("%s()\n", __func__);
1229 
1230 	switch (c->delivery_system) {
1231 	case SYS_DVBS:
1232 		dprintk("%s: DVB-S delivery system selected\n", __func__);
1233 
1234 		/* Only QPSK is supported for DVB-S */
1235 		if (c->modulation != QPSK) {
1236 			dprintk("%s: unsupported modulation selected (%d)\n",
1237 				__func__, c->modulation);
1238 			return -EOPNOTSUPP;
1239 		}
1240 
1241 		/* Pilot doesn't exist in DVB-S, turn bit off */
1242 		state->dnxt.pilot_val = CX24116_PILOT_OFF;
1243 
1244 		/* DVB-S only supports 0.35 */
1245 		if (c->rolloff != ROLLOFF_35) {
1246 			dprintk("%s: unsupported rolloff selected (%d)\n",
1247 				__func__, c->rolloff);
1248 			return -EOPNOTSUPP;
1249 		}
1250 		state->dnxt.rolloff_val = CX24116_ROLLOFF_035;
1251 		break;
1252 
1253 	case SYS_DVBS2:
1254 		dprintk("%s: DVB-S2 delivery system selected\n", __func__);
1255 
1256 		/*
1257 		 * NBC 8PSK/QPSK with DVB-S is supported for DVB-S2,
1258 		 * but not hardware auto detection
1259 		 */
1260 		if (c->modulation != PSK_8 && c->modulation != QPSK) {
1261 			dprintk("%s: unsupported modulation selected (%d)\n",
1262 				__func__, c->modulation);
1263 			return -EOPNOTSUPP;
1264 		}
1265 
1266 		switch (c->pilot) {
1267 		case PILOT_AUTO:	/* Not supported but emulated */
1268 			state->dnxt.pilot_val = (c->modulation == QPSK)
1269 				? CX24116_PILOT_OFF : CX24116_PILOT_ON;
1270 			retune++;
1271 			break;
1272 		case PILOT_OFF:
1273 			state->dnxt.pilot_val = CX24116_PILOT_OFF;
1274 			break;
1275 		case PILOT_ON:
1276 			state->dnxt.pilot_val = CX24116_PILOT_ON;
1277 			break;
1278 		default:
1279 			dprintk("%s: unsupported pilot mode selected (%d)\n",
1280 				__func__, c->pilot);
1281 			return -EOPNOTSUPP;
1282 		}
1283 
1284 		switch (c->rolloff) {
1285 		case ROLLOFF_20:
1286 			state->dnxt.rolloff_val = CX24116_ROLLOFF_020;
1287 			break;
1288 		case ROLLOFF_25:
1289 			state->dnxt.rolloff_val = CX24116_ROLLOFF_025;
1290 			break;
1291 		case ROLLOFF_35:
1292 			state->dnxt.rolloff_val = CX24116_ROLLOFF_035;
1293 			break;
1294 		case ROLLOFF_AUTO:	/* Rolloff must be explicit */
1295 		default:
1296 			dprintk("%s: unsupported rolloff selected (%d)\n",
1297 				__func__, c->rolloff);
1298 			return -EOPNOTSUPP;
1299 		}
1300 		break;
1301 
1302 	default:
1303 		dprintk("%s: unsupported delivery system selected (%d)\n",
1304 			__func__, c->delivery_system);
1305 		return -EOPNOTSUPP;
1306 	}
1307 	state->dnxt.delsys = c->delivery_system;
1308 	state->dnxt.modulation = c->modulation;
1309 	state->dnxt.frequency = c->frequency;
1310 	state->dnxt.pilot = c->pilot;
1311 	state->dnxt.rolloff = c->rolloff;
1312 
1313 	ret = cx24116_set_inversion(state, c->inversion);
1314 	if (ret !=  0)
1315 		return ret;
1316 
1317 	/* FEC_NONE/AUTO for DVB-S2 is not supported and detected here */
1318 	ret = cx24116_set_fec(state, c->delivery_system, c->modulation, c->fec_inner);
1319 	if (ret !=  0)
1320 		return ret;
1321 
1322 	ret = cx24116_set_symbolrate(state, c->symbol_rate);
1323 	if (ret !=  0)
1324 		return ret;
1325 
1326 	/* discard the 'current' tuning parameters and prepare to tune */
1327 	cx24116_clone_params(fe);
1328 
1329 	dprintk("%s:   delsys      = %d\n", __func__, state->dcur.delsys);
1330 	dprintk("%s:   modulation  = %d\n", __func__, state->dcur.modulation);
1331 	dprintk("%s:   frequency   = %d\n", __func__, state->dcur.frequency);
1332 	dprintk("%s:   pilot       = %d (val = 0x%02x)\n", __func__,
1333 		state->dcur.pilot, state->dcur.pilot_val);
1334 	dprintk("%s:   retune      = %d\n", __func__, retune);
1335 	dprintk("%s:   rolloff     = %d (val = 0x%02x)\n", __func__,
1336 		state->dcur.rolloff, state->dcur.rolloff_val);
1337 	dprintk("%s:   symbol_rate = %d\n", __func__, state->dcur.symbol_rate);
1338 	dprintk("%s:   FEC         = %d (mask/val = 0x%02x/0x%02x)\n", __func__,
1339 		state->dcur.fec, state->dcur.fec_mask, state->dcur.fec_val);
1340 	dprintk("%s:   Inversion   = %d (val = 0x%02x)\n", __func__,
1341 		state->dcur.inversion, state->dcur.inversion_val);
1342 
1343 	/* This is also done in advise/acquire on HVR4000 but not on LITE */
1344 	if (state->config->set_ts_params)
1345 		state->config->set_ts_params(fe, 0);
1346 
1347 	/* Set/Reset B/W */
1348 	cmd.args[0x00] = CMD_BANDWIDTH;
1349 	cmd.args[0x01] = 0x01;
1350 	cmd.len = 0x02;
1351 	ret = cx24116_cmd_execute(fe, &cmd);
1352 	if (ret != 0)
1353 		return ret;
1354 
1355 	/* Prepare a tune request */
1356 	cmd.args[0x00] = CMD_TUNEREQUEST;
1357 
1358 	/* Frequency */
1359 	cmd.args[0x01] = (state->dcur.frequency & 0xff0000) >> 16;
1360 	cmd.args[0x02] = (state->dcur.frequency & 0x00ff00) >> 8;
1361 	cmd.args[0x03] = (state->dcur.frequency & 0x0000ff);
1362 
1363 	/* Symbol Rate */
1364 	cmd.args[0x04] = ((state->dcur.symbol_rate / 1000) & 0xff00) >> 8;
1365 	cmd.args[0x05] = ((state->dcur.symbol_rate / 1000) & 0x00ff);
1366 
1367 	/* Automatic Inversion */
1368 	cmd.args[0x06] = state->dcur.inversion_val;
1369 
1370 	/* Modulation / FEC / Pilot */
1371 	cmd.args[0x07] = state->dcur.fec_val | state->dcur.pilot_val;
1372 
1373 	cmd.args[0x08] = CX24116_SEARCH_RANGE_KHZ >> 8;
1374 	cmd.args[0x09] = CX24116_SEARCH_RANGE_KHZ & 0xff;
1375 	cmd.args[0x0a] = 0x00;
1376 	cmd.args[0x0b] = 0x00;
1377 	cmd.args[0x0c] = state->dcur.rolloff_val;
1378 	cmd.args[0x0d] = state->dcur.fec_mask;
1379 
1380 	if (state->dcur.symbol_rate > 30000000) {
1381 		cmd.args[0x0e] = 0x04;
1382 		cmd.args[0x0f] = 0x00;
1383 		cmd.args[0x10] = 0x01;
1384 		cmd.args[0x11] = 0x77;
1385 		cmd.args[0x12] = 0x36;
1386 		cx24116_writereg(state, CX24116_REG_CLKDIV, 0x44);
1387 		cx24116_writereg(state, CX24116_REG_RATEDIV, 0x01);
1388 	} else {
1389 		cmd.args[0x0e] = 0x06;
1390 		cmd.args[0x0f] = 0x00;
1391 		cmd.args[0x10] = 0x00;
1392 		cmd.args[0x11] = 0xFA;
1393 		cmd.args[0x12] = 0x24;
1394 		cx24116_writereg(state, CX24116_REG_CLKDIV, 0x46);
1395 		cx24116_writereg(state, CX24116_REG_RATEDIV, 0x00);
1396 	}
1397 
1398 	cmd.len = 0x13;
1399 
1400 	/* We need to support pilot and non-pilot tuning in the
1401 	 * driver automatically. This is a workaround for because
1402 	 * the demod does not support autodetect.
1403 	 */
1404 	do {
1405 		/* Reset status register */
1406 		status = cx24116_readreg(state, CX24116_REG_SSTATUS)
1407 			& CX24116_SIGNAL_MASK;
1408 		cx24116_writereg(state, CX24116_REG_SSTATUS, status);
1409 
1410 		/* Tune */
1411 		ret = cx24116_cmd_execute(fe, &cmd);
1412 		if (ret != 0)
1413 			break;
1414 
1415 		/*
1416 		 * Wait for up to 500 ms before retrying
1417 		 *
1418 		 * If we are able to tune then generally it occurs within 100ms.
1419 		 * If it takes longer, try a different toneburst setting.
1420 		 */
1421 		for (i = 0; i < 50 ; i++) {
1422 			cx24116_read_status(fe, &tunerstat);
1423 			status = tunerstat & (FE_HAS_SIGNAL | FE_HAS_SYNC);
1424 			if (status == (FE_HAS_SIGNAL | FE_HAS_SYNC)) {
1425 				dprintk("%s: Tuned\n", __func__);
1426 				goto tuned;
1427 			}
1428 			msleep(10);
1429 		}
1430 
1431 		dprintk("%s: Not tuned\n", __func__);
1432 
1433 		/* Toggle pilot bit when in auto-pilot */
1434 		if (state->dcur.pilot == PILOT_AUTO)
1435 			cmd.args[0x07] ^= CX24116_PILOT_ON;
1436 	} while (--retune);
1437 
1438 tuned:  /* Set/Reset B/W */
1439 	cmd.args[0x00] = CMD_BANDWIDTH;
1440 	cmd.args[0x01] = 0x00;
1441 	cmd.len = 0x02;
1442 	return cx24116_cmd_execute(fe, &cmd);
1443 }
1444 
1445 static int cx24116_tune(struct dvb_frontend *fe, bool re_tune,
1446 	unsigned int mode_flags, unsigned int *delay, enum fe_status *status)
1447 {
1448 	/*
1449 	 * It is safe to discard "params" here, as the DVB core will sync
1450 	 * fe->dtv_property_cache with fepriv->parameters_in, where the
1451 	 * DVBv3 params are stored. The only practical usage for it indicate
1452 	 * that re-tuning is needed, e. g. (fepriv->state & FESTATE_RETUNE) is
1453 	 * true.
1454 	 */
1455 
1456 	*delay = HZ / 5;
1457 	if (re_tune) {
1458 		int ret = cx24116_set_frontend(fe);
1459 		if (ret)
1460 			return ret;
1461 	}
1462 	return cx24116_read_status(fe, status);
1463 }
1464 
1465 static int cx24116_get_algo(struct dvb_frontend *fe)
1466 {
1467 	return DVBFE_ALGO_HW;
1468 }
1469 
1470 static struct dvb_frontend_ops cx24116_ops = {
1471 	.delsys = { SYS_DVBS, SYS_DVBS2 },
1472 	.info = {
1473 		.name = "Conexant CX24116/CX24118",
1474 		.frequency_min = 950000,
1475 		.frequency_max = 2150000,
1476 		.frequency_stepsize = 1011, /* kHz for QPSK frontends */
1477 		.frequency_tolerance = 5000,
1478 		.symbol_rate_min = 1000000,
1479 		.symbol_rate_max = 45000000,
1480 		.caps = FE_CAN_INVERSION_AUTO |
1481 			FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
1482 			FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
1483 			FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
1484 			FE_CAN_2G_MODULATION |
1485 			FE_CAN_QPSK | FE_CAN_RECOVER
1486 	},
1487 
1488 	.release = cx24116_release,
1489 
1490 	.init = cx24116_initfe,
1491 	.sleep = cx24116_sleep,
1492 	.read_status = cx24116_read_status,
1493 	.read_ber = cx24116_read_ber,
1494 	.read_signal_strength = cx24116_read_signal_strength,
1495 	.read_snr = cx24116_read_snr,
1496 	.read_ucblocks = cx24116_read_ucblocks,
1497 	.set_tone = cx24116_set_tone,
1498 	.set_voltage = cx24116_set_voltage,
1499 	.diseqc_send_master_cmd = cx24116_send_diseqc_msg,
1500 	.diseqc_send_burst = cx24116_diseqc_send_burst,
1501 	.get_frontend_algo = cx24116_get_algo,
1502 	.tune = cx24116_tune,
1503 
1504 	.set_frontend = cx24116_set_frontend,
1505 };
1506 
1507 MODULE_DESCRIPTION("DVB Frontend module for Conexant cx24116/cx24118 hardware");
1508 MODULE_AUTHOR("Steven Toth");
1509 MODULE_LICENSE("GPL");
1510 
1511