8dde72bd10461fb5997cf13e6748e73bfee43535
[linux-2.6-microblaze.git] / drivers / media / dvb / frontends / lgdt330x.c
1 /*
2  *    Support for LGDT3302 and LGDT3303 - VSB/QAM
3  *
4  *    Copyright (C) 2005 Wilson Michaels <wilsonmichaels@earthlink.net>
5  *
6  *    This program is free software; you can redistribute it and/or modify
7  *    it under the terms of the GNU General Public License as published by
8  *    the Free Software Foundation; either version 2 of the License, or
9  *    (at your option) any later version.
10  *
11  *    This program is distributed in the hope that it will be useful,
12  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *    GNU General Public License for more details.
15  *
16  *    You should have received a copy of the GNU General Public License
17  *    along with this program; if not, write to the Free Software
18  *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19  *
20  */
21
22 /*
23  *                      NOTES ABOUT THIS DRIVER
24  *
25  * This Linux driver supports:
26  *   DViCO FusionHDTV 3 Gold-Q
27  *   DViCO FusionHDTV 3 Gold-T
28  *   DViCO FusionHDTV 5 Gold
29  *
30  * TODO:
31  * signal strength always returns 0.
32  *
33  */
34
35 #include <linux/kernel.h>
36 #include <linux/module.h>
37 #include <linux/moduleparam.h>
38 #include <linux/init.h>
39 #include <linux/delay.h>
40 #include <linux/string.h>
41 #include <linux/slab.h>
42 #include <asm/byteorder.h>
43
44 #include "dvb_frontend.h"
45 #include "lgdt330x_priv.h"
46 #include "lgdt330x.h"
47
48 static int debug = 0;
49 module_param(debug, int, 0644);
50 MODULE_PARM_DESC(debug,"Turn on/off lgdt330x frontend debugging (default:off).");
51 #define dprintk(args...) \
52 do { \
53 if (debug) printk(KERN_DEBUG "lgdt330x: " args); \
54 } while (0)
55
56 struct lgdt330x_state
57 {
58         struct i2c_adapter* i2c;
59         struct dvb_frontend_ops ops;
60
61         /* Configuration settings */
62         const struct lgdt330x_config* config;
63
64         struct dvb_frontend frontend;
65
66         /* Demodulator private data */
67         fe_modulation_t current_modulation;
68
69         /* Tuner private data */
70         u32 current_frequency;
71 };
72
73 static int i2c_write_demod_bytes (struct lgdt330x_state* state,
74                                   u8 *buf, /* data bytes to send */
75                                   int len  /* number of bytes to send */ )
76 {
77         struct i2c_msg msg =
78                 { .addr = state->config->demod_address,
79                   .flags = 0,
80                   .buf = buf,
81                   .len = 2 };
82         int i;
83         int err;
84
85         for (i=0; i<len-1; i+=2){
86                 if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
87                         printk(KERN_WARNING "lgdt330x: %s error (addr %02x <- %02x, err = %i)\n", __FUNCTION__, msg.buf[0], msg.buf[1], err);
88                         if (err < 0)
89                                 return err;
90                         else
91                                 return -EREMOTEIO;
92                 }
93                 msg.buf += 2;
94         }
95         return 0;
96 }
97
98 /*
99  * This routine writes the register (reg) to the demod bus
100  * then reads the data returned for (len) bytes.
101  */
102
103 static u8 i2c_read_demod_bytes (struct lgdt330x_state* state,
104                                enum I2C_REG reg, u8* buf, int len)
105 {
106         u8 wr [] = { reg };
107         struct i2c_msg msg [] = {
108                 { .addr = state->config->demod_address,
109                   .flags = 0, .buf = wr,  .len = 1 },
110                 { .addr = state->config->demod_address,
111                   .flags = I2C_M_RD, .buf = buf, .len = len },
112         };
113         int ret;
114         ret = i2c_transfer(state->i2c, msg, 2);
115         if (ret != 2) {
116                 printk(KERN_WARNING "lgdt330x: %s: addr 0x%02x select 0x%02x error (ret == %i)\n", __FUNCTION__, state->config->demod_address, reg, ret);
117         } else {
118                 ret = 0;
119         }
120         return ret;
121 }
122
123 /* Software reset */
124 static int lgdt3302_SwReset(struct lgdt330x_state* state)
125 {
126         u8 ret;
127         u8 reset[] = {
128                 IRQ_MASK,
129                 0x00 /* bit 6 is active low software reset
130                       * bits 5-0 are 1 to mask interrupts */
131         };
132
133         ret = i2c_write_demod_bytes(state,
134                                     reset, sizeof(reset));
135         if (ret == 0) {
136
137                 /* force reset high (inactive) and unmask interrupts */
138                 reset[1] = 0x7f;
139                 ret = i2c_write_demod_bytes(state,
140                                             reset, sizeof(reset));
141         }
142         return ret;
143 }
144
145 static int lgdt3303_SwReset(struct lgdt330x_state* state)
146 {
147         u8 ret;
148         u8 reset[] = {
149                 0x02,
150                 0x00 /* bit 0 is active low software reset */
151         };
152
153         ret = i2c_write_demod_bytes(state,
154                                     reset, sizeof(reset));
155         if (ret == 0) {
156
157                 /* force reset high (inactive) */
158                 reset[1] = 0x01;
159                 ret = i2c_write_demod_bytes(state,
160                                             reset, sizeof(reset));
161         }
162         return ret;
163 }
164
165 static int lgdt330x_SwReset(struct lgdt330x_state* state)
166 {
167         switch (state->config->demod_chip) {
168         case LGDT3302:
169                 return lgdt3302_SwReset(state);
170         case LGDT3303:
171                 return lgdt3303_SwReset(state);
172         default:
173                 return -ENODEV;
174         }
175 }
176
177 static int lgdt330x_init(struct dvb_frontend* fe)
178 {
179         /* Hardware reset is done using gpio[0] of cx23880x chip.
180          * I'd like to do it here, but don't know how to find chip address.
181          * cx88-cards.c arranges for the reset bit to be inactive (high).
182          * Maybe there needs to be a callable function in cx88-core or
183          * the caller of this function needs to do it. */
184
185         /*
186          * Array of byte pairs <address, value>
187          * to initialize each different chip
188          */
189         static u8 lgdt3302_init_data[] = {
190                 /* Use 50MHz parameter values from spec sheet since xtal is 50 */
191                 /* Change the value of NCOCTFV[25:0] of carrier
192                    recovery center frequency register */
193                 VSB_CARRIER_FREQ0, 0x00,
194                 VSB_CARRIER_FREQ1, 0x87,
195                 VSB_CARRIER_FREQ2, 0x8e,
196                 VSB_CARRIER_FREQ3, 0x01,
197                 /* Change the TPCLK pin polarity
198                    data is valid on falling clock */
199                 DEMUX_CONTROL, 0xfb,
200                 /* Change the value of IFBW[11:0] of
201                    AGC IF/RF loop filter bandwidth register */
202                 AGC_RF_BANDWIDTH0, 0x40,
203                 AGC_RF_BANDWIDTH1, 0x93,
204                 AGC_RF_BANDWIDTH2, 0x00,
205                 /* Change the value of bit 6, 'nINAGCBY' and
206                    'NSSEL[1:0] of ACG function control register 2 */
207                 AGC_FUNC_CTRL2, 0xc6,
208                 /* Change the value of bit 6 'RFFIX'
209                    of AGC function control register 3 */
210                 AGC_FUNC_CTRL3, 0x40,
211                 /* Set the value of 'INLVTHD' register 0x2a/0x2c
212                    to 0x7fe */
213                 AGC_DELAY0, 0x07,
214                 AGC_DELAY2, 0xfe,
215                 /* Change the value of IAGCBW[15:8]
216                    of inner AGC loop filter bandwith */
217                 AGC_LOOP_BANDWIDTH0, 0x08,
218                 AGC_LOOP_BANDWIDTH1, 0x9a
219         };
220
221         static u8 lgdt3303_init_data[] = {
222                 0x4c, 0x14
223         };
224
225         struct lgdt330x_state* state = fe->demodulator_priv;
226         char  *chip_name;
227         int    err;
228
229         switch (state->config->demod_chip) {
230         case LGDT3302:
231                 chip_name = "LGDT3302";
232                 err = i2c_write_demod_bytes(state, lgdt3302_init_data,
233                                             sizeof(lgdt3302_init_data));
234                 break;
235         case LGDT3303:
236                 chip_name = "LGDT3303";
237                 err = i2c_write_demod_bytes(state, lgdt3303_init_data,
238                                             sizeof(lgdt3303_init_data));
239                 break;
240         default:
241                 chip_name = "undefined";
242                 printk (KERN_WARNING "Only LGDT3302 and LGDT3303 are supported chips.\n");
243                 err = -ENODEV;
244         }
245         dprintk("%s entered as %s\n", __FUNCTION__, chip_name);
246         if (err < 0)
247                 return err;
248         return lgdt330x_SwReset(state);
249 }
250
251 static int lgdt330x_read_ber(struct dvb_frontend* fe, u32* ber)
252 {
253         *ber = 0; /* Not supplied by the demod chips */
254         return 0;
255 }
256
257 static int lgdt330x_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
258 {
259         struct lgdt330x_state* state = fe->demodulator_priv;
260         int err;
261         u8 buf[2];
262
263         switch (state->config->demod_chip) {
264         case LGDT3302:
265                 err = i2c_read_demod_bytes(state, LGDT3302_PACKET_ERR_COUNTER1,
266                                            buf, sizeof(buf));
267                 break;
268         case LGDT3303:
269                 err = i2c_read_demod_bytes(state, LGDT3303_PACKET_ERR_COUNTER1,
270                                            buf, sizeof(buf));
271                 break;
272         default:
273                 printk(KERN_WARNING
274                        "Only LGDT3302 and LGDT3303 are supported chips.\n");
275                 err = -ENODEV;
276         }
277
278         *ucblocks = (buf[0] << 8) | buf[1];
279         return 0;
280 }
281
282 static int lgdt330x_set_parameters(struct dvb_frontend* fe,
283                                    struct dvb_frontend_parameters *param)
284 {
285         /*
286          * Array of byte pairs <address, value>
287          * to initialize 8VSB for lgdt3303 chip 50 MHz IF
288          */
289         static u8 lgdt3303_8vsb_44_data[] = {
290                 0x04, 0x00,
291                 0x0d, 0x40,
292         0x0e, 0x87,
293         0x0f, 0x8e,
294         0x10, 0x01,
295         0x47, 0x8b };
296
297         /*
298          * Array of byte pairs <address, value>
299          * to initialize QAM for lgdt3303 chip
300          */
301         static u8 lgdt3303_qam_data[] = {
302                 0x04, 0x00,
303                 0x0d, 0x00,
304                 0x0e, 0x00,
305                 0x0f, 0x00,
306                 0x10, 0x00,
307                 0x51, 0x63,
308                 0x47, 0x66,
309                 0x48, 0x66,
310                 0x4d, 0x1a,
311                 0x49, 0x08,
312                 0x4a, 0x9b };
313
314         struct lgdt330x_state* state = fe->demodulator_priv;
315
316         static u8 top_ctrl_cfg[]   = { TOP_CONTROL, 0x03 };
317
318         int err;
319         /* Change only if we are actually changing the modulation */
320         if (state->current_modulation != param->u.vsb.modulation) {
321                 switch(param->u.vsb.modulation) {
322                 case VSB_8:
323                         dprintk("%s: VSB_8 MODE\n", __FUNCTION__);
324
325                         /* Select VSB mode */
326                         top_ctrl_cfg[1] = 0x03;
327
328                         /* Select ANT connector if supported by card */
329                         if (state->config->pll_rf_set)
330                                 state->config->pll_rf_set(fe, 1);
331
332                         if (state->config->demod_chip == LGDT3303) {
333                                 err = i2c_write_demod_bytes(state, lgdt3303_8vsb_44_data,
334                                                             sizeof(lgdt3303_8vsb_44_data));
335                         }
336                         break;
337
338                 case QAM_64:
339                         dprintk("%s: QAM_64 MODE\n", __FUNCTION__);
340
341                         /* Select QAM_64 mode */
342                         top_ctrl_cfg[1] = 0x00;
343
344                         /* Select CABLE connector if supported by card */
345                         if (state->config->pll_rf_set)
346                                 state->config->pll_rf_set(fe, 0);
347
348                         if (state->config->demod_chip == LGDT3303) {
349                                 err = i2c_write_demod_bytes(state, lgdt3303_qam_data,
350                                                                                         sizeof(lgdt3303_qam_data));
351                         }
352                         break;
353
354                 case QAM_256:
355                         dprintk("%s: QAM_256 MODE\n", __FUNCTION__);
356
357                         /* Select QAM_256 mode */
358                         top_ctrl_cfg[1] = 0x01;
359
360                         /* Select CABLE connector if supported by card */
361                         if (state->config->pll_rf_set)
362                                 state->config->pll_rf_set(fe, 0);
363
364                         if (state->config->demod_chip == LGDT3303) {
365                                 err = i2c_write_demod_bytes(state, lgdt3303_qam_data,
366                                                                                         sizeof(lgdt3303_qam_data));
367                         }
368                         break;
369                 default:
370                         printk(KERN_WARNING "lgdt330x: %s: Modulation type(%d) UNSUPPORTED\n", __FUNCTION__, param->u.vsb.modulation);
371                         return -1;
372                 }
373                 /*
374                  * select serial or parallel MPEG harware interface
375                  * Serial:   0x04 for LGDT3302 or 0x40 for LGDT3303
376                  * Parallel: 0x00
377                  */
378                 top_ctrl_cfg[1] |= state->config->serial_mpeg;
379
380                 /* Select the requested mode */
381                 i2c_write_demod_bytes(state, top_ctrl_cfg,
382                                       sizeof(top_ctrl_cfg));
383                 if (state->config->set_ts_params)
384                         state->config->set_ts_params(fe, 0);
385                 state->current_modulation = param->u.vsb.modulation;
386         }
387
388         /* Tune to the specified frequency */
389         if (state->config->pll_set)
390                 state->config->pll_set(fe, param);
391
392         /* Keep track of the new frequency */
393         state->current_frequency = param->frequency;
394
395         lgdt330x_SwReset(state);
396         return 0;
397 }
398
399 static int lgdt330x_get_frontend(struct dvb_frontend* fe,
400                                  struct dvb_frontend_parameters* param)
401 {
402         struct lgdt330x_state *state = fe->demodulator_priv;
403         param->frequency = state->current_frequency;
404         return 0;
405 }
406
407 static int lgdt3302_read_status(struct dvb_frontend* fe, fe_status_t* status)
408 {
409         struct lgdt330x_state* state = fe->demodulator_priv;
410         u8 buf[3];
411
412         *status = 0; /* Reset status result */
413
414         /* AGC status register */
415         i2c_read_demod_bytes(state, AGC_STATUS, buf, 1);
416         dprintk("%s: AGC_STATUS = 0x%02x\n", __FUNCTION__, buf[0]);
417         if ((buf[0] & 0x0c) == 0x8){
418                 /* Test signal does not exist flag */
419                 /* as well as the AGC lock flag.   */
420                 *status |= FE_HAS_SIGNAL;
421         } else {
422                 /* Without a signal all other status bits are meaningless */
423                 return 0;
424         }
425
426         /*
427          * You must set the Mask bits to 1 in the IRQ_MASK in order
428          * to see that status bit in the IRQ_STATUS register.
429          * This is done in SwReset();
430          */
431         /* signal status */
432         i2c_read_demod_bytes(state, TOP_CONTROL, buf, sizeof(buf));
433         dprintk("%s: TOP_CONTROL = 0x%02x, IRO_MASK = 0x%02x, IRQ_STATUS = 0x%02x\n", __FUNCTION__, buf[0], buf[1], buf[2]);
434
435
436         /* sync status */
437         if ((buf[2] & 0x03) == 0x01) {
438                 *status |= FE_HAS_SYNC;
439         }
440
441         /* FEC error status */
442         if ((buf[2] & 0x0c) == 0x08) {
443                 *status |= FE_HAS_LOCK;
444                 *status |= FE_HAS_VITERBI;
445         }
446
447         /* Carrier Recovery Lock Status Register */
448         i2c_read_demod_bytes(state, CARRIER_LOCK, buf, 1);
449         dprintk("%s: CARRIER_LOCK = 0x%02x\n", __FUNCTION__, buf[0]);
450         switch (state->current_modulation) {
451         case QAM_256:
452         case QAM_64:
453                 /* Need to undestand why there are 3 lock levels here */
454                 if ((buf[0] & 0x07) == 0x07)
455                         *status |= FE_HAS_CARRIER;
456                 break;
457         case VSB_8:
458                 if ((buf[0] & 0x80) == 0x80)
459                         *status |= FE_HAS_CARRIER;
460                 break;
461         default:
462                 printk("KERN_WARNING lgdt330x: %s: Modulation set to unsupported value\n", __FUNCTION__);
463         }
464
465         return 0;
466 }
467
468 static int lgdt3303_read_status(struct dvb_frontend* fe, fe_status_t* status)
469 {
470         struct lgdt330x_state* state = fe->demodulator_priv;
471         int err;
472         u8 buf[3];
473
474         *status = 0; /* Reset status result */
475
476         /* lgdt3303 AGC status register */
477         err = i2c_read_demod_bytes(state, 0x58, buf, 1);
478         if (err < 0)
479                 return err;
480
481         dprintk("%s: AGC_STATUS = 0x%02x\n", __FUNCTION__, buf[0]);
482         if ((buf[0] & 0x21) == 0x01){
483                 /* Test input signal does not exist flag */
484                 /* as well as the AGC lock flag.   */
485                 *status |= FE_HAS_SIGNAL;
486         } else {
487                 /* Without a signal all other status bits are meaningless */
488                 return 0;
489         }
490
491         /* Carrier Recovery Lock Status Register */
492         i2c_read_demod_bytes(state, CARRIER_LOCK, buf, 1);
493         dprintk("%s: CARRIER_LOCK = 0x%02x\n", __FUNCTION__, buf[0]);
494         switch (state->current_modulation) {
495         case QAM_256:
496         case QAM_64:
497                 /* Need to undestand why there are 3 lock levels here */
498                 if ((buf[0] & 0x07) == 0x07)
499                         *status |= FE_HAS_CARRIER;
500                 else
501                         break;
502                 i2c_read_demod_bytes(state, 0x8a, buf, 1);
503                 if ((buf[0] & 0x04) == 0x04)
504                         *status |= FE_HAS_SYNC;
505                 if ((buf[0] & 0x01) == 0x01)
506                         *status |= FE_HAS_LOCK;
507                 if ((buf[0] & 0x08) == 0x08)
508                         *status |= FE_HAS_VITERBI;
509                 break;
510         case VSB_8:
511                 if ((buf[0] & 0x80) == 0x80)
512                         *status |= FE_HAS_CARRIER;
513                 else
514                         break;
515                 i2c_read_demod_bytes(state, 0x38, buf, 1);
516                 if ((buf[0] & 0x02) == 0x00)
517                         *status |= FE_HAS_SYNC;
518                 if ((buf[0] & 0x01) == 0x01) {
519                         *status |= FE_HAS_LOCK;
520                         *status |= FE_HAS_VITERBI;
521                 }
522                 break;
523         default:
524                 printk("KERN_WARNING lgdt330x: %s: Modulation set to unsupported value\n", __FUNCTION__);
525         }
526         return 0;
527 }
528
529 static int lgdt330x_read_signal_strength(struct dvb_frontend* fe, u16* strength)
530 {
531         /* not directly available. */
532         *strength = 0;
533         return 0;
534 }
535
536 static int lgdt3302_read_snr(struct dvb_frontend* fe, u16* snr)
537 {
538 #ifdef SNR_IN_DB
539         /*
540          * Spec sheet shows formula for SNR_EQ = 10 log10(25 * 24**2 / noise)
541          * and SNR_PH = 10 log10(25 * 32**2 / noise) for equalizer and phase tracker
542          * respectively. The following tables are built on these formulas.
543          * The usual definition is SNR = 20 log10(signal/noise)
544          * If the specification is wrong the value retuned is 1/2 the actual SNR in db.
545          *
546          * This table is a an ordered list of noise values computed by the
547          * formula from the spec sheet such that the index into the table
548          * starting at 43 or 45 is the SNR value in db. There are duplicate noise
549          * value entries at the beginning because the SNR varies more than
550          * 1 db for a change of 1 digit in noise at very small values of noise.
551          *
552          * Examples from SNR_EQ table:
553          * noise SNR
554          *   0    43
555          *   1    42
556          *   2    39
557          *   3    37
558          *   4    36
559          *   5    35
560          *   6    34
561          *   7    33
562          *   8    33
563          *   9    32
564          *   10   32
565          *   11   31
566          *   12   31
567          *   13   30
568          */
569
570         static const u32 SNR_EQ[] =
571                 { 1,     2,      2,      2, 3,      3,      4,     4,     5,     7,
572                   9,     11,     13,     17, 21,     26,     33,    41,    52,    65,
573                   81,    102,    129,    162, 204,    257,    323,   406,   511,   644,
574                   810,   1020,   1284,   1616, 2035,   2561,   3224,  4059,  5110,  6433,
575                   8098,  10195,  12835,  16158, 20341,  25608,  32238, 40585, 51094, 64323,
576                   80978, 101945, 128341, 161571, 203406, 256073, 0x40000
577                 };
578
579         static const u32 SNR_PH[] =
580                 { 1,     2,      2,      2,      3,      3,     4,     5,     6,     8,
581                   10,    12,     15,     19,     23,     29, 37,    46,    58,    73,
582                   91,    115,    144,    182,    229,    288, 362,   456,   574,   722,
583                   909,   1144,   1440,   1813,   2282,   2873, 3617,  4553,  5732,  7216,
584                   9084,  11436,  14396,  18124,  22817,  28724,  36161, 45524, 57312, 72151,
585                   90833, 114351, 143960, 181235, 228161, 0x080000
586                 };
587
588         static u8 buf[5];/* read data buffer */
589         static u32 noise;   /* noise value */
590         static u32 snr_db;  /* index into SNR_EQ[] */
591         struct lgdt330x_state* state = (struct lgdt330x_state*) fe->demodulator_priv;
592
593         /* read both equalizer and phase tracker noise data */
594         i2c_read_demod_bytes(state, EQPH_ERR0, buf, sizeof(buf));
595
596         if (state->current_modulation == VSB_8) {
597                 /* Equalizer Mean-Square Error Register for VSB */
598                 noise = ((buf[0] & 7) << 16) | (buf[1] << 8) | buf[2];
599
600                 /*
601                  * Look up noise value in table.
602                  * A better search algorithm could be used...
603                  * watch out there are duplicate entries.
604                  */
605                 for (snr_db = 0; snr_db < sizeof(SNR_EQ); snr_db++) {
606                         if (noise < SNR_EQ[snr_db]) {
607                                 *snr = 43 - snr_db;
608                                 break;
609                         }
610                 }
611         } else {
612                 /* Phase Tracker Mean-Square Error Register for QAM */
613                 noise = ((buf[0] & 7<<3) << 13) | (buf[3] << 8) | buf[4];
614
615                 /* Look up noise value in table. */
616                 for (snr_db = 0; snr_db < sizeof(SNR_PH); snr_db++) {
617                         if (noise < SNR_PH[snr_db]) {
618                                 *snr = 45 - snr_db;
619                                 break;
620                         }
621                 }
622         }
623 #else
624         /* Return the raw noise value */
625         static u8 buf[5];/* read data buffer */
626         static u32 noise;   /* noise value */
627         struct lgdt330x_state* state = (struct lgdt330x_state*) fe->demodulator_priv;
628
629         /* read both equalizer and pase tracker noise data */
630         i2c_read_demod_bytes(state, EQPH_ERR0, buf, sizeof(buf));
631
632         if (state->current_modulation == VSB_8) {
633                 /* Phase Tracker Mean-Square Error Register for VSB */
634                 noise = ((buf[0] & 7<<3) << 13) | (buf[3] << 8) | buf[4];
635         } else {
636
637                 /* Carrier Recovery Mean-Square Error for QAM */
638                 i2c_read_demod_bytes(state, 0x1a, buf, 2);
639                 noise = ((buf[0] & 3) << 8) | buf[1];
640         }
641
642         /* Small values for noise mean signal is better so invert noise */
643         *snr = ~noise;
644 #endif
645
646         dprintk("%s: noise = 0x%05x, snr = %idb\n",__FUNCTION__, noise, *snr);
647
648         return 0;
649 }
650
651 static int lgdt3303_read_snr(struct dvb_frontend* fe, u16* snr)
652 {
653         /* Return the raw noise value */
654         static u8 buf[5];/* read data buffer */
655         static u32 noise;   /* noise value */
656         struct lgdt330x_state* state = (struct lgdt330x_state*) fe->demodulator_priv;
657
658         if (state->current_modulation == VSB_8) {
659
660                 /* Phase Tracker Mean-Square Error Register for VSB */
661                 noise = ((buf[0] & 7) << 16) | (buf[3] << 8) | buf[4];
662         } else {
663
664                 /* Carrier Recovery Mean-Square Error for QAM */
665                 i2c_read_demod_bytes(state, 0x1a, buf, 2);
666                 noise = (buf[0] << 8) | buf[1];
667         }
668
669         /* Small values for noise mean signal is better so invert noise */
670         *snr = ~noise;
671
672         dprintk("%s: noise = 0x%05x, snr = %idb\n",__FUNCTION__, noise, *snr);
673
674         return 0;
675 }
676
677 static int lgdt330x_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fe_tune_settings)
678 {
679         /* I have no idea about this - it may not be needed */
680         fe_tune_settings->min_delay_ms = 500;
681         fe_tune_settings->step_size = 0;
682         fe_tune_settings->max_drift = 0;
683         return 0;
684 }
685
686 static void lgdt330x_release(struct dvb_frontend* fe)
687 {
688         struct lgdt330x_state* state = (struct lgdt330x_state*) fe->demodulator_priv;
689         kfree(state);
690 }
691
692 static struct dvb_frontend_ops lgdt3302_ops;
693 static struct dvb_frontend_ops lgdt3303_ops;
694
695 struct dvb_frontend* lgdt330x_attach(const struct lgdt330x_config* config,
696                                      struct i2c_adapter* i2c)
697 {
698         struct lgdt330x_state* state = NULL;
699         u8 buf[1];
700
701         /* Allocate memory for the internal state */
702         state = (struct lgdt330x_state*) kmalloc(sizeof(struct lgdt330x_state), GFP_KERNEL);
703         if (state == NULL)
704                 goto error;
705         memset(state,0,sizeof(*state));
706
707         /* Setup the state */
708         state->config = config;
709         state->i2c = i2c;
710         switch (config->demod_chip) {
711         case LGDT3302:
712                 memcpy(&state->ops, &lgdt3302_ops, sizeof(struct dvb_frontend_ops));
713                 break;
714         case LGDT3303:
715                 memcpy(&state->ops, &lgdt3303_ops, sizeof(struct dvb_frontend_ops));
716                 break;
717         default:
718                 goto error;
719         }
720
721         /* Verify communication with demod chip */
722         if (i2c_read_demod_bytes(state, 2, buf, 1))
723                 goto error;
724
725         state->current_frequency = -1;
726         state->current_modulation = -1;
727
728         /* Create dvb_frontend */
729         state->frontend.ops = &state->ops;
730         state->frontend.demodulator_priv = state;
731         return &state->frontend;
732
733 error:
734         if (state)
735                 kfree(state);
736         dprintk("%s: ERROR\n",__FUNCTION__);
737         return NULL;
738 }
739
740 static struct dvb_frontend_ops lgdt3302_ops = {
741         .info = {
742                 .name= "LG Electronics LGDT3302 VSB/QAM Frontend",
743                 .type = FE_ATSC,
744                 .frequency_min= 54000000,
745                 .frequency_max= 858000000,
746                 .frequency_stepsize= 62500,
747                 /* Symbol rate is for all VSB modes need to check QAM */
748                 .symbol_rate_min    = 10762000,
749                 .symbol_rate_max    = 10762000,
750                 .caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB
751         },
752         .init                 = lgdt330x_init,
753         .set_frontend         = lgdt330x_set_parameters,
754         .get_frontend         = lgdt330x_get_frontend,
755         .get_tune_settings    = lgdt330x_get_tune_settings,
756         .read_status          = lgdt3302_read_status,
757         .read_ber             = lgdt330x_read_ber,
758         .read_signal_strength = lgdt330x_read_signal_strength,
759         .read_snr             = lgdt3302_read_snr,
760         .read_ucblocks        = lgdt330x_read_ucblocks,
761         .release              = lgdt330x_release,
762 };
763
764 static struct dvb_frontend_ops lgdt3303_ops = {
765         .info = {
766                 .name= "LG Electronics LGDT3303 VSB/QAM Frontend",
767                 .type = FE_ATSC,
768                 .frequency_min= 54000000,
769                 .frequency_max= 858000000,
770                 .frequency_stepsize= 62500,
771                 /* Symbol rate is for all VSB modes need to check QAM */
772                 .symbol_rate_min    = 10762000,
773                 .symbol_rate_max    = 10762000,
774                 .caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB
775         },
776         .init                 = lgdt330x_init,
777         .set_frontend         = lgdt330x_set_parameters,
778         .get_frontend         = lgdt330x_get_frontend,
779         .get_tune_settings    = lgdt330x_get_tune_settings,
780         .read_status          = lgdt3303_read_status,
781         .read_ber             = lgdt330x_read_ber,
782         .read_signal_strength = lgdt330x_read_signal_strength,
783         .read_snr             = lgdt3303_read_snr,
784         .read_ucblocks        = lgdt330x_read_ucblocks,
785         .release              = lgdt330x_release,
786 };
787
788 MODULE_DESCRIPTION("LGDT330X (ATSC 8VSB & ITU-T J.83 AnnexB 64/256 QAM) Demodulator Driver");
789 MODULE_AUTHOR("Wilson Michaels");
790 MODULE_LICENSE("GPL");
791
792 EXPORT_SYMBOL(lgdt330x_attach);
793
794 /*
795  * Local variables:
796  * c-basic-offset: 8
797  * End:
798  */