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