1
2
3
4
5
6
7
8
9
10
11#include <linux/init.h>
12#include <linux/kernel.h>
13#include <linux/module.h>
14#include <linux/string.h>
15#include <linux/slab.h>
16#include <media/dvb_frontend.h>
17#include "l64781.h"
18
19
20struct l64781_state {
21 struct i2c_adapter* i2c;
22 const struct l64781_config* config;
23 struct dvb_frontend frontend;
24
25
26 unsigned int first:1;
27};
28
29#define dprintk(args...) \
30 do { \
31 if (debug) printk(KERN_DEBUG "l64781: " args); \
32 } while (0)
33
34static int debug;
35
36module_param(debug, int, 0644);
37MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
38
39
40static int l64781_writereg (struct l64781_state* state, u8 reg, u8 data)
41{
42 int ret;
43 u8 buf [] = { reg, data };
44 struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0, .buf = buf, .len = 2 };
45
46 if ((ret = i2c_transfer(state->i2c, &msg, 1)) != 1)
47 dprintk ("%s: write_reg error (reg == %02x) = %02x!\n",
48 __func__, reg, ret);
49
50 return (ret != 1) ? -1 : 0;
51}
52
53static int l64781_readreg (struct l64781_state* state, u8 reg)
54{
55 int ret;
56 u8 b0 [] = { reg };
57 u8 b1 [] = { 0 };
58 struct i2c_msg msg [] = { { .addr = state->config->demod_address, .flags = 0, .buf = b0, .len = 1 },
59 { .addr = state->config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 1 } };
60
61 ret = i2c_transfer(state->i2c, msg, 2);
62
63 if (ret != 2) return ret;
64
65 return b1[0];
66}
67
68static void apply_tps (struct l64781_state* state)
69{
70 l64781_writereg (state, 0x2a, 0x00);
71 l64781_writereg (state, 0x2a, 0x01);
72
73
74
75
76
77
78 l64781_writereg (state, 0x2a, 0x02);
79}
80
81
82static void reset_afc (struct l64781_state* state)
83{
84
85
86 l64781_writereg (state, 0x07, 0x9e);
87 l64781_writereg (state, 0x08, 0);
88 l64781_writereg (state, 0x09, 0);
89 l64781_writereg (state, 0x0a, 0);
90 l64781_writereg (state, 0x07, 0x8e);
91 l64781_writereg (state, 0x0e, 0);
92 l64781_writereg (state, 0x11, 0x80);
93 l64781_writereg (state, 0x10, 0);
94 l64781_writereg (state, 0x12, 0);
95 l64781_writereg (state, 0x13, 0);
96 l64781_writereg (state, 0x11, 0x00);
97}
98
99static int reset_and_configure (struct l64781_state* state)
100{
101 u8 buf [] = { 0x06 };
102 struct i2c_msg msg = { .addr = 0x00, .flags = 0, .buf = buf, .len = 1 };
103
104
105 return (i2c_transfer(state->i2c, &msg, 1) == 1) ? 0 : -ENODEV;
106}
107
108static int apply_frontend_param(struct dvb_frontend *fe)
109{
110 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
111 struct l64781_state* state = fe->demodulator_priv;
112
113 static const u8 fec_tab[] = { 7, 0, 1, 2, 9, 3, 10, 4 };
114
115 static const u8 qam_tab [] = { 2, 4, 0, 6 };
116 static const u8 guard_tab [] = { 1, 2, 4, 8 };
117
118 static const u32 ppm = 8000;
119 u32 ddfs_offset_fixed;
120
121
122 u32 init_freq;
123 u32 spi_bias;
124 u8 val0x04;
125 u8 val0x05;
126 u8 val0x06;
127 int bw;
128
129 switch (p->bandwidth_hz) {
130 case 8000000:
131 bw = 8;
132 break;
133 case 7000000:
134 bw = 7;
135 break;
136 case 6000000:
137 bw = 6;
138 break;
139 default:
140 return -EINVAL;
141 }
142
143 if (fe->ops.tuner_ops.set_params) {
144 fe->ops.tuner_ops.set_params(fe);
145 if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0);
146 }
147
148 if (p->inversion != INVERSION_ON &&
149 p->inversion != INVERSION_OFF)
150 return -EINVAL;
151
152 if (p->code_rate_HP != FEC_1_2 && p->code_rate_HP != FEC_2_3 &&
153 p->code_rate_HP != FEC_3_4 && p->code_rate_HP != FEC_5_6 &&
154 p->code_rate_HP != FEC_7_8)
155 return -EINVAL;
156
157 if (p->hierarchy != HIERARCHY_NONE &&
158 (p->code_rate_LP != FEC_1_2 && p->code_rate_LP != FEC_2_3 &&
159 p->code_rate_LP != FEC_3_4 && p->code_rate_LP != FEC_5_6 &&
160 p->code_rate_LP != FEC_7_8))
161 return -EINVAL;
162
163 if (p->modulation != QPSK && p->modulation != QAM_16 &&
164 p->modulation != QAM_64)
165 return -EINVAL;
166
167 if (p->transmission_mode != TRANSMISSION_MODE_2K &&
168 p->transmission_mode != TRANSMISSION_MODE_8K)
169 return -EINVAL;
170
171 if ((int)p->guard_interval < GUARD_INTERVAL_1_32 ||
172 p->guard_interval > GUARD_INTERVAL_1_4)
173 return -EINVAL;
174
175 if ((int)p->hierarchy < HIERARCHY_NONE ||
176 p->hierarchy > HIERARCHY_4)
177 return -EINVAL;
178
179 ddfs_offset_fixed = 0x4000-(ppm<<16)/bw/1000000;
180
181
182 init_freq = (((8UL<<25) + (8UL<<19) / 25*ppm / (15625/25)) /
183 bw & 0xFFFFFF);
184
185
186
187 spi_bias = 378 * (1 << 10);
188 spi_bias *= 16;
189 spi_bias *= bw;
190 spi_bias *= qam_tab[p->modulation];
191 spi_bias /= p->code_rate_HP + 1;
192 spi_bias /= (guard_tab[p->guard_interval] + 32);
193 spi_bias *= 1000;
194 spi_bias /= 1000 + ppm/1000;
195 spi_bias *= p->code_rate_HP;
196
197 val0x04 = (p->transmission_mode << 2) | p->guard_interval;
198 val0x05 = fec_tab[p->code_rate_HP];
199
200 if (p->hierarchy != HIERARCHY_NONE)
201 val0x05 |= (p->code_rate_LP - FEC_1_2) << 3;
202
203 val0x06 = (p->hierarchy << 2) | p->modulation;
204
205 l64781_writereg (state, 0x04, val0x04);
206 l64781_writereg (state, 0x05, val0x05);
207 l64781_writereg (state, 0x06, val0x06);
208
209 reset_afc (state);
210
211
212 l64781_writereg (state, 0x15,
213 p->transmission_mode == TRANSMISSION_MODE_2K ? 1 : 3);
214 l64781_writereg (state, 0x16, init_freq & 0xff);
215 l64781_writereg (state, 0x17, (init_freq >> 8) & 0xff);
216 l64781_writereg (state, 0x18, (init_freq >> 16) & 0xff);
217
218 l64781_writereg (state, 0x1b, spi_bias & 0xff);
219 l64781_writereg (state, 0x1c, (spi_bias >> 8) & 0xff);
220 l64781_writereg (state, 0x1d, ((spi_bias >> 16) & 0x7f) |
221 (p->inversion == INVERSION_ON ? 0x80 : 0x00));
222
223 l64781_writereg (state, 0x22, ddfs_offset_fixed & 0xff);
224 l64781_writereg (state, 0x23, (ddfs_offset_fixed >> 8) & 0x3f);
225
226 l64781_readreg (state, 0x00);
227 l64781_readreg (state, 0x01);
228
229 apply_tps (state);
230
231 return 0;
232}
233
234static int get_frontend(struct dvb_frontend *fe,
235 struct dtv_frontend_properties *p)
236{
237 struct l64781_state* state = fe->demodulator_priv;
238 int tmp;
239
240
241 tmp = l64781_readreg(state, 0x04);
242 switch(tmp & 3) {
243 case 0:
244 p->guard_interval = GUARD_INTERVAL_1_32;
245 break;
246 case 1:
247 p->guard_interval = GUARD_INTERVAL_1_16;
248 break;
249 case 2:
250 p->guard_interval = GUARD_INTERVAL_1_8;
251 break;
252 case 3:
253 p->guard_interval = GUARD_INTERVAL_1_4;
254 break;
255 }
256 switch((tmp >> 2) & 3) {
257 case 0:
258 p->transmission_mode = TRANSMISSION_MODE_2K;
259 break;
260 case 1:
261 p->transmission_mode = TRANSMISSION_MODE_8K;
262 break;
263 default:
264 printk(KERN_WARNING "Unexpected value for transmission_mode\n");
265 }
266
267 tmp = l64781_readreg(state, 0x05);
268 switch(tmp & 7) {
269 case 0:
270 p->code_rate_HP = FEC_1_2;
271 break;
272 case 1:
273 p->code_rate_HP = FEC_2_3;
274 break;
275 case 2:
276 p->code_rate_HP = FEC_3_4;
277 break;
278 case 3:
279 p->code_rate_HP = FEC_5_6;
280 break;
281 case 4:
282 p->code_rate_HP = FEC_7_8;
283 break;
284 default:
285 printk("Unexpected value for code_rate_HP\n");
286 }
287 switch((tmp >> 3) & 7) {
288 case 0:
289 p->code_rate_LP = FEC_1_2;
290 break;
291 case 1:
292 p->code_rate_LP = FEC_2_3;
293 break;
294 case 2:
295 p->code_rate_LP = FEC_3_4;
296 break;
297 case 3:
298 p->code_rate_LP = FEC_5_6;
299 break;
300 case 4:
301 p->code_rate_LP = FEC_7_8;
302 break;
303 default:
304 printk("Unexpected value for code_rate_LP\n");
305 }
306
307 tmp = l64781_readreg(state, 0x06);
308 switch(tmp & 3) {
309 case 0:
310 p->modulation = QPSK;
311 break;
312 case 1:
313 p->modulation = QAM_16;
314 break;
315 case 2:
316 p->modulation = QAM_64;
317 break;
318 default:
319 printk(KERN_WARNING "Unexpected value for modulation\n");
320 }
321 switch((tmp >> 2) & 7) {
322 case 0:
323 p->hierarchy = HIERARCHY_NONE;
324 break;
325 case 1:
326 p->hierarchy = HIERARCHY_1;
327 break;
328 case 2:
329 p->hierarchy = HIERARCHY_2;
330 break;
331 case 3:
332 p->hierarchy = HIERARCHY_4;
333 break;
334 default:
335 printk("Unexpected value for hierarchy\n");
336 }
337
338
339 tmp = l64781_readreg (state, 0x1d);
340 p->inversion = (tmp & 0x80) ? INVERSION_ON : INVERSION_OFF;
341
342 tmp = (int) (l64781_readreg (state, 0x08) |
343 (l64781_readreg (state, 0x09) << 8) |
344 (l64781_readreg (state, 0x0a) << 16));
345 p->frequency += tmp;
346
347 return 0;
348}
349
350static int l64781_read_status(struct dvb_frontend *fe, enum fe_status *status)
351{
352 struct l64781_state* state = fe->demodulator_priv;
353 int sync = l64781_readreg (state, 0x32);
354 int gain = l64781_readreg (state, 0x0e);
355
356 l64781_readreg (state, 0x00);
357 l64781_readreg (state, 0x01);
358
359 *status = 0;
360
361 if (gain > 5)
362 *status |= FE_HAS_SIGNAL;
363
364 if (sync & 0x02)
365 *status |= FE_HAS_CARRIER;
366
367 if (sync & 0x20)
368 *status |= FE_HAS_VITERBI;
369
370 if (sync & 0x40)
371 *status |= FE_HAS_SYNC;
372
373 if (sync == 0x7f)
374 *status |= FE_HAS_LOCK;
375
376 return 0;
377}
378
379static int l64781_read_ber(struct dvb_frontend* fe, u32* ber)
380{
381 struct l64781_state* state = fe->demodulator_priv;
382
383
384
385 *ber = l64781_readreg (state, 0x39)
386 | (l64781_readreg (state, 0x3a) << 8);
387
388 return 0;
389}
390
391static int l64781_read_signal_strength(struct dvb_frontend* fe, u16* signal_strength)
392{
393 struct l64781_state* state = fe->demodulator_priv;
394
395 u8 gain = l64781_readreg (state, 0x0e);
396 *signal_strength = (gain << 8) | gain;
397
398 return 0;
399}
400
401static int l64781_read_snr(struct dvb_frontend* fe, u16* snr)
402{
403 struct l64781_state* state = fe->demodulator_priv;
404
405 u8 avg_quality = 0xff - l64781_readreg (state, 0x33);
406 *snr = (avg_quality << 8) | avg_quality;
407
408 return 0;
409}
410
411static int l64781_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
412{
413 struct l64781_state* state = fe->demodulator_priv;
414
415 *ucblocks = l64781_readreg (state, 0x37)
416 | (l64781_readreg (state, 0x38) << 8);
417
418 return 0;
419}
420
421static int l64781_sleep(struct dvb_frontend* fe)
422{
423 struct l64781_state* state = fe->demodulator_priv;
424
425
426 return l64781_writereg (state, 0x3e, 0x5a);
427}
428
429static int l64781_init(struct dvb_frontend* fe)
430{
431 struct l64781_state* state = fe->demodulator_priv;
432
433 reset_and_configure (state);
434
435
436 l64781_writereg (state, 0x3e, 0xa5);
437
438
439 l64781_writereg (state, 0x2a, 0x04);
440 l64781_writereg (state, 0x2a, 0x00);
441
442
443
444 l64781_writereg (state, 0x07, 0x8e);
445
446
447 l64781_writereg (state, 0x0b, 0x81);
448
449
450 l64781_writereg (state, 0x0c, 0x84);
451
452
453 l64781_writereg (state, 0x0d, 0x8c);
454
455
456
457
458
459
460
461 l64781_writereg (state, 0x1e, 0x09);
462
463
464 if (state->first) {
465 state->first = 0;
466 msleep(200);
467 }
468
469 return 0;
470}
471
472static int l64781_get_tune_settings(struct dvb_frontend* fe,
473 struct dvb_frontend_tune_settings* fesettings)
474{
475 fesettings->min_delay_ms = 4000;
476 fesettings->step_size = 0;
477 fesettings->max_drift = 0;
478 return 0;
479}
480
481static void l64781_release(struct dvb_frontend* fe)
482{
483 struct l64781_state* state = fe->demodulator_priv;
484 kfree(state);
485}
486
487static const struct dvb_frontend_ops l64781_ops;
488
489struct dvb_frontend* l64781_attach(const struct l64781_config* config,
490 struct i2c_adapter* i2c)
491{
492 struct l64781_state* state = NULL;
493 int reg0x3e = -1;
494 u8 b0 [] = { 0x1a };
495 u8 b1 [] = { 0x00 };
496 struct i2c_msg msg [] = { { .addr = config->demod_address, .flags = 0, .buf = b0, .len = 1 },
497 { .addr = config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 1 } };
498
499
500 state = kzalloc(sizeof(struct l64781_state), GFP_KERNEL);
501 if (state == NULL) goto error;
502
503
504 state->config = config;
505 state->i2c = i2c;
506 state->first = 1;
507
508
509
510
511
512 if (reset_and_configure(state) < 0) {
513 dprintk("No response to reset and configure broadcast...\n");
514 goto error;
515 }
516
517
518 if (i2c_transfer(state->i2c, msg, 2) != 2) {
519 dprintk("No response to read on I2C bus\n");
520 goto error;
521 }
522
523
524 reg0x3e = l64781_readreg(state, 0x3e);
525
526
527 if (reg0x3e != 0) {
528 dprintk("Device doesn't look like L64781\n");
529 goto error;
530 }
531
532
533 l64781_writereg (state, 0x3e, 0x5a);
534
535
536 if (l64781_readreg(state, 0x1a) != 0) {
537 dprintk("Read 1 returned unexpected value\n");
538 goto error;
539 }
540
541
542 l64781_writereg (state, 0x3e, 0xa5);
543
544
545 if (l64781_readreg(state, 0x1a) != 0xa1) {
546 dprintk("Read 2 returned unexpected value\n");
547 goto error;
548 }
549
550
551 memcpy(&state->frontend.ops, &l64781_ops, sizeof(struct dvb_frontend_ops));
552 state->frontend.demodulator_priv = state;
553 return &state->frontend;
554
555error:
556 if (reg0x3e >= 0)
557 l64781_writereg (state, 0x3e, reg0x3e);
558 kfree(state);
559 return NULL;
560}
561
562static const struct dvb_frontend_ops l64781_ops = {
563 .delsys = { SYS_DVBT },
564 .info = {
565 .name = "LSI L64781 DVB-T",
566
567
568 .frequency_stepsize_hz = 166666,
569
570 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
571 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
572 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
573 FE_CAN_MUTE_TS
574 },
575
576 .release = l64781_release,
577
578 .init = l64781_init,
579 .sleep = l64781_sleep,
580
581 .set_frontend = apply_frontend_param,
582 .get_frontend = get_frontend,
583 .get_tune_settings = l64781_get_tune_settings,
584
585 .read_status = l64781_read_status,
586 .read_ber = l64781_read_ber,
587 .read_signal_strength = l64781_read_signal_strength,
588 .read_snr = l64781_read_snr,
589 .read_ucblocks = l64781_read_ucblocks,
590};
591
592MODULE_DESCRIPTION("LSI L64781 DVB-T Demodulator driver");
593MODULE_AUTHOR("Holger Waechtler, Marko Kohtala");
594MODULE_LICENSE("GPL");
595
596EXPORT_SYMBOL(l64781_attach);
597