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