This commit was manufactured by cvs2svn to create branch 'vserver'.
[linux-2.6.git] / drivers / media / dvb / frontends / mt352.c
1 /*
2  *  Driver for Zarlink DVB-T MT352 demodulator
3  *
4  *  Written by Holger Waechtler <holger@qanu.de>
5  *       and Daniel Mack <daniel@qanu.de>
6  *
7  *  AVerMedia AVerTV DVB-T 771 support by
8  *       Wolfram Joost <dbox2@frokaschwei.de>
9  *
10  *  Support for Samsung TDTC9251DH01C(M) tuner
11  *  Copyright (C) 2004 Antonio Mancuso <antonio.mancuso@digitaltelevision.it>
12  *                     Amauri  Celani  <acelani@essegi.net>
13  *
14  *  DVICO FusionHDTV DVB-T1 and DVICO FusionHDTV DVB-T Lite support by
15  *       Christopher Pascoe <c.pascoe@itee.uq.edu.au>
16  *
17  *  This program is free software; you can redistribute it and/or modify
18  *  it under the terms of the GNU General Public License as published by
19  *  the Free Software Foundation; either version 2 of the License, or
20  *  (at your option) any later version.
21  *
22  *  This program is distributed in the hope that it will be useful,
23  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
24  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25  *
26  *  GNU General Public License for more details.
27  *
28  *  You should have received a copy of the GNU General Public License
29  *  along with this program; if not, write to the Free Software
30  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.=
31  */
32
33 #include <linux/kernel.h>
34 #include <linux/module.h>
35 #include <linux/moduleparam.h>
36 #include <linux/init.h>
37 #include <linux/delay.h>
38
39 #include "dvb_frontend.h"
40 #include "mt352_priv.h"
41 #include "mt352.h"
42
43 struct mt352_state {
44
45         struct i2c_adapter* i2c;
46
47         struct dvb_frontend_ops ops;
48
49         /* configuration settings */
50         const struct mt352_config* config;
51
52         struct dvb_frontend frontend;
53 };
54
55 static int debug;
56 #define dprintk(args...) \
57 do {                                                                    \
58                 if (debug) printk(KERN_DEBUG "mt352: " args); \
59 } while (0)
60
61 int mt352_write(struct dvb_frontend* fe, u8* ibuf, int ilen)
62 {
63         struct mt352_state* state = (struct mt352_state*) fe->demodulator_priv;
64         struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0,
65                                .buf = ibuf, .len = ilen };
66         int err = i2c_transfer(state->i2c, &msg, 1);
67         if (err != 1) {
68                 dprintk("mt352_write() failed (err = %d)!\n", err);
69                 return err;
70 }
71
72         return 0;
73 }
74
75 static u8 mt352_read_register(struct mt352_state* state, u8 reg)
76 {
77         int ret;
78         u8 b0 [] = { reg };
79         u8 b1 [] = { 0 };
80         struct i2c_msg msg [] = { { .addr = state->config->demod_address,
81                                     .flags = 0,
82                                     .buf = b0, .len = 1 },
83                                   { .addr = state->config->demod_address,
84                                     .flags = I2C_M_RD,
85                                     .buf = b1, .len = 1 } };
86
87         ret = i2c_transfer(state->i2c, msg, 2);
88
89         if (ret != 2)
90                 dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret);
91
92         return b1[0];
93 }
94
95
96
97
98
99
100
101
102
103
104
105
106 static int mt352_sleep(struct dvb_frontend* fe)
107 {
108         static u8 mt352_softdown[] = { CLOCK_CTL, 0x20, 0x08 };
109
110         mt352_write(fe, mt352_softdown, sizeof(mt352_softdown));
111
112         return 0;
113 }
114
115 static int mt352_set_parameters(struct dvb_frontend* fe,
116                                 struct dvb_frontend_parameters *param)
117 {
118         struct mt352_state* state = (struct mt352_state*) fe->demodulator_priv;
119         unsigned char buf[14];
120         unsigned int tps = 0;
121         struct dvb_ofdm_parameters *op = &param->u.ofdm;
122         int i;
123
124         switch (op->code_rate_HP) {
125                 case FEC_2_3:
126                         tps |= (1 << 7);
127                         break;
128                 case FEC_3_4:
129                         tps |= (2 << 7);
130                         break;
131                 case FEC_5_6:
132                         tps |= (3 << 7);
133                         break;
134                 case FEC_7_8:
135                         tps |= (4 << 7);
136                         break;
137                 case FEC_1_2:
138                 case FEC_AUTO:
139                         break;
140                 default:
141                         return -EINVAL;
142         }
143
144         switch (op->code_rate_LP) {
145                 case FEC_2_3:
146                         tps |= (1 << 4);
147                         break;
148                 case FEC_3_4:
149                         tps |= (2 << 4);
150                         break;
151                 case FEC_5_6:
152                         tps |= (3 << 4);
153                         break;
154                 case FEC_7_8:
155                         tps |= (4 << 4);
156                         break;
157                 case FEC_1_2:
158                 case FEC_AUTO:
159                         break;
160                 case FEC_NONE:
161                         if (op->hierarchy_information == HIERARCHY_AUTO ||
162                             op->hierarchy_information == HIERARCHY_NONE)
163                                 break;
164                 default:
165                         return -EINVAL;
166         }
167
168         switch (op->constellation) {
169                 case QPSK:
170                         break;
171                 case QAM_AUTO:
172                 case QAM_16:
173                         tps |= (1 << 13);
174                         break;
175                 case QAM_64:
176                         tps |= (2 << 13);
177                         break;
178                 default:
179                         return -EINVAL;
180         }
181
182         switch (op->transmission_mode) {
183                 case TRANSMISSION_MODE_2K:
184                 case TRANSMISSION_MODE_AUTO:
185                         break;
186                 case TRANSMISSION_MODE_8K:
187                         tps |= (1 << 0);
188                         break;
189                 default:
190                         return -EINVAL;
191         }
192
193         switch (op->guard_interval) {
194                 case GUARD_INTERVAL_1_32:
195                 case GUARD_INTERVAL_AUTO:
196                         break;
197                 case GUARD_INTERVAL_1_16:
198                         tps |= (1 << 2);
199                         break;
200                 case GUARD_INTERVAL_1_8:
201                         tps |= (2 << 2);
202                         break;
203                 case GUARD_INTERVAL_1_4:
204                         tps |= (3 << 2);
205                         break;
206                 default:
207                         return -EINVAL;
208         }
209
210         switch (op->hierarchy_information) {
211                 case HIERARCHY_AUTO:
212                 case HIERARCHY_NONE:
213                         break;
214                 case HIERARCHY_1:
215                         tps |= (1 << 10);
216                         break;
217                 case HIERARCHY_2:
218                         tps |= (2 << 10);
219                         break;
220                 case HIERARCHY_4:
221                         tps |= (3 << 10);
222                         break;
223                 default:
224                         return -EINVAL;
225         }
226
227
228         buf[0] = TPS_GIVEN_1; /* TPS_GIVEN_1 and following registers */
229
230         buf[1] = msb(tps);      /* TPS_GIVEN_(1|0) */
231         buf[2] = lsb(tps);
232
233         buf[3] = 0x50;
234
235         /**
236          *  these settings assume 20.48MHz f_ADC, for other tuners you might
237          *  need other values. See p. 33 in the MT352 Design Manual.
238          */
239         if (op->bandwidth == BANDWIDTH_8_MHZ) {
240                 buf[4] = 0x72;  /* TRL_NOMINAL_RATE_(1|0) */
241                 buf[5] = 0x49;
242         } else if (op->bandwidth == BANDWIDTH_7_MHZ) {
243                 buf[4] = 0x64;
244                 buf[5] = 0x00;
245         } else {                /* 6MHz */
246                 buf[4] = 0x55;
247                 buf[5] = 0xb7;
248         }
249
250         buf[6] = 0x31;  /* INPUT_FREQ_(1|0), 20.48MHz clock, 36.166667MHz IF */
251         buf[7] = 0x05;  /* see MT352 Design Manual page 32 for details */
252
253         state->config->pll_set(fe, param, buf+8);
254
255         buf[13] = 0x01; /* TUNER_GO!! */
256
257         /* Only send the tuning request if the tuner doesn't have the requested
258          * parameters already set.  Enhances tuning time and prevents stream
259          * breakup when retuning the same transponder. */
260         for (i = 1; i < 13; i++)
261                 if (buf[i] != mt352_read_register(state, i + 0x50)) {
262                         mt352_write(fe, buf, sizeof(buf));
263                         break;
264                 }
265
266         return 0;
267 }
268
269 static int mt352_get_parameters(struct dvb_frontend* fe,
270                                 struct dvb_frontend_parameters *param)
271 {
272         struct mt352_state* state = (struct mt352_state*) fe->demodulator_priv;
273         u16 tps;
274         u16 div;
275         u8 trl;
276         struct dvb_ofdm_parameters *op = &param->u.ofdm;
277         static const u8 tps_fec_to_api[8] =
278         {
279                 FEC_1_2,
280                 FEC_2_3,
281                 FEC_3_4,
282                 FEC_5_6,
283                 FEC_7_8,
284                 FEC_AUTO,
285                 FEC_AUTO,
286                 FEC_AUTO
287         };
288
289         if ( (mt352_read_register(state,0x00) & 0xC0) != 0xC0 )
290         {
291                 return -EINVAL;
292         }
293
294         /* Use TPS_RECEIVED-registers, not the TPS_CURRENT-registers because
295          * the mt352 sometimes works with the wrong parameters
296          */
297         tps = (mt352_read_register(state, TPS_RECEIVED_1) << 8) | mt352_read_register(state, TPS_RECEIVED_0);
298         div = (mt352_read_register(state, CHAN_START_1) << 8) | mt352_read_register(state, CHAN_START_0);
299         trl = mt352_read_register(state, TRL_NOMINAL_RATE_1);
300
301         op->code_rate_HP = tps_fec_to_api[(tps >> 7) & 7];
302         op->code_rate_LP = tps_fec_to_api[(tps >> 4) & 7];
303
304         switch ( (tps >> 13) & 3)
305         {
306                 case 0:
307                         op->constellation = QPSK;
308                         break;
309                 case 1:
310                         op->constellation = QAM_16;
311                         break;
312                 case 2:
313                         op->constellation = QAM_64;
314                         break;
315                 default:
316                         op->constellation = QAM_AUTO;
317                         break;
318         }
319
320         op->transmission_mode = (tps & 0x01) ? TRANSMISSION_MODE_8K : TRANSMISSION_MODE_2K;
321
322         switch ( (tps >> 2) & 3)
323         {
324                 case 0:
325                         op->guard_interval = GUARD_INTERVAL_1_32;
326                         break;
327                 case 1:
328                         op->guard_interval = GUARD_INTERVAL_1_16;
329                         break;
330                 case 2:
331                         op->guard_interval = GUARD_INTERVAL_1_8;
332                         break;
333                 case 3:
334                         op->guard_interval = GUARD_INTERVAL_1_4;
335                         break;
336                 default:
337                         op->guard_interval = GUARD_INTERVAL_AUTO;
338                         break;
339         }
340
341         switch ( (tps >> 10) & 7)
342         {
343                 case 0:
344                         op->hierarchy_information = HIERARCHY_NONE;
345                         break;
346                 case 1:
347                         op->hierarchy_information = HIERARCHY_1;
348                         break;
349                 case 2:
350                         op->hierarchy_information = HIERARCHY_2;
351                         break;
352                 case 3:
353                         op->hierarchy_information = HIERARCHY_4;
354                         break;
355                 default:
356                         op->hierarchy_information = HIERARCHY_AUTO;
357                         break;
358         }
359
360         param->frequency = ( 500 * (div - IF_FREQUENCYx6) ) / 3 * 1000;
361
362         if (trl == 0x72)
363         {
364                 op->bandwidth = BANDWIDTH_8_MHZ;
365         }
366         else if (trl == 0x64)
367         {
368                 op->bandwidth = BANDWIDTH_7_MHZ;
369         }
370         else
371         {
372                 op->bandwidth = BANDWIDTH_6_MHZ;
373         }
374
375
376         if (mt352_read_register(state, STATUS_2) & 0x02)
377                 param->inversion = INVERSION_OFF;
378         else
379                 param->inversion = INVERSION_ON;
380
381         return 0;
382 }
383
384 static int mt352_read_status(struct dvb_frontend* fe, fe_status_t* status)
385 {
386         struct mt352_state* state = (struct mt352_state*) fe->demodulator_priv;
387         u8 r;
388
389                 *status = 0;
390         r = mt352_read_register (state, STATUS_0);
391                 if (r & (1 << 4))
392                         *status = FE_HAS_CARRIER;
393                 if (r & (1 << 1))
394                         *status |= FE_HAS_VITERBI;
395                 if (r & (1 << 5))
396                         *status |= FE_HAS_LOCK;
397
398         r = mt352_read_register (state, STATUS_1);
399                 if (r & (1 << 1))
400                         *status |= FE_HAS_SYNC;
401
402         r = mt352_read_register (state, STATUS_3);
403                 if (r & (1 << 6))
404                         *status |= FE_HAS_SIGNAL;
405
406         if ((*status & (FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC)) !=
407                       (FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC))
408                 *status &= ~FE_HAS_LOCK;
409
410         return 0;
411 }
412
413 static int mt352_read_ber(struct dvb_frontend* fe, u32* ber)
414 {
415         struct mt352_state* state = (struct mt352_state*) fe->demodulator_priv;
416
417         *ber = (mt352_read_register (state, RS_ERR_CNT_2) << 16) |
418                (mt352_read_register (state, RS_ERR_CNT_1) << 8) |
419                (mt352_read_register (state, RS_ERR_CNT_0));
420
421                         return 0;
422         }
423
424 static int mt352_read_signal_strength(struct dvb_frontend* fe, u16* strength)
425 {
426         struct mt352_state* state = (struct mt352_state*) fe->demodulator_priv;
427
428         u16 signal = (mt352_read_register (state, AGC_GAIN_3) << 8) |
429                      (mt352_read_register (state, AGC_GAIN_2));
430
431         *strength = ~signal;
432         return 0;
433 }
434
435 static int mt352_read_snr(struct dvb_frontend* fe, u16* snr)
436 {
437         struct mt352_state* state = (struct mt352_state*) fe->demodulator_priv;
438
439         u8 _snr = mt352_read_register (state, SNR);
440         *snr = (_snr << 8) | _snr;
441
442         return 0;
443 }
444
445 static int mt352_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
446 {
447         struct mt352_state* state = (struct mt352_state*) fe->demodulator_priv;
448
449         *ucblocks = (mt352_read_register (state,  RS_UBC_1) << 8) |
450                     (mt352_read_register (state,  RS_UBC_0));
451
452         return 0;
453         }
454
455 static int mt352_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fe_tune_settings)
456 {
457         fe_tune_settings->min_delay_ms = 800;
458         fe_tune_settings->step_size = 0;
459         fe_tune_settings->max_drift = 0;
460
461         return 0;
462         }
463
464 static int mt352_init(struct dvb_frontend* fe)
465 {
466         struct mt352_state* state = (struct mt352_state*) fe->demodulator_priv;
467
468         static u8 mt352_reset_attach [] = { RESET, 0xC0 };
469
470         if ((mt352_read_register(state, CLOCK_CTL) & 0x10) == 0 ||
471             (mt352_read_register(state, CONFIG) & 0x20) == 0) {
472
473         /* Do a "hard" reset */
474                 mt352_write(fe, mt352_reset_attach, sizeof(mt352_reset_attach));
475                 return state->config->demod_init(fe);
476         }
477
478         return 0;
479         }
480
481 static void mt352_release(struct dvb_frontend* fe)
482 {
483         struct mt352_state* state = (struct mt352_state*) fe->demodulator_priv;
484                 kfree(state);
485         }
486
487 static struct dvb_frontend_ops mt352_ops;
488
489 struct dvb_frontend* mt352_attach(const struct mt352_config* config,
490                                   struct i2c_adapter* i2c)
491 {
492         struct mt352_state* state = NULL;
493
494         /* allocate memory for the internal state */
495         state = (struct mt352_state*) kmalloc(sizeof(struct mt352_state), GFP_KERNEL);
496         if (state == NULL) goto error;
497
498         /* setup the state */
499         state->config = config;
500         state->i2c = i2c;
501         memcpy(&state->ops, &mt352_ops, sizeof(struct dvb_frontend_ops));
502
503         /* check if the demod is there */
504         if (mt352_read_register(state, CHIP_ID) != ID_MT352) goto error;
505
506         /* create dvb_frontend */
507         state->frontend.ops = &state->ops;
508         state->frontend.demodulator_priv = state;
509         return &state->frontend;
510
511 error:
512         if (state) kfree(state);
513         return NULL;
514 }
515
516 static struct dvb_frontend_ops mt352_ops = {
517
518         .info = {
519                 .name                   = "Zarlink MT352 DVB-T",
520                 .type                   = FE_OFDM,
521                 .frequency_min          = 174000000,
522                 .frequency_max          = 862000000,
523                 .frequency_stepsize     = 166667,
524                 .frequency_tolerance    = 0,
525                 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
526                         FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
527                         FE_CAN_FEC_AUTO |
528                         FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
529                         FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO |
530                         FE_CAN_HIERARCHY_AUTO | FE_CAN_RECOVER |
531                         FE_CAN_MUTE_TS
532         },
533
534         .release = mt352_release,
535
536         .init = mt352_init,
537         .sleep = mt352_sleep,
538
539         .set_frontend = mt352_set_parameters,
540         .get_frontend = mt352_get_parameters,
541         .get_tune_settings = mt352_get_tune_settings,
542
543         .read_status = mt352_read_status,
544         .read_ber = mt352_read_ber,
545         .read_signal_strength = mt352_read_signal_strength,
546         .read_snr = mt352_read_snr,
547         .read_ucblocks = mt352_read_ucblocks,
548 };
549
550 module_param(debug, int, 0644);
551 MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
552
553 MODULE_DESCRIPTION("Zarlink MT352 DVB-T Demodulator driver");
554 MODULE_AUTHOR("Holger Waechtler, Daniel Mack, Antonio Mancuso");
555 MODULE_LICENSE("GPL");
556
557 EXPORT_SYMBOL(mt352_attach);
558 EXPORT_SYMBOL(mt352_write);