sched: Remove double_rq_lock() from __migrate_task()
[linux/fpc-iii.git] / drivers / media / usb / ttusb-budget / dvb-ttusb-budget.c
blobf8a60c19753476f53c87bf44b555031eb0e8b201
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 static int ttusb_cmd(struct ttusb *ttusb,
138 const u8 * data, int len, int needresult)
140 int actual_len;
141 int err;
142 int i;
144 if (debug >= 3) {
145 printk(KERN_DEBUG ">");
146 for (i = 0; i < len; ++i)
147 printk(KERN_CONT " %02x", data[i]);
148 printk(KERN_CONT "\n");
151 if (mutex_lock_interruptible(&ttusb->semusb) < 0)
152 return -EAGAIN;
154 err = usb_bulk_msg(ttusb->dev, ttusb->bulk_out_pipe,
155 (u8 *) data, len, &actual_len, 1000);
156 if (err != 0) {
157 dprintk("%s: usb_bulk_msg(send) failed, err == %i!\n",
158 __func__, err);
159 mutex_unlock(&ttusb->semusb);
160 return err;
162 if (actual_len != len) {
163 dprintk("%s: only wrote %d of %d bytes\n", __func__,
164 actual_len, len);
165 mutex_unlock(&ttusb->semusb);
166 return -1;
169 err = usb_bulk_msg(ttusb->dev, ttusb->bulk_in_pipe,
170 ttusb->last_result, 32, &actual_len, 1000);
172 if (err != 0) {
173 printk("%s: failed, receive error %d\n", __func__,
174 err);
175 mutex_unlock(&ttusb->semusb);
176 return err;
179 if (debug >= 3) {
180 actual_len = ttusb->last_result[3] + 4;
181 printk(KERN_DEBUG "<");
182 for (i = 0; i < actual_len; ++i)
183 printk(KERN_CONT " %02x", ttusb->last_result[i]);
184 printk(KERN_CONT "\n");
187 if (!needresult)
188 mutex_unlock(&ttusb->semusb);
189 return 0;
192 static int ttusb_result(struct ttusb *ttusb, u8 * data, int len)
194 memcpy(data, ttusb->last_result, len);
195 mutex_unlock(&ttusb->semusb);
196 return 0;
199 static int ttusb_i2c_msg(struct ttusb *ttusb,
200 u8 addr, u8 * snd_buf, u8 snd_len, u8 * rcv_buf,
201 u8 rcv_len)
203 u8 b[0x28];
204 u8 id = ++ttusb->c;
205 int i, err;
207 if (snd_len > 0x28 - 7 || rcv_len > 0x20 - 7)
208 return -EINVAL;
210 b[0] = 0xaa;
211 b[1] = id;
212 b[2] = 0x31;
213 b[3] = snd_len + 3;
214 b[4] = addr << 1;
215 b[5] = snd_len;
216 b[6] = rcv_len;
218 for (i = 0; i < snd_len; i++)
219 b[7 + i] = snd_buf[i];
221 err = ttusb_cmd(ttusb, b, snd_len + 7, 1);
223 if (err)
224 return -EREMOTEIO;
226 err = ttusb_result(ttusb, b, 0x20);
228 /* check if the i2c transaction was successful */
229 if ((snd_len != b[5]) || (rcv_len != b[6])) return -EREMOTEIO;
231 if (rcv_len > 0) {
233 if (err || b[0] != 0x55 || b[1] != id) {
234 dprintk
235 ("%s: usb_bulk_msg(recv) failed, err == %i, id == %02x, b == ",
236 __func__, err, id);
237 return -EREMOTEIO;
240 for (i = 0; i < rcv_len; i++)
241 rcv_buf[i] = b[7 + i];
244 return rcv_len;
247 static int master_xfer(struct i2c_adapter* adapter, struct i2c_msg *msg, int num)
249 struct ttusb *ttusb = i2c_get_adapdata(adapter);
250 int i = 0;
251 int inc;
253 if (mutex_lock_interruptible(&ttusb->semi2c) < 0)
254 return -EAGAIN;
256 while (i < num) {
257 u8 addr, snd_len, rcv_len, *snd_buf, *rcv_buf;
258 int err;
260 if (num > i + 1 && (msg[i + 1].flags & I2C_M_RD)) {
261 addr = msg[i].addr;
262 snd_buf = msg[i].buf;
263 snd_len = msg[i].len;
264 rcv_buf = msg[i + 1].buf;
265 rcv_len = msg[i + 1].len;
266 inc = 2;
267 } else {
268 addr = msg[i].addr;
269 snd_buf = msg[i].buf;
270 snd_len = msg[i].len;
271 rcv_buf = NULL;
272 rcv_len = 0;
273 inc = 1;
276 err = ttusb_i2c_msg(ttusb, addr,
277 snd_buf, snd_len, rcv_buf, rcv_len);
279 if (err < rcv_len) {
280 dprintk("%s: i == %i\n", __func__, i);
281 break;
284 i += inc;
287 mutex_unlock(&ttusb->semi2c);
288 return i;
291 static int ttusb_boot_dsp(struct ttusb *ttusb)
293 const struct firmware *fw;
294 int i, err;
295 u8 b[40];
297 err = request_firmware(&fw, "ttusb-budget/dspbootcode.bin",
298 &ttusb->dev->dev);
299 if (err) {
300 printk(KERN_ERR "ttusb-budget: failed to request firmware\n");
301 return err;
304 /* BootBlock */
305 b[0] = 0xaa;
306 b[2] = 0x13;
307 b[3] = 28;
309 /* upload dsp code in 32 byte steps (36 didn't work for me ...) */
310 /* 32 is max packet size, no messages should be splitted. */
311 for (i = 0; i < fw->size; i += 28) {
312 memcpy(&b[4], &fw->data[i], 28);
314 b[1] = ++ttusb->c;
316 err = ttusb_cmd(ttusb, b, 32, 0);
317 if (err)
318 goto done;
321 /* last block ... */
322 b[1] = ++ttusb->c;
323 b[2] = 0x13;
324 b[3] = 0;
326 err = ttusb_cmd(ttusb, b, 4, 0);
327 if (err)
328 goto done;
330 /* BootEnd */
331 b[1] = ++ttusb->c;
332 b[2] = 0x14;
333 b[3] = 0;
335 err = ttusb_cmd(ttusb, b, 4, 0);
337 done:
338 release_firmware(fw);
339 if (err) {
340 dprintk("%s: usb_bulk_msg() failed, return value %i!\n",
341 __func__, err);
344 return err;
347 static int ttusb_set_channel(struct ttusb *ttusb, int chan_id, int filter_type,
348 int pid)
350 int err;
351 /* SetChannel */
352 u8 b[] = { 0xaa, ++ttusb->c, 0x22, 4, chan_id, filter_type,
353 (pid >> 8) & 0xff, pid & 0xff
356 err = ttusb_cmd(ttusb, b, sizeof(b), 0);
357 return err;
360 static int ttusb_del_channel(struct ttusb *ttusb, int channel_id)
362 int err;
363 /* DelChannel */
364 u8 b[] = { 0xaa, ++ttusb->c, 0x23, 1, channel_id };
366 err = ttusb_cmd(ttusb, b, sizeof(b), 0);
367 return err;
370 #ifdef TTUSB_HWSECTIONS
371 static int ttusb_set_filter(struct ttusb *ttusb, int filter_id,
372 int associated_chan, u8 filter[8], u8 mask[8])
374 int err;
375 /* SetFilter */
376 u8 b[] = { 0xaa, 0, 0x24, 0x1a, filter_id, associated_chan,
377 filter[0], filter[1], filter[2], filter[3],
378 filter[4], filter[5], filter[6], filter[7],
379 filter[8], filter[9], filter[10], filter[11],
380 mask[0], mask[1], mask[2], mask[3],
381 mask[4], mask[5], mask[6], mask[7],
382 mask[8], mask[9], mask[10], mask[11]
385 err = ttusb_cmd(ttusb, b, sizeof(b), 0);
386 return err;
389 static int ttusb_del_filter(struct ttusb *ttusb, int filter_id)
391 int err;
392 /* DelFilter */
393 u8 b[] = { 0xaa, ++ttusb->c, 0x25, 1, filter_id };
395 err = ttusb_cmd(ttusb, b, sizeof(b), 0);
396 return err;
398 #endif
400 static int ttusb_init_controller(struct ttusb *ttusb)
402 u8 b0[] = { 0xaa, ++ttusb->c, 0x15, 1, 0 };
403 u8 b1[] = { 0xaa, ++ttusb->c, 0x15, 1, 1 };
404 u8 b2[] = { 0xaa, ++ttusb->c, 0x32, 1, 0 };
405 /* i2c write read: 5 bytes, addr 0x10, 0x02 bytes write, 1 bytes read. */
406 u8 b3[] =
407 { 0xaa, ++ttusb->c, 0x31, 5, 0x10, 0x02, 0x01, 0x00, 0x1e };
408 u8 b4[] =
409 { 0x55, ttusb->c, 0x31, 4, 0x10, 0x02, 0x01, 0x00, 0x1e };
411 u8 get_version[] = { 0xaa, ++ttusb->c, 0x17, 5, 0, 0, 0, 0, 0 };
412 u8 get_dsp_version[0x20] =
413 { 0xaa, ++ttusb->c, 0x26, 28, 0, 0, 0, 0, 0 };
414 int err;
416 /* reset board */
417 if ((err = ttusb_cmd(ttusb, b0, sizeof(b0), 0)))
418 return err;
420 /* reset board (again?) */
421 if ((err = ttusb_cmd(ttusb, b1, sizeof(b1), 0)))
422 return err;
424 ttusb_boot_dsp(ttusb);
426 /* set i2c bit rate */
427 if ((err = ttusb_cmd(ttusb, b2, sizeof(b2), 0)))
428 return err;
430 if ((err = ttusb_cmd(ttusb, b3, sizeof(b3), 1)))
431 return err;
433 err = ttusb_result(ttusb, b4, sizeof(b4));
435 if ((err = ttusb_cmd(ttusb, get_version, sizeof(get_version), 1)))
436 return err;
438 if ((err = ttusb_result(ttusb, get_version, sizeof(get_version))))
439 return err;
441 dprintk("%s: stc-version: %c%c%c%c%c\n", __func__,
442 get_version[4], get_version[5], get_version[6],
443 get_version[7], get_version[8]);
445 if (memcmp(get_version + 4, "V 0.0", 5) &&
446 memcmp(get_version + 4, "V 1.1", 5) &&
447 memcmp(get_version + 4, "V 2.1", 5) &&
448 memcmp(get_version + 4, "V 2.2", 5)) {
449 printk
450 ("%s: unknown STC version %c%c%c%c%c, please report!\n",
451 __func__, get_version[4], get_version[5],
452 get_version[6], get_version[7], get_version[8]);
455 ttusb->revision = ((get_version[6] - '0') << 4) |
456 (get_version[8] - '0');
458 err =
459 ttusb_cmd(ttusb, get_dsp_version, sizeof(get_dsp_version), 1);
460 if (err)
461 return err;
463 err =
464 ttusb_result(ttusb, get_dsp_version, sizeof(get_dsp_version));
465 if (err)
466 return err;
467 printk("%s: dsp-version: %c%c%c\n", __func__,
468 get_dsp_version[4], get_dsp_version[5], get_dsp_version[6]);
469 return 0;
472 #ifdef TTUSB_DISEQC
473 static int ttusb_send_diseqc(struct dvb_frontend* fe,
474 const struct dvb_diseqc_master_cmd *cmd)
476 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
477 u8 b[12] = { 0xaa, ++ttusb->c, 0x18 };
479 int err;
481 b[3] = 4 + 2 + cmd->msg_len;
482 b[4] = 0xFF; /* send diseqc master, not burst */
483 b[5] = cmd->msg_len;
485 memcpy(b + 5, cmd->msg, cmd->msg_len);
487 /* Diseqc */
488 if ((err = ttusb_cmd(ttusb, b, 4 + b[3], 0))) {
489 dprintk("%s: usb_bulk_msg() failed, return value %i!\n",
490 __func__, err);
493 return err;
495 #endif
497 static int ttusb_update_lnb(struct ttusb *ttusb)
499 u8 b[] = { 0xaa, ++ttusb->c, 0x16, 5, /*power: */ 1,
500 ttusb->voltage == SEC_VOLTAGE_18 ? 0 : 1,
501 ttusb->tone == SEC_TONE_ON ? 1 : 0, 1, 1
503 int err;
505 /* SetLNB */
506 if ((err = ttusb_cmd(ttusb, b, sizeof(b), 0))) {
507 dprintk("%s: usb_bulk_msg() failed, return value %i!\n",
508 __func__, err);
511 return err;
514 static int ttusb_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage)
516 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
518 ttusb->voltage = voltage;
519 return ttusb_update_lnb(ttusb);
522 #ifdef TTUSB_TONE
523 static int ttusb_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
525 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
527 ttusb->tone = tone;
528 return ttusb_update_lnb(ttusb);
530 #endif
533 #if 0
534 static void ttusb_set_led_freq(struct ttusb *ttusb, u8 freq)
536 u8 b[] = { 0xaa, ++ttusb->c, 0x19, 1, freq };
537 int err, actual_len;
539 err = ttusb_cmd(ttusb, b, sizeof(b), 0);
540 if (err) {
541 dprintk("%s: usb_bulk_msg() failed, return value %i!\n",
542 __func__, err);
545 #endif
547 /*****************************************************************************/
549 #ifdef TTUSB_HWSECTIONS
550 static void ttusb_handle_ts_data(struct ttusb_channel *channel,
551 const u8 * data, int len);
552 static void ttusb_handle_sec_data(struct ttusb_channel *channel,
553 const u8 * data, int len);
554 #endif
556 static int numpkt, numts, numstuff, numsec, numinvalid;
557 static unsigned long lastj;
559 static void ttusb_process_muxpack(struct ttusb *ttusb, const u8 * muxpack,
560 int len)
562 u16 csum = 0, cc;
563 int i;
565 if (len < 4 || len & 0x1) {
566 pr_warn("%s: muxpack has invalid len %d\n", __func__, len);
567 numinvalid++;
568 return;
571 for (i = 0; i < len; i += 2)
572 csum ^= le16_to_cpup((__le16 *) (muxpack + i));
573 if (csum) {
574 printk("%s: muxpack with incorrect checksum, ignoring\n",
575 __func__);
576 numinvalid++;
577 return;
580 cc = (muxpack[len - 4] << 8) | muxpack[len - 3];
581 cc &= 0x7FFF;
582 if ((cc != ttusb->cc) && (ttusb->cc != -1))
583 printk("%s: cc discontinuity (%d frames missing)\n",
584 __func__, (cc - ttusb->cc) & 0x7FFF);
585 ttusb->cc = (cc + 1) & 0x7FFF;
586 if (muxpack[0] & 0x80) {
587 #ifdef TTUSB_HWSECTIONS
588 /* section data */
589 int pusi = muxpack[0] & 0x40;
590 int channel = muxpack[0] & 0x1F;
591 int payload = muxpack[1];
592 const u8 *data = muxpack + 2;
593 /* check offset flag */
594 if (muxpack[0] & 0x20)
595 data++;
597 ttusb_handle_sec_data(ttusb->channel + channel, data,
598 payload);
599 data += payload;
601 if ((!!(ttusb->muxpack[0] & 0x20)) ^
602 !!(ttusb->muxpack[1] & 1))
603 data++;
604 #warning TODO: pusi
605 printk("cc: %04x\n", (data[0] << 8) | data[1]);
606 #endif
607 numsec++;
608 } else if (muxpack[0] == 0x47) {
609 #ifdef TTUSB_HWSECTIONS
610 /* we have TS data here! */
611 int pid = ((muxpack[1] & 0x0F) << 8) | muxpack[2];
612 int channel;
613 for (channel = 0; channel < TTUSB_MAXCHANNEL; ++channel)
614 if (ttusb->channel[channel].active
615 && (pid == ttusb->channel[channel].pid))
616 ttusb_handle_ts_data(ttusb->channel +
617 channel, muxpack,
618 188);
619 #endif
620 numts++;
621 dvb_dmx_swfilter_packets(&ttusb->dvb_demux, muxpack, 1);
622 } else if (muxpack[0] != 0) {
623 numinvalid++;
624 printk("illegal muxpack type %02x\n", muxpack[0]);
625 } else
626 numstuff++;
629 static void ttusb_process_frame(struct ttusb *ttusb, u8 * data, int len)
631 int maxwork = 1024;
632 while (len) {
633 if (!(maxwork--)) {
634 printk("%s: too much work\n", __func__);
635 break;
638 switch (ttusb->mux_state) {
639 case 0:
640 case 1:
641 case 2:
642 len--;
643 if (*data++ == 0xAA)
644 ++ttusb->mux_state;
645 else {
646 ttusb->mux_state = 0;
647 if (ttusb->insync) {
648 dprintk("%s: %02x\n",
649 __func__, data[-1]);
650 printk(KERN_INFO "%s: lost sync.\n",
651 __func__);
652 ttusb->insync = 0;
655 break;
656 case 3:
657 ttusb->insync = 1;
658 len--;
659 ttusb->mux_npacks = *data++;
660 ++ttusb->mux_state;
661 ttusb->muxpack_ptr = 0;
662 /* maximum bytes, until we know the length */
663 ttusb->muxpack_len = 2;
664 break;
665 case 4:
667 int avail;
668 avail = len;
669 if (avail >
670 (ttusb->muxpack_len -
671 ttusb->muxpack_ptr))
672 avail =
673 ttusb->muxpack_len -
674 ttusb->muxpack_ptr;
675 memcpy(ttusb->muxpack + ttusb->muxpack_ptr,
676 data, avail);
677 ttusb->muxpack_ptr += avail;
678 BUG_ON(ttusb->muxpack_ptr > 264);
679 data += avail;
680 len -= avail;
681 /* determine length */
682 if (ttusb->muxpack_ptr == 2) {
683 if (ttusb->muxpack[0] & 0x80) {
684 ttusb->muxpack_len =
685 ttusb->muxpack[1] + 2;
686 if (ttusb->
687 muxpack[0] & 0x20)
688 ttusb->
689 muxpack_len++;
690 if ((!!
691 (ttusb->
692 muxpack[0] & 0x20)) ^
693 !!(ttusb->
694 muxpack[1] & 1))
695 ttusb->
696 muxpack_len++;
697 ttusb->muxpack_len += 4;
698 } else if (ttusb->muxpack[0] ==
699 0x47)
700 ttusb->muxpack_len =
701 188 + 4;
702 else if (ttusb->muxpack[0] == 0x00)
703 ttusb->muxpack_len =
704 ttusb->muxpack[1] + 2 +
706 else {
707 dprintk
708 ("%s: invalid state: first byte is %x\n",
709 __func__,
710 ttusb->muxpack[0]);
711 ttusb->mux_state = 0;
716 * if length is valid and we reached the end:
717 * goto next muxpack
719 if ((ttusb->muxpack_ptr >= 2) &&
720 (ttusb->muxpack_ptr ==
721 ttusb->muxpack_len)) {
722 ttusb_process_muxpack(ttusb,
723 ttusb->
724 muxpack,
725 ttusb->
726 muxpack_ptr);
727 ttusb->muxpack_ptr = 0;
728 /* maximum bytes, until we know the length */
729 ttusb->muxpack_len = 2;
732 * no muxpacks left?
733 * return to search-sync state
735 if (!ttusb->mux_npacks--) {
736 ttusb->mux_state = 0;
737 break;
740 break;
742 default:
743 BUG();
744 break;
749 static void ttusb_iso_irq(struct urb *urb)
751 struct ttusb *ttusb = urb->context;
752 struct usb_iso_packet_descriptor *d;
753 u8 *data;
754 int len, i;
756 if (!ttusb->iso_streaming)
757 return;
759 #if 0
760 printk("%s: status %d, errcount == %d, length == %i\n",
761 __func__,
762 urb->status, urb->error_count, urb->actual_length);
763 #endif
765 if (!urb->status) {
766 for (i = 0; i < urb->number_of_packets; ++i) {
767 numpkt++;
768 if (time_after_eq(jiffies, lastj + HZ)) {
769 dprintk("frames/s: %lu (ts: %d, stuff %d, "
770 "sec: %d, invalid: %d, all: %d)\n",
771 numpkt * HZ / (jiffies - lastj),
772 numts, numstuff, numsec, numinvalid,
773 numts + numstuff + numsec + numinvalid);
774 numts = numstuff = numsec = numinvalid = 0;
775 lastj = jiffies;
776 numpkt = 0;
778 d = &urb->iso_frame_desc[i];
779 data = urb->transfer_buffer + d->offset;
780 len = d->actual_length;
781 d->actual_length = 0;
782 d->status = 0;
783 ttusb_process_frame(ttusb, data, len);
786 usb_submit_urb(urb, GFP_ATOMIC);
789 static void ttusb_free_iso_urbs(struct ttusb *ttusb)
791 int i;
793 for (i = 0; i < ISO_BUF_COUNT; i++)
794 if (ttusb->iso_urb[i])
795 usb_free_urb(ttusb->iso_urb[i]);
797 pci_free_consistent(NULL,
798 ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF *
799 ISO_BUF_COUNT, ttusb->iso_buffer,
800 ttusb->iso_dma_handle);
803 static int ttusb_alloc_iso_urbs(struct ttusb *ttusb)
805 int i;
807 ttusb->iso_buffer = pci_alloc_consistent(NULL,
808 ISO_FRAME_SIZE *
809 FRAMES_PER_ISO_BUF *
810 ISO_BUF_COUNT,
811 &ttusb->iso_dma_handle);
813 if (!ttusb->iso_buffer) {
814 dprintk("%s: pci_alloc_consistent - not enough memory\n",
815 __func__);
816 return -ENOMEM;
819 memset(ttusb->iso_buffer, 0,
820 ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF * ISO_BUF_COUNT);
822 for (i = 0; i < ISO_BUF_COUNT; i++) {
823 struct urb *urb;
825 if (!
826 (urb =
827 usb_alloc_urb(FRAMES_PER_ISO_BUF, GFP_ATOMIC))) {
828 ttusb_free_iso_urbs(ttusb);
829 return -ENOMEM;
832 ttusb->iso_urb[i] = urb;
835 return 0;
838 static void ttusb_stop_iso_xfer(struct ttusb *ttusb)
840 int i;
842 for (i = 0; i < ISO_BUF_COUNT; i++)
843 usb_kill_urb(ttusb->iso_urb[i]);
845 ttusb->iso_streaming = 0;
848 static int ttusb_start_iso_xfer(struct ttusb *ttusb)
850 int i, j, err, buffer_offset = 0;
852 if (ttusb->iso_streaming) {
853 printk("%s: iso xfer already running!\n", __func__);
854 return 0;
857 ttusb->cc = -1;
858 ttusb->insync = 0;
859 ttusb->mux_state = 0;
861 for (i = 0; i < ISO_BUF_COUNT; i++) {
862 int frame_offset = 0;
863 struct urb *urb = ttusb->iso_urb[i];
865 urb->dev = ttusb->dev;
866 urb->context = ttusb;
867 urb->complete = ttusb_iso_irq;
868 urb->pipe = ttusb->isoc_in_pipe;
869 urb->transfer_flags = URB_ISO_ASAP;
870 urb->interval = 1;
871 urb->number_of_packets = FRAMES_PER_ISO_BUF;
872 urb->transfer_buffer_length =
873 ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF;
874 urb->transfer_buffer = ttusb->iso_buffer + buffer_offset;
875 buffer_offset += ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF;
877 for (j = 0; j < FRAMES_PER_ISO_BUF; j++) {
878 urb->iso_frame_desc[j].offset = frame_offset;
879 urb->iso_frame_desc[j].length = ISO_FRAME_SIZE;
880 frame_offset += ISO_FRAME_SIZE;
884 for (i = 0; i < ISO_BUF_COUNT; i++) {
885 if ((err = usb_submit_urb(ttusb->iso_urb[i], GFP_ATOMIC))) {
886 ttusb_stop_iso_xfer(ttusb);
887 printk
888 ("%s: failed urb submission (%i: err = %i)!\n",
889 __func__, i, err);
890 return err;
894 ttusb->iso_streaming = 1;
896 return 0;
899 #ifdef TTUSB_HWSECTIONS
900 static void ttusb_handle_ts_data(struct dvb_demux_feed *dvbdmxfeed, const u8 * data,
901 int len)
903 dvbdmxfeed->cb.ts(data, len, 0, 0, &dvbdmxfeed->feed.ts, 0);
906 static void ttusb_handle_sec_data(struct dvb_demux_feed *dvbdmxfeed, const u8 * data,
907 int len)
909 // struct dvb_demux_feed *dvbdmxfeed = channel->dvbdmxfeed;
910 #error TODO: handle ugly stuff
911 // dvbdmxfeed->cb.sec(data, len, 0, 0, &dvbdmxfeed->feed.sec, 0);
913 #endif
915 static int ttusb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
917 struct ttusb *ttusb = (struct ttusb *) dvbdmxfeed->demux;
918 int feed_type = 1;
920 dprintk("ttusb_start_feed\n");
922 switch (dvbdmxfeed->type) {
923 case DMX_TYPE_TS:
924 break;
925 case DMX_TYPE_SEC:
926 break;
927 default:
928 return -EINVAL;
931 if (dvbdmxfeed->type == DMX_TYPE_TS) {
932 switch (dvbdmxfeed->pes_type) {
933 case DMX_PES_VIDEO:
934 case DMX_PES_AUDIO:
935 case DMX_PES_TELETEXT:
936 case DMX_PES_PCR:
937 case DMX_PES_OTHER:
938 break;
939 default:
940 return -EINVAL;
944 #ifdef TTUSB_HWSECTIONS
945 #error TODO: allocate filters
946 if (dvbdmxfeed->type == DMX_TYPE_TS) {
947 feed_type = 1;
948 } else if (dvbdmxfeed->type == DMX_TYPE_SEC) {
949 feed_type = 2;
951 #endif
953 ttusb_set_channel(ttusb, dvbdmxfeed->index, feed_type, dvbdmxfeed->pid);
955 if (0 == ttusb->running_feed_count++)
956 ttusb_start_iso_xfer(ttusb);
958 return 0;
961 static int ttusb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
963 struct ttusb *ttusb = (struct ttusb *) dvbdmxfeed->demux;
965 ttusb_del_channel(ttusb, dvbdmxfeed->index);
967 if (--ttusb->running_feed_count == 0)
968 ttusb_stop_iso_xfer(ttusb);
970 return 0;
973 static int ttusb_setup_interfaces(struct ttusb *ttusb)
975 usb_set_interface(ttusb->dev, 1, 1);
977 ttusb->bulk_out_pipe = usb_sndbulkpipe(ttusb->dev, 1);
978 ttusb->bulk_in_pipe = usb_rcvbulkpipe(ttusb->dev, 1);
979 ttusb->isoc_in_pipe = usb_rcvisocpipe(ttusb->dev, 2);
981 return 0;
984 #if 0
985 static u8 stc_firmware[8192];
987 static int stc_open(struct inode *inode, struct file *file)
989 struct ttusb *ttusb = file->private_data;
990 int addr;
992 for (addr = 0; addr < 8192; addr += 16) {
993 u8 snd_buf[2] = { addr >> 8, addr & 0xFF };
994 ttusb_i2c_msg(ttusb, 0x50, snd_buf, 2, stc_firmware + addr,
995 16);
998 return 0;
1001 static ssize_t stc_read(struct file *file, char *buf, size_t count,
1002 loff_t *offset)
1004 return simple_read_from_buffer(buf, count, offset, stc_firmware, 8192);
1007 static int stc_release(struct inode *inode, struct file *file)
1009 return 0;
1012 static const struct file_operations stc_fops = {
1013 .owner = THIS_MODULE,
1014 .read = stc_read,
1015 .open = stc_open,
1016 .release = stc_release,
1018 #endif
1020 static u32 functionality(struct i2c_adapter *adapter)
1022 return I2C_FUNC_I2C;
1027 static int alps_tdmb7_tuner_set_params(struct dvb_frontend *fe)
1029 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1030 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
1031 u8 data[4];
1032 struct i2c_msg msg = {.addr=0x61, .flags=0, .buf=data, .len=sizeof(data) };
1033 u32 div;
1035 div = (p->frequency + 36166667) / 166667;
1037 data[0] = (div >> 8) & 0x7f;
1038 data[1] = div & 0xff;
1039 data[2] = ((div >> 10) & 0x60) | 0x85;
1040 data[3] = p->frequency < 592000000 ? 0x40 : 0x80;
1042 if (fe->ops.i2c_gate_ctrl)
1043 fe->ops.i2c_gate_ctrl(fe, 1);
1044 if (i2c_transfer(&ttusb->i2c_adap, &msg, 1) != 1) return -EIO;
1045 return 0;
1048 static struct cx22700_config alps_tdmb7_config = {
1049 .demod_address = 0x43,
1056 static int philips_tdm1316l_tuner_init(struct dvb_frontend* fe)
1058 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
1059 static u8 td1316_init[] = { 0x0b, 0xf5, 0x85, 0xab };
1060 static u8 disable_mc44BC374c[] = { 0x1d, 0x74, 0xa0, 0x68 };
1061 struct i2c_msg tuner_msg = { .addr=0x60, .flags=0, .buf=td1316_init, .len=sizeof(td1316_init) };
1063 // setup PLL configuration
1064 if (fe->ops.i2c_gate_ctrl)
1065 fe->ops.i2c_gate_ctrl(fe, 1);
1066 if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1) return -EIO;
1067 msleep(1);
1069 // disable the mc44BC374c (do not check for errors)
1070 tuner_msg.addr = 0x65;
1071 tuner_msg.buf = disable_mc44BC374c;
1072 tuner_msg.len = sizeof(disable_mc44BC374c);
1073 if (fe->ops.i2c_gate_ctrl)
1074 fe->ops.i2c_gate_ctrl(fe, 1);
1075 if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1) {
1076 i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1);
1079 return 0;
1082 static int philips_tdm1316l_tuner_set_params(struct dvb_frontend *fe)
1084 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1085 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
1086 u8 tuner_buf[4];
1087 struct i2c_msg tuner_msg = {.addr=0x60, .flags=0, .buf=tuner_buf, .len=sizeof(tuner_buf) };
1088 int tuner_frequency = 0;
1089 u8 band, cp, filter;
1091 // determine charge pump
1092 tuner_frequency = p->frequency + 36130000;
1093 if (tuner_frequency < 87000000) return -EINVAL;
1094 else if (tuner_frequency < 130000000) cp = 3;
1095 else if (tuner_frequency < 160000000) cp = 5;
1096 else if (tuner_frequency < 200000000) cp = 6;
1097 else if (tuner_frequency < 290000000) cp = 3;
1098 else if (tuner_frequency < 420000000) cp = 5;
1099 else if (tuner_frequency < 480000000) cp = 6;
1100 else if (tuner_frequency < 620000000) cp = 3;
1101 else if (tuner_frequency < 830000000) cp = 5;
1102 else if (tuner_frequency < 895000000) cp = 7;
1103 else return -EINVAL;
1105 // determine band
1106 if (p->frequency < 49000000)
1107 return -EINVAL;
1108 else if (p->frequency < 159000000)
1109 band = 1;
1110 else if (p->frequency < 444000000)
1111 band = 2;
1112 else if (p->frequency < 861000000)
1113 band = 4;
1114 else return -EINVAL;
1116 // setup PLL filter
1117 switch (p->bandwidth_hz) {
1118 case 6000000:
1119 tda1004x_writereg(fe, 0x0C, 0);
1120 filter = 0;
1121 break;
1123 case 7000000:
1124 tda1004x_writereg(fe, 0x0C, 0);
1125 filter = 0;
1126 break;
1128 case 8000000:
1129 tda1004x_writereg(fe, 0x0C, 0xFF);
1130 filter = 1;
1131 break;
1133 default:
1134 return -EINVAL;
1137 // calculate divisor
1138 // ((36130000+((1000000/6)/2)) + Finput)/(1000000/6)
1139 tuner_frequency = (((p->frequency / 1000) * 6) + 217280) / 1000;
1141 // setup tuner buffer
1142 tuner_buf[0] = tuner_frequency >> 8;
1143 tuner_buf[1] = tuner_frequency & 0xff;
1144 tuner_buf[2] = 0xca;
1145 tuner_buf[3] = (cp << 5) | (filter << 3) | band;
1147 if (fe->ops.i2c_gate_ctrl)
1148 fe->ops.i2c_gate_ctrl(fe, 1);
1149 if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1)
1150 return -EIO;
1152 msleep(1);
1153 return 0;
1156 static int philips_tdm1316l_request_firmware(struct dvb_frontend* fe, const struct firmware **fw, char* name)
1158 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
1160 return request_firmware(fw, name, &ttusb->dev->dev);
1163 static struct tda1004x_config philips_tdm1316l_config = {
1165 .demod_address = 0x8,
1166 .invert = 1,
1167 .invert_oclk = 0,
1168 .request_firmware = philips_tdm1316l_request_firmware,
1171 static u8 alps_bsbe1_inittab[] = {
1172 0x01, 0x15,
1173 0x02, 0x30,
1174 0x03, 0x00,
1175 0x04, 0x7d, /* F22FR = 0x7d, F22 = f_VCO / 128 / 0x7d = 22 kHz */
1176 0x05, 0x35, /* I2CT = 0, SCLT = 1, SDAT = 1 */
1177 0x06, 0x40, /* DAC not used, set to high impendance mode */
1178 0x07, 0x00, /* DAC LSB */
1179 0x08, 0x40, /* DiSEqC off, LNB power on OP2/LOCK pin on */
1180 0x09, 0x00, /* FIFO */
1181 0x0c, 0x51, /* OP1 ctl = Normal, OP1 val = 1 (LNB Power ON) */
1182 0x0d, 0x82, /* DC offset compensation = ON, beta_agc1 = 2 */
1183 0x0e, 0x23, /* alpha_tmg = 2, beta_tmg = 3 */
1184 0x10, 0x3f, // AGC2 0x3d
1185 0x11, 0x84,
1186 0x12, 0xb9,
1187 0x15, 0xc9, // lock detector threshold
1188 0x16, 0x00,
1189 0x17, 0x00,
1190 0x18, 0x00,
1191 0x19, 0x00,
1192 0x1a, 0x00,
1193 0x1f, 0x50,
1194 0x20, 0x00,
1195 0x21, 0x00,
1196 0x22, 0x00,
1197 0x23, 0x00,
1198 0x28, 0x00, // out imp: normal out type: parallel FEC mode:0
1199 0x29, 0x1e, // 1/2 threshold
1200 0x2a, 0x14, // 2/3 threshold
1201 0x2b, 0x0f, // 3/4 threshold
1202 0x2c, 0x09, // 5/6 threshold
1203 0x2d, 0x05, // 7/8 threshold
1204 0x2e, 0x01,
1205 0x31, 0x1f, // test all FECs
1206 0x32, 0x19, // viterbi and synchro search
1207 0x33, 0xfc, // rs control
1208 0x34, 0x93, // error control
1209 0x0f, 0x92,
1210 0xff, 0xff
1213 static u8 alps_bsru6_inittab[] = {
1214 0x01, 0x15,
1215 0x02, 0x30,
1216 0x03, 0x00,
1217 0x04, 0x7d, /* F22FR = 0x7d, F22 = f_VCO / 128 / 0x7d = 22 kHz */
1218 0x05, 0x35, /* I2CT = 0, SCLT = 1, SDAT = 1 */
1219 0x06, 0x40, /* DAC not used, set to high impendance mode */
1220 0x07, 0x00, /* DAC LSB */
1221 0x08, 0x40, /* DiSEqC off, LNB power on OP2/LOCK pin on */
1222 0x09, 0x00, /* FIFO */
1223 0x0c, 0x51, /* OP1 ctl = Normal, OP1 val = 1 (LNB Power ON) */
1224 0x0d, 0x82, /* DC offset compensation = ON, beta_agc1 = 2 */
1225 0x0e, 0x23, /* alpha_tmg = 2, beta_tmg = 3 */
1226 0x10, 0x3f, // AGC2 0x3d
1227 0x11, 0x84,
1228 0x12, 0xb9,
1229 0x15, 0xc9, // lock detector threshold
1230 0x16, 0x00,
1231 0x17, 0x00,
1232 0x18, 0x00,
1233 0x19, 0x00,
1234 0x1a, 0x00,
1235 0x1f, 0x50,
1236 0x20, 0x00,
1237 0x21, 0x00,
1238 0x22, 0x00,
1239 0x23, 0x00,
1240 0x28, 0x00, // out imp: normal out type: parallel FEC mode:0
1241 0x29, 0x1e, // 1/2 threshold
1242 0x2a, 0x14, // 2/3 threshold
1243 0x2b, 0x0f, // 3/4 threshold
1244 0x2c, 0x09, // 5/6 threshold
1245 0x2d, 0x05, // 7/8 threshold
1246 0x2e, 0x01,
1247 0x31, 0x1f, // test all FECs
1248 0x32, 0x19, // viterbi and synchro search
1249 0x33, 0xfc, // rs control
1250 0x34, 0x93, // error control
1251 0x0f, 0x52,
1252 0xff, 0xff
1255 static int alps_stv0299_set_symbol_rate(struct dvb_frontend *fe, u32 srate, u32 ratio)
1257 u8 aclk = 0;
1258 u8 bclk = 0;
1260 if (srate < 1500000) {
1261 aclk = 0xb7;
1262 bclk = 0x47;
1263 } else if (srate < 3000000) {
1264 aclk = 0xb7;
1265 bclk = 0x4b;
1266 } else if (srate < 7000000) {
1267 aclk = 0xb7;
1268 bclk = 0x4f;
1269 } else if (srate < 14000000) {
1270 aclk = 0xb7;
1271 bclk = 0x53;
1272 } else if (srate < 30000000) {
1273 aclk = 0xb6;
1274 bclk = 0x53;
1275 } else if (srate < 45000000) {
1276 aclk = 0xb4;
1277 bclk = 0x51;
1280 stv0299_writereg(fe, 0x13, aclk);
1281 stv0299_writereg(fe, 0x14, bclk);
1282 stv0299_writereg(fe, 0x1f, (ratio >> 16) & 0xff);
1283 stv0299_writereg(fe, 0x20, (ratio >> 8) & 0xff);
1284 stv0299_writereg(fe, 0x21, (ratio) & 0xf0);
1286 return 0;
1289 static int philips_tsa5059_tuner_set_params(struct dvb_frontend *fe)
1291 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1292 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
1293 u8 buf[4];
1294 u32 div;
1295 struct i2c_msg msg = {.addr = 0x61,.flags = 0,.buf = buf,.len = sizeof(buf) };
1297 if ((p->frequency < 950000) || (p->frequency > 2150000))
1298 return -EINVAL;
1300 div = (p->frequency + (125 - 1)) / 125; /* round correctly */
1301 buf[0] = (div >> 8) & 0x7f;
1302 buf[1] = div & 0xff;
1303 buf[2] = 0x80 | ((div & 0x18000) >> 10) | 4;
1304 buf[3] = 0xC4;
1306 if (p->frequency > 1530000)
1307 buf[3] = 0xC0;
1309 /* BSBE1 wants XCE bit set */
1310 if (ttusb->revision == TTUSB_REV_2_2)
1311 buf[3] |= 0x20;
1313 if (fe->ops.i2c_gate_ctrl)
1314 fe->ops.i2c_gate_ctrl(fe, 1);
1315 if (i2c_transfer(&ttusb->i2c_adap, &msg, 1) != 1)
1316 return -EIO;
1318 return 0;
1321 static struct stv0299_config alps_stv0299_config = {
1322 .demod_address = 0x68,
1323 .inittab = alps_bsru6_inittab,
1324 .mclk = 88000000UL,
1325 .invert = 1,
1326 .skip_reinit = 0,
1327 .lock_output = STV0299_LOCKOUTPUT_1,
1328 .volt13_op0_op1 = STV0299_VOLT13_OP1,
1329 .min_delay_ms = 100,
1330 .set_symbol_rate = alps_stv0299_set_symbol_rate,
1333 static int ttusb_novas_grundig_29504_491_tuner_set_params(struct dvb_frontend *fe)
1335 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1336 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
1337 u8 buf[4];
1338 u32 div;
1339 struct i2c_msg msg = {.addr = 0x61,.flags = 0,.buf = buf,.len = sizeof(buf) };
1341 div = p->frequency / 125;
1343 buf[0] = (div >> 8) & 0x7f;
1344 buf[1] = div & 0xff;
1345 buf[2] = 0x8e;
1346 buf[3] = 0x00;
1348 if (fe->ops.i2c_gate_ctrl)
1349 fe->ops.i2c_gate_ctrl(fe, 1);
1350 if (i2c_transfer(&ttusb->i2c_adap, &msg, 1) != 1)
1351 return -EIO;
1353 return 0;
1356 static struct tda8083_config ttusb_novas_grundig_29504_491_config = {
1358 .demod_address = 0x68,
1361 static int alps_tdbe2_tuner_set_params(struct dvb_frontend *fe)
1363 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1364 struct ttusb* ttusb = fe->dvb->priv;
1365 u32 div;
1366 u8 data[4];
1367 struct i2c_msg msg = { .addr = 0x62, .flags = 0, .buf = data, .len = sizeof(data) };
1369 div = (p->frequency + 35937500 + 31250) / 62500;
1371 data[0] = (div >> 8) & 0x7f;
1372 data[1] = div & 0xff;
1373 data[2] = 0x85 | ((div >> 10) & 0x60);
1374 data[3] = (p->frequency < 174000000 ? 0x88 : p->frequency < 470000000 ? 0x84 : 0x81);
1376 if (fe->ops.i2c_gate_ctrl)
1377 fe->ops.i2c_gate_ctrl(fe, 1);
1378 if (i2c_transfer (&ttusb->i2c_adap, &msg, 1) != 1)
1379 return -EIO;
1381 return 0;
1385 static struct ves1820_config alps_tdbe2_config = {
1386 .demod_address = 0x09,
1387 .xin = 57840000UL,
1388 .invert = 1,
1389 .selagc = VES1820_SELAGC_SIGNAMPERR,
1392 static u8 read_pwm(struct ttusb* ttusb)
1394 u8 b = 0xff;
1395 u8 pwm;
1396 struct i2c_msg msg[] = { { .addr = 0x50,.flags = 0,.buf = &b,.len = 1 },
1397 { .addr = 0x50,.flags = I2C_M_RD,.buf = &pwm,.len = 1} };
1399 if ((i2c_transfer(&ttusb->i2c_adap, msg, 2) != 2) || (pwm == 0xff))
1400 pwm = 0x48;
1402 return pwm;
1406 static int dvbc_philips_tdm1316l_tuner_set_params(struct dvb_frontend *fe)
1408 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1409 struct ttusb *ttusb = (struct ttusb *) fe->dvb->priv;
1410 u8 tuner_buf[5];
1411 struct i2c_msg tuner_msg = {.addr = 0x60,
1412 .flags = 0,
1413 .buf = tuner_buf,
1414 .len = sizeof(tuner_buf) };
1415 int tuner_frequency = 0;
1416 u8 band, cp, filter;
1418 // determine charge pump
1419 tuner_frequency = p->frequency;
1420 if (tuner_frequency < 87000000) {return -EINVAL;}
1421 else if (tuner_frequency < 130000000) {cp = 3; band = 1;}
1422 else if (tuner_frequency < 160000000) {cp = 5; band = 1;}
1423 else if (tuner_frequency < 200000000) {cp = 6; band = 1;}
1424 else if (tuner_frequency < 290000000) {cp = 3; band = 2;}
1425 else if (tuner_frequency < 420000000) {cp = 5; band = 2;}
1426 else if (tuner_frequency < 480000000) {cp = 6; band = 2;}
1427 else if (tuner_frequency < 620000000) {cp = 3; band = 4;}
1428 else if (tuner_frequency < 830000000) {cp = 5; band = 4;}
1429 else if (tuner_frequency < 895000000) {cp = 7; band = 4;}
1430 else {return -EINVAL;}
1432 // assume PLL filter should always be 8MHz for the moment.
1433 filter = 1;
1435 // calculate divisor
1436 // (Finput + Fif)/Fref; Fif = 36125000 Hz, Fref = 62500 Hz
1437 tuner_frequency = ((p->frequency + 36125000) / 62500);
1439 // setup tuner buffer
1440 tuner_buf[0] = tuner_frequency >> 8;
1441 tuner_buf[1] = tuner_frequency & 0xff;
1442 tuner_buf[2] = 0xc8;
1443 tuner_buf[3] = (cp << 5) | (filter << 3) | band;
1444 tuner_buf[4] = 0x80;
1446 if (fe->ops.i2c_gate_ctrl)
1447 fe->ops.i2c_gate_ctrl(fe, 1);
1448 if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1) {
1449 printk("dvb-ttusb-budget: dvbc_philips_tdm1316l_pll_set Error 1\n");
1450 return -EIO;
1453 msleep(50);
1455 if (fe->ops.i2c_gate_ctrl)
1456 fe->ops.i2c_gate_ctrl(fe, 1);
1457 if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1) {
1458 printk("dvb-ttusb-budget: dvbc_philips_tdm1316l_pll_set Error 2\n");
1459 return -EIO;
1462 msleep(1);
1464 return 0;
1467 static u8 dvbc_philips_tdm1316l_inittab[] = {
1468 0x80, 0x21,
1469 0x80, 0x20,
1470 0x81, 0x01,
1471 0x81, 0x00,
1472 0x00, 0x09,
1473 0x01, 0x69,
1474 0x03, 0x00,
1475 0x04, 0x00,
1476 0x07, 0x00,
1477 0x08, 0x00,
1478 0x20, 0x00,
1479 0x21, 0x40,
1480 0x22, 0x00,
1481 0x23, 0x00,
1482 0x24, 0x40,
1483 0x25, 0x88,
1484 0x30, 0xff,
1485 0x31, 0x00,
1486 0x32, 0xff,
1487 0x33, 0x00,
1488 0x34, 0x50,
1489 0x35, 0x7f,
1490 0x36, 0x00,
1491 0x37, 0x20,
1492 0x38, 0x00,
1493 0x40, 0x1c,
1494 0x41, 0xff,
1495 0x42, 0x29,
1496 0x43, 0x20,
1497 0x44, 0xff,
1498 0x45, 0x00,
1499 0x46, 0x00,
1500 0x49, 0x04,
1501 0x4a, 0xff,
1502 0x4b, 0x7f,
1503 0x52, 0x30,
1504 0x55, 0xae,
1505 0x56, 0x47,
1506 0x57, 0xe1,
1507 0x58, 0x3a,
1508 0x5a, 0x1e,
1509 0x5b, 0x34,
1510 0x60, 0x00,
1511 0x63, 0x00,
1512 0x64, 0x00,
1513 0x65, 0x00,
1514 0x66, 0x00,
1515 0x67, 0x00,
1516 0x68, 0x00,
1517 0x69, 0x00,
1518 0x6a, 0x02,
1519 0x6b, 0x00,
1520 0x70, 0xff,
1521 0x71, 0x00,
1522 0x72, 0x00,
1523 0x73, 0x00,
1524 0x74, 0x0c,
1525 0x80, 0x00,
1526 0x81, 0x00,
1527 0x82, 0x00,
1528 0x83, 0x00,
1529 0x84, 0x04,
1530 0x85, 0x80,
1531 0x86, 0x24,
1532 0x87, 0x78,
1533 0x88, 0x00,
1534 0x89, 0x00,
1535 0x90, 0x01,
1536 0x91, 0x01,
1537 0xa0, 0x00,
1538 0xa1, 0x00,
1539 0xa2, 0x00,
1540 0xb0, 0x91,
1541 0xb1, 0x0b,
1542 0xc0, 0x4b,
1543 0xc1, 0x00,
1544 0xc2, 0x00,
1545 0xd0, 0x00,
1546 0xd1, 0x00,
1547 0xd2, 0x00,
1548 0xd3, 0x00,
1549 0xd4, 0x00,
1550 0xd5, 0x00,
1551 0xde, 0x00,
1552 0xdf, 0x00,
1553 0x61, 0x38,
1554 0x62, 0x0a,
1555 0x53, 0x13,
1556 0x59, 0x08,
1557 0x55, 0x00,
1558 0x56, 0x40,
1559 0x57, 0x08,
1560 0x58, 0x3d,
1561 0x88, 0x10,
1562 0xa0, 0x00,
1563 0xa0, 0x00,
1564 0xa0, 0x00,
1565 0xa0, 0x04,
1566 0xff, 0xff,
1569 static struct stv0297_config dvbc_philips_tdm1316l_config = {
1570 .demod_address = 0x1c,
1571 .inittab = dvbc_philips_tdm1316l_inittab,
1572 .invert = 0,
1575 static void frontend_init(struct ttusb* ttusb)
1577 switch(le16_to_cpu(ttusb->dev->descriptor.idProduct)) {
1578 case 0x1003: // Hauppauge/TT Nova-USB-S budget (stv0299/ALPS BSRU6|BSBE1(tsa5059))
1579 // try the stv0299 based first
1580 ttusb->fe = dvb_attach(stv0299_attach, &alps_stv0299_config, &ttusb->i2c_adap);
1581 if (ttusb->fe != NULL) {
1582 ttusb->fe->ops.tuner_ops.set_params = philips_tsa5059_tuner_set_params;
1584 if(ttusb->revision == TTUSB_REV_2_2) { // ALPS BSBE1
1585 alps_stv0299_config.inittab = alps_bsbe1_inittab;
1586 dvb_attach(lnbp21_attach, ttusb->fe, &ttusb->i2c_adap, 0, 0);
1587 } else { // ALPS BSRU6
1588 ttusb->fe->ops.set_voltage = ttusb_set_voltage;
1590 break;
1593 // Grundig 29504-491
1594 ttusb->fe = dvb_attach(tda8083_attach, &ttusb_novas_grundig_29504_491_config, &ttusb->i2c_adap);
1595 if (ttusb->fe != NULL) {
1596 ttusb->fe->ops.tuner_ops.set_params = ttusb_novas_grundig_29504_491_tuner_set_params;
1597 ttusb->fe->ops.set_voltage = ttusb_set_voltage;
1598 break;
1600 break;
1602 case 0x1004: // Hauppauge/TT DVB-C budget (ves1820/ALPS TDBE2(sp5659))
1603 ttusb->fe = dvb_attach(ves1820_attach, &alps_tdbe2_config, &ttusb->i2c_adap, read_pwm(ttusb));
1604 if (ttusb->fe != NULL) {
1605 ttusb->fe->ops.tuner_ops.set_params = alps_tdbe2_tuner_set_params;
1606 break;
1609 ttusb->fe = dvb_attach(stv0297_attach, &dvbc_philips_tdm1316l_config, &ttusb->i2c_adap);
1610 if (ttusb->fe != NULL) {
1611 ttusb->fe->ops.tuner_ops.set_params = dvbc_philips_tdm1316l_tuner_set_params;
1612 break;
1614 break;
1616 case 0x1005: // Hauppauge/TT Nova-USB-t budget (tda10046/Philips td1316(tda6651tt) OR cx22700/ALPS TDMB7(??))
1617 // try the ALPS TDMB7 first
1618 ttusb->fe = dvb_attach(cx22700_attach, &alps_tdmb7_config, &ttusb->i2c_adap);
1619 if (ttusb->fe != NULL) {
1620 ttusb->fe->ops.tuner_ops.set_params = alps_tdmb7_tuner_set_params;
1621 break;
1624 // Philips td1316
1625 ttusb->fe = dvb_attach(tda10046_attach, &philips_tdm1316l_config, &ttusb->i2c_adap);
1626 if (ttusb->fe != NULL) {
1627 ttusb->fe->ops.tuner_ops.init = philips_tdm1316l_tuner_init;
1628 ttusb->fe->ops.tuner_ops.set_params = philips_tdm1316l_tuner_set_params;
1629 break;
1631 break;
1634 if (ttusb->fe == NULL) {
1635 printk("dvb-ttusb-budget: A frontend driver was not found for device [%04x:%04x]\n",
1636 le16_to_cpu(ttusb->dev->descriptor.idVendor),
1637 le16_to_cpu(ttusb->dev->descriptor.idProduct));
1638 } else {
1639 if (dvb_register_frontend(&ttusb->adapter, ttusb->fe)) {
1640 printk("dvb-ttusb-budget: Frontend registration failed!\n");
1641 dvb_frontend_detach(ttusb->fe);
1642 ttusb->fe = NULL;
1649 static struct i2c_algorithm ttusb_dec_algo = {
1650 .master_xfer = master_xfer,
1651 .functionality = functionality,
1654 static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
1656 struct usb_device *udev;
1657 struct ttusb *ttusb;
1658 int result;
1660 dprintk("%s: TTUSB DVB connected\n", __func__);
1662 udev = interface_to_usbdev(intf);
1664 if (intf->altsetting->desc.bInterfaceNumber != 1) return -ENODEV;
1666 if (!(ttusb = kzalloc(sizeof(struct ttusb), GFP_KERNEL)))
1667 return -ENOMEM;
1669 ttusb->dev = udev;
1670 ttusb->c = 0;
1671 ttusb->mux_state = 0;
1672 mutex_init(&ttusb->semi2c);
1674 mutex_lock(&ttusb->semi2c);
1676 mutex_init(&ttusb->semusb);
1678 ttusb_setup_interfaces(ttusb);
1680 result = ttusb_alloc_iso_urbs(ttusb);
1681 if (result < 0) {
1682 dprintk("%s: ttusb_alloc_iso_urbs - failed\n", __func__);
1683 mutex_unlock(&ttusb->semi2c);
1684 kfree(ttusb);
1685 return result;
1688 if (ttusb_init_controller(ttusb))
1689 printk("ttusb_init_controller: error\n");
1691 mutex_unlock(&ttusb->semi2c);
1693 result = dvb_register_adapter(&ttusb->adapter,
1694 "Technotrend/Hauppauge Nova-USB",
1695 THIS_MODULE, &udev->dev, adapter_nr);
1696 if (result < 0) {
1697 ttusb_free_iso_urbs(ttusb);
1698 kfree(ttusb);
1699 return result;
1701 ttusb->adapter.priv = ttusb;
1703 /* i2c */
1704 memset(&ttusb->i2c_adap, 0, sizeof(struct i2c_adapter));
1705 strcpy(ttusb->i2c_adap.name, "TTUSB DEC");
1707 i2c_set_adapdata(&ttusb->i2c_adap, ttusb);
1709 ttusb->i2c_adap.algo = &ttusb_dec_algo;
1710 ttusb->i2c_adap.algo_data = NULL;
1711 ttusb->i2c_adap.dev.parent = &udev->dev;
1713 result = i2c_add_adapter(&ttusb->i2c_adap);
1714 if (result)
1715 goto err_unregister_adapter;
1717 memset(&ttusb->dvb_demux, 0, sizeof(ttusb->dvb_demux));
1719 ttusb->dvb_demux.dmx.capabilities =
1720 DMX_TS_FILTERING | DMX_SECTION_FILTERING;
1721 ttusb->dvb_demux.priv = NULL;
1722 #ifdef TTUSB_HWSECTIONS
1723 ttusb->dvb_demux.filternum = TTUSB_MAXFILTER;
1724 #else
1725 ttusb->dvb_demux.filternum = 32;
1726 #endif
1727 ttusb->dvb_demux.feednum = TTUSB_MAXCHANNEL;
1728 ttusb->dvb_demux.start_feed = ttusb_start_feed;
1729 ttusb->dvb_demux.stop_feed = ttusb_stop_feed;
1730 ttusb->dvb_demux.write_to_decoder = NULL;
1732 result = dvb_dmx_init(&ttusb->dvb_demux);
1733 if (result < 0) {
1734 printk("ttusb_dvb: dvb_dmx_init failed (errno = %d)\n", result);
1735 result = -ENODEV;
1736 goto err_i2c_del_adapter;
1738 //FIXME dmxdev (nur WAS?)
1739 ttusb->dmxdev.filternum = ttusb->dvb_demux.filternum;
1740 ttusb->dmxdev.demux = &ttusb->dvb_demux.dmx;
1741 ttusb->dmxdev.capabilities = 0;
1743 result = dvb_dmxdev_init(&ttusb->dmxdev, &ttusb->adapter);
1744 if (result < 0) {
1745 printk("ttusb_dvb: dvb_dmxdev_init failed (errno = %d)\n",
1746 result);
1747 result = -ENODEV;
1748 goto err_release_dmx;
1751 if (dvb_net_init(&ttusb->adapter, &ttusb->dvbnet, &ttusb->dvb_demux.dmx)) {
1752 printk("ttusb_dvb: dvb_net_init failed!\n");
1753 result = -ENODEV;
1754 goto err_release_dmxdev;
1757 usb_set_intfdata(intf, (void *) ttusb);
1759 frontend_init(ttusb);
1761 return 0;
1763 err_release_dmxdev:
1764 dvb_dmxdev_release(&ttusb->dmxdev);
1765 err_release_dmx:
1766 dvb_dmx_release(&ttusb->dvb_demux);
1767 err_i2c_del_adapter:
1768 i2c_del_adapter(&ttusb->i2c_adap);
1769 err_unregister_adapter:
1770 dvb_unregister_adapter (&ttusb->adapter);
1771 ttusb_free_iso_urbs(ttusb);
1772 kfree(ttusb);
1773 return result;
1776 static void ttusb_disconnect(struct usb_interface *intf)
1778 struct ttusb *ttusb = usb_get_intfdata(intf);
1780 usb_set_intfdata(intf, NULL);
1782 ttusb->disconnecting = 1;
1784 ttusb_stop_iso_xfer(ttusb);
1786 ttusb->dvb_demux.dmx.close(&ttusb->dvb_demux.dmx);
1787 dvb_net_release(&ttusb->dvbnet);
1788 dvb_dmxdev_release(&ttusb->dmxdev);
1789 dvb_dmx_release(&ttusb->dvb_demux);
1790 if (ttusb->fe != NULL) {
1791 dvb_unregister_frontend(ttusb->fe);
1792 dvb_frontend_detach(ttusb->fe);
1794 i2c_del_adapter(&ttusb->i2c_adap);
1795 dvb_unregister_adapter(&ttusb->adapter);
1797 ttusb_free_iso_urbs(ttusb);
1799 kfree(ttusb);
1801 dprintk("%s: TTUSB DVB disconnected\n", __func__);
1804 static struct usb_device_id ttusb_table[] = {
1805 {USB_DEVICE(0xb48, 0x1003)},
1806 {USB_DEVICE(0xb48, 0x1004)},
1807 {USB_DEVICE(0xb48, 0x1005)},
1811 MODULE_DEVICE_TABLE(usb, ttusb_table);
1813 static struct usb_driver ttusb_driver = {
1814 .name = "ttusb",
1815 .probe = ttusb_probe,
1816 .disconnect = ttusb_disconnect,
1817 .id_table = ttusb_table,
1820 module_usb_driver(ttusb_driver);
1822 MODULE_AUTHOR("Holger Waechtler <holger@convergence.de>");
1823 MODULE_DESCRIPTION("TTUSB DVB Driver");
1824 MODULE_LICENSE("GPL");
1825 MODULE_FIRMWARE("ttusb-budget/dspbootcode.bin");