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

source code of linux/drivers/media/usb/ttusb-budget/dvb-ttusb-budget.c