Merge branch 'for-2.6.30' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie...
[linux-2.6] / drivers / media / dvb / ttpci / av7110.c
1 /*
2  * driver for the SAA7146 based AV110 cards (like the Fujitsu-Siemens DVB)
3  * av7110.c: initialization and demux stuff
4  *
5  * Copyright (C) 1999-2002 Ralph  Metzler
6  *                       & Marcus Metzler for convergence integrated media GmbH
7  *
8  * originally based on code by:
9  * Copyright (C) 1998,1999 Christian Theiss <mistert@rz.fh-augsburg.de>
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License
13  * as published by the Free Software Foundation; either version 2
14  * of the License, or (at your option) any later version.
15  *
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU General Public License for more details.
21  *
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software
25  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26  * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
27  *
28  *
29  * the project's page is at http://www.linuxtv.org/dvb/
30  */
31
32
33 #include <linux/module.h>
34 #include <linux/kmod.h>
35 #include <linux/delay.h>
36 #include <linux/fs.h>
37 #include <linux/timer.h>
38 #include <linux/poll.h>
39 #include <linux/smp_lock.h>
40
41 #include <linux/kernel.h>
42 #include <linux/sched.h>
43 #include <linux/types.h>
44 #include <linux/fcntl.h>
45 #include <linux/interrupt.h>
46 #include <linux/string.h>
47 #include <linux/pci.h>
48 #include <linux/vmalloc.h>
49 #include <linux/firmware.h>
50 #include <linux/crc32.h>
51 #include <linux/i2c.h>
52 #include <linux/kthread.h>
53 #include <asm/unaligned.h>
54 #include <asm/byteorder.h>
55
56 #include <asm/system.h>
57
58 #include <linux/dvb/frontend.h>
59
60 #include "dvb_frontend.h"
61
62 #include "ttpci-eeprom.h"
63 #include "av7110.h"
64 #include "av7110_hw.h"
65 #include "av7110_av.h"
66 #include "av7110_ca.h"
67 #include "av7110_ipack.h"
68
69 #include "bsbe1.h"
70 #include "lnbp21.h"
71 #include "bsru6.h"
72
73 #define TS_WIDTH  376
74 #define TS_HEIGHT 512
75 #define TS_BUFLEN (TS_WIDTH*TS_HEIGHT)
76 #define TS_MAX_PACKETS (TS_BUFLEN/TS_SIZE)
77
78
79 int av7110_debug;
80
81 static int vidmode = CVBS_RGB_OUT;
82 static int pids_off;
83 static int adac = DVB_ADAC_TI;
84 static int hw_sections;
85 static int rgb_on;
86 static int volume = 255;
87 static int budgetpatch;
88 static int wss_cfg_4_3 = 0x4008;
89 static int wss_cfg_16_9 = 0x0007;
90 static int tv_standard;
91 static int full_ts;
92
93 module_param_named(debug, av7110_debug, int, 0644);
94 MODULE_PARM_DESC(debug, "debug level (bitmask, default 0)");
95 module_param(vidmode, int, 0444);
96 MODULE_PARM_DESC(vidmode,"analog video out: 0 off, 1 CVBS+RGB (default), 2 CVBS+YC, 3 YC");
97 module_param(pids_off, int, 0444);
98 MODULE_PARM_DESC(pids_off,"clear video/audio/PCR PID filters when demux is closed");
99 module_param(adac, int, 0444);
100 MODULE_PARM_DESC(adac,"audio DAC type: 0 TI, 1 CRYSTAL, 2 MSP (use if autodetection fails)");
101 module_param(hw_sections, int, 0444);
102 MODULE_PARM_DESC(hw_sections, "0 use software section filter, 1 use hardware");
103 module_param(rgb_on, int, 0444);
104 MODULE_PARM_DESC(rgb_on, "For Siemens DVB-C cards only: Enable RGB control"
105                 " signal on SCART pin 16 to switch SCART video mode from CVBS to RGB");
106 module_param(volume, int, 0444);
107 MODULE_PARM_DESC(volume, "initial volume: default 255 (range 0-255)");
108 module_param(budgetpatch, int, 0444);
109 MODULE_PARM_DESC(budgetpatch, "use budget-patch hardware modification: default 0 (0 no, 1 autodetect, 2 always)");
110 module_param(full_ts, int, 0444);
111 MODULE_PARM_DESC(full_ts, "enable code for full-ts hardware modification: 0 disable (default), 1 enable");
112 module_param(wss_cfg_4_3, int, 0444);
113 MODULE_PARM_DESC(wss_cfg_4_3, "WSS 4:3 - default 0x4008 - bit 15: disable, 14: burst mode, 13..0: wss data");
114 module_param(wss_cfg_16_9, int, 0444);
115 MODULE_PARM_DESC(wss_cfg_16_9, "WSS 16:9 - default 0x0007 - bit 15: disable, 14: burst mode, 13..0: wss data");
116 module_param(tv_standard, int, 0444);
117 MODULE_PARM_DESC(tv_standard, "TV standard: 0 PAL (default), 1 NTSC");
118
119 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
120
121 static void restart_feeds(struct av7110 *av7110);
122 static int budget_start_feed(struct dvb_demux_feed *feed);
123 static int budget_stop_feed(struct dvb_demux_feed *feed);
124
125 static int av7110_num;
126
127 #define FE_FUNC_OVERRIDE(fe_func, av7110_copy, av7110_func) \
128 {\
129         if (fe_func != NULL) { \
130                 av7110_copy = fe_func; \
131                 fe_func = av7110_func; \
132         } \
133 }
134
135
136 static void init_av7110_av(struct av7110 *av7110)
137 {
138         int ret;
139         struct saa7146_dev *dev = av7110->dev;
140
141         /* set internal volume control to maximum */
142         av7110->adac_type = DVB_ADAC_TI;
143         ret = av7110_set_volume(av7110, av7110->mixer.volume_left, av7110->mixer.volume_right);
144         if (ret < 0)
145                 printk("dvb-ttpci:cannot set internal volume to maximum:%d\n",ret);
146
147         ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetMonitorType,
148                             1, (u16) av7110->display_ar);
149         if (ret < 0)
150                 printk("dvb-ttpci: unable to set aspect ratio\n");
151         ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetPanScanType,
152                             1, av7110->display_panscan);
153         if (ret < 0)
154                 printk("dvb-ttpci: unable to set pan scan\n");
155
156         ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetWSSConfig, 2, 2, wss_cfg_4_3);
157         if (ret < 0)
158                 printk("dvb-ttpci: unable to configure 4:3 wss\n");
159         ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetWSSConfig, 2, 3, wss_cfg_16_9);
160         if (ret < 0)
161                 printk("dvb-ttpci: unable to configure 16:9 wss\n");
162
163         ret = av7710_set_video_mode(av7110, vidmode);
164         if (ret < 0)
165                 printk("dvb-ttpci:cannot set video mode:%d\n",ret);
166
167         /* handle different card types */
168         /* remaining inits according to card and frontend type */
169         av7110->analog_tuner_flags = 0;
170         av7110->current_input = 0;
171         if (dev->pci->subsystem_vendor == 0x13c2 && dev->pci->subsystem_device == 0x000a)
172                 av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, ADSwitch, 1, 0); // SPDIF on
173         if (i2c_writereg(av7110, 0x20, 0x00, 0x00) == 1) {
174                 printk ("dvb-ttpci: Crystal audio DAC @ card %d detected\n",
175                         av7110->dvb_adapter.num);
176                 av7110->adac_type = DVB_ADAC_CRYSTAL;
177                 i2c_writereg(av7110, 0x20, 0x01, 0xd2);
178                 i2c_writereg(av7110, 0x20, 0x02, 0x49);
179                 i2c_writereg(av7110, 0x20, 0x03, 0x00);
180                 i2c_writereg(av7110, 0x20, 0x04, 0x00);
181
182                 /**
183                  * some special handling for the Siemens DVB-C cards...
184                  */
185         } else if (0 == av7110_init_analog_module(av7110)) {
186                 /* done. */
187         }
188         else if (dev->pci->subsystem_vendor == 0x110a) {
189                 printk("dvb-ttpci: DVB-C w/o analog module @ card %d detected\n",
190                         av7110->dvb_adapter.num);
191                 av7110->adac_type = DVB_ADAC_NONE;
192         }
193         else {
194                 av7110->adac_type = adac;
195                 printk("dvb-ttpci: adac type set to %d @ card %d\n",
196                         av7110->adac_type, av7110->dvb_adapter.num);
197         }
198
199         if (av7110->adac_type == DVB_ADAC_NONE || av7110->adac_type == DVB_ADAC_MSP34x0) {
200                 // switch DVB SCART on
201                 ret = av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, MainSwitch, 1, 0);
202                 if (ret < 0)
203                         printk("dvb-ttpci:cannot switch on SCART(Main):%d\n",ret);
204                 ret = av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, ADSwitch, 1, 1);
205                 if (ret < 0)
206                         printk("dvb-ttpci:cannot switch on SCART(AD):%d\n",ret);
207                 if (rgb_on &&
208                     ((av7110->dev->pci->subsystem_vendor == 0x110a) ||
209                      (av7110->dev->pci->subsystem_vendor == 0x13c2)) &&
210                      (av7110->dev->pci->subsystem_device == 0x0000)) {
211                         saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // RGB on, SCART pin 16
212                         //saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // SCARTpin 8
213                 }
214         }
215
216         if (dev->pci->subsystem_vendor == 0x13c2 && dev->pci->subsystem_device == 0x000e)
217                 av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, SpdifSwitch, 1, 0); // SPDIF on
218
219         ret = av7110_set_volume(av7110, av7110->mixer.volume_left, av7110->mixer.volume_right);
220         if (ret < 0)
221                 printk("dvb-ttpci:cannot set volume :%d\n",ret);
222 }
223
224 static void recover_arm(struct av7110 *av7110)
225 {
226         dprintk(4, "%p\n",av7110);
227
228         av7110_bootarm(av7110);
229         msleep(100);
230
231         init_av7110_av(av7110);
232
233         /* card-specific recovery */
234         if (av7110->recover)
235                 av7110->recover(av7110);
236
237         restart_feeds(av7110);
238
239 #if defined(CONFIG_INPUT_EVDEV) || defined(CONFIG_INPUT_EVDEV_MODULE)
240         av7110_check_ir_config(av7110, true);
241 #endif
242 }
243
244 static void av7110_arm_sync(struct av7110 *av7110)
245 {
246         if (av7110->arm_thread)
247                 kthread_stop(av7110->arm_thread);
248
249         av7110->arm_thread = NULL;
250 }
251
252 static int arm_thread(void *data)
253 {
254         struct av7110 *av7110 = data;
255         u16 newloops = 0;
256         int timeout;
257
258         dprintk(4, "%p\n",av7110);
259
260         for (;;) {
261                 timeout = wait_event_interruptible_timeout(av7110->arm_wait,
262                         kthread_should_stop(), 5 * HZ);
263
264                 if (-ERESTARTSYS == timeout || kthread_should_stop()) {
265                         /* got signal or told to quit*/
266                         break;
267                 }
268
269                 if (!av7110->arm_ready)
270                         continue;
271
272 #if defined(CONFIG_INPUT_EVDEV) || defined(CONFIG_INPUT_EVDEV_MODULE)
273                 av7110_check_ir_config(av7110, false);
274 #endif
275
276                 if (mutex_lock_interruptible(&av7110->dcomlock))
277                         break;
278                 newloops = rdebi(av7110, DEBINOSWAP, STATUS_LOOPS, 0, 2);
279                 mutex_unlock(&av7110->dcomlock);
280
281                 if (newloops == av7110->arm_loops || av7110->arm_errors > 3) {
282                         printk(KERN_ERR "dvb-ttpci: ARM crashed @ card %d\n",
283                                av7110->dvb_adapter.num);
284
285                         recover_arm(av7110);
286
287                         if (mutex_lock_interruptible(&av7110->dcomlock))
288                                 break;
289                         newloops = rdebi(av7110, DEBINOSWAP, STATUS_LOOPS, 0, 2) - 1;
290                         mutex_unlock(&av7110->dcomlock);
291                 }
292                 av7110->arm_loops = newloops;
293                 av7110->arm_errors = 0;
294         }
295
296         return 0;
297 }
298
299
300 /****************************************************************************
301  * IRQ handling
302  ****************************************************************************/
303
304 static int DvbDmxFilterCallback(u8 *buffer1, size_t buffer1_len,
305                                 u8 *buffer2, size_t buffer2_len,
306                                 struct dvb_demux_filter *dvbdmxfilter,
307                                 enum dmx_success success,
308                                 struct av7110 *av7110)
309 {
310         if (!dvbdmxfilter->feed->demux->dmx.frontend)
311                 return 0;
312         if (dvbdmxfilter->feed->demux->dmx.frontend->source == DMX_MEMORY_FE)
313                 return 0;
314
315         switch (dvbdmxfilter->type) {
316         case DMX_TYPE_SEC:
317                 if ((((buffer1[1] << 8) | buffer1[2]) & 0xfff) + 3 != buffer1_len)
318                         return 0;
319                 if (dvbdmxfilter->doneq) {
320                         struct dmx_section_filter *filter = &dvbdmxfilter->filter;
321                         int i;
322                         u8 xor, neq = 0;
323
324                         for (i = 0; i < DVB_DEMUX_MASK_MAX; i++) {
325                                 xor = filter->filter_value[i] ^ buffer1[i];
326                                 neq |= dvbdmxfilter->maskandnotmode[i] & xor;
327                         }
328                         if (!neq)
329                                 return 0;
330                 }
331                 return dvbdmxfilter->feed->cb.sec(buffer1, buffer1_len,
332                                                   buffer2, buffer2_len,
333                                                   &dvbdmxfilter->filter,
334                                                   DMX_OK);
335         case DMX_TYPE_TS:
336                 if (!(dvbdmxfilter->feed->ts_type & TS_PACKET))
337                         return 0;
338                 if (dvbdmxfilter->feed->ts_type & TS_PAYLOAD_ONLY)
339                         return dvbdmxfilter->feed->cb.ts(buffer1, buffer1_len,
340                                                          buffer2, buffer2_len,
341                                                          &dvbdmxfilter->feed->feed.ts,
342                                                          DMX_OK);
343                 else
344                         av7110_p2t_write(buffer1, buffer1_len,
345                                          dvbdmxfilter->feed->pid,
346                                          &av7110->p2t_filter[dvbdmxfilter->index]);
347         default:
348                 return 0;
349         }
350 }
351
352
353 //#define DEBUG_TIMING
354 static inline void print_time(char *s)
355 {
356 #ifdef DEBUG_TIMING
357         struct timeval tv;
358         do_gettimeofday(&tv);
359         printk("%s: %d.%d\n", s, (int)tv.tv_sec, (int)tv.tv_usec);
360 #endif
361 }
362
363 #define DEBI_READ 0
364 #define DEBI_WRITE 1
365 static inline void start_debi_dma(struct av7110 *av7110, int dir,
366                                   unsigned long addr, unsigned int len)
367 {
368         dprintk(8, "%c %08lx %u\n", dir == DEBI_READ ? 'R' : 'W', addr, len);
369         if (saa7146_wait_for_debi_done(av7110->dev, 0)) {
370                 printk(KERN_ERR "%s: saa7146_wait_for_debi_done timed out\n", __func__);
371                 return;
372         }
373
374         SAA7146_ISR_CLEAR(av7110->dev, MASK_19); /* for good measure */
375         SAA7146_IER_ENABLE(av7110->dev, MASK_19);
376         if (len < 5)
377                 len = 5; /* we want a real DEBI DMA */
378         if (dir == DEBI_WRITE)
379                 iwdebi(av7110, DEBISWAB, addr, 0, (len + 3) & ~3);
380         else
381                 irdebi(av7110, DEBISWAB, addr, 0, len);
382 }
383
384 static void debiirq(unsigned long cookie)
385 {
386         struct av7110 *av7110 = (struct av7110 *)cookie;
387         int type = av7110->debitype;
388         int handle = (type >> 8) & 0x1f;
389         unsigned int xfer = 0;
390
391         print_time("debi");
392         dprintk(4, "type 0x%04x\n", type);
393
394         if (type == -1) {
395                 printk("DEBI irq oops @ %ld, psr:0x%08x, ssr:0x%08x\n",
396                        jiffies, saa7146_read(av7110->dev, PSR),
397                        saa7146_read(av7110->dev, SSR));
398                 goto debi_done;
399         }
400         av7110->debitype = -1;
401
402         switch (type & 0xff) {
403
404         case DATA_TS_RECORD:
405                 dvb_dmx_swfilter_packets(&av7110->demux,
406                                          (const u8 *) av7110->debi_virt,
407                                          av7110->debilen / 188);
408                 xfer = RX_BUFF;
409                 break;
410
411         case DATA_PES_RECORD:
412                 if (av7110->demux.recording)
413                         av7110_record_cb(&av7110->p2t[handle],
414                                          (u8 *) av7110->debi_virt,
415                                          av7110->debilen);
416                 xfer = RX_BUFF;
417                 break;
418
419         case DATA_IPMPE:
420         case DATA_FSECTION:
421         case DATA_PIPING:
422                 if (av7110->handle2filter[handle])
423                         DvbDmxFilterCallback((u8 *)av7110->debi_virt,
424                                              av7110->debilen, NULL, 0,
425                                              av7110->handle2filter[handle],
426                                              DMX_OK, av7110);
427                 xfer = RX_BUFF;
428                 break;
429
430         case DATA_CI_GET:
431         {
432                 u8 *data = av7110->debi_virt;
433
434                 if ((data[0] < 2) && data[2] == 0xff) {
435                         int flags = 0;
436                         if (data[5] > 0)
437                                 flags |= CA_CI_MODULE_PRESENT;
438                         if (data[5] > 5)
439                                 flags |= CA_CI_MODULE_READY;
440                         av7110->ci_slot[data[0]].flags = flags;
441                 } else
442                         ci_get_data(&av7110->ci_rbuffer,
443                                     av7110->debi_virt,
444                                     av7110->debilen);
445                 xfer = RX_BUFF;
446                 break;
447         }
448
449         case DATA_COMMON_INTERFACE:
450                 CI_handle(av7110, (u8 *)av7110->debi_virt, av7110->debilen);
451 #if 0
452         {
453                 int i;
454
455                 printk("av7110%d: ", av7110->num);
456                 printk("%02x ", *(u8 *)av7110->debi_virt);
457                 printk("%02x ", *(1+(u8 *)av7110->debi_virt));
458                 for (i = 2; i < av7110->debilen; i++)
459                         printk("%02x ", (*(i+(unsigned char *)av7110->debi_virt)));
460                 for (i = 2; i < av7110->debilen; i++)
461                         printk("%c", chtrans(*(i+(unsigned char *)av7110->debi_virt)));
462
463                 printk("\n");
464         }
465 #endif
466                 xfer = RX_BUFF;
467                 break;
468
469         case DATA_DEBUG_MESSAGE:
470                 ((s8*)av7110->debi_virt)[Reserved_SIZE - 1] = 0;
471                 printk("%s\n", (s8 *) av7110->debi_virt);
472                 xfer = RX_BUFF;
473                 break;
474
475         case DATA_CI_PUT:
476                 dprintk(4, "debi DATA_CI_PUT\n");
477         case DATA_MPEG_PLAY:
478                 dprintk(4, "debi DATA_MPEG_PLAY\n");
479         case DATA_BMP_LOAD:
480                 dprintk(4, "debi DATA_BMP_LOAD\n");
481                 xfer = TX_BUFF;
482                 break;
483         default:
484                 break;
485         }
486 debi_done:
487         spin_lock(&av7110->debilock);
488         if (xfer)
489                 iwdebi(av7110, DEBINOSWAP, xfer, 0, 2);
490         ARM_ClearMailBox(av7110);
491         spin_unlock(&av7110->debilock);
492 }
493
494 /* irq from av7110 firmware writing the mailbox register in the DPRAM */
495 static void gpioirq(unsigned long cookie)
496 {
497         struct av7110 *av7110 = (struct av7110 *)cookie;
498         u32 rxbuf, txbuf;
499         int len;
500
501         if (av7110->debitype != -1)
502                 /* we shouldn't get any irq while a debi xfer is running */
503                 printk("dvb-ttpci: GPIO0 irq oops @ %ld, psr:0x%08x, ssr:0x%08x\n",
504                        jiffies, saa7146_read(av7110->dev, PSR),
505                        saa7146_read(av7110->dev, SSR));
506
507         if (saa7146_wait_for_debi_done(av7110->dev, 0)) {
508                 printk(KERN_ERR "%s: saa7146_wait_for_debi_done timed out\n", __func__);
509                 BUG(); /* maybe we should try resetting the debi? */
510         }
511
512         spin_lock(&av7110->debilock);
513         ARM_ClearIrq(av7110);
514
515         /* see what the av7110 wants */
516         av7110->debitype = irdebi(av7110, DEBINOSWAP, IRQ_STATE, 0, 2);
517         av7110->debilen  = irdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
518         rxbuf = irdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
519         txbuf = irdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
520         len = (av7110->debilen + 3) & ~3;
521
522         print_time("gpio");
523         dprintk(8, "GPIO0 irq 0x%04x %d\n", av7110->debitype, av7110->debilen);
524
525         switch (av7110->debitype & 0xff) {
526
527         case DATA_TS_PLAY:
528         case DATA_PES_PLAY:
529                 break;
530
531         case DATA_MPEG_VIDEO_EVENT:
532         {
533                 u32 h_ar;
534                 struct video_event event;
535
536                 av7110->video_size.w = irdebi(av7110, DEBINOSWAP, STATUS_MPEG_WIDTH, 0, 2);
537                 h_ar = irdebi(av7110, DEBINOSWAP, STATUS_MPEG_HEIGHT_AR, 0, 2);
538
539                 iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
540                 iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
541
542                 av7110->video_size.h = h_ar & 0xfff;
543
544                 event.type = VIDEO_EVENT_SIZE_CHANGED;
545                 event.u.size.w = av7110->video_size.w;
546                 event.u.size.h = av7110->video_size.h;
547                 switch ((h_ar >> 12) & 0xf)
548                 {
549                 case 3:
550                         av7110->video_size.aspect_ratio = VIDEO_FORMAT_16_9;
551                         event.u.size.aspect_ratio = VIDEO_FORMAT_16_9;
552                         av7110->videostate.video_format = VIDEO_FORMAT_16_9;
553                         break;
554                 case 4:
555                         av7110->video_size.aspect_ratio = VIDEO_FORMAT_221_1;
556                         event.u.size.aspect_ratio = VIDEO_FORMAT_221_1;
557                         av7110->videostate.video_format = VIDEO_FORMAT_221_1;
558                         break;
559                 default:
560                         av7110->video_size.aspect_ratio = VIDEO_FORMAT_4_3;
561                         event.u.size.aspect_ratio = VIDEO_FORMAT_4_3;
562                         av7110->videostate.video_format = VIDEO_FORMAT_4_3;
563                 }
564
565                 dprintk(8, "GPIO0 irq: DATA_MPEG_VIDEO_EVENT: w/h/ar = %u/%u/%u\n",
566                         av7110->video_size.w, av7110->video_size.h,
567                         av7110->video_size.aspect_ratio);
568
569                 dvb_video_add_event(av7110, &event);
570                 break;
571         }
572
573         case DATA_CI_PUT:
574         {
575                 int avail;
576                 struct dvb_ringbuffer *cibuf = &av7110->ci_wbuffer;
577
578                 avail = dvb_ringbuffer_avail(cibuf);
579                 if (avail <= 2) {
580                         iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
581                         iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
582                         iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
583                         break;
584                 }
585                 len = DVB_RINGBUFFER_PEEK(cibuf, 0) << 8;
586                 len |= DVB_RINGBUFFER_PEEK(cibuf, 1);
587                 if (avail < len + 2) {
588                         iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
589                         iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
590                         iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
591                         break;
592                 }
593                 DVB_RINGBUFFER_SKIP(cibuf, 2);
594
595                 dvb_ringbuffer_read(cibuf, av7110->debi_virt, len);
596
597                 iwdebi(av7110, DEBINOSWAP, TX_LEN, len, 2);
598                 iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, len, 2);
599                 dprintk(8, "DMA: CI\n");
600                 start_debi_dma(av7110, DEBI_WRITE, DPRAM_BASE + txbuf, len);
601                 spin_unlock(&av7110->debilock);
602                 wake_up(&cibuf->queue);
603                 return;
604         }
605
606         case DATA_MPEG_PLAY:
607                 if (!av7110->playing) {
608                         iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
609                         iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
610                         iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
611                         break;
612                 }
613                 len = 0;
614                 if (av7110->debitype & 0x100) {
615                         spin_lock(&av7110->aout.lock);
616                         len = av7110_pes_play(av7110->debi_virt, &av7110->aout, 2048);
617                         spin_unlock(&av7110->aout.lock);
618                 }
619                 if (len <= 0 && (av7110->debitype & 0x200)
620                     &&av7110->videostate.play_state != VIDEO_FREEZED) {
621                         spin_lock(&av7110->avout.lock);
622                         len = av7110_pes_play(av7110->debi_virt, &av7110->avout, 2048);
623                         spin_unlock(&av7110->avout.lock);
624                 }
625                 if (len <= 0) {
626                         iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
627                         iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
628                         iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
629                         break;
630                 }
631                 dprintk(8, "GPIO0 PES_PLAY len=%04x\n", len);
632                 iwdebi(av7110, DEBINOSWAP, TX_LEN, len, 2);
633                 iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, len, 2);
634                 dprintk(8, "DMA: MPEG_PLAY\n");
635                 start_debi_dma(av7110, DEBI_WRITE, DPRAM_BASE + txbuf, len);
636                 spin_unlock(&av7110->debilock);
637                 return;
638
639         case DATA_BMP_LOAD:
640                 len = av7110->debilen;
641                 dprintk(8, "gpio DATA_BMP_LOAD len %d\n", len);
642                 if (!len) {
643                         av7110->bmp_state = BMP_LOADED;
644                         iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
645                         iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
646                         iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
647                         wake_up(&av7110->bmpq);
648                         dprintk(8, "gpio DATA_BMP_LOAD done\n");
649                         break;
650                 }
651                 if (len > av7110->bmplen)
652                         len = av7110->bmplen;
653                 if (len > 2 * 1024)
654                         len = 2 * 1024;
655                 iwdebi(av7110, DEBINOSWAP, TX_LEN, len, 2);
656                 iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, len, 2);
657                 memcpy(av7110->debi_virt, av7110->bmpbuf+av7110->bmpp, len);
658                 av7110->bmpp += len;
659                 av7110->bmplen -= len;
660                 dprintk(8, "gpio DATA_BMP_LOAD DMA len %d\n", len);
661                 start_debi_dma(av7110, DEBI_WRITE, DPRAM_BASE+txbuf, len);
662                 spin_unlock(&av7110->debilock);
663                 return;
664
665         case DATA_CI_GET:
666         case DATA_COMMON_INTERFACE:
667         case DATA_FSECTION:
668         case DATA_IPMPE:
669         case DATA_PIPING:
670                 if (!len || len > 4 * 1024) {
671                         iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
672                         break;
673                 }
674                 /* fall through */
675
676         case DATA_TS_RECORD:
677         case DATA_PES_RECORD:
678                 dprintk(8, "DMA: TS_REC etc.\n");
679                 start_debi_dma(av7110, DEBI_READ, DPRAM_BASE+rxbuf, len);
680                 spin_unlock(&av7110->debilock);
681                 return;
682
683         case DATA_DEBUG_MESSAGE:
684                 if (!len || len > 0xff) {
685                         iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
686                         break;
687                 }
688                 start_debi_dma(av7110, DEBI_READ, Reserved, len);
689                 spin_unlock(&av7110->debilock);
690                 return;
691
692         case DATA_IRCOMMAND:
693                 if (av7110->ir.ir_handler)
694                         av7110->ir.ir_handler(av7110,
695                                 swahw32(irdebi(av7110, DEBINOSWAP, Reserved, 0, 4)));
696                 iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
697                 break;
698
699         default:
700                 printk("dvb-ttpci: gpioirq unknown type=%d len=%d\n",
701                        av7110->debitype, av7110->debilen);
702                 break;
703         }
704         av7110->debitype = -1;
705         ARM_ClearMailBox(av7110);
706         spin_unlock(&av7110->debilock);
707 }
708
709
710 #ifdef CONFIG_DVB_AV7110_OSD
711 static int dvb_osd_ioctl(struct inode *inode, struct file *file,
712                          unsigned int cmd, void *parg)
713 {
714         struct dvb_device *dvbdev = file->private_data;
715         struct av7110 *av7110 = dvbdev->priv;
716
717         dprintk(4, "%p\n", av7110);
718
719         if (cmd == OSD_SEND_CMD)
720                 return av7110_osd_cmd(av7110, (osd_cmd_t *) parg);
721         if (cmd == OSD_GET_CAPABILITY)
722                 return av7110_osd_capability(av7110, (osd_cap_t *) parg);
723
724         return -EINVAL;
725 }
726
727
728 static const struct file_operations dvb_osd_fops = {
729         .owner          = THIS_MODULE,
730         .ioctl          = dvb_generic_ioctl,
731         .open           = dvb_generic_open,
732         .release        = dvb_generic_release,
733 };
734
735 static struct dvb_device dvbdev_osd = {
736         .priv           = NULL,
737         .users          = 1,
738         .writers        = 1,
739         .fops           = &dvb_osd_fops,
740         .kernel_ioctl   = dvb_osd_ioctl,
741 };
742 #endif /* CONFIG_DVB_AV7110_OSD */
743
744
745 static inline int SetPIDs(struct av7110 *av7110, u16 vpid, u16 apid, u16 ttpid,
746                           u16 subpid, u16 pcrpid)
747 {
748         u16 aflags = 0;
749
750         dprintk(4, "%p\n", av7110);
751
752         if (vpid == 0x1fff || apid == 0x1fff ||
753             ttpid == 0x1fff || subpid == 0x1fff || pcrpid == 0x1fff) {
754                 vpid = apid = ttpid = subpid = pcrpid = 0;
755                 av7110->pids[DMX_PES_VIDEO] = 0;
756                 av7110->pids[DMX_PES_AUDIO] = 0;
757                 av7110->pids[DMX_PES_TELETEXT] = 0;
758                 av7110->pids[DMX_PES_PCR] = 0;
759         }
760
761         if (av7110->audiostate.bypass_mode)
762                 aflags |= 0x8000;
763
764         return av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, MultiPID, 6,
765                              pcrpid, vpid, apid, ttpid, subpid, aflags);
766 }
767
768 int ChangePIDs(struct av7110 *av7110, u16 vpid, u16 apid, u16 ttpid,
769                 u16 subpid, u16 pcrpid)
770 {
771         int ret = 0;
772         dprintk(4, "%p\n", av7110);
773
774         if (mutex_lock_interruptible(&av7110->pid_mutex))
775                 return -ERESTARTSYS;
776
777         if (!(vpid & 0x8000))
778                 av7110->pids[DMX_PES_VIDEO] = vpid;
779         if (!(apid & 0x8000))
780                 av7110->pids[DMX_PES_AUDIO] = apid;
781         if (!(ttpid & 0x8000))
782                 av7110->pids[DMX_PES_TELETEXT] = ttpid;
783         if (!(pcrpid & 0x8000))
784                 av7110->pids[DMX_PES_PCR] = pcrpid;
785
786         av7110->pids[DMX_PES_SUBTITLE] = 0;
787
788         if (av7110->fe_synced) {
789                 pcrpid = av7110->pids[DMX_PES_PCR];
790                 ret = SetPIDs(av7110, vpid, apid, ttpid, subpid, pcrpid);
791         }
792
793         mutex_unlock(&av7110->pid_mutex);
794         return ret;
795 }
796
797
798 /******************************************************************************
799  * hardware filter functions
800  ******************************************************************************/
801
802 static int StartHWFilter(struct dvb_demux_filter *dvbdmxfilter)
803 {
804         struct dvb_demux_feed *dvbdmxfeed = dvbdmxfilter->feed;
805         struct av7110 *av7110 = dvbdmxfeed->demux->priv;
806         u16 buf[20];
807         int ret, i;
808         u16 handle;
809 //      u16 mode = 0x0320;
810         u16 mode = 0xb96a;
811
812         dprintk(4, "%p\n", av7110);
813
814         if (av7110->full_ts)
815                 return 0;
816
817         if (dvbdmxfilter->type == DMX_TYPE_SEC) {
818                 if (hw_sections) {
819                         buf[4] = (dvbdmxfilter->filter.filter_value[0] << 8) |
820                                 dvbdmxfilter->maskandmode[0];
821                         for (i = 3; i < 18; i++)
822                                 buf[i + 4 - 2] =
823                                         (dvbdmxfilter->filter.filter_value[i] << 8) |
824                                         dvbdmxfilter->maskandmode[i];
825                         mode = 4;
826                 }
827         } else if ((dvbdmxfeed->ts_type & TS_PACKET) &&
828                    !(dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY)) {
829                 av7110_p2t_init(&av7110->p2t_filter[dvbdmxfilter->index], dvbdmxfeed);
830         }
831
832         buf[0] = (COMTYPE_PID_FILTER << 8) + AddPIDFilter;
833         buf[1] = 16;
834         buf[2] = dvbdmxfeed->pid;
835         buf[3] = mode;
836
837         ret = av7110_fw_request(av7110, buf, 20, &handle, 1);
838         if (ret != 0 || handle >= 32) {
839                 printk("dvb-ttpci: %s error  buf %04x %04x %04x %04x  "
840                                 "ret %d  handle %04x\n",
841                                 __func__, buf[0], buf[1], buf[2], buf[3],
842                                 ret, handle);
843                 dvbdmxfilter->hw_handle = 0xffff;
844                 if (!ret)
845                         ret = -1;
846                 return ret;
847         }
848
849         av7110->handle2filter[handle] = dvbdmxfilter;
850         dvbdmxfilter->hw_handle = handle;
851
852         return ret;
853 }
854
855 static int StopHWFilter(struct dvb_demux_filter *dvbdmxfilter)
856 {
857         struct av7110 *av7110 = dvbdmxfilter->feed->demux->priv;
858         u16 buf[3];
859         u16 answ[2];
860         int ret;
861         u16 handle;
862
863         dprintk(4, "%p\n", av7110);
864
865         if (av7110->full_ts)
866                 return 0;
867
868         handle = dvbdmxfilter->hw_handle;
869         if (handle >= 32) {
870                 printk("%s tried to stop invalid filter %04x, filter type = %x\n",
871                                 __func__, handle, dvbdmxfilter->type);
872                 return -EINVAL;
873         }
874
875         av7110->handle2filter[handle] = NULL;
876
877         buf[0] = (COMTYPE_PID_FILTER << 8) + DelPIDFilter;
878         buf[1] = 1;
879         buf[2] = handle;
880         ret = av7110_fw_request(av7110, buf, 3, answ, 2);
881         if (ret != 0 || answ[1] != handle) {
882                 printk("dvb-ttpci: %s error  cmd %04x %04x %04x  ret %x  "
883                                 "resp %04x %04x  pid %d\n",
884                                 __func__, buf[0], buf[1], buf[2], ret,
885                                 answ[0], answ[1], dvbdmxfilter->feed->pid);
886                 if (!ret)
887                         ret = -1;
888         }
889         return ret;
890 }
891
892
893 static int dvb_feed_start_pid(struct dvb_demux_feed *dvbdmxfeed)
894 {
895         struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
896         struct av7110 *av7110 = dvbdmx->priv;
897         u16 *pid = dvbdmx->pids, npids[5];
898         int i;
899         int ret = 0;
900
901         dprintk(4, "%p\n", av7110);
902
903         npids[0] = npids[1] = npids[2] = npids[3] = npids[4] = 0xffff;
904         i = dvbdmxfeed->pes_type;
905         npids[i] = (pid[i]&0x8000) ? 0 : pid[i];
906         if ((i == 2) && npids[i] && (dvbdmxfeed->ts_type & TS_PACKET)) {
907                 npids[i] = 0;
908                 ret = ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]);
909                 if (!ret)
910                         ret = StartHWFilter(dvbdmxfeed->filter);
911                 return ret;
912         }
913         if (dvbdmxfeed->pes_type <= 2 || dvbdmxfeed->pes_type == 4) {
914                 ret = ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]);
915                 if (ret)
916                         return ret;
917         }
918
919         if (dvbdmxfeed->pes_type < 2 && npids[0])
920                 if (av7110->fe_synced)
921                 {
922                         ret = av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, Scan, 0);
923                         if (ret)
924                                 return ret;
925                 }
926
927         if ((dvbdmxfeed->ts_type & TS_PACKET) && !av7110->full_ts) {
928                 if (dvbdmxfeed->pes_type == 0 && !(dvbdmx->pids[0] & 0x8000))
929                         ret = av7110_av_start_record(av7110, RP_AUDIO, dvbdmxfeed);
930                 if (dvbdmxfeed->pes_type == 1 && !(dvbdmx->pids[1] & 0x8000))
931                         ret = av7110_av_start_record(av7110, RP_VIDEO, dvbdmxfeed);
932         }
933         return ret;
934 }
935
936 static int dvb_feed_stop_pid(struct dvb_demux_feed *dvbdmxfeed)
937 {
938         struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
939         struct av7110 *av7110 = dvbdmx->priv;
940         u16 *pid = dvbdmx->pids, npids[5];
941         int i;
942
943         int ret = 0;
944
945         dprintk(4, "%p\n", av7110);
946
947         if (dvbdmxfeed->pes_type <= 1) {
948                 ret = av7110_av_stop(av7110, dvbdmxfeed->pes_type ?  RP_VIDEO : RP_AUDIO);
949                 if (ret)
950                         return ret;
951                 if (!av7110->rec_mode)
952                         dvbdmx->recording = 0;
953                 if (!av7110->playing)
954                         dvbdmx->playing = 0;
955         }
956         npids[0] = npids[1] = npids[2] = npids[3] = npids[4] = 0xffff;
957         i = dvbdmxfeed->pes_type;
958         switch (i) {
959         case 2: //teletext
960                 if (dvbdmxfeed->ts_type & TS_PACKET)
961                         ret = StopHWFilter(dvbdmxfeed->filter);
962                 npids[2] = 0;
963                 break;
964         case 0:
965         case 1:
966         case 4:
967                 if (!pids_off)
968                         return 0;
969                 npids[i] = (pid[i]&0x8000) ? 0 : pid[i];
970                 break;
971         }
972         if (!ret)
973                 ret = ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]);
974         return ret;
975 }
976
977 static int av7110_start_feed(struct dvb_demux_feed *feed)
978 {
979         struct dvb_demux *demux = feed->demux;
980         struct av7110 *av7110 = demux->priv;
981         int ret = 0;
982
983         dprintk(4, "%p\n", av7110);
984
985         if (!demux->dmx.frontend)
986                 return -EINVAL;
987
988         if (!av7110->full_ts && feed->pid > 0x1fff)
989                 return -EINVAL;
990
991         if (feed->type == DMX_TYPE_TS) {
992                 if ((feed->ts_type & TS_DECODER) &&
993                     (feed->pes_type < DMX_TS_PES_OTHER)) {
994                         switch (demux->dmx.frontend->source) {
995                         case DMX_MEMORY_FE:
996                                 if (feed->ts_type & TS_DECODER)
997                                        if (feed->pes_type < 2 &&
998                                            !(demux->pids[0] & 0x8000) &&
999                                            !(demux->pids[1] & 0x8000)) {
1000                                                dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout);
1001                                                dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout);
1002                                                ret = av7110_av_start_play(av7110,RP_AV);
1003                                                if (!ret)
1004                                                        demux->playing = 1;
1005                                         }
1006                                 break;
1007                         default:
1008                                 ret = dvb_feed_start_pid(feed);
1009                                 break;
1010                         }
1011                 } else if ((feed->ts_type & TS_PACKET) &&
1012                            (demux->dmx.frontend->source != DMX_MEMORY_FE)) {
1013                         ret = StartHWFilter(feed->filter);
1014                 }
1015         }
1016
1017         if (av7110->full_ts) {
1018                 budget_start_feed(feed);
1019                 return ret;
1020         }
1021
1022         if (feed->type == DMX_TYPE_SEC) {
1023                 int i;
1024
1025                 for (i = 0; i < demux->filternum; i++) {
1026                         if (demux->filter[i].state != DMX_STATE_READY)
1027                                 continue;
1028                         if (demux->filter[i].type != DMX_TYPE_SEC)
1029                                 continue;
1030                         if (demux->filter[i].filter.parent != &feed->feed.sec)
1031                                 continue;
1032                         demux->filter[i].state = DMX_STATE_GO;
1033                         if (demux->dmx.frontend->source != DMX_MEMORY_FE) {
1034                                 ret = StartHWFilter(&demux->filter[i]);
1035                                 if (ret)
1036                                         break;
1037                         }
1038                 }
1039         }
1040
1041         return ret;
1042 }
1043
1044
1045 static int av7110_stop_feed(struct dvb_demux_feed *feed)
1046 {
1047         struct dvb_demux *demux = feed->demux;
1048         struct av7110 *av7110 = demux->priv;
1049         int i, rc, ret = 0;
1050         dprintk(4, "%p\n", av7110);
1051
1052         if (feed->type == DMX_TYPE_TS) {
1053                 if (feed->ts_type & TS_DECODER) {
1054                         if (feed->pes_type >= DMX_TS_PES_OTHER ||
1055                             !demux->pesfilter[feed->pes_type])
1056                                 return -EINVAL;
1057                         demux->pids[feed->pes_type] |= 0x8000;
1058                         demux->pesfilter[feed->pes_type] = NULL;
1059                 }
1060                 if (feed->ts_type & TS_DECODER &&
1061                     feed->pes_type < DMX_TS_PES_OTHER) {
1062                         ret = dvb_feed_stop_pid(feed);
1063                 } else
1064                         if ((feed->ts_type & TS_PACKET) &&
1065                             (demux->dmx.frontend->source != DMX_MEMORY_FE))
1066                                 ret = StopHWFilter(feed->filter);
1067         }
1068
1069         if (av7110->full_ts) {
1070                 budget_stop_feed(feed);
1071                 return ret;
1072         }
1073
1074         if (feed->type == DMX_TYPE_SEC) {
1075                 for (i = 0; i<demux->filternum; i++) {
1076                         if (demux->filter[i].state == DMX_STATE_GO &&
1077                             demux->filter[i].filter.parent == &feed->feed.sec) {
1078                                 demux->filter[i].state = DMX_STATE_READY;
1079                                 if (demux->dmx.frontend->source != DMX_MEMORY_FE) {
1080                                         rc = StopHWFilter(&demux->filter[i]);
1081                                         if (!ret)
1082                                                 ret = rc;
1083                                         /* keep going, stop as many filters as possible */
1084                                 }
1085                         }
1086                 }
1087         }
1088
1089         return ret;
1090 }
1091
1092
1093 static void restart_feeds(struct av7110 *av7110)
1094 {
1095         struct dvb_demux *dvbdmx = &av7110->demux;
1096         struct dvb_demux_feed *feed;
1097         int mode;
1098         int feeding;
1099         int i, j;
1100
1101         dprintk(4, "%p\n", av7110);
1102
1103         mode = av7110->playing;
1104         av7110->playing = 0;
1105         av7110->rec_mode = 0;
1106
1107         feeding = av7110->feeding1; /* full_ts mod */
1108
1109         for (i = 0; i < dvbdmx->feednum; i++) {
1110                 feed = &dvbdmx->feed[i];
1111                 if (feed->state == DMX_STATE_GO) {
1112                         if (feed->type == DMX_TYPE_SEC) {
1113                                 for (j = 0; j < dvbdmx->filternum; j++) {
1114                                         if (dvbdmx->filter[j].type != DMX_TYPE_SEC)
1115                                                 continue;
1116                                         if (dvbdmx->filter[j].filter.parent != &feed->feed.sec)
1117                                                 continue;
1118                                         if (dvbdmx->filter[j].state == DMX_STATE_GO)
1119                                                 dvbdmx->filter[j].state = DMX_STATE_READY;
1120                                 }
1121                         }
1122                         av7110_start_feed(feed);
1123                 }
1124         }
1125
1126         av7110->feeding1 = feeding; /* full_ts mod */
1127
1128         if (mode)
1129                 av7110_av_start_play(av7110, mode);
1130 }
1131
1132 static int dvb_get_stc(struct dmx_demux *demux, unsigned int num,
1133                        uint64_t *stc, unsigned int *base)
1134 {
1135         int ret;
1136         u16 fwstc[4];
1137         u16 tag = ((COMTYPE_REQUEST << 8) + ReqSTC);
1138         struct dvb_demux *dvbdemux;
1139         struct av7110 *av7110;
1140
1141         /* pointer casting paranoia... */
1142         BUG_ON(!demux);
1143         dvbdemux = demux->priv;
1144         BUG_ON(!dvbdemux);
1145         av7110 = dvbdemux->priv;
1146
1147         dprintk(4, "%p\n", av7110);
1148
1149         if (num != 0)
1150                 return -EINVAL;
1151
1152         ret = av7110_fw_request(av7110, &tag, 0, fwstc, 4);
1153         if (ret) {
1154                 printk(KERN_ERR "%s: av7110_fw_request error\n", __func__);
1155                 return ret;
1156         }
1157         dprintk(2, "fwstc = %04hx %04hx %04hx %04hx\n",
1158                 fwstc[0], fwstc[1], fwstc[2], fwstc[3]);
1159
1160         *stc =  (((uint64_t) ((fwstc[3] & 0x8000) >> 15)) << 32) |
1161                 (((uint64_t)  fwstc[1]) << 16) | ((uint64_t) fwstc[0]);
1162         *base = 1;
1163
1164         dprintk(4, "stc = %lu\n", (unsigned long)*stc);
1165
1166         return 0;
1167 }
1168
1169
1170 /******************************************************************************
1171  * SEC device file operations
1172  ******************************************************************************/
1173
1174
1175 static int av7110_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
1176 {
1177         struct av7110* av7110 = fe->dvb->priv;
1178
1179         switch (tone) {
1180         case SEC_TONE_ON:
1181                 return Set22K(av7110, 1);
1182
1183         case SEC_TONE_OFF:
1184                 return Set22K(av7110, 0);
1185
1186         default:
1187                 return -EINVAL;
1188         }
1189 }
1190
1191 static int av7110_diseqc_send_master_cmd(struct dvb_frontend* fe,
1192                                          struct dvb_diseqc_master_cmd* cmd)
1193 {
1194         struct av7110* av7110 = fe->dvb->priv;
1195
1196         return av7110_diseqc_send(av7110, cmd->msg_len, cmd->msg, -1);
1197 }
1198
1199 static int av7110_diseqc_send_burst(struct dvb_frontend* fe,
1200                                     fe_sec_mini_cmd_t minicmd)
1201 {
1202         struct av7110* av7110 = fe->dvb->priv;
1203
1204         return av7110_diseqc_send(av7110, 0, NULL, minicmd);
1205 }
1206
1207 /* simplified code from budget-core.c */
1208 static int stop_ts_capture(struct av7110 *budget)
1209 {
1210         dprintk(2, "budget: %p\n", budget);
1211
1212         if (--budget->feeding1)
1213                 return budget->feeding1;
1214         saa7146_write(budget->dev, MC1, MASK_20);       /* DMA3 off */
1215         SAA7146_IER_DISABLE(budget->dev, MASK_10);
1216         SAA7146_ISR_CLEAR(budget->dev, MASK_10);
1217         return 0;
1218 }
1219
1220 static int start_ts_capture(struct av7110 *budget)
1221 {
1222         dprintk(2, "budget: %p\n", budget);
1223
1224         if (budget->feeding1)
1225                 return ++budget->feeding1;
1226         memset(budget->grabbing, 0x00, TS_BUFLEN);
1227         budget->ttbp = 0;
1228         SAA7146_ISR_CLEAR(budget->dev, MASK_10);  /* VPE */
1229         SAA7146_IER_ENABLE(budget->dev, MASK_10); /* VPE */
1230         saa7146_write(budget->dev, MC1, (MASK_04 | MASK_20)); /* DMA3 on */
1231         return ++budget->feeding1;
1232 }
1233
1234 static int budget_start_feed(struct dvb_demux_feed *feed)
1235 {
1236         struct dvb_demux *demux = feed->demux;
1237         struct av7110 *budget = demux->priv;
1238         int status;
1239
1240         dprintk(2, "av7110: %p\n", budget);
1241
1242         spin_lock(&budget->feedlock1);
1243         feed->pusi_seen = 0; /* have a clean section start */
1244         status = start_ts_capture(budget);
1245         spin_unlock(&budget->feedlock1);
1246         return status;
1247 }
1248
1249 static int budget_stop_feed(struct dvb_demux_feed *feed)
1250 {
1251         struct dvb_demux *demux = feed->demux;
1252         struct av7110 *budget = demux->priv;
1253         int status;
1254
1255         dprintk(2, "budget: %p\n", budget);
1256
1257         spin_lock(&budget->feedlock1);
1258         status = stop_ts_capture(budget);
1259         spin_unlock(&budget->feedlock1);
1260         return status;
1261 }
1262
1263 static void vpeirq(unsigned long cookie)
1264 {
1265         struct av7110 *budget = (struct av7110 *)cookie;
1266         u8 *mem = (u8 *) (budget->grabbing);
1267         u32 olddma = budget->ttbp;
1268         u32 newdma = saa7146_read(budget->dev, PCI_VDP3);
1269         struct dvb_demux *demux = budget->full_ts ? &budget->demux : &budget->demux1;
1270
1271         /* nearest lower position divisible by 188 */
1272         newdma -= newdma % 188;
1273
1274         if (newdma >= TS_BUFLEN)
1275                 return;
1276
1277         budget->ttbp = newdma;
1278
1279         if (!budget->feeding1 || (newdma == olddma))
1280                 return;
1281
1282         /* Ensure streamed PCI data is synced to CPU */
1283         pci_dma_sync_sg_for_cpu(budget->dev->pci, budget->pt.slist, budget->pt.nents, PCI_DMA_FROMDEVICE);
1284
1285 #if 0
1286         /* track rps1 activity */
1287         printk("vpeirq: %02x Event Counter 1 0x%04x\n",
1288                mem[olddma],
1289                saa7146_read(budget->dev, EC1R) & 0x3fff);
1290 #endif
1291
1292         if (newdma > olddma)
1293                 /* no wraparound, dump olddma..newdma */
1294                 dvb_dmx_swfilter_packets(demux, mem + olddma, (newdma - olddma) / 188);
1295         else {
1296                 /* wraparound, dump olddma..buflen and 0..newdma */
1297                 dvb_dmx_swfilter_packets(demux, mem + olddma, (TS_BUFLEN - olddma) / 188);
1298                 dvb_dmx_swfilter_packets(demux, mem, newdma / 188);
1299         }
1300 }
1301
1302 static int av7110_register(struct av7110 *av7110)
1303 {
1304         int ret, i;
1305         struct dvb_demux *dvbdemux = &av7110->demux;
1306         struct dvb_demux *dvbdemux1 = &av7110->demux1;
1307
1308         dprintk(4, "%p\n", av7110);
1309
1310         if (av7110->registered)
1311                 return -1;
1312
1313         av7110->registered = 1;
1314
1315         dvbdemux->priv = (void *) av7110;
1316
1317         for (i = 0; i < 32; i++)
1318                 av7110->handle2filter[i] = NULL;
1319
1320         dvbdemux->filternum = (av7110->full_ts) ? 256 : 32;
1321         dvbdemux->feednum = (av7110->full_ts) ? 256 : 32;
1322         dvbdemux->start_feed = av7110_start_feed;
1323         dvbdemux->stop_feed = av7110_stop_feed;
1324         dvbdemux->write_to_decoder = av7110_write_to_decoder;
1325         dvbdemux->dmx.capabilities = (DMX_TS_FILTERING | DMX_SECTION_FILTERING |
1326                                       DMX_MEMORY_BASED_FILTERING);
1327
1328         dvb_dmx_init(&av7110->demux);
1329         av7110->demux.dmx.get_stc = dvb_get_stc;
1330
1331         av7110->dmxdev.filternum = (av7110->full_ts) ? 256 : 32;
1332         av7110->dmxdev.demux = &dvbdemux->dmx;
1333         av7110->dmxdev.capabilities = 0;
1334
1335         dvb_dmxdev_init(&av7110->dmxdev, &av7110->dvb_adapter);
1336
1337         av7110->hw_frontend.source = DMX_FRONTEND_0;
1338
1339         ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &av7110->hw_frontend);
1340
1341         if (ret < 0)
1342                 return ret;
1343
1344         av7110->mem_frontend.source = DMX_MEMORY_FE;
1345
1346         ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &av7110->mem_frontend);
1347
1348         if (ret < 0)
1349                 return ret;
1350
1351         ret = dvbdemux->dmx.connect_frontend(&dvbdemux->dmx,
1352                                              &av7110->hw_frontend);
1353         if (ret < 0)
1354                 return ret;
1355
1356         av7110_av_register(av7110);
1357         av7110_ca_register(av7110);
1358
1359 #ifdef CONFIG_DVB_AV7110_OSD
1360         dvb_register_device(&av7110->dvb_adapter, &av7110->osd_dev,
1361                             &dvbdev_osd, av7110, DVB_DEVICE_OSD);
1362 #endif
1363
1364         dvb_net_init(&av7110->dvb_adapter, &av7110->dvb_net, &dvbdemux->dmx);
1365
1366         if (budgetpatch) {
1367                 /* initialize software demux1 without its own frontend
1368                  * demux1 hardware is connected to frontend0 of demux0
1369                  */
1370                 dvbdemux1->priv = (void *) av7110;
1371
1372                 dvbdemux1->filternum = 256;
1373                 dvbdemux1->feednum = 256;
1374                 dvbdemux1->start_feed = budget_start_feed;
1375                 dvbdemux1->stop_feed = budget_stop_feed;
1376                 dvbdemux1->write_to_decoder = NULL;
1377
1378                 dvbdemux1->dmx.capabilities = (DMX_TS_FILTERING | DMX_SECTION_FILTERING |
1379                                                DMX_MEMORY_BASED_FILTERING);
1380
1381                 dvb_dmx_init(&av7110->demux1);
1382
1383                 av7110->dmxdev1.filternum = 256;
1384                 av7110->dmxdev1.demux = &dvbdemux1->dmx;
1385                 av7110->dmxdev1.capabilities = 0;
1386
1387                 dvb_dmxdev_init(&av7110->dmxdev1, &av7110->dvb_adapter);
1388
1389                 dvb_net_init(&av7110->dvb_adapter, &av7110->dvb_net1, &dvbdemux1->dmx);
1390                 printk("dvb-ttpci: additional demux1 for budget-patch registered\n");
1391         }
1392         return 0;
1393 }
1394
1395
1396 static void dvb_unregister(struct av7110 *av7110)
1397 {
1398         struct dvb_demux *dvbdemux = &av7110->demux;
1399         struct dvb_demux *dvbdemux1 = &av7110->demux1;
1400
1401         dprintk(4, "%p\n", av7110);
1402
1403         if (!av7110->registered)
1404                 return;
1405
1406         if (budgetpatch) {
1407                 dvb_net_release(&av7110->dvb_net1);
1408                 dvbdemux->dmx.close(&dvbdemux1->dmx);
1409                 dvb_dmxdev_release(&av7110->dmxdev1);
1410                 dvb_dmx_release(&av7110->demux1);
1411         }
1412
1413         dvb_net_release(&av7110->dvb_net);
1414
1415         dvbdemux->dmx.close(&dvbdemux->dmx);
1416         dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &av7110->hw_frontend);
1417         dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &av7110->mem_frontend);
1418
1419         dvb_dmxdev_release(&av7110->dmxdev);
1420         dvb_dmx_release(&av7110->demux);
1421
1422         if (av7110->fe != NULL) {
1423                 dvb_unregister_frontend(av7110->fe);
1424                 dvb_frontend_detach(av7110->fe);
1425         }
1426         dvb_unregister_device(av7110->osd_dev);
1427         av7110_av_unregister(av7110);
1428         av7110_ca_unregister(av7110);
1429 }
1430
1431
1432 /****************************************************************************
1433  * I2C client commands
1434  ****************************************************************************/
1435
1436 int i2c_writereg(struct av7110 *av7110, u8 id, u8 reg, u8 val)
1437 {
1438         u8 msg[2] = { reg, val };
1439         struct i2c_msg msgs;
1440
1441         msgs.flags = 0;
1442         msgs.addr = id / 2;
1443         msgs.len = 2;
1444         msgs.buf = msg;
1445         return i2c_transfer(&av7110->i2c_adap, &msgs, 1);
1446 }
1447
1448 u8 i2c_readreg(struct av7110 *av7110, u8 id, u8 reg)
1449 {
1450         u8 mm1[] = {0x00};
1451         u8 mm2[] = {0x00};
1452         struct i2c_msg msgs[2];
1453
1454         msgs[0].flags = 0;
1455         msgs[1].flags = I2C_M_RD;
1456         msgs[0].addr = msgs[1].addr = id / 2;
1457         mm1[0] = reg;
1458         msgs[0].len = 1; msgs[1].len = 1;
1459         msgs[0].buf = mm1; msgs[1].buf = mm2;
1460         i2c_transfer(&av7110->i2c_adap, msgs, 2);
1461
1462         return mm2[0];
1463 }
1464
1465 /****************************************************************************
1466  * INITIALIZATION
1467  ****************************************************************************/
1468
1469
1470 static int check_firmware(struct av7110* av7110)
1471 {
1472         u32 crc = 0, len = 0;
1473         unsigned char *ptr;
1474
1475         /* check for firmware magic */
1476         ptr = av7110->bin_fw;
1477         if (ptr[0] != 'A' || ptr[1] != 'V' ||
1478             ptr[2] != 'F' || ptr[3] != 'W') {
1479                 printk("dvb-ttpci: this is not an av7110 firmware\n");
1480                 return -EINVAL;
1481         }
1482         ptr += 4;
1483
1484         /* check dpram file */
1485         crc = get_unaligned_be32(ptr);
1486         ptr += 4;
1487         len = get_unaligned_be32(ptr);
1488         ptr += 4;
1489         if (len >= 512) {
1490                 printk("dvb-ttpci: dpram file is way too big.\n");
1491                 return -EINVAL;
1492         }
1493         if (crc != crc32_le(0, ptr, len)) {
1494                 printk("dvb-ttpci: crc32 of dpram file does not match.\n");
1495                 return -EINVAL;
1496         }
1497         av7110->bin_dpram = ptr;
1498         av7110->size_dpram = len;
1499         ptr += len;
1500
1501         /* check root file */
1502         crc = get_unaligned_be32(ptr);
1503         ptr += 4;
1504         len = get_unaligned_be32(ptr);
1505         ptr += 4;
1506
1507         if (len <= 200000 || len >= 300000 ||
1508             len > ((av7110->bin_fw + av7110->size_fw) - ptr)) {
1509                 printk("dvb-ttpci: root file has strange size (%d). aborting.\n", len);
1510                 return -EINVAL;
1511         }
1512         if( crc != crc32_le(0, ptr, len)) {
1513                 printk("dvb-ttpci: crc32 of root file does not match.\n");
1514                 return -EINVAL;
1515         }
1516         av7110->bin_root = ptr;
1517         av7110->size_root = len;
1518         return 0;
1519 }
1520
1521 #ifdef CONFIG_DVB_AV7110_FIRMWARE_FILE
1522 #include "av7110_firm.h"
1523 static void put_firmware(struct av7110* av7110)
1524 {
1525         av7110->bin_fw = NULL;
1526 }
1527
1528 static inline int get_firmware(struct av7110* av7110)
1529 {
1530         av7110->bin_fw = dvb_ttpci_fw;
1531         av7110->size_fw = sizeof(dvb_ttpci_fw);
1532         return check_firmware(av7110);
1533 }
1534 #else
1535 static void put_firmware(struct av7110* av7110)
1536 {
1537         vfree(av7110->bin_fw);
1538 }
1539
1540 static int get_firmware(struct av7110* av7110)
1541 {
1542         int ret;
1543         const struct firmware *fw;
1544
1545         /* request the av7110 firmware, this will block until someone uploads it */
1546         ret = request_firmware(&fw, "dvb-ttpci-01.fw", &av7110->dev->pci->dev);
1547         if (ret) {
1548                 if (ret == -ENOENT) {
1549                         printk(KERN_ERR "dvb-ttpci: could not load firmware,"
1550                                " file not found: dvb-ttpci-01.fw\n");
1551                         printk(KERN_ERR "dvb-ttpci: usually this should be in "
1552                                "/usr/lib/hotplug/firmware or /lib/firmware\n");
1553                         printk(KERN_ERR "dvb-ttpci: and can be downloaded from"
1554                                " http://www.linuxtv.org/download/dvb/firmware/\n");
1555                 } else
1556                         printk(KERN_ERR "dvb-ttpci: cannot request firmware"
1557                                " (error %i)\n", ret);
1558                 return -EINVAL;
1559         }
1560
1561         if (fw->size <= 200000) {
1562                 printk("dvb-ttpci: this firmware is way too small.\n");
1563                 release_firmware(fw);
1564                 return -EINVAL;
1565         }
1566
1567         /* check if the firmware is available */
1568         av7110->bin_fw = vmalloc(fw->size);
1569         if (NULL == av7110->bin_fw) {
1570                 dprintk(1, "out of memory\n");
1571                 release_firmware(fw);
1572                 return -ENOMEM;
1573         }
1574
1575         memcpy(av7110->bin_fw, fw->data, fw->size);
1576         av7110->size_fw = fw->size;
1577         if ((ret = check_firmware(av7110)))
1578                 vfree(av7110->bin_fw);
1579
1580         release_firmware(fw);
1581         return ret;
1582 }
1583 #endif
1584
1585
1586 static int alps_bsrv2_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params)
1587 {
1588         struct av7110* av7110 = fe->dvb->priv;
1589         u8 pwr = 0;
1590         u8 buf[4];
1591         struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf) };
1592         u32 div = (params->frequency + 479500) / 125;
1593
1594         if (params->frequency > 2000000) pwr = 3;
1595         else if (params->frequency > 1800000) pwr = 2;
1596         else if (params->frequency > 1600000) pwr = 1;
1597         else if (params->frequency > 1200000) pwr = 0;
1598         else if (params->frequency >= 1100000) pwr = 1;
1599         else pwr = 2;
1600
1601         buf[0] = (div >> 8) & 0x7f;
1602         buf[1] = div & 0xff;
1603         buf[2] = ((div & 0x18000) >> 10) | 0x95;
1604         buf[3] = (pwr << 6) | 0x30;
1605
1606         // NOTE: since we're using a prescaler of 2, we set the
1607         // divisor frequency to 62.5kHz and divide by 125 above
1608
1609         if (fe->ops.i2c_gate_ctrl)
1610                 fe->ops.i2c_gate_ctrl(fe, 1);
1611         if (i2c_transfer (&av7110->i2c_adap, &msg, 1) != 1)
1612                 return -EIO;
1613         return 0;
1614 }
1615
1616 static struct ves1x93_config alps_bsrv2_config = {
1617         .demod_address = 0x08,
1618         .xin = 90100000UL,
1619         .invert_pwm = 0,
1620 };
1621
1622 static int alps_tdbe2_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params)
1623 {
1624         struct av7110* av7110 = fe->dvb->priv;
1625         u32 div;
1626         u8 data[4];
1627         struct i2c_msg msg = { .addr = 0x62, .flags = 0, .buf = data, .len = sizeof(data) };
1628
1629         div = (params->frequency + 35937500 + 31250) / 62500;
1630
1631         data[0] = (div >> 8) & 0x7f;
1632         data[1] = div & 0xff;
1633         data[2] = 0x85 | ((div >> 10) & 0x60);
1634         data[3] = (params->frequency < 174000000 ? 0x88 : params->frequency < 470000000 ? 0x84 : 0x81);
1635
1636         if (fe->ops.i2c_gate_ctrl)
1637                 fe->ops.i2c_gate_ctrl(fe, 1);
1638         if (i2c_transfer(&av7110->i2c_adap, &msg, 1) != 1)
1639                 return -EIO;
1640         return 0;
1641 }
1642
1643 static struct ves1820_config alps_tdbe2_config = {
1644         .demod_address = 0x09,
1645         .xin = 57840000UL,
1646         .invert = 1,
1647         .selagc = VES1820_SELAGC_SIGNAMPERR,
1648 };
1649
1650
1651
1652
1653 static int grundig_29504_451_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params)
1654 {
1655         struct av7110* av7110 = fe->dvb->priv;
1656         u32 div;
1657         u8 data[4];
1658         struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) };
1659
1660         div = params->frequency / 125;
1661         data[0] = (div >> 8) & 0x7f;
1662         data[1] = div & 0xff;
1663         data[2] = 0x8e;
1664         data[3] = 0x00;
1665
1666         if (fe->ops.i2c_gate_ctrl)
1667                 fe->ops.i2c_gate_ctrl(fe, 1);
1668         if (i2c_transfer(&av7110->i2c_adap, &msg, 1) != 1)
1669                 return -EIO;
1670         return 0;
1671 }
1672
1673 static struct tda8083_config grundig_29504_451_config = {
1674         .demod_address = 0x68,
1675 };
1676
1677
1678
1679 static int philips_cd1516_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params)
1680 {
1681         struct av7110* av7110 = fe->dvb->priv;
1682         u32 div;
1683         u32 f = params->frequency;
1684         u8 data[4];
1685         struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) };
1686
1687         div = (f + 36125000 + 31250) / 62500;
1688
1689         data[0] = (div >> 8) & 0x7f;
1690         data[1] = div & 0xff;
1691         data[2] = 0x8e;
1692         data[3] = (f < 174000000 ? 0xa1 : f < 470000000 ? 0x92 : 0x34);
1693
1694         if (fe->ops.i2c_gate_ctrl)
1695                 fe->ops.i2c_gate_ctrl(fe, 1);
1696         if (i2c_transfer(&av7110->i2c_adap, &msg, 1) != 1)
1697                 return -EIO;
1698         return 0;
1699 }
1700
1701 static struct ves1820_config philips_cd1516_config = {
1702         .demod_address = 0x09,
1703         .xin = 57840000UL,
1704         .invert = 1,
1705         .selagc = VES1820_SELAGC_SIGNAMPERR,
1706 };
1707
1708
1709
1710 static int alps_tdlb7_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params)
1711 {
1712         struct av7110* av7110 = fe->dvb->priv;
1713         u32 div, pwr;
1714         u8 data[4];
1715         struct i2c_msg msg = { .addr = 0x60, .flags = 0, .buf = data, .len = sizeof(data) };
1716
1717         div = (params->frequency + 36200000) / 166666;
1718
1719         if (params->frequency <= 782000000)
1720                 pwr = 1;
1721         else
1722                 pwr = 2;
1723
1724         data[0] = (div >> 8) & 0x7f;
1725         data[1] = div & 0xff;
1726         data[2] = 0x85;
1727         data[3] = pwr << 6;
1728
1729         if (fe->ops.i2c_gate_ctrl)
1730                 fe->ops.i2c_gate_ctrl(fe, 1);
1731         if (i2c_transfer(&av7110->i2c_adap, &msg, 1) != 1)
1732                 return -EIO;
1733         return 0;
1734 }
1735
1736 static int alps_tdlb7_request_firmware(struct dvb_frontend* fe, const struct firmware **fw, char* name)
1737 {
1738 #if defined(CONFIG_DVB_SP8870) || defined(CONFIG_DVB_SP8870_MODULE)
1739         struct av7110* av7110 = fe->dvb->priv;
1740
1741         return request_firmware(fw, name, &av7110->dev->pci->dev);
1742 #else
1743         return -EINVAL;
1744 #endif
1745 }
1746
1747 static struct sp8870_config alps_tdlb7_config = {
1748
1749         .demod_address = 0x71,
1750         .request_firmware = alps_tdlb7_request_firmware,
1751 };
1752
1753
1754 static u8 nexusca_stv0297_inittab[] = {
1755         0x80, 0x01,
1756         0x80, 0x00,
1757         0x81, 0x01,
1758         0x81, 0x00,
1759         0x00, 0x09,
1760         0x01, 0x69,
1761         0x03, 0x00,
1762         0x04, 0x00,
1763         0x07, 0x00,
1764         0x08, 0x00,
1765         0x20, 0x00,
1766         0x21, 0x40,
1767         0x22, 0x00,
1768         0x23, 0x00,
1769         0x24, 0x40,
1770         0x25, 0x88,
1771         0x30, 0xff,
1772         0x31, 0x00,
1773         0x32, 0xff,
1774         0x33, 0x00,
1775         0x34, 0x50,
1776         0x35, 0x7f,
1777         0x36, 0x00,
1778         0x37, 0x20,
1779         0x38, 0x00,
1780         0x40, 0x1c,
1781         0x41, 0xff,
1782         0x42, 0x29,
1783         0x43, 0x00,
1784         0x44, 0xff,
1785         0x45, 0x00,
1786         0x46, 0x00,
1787         0x49, 0x04,
1788         0x4a, 0x00,
1789         0x4b, 0x7b,
1790         0x52, 0x30,
1791         0x55, 0xae,
1792         0x56, 0x47,
1793         0x57, 0xe1,
1794         0x58, 0x3a,
1795         0x5a, 0x1e,
1796         0x5b, 0x34,
1797         0x60, 0x00,
1798         0x63, 0x00,
1799         0x64, 0x00,
1800         0x65, 0x00,
1801         0x66, 0x00,
1802         0x67, 0x00,
1803         0x68, 0x00,
1804         0x69, 0x00,
1805         0x6a, 0x02,
1806         0x6b, 0x00,
1807         0x70, 0xff,
1808         0x71, 0x00,
1809         0x72, 0x00,
1810         0x73, 0x00,
1811         0x74, 0x0c,
1812         0x80, 0x00,
1813         0x81, 0x00,
1814         0x82, 0x00,
1815         0x83, 0x00,
1816         0x84, 0x04,
1817         0x85, 0x80,
1818         0x86, 0x24,
1819         0x87, 0x78,
1820         0x88, 0x10,
1821         0x89, 0x00,
1822         0x90, 0x01,
1823         0x91, 0x01,
1824         0xa0, 0x04,
1825         0xa1, 0x00,
1826         0xa2, 0x00,
1827         0xb0, 0x91,
1828         0xb1, 0x0b,
1829         0xc0, 0x53,
1830         0xc1, 0x70,
1831         0xc2, 0x12,
1832         0xd0, 0x00,
1833         0xd1, 0x00,
1834         0xd2, 0x00,
1835         0xd3, 0x00,
1836         0xd4, 0x00,
1837         0xd5, 0x00,
1838         0xde, 0x00,
1839         0xdf, 0x00,
1840         0x61, 0x49,
1841         0x62, 0x0b,
1842         0x53, 0x08,
1843         0x59, 0x08,
1844         0xff, 0xff,
1845 };
1846
1847 static int nexusca_stv0297_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params)
1848 {
1849         struct av7110* av7110 = fe->dvb->priv;
1850         u32 div;
1851         u8 data[4];
1852         struct i2c_msg msg = { .addr = 0x63, .flags = 0, .buf = data, .len = sizeof(data) };
1853         struct i2c_msg readmsg = { .addr = 0x63, .flags = I2C_M_RD, .buf = data, .len = 1 };
1854         int i;
1855
1856         div = (params->frequency + 36150000 + 31250) / 62500;
1857
1858         data[0] = (div >> 8) & 0x7f;
1859         data[1] = div & 0xff;
1860         data[2] = 0xce;
1861
1862         if (params->frequency < 45000000)
1863                 return -EINVAL;
1864         else if (params->frequency < 137000000)
1865                 data[3] = 0x01;
1866         else if (params->frequency < 403000000)
1867                 data[3] = 0x02;
1868         else if (params->frequency < 860000000)
1869                 data[3] = 0x04;
1870         else
1871                 return -EINVAL;
1872
1873         if (fe->ops.i2c_gate_ctrl)
1874                 fe->ops.i2c_gate_ctrl(fe, 1);
1875         if (i2c_transfer(&av7110->i2c_adap, &msg, 1) != 1) {
1876                 printk("nexusca: pll transfer failed!\n");
1877                 return -EIO;
1878         }
1879
1880         // wait for PLL lock
1881         for(i = 0; i < 20; i++) {
1882                 if (fe->ops.i2c_gate_ctrl)
1883                         fe->ops.i2c_gate_ctrl(fe, 1);
1884                 if (i2c_transfer(&av7110->i2c_adap, &readmsg, 1) == 1)
1885                         if (data[0] & 0x40) break;
1886                 msleep(10);
1887         }
1888
1889         return 0;
1890 }
1891
1892 static struct stv0297_config nexusca_stv0297_config = {
1893
1894         .demod_address = 0x1C,
1895         .inittab = nexusca_stv0297_inittab,
1896         .invert = 1,
1897         .stop_during_read = 1,
1898 };
1899
1900
1901
1902 static int grundig_29504_401_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params)
1903 {
1904         struct av7110* av7110 = fe->dvb->priv;
1905         u32 div;
1906         u8 cfg, cpump, band_select;
1907         u8 data[4];
1908         struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) };
1909
1910         div = (36125000 + params->frequency) / 166666;
1911
1912         cfg = 0x88;
1913
1914         if (params->frequency < 175000000) cpump = 2;
1915         else if (params->frequency < 390000000) cpump = 1;
1916         else if (params->frequency < 470000000) cpump = 2;
1917         else if (params->frequency < 750000000) cpump = 1;
1918         else cpump = 3;
1919
1920         if (params->frequency < 175000000) band_select = 0x0e;
1921         else if (params->frequency < 470000000) band_select = 0x05;
1922         else band_select = 0x03;
1923
1924         data[0] = (div >> 8) & 0x7f;
1925         data[1] = div & 0xff;
1926         data[2] = ((div >> 10) & 0x60) | cfg;
1927         data[3] = (cpump << 6) | band_select;
1928
1929         if (fe->ops.i2c_gate_ctrl)
1930                 fe->ops.i2c_gate_ctrl(fe, 1);
1931         if (i2c_transfer (&av7110->i2c_adap, &msg, 1) != 1) return -EIO;
1932         return 0;
1933 }
1934
1935 static struct l64781_config grundig_29504_401_config = {
1936         .demod_address = 0x55,
1937 };
1938
1939
1940
1941 static int av7110_fe_lock_fix(struct av7110* av7110, fe_status_t status)
1942 {
1943         int ret = 0;
1944         int synced = (status & FE_HAS_LOCK) ? 1 : 0;
1945
1946         av7110->fe_status = status;
1947
1948         if (av7110->fe_synced == synced)
1949                 return 0;
1950
1951         if (av7110->playing) {
1952                 av7110->fe_synced = synced;
1953                 return 0;
1954         }
1955
1956         if (mutex_lock_interruptible(&av7110->pid_mutex))
1957                 return -ERESTARTSYS;
1958
1959         if (synced) {
1960                 ret = SetPIDs(av7110, av7110->pids[DMX_PES_VIDEO],
1961                         av7110->pids[DMX_PES_AUDIO],
1962                         av7110->pids[DMX_PES_TELETEXT], 0,
1963                         av7110->pids[DMX_PES_PCR]);
1964                 if (!ret)
1965                         ret = av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, Scan, 0);
1966         } else {
1967                 ret = SetPIDs(av7110, 0, 0, 0, 0, 0);
1968                 if (!ret) {
1969                         ret = av7110_fw_cmd(av7110, COMTYPE_PID_FILTER, FlushTSQueue, 0);
1970                         if (!ret)
1971                                 ret = av7110_wait_msgstate(av7110, GPMQBusy);
1972                 }
1973         }
1974
1975         if (!ret)
1976                 av7110->fe_synced = synced;
1977
1978         mutex_unlock(&av7110->pid_mutex);
1979         return ret;
1980 }
1981
1982 static int av7110_fe_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
1983 {
1984         struct av7110* av7110 = fe->dvb->priv;
1985
1986         int ret = av7110_fe_lock_fix(av7110, 0);
1987         if (!ret) {
1988                 av7110->saved_fe_params = *params;
1989                 ret = av7110->fe_set_frontend(fe, params);
1990         }
1991         return ret;
1992 }
1993
1994 static int av7110_fe_init(struct dvb_frontend* fe)
1995 {
1996         struct av7110* av7110 = fe->dvb->priv;
1997
1998         int ret = av7110_fe_lock_fix(av7110, 0);
1999         if (!ret)
2000                 ret = av7110->fe_init(fe);
2001         return ret;
2002 }
2003
2004 static int av7110_fe_read_status(struct dvb_frontend* fe, fe_status_t* status)
2005 {
2006         struct av7110* av7110 = fe->dvb->priv;
2007
2008         /* call the real implementation */
2009         int ret = av7110->fe_read_status(fe, status);
2010         if (!ret)
2011                 if (((*status ^ av7110->fe_status) & FE_HAS_LOCK) && (*status & FE_HAS_LOCK))
2012                         ret = av7110_fe_lock_fix(av7110, *status);
2013         return ret;
2014 }
2015
2016 static int av7110_fe_diseqc_reset_overload(struct dvb_frontend* fe)
2017 {
2018         struct av7110* av7110 = fe->dvb->priv;
2019
2020         int ret = av7110_fe_lock_fix(av7110, 0);
2021         if (!ret)
2022                 ret = av7110->fe_diseqc_reset_overload(fe);
2023         return ret;
2024 }
2025
2026 static int av7110_fe_diseqc_send_master_cmd(struct dvb_frontend* fe,
2027                                             struct dvb_diseqc_master_cmd* cmd)
2028 {
2029         struct av7110* av7110 = fe->dvb->priv;
2030
2031         int ret = av7110_fe_lock_fix(av7110, 0);
2032         if (!ret) {
2033                 av7110->saved_master_cmd = *cmd;
2034                 ret = av7110->fe_diseqc_send_master_cmd(fe, cmd);
2035         }
2036         return ret;
2037 }
2038
2039 static int av7110_fe_diseqc_send_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t minicmd)
2040 {
2041         struct av7110* av7110 = fe->dvb->priv;
2042
2043         int ret = av7110_fe_lock_fix(av7110, 0);
2044         if (!ret) {
2045                 av7110->saved_minicmd = minicmd;
2046                 ret = av7110->fe_diseqc_send_burst(fe, minicmd);
2047         }
2048         return ret;
2049 }
2050
2051 static int av7110_fe_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
2052 {
2053         struct av7110* av7110 = fe->dvb->priv;
2054
2055         int ret = av7110_fe_lock_fix(av7110, 0);
2056         if (!ret) {
2057                 av7110->saved_tone = tone;
2058                 ret = av7110->fe_set_tone(fe, tone);
2059         }
2060         return ret;
2061 }
2062
2063 static int av7110_fe_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage)
2064 {
2065         struct av7110* av7110 = fe->dvb->priv;
2066
2067         int ret = av7110_fe_lock_fix(av7110, 0);
2068         if (!ret) {
2069                 av7110->saved_voltage = voltage;
2070                 ret = av7110->fe_set_voltage(fe, voltage);
2071         }
2072         return ret;
2073 }
2074
2075 static int av7110_fe_dishnetwork_send_legacy_command(struct dvb_frontend* fe, unsigned long cmd)
2076 {
2077         struct av7110* av7110 = fe->dvb->priv;
2078
2079         int ret = av7110_fe_lock_fix(av7110, 0);
2080         if (!ret)
2081                 ret = av7110->fe_dishnetwork_send_legacy_command(fe, cmd);
2082         return ret;
2083 }
2084
2085 static void dvb_s_recover(struct av7110* av7110)
2086 {
2087         av7110_fe_init(av7110->fe);
2088
2089         av7110_fe_set_voltage(av7110->fe, av7110->saved_voltage);
2090         if (av7110->saved_master_cmd.msg_len) {
2091                 msleep(20);
2092                 av7110_fe_diseqc_send_master_cmd(av7110->fe, &av7110->saved_master_cmd);
2093         }
2094         msleep(20);
2095         av7110_fe_diseqc_send_burst(av7110->fe, av7110->saved_minicmd);
2096         msleep(20);
2097         av7110_fe_set_tone(av7110->fe, av7110->saved_tone);
2098
2099         av7110_fe_set_frontend(av7110->fe, &av7110->saved_fe_params);
2100 }
2101
2102 static u8 read_pwm(struct av7110* av7110)
2103 {
2104         u8 b = 0xff;
2105         u8 pwm;
2106         struct i2c_msg msg[] = { { .addr = 0x50,.flags = 0,.buf = &b,.len = 1 },
2107                                  { .addr = 0x50,.flags = I2C_M_RD,.buf = &pwm,.len = 1} };
2108
2109         if ((i2c_transfer(&av7110->i2c_adap, msg, 2) != 2) || (pwm == 0xff))
2110                 pwm = 0x48;
2111
2112         return pwm;
2113 }
2114
2115 static int frontend_init(struct av7110 *av7110)
2116 {
2117         int ret;
2118
2119         if (av7110->dev->pci->subsystem_vendor == 0x110a) {
2120                 switch(av7110->dev->pci->subsystem_device) {
2121                 case 0x0000: // Fujitsu/Siemens DVB-Cable (ves1820/Philips CD1516(??))
2122                         av7110->fe = dvb_attach(ves1820_attach, &philips_cd1516_config,
2123                                                     &av7110->i2c_adap, read_pwm(av7110));
2124                         if (av7110->fe) {
2125                                 av7110->fe->ops.tuner_ops.set_params = philips_cd1516_tuner_set_params;
2126                         }
2127                         break;
2128                 }
2129
2130         } else if (av7110->dev->pci->subsystem_vendor == 0x13c2) {
2131                 switch(av7110->dev->pci->subsystem_device) {
2132                 case 0x0000: // Hauppauge/TT WinTV DVB-S rev1.X
2133                 case 0x0003: // Hauppauge/TT WinTV Nexus-S Rev 2.X
2134                 case 0x1002: // Hauppauge/TT WinTV DVB-S rev1.3SE
2135
2136                         // try the ALPS BSRV2 first of all
2137                         av7110->fe = dvb_attach(ves1x93_attach, &alps_bsrv2_config, &av7110->i2c_adap);
2138                         if (av7110->fe) {
2139                                 av7110->fe->ops.tuner_ops.set_params = alps_bsrv2_tuner_set_params;
2140                                 av7110->fe->ops.diseqc_send_master_cmd = av7110_diseqc_send_master_cmd;
2141                                 av7110->fe->ops.diseqc_send_burst = av7110_diseqc_send_burst;
2142                                 av7110->fe->ops.set_tone = av7110_set_tone;
2143                                 av7110->recover = dvb_s_recover;
2144                                 break;
2145                         }
2146
2147                         // try the ALPS BSRU6 now
2148                         av7110->fe = dvb_attach(stv0299_attach, &alps_bsru6_config, &av7110->i2c_adap);
2149                         if (av7110->fe) {
2150                                 av7110->fe->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params;
2151                                 av7110->fe->tuner_priv = &av7110->i2c_adap;
2152
2153                                 av7110->fe->ops.diseqc_send_master_cmd = av7110_diseqc_send_master_cmd;
2154                                 av7110->fe->ops.diseqc_send_burst = av7110_diseqc_send_burst;
2155                                 av7110->fe->ops.set_tone = av7110_set_tone;
2156                                 av7110->recover = dvb_s_recover;
2157                                 break;
2158                         }
2159
2160                         // Try the grundig 29504-451
2161                         av7110->fe = dvb_attach(tda8083_attach, &grundig_29504_451_config, &av7110->i2c_adap);
2162                         if (av7110->fe) {
2163                                 av7110->fe->ops.tuner_ops.set_params = grundig_29504_451_tuner_set_params;
2164                                 av7110->fe->ops.diseqc_send_master_cmd = av7110_diseqc_send_master_cmd;
2165                                 av7110->fe->ops.diseqc_send_burst = av7110_diseqc_send_burst;
2166                                 av7110->fe->ops.set_tone = av7110_set_tone;
2167                                 av7110->recover = dvb_s_recover;
2168                                 break;
2169                         }
2170
2171                         /* Try DVB-C cards */
2172                         switch(av7110->dev->pci->subsystem_device) {
2173                         case 0x0000:
2174                                 /* Siemens DVB-C (full-length card) VES1820/Philips CD1516 */
2175                                 av7110->fe = dvb_attach(ves1820_attach, &philips_cd1516_config, &av7110->i2c_adap,
2176                                                         read_pwm(av7110));
2177                                 if (av7110->fe) {
2178                                         av7110->fe->ops.tuner_ops.set_params = philips_cd1516_tuner_set_params;
2179                                 }
2180                                 break;
2181                         case 0x0003:
2182                                 /* Hauppauge DVB-C 2.1 VES1820/ALPS TDBE2 */
2183                                 av7110->fe = dvb_attach(ves1820_attach, &alps_tdbe2_config, &av7110->i2c_adap,
2184                                                         read_pwm(av7110));
2185                                 if (av7110->fe) {
2186                                         av7110->fe->ops.tuner_ops.set_params = alps_tdbe2_tuner_set_params;
2187                                 }
2188                                 break;
2189                         }
2190                         break;
2191
2192                 case 0x0001: // Hauppauge/TT Nexus-T premium rev1.X
2193                         // try ALPS TDLB7 first, then Grundig 29504-401
2194                         av7110->fe = dvb_attach(sp8870_attach, &alps_tdlb7_config, &av7110->i2c_adap);
2195                         if (av7110->fe) {
2196                                 av7110->fe->ops.tuner_ops.set_params = alps_tdlb7_tuner_set_params;
2197                                 break;
2198                         }
2199                         /* fall-thru */
2200
2201                 case 0x0008: // Hauppauge/TT DVB-T
2202                         // Grundig 29504-401
2203                         av7110->fe = dvb_attach(l64781_attach, &grundig_29504_401_config, &av7110->i2c_adap);
2204                         if (av7110->fe)
2205                                 av7110->fe->ops.tuner_ops.set_params = grundig_29504_401_tuner_set_params;
2206                         break;
2207
2208                 case 0x0002: // Hauppauge/TT DVB-C premium rev2.X
2209
2210                         av7110->fe = dvb_attach(ves1820_attach, &alps_tdbe2_config, &av7110->i2c_adap, read_pwm(av7110));
2211                         if (av7110->fe) {
2212                                 av7110->fe->ops.tuner_ops.set_params = alps_tdbe2_tuner_set_params;
2213                         }
2214                         break;
2215
2216                 case 0x0004: // Galaxis DVB-S rev1.3
2217                         /* ALPS BSRV2 */
2218                         av7110->fe = dvb_attach(ves1x93_attach, &alps_bsrv2_config, &av7110->i2c_adap);
2219                         if (av7110->fe) {
2220                                 av7110->fe->ops.tuner_ops.set_params = alps_bsrv2_tuner_set_params;
2221                                 av7110->fe->ops.diseqc_send_master_cmd = av7110_diseqc_send_master_cmd;
2222                                 av7110->fe->ops.diseqc_send_burst = av7110_diseqc_send_burst;
2223                                 av7110->fe->ops.set_tone = av7110_set_tone;
2224                                 av7110->recover = dvb_s_recover;
2225                         }
2226                         break;
2227
2228                 case 0x0006: /* Fujitsu-Siemens DVB-S rev 1.6 */
2229                         /* Grundig 29504-451 */
2230                         av7110->fe = dvb_attach(tda8083_attach, &grundig_29504_451_config, &av7110->i2c_adap);
2231                         if (av7110->fe) {
2232                                 av7110->fe->ops.tuner_ops.set_params = grundig_29504_451_tuner_set_params;
2233                                 av7110->fe->ops.diseqc_send_master_cmd = av7110_diseqc_send_master_cmd;
2234                                 av7110->fe->ops.diseqc_send_burst = av7110_diseqc_send_burst;
2235                                 av7110->fe->ops.set_tone = av7110_set_tone;
2236                                 av7110->recover = dvb_s_recover;
2237                         }
2238                         break;
2239
2240                 case 0x000A: // Hauppauge/TT Nexus-CA rev1.X
2241
2242                         av7110->fe = dvb_attach(stv0297_attach, &nexusca_stv0297_config, &av7110->i2c_adap);
2243                         if (av7110->fe) {
2244                                 av7110->fe->ops.tuner_ops.set_params = nexusca_stv0297_tuner_set_params;
2245
2246                                 /* set TDA9819 into DVB mode */
2247                                 saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD)
2248                                 saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF)
2249
2250                                 /* tuner on this needs a slower i2c bus speed */
2251                                 av7110->dev->i2c_bitrate = SAA7146_I2C_BUS_BIT_RATE_240;
2252                                 break;
2253                         }
2254                         break;
2255
2256                 case 0x000E: /* Hauppauge/TT Nexus-S rev 2.3 */
2257                         /* ALPS BSBE1 */
2258                         av7110->fe = dvb_attach(stv0299_attach, &alps_bsbe1_config, &av7110->i2c_adap);
2259                         if (av7110->fe) {
2260                                 av7110->fe->ops.tuner_ops.set_params = alps_bsbe1_tuner_set_params;
2261                                 av7110->fe->tuner_priv = &av7110->i2c_adap;
2262
2263                                 if (dvb_attach(lnbp21_attach, av7110->fe, &av7110->i2c_adap, 0, 0) == NULL) {
2264                                         printk("dvb-ttpci: LNBP21 not found!\n");
2265                                         if (av7110->fe->ops.release)
2266                                                 av7110->fe->ops.release(av7110->fe);
2267                                         av7110->fe = NULL;
2268                                 } else {
2269                                         av7110->fe->ops.dishnetwork_send_legacy_command = NULL;
2270                                         av7110->recover = dvb_s_recover;
2271                                 }
2272                         }
2273                         break;
2274                 }
2275         }
2276
2277         if (!av7110->fe) {
2278                 /* FIXME: propagate the failure code from the lower layers */
2279                 ret = -ENOMEM;
2280                 printk("dvb-ttpci: A frontend driver was not found for device [%04x:%04x] subsystem [%04x:%04x]\n",
2281                        av7110->dev->pci->vendor,
2282                        av7110->dev->pci->device,
2283                        av7110->dev->pci->subsystem_vendor,
2284                        av7110->dev->pci->subsystem_device);
2285         } else {
2286                 FE_FUNC_OVERRIDE(av7110->fe->ops.init, av7110->fe_init, av7110_fe_init);
2287                 FE_FUNC_OVERRIDE(av7110->fe->ops.read_status, av7110->fe_read_status, av7110_fe_read_status);
2288                 FE_FUNC_OVERRIDE(av7110->fe->ops.diseqc_reset_overload, av7110->fe_diseqc_reset_overload, av7110_fe_diseqc_reset_overload);
2289                 FE_FUNC_OVERRIDE(av7110->fe->ops.diseqc_send_master_cmd, av7110->fe_diseqc_send_master_cmd, av7110_fe_diseqc_send_master_cmd);
2290                 FE_FUNC_OVERRIDE(av7110->fe->ops.diseqc_send_burst, av7110->fe_diseqc_send_burst, av7110_fe_diseqc_send_burst);
2291                 FE_FUNC_OVERRIDE(av7110->fe->ops.set_tone, av7110->fe_set_tone, av7110_fe_set_tone);
2292                 FE_FUNC_OVERRIDE(av7110->fe->ops.set_voltage, av7110->fe_set_voltage, av7110_fe_set_voltage);
2293                 FE_FUNC_OVERRIDE(av7110->fe->ops.dishnetwork_send_legacy_command, av7110->fe_dishnetwork_send_legacy_command, av7110_fe_dishnetwork_send_legacy_command);
2294                 FE_FUNC_OVERRIDE(av7110->fe->ops.set_frontend, av7110->fe_set_frontend, av7110_fe_set_frontend);
2295
2296                 ret = dvb_register_frontend(&av7110->dvb_adapter, av7110->fe);
2297                 if (ret < 0) {
2298                         printk("av7110: Frontend registration failed!\n");
2299                         dvb_frontend_detach(av7110->fe);
2300                         av7110->fe = NULL;
2301                 }
2302         }
2303         return ret;
2304 }
2305
2306 /* Budgetpatch note:
2307  * Original hardware design by Roberto Deza:
2308  * There is a DVB_Wiki at
2309  * http://212.227.36.83/linuxtv/wiki/index.php/Main_Page
2310  * where is described this 'DVB TT Budget Patch', on Card Modding:
2311  * http://212.227.36.83/linuxtv/wiki/index.php/DVB_TT_Budget_Patch
2312  * On the short description there is also a link to a external file,
2313  * with more details:
2314  * http://perso.wanadoo.es/jesussolano/Ttf_tsc1.zip
2315  *
2316  * New software triggering design by Emard that works on
2317  * original Roberto Deza's hardware:
2318  *
2319  * rps1 code for budgetpatch will copy internal HS event to GPIO3 pin.
2320  * GPIO3 is in budget-patch hardware connectd to port B VSYNC
2321  * HS is an internal event of 7146, accessible with RPS
2322  * and temporarily raised high every n lines
2323  * (n in defined in the RPS_THRESH1 counter threshold)
2324  * I think HS is raised high on the beginning of the n-th line
2325  * and remains high until this n-th line that triggered
2326  * it is completely received. When the receiption of n-th line
2327  * ends, HS is lowered.
2328  *
2329  * To transmit data over DMA, 7146 needs changing state at
2330  * port B VSYNC pin. Any changing of port B VSYNC will
2331  * cause some DMA data transfer, with more or less packets loss.
2332  * It depends on the phase and frequency of VSYNC and
2333  * the way of 7146 is instructed to trigger on port B (defined
2334  * in DD1_INIT register, 3rd nibble from the right valid
2335  * numbers are 0-7, see datasheet)
2336  *
2337  * The correct triggering can minimize packet loss,
2338  * dvbtraffic should give this stable bandwidths:
2339  *   22k transponder = 33814 kbit/s
2340  * 27.5k transponder = 38045 kbit/s
2341  * by experiment it is found that the best results
2342  * (stable bandwidths and almost no packet loss)
2343  * are obtained using DD1_INIT triggering number 2
2344  * (Va at rising edge of VS Fa = HS x VS-failing forced toggle)
2345  * and a VSYNC phase that occurs in the middle of DMA transfer
2346  * (about byte 188*512=96256 in the DMA window).
2347  *
2348  * Phase of HS is still not clear to me how to control,
2349  * It just happens to be so. It can be seen if one enables
2350  * RPS_IRQ and print Event Counter 1 in vpeirq(). Every
2351  * time RPS_INTERRUPT is called, the Event Counter 1 will
2352  * increment. That's how the 7146 is programmed to do event
2353  * counting in this budget-patch.c
2354  * I *think* HPS setting has something to do with the phase
2355  * of HS but I cant be 100% sure in that.
2356  *
2357  * hardware debug note: a working budget card (including budget patch)
2358  * with vpeirq() interrupt setup in mode "0x90" (every 64K) will
2359  * generate 3 interrupts per 25-Hz DMA frame of 2*188*512 bytes
2360  * and that means 3*25=75 Hz of interrupt freqency, as seen by
2361  * watch cat /proc/interrupts
2362  *
2363  * If this frequency is 3x lower (and data received in the DMA
2364  * buffer don't start with 0x47, but in the middle of packets,
2365  * whose lengths appear to be like 188 292 188 104 etc.
2366  * this means VSYNC line is not connected in the hardware.
2367  * (check soldering pcb and pins)
2368  * The same behaviour of missing VSYNC can be duplicated on budget
2369  * cards, by seting DD1_INIT trigger mode 7 in 3rd nibble.
2370  */
2371 static int __devinit av7110_attach(struct saa7146_dev* dev,
2372                                    struct saa7146_pci_extension_data *pci_ext)
2373 {
2374         const int length = TS_WIDTH * TS_HEIGHT;
2375         struct pci_dev *pdev = dev->pci;
2376         struct av7110 *av7110;
2377         struct task_struct *thread;
2378         int ret, count = 0;
2379
2380         dprintk(4, "dev: %p\n", dev);
2381
2382         /* Set RPS_IRQ to 1 to track rps1 activity.
2383          * Enabling this won't send any interrupt to PC CPU.
2384          */
2385 #define RPS_IRQ 0
2386
2387         if (budgetpatch == 1) {
2388                 budgetpatch = 0;
2389                 /* autodetect the presence of budget patch
2390                  * this only works if saa7146 has been recently
2391                  * reset with with MASK_31 to MC1
2392                  *
2393                  * will wait for VBI_B event (vertical blank at port B)
2394                  * and will reset GPIO3 after VBI_B is detected.
2395                  * (GPIO3 should be raised high by CPU to
2396                  * test if GPIO3 will generate vertical blank signal
2397                  * in budget patch GPIO3 is connected to VSYNC_B
2398                  */
2399
2400                 /* RESET SAA7146 */
2401                 saa7146_write(dev, MC1, MASK_31);
2402                 /* autodetection success seems to be time-dependend after reset */
2403
2404                 /* Fix VSYNC level */
2405                 saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
2406                 /* set vsync_b triggering */
2407                 saa7146_write(dev, DD1_STREAM_B, 0);
2408                 /* port B VSYNC at rising edge */
2409                 saa7146_write(dev, DD1_INIT, 0x00000200);
2410                 saa7146_write(dev, BRS_CTRL, 0x00000000);  // VBI
2411                 saa7146_write(dev, MC2,
2412                               1 * (MASK_08 | MASK_24)  |   // BRS control
2413                               0 * (MASK_09 | MASK_25)  |   // a
2414                               1 * (MASK_10 | MASK_26)  |   // b
2415                               0 * (MASK_06 | MASK_22)  |   // HPS_CTRL1
2416                               0 * (MASK_05 | MASK_21)  |   // HPS_CTRL2
2417                               0 * (MASK_01 | MASK_15)      // DEBI
2418                 );
2419
2420                 /* start writing RPS1 code from beginning */
2421                 count = 0;
2422                 /* Disable RPS1 */
2423                 saa7146_write(dev, MC1, MASK_29);
2424                 /* RPS1 timeout disable */
2425                 saa7146_write(dev, RPS_TOV1, 0);
2426                 WRITE_RPS1(CMD_PAUSE | EVT_VBI_B);
2427                 WRITE_RPS1(CMD_WR_REG_MASK | (GPIO_CTRL>>2));
2428                 WRITE_RPS1(GPIO3_MSK);
2429                 WRITE_RPS1(SAA7146_GPIO_OUTLO<<24);
2430 #if RPS_IRQ
2431                 /* issue RPS1 interrupt to increment counter */
2432                 WRITE_RPS1(CMD_INTERRUPT);
2433 #endif
2434                 WRITE_RPS1(CMD_STOP);
2435                 /* Jump to begin of RPS program as safety measure               (p37) */
2436                 WRITE_RPS1(CMD_JUMP);
2437                 WRITE_RPS1(dev->d_rps1.dma_handle);
2438
2439 #if RPS_IRQ
2440                 /* set event counter 1 source as RPS1 interrupt (0x03)          (rE4 p53)
2441                  * use 0x03 to track RPS1 interrupts - increase by 1 every gpio3 is toggled
2442                  * use 0x15 to track VPE  interrupts - increase by 1 every vpeirq() is called
2443                  */
2444                 saa7146_write(dev, EC1SSR, (0x03<<2) | 3 );
2445                 /* set event counter 1 treshold to maximum allowed value        (rEC p55) */
2446                 saa7146_write(dev, ECT1R,  0x3fff );
2447 #endif
2448                 /* Set RPS1 Address register to point to RPS code               (r108 p42) */
2449                 saa7146_write(dev, RPS_ADDR1, dev->d_rps1.dma_handle);
2450                 /* Enable RPS1,                                                 (rFC p33) */
2451                 saa7146_write(dev, MC1, (MASK_13 | MASK_29 ));
2452
2453                 mdelay(10);
2454                 /* now send VSYNC_B to rps1 by rising GPIO3 */
2455                 saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI);
2456                 mdelay(10);
2457                 /* if rps1 responded by lowering the GPIO3,
2458                  * then we have budgetpatch hardware
2459                  */
2460                 if ((saa7146_read(dev, GPIO_CTRL) & 0x10000000) == 0) {
2461                         budgetpatch = 1;
2462                         printk("dvb-ttpci: BUDGET-PATCH DETECTED.\n");
2463                 }
2464                 /* Disable RPS1 */
2465                 saa7146_write(dev, MC1, ( MASK_29 ));
2466 #if RPS_IRQ
2467                 printk("dvb-ttpci: Event Counter 1 0x%04x\n", saa7146_read(dev, EC1R) & 0x3fff );
2468 #endif
2469         }
2470
2471         /* prepare the av7110 device struct */
2472         av7110 = kzalloc(sizeof(struct av7110), GFP_KERNEL);
2473         if (!av7110) {
2474                 dprintk(1, "out of memory\n");
2475                 return -ENOMEM;
2476         }
2477
2478         av7110->card_name = (char*) pci_ext->ext_priv;
2479         av7110->dev = dev;
2480         dev->ext_priv = av7110;
2481
2482         ret = get_firmware(av7110);
2483         if (ret < 0)
2484                 goto err_kfree_0;
2485
2486         ret = dvb_register_adapter(&av7110->dvb_adapter, av7110->card_name,
2487                                    THIS_MODULE, &dev->pci->dev, adapter_nr);
2488         if (ret < 0)
2489                 goto err_put_firmware_1;
2490
2491         /* the Siemens DVB needs this if you want to have the i2c chips
2492            get recognized before the main driver is fully loaded */
2493         saa7146_write(dev, GPIO_CTRL, 0x500000);
2494
2495         av7110->i2c_adap.class = I2C_CLASS_TV_DIGITAL;
2496         strlcpy(av7110->i2c_adap.name, pci_ext->ext_priv, sizeof(av7110->i2c_adap.name));
2497
2498         saa7146_i2c_adapter_prepare(dev, &av7110->i2c_adap, SAA7146_I2C_BUS_BIT_RATE_120); /* 275 kHz */
2499
2500         ret = i2c_add_adapter(&av7110->i2c_adap);
2501         if (ret < 0)
2502                 goto err_dvb_unregister_adapter_2;
2503
2504         ttpci_eeprom_parse_mac(&av7110->i2c_adap,
2505                                av7110->dvb_adapter.proposed_mac);
2506         ret = -ENOMEM;
2507
2508         /* full-ts mod? */
2509         if (full_ts)
2510                 av7110->full_ts = true;
2511
2512         /* check for full-ts flag in eeprom */
2513         if (i2c_readreg(av7110, 0xaa, 0) == 0x4f && i2c_readreg(av7110, 0xaa, 1) == 0x45) {
2514                 u8 flags = i2c_readreg(av7110, 0xaa, 2);
2515                 if (flags != 0xff && (flags & 0x01))
2516                         av7110->full_ts = true;
2517         }
2518
2519         if (av7110->full_ts) {
2520                 printk(KERN_INFO "dvb-ttpci: full-ts mode enabled for saa7146 port B\n");
2521                 spin_lock_init(&av7110->feedlock1);
2522                 av7110->grabbing = saa7146_vmalloc_build_pgtable(pdev, length,
2523                                                                  &av7110->pt);
2524                 if (!av7110->grabbing)
2525                         goto err_i2c_del_3;
2526
2527                 saa7146_write(dev, DD1_STREAM_B, 0x00000000);
2528                 saa7146_write(dev, MC2, (MASK_10 | MASK_26));
2529
2530                 saa7146_write(dev, DD1_INIT, 0x00000600);
2531                 saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
2532
2533                 saa7146_write(dev, BRS_CTRL, 0x60000000);
2534                 saa7146_write(dev, MC2, MASK_08 | MASK_24);
2535
2536                 /* dma3 */
2537                 saa7146_write(dev, PCI_BT_V1, 0x001c0000 | (saa7146_read(dev, PCI_BT_V1) & ~0x001f0000));
2538                 saa7146_write(dev, BASE_ODD3, 0);
2539                 saa7146_write(dev, BASE_EVEN3, 0);
2540                 saa7146_write(dev, PROT_ADDR3, TS_WIDTH * TS_HEIGHT);
2541                 saa7146_write(dev, PITCH3, TS_WIDTH);
2542                 saa7146_write(dev, BASE_PAGE3, av7110->pt.dma | ME1 | 0x90);
2543                 saa7146_write(dev, NUM_LINE_BYTE3, (TS_HEIGHT << 16) | TS_WIDTH);
2544                 saa7146_write(dev, MC2, MASK_04 | MASK_20);
2545
2546                 tasklet_init(&av7110->vpe_tasklet, vpeirq, (unsigned long) av7110);
2547
2548         } else if (budgetpatch) {
2549                 spin_lock_init(&av7110->feedlock1);
2550                 av7110->grabbing = saa7146_vmalloc_build_pgtable(pdev, length,
2551                                                                  &av7110->pt);
2552                 if (!av7110->grabbing)
2553                         goto err_i2c_del_3;
2554
2555                 saa7146_write(dev, PCI_BT_V1, 0x1c1f101f);
2556                 saa7146_write(dev, BCS_CTRL, 0x80400040);
2557                 /* set dd1 stream a & b */
2558                 saa7146_write(dev, DD1_STREAM_B, 0x00000000);
2559                 saa7146_write(dev, DD1_INIT, 0x03000200);
2560                 saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
2561                 saa7146_write(dev, BRS_CTRL, 0x60000000);
2562                 saa7146_write(dev, BASE_ODD3, 0);
2563                 saa7146_write(dev, BASE_EVEN3, 0);
2564                 saa7146_write(dev, PROT_ADDR3, TS_WIDTH * TS_HEIGHT);
2565                 saa7146_write(dev, BASE_PAGE3, av7110->pt.dma | ME1 | 0x90);
2566
2567                 saa7146_write(dev, PITCH3, TS_WIDTH);
2568                 saa7146_write(dev, NUM_LINE_BYTE3, (TS_HEIGHT << 16) | TS_WIDTH);
2569
2570                 /* upload all */
2571                 saa7146_write(dev, MC2, 0x077c077c);
2572                 saa7146_write(dev, GPIO_CTRL, 0x000000);
2573 #if RPS_IRQ
2574                 /* set event counter 1 source as RPS1 interrupt (0x03)          (rE4 p53)
2575                  * use 0x03 to track RPS1 interrupts - increase by 1 every gpio3 is toggled
2576                  * use 0x15 to track VPE  interrupts - increase by 1 every vpeirq() is called
2577                  */
2578                 saa7146_write(dev, EC1SSR, (0x03<<2) | 3 );
2579                 /* set event counter 1 treshold to maximum allowed value        (rEC p55) */
2580                 saa7146_write(dev, ECT1R,  0x3fff );
2581 #endif
2582                 /* Setup BUDGETPATCH MAIN RPS1 "program" (p35) */
2583                 count = 0;
2584
2585                 /* Wait Source Line Counter Threshold                           (p36) */
2586                 WRITE_RPS1(CMD_PAUSE | EVT_HS);
2587                 /* Set GPIO3=1                                                  (p42) */
2588                 WRITE_RPS1(CMD_WR_REG_MASK | (GPIO_CTRL>>2));
2589                 WRITE_RPS1(GPIO3_MSK);
2590                 WRITE_RPS1(SAA7146_GPIO_OUTHI<<24);
2591 #if RPS_IRQ
2592                 /* issue RPS1 interrupt */
2593                 WRITE_RPS1(CMD_INTERRUPT);
2594 #endif
2595                 /* Wait reset Source Line Counter Threshold                     (p36) */
2596                 WRITE_RPS1(CMD_PAUSE | RPS_INV | EVT_HS);
2597                 /* Set GPIO3=0                                                  (p42) */
2598                 WRITE_RPS1(CMD_WR_REG_MASK | (GPIO_CTRL>>2));
2599                 WRITE_RPS1(GPIO3_MSK);
2600                 WRITE_RPS1(SAA7146_GPIO_OUTLO<<24);
2601 #if RPS_IRQ
2602                 /* issue RPS1 interrupt */
2603                 WRITE_RPS1(CMD_INTERRUPT);
2604 #endif
2605                 /* Jump to begin of RPS program                                 (p37) */
2606                 WRITE_RPS1(CMD_JUMP);
2607                 WRITE_RPS1(dev->d_rps1.dma_handle);
2608
2609                 /* Fix VSYNC level */
2610                 saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
2611                 /* Set RPS1 Address register to point to RPS code               (r108 p42) */
2612                 saa7146_write(dev, RPS_ADDR1, dev->d_rps1.dma_handle);
2613                 /* Set Source Line Counter Threshold, using BRS                 (rCC p43)
2614                  * It generates HS event every TS_HEIGHT lines
2615                  * this is related to TS_WIDTH set in register
2616                  * NUM_LINE_BYTE3. If NUM_LINE_BYTE low 16 bits
2617                  * are set to TS_WIDTH bytes (TS_WIDTH=2*188),
2618                  * then RPS_THRESH1 should be set to trigger
2619                  * every TS_HEIGHT (512) lines.
2620                  */
2621                 saa7146_write(dev, RPS_THRESH1, (TS_HEIGHT*1) | MASK_12 );
2622
2623                 /* Enable RPS1                                                  (rFC p33) */
2624                 saa7146_write(dev, MC1, (MASK_13 | MASK_29));
2625
2626                 /* end of budgetpatch register initialization */
2627                 tasklet_init (&av7110->vpe_tasklet,  vpeirq,  (unsigned long) av7110);
2628         } else {
2629                 saa7146_write(dev, PCI_BT_V1, 0x1c00101f);
2630                 saa7146_write(dev, BCS_CTRL, 0x80400040);
2631
2632                 /* set dd1 stream a & b */
2633                 saa7146_write(dev, DD1_STREAM_B, 0x00000000);
2634                 saa7146_write(dev, DD1_INIT, 0x03000000);
2635                 saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
2636
2637                 /* upload all */
2638                 saa7146_write(dev, MC2, 0x077c077c);
2639                 saa7146_write(dev, GPIO_CTRL, 0x000000);
2640         }
2641
2642         tasklet_init (&av7110->debi_tasklet, debiirq, (unsigned long) av7110);
2643         tasklet_init (&av7110->gpio_tasklet, gpioirq, (unsigned long) av7110);
2644
2645         mutex_init(&av7110->pid_mutex);
2646
2647         /* locks for data transfers from/to AV7110 */
2648         spin_lock_init(&av7110->debilock);
2649         mutex_init(&av7110->dcomlock);
2650         av7110->debitype = -1;
2651
2652         /* default OSD window */
2653         av7110->osdwin = 1;
2654         mutex_init(&av7110->osd_mutex);
2655
2656         /* TV standard */
2657         av7110->vidmode = tv_standard == 1 ? AV7110_VIDEO_MODE_NTSC
2658                                            : AV7110_VIDEO_MODE_PAL;
2659
2660         /* ARM "watchdog" */
2661         init_waitqueue_head(&av7110->arm_wait);
2662         av7110->arm_thread = NULL;
2663
2664         /* allocate and init buffers */
2665         av7110->debi_virt = pci_alloc_consistent(pdev, 8192, &av7110->debi_bus);
2666         if (!av7110->debi_virt)
2667                 goto err_saa71466_vfree_4;
2668
2669
2670         av7110->iobuf = vmalloc(AVOUTLEN+AOUTLEN+BMPLEN+4*IPACKS);
2671         if (!av7110->iobuf)
2672                 goto err_pci_free_5;
2673
2674         ret = av7110_av_init(av7110);
2675         if (ret < 0)
2676                 goto err_iobuf_vfree_6;
2677
2678         /* init BMP buffer */
2679         av7110->bmpbuf = av7110->iobuf+AVOUTLEN+AOUTLEN;
2680         init_waitqueue_head(&av7110->bmpq);
2681
2682         ret = av7110_ca_init(av7110);
2683         if (ret < 0)
2684                 goto err_av7110_av_exit_7;
2685
2686         /* load firmware into AV7110 cards */
2687         ret = av7110_bootarm(av7110);
2688         if (ret < 0)
2689                 goto err_av7110_ca_exit_8;
2690
2691         ret = av7110_firmversion(av7110);
2692         if (ret < 0)
2693                 goto err_stop_arm_9;
2694
2695         if (FW_VERSION(av7110->arm_app)<0x2501)
2696                 printk ("dvb-ttpci: Warning, firmware version 0x%04x is too old. "
2697                         "System might be unstable!\n", FW_VERSION(av7110->arm_app));
2698
2699         thread = kthread_run(arm_thread, (void *) av7110, "arm_mon");
2700         if (IS_ERR(thread)) {
2701                 ret = PTR_ERR(thread);
2702                 goto err_stop_arm_9;
2703         }
2704         av7110->arm_thread = thread;
2705
2706         /* set initial volume in mixer struct */
2707         av7110->mixer.volume_left  = volume;
2708         av7110->mixer.volume_right = volume;
2709
2710         ret = av7110_register(av7110);
2711         if (ret < 0)
2712                 goto err_arm_thread_stop_10;
2713
2714         init_av7110_av(av7110);
2715
2716         /* special case DVB-C: these cards have an analog tuner
2717            plus need some special handling, so we have separate
2718            saa7146_ext_vv data for these... */
2719         ret = av7110_init_v4l(av7110);
2720         if (ret < 0)
2721                 goto err_av7110_unregister_11;
2722
2723         av7110->dvb_adapter.priv = av7110;
2724         ret = frontend_init(av7110);
2725         if (ret < 0)
2726                 goto err_av7110_exit_v4l_12;
2727
2728 #if defined(CONFIG_INPUT_EVDEV) || defined(CONFIG_INPUT_EVDEV_MODULE)
2729         av7110_ir_init(av7110);
2730 #endif
2731         printk(KERN_INFO "dvb-ttpci: found av7110-%d.\n", av7110_num);
2732         av7110_num++;
2733 out:
2734         return ret;
2735
2736 err_av7110_exit_v4l_12:
2737         av7110_exit_v4l(av7110);
2738 err_av7110_unregister_11:
2739         dvb_unregister(av7110);
2740 err_arm_thread_stop_10:
2741         av7110_arm_sync(av7110);
2742 err_stop_arm_9:
2743         /* Nothing to do. Rejoice. */
2744 err_av7110_ca_exit_8:
2745         av7110_ca_exit(av7110);
2746 err_av7110_av_exit_7:
2747         av7110_av_exit(av7110);
2748 err_iobuf_vfree_6:
2749         vfree(av7110->iobuf);
2750 err_pci_free_5:
2751         pci_free_consistent(pdev, 8192, av7110->debi_virt, av7110->debi_bus);
2752 err_saa71466_vfree_4:
2753         if (av7110->grabbing)
2754                 saa7146_vfree_destroy_pgtable(pdev, av7110->grabbing, &av7110->pt);
2755 err_i2c_del_3:
2756         i2c_del_adapter(&av7110->i2c_adap);
2757 err_dvb_unregister_adapter_2:
2758         dvb_unregister_adapter(&av7110->dvb_adapter);
2759 err_put_firmware_1:
2760         put_firmware(av7110);
2761 err_kfree_0:
2762         kfree(av7110);
2763         goto out;
2764 }
2765
2766 static int __devexit av7110_detach(struct saa7146_dev* saa)
2767 {
2768         struct av7110 *av7110 = saa->ext_priv;
2769         dprintk(4, "%p\n", av7110);
2770
2771 #if defined(CONFIG_INPUT_EVDEV) || defined(CONFIG_INPUT_EVDEV_MODULE)
2772         av7110_ir_exit(av7110);
2773 #endif
2774         if (budgetpatch || av7110->full_ts) {
2775                 if (budgetpatch) {
2776                         /* Disable RPS1 */
2777                         saa7146_write(saa, MC1, MASK_29);
2778                         /* VSYNC LOW (inactive) */
2779                         saa7146_setgpio(saa, 3, SAA7146_GPIO_OUTLO);
2780                 }
2781                 saa7146_write(saa, MC1, MASK_20);       /* DMA3 off */
2782                 SAA7146_IER_DISABLE(saa, MASK_10);
2783                 SAA7146_ISR_CLEAR(saa, MASK_10);
2784                 msleep(50);
2785                 tasklet_kill(&av7110->vpe_tasklet);
2786                 saa7146_vfree_destroy_pgtable(saa->pci, av7110->grabbing, &av7110->pt);
2787         }
2788         av7110_exit_v4l(av7110);
2789
2790         av7110_arm_sync(av7110);
2791
2792         tasklet_kill(&av7110->debi_tasklet);
2793         tasklet_kill(&av7110->gpio_tasklet);
2794
2795         dvb_unregister(av7110);
2796
2797         SAA7146_IER_DISABLE(saa, MASK_19 | MASK_03);
2798         SAA7146_ISR_CLEAR(saa, MASK_19 | MASK_03);
2799
2800         av7110_ca_exit(av7110);
2801         av7110_av_exit(av7110);
2802
2803         vfree(av7110->iobuf);
2804         pci_free_consistent(saa->pci, 8192, av7110->debi_virt,
2805                             av7110->debi_bus);
2806
2807         i2c_del_adapter(&av7110->i2c_adap);
2808
2809         dvb_unregister_adapter (&av7110->dvb_adapter);
2810
2811         av7110_num--;
2812
2813         put_firmware(av7110);
2814
2815         kfree(av7110);
2816
2817         saa->ext_priv = NULL;
2818
2819         return 0;
2820 }
2821
2822
2823 static void av7110_irq(struct saa7146_dev* dev, u32 *isr)
2824 {
2825         struct av7110 *av7110 = dev->ext_priv;
2826
2827         //print_time("av7110_irq");
2828
2829         /* Note: Don't try to handle the DEBI error irq (MASK_18), in
2830          * intel mode the timeout is asserted all the time...
2831          */
2832
2833         if (*isr & MASK_19) {
2834                 //printk("av7110_irq: DEBI\n");
2835                 /* Note 1: The DEBI irq is level triggered: We must enable it
2836                  * only after we started a DMA xfer, and disable it here
2837                  * immediately, or it will be signalled all the time while
2838                  * DEBI is idle.
2839                  * Note 2: You would think that an irq which is masked is
2840                  * not signalled by the hardware. Not so for the SAA7146:
2841                  * An irq is signalled as long as the corresponding bit
2842                  * in the ISR is set, and disabling irqs just prevents the
2843                  * hardware from setting the ISR bit. This means a) that we
2844                  * must clear the ISR *after* disabling the irq (which is why
2845                  * we must do it here even though saa7146_core did it already),
2846                  * and b) that if we were to disable an edge triggered irq
2847                  * (like the gpio irqs sadly are) temporarily we would likely
2848                  * loose some. This sucks :-(
2849                  */
2850                 SAA7146_IER_DISABLE(av7110->dev, MASK_19);
2851                 SAA7146_ISR_CLEAR(av7110->dev, MASK_19);
2852                 tasklet_schedule(&av7110->debi_tasklet);
2853         }
2854
2855         if (*isr & MASK_03) {
2856                 //printk("av7110_irq: GPIO\n");
2857                 tasklet_schedule(&av7110->gpio_tasklet);
2858         }
2859
2860         if (*isr & MASK_10)
2861                 tasklet_schedule(&av7110->vpe_tasklet);
2862 }
2863
2864
2865 static struct saa7146_extension av7110_extension_driver;
2866
2867 #define MAKE_AV7110_INFO(x_var,x_name) \
2868 static struct saa7146_pci_extension_data x_var = { \
2869         .ext_priv = x_name, \
2870         .ext = &av7110_extension_driver }
2871
2872 MAKE_AV7110_INFO(tts_1_X_fsc,"Technotrend/Hauppauge WinTV DVB-S rev1.X or Fujitsu Siemens DVB-C");
2873 MAKE_AV7110_INFO(ttt_1_X,    "Technotrend/Hauppauge WinTV DVB-T rev1.X");
2874 MAKE_AV7110_INFO(ttc_1_X,    "Technotrend/Hauppauge WinTV Nexus-CA rev1.X");
2875 MAKE_AV7110_INFO(ttc_2_X,    "Technotrend/Hauppauge WinTV DVB-C rev2.X");
2876 MAKE_AV7110_INFO(tts_2_X,    "Technotrend/Hauppauge WinTV Nexus-S rev2.X");
2877 MAKE_AV7110_INFO(tts_2_3,    "Technotrend/Hauppauge WinTV Nexus-S rev2.3");
2878 MAKE_AV7110_INFO(tts_1_3se,  "Technotrend/Hauppauge WinTV DVB-S rev1.3 SE");
2879 MAKE_AV7110_INFO(ttt,        "Technotrend/Hauppauge DVB-T");
2880 MAKE_AV7110_INFO(fsc,        "Fujitsu Siemens DVB-C");
2881 MAKE_AV7110_INFO(fss,        "Fujitsu Siemens DVB-S rev1.6");
2882 MAKE_AV7110_INFO(gxs_1_3,    "Galaxis DVB-S rev1.3");
2883
2884 static struct pci_device_id pci_tbl[] = {
2885         MAKE_EXTENSION_PCI(fsc,         0x110a, 0x0000),
2886         MAKE_EXTENSION_PCI(tts_1_X_fsc, 0x13c2, 0x0000),
2887         MAKE_EXTENSION_PCI(ttt_1_X,     0x13c2, 0x0001),
2888         MAKE_EXTENSION_PCI(ttc_2_X,     0x13c2, 0x0002),
2889         MAKE_EXTENSION_PCI(tts_2_X,     0x13c2, 0x0003),
2890         MAKE_EXTENSION_PCI(gxs_1_3,     0x13c2, 0x0004),
2891         MAKE_EXTENSION_PCI(fss,         0x13c2, 0x0006),
2892         MAKE_EXTENSION_PCI(ttt,         0x13c2, 0x0008),
2893         MAKE_EXTENSION_PCI(ttc_1_X,     0x13c2, 0x000a),
2894         MAKE_EXTENSION_PCI(tts_2_3,     0x13c2, 0x000e),
2895         MAKE_EXTENSION_PCI(tts_1_3se,   0x13c2, 0x1002),
2896
2897 /*      MAKE_EXTENSION_PCI(???, 0x13c2, 0x0005), UNDEFINED CARD */ // Technisat SkyStar1
2898 /*      MAKE_EXTENSION_PCI(???, 0x13c2, 0x0009), UNDEFINED CARD */ // TT/Hauppauge WinTV Nexus-CA v????
2899
2900         {
2901                 .vendor    = 0,
2902         }
2903 };
2904
2905 MODULE_DEVICE_TABLE(pci, pci_tbl);
2906
2907
2908 static struct saa7146_extension av7110_extension_driver = {
2909         .name           = "dvb",
2910         .flags          = SAA7146_USE_I2C_IRQ,
2911
2912         .module         = THIS_MODULE,
2913         .pci_tbl        = &pci_tbl[0],
2914         .attach         = av7110_attach,
2915         .detach         = __devexit_p(av7110_detach),
2916
2917         .irq_mask       = MASK_19 | MASK_03 | MASK_10,
2918         .irq_func       = av7110_irq,
2919 };
2920
2921
2922 static int __init av7110_init(void)
2923 {
2924         int retval;
2925         retval = saa7146_register_extension(&av7110_extension_driver);
2926         return retval;
2927 }
2928
2929
2930 static void __exit av7110_exit(void)
2931 {
2932         saa7146_unregister_extension(&av7110_extension_driver);
2933 }
2934
2935 module_init(av7110_init);
2936 module_exit(av7110_exit);
2937
2938 MODULE_DESCRIPTION("driver for the SAA7146 based AV110 PCI DVB cards by "
2939                    "Siemens, Technotrend, Hauppauge");
2940 MODULE_AUTHOR("Ralph Metzler, Marcus Metzler, others");
2941 MODULE_LICENSE("GPL");