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