blob: 3373890c092ef548075662c2a11f4b0e9f6fd263 [file] [log] [blame]
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001/*
2 Montage Technology DS3000/TS2020 - DVBS/S2 Demodulator/Tuner driver
3 Copyright (C) 2009 Konstantin Dimitrov <kosio.dimitrov@gmail.com>
4
5 Copyright (C) 2009 TurboSight.com
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22#include <linux/slab.h>
23#include <linux/kernel.h>
24#include <linux/module.h>
25#include <linux/moduleparam.h>
26#include <linux/init.h>
27#include <linux/firmware.h>
28
29#include "dvb_frontend.h"
30#include "ds3000.h"
31
32static int debug;
33
34#define dprintk(args...) \
35 do { \
36 if (debug) \
37 printk(args); \
38 } while (0)
39
40/* as of March 2009 current DS3000 firmware version is 1.78 */
41/* DS3000 FW v1.78 MD5: a32d17910c4f370073f9346e71d34b80 */
42#define DS3000_DEFAULT_FIRMWARE "dvb-fe-ds3000.fw"
43
44#define DS3000_SAMPLE_RATE 96000 /* in kHz */
45#define DS3000_XTAL_FREQ 27000 /* in kHz */
46
47/* Register values to initialise the demod in DVB-S mode */
48static u8 ds3000_dvbs_init_tab[] = {
49 0x23, 0x05,
50 0x08, 0x03,
51 0x0c, 0x00,
52 0x21, 0x54,
53 0x25, 0x82,
54 0x27, 0x31,
55 0x30, 0x08,
56 0x31, 0x40,
57 0x32, 0x32,
58 0x33, 0x35,
59 0x35, 0xff,
60 0x3a, 0x00,
61 0x37, 0x10,
62 0x38, 0x10,
63 0x39, 0x02,
64 0x42, 0x60,
65 0x4a, 0x40,
66 0x4b, 0x04,
67 0x4d, 0x91,
68 0x5d, 0xc8,
69 0x50, 0x77,
70 0x51, 0x77,
71 0x52, 0x36,
72 0x53, 0x36,
73 0x56, 0x01,
74 0x63, 0x43,
75 0x64, 0x30,
76 0x65, 0x40,
77 0x68, 0x26,
78 0x69, 0x4c,
79 0x70, 0x20,
80 0x71, 0x70,
81 0x72, 0x04,
82 0x73, 0x00,
83 0x70, 0x40,
84 0x71, 0x70,
85 0x72, 0x04,
86 0x73, 0x00,
87 0x70, 0x60,
88 0x71, 0x70,
89 0x72, 0x04,
90 0x73, 0x00,
91 0x70, 0x80,
92 0x71, 0x70,
93 0x72, 0x04,
94 0x73, 0x00,
95 0x70, 0xa0,
96 0x71, 0x70,
97 0x72, 0x04,
98 0x73, 0x00,
99 0x70, 0x1f,
100 0x76, 0x00,
101 0x77, 0xd1,
102 0x78, 0x0c,
103 0x79, 0x80,
104 0x7f, 0x04,
105 0x7c, 0x00,
106 0x80, 0x86,
107 0x81, 0xa6,
108 0x85, 0x04,
109 0xcd, 0xf4,
110 0x90, 0x33,
111 0xa0, 0x44,
112 0xc0, 0x18,
113 0xc3, 0x10,
114 0xc4, 0x08,
115 0xc5, 0x80,
116 0xc6, 0x80,
117 0xc7, 0x0a,
118 0xc8, 0x1a,
119 0xc9, 0x80,
120 0xfe, 0x92,
121 0xe0, 0xf8,
122 0xe6, 0x8b,
123 0xd0, 0x40,
124 0xf8, 0x20,
125 0xfa, 0x0f,
126 0xfd, 0x20,
127 0xad, 0x20,
128 0xae, 0x07,
129 0xb8, 0x00,
130};
131
132/* Register values to initialise the demod in DVB-S2 mode */
133static u8 ds3000_dvbs2_init_tab[] = {
134 0x23, 0x0f,
135 0x08, 0x07,
136 0x0c, 0x00,
137 0x21, 0x54,
138 0x25, 0x82,
139 0x27, 0x31,
140 0x30, 0x08,
141 0x31, 0x32,
142 0x32, 0x32,
143 0x33, 0x35,
144 0x35, 0xff,
145 0x3a, 0x00,
146 0x37, 0x10,
147 0x38, 0x10,
148 0x39, 0x02,
149 0x42, 0x60,
150 0x4a, 0x80,
151 0x4b, 0x04,
152 0x4d, 0x81,
153 0x5d, 0x88,
154 0x50, 0x36,
155 0x51, 0x36,
156 0x52, 0x36,
157 0x53, 0x36,
158 0x63, 0x60,
159 0x64, 0x10,
160 0x65, 0x10,
161 0x68, 0x04,
162 0x69, 0x29,
163 0x70, 0x20,
164 0x71, 0x70,
165 0x72, 0x04,
166 0x73, 0x00,
167 0x70, 0x40,
168 0x71, 0x70,
169 0x72, 0x04,
170 0x73, 0x00,
171 0x70, 0x60,
172 0x71, 0x70,
173 0x72, 0x04,
174 0x73, 0x00,
175 0x70, 0x80,
176 0x71, 0x70,
177 0x72, 0x04,
178 0x73, 0x00,
179 0x70, 0xa0,
180 0x71, 0x70,
181 0x72, 0x04,
182 0x73, 0x00,
183 0x70, 0x1f,
184 0xa0, 0x44,
185 0xc0, 0x08,
186 0xc1, 0x10,
187 0xc2, 0x08,
188 0xc3, 0x10,
189 0xc4, 0x08,
190 0xc5, 0xf0,
191 0xc6, 0xf0,
192 0xc7, 0x0a,
193 0xc8, 0x1a,
194 0xc9, 0x80,
195 0xca, 0x23,
196 0xcb, 0x24,
197 0xce, 0x74,
198 0x90, 0x03,
199 0x76, 0x80,
200 0x77, 0x42,
201 0x78, 0x0a,
202 0x79, 0x80,
203 0xad, 0x40,
204 0xae, 0x07,
205 0x7f, 0xd4,
206 0x7c, 0x00,
207 0x80, 0xa8,
208 0x81, 0xda,
209 0x7c, 0x01,
210 0x80, 0xda,
211 0x81, 0xec,
212 0x7c, 0x02,
213 0x80, 0xca,
214 0x81, 0xeb,
215 0x7c, 0x03,
216 0x80, 0xba,
217 0x81, 0xdb,
218 0x85, 0x08,
219 0x86, 0x00,
220 0x87, 0x02,
221 0x89, 0x80,
222 0x8b, 0x44,
223 0x8c, 0xaa,
224 0x8a, 0x10,
225 0xba, 0x00,
226 0xf5, 0x04,
227 0xfe, 0x44,
228 0xd2, 0x32,
229 0xb8, 0x00,
230};
231
232/* DS3000 doesn't need some parameters as input and auto-detects them */
233/* save input from the application of those parameters */
234struct ds3000_tuning {
235 u32 frequency;
236 u32 symbol_rate;
237 fe_spectral_inversion_t inversion;
238 enum fe_code_rate fec;
239
240 /* input values */
241 u8 inversion_val;
242 fe_modulation_t delivery;
243 u8 rolloff;
244};
245
246struct ds3000_state {
247 struct i2c_adapter *i2c;
248 const struct ds3000_config *config;
249
250 struct dvb_frontend frontend;
251
252 struct ds3000_tuning dcur;
253 struct ds3000_tuning dnxt;
254
255 u8 skip_fw_load;
256
257 /* previous uncorrected block counter for DVB-S2 */
258 u16 prevUCBS2;
259};
260
261static int ds3000_writereg(struct ds3000_state *state, int reg, int data)
262{
263 u8 buf[] = { reg, data };
264 struct i2c_msg msg = { .addr = state->config->demod_address,
265 .flags = 0, .buf = buf, .len = 2 };
266 int err;
267
268 dprintk("%s: write reg 0x%02x, value 0x%02x\n", __func__, reg, data);
269
270 err = i2c_transfer(state->i2c, &msg, 1);
271 if (err != 1) {
272 printk(KERN_ERR "%s: writereg error(err == %i, reg == 0x%02x,"
273 " value == 0x%02x)\n", __func__, err, reg, data);
274 return -EREMOTEIO;
275 }
276
277 return 0;
278}
279
280static int ds3000_tuner_writereg(struct ds3000_state *state, int reg, int data)
281{
282 u8 buf[] = { reg, data };
283 struct i2c_msg msg = { .addr = 0x60,
284 .flags = 0, .buf = buf, .len = 2 };
285 int err;
286
287 dprintk("%s: write reg 0x%02x, value 0x%02x\n", __func__, reg, data);
288
289 ds3000_writereg(state, 0x03, 0x11);
290 err = i2c_transfer(state->i2c, &msg, 1);
291 if (err != 1) {
292 printk("%s: writereg error(err == %i, reg == 0x%02x,"
293 " value == 0x%02x)\n", __func__, err, reg, data);
294 return -EREMOTEIO;
295 }
296
297 return 0;
298}
299
300/* I2C write for 8k firmware load */
301static int ds3000_writeFW(struct ds3000_state *state, int reg,
302 const u8 *data, u16 len)
303{
304 int i, ret = -EREMOTEIO;
305 struct i2c_msg msg;
306 u8 *buf;
307
Igor M. Liplianincaa687c2011-02-01 19:40:25 -0300308 buf = kmalloc(33, GFP_KERNEL);
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300309 if (buf == NULL) {
310 printk(KERN_ERR "Unable to kmalloc\n");
311 ret = -ENOMEM;
312 goto error;
313 }
314
315 *(buf) = reg;
316
317 msg.addr = state->config->demod_address;
318 msg.flags = 0;
319 msg.buf = buf;
Igor M. Liplianincaa687c2011-02-01 19:40:25 -0300320 msg.len = 33;
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300321
Igor M. Liplianincaa687c2011-02-01 19:40:25 -0300322 for (i = 0; i < len; i += 32) {
323 memcpy(buf + 1, data + i, 32);
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300324
325 dprintk("%s: write reg 0x%02x, len = %d\n", __func__, reg, len);
326
327 ret = i2c_transfer(state->i2c, &msg, 1);
328 if (ret != 1) {
329 printk(KERN_ERR "%s: write error(err == %i, "
330 "reg == 0x%02x\n", __func__, ret, reg);
331 ret = -EREMOTEIO;
332 }
333 }
334
335error:
336 kfree(buf);
337
338 return ret;
339}
340
341static int ds3000_readreg(struct ds3000_state *state, u8 reg)
342{
343 int ret;
344 u8 b0[] = { reg };
345 u8 b1[] = { 0 };
346 struct i2c_msg msg[] = {
347 {
348 .addr = state->config->demod_address,
349 .flags = 0,
350 .buf = b0,
351 .len = 1
352 }, {
353 .addr = state->config->demod_address,
354 .flags = I2C_M_RD,
355 .buf = b1,
356 .len = 1
357 }
358 };
359
360 ret = i2c_transfer(state->i2c, msg, 2);
361
362 if (ret != 2) {
363 printk(KERN_ERR "%s: reg=0x%x(error=%d)\n", __func__, reg, ret);
364 return ret;
365 }
366
367 dprintk("%s: read reg 0x%02x, value 0x%02x\n", __func__, reg, b1[0]);
368
369 return b1[0];
370}
371
372static int ds3000_tuner_readreg(struct ds3000_state *state, u8 reg)
373{
374 int ret;
375 u8 b0[] = { reg };
376 u8 b1[] = { 0 };
377 struct i2c_msg msg[] = {
378 {
379 .addr = 0x60,
380 .flags = 0,
381 .buf = b0,
382 .len = 1
383 }, {
384 .addr = 0x60,
385 .flags = I2C_M_RD,
386 .buf = b1,
387 .len = 1
388 }
389 };
390
391 ds3000_writereg(state, 0x03, 0x12);
392 ret = i2c_transfer(state->i2c, msg, 2);
393
394 if (ret != 2) {
395 printk(KERN_ERR "%s: reg=0x%x(error=%d)\n", __func__, reg, ret);
396 return ret;
397 }
398
399 dprintk("%s: read reg 0x%02x, value 0x%02x\n", __func__, reg, b1[0]);
400
401 return b1[0];
402}
403
404static int ds3000_set_inversion(struct ds3000_state *state,
405 fe_spectral_inversion_t inversion)
406{
407 dprintk("%s(%d)\n", __func__, inversion);
408
409 switch (inversion) {
410 case INVERSION_OFF:
411 case INVERSION_ON:
412 case INVERSION_AUTO:
413 break;
414 default:
415 return -EINVAL;
416 }
417
418 state->dnxt.inversion = inversion;
419
420 return 0;
421}
422
423static int ds3000_set_symbolrate(struct ds3000_state *state, u32 rate)
424{
425 int ret = 0;
426
427 dprintk("%s()\n", __func__);
428
429 dprintk("%s() symbol_rate = %d\n", __func__, state->dnxt.symbol_rate);
430
431 /* check if symbol rate is within limits */
432 if ((state->dnxt.symbol_rate >
433 state->frontend.ops.info.symbol_rate_max) ||
434 (state->dnxt.symbol_rate <
435 state->frontend.ops.info.symbol_rate_min))
436 ret = -EOPNOTSUPP;
437
438 state->dnxt.symbol_rate = rate;
439
440 return ret;
441}
442
443static int ds3000_load_firmware(struct dvb_frontend *fe,
444 const struct firmware *fw);
445
446static int ds3000_firmware_ondemand(struct dvb_frontend *fe)
447{
448 struct ds3000_state *state = fe->demodulator_priv;
449 const struct firmware *fw;
450 int ret = 0;
451
452 dprintk("%s()\n", __func__);
453
454 if (ds3000_readreg(state, 0xb2) <= 0)
455 return ret;
456
457 if (state->skip_fw_load)
458 return 0;
459 /* Load firmware */
460 /* request the firmware, this will block until someone uploads it */
461 printk(KERN_INFO "%s: Waiting for firmware upload (%s)...\n", __func__,
462 DS3000_DEFAULT_FIRMWARE);
463 ret = request_firmware(&fw, DS3000_DEFAULT_FIRMWARE,
464 state->i2c->dev.parent);
465 printk(KERN_INFO "%s: Waiting for firmware upload(2)...\n", __func__);
466 if (ret) {
467 printk(KERN_ERR "%s: No firmware uploaded (timeout or file not "
468 "found?)\n", __func__);
469 return ret;
470 }
471
472 /* Make sure we don't recurse back through here during loading */
473 state->skip_fw_load = 1;
474
475 ret = ds3000_load_firmware(fe, fw);
476 if (ret)
477 printk("%s: Writing firmware to device failed\n", __func__);
478
479 release_firmware(fw);
480
481 dprintk("%s: Firmware upload %s\n", __func__,
482 ret == 0 ? "complete" : "failed");
483
484 /* Ensure firmware is always loaded if required */
485 state->skip_fw_load = 0;
486
487 return ret;
488}
489
490static int ds3000_load_firmware(struct dvb_frontend *fe,
491 const struct firmware *fw)
492{
493 struct ds3000_state *state = fe->demodulator_priv;
494
495 dprintk("%s\n", __func__);
496 dprintk("Firmware is %zu bytes (%02x %02x .. %02x %02x)\n",
497 fw->size,
498 fw->data[0],
499 fw->data[1],
500 fw->data[fw->size - 2],
501 fw->data[fw->size - 1]);
502
503 /* Begin the firmware load process */
504 ds3000_writereg(state, 0xb2, 0x01);
505 /* write the entire firmware */
506 ds3000_writeFW(state, 0xb0, fw->data, fw->size);
507 ds3000_writereg(state, 0xb2, 0x00);
508
509 return 0;
510}
511
Igor M. Liplianind2ffc442011-02-25 18:41:22 -0300512static int ds3000_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
513{
514 struct ds3000_state *state = fe->demodulator_priv;
515 u8 data;
516
517 dprintk("%s(%d)\n", __func__, voltage);
518
519 data = ds3000_readreg(state, 0xa2);
520 data |= 0x03; /* bit0 V/H, bit1 off/on */
521
522 switch (voltage) {
523 case SEC_VOLTAGE_18:
524 data &= ~0x03;
525 break;
526 case SEC_VOLTAGE_13:
527 data &= ~0x03;
528 data |= 0x01;
529 break;
530 case SEC_VOLTAGE_OFF:
531 break;
532 }
533
534 ds3000_writereg(state, 0xa2, data);
535
536 return 0;
537}
538
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300539static void ds3000_dump_registers(struct dvb_frontend *fe)
540{
541 struct ds3000_state *state = fe->demodulator_priv;
542 int x, y, reg = 0, val;
543
544 for (y = 0; y < 16; y++) {
545 dprintk("%s: %02x: ", __func__, y);
546 for (x = 0; x < 16; x++) {
547 reg = (y << 4) + x;
548 val = ds3000_readreg(state, reg);
549 if (x != 15)
550 dprintk("%02x ", val);
551 else
552 dprintk("%02x\n", val);
553 }
554 }
555 dprintk("%s: -- DS3000 DUMP DONE --\n", __func__);
556}
557
558static int ds3000_read_status(struct dvb_frontend *fe, fe_status_t* status)
559{
560 struct ds3000_state *state = fe->demodulator_priv;
561 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
562 int lock;
563
564 *status = 0;
565
566 switch (c->delivery_system) {
567 case SYS_DVBS:
568 lock = ds3000_readreg(state, 0xd1);
569 if ((lock & 0x07) == 0x07)
570 *status = FE_HAS_SIGNAL | FE_HAS_CARRIER |
571 FE_HAS_VITERBI | FE_HAS_SYNC |
572 FE_HAS_LOCK;
573
574 break;
575 case SYS_DVBS2:
576 lock = ds3000_readreg(state, 0x0d);
577 if ((lock & 0x8f) == 0x8f)
578 *status = FE_HAS_SIGNAL | FE_HAS_CARRIER |
579 FE_HAS_VITERBI | FE_HAS_SYNC |
580 FE_HAS_LOCK;
581
582 break;
583 default:
584 return 1;
585 }
586
587 dprintk("%s: status = 0x%02x\n", __func__, lock);
588
589 return 0;
590}
591
592#define FE_IS_TUNED (FE_HAS_SIGNAL + FE_HAS_LOCK)
593static int ds3000_is_tuned(struct dvb_frontend *fe)
594{
595 fe_status_t tunerstat;
596
597 ds3000_read_status(fe, &tunerstat);
598
599 return ((tunerstat & FE_IS_TUNED) == FE_IS_TUNED);
600}
601
602/* read DS3000 BER value */
603static int ds3000_read_ber(struct dvb_frontend *fe, u32* ber)
604{
605 struct ds3000_state *state = fe->demodulator_priv;
606 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
607 u8 data;
608 u32 ber_reading, lpdc_frames;
609
610 dprintk("%s()\n", __func__);
611
612 switch (c->delivery_system) {
613 case SYS_DVBS:
614 /* set the number of bytes checked during
615 BER estimation */
616 ds3000_writereg(state, 0xf9, 0x04);
617 /* read BER estimation status */
618 data = ds3000_readreg(state, 0xf8);
619 /* check if BER estimation is ready */
620 if ((data & 0x10) == 0) {
621 /* this is the number of error bits,
622 to calculate the bit error rate
623 divide to 8388608 */
624 *ber = (ds3000_readreg(state, 0xf7) << 8) |
625 ds3000_readreg(state, 0xf6);
626 /* start counting error bits */
627 /* need to be set twice
628 otherwise it fails sometimes */
629 data |= 0x10;
630 ds3000_writereg(state, 0xf8, data);
631 ds3000_writereg(state, 0xf8, data);
632 } else
633 /* used to indicate that BER estimation
634 is not ready, i.e. BER is unknown */
635 *ber = 0xffffffff;
636 break;
637 case SYS_DVBS2:
638 /* read the number of LPDC decoded frames */
639 lpdc_frames = (ds3000_readreg(state, 0xd7) << 16) |
640 (ds3000_readreg(state, 0xd6) << 8) |
641 ds3000_readreg(state, 0xd5);
642 /* read the number of packets with bad CRC */
643 ber_reading = (ds3000_readreg(state, 0xf8) << 8) |
644 ds3000_readreg(state, 0xf7);
645 if (lpdc_frames > 750) {
646 /* clear LPDC frame counters */
647 ds3000_writereg(state, 0xd1, 0x01);
648 /* clear bad packets counter */
649 ds3000_writereg(state, 0xf9, 0x01);
650 /* enable bad packets counter */
651 ds3000_writereg(state, 0xf9, 0x00);
652 /* enable LPDC frame counters */
653 ds3000_writereg(state, 0xd1, 0x00);
654 *ber = ber_reading;
655 } else
656 /* used to indicate that BER estimation is not ready,
657 i.e. BER is unknown */
658 *ber = 0xffffffff;
659 break;
660 default:
661 return 1;
662 }
663
664 return 0;
665}
666
667/* read TS2020 signal strength */
668static int ds3000_read_signal_strength(struct dvb_frontend *fe,
669 u16 *signal_strength)
670{
671 struct ds3000_state *state = fe->demodulator_priv;
672 u16 sig_reading, sig_strength;
673 u8 rfgain, bbgain;
674
675 dprintk("%s()\n", __func__);
676
677 rfgain = ds3000_tuner_readreg(state, 0x3d) & 0x1f;
678 bbgain = ds3000_tuner_readreg(state, 0x21) & 0x1f;
679
680 if (rfgain > 15)
681 rfgain = 15;
682 if (bbgain > 13)
683 bbgain = 13;
684
685 sig_reading = rfgain * 2 + bbgain * 3;
686
687 sig_strength = 40 + (64 - sig_reading) * 50 / 64 ;
688
689 /* cook the value to be suitable for szap-s2 human readable output */
690 *signal_strength = sig_strength * 1000;
691
692 dprintk("%s: raw / cooked = 0x%04x / 0x%04x\n", __func__,
693 sig_reading, *signal_strength);
694
695 return 0;
696}
697
698/* calculate DS3000 snr value in dB */
699static int ds3000_read_snr(struct dvb_frontend *fe, u16 *snr)
700{
701 struct ds3000_state *state = fe->demodulator_priv;
702 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
703 u8 snr_reading, snr_value;
704 u32 dvbs2_signal_reading, dvbs2_noise_reading, tmp;
705 static const u16 dvbs_snr_tab[] = { /* 20 x Table (rounded up) */
706 0x0000, 0x1b13, 0x2aea, 0x3627, 0x3ede, 0x45fe, 0x4c03,
707 0x513a, 0x55d4, 0x59f2, 0x5dab, 0x6111, 0x6431, 0x6717,
708 0x69c9, 0x6c4e, 0x6eac, 0x70e8, 0x7304, 0x7505
709 };
710 static const u16 dvbs2_snr_tab[] = { /* 80 x Table (rounded up) */
711 0x0000, 0x0bc2, 0x12a3, 0x1785, 0x1b4e, 0x1e65, 0x2103,
712 0x2347, 0x2546, 0x2710, 0x28ae, 0x2a28, 0x2b83, 0x2cc5,
713 0x2df1, 0x2f09, 0x3010, 0x3109, 0x31f4, 0x32d2, 0x33a6,
714 0x3470, 0x3531, 0x35ea, 0x369b, 0x3746, 0x37ea, 0x3888,
715 0x3920, 0x39b3, 0x3a42, 0x3acc, 0x3b51, 0x3bd3, 0x3c51,
716 0x3ccb, 0x3d42, 0x3db6, 0x3e27, 0x3e95, 0x3f00, 0x3f68,
717 0x3fcf, 0x4033, 0x4094, 0x40f4, 0x4151, 0x41ac, 0x4206,
718 0x425e, 0x42b4, 0x4308, 0x435b, 0x43ac, 0x43fc, 0x444a,
719 0x4497, 0x44e2, 0x452d, 0x4576, 0x45bd, 0x4604, 0x4649,
720 0x468e, 0x46d1, 0x4713, 0x4755, 0x4795, 0x47d4, 0x4813,
721 0x4851, 0x488d, 0x48c9, 0x4904, 0x493f, 0x4978, 0x49b1,
722 0x49e9, 0x4a20, 0x4a57
723 };
724
725 dprintk("%s()\n", __func__);
726
727 switch (c->delivery_system) {
728 case SYS_DVBS:
729 snr_reading = ds3000_readreg(state, 0xff);
730 snr_reading /= 8;
731 if (snr_reading == 0)
732 *snr = 0x0000;
733 else {
734 if (snr_reading > 20)
735 snr_reading = 20;
736 snr_value = dvbs_snr_tab[snr_reading - 1] * 10 / 23026;
737 /* cook the value to be suitable for szap-s2
738 human readable output */
739 *snr = snr_value * 8 * 655;
740 }
741 dprintk("%s: raw / cooked = 0x%02x / 0x%04x\n", __func__,
742 snr_reading, *snr);
743 break;
744 case SYS_DVBS2:
745 dvbs2_noise_reading = (ds3000_readreg(state, 0x8c) & 0x3f) +
746 (ds3000_readreg(state, 0x8d) << 4);
747 dvbs2_signal_reading = ds3000_readreg(state, 0x8e);
748 tmp = dvbs2_signal_reading * dvbs2_signal_reading >> 1;
Nicolas Noirbent450df222010-03-22 14:54:43 -0300749 if (tmp == 0) {
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300750 *snr = 0x0000;
751 return 0;
752 }
753 if (dvbs2_noise_reading == 0) {
754 snr_value = 0x0013;
755 /* cook the value to be suitable for szap-s2
756 human readable output */
757 *snr = 0xffff;
758 return 0;
759 }
760 if (tmp > dvbs2_noise_reading) {
761 snr_reading = tmp / dvbs2_noise_reading;
762 if (snr_reading > 80)
763 snr_reading = 80;
764 snr_value = dvbs2_snr_tab[snr_reading - 1] / 1000;
765 /* cook the value to be suitable for szap-s2
766 human readable output */
767 *snr = snr_value * 5 * 655;
768 } else {
769 snr_reading = dvbs2_noise_reading / tmp;
770 if (snr_reading > 80)
771 snr_reading = 80;
772 *snr = -(dvbs2_snr_tab[snr_reading] / 1000);
773 }
774 dprintk("%s: raw / cooked = 0x%02x / 0x%04x\n", __func__,
775 snr_reading, *snr);
776 break;
777 default:
778 return 1;
779 }
780
781 return 0;
782}
783
784/* read DS3000 uncorrected blocks */
785static int ds3000_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
786{
787 struct ds3000_state *state = fe->demodulator_priv;
788 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
789 u8 data;
790 u16 _ucblocks;
791
792 dprintk("%s()\n", __func__);
793
794 switch (c->delivery_system) {
795 case SYS_DVBS:
796 *ucblocks = (ds3000_readreg(state, 0xf5) << 8) |
797 ds3000_readreg(state, 0xf4);
798 data = ds3000_readreg(state, 0xf8);
799 /* clear packet counters */
800 data &= ~0x20;
801 ds3000_writereg(state, 0xf8, data);
802 /* enable packet counters */
803 data |= 0x20;
804 ds3000_writereg(state, 0xf8, data);
805 break;
806 case SYS_DVBS2:
807 _ucblocks = (ds3000_readreg(state, 0xe2) << 8) |
808 ds3000_readreg(state, 0xe1);
809 if (_ucblocks > state->prevUCBS2)
810 *ucblocks = _ucblocks - state->prevUCBS2;
811 else
812 *ucblocks = state->prevUCBS2 - _ucblocks;
813 state->prevUCBS2 = _ucblocks;
814 break;
815 default:
816 return 1;
817 }
818
819 return 0;
820}
821
822/* Overwrite the current tuning params, we are about to tune */
823static void ds3000_clone_params(struct dvb_frontend *fe)
824{
825 struct ds3000_state *state = fe->demodulator_priv;
826 memcpy(&state->dcur, &state->dnxt, sizeof(state->dcur));
827}
828
829static int ds3000_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone)
830{
831 struct ds3000_state *state = fe->demodulator_priv;
832 u8 data;
833
834 dprintk("%s(%d)\n", __func__, tone);
835 if ((tone != SEC_TONE_ON) && (tone != SEC_TONE_OFF)) {
836 printk(KERN_ERR "%s: Invalid, tone=%d\n", __func__, tone);
837 return -EINVAL;
838 }
839
840 data = ds3000_readreg(state, 0xa2);
841 data &= ~0xc0;
842 ds3000_writereg(state, 0xa2, data);
843
844 switch (tone) {
845 case SEC_TONE_ON:
846 dprintk("%s: setting tone on\n", __func__);
847 data = ds3000_readreg(state, 0xa1);
848 data &= ~0x43;
849 data |= 0x04;
850 ds3000_writereg(state, 0xa1, data);
851 break;
852 case SEC_TONE_OFF:
853 dprintk("%s: setting tone off\n", __func__);
854 data = ds3000_readreg(state, 0xa2);
855 data |= 0x80;
856 ds3000_writereg(state, 0xa2, data);
857 break;
858 }
859
860 return 0;
861}
862
863static int ds3000_send_diseqc_msg(struct dvb_frontend *fe,
864 struct dvb_diseqc_master_cmd *d)
865{
866 struct ds3000_state *state = fe->demodulator_priv;
867 int i;
868 u8 data;
869
870 /* Dump DiSEqC message */
871 dprintk("%s(", __func__);
872 for (i = 0 ; i < d->msg_len;) {
873 dprintk("0x%02x", d->msg[i]);
874 if (++i < d->msg_len)
875 dprintk(", ");
876 }
877
878 /* enable DiSEqC message send pin */
879 data = ds3000_readreg(state, 0xa2);
880 data &= ~0xc0;
881 ds3000_writereg(state, 0xa2, data);
882
883 /* DiSEqC message */
884 for (i = 0; i < d->msg_len; i++)
885 ds3000_writereg(state, 0xa3 + i, d->msg[i]);
886
887 data = ds3000_readreg(state, 0xa1);
888 /* clear DiSEqC message length and status,
889 enable DiSEqC message send */
890 data &= ~0xf8;
891 /* set DiSEqC mode, modulation active during 33 pulses,
892 set DiSEqC message length */
893 data |= ((d->msg_len - 1) << 3) | 0x07;
894 ds3000_writereg(state, 0xa1, data);
895
896 /* wait up to 150ms for DiSEqC transmission to complete */
897 for (i = 0; i < 15; i++) {
898 data = ds3000_readreg(state, 0xa1);
899 if ((data & 0x40) == 0)
900 break;
901 msleep(10);
902 }
903
904 /* DiSEqC timeout after 150ms */
905 if (i == 15) {
906 data = ds3000_readreg(state, 0xa1);
907 data &= ~0x80;
908 data |= 0x40;
909 ds3000_writereg(state, 0xa1, data);
910
911 data = ds3000_readreg(state, 0xa2);
912 data &= ~0xc0;
913 data |= 0x80;
914 ds3000_writereg(state, 0xa2, data);
915
916 return 1;
917 }
918
919 data = ds3000_readreg(state, 0xa2);
920 data &= ~0xc0;
921 data |= 0x80;
922 ds3000_writereg(state, 0xa2, data);
923
924 return 0;
925}
926
927/* Send DiSEqC burst */
928static int ds3000_diseqc_send_burst(struct dvb_frontend *fe,
929 fe_sec_mini_cmd_t burst)
930{
931 struct ds3000_state *state = fe->demodulator_priv;
932 int i;
933 u8 data;
934
935 dprintk("%s()\n", __func__);
936
937 data = ds3000_readreg(state, 0xa2);
938 data &= ~0xc0;
939 ds3000_writereg(state, 0xa2, data);
940
941 /* DiSEqC burst */
942 if (burst == SEC_MINI_A)
943 /* Unmodulated tone burst */
944 ds3000_writereg(state, 0xa1, 0x02);
945 else if (burst == SEC_MINI_B)
946 /* Modulated tone burst */
947 ds3000_writereg(state, 0xa1, 0x01);
948 else
949 return -EINVAL;
950
951 msleep(13);
952 for (i = 0; i < 5; i++) {
953 data = ds3000_readreg(state, 0xa1);
954 if ((data & 0x40) == 0)
955 break;
956 msleep(1);
957 }
958
959 if (i == 5) {
960 data = ds3000_readreg(state, 0xa1);
961 data &= ~0x80;
962 data |= 0x40;
963 ds3000_writereg(state, 0xa1, data);
964
965 data = ds3000_readreg(state, 0xa2);
966 data &= ~0xc0;
967 data |= 0x80;
968 ds3000_writereg(state, 0xa2, data);
969
970 return 1;
971 }
972
973 data = ds3000_readreg(state, 0xa2);
974 data &= ~0xc0;
975 data |= 0x80;
976 ds3000_writereg(state, 0xa2, data);
977
978 return 0;
979}
980
981static void ds3000_release(struct dvb_frontend *fe)
982{
983 struct ds3000_state *state = fe->demodulator_priv;
984 dprintk("%s\n", __func__);
985 kfree(state);
986}
987
988static struct dvb_frontend_ops ds3000_ops;
989
990struct dvb_frontend *ds3000_attach(const struct ds3000_config *config,
991 struct i2c_adapter *i2c)
992{
993 struct ds3000_state *state = NULL;
994 int ret;
995
996 dprintk("%s\n", __func__);
997
998 /* allocate memory for the internal state */
Julia Lawall2ef17c92010-05-13 16:59:15 -0300999 state = kzalloc(sizeof(struct ds3000_state), GFP_KERNEL);
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001000 if (state == NULL) {
1001 printk(KERN_ERR "Unable to kmalloc\n");
1002 goto error2;
1003 }
1004
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001005 state->config = config;
1006 state->i2c = i2c;
1007 state->prevUCBS2 = 0;
1008
1009 /* check if the demod is present */
1010 ret = ds3000_readreg(state, 0x00) & 0xfe;
1011 if (ret != 0xe0) {
1012 printk(KERN_ERR "Invalid probe, probably not a DS3000\n");
1013 goto error3;
1014 }
1015
1016 printk(KERN_INFO "DS3000 chip version: %d.%d attached.\n",
1017 ds3000_readreg(state, 0x02),
1018 ds3000_readreg(state, 0x01));
1019
1020 memcpy(&state->frontend.ops, &ds3000_ops,
1021 sizeof(struct dvb_frontend_ops));
1022 state->frontend.demodulator_priv = state;
1023 return &state->frontend;
1024
1025error3:
1026 kfree(state);
1027error2:
1028 return NULL;
1029}
1030EXPORT_SYMBOL(ds3000_attach);
1031
1032static int ds3000_set_property(struct dvb_frontend *fe,
1033 struct dtv_property *tvp)
1034{
1035 dprintk("%s(..)\n", __func__);
1036 return 0;
1037}
1038
1039static int ds3000_get_property(struct dvb_frontend *fe,
1040 struct dtv_property *tvp)
1041{
1042 dprintk("%s(..)\n", __func__);
1043 return 0;
1044}
1045
1046static int ds3000_tune(struct dvb_frontend *fe,
1047 struct dvb_frontend_parameters *p)
1048{
1049 struct ds3000_state *state = fe->demodulator_priv;
1050 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1051
1052 int ret = 0, retune, i;
1053 u8 status, mlpf, mlpf_new, mlpf_max, mlpf_min, nlpf;
1054 u16 value, ndiv;
1055 u32 f3db;
1056
1057 dprintk("%s() ", __func__);
1058
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001059 state->dnxt.delivery = c->modulation;
1060 state->dnxt.frequency = c->frequency;
1061 state->dnxt.rolloff = 2; /* fixme */
1062 state->dnxt.fec = c->fec_inner;
1063
1064 ret = ds3000_set_inversion(state, p->inversion);
1065 if (ret != 0)
1066 return ret;
1067
1068 ret = ds3000_set_symbolrate(state, c->symbol_rate);
1069 if (ret != 0)
1070 return ret;
1071
1072 /* discard the 'current' tuning parameters and prepare to tune */
1073 ds3000_clone_params(fe);
1074
1075 retune = 1; /* try 1 times */
1076 dprintk("%s: retune = %d\n", __func__, retune);
1077 dprintk("%s: frequency = %d\n", __func__, state->dcur.frequency);
1078 dprintk("%s: symbol_rate = %d\n", __func__, state->dcur.symbol_rate);
1079 dprintk("%s: FEC = %d \n", __func__,
1080 state->dcur.fec);
1081 dprintk("%s: Inversion = %d\n", __func__, state->dcur.inversion);
1082
1083 do {
1084 /* Reset status register */
1085 status = 0;
1086 /* Tune */
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001087 /* unknown */
1088 ds3000_tuner_writereg(state, 0x07, 0x02);
1089 ds3000_tuner_writereg(state, 0x10, 0x00);
1090 ds3000_tuner_writereg(state, 0x60, 0x79);
1091 ds3000_tuner_writereg(state, 0x08, 0x01);
1092 ds3000_tuner_writereg(state, 0x00, 0x01);
1093 /* calculate and set freq divider */
1094 if (state->dcur.frequency < 1146000) {
1095 ds3000_tuner_writereg(state, 0x10, 0x11);
1096 ndiv = ((state->dcur.frequency * (6 + 8) * 4) +
1097 (DS3000_XTAL_FREQ / 2)) /
1098 DS3000_XTAL_FREQ - 1024;
1099 } else {
1100 ds3000_tuner_writereg(state, 0x10, 0x01);
1101 ndiv = ((state->dcur.frequency * (6 + 8) * 2) +
1102 (DS3000_XTAL_FREQ / 2)) /
1103 DS3000_XTAL_FREQ - 1024;
1104 }
1105
1106 ds3000_tuner_writereg(state, 0x01, (ndiv & 0x0f00) >> 8);
1107 ds3000_tuner_writereg(state, 0x02, ndiv & 0x00ff);
1108
1109 /* set pll */
1110 ds3000_tuner_writereg(state, 0x03, 0x06);
1111 ds3000_tuner_writereg(state, 0x51, 0x0f);
1112 ds3000_tuner_writereg(state, 0x51, 0x1f);
1113 ds3000_tuner_writereg(state, 0x50, 0x10);
1114 ds3000_tuner_writereg(state, 0x50, 0x00);
1115 msleep(5);
1116
1117 /* unknown */
1118 ds3000_tuner_writereg(state, 0x51, 0x17);
1119 ds3000_tuner_writereg(state, 0x51, 0x1f);
1120 ds3000_tuner_writereg(state, 0x50, 0x08);
1121 ds3000_tuner_writereg(state, 0x50, 0x00);
1122 msleep(5);
1123
1124 value = ds3000_tuner_readreg(state, 0x3d);
1125 value &= 0x0f;
1126 if ((value > 4) && (value < 15)) {
1127 value -= 3;
1128 if (value < 4)
1129 value = 4;
1130 value = ((value << 3) | 0x01) & 0x79;
1131 }
1132
1133 ds3000_tuner_writereg(state, 0x60, value);
1134 ds3000_tuner_writereg(state, 0x51, 0x17);
1135 ds3000_tuner_writereg(state, 0x51, 0x1f);
1136 ds3000_tuner_writereg(state, 0x50, 0x08);
1137 ds3000_tuner_writereg(state, 0x50, 0x00);
1138
1139 /* set low-pass filter period */
1140 ds3000_tuner_writereg(state, 0x04, 0x2e);
1141 ds3000_tuner_writereg(state, 0x51, 0x1b);
1142 ds3000_tuner_writereg(state, 0x51, 0x1f);
1143 ds3000_tuner_writereg(state, 0x50, 0x04);
1144 ds3000_tuner_writereg(state, 0x50, 0x00);
1145 msleep(5);
1146
1147 f3db = ((state->dcur.symbol_rate / 1000) << 2) / 5 + 2000;
1148 if ((state->dcur.symbol_rate / 1000) < 5000)
1149 f3db += 3000;
1150 if (f3db < 7000)
1151 f3db = 7000;
1152 if (f3db > 40000)
1153 f3db = 40000;
1154
1155 /* set low-pass filter baseband */
1156 value = ds3000_tuner_readreg(state, 0x26);
1157 mlpf = 0x2e * 207 / ((value << 1) + 151);
1158 mlpf_max = mlpf * 135 / 100;
1159 mlpf_min = mlpf * 78 / 100;
1160 if (mlpf_max > 63)
1161 mlpf_max = 63;
1162
1163 /* rounded to the closest integer */
1164 nlpf = ((mlpf * f3db * 1000) + (2766 * DS3000_XTAL_FREQ / 2))
1165 / (2766 * DS3000_XTAL_FREQ);
1166 if (nlpf > 23)
1167 nlpf = 23;
1168 if (nlpf < 1)
1169 nlpf = 1;
1170
1171 /* rounded to the closest integer */
1172 mlpf_new = ((DS3000_XTAL_FREQ * nlpf * 2766) +
1173 (1000 * f3db / 2)) / (1000 * f3db);
1174
1175 if (mlpf_new < mlpf_min) {
1176 nlpf++;
1177 mlpf_new = ((DS3000_XTAL_FREQ * nlpf * 2766) +
1178 (1000 * f3db / 2)) / (1000 * f3db);
1179 }
1180
1181 if (mlpf_new > mlpf_max)
1182 mlpf_new = mlpf_max;
1183
1184 ds3000_tuner_writereg(state, 0x04, mlpf_new);
1185 ds3000_tuner_writereg(state, 0x06, nlpf);
1186 ds3000_tuner_writereg(state, 0x51, 0x1b);
1187 ds3000_tuner_writereg(state, 0x51, 0x1f);
1188 ds3000_tuner_writereg(state, 0x50, 0x04);
1189 ds3000_tuner_writereg(state, 0x50, 0x00);
1190 msleep(5);
1191
1192 /* unknown */
1193 ds3000_tuner_writereg(state, 0x51, 0x1e);
1194 ds3000_tuner_writereg(state, 0x51, 0x1f);
1195 ds3000_tuner_writereg(state, 0x50, 0x01);
1196 ds3000_tuner_writereg(state, 0x50, 0x00);
1197 msleep(60);
1198
1199 /* ds3000 global reset */
1200 ds3000_writereg(state, 0x07, 0x80);
1201 ds3000_writereg(state, 0x07, 0x00);
1202 /* ds3000 build-in uC reset */
1203 ds3000_writereg(state, 0xb2, 0x01);
1204 /* ds3000 software reset */
1205 ds3000_writereg(state, 0x00, 0x01);
1206
1207 switch (c->delivery_system) {
1208 case SYS_DVBS:
1209 /* initialise the demod in DVB-S mode */
1210 for (i = 0; i < sizeof(ds3000_dvbs_init_tab); i += 2)
1211 ds3000_writereg(state,
1212 ds3000_dvbs_init_tab[i],
1213 ds3000_dvbs_init_tab[i + 1]);
1214 value = ds3000_readreg(state, 0xfe);
1215 value &= 0xc0;
1216 value |= 0x1b;
1217 ds3000_writereg(state, 0xfe, value);
1218 break;
1219 case SYS_DVBS2:
1220 /* initialise the demod in DVB-S2 mode */
1221 for (i = 0; i < sizeof(ds3000_dvbs2_init_tab); i += 2)
1222 ds3000_writereg(state,
1223 ds3000_dvbs2_init_tab[i],
1224 ds3000_dvbs2_init_tab[i + 1]);
Igor M. Liplianin2a66bf32011-02-01 19:40:17 -03001225 ds3000_writereg(state, 0xfe, 0x98);
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001226 break;
1227 default:
1228 return 1;
1229 }
1230
1231 /* enable 27MHz clock output */
1232 ds3000_writereg(state, 0x29, 0x80);
1233 /* enable ac coupling */
1234 ds3000_writereg(state, 0x25, 0x8a);
1235
1236 /* enhance symbol rate performance */
1237 if ((state->dcur.symbol_rate / 1000) <= 5000) {
1238 value = 29777 / (state->dcur.symbol_rate / 1000) + 1;
1239 if (value % 2 != 0)
1240 value++;
1241 ds3000_writereg(state, 0xc3, 0x0d);
1242 ds3000_writereg(state, 0xc8, value);
1243 ds3000_writereg(state, 0xc4, 0x10);
1244 ds3000_writereg(state, 0xc7, 0x0e);
1245 } else if ((state->dcur.symbol_rate / 1000) <= 10000) {
1246 value = 92166 / (state->dcur.symbol_rate / 1000) + 1;
1247 if (value % 2 != 0)
1248 value++;
1249 ds3000_writereg(state, 0xc3, 0x07);
1250 ds3000_writereg(state, 0xc8, value);
1251 ds3000_writereg(state, 0xc4, 0x09);
1252 ds3000_writereg(state, 0xc7, 0x12);
1253 } else if ((state->dcur.symbol_rate / 1000) <= 20000) {
1254 value = 64516 / (state->dcur.symbol_rate / 1000) + 1;
1255 ds3000_writereg(state, 0xc3, value);
1256 ds3000_writereg(state, 0xc8, 0x0e);
1257 ds3000_writereg(state, 0xc4, 0x07);
1258 ds3000_writereg(state, 0xc7, 0x18);
1259 } else {
1260 value = 129032 / (state->dcur.symbol_rate / 1000) + 1;
1261 ds3000_writereg(state, 0xc3, value);
1262 ds3000_writereg(state, 0xc8, 0x0a);
1263 ds3000_writereg(state, 0xc4, 0x05);
1264 ds3000_writereg(state, 0xc7, 0x24);
1265 }
1266
1267 /* normalized symbol rate rounded to the closest integer */
1268 value = (((state->dcur.symbol_rate / 1000) << 16) +
1269 (DS3000_SAMPLE_RATE / 2)) / DS3000_SAMPLE_RATE;
1270 ds3000_writereg(state, 0x61, value & 0x00ff);
1271 ds3000_writereg(state, 0x62, (value & 0xff00) >> 8);
1272
1273 /* co-channel interference cancellation disabled */
1274 ds3000_writereg(state, 0x56, 0x00);
1275
1276 /* equalizer disabled */
1277 ds3000_writereg(state, 0x76, 0x00);
1278
1279 /*ds3000_writereg(state, 0x08, 0x03);
1280 ds3000_writereg(state, 0xfd, 0x22);
1281 ds3000_writereg(state, 0x08, 0x07);
1282 ds3000_writereg(state, 0xfd, 0x42);
1283 ds3000_writereg(state, 0x08, 0x07);*/
1284
Igor M. Liplianind2ffc442011-02-25 18:41:22 -03001285 if (state->config->ci_mode) {
1286 switch (c->delivery_system) {
1287 case SYS_DVBS:
1288 default:
1289 ds3000_writereg(state, 0xfd, 0x80);
1290 break;
1291 case SYS_DVBS2:
1292 ds3000_writereg(state, 0xfd, 0x01);
1293 break;
1294 }
1295 }
1296
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001297 /* ds3000 out of software reset */
1298 ds3000_writereg(state, 0x00, 0x00);
1299 /* start ds3000 build-in uC */
1300 ds3000_writereg(state, 0xb2, 0x00);
1301
1302 /* TODO: calculate and set carrier offset */
1303
1304 /* wait before retrying */
1305 for (i = 0; i < 30 ; i++) {
1306 if (ds3000_is_tuned(fe)) {
1307 dprintk("%s: Tuned\n", __func__);
1308 ds3000_dump_registers(fe);
1309 goto tuned;
1310 }
1311 msleep(1);
1312 }
1313
1314 dprintk("%s: Not tuned\n", __func__);
1315 ds3000_dump_registers(fe);
1316
1317 } while (--retune);
1318
1319tuned:
1320 return ret;
1321}
1322
1323static enum dvbfe_algo ds3000_get_algo(struct dvb_frontend *fe)
1324{
1325 dprintk("%s()\n", __func__);
1326 return DVBFE_ALGO_SW;
1327}
1328
1329/*
1330 * Initialise or wake up device
1331 *
1332 * Power config will reset and load initial firmware if required
1333 */
1334static int ds3000_initfe(struct dvb_frontend *fe)
1335{
Igor M. Liplianina0ea298d52011-02-01 19:40:03 -03001336 struct ds3000_state *state = fe->demodulator_priv;
1337 int ret;
1338
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001339 dprintk("%s()\n", __func__);
Igor M. Liplianina0ea298d52011-02-01 19:40:03 -03001340 /* hard reset */
1341 ds3000_writereg(state, 0x08, 0x01 | ds3000_readreg(state, 0x08));
1342 msleep(1);
1343
1344 /* TS2020 init */
1345 ds3000_tuner_writereg(state, 0x42, 0x73);
1346 ds3000_tuner_writereg(state, 0x05, 0x01);
1347 ds3000_tuner_writereg(state, 0x62, 0xf5);
Igor M. Liplianinb9bf2ea2011-02-01 19:40:36 -03001348 /* Load the firmware if required */
1349 ret = ds3000_firmware_ondemand(fe);
1350 if (ret != 0) {
1351 printk(KERN_ERR "%s: Unable initialize firmware\n", __func__);
1352 return ret;
1353 }
Igor M. Liplianina0ea298d52011-02-01 19:40:03 -03001354
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001355 return 0;
1356}
1357
1358/* Put device to sleep */
1359static int ds3000_sleep(struct dvb_frontend *fe)
1360{
1361 dprintk("%s()\n", __func__);
1362 return 0;
1363}
1364
1365static struct dvb_frontend_ops ds3000_ops = {
1366
1367 .info = {
1368 .name = "Montage Technology DS3000/TS2020",
1369 .type = FE_QPSK,
1370 .frequency_min = 950000,
1371 .frequency_max = 2150000,
1372 .frequency_stepsize = 1011, /* kHz for QPSK frontends */
1373 .frequency_tolerance = 5000,
1374 .symbol_rate_min = 1000000,
1375 .symbol_rate_max = 45000000,
1376 .caps = FE_CAN_INVERSION_AUTO |
1377 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
1378 FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
1379 FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
1380 FE_CAN_2G_MODULATION |
1381 FE_CAN_QPSK | FE_CAN_RECOVER
1382 },
1383
1384 .release = ds3000_release,
1385
1386 .init = ds3000_initfe,
1387 .sleep = ds3000_sleep,
1388 .read_status = ds3000_read_status,
1389 .read_ber = ds3000_read_ber,
1390 .read_signal_strength = ds3000_read_signal_strength,
1391 .read_snr = ds3000_read_snr,
1392 .read_ucblocks = ds3000_read_ucblocks,
Igor M. Liplianind2ffc442011-02-25 18:41:22 -03001393 .set_voltage = ds3000_set_voltage,
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001394 .set_tone = ds3000_set_tone,
1395 .diseqc_send_master_cmd = ds3000_send_diseqc_msg,
1396 .diseqc_send_burst = ds3000_diseqc_send_burst,
1397 .get_frontend_algo = ds3000_get_algo,
1398
1399 .set_property = ds3000_set_property,
1400 .get_property = ds3000_get_property,
1401 .set_frontend = ds3000_tune,
1402};
1403
1404module_param(debug, int, 0644);
1405MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)");
1406
1407MODULE_DESCRIPTION("DVB Frontend module for Montage Technology "
1408 "DS3000/TS2020 hardware");
1409MODULE_AUTHOR("Konstantin Dimitrov");
1410MODULE_LICENSE("GPL");