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