Merge branch 'rmobile-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[pandora-kernel.git] / 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/ 
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
40 #include <linux/kernel.h>
41 #include <linux/sched.h>
42 #include <linux/types.h>
43 #include <linux/fcntl.h>
44 #include <linux/interrupt.h>
45 #include <linux/string.h>
46 #include <linux/pci.h>
47 #include <linux/vmalloc.h>
48 #include <linux/firmware.h>
49 #include <linux/crc32.h>
50 #include <linux/i2c.h>
51 #include <linux/kthread.h>
52 #include <linux/slab.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 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         .unlocked_ioctl = dvb_generic_ioctl,
731         .open           = dvb_generic_open,
732         .release        = dvb_generic_release,
733         .llseek         = noop_llseek,
734 };
735
736 static struct dvb_device dvbdev_osd = {
737         .priv           = NULL,
738         .users          = 1,
739         .writers        = 1,
740         .fops           = &dvb_osd_fops,
741         .kernel_ioctl   = dvb_osd_ioctl,
742 };
743 #endif /* CONFIG_DVB_AV7110_OSD */
744
745
746 static inline int SetPIDs(struct av7110 *av7110, u16 vpid, u16 apid, u16 ttpid,
747                           u16 subpid, u16 pcrpid)
748 {
749         u16 aflags = 0;
750
751         dprintk(4, "%p\n", av7110);
752
753         if (vpid == 0x1fff || apid == 0x1fff ||
754             ttpid == 0x1fff || subpid == 0x1fff || pcrpid == 0x1fff) {
755                 vpid = apid = ttpid = subpid = pcrpid = 0;
756                 av7110->pids[DMX_PES_VIDEO] = 0;
757                 av7110->pids[DMX_PES_AUDIO] = 0;
758                 av7110->pids[DMX_PES_TELETEXT] = 0;
759                 av7110->pids[DMX_PES_PCR] = 0;
760         }
761
762         if (av7110->audiostate.bypass_mode)
763                 aflags |= 0x8000;
764
765         return av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, MultiPID, 6,
766                              pcrpid, vpid, apid, ttpid, subpid, aflags);
767 }
768
769 int ChangePIDs(struct av7110 *av7110, u16 vpid, u16 apid, u16 ttpid,
770                 u16 subpid, u16 pcrpid)
771 {
772         int ret = 0;
773         dprintk(4, "%p\n", av7110);
774
775         if (mutex_lock_interruptible(&av7110->pid_mutex))
776                 return -ERESTARTSYS;
777
778         if (!(vpid & 0x8000))
779                 av7110->pids[DMX_PES_VIDEO] = vpid;
780         if (!(apid & 0x8000))
781                 av7110->pids[DMX_PES_AUDIO] = apid;
782         if (!(ttpid & 0x8000))
783                 av7110->pids[DMX_PES_TELETEXT] = ttpid;
784         if (!(pcrpid & 0x8000))
785                 av7110->pids[DMX_PES_PCR] = pcrpid;
786
787         av7110->pids[DMX_PES_SUBTITLE] = 0;
788
789         if (av7110->fe_synced) {
790                 pcrpid = av7110->pids[DMX_PES_PCR];
791                 ret = SetPIDs(av7110, vpid, apid, ttpid, subpid, pcrpid);
792         }
793
794         mutex_unlock(&av7110->pid_mutex);
795         return ret;
796 }
797
798
799 /******************************************************************************
800  * hardware filter functions
801  ******************************************************************************/
802
803 static int StartHWFilter(struct dvb_demux_filter *dvbdmxfilter)
804 {
805         struct dvb_demux_feed *dvbdmxfeed = dvbdmxfilter->feed;
806         struct av7110 *av7110 = dvbdmxfeed->demux->priv;
807         u16 buf[20];
808         int ret, i;
809         u16 handle;
810 //      u16 mode = 0x0320;
811         u16 mode = 0xb96a;
812
813         dprintk(4, "%p\n", av7110);
814
815         if (av7110->full_ts)
816                 return 0;
817
818         if (dvbdmxfilter->type == DMX_TYPE_SEC) {
819                 if (hw_sections) {
820                         buf[4] = (dvbdmxfilter->filter.filter_value[0] << 8) |
821                                 dvbdmxfilter->maskandmode[0];
822                         for (i = 3; i < 18; i++)
823                                 buf[i + 4 - 2] =
824                                         (dvbdmxfilter->filter.filter_value[i] << 8) |
825                                         dvbdmxfilter->maskandmode[i];
826                         mode = 4;
827                 }
828         } else if ((dvbdmxfeed->ts_type & TS_PACKET) &&
829                    !(dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY)) {
830                 av7110_p2t_init(&av7110->p2t_filter[dvbdmxfilter->index], dvbdmxfeed);
831         }
832
833         buf[0] = (COMTYPE_PID_FILTER << 8) + AddPIDFilter;
834         buf[1] = 16;
835         buf[2] = dvbdmxfeed->pid;
836         buf[3] = mode;
837
838         ret = av7110_fw_request(av7110, buf, 20, &handle, 1);
839         if (ret != 0 || handle >= 32) {
840                 printk("dvb-ttpci: %s error  buf %04x %04x %04x %04x  "
841                                 "ret %d  handle %04x\n",
842                                 __func__, buf[0], buf[1], buf[2], buf[3],
843                                 ret, handle);
844                 dvbdmxfilter->hw_handle = 0xffff;
845                 if (!ret)
846                         ret = -1;
847                 return ret;
848         }
849
850         av7110->handle2filter[handle] = dvbdmxfilter;
851         dvbdmxfilter->hw_handle = handle;
852
853         return ret;
854 }
855
856 static int StopHWFilter(struct dvb_demux_filter *dvbdmxfilter)
857 {
858         struct av7110 *av7110 = dvbdmxfilter->feed->demux->priv;
859         u16 buf[3];
860         u16 answ[2];
861         int ret;
862         u16 handle;
863
864         dprintk(4, "%p\n", av7110);
865
866         if (av7110->full_ts)
867                 return 0;
868
869         handle = dvbdmxfilter->hw_handle;
870         if (handle >= 32) {
871                 printk("%s tried to stop invalid filter %04x, filter type = %x\n",
872                                 __func__, handle, dvbdmxfilter->type);
873                 return -EINVAL;
874         }
875
876         av7110->handle2filter[handle] = NULL;
877
878         buf[0] = (COMTYPE_PID_FILTER << 8) + DelPIDFilter;
879         buf[1] = 1;
880         buf[2] = handle;
881         ret = av7110_fw_request(av7110, buf, 3, answ, 2);
882         if (ret != 0 || answ[1] != handle) {
883                 printk("dvb-ttpci: %s error  cmd %04x %04x %04x  ret %x  "
884                                 "resp %04x %04x  pid %d\n",
885                                 __func__, buf[0], buf[1], buf[2], ret,
886                                 answ[0], answ[1], dvbdmxfilter->feed->pid);
887                 if (!ret)
888                         ret = -1;
889         }
890         return ret;
891 }
892
893
894 static int dvb_feed_start_pid(struct dvb_demux_feed *dvbdmxfeed)
895 {
896         struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
897         struct av7110 *av7110 = dvbdmx->priv;
898         u16 *pid = dvbdmx->pids, npids[5];
899         int i;
900         int ret = 0;
901
902         dprintk(4, "%p\n", av7110);
903
904         npids[0] = npids[1] = npids[2] = npids[3] = npids[4] = 0xffff;
905         i = dvbdmxfeed->pes_type;
906         npids[i] = (pid[i]&0x8000) ? 0 : pid[i];
907         if ((i == 2) && npids[i] && (dvbdmxfeed->ts_type & TS_PACKET)) {
908                 npids[i] = 0;
909                 ret = ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]);
910                 if (!ret)
911                         ret = StartHWFilter(dvbdmxfeed->filter);
912                 return ret;
913         }
914         if (dvbdmxfeed->pes_type <= 2 || dvbdmxfeed->pes_type == 4) {
915                 ret = ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]);
916                 if (ret)
917                         return ret;
918         }
919
920         if (dvbdmxfeed->pes_type < 2 && npids[0])
921                 if (av7110->fe_synced)
922                 {
923                         ret = av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, Scan, 0);
924                         if (ret)
925                                 return ret;
926                 }
927
928         if ((dvbdmxfeed->ts_type & TS_PACKET) && !av7110->full_ts) {
929                 if (dvbdmxfeed->pes_type == 0 && !(dvbdmx->pids[0] & 0x8000))
930                         ret = av7110_av_start_record(av7110, RP_AUDIO, dvbdmxfeed);
931                 if (dvbdmxfeed->pes_type == 1 && !(dvbdmx->pids[1] & 0x8000))
932                         ret = av7110_av_start_record(av7110, RP_VIDEO, dvbdmxfeed);
933         }
934         return ret;
935 }
936
937 static int dvb_feed_stop_pid(struct dvb_demux_feed *dvbdmxfeed)
938 {
939         struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
940         struct av7110 *av7110 = dvbdmx->priv;
941         u16 *pid = dvbdmx->pids, npids[5];
942         int i;
943
944         int ret = 0;
945
946         dprintk(4, "%p\n", av7110);
947
948         if (dvbdmxfeed->pes_type <= 1) {
949                 ret = av7110_av_stop(av7110, dvbdmxfeed->pes_type ?  RP_VIDEO : RP_AUDIO);
950                 if (ret)
951                         return ret;
952                 if (!av7110->rec_mode)
953                         dvbdmx->recording = 0;
954                 if (!av7110->playing)
955                         dvbdmx->playing = 0;
956         }
957         npids[0] = npids[1] = npids[2] = npids[3] = npids[4] = 0xffff;
958         i = dvbdmxfeed->pes_type;
959         switch (i) {
960         case 2: //teletext
961                 if (dvbdmxfeed->ts_type & TS_PACKET)
962                         ret = StopHWFilter(dvbdmxfeed->filter);
963                 npids[2] = 0;
964                 break;
965         case 0:
966         case 1:
967         case 4:
968                 if (!pids_off)
969                         return 0;
970                 npids[i] = (pid[i]&0x8000) ? 0 : pid[i];
971                 break;
972         }
973         if (!ret)
974                 ret = ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]);
975         return ret;
976 }
977
978 static int av7110_start_feed(struct dvb_demux_feed *feed)
979 {
980         struct dvb_demux *demux = feed->demux;
981         struct av7110 *av7110 = demux->priv;
982         int ret = 0;
983
984         dprintk(4, "%p\n", av7110);
985
986         if (!demux->dmx.frontend)
987                 return -EINVAL;
988
989         if (!av7110->full_ts && feed->pid > 0x1fff)
990                 return -EINVAL;
991
992         if (feed->type == DMX_TYPE_TS) {
993                 if ((feed->ts_type & TS_DECODER) &&
994                     (feed->pes_type < DMX_TS_PES_OTHER)) {
995                         switch (demux->dmx.frontend->source) {
996                         case DMX_MEMORY_FE:
997                                 if (feed->ts_type & TS_DECODER)
998                                        if (feed->pes_type < 2 &&
999                                            !(demux->pids[0] & 0x8000) &&
1000                                            !(demux->pids[1] & 0x8000)) {
1001                                                dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout);
1002                                                dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout);
1003                                                ret = av7110_av_start_play(av7110,RP_AV);
1004                                                if (!ret)
1005                                                        demux->playing = 1;
1006                                         }
1007                                 break;
1008                         default:
1009                                 ret = dvb_feed_start_pid(feed);
1010                                 break;
1011                         }
1012                 } else if ((feed->ts_type & TS_PACKET) &&
1013                            (demux->dmx.frontend->source != DMX_MEMORY_FE)) {
1014                         ret = StartHWFilter(feed->filter);
1015                 }
1016         }
1017
1018         if (av7110->full_ts) {
1019                 budget_start_feed(feed);
1020                 return ret;
1021         }
1022
1023         if (feed->type == DMX_TYPE_SEC) {
1024                 int i;
1025
1026                 for (i = 0; i < demux->filternum; i++) {
1027                         if (demux->filter[i].state != DMX_STATE_READY)
1028                                 continue;
1029                         if (demux->filter[i].type != DMX_TYPE_SEC)
1030                                 continue;
1031                         if (demux->filter[i].filter.parent != &feed->feed.sec)
1032                                 continue;
1033                         demux->filter[i].state = DMX_STATE_GO;
1034                         if (demux->dmx.frontend->source != DMX_MEMORY_FE) {
1035                                 ret = StartHWFilter(&demux->filter[i]);
1036                                 if (ret)
1037                                         break;
1038                         }
1039                 }
1040         }
1041
1042         return ret;
1043 }
1044
1045
1046 static int av7110_stop_feed(struct dvb_demux_feed *feed)
1047 {
1048         struct dvb_demux *demux = feed->demux;
1049         struct av7110 *av7110 = demux->priv;
1050         int i, rc, ret = 0;
1051         dprintk(4, "%p\n", av7110);
1052
1053         if (feed->type == DMX_TYPE_TS) {
1054                 if (feed->ts_type & TS_DECODER) {
1055                         if (feed->pes_type >= DMX_TS_PES_OTHER ||
1056                             !demux->pesfilter[feed->pes_type])
1057                                 return -EINVAL;
1058                         demux->pids[feed->pes_type] |= 0x8000;
1059                         demux->pesfilter[feed->pes_type] = NULL;
1060                 }
1061                 if (feed->ts_type & TS_DECODER &&
1062                     feed->pes_type < DMX_TS_PES_OTHER) {
1063                         ret = dvb_feed_stop_pid(feed);
1064                 } else
1065                         if ((feed->ts_type & TS_PACKET) &&
1066                             (demux->dmx.frontend->source != DMX_MEMORY_FE))
1067                                 ret = StopHWFilter(feed->filter);
1068         }
1069
1070         if (av7110->full_ts) {
1071                 budget_stop_feed(feed);
1072                 return ret;
1073         }
1074
1075         if (feed->type == DMX_TYPE_SEC) {
1076                 for (i = 0; i<demux->filternum; i++) {
1077                         if (demux->filter[i].state == DMX_STATE_GO &&
1078                             demux->filter[i].filter.parent == &feed->feed.sec) {
1079                                 demux->filter[i].state = DMX_STATE_READY;
1080                                 if (demux->dmx.frontend->source != DMX_MEMORY_FE) {
1081                                         rc = StopHWFilter(&demux->filter[i]);
1082                                         if (!ret)
1083                                                 ret = rc;
1084                                         /* keep going, stop as many filters as possible */
1085                                 }
1086                         }
1087                 }
1088         }
1089
1090         return ret;
1091 }
1092
1093
1094 static void restart_feeds(struct av7110 *av7110)
1095 {
1096         struct dvb_demux *dvbdmx = &av7110->demux;
1097         struct dvb_demux_feed *feed;
1098         int mode;
1099         int feeding;
1100         int i, j;
1101
1102         dprintk(4, "%p\n", av7110);
1103
1104         mode = av7110->playing;
1105         av7110->playing = 0;
1106         av7110->rec_mode = 0;
1107
1108         feeding = av7110->feeding1; /* full_ts mod */
1109
1110         for (i = 0; i < dvbdmx->feednum; i++) {
1111                 feed = &dvbdmx->feed[i];
1112                 if (feed->state == DMX_STATE_GO) {
1113                         if (feed->type == DMX_TYPE_SEC) {
1114                                 for (j = 0; j < dvbdmx->filternum; j++) {
1115                                         if (dvbdmx->filter[j].type != DMX_TYPE_SEC)
1116                                                 continue;
1117                                         if (dvbdmx->filter[j].filter.parent != &feed->feed.sec)
1118                                                 continue;
1119                                         if (dvbdmx->filter[j].state == DMX_STATE_GO)
1120                                                 dvbdmx->filter[j].state = DMX_STATE_READY;
1121                                 }
1122                         }
1123                         av7110_start_feed(feed);
1124                 }
1125         }
1126
1127         av7110->feeding1 = feeding; /* full_ts mod */
1128
1129         if (mode)
1130                 av7110_av_start_play(av7110, mode);
1131 }
1132
1133 static int dvb_get_stc(struct dmx_demux *demux, unsigned int num,
1134                        uint64_t *stc, unsigned int *base)
1135 {
1136         int ret;
1137         u16 fwstc[4];
1138         u16 tag = ((COMTYPE_REQUEST << 8) + ReqSTC);
1139         struct dvb_demux *dvbdemux;
1140         struct av7110 *av7110;
1141
1142         /* pointer casting paranoia... */
1143         BUG_ON(!demux);
1144         dvbdemux = demux->priv;
1145         BUG_ON(!dvbdemux);
1146         av7110 = dvbdemux->priv;
1147
1148         dprintk(4, "%p\n", av7110);
1149
1150         if (num != 0)
1151                 return -EINVAL;
1152
1153         ret = av7110_fw_request(av7110, &tag, 0, fwstc, 4);
1154         if (ret) {
1155                 printk(KERN_ERR "%s: av7110_fw_request error\n", __func__);
1156                 return ret;
1157         }
1158         dprintk(2, "fwstc = %04hx %04hx %04hx %04hx\n",
1159                 fwstc[0], fwstc[1], fwstc[2], fwstc[3]);
1160
1161         *stc =  (((uint64_t) ((fwstc[3] & 0x8000) >> 15)) << 32) |
1162                 (((uint64_t)  fwstc[1]) << 16) | ((uint64_t) fwstc[0]);
1163         *base = 1;
1164
1165         dprintk(4, "stc = %lu\n", (unsigned long)*stc);
1166
1167         return 0;
1168 }
1169
1170
1171 /******************************************************************************
1172  * SEC device file operations
1173  ******************************************************************************/
1174
1175
1176 static int av7110_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
1177 {
1178         struct av7110* av7110 = fe->dvb->priv;
1179
1180         switch (tone) {
1181         case SEC_TONE_ON:
1182                 return Set22K(av7110, 1);
1183
1184         case SEC_TONE_OFF:
1185                 return Set22K(av7110, 0);
1186
1187         default:
1188                 return -EINVAL;
1189         }
1190 }
1191
1192 static int av7110_diseqc_send_master_cmd(struct dvb_frontend* fe,
1193                                          struct dvb_diseqc_master_cmd* cmd)
1194 {
1195         struct av7110* av7110 = fe->dvb->priv;
1196
1197         return av7110_diseqc_send(av7110, cmd->msg_len, cmd->msg, -1);
1198 }
1199
1200 static int av7110_diseqc_send_burst(struct dvb_frontend* fe,
1201                                     fe_sec_mini_cmd_t minicmd)
1202 {
1203         struct av7110* av7110 = fe->dvb->priv;
1204
1205         return av7110_diseqc_send(av7110, 0, NULL, minicmd);
1206 }
1207
1208 /* simplified code from budget-core.c */
1209 static int stop_ts_capture(struct av7110 *budget)
1210 {
1211         dprintk(2, "budget: %p\n", budget);
1212
1213         if (--budget->feeding1)
1214                 return budget->feeding1;
1215         saa7146_write(budget->dev, MC1, MASK_20);       /* DMA3 off */
1216         SAA7146_IER_DISABLE(budget->dev, MASK_10);
1217         SAA7146_ISR_CLEAR(budget->dev, MASK_10);
1218         return 0;
1219 }
1220
1221 static int start_ts_capture(struct av7110 *budget)
1222 {
1223         dprintk(2, "budget: %p\n", budget);
1224
1225         if (budget->feeding1)
1226                 return ++budget->feeding1;
1227         memset(budget->grabbing, 0x00, TS_BUFLEN);
1228         budget->ttbp = 0;
1229         SAA7146_ISR_CLEAR(budget->dev, MASK_10);  /* VPE */
1230         SAA7146_IER_ENABLE(budget->dev, MASK_10); /* VPE */
1231         saa7146_write(budget->dev, MC1, (MASK_04 | MASK_20)); /* DMA3 on */
1232         return ++budget->feeding1;
1233 }
1234
1235 static int budget_start_feed(struct dvb_demux_feed *feed)
1236 {
1237         struct dvb_demux *demux = feed->demux;
1238         struct av7110 *budget = demux->priv;
1239         int status;
1240
1241         dprintk(2, "av7110: %p\n", budget);
1242
1243         spin_lock(&budget->feedlock1);
1244         feed->pusi_seen = 0; /* have a clean section start */
1245         status = start_ts_capture(budget);
1246         spin_unlock(&budget->feedlock1);
1247         return status;
1248 }
1249
1250 static int budget_stop_feed(struct dvb_demux_feed *feed)
1251 {
1252         struct dvb_demux *demux = feed->demux;
1253         struct av7110 *budget = demux->priv;
1254         int status;
1255
1256         dprintk(2, "budget: %p\n", budget);
1257
1258         spin_lock(&budget->feedlock1);
1259         status = stop_ts_capture(budget);
1260         spin_unlock(&budget->feedlock1);
1261         return status;
1262 }
1263
1264 static void vpeirq(unsigned long cookie)
1265 {
1266         struct av7110 *budget = (struct av7110 *)cookie;
1267         u8 *mem = (u8 *) (budget->grabbing);
1268         u32 olddma = budget->ttbp;
1269         u32 newdma = saa7146_read(budget->dev, PCI_VDP3);
1270         struct dvb_demux *demux = budget->full_ts ? &budget->demux : &budget->demux1;
1271
1272         /* nearest lower position divisible by 188 */
1273         newdma -= newdma % 188;
1274
1275         if (newdma >= TS_BUFLEN)
1276                 return;
1277
1278         budget->ttbp = newdma;
1279
1280         if (!budget->feeding1 || (newdma == olddma))
1281                 return;
1282
1283         /* Ensure streamed PCI data is synced to CPU */
1284         pci_dma_sync_sg_for_cpu(budget->dev->pci, budget->pt.slist, budget->pt.nents, PCI_DMA_FROMDEVICE);
1285
1286 #if 0
1287         /* track rps1 activity */
1288         printk("vpeirq: %02x Event Counter 1 0x%04x\n",
1289                mem[olddma],
1290                saa7146_read(budget->dev, EC1R) & 0x3fff);
1291 #endif
1292
1293         if (newdma > olddma)
1294                 /* no wraparound, dump olddma..newdma */
1295                 dvb_dmx_swfilter_packets(demux, mem + olddma, (newdma - olddma) / 188);
1296         else {
1297                 /* wraparound, dump olddma..buflen and 0..newdma */
1298                 dvb_dmx_swfilter_packets(demux, mem + olddma, (TS_BUFLEN - olddma) / 188);
1299                 dvb_dmx_swfilter_packets(demux, mem, newdma / 188);
1300         }
1301 }
1302
1303 static int av7110_register(struct av7110 *av7110)
1304 {
1305         int ret, i;
1306         struct dvb_demux *dvbdemux = &av7110->demux;
1307         struct dvb_demux *dvbdemux1 = &av7110->demux1;
1308
1309         dprintk(4, "%p\n", av7110);
1310
1311         if (av7110->registered)
1312                 return -1;
1313
1314         av7110->registered = 1;
1315
1316         dvbdemux->priv = (void *) av7110;
1317
1318         for (i = 0; i < 32; i++)
1319                 av7110->handle2filter[i] = NULL;
1320
1321         dvbdemux->filternum = (av7110->full_ts) ? 256 : 32;
1322         dvbdemux->feednum = (av7110->full_ts) ? 256 : 32;
1323         dvbdemux->start_feed = av7110_start_feed;
1324         dvbdemux->stop_feed = av7110_stop_feed;
1325         dvbdemux->write_to_decoder = av7110_write_to_decoder;
1326         dvbdemux->dmx.capabilities = (DMX_TS_FILTERING | DMX_SECTION_FILTERING |
1327                                       DMX_MEMORY_BASED_FILTERING);
1328
1329         dvb_dmx_init(&av7110->demux);
1330         av7110->demux.dmx.get_stc = dvb_get_stc;
1331
1332         av7110->dmxdev.filternum = (av7110->full_ts) ? 256 : 32;
1333         av7110->dmxdev.demux = &dvbdemux->dmx;
1334         av7110->dmxdev.capabilities = 0;
1335
1336         dvb_dmxdev_init(&av7110->dmxdev, &av7110->dvb_adapter);
1337
1338         av7110->hw_frontend.source = DMX_FRONTEND_0;
1339
1340         ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &av7110->hw_frontend);
1341
1342         if (ret < 0)
1343                 return ret;
1344
1345         av7110->mem_frontend.source = DMX_MEMORY_FE;
1346
1347         ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &av7110->mem_frontend);
1348
1349         if (ret < 0)
1350                 return ret;
1351
1352         ret = dvbdemux->dmx.connect_frontend(&dvbdemux->dmx,
1353                                              &av7110->hw_frontend);
1354         if (ret < 0)
1355                 return ret;
1356
1357         av7110_av_register(av7110);
1358         av7110_ca_register(av7110);
1359
1360 #ifdef CONFIG_DVB_AV7110_OSD
1361         dvb_register_device(&av7110->dvb_adapter, &av7110->osd_dev,
1362                             &dvbdev_osd, av7110, DVB_DEVICE_OSD);
1363 #endif
1364
1365         dvb_net_init(&av7110->dvb_adapter, &av7110->dvb_net, &dvbdemux->dmx);
1366
1367         if (budgetpatch) {
1368                 /* initialize software demux1 without its own frontend
1369                  * demux1 hardware is connected to frontend0 of demux0
1370                  */
1371                 dvbdemux1->priv = (void *) av7110;
1372
1373                 dvbdemux1->filternum = 256;
1374                 dvbdemux1->feednum = 256;
1375                 dvbdemux1->start_feed = budget_start_feed;
1376                 dvbdemux1->stop_feed = budget_stop_feed;
1377                 dvbdemux1->write_to_decoder = NULL;
1378
1379                 dvbdemux1->dmx.capabilities = (DMX_TS_FILTERING | DMX_SECTION_FILTERING |
1380                                                DMX_MEMORY_BASED_FILTERING);
1381
1382                 dvb_dmx_init(&av7110->demux1);
1383
1384                 av7110->dmxdev1.filternum = 256;
1385                 av7110->dmxdev1.demux = &dvbdemux1->dmx;
1386                 av7110->dmxdev1.capabilities = 0;
1387
1388                 dvb_dmxdev_init(&av7110->dmxdev1, &av7110->dvb_adapter);
1389
1390                 dvb_net_init(&av7110->dvb_adapter, &av7110->dvb_net1, &dvbdemux1->dmx);
1391                 printk("dvb-ttpci: additional demux1 for budget-patch registered\n");
1392         }
1393         return 0;
1394 }
1395
1396
1397 static void dvb_unregister(struct av7110 *av7110)
1398 {
1399         struct dvb_demux *dvbdemux = &av7110->demux;
1400         struct dvb_demux *dvbdemux1 = &av7110->demux1;
1401
1402         dprintk(4, "%p\n", av7110);
1403
1404         if (!av7110->registered)
1405                 return;
1406
1407         if (budgetpatch) {
1408                 dvb_net_release(&av7110->dvb_net1);
1409                 dvbdemux->dmx.close(&dvbdemux1->dmx);
1410                 dvb_dmxdev_release(&av7110->dmxdev1);
1411                 dvb_dmx_release(&av7110->demux1);
1412         }
1413
1414         dvb_net_release(&av7110->dvb_net);
1415
1416         dvbdemux->dmx.close(&dvbdemux->dmx);
1417         dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &av7110->hw_frontend);
1418         dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &av7110->mem_frontend);
1419
1420         dvb_dmxdev_release(&av7110->dmxdev);
1421         dvb_dmx_release(&av7110->demux);
1422
1423         if (av7110->fe != NULL) {
1424                 dvb_unregister_frontend(av7110->fe);
1425                 dvb_frontend_detach(av7110->fe);
1426         }
1427         dvb_unregister_device(av7110->osd_dev);
1428         av7110_av_unregister(av7110);
1429         av7110_ca_unregister(av7110);
1430 }
1431
1432
1433 /****************************************************************************
1434  * I2C client commands
1435  ****************************************************************************/
1436
1437 int i2c_writereg(struct av7110 *av7110, u8 id, u8 reg, u8 val)
1438 {
1439         u8 msg[2] = { reg, val };
1440         struct i2c_msg msgs;
1441
1442         msgs.flags = 0;
1443         msgs.addr = id / 2;
1444         msgs.len = 2;
1445         msgs.buf = msg;
1446         return i2c_transfer(&av7110->i2c_adap, &msgs, 1);
1447 }
1448
1449 u8 i2c_readreg(struct av7110 *av7110, u8 id, u8 reg)
1450 {
1451         u8 mm1[] = {0x00};
1452         u8 mm2[] = {0x00};
1453         struct i2c_msg msgs[2];
1454
1455         msgs[0].flags = 0;
1456         msgs[1].flags = I2C_M_RD;
1457         msgs[0].addr = msgs[1].addr = id / 2;
1458         mm1[0] = reg;
1459         msgs[0].len = 1; msgs[1].len = 1;
1460         msgs[0].buf = mm1; msgs[1].buf = mm2;
1461         i2c_transfer(&av7110->i2c_adap, msgs, 2);
1462
1463         return mm2[0];
1464 }
1465
1466 /****************************************************************************
1467  * INITIALIZATION
1468  ****************************************************************************/
1469
1470
1471 static int check_firmware(struct av7110* av7110)
1472 {
1473         u32 crc = 0, len = 0;
1474         unsigned char *ptr;
1475
1476         /* check for firmware magic */
1477         ptr = av7110->bin_fw;
1478         if (ptr[0] != 'A' || ptr[1] != 'V' ||
1479             ptr[2] != 'F' || ptr[3] != 'W') {
1480                 printk("dvb-ttpci: this is not an av7110 firmware\n");
1481                 return -EINVAL;
1482         }
1483         ptr += 4;
1484
1485         /* check dpram file */
1486         crc = get_unaligned_be32(ptr);
1487         ptr += 4;
1488         len = get_unaligned_be32(ptr);
1489         ptr += 4;
1490         if (len >= 512) {
1491                 printk("dvb-ttpci: dpram file is way too big.\n");
1492                 return -EINVAL;
1493         }
1494         if (crc != crc32_le(0, ptr, len)) {
1495                 printk("dvb-ttpci: crc32 of dpram file does not match.\n");
1496                 return -EINVAL;
1497         }
1498         av7110->bin_dpram = ptr;
1499         av7110->size_dpram = len;
1500         ptr += len;
1501
1502         /* check root file */
1503         crc = get_unaligned_be32(ptr);
1504         ptr += 4;
1505         len = get_unaligned_be32(ptr);
1506         ptr += 4;
1507
1508         if (len <= 200000 || len >= 300000 ||
1509             len > ((av7110->bin_fw + av7110->size_fw) - ptr)) {
1510                 printk("dvb-ttpci: root file has strange size (%d). aborting.\n", len);
1511                 return -EINVAL;
1512         }
1513         if( crc != crc32_le(0, ptr, len)) {
1514                 printk("dvb-ttpci: crc32 of root file does not match.\n");
1515                 return -EINVAL;
1516         }
1517         av7110->bin_root = ptr;
1518         av7110->size_root = len;
1519         return 0;
1520 }
1521
1522 static void put_firmware(struct av7110* av7110)
1523 {
1524         vfree(av7110->bin_fw);
1525 }
1526
1527 static int get_firmware(struct av7110* av7110)
1528 {
1529         int ret;
1530         const struct firmware *fw;
1531
1532         /* request the av7110 firmware, this will block until someone uploads it */
1533         ret = request_firmware(&fw, "dvb-ttpci-01.fw", &av7110->dev->pci->dev);
1534         if (ret) {
1535                 if (ret == -ENOENT) {
1536                         printk(KERN_ERR "dvb-ttpci: could not load firmware,"
1537                                " file not found: dvb-ttpci-01.fw\n");
1538                         printk(KERN_ERR "dvb-ttpci: usually this should be in "
1539                                "/usr/lib/hotplug/firmware or /lib/firmware\n");
1540                         printk(KERN_ERR "dvb-ttpci: and can be downloaded from"
1541                                " http://www.linuxtv.org/download/dvb/firmware/\n");
1542                 } else
1543                         printk(KERN_ERR "dvb-ttpci: cannot request firmware"
1544                                " (error %i)\n", ret);
1545                 return -EINVAL;
1546         }
1547
1548         if (fw->size <= 200000) {
1549                 printk("dvb-ttpci: this firmware is way too small.\n");
1550                 release_firmware(fw);
1551                 return -EINVAL;
1552         }
1553
1554         /* check if the firmware is available */
1555         av7110->bin_fw = vmalloc(fw->size);
1556         if (NULL == av7110->bin_fw) {
1557                 dprintk(1, "out of memory\n");
1558                 release_firmware(fw);
1559                 return -ENOMEM;
1560         }
1561
1562         memcpy(av7110->bin_fw, fw->data, fw->size);
1563         av7110->size_fw = fw->size;
1564         if ((ret = check_firmware(av7110)))
1565                 vfree(av7110->bin_fw);
1566
1567         release_firmware(fw);
1568         return ret;
1569 }
1570
1571 static int alps_bsrv2_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params)
1572 {
1573         struct av7110* av7110 = fe->dvb->priv;
1574         u8 pwr = 0;
1575         u8 buf[4];
1576         struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf) };
1577         u32 div = (params->frequency + 479500) / 125;
1578
1579         if (params->frequency > 2000000) pwr = 3;
1580         else if (params->frequency > 1800000) pwr = 2;
1581         else if (params->frequency > 1600000) pwr = 1;
1582         else if (params->frequency > 1200000) pwr = 0;
1583         else if (params->frequency >= 1100000) pwr = 1;
1584         else pwr = 2;
1585
1586         buf[0] = (div >> 8) & 0x7f;
1587         buf[1] = div & 0xff;
1588         buf[2] = ((div & 0x18000) >> 10) | 0x95;
1589         buf[3] = (pwr << 6) | 0x30;
1590
1591         // NOTE: since we're using a prescaler of 2, we set the
1592         // divisor frequency to 62.5kHz and divide by 125 above
1593
1594         if (fe->ops.i2c_gate_ctrl)
1595                 fe->ops.i2c_gate_ctrl(fe, 1);
1596         if (i2c_transfer (&av7110->i2c_adap, &msg, 1) != 1)
1597                 return -EIO;
1598         return 0;
1599 }
1600
1601 static struct ves1x93_config alps_bsrv2_config = {
1602         .demod_address = 0x08,
1603         .xin = 90100000UL,
1604         .invert_pwm = 0,
1605 };
1606
1607 static int alps_tdbe2_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params)
1608 {
1609         struct av7110* av7110 = fe->dvb->priv;
1610         u32 div;
1611         u8 data[4];
1612         struct i2c_msg msg = { .addr = 0x62, .flags = 0, .buf = data, .len = sizeof(data) };
1613
1614         div = (params->frequency + 35937500 + 31250) / 62500;
1615
1616         data[0] = (div >> 8) & 0x7f;
1617         data[1] = div & 0xff;
1618         data[2] = 0x85 | ((div >> 10) & 0x60);
1619         data[3] = (params->frequency < 174000000 ? 0x88 : params->frequency < 470000000 ? 0x84 : 0x81);
1620
1621         if (fe->ops.i2c_gate_ctrl)
1622                 fe->ops.i2c_gate_ctrl(fe, 1);
1623         if (i2c_transfer(&av7110->i2c_adap, &msg, 1) != 1)
1624                 return -EIO;
1625         return 0;
1626 }
1627
1628 static struct ves1820_config alps_tdbe2_config = {
1629         .demod_address = 0x09,
1630         .xin = 57840000UL,
1631         .invert = 1,
1632         .selagc = VES1820_SELAGC_SIGNAMPERR,
1633 };
1634
1635
1636
1637
1638 static int grundig_29504_451_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params)
1639 {
1640         struct av7110* av7110 = fe->dvb->priv;
1641         u32 div;
1642         u8 data[4];
1643         struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) };
1644
1645         div = params->frequency / 125;
1646         data[0] = (div >> 8) & 0x7f;
1647         data[1] = div & 0xff;
1648         data[2] = 0x8e;
1649         data[3] = 0x00;
1650
1651         if (fe->ops.i2c_gate_ctrl)
1652                 fe->ops.i2c_gate_ctrl(fe, 1);
1653         if (i2c_transfer(&av7110->i2c_adap, &msg, 1) != 1)
1654                 return -EIO;
1655         return 0;
1656 }
1657
1658 static struct tda8083_config grundig_29504_451_config = {
1659         .demod_address = 0x68,
1660 };
1661
1662
1663
1664 static int philips_cd1516_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params)
1665 {
1666         struct av7110* av7110 = fe->dvb->priv;
1667         u32 div;
1668         u32 f = params->frequency;
1669         u8 data[4];
1670         struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) };
1671
1672         div = (f + 36125000 + 31250) / 62500;
1673
1674         data[0] = (div >> 8) & 0x7f;
1675         data[1] = div & 0xff;
1676         data[2] = 0x8e;
1677         data[3] = (f < 174000000 ? 0xa1 : f < 470000000 ? 0x92 : 0x34);
1678
1679         if (fe->ops.i2c_gate_ctrl)
1680                 fe->ops.i2c_gate_ctrl(fe, 1);
1681         if (i2c_transfer(&av7110->i2c_adap, &msg, 1) != 1)
1682                 return -EIO;
1683         return 0;
1684 }
1685
1686 static struct ves1820_config philips_cd1516_config = {
1687         .demod_address = 0x09,
1688         .xin = 57840000UL,
1689         .invert = 1,
1690         .selagc = VES1820_SELAGC_SIGNAMPERR,
1691 };
1692
1693
1694
1695 static int alps_tdlb7_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params)
1696 {
1697         struct av7110* av7110 = fe->dvb->priv;
1698         u32 div, pwr;
1699         u8 data[4];
1700         struct i2c_msg msg = { .addr = 0x60, .flags = 0, .buf = data, .len = sizeof(data) };
1701
1702         div = (params->frequency + 36200000) / 166666;
1703
1704         if (params->frequency <= 782000000)
1705                 pwr = 1;
1706         else
1707                 pwr = 2;
1708
1709         data[0] = (div >> 8) & 0x7f;
1710         data[1] = div & 0xff;
1711         data[2] = 0x85;
1712         data[3] = pwr << 6;
1713
1714         if (fe->ops.i2c_gate_ctrl)
1715                 fe->ops.i2c_gate_ctrl(fe, 1);
1716         if (i2c_transfer(&av7110->i2c_adap, &msg, 1) != 1)
1717                 return -EIO;
1718         return 0;
1719 }
1720
1721 static int alps_tdlb7_request_firmware(struct dvb_frontend* fe, const struct firmware **fw, char* name)
1722 {
1723 #if defined(CONFIG_DVB_SP8870) || defined(CONFIG_DVB_SP8870_MODULE)
1724         struct av7110* av7110 = fe->dvb->priv;
1725
1726         return request_firmware(fw, name, &av7110->dev->pci->dev);
1727 #else
1728         return -EINVAL;
1729 #endif
1730 }
1731
1732 static struct sp8870_config alps_tdlb7_config = {
1733
1734         .demod_address = 0x71,
1735         .request_firmware = alps_tdlb7_request_firmware,
1736 };
1737
1738
1739 static u8 nexusca_stv0297_inittab[] = {
1740         0x80, 0x01,
1741         0x80, 0x00,
1742         0x81, 0x01,
1743         0x81, 0x00,
1744         0x00, 0x09,
1745         0x01, 0x69,
1746         0x03, 0x00,
1747         0x04, 0x00,
1748         0x07, 0x00,
1749         0x08, 0x00,
1750         0x20, 0x00,
1751         0x21, 0x40,
1752         0x22, 0x00,
1753         0x23, 0x00,
1754         0x24, 0x40,
1755         0x25, 0x88,
1756         0x30, 0xff,
1757         0x31, 0x00,
1758         0x32, 0xff,
1759         0x33, 0x00,
1760         0x34, 0x50,
1761         0x35, 0x7f,
1762         0x36, 0x00,
1763         0x37, 0x20,
1764         0x38, 0x00,
1765         0x40, 0x1c,
1766         0x41, 0xff,
1767         0x42, 0x29,
1768         0x43, 0x00,
1769         0x44, 0xff,
1770         0x45, 0x00,
1771         0x46, 0x00,
1772         0x49, 0x04,
1773         0x4a, 0x00,
1774         0x4b, 0x7b,
1775         0x52, 0x30,
1776         0x55, 0xae,
1777         0x56, 0x47,
1778         0x57, 0xe1,
1779         0x58, 0x3a,
1780         0x5a, 0x1e,
1781         0x5b, 0x34,
1782         0x60, 0x00,
1783         0x63, 0x00,
1784         0x64, 0x00,
1785         0x65, 0x00,
1786         0x66, 0x00,
1787         0x67, 0x00,
1788         0x68, 0x00,
1789         0x69, 0x00,
1790         0x6a, 0x02,
1791         0x6b, 0x00,
1792         0x70, 0xff,
1793         0x71, 0x00,
1794         0x72, 0x00,
1795         0x73, 0x00,
1796         0x74, 0x0c,
1797         0x80, 0x00,
1798         0x81, 0x00,
1799         0x82, 0x00,
1800         0x83, 0x00,
1801         0x84, 0x04,
1802         0x85, 0x80,
1803         0x86, 0x24,
1804         0x87, 0x78,
1805         0x88, 0x10,
1806         0x89, 0x00,
1807         0x90, 0x01,
1808         0x91, 0x01,
1809         0xa0, 0x04,
1810         0xa1, 0x00,
1811         0xa2, 0x00,
1812         0xb0, 0x91,
1813         0xb1, 0x0b,
1814         0xc0, 0x53,
1815         0xc1, 0x70,
1816         0xc2, 0x12,
1817         0xd0, 0x00,
1818         0xd1, 0x00,
1819         0xd2, 0x00,
1820         0xd3, 0x00,
1821         0xd4, 0x00,
1822         0xd5, 0x00,
1823         0xde, 0x00,
1824         0xdf, 0x00,
1825         0x61, 0x49,
1826         0x62, 0x0b,
1827         0x53, 0x08,
1828         0x59, 0x08,
1829         0xff, 0xff,
1830 };
1831
1832 static int nexusca_stv0297_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params)
1833 {
1834         struct av7110* av7110 = fe->dvb->priv;
1835         u32 div;
1836         u8 data[4];
1837         struct i2c_msg msg = { .addr = 0x63, .flags = 0, .buf = data, .len = sizeof(data) };
1838         struct i2c_msg readmsg = { .addr = 0x63, .flags = I2C_M_RD, .buf = data, .len = 1 };
1839         int i;
1840
1841         div = (params->frequency + 36150000 + 31250) / 62500;
1842
1843         data[0] = (div >> 8) & 0x7f;
1844         data[1] = div & 0xff;
1845         data[2] = 0xce;
1846
1847         if (params->frequency < 45000000)
1848                 return -EINVAL;
1849         else if (params->frequency < 137000000)
1850                 data[3] = 0x01;
1851         else if (params->frequency < 403000000)
1852                 data[3] = 0x02;
1853         else if (params->frequency < 860000000)
1854                 data[3] = 0x04;
1855         else
1856                 return -EINVAL;
1857
1858         if (fe->ops.i2c_gate_ctrl)
1859                 fe->ops.i2c_gate_ctrl(fe, 1);
1860         if (i2c_transfer(&av7110->i2c_adap, &msg, 1) != 1) {
1861                 printk("nexusca: pll transfer failed!\n");
1862                 return -EIO;
1863         }
1864
1865         // wait for PLL lock
1866         for(i = 0; i < 20; i++) {
1867                 if (fe->ops.i2c_gate_ctrl)
1868                         fe->ops.i2c_gate_ctrl(fe, 1);
1869                 if (i2c_transfer(&av7110->i2c_adap, &readmsg, 1) == 1)
1870                         if (data[0] & 0x40) break;
1871                 msleep(10);
1872         }
1873
1874         return 0;
1875 }
1876
1877 static struct stv0297_config nexusca_stv0297_config = {
1878
1879         .demod_address = 0x1C,
1880         .inittab = nexusca_stv0297_inittab,
1881         .invert = 1,
1882         .stop_during_read = 1,
1883 };
1884
1885
1886
1887 static int grundig_29504_401_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters *params)
1888 {
1889         struct av7110* av7110 = fe->dvb->priv;
1890         u32 div;
1891         u8 cfg, cpump, band_select;
1892         u8 data[4];
1893         struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) };
1894
1895         div = (36125000 + params->frequency) / 166666;
1896
1897         cfg = 0x88;
1898
1899         if (params->frequency < 175000000) cpump = 2;
1900         else if (params->frequency < 390000000) cpump = 1;
1901         else if (params->frequency < 470000000) cpump = 2;
1902         else if (params->frequency < 750000000) cpump = 1;
1903         else cpump = 3;
1904
1905         if (params->frequency < 175000000) band_select = 0x0e;
1906         else if (params->frequency < 470000000) band_select = 0x05;
1907         else band_select = 0x03;
1908
1909         data[0] = (div >> 8) & 0x7f;
1910         data[1] = div & 0xff;
1911         data[2] = ((div >> 10) & 0x60) | cfg;
1912         data[3] = (cpump << 6) | band_select;
1913
1914         if (fe->ops.i2c_gate_ctrl)
1915                 fe->ops.i2c_gate_ctrl(fe, 1);
1916         if (i2c_transfer (&av7110->i2c_adap, &msg, 1) != 1) return -EIO;
1917         return 0;
1918 }
1919
1920 static struct l64781_config grundig_29504_401_config = {
1921         .demod_address = 0x55,
1922 };
1923
1924
1925
1926 static int av7110_fe_lock_fix(struct av7110* av7110, fe_status_t status)
1927 {
1928         int ret = 0;
1929         int synced = (status & FE_HAS_LOCK) ? 1 : 0;
1930
1931         av7110->fe_status = status;
1932
1933         if (av7110->fe_synced == synced)
1934                 return 0;
1935
1936         if (av7110->playing) {
1937                 av7110->fe_synced = synced;
1938                 return 0;
1939         }
1940
1941         if (mutex_lock_interruptible(&av7110->pid_mutex))
1942                 return -ERESTARTSYS;
1943
1944         if (synced) {
1945                 ret = SetPIDs(av7110, av7110->pids[DMX_PES_VIDEO],
1946                         av7110->pids[DMX_PES_AUDIO],
1947                         av7110->pids[DMX_PES_TELETEXT], 0,
1948                         av7110->pids[DMX_PES_PCR]);
1949                 if (!ret)
1950                         ret = av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, Scan, 0);
1951         } else {
1952                 ret = SetPIDs(av7110, 0, 0, 0, 0, 0);
1953                 if (!ret) {
1954                         ret = av7110_fw_cmd(av7110, COMTYPE_PID_FILTER, FlushTSQueue, 0);
1955                         if (!ret)
1956                                 ret = av7110_wait_msgstate(av7110, GPMQBusy);
1957                 }
1958         }
1959
1960         if (!ret)
1961                 av7110->fe_synced = synced;
1962
1963         mutex_unlock(&av7110->pid_mutex);
1964         return ret;
1965 }
1966
1967 static int av7110_fe_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
1968 {
1969         struct av7110* av7110 = fe->dvb->priv;
1970
1971         int ret = av7110_fe_lock_fix(av7110, 0);
1972         if (!ret) {
1973                 av7110->saved_fe_params = *params;
1974                 ret = av7110->fe_set_frontend(fe, params);
1975         }
1976         return ret;
1977 }
1978
1979 static int av7110_fe_init(struct dvb_frontend* fe)
1980 {
1981         struct av7110* av7110 = fe->dvb->priv;
1982
1983         int ret = av7110_fe_lock_fix(av7110, 0);
1984         if (!ret)
1985                 ret = av7110->fe_init(fe);
1986         return ret;
1987 }
1988
1989 static int av7110_fe_read_status(struct dvb_frontend* fe, fe_status_t* status)
1990 {
1991         struct av7110* av7110 = fe->dvb->priv;
1992
1993         /* call the real implementation */
1994         int ret = av7110->fe_read_status(fe, status);
1995         if (!ret)
1996                 if (((*status ^ av7110->fe_status) & FE_HAS_LOCK) && (*status & FE_HAS_LOCK))
1997                         ret = av7110_fe_lock_fix(av7110, *status);
1998         return ret;
1999 }
2000
2001 static int av7110_fe_diseqc_reset_overload(struct dvb_frontend* fe)
2002 {
2003         struct av7110* av7110 = fe->dvb->priv;
2004
2005         int ret = av7110_fe_lock_fix(av7110, 0);
2006         if (!ret)
2007                 ret = av7110->fe_diseqc_reset_overload(fe);
2008         return ret;
2009 }
2010
2011 static int av7110_fe_diseqc_send_master_cmd(struct dvb_frontend* fe,
2012                                             struct dvb_diseqc_master_cmd* cmd)
2013 {
2014         struct av7110* av7110 = fe->dvb->priv;
2015
2016         int ret = av7110_fe_lock_fix(av7110, 0);
2017         if (!ret) {
2018                 av7110->saved_master_cmd = *cmd;
2019                 ret = av7110->fe_diseqc_send_master_cmd(fe, cmd);
2020         }
2021         return ret;
2022 }
2023
2024 static int av7110_fe_diseqc_send_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t minicmd)
2025 {
2026         struct av7110* av7110 = fe->dvb->priv;
2027
2028         int ret = av7110_fe_lock_fix(av7110, 0);
2029         if (!ret) {
2030                 av7110->saved_minicmd = minicmd;
2031                 ret = av7110->fe_diseqc_send_burst(fe, minicmd);
2032         }
2033         return ret;
2034 }
2035
2036 static int av7110_fe_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
2037 {
2038         struct av7110* av7110 = fe->dvb->priv;
2039
2040         int ret = av7110_fe_lock_fix(av7110, 0);
2041         if (!ret) {
2042                 av7110->saved_tone = tone;
2043                 ret = av7110->fe_set_tone(fe, tone);
2044         }
2045         return ret;
2046 }
2047
2048 static int av7110_fe_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage)
2049 {
2050         struct av7110* av7110 = fe->dvb->priv;
2051
2052         int ret = av7110_fe_lock_fix(av7110, 0);
2053         if (!ret) {
2054                 av7110->saved_voltage = voltage;
2055                 ret = av7110->fe_set_voltage(fe, voltage);
2056         }
2057         return ret;
2058 }
2059
2060 static int av7110_fe_dishnetwork_send_legacy_command(struct dvb_frontend* fe, unsigned long cmd)
2061 {
2062         struct av7110* av7110 = fe->dvb->priv;
2063
2064         int ret = av7110_fe_lock_fix(av7110, 0);
2065         if (!ret)
2066                 ret = av7110->fe_dishnetwork_send_legacy_command(fe, cmd);
2067         return ret;
2068 }
2069
2070 static void dvb_s_recover(struct av7110* av7110)
2071 {
2072         av7110_fe_init(av7110->fe);
2073
2074         av7110_fe_set_voltage(av7110->fe, av7110->saved_voltage);
2075         if (av7110->saved_master_cmd.msg_len) {
2076                 msleep(20);
2077                 av7110_fe_diseqc_send_master_cmd(av7110->fe, &av7110->saved_master_cmd);
2078         }
2079         msleep(20);
2080         av7110_fe_diseqc_send_burst(av7110->fe, av7110->saved_minicmd);
2081         msleep(20);
2082         av7110_fe_set_tone(av7110->fe, av7110->saved_tone);
2083
2084         av7110_fe_set_frontend(av7110->fe, &av7110->saved_fe_params);
2085 }
2086
2087 static u8 read_pwm(struct av7110* av7110)
2088 {
2089         u8 b = 0xff;
2090         u8 pwm;
2091         struct i2c_msg msg[] = { { .addr = 0x50,.flags = 0,.buf = &b,.len = 1 },
2092                                  { .addr = 0x50,.flags = I2C_M_RD,.buf = &pwm,.len = 1} };
2093
2094         if ((i2c_transfer(&av7110->i2c_adap, msg, 2) != 2) || (pwm == 0xff))
2095                 pwm = 0x48;
2096
2097         return pwm;
2098 }
2099
2100 static int frontend_init(struct av7110 *av7110)
2101 {
2102         int ret;
2103
2104         if (av7110->dev->pci->subsystem_vendor == 0x110a) {
2105                 switch(av7110->dev->pci->subsystem_device) {
2106                 case 0x0000: // Fujitsu/Siemens DVB-Cable (ves1820/Philips CD1516(??))
2107                         av7110->fe = dvb_attach(ves1820_attach, &philips_cd1516_config,
2108                                                     &av7110->i2c_adap, read_pwm(av7110));
2109                         if (av7110->fe) {
2110                                 av7110->fe->ops.tuner_ops.set_params = philips_cd1516_tuner_set_params;
2111                         }
2112                         break;
2113                 }
2114
2115         } else if (av7110->dev->pci->subsystem_vendor == 0x13c2) {
2116                 switch(av7110->dev->pci->subsystem_device) {
2117                 case 0x0000: // Hauppauge/TT WinTV DVB-S rev1.X
2118                 case 0x0003: // Hauppauge/TT WinTV Nexus-S Rev 2.X
2119                 case 0x1002: // Hauppauge/TT WinTV DVB-S rev1.3SE
2120
2121                         // try the ALPS BSRV2 first of all
2122                         av7110->fe = dvb_attach(ves1x93_attach, &alps_bsrv2_config, &av7110->i2c_adap);
2123                         if (av7110->fe) {
2124                                 av7110->fe->ops.tuner_ops.set_params = alps_bsrv2_tuner_set_params;
2125                                 av7110->fe->ops.diseqc_send_master_cmd = av7110_diseqc_send_master_cmd;
2126                                 av7110->fe->ops.diseqc_send_burst = av7110_diseqc_send_burst;
2127                                 av7110->fe->ops.set_tone = av7110_set_tone;
2128                                 av7110->recover = dvb_s_recover;
2129                                 break;
2130                         }
2131
2132                         // try the ALPS BSRU6 now
2133                         av7110->fe = dvb_attach(stv0299_attach, &alps_bsru6_config, &av7110->i2c_adap);
2134                         if (av7110->fe) {
2135                                 av7110->fe->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params;
2136                                 av7110->fe->tuner_priv = &av7110->i2c_adap;
2137
2138                                 av7110->fe->ops.diseqc_send_master_cmd = av7110_diseqc_send_master_cmd;
2139                                 av7110->fe->ops.diseqc_send_burst = av7110_diseqc_send_burst;
2140                                 av7110->fe->ops.set_tone = av7110_set_tone;
2141                                 av7110->recover = dvb_s_recover;
2142                                 break;
2143                         }
2144
2145                         // Try the grundig 29504-451
2146                         av7110->fe = dvb_attach(tda8083_attach, &grundig_29504_451_config, &av7110->i2c_adap);
2147                         if (av7110->fe) {
2148                                 av7110->fe->ops.tuner_ops.set_params = grundig_29504_451_tuner_set_params;
2149                                 av7110->fe->ops.diseqc_send_master_cmd = av7110_diseqc_send_master_cmd;
2150                                 av7110->fe->ops.diseqc_send_burst = av7110_diseqc_send_burst;
2151                                 av7110->fe->ops.set_tone = av7110_set_tone;
2152                                 av7110->recover = dvb_s_recover;
2153                                 break;
2154                         }
2155
2156                         /* Try DVB-C cards */
2157                         switch(av7110->dev->pci->subsystem_device) {
2158                         case 0x0000:
2159                                 /* Siemens DVB-C (full-length card) VES1820/Philips CD1516 */
2160                                 av7110->fe = dvb_attach(ves1820_attach, &philips_cd1516_config, &av7110->i2c_adap,
2161                                                         read_pwm(av7110));
2162                                 if (av7110->fe) {
2163                                         av7110->fe->ops.tuner_ops.set_params = philips_cd1516_tuner_set_params;
2164                                 }
2165                                 break;
2166                         case 0x0003:
2167                                 /* Hauppauge DVB-C 2.1 VES1820/ALPS TDBE2 */
2168                                 av7110->fe = dvb_attach(ves1820_attach, &alps_tdbe2_config, &av7110->i2c_adap,
2169                                                         read_pwm(av7110));
2170                                 if (av7110->fe) {
2171                                         av7110->fe->ops.tuner_ops.set_params = alps_tdbe2_tuner_set_params;
2172                                 }
2173                                 break;
2174                         }
2175                         break;
2176
2177                 case 0x0001: // Hauppauge/TT Nexus-T premium rev1.X
2178                         // try ALPS TDLB7 first, then Grundig 29504-401
2179                         av7110->fe = dvb_attach(sp8870_attach, &alps_tdlb7_config, &av7110->i2c_adap);
2180                         if (av7110->fe) {
2181                                 av7110->fe->ops.tuner_ops.set_params = alps_tdlb7_tuner_set_params;
2182                                 break;
2183                         }
2184                         /* fall-thru */
2185
2186                 case 0x0008: // Hauppauge/TT DVB-T
2187                         // Grundig 29504-401
2188                         av7110->fe = dvb_attach(l64781_attach, &grundig_29504_401_config, &av7110->i2c_adap);
2189                         if (av7110->fe)
2190                                 av7110->fe->ops.tuner_ops.set_params = grundig_29504_401_tuner_set_params;
2191                         break;
2192
2193                 case 0x0002: // Hauppauge/TT DVB-C premium rev2.X
2194
2195                         av7110->fe = dvb_attach(ves1820_attach, &alps_tdbe2_config, &av7110->i2c_adap, read_pwm(av7110));
2196                         if (av7110->fe) {
2197                                 av7110->fe->ops.tuner_ops.set_params = alps_tdbe2_tuner_set_params;
2198                         }
2199                         break;
2200
2201                 case 0x0004: // Galaxis DVB-S rev1.3
2202                         /* ALPS BSRV2 */
2203                         av7110->fe = dvb_attach(ves1x93_attach, &alps_bsrv2_config, &av7110->i2c_adap);
2204                         if (av7110->fe) {
2205                                 av7110->fe->ops.tuner_ops.set_params = alps_bsrv2_tuner_set_params;
2206                                 av7110->fe->ops.diseqc_send_master_cmd = av7110_diseqc_send_master_cmd;
2207                                 av7110->fe->ops.diseqc_send_burst = av7110_diseqc_send_burst;
2208                                 av7110->fe->ops.set_tone = av7110_set_tone;
2209                                 av7110->recover = dvb_s_recover;
2210                         }
2211                         break;
2212
2213                 case 0x0006: /* Fujitsu-Siemens DVB-S rev 1.6 */
2214                         /* Grundig 29504-451 */
2215                         av7110->fe = dvb_attach(tda8083_attach, &grundig_29504_451_config, &av7110->i2c_adap);
2216                         if (av7110->fe) {
2217                                 av7110->fe->ops.tuner_ops.set_params = grundig_29504_451_tuner_set_params;
2218                                 av7110->fe->ops.diseqc_send_master_cmd = av7110_diseqc_send_master_cmd;
2219                                 av7110->fe->ops.diseqc_send_burst = av7110_diseqc_send_burst;
2220                                 av7110->fe->ops.set_tone = av7110_set_tone;
2221                                 av7110->recover = dvb_s_recover;
2222                         }
2223                         break;
2224
2225                 case 0x000A: // Hauppauge/TT Nexus-CA rev1.X
2226
2227                         av7110->fe = dvb_attach(stv0297_attach, &nexusca_stv0297_config, &av7110->i2c_adap);
2228                         if (av7110->fe) {
2229                                 av7110->fe->ops.tuner_ops.set_params = nexusca_stv0297_tuner_set_params;
2230
2231                                 /* set TDA9819 into DVB mode */
2232                                 saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD)
2233                                 saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF)
2234
2235                                 /* tuner on this needs a slower i2c bus speed */
2236                                 av7110->dev->i2c_bitrate = SAA7146_I2C_BUS_BIT_RATE_240;
2237                                 break;
2238                         }
2239                         break;
2240
2241                 case 0x000E: /* Hauppauge/TT Nexus-S rev 2.3 */
2242                         /* ALPS BSBE1 */
2243                         av7110->fe = dvb_attach(stv0299_attach, &alps_bsbe1_config, &av7110->i2c_adap);
2244                         if (av7110->fe) {
2245                                 av7110->fe->ops.tuner_ops.set_params = alps_bsbe1_tuner_set_params;
2246                                 av7110->fe->tuner_priv = &av7110->i2c_adap;
2247
2248                                 if (dvb_attach(lnbp21_attach, av7110->fe, &av7110->i2c_adap, 0, 0) == NULL) {
2249                                         printk("dvb-ttpci: LNBP21 not found!\n");
2250                                         if (av7110->fe->ops.release)
2251                                                 av7110->fe->ops.release(av7110->fe);
2252                                         av7110->fe = NULL;
2253                                 } else {
2254                                         av7110->fe->ops.dishnetwork_send_legacy_command = NULL;
2255                                         av7110->recover = dvb_s_recover;
2256                                 }
2257                         }
2258                         break;
2259                 }
2260         }
2261
2262         if (!av7110->fe) {
2263                 /* FIXME: propagate the failure code from the lower layers */
2264                 ret = -ENOMEM;
2265                 printk("dvb-ttpci: A frontend driver was not found for device [%04x:%04x] subsystem [%04x:%04x]\n",
2266                        av7110->dev->pci->vendor,
2267                        av7110->dev->pci->device,
2268                        av7110->dev->pci->subsystem_vendor,
2269                        av7110->dev->pci->subsystem_device);
2270         } else {
2271                 FE_FUNC_OVERRIDE(av7110->fe->ops.init, av7110->fe_init, av7110_fe_init);
2272                 FE_FUNC_OVERRIDE(av7110->fe->ops.read_status, av7110->fe_read_status, av7110_fe_read_status);
2273                 FE_FUNC_OVERRIDE(av7110->fe->ops.diseqc_reset_overload, av7110->fe_diseqc_reset_overload, av7110_fe_diseqc_reset_overload);
2274                 FE_FUNC_OVERRIDE(av7110->fe->ops.diseqc_send_master_cmd, av7110->fe_diseqc_send_master_cmd, av7110_fe_diseqc_send_master_cmd);
2275                 FE_FUNC_OVERRIDE(av7110->fe->ops.diseqc_send_burst, av7110->fe_diseqc_send_burst, av7110_fe_diseqc_send_burst);
2276                 FE_FUNC_OVERRIDE(av7110->fe->ops.set_tone, av7110->fe_set_tone, av7110_fe_set_tone);
2277                 FE_FUNC_OVERRIDE(av7110->fe->ops.set_voltage, av7110->fe_set_voltage, av7110_fe_set_voltage);
2278                 FE_FUNC_OVERRIDE(av7110->fe->ops.dishnetwork_send_legacy_command, av7110->fe_dishnetwork_send_legacy_command, av7110_fe_dishnetwork_send_legacy_command);
2279                 FE_FUNC_OVERRIDE(av7110->fe->ops.set_frontend, av7110->fe_set_frontend, av7110_fe_set_frontend);
2280
2281                 ret = dvb_register_frontend(&av7110->dvb_adapter, av7110->fe);
2282                 if (ret < 0) {
2283                         printk("av7110: Frontend registration failed!\n");
2284                         dvb_frontend_detach(av7110->fe);
2285                         av7110->fe = NULL;
2286                 }
2287         }
2288         return ret;
2289 }
2290
2291 /* Budgetpatch note:
2292  * Original hardware design by Roberto Deza:
2293  * There is a DVB_Wiki at
2294  * http://www.linuxtv.org/
2295  *
2296  * New software triggering design by Emard that works on
2297  * original Roberto Deza's hardware:
2298  *
2299  * rps1 code for budgetpatch will copy internal HS event to GPIO3 pin.
2300  * GPIO3 is in budget-patch hardware connectd to port B VSYNC
2301  * HS is an internal event of 7146, accessible with RPS
2302  * and temporarily raised high every n lines
2303  * (n in defined in the RPS_THRESH1 counter threshold)
2304  * I think HS is raised high on the beginning of the n-th line
2305  * and remains high until this n-th line that triggered
2306  * it is completely received. When the receiption of n-th line
2307  * ends, HS is lowered.
2308  *
2309  * To transmit data over DMA, 7146 needs changing state at
2310  * port B VSYNC pin. Any changing of port B VSYNC will
2311  * cause some DMA data transfer, with more or less packets loss.
2312  * It depends on the phase and frequency of VSYNC and
2313  * the way of 7146 is instructed to trigger on port B (defined
2314  * in DD1_INIT register, 3rd nibble from the right valid
2315  * numbers are 0-7, see datasheet)
2316  *
2317  * The correct triggering can minimize packet loss,
2318  * dvbtraffic should give this stable bandwidths:
2319  *   22k transponder = 33814 kbit/s
2320  * 27.5k transponder = 38045 kbit/s
2321  * by experiment it is found that the best results
2322  * (stable bandwidths and almost no packet loss)
2323  * are obtained using DD1_INIT triggering number 2
2324  * (Va at rising edge of VS Fa = HS x VS-failing forced toggle)
2325  * and a VSYNC phase that occurs in the middle of DMA transfer
2326  * (about byte 188*512=96256 in the DMA window).
2327  *
2328  * Phase of HS is still not clear to me how to control,
2329  * It just happens to be so. It can be seen if one enables
2330  * RPS_IRQ and print Event Counter 1 in vpeirq(). Every
2331  * time RPS_INTERRUPT is called, the Event Counter 1 will
2332  * increment. That's how the 7146 is programmed to do event
2333  * counting in this budget-patch.c
2334  * I *think* HPS setting has something to do with the phase
2335  * of HS but I can't be 100% sure in that.
2336  *
2337  * hardware debug note: a working budget card (including budget patch)
2338  * with vpeirq() interrupt setup in mode "0x90" (every 64K) will
2339  * generate 3 interrupts per 25-Hz DMA frame of 2*188*512 bytes
2340  * and that means 3*25=75 Hz of interrupt freqency, as seen by
2341  * watch cat /proc/interrupts
2342  *
2343  * If this frequency is 3x lower (and data received in the DMA
2344  * buffer don't start with 0x47, but in the middle of packets,
2345  * whose lengths appear to be like 188 292 188 104 etc.
2346  * this means VSYNC line is not connected in the hardware.
2347  * (check soldering pcb and pins)
2348  * The same behaviour of missing VSYNC can be duplicated on budget
2349  * cards, by seting DD1_INIT trigger mode 7 in 3rd nibble.
2350  */
2351 static int __devinit av7110_attach(struct saa7146_dev* dev,
2352                                    struct saa7146_pci_extension_data *pci_ext)
2353 {
2354         const int length = TS_WIDTH * TS_HEIGHT;
2355         struct pci_dev *pdev = dev->pci;
2356         struct av7110 *av7110;
2357         struct task_struct *thread;
2358         int ret, count = 0;
2359
2360         dprintk(4, "dev: %p\n", dev);
2361
2362         /* Set RPS_IRQ to 1 to track rps1 activity.
2363          * Enabling this won't send any interrupt to PC CPU.
2364          */
2365 #define RPS_IRQ 0
2366
2367         if (budgetpatch == 1) {
2368                 budgetpatch = 0;
2369                 /* autodetect the presence of budget patch
2370                  * this only works if saa7146 has been recently
2371                  * reset with with MASK_31 to MC1
2372                  *
2373                  * will wait for VBI_B event (vertical blank at port B)
2374                  * and will reset GPIO3 after VBI_B is detected.
2375                  * (GPIO3 should be raised high by CPU to
2376                  * test if GPIO3 will generate vertical blank signal
2377                  * in budget patch GPIO3 is connected to VSYNC_B
2378                  */
2379
2380                 /* RESET SAA7146 */
2381                 saa7146_write(dev, MC1, MASK_31);
2382                 /* autodetection success seems to be time-dependend after reset */
2383
2384                 /* Fix VSYNC level */
2385                 saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
2386                 /* set vsync_b triggering */
2387                 saa7146_write(dev, DD1_STREAM_B, 0);
2388                 /* port B VSYNC at rising edge */
2389                 saa7146_write(dev, DD1_INIT, 0x00000200);
2390                 saa7146_write(dev, BRS_CTRL, 0x00000000);  // VBI
2391                 saa7146_write(dev, MC2,
2392                               1 * (MASK_08 | MASK_24)  |   // BRS control
2393                               0 * (MASK_09 | MASK_25)  |   // a
2394                               1 * (MASK_10 | MASK_26)  |   // b
2395                               0 * (MASK_06 | MASK_22)  |   // HPS_CTRL1
2396                               0 * (MASK_05 | MASK_21)  |   // HPS_CTRL2
2397                               0 * (MASK_01 | MASK_15)      // DEBI
2398                 );
2399
2400                 /* start writing RPS1 code from beginning */
2401                 count = 0;
2402                 /* Disable RPS1 */
2403                 saa7146_write(dev, MC1, MASK_29);
2404                 /* RPS1 timeout disable */
2405                 saa7146_write(dev, RPS_TOV1, 0);
2406                 WRITE_RPS1(CMD_PAUSE | EVT_VBI_B);
2407                 WRITE_RPS1(CMD_WR_REG_MASK | (GPIO_CTRL>>2));
2408                 WRITE_RPS1(GPIO3_MSK);
2409                 WRITE_RPS1(SAA7146_GPIO_OUTLO<<24);
2410 #if RPS_IRQ
2411                 /* issue RPS1 interrupt to increment counter */
2412                 WRITE_RPS1(CMD_INTERRUPT);
2413 #endif
2414                 WRITE_RPS1(CMD_STOP);
2415                 /* Jump to begin of RPS program as safety measure               (p37) */
2416                 WRITE_RPS1(CMD_JUMP);
2417                 WRITE_RPS1(dev->d_rps1.dma_handle);
2418
2419 #if RPS_IRQ
2420                 /* set event counter 1 source as RPS1 interrupt (0x03)          (rE4 p53)
2421                  * use 0x03 to track RPS1 interrupts - increase by 1 every gpio3 is toggled
2422                  * use 0x15 to track VPE  interrupts - increase by 1 every vpeirq() is called
2423                  */
2424                 saa7146_write(dev, EC1SSR, (0x03<<2) | 3 );
2425                 /* set event counter 1 threshold to maximum allowed value        (rEC p55) */
2426                 saa7146_write(dev, ECT1R,  0x3fff );
2427 #endif
2428                 /* Set RPS1 Address register to point to RPS code               (r108 p42) */
2429                 saa7146_write(dev, RPS_ADDR1, dev->d_rps1.dma_handle);
2430                 /* Enable RPS1,                                                 (rFC p33) */
2431                 saa7146_write(dev, MC1, (MASK_13 | MASK_29 ));
2432
2433                 mdelay(10);
2434                 /* now send VSYNC_B to rps1 by rising GPIO3 */
2435                 saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI);
2436                 mdelay(10);
2437                 /* if rps1 responded by lowering the GPIO3,
2438                  * then we have budgetpatch hardware
2439                  */
2440                 if ((saa7146_read(dev, GPIO_CTRL) & 0x10000000) == 0) {
2441                         budgetpatch = 1;
2442                         printk("dvb-ttpci: BUDGET-PATCH DETECTED.\n");
2443                 }
2444                 /* Disable RPS1 */
2445                 saa7146_write(dev, MC1, ( MASK_29 ));
2446 #if RPS_IRQ
2447                 printk("dvb-ttpci: Event Counter 1 0x%04x\n", saa7146_read(dev, EC1R) & 0x3fff );
2448 #endif
2449         }
2450
2451         /* prepare the av7110 device struct */
2452         av7110 = kzalloc(sizeof(struct av7110), GFP_KERNEL);
2453         if (!av7110) {
2454                 dprintk(1, "out of memory\n");
2455                 return -ENOMEM;
2456         }
2457
2458         av7110->card_name = (char*) pci_ext->ext_priv;
2459         av7110->dev = dev;
2460         dev->ext_priv = av7110;
2461
2462         ret = get_firmware(av7110);
2463         if (ret < 0)
2464                 goto err_kfree_0;
2465
2466         ret = dvb_register_adapter(&av7110->dvb_adapter, av7110->card_name,
2467                                    THIS_MODULE, &dev->pci->dev, adapter_nr);
2468         if (ret < 0)
2469                 goto err_put_firmware_1;
2470
2471         /* the Siemens DVB needs this if you want to have the i2c chips
2472            get recognized before the main driver is fully loaded */
2473         saa7146_write(dev, GPIO_CTRL, 0x500000);
2474
2475         strlcpy(av7110->i2c_adap.name, pci_ext->ext_priv, sizeof(av7110->i2c_adap.name));
2476
2477         saa7146_i2c_adapter_prepare(dev, &av7110->i2c_adap, SAA7146_I2C_BUS_BIT_RATE_120); /* 275 kHz */
2478
2479         ret = i2c_add_adapter(&av7110->i2c_adap);
2480         if (ret < 0)
2481                 goto err_dvb_unregister_adapter_2;
2482
2483         ttpci_eeprom_parse_mac(&av7110->i2c_adap,
2484                                av7110->dvb_adapter.proposed_mac);
2485         ret = -ENOMEM;
2486
2487         /* full-ts mod? */
2488         if (full_ts)
2489                 av7110->full_ts = true;
2490
2491         /* check for full-ts flag in eeprom */
2492         if (i2c_readreg(av7110, 0xaa, 0) == 0x4f && i2c_readreg(av7110, 0xaa, 1) == 0x45) {
2493                 u8 flags = i2c_readreg(av7110, 0xaa, 2);
2494                 if (flags != 0xff && (flags & 0x01))
2495                         av7110->full_ts = true;
2496         }
2497
2498         if (av7110->full_ts) {
2499                 printk(KERN_INFO "dvb-ttpci: full-ts mode enabled for saa7146 port B\n");
2500                 spin_lock_init(&av7110->feedlock1);
2501                 av7110->grabbing = saa7146_vmalloc_build_pgtable(pdev, length,
2502                                                                  &av7110->pt);
2503                 if (!av7110->grabbing)
2504                         goto err_i2c_del_3;
2505
2506                 saa7146_write(dev, DD1_STREAM_B, 0x00000000);
2507                 saa7146_write(dev, MC2, (MASK_10 | MASK_26));
2508
2509                 saa7146_write(dev, DD1_INIT, 0x00000600);
2510                 saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
2511
2512                 saa7146_write(dev, BRS_CTRL, 0x60000000);
2513                 saa7146_write(dev, MC2, MASK_08 | MASK_24);
2514
2515                 /* dma3 */
2516                 saa7146_write(dev, PCI_BT_V1, 0x001c0000 | (saa7146_read(dev, PCI_BT_V1) & ~0x001f0000));
2517                 saa7146_write(dev, BASE_ODD3, 0);
2518                 saa7146_write(dev, BASE_EVEN3, 0);
2519                 saa7146_write(dev, PROT_ADDR3, TS_WIDTH * TS_HEIGHT);
2520                 saa7146_write(dev, PITCH3, TS_WIDTH);
2521                 saa7146_write(dev, BASE_PAGE3, av7110->pt.dma | ME1 | 0x90);
2522                 saa7146_write(dev, NUM_LINE_BYTE3, (TS_HEIGHT << 16) | TS_WIDTH);
2523                 saa7146_write(dev, MC2, MASK_04 | MASK_20);
2524
2525                 tasklet_init(&av7110->vpe_tasklet, vpeirq, (unsigned long) av7110);
2526
2527         } else if (budgetpatch) {
2528                 spin_lock_init(&av7110->feedlock1);
2529                 av7110->grabbing = saa7146_vmalloc_build_pgtable(pdev, length,
2530                                                                  &av7110->pt);
2531                 if (!av7110->grabbing)
2532                         goto err_i2c_del_3;
2533
2534                 saa7146_write(dev, PCI_BT_V1, 0x1c1f101f);
2535                 saa7146_write(dev, BCS_CTRL, 0x80400040);
2536                 /* set dd1 stream a & b */
2537                 saa7146_write(dev, DD1_STREAM_B, 0x00000000);
2538                 saa7146_write(dev, DD1_INIT, 0x03000200);
2539                 saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
2540                 saa7146_write(dev, BRS_CTRL, 0x60000000);
2541                 saa7146_write(dev, BASE_ODD3, 0);
2542                 saa7146_write(dev, BASE_EVEN3, 0);
2543                 saa7146_write(dev, PROT_ADDR3, TS_WIDTH * TS_HEIGHT);
2544                 saa7146_write(dev, BASE_PAGE3, av7110->pt.dma | ME1 | 0x90);
2545
2546                 saa7146_write(dev, PITCH3, TS_WIDTH);
2547                 saa7146_write(dev, NUM_LINE_BYTE3, (TS_HEIGHT << 16) | TS_WIDTH);
2548
2549                 /* upload all */
2550                 saa7146_write(dev, MC2, 0x077c077c);
2551                 saa7146_write(dev, GPIO_CTRL, 0x000000);
2552 #if RPS_IRQ
2553                 /* set event counter 1 source as RPS1 interrupt (0x03)          (rE4 p53)
2554                  * use 0x03 to track RPS1 interrupts - increase by 1 every gpio3 is toggled
2555                  * use 0x15 to track VPE  interrupts - increase by 1 every vpeirq() is called
2556                  */
2557                 saa7146_write(dev, EC1SSR, (0x03<<2) | 3 );
2558                 /* set event counter 1 threshold to maximum allowed value        (rEC p55) */
2559                 saa7146_write(dev, ECT1R,  0x3fff );
2560 #endif
2561                 /* Setup BUDGETPATCH MAIN RPS1 "program" (p35) */
2562                 count = 0;
2563
2564                 /* Wait Source Line Counter Threshold                           (p36) */
2565                 WRITE_RPS1(CMD_PAUSE | EVT_HS);
2566                 /* Set GPIO3=1                                                  (p42) */
2567                 WRITE_RPS1(CMD_WR_REG_MASK | (GPIO_CTRL>>2));
2568                 WRITE_RPS1(GPIO3_MSK);
2569                 WRITE_RPS1(SAA7146_GPIO_OUTHI<<24);
2570 #if RPS_IRQ
2571                 /* issue RPS1 interrupt */
2572                 WRITE_RPS1(CMD_INTERRUPT);
2573 #endif
2574                 /* Wait reset Source Line Counter Threshold                     (p36) */
2575                 WRITE_RPS1(CMD_PAUSE | RPS_INV | EVT_HS);
2576                 /* Set GPIO3=0                                                  (p42) */
2577                 WRITE_RPS1(CMD_WR_REG_MASK | (GPIO_CTRL>>2));
2578                 WRITE_RPS1(GPIO3_MSK);
2579                 WRITE_RPS1(SAA7146_GPIO_OUTLO<<24);
2580 #if RPS_IRQ
2581                 /* issue RPS1 interrupt */
2582                 WRITE_RPS1(CMD_INTERRUPT);
2583 #endif
2584                 /* Jump to begin of RPS program                                 (p37) */
2585                 WRITE_RPS1(CMD_JUMP);
2586                 WRITE_RPS1(dev->d_rps1.dma_handle);
2587
2588                 /* Fix VSYNC level */
2589                 saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
2590                 /* Set RPS1 Address register to point to RPS code               (r108 p42) */
2591                 saa7146_write(dev, RPS_ADDR1, dev->d_rps1.dma_handle);
2592                 /* Set Source Line Counter Threshold, using BRS                 (rCC p43)
2593                  * It generates HS event every TS_HEIGHT lines
2594                  * this is related to TS_WIDTH set in register
2595                  * NUM_LINE_BYTE3. If NUM_LINE_BYTE low 16 bits
2596                  * are set to TS_WIDTH bytes (TS_WIDTH=2*188),
2597                  * then RPS_THRESH1 should be set to trigger
2598                  * every TS_HEIGHT (512) lines.
2599                  */
2600                 saa7146_write(dev, RPS_THRESH1, (TS_HEIGHT*1) | MASK_12 );
2601
2602                 /* Enable RPS1                                                  (rFC p33) */
2603                 saa7146_write(dev, MC1, (MASK_13 | MASK_29));
2604
2605                 /* end of budgetpatch register initialization */
2606                 tasklet_init (&av7110->vpe_tasklet,  vpeirq,  (unsigned long) av7110);
2607         } else {
2608                 saa7146_write(dev, PCI_BT_V1, 0x1c00101f);
2609                 saa7146_write(dev, BCS_CTRL, 0x80400040);
2610
2611                 /* set dd1 stream a & b */
2612                 saa7146_write(dev, DD1_STREAM_B, 0x00000000);
2613                 saa7146_write(dev, DD1_INIT, 0x03000000);
2614                 saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
2615
2616                 /* upload all */
2617                 saa7146_write(dev, MC2, 0x077c077c);
2618                 saa7146_write(dev, GPIO_CTRL, 0x000000);
2619         }
2620
2621         tasklet_init (&av7110->debi_tasklet, debiirq, (unsigned long) av7110);
2622         tasklet_init (&av7110->gpio_tasklet, gpioirq, (unsigned long) av7110);
2623
2624         mutex_init(&av7110->pid_mutex);
2625
2626         /* locks for data transfers from/to AV7110 */
2627         spin_lock_init(&av7110->debilock);
2628         mutex_init(&av7110->dcomlock);
2629         av7110->debitype = -1;
2630
2631         /* default OSD window */
2632         av7110->osdwin = 1;
2633         mutex_init(&av7110->osd_mutex);
2634
2635         /* TV standard */
2636         av7110->vidmode = tv_standard == 1 ? AV7110_VIDEO_MODE_NTSC
2637                                            : AV7110_VIDEO_MODE_PAL;
2638
2639         /* ARM "watchdog" */
2640         init_waitqueue_head(&av7110->arm_wait);
2641         av7110->arm_thread = NULL;
2642
2643         /* allocate and init buffers */
2644         av7110->debi_virt = pci_alloc_consistent(pdev, 8192, &av7110->debi_bus);
2645         if (!av7110->debi_virt)
2646                 goto err_saa71466_vfree_4;
2647
2648
2649         av7110->iobuf = vmalloc(AVOUTLEN+AOUTLEN+BMPLEN+4*IPACKS);
2650         if (!av7110->iobuf)
2651                 goto err_pci_free_5;
2652
2653         ret = av7110_av_init(av7110);
2654         if (ret < 0)
2655                 goto err_iobuf_vfree_6;
2656
2657         /* init BMP buffer */
2658         av7110->bmpbuf = av7110->iobuf+AVOUTLEN+AOUTLEN;
2659         init_waitqueue_head(&av7110->bmpq);
2660
2661         ret = av7110_ca_init(av7110);
2662         if (ret < 0)
2663                 goto err_av7110_av_exit_7;
2664
2665         /* load firmware into AV7110 cards */
2666         ret = av7110_bootarm(av7110);
2667         if (ret < 0)
2668                 goto err_av7110_ca_exit_8;
2669
2670         ret = av7110_firmversion(av7110);
2671         if (ret < 0)
2672                 goto err_stop_arm_9;
2673
2674         if (FW_VERSION(av7110->arm_app)<0x2501)
2675                 printk ("dvb-ttpci: Warning, firmware version 0x%04x is too old. "
2676                         "System might be unstable!\n", FW_VERSION(av7110->arm_app));
2677
2678         thread = kthread_run(arm_thread, (void *) av7110, "arm_mon");
2679         if (IS_ERR(thread)) {
2680                 ret = PTR_ERR(thread);
2681                 goto err_stop_arm_9;
2682         }
2683         av7110->arm_thread = thread;
2684
2685         /* set initial volume in mixer struct */
2686         av7110->mixer.volume_left  = volume;
2687         av7110->mixer.volume_right = volume;
2688
2689         ret = av7110_register(av7110);
2690         if (ret < 0)
2691                 goto err_arm_thread_stop_10;
2692
2693         init_av7110_av(av7110);
2694
2695         /* special case DVB-C: these cards have an analog tuner
2696            plus need some special handling, so we have separate
2697            saa7146_ext_vv data for these... */
2698         ret = av7110_init_v4l(av7110);
2699         if (ret < 0)
2700                 goto err_av7110_unregister_11;
2701
2702         av7110->dvb_adapter.priv = av7110;
2703         ret = frontend_init(av7110);
2704         if (ret < 0)
2705                 goto err_av7110_exit_v4l_12;
2706
2707 #if defined(CONFIG_INPUT_EVDEV) || defined(CONFIG_INPUT_EVDEV_MODULE)
2708         av7110_ir_init(av7110);
2709 #endif
2710         printk(KERN_INFO "dvb-ttpci: found av7110-%d.\n", av7110_num);
2711         av7110_num++;
2712 out:
2713         return ret;
2714
2715 err_av7110_exit_v4l_12:
2716         av7110_exit_v4l(av7110);
2717 err_av7110_unregister_11:
2718         dvb_unregister(av7110);
2719 err_arm_thread_stop_10:
2720         av7110_arm_sync(av7110);
2721 err_stop_arm_9:
2722         /* Nothing to do. Rejoice. */
2723 err_av7110_ca_exit_8:
2724         av7110_ca_exit(av7110);
2725 err_av7110_av_exit_7:
2726         av7110_av_exit(av7110);
2727 err_iobuf_vfree_6:
2728         vfree(av7110->iobuf);
2729 err_pci_free_5:
2730         pci_free_consistent(pdev, 8192, av7110->debi_virt, av7110->debi_bus);
2731 err_saa71466_vfree_4:
2732         if (av7110->grabbing)
2733                 saa7146_vfree_destroy_pgtable(pdev, av7110->grabbing, &av7110->pt);
2734 err_i2c_del_3:
2735         i2c_del_adapter(&av7110->i2c_adap);
2736 err_dvb_unregister_adapter_2:
2737         dvb_unregister_adapter(&av7110->dvb_adapter);
2738 err_put_firmware_1:
2739         put_firmware(av7110);
2740 err_kfree_0:
2741         kfree(av7110);
2742         goto out;
2743 }
2744
2745 static int __devexit av7110_detach(struct saa7146_dev* saa)
2746 {
2747         struct av7110 *av7110 = saa->ext_priv;
2748         dprintk(4, "%p\n", av7110);
2749
2750 #if defined(CONFIG_INPUT_EVDEV) || defined(CONFIG_INPUT_EVDEV_MODULE)
2751         av7110_ir_exit(av7110);
2752 #endif
2753         if (budgetpatch || av7110->full_ts) {
2754                 if (budgetpatch) {
2755                         /* Disable RPS1 */
2756                         saa7146_write(saa, MC1, MASK_29);
2757                         /* VSYNC LOW (inactive) */
2758                         saa7146_setgpio(saa, 3, SAA7146_GPIO_OUTLO);
2759                 }
2760                 saa7146_write(saa, MC1, MASK_20);       /* DMA3 off */
2761                 SAA7146_IER_DISABLE(saa, MASK_10);
2762                 SAA7146_ISR_CLEAR(saa, MASK_10);
2763                 msleep(50);
2764                 tasklet_kill(&av7110->vpe_tasklet);
2765                 saa7146_vfree_destroy_pgtable(saa->pci, av7110->grabbing, &av7110->pt);
2766         }
2767         av7110_exit_v4l(av7110);
2768
2769         av7110_arm_sync(av7110);
2770
2771         tasklet_kill(&av7110->debi_tasklet);
2772         tasklet_kill(&av7110->gpio_tasklet);
2773
2774         dvb_unregister(av7110);
2775
2776         SAA7146_IER_DISABLE(saa, MASK_19 | MASK_03);
2777         SAA7146_ISR_CLEAR(saa, MASK_19 | MASK_03);
2778
2779         av7110_ca_exit(av7110);
2780         av7110_av_exit(av7110);
2781
2782         vfree(av7110->iobuf);
2783         pci_free_consistent(saa->pci, 8192, av7110->debi_virt,
2784                             av7110->debi_bus);
2785
2786         i2c_del_adapter(&av7110->i2c_adap);
2787
2788         dvb_unregister_adapter (&av7110->dvb_adapter);
2789
2790         av7110_num--;
2791
2792         put_firmware(av7110);
2793
2794         kfree(av7110);
2795
2796         saa->ext_priv = NULL;
2797
2798         return 0;
2799 }
2800
2801
2802 static void av7110_irq(struct saa7146_dev* dev, u32 *isr)
2803 {
2804         struct av7110 *av7110 = dev->ext_priv;
2805
2806         //print_time("av7110_irq");
2807
2808         /* Note: Don't try to handle the DEBI error irq (MASK_18), in
2809          * intel mode the timeout is asserted all the time...
2810          */
2811
2812         if (*isr & MASK_19) {
2813                 //printk("av7110_irq: DEBI\n");
2814                 /* Note 1: The DEBI irq is level triggered: We must enable it
2815                  * only after we started a DMA xfer, and disable it here
2816                  * immediately, or it will be signalled all the time while
2817                  * DEBI is idle.
2818                  * Note 2: You would think that an irq which is masked is
2819                  * not signalled by the hardware. Not so for the SAA7146:
2820                  * An irq is signalled as long as the corresponding bit
2821                  * in the ISR is set, and disabling irqs just prevents the
2822                  * hardware from setting the ISR bit. This means a) that we
2823                  * must clear the ISR *after* disabling the irq (which is why
2824                  * we must do it here even though saa7146_core did it already),
2825                  * and b) that if we were to disable an edge triggered irq
2826                  * (like the gpio irqs sadly are) temporarily we would likely
2827                  * loose some. This sucks :-(
2828                  */
2829                 SAA7146_IER_DISABLE(av7110->dev, MASK_19);
2830                 SAA7146_ISR_CLEAR(av7110->dev, MASK_19);
2831                 tasklet_schedule(&av7110->debi_tasklet);
2832         }
2833
2834         if (*isr & MASK_03) {
2835                 //printk("av7110_irq: GPIO\n");
2836                 tasklet_schedule(&av7110->gpio_tasklet);
2837         }
2838
2839         if (*isr & MASK_10)
2840                 tasklet_schedule(&av7110->vpe_tasklet);
2841 }
2842
2843
2844 static struct saa7146_extension av7110_extension_driver;
2845
2846 #define MAKE_AV7110_INFO(x_var,x_name) \
2847 static struct saa7146_pci_extension_data x_var = { \
2848         .ext_priv = x_name, \
2849         .ext = &av7110_extension_driver }
2850
2851 MAKE_AV7110_INFO(tts_1_X_fsc,"Technotrend/Hauppauge WinTV DVB-S rev1.X or Fujitsu Siemens DVB-C");
2852 MAKE_AV7110_INFO(ttt_1_X,    "Technotrend/Hauppauge WinTV DVB-T rev1.X");
2853 MAKE_AV7110_INFO(ttc_1_X,    "Technotrend/Hauppauge WinTV Nexus-CA rev1.X");
2854 MAKE_AV7110_INFO(ttc_2_X,    "Technotrend/Hauppauge WinTV DVB-C rev2.X");
2855 MAKE_AV7110_INFO(tts_2_X,    "Technotrend/Hauppauge WinTV Nexus-S rev2.X");
2856 MAKE_AV7110_INFO(tts_2_3,    "Technotrend/Hauppauge WinTV Nexus-S rev2.3");
2857 MAKE_AV7110_INFO(tts_1_3se,  "Technotrend/Hauppauge WinTV DVB-S rev1.3 SE");
2858 MAKE_AV7110_INFO(ttt,        "Technotrend/Hauppauge DVB-T");
2859 MAKE_AV7110_INFO(fsc,        "Fujitsu Siemens DVB-C");
2860 MAKE_AV7110_INFO(fss,        "Fujitsu Siemens DVB-S rev1.6");
2861 MAKE_AV7110_INFO(gxs_1_3,    "Galaxis DVB-S rev1.3");
2862
2863 static struct pci_device_id pci_tbl[] = {
2864         MAKE_EXTENSION_PCI(fsc,         0x110a, 0x0000),
2865         MAKE_EXTENSION_PCI(tts_1_X_fsc, 0x13c2, 0x0000),
2866         MAKE_EXTENSION_PCI(ttt_1_X,     0x13c2, 0x0001),
2867         MAKE_EXTENSION_PCI(ttc_2_X,     0x13c2, 0x0002),
2868         MAKE_EXTENSION_PCI(tts_2_X,     0x13c2, 0x0003),
2869         MAKE_EXTENSION_PCI(gxs_1_3,     0x13c2, 0x0004),
2870         MAKE_EXTENSION_PCI(fss,         0x13c2, 0x0006),
2871         MAKE_EXTENSION_PCI(ttt,         0x13c2, 0x0008),
2872         MAKE_EXTENSION_PCI(ttc_1_X,     0x13c2, 0x000a),
2873         MAKE_EXTENSION_PCI(tts_2_3,     0x13c2, 0x000e),
2874         MAKE_EXTENSION_PCI(tts_1_3se,   0x13c2, 0x1002),
2875
2876 /*      MAKE_EXTENSION_PCI(???, 0x13c2, 0x0005), UNDEFINED CARD */ // Technisat SkyStar1
2877 /*      MAKE_EXTENSION_PCI(???, 0x13c2, 0x0009), UNDEFINED CARD */ // TT/Hauppauge WinTV Nexus-CA v????
2878
2879         {
2880                 .vendor    = 0,
2881         }
2882 };
2883
2884 MODULE_DEVICE_TABLE(pci, pci_tbl);
2885
2886
2887 static struct saa7146_extension av7110_extension_driver = {
2888         .name           = "av7110",
2889         .flags          = SAA7146_USE_I2C_IRQ,
2890
2891         .module         = THIS_MODULE,
2892         .pci_tbl        = &pci_tbl[0],
2893         .attach         = av7110_attach,
2894         .detach         = __devexit_p(av7110_detach),
2895
2896         .irq_mask       = MASK_19 | MASK_03 | MASK_10,
2897         .irq_func       = av7110_irq,
2898 };
2899
2900
2901 static int __init av7110_init(void)
2902 {
2903         int retval;
2904         retval = saa7146_register_extension(&av7110_extension_driver);
2905         return retval;
2906 }
2907
2908
2909 static void __exit av7110_exit(void)
2910 {
2911         saa7146_unregister_extension(&av7110_extension_driver);
2912 }
2913
2914 module_init(av7110_init);
2915 module_exit(av7110_exit);
2916
2917 MODULE_DESCRIPTION("driver for the SAA7146 based AV110 PCI DVB cards by "
2918                    "Siemens, Technotrend, Hauppauge");
2919 MODULE_AUTHOR("Ralph Metzler, Marcus Metzler, others");
2920 MODULE_LICENSE("GPL");