brintos

brintos / linux-shallow public Read only

0
0
Text · 41.1 KiB · 9e016b7 Raw
1769 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * TTUSB DVB driver4 *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 ": " fmt10 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 just46    parse TS data. USB bandwidth will be a problem when having large47    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 with51    my TTUSB, so let it undef'd unless you want to implement another52    frontend. never tested.53 54  debug:55    define it to > 3 for really hardcore debugging. you probably don't want56    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      473#define FRAMES_PER_ISO_BUF 474#define ISO_FRAME_SIZE     91275#define TTUSB_MAXCHANNEL   3276#ifdef TTUSB_HWSECTIONS77#define TTUSB_MAXFILTER    16	/* ??? */78#endif79 80#define TTUSB_REV_2_2	0x2281#define TTUSB_BUDGET_NAME "ttusb_stc_fw"82 83#define MAX_SEND	0x2884#define MAX_RCV		0x2085 86/*87 *  since we're casting (struct ttusb*) <-> (struct dvb_demux*) around88 *  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 - muxpack124	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(ttusb->dev, ttusb->bulk_out_pipe,155			   ttusb->send_buf, len, &actual_len, 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(ttusb->dev, ttusb->bulk_in_pipe,168			   ttusb->last_result, MAX_RCV, &actual_len, 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(&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, b, 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(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(&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, "ttusb-budget/dspbootcode.bin",284			       &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, b, 32, 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, b, 4, 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, b, 4, 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 & 0xff339	};340 341	err = ttusb_cmd(ttusb, b, sizeof(b), 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, b, sizeof(b), 0);352	return err;353}354 355#ifdef TTUSB_HWSECTIONS356static 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#endif384 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, b0, sizeof(b0), 0)))401		return err;402 403	/* reset board (again?) */404	if ((err = ttusb_cmd(ttusb, b1, sizeof(b1), 0)))405		return err;406 407	ttusb_boot_dsp(ttusb);408 409	/* set i2c bit rate */410	if ((err = ttusb_cmd(ttusb, b2, sizeof(b2), 0)))411		return err;412 413	if ((err = ttusb_cmd(ttusb, b3, sizeof(b3), 0)))414		return err;415 416	if ((err = ttusb_cmd(ttusb, get_version,417			     sizeof(get_version), 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(get_version + 4, "V 0.0", 5) &&424	    memcmp(get_version + 4, "V 1.1", 5) &&425	    memcmp(get_version + 4, "V 2.1", 5) &&426	    memcmp(get_version + 4, "V 2.2", 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, get_dsp_version,437		      sizeof(get_dsp_version), 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_DISEQC447static 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#endif469 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, 1475	};476	int err;477 478	/* SetLNB */479	if ((err = ttusb_cmd(ttusb, b, sizeof(b), 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_TONE496static 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#endif504 505 506#if 0507static 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#endif518 519/*****************************************************************************/520 521#ifdef TTUSB_HWSECTIONS522static 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#endif527 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((__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_HWSECTIONS559		/* 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: pusi576		dprintk("cc: %04x\n", (data[0] << 8) | data[1]);577#endif578		numsec++;579	} else if (muxpack[0] == 0x47) {580#ifdef TTUSB_HWSECTIONS581		/* 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].active586			    && (pid == ttusb->channel[channel].pid))587				ttusb_handle_ts_data(ttusb->channel +588						     channel, muxpack,589						     188);590#endif591		numts++;592		dvb_dmx_swfilter_packets(&ttusb->dvb_demux, muxpack, 1);593	} else if (muxpack[0] != 0) {594		numinvalid++;595		pr_err("illegal muxpack type %02x\n", muxpack[0]);596	} else597		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 muxpack684			 */685				if ((ttusb->muxpack_ptr >= 2) &&686				    (ttusb->muxpack_ptr ==687				     ttusb->muxpack_len)) {688					ttusb_process_muxpack(ttusb,689							      ttusb->690							      muxpack,691							      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 state700				 */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(ttusb->iso_urb[i]);754	kfree(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(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(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_HWSECTIONS843static 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 stuff854//      dvbdmxfeed->cb.sec(data, len, 0, 0, &dvbdmxfeed->feed.sec, 0);855}856#endif857 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_HWSECTIONS888#error TODO: allocate filters889	if (dvbdmxfeed->type == DMX_TYPE_TS) {890		feed_type = 1;891	} else if (dvbdmxfeed->type == DMX_TYPE_SEC) {892		feed_type = 2;893	}894#endif895 896	ttusb_set_channel(ttusb, dvbdmxfeed->index, feed_type, 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, 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(ttusb->dev, 1, 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 0928static 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#endif962 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(&ttusb->i2c_adap, &msg, 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 configuration1007	if (fe->ops.i2c_gate_ctrl)1008		fe->ops.i2c_gate_ctrl(fe, 1);1009	if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1) return -EIO;1010	msleep(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(&ttusb->i2c_adap, &tuner_msg, 1) != 1) {1019		i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 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 pump1035	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 band1049	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 filter1060	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 divisor1081	// ((36130000+((1000000/6)/2)) + Finput)/(1000000/6)1082	tuner_frequency = (((p->frequency / 1000) * 6) + 217280) / 1000;1083 1084	// setup tuner buffer1085	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(&ttusb->i2c_adap, &tuner_msg, 1) != 1)1093		return -EIO;1094 1095	msleep(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, &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  0x3d1128	0x11, 0x84,1129	0x12, 0xb9,1130	0x15, 0xc9,             // lock detector threshold1131	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:01142	0x29, 0x1e,             // 1/2 threshold1143	0x2a, 0x14,             // 2/3 threshold1144	0x2b, 0x0f,             // 3/4 threshold1145	0x2c, 0x09,             // 5/6 threshold1146	0x2d, 0x05,             // 7/8 threshold1147	0x2e, 0x01,1148	0x31, 0x1f,             // test all FECs1149	0x32, 0x19,             // viterbi and synchro search1150	0x33, 0xfc,             // rs control1151	0x34, 0x93,             // error control1152	0x0f, 0x92,1153	0xff, 0xff1154};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  0x3d1170	0x11, 0x84,1171	0x12, 0xb9,1172	0x15, 0xc9,		// lock detector threshold1173	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:01184	0x29, 0x1e,		// 1/2 threshold1185	0x2a, 0x14,		// 2/3 threshold1186	0x2b, 0x0f,		// 3/4 threshold1187	0x2c, 0x09,		// 5/6 threshold1188	0x2d, 0x05,		// 7/8 threshold1189	0x2e, 0x01,1190	0x31, 0x1f,		// test all FECs1191	0x32, 0x19,		// viterbi and synchro search1192	0x33, 0xfc,		// rs control1193	0x34, 0x93,		// error control1194	0x0f, 0x52,1195	0xff, 0xff1196};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(&ttusb->i2c_adap, &msg, 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(&ttusb->i2c_adap, &msg, 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 (&ttusb->i2c_adap, &msg, 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(&ttusb->i2c_adap, msg, 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 pump1362	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 divisor1379	// (Finput + Fif)/Fref; Fif = 36125000 Hz, Fref = 62500 Hz1380	tuner_frequency = ((p->frequency + 36125000) / 62500);1381 1382	// setup tuner buffer1383	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(&ttusb->i2c_adap, &tuner_msg, 1) != 1) {1392		pr_err("dvbc_philips_tdm1316l_pll_set Error 1\n");1393		return -EIO;1394	}1395 1396	msleep(50);1397 1398	if (fe->ops.i2c_gate_ctrl)1399		fe->ops.i2c_gate_ctrl(fe, 1);1400	if (i2c_transfer(&ttusb->i2c_adap, &tuner_msg, 1) != 1) {1401		pr_err("dvbc_philips_tdm1316l_pll_set Error 2\n");1402		return -EIO;1403	}1404 1405	msleep(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 first1523		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 BSBE11528				alps_stv0299_config.inittab = alps_bsbe1_inittab;1529				dvb_attach(lnbp21_attach, ttusb->fe, &ttusb->i2c_adap, 0, 0);1530			} else { // ALPS BSRU61531				ttusb->fe->ops.set_voltage = ttusb_set_voltage;1532			}1533			break;1534		}1535 1536		// Grundig 29504-4911537		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 first1561		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 td13161568		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(&ttusb->adapter, ttusb->fe)) {1583			pr_err("Frontend registration failed!\n");1584			dvb_frontend_detach(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(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(&ttusb->semi2c);1627		kfree(ttusb);1628		return result;1629	}1630 1631	if (ttusb_init_controller(ttusb))1632		pr_err("ttusb_init_controller: error\n");1633 1634	mutex_unlock(&ttusb->semi2c);1635 1636	result = dvb_register_adapter(&ttusb->adapter,1637				      "Technotrend/Hauppauge Nova-USB",1638				      THIS_MODULE, &udev->dev, adapter_nr);1639	if (result < 0) {1640		ttusb_free_iso_urbs(ttusb);1641		kfree(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(&ttusb->i2c_adap, 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(&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_HWSECTIONS1666	ttusb->dvb_demux.filternum = TTUSB_MAXFILTER;1667#else1668	ttusb->dvb_demux.filternum = 32;1669#endif1670	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(&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(&ttusb->dmxdev, &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(&ttusb->adapter, &ttusb->dvbnet, &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, (void *) ttusb);1701 1702	frontend_init(ttusb);1703 1704	return 0;1705 1706err_release_dmxdev:1707	dvb_dmxdev_release(&ttusb->dmxdev);1708err_release_dmx:1709	dvb_dmx_release(&ttusb->dvb_demux);1710err_i2c_del_adapter:1711	i2c_del_adapter(&ttusb->i2c_adap);1712err_unregister_adapter:1713	dvb_unregister_adapter (&ttusb->adapter);1714	ttusb_free_iso_urbs(ttusb);1715	kfree(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(&ttusb->dvbnet);1731	dvb_dmxdev_release(&ttusb->dmxdev);1732	dvb_dmx_release(&ttusb->dvb_demux);1733	if (ttusb->fe != NULL) {1734		dvb_unregister_frontend(ttusb->fe);1735		dvb_frontend_detach(ttusb->fe);1736	}1737	i2c_del_adapter(&ttusb->i2c_adap);1738	dvb_unregister_adapter(&ttusb->adapter);1739 1740	ttusb_free_iso_urbs(ttusb);1741 1742	kfree(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