]> git.ipfire.org Git - thirdparty/linux.git/blame - drivers/media/usb/ttusb-budget/dvb-ttusb-budget.c
treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152
[thirdparty/linux.git] / drivers / media / usb / ttusb-budget / dvb-ttusb-budget.c
CommitLineData
2874c5fd 1// SPDX-License-Identifier: GPL-2.0-or-later
1da177e4
LT
2/*
3 * TTUSB DVB driver
4 *
5 * Copyright (c) 2002 Holger Waechtler <holger@convergence.de>
6 * Copyright (c) 2003 Felix Domke <tmbinc@elitedvb.net>
1da177e4
LT
7 */
8#include <linux/init.h>
9#include <linux/slab.h>
10#include <linux/wait.h>
a8a89b7f 11#include <linux/fs.h>
1da177e4 12#include <linux/module.h>
1da177e4
LT
13#include <linux/usb.h>
14#include <linux/delay.h>
15#include <linux/time.h>
16#include <linux/errno.h>
4da006c6 17#include <linux/jiffies.h>
3593cab5 18#include <linux/mutex.h>
0a2a736a 19#include <linux/firmware.h>
1da177e4 20
fada1935
MCC
21#include <media/dvb_frontend.h>
22#include <media/dmxdev.h>
23#include <media/dvb_demux.h>
24#include <media/dvb_net.h>
53936391 25#include "ves1820.h"
1da177e4
LT
26#include "cx22700.h"
27#include "tda1004x.h"
28#include "stv0299.h"
29#include "tda8083.h"
b8d4c235 30#include "stv0297.h"
d020542f 31#include "lnbp21.h"
1da177e4
LT
32
33#include <linux/dvb/frontend.h>
34#include <linux/dvb/dmx.h>
35#include <linux/pci.h>
36
1da177e4
LT
37/*
38 TTUSB_HWSECTIONS:
39 the DSP supports filtering in hardware, however, since the "muxstream"
40 is a bit braindead (no matching channel masks or no matching filter mask),
41 we won't support this - yet. it doesn't event support negative filters,
42 so the best way is maybe to keep TTUSB_HWSECTIONS undef'd and just
9aaeded7 43 parse TS data. USB bandwidth will be a problem when having large
1da177e4
LT
44 datastreams, especially for dvb-net, but hey, that's not my problem.
45
46 TTUSB_DISEQC, TTUSB_TONE:
47 let the STC do the diseqc/tone stuff. this isn't supported at least with
48 my TTUSB, so let it undef'd unless you want to implement another
49 frontend. never tested.
50
68a49a4a 51 debug:
1da177e4
LT
52 define it to > 3 for really hardcore debugging. you probably don't want
53 this unless the device doesn't load at all. > 2 for bandwidth statistics.
54*/
55
56static int debug;
1da177e4
LT
57module_param(debug, int, 0644);
58MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off).");
59
78e92006
JG
60DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
61
1da177e4
LT
62#define dprintk(x...) do { if (debug) printk(KERN_DEBUG x); } while (0)
63
64#define ISO_BUF_COUNT 4
65#define FRAMES_PER_ISO_BUF 4
66#define ISO_FRAME_SIZE 912
67#define TTUSB_MAXCHANNEL 32
68#ifdef TTUSB_HWSECTIONS
69#define TTUSB_MAXFILTER 16 /* ??? */
70#endif
71
72#define TTUSB_REV_2_2 0x22
73#define TTUSB_BUDGET_NAME "ttusb_stc_fw"
74
cba862dc 75/*
1da177e4
LT
76 * since we're casting (struct ttusb*) <-> (struct dvb_demux*) around
77 * the dvb_demux field must be the first in struct!!
78 */
79struct ttusb {
80 struct dvb_demux dvb_demux;
81 struct dmxdev dmxdev;
82 struct dvb_net dvbnet;
83
84 /* and one for USB access. */
3593cab5
IM
85 struct mutex semi2c;
86 struct mutex semusb;
1da177e4 87
fdc53a6d 88 struct dvb_adapter adapter;
1da177e4
LT
89 struct usb_device *dev;
90
91 struct i2c_adapter i2c_adap;
92
93 int disconnecting;
94 int iso_streaming;
95
96 unsigned int bulk_out_pipe;
97 unsigned int bulk_in_pipe;
98 unsigned int isoc_in_pipe;
99
100 void *iso_buffer;
1da177e4
LT
101
102 struct urb *iso_urb[ISO_BUF_COUNT];
103
104 int running_feed_count;
105 int last_channel;
106 int last_filter;
107
108 u8 c; /* transaction counter, wraps around... */
0df289a2
MCC
109 enum fe_sec_tone_mode tone;
110 enum fe_sec_voltage voltage;
1da177e4
LT
111
112 int mux_state; // 0..2 - MuxSyncWord, 3 - nMuxPacks, 4 - muxpack
113 u8 mux_npacks;
114 u8 muxpack[256 + 8];
115 int muxpack_ptr, muxpack_len;
116
117 int insync;
118
119 int cc; /* MuxCounter - will increment on EVERY MUX PACKET */
120 /* (including stuffing. yes. really.) */
121
122 u8 last_result[32];
123
124 int revision;
125
1da177e4
LT
126 struct dvb_frontend* fe;
127};
128
3a4fa0a2 129/* ugly workaround ... don't know why it's necessary to read */
1da177e4
LT
130/* all result codes. */
131
1da177e4
LT
132static int ttusb_cmd(struct ttusb *ttusb,
133 const u8 * data, int len, int needresult)
134{
135 int actual_len;
136 int err;
1da177e4
LT
137 int i;
138
68a49a4a
JW
139 if (debug >= 3) {
140 printk(KERN_DEBUG ">");
141 for (i = 0; i < len; ++i)
142 printk(KERN_CONT " %02x", data[i]);
143 printk(KERN_CONT "\n");
144 }
1da177e4 145
3593cab5 146 if (mutex_lock_interruptible(&ttusb->semusb) < 0)
1da177e4
LT
147 return -EAGAIN;
148
149 err = usb_bulk_msg(ttusb->dev, ttusb->bulk_out_pipe,
150 (u8 *) data, len, &actual_len, 1000);
151 if (err != 0) {
152 dprintk("%s: usb_bulk_msg(send) failed, err == %i!\n",
fb9393b5 153 __func__, err);
3593cab5 154 mutex_unlock(&ttusb->semusb);
1da177e4
LT
155 return err;
156 }
157 if (actual_len != len) {
fb9393b5 158 dprintk("%s: only wrote %d of %d bytes\n", __func__,
1da177e4 159 actual_len, len);
3593cab5 160 mutex_unlock(&ttusb->semusb);
1da177e4
LT
161 return -1;
162 }
163
164 err = usb_bulk_msg(ttusb->dev, ttusb->bulk_in_pipe,
165 ttusb->last_result, 32, &actual_len, 1000);
166
167 if (err != 0) {
fb9393b5 168 printk("%s: failed, receive error %d\n", __func__,
1da177e4 169 err);
3593cab5 170 mutex_unlock(&ttusb->semusb);
1da177e4
LT
171 return err;
172 }
68a49a4a
JW
173
174 if (debug >= 3) {
175 actual_len = ttusb->last_result[3] + 4;
176 printk(KERN_DEBUG "<");
177 for (i = 0; i < actual_len; ++i)
178 printk(KERN_CONT " %02x", ttusb->last_result[i]);
179 printk(KERN_CONT "\n");
180 }
181
1da177e4 182 if (!needresult)
3593cab5 183 mutex_unlock(&ttusb->semusb);
1da177e4
LT
184 return 0;
185}
186
187static int ttusb_result(struct ttusb *ttusb, u8 * data, int len)
188{
189 memcpy(data, ttusb->last_result, len);
3593cab5 190 mutex_unlock(&ttusb->semusb);
1da177e4
LT
191 return 0;
192}
193
194static int ttusb_i2c_msg(struct ttusb *ttusb,
195 u8 addr, u8 * snd_buf, u8 snd_len, u8 * rcv_buf,
196 u8 rcv_len)
197{
198 u8 b[0x28];
199 u8 id = ++ttusb->c;
200 int i, err;
201
202 if (snd_len > 0x28 - 7 || rcv_len > 0x20 - 7)
203 return -EINVAL;
204
205 b[0] = 0xaa;
206 b[1] = id;
207 b[2] = 0x31;
208 b[3] = snd_len + 3;
209 b[4] = addr << 1;
210 b[5] = snd_len;
211 b[6] = rcv_len;
212
213 for (i = 0; i < snd_len; i++)
214 b[7 + i] = snd_buf[i];
215
216 err = ttusb_cmd(ttusb, b, snd_len + 7, 1);
217
218 if (err)
219 return -EREMOTEIO;
220
221 err = ttusb_result(ttusb, b, 0x20);
222
9101e622
MCC
223 /* check if the i2c transaction was successful */
224 if ((snd_len != b[5]) || (rcv_len != b[6])) return -EREMOTEIO;
1da177e4
LT
225
226 if (rcv_len > 0) {
227
228 if (err || b[0] != 0x55 || b[1] != id) {
229 dprintk
230 ("%s: usb_bulk_msg(recv) failed, err == %i, id == %02x, b == ",
fb9393b5 231 __func__, err, id);
1da177e4
LT
232 return -EREMOTEIO;
233 }
234
235 for (i = 0; i < rcv_len; i++)
236 rcv_buf[i] = b[7 + i];
237 }
238
239 return rcv_len;
240}
241
242static int master_xfer(struct i2c_adapter* adapter, struct i2c_msg *msg, int num)
243{
244 struct ttusb *ttusb = i2c_get_adapdata(adapter);
245 int i = 0;
246 int inc;
247
3593cab5 248 if (mutex_lock_interruptible(&ttusb->semi2c) < 0)
1da177e4
LT
249 return -EAGAIN;
250
251 while (i < num) {
252 u8 addr, snd_len, rcv_len, *snd_buf, *rcv_buf;
253 int err;
254
255 if (num > i + 1 && (msg[i + 1].flags & I2C_M_RD)) {
256 addr = msg[i].addr;
257 snd_buf = msg[i].buf;
258 snd_len = msg[i].len;
259 rcv_buf = msg[i + 1].buf;
260 rcv_len = msg[i + 1].len;
261 inc = 2;
262 } else {
263 addr = msg[i].addr;
264 snd_buf = msg[i].buf;
265 snd_len = msg[i].len;
266 rcv_buf = NULL;
267 rcv_len = 0;
268 inc = 1;
269 }
270
271 err = ttusb_i2c_msg(ttusb, addr,
272 snd_buf, snd_len, rcv_buf, rcv_len);
273
274 if (err < rcv_len) {
fb9393b5 275 dprintk("%s: i == %i\n", __func__, i);
1da177e4
LT
276 break;
277 }
278
279 i += inc;
280 }
281
3593cab5 282 mutex_unlock(&ttusb->semi2c);
1da177e4
LT
283 return i;
284}
285
1da177e4
LT
286static int ttusb_boot_dsp(struct ttusb *ttusb)
287{
0a2a736a 288 const struct firmware *fw;
1da177e4
LT
289 int i, err;
290 u8 b[40];
291
0a2a736a
DW
292 err = request_firmware(&fw, "ttusb-budget/dspbootcode.bin",
293 &ttusb->dev->dev);
294 if (err) {
295 printk(KERN_ERR "ttusb-budget: failed to request firmware\n");
296 return err;
297 }
298
1da177e4
LT
299 /* BootBlock */
300 b[0] = 0xaa;
301 b[2] = 0x13;
302 b[3] = 28;
303
304 /* upload dsp code in 32 byte steps (36 didn't work for me ...) */
3e4d8f48 305 /* 32 is max packet size, no messages should be split. */
0a2a736a
DW
306 for (i = 0; i < fw->size; i += 28) {
307 memcpy(&b[4], &fw->data[i], 28);
1da177e4
LT
308
309 b[1] = ++ttusb->c;
310
311 err = ttusb_cmd(ttusb, b, 32, 0);
312 if (err)
313 goto done;
314 }
315
316 /* last block ... */
317 b[1] = ++ttusb->c;
318 b[2] = 0x13;
319 b[3] = 0;
320
321 err = ttusb_cmd(ttusb, b, 4, 0);
322 if (err)
323 goto done;
324
325 /* BootEnd */
326 b[1] = ++ttusb->c;
327 b[2] = 0x14;
328 b[3] = 0;
329
330 err = ttusb_cmd(ttusb, b, 4, 0);
331
332 done:
ba0fd56a 333 release_firmware(fw);
1da177e4
LT
334 if (err) {
335 dprintk("%s: usb_bulk_msg() failed, return value %i!\n",
fb9393b5 336 __func__, err);
1da177e4
LT
337 }
338
339 return err;
340}
341
342static int ttusb_set_channel(struct ttusb *ttusb, int chan_id, int filter_type,
343 int pid)
344{
345 int err;
346 /* SetChannel */
347 u8 b[] = { 0xaa, ++ttusb->c, 0x22, 4, chan_id, filter_type,
348 (pid >> 8) & 0xff, pid & 0xff
349 };
350
351 err = ttusb_cmd(ttusb, b, sizeof(b), 0);
352 return err;
353}
354
355static int ttusb_del_channel(struct ttusb *ttusb, int channel_id)
356{
357 int err;
358 /* DelChannel */
359 u8 b[] = { 0xaa, ++ttusb->c, 0x23, 1, channel_id };
360
361 err = ttusb_cmd(ttusb, b, sizeof(b), 0);
362 return err;
363}
364
365#ifdef TTUSB_HWSECTIONS
366static int ttusb_set_filter(struct ttusb *ttusb, int filter_id,
367 int associated_chan, u8 filter[8], u8 mask[8])
368{
369 int err;
370 /* SetFilter */
371 u8 b[] = { 0xaa, 0, 0x24, 0x1a, filter_id, associated_chan,
372 filter[0], filter[1], filter[2], filter[3],
373 filter[4], filter[5], filter[6], filter[7],
374 filter[8], filter[9], filter[10], filter[11],
375 mask[0], mask[1], mask[2], mask[3],
376 mask[4], mask[5], mask[6], mask[7],
377 mask[8], mask[9], mask[10], mask[11]
378 };
379
380 err = ttusb_cmd(ttusb, b, sizeof(b), 0);
381 return err;
382}
383
384static int ttusb_del_filter(struct ttusb *ttusb, int filter_id)
385{
386 int err;
387 /* DelFilter */
388 u8 b[] = { 0xaa, ++ttusb->c, 0x25, 1, filter_id };
389
390 err = ttusb_cmd(ttusb, b, sizeof(b), 0);
391 return err;
392}
393#endif
394
395static int ttusb_init_controller(struct ttusb *ttusb)
396{
397 u8 b0[] = { 0xaa, ++ttusb->c, 0x15, 1, 0 };
398 u8 b1[] = { 0xaa, ++ttusb->c, 0x15, 1, 1 };
399 u8 b2[] = { 0xaa, ++ttusb->c, 0x32, 1, 0 };
400 /* i2c write read: 5 bytes, addr 0x10, 0x02 bytes write, 1 bytes read. */
401 u8 b3[] =
402 { 0xaa, ++ttusb->c, 0x31, 5, 0x10, 0x02, 0x01, 0x00, 0x1e };
403 u8 b4[] =
404 { 0x55, ttusb->c, 0x31, 4, 0x10, 0x02, 0x01, 0x00, 0x1e };
405
406 u8 get_version[] = { 0xaa, ++ttusb->c, 0x17, 5, 0, 0, 0, 0, 0 };
407 u8 get_dsp_version[0x20] =
408 { 0xaa, ++ttusb->c, 0x26, 28, 0, 0, 0, 0, 0 };
409 int err;
410
411 /* reset board */
412 if ((err = ttusb_cmd(ttusb, b0, sizeof(b0), 0)))
413 return err;
414
415 /* reset board (again?) */
416 if ((err = ttusb_cmd(ttusb, b1, sizeof(b1), 0)))
417 return err;
418
419 ttusb_boot_dsp(ttusb);
420
421 /* set i2c bit rate */
422 if ((err = ttusb_cmd(ttusb, b2, sizeof(b2), 0)))
423 return err;
424
425 if ((err = ttusb_cmd(ttusb, b3, sizeof(b3), 1)))
426 return err;
427
428 err = ttusb_result(ttusb, b4, sizeof(b4));
429
430 if ((err = ttusb_cmd(ttusb, get_version, sizeof(get_version), 1)))
431 return err;
432
433 if ((err = ttusb_result(ttusb, get_version, sizeof(get_version))))
434 return err;
435
fb9393b5 436 dprintk("%s: stc-version: %c%c%c%c%c\n", __func__,
1da177e4
LT
437 get_version[4], get_version[5], get_version[6],
438 get_version[7], get_version[8]);
439
440 if (memcmp(get_version + 4, "V 0.0", 5) &&
441 memcmp(get_version + 4, "V 1.1", 5) &&
442 memcmp(get_version + 4, "V 2.1", 5) &&
443 memcmp(get_version + 4, "V 2.2", 5)) {
444 printk
445 ("%s: unknown STC version %c%c%c%c%c, please report!\n",
fb9393b5 446 __func__, get_version[4], get_version[5],
1da177e4
LT
447 get_version[6], get_version[7], get_version[8]);
448 }
449
450 ttusb->revision = ((get_version[6] - '0') << 4) |
451 (get_version[8] - '0');
452
453 err =
454 ttusb_cmd(ttusb, get_dsp_version, sizeof(get_dsp_version), 1);
455 if (err)
456 return err;
457
458 err =
459 ttusb_result(ttusb, get_dsp_version, sizeof(get_dsp_version));
460 if (err)
461 return err;
fb9393b5 462 printk("%s: dsp-version: %c%c%c\n", __func__,
1da177e4
LT
463 get_dsp_version[4], get_dsp_version[5], get_dsp_version[6]);
464 return 0;
465}
466
467#ifdef TTUSB_DISEQC
468static int ttusb_send_diseqc(struct dvb_frontend* fe,
469 const struct dvb_diseqc_master_cmd *cmd)
470{
471 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
472 u8 b[12] = { 0xaa, ++ttusb->c, 0x18 };
473
474 int err;
475
476 b[3] = 4 + 2 + cmd->msg_len;
477 b[4] = 0xFF; /* send diseqc master, not burst */
478 b[5] = cmd->msg_len;
479
480 memcpy(b + 5, cmd->msg, cmd->msg_len);
481
482 /* Diseqc */
483 if ((err = ttusb_cmd(ttusb, b, 4 + b[3], 0))) {
484 dprintk("%s: usb_bulk_msg() failed, return value %i!\n",
fb9393b5 485 __func__, err);
1da177e4
LT
486 }
487
488 return err;
489}
490#endif
491
1da177e4
LT
492static int ttusb_update_lnb(struct ttusb *ttusb)
493{
494 u8 b[] = { 0xaa, ++ttusb->c, 0x16, 5, /*power: */ 1,
495 ttusb->voltage == SEC_VOLTAGE_18 ? 0 : 1,
496 ttusb->tone == SEC_TONE_ON ? 1 : 0, 1, 1
497 };
498 int err;
499
500 /* SetLNB */
501 if ((err = ttusb_cmd(ttusb, b, sizeof(b), 0))) {
502 dprintk("%s: usb_bulk_msg() failed, return value %i!\n",
fb9393b5 503 __func__, err);
1da177e4
LT
504 }
505
506 return err;
507}
508
0df289a2
MCC
509static int ttusb_set_voltage(struct dvb_frontend *fe,
510 enum fe_sec_voltage voltage)
1da177e4
LT
511{
512 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
513
514 ttusb->voltage = voltage;
515 return ttusb_update_lnb(ttusb);
516}
517
518#ifdef TTUSB_TONE
0df289a2 519static int ttusb_set_tone(struct dvb_frontend *fe, enum fe_sec_tone_mode tone)
1da177e4
LT
520{
521 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
522
523 ttusb->tone = tone;
524 return ttusb_update_lnb(ttusb);
525}
526#endif
527
528
529#if 0
530static void ttusb_set_led_freq(struct ttusb *ttusb, u8 freq)
531{
532 u8 b[] = { 0xaa, ++ttusb->c, 0x19, 1, freq };
533 int err, actual_len;
534
535 err = ttusb_cmd(ttusb, b, sizeof(b), 0);
536 if (err) {
537 dprintk("%s: usb_bulk_msg() failed, return value %i!\n",
fb9393b5 538 __func__, err);
1da177e4
LT
539 }
540}
541#endif
542
543/*****************************************************************************/
544
545#ifdef TTUSB_HWSECTIONS
546static void ttusb_handle_ts_data(struct ttusb_channel *channel,
547 const u8 * data, int len);
548static void ttusb_handle_sec_data(struct ttusb_channel *channel,
549 const u8 * data, int len);
550#endif
551
ff699e6b 552static int numpkt, numts, numstuff, numsec, numinvalid;
4da006c6 553static unsigned long lastj;
1da177e4
LT
554
555static void ttusb_process_muxpack(struct ttusb *ttusb, const u8 * muxpack,
556 int len)
557{
558 u16 csum = 0, cc;
559 int i;
bf5bbed1
DC
560
561 if (len < 4 || len & 0x1) {
562 pr_warn("%s: muxpack has invalid len %d\n", __func__, len);
563 numinvalid++;
564 return;
565 }
566
1da177e4 567 for (i = 0; i < len; i += 2)
d4f979a9 568 csum ^= le16_to_cpup((__le16 *) (muxpack + i));
1da177e4
LT
569 if (csum) {
570 printk("%s: muxpack with incorrect checksum, ignoring\n",
fb9393b5 571 __func__);
1da177e4
LT
572 numinvalid++;
573 return;
574 }
575
576 cc = (muxpack[len - 4] << 8) | muxpack[len - 3];
577 cc &= 0x7FFF;
578 if ((cc != ttusb->cc) && (ttusb->cc != -1))
579 printk("%s: cc discontinuity (%d frames missing)\n",
fb9393b5 580 __func__, (cc - ttusb->cc) & 0x7FFF);
1da177e4
LT
581 ttusb->cc = (cc + 1) & 0x7FFF;
582 if (muxpack[0] & 0x80) {
583#ifdef TTUSB_HWSECTIONS
584 /* section data */
585 int pusi = muxpack[0] & 0x40;
586 int channel = muxpack[0] & 0x1F;
587 int payload = muxpack[1];
588 const u8 *data = muxpack + 2;
589 /* check offset flag */
590 if (muxpack[0] & 0x20)
591 data++;
592
593 ttusb_handle_sec_data(ttusb->channel + channel, data,
594 payload);
595 data += payload;
596
597 if ((!!(ttusb->muxpack[0] & 0x20)) ^
598 !!(ttusb->muxpack[1] & 1))
599 data++;
600#warning TODO: pusi
601 printk("cc: %04x\n", (data[0] << 8) | data[1]);
602#endif
603 numsec++;
604 } else if (muxpack[0] == 0x47) {
605#ifdef TTUSB_HWSECTIONS
606 /* we have TS data here! */
607 int pid = ((muxpack[1] & 0x0F) << 8) | muxpack[2];
608 int channel;
609 for (channel = 0; channel < TTUSB_MAXCHANNEL; ++channel)
610 if (ttusb->channel[channel].active
611 && (pid == ttusb->channel[channel].pid))
612 ttusb_handle_ts_data(ttusb->channel +
613 channel, muxpack,
614 188);
615#endif
616 numts++;
617 dvb_dmx_swfilter_packets(&ttusb->dvb_demux, muxpack, 1);
618 } else if (muxpack[0] != 0) {
619 numinvalid++;
620 printk("illegal muxpack type %02x\n", muxpack[0]);
621 } else
622 numstuff++;
623}
624
625static void ttusb_process_frame(struct ttusb *ttusb, u8 * data, int len)
626{
627 int maxwork = 1024;
628 while (len) {
629 if (!(maxwork--)) {
fb9393b5 630 printk("%s: too much work\n", __func__);
1da177e4
LT
631 break;
632 }
633
634 switch (ttusb->mux_state) {
635 case 0:
636 case 1:
637 case 2:
638 len--;
639 if (*data++ == 0xAA)
640 ++ttusb->mux_state;
641 else {
642 ttusb->mux_state = 0;
1da177e4 643 if (ttusb->insync) {
68a49a4a
JW
644 dprintk("%s: %02x\n",
645 __func__, data[-1]);
646 printk(KERN_INFO "%s: lost sync.\n",
fb9393b5 647 __func__);
1da177e4
LT
648 ttusb->insync = 0;
649 }
1da177e4
LT
650 }
651 break;
652 case 3:
653 ttusb->insync = 1;
654 len--;
655 ttusb->mux_npacks = *data++;
656 ++ttusb->mux_state;
657 ttusb->muxpack_ptr = 0;
658 /* maximum bytes, until we know the length */
659 ttusb->muxpack_len = 2;
660 break;
661 case 4:
662 {
663 int avail;
664 avail = len;
665 if (avail >
666 (ttusb->muxpack_len -
667 ttusb->muxpack_ptr))
668 avail =
669 ttusb->muxpack_len -
670 ttusb->muxpack_ptr;
671 memcpy(ttusb->muxpack + ttusb->muxpack_ptr,
672 data, avail);
673 ttusb->muxpack_ptr += avail;
ae24601b 674 BUG_ON(ttusb->muxpack_ptr > 264);
1da177e4
LT
675 data += avail;
676 len -= avail;
677 /* determine length */
678 if (ttusb->muxpack_ptr == 2) {
679 if (ttusb->muxpack[0] & 0x80) {
680 ttusb->muxpack_len =
681 ttusb->muxpack[1] + 2;
682 if (ttusb->
683 muxpack[0] & 0x20)
684 ttusb->
685 muxpack_len++;
686 if ((!!
687 (ttusb->
688 muxpack[0] & 0x20)) ^
689 !!(ttusb->
690 muxpack[1] & 1))
691 ttusb->
692 muxpack_len++;
693 ttusb->muxpack_len += 4;
694 } else if (ttusb->muxpack[0] ==
695 0x47)
696 ttusb->muxpack_len =
697 188 + 4;
698 else if (ttusb->muxpack[0] == 0x00)
699 ttusb->muxpack_len =
700 ttusb->muxpack[1] + 2 +
701 4;
702 else {
703 dprintk
704 ("%s: invalid state: first byte is %x\n",
fb9393b5 705 __func__,
1da177e4
LT
706 ttusb->muxpack[0]);
707 ttusb->mux_state = 0;
708 }
709 }
710
cba862dc 711 /*
1da177e4
LT
712 * if length is valid and we reached the end:
713 * goto next muxpack
714 */
715 if ((ttusb->muxpack_ptr >= 2) &&
716 (ttusb->muxpack_ptr ==
717 ttusb->muxpack_len)) {
718 ttusb_process_muxpack(ttusb,
719 ttusb->
720 muxpack,
721 ttusb->
722 muxpack_ptr);
723 ttusb->muxpack_ptr = 0;
724 /* maximum bytes, until we know the length */
725 ttusb->muxpack_len = 2;
726
cba862dc 727 /*
1da177e4
LT
728 * no muxpacks left?
729 * return to search-sync state
730 */
731 if (!ttusb->mux_npacks--) {
732 ttusb->mux_state = 0;
733 break;
734 }
735 }
736 break;
737 }
738 default:
739 BUG();
740 break;
741 }
742 }
743}
744
7d12e780 745static void ttusb_iso_irq(struct urb *urb)
1da177e4
LT
746{
747 struct ttusb *ttusb = urb->context;
68a49a4a
JW
748 struct usb_iso_packet_descriptor *d;
749 u8 *data;
750 int len, i;
1da177e4
LT
751
752 if (!ttusb->iso_streaming)
753 return;
754
755#if 0
756 printk("%s: status %d, errcount == %d, length == %i\n",
fb9393b5 757 __func__,
1da177e4
LT
758 urb->status, urb->error_count, urb->actual_length);
759#endif
760
761 if (!urb->status) {
1da177e4 762 for (i = 0; i < urb->number_of_packets; ++i) {
1da177e4 763 numpkt++;
4da006c6 764 if (time_after_eq(jiffies, lastj + HZ)) {
80ebec68 765 dprintk("frames/s: %lu (ts: %d, stuff %d, sec: %d, invalid: %d, all: %d)\n",
68a49a4a
JW
766 numpkt * HZ / (jiffies - lastj),
767 numts, numstuff, numsec, numinvalid,
768 numts + numstuff + numsec + numinvalid);
1da177e4
LT
769 numts = numstuff = numsec = numinvalid = 0;
770 lastj = jiffies;
771 numpkt = 0;
772 }
773 d = &urb->iso_frame_desc[i];
774 data = urb->transfer_buffer + d->offset;
775 len = d->actual_length;
776 d->actual_length = 0;
777 d->status = 0;
778 ttusb_process_frame(ttusb, data, len);
779 }
780 }
781 usb_submit_urb(urb, GFP_ATOMIC);
782}
783
784static void ttusb_free_iso_urbs(struct ttusb *ttusb)
785{
786 int i;
787
788 for (i = 0; i < ISO_BUF_COUNT; i++)
0ee4c2ac 789 usb_free_urb(ttusb->iso_urb[i]);
894f3009 790 kfree(ttusb->iso_buffer);
1da177e4
LT
791}
792
793static int ttusb_alloc_iso_urbs(struct ttusb *ttusb)
794{
795 int i;
796
894f3009
CH
797 ttusb->iso_buffer = kcalloc(FRAMES_PER_ISO_BUF * ISO_BUF_COUNT,
798 ISO_FRAME_SIZE, GFP_KERNEL);
799 if (!ttusb->iso_buffer)
11eb260a 800 return -ENOMEM;
11eb260a 801
1da177e4
LT
802 for (i = 0; i < ISO_BUF_COUNT; i++) {
803 struct urb *urb;
804
805 if (!
806 (urb =
807 usb_alloc_urb(FRAMES_PER_ISO_BUF, GFP_ATOMIC))) {
808 ttusb_free_iso_urbs(ttusb);
809 return -ENOMEM;
810 }
811
812 ttusb->iso_urb[i] = urb;
813 }
814
815 return 0;
816}
817
818static void ttusb_stop_iso_xfer(struct ttusb *ttusb)
819{
820 int i;
821
822 for (i = 0; i < ISO_BUF_COUNT; i++)
823 usb_kill_urb(ttusb->iso_urb[i]);
824
825 ttusb->iso_streaming = 0;
826}
827
828static int ttusb_start_iso_xfer(struct ttusb *ttusb)
829{
830 int i, j, err, buffer_offset = 0;
831
832 if (ttusb->iso_streaming) {
fb9393b5 833 printk("%s: iso xfer already running!\n", __func__);
1da177e4
LT
834 return 0;
835 }
836
837 ttusb->cc = -1;
838 ttusb->insync = 0;
839 ttusb->mux_state = 0;
840
841 for (i = 0; i < ISO_BUF_COUNT; i++) {
842 int frame_offset = 0;
843 struct urb *urb = ttusb->iso_urb[i];
844
845 urb->dev = ttusb->dev;
846 urb->context = ttusb;
847 urb->complete = ttusb_iso_irq;
848 urb->pipe = ttusb->isoc_in_pipe;
849 urb->transfer_flags = URB_ISO_ASAP;
850 urb->interval = 1;
851 urb->number_of_packets = FRAMES_PER_ISO_BUF;
852 urb->transfer_buffer_length =
853 ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF;
854 urb->transfer_buffer = ttusb->iso_buffer + buffer_offset;
855 buffer_offset += ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF;
856
857 for (j = 0; j < FRAMES_PER_ISO_BUF; j++) {
858 urb->iso_frame_desc[j].offset = frame_offset;
859 urb->iso_frame_desc[j].length = ISO_FRAME_SIZE;
860 frame_offset += ISO_FRAME_SIZE;
861 }
862 }
863
864 for (i = 0; i < ISO_BUF_COUNT; i++) {
865 if ((err = usb_submit_urb(ttusb->iso_urb[i], GFP_ATOMIC))) {
866 ttusb_stop_iso_xfer(ttusb);
867 printk
868 ("%s: failed urb submission (%i: err = %i)!\n",
fb9393b5 869 __func__, i, err);
1da177e4
LT
870 return err;
871 }
872 }
873
874 ttusb->iso_streaming = 1;
875
876 return 0;
877}
878
879#ifdef TTUSB_HWSECTIONS
880static void ttusb_handle_ts_data(struct dvb_demux_feed *dvbdmxfeed, const u8 * data,
881 int len)
882{
883 dvbdmxfeed->cb.ts(data, len, 0, 0, &dvbdmxfeed->feed.ts, 0);
884}
885
886static void ttusb_handle_sec_data(struct dvb_demux_feed *dvbdmxfeed, const u8 * data,
887 int len)
888{
889// struct dvb_demux_feed *dvbdmxfeed = channel->dvbdmxfeed;
890#error TODO: handle ugly stuff
891// dvbdmxfeed->cb.sec(data, len, 0, 0, &dvbdmxfeed->feed.sec, 0);
892}
893#endif
894
895static int ttusb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
896{
897 struct ttusb *ttusb = (struct ttusb *) dvbdmxfeed->demux;
898 int feed_type = 1;
899
900 dprintk("ttusb_start_feed\n");
901
902 switch (dvbdmxfeed->type) {
903 case DMX_TYPE_TS:
904 break;
905 case DMX_TYPE_SEC:
906 break;
907 default:
908 return -EINVAL;
909 }
910
911 if (dvbdmxfeed->type == DMX_TYPE_TS) {
912 switch (dvbdmxfeed->pes_type) {
fde04ab9
MCC
913 case DMX_PES_VIDEO:
914 case DMX_PES_AUDIO:
915 case DMX_PES_TELETEXT:
916 case DMX_PES_PCR:
917 case DMX_PES_OTHER:
1da177e4
LT
918 break;
919 default:
920 return -EINVAL;
921 }
922 }
923
924#ifdef TTUSB_HWSECTIONS
925#error TODO: allocate filters
926 if (dvbdmxfeed->type == DMX_TYPE_TS) {
927 feed_type = 1;
928 } else if (dvbdmxfeed->type == DMX_TYPE_SEC) {
929 feed_type = 2;
930 }
931#endif
932
933 ttusb_set_channel(ttusb, dvbdmxfeed->index, feed_type, dvbdmxfeed->pid);
934
935 if (0 == ttusb->running_feed_count++)
936 ttusb_start_iso_xfer(ttusb);
937
938 return 0;
939}
940
941static int ttusb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
942{
943 struct ttusb *ttusb = (struct ttusb *) dvbdmxfeed->demux;
944
945 ttusb_del_channel(ttusb, dvbdmxfeed->index);
946
947 if (--ttusb->running_feed_count == 0)
948 ttusb_stop_iso_xfer(ttusb);
949
950 return 0;
951}
952
953static int ttusb_setup_interfaces(struct ttusb *ttusb)
954{
955 usb_set_interface(ttusb->dev, 1, 1);
956
957 ttusb->bulk_out_pipe = usb_sndbulkpipe(ttusb->dev, 1);
958 ttusb->bulk_in_pipe = usb_rcvbulkpipe(ttusb->dev, 1);
959 ttusb->isoc_in_pipe = usb_rcvisocpipe(ttusb->dev, 2);
960
961 return 0;
962}
963
964#if 0
965static u8 stc_firmware[8192];
966
967static int stc_open(struct inode *inode, struct file *file)
968{
969 struct ttusb *ttusb = file->private_data;
970 int addr;
971
972 for (addr = 0; addr < 8192; addr += 16) {
973 u8 snd_buf[2] = { addr >> 8, addr & 0xFF };
974 ttusb_i2c_msg(ttusb, 0x50, snd_buf, 2, stc_firmware + addr,
975 16);
976 }
977
978 return 0;
979}
980
981static ssize_t stc_read(struct file *file, char *buf, size_t count,
a8a89b7f 982 loff_t *offset)
1da177e4 983{
a8a89b7f 984 return simple_read_from_buffer(buf, count, offset, stc_firmware, 8192);
1da177e4
LT
985}
986
987static int stc_release(struct inode *inode, struct file *file)
988{
989 return 0;
990}
991
27a643b1 992static const struct file_operations stc_fops = {
1da177e4
LT
993 .owner = THIS_MODULE,
994 .read = stc_read,
995 .open = stc_open,
996 .release = stc_release,
997};
998#endif
999
1000static u32 functionality(struct i2c_adapter *adapter)
1001{
1002 return I2C_FUNC_I2C;
1003}
1004
1005
1006
14d24d14 1007static int alps_tdmb7_tuner_set_params(struct dvb_frontend *fe)
1da177e4 1008{
57605c96 1009 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1da177e4
LT
1010 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
1011 u8 data[4];
1012 struct i2c_msg msg = {.addr=0x61, .flags=0, .buf=data, .len=sizeof(data) };
1013 u32 div;
1014
57605c96 1015 div = (p->frequency + 36166667) / 166667;
1da177e4
LT
1016
1017 data[0] = (div >> 8) & 0x7f;
1018 data[1] = div & 0xff;
1019 data[2] = ((div >> 10) & 0x60) | 0x85;
57605c96 1020 data[3] = p->frequency < 592000000 ? 0x40 : 0x80;
1da177e4 1021
dea74869
PB
1022 if (fe->ops.i2c_gate_ctrl)
1023 fe->ops.i2c_gate_ctrl(fe, 1);
1da177e4
LT
1024 if (i2c_transfer(&ttusb->i2c_adap, &msg, 1) != 1) return -EIO;
1025 return 0;
1026}
1027
d91b730d 1028static struct cx22700_config alps_tdmb7_config = {
1da177e4 1029 .demod_address = 0x43,
1da177e4
LT
1030};
1031
1032
1033
1034
1035
651b81be 1036static int philips_tdm1316l_tuner_init(struct dvb_frontend* fe)
1da177e4
LT
1037{
1038 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
1039 static u8 td1316_init[] = { 0x0b, 0xf5, 0x85, 0xab };
1040 static u8 disable_mc44BC374c[] = { 0x1d, 0x74, 0xa0, 0x68 };
1041 struct i2c_msg tuner_msg = { .addr=0x60, .flags=0, .buf=td1316_init, .len=sizeof(td1316_init) };
1042
1043 // setup PLL configuration
dea74869
PB
1044 if (fe->ops.i2c_gate_ctrl)
1045 fe->ops.i2c_gate_ctrl(fe, 1);
1da177e4
LT
1046 if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1) return -EIO;
1047 msleep(1);
1048
1049 // disable the mc44BC374c (do not check for errors)
1050 tuner_msg.addr = 0x65;
1051 tuner_msg.buf = disable_mc44BC374c;
1052 tuner_msg.len = sizeof(disable_mc44BC374c);
dea74869
PB
1053 if (fe->ops.i2c_gate_ctrl)
1054 fe->ops.i2c_gate_ctrl(fe, 1);
1da177e4
LT
1055 if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1) {
1056 i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1);
1057 }
1058
1059 return 0;
1060}
1061
14d24d14 1062static int philips_tdm1316l_tuner_set_params(struct dvb_frontend *fe)
1da177e4 1063{
57605c96 1064 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1da177e4
LT
1065 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
1066 u8 tuner_buf[4];
1067 struct i2c_msg tuner_msg = {.addr=0x60, .flags=0, .buf=tuner_buf, .len=sizeof(tuner_buf) };
1068 int tuner_frequency = 0;
1069 u8 band, cp, filter;
1070
1071 // determine charge pump
57605c96 1072 tuner_frequency = p->frequency + 36130000;
1da177e4
LT
1073 if (tuner_frequency < 87000000) return -EINVAL;
1074 else if (tuner_frequency < 130000000) cp = 3;
1075 else if (tuner_frequency < 160000000) cp = 5;
1076 else if (tuner_frequency < 200000000) cp = 6;
1077 else if (tuner_frequency < 290000000) cp = 3;
1078 else if (tuner_frequency < 420000000) cp = 5;
1079 else if (tuner_frequency < 480000000) cp = 6;
1080 else if (tuner_frequency < 620000000) cp = 3;
1081 else if (tuner_frequency < 830000000) cp = 5;
1082 else if (tuner_frequency < 895000000) cp = 7;
1083 else return -EINVAL;
1084
1085 // determine band
57605c96
MCC
1086 if (p->frequency < 49000000)
1087 return -EINVAL;
1088 else if (p->frequency < 159000000)
1089 band = 1;
1090 else if (p->frequency < 444000000)
1091 band = 2;
1092 else if (p->frequency < 861000000)
1093 band = 4;
1da177e4
LT
1094 else return -EINVAL;
1095
1096 // setup PLL filter
57605c96
MCC
1097 switch (p->bandwidth_hz) {
1098 case 6000000:
c10d14d6 1099 tda1004x_writereg(fe, 0x0C, 0);
1da177e4
LT
1100 filter = 0;
1101 break;
1102
57605c96 1103 case 7000000:
c10d14d6 1104 tda1004x_writereg(fe, 0x0C, 0);
1da177e4
LT
1105 filter = 0;
1106 break;
1107
57605c96 1108 case 8000000:
c10d14d6 1109 tda1004x_writereg(fe, 0x0C, 0xFF);
1da177e4
LT
1110 filter = 1;
1111 break;
1112
1113 default:
1114 return -EINVAL;
1115 }
1116
1117 // calculate divisor
1118 // ((36130000+((1000000/6)/2)) + Finput)/(1000000/6)
57605c96 1119 tuner_frequency = (((p->frequency / 1000) * 6) + 217280) / 1000;
1da177e4
LT
1120
1121 // setup tuner buffer
1122 tuner_buf[0] = tuner_frequency >> 8;
1123 tuner_buf[1] = tuner_frequency & 0xff;
1124 tuner_buf[2] = 0xca;
1125 tuner_buf[3] = (cp << 5) | (filter << 3) | band;
1126
dea74869
PB
1127 if (fe->ops.i2c_gate_ctrl)
1128 fe->ops.i2c_gate_ctrl(fe, 1);
1da177e4
LT
1129 if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1)
1130 return -EIO;
1131
1132 msleep(1);
1133 return 0;
1134}
1135
1136static int philips_tdm1316l_request_firmware(struct dvb_frontend* fe, const struct firmware **fw, char* name)
1137{
1138 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
1139
1140 return request_firmware(fw, name, &ttusb->dev->dev);
1141}
1142
1143static struct tda1004x_config philips_tdm1316l_config = {
1144
1145 .demod_address = 0x8,
1146 .invert = 1,
1147 .invert_oclk = 0,
1da177e4
LT
1148 .request_firmware = philips_tdm1316l_request_firmware,
1149};
1150
1151static u8 alps_bsbe1_inittab[] = {
9101e622
MCC
1152 0x01, 0x15,
1153 0x02, 0x30,
1154 0x03, 0x00,
1155 0x04, 0x7d, /* F22FR = 0x7d, F22 = f_VCO / 128 / 0x7d = 22 kHz */
1156 0x05, 0x35, /* I2CT = 0, SCLT = 1, SDAT = 1 */
1157 0x06, 0x40, /* DAC not used, set to high impendance mode */
1158 0x07, 0x00, /* DAC LSB */
1159 0x08, 0x40, /* DiSEqC off, LNB power on OP2/LOCK pin on */
1160 0x09, 0x00, /* FIFO */
1161 0x0c, 0x51, /* OP1 ctl = Normal, OP1 val = 1 (LNB Power ON) */
1162 0x0d, 0x82, /* DC offset compensation = ON, beta_agc1 = 2 */
1163 0x0e, 0x23, /* alpha_tmg = 2, beta_tmg = 3 */
1164 0x10, 0x3f, // AGC2 0x3d
1165 0x11, 0x84,
1166 0x12, 0xb9,
1167 0x15, 0xc9, // lock detector threshold
1168 0x16, 0x00,
1169 0x17, 0x00,
1170 0x18, 0x00,
1171 0x19, 0x00,
1172 0x1a, 0x00,
1173 0x1f, 0x50,
1174 0x20, 0x00,
1175 0x21, 0x00,
1176 0x22, 0x00,
1177 0x23, 0x00,
1178 0x28, 0x00, // out imp: normal out type: parallel FEC mode:0
1179 0x29, 0x1e, // 1/2 threshold
1180 0x2a, 0x14, // 2/3 threshold
1181 0x2b, 0x0f, // 3/4 threshold
1182 0x2c, 0x09, // 5/6 threshold
1183 0x2d, 0x05, // 7/8 threshold
1184 0x2e, 0x01,
1185 0x31, 0x1f, // test all FECs
1186 0x32, 0x19, // viterbi and synchro search
1187 0x33, 0xfc, // rs control
1188 0x34, 0x93, // error control
1189 0x0f, 0x92,
1190 0xff, 0xff
1da177e4
LT
1191};
1192
1193static u8 alps_bsru6_inittab[] = {
1194 0x01, 0x15,
1195 0x02, 0x30,
1196 0x03, 0x00,
1197 0x04, 0x7d, /* F22FR = 0x7d, F22 = f_VCO / 128 / 0x7d = 22 kHz */
1198 0x05, 0x35, /* I2CT = 0, SCLT = 1, SDAT = 1 */
1199 0x06, 0x40, /* DAC not used, set to high impendance mode */
1200 0x07, 0x00, /* DAC LSB */
1201 0x08, 0x40, /* DiSEqC off, LNB power on OP2/LOCK pin on */
1202 0x09, 0x00, /* FIFO */
1203 0x0c, 0x51, /* OP1 ctl = Normal, OP1 val = 1 (LNB Power ON) */
1204 0x0d, 0x82, /* DC offset compensation = ON, beta_agc1 = 2 */
1205 0x0e, 0x23, /* alpha_tmg = 2, beta_tmg = 3 */
1206 0x10, 0x3f, // AGC2 0x3d
1207 0x11, 0x84,
7f44dcda 1208 0x12, 0xb9,
1da177e4
LT
1209 0x15, 0xc9, // lock detector threshold
1210 0x16, 0x00,
1211 0x17, 0x00,
1212 0x18, 0x00,
1213 0x19, 0x00,
1214 0x1a, 0x00,
1215 0x1f, 0x50,
1216 0x20, 0x00,
1217 0x21, 0x00,
1218 0x22, 0x00,
1219 0x23, 0x00,
1220 0x28, 0x00, // out imp: normal out type: parallel FEC mode:0
1221 0x29, 0x1e, // 1/2 threshold
1222 0x2a, 0x14, // 2/3 threshold
1223 0x2b, 0x0f, // 3/4 threshold
1224 0x2c, 0x09, // 5/6 threshold
1225 0x2d, 0x05, // 7/8 threshold
1226 0x2e, 0x01,
1227 0x31, 0x1f, // test all FECs
1228 0x32, 0x19, // viterbi and synchro search
1229 0x33, 0xfc, // rs control
1230 0x34, 0x93, // error control
1231 0x0f, 0x52,
1232 0xff, 0xff
1233};
1234
1235static int alps_stv0299_set_symbol_rate(struct dvb_frontend *fe, u32 srate, u32 ratio)
1236{
1237 u8 aclk = 0;
1238 u8 bclk = 0;
1239
1240 if (srate < 1500000) {
1241 aclk = 0xb7;
1242 bclk = 0x47;
1243 } else if (srate < 3000000) {
1244 aclk = 0xb7;
1245 bclk = 0x4b;
1246 } else if (srate < 7000000) {
1247 aclk = 0xb7;
1248 bclk = 0x4f;
1249 } else if (srate < 14000000) {
1250 aclk = 0xb7;
1251 bclk = 0x53;
1252 } else if (srate < 30000000) {
1253 aclk = 0xb6;
1254 bclk = 0x53;
1255 } else if (srate < 45000000) {
1256 aclk = 0xb4;
1257 bclk = 0x51;
1258 }
1259
1260 stv0299_writereg(fe, 0x13, aclk);
1261 stv0299_writereg(fe, 0x14, bclk);
1262 stv0299_writereg(fe, 0x1f, (ratio >> 16) & 0xff);
1263 stv0299_writereg(fe, 0x20, (ratio >> 8) & 0xff);
1264 stv0299_writereg(fe, 0x21, (ratio) & 0xf0);
1265
1266 return 0;
1267}
1268
14d24d14 1269static int philips_tsa5059_tuner_set_params(struct dvb_frontend *fe)
1da177e4 1270{
57605c96 1271 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1da177e4
LT
1272 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
1273 u8 buf[4];
1274 u32 div;
1275 struct i2c_msg msg = {.addr = 0x61,.flags = 0,.buf = buf,.len = sizeof(buf) };
1276
57605c96 1277 if ((p->frequency < 950000) || (p->frequency > 2150000))
1da177e4
LT
1278 return -EINVAL;
1279
57605c96 1280 div = (p->frequency + (125 - 1)) / 125; /* round correctly */
1da177e4
LT
1281 buf[0] = (div >> 8) & 0x7f;
1282 buf[1] = div & 0xff;
1283 buf[2] = 0x80 | ((div & 0x18000) >> 10) | 4;
1284 buf[3] = 0xC4;
1285
57605c96 1286 if (p->frequency > 1530000)
1da177e4
LT
1287 buf[3] = 0xC0;
1288
1289 /* BSBE1 wants XCE bit set */
1290 if (ttusb->revision == TTUSB_REV_2_2)
1291 buf[3] |= 0x20;
1292
dea74869
PB
1293 if (fe->ops.i2c_gate_ctrl)
1294 fe->ops.i2c_gate_ctrl(fe, 1);
651b81be 1295 if (i2c_transfer(&ttusb->i2c_adap, &msg, 1) != 1)
1da177e4
LT
1296 return -EIO;
1297
1298 return 0;
1299}
1300
1301static struct stv0299_config alps_stv0299_config = {
1302 .demod_address = 0x68,
1303 .inittab = alps_bsru6_inittab,
1304 .mclk = 88000000UL,
1305 .invert = 1,
1da177e4 1306 .skip_reinit = 0,
da2c7f66 1307 .lock_output = STV0299_LOCKOUTPUT_1,
1da177e4
LT
1308 .volt13_op0_op1 = STV0299_VOLT13_OP1,
1309 .min_delay_ms = 100,
1310 .set_symbol_rate = alps_stv0299_set_symbol_rate,
1da177e4
LT
1311};
1312
14d24d14 1313static int ttusb_novas_grundig_29504_491_tuner_set_params(struct dvb_frontend *fe)
1da177e4 1314{
57605c96 1315 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1da177e4
LT
1316 struct ttusb* ttusb = (struct ttusb*) fe->dvb->priv;
1317 u8 buf[4];
1318 u32 div;
1319 struct i2c_msg msg = {.addr = 0x61,.flags = 0,.buf = buf,.len = sizeof(buf) };
1320
57605c96 1321 div = p->frequency / 125;
1da177e4
LT
1322
1323 buf[0] = (div >> 8) & 0x7f;
1324 buf[1] = div & 0xff;
1325 buf[2] = 0x8e;
1326 buf[3] = 0x00;
1327
dea74869
PB
1328 if (fe->ops.i2c_gate_ctrl)
1329 fe->ops.i2c_gate_ctrl(fe, 1);
1da177e4
LT
1330 if (i2c_transfer(&ttusb->i2c_adap, &msg, 1) != 1)
1331 return -EIO;
1332
1333 return 0;
1334}
1335
1336static struct tda8083_config ttusb_novas_grundig_29504_491_config = {
1337
1338 .demod_address = 0x68,
1da177e4
LT
1339};
1340
14d24d14 1341static int alps_tdbe2_tuner_set_params(struct dvb_frontend *fe)
53936391 1342{
57605c96 1343 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
53936391
GH
1344 struct ttusb* ttusb = fe->dvb->priv;
1345 u32 div;
1346 u8 data[4];
1347 struct i2c_msg msg = { .addr = 0x62, .flags = 0, .buf = data, .len = sizeof(data) };
1348
57605c96 1349 div = (p->frequency + 35937500 + 31250) / 62500;
53936391
GH
1350
1351 data[0] = (div >> 8) & 0x7f;
1352 data[1] = div & 0xff;
1353 data[2] = 0x85 | ((div >> 10) & 0x60);
57605c96 1354 data[3] = (p->frequency < 174000000 ? 0x88 : p->frequency < 470000000 ? 0x84 : 0x81);
53936391 1355
dea74869
PB
1356 if (fe->ops.i2c_gate_ctrl)
1357 fe->ops.i2c_gate_ctrl(fe, 1);
53936391
GH
1358 if (i2c_transfer (&ttusb->i2c_adap, &msg, 1) != 1)
1359 return -EIO;
1360
1361 return 0;
1362}
1363
1364
1365static struct ves1820_config alps_tdbe2_config = {
1366 .demod_address = 0x09,
1367 .xin = 57840000UL,
1368 .invert = 1,
1369 .selagc = VES1820_SELAGC_SIGNAMPERR,
53936391
GH
1370};
1371
1372static u8 read_pwm(struct ttusb* ttusb)
1373{
1374 u8 b = 0xff;
1375 u8 pwm;
1376 struct i2c_msg msg[] = { { .addr = 0x50,.flags = 0,.buf = &b,.len = 1 },
1377 { .addr = 0x50,.flags = I2C_M_RD,.buf = &pwm,.len = 1} };
1378
1379 if ((i2c_transfer(&ttusb->i2c_adap, msg, 2) != 2) || (pwm == 0xff))
1380 pwm = 0x48;
1381
1382 return pwm;
1383}
1da177e4
LT
1384
1385
14d24d14 1386static int dvbc_philips_tdm1316l_tuner_set_params(struct dvb_frontend *fe)
b8d4c235 1387{
57605c96 1388 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
b8d4c235
TK
1389 struct ttusb *ttusb = (struct ttusb *) fe->dvb->priv;
1390 u8 tuner_buf[5];
1391 struct i2c_msg tuner_msg = {.addr = 0x60,
1392 .flags = 0,
1393 .buf = tuner_buf,
1394 .len = sizeof(tuner_buf) };
1395 int tuner_frequency = 0;
1396 u8 band, cp, filter;
1397
1398 // determine charge pump
57605c96 1399 tuner_frequency = p->frequency;
b8d4c235
TK
1400 if (tuner_frequency < 87000000) {return -EINVAL;}
1401 else if (tuner_frequency < 130000000) {cp = 3; band = 1;}
1402 else if (tuner_frequency < 160000000) {cp = 5; band = 1;}
1403 else if (tuner_frequency < 200000000) {cp = 6; band = 1;}
1404 else if (tuner_frequency < 290000000) {cp = 3; band = 2;}
1405 else if (tuner_frequency < 420000000) {cp = 5; band = 2;}
1406 else if (tuner_frequency < 480000000) {cp = 6; band = 2;}
1407 else if (tuner_frequency < 620000000) {cp = 3; band = 4;}
1408 else if (tuner_frequency < 830000000) {cp = 5; band = 4;}
1409 else if (tuner_frequency < 895000000) {cp = 7; band = 4;}
1410 else {return -EINVAL;}
1411
1412 // assume PLL filter should always be 8MHz for the moment.
1413 filter = 1;
1414
1415 // calculate divisor
1416 // (Finput + Fif)/Fref; Fif = 36125000 Hz, Fref = 62500 Hz
57605c96 1417 tuner_frequency = ((p->frequency + 36125000) / 62500);
b8d4c235
TK
1418
1419 // setup tuner buffer
1420 tuner_buf[0] = tuner_frequency >> 8;
1421 tuner_buf[1] = tuner_frequency & 0xff;
1422 tuner_buf[2] = 0xc8;
1423 tuner_buf[3] = (cp << 5) | (filter << 3) | band;
1424 tuner_buf[4] = 0x80;
1425
dea74869
PB
1426 if (fe->ops.i2c_gate_ctrl)
1427 fe->ops.i2c_gate_ctrl(fe, 1);
b8d4c235
TK
1428 if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1) {
1429 printk("dvb-ttusb-budget: dvbc_philips_tdm1316l_pll_set Error 1\n");
1430 return -EIO;
1431 }
1432
1433 msleep(50);
1434
dea74869
PB
1435 if (fe->ops.i2c_gate_ctrl)
1436 fe->ops.i2c_gate_ctrl(fe, 1);
b8d4c235
TK
1437 if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1) {
1438 printk("dvb-ttusb-budget: dvbc_philips_tdm1316l_pll_set Error 2\n");
1439 return -EIO;
1440 }
1441
1442 msleep(1);
1443
1444 return 0;
1445}
1446
1447static u8 dvbc_philips_tdm1316l_inittab[] = {
1448 0x80, 0x21,
1449 0x80, 0x20,
1450 0x81, 0x01,
1451 0x81, 0x00,
1452 0x00, 0x09,
1453 0x01, 0x69,
1454 0x03, 0x00,
1455 0x04, 0x00,
1456 0x07, 0x00,
1457 0x08, 0x00,
1458 0x20, 0x00,
1459 0x21, 0x40,
1460 0x22, 0x00,
1461 0x23, 0x00,
1462 0x24, 0x40,
1463 0x25, 0x88,
1464 0x30, 0xff,
1465 0x31, 0x00,
1466 0x32, 0xff,
1467 0x33, 0x00,
1468 0x34, 0x50,
1469 0x35, 0x7f,
1470 0x36, 0x00,
1471 0x37, 0x20,
1472 0x38, 0x00,
1473 0x40, 0x1c,
1474 0x41, 0xff,
1475 0x42, 0x29,
1476 0x43, 0x20,
1477 0x44, 0xff,
1478 0x45, 0x00,
1479 0x46, 0x00,
1480 0x49, 0x04,
1481 0x4a, 0xff,
1482 0x4b, 0x7f,
1483 0x52, 0x30,
1484 0x55, 0xae,
1485 0x56, 0x47,
1486 0x57, 0xe1,
1487 0x58, 0x3a,
1488 0x5a, 0x1e,
1489 0x5b, 0x34,
1490 0x60, 0x00,
1491 0x63, 0x00,
1492 0x64, 0x00,
1493 0x65, 0x00,
1494 0x66, 0x00,
1495 0x67, 0x00,
1496 0x68, 0x00,
1497 0x69, 0x00,
1498 0x6a, 0x02,
1499 0x6b, 0x00,
1500 0x70, 0xff,
1501 0x71, 0x00,
1502 0x72, 0x00,
1503 0x73, 0x00,
1504 0x74, 0x0c,
1505 0x80, 0x00,
1506 0x81, 0x00,
1507 0x82, 0x00,
1508 0x83, 0x00,
1509 0x84, 0x04,
1510 0x85, 0x80,
1511 0x86, 0x24,
1512 0x87, 0x78,
1513 0x88, 0x00,
1514 0x89, 0x00,
1515 0x90, 0x01,
1516 0x91, 0x01,
1517 0xa0, 0x00,
1518 0xa1, 0x00,
1519 0xa2, 0x00,
1520 0xb0, 0x91,
1521 0xb1, 0x0b,
1522 0xc0, 0x4b,
1523 0xc1, 0x00,
1524 0xc2, 0x00,
1525 0xd0, 0x00,
1526 0xd1, 0x00,
1527 0xd2, 0x00,
1528 0xd3, 0x00,
1529 0xd4, 0x00,
1530 0xd5, 0x00,
1531 0xde, 0x00,
1532 0xdf, 0x00,
1533 0x61, 0x38,
1534 0x62, 0x0a,
1535 0x53, 0x13,
1536 0x59, 0x08,
1537 0x55, 0x00,
1538 0x56, 0x40,
1539 0x57, 0x08,
1540 0x58, 0x3d,
1541 0x88, 0x10,
1542 0xa0, 0x00,
1543 0xa0, 0x00,
1544 0xa0, 0x00,
1545 0xa0, 0x04,
1546 0xff, 0xff,
1547};
1548
1549static struct stv0297_config dvbc_philips_tdm1316l_config = {
1550 .demod_address = 0x1c,
1551 .inittab = dvbc_philips_tdm1316l_inittab,
1552 .invert = 0,
1553};
1554
1da177e4
LT
1555static void frontend_init(struct ttusb* ttusb)
1556{
1557 switch(le16_to_cpu(ttusb->dev->descriptor.idProduct)) {
1558 case 0x1003: // Hauppauge/TT Nova-USB-S budget (stv0299/ALPS BSRU6|BSBE1(tsa5059))
1559 // try the stv0299 based first
2bfe031d 1560 ttusb->fe = dvb_attach(stv0299_attach, &alps_stv0299_config, &ttusb->i2c_adap);
1da177e4 1561 if (ttusb->fe != NULL) {
dea74869 1562 ttusb->fe->ops.tuner_ops.set_params = philips_tsa5059_tuner_set_params;
651b81be 1563
1da177e4
LT
1564 if(ttusb->revision == TTUSB_REV_2_2) { // ALPS BSBE1
1565 alps_stv0299_config.inittab = alps_bsbe1_inittab;
2bfe031d 1566 dvb_attach(lnbp21_attach, ttusb->fe, &ttusb->i2c_adap, 0, 0);
1da177e4 1567 } else { // ALPS BSRU6
dea74869 1568 ttusb->fe->ops.set_voltage = ttusb_set_voltage;
1da177e4
LT
1569 }
1570 break;
1571 }
1572
1573 // Grundig 29504-491
2bfe031d 1574 ttusb->fe = dvb_attach(tda8083_attach, &ttusb_novas_grundig_29504_491_config, &ttusb->i2c_adap);
1da177e4 1575 if (ttusb->fe != NULL) {
dea74869
PB
1576 ttusb->fe->ops.tuner_ops.set_params = ttusb_novas_grundig_29504_491_tuner_set_params;
1577 ttusb->fe->ops.set_voltage = ttusb_set_voltage;
1da177e4
LT
1578 break;
1579 }
1da177e4
LT
1580 break;
1581
53936391 1582 case 0x1004: // Hauppauge/TT DVB-C budget (ves1820/ALPS TDBE2(sp5659))
2bfe031d 1583 ttusb->fe = dvb_attach(ves1820_attach, &alps_tdbe2_config, &ttusb->i2c_adap, read_pwm(ttusb));
651b81be 1584 if (ttusb->fe != NULL) {
dea74869 1585 ttusb->fe->ops.tuner_ops.set_params = alps_tdbe2_tuner_set_params;
53936391 1586 break;
651b81be 1587 }
b8d4c235 1588
2bfe031d 1589 ttusb->fe = dvb_attach(stv0297_attach, &dvbc_philips_tdm1316l_config, &ttusb->i2c_adap);
b8d4c235 1590 if (ttusb->fe != NULL) {
dea74869 1591 ttusb->fe->ops.tuner_ops.set_params = dvbc_philips_tdm1316l_tuner_set_params;
b8d4c235
TK
1592 break;
1593 }
53936391
GH
1594 break;
1595
1da177e4
LT
1596 case 0x1005: // Hauppauge/TT Nova-USB-t budget (tda10046/Philips td1316(tda6651tt) OR cx22700/ALPS TDMB7(??))
1597 // try the ALPS TDMB7 first
2bfe031d 1598 ttusb->fe = dvb_attach(cx22700_attach, &alps_tdmb7_config, &ttusb->i2c_adap);
651b81be 1599 if (ttusb->fe != NULL) {
dea74869 1600 ttusb->fe->ops.tuner_ops.set_params = alps_tdmb7_tuner_set_params;
1da177e4 1601 break;
651b81be 1602 }
1da177e4
LT
1603
1604 // Philips td1316
2bfe031d 1605 ttusb->fe = dvb_attach(tda10046_attach, &philips_tdm1316l_config, &ttusb->i2c_adap);
651b81be 1606 if (ttusb->fe != NULL) {
dea74869
PB
1607 ttusb->fe->ops.tuner_ops.init = philips_tdm1316l_tuner_init;
1608 ttusb->fe->ops.tuner_ops.set_params = philips_tdm1316l_tuner_set_params;
1da177e4 1609 break;
651b81be 1610 }
1da177e4
LT
1611 break;
1612 }
1613
1614 if (ttusb->fe == NULL) {
29e66a6c 1615 printk("dvb-ttusb-budget: A frontend driver was not found for device [%04x:%04x]\n",
1da177e4
LT
1616 le16_to_cpu(ttusb->dev->descriptor.idVendor),
1617 le16_to_cpu(ttusb->dev->descriptor.idProduct));
1618 } else {
fdc53a6d 1619 if (dvb_register_frontend(&ttusb->adapter, ttusb->fe)) {
1da177e4 1620 printk("dvb-ttusb-budget: Frontend registration failed!\n");
f52a838b 1621 dvb_frontend_detach(ttusb->fe);
1da177e4
LT
1622 ttusb->fe = NULL;
1623 }
1624 }
1625}
1626
1627
1628
8d08a4c1 1629static const struct i2c_algorithm ttusb_dec_algo = {
1da177e4
LT
1630 .master_xfer = master_xfer,
1631 .functionality = functionality,
1632};
1633
1634static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
1635{
1636 struct usb_device *udev;
1637 struct ttusb *ttusb;
1638 int result;
1639
fb9393b5 1640 dprintk("%s: TTUSB DVB connected\n", __func__);
1da177e4
LT
1641
1642 udev = interface_to_usbdev(intf);
1643
9101e622 1644 if (intf->altsetting->desc.bInterfaceNumber != 1) return -ENODEV;
1da177e4 1645
7408187d 1646 if (!(ttusb = kzalloc(sizeof(struct ttusb), GFP_KERNEL)))
1da177e4
LT
1647 return -ENOMEM;
1648
1da177e4
LT
1649 ttusb->dev = udev;
1650 ttusb->c = 0;
1651 ttusb->mux_state = 0;
3593cab5
IM
1652 mutex_init(&ttusb->semi2c);
1653
1654 mutex_lock(&ttusb->semi2c);
1655
1656 mutex_init(&ttusb->semusb);
1da177e4
LT
1657
1658 ttusb_setup_interfaces(ttusb);
1659
b7ed785b
DSL
1660 result = ttusb_alloc_iso_urbs(ttusb);
1661 if (result < 0) {
1662 dprintk("%s: ttusb_alloc_iso_urbs - failed\n", __func__);
1663 mutex_unlock(&ttusb->semi2c);
1664 kfree(ttusb);
1665 return result;
1666 }
1667
1da177e4
LT
1668 if (ttusb_init_controller(ttusb))
1669 printk("ttusb_init_controller: error\n");
1670
3593cab5 1671 mutex_unlock(&ttusb->semi2c);
1da177e4 1672
78e92006
JG
1673 result = dvb_register_adapter(&ttusb->adapter,
1674 "Technotrend/Hauppauge Nova-USB",
1675 THIS_MODULE, &udev->dev, adapter_nr);
1676 if (result < 0) {
a064fad3
AQ
1677 ttusb_free_iso_urbs(ttusb);
1678 kfree(ttusb);
1679 return result;
1680 }
fdc53a6d 1681 ttusb->adapter.priv = ttusb;
1da177e4
LT
1682
1683 /* i2c */
1684 memset(&ttusb->i2c_adap, 0, sizeof(struct i2c_adapter));
cc1e6315 1685 strscpy(ttusb->i2c_adap.name, "TTUSB DEC", sizeof(ttusb->i2c_adap.name));
1da177e4
LT
1686
1687 i2c_set_adapdata(&ttusb->i2c_adap, ttusb);
1688
1da177e4
LT
1689 ttusb->i2c_adap.algo = &ttusb_dec_algo;
1690 ttusb->i2c_adap.algo_data = NULL;
12a917f6 1691 ttusb->i2c_adap.dev.parent = &udev->dev;
1da177e4
LT
1692
1693 result = i2c_add_adapter(&ttusb->i2c_adap);
42702de2
JN
1694 if (result)
1695 goto err_unregister_adapter;
1da177e4
LT
1696
1697 memset(&ttusb->dvb_demux, 0, sizeof(ttusb->dvb_demux));
1698
1699 ttusb->dvb_demux.dmx.capabilities =
1700 DMX_TS_FILTERING | DMX_SECTION_FILTERING;
1701 ttusb->dvb_demux.priv = NULL;
1702#ifdef TTUSB_HWSECTIONS
1703 ttusb->dvb_demux.filternum = TTUSB_MAXFILTER;
1704#else
1705 ttusb->dvb_demux.filternum = 32;
1706#endif
1707 ttusb->dvb_demux.feednum = TTUSB_MAXCHANNEL;
1708 ttusb->dvb_demux.start_feed = ttusb_start_feed;
1709 ttusb->dvb_demux.stop_feed = ttusb_stop_feed;
1710 ttusb->dvb_demux.write_to_decoder = NULL;
1711
42702de2
JN
1712 result = dvb_dmx_init(&ttusb->dvb_demux);
1713 if (result < 0) {
1da177e4 1714 printk("ttusb_dvb: dvb_dmx_init failed (errno = %d)\n", result);
42702de2
JN
1715 result = -ENODEV;
1716 goto err_i2c_del_adapter;
1da177e4
LT
1717 }
1718//FIXME dmxdev (nur WAS?)
1719 ttusb->dmxdev.filternum = ttusb->dvb_demux.filternum;
1720 ttusb->dmxdev.demux = &ttusb->dvb_demux.dmx;
1721 ttusb->dmxdev.capabilities = 0;
1722
42702de2
JN
1723 result = dvb_dmxdev_init(&ttusb->dmxdev, &ttusb->adapter);
1724 if (result < 0) {
1da177e4
LT
1725 printk("ttusb_dvb: dvb_dmxdev_init failed (errno = %d)\n",
1726 result);
42702de2
JN
1727 result = -ENODEV;
1728 goto err_release_dmx;
1da177e4
LT
1729 }
1730
fdc53a6d 1731 if (dvb_net_init(&ttusb->adapter, &ttusb->dvbnet, &ttusb->dvb_demux.dmx)) {
1da177e4 1732 printk("ttusb_dvb: dvb_net_init failed!\n");
42702de2
JN
1733 result = -ENODEV;
1734 goto err_release_dmxdev;
1da177e4
LT
1735 }
1736
1da177e4
LT
1737 usb_set_intfdata(intf, (void *) ttusb);
1738
1739 frontend_init(ttusb);
1740
1741 return 0;
42702de2
JN
1742
1743err_release_dmxdev:
1744 dvb_dmxdev_release(&ttusb->dmxdev);
1745err_release_dmx:
1746 dvb_dmx_release(&ttusb->dvb_demux);
1747err_i2c_del_adapter:
1748 i2c_del_adapter(&ttusb->i2c_adap);
1749err_unregister_adapter:
1750 dvb_unregister_adapter (&ttusb->adapter);
b9d4b2da
AK
1751 ttusb_free_iso_urbs(ttusb);
1752 kfree(ttusb);
42702de2 1753 return result;
1da177e4
LT
1754}
1755
1756static void ttusb_disconnect(struct usb_interface *intf)
1757{
1758 struct ttusb *ttusb = usb_get_intfdata(intf);
1759
1760 usb_set_intfdata(intf, NULL);
1761
1762 ttusb->disconnecting = 1;
1763
1764 ttusb_stop_iso_xfer(ttusb);
1765
1766 ttusb->dvb_demux.dmx.close(&ttusb->dvb_demux.dmx);
1767 dvb_net_release(&ttusb->dvbnet);
1768 dvb_dmxdev_release(&ttusb->dmxdev);
1769 dvb_dmx_release(&ttusb->dvb_demux);
2bfe031d
AQ
1770 if (ttusb->fe != NULL) {
1771 dvb_unregister_frontend(ttusb->fe);
f52a838b 1772 dvb_frontend_detach(ttusb->fe);
2bfe031d 1773 }
1da177e4 1774 i2c_del_adapter(&ttusb->i2c_adap);
fdc53a6d 1775 dvb_unregister_adapter(&ttusb->adapter);
1da177e4
LT
1776
1777 ttusb_free_iso_urbs(ttusb);
1778
1779 kfree(ttusb);
1780
fb9393b5 1781 dprintk("%s: TTUSB DVB disconnected\n", __func__);
1da177e4
LT
1782}
1783
7fb2e072 1784static const struct usb_device_id ttusb_table[] = {
1da177e4 1785 {USB_DEVICE(0xb48, 0x1003)},
53936391 1786 {USB_DEVICE(0xb48, 0x1004)},
1da177e4
LT
1787 {USB_DEVICE(0xb48, 0x1005)},
1788 {}
1789};
1790
1791MODULE_DEVICE_TABLE(usb, ttusb_table);
1792
1793static struct usb_driver ttusb_driver = {
27b05fd2 1794 .name = "ttusb",
1da177e4
LT
1795 .probe = ttusb_probe,
1796 .disconnect = ttusb_disconnect,
1797 .id_table = ttusb_table,
1798};
1799
ecb3b2b3 1800module_usb_driver(ttusb_driver);
1da177e4
LT
1801
1802MODULE_AUTHOR("Holger Waechtler <holger@convergence.de>");
1803MODULE_DESCRIPTION("TTUSB DVB Driver");
1804MODULE_LICENSE("GPL");
0a2a736a 1805MODULE_FIRMWARE("ttusb-budget/dspbootcode.bin");