vserver 1.9.5.x5
[linux-2.6.git] / drivers / media / dvb / ttpci / budget.c
1 /*
2  * budget.c: driver for the SAA7146 based Budget DVB cards 
3  *
4  * Compiled from various sources by Michael Hunold <michael@mihu.de> 
5  *
6  * Copyright (C) 2002 Ralph Metzler <rjkm@metzlerbros.de>
7  *
8  * Copyright (C) 1999-2002 Ralph  Metzler 
9  *                       & Marcus Metzler for convergence integrated media GmbH
10  *
11  * 26feb2004 Support for FS Activy Card (Grundig tuner) by
12  *           Michael Dreher <michael@5dot1.de>,
13  *           Oliver Endriss <o.endriss@gmx.de> and
14  *           Andreas 'randy' Weinberger
15  * 
16  * This program is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU General Public License
18  * as published by the Free Software Foundation; either version 2
19  * of the License, or (at your option) any later version.
20  * 
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  * GNU General Public License for more details.
26  * 
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
31  * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
32  * 
33  *
34  * the project's page is at http://www.linuxtv.org/dvb/
35  */
36
37 #include "budget.h"
38 #include "stv0299.h"
39 #include "ves1x93.h"
40 #include "ves1820.h"
41 #include "l64781.h"
42 #include "tda8083.h"
43
44 static void Set22K (struct budget *budget, int state)
45 {
46         struct saa7146_dev *dev=budget->dev;
47         dprintk(2, "budget: %p\n", budget);
48         saa7146_setgpio(dev, 3, (state ? SAA7146_GPIO_OUTHI : SAA7146_GPIO_OUTLO));
49 }
50
51
52 /* Diseqc functions only for TT Budget card */
53 /* taken from the Skyvision DVB driver by
54    Ralph Metzler <rjkm@metzlerbros.de> */
55
56 static void DiseqcSendBit (struct budget *budget, int data)
57 {
58         struct saa7146_dev *dev=budget->dev;
59         dprintk(2, "budget: %p\n", budget);
60
61         saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI);
62         udelay(data ? 500 : 1000);
63         saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
64         udelay(data ? 1000 : 500);
65 }
66
67
68 static void DiseqcSendByte (struct budget *budget, int data)
69 {
70         int i, par=1, d;
71
72         dprintk(2, "budget: %p\n", budget);
73
74         for (i=7; i>=0; i--) {
75                 d = (data>>i)&1;
76                 par ^= d;
77                 DiseqcSendBit(budget, d);
78         }
79
80         DiseqcSendBit(budget, par);
81 }
82
83
84 static int SendDiSEqCMsg (struct budget *budget, int len, u8 *msg, unsigned long burst)
85 {
86         struct saa7146_dev *dev=budget->dev;
87         int i;
88
89         dprintk(2, "budget: %p\n", budget);
90
91         saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
92         mdelay(16);
93
94         for (i=0; i<len; i++)
95                 DiseqcSendByte(budget, msg[i]);
96
97         mdelay(16);
98
99         if (burst!=-1) {
100                 if (burst)
101                         DiseqcSendByte(budget, 0xff);
102                 else {
103                         saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI);
104                         udelay(12500);
105                         saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
106                 }
107                 msleep(20);
108         }
109
110         return 0;
111 }
112
113 /*
114  *   Routines for the Fujitsu Siemens Activy budget card
115  *   22 kHz tone and DiSEqC are handled by the frontend.
116  *   Voltage must be set here.
117  */
118 static int SetVoltage_Activy (struct budget *budget, fe_sec_voltage_t voltage)
119 {
120         struct saa7146_dev *dev=budget->dev;
121
122        dprintk(2, "budget: %p\n", budget);
123
124         switch (voltage) {
125                 case SEC_VOLTAGE_13:
126                         saa7146_setgpio(dev, 2, SAA7146_GPIO_OUTLO);
127                         break;
128                 case SEC_VOLTAGE_18:
129                         saa7146_setgpio(dev, 2, SAA7146_GPIO_OUTHI);
130                         break;
131                 default:
132                         return -EINVAL;
133         }
134
135         return 0;
136 }
137
138 static int siemens_budget_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage)
139 {
140         struct budget* budget = (struct budget*) fe->dvb->priv;
141
142         return SetVoltage_Activy (budget, voltage);
143 }
144
145 static int budget_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
146 {
147         struct budget* budget = (struct budget*) fe->dvb->priv;
148
149         switch (tone) {
150                case SEC_TONE_ON:
151                        Set22K (budget, 1);
152                        break;
153                case SEC_TONE_OFF:
154                        Set22K (budget, 0);
155                        break;
156
157                default:
158                        return -EINVAL;
159         }
160
161         return 0;
162 }
163
164 static int budget_diseqc_send_master_cmd(struct dvb_frontend* fe, struct dvb_diseqc_master_cmd* cmd)
165        {
166         struct budget* budget = (struct budget*) fe->dvb->priv;
167
168                SendDiSEqCMsg (budget, cmd->msg_len, cmd->msg, 0);
169
170         return 0;
171        }
172
173 static int budget_diseqc_send_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t minicmd)
174 {
175         struct budget* budget = (struct budget*) fe->dvb->priv;
176
177         SendDiSEqCMsg (budget, 0, NULL, minicmd);
178
179        return 0;
180 }
181
182 static int alps_bsrv2_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
183 {
184         struct budget* budget = (struct budget*) fe->dvb->priv;
185         u8 pwr = 0;
186         u8 buf[4];
187         struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf) };
188         u32 div = (params->frequency + 479500) / 125;
189
190         if (params->frequency > 2000000) pwr = 3;
191         else if (params->frequency > 1800000) pwr = 2;
192         else if (params->frequency > 1600000) pwr = 1;
193         else if (params->frequency > 1200000) pwr = 0;
194         else if (params->frequency >= 1100000) pwr = 1;
195         else pwr = 2;
196
197         buf[0] = (div >> 8) & 0x7f;
198         buf[1] = div & 0xff;
199         buf[2] = ((div & 0x18000) >> 10) | 0x95;
200         buf[3] = (pwr << 6) | 0x30;
201
202         // NOTE: since we're using a prescaler of 2, we set the
203         // divisor frequency to 62.5kHz and divide by 125 above
204
205         if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO;
206         return 0;
207 }
208
209 static struct ves1x93_config alps_bsrv2_config =
210 {
211         .demod_address = 0x08,
212         .xin = 90100000UL,
213         .invert_pwm = 0,
214         .pll_set = alps_bsrv2_pll_set,
215 };
216
217 static u8 alps_bsru6_inittab[] = {
218         0x01, 0x15,
219         0x02, 0x00,
220         0x03, 0x00,
221         0x04, 0x7d,   /* F22FR = 0x7d, F22 = f_VCO / 128 / 0x7d = 22 kHz */
222         0x05, 0x35,   /* I2CT = 0, SCLT = 1, SDAT = 1 */
223         0x06, 0x40,   /* DAC not used, set to high impendance mode */
224         0x07, 0x00,   /* DAC LSB */
225         0x08, 0x40,   /* DiSEqC off, LNB power on OP2/LOCK pin on */
226         0x09, 0x00,   /* FIFO */
227         0x0c, 0x51,   /* OP1 ctl = Normal, OP1 val = 1 (LNB Power ON) */
228         0x0d, 0x82,   /* DC offset compensation = ON, beta_agc1 = 2 */
229         0x0e, 0x23,   /* alpha_tmg = 2, beta_tmg = 3 */
230         0x10, 0x3f,   // AGC2  0x3d
231         0x11, 0x84,
232         0x12, 0xb5,   // Lock detect: -64  Carrier freq detect:on
233         0x15, 0xc9,   // lock detector threshold
234         0x16, 0x00,
235         0x17, 0x00,
236         0x18, 0x00,
237         0x19, 0x00,
238         0x1a, 0x00,
239         0x1f, 0x50,
240         0x20, 0x00,
241         0x21, 0x00,
242         0x22, 0x00,
243         0x23, 0x00,
244         0x28, 0x00,  // out imp: normal  out type: parallel FEC mode:0
245         0x29, 0x1e,  // 1/2 threshold
246         0x2a, 0x14,  // 2/3 threshold
247         0x2b, 0x0f,  // 3/4 threshold
248         0x2c, 0x09,  // 5/6 threshold
249         0x2d, 0x05,  // 7/8 threshold
250         0x2e, 0x01,
251         0x31, 0x1f,  // test all FECs
252         0x32, 0x19,  // viterbi and synchro search
253         0x33, 0xfc,  // rs control
254         0x34, 0x93,  // error control
255         0x0f, 0x52,
256         0xff, 0xff
257 };
258
259 static int alps_bsru6_set_symbol_rate(struct dvb_frontend* fe, u32 srate, u32 ratio)
260 {
261         u8 aclk = 0;
262         u8 bclk = 0;
263
264         if (srate < 1500000) { aclk = 0xb7; bclk = 0x47; }
265         else if (srate < 3000000) { aclk = 0xb7; bclk = 0x4b; }
266         else if (srate < 7000000) { aclk = 0xb7; bclk = 0x4f; }
267         else if (srate < 14000000) { aclk = 0xb7; bclk = 0x53; }
268         else if (srate < 30000000) { aclk = 0xb6; bclk = 0x53; }
269         else if (srate < 45000000) { aclk = 0xb4; bclk = 0x51; }
270
271         stv0299_writereg (fe, 0x13, aclk);
272         stv0299_writereg (fe, 0x14, bclk);
273         stv0299_writereg (fe, 0x1f, (ratio >> 16) & 0xff);
274         stv0299_writereg (fe, 0x20, (ratio >>  8) & 0xff);
275         stv0299_writereg (fe, 0x21, (ratio      ) & 0xf0);
276
277         return 0;
278         }
279
280 static int alps_bsru6_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
281 {
282         struct budget* budget = (struct budget*) fe->dvb->priv;
283         u8 data[4];
284         u32 div;
285         struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) };
286
287         if ((params->frequency < 950000) || (params->frequency > 2150000)) return -EINVAL;
288
289         div = (params->frequency + (125 - 1)) / 125; // round correctly
290         data[0] = (div >> 8) & 0x7f;
291         data[1] = div & 0xff;
292         data[2] = 0x80 | ((div & 0x18000) >> 10) | 4;
293         data[3] = 0xC4;
294
295         if (params->frequency > 1530000) data[3] = 0xc0;
296
297         if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO;
298         return 0;
299 }
300
301 static struct stv0299_config alps_bsru6_config = {
302
303         .demod_address = 0x68,
304         .inittab = alps_bsru6_inittab,
305         .mclk = 88000000UL,
306         .invert = 1,
307         .enhanced_tuning = 0,
308         .skip_reinit = 0,
309         .lock_output = STV0229_LOCKOUTPUT_1,
310         .volt13_op0_op1 = STV0299_VOLT13_OP1,
311         .min_delay_ms = 100,
312         .set_symbol_rate = alps_bsru6_set_symbol_rate,
313         .pll_set = alps_bsru6_pll_set,
314 };
315
316 static int alps_tdbe2_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
317 {
318         struct budget* budget = (struct budget*) fe->dvb->priv;
319         u32 div;
320         u8 data[4];
321         struct i2c_msg msg = { .addr = 0x62, .flags = 0, .buf = data, .len = sizeof(data) };
322
323         div = (params->frequency + 35937500 + 31250) / 62500;
324
325         data[0] = (div >> 8) & 0x7f;
326         data[1] = div & 0xff;
327         data[2] = 0x85 | ((div >> 10) & 0x60);
328         data[3] = (params->frequency < 174000000 ? 0x88 : params->frequency < 470000000 ? 0x84 : 0x81);
329
330         if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO;
331         return 0;
332 }
333
334 static struct ves1820_config alps_tdbe2_config = {
335         .demod_address = 0x09,
336         .xin = 57840000UL,
337         .invert = 1,
338         .selagc = VES1820_SELAGC_SIGNAMPERR,
339         .pll_set = alps_tdbe2_pll_set,
340 };
341
342 static int grundig_29504_401_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
343 {
344         struct budget* budget = (struct budget*) fe->dvb->priv;
345         u32 div;
346         u8 cfg, cpump, band_select;
347         u8 data[4];
348         struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) };
349
350         div = (36125000 + params->frequency) / 166666;
351
352         cfg = 0x88;
353
354         if (params->frequency < 175000000) cpump = 2;
355         else if (params->frequency < 390000000) cpump = 1;
356         else if (params->frequency < 470000000) cpump = 2;
357         else if (params->frequency < 750000000) cpump = 1;
358         else cpump = 3;
359
360         if (params->frequency < 175000000) band_select = 0x0e;
361         else if (params->frequency < 470000000) band_select = 0x05;
362         else band_select = 0x03;
363
364         data[0] = (div >> 8) & 0x7f;
365         data[1] = div & 0xff;
366         data[2] = ((div >> 10) & 0x60) | cfg;
367         data[3] = (cpump << 6) | band_select;
368
369         if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO;
370         return 0;
371         }
372
373 static struct l64781_config grundig_29504_401_config = {
374         .demod_address = 0x55,
375         .pll_set = grundig_29504_401_pll_set,
376 };
377
378 static int grundig_29504_451_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
379 {
380         struct budget* budget = (struct budget*) fe->dvb->priv;
381         u32 div;
382         u8 data[4];
383         struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) };
384
385         div = params->frequency / 125;
386         data[0] = (div >> 8) & 0x7f;
387         data[1] = div & 0xff;
388         data[2] = 0x8e;
389         data[3] = 0x00;
390
391         if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO;
392         return 0;
393 }
394
395 static struct tda8083_config grundig_29504_451_config = {
396         .demod_address = 0x68,
397         .pll_set = grundig_29504_451_pll_set,
398 };
399
400 static u8 read_pwm(struct budget* budget)
401 {
402         u8 b = 0xff;
403         u8 pwm;
404         struct i2c_msg msg[] = { { .addr = 0x50,.flags = 0,.buf = &b,.len = 1 },
405                                  { .addr = 0x50,.flags = I2C_M_RD,.buf = &pwm,.len = 1} };
406
407         if ((i2c_transfer(&budget->i2c_adap, msg, 2) != 2) || (pwm == 0xff))
408                 pwm = 0x48;
409
410         return pwm;
411 }
412
413 static void frontend_init(struct budget *budget)
414 {
415         switch(budget->dev->pci->subsystem_device) {
416         case 0x1003: // Hauppauge/TT Nova budget (stv0299/ALPS BSRU6(tsa5059) OR ves1893/ALPS BSRV2(sp5659))
417         case 0x1013:
418                 // try the ALPS BSRV2 first of all
419                 budget->dvb_frontend = ves1x93_attach(&alps_bsrv2_config, &budget->i2c_adap);
420                 if (budget->dvb_frontend) {
421                         budget->dvb_frontend->ops->diseqc_send_master_cmd = budget_diseqc_send_master_cmd;
422                         budget->dvb_frontend->ops->diseqc_send_burst = budget_diseqc_send_burst;
423                         budget->dvb_frontend->ops->set_tone = budget_set_tone;
424                         break;
425                 }
426
427                 // try the ALPS BSRU6 now
428                 budget->dvb_frontend = stv0299_attach(&alps_bsru6_config, &budget->i2c_adap);
429                 if (budget->dvb_frontend) {
430                         budget->dvb_frontend->ops->diseqc_send_master_cmd = budget_diseqc_send_master_cmd;
431                         budget->dvb_frontend->ops->diseqc_send_burst = budget_diseqc_send_burst;
432                         budget->dvb_frontend->ops->set_tone = budget_set_tone;
433                         break;
434                 }
435                 break;
436
437         case 0x1004: // Hauppauge/TT DVB-C budget (ves1820/ALPS TDBE2(sp5659))
438
439                 budget->dvb_frontend = ves1820_attach(&alps_tdbe2_config, &budget->i2c_adap, read_pwm(budget));
440                 if (budget->dvb_frontend) break;
441                 break;
442
443         case 0x1005: // Hauppauge/TT Nova-T budget (L64781/Grundig 29504-401(tsa5060))
444
445                 budget->dvb_frontend = l64781_attach(&grundig_29504_401_config, &budget->i2c_adap);
446                 if (budget->dvb_frontend) break;
447                 break;
448
449         case 0x4f61: // Fujitsu Siemens Activy Budget-S PCI (tda8083/Grundig 29504-451(tsa5522))
450
451                 // grundig 29504-451
452                 budget->dvb_frontend = tda8083_attach(&grundig_29504_451_config, &budget->i2c_adap);
453                 if (budget->dvb_frontend) {
454                         budget->dvb_frontend->ops->set_voltage = siemens_budget_set_voltage;
455                         break;
456                 }
457                 break;
458         }
459
460         if (budget->dvb_frontend == NULL) {
461                 printk("budget: A frontend driver was not found for device %04x/%04x subsystem %04x/%04x\n",
462                        budget->dev->pci->vendor,
463                        budget->dev->pci->device,
464                        budget->dev->pci->subsystem_vendor,
465                        budget->dev->pci->subsystem_device);
466         } else {
467                 if (dvb_register_frontend(budget->dvb_adapter, budget->dvb_frontend)) {
468                         printk("budget: Frontend registration failed!\n");
469                         if (budget->dvb_frontend->ops->release)
470                                 budget->dvb_frontend->ops->release(budget->dvb_frontend);
471                         budget->dvb_frontend = NULL;
472                 }
473         }
474 }
475
476 static int budget_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_data *info)
477 {
478         struct budget *budget = NULL;
479         int err;
480
481         budget = kmalloc(sizeof(struct budget), GFP_KERNEL);
482         if( NULL == budget ) {
483                 return -ENOMEM;
484         }
485
486         dprintk(2, "dev:%p, info:%p, budget:%p\n", dev, info, budget);
487
488         dev->ext_priv = budget;
489
490         if ((err = ttpci_budget_init (budget, dev, info, THIS_MODULE))) {
491                 printk("==> failed\n");
492                 kfree (budget);
493                 return err;
494         }
495
496         budget->dvb_adapter->priv = budget;
497         frontend_init(budget);
498
499         return 0;
500 }
501
502
503 static int budget_detach (struct saa7146_dev* dev)
504 {
505         struct budget *budget = (struct budget*) dev->ext_priv;
506         int err;
507
508         if (budget->dvb_frontend) dvb_unregister_frontend(budget->dvb_frontend);
509
510         err = ttpci_budget_deinit (budget);
511
512         kfree (budget);
513         dev->ext_priv = NULL;
514
515         return err;
516 }
517
518
519
520 static struct saa7146_extension budget_extension;
521
522 MAKE_BUDGET_INFO(ttbs,  "TT-Budget/WinTV-NOVA-S  PCI",  BUDGET_TT);
523 MAKE_BUDGET_INFO(ttbc,  "TT-Budget/WinTV-NOVA-C  PCI",  BUDGET_TT);
524 MAKE_BUDGET_INFO(ttbt,  "TT-Budget/WinTV-NOVA-T  PCI",  BUDGET_TT);
525 MAKE_BUDGET_INFO(satel, "SATELCO Multimedia PCI",       BUDGET_TT_HW_DISEQC);
526 MAKE_BUDGET_INFO(fsacs, "Fujitsu Siemens Activy Budget-S PCI", BUDGET_FS_ACTIVY);
527
528 static struct pci_device_id pci_tbl[] = {
529         MAKE_EXTENSION_PCI(ttbs,  0x13c2, 0x1003),
530         MAKE_EXTENSION_PCI(ttbc,  0x13c2, 0x1004),
531         MAKE_EXTENSION_PCI(ttbt,  0x13c2, 0x1005),
532         MAKE_EXTENSION_PCI(satel, 0x13c2, 0x1013),
533         MAKE_EXTENSION_PCI(fsacs, 0x1131, 0x4f61),
534         {
535                 .vendor    = 0,
536         }
537 };
538
539 MODULE_DEVICE_TABLE(pci, pci_tbl);
540
541 static struct saa7146_extension budget_extension = {
542         .name           = "budget dvb\0",
543         .flags          = 0,
544         
545         .module         = THIS_MODULE,
546         .pci_tbl        = pci_tbl,
547         .attach         = budget_attach,
548         .detach         = budget_detach,
549
550         .irq_mask       = MASK_10,
551         .irq_func       = ttpci_budget_irq10_handler,
552 };      
553
554
555 static int __init budget_init(void) 
556 {
557         return saa7146_register_extension(&budget_extension);
558 }
559
560
561 static void __exit budget_exit(void)
562 {
563         saa7146_unregister_extension(&budget_extension); 
564 }
565
566 module_init(budget_init);
567 module_exit(budget_exit);
568
569 MODULE_LICENSE("GPL");
570 MODULE_AUTHOR("Ralph Metzler, Marcus Metzler, Michael Hunold, others");
571 MODULE_DESCRIPTION("driver for the SAA7146 based so-called "
572                    "budget PCI DVB cards by Siemens, Technotrend, Hauppauge");
573