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