x86/amd-iommu: Add function to complete a tlb flush
[linux/fpc-iii.git] / drivers / media / dvb / ttusb-budget / dvb-ttusb-budget.c
blob4a3f2b8ea37d448a6cb0f062cc089e2d63114ff7
1 /*
2 * TTUSB DVB driver
4 * Copyright (c) 2002 Holger Waechtler <holger@convergence.de>
5 * Copyright (c) 2003 Felix Domke <tmbinc@elitedvb.net>
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation; either version 2 of
10 * the License, or (at your option) any later version.
12 #include <linux/init.h>
13 #include <linux/slab.h>
14 #include <linux/wait.h>
15 #include <linux/fs.h>
16 #include <linux/module.h>
17 #include <linux/usb.h>
18 #include <linux/delay.h>
19 #include <linux/time.h>
20 #include <linux/errno.h>
21 #include <linux/jiffies.h>
22 #include <linux/mutex.h>
23 #include <linux/firmware.h>
25 #include "dvb_frontend.h"
26 #include "dmxdev.h"
27 #include "dvb_demux.h"
28 #include "dvb_net.h"
29 #include "ves1820.h"
30 #include "cx22700.h"
31 #include "tda1004x.h"
32 #include "stv0299.h"
33 #include "tda8083.h"
34 #include "stv0297.h"
35 #include "lnbp21.h"
37 #include <linux/dvb/frontend.h>
38 #include <linux/dvb/dmx.h>
39 #include <linux/pci.h>
42 TTUSB_HWSECTIONS:
43 the DSP supports filtering in hardware, however, since the "muxstream"
44 is a bit braindead (no matching channel masks or no matching filter mask),
45 we won't support this - yet. it doesn't event support negative filters,
46 so the best way is maybe to keep TTUSB_HWSECTIONS undef'd and just
47 parse TS data. USB bandwidth will be a problem when having large
48 datastreams, especially for dvb-net, but hey, that's not my problem.
50 TTUSB_DISEQC, TTUSB_TONE:
51 let the STC do the diseqc/tone stuff. this isn't supported at least with
52 my TTUSB, so let it undef'd unless you want to implement another
53 frontend. never tested.
55 DEBUG:
56 define it to > 3 for really hardcore debugging. you probably don't want
57 this unless the device doesn't load at all. > 2 for bandwidth statistics.
60 static int debug;
61 module_param(debug, int, 0644);
62 MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off).");
64 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
66 #define dprintk(x...) do { if (debug) printk(KERN_DEBUG x); } while (0)
68 #define ISO_BUF_COUNT 4
69 #define FRAMES_PER_ISO_BUF 4
70 #define ISO_FRAME_SIZE 912
71 #define TTUSB_MAXCHANNEL 32
72 #ifdef TTUSB_HWSECTIONS
73 #define TTUSB_MAXFILTER 16 /* ??? */
74 #endif
76 #define TTUSB_REV_2_2 0x22
77 #define TTUSB_BUDGET_NAME "ttusb_stc_fw"
79 /**
80 * since we're casting (struct ttusb*) <-> (struct dvb_demux*) around
81 * the dvb_demux field must be the first in struct!!
83 struct ttusb {
84 struct dvb_demux dvb_demux;
85 struct dmxdev dmxdev;
86 struct dvb_net dvbnet;
88 /* and one for USB access. */
89 struct mutex semi2c;
90 struct mutex semusb;
92 struct dvb_adapter adapter;
93 struct usb_device *dev;
95 struct i2c_adapter i2c_adap;
97 int disconnecting;
98 int iso_streaming;
100 unsigned int bulk_out_pipe;
101 unsigned int bulk_in_pipe;
102 unsigned int isoc_in_pipe;
104 void *iso_buffer;
105 dma_addr_t iso_dma_handle;
107 struct urb *iso_urb[ISO_BUF_COUNT];
109 int running_feed_count;
110 int last_channel;
111 int last_filter;
113 u8 c; /* transaction counter, wraps around... */
114 fe_sec_tone_mode_t tone;
115 fe_sec_voltage_t voltage;
117 int mux_state; // 0..2 - MuxSyncWord, 3 - nMuxPacks, 4 - muxpack
118 u8 mux_npacks;
119 u8 muxpack[256 + 8];
120 int muxpack_ptr, muxpack_len;
122 int insync;
124 int cc; /* MuxCounter - will increment on EVERY MUX PACKET */
125 /* (including stuffing. yes. really.) */
127 u8 last_result[32];
129 int revision;
131 struct dvb_frontend* fe;
134 /* ugly workaround ... don't know why it's necessary to read */
135 /* all result codes. */
137 #define DEBUG 0
138 static int ttusb_cmd(struct ttusb *ttusb,
139 const u8 * data, int len, int needresult)
141 int actual_len;
142 int err;
143 #if DEBUG >= 3
144 int i;
146 printk(">");
147 for (i = 0; i < len; ++i)
148 printk(" %02x", data[i]);
149 printk("\n");
150 #endif
152 if (mutex_lock_interruptible(&ttusb->semusb) < 0)
153 return -EAGAIN;
155 err = usb_bulk_msg(ttusb->dev, ttusb->bulk_out_pipe,
156 (u8 *) data, len, &actual_len, 1000);
157 if (err != 0) {
158 dprintk("%s: usb_bulk_msg(send) failed, err == %i!\n",
159 __func__, err);
160 mutex_unlock(&ttusb->semusb);
161 return err;
163 if (actual_len != len) {
164 dprintk("%s: only wrote %d of %d bytes\n", __func__,
165 actual_len, len);
166 mutex_unlock(&ttusb->semusb);
167 return -1;
170 err = usb_bulk_msg(ttusb->dev, ttusb->bulk_in_pipe,
171 ttusb->last_result, 32, &actual_len, 1000);
173 if (err != 0) {
174 printk("%s: failed, receive error %d\n", __func__,
175 err);
176 mutex_unlock(&ttusb->semusb);
177 return err;
179 #if DEBUG >= 3
180 actual_len = ttusb->last_result[3] + 4;
181 printk("<");
182 for (i = 0; i < actual_len; ++i)
183 printk(" %02x", ttusb->last_result[i]);
184 printk("\n");
185 #endif
186 if (!needresult)
187 mutex_unlock(&ttusb->semusb);
188 return 0;
191 static int ttusb_result(struct ttusb *ttusb, u8 * data, int len)
193 memcpy(data, ttusb->last_result, len);
194 mutex_unlock(&ttusb->semusb);
195 return 0;
198 static int ttusb_i2c_msg(struct ttusb *ttusb,
199 u8 addr, u8 * snd_buf, u8 snd_len, u8 * rcv_buf,
200 u8 rcv_len)
202 u8 b[0x28];
203 u8 id = ++ttusb->c;
204 int i, err;
206 if (snd_len > 0x28 - 7 || rcv_len > 0x20 - 7)
207 return -EINVAL;
209 b[0] = 0xaa;
210 b[1] = id;
211 b[2] = 0x31;
212 b[3] = snd_len + 3;
213 b[4] = addr << 1;
214 b[5] = snd_len;
215 b[6] = rcv_len;
217 for (i = 0; i < snd_len; i++)
218 b[7 + i] = snd_buf[i];
220 err = ttusb_cmd(ttusb, b, snd_len + 7, 1);
222 if (err)
223 return -EREMOTEIO;
225 err = ttusb_result(ttusb, b, 0x20);
227 /* check if the i2c transaction was successful */
228 if ((snd_len != b[5]) || (rcv_len != b[6])) return -EREMOTEIO;
230 if (rcv_len > 0) {
232 if (err || b[0] != 0x55 || b[1] != id) {
233 dprintk
234 ("%s: usb_bulk_msg(recv) failed, err == %i, id == %02x, b == ",
235 __func__, err, id);
236 return -EREMOTEIO;
239 for (i = 0; i < rcv_len; i++)
240 rcv_buf[i] = b[7 + i];
243 return rcv_len;
246 static int master_xfer(struct i2c_adapter* adapter, struct i2c_msg *msg, int num)
248 struct ttusb *ttusb = i2c_get_adapdata(adapter);
249 int i = 0;
250 int inc;
252 if (mutex_lock_interruptible(&ttusb->semi2c) < 0)
253 return -EAGAIN;
255 while (i < num) {
256 u8 addr, snd_len, rcv_len, *snd_buf, *rcv_buf;
257 int err;
259 if (num > i + 1 && (msg[i + 1].flags & I2C_M_RD)) {
260 addr = msg[i].addr;
261 snd_buf = msg[i].buf;
262 snd_len = msg[i].len;
263 rcv_buf = msg[i + 1].buf;
264 rcv_len = msg[i + 1].len;
265 inc = 2;
266 } else {
267 addr = msg[i].addr;
268 snd_buf = msg[i].buf;
269 snd_len = msg[i].len;
270 rcv_buf = NULL;
271 rcv_len = 0;
272 inc = 1;
275 err = ttusb_i2c_msg(ttusb, addr,
276 snd_buf, snd_len, rcv_buf, rcv_len);
278 if (err < rcv_len) {
279 dprintk("%s: i == %i\n", __func__, i);
280 break;
283 i += inc;
286 mutex_unlock(&ttusb->semi2c);
287 return i;
290 static int ttusb_boot_dsp(struct ttusb *ttusb)
292 const struct firmware *fw;
293 int i, err;
294 u8 b[40];
296 err = request_firmware(&fw, "ttusb-budget/dspbootcode.bin",
297 &ttusb->dev->dev);
298 if (err) {
299 printk(KERN_ERR "ttusb-budget: failed to request firmware\n");
300 return err;
303 /* BootBlock */
304 b[0] = 0xaa;
305 b[2] = 0x13;
306 b[3] = 28;
308 /* upload dsp code in 32 byte steps (36 didn't work for me ...) */
309 /* 32 is max packet size, no messages should be splitted. */
310 for (i = 0; i < fw->size; i += 28) {
311 memcpy(&b[4], &fw->data[i], 28);
313 b[1] = ++ttusb->c;
315 err = ttusb_cmd(ttusb, b, 32, 0);
316 if (err)
317 goto done;
320 /* last block ... */
321 b[1] = ++ttusb->c;
322 b[2] = 0x13;
323 b[3] = 0;
325 err = ttusb_cmd(ttusb, b, 4, 0);
326 if (err)
327 goto done;
329 /* BootEnd */
330 b[1] = ++ttusb->c;
331 b[2] = 0x14;
332 b[3] = 0;
334 err = ttusb_cmd(ttusb, b, 4, 0);
336 done:
337 if (err) {
338 dprintk("%s: usb_bulk_msg() failed, return value %i!\n",
339 __func__, err);
342 return err;
345 static int ttusb_set_channel(struct ttusb *ttusb, int chan_id, int filter_type,
346 int pid)
348 int err;
349 /* SetChannel */
350 u8 b[] = { 0xaa, ++ttusb->c, 0x22, 4, chan_id, filter_type,
351 (pid >> 8) & 0xff, pid & 0xff
354 err = ttusb_cmd(ttusb, b, sizeof(b), 0);
355 return err;
358 static int ttusb_del_channel(struct ttusb *ttusb, int channel_id)
360 int err;
361 /* DelChannel */
362 u8 b[] = { 0xaa, ++ttusb->c, 0x23, 1, channel_id };
364 err = ttusb_cmd(ttusb, b, sizeof(b), 0);
365 return err;
368 #ifdef TTUSB_HWSECTIONS
369 static int ttusb_set_filter(struct ttusb *ttusb, int filter_id,
370 int associated_chan, u8 filter[8], u8 mask[8])
372 int err;
373 /* SetFilter */
374 u8 b[] = { 0xaa, 0, 0x24, 0x1a, filter_id, associated_chan,
375 filter[0], filter[1], filter[2], filter[3],
376 filter[4], filter[5], filter[6], filter[7],
377 filter[8], filter[9], filter[10], filter[11],
378 mask[0], mask[1], mask[2], mask[3],
379 mask[4], mask[5], mask[6], mask[7],
380 mask[8], mask[9], mask[10], mask[11]
383 err = ttusb_cmd(ttusb, b, sizeof(b), 0);
384 return err;
387 static int ttusb_del_filter(struct ttusb *ttusb, int filter_id)
389 int err;
390 /* DelFilter */
391 u8 b[] = { 0xaa, ++ttusb->c, 0x25, 1, filter_id };
393 err = ttusb_cmd(ttusb, b, sizeof(b), 0);
394 return err;
396 #endif
398 static int ttusb_init_controller(struct ttusb *ttusb)
400 u8 b0[] = { 0xaa, ++ttusb->c, 0x15, 1, 0 };
401 u8 b1[] = { 0xaa, ++ttusb->c, 0x15, 1, 1 };
402 u8 b2[] = { 0xaa, ++ttusb->c, 0x32, 1, 0 };
403 /* i2c write read: 5 bytes, addr 0x10, 0x02 bytes write, 1 bytes read. */
404 u8 b3[] =
405 { 0xaa, ++ttusb->c, 0x31, 5, 0x10, 0x02, 0x01, 0x00, 0x1e };
406 u8 b4[] =
407 { 0x55, ttusb->c, 0x31, 4, 0x10, 0x02, 0x01, 0x00, 0x1e };
409 u8 get_version[] = { 0xaa, ++ttusb->c, 0x17, 5, 0, 0, 0, 0, 0 };
410 u8 get_dsp_version[0x20] =
411 { 0xaa, ++ttusb->c, 0x26, 28, 0, 0, 0, 0, 0 };
412 int err;
414 /* reset board */
415 if ((err = ttusb_cmd(ttusb, b0, sizeof(b0), 0)))
416 return err;
418 /* reset board (again?) */
419 if ((err = ttusb_cmd(ttusb, b1, sizeof(b1), 0)))
420 return err;
422 ttusb_boot_dsp(ttusb);
424 /* set i2c bit rate */
425 if ((err = ttusb_cmd(ttusb, b2, sizeof(b2), 0)))
426 return err;
428 if ((err = ttusb_cmd(ttusb, b3, sizeof(b3), 1)))
429 return err;
431 err = ttusb_result(ttusb, b4, sizeof(b4));
433 if ((err = ttusb_cmd(ttusb, get_version, sizeof(get_version), 1)))
434 return err;
436 if ((err = ttusb_result(ttusb, get_version, sizeof(get_version))))
437 return err;
439 dprintk("%s: stc-version: %c%c%c%c%c\n", __func__,
440 get_version[4], get_version[5], get_version[6],
441 get_version[7], get_version[8]);
443 if (memcmp(get_version + 4, "V 0.0", 5) &&
444 memcmp(get_version + 4, "V 1.1", 5) &&
445 memcmp(get_version + 4, "V 2.1", 5) &&
446 memcmp(get_version + 4, "V 2.2", 5)) {
447 printk
448 ("%s: unknown STC version %c%c%c%c%c, please report!\n",
449 __func__, get_version[4], get_version[5],
450 get_version[6], get_version[7], get_version[8]);
453 ttusb->revision = ((get_version[6] - '0') << 4) |
454 (get_version[8] - '0');
456 err =
457 ttusb_cmd(ttusb, get_dsp_version, sizeof(get_dsp_version), 1);
458 if (err)
459 return err;
461 err =
462 ttusb_result(ttusb, get_dsp_version, sizeof(get_dsp_version));
463 if (err)
464 return err;
465 printk("%s: dsp-version: %c%c%c\n", __func__,
466 get_dsp_version[4], get_dsp_version[5], get_dsp_version[6]);
467 return 0;
470 #ifdef TTUSB_DISEQC
471 static int ttusb_send_diseqc(struct dvb_frontend* fe,
472 const struct dvb_diseqc_master_cmd *cmd)
474 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
475 u8 b[12] = { 0xaa, ++ttusb->c, 0x18 };
477 int err;
479 b[3] = 4 + 2 + cmd->msg_len;
480 b[4] = 0xFF; /* send diseqc master, not burst */
481 b[5] = cmd->msg_len;
483 memcpy(b + 5, cmd->msg, cmd->msg_len);
485 /* Diseqc */
486 if ((err = ttusb_cmd(ttusb, b, 4 + b[3], 0))) {
487 dprintk("%s: usb_bulk_msg() failed, return value %i!\n",
488 __func__, err);
491 return err;
493 #endif
495 static int ttusb_update_lnb(struct ttusb *ttusb)
497 u8 b[] = { 0xaa, ++ttusb->c, 0x16, 5, /*power: */ 1,
498 ttusb->voltage == SEC_VOLTAGE_18 ? 0 : 1,
499 ttusb->tone == SEC_TONE_ON ? 1 : 0, 1, 1
501 int err;
503 /* SetLNB */
504 if ((err = ttusb_cmd(ttusb, b, sizeof(b), 0))) {
505 dprintk("%s: usb_bulk_msg() failed, return value %i!\n",
506 __func__, err);
509 return err;
512 static int ttusb_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage)
514 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
516 ttusb->voltage = voltage;
517 return ttusb_update_lnb(ttusb);
520 #ifdef TTUSB_TONE
521 static int ttusb_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
523 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
525 ttusb->tone = tone;
526 return ttusb_update_lnb(ttusb);
528 #endif
531 #if 0
532 static void ttusb_set_led_freq(struct ttusb *ttusb, u8 freq)
534 u8 b[] = { 0xaa, ++ttusb->c, 0x19, 1, freq };
535 int err, actual_len;
537 err = ttusb_cmd(ttusb, b, sizeof(b), 0);
538 if (err) {
539 dprintk("%s: usb_bulk_msg() failed, return value %i!\n",
540 __func__, err);
543 #endif
545 /*****************************************************************************/
547 #ifdef TTUSB_HWSECTIONS
548 static void ttusb_handle_ts_data(struct ttusb_channel *channel,
549 const u8 * data, int len);
550 static void ttusb_handle_sec_data(struct ttusb_channel *channel,
551 const u8 * data, int len);
552 #endif
554 static int numpkt, numts, numstuff, numsec, numinvalid;
555 static unsigned long lastj;
557 static void ttusb_process_muxpack(struct ttusb *ttusb, const u8 * muxpack,
558 int len)
560 u16 csum = 0, cc;
561 int i;
562 for (i = 0; i < len; i += 2)
563 csum ^= le16_to_cpup((__le16 *) (muxpack + i));
564 if (csum) {
565 printk("%s: muxpack with incorrect checksum, ignoring\n",
566 __func__);
567 numinvalid++;
568 return;
571 cc = (muxpack[len - 4] << 8) | muxpack[len - 3];
572 cc &= 0x7FFF;
573 if ((cc != ttusb->cc) && (ttusb->cc != -1))
574 printk("%s: cc discontinuity (%d frames missing)\n",
575 __func__, (cc - ttusb->cc) & 0x7FFF);
576 ttusb->cc = (cc + 1) & 0x7FFF;
577 if (muxpack[0] & 0x80) {
578 #ifdef TTUSB_HWSECTIONS
579 /* section data */
580 int pusi = muxpack[0] & 0x40;
581 int channel = muxpack[0] & 0x1F;
582 int payload = muxpack[1];
583 const u8 *data = muxpack + 2;
584 /* check offset flag */
585 if (muxpack[0] & 0x20)
586 data++;
588 ttusb_handle_sec_data(ttusb->channel + channel, data,
589 payload);
590 data += payload;
592 if ((!!(ttusb->muxpack[0] & 0x20)) ^
593 !!(ttusb->muxpack[1] & 1))
594 data++;
595 #warning TODO: pusi
596 printk("cc: %04x\n", (data[0] << 8) | data[1]);
597 #endif
598 numsec++;
599 } else if (muxpack[0] == 0x47) {
600 #ifdef TTUSB_HWSECTIONS
601 /* we have TS data here! */
602 int pid = ((muxpack[1] & 0x0F) << 8) | muxpack[2];
603 int channel;
604 for (channel = 0; channel < TTUSB_MAXCHANNEL; ++channel)
605 if (ttusb->channel[channel].active
606 && (pid == ttusb->channel[channel].pid))
607 ttusb_handle_ts_data(ttusb->channel +
608 channel, muxpack,
609 188);
610 #endif
611 numts++;
612 dvb_dmx_swfilter_packets(&ttusb->dvb_demux, muxpack, 1);
613 } else if (muxpack[0] != 0) {
614 numinvalid++;
615 printk("illegal muxpack type %02x\n", muxpack[0]);
616 } else
617 numstuff++;
620 static void ttusb_process_frame(struct ttusb *ttusb, u8 * data, int len)
622 int maxwork = 1024;
623 while (len) {
624 if (!(maxwork--)) {
625 printk("%s: too much work\n", __func__);
626 break;
629 switch (ttusb->mux_state) {
630 case 0:
631 case 1:
632 case 2:
633 len--;
634 if (*data++ == 0xAA)
635 ++ttusb->mux_state;
636 else {
637 ttusb->mux_state = 0;
638 #if DEBUG > 3
639 if (ttusb->insync)
640 printk("%02x ", data[-1]);
641 #else
642 if (ttusb->insync) {
643 printk("%s: lost sync.\n",
644 __func__);
645 ttusb->insync = 0;
647 #endif
649 break;
650 case 3:
651 ttusb->insync = 1;
652 len--;
653 ttusb->mux_npacks = *data++;
654 ++ttusb->mux_state;
655 ttusb->muxpack_ptr = 0;
656 /* maximum bytes, until we know the length */
657 ttusb->muxpack_len = 2;
658 break;
659 case 4:
661 int avail;
662 avail = len;
663 if (avail >
664 (ttusb->muxpack_len -
665 ttusb->muxpack_ptr))
666 avail =
667 ttusb->muxpack_len -
668 ttusb->muxpack_ptr;
669 memcpy(ttusb->muxpack + ttusb->muxpack_ptr,
670 data, avail);
671 ttusb->muxpack_ptr += avail;
672 BUG_ON(ttusb->muxpack_ptr > 264);
673 data += avail;
674 len -= avail;
675 /* determine length */
676 if (ttusb->muxpack_ptr == 2) {
677 if (ttusb->muxpack[0] & 0x80) {
678 ttusb->muxpack_len =
679 ttusb->muxpack[1] + 2;
680 if (ttusb->
681 muxpack[0] & 0x20)
682 ttusb->
683 muxpack_len++;
684 if ((!!
685 (ttusb->
686 muxpack[0] & 0x20)) ^
687 !!(ttusb->
688 muxpack[1] & 1))
689 ttusb->
690 muxpack_len++;
691 ttusb->muxpack_len += 4;
692 } else if (ttusb->muxpack[0] ==
693 0x47)
694 ttusb->muxpack_len =
695 188 + 4;
696 else if (ttusb->muxpack[0] == 0x00)
697 ttusb->muxpack_len =
698 ttusb->muxpack[1] + 2 +
700 else {
701 dprintk
702 ("%s: invalid state: first byte is %x\n",
703 __func__,
704 ttusb->muxpack[0]);
705 ttusb->mux_state = 0;
710 * if length is valid and we reached the end:
711 * goto next muxpack
713 if ((ttusb->muxpack_ptr >= 2) &&
714 (ttusb->muxpack_ptr ==
715 ttusb->muxpack_len)) {
716 ttusb_process_muxpack(ttusb,
717 ttusb->
718 muxpack,
719 ttusb->
720 muxpack_ptr);
721 ttusb->muxpack_ptr = 0;
722 /* maximum bytes, until we know the length */
723 ttusb->muxpack_len = 2;
726 * no muxpacks left?
727 * return to search-sync state
729 if (!ttusb->mux_npacks--) {
730 ttusb->mux_state = 0;
731 break;
734 break;
736 default:
737 BUG();
738 break;
743 static void ttusb_iso_irq(struct urb *urb)
745 struct ttusb *ttusb = urb->context;
747 if (!ttusb->iso_streaming)
748 return;
750 #if 0
751 printk("%s: status %d, errcount == %d, length == %i\n",
752 __func__,
753 urb->status, urb->error_count, urb->actual_length);
754 #endif
756 if (!urb->status) {
757 int i;
758 for (i = 0; i < urb->number_of_packets; ++i) {
759 struct usb_iso_packet_descriptor *d;
760 u8 *data;
761 int len;
762 numpkt++;
763 if (time_after_eq(jiffies, lastj + HZ)) {
764 #if DEBUG > 2
765 printk
766 ("frames/s: %d (ts: %d, stuff %d, sec: %d, invalid: %d, all: %d)\n",
767 numpkt * HZ / (jiffies - lastj),
768 numts, numstuff, numsec, numinvalid,
769 numts + numstuff + numsec +
770 numinvalid);
771 #endif
772 numts = numstuff = numsec = numinvalid = 0;
773 lastj = jiffies;
774 numpkt = 0;
776 d = &urb->iso_frame_desc[i];
777 data = urb->transfer_buffer + d->offset;
778 len = d->actual_length;
779 d->actual_length = 0;
780 d->status = 0;
781 ttusb_process_frame(ttusb, data, len);
784 usb_submit_urb(urb, GFP_ATOMIC);
787 static void ttusb_free_iso_urbs(struct ttusb *ttusb)
789 int i;
791 for (i = 0; i < ISO_BUF_COUNT; i++)
792 if (ttusb->iso_urb[i])
793 usb_free_urb(ttusb->iso_urb[i]);
795 pci_free_consistent(NULL,
796 ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF *
797 ISO_BUF_COUNT, ttusb->iso_buffer,
798 ttusb->iso_dma_handle);
801 static int ttusb_alloc_iso_urbs(struct ttusb *ttusb)
803 int i;
805 ttusb->iso_buffer = pci_alloc_consistent(NULL,
806 ISO_FRAME_SIZE *
807 FRAMES_PER_ISO_BUF *
808 ISO_BUF_COUNT,
809 &ttusb->iso_dma_handle);
811 if (!ttusb->iso_buffer) {
812 dprintk("%s: pci_alloc_consistent - not enough memory\n",
813 __func__);
814 return -ENOMEM;
817 memset(ttusb->iso_buffer, 0,
818 ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF * ISO_BUF_COUNT);
820 for (i = 0; i < ISO_BUF_COUNT; i++) {
821 struct urb *urb;
823 if (!
824 (urb =
825 usb_alloc_urb(FRAMES_PER_ISO_BUF, GFP_ATOMIC))) {
826 ttusb_free_iso_urbs(ttusb);
827 return -ENOMEM;
830 ttusb->iso_urb[i] = urb;
833 return 0;
836 static void ttusb_stop_iso_xfer(struct ttusb *ttusb)
838 int i;
840 for (i = 0; i < ISO_BUF_COUNT; i++)
841 usb_kill_urb(ttusb->iso_urb[i]);
843 ttusb->iso_streaming = 0;
846 static int ttusb_start_iso_xfer(struct ttusb *ttusb)
848 int i, j, err, buffer_offset = 0;
850 if (ttusb->iso_streaming) {
851 printk("%s: iso xfer already running!\n", __func__);
852 return 0;
855 ttusb->cc = -1;
856 ttusb->insync = 0;
857 ttusb->mux_state = 0;
859 for (i = 0; i < ISO_BUF_COUNT; i++) {
860 int frame_offset = 0;
861 struct urb *urb = ttusb->iso_urb[i];
863 urb->dev = ttusb->dev;
864 urb->context = ttusb;
865 urb->complete = ttusb_iso_irq;
866 urb->pipe = ttusb->isoc_in_pipe;
867 urb->transfer_flags = URB_ISO_ASAP;
868 urb->interval = 1;
869 urb->number_of_packets = FRAMES_PER_ISO_BUF;
870 urb->transfer_buffer_length =
871 ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF;
872 urb->transfer_buffer = ttusb->iso_buffer + buffer_offset;
873 buffer_offset += ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF;
875 for (j = 0; j < FRAMES_PER_ISO_BUF; j++) {
876 urb->iso_frame_desc[j].offset = frame_offset;
877 urb->iso_frame_desc[j].length = ISO_FRAME_SIZE;
878 frame_offset += ISO_FRAME_SIZE;
882 for (i = 0; i < ISO_BUF_COUNT; i++) {
883 if ((err = usb_submit_urb(ttusb->iso_urb[i], GFP_ATOMIC))) {
884 ttusb_stop_iso_xfer(ttusb);
885 printk
886 ("%s: failed urb submission (%i: err = %i)!\n",
887 __func__, i, err);
888 return err;
892 ttusb->iso_streaming = 1;
894 return 0;
897 #ifdef TTUSB_HWSECTIONS
898 static void ttusb_handle_ts_data(struct dvb_demux_feed *dvbdmxfeed, const u8 * data,
899 int len)
901 dvbdmxfeed->cb.ts(data, len, 0, 0, &dvbdmxfeed->feed.ts, 0);
904 static void ttusb_handle_sec_data(struct dvb_demux_feed *dvbdmxfeed, const u8 * data,
905 int len)
907 // struct dvb_demux_feed *dvbdmxfeed = channel->dvbdmxfeed;
908 #error TODO: handle ugly stuff
909 // dvbdmxfeed->cb.sec(data, len, 0, 0, &dvbdmxfeed->feed.sec, 0);
911 #endif
913 static int ttusb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
915 struct ttusb *ttusb = (struct ttusb *) dvbdmxfeed->demux;
916 int feed_type = 1;
918 dprintk("ttusb_start_feed\n");
920 switch (dvbdmxfeed->type) {
921 case DMX_TYPE_TS:
922 break;
923 case DMX_TYPE_SEC:
924 break;
925 default:
926 return -EINVAL;
929 if (dvbdmxfeed->type == DMX_TYPE_TS) {
930 switch (dvbdmxfeed->pes_type) {
931 case DMX_TS_PES_VIDEO:
932 case DMX_TS_PES_AUDIO:
933 case DMX_TS_PES_TELETEXT:
934 case DMX_TS_PES_PCR:
935 case DMX_TS_PES_OTHER:
936 break;
937 default:
938 return -EINVAL;
942 #ifdef TTUSB_HWSECTIONS
943 #error TODO: allocate filters
944 if (dvbdmxfeed->type == DMX_TYPE_TS) {
945 feed_type = 1;
946 } else if (dvbdmxfeed->type == DMX_TYPE_SEC) {
947 feed_type = 2;
949 #endif
951 ttusb_set_channel(ttusb, dvbdmxfeed->index, feed_type, dvbdmxfeed->pid);
953 if (0 == ttusb->running_feed_count++)
954 ttusb_start_iso_xfer(ttusb);
956 return 0;
959 static int ttusb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
961 struct ttusb *ttusb = (struct ttusb *) dvbdmxfeed->demux;
963 ttusb_del_channel(ttusb, dvbdmxfeed->index);
965 if (--ttusb->running_feed_count == 0)
966 ttusb_stop_iso_xfer(ttusb);
968 return 0;
971 static int ttusb_setup_interfaces(struct ttusb *ttusb)
973 usb_set_interface(ttusb->dev, 1, 1);
975 ttusb->bulk_out_pipe = usb_sndbulkpipe(ttusb->dev, 1);
976 ttusb->bulk_in_pipe = usb_rcvbulkpipe(ttusb->dev, 1);
977 ttusb->isoc_in_pipe = usb_rcvisocpipe(ttusb->dev, 2);
979 return 0;
982 #if 0
983 static u8 stc_firmware[8192];
985 static int stc_open(struct inode *inode, struct file *file)
987 struct ttusb *ttusb = file->private_data;
988 int addr;
990 for (addr = 0; addr < 8192; addr += 16) {
991 u8 snd_buf[2] = { addr >> 8, addr & 0xFF };
992 ttusb_i2c_msg(ttusb, 0x50, snd_buf, 2, stc_firmware + addr,
993 16);
996 return 0;
999 static ssize_t stc_read(struct file *file, char *buf, size_t count,
1000 loff_t *offset)
1002 return simple_read_from_buffer(buf, count, offset, stc_firmware, 8192);
1005 static int stc_release(struct inode *inode, struct file *file)
1007 return 0;
1010 static const struct file_operations stc_fops = {
1011 .owner = THIS_MODULE,
1012 .read = stc_read,
1013 .open = stc_open,
1014 .release = stc_release,
1016 #endif
1018 static u32 functionality(struct i2c_adapter *adapter)
1020 return I2C_FUNC_I2C;
1025 static int alps_tdmb7_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
1027 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
1028 u8 data[4];
1029 struct i2c_msg msg = {.addr=0x61, .flags=0, .buf=data, .len=sizeof(data) };
1030 u32 div;
1032 div = (params->frequency + 36166667) / 166667;
1034 data[0] = (div >> 8) & 0x7f;
1035 data[1] = div & 0xff;
1036 data[2] = ((div >> 10) & 0x60) | 0x85;
1037 data[3] = params->frequency < 592000000 ? 0x40 : 0x80;
1039 if (fe->ops.i2c_gate_ctrl)
1040 fe->ops.i2c_gate_ctrl(fe, 1);
1041 if (i2c_transfer(&ttusb->i2c_adap, &msg, 1) != 1) return -EIO;
1042 return 0;
1045 static struct cx22700_config alps_tdmb7_config = {
1046 .demod_address = 0x43,
1053 static int philips_tdm1316l_tuner_init(struct dvb_frontend* fe)
1055 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
1056 static u8 td1316_init[] = { 0x0b, 0xf5, 0x85, 0xab };
1057 static u8 disable_mc44BC374c[] = { 0x1d, 0x74, 0xa0, 0x68 };
1058 struct i2c_msg tuner_msg = { .addr=0x60, .flags=0, .buf=td1316_init, .len=sizeof(td1316_init) };
1060 // setup PLL configuration
1061 if (fe->ops.i2c_gate_ctrl)
1062 fe->ops.i2c_gate_ctrl(fe, 1);
1063 if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1) return -EIO;
1064 msleep(1);
1066 // disable the mc44BC374c (do not check for errors)
1067 tuner_msg.addr = 0x65;
1068 tuner_msg.buf = disable_mc44BC374c;
1069 tuner_msg.len = sizeof(disable_mc44BC374c);
1070 if (fe->ops.i2c_gate_ctrl)
1071 fe->ops.i2c_gate_ctrl(fe, 1);
1072 if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1) {
1073 i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1);
1076 return 0;
1079 static int philips_tdm1316l_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
1081 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
1082 u8 tuner_buf[4];
1083 struct i2c_msg tuner_msg = {.addr=0x60, .flags=0, .buf=tuner_buf, .len=sizeof(tuner_buf) };
1084 int tuner_frequency = 0;
1085 u8 band, cp, filter;
1087 // determine charge pump
1088 tuner_frequency = params->frequency + 36130000;
1089 if (tuner_frequency < 87000000) return -EINVAL;
1090 else if (tuner_frequency < 130000000) cp = 3;
1091 else if (tuner_frequency < 160000000) cp = 5;
1092 else if (tuner_frequency < 200000000) cp = 6;
1093 else if (tuner_frequency < 290000000) cp = 3;
1094 else if (tuner_frequency < 420000000) cp = 5;
1095 else if (tuner_frequency < 480000000) cp = 6;
1096 else if (tuner_frequency < 620000000) cp = 3;
1097 else if (tuner_frequency < 830000000) cp = 5;
1098 else if (tuner_frequency < 895000000) cp = 7;
1099 else return -EINVAL;
1101 // determine band
1102 if (params->frequency < 49000000) return -EINVAL;
1103 else if (params->frequency < 159000000) band = 1;
1104 else if (params->frequency < 444000000) band = 2;
1105 else if (params->frequency < 861000000) band = 4;
1106 else return -EINVAL;
1108 // setup PLL filter
1109 switch (params->u.ofdm.bandwidth) {
1110 case BANDWIDTH_6_MHZ:
1111 tda1004x_writereg(fe, 0x0C, 0);
1112 filter = 0;
1113 break;
1115 case BANDWIDTH_7_MHZ:
1116 tda1004x_writereg(fe, 0x0C, 0);
1117 filter = 0;
1118 break;
1120 case BANDWIDTH_8_MHZ:
1121 tda1004x_writereg(fe, 0x0C, 0xFF);
1122 filter = 1;
1123 break;
1125 default:
1126 return -EINVAL;
1129 // calculate divisor
1130 // ((36130000+((1000000/6)/2)) + Finput)/(1000000/6)
1131 tuner_frequency = (((params->frequency / 1000) * 6) + 217280) / 1000;
1133 // setup tuner buffer
1134 tuner_buf[0] = tuner_frequency >> 8;
1135 tuner_buf[1] = tuner_frequency & 0xff;
1136 tuner_buf[2] = 0xca;
1137 tuner_buf[3] = (cp << 5) | (filter << 3) | band;
1139 if (fe->ops.i2c_gate_ctrl)
1140 fe->ops.i2c_gate_ctrl(fe, 1);
1141 if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1)
1142 return -EIO;
1144 msleep(1);
1145 return 0;
1148 static int philips_tdm1316l_request_firmware(struct dvb_frontend* fe, const struct firmware **fw, char* name)
1150 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
1152 return request_firmware(fw, name, &ttusb->dev->dev);
1155 static struct tda1004x_config philips_tdm1316l_config = {
1157 .demod_address = 0x8,
1158 .invert = 1,
1159 .invert_oclk = 0,
1160 .request_firmware = philips_tdm1316l_request_firmware,
1163 static u8 alps_bsbe1_inittab[] = {
1164 0x01, 0x15,
1165 0x02, 0x30,
1166 0x03, 0x00,
1167 0x04, 0x7d, /* F22FR = 0x7d, F22 = f_VCO / 128 / 0x7d = 22 kHz */
1168 0x05, 0x35, /* I2CT = 0, SCLT = 1, SDAT = 1 */
1169 0x06, 0x40, /* DAC not used, set to high impendance mode */
1170 0x07, 0x00, /* DAC LSB */
1171 0x08, 0x40, /* DiSEqC off, LNB power on OP2/LOCK pin on */
1172 0x09, 0x00, /* FIFO */
1173 0x0c, 0x51, /* OP1 ctl = Normal, OP1 val = 1 (LNB Power ON) */
1174 0x0d, 0x82, /* DC offset compensation = ON, beta_agc1 = 2 */
1175 0x0e, 0x23, /* alpha_tmg = 2, beta_tmg = 3 */
1176 0x10, 0x3f, // AGC2 0x3d
1177 0x11, 0x84,
1178 0x12, 0xb9,
1179 0x15, 0xc9, // lock detector threshold
1180 0x16, 0x00,
1181 0x17, 0x00,
1182 0x18, 0x00,
1183 0x19, 0x00,
1184 0x1a, 0x00,
1185 0x1f, 0x50,
1186 0x20, 0x00,
1187 0x21, 0x00,
1188 0x22, 0x00,
1189 0x23, 0x00,
1190 0x28, 0x00, // out imp: normal out type: parallel FEC mode:0
1191 0x29, 0x1e, // 1/2 threshold
1192 0x2a, 0x14, // 2/3 threshold
1193 0x2b, 0x0f, // 3/4 threshold
1194 0x2c, 0x09, // 5/6 threshold
1195 0x2d, 0x05, // 7/8 threshold
1196 0x2e, 0x01,
1197 0x31, 0x1f, // test all FECs
1198 0x32, 0x19, // viterbi and synchro search
1199 0x33, 0xfc, // rs control
1200 0x34, 0x93, // error control
1201 0x0f, 0x92,
1202 0xff, 0xff
1205 static u8 alps_bsru6_inittab[] = {
1206 0x01, 0x15,
1207 0x02, 0x30,
1208 0x03, 0x00,
1209 0x04, 0x7d, /* F22FR = 0x7d, F22 = f_VCO / 128 / 0x7d = 22 kHz */
1210 0x05, 0x35, /* I2CT = 0, SCLT = 1, SDAT = 1 */
1211 0x06, 0x40, /* DAC not used, set to high impendance mode */
1212 0x07, 0x00, /* DAC LSB */
1213 0x08, 0x40, /* DiSEqC off, LNB power on OP2/LOCK pin on */
1214 0x09, 0x00, /* FIFO */
1215 0x0c, 0x51, /* OP1 ctl = Normal, OP1 val = 1 (LNB Power ON) */
1216 0x0d, 0x82, /* DC offset compensation = ON, beta_agc1 = 2 */
1217 0x0e, 0x23, /* alpha_tmg = 2, beta_tmg = 3 */
1218 0x10, 0x3f, // AGC2 0x3d
1219 0x11, 0x84,
1220 0x12, 0xb9,
1221 0x15, 0xc9, // lock detector threshold
1222 0x16, 0x00,
1223 0x17, 0x00,
1224 0x18, 0x00,
1225 0x19, 0x00,
1226 0x1a, 0x00,
1227 0x1f, 0x50,
1228 0x20, 0x00,
1229 0x21, 0x00,
1230 0x22, 0x00,
1231 0x23, 0x00,
1232 0x28, 0x00, // out imp: normal out type: parallel FEC mode:0
1233 0x29, 0x1e, // 1/2 threshold
1234 0x2a, 0x14, // 2/3 threshold
1235 0x2b, 0x0f, // 3/4 threshold
1236 0x2c, 0x09, // 5/6 threshold
1237 0x2d, 0x05, // 7/8 threshold
1238 0x2e, 0x01,
1239 0x31, 0x1f, // test all FECs
1240 0x32, 0x19, // viterbi and synchro search
1241 0x33, 0xfc, // rs control
1242 0x34, 0x93, // error control
1243 0x0f, 0x52,
1244 0xff, 0xff
1247 static int alps_stv0299_set_symbol_rate(struct dvb_frontend *fe, u32 srate, u32 ratio)
1249 u8 aclk = 0;
1250 u8 bclk = 0;
1252 if (srate < 1500000) {
1253 aclk = 0xb7;
1254 bclk = 0x47;
1255 } else if (srate < 3000000) {
1256 aclk = 0xb7;
1257 bclk = 0x4b;
1258 } else if (srate < 7000000) {
1259 aclk = 0xb7;
1260 bclk = 0x4f;
1261 } else if (srate < 14000000) {
1262 aclk = 0xb7;
1263 bclk = 0x53;
1264 } else if (srate < 30000000) {
1265 aclk = 0xb6;
1266 bclk = 0x53;
1267 } else if (srate < 45000000) {
1268 aclk = 0xb4;
1269 bclk = 0x51;
1272 stv0299_writereg(fe, 0x13, aclk);
1273 stv0299_writereg(fe, 0x14, bclk);
1274 stv0299_writereg(fe, 0x1f, (ratio >> 16) & 0xff);
1275 stv0299_writereg(fe, 0x20, (ratio >> 8) & 0xff);
1276 stv0299_writereg(fe, 0x21, (ratio) & 0xf0);
1278 return 0;
1281 static int philips_tsa5059_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
1283 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
1284 u8 buf[4];
1285 u32 div;
1286 struct i2c_msg msg = {.addr = 0x61,.flags = 0,.buf = buf,.len = sizeof(buf) };
1288 if ((params->frequency < 950000) || (params->frequency > 2150000))
1289 return -EINVAL;
1291 div = (params->frequency + (125 - 1)) / 125; // round correctly
1292 buf[0] = (div >> 8) & 0x7f;
1293 buf[1] = div & 0xff;
1294 buf[2] = 0x80 | ((div & 0x18000) >> 10) | 4;
1295 buf[3] = 0xC4;
1297 if (params->frequency > 1530000)
1298 buf[3] = 0xC0;
1300 /* BSBE1 wants XCE bit set */
1301 if (ttusb->revision == TTUSB_REV_2_2)
1302 buf[3] |= 0x20;
1304 if (fe->ops.i2c_gate_ctrl)
1305 fe->ops.i2c_gate_ctrl(fe, 1);
1306 if (i2c_transfer(&ttusb->i2c_adap, &msg, 1) != 1)
1307 return -EIO;
1309 return 0;
1312 static struct stv0299_config alps_stv0299_config = {
1313 .demod_address = 0x68,
1314 .inittab = alps_bsru6_inittab,
1315 .mclk = 88000000UL,
1316 .invert = 1,
1317 .skip_reinit = 0,
1318 .lock_output = STV0299_LOCKOUTPUT_1,
1319 .volt13_op0_op1 = STV0299_VOLT13_OP1,
1320 .min_delay_ms = 100,
1321 .set_symbol_rate = alps_stv0299_set_symbol_rate,
1324 static int ttusb_novas_grundig_29504_491_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
1326 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
1327 u8 buf[4];
1328 u32 div;
1329 struct i2c_msg msg = {.addr = 0x61,.flags = 0,.buf = buf,.len = sizeof(buf) };
1331 div = params->frequency / 125;
1333 buf[0] = (div >> 8) & 0x7f;
1334 buf[1] = div & 0xff;
1335 buf[2] = 0x8e;
1336 buf[3] = 0x00;
1338 if (fe->ops.i2c_gate_ctrl)
1339 fe->ops.i2c_gate_ctrl(fe, 1);
1340 if (i2c_transfer(&ttusb->i2c_adap, &msg, 1) != 1)
1341 return -EIO;
1343 return 0;
1346 static struct tda8083_config ttusb_novas_grundig_29504_491_config = {
1348 .demod_address = 0x68,
1351 static int alps_tdbe2_tuner_set_params(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
1353 struct ttusb* ttusb = fe->dvb->priv;
1354 u32 div;
1355 u8 data[4];
1356 struct i2c_msg msg = { .addr = 0x62, .flags = 0, .buf = data, .len = sizeof(data) };
1358 div = (params->frequency + 35937500 + 31250) / 62500;
1360 data[0] = (div >> 8) & 0x7f;
1361 data[1] = div & 0xff;
1362 data[2] = 0x85 | ((div >> 10) & 0x60);
1363 data[3] = (params->frequency < 174000000 ? 0x88 : params->frequency < 470000000 ? 0x84 : 0x81);
1365 if (fe->ops.i2c_gate_ctrl)
1366 fe->ops.i2c_gate_ctrl(fe, 1);
1367 if (i2c_transfer (&ttusb->i2c_adap, &msg, 1) != 1)
1368 return -EIO;
1370 return 0;
1374 static struct ves1820_config alps_tdbe2_config = {
1375 .demod_address = 0x09,
1376 .xin = 57840000UL,
1377 .invert = 1,
1378 .selagc = VES1820_SELAGC_SIGNAMPERR,
1381 static u8 read_pwm(struct ttusb* ttusb)
1383 u8 b = 0xff;
1384 u8 pwm;
1385 struct i2c_msg msg[] = { { .addr = 0x50,.flags = 0,.buf = &b,.len = 1 },
1386 { .addr = 0x50,.flags = I2C_M_RD,.buf = &pwm,.len = 1} };
1388 if ((i2c_transfer(&ttusb->i2c_adap, msg, 2) != 2) || (pwm == 0xff))
1389 pwm = 0x48;
1391 return pwm;
1395 static int dvbc_philips_tdm1316l_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
1397 struct ttusb *ttusb = (struct ttusb *) fe->dvb->priv;
1398 u8 tuner_buf[5];
1399 struct i2c_msg tuner_msg = {.addr = 0x60,
1400 .flags = 0,
1401 .buf = tuner_buf,
1402 .len = sizeof(tuner_buf) };
1403 int tuner_frequency = 0;
1404 u8 band, cp, filter;
1406 // determine charge pump
1407 tuner_frequency = params->frequency;
1408 if (tuner_frequency < 87000000) {return -EINVAL;}
1409 else if (tuner_frequency < 130000000) {cp = 3; band = 1;}
1410 else if (tuner_frequency < 160000000) {cp = 5; band = 1;}
1411 else if (tuner_frequency < 200000000) {cp = 6; band = 1;}
1412 else if (tuner_frequency < 290000000) {cp = 3; band = 2;}
1413 else if (tuner_frequency < 420000000) {cp = 5; band = 2;}
1414 else if (tuner_frequency < 480000000) {cp = 6; band = 2;}
1415 else if (tuner_frequency < 620000000) {cp = 3; band = 4;}
1416 else if (tuner_frequency < 830000000) {cp = 5; band = 4;}
1417 else if (tuner_frequency < 895000000) {cp = 7; band = 4;}
1418 else {return -EINVAL;}
1420 // assume PLL filter should always be 8MHz for the moment.
1421 filter = 1;
1423 // calculate divisor
1424 // (Finput + Fif)/Fref; Fif = 36125000 Hz, Fref = 62500 Hz
1425 tuner_frequency = ((params->frequency + 36125000) / 62500);
1427 // setup tuner buffer
1428 tuner_buf[0] = tuner_frequency >> 8;
1429 tuner_buf[1] = tuner_frequency & 0xff;
1430 tuner_buf[2] = 0xc8;
1431 tuner_buf[3] = (cp << 5) | (filter << 3) | band;
1432 tuner_buf[4] = 0x80;
1434 if (fe->ops.i2c_gate_ctrl)
1435 fe->ops.i2c_gate_ctrl(fe, 1);
1436 if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1) {
1437 printk("dvb-ttusb-budget: dvbc_philips_tdm1316l_pll_set Error 1\n");
1438 return -EIO;
1441 msleep(50);
1443 if (fe->ops.i2c_gate_ctrl)
1444 fe->ops.i2c_gate_ctrl(fe, 1);
1445 if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1) {
1446 printk("dvb-ttusb-budget: dvbc_philips_tdm1316l_pll_set Error 2\n");
1447 return -EIO;
1450 msleep(1);
1452 return 0;
1455 static u8 dvbc_philips_tdm1316l_inittab[] = {
1456 0x80, 0x21,
1457 0x80, 0x20,
1458 0x81, 0x01,
1459 0x81, 0x00,
1460 0x00, 0x09,
1461 0x01, 0x69,
1462 0x03, 0x00,
1463 0x04, 0x00,
1464 0x07, 0x00,
1465 0x08, 0x00,
1466 0x20, 0x00,
1467 0x21, 0x40,
1468 0x22, 0x00,
1469 0x23, 0x00,
1470 0x24, 0x40,
1471 0x25, 0x88,
1472 0x30, 0xff,
1473 0x31, 0x00,
1474 0x32, 0xff,
1475 0x33, 0x00,
1476 0x34, 0x50,
1477 0x35, 0x7f,
1478 0x36, 0x00,
1479 0x37, 0x20,
1480 0x38, 0x00,
1481 0x40, 0x1c,
1482 0x41, 0xff,
1483 0x42, 0x29,
1484 0x43, 0x20,
1485 0x44, 0xff,
1486 0x45, 0x00,
1487 0x46, 0x00,
1488 0x49, 0x04,
1489 0x4a, 0xff,
1490 0x4b, 0x7f,
1491 0x52, 0x30,
1492 0x55, 0xae,
1493 0x56, 0x47,
1494 0x57, 0xe1,
1495 0x58, 0x3a,
1496 0x5a, 0x1e,
1497 0x5b, 0x34,
1498 0x60, 0x00,
1499 0x63, 0x00,
1500 0x64, 0x00,
1501 0x65, 0x00,
1502 0x66, 0x00,
1503 0x67, 0x00,
1504 0x68, 0x00,
1505 0x69, 0x00,
1506 0x6a, 0x02,
1507 0x6b, 0x00,
1508 0x70, 0xff,
1509 0x71, 0x00,
1510 0x72, 0x00,
1511 0x73, 0x00,
1512 0x74, 0x0c,
1513 0x80, 0x00,
1514 0x81, 0x00,
1515 0x82, 0x00,
1516 0x83, 0x00,
1517 0x84, 0x04,
1518 0x85, 0x80,
1519 0x86, 0x24,
1520 0x87, 0x78,
1521 0x88, 0x00,
1522 0x89, 0x00,
1523 0x90, 0x01,
1524 0x91, 0x01,
1525 0xa0, 0x00,
1526 0xa1, 0x00,
1527 0xa2, 0x00,
1528 0xb0, 0x91,
1529 0xb1, 0x0b,
1530 0xc0, 0x4b,
1531 0xc1, 0x00,
1532 0xc2, 0x00,
1533 0xd0, 0x00,
1534 0xd1, 0x00,
1535 0xd2, 0x00,
1536 0xd3, 0x00,
1537 0xd4, 0x00,
1538 0xd5, 0x00,
1539 0xde, 0x00,
1540 0xdf, 0x00,
1541 0x61, 0x38,
1542 0x62, 0x0a,
1543 0x53, 0x13,
1544 0x59, 0x08,
1545 0x55, 0x00,
1546 0x56, 0x40,
1547 0x57, 0x08,
1548 0x58, 0x3d,
1549 0x88, 0x10,
1550 0xa0, 0x00,
1551 0xa0, 0x00,
1552 0xa0, 0x00,
1553 0xa0, 0x04,
1554 0xff, 0xff,
1557 static struct stv0297_config dvbc_philips_tdm1316l_config = {
1558 .demod_address = 0x1c,
1559 .inittab = dvbc_philips_tdm1316l_inittab,
1560 .invert = 0,
1563 static void frontend_init(struct ttusb* ttusb)
1565 switch(le16_to_cpu(ttusb->dev->descriptor.idProduct)) {
1566 case 0x1003: // Hauppauge/TT Nova-USB-S budget (stv0299/ALPS BSRU6|BSBE1(tsa5059))
1567 // try the stv0299 based first
1568 ttusb->fe = dvb_attach(stv0299_attach, &alps_stv0299_config, &ttusb->i2c_adap);
1569 if (ttusb->fe != NULL) {
1570 ttusb->fe->ops.tuner_ops.set_params = philips_tsa5059_tuner_set_params;
1572 if(ttusb->revision == TTUSB_REV_2_2) { // ALPS BSBE1
1573 alps_stv0299_config.inittab = alps_bsbe1_inittab;
1574 dvb_attach(lnbp21_attach, ttusb->fe, &ttusb->i2c_adap, 0, 0);
1575 } else { // ALPS BSRU6
1576 ttusb->fe->ops.set_voltage = ttusb_set_voltage;
1578 break;
1581 // Grundig 29504-491
1582 ttusb->fe = dvb_attach(tda8083_attach, &ttusb_novas_grundig_29504_491_config, &ttusb->i2c_adap);
1583 if (ttusb->fe != NULL) {
1584 ttusb->fe->ops.tuner_ops.set_params = ttusb_novas_grundig_29504_491_tuner_set_params;
1585 ttusb->fe->ops.set_voltage = ttusb_set_voltage;
1586 break;
1588 break;
1590 case 0x1004: // Hauppauge/TT DVB-C budget (ves1820/ALPS TDBE2(sp5659))
1591 ttusb->fe = dvb_attach(ves1820_attach, &alps_tdbe2_config, &ttusb->i2c_adap, read_pwm(ttusb));
1592 if (ttusb->fe != NULL) {
1593 ttusb->fe->ops.tuner_ops.set_params = alps_tdbe2_tuner_set_params;
1594 break;
1597 ttusb->fe = dvb_attach(stv0297_attach, &dvbc_philips_tdm1316l_config, &ttusb->i2c_adap);
1598 if (ttusb->fe != NULL) {
1599 ttusb->fe->ops.tuner_ops.set_params = dvbc_philips_tdm1316l_tuner_set_params;
1600 break;
1602 break;
1604 case 0x1005: // Hauppauge/TT Nova-USB-t budget (tda10046/Philips td1316(tda6651tt) OR cx22700/ALPS TDMB7(??))
1605 // try the ALPS TDMB7 first
1606 ttusb->fe = dvb_attach(cx22700_attach, &alps_tdmb7_config, &ttusb->i2c_adap);
1607 if (ttusb->fe != NULL) {
1608 ttusb->fe->ops.tuner_ops.set_params = alps_tdmb7_tuner_set_params;
1609 break;
1612 // Philips td1316
1613 ttusb->fe = dvb_attach(tda10046_attach, &philips_tdm1316l_config, &ttusb->i2c_adap);
1614 if (ttusb->fe != NULL) {
1615 ttusb->fe->ops.tuner_ops.init = philips_tdm1316l_tuner_init;
1616 ttusb->fe->ops.tuner_ops.set_params = philips_tdm1316l_tuner_set_params;
1617 break;
1619 break;
1622 if (ttusb->fe == NULL) {
1623 printk("dvb-ttusb-budget: A frontend driver was not found for device [%04x:%04x]\n",
1624 le16_to_cpu(ttusb->dev->descriptor.idVendor),
1625 le16_to_cpu(ttusb->dev->descriptor.idProduct));
1626 } else {
1627 if (dvb_register_frontend(&ttusb->adapter, ttusb->fe)) {
1628 printk("dvb-ttusb-budget: Frontend registration failed!\n");
1629 dvb_frontend_detach(ttusb->fe);
1630 ttusb->fe = NULL;
1637 static struct i2c_algorithm ttusb_dec_algo = {
1638 .master_xfer = master_xfer,
1639 .functionality = functionality,
1642 static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
1644 struct usb_device *udev;
1645 struct ttusb *ttusb;
1646 int result;
1648 dprintk("%s: TTUSB DVB connected\n", __func__);
1650 udev = interface_to_usbdev(intf);
1652 if (intf->altsetting->desc.bInterfaceNumber != 1) return -ENODEV;
1654 if (!(ttusb = kzalloc(sizeof(struct ttusb), GFP_KERNEL)))
1655 return -ENOMEM;
1657 ttusb->dev = udev;
1658 ttusb->c = 0;
1659 ttusb->mux_state = 0;
1660 mutex_init(&ttusb->semi2c);
1662 mutex_lock(&ttusb->semi2c);
1664 mutex_init(&ttusb->semusb);
1666 ttusb_setup_interfaces(ttusb);
1668 result = ttusb_alloc_iso_urbs(ttusb);
1669 if (result < 0) {
1670 dprintk("%s: ttusb_alloc_iso_urbs - failed\n", __func__);
1671 mutex_unlock(&ttusb->semi2c);
1672 kfree(ttusb);
1673 return result;
1676 if (ttusb_init_controller(ttusb))
1677 printk("ttusb_init_controller: error\n");
1679 mutex_unlock(&ttusb->semi2c);
1681 result = dvb_register_adapter(&ttusb->adapter,
1682 "Technotrend/Hauppauge Nova-USB",
1683 THIS_MODULE, &udev->dev, adapter_nr);
1684 if (result < 0) {
1685 ttusb_free_iso_urbs(ttusb);
1686 kfree(ttusb);
1687 return result;
1689 ttusb->adapter.priv = ttusb;
1691 /* i2c */
1692 memset(&ttusb->i2c_adap, 0, sizeof(struct i2c_adapter));
1693 strcpy(ttusb->i2c_adap.name, "TTUSB DEC");
1695 i2c_set_adapdata(&ttusb->i2c_adap, ttusb);
1697 ttusb->i2c_adap.class = I2C_CLASS_TV_DIGITAL;
1698 ttusb->i2c_adap.algo = &ttusb_dec_algo;
1699 ttusb->i2c_adap.algo_data = NULL;
1700 ttusb->i2c_adap.dev.parent = &udev->dev;
1702 result = i2c_add_adapter(&ttusb->i2c_adap);
1703 if (result) {
1704 dvb_unregister_adapter (&ttusb->adapter);
1705 return result;
1708 memset(&ttusb->dvb_demux, 0, sizeof(ttusb->dvb_demux));
1710 ttusb->dvb_demux.dmx.capabilities =
1711 DMX_TS_FILTERING | DMX_SECTION_FILTERING;
1712 ttusb->dvb_demux.priv = NULL;
1713 #ifdef TTUSB_HWSECTIONS
1714 ttusb->dvb_demux.filternum = TTUSB_MAXFILTER;
1715 #else
1716 ttusb->dvb_demux.filternum = 32;
1717 #endif
1718 ttusb->dvb_demux.feednum = TTUSB_MAXCHANNEL;
1719 ttusb->dvb_demux.start_feed = ttusb_start_feed;
1720 ttusb->dvb_demux.stop_feed = ttusb_stop_feed;
1721 ttusb->dvb_demux.write_to_decoder = NULL;
1723 if ((result = dvb_dmx_init(&ttusb->dvb_demux)) < 0) {
1724 printk("ttusb_dvb: dvb_dmx_init failed (errno = %d)\n", result);
1725 i2c_del_adapter(&ttusb->i2c_adap);
1726 dvb_unregister_adapter (&ttusb->adapter);
1727 return -ENODEV;
1729 //FIXME dmxdev (nur WAS?)
1730 ttusb->dmxdev.filternum = ttusb->dvb_demux.filternum;
1731 ttusb->dmxdev.demux = &ttusb->dvb_demux.dmx;
1732 ttusb->dmxdev.capabilities = 0;
1734 if ((result = dvb_dmxdev_init(&ttusb->dmxdev, &ttusb->adapter)) < 0) {
1735 printk("ttusb_dvb: dvb_dmxdev_init failed (errno = %d)\n",
1736 result);
1737 dvb_dmx_release(&ttusb->dvb_demux);
1738 i2c_del_adapter(&ttusb->i2c_adap);
1739 dvb_unregister_adapter (&ttusb->adapter);
1740 return -ENODEV;
1743 if (dvb_net_init(&ttusb->adapter, &ttusb->dvbnet, &ttusb->dvb_demux.dmx)) {
1744 printk("ttusb_dvb: dvb_net_init failed!\n");
1745 dvb_dmxdev_release(&ttusb->dmxdev);
1746 dvb_dmx_release(&ttusb->dvb_demux);
1747 i2c_del_adapter(&ttusb->i2c_adap);
1748 dvb_unregister_adapter (&ttusb->adapter);
1749 return -ENODEV;
1752 usb_set_intfdata(intf, (void *) ttusb);
1754 frontend_init(ttusb);
1756 return 0;
1759 static void ttusb_disconnect(struct usb_interface *intf)
1761 struct ttusb *ttusb = usb_get_intfdata(intf);
1763 usb_set_intfdata(intf, NULL);
1765 ttusb->disconnecting = 1;
1767 ttusb_stop_iso_xfer(ttusb);
1769 ttusb->dvb_demux.dmx.close(&ttusb->dvb_demux.dmx);
1770 dvb_net_release(&ttusb->dvbnet);
1771 dvb_dmxdev_release(&ttusb->dmxdev);
1772 dvb_dmx_release(&ttusb->dvb_demux);
1773 if (ttusb->fe != NULL) {
1774 dvb_unregister_frontend(ttusb->fe);
1775 dvb_frontend_detach(ttusb->fe);
1777 i2c_del_adapter(&ttusb->i2c_adap);
1778 dvb_unregister_adapter(&ttusb->adapter);
1780 ttusb_free_iso_urbs(ttusb);
1782 kfree(ttusb);
1784 dprintk("%s: TTUSB DVB disconnected\n", __func__);
1787 static struct usb_device_id ttusb_table[] = {
1788 {USB_DEVICE(0xb48, 0x1003)},
1789 {USB_DEVICE(0xb48, 0x1004)},
1790 {USB_DEVICE(0xb48, 0x1005)},
1794 MODULE_DEVICE_TABLE(usb, ttusb_table);
1796 static struct usb_driver ttusb_driver = {
1797 .name = "ttusb",
1798 .probe = ttusb_probe,
1799 .disconnect = ttusb_disconnect,
1800 .id_table = ttusb_table,
1803 static int __init ttusb_init(void)
1805 int err;
1807 if ((err = usb_register(&ttusb_driver)) < 0) {
1808 printk("%s: usb_register failed! Error number %d",
1809 __FILE__, err);
1810 return err;
1813 return 0;
1816 static void __exit ttusb_exit(void)
1818 usb_deregister(&ttusb_driver);
1821 module_init(ttusb_init);
1822 module_exit(ttusb_exit);
1824 MODULE_AUTHOR("Holger Waechtler <holger@convergence.de>");
1825 MODULE_DESCRIPTION("TTUSB DVB Driver");
1826 MODULE_LICENSE("GPL");
1827 MODULE_FIRMWARE("ttusb-budget/dspbootcode.bin");