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