4 * Philips TDA8044 / TDA8083 QPSK demodulator driver
6 * Copyright (C) 2001 Felix Domke <tmbinc@elitedvb.net>
7 * Copyright (C) 2002-2004 Andreas Oberritter <obi@linuxtv.org>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include <linux/config.h>
25 #include <linux/delay.h>
26 #include <linux/init.h>
27 #include <linux/spinlock.h>
28 #include <linux/threads.h>
29 #include <linux/interrupt.h>
30 #include <linux/kernel.h>
31 #include <linux/module.h>
32 #include <linux/slab.h>
34 #include <asm/div64.h>
36 #include "dvb_frontend.h"
45 struct tda80xx_state
{
47 struct i2c_adapter
* i2c
;
49 struct dvb_frontend_ops ops
;
51 /* configuration settings */
52 const struct tda80xx_config
* config
;
54 struct dvb_frontend frontend
;
58 struct work_struct worklet
;
59 fe_code_rate_t code_rate
;
60 fe_spectral_inversion_t spectral_inversion
;
66 #define dprintk if (debug) printk
68 static u8 tda8044_inittab_pre
[] = {
69 0x02, 0x00, 0x6f, 0xb5, 0x86, 0x22, 0x00, 0xea,
70 0x30, 0x42, 0x98, 0x68, 0x70, 0x42, 0x99, 0x58,
71 0x95, 0x10, 0xf5, 0xe7, 0x93, 0x0b, 0x15, 0x68,
72 0x9a, 0x90, 0x61, 0x80, 0x00, 0xe0, 0x40, 0x00,
73 0x0f, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
77 static u8 tda8044_inittab_post
[] = {
78 0x04, 0x00, 0x6f, 0xb5, 0x86, 0x22, 0x00, 0xea,
79 0x30, 0x42, 0x98, 0x68, 0x70, 0x42, 0x99, 0x50,
80 0x95, 0x10, 0xf5, 0xe7, 0x93, 0x0b, 0x15, 0x68,
81 0x9a, 0x90, 0x61, 0x80, 0x00, 0xe0, 0x40, 0x6c,
82 0x0f, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
86 static u8 tda8083_inittab
[] = {
87 0x04, 0x00, 0x4a, 0x79, 0x04, 0x00, 0xff, 0xea,
88 0x48, 0x42, 0x79, 0x60, 0x70, 0x52, 0x9a, 0x10,
89 0x0e, 0x10, 0xf2, 0xa7, 0x93, 0x0b, 0x05, 0xc8,
90 0x9d, 0x00, 0x42, 0x80, 0x00, 0x60, 0x40, 0x00,
91 0x00, 0x75, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00,
92 0x00, 0x00, 0x00, 0x00
95 static __inline__ u32
tda80xx_div(u32 a
, u32 b
)
97 return (a
+ (b
/ 2)) / b
;
100 static __inline__ u32
tda80xx_gcd(u32 a
, u32 b
)
104 while ((r
= a
% b
)) {
112 static int tda80xx_read(struct tda80xx_state
* state
, u8 reg
, u8
*buf
, u8 len
)
115 struct i2c_msg msg
[] = { { .addr
= state
->config
->demod_address
, .flags
= 0, .buf
= ®
, .len
= 1 },
116 { .addr
= state
->config
->demod_address
, .flags
= I2C_M_RD
, .buf
= buf
, .len
= len
} };
118 ret
= i2c_transfer(state
->i2c
, msg
, 2);
121 dprintk("%s: readreg error (reg %02x, ret == %i)\n",
122 __FUNCTION__
, reg
, ret
);
126 return (ret
== 2) ? 0 : -EREMOTEIO
;
129 static int tda80xx_write(struct tda80xx_state
* state
, u8 reg
, const u8
*buf
, u8 len
)
133 struct i2c_msg msg
= { .addr
= state
->config
->demod_address
, .flags
= 0, .buf
= wbuf
, .len
= len
+ 1 };
136 memcpy(&wbuf
[1], buf
, len
);
138 ret
= i2c_transfer(state
->i2c
, &msg
, 1);
141 dprintk("%s: i2c xfer error (ret == %i)\n", __FUNCTION__
, ret
);
145 return (ret
== 1) ? 0 : -EREMOTEIO
;
148 static __inline__ u8
tda80xx_readreg(struct tda80xx_state
* state
, u8 reg
)
152 tda80xx_read(state
, reg
, &val
, 1);
157 static __inline__
int tda80xx_writereg(struct tda80xx_state
* state
, u8 reg
, u8 data
)
159 return tda80xx_write(state
, reg
, &data
, 1);
162 static int tda80xx_set_parameters(struct tda80xx_state
* state
,
163 fe_spectral_inversion_t inversion
,
165 fe_code_rate_t fec_inner
)
171 u32 sr
= symbol_rate
;
175 if (symbol_rate
> (state
->clk
* 3) / 16)
177 else if (symbol_rate
> (state
->clk
* 3) / 32)
179 else if (symbol_rate
> (state
->clk
* 3) / 64)
184 clk
= scd
? (state
->clk
/ (scd
* 2)) : state
->clk
;
188 * Differential decoding off
189 * Spectral inversion unknown
192 if (inversion
== INVERSION_ON
)
194 else if (inversion
== INVERSION_OFF
)
201 * system clock frequency is up to 64 or 96 MHz
204 * r = k * clk / symbol_rate
206 * k: 2^21 for caa 0..3,
210 if (symbol_rate
<= (clk
* 3) / 32)
212 else if (symbol_rate
<= (clk
* 3) / 16)
217 gcd
= tda80xx_gcd(clk
, sr
);
221 gcd
= tda80xx_gcd(k
, sr
);
225 ratio
= (u64
)k
* (u64
)clk
;
228 buf
[1] = ratio
>> 16;
232 /* nyquist filter roll-off factor 35% */
235 clk
= scd
? (state
->clk
/ (scd
* 2)) : state
->clk
;
237 /* Anti Alias Filter */
238 if (symbol_rate
< (clk
* 3) / 64)
239 printk("tda80xx: unsupported symbol rate: %u\n", symbol_rate
);
240 else if (symbol_rate
<= clk
/ 16)
242 else if (symbol_rate
<= (clk
* 3) / 32)
244 else if (symbol_rate
<= clk
/ 8)
246 else if (symbol_rate
<= (clk
* 3) / 16)
248 else if (symbol_rate
<= clk
/ 4)
250 else if (symbol_rate
<= (clk
* 3) / 8)
252 else if (symbol_rate
<= clk
/ 2)
257 /* Sigma Delta converter */
260 /* FEC: Possible puncturing rates */
261 if (fec_inner
== FEC_NONE
)
263 else if ((fec_inner
>= FEC_1_2
) && (fec_inner
<= FEC_8_9
))
264 buf
[6] = (1 << (8 - fec_inner
));
265 else if (fec_inner
== FEC_AUTO
)
270 /* carrier lock detector threshold value */
272 /* AFC1: proportional part settings */
274 /* AFC1: integral part settings */
276 /* PD: Leaky integrator SCPC mode */
278 /* AFC2, AFC1 controls */
280 /* PD: proportional part settings */
282 /* PD: integral part settings */
285 buf
[14] = 0x50 | scd
;
287 printk("symbol_rate=%u clk=%u\n", symbol_rate
, clk
);
289 return tda80xx_write(state
, 0x01, buf
, sizeof(buf
));
292 static int tda80xx_set_clk(struct tda80xx_state
* state
)
296 /* CLK proportional part */
297 buf
[0] = (0x06 << 5) | 0x08; /* CMP[2:0], CSP[4:0] */
298 /* CLK integral part */
299 buf
[1] = (0x04 << 5) | 0x1a; /* CMI[2:0], CSI[4:0] */
301 return tda80xx_write(state
, 0x17, buf
, sizeof(buf
));
305 static int tda80xx_set_scpc_freq_offset(struct tda80xx_state
* state
)
307 /* a constant value is nonsense here imho */
308 return tda80xx_writereg(state
, 0x22, 0xf9);
312 static int tda80xx_close_loop(struct tda80xx_state
* state
)
316 /* PD: Loop closed, LD: lock detect enable, SCPC: Sweep mode - AFC1 loop closed */
318 /* AFC1: Loop closed, CAR Feedback: 8192 */
321 return tda80xx_write(state
, 0x0b, buf
, sizeof(buf
));
324 static irqreturn_t
tda80xx_irq(int irq
, void *priv
, struct pt_regs
*pt
)
331 static void tda80xx_read_status_int(struct tda80xx_state
* state
)
335 static const fe_spectral_inversion_t inv_tab
[] = {
336 INVERSION_OFF
, INVERSION_ON
339 static const fe_code_rate_t fec_tab
[] = {
340 FEC_8_9
, FEC_1_2
, FEC_2_3
, FEC_3_4
,
341 FEC_4_5
, FEC_5_6
, FEC_6_7
, FEC_7_8
,
344 val
= tda80xx_readreg(state
, 0x02);
348 if (val
& 0x01) /* demodulator lock */
349 state
->status
|= FE_HAS_SIGNAL
;
350 if (val
& 0x02) /* clock recovery lock */
351 state
->status
|= FE_HAS_CARRIER
;
352 if (val
& 0x04) /* viterbi lock */
353 state
->status
|= FE_HAS_VITERBI
;
354 if (val
& 0x08) /* deinterleaver lock (packet sync) */
355 state
->status
|= FE_HAS_SYNC
;
356 if (val
& 0x10) /* derandomizer lock (frame sync) */
357 state
->status
|= FE_HAS_LOCK
;
358 if (val
& 0x20) /* frontend can not lock */
359 state
->status
|= FE_TIMEDOUT
;
361 if ((state
->status
& (FE_HAS_CARRIER
)) && (state
->afc_loop
)) {
362 printk("tda80xx: closing loop\n");
363 tda80xx_close_loop(state
);
367 if (state
->status
& (FE_HAS_VITERBI
| FE_HAS_SYNC
| FE_HAS_LOCK
)) {
368 val
= tda80xx_readreg(state
, 0x0e);
369 state
->code_rate
= fec_tab
[val
& 0x07];
370 if (state
->status
& (FE_HAS_SYNC
| FE_HAS_LOCK
))
371 state
->spectral_inversion
= inv_tab
[(val
>> 7) & 0x01];
373 state
->spectral_inversion
= INVERSION_AUTO
;
376 state
->code_rate
= FEC_AUTO
;
380 static void tda80xx_worklet(void *priv
)
382 struct tda80xx_state
*state
= priv
;
384 tda80xx_writereg(state
, 0x00, 0x04);
385 enable_irq(state
->config
->irq
);
387 tda80xx_read_status_int(state
);
390 static void tda80xx_wait_diseqc_fifo(struct tda80xx_state
* state
)
394 for (i
= 0; i
< 100; i
++) {
395 if (tda80xx_readreg(state
, 0x02) & 0x80)
401 static int tda8044_init(struct dvb_frontend
* fe
)
403 struct tda80xx_state
* state
= fe
->demodulator_priv
;
407 * this function is a mess...
410 if ((ret
= tda80xx_write(state
, 0x00, tda8044_inittab_pre
, sizeof(tda8044_inittab_pre
))))
413 tda80xx_writereg(state
, 0x0f, 0x50);
415 tda80xx_writereg(state
, 0x20, 0x8F); /* FIXME */
416 tda80xx_writereg(state
, 0x20, state
->config
->volt18setting
); /* FIXME */
417 //tda80xx_writereg(state, 0x00, 0x04);
418 tda80xx_writereg(state
, 0x00, 0x0C);
420 //tda80xx_writereg(state, 0x00, 0x08); /* Reset AFC1 loop filter */
422 tda80xx_write(state
, 0x00, tda8044_inittab_post
, sizeof(tda8044_inittab_post
));
424 if (state
->config
->pll_init
) {
425 tda80xx_writereg(state
, 0x1c, 0x80);
426 state
->config
->pll_init(fe
);
427 tda80xx_writereg(state
, 0x1c, 0x00);
433 static int tda8083_init(struct dvb_frontend
* fe
)
435 struct tda80xx_state
* state
= fe
->demodulator_priv
;
437 tda80xx_write(state
, 0x00, tda8083_inittab
, sizeof(tda8083_inittab
));
439 if (state
->config
->pll_init
) {
440 tda80xx_writereg(state
, 0x1c, 0x80);
441 state
->config
->pll_init(fe
);
442 tda80xx_writereg(state
, 0x1c, 0x00);
448 static int tda80xx_set_voltage(struct dvb_frontend
* fe
, fe_sec_voltage_t voltage
)
450 struct tda80xx_state
* state
= fe
->demodulator_priv
;
454 return tda80xx_writereg(state
, 0x20, state
->config
->volt13setting
);
456 return tda80xx_writereg(state
, 0x20, state
->config
->volt18setting
);
457 case SEC_VOLTAGE_OFF
:
458 return tda80xx_writereg(state
, 0x20, 0);
464 static int tda80xx_set_tone(struct dvb_frontend
* fe
, fe_sec_tone_mode_t tone
)
466 struct tda80xx_state
* state
= fe
->demodulator_priv
;
470 return tda80xx_writereg(state
, 0x29, 0x00);
472 return tda80xx_writereg(state
, 0x29, 0x80);
478 static int tda80xx_send_diseqc_msg(struct dvb_frontend
* fe
, struct dvb_diseqc_master_cmd
*cmd
)
480 struct tda80xx_state
* state
= fe
->demodulator_priv
;
482 if (cmd
->msg_len
> 6)
485 tda80xx_writereg(state
, 0x29, 0x08 | (cmd
->msg_len
- 3));
486 tda80xx_write(state
, 0x23, cmd
->msg
, cmd
->msg_len
);
487 tda80xx_writereg(state
, 0x29, 0x0c | (cmd
->msg_len
- 3));
488 tda80xx_wait_diseqc_fifo(state
);
493 static int tda80xx_send_diseqc_burst(struct dvb_frontend
* fe
, fe_sec_mini_cmd_t cmd
)
495 struct tda80xx_state
* state
= fe
->demodulator_priv
;
499 tda80xx_writereg(state
, 0x29, 0x14);
502 tda80xx_writereg(state
, 0x29, 0x1c);
508 tda80xx_wait_diseqc_fifo(state
);
513 static int tda80xx_sleep(struct dvb_frontend
* fe
)
515 struct tda80xx_state
* state
= fe
->demodulator_priv
;
517 tda80xx_writereg(state
, 0x00, 0x02); /* enter standby */
522 static int tda80xx_set_frontend(struct dvb_frontend
* fe
, struct dvb_frontend_parameters
*p
)
524 struct tda80xx_state
* state
= fe
->demodulator_priv
;
526 tda80xx_writereg(state
, 0x1c, 0x80);
527 state
->config
->pll_set(fe
, p
);
528 tda80xx_writereg(state
, 0x1c, 0x00);
530 tda80xx_set_parameters(state
, p
->inversion
, p
->u
.qpsk
.symbol_rate
, p
->u
.qpsk
.fec_inner
);
531 tda80xx_set_clk(state
);
532 //tda80xx_set_scpc_freq_offset(state);
538 static int tda80xx_get_frontend(struct dvb_frontend
* fe
, struct dvb_frontend_parameters
*p
)
540 struct tda80xx_state
* state
= fe
->demodulator_priv
;
542 if (!state
->config
->irq
)
543 tda80xx_read_status_int(state
);
545 p
->inversion
= state
->spectral_inversion
;
546 p
->u
.qpsk
.fec_inner
= state
->code_rate
;
551 static int tda80xx_read_status(struct dvb_frontend
* fe
, fe_status_t
* status
)
553 struct tda80xx_state
* state
= fe
->demodulator_priv
;
555 if (!state
->config
->irq
)
556 tda80xx_read_status_int(state
);
557 *status
= state
->status
;
562 static int tda80xx_read_ber(struct dvb_frontend
* fe
, u32
* ber
)
564 struct tda80xx_state
* state
= fe
->demodulator_priv
;
568 if ((ret
= tda80xx_read(state
, 0x0b, buf
, sizeof(buf
))))
571 *ber
= ((buf
[0] & 0x1f) << 16) | (buf
[1] << 8) | buf
[2];
576 static int tda80xx_read_signal_strength(struct dvb_frontend
* fe
, u16
* strength
)
578 struct tda80xx_state
* state
= fe
->demodulator_priv
;
580 u8 gain
= ~tda80xx_readreg(state
, 0x01);
581 *strength
= (gain
<< 8) | gain
;
586 static int tda80xx_read_snr(struct dvb_frontend
* fe
, u16
* snr
)
588 struct tda80xx_state
* state
= fe
->demodulator_priv
;
590 u8 quality
= tda80xx_readreg(state
, 0x08);
591 *snr
= (quality
<< 8) | quality
;
596 static int tda80xx_read_ucblocks(struct dvb_frontend
* fe
, u32
* ucblocks
)
598 struct tda80xx_state
* state
= fe
->demodulator_priv
;
600 *ucblocks
= tda80xx_readreg(state
, 0x0f);
601 if (*ucblocks
== 0xff)
602 *ucblocks
= 0xffffffff;
607 static int tda80xx_init(struct dvb_frontend
* fe
)
609 struct tda80xx_state
* state
= fe
->demodulator_priv
;
613 return tda8044_init(fe
);
616 return tda8083_init(fe
);
621 static void tda80xx_release(struct dvb_frontend
* fe
)
623 struct tda80xx_state
* state
= fe
->demodulator_priv
;
625 if (state
->config
->irq
)
626 free_irq(state
->config
->irq
, &state
->worklet
);
631 static struct dvb_frontend_ops tda80xx_ops
;
633 struct dvb_frontend
* tda80xx_attach(const struct tda80xx_config
* config
,
634 struct i2c_adapter
* i2c
)
636 struct tda80xx_state
* state
= NULL
;
639 /* allocate memory for the internal state */
640 state
= kmalloc(sizeof(struct tda80xx_state
), GFP_KERNEL
);
641 if (state
== NULL
) goto error
;
643 /* setup the state */
644 state
->config
= config
;
646 memcpy(&state
->ops
, &tda80xx_ops
, sizeof(struct dvb_frontend_ops
));
647 state
->spectral_inversion
= INVERSION_AUTO
;
648 state
->code_rate
= FEC_AUTO
;
652 /* check if the demod is there */
653 if (tda80xx_writereg(state
, 0x89, 0x00) < 0) goto error
;
654 state
->id
= tda80xx_readreg(state
, 0x00);
658 state
->clk
= 96000000;
659 printk("tda80xx: Detected tda8044\n");
663 state
->clk
= 64000000;
664 printk("tda80xx: Detected tda8083\n");
672 if (state
->config
->irq
) {
673 INIT_WORK(&state
->worklet
, tda80xx_worklet
, state
);
674 if ((ret
= request_irq(state
->config
->irq
, tda80xx_irq
, SA_ONESHOT
, "tda80xx", &state
->worklet
)) < 0) {
675 printk(KERN_ERR
"tda80xx: request_irq failed (%d)\n", ret
);
680 /* create dvb_frontend */
681 state
->frontend
.ops
= &state
->ops
;
682 state
->frontend
.demodulator_priv
= state
;
683 return &state
->frontend
;
690 static struct dvb_frontend_ops tda80xx_ops
= {
693 .name
= "Philips TDA80xx DVB-S",
695 .frequency_min
= 500000,
696 .frequency_max
= 2700000,
697 .frequency_stepsize
= 125,
698 .symbol_rate_min
= 4500000,
699 .symbol_rate_max
= 45000000,
700 .caps
= FE_CAN_INVERSION_AUTO
|
701 FE_CAN_FEC_1_2
| FE_CAN_FEC_2_3
| FE_CAN_FEC_3_4
|
702 FE_CAN_FEC_4_5
| FE_CAN_FEC_5_6
| FE_CAN_FEC_6_7
|
703 FE_CAN_FEC_7_8
| FE_CAN_FEC_8_9
| FE_CAN_FEC_AUTO
|
708 .release
= tda80xx_release
,
710 .init
= tda80xx_init
,
711 .sleep
= tda80xx_sleep
,
713 .set_frontend
= tda80xx_set_frontend
,
714 .get_frontend
= tda80xx_get_frontend
,
716 .read_status
= tda80xx_read_status
,
717 .read_ber
= tda80xx_read_ber
,
718 .read_signal_strength
= tda80xx_read_signal_strength
,
719 .read_snr
= tda80xx_read_snr
,
720 .read_ucblocks
= tda80xx_read_ucblocks
,
722 .diseqc_send_master_cmd
= tda80xx_send_diseqc_msg
,
723 .diseqc_send_burst
= tda80xx_send_diseqc_burst
,
724 .set_tone
= tda80xx_set_tone
,
725 .set_voltage
= tda80xx_set_voltage
,
728 module_param(debug
, int, 0644);
730 MODULE_DESCRIPTION("Philips TDA8044 / TDA8083 DVB-S Demodulator driver");
731 MODULE_AUTHOR("Felix Domke, Andreas Oberritter");
732 MODULE_LICENSE("GPL");
734 EXPORT_SYMBOL(tda80xx_attach
);