lmedm04.c 31.1 KB
Newer Older
1 2 3
/* DVB USB compliant linux driver for
 *
 * DM04/QQBOX DVB-S USB BOX	LME2510C + SHARP:BS2F7HZ7395
4
 *				LME2510C + LG TDQY-P001F
5
 *				LME2510C + BS2F7HZ0194
6
 *				LME2510 + LG TDQY-P001F
7
 *				LME2510 + BS2F7HZ0194
8 9 10 11
 *
 * MVB7395 (LME2510C+SHARP:BS2F7HZ7395)
 * SHARP:BS2F7HZ7395 = (STV0288+Sharp IX2505V)
 *
12
 * MV001F (LME2510+LGTDQY-P001F)
13 14
 * LG TDQY - P001F =(TDA8263 + TDA10086H)
 *
15 16
 * MVB0001F (LME2510C+LGTDQT-P001F)
 *
17 18 19 20 21
 * MV0194 (LME2510+SHARP:BS2F7HZ0194)
 * SHARP:BS2F7HZ0194 = (STV0299+IX2410)
 *
 * MVB0194 (LME2510C+SHARP0194)
 *
22 23
 * LME2510C + M88RS2000
 *
24 25 26 27 28
 * For firmware see Documentation/dvb/lmedm04.txt
 *
 * I2C addresses:
 * 0xd0 - STV0288	- Demodulator
 * 0xc0 - Sharp IX2505V	- Tuner
29
 * --
30 31
 * 0x1c - TDA10086   - Demodulator
 * 0xc0 - TDA8263    - Tuner
32 33 34
 * --
 * 0xd0 - STV0299	- Demodulator
 * 0xc0 - IX2410	- Tuner
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
 *
 *
 * VID = 3344  PID LME2510=1122 LME2510C=1120
 *
 * Copyright (C) 2010 Malcolm Priestley (tvboxspy@gmail.com)
 * LME2510(C)(C) Leaguerme (Shenzhen) MicroElectronics Co., Ltd.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License Version 2, as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 *
 * see Documentation/dvb/README.dvb-usb for more information
 *
 * Known Issues :
 *	LME2510: Non Intel USB chipsets fail to maintain High Speed on
 * Boot or Hot Plug.
 *
58
 * QQbox suffers from noise on LNB voltage.
59
 *
60 61 62
 *	LME2510: SHARP:BS2F7HZ0194(MV0194) cannot cold reset and share system
 * with other tuners. After a cold reset streaming will not start.
 *
63
 * M88RS2000 suffers from loss of lock.
64 65 66 67
 */
#define DVB_USB_LOG_PREFIX "LME2510(C)"
#include <linux/usb.h>
#include <linux/usb/input.h>
68
#include <media/rc-core.h>
69

70
#include "dvb_usb.h"
71 72 73 74 75
#include "lmedm04.h"
#include "tda826x.h"
#include "tda10086.h"
#include "stv0288.h"
#include "ix2505v.h"
76 77 78
#include "stv0299.h"
#include "dvb-pll.h"
#include "z0194a.h"
79
#include "m88rs2000.h"
80
#include "ts2020.h"
81 82


83 84 85 86 87 88
#define LME2510_C_S7395	"dvb-usb-lme2510c-s7395.fw";
#define LME2510_C_LG	"dvb-usb-lme2510c-lg.fw";
#define LME2510_C_S0194	"dvb-usb-lme2510c-s0194.fw";
#define LME2510_C_RS2000 "dvb-usb-lme2510c-rs2000.fw";
#define LME2510_LG	"dvb-usb-lme2510-lg.fw";
#define LME2510_S0194	"dvb-usb-lme2510-s0194.fw";
89 90 91

/* debug */
static int dvb_usb_lme2510_debug;
92
#define lme_debug(var, level, args...) do { \
93
	if ((var >= level)) \
94
		pr_debug(DVB_USB_LOG_PREFIX": " args); \
95
} while (0)
96
#define deb_info(level, args...) lme_debug(dvb_usb_lme2510_debug, level, args)
97
#define debug_data_snipet(level, name, p) \
98
	 deb_info(level, name" (%8phN)", p);
99
#define info(args...) pr_info(DVB_USB_LOG_PREFIX": "args)
100 101

module_param_named(debug, dvb_usb_lme2510_debug, int, 0644);
102
MODULE_PARM_DESC(debug, "set debugging level (1=info (or-able)).");
103

104 105 106 107
static int dvb_usb_lme2510_firmware;
module_param_named(firmware, dvb_usb_lme2510_firmware, int, 0644);
MODULE_PARM_DESC(firmware, "set default firmware 0=Sharp7395 1=LG");

108 109
static int pid_filter;
module_param_named(pid, pid_filter, int, 0644);
110
MODULE_PARM_DESC(pid, "set default 0=default 1=off 2=on");
111

112

113
DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
114 115

#define TUNER_DEFAULT	0x0
116 117
#define TUNER_LG	0x1
#define TUNER_S7395	0x2
118
#define TUNER_S0194	0x3
119
#define TUNER_RS2000	0x4
120 121

struct lme2510_state {
122
	unsigned long int_urb_due;
123
	enum fe_status lock_status;
124 125 126 127 128 129 130 131 132 133
	u8 id;
	u8 tuner_config;
	u8 signal_level;
	u8 signal_sn;
	u8 time_key;
	u8 i2c_talk_onoff;
	u8 i2c_gate;
	u8 i2c_tuner_gate_w;
	u8 i2c_tuner_gate_r;
	u8 i2c_tuner_addr;
134
	u8 stream_on;
135
	u8 pid_size;
136
	u8 pid_off;
137 138 139
	void *buffer;
	struct urb *lme_urb;
	void *usb_buffer;
140
	/* Frontend original calls */
141
	int (*fe_read_status)(struct dvb_frontend *, enum fe_status *);
142 143 144 145
	int (*fe_read_signal_strength)(struct dvb_frontend *, u16 *);
	int (*fe_read_snr)(struct dvb_frontend *, u16 *);
	int (*fe_read_ber)(struct dvb_frontend *, u32 *);
	int (*fe_read_ucblocks)(struct dvb_frontend *, u32 *);
146
	int (*fe_set_voltage)(struct dvb_frontend *, enum fe_sec_voltage);
147
	u8 dvb_usb_lme2510_firmware;
148 149 150 151 152
};

static int lme2510_bulk_write(struct usb_device *dev,
				u8 *snd, int len, u8 pipe)
{
153
	int actual_l;
154

155 156
	return usb_bulk_msg(dev, usb_sndbulkpipe(dev, pipe),
			    snd, len, &actual_l, 100);
157 158 159 160 161
}

static int lme2510_bulk_read(struct usb_device *dev,
				u8 *rev, int len, u8 pipe)
{
162
	int actual_l;
163

164 165
	return usb_bulk_msg(dev, usb_rcvbulkpipe(dev, pipe),
			    rev, len, &actual_l, 200);
166 167 168 169 170 171 172 173 174 175
}

static int lme2510_usb_talk(struct dvb_usb_device *d,
		u8 *wbuf, int wlen, u8 *rbuf, int rlen)
{
	struct lme2510_state *st = d->priv;
	u8 *buff;
	int ret = 0;

	if (st->usb_buffer == NULL) {
176
		st->usb_buffer = kmalloc(64, GFP_KERNEL);
177 178 179 180 181 182 183 184 185 186 187 188
		if (st->usb_buffer == NULL) {
			info("MEM Error no memory");
			return -ENOMEM;
		}
	}
	buff = st->usb_buffer;

	ret = mutex_lock_interruptible(&d->usb_mutex);

	if (ret < 0)
		return -EAGAIN;

189 190
	/* the read/write capped at 64 */
	memcpy(buff, wbuf, (wlen < 64) ? wlen : 64);
191

192 193
	ret |= lme2510_bulk_write(d->udev, buff, wlen , 0x01);

194 195
	ret |= lme2510_bulk_read(d->udev, buff, (rlen < 64) ?
			rlen : 64 , 0x01);
196 197 198 199 200 201 202 203 204

	if (rlen > 0)
		memcpy(rbuf, buff, rlen);

	mutex_unlock(&d->usb_mutex);

	return (ret < 0) ? -ENODEV : 0;
}

205 206
static int lme2510_stream_restart(struct dvb_usb_device *d)
{
207 208 209
	struct lme2510_state *st = d->priv;
	u8 all_pids[] = LME_ALL_PIDS;
	u8 stream_on[] = LME_ST_ON_W;
210
	int ret;
211 212 213 214
	u8 rbuff[1];
	if (st->pid_off)
		ret = lme2510_usb_talk(d, all_pids, sizeof(all_pids),
			rbuff, sizeof(rbuff));
215
	/*Restart Stream Command*/
216
	ret = lme2510_usb_talk(d, stream_on, sizeof(stream_on),
217 218 219
			rbuff, sizeof(rbuff));
	return ret;
}
220

221 222 223 224 225 226
static int lme2510_enable_pid(struct dvb_usb_device *d, u8 index, u16 pid_out)
{
	struct lme2510_state *st = d->priv;
	static u8 pid_buff[] = LME_ZERO_PID;
	static u8 rbuf[1];
	u8 pid_no = index * 2;
227
	u8 pid_len = pid_no + 2;
228 229 230
	int ret = 0;
	deb_info(1, "PID Setting Pid %04x", pid_out);

231 232 233
	if (st->pid_size == 0)
		ret |= lme2510_stream_restart(d);

234 235 236 237 238
	pid_buff[2] = pid_no;
	pid_buff[3] = (u8)pid_out & 0xff;
	pid_buff[4] = pid_no + 1;
	pid_buff[5] = (u8)(pid_out >> 8);

239 240 241
	if (pid_len > st->pid_size)
		st->pid_size = pid_len;
	pid_buff[7] = 0x80 + st->pid_size;
242 243 244 245

	ret |= lme2510_usb_talk(d, pid_buff ,
		sizeof(pid_buff) , rbuf, sizeof(rbuf));

246
	if (st->stream_on)
247 248 249 250 251
		ret |= lme2510_stream_restart(d);

	return ret;
}

252 253 254
/* Convert range from 0x00-0xff to 0x0000-0xffff */
#define reg_to_16bits(x)	((x) | ((x) << 8))

255 256 257 258 259
static void lme2510_update_stats(struct dvb_usb_adapter *adap)
{
	struct lme2510_state *st = adap_to_priv(adap);
	struct dvb_frontend *fe = adap->fe[0];
	struct dtv_frontend_properties *c;
260
	u32 s_tmp = 0, c_tmp = 0;
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285

	if (!fe)
		return;

	c = &fe->dtv_property_cache;

	c->block_count.len = 1;
	c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
	c->block_error.len = 1;
	c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
	c->post_bit_count.len = 1;
	c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
	c->post_bit_error.len = 1;
	c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;

	if (st->i2c_talk_onoff) {
		c->strength.len = 1;
		c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
		c->cnr.len = 1;
		c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
		return;
	}

	switch (st->tuner_config) {
	case TUNER_LG:
286 287
		s_tmp = reg_to_16bits(0xff - st->signal_level);
		c_tmp = reg_to_16bits(0xff - st->signal_sn);
288 289 290 291
		break;
	case TUNER_S7395:
	case TUNER_S0194:
		s_tmp = 0xffff - (((st->signal_level * 2) << 8) * 5 / 4);
292
		c_tmp = reg_to_16bits((0xff - st->signal_sn - 0xa1) * 3);
293 294
		break;
	case TUNER_RS2000:
295 296
		s_tmp = reg_to_16bits(st->signal_level);
		c_tmp = reg_to_16bits(st->signal_sn);
297 298 299 300
	}

	c->strength.len = 1;
	c->strength.stat[0].scale = FE_SCALE_RELATIVE;
301
	c->strength.stat[0].uvalue = (u64)s_tmp;
302 303 304

	c->cnr.len = 1;
	c->cnr.stat[0].scale = FE_SCALE_RELATIVE;
305
	c->cnr.stat[0].uvalue = (u64)c_tmp;
306 307
}

308 309 310
static void lme2510_int_response(struct urb *lme_urb)
{
	struct dvb_usb_adapter *adap = lme_urb->context;
311
	struct lme2510_state *st = adap_to_priv(adap);
312
	u8 *ibuf, *rbuf;
313
	int i = 0, offset;
314
	u32 key;
315
	u8 signal_lock = 0;
316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341

	switch (lme_urb->status) {
	case 0:
	case -ETIMEDOUT:
		break;
	case -ECONNRESET:
	case -ENOENT:
	case -ESHUTDOWN:
		return;
	default:
		info("Error %x", lme_urb->status);
		break;
	}

	rbuf = (u8 *) lme_urb->transfer_buffer;

	offset = ((lme_urb->actual_length/8) > 4)
			? 4 : (lme_urb->actual_length/8) ;

	for (i = 0; i < offset; ++i) {
		ibuf = (u8 *)&rbuf[i*8];
		deb_info(5, "INT O/S C =%02x C/O=%02x Type =%02x%02x",
		offset, i, ibuf[0], ibuf[1]);

		switch (ibuf[0]) {
		case 0xaa:
342
			debug_data_snipet(1, "INT Remote data snipet", ibuf);
343 344 345 346 347 348 349 350 351
			if (!adap_to_d(adap)->rc_dev)
				break;

			key = RC_SCANCODE_NEC32(ibuf[2] << 24 |
						ibuf[3] << 16 |
						ibuf[4] << 8  |
						ibuf[5]);

			deb_info(1, "INT Key = 0x%08x", key);
352 353
			rc_keydown(adap_to_d(adap)->rc_dev, RC_TYPE_NEC32, key,
									0);
354 355 356 357
			break;
		case 0xbb:
			switch (st->tuner_config) {
			case TUNER_LG:
358
				signal_lock = ibuf[2] & BIT(5);
359 360 361 362 363
				st->signal_level = ibuf[4];
				st->signal_sn = ibuf[3];
				st->time_key = ibuf[7];
				break;
			case TUNER_S7395:
364
			case TUNER_S0194:
365 366
				/* Tweak for earlier firmware*/
				if (ibuf[1] == 0x03) {
367
					signal_lock = ibuf[2] & BIT(4);
368
					st->signal_level = ibuf[3];
369
					st->signal_sn = ibuf[4];
370 371 372 373 374
				} else {
					st->signal_level = ibuf[4];
					st->signal_sn = ibuf[5];
				}
				break;
375
			case TUNER_RS2000:
376
				signal_lock = ibuf[2] & 0xee;
377 378
				st->signal_level = ibuf[5];
				st->signal_sn = ibuf[4];
379
				st->time_key = ibuf[7];
380 381 382
			default:
				break;
			}
383 384 385 386 387 388 389

			/* Interrupt will also throw just BIT 0 as lock */
			signal_lock |= ibuf[2] & BIT(0);

			if (!signal_lock)
				st->lock_status &= ~FE_HAS_LOCK;

390 391
			lme2510_update_stats(adap);

392 393 394 395 396 397 398 399 400 401
			debug_data_snipet(5, "INT Remote data snipet in", ibuf);
		break;
		case 0xcc:
			debug_data_snipet(1, "INT Control data snipet", ibuf);
			break;
		default:
			debug_data_snipet(1, "INT Unknown data snipet", ibuf);
		break;
		}
	}
402

403
	usb_submit_urb(lme_urb, GFP_ATOMIC);
404

405 406 407 408
	/* Interrupt urb is due every 48 msecs while streaming the buffer
	 * stores up to 4 periods if missed. Allow 200 msec for next interrupt.
	 */
	st->int_urb_due = jiffies + msecs_to_jiffies(200);
409 410 411 412
}

static int lme2510_int_read(struct dvb_usb_adapter *adap)
{
413 414
	struct dvb_usb_device *d = adap_to_d(adap);
	struct lme2510_state *lme_int = adap_to_priv(adap);
415
	struct usb_host_endpoint *ep;
416 417 418 419 420 421

	lme_int->lme_urb = usb_alloc_urb(0, GFP_ATOMIC);

	if (lme_int->lme_urb == NULL)
			return -ENOMEM;

422
	lme_int->buffer = usb_alloc_coherent(d->udev, 128, GFP_ATOMIC,
423 424 425 426 427 428
					&lme_int->lme_urb->transfer_dma);

	if (lme_int->buffer == NULL)
			return -ENOMEM;

	usb_fill_int_urb(lme_int->lme_urb,
429 430
				d->udev,
				usb_rcvintpipe(d->udev, 0xa),
431
				lme_int->buffer,
432
				128,
433 434
				lme2510_int_response,
				adap,
435
				8);
436

437 438 439 440 441 442
	/* Quirk of pipe reporting PIPE_BULK but behaves as interrupt */
	ep = usb_pipe_endpoint(d->udev, lme_int->lme_urb->pipe);

	if (usb_endpoint_type(&ep->desc) == USB_ENDPOINT_XFER_BULK)
		lme_int->lme_urb->pipe = usb_rcvbulkpipe(d->udev, 0xa),

443 444 445
	lme_int->lme_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;

	usb_submit_urb(lme_int->lme_urb, GFP_ATOMIC);
L
Lucas De Marchi 已提交
446
	info("INT Interrupt Service Started");
447 448 449 450

	return 0;
}

451 452
static int lme2510_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
{
453 454
	struct dvb_usb_device *d = adap_to_d(adap);
	struct lme2510_state *st = adap_to_priv(adap);
455
	static u8 clear_pid_reg[] = LME_ALL_PIDS;
456
	static u8 rbuf[1];
457
	int ret = 0;
458 459 460

	deb_info(1, "PID Clearing Filter");

461
	mutex_lock(&d->i2c_mutex);
462

463
	if (!onoff) {
464
		ret |= lme2510_usb_talk(d, clear_pid_reg,
465
			sizeof(clear_pid_reg), rbuf, sizeof(rbuf));
466 467 468
		st->pid_off = true;
	} else
		st->pid_off = false;
469

470 471
	st->pid_size = 0;

472
	mutex_unlock(&d->i2c_mutex);
473 474 475 476 477 478 479

	return 0;
}

static int lme2510_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
	int onoff)
{
480
	struct dvb_usb_device *d = adap_to_d(adap);
481 482 483 484 485
	int ret = 0;

	deb_info(3, "%s PID=%04x Index=%04x onoff=%02x", __func__,
		pid, index, onoff);

486
	if (onoff) {
487 488 489
		mutex_lock(&d->i2c_mutex);
		ret |= lme2510_enable_pid(d, index, pid);
		mutex_unlock(&d->i2c_mutex);
490 491
	}

492 493 494 495 496

	return ret;
}


497
static int lme2510_return_status(struct dvb_usb_device *d)
498 499
{
	int ret = 0;
500 501 502 503 504
	u8 *data;

	data = kzalloc(10, GFP_KERNEL);
	if (!data)
		return -ENOMEM;
505

506
	ret |= usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0),
507 508 509
			0x06, 0x80, 0x0302, 0x00, data, 0x0006, 200);
	info("Firmware Status: %x (%x)", ret , data[2]);

510 511 512
	ret = (ret < 0) ? -ENODEV : data[2];
	kfree(data);
	return ret;
513 514 515 516 517 518 519
}

static int lme2510_msg(struct dvb_usb_device *d,
		u8 *wbuf, int wlen, u8 *rbuf, int rlen)
{
	struct lme2510_state *st = d->priv;

520
	st->i2c_talk_onoff = 1;
521

522
	return lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen);
523 524 525 526 527 528 529
}

static int lme2510_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
				 int num)
{
	struct dvb_usb_device *d = i2c_get_adapdata(adap);
	struct lme2510_state *st = d->priv;
530
	static u8 obuf[64], ibuf[64];
531 532 533 534
	int i, read, read_o;
	u16 len;
	u8 gate = st->i2c_gate;

535 536
	mutex_lock(&d->i2c_mutex);

537 538 539 540
	if (gate == 0)
		gate = 5;

	for (i = 0; i < num; i++) {
541 542
		read_o = msg[i].flags & I2C_M_RD;
		read = i + 1 < num && msg[i + 1].flags & I2C_M_RD;
543 544 545 546 547 548 549 550 551 552 553 554
		read |= read_o;
		gate = (msg[i].addr == st->i2c_tuner_addr)
			? (read)	? st->i2c_tuner_gate_r
					: st->i2c_tuner_gate_w
			: st->i2c_gate;
		obuf[0] = gate | (read << 7);

		if (gate == 5)
			obuf[1] = (read) ? 2 : msg[i].len + 1;
		else
			obuf[1] = msg[i].len + read + 1;

555 556
		obuf[2] = msg[i].addr << 1;

557 558 559 560 561 562 563 564 565 566 567 568 569
		if (read) {
			if (read_o)
				len = 3;
			else {
				memcpy(&obuf[3], msg[i].buf, msg[i].len);
				obuf[msg[i].len+3] = msg[i+1].len;
				len = msg[i].len+4;
			}
		} else {
			memcpy(&obuf[3], msg[i].buf, msg[i].len);
			len = msg[i].len+3;
		}

570
		if (lme2510_msg(d, obuf, len, ibuf, 64) < 0) {
571
			deb_info(1, "i2c transfer failed.");
572
			mutex_unlock(&d->i2c_mutex);
573 574 575 576 577 578 579 580 581 582 583 584
			return -EAGAIN;
		}

		if (read) {
			if (read_o)
				memcpy(msg[i].buf, &ibuf[1], msg[i].len);
			else {
				memcpy(msg[i+1].buf, &ibuf[1], msg[i+1].len);
				i++;
			}
		}
	}
585 586

	mutex_unlock(&d->i2c_mutex);
587 588 589 590 591 592 593 594 595 596 597 598 599
	return i;
}

static u32 lme2510_i2c_func(struct i2c_adapter *adapter)
{
	return I2C_FUNC_I2C;
}

static struct i2c_algorithm lme2510_i2c_algo = {
	.master_xfer   = lme2510_i2c_xfer,
	.functionality = lme2510_i2c_func,
};

600
static int lme2510_streaming_ctrl(struct dvb_frontend *fe, int onoff)
601
{
602 603 604
	struct dvb_usb_adapter *adap = fe_to_adap(fe);
	struct dvb_usb_device *d = adap_to_d(adap);
	struct lme2510_state *st = adap_to_priv(adap);
605
	static u8 clear_reg_3[] = LME_ALL_PIDS;
606
	static u8 rbuf[1];
607
	int ret = 0, rlen = sizeof(rbuf);
608 609 610

	deb_info(1, "STM  (%02x)", onoff);

611 612
	/* Streaming is started by FE_HAS_LOCK */
	if (onoff == 1)
613
		st->stream_on = 1;
614
	else {
615
		deb_info(1, "STM Steam Off");
616
		/* mutex is here only to avoid collision with I2C */
617
		mutex_lock(&d->i2c_mutex);
618

619
		ret = lme2510_usb_talk(d, clear_reg_3,
620
				sizeof(clear_reg_3), rbuf, rlen);
621
		st->stream_on = 0;
622
		st->i2c_talk_onoff = 1;
623

624
		mutex_unlock(&d->i2c_mutex);
625 626 627 628 629 630 631 632 633 634 635 636 637
	}

	return (ret < 0) ? -ENODEV : 0;
}

static u8 check_sum(u8 *p, u8 len)
{
	u8 sum = 0;
	while (len--)
		sum += *p++;
	return sum;
}

638
static int lme2510_download_firmware(struct dvb_usb_device *d,
639 640 641
					const struct firmware *fw)
{
	int ret = 0;
642
	u8 *data;
643 644 645 646 647 648 649
	u16 j, wlen, len_in, start, end;
	u8 packet_size, dlen, i;
	u8 *fw_data;

	packet_size = 0x31;
	len_in = 1;

650
	data = kzalloc(128, GFP_KERNEL);
651
	if (!data) {
652 653
		info("FRM Could not start Firmware Download"\
			"(Buffer allocation failed)");
654 655
		return -ENOMEM;
	}
656 657 658 659 660 661 662 663 664 665 666 667 668 669 670

	info("FRM Starting Firmware Download");

	for (i = 1; i < 3; i++) {
		start = (i == 1) ? 0 : 512;
		end = (i == 1) ? 512 : fw->size;
		for (j = start; j < end; j += (packet_size+1)) {
			fw_data = (u8 *)(fw->data + j);
			if ((end - j) > packet_size) {
				data[0] = i;
				dlen = packet_size;
			} else {
				data[0] = i | 0x80;
				dlen = (u8)(end - j)-1;
			}
671 672 673 674 675
			data[1] = dlen;
			memcpy(&data[2], fw_data, dlen+1);
			wlen = (u8) dlen + 4;
			data[wlen-1] = check_sum(fw_data, dlen+1);
			deb_info(1, "Data S=%02x:E=%02x CS= %02x", data[3],
676
				data[dlen+2], data[dlen+3]);
677
			lme2510_usb_talk(d, data, wlen, data, len_in);
678
			ret |= (data[0] == 0x88) ? 0 : -1;
679 680
		}
	}
681

682 683 684
	data[0] = 0x8a;
	len_in = 1;
	msleep(2000);
685
	lme2510_usb_talk(d, data, len_in, data, len_in);
686 687 688 689 690 691 692
	msleep(400);

	if (ret < 0)
		info("FRM Firmware Download Failed (%04x)" , ret);
	else
		info("FRM Firmware Download Completed - Resetting Device");

693
	kfree(data);
694
	return RECONNECTS_USB;
695 696
}

697
static void lme_coldreset(struct dvb_usb_device *d)
698
{
699
	u8 data[1] = {0};
700 701
	data[0] = 0x0a;
	info("FRM Firmware Cold Reset");
702 703

	lme2510_usb_talk(d, data, sizeof(data), data, sizeof(data));
704

705 706 707
	return;
}

708 709 710 711 712 713 714
static const char fw_c_s7395[] = LME2510_C_S7395;
static const char fw_c_lg[] = LME2510_C_LG;
static const char fw_c_s0194[] = LME2510_C_S0194;
static const char fw_c_rs2000[] = LME2510_C_RS2000;
static const char fw_lg[] = LME2510_LG;
static const char fw_s0194[] = LME2510_S0194;

715
static const char *lme_firmware_switch(struct dvb_usb_device *d, int cold)
716
{
717 718
	struct lme2510_state *st = d->priv;
	struct usb_device *udev = d->udev;
719
	const struct firmware *fw = NULL;
720
	const char *fw_lme;
721
	int ret = 0;
722

723 724
	cold = (cold > 0) ? (cold & 1) : 0;

725 726
	switch (le16_to_cpu(udev->descriptor.idProduct)) {
	case 0x1122:
727
		switch (st->dvb_usb_lme2510_firmware) {
728 729 730 731 732
		default:
		case TUNER_S0194:
			fw_lme = fw_s0194;
			ret = request_firmware(&fw, fw_lme, &udev->dev);
			if (ret == 0) {
733
				st->dvb_usb_lme2510_firmware = TUNER_S0194;
734
				cold = 0;
735 736
				break;
			}
737
			/* fall through */
738 739 740
		case TUNER_LG:
			fw_lme = fw_lg;
			ret = request_firmware(&fw, fw_lme, &udev->dev);
741 742
			if (ret == 0) {
				st->dvb_usb_lme2510_firmware = TUNER_LG;
743
				break;
744
			}
745
			st->dvb_usb_lme2510_firmware = TUNER_DEFAULT;
746 747
			break;
		}
748 749
		break;
	case 0x1120:
750
		switch (st->dvb_usb_lme2510_firmware) {
751 752 753 754
		default:
		case TUNER_S7395:
			fw_lme = fw_c_s7395;
			ret = request_firmware(&fw, fw_lme, &udev->dev);
755
			if (ret == 0) {
756
				st->dvb_usb_lme2510_firmware = TUNER_S7395;
757
				cold = 0;
758
				break;
759
			}
760
			/* fall through */
761 762 763
		case TUNER_LG:
			fw_lme = fw_c_lg;
			ret = request_firmware(&fw, fw_lme, &udev->dev);
764 765
			if (ret == 0) {
				st->dvb_usb_lme2510_firmware = TUNER_LG;
766
				break;
767 768
			}
			/* fall through */
769 770 771
		case TUNER_S0194:
			fw_lme = fw_c_s0194;
			ret = request_firmware(&fw, fw_lme, &udev->dev);
772 773
			if (ret == 0) {
				st->dvb_usb_lme2510_firmware = TUNER_S0194;
774
				break;
775
			}
776
			st->dvb_usb_lme2510_firmware = TUNER_DEFAULT;
777 778 779
			cold = 0;
			break;
		}
780 781 782
		break;
	case 0x22f0:
		fw_lme = fw_c_rs2000;
783
		st->dvb_usb_lme2510_firmware = TUNER_RS2000;
784 785 786
		break;
	default:
		fw_lme = fw_c_s7395;
787
	}
788

789 790
	release_firmware(fw);

791
	if (cold) {
792
		dvb_usb_lme2510_firmware = st->dvb_usb_lme2510_firmware;
793
		info("FRM Changing to %s firmware", fw_lme);
794 795
		lme_coldreset(d);
		return NULL;
796
	}
797

798
	return fw_lme;
799
}
800 801 802 803

static int lme2510_kill_urb(struct usb_data_stream *stream)
{
	int i;
804

805 806 807 808 809 810
	for (i = 0; i < stream->urbs_submitted; i++) {
		deb_info(3, "killing URB no. %d.", i);
		/* stop the URB */
		usb_kill_urb(stream->urb_list[i]);
	}
	stream->urbs_submitted = 0;
811

812 813 814 815
	return 0;
}

static struct tda10086_config tda10086_config = {
816
	.demod_address = 0x0e,
817 818 819 820 821 822
	.invert = 0,
	.diseqc_tone = 1,
	.xtal_freq = TDA10086_XTAL_16M,
};

static struct stv0288_config lme_config = {
823
	.demod_address = 0x68,
824 825 826 827 828
	.min_delay_ms = 15,
	.inittab = s7395_inittab,
};

static struct ix2505v_config lme_tuner = {
829
	.tuner_address = 0x60,
830 831 832 833 834
	.min_delay_ms = 100,
	.tuner_gain = 0x0,
	.tuner_chargepump = 0x3,
};

835
static struct stv0299_config sharp_z0194_config = {
836
	.demod_address = 0x68,
837 838 839 840 841 842 843 844 845 846
	.inittab = sharp_z0194a_inittab,
	.mclk = 88000000UL,
	.invert = 0,
	.skip_reinit = 0,
	.lock_output = STV0299_LOCKOUTPUT_1,
	.volt13_op0_op1 = STV0299_VOLT13_OP1,
	.min_delay_ms = 100,
	.set_symbol_rate = sharp_z0194a_set_symbol_rate,
};

847
static struct m88rs2000_config m88rs2000_config = {
848
	.demod_addr = 0x68
849 850
};

851 852 853
static struct ts2020_config ts2020_config = {
	.tuner_address = 0x60,
	.clk_out_div = 7,
854
	.dont_poll = true
855 856
};

857
static int dm04_lme2510_set_voltage(struct dvb_frontend *fe,
858
				    enum fe_sec_voltage voltage)
859
{
860 861 862
	struct dvb_usb_device *d = fe_to_d(fe);
	struct lme2510_state *st = fe_to_priv(fe);
	static u8 voltage_low[] = LME_VOLTAGE_L;
863 864 865 866
	static u8 voltage_high[] = LME_VOLTAGE_H;
	static u8 rbuf[1];
	int ret = 0, len = 3, rlen = 1;

867
	mutex_lock(&d->i2c_mutex);
868

869 870
	switch (voltage) {
	case SEC_VOLTAGE_18:
871
		ret |= lme2510_usb_talk(d,
872
			voltage_high, len, rbuf, rlen);
873 874
		break;

875 876 877
	case SEC_VOLTAGE_OFF:
	case SEC_VOLTAGE_13:
	default:
878
		ret |= lme2510_usb_talk(d,
879 880
				voltage_low, len, rbuf, rlen);
		break;
881
	}
882

883 884 885 886 887 888
	mutex_unlock(&d->i2c_mutex);

	if (st->tuner_config == TUNER_RS2000)
		if (st->fe_set_voltage)
			st->fe_set_voltage(fe, voltage);

889 890 891 892

	return (ret < 0) ? -ENODEV : 0;
}

893
static int dm04_read_status(struct dvb_frontend *fe, enum fe_status *status)
894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926
{
	struct dvb_usb_device *d = fe_to_d(fe);
	struct lme2510_state *st = d->priv;
	int ret = 0;

	if (st->i2c_talk_onoff) {
		if (st->fe_read_status) {
			ret = st->fe_read_status(fe, status);
			if (ret < 0)
				return ret;
		}

		st->lock_status = *status;

		if (*status & FE_HAS_LOCK && st->stream_on) {
			mutex_lock(&d->i2c_mutex);

			st->i2c_talk_onoff = 0;
			ret = lme2510_stream_restart(d);

			mutex_unlock(&d->i2c_mutex);
		}

		return ret;
	}

	/* Timeout of interrupt reached on RS2000 */
	if (st->tuner_config == TUNER_RS2000 &&
	    time_after(jiffies, st->int_urb_due))
		st->lock_status &= ~FE_HAS_LOCK;

	*status = st->lock_status;

927 928 929
	if (!(*status & FE_HAS_LOCK)) {
		struct dvb_usb_adapter *adap = fe_to_adap(fe);

930 931
		st->i2c_talk_onoff = 1;

932 933 934
		lme2510_update_stats(adap);
	}

935 936 937
	return ret;
}

938
static int dm04_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
939
{
940
	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
941 942
	struct lme2510_state *st = fe_to_priv(fe);

943 944 945
	if (st->fe_read_signal_strength && !st->stream_on)
		return st->fe_read_signal_strength(fe, strength);

946 947 948 949
	if (c->strength.stat[0].scale == FE_SCALE_RELATIVE)
		*strength = (u16)c->strength.stat[0].uvalue;
	else
		*strength = 0;
950 951 952 953

	return 0;
}

954
static int dm04_read_snr(struct dvb_frontend *fe, u16 *snr)
955
{
956
	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
957 958
	struct lme2510_state *st = fe_to_priv(fe);

959 960 961
	if (st->fe_read_snr && !st->stream_on)
		return st->fe_read_snr(fe, snr);

962 963 964 965
	if (c->cnr.stat[0].scale == FE_SCALE_RELATIVE)
		*snr = (u16)c->cnr.stat[0].uvalue;
	else
		*snr = 0;
966 967 968 969 970 971

	return 0;
}

static int dm04_read_ber(struct dvb_frontend *fe, u32 *ber)
{
972 973 974 975 976
	struct lme2510_state *st = fe_to_priv(fe);

	if (st->fe_read_ber && !st->stream_on)
		return st->fe_read_ber(fe, ber);

977 978 979 980 981 982 983
	*ber = 0;

	return 0;
}

static int dm04_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
{
984 985 986 987 988
	struct lme2510_state *st = fe_to_priv(fe);

	if (st->fe_read_ucblocks && !st->stream_on)
		return st->fe_read_ucblocks(fe, ucblocks);

989
	*ucblocks = 0;
990 991 992 993

	return 0;
}

994 995
static int lme_name(struct dvb_usb_adapter *adap)
{
996 997 998
	struct dvb_usb_device *d = adap_to_d(adap);
	struct lme2510_state *st = adap_to_priv(adap);
	const char *desc = d->name;
999 1000 1001
	static const char * const fe_name[] = {
		"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395",
		" SHARP:BS2F7HZ0194", " RS2000"};
1002
	char *name = adap->fe[0]->ops.info.name;
1003 1004 1005 1006 1007 1008 1009

	strlcpy(name, desc, 128);
	strlcat(name, fe_name[st->tuner_config], 128);

	return 0;
}

1010 1011
static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
{
1012 1013
	struct dvb_usb_device *d = adap_to_d(adap);
	struct lme2510_state *st = d->priv;
1014
	int ret = 0;
1015 1016

	st->i2c_talk_onoff = 1;
1017
	switch (le16_to_cpu(d->udev->descriptor.idProduct)) {
1018 1019 1020
	case 0x1122:
	case 0x1120:
		st->i2c_gate = 4;
1021 1022 1023
		adap->fe[0] = dvb_attach(tda10086_attach,
			&tda10086_config, &d->i2c_adap);
		if (adap->fe[0]) {
1024 1025 1026
			info("TUN Found Frontend TDA10086");
			st->i2c_tuner_gate_w = 4;
			st->i2c_tuner_gate_r = 4;
1027
			st->i2c_tuner_addr = 0x60;
1028
			st->tuner_config = TUNER_LG;
1029 1030 1031
			if (st->dvb_usb_lme2510_firmware != TUNER_LG) {
				st->dvb_usb_lme2510_firmware = TUNER_LG;
				ret = lme_firmware_switch(d, 1) ? 0 : -ENODEV;
1032 1033 1034
			}
			break;
		}
1035

1036
		st->i2c_gate = 4;
1037 1038 1039
		adap->fe[0] = dvb_attach(stv0299_attach,
				&sharp_z0194_config, &d->i2c_adap);
		if (adap->fe[0]) {
1040 1041 1042
			info("FE Found Stv0299");
			st->i2c_tuner_gate_w = 4;
			st->i2c_tuner_gate_r = 5;
1043
			st->i2c_tuner_addr = 0x60;
1044
			st->tuner_config = TUNER_S0194;
1045 1046 1047
			if (st->dvb_usb_lme2510_firmware != TUNER_S0194) {
				st->dvb_usb_lme2510_firmware = TUNER_S0194;
				ret = lme_firmware_switch(d, 1) ? 0 : -ENODEV;
1048 1049
			}
			break;
1050 1051
		}

1052
		st->i2c_gate = 5;
1053 1054
		adap->fe[0] = dvb_attach(stv0288_attach, &lme_config,
			&d->i2c_adap);
1055

1056
		if (adap->fe[0]) {
1057 1058 1059
			info("FE Found Stv0288");
			st->i2c_tuner_gate_w = 4;
			st->i2c_tuner_gate_r = 5;
1060
			st->i2c_tuner_addr = 0x60;
1061
			st->tuner_config = TUNER_S7395;
1062 1063 1064
			if (st->dvb_usb_lme2510_firmware != TUNER_S7395) {
				st->dvb_usb_lme2510_firmware = TUNER_S7395;
				ret = lme_firmware_switch(d, 1) ? 0 : -ENODEV;
1065 1066
			}
			break;
1067
		}
1068 1069
	case 0x22f0:
		st->i2c_gate = 5;
1070 1071
		adap->fe[0] = dvb_attach(m88rs2000_attach,
			&m88rs2000_config, &d->i2c_adap);
1072

1073
		if (adap->fe[0]) {
1074
			info("FE Found M88RS2000");
1075 1076
			dvb_attach(ts2020_attach, adap->fe[0], &ts2020_config,
					&d->i2c_adap);
1077 1078
			st->i2c_tuner_gate_w = 5;
			st->i2c_tuner_gate_r = 5;
1079
			st->i2c_tuner_addr = 0x60;
1080
			st->tuner_config = TUNER_RS2000;
1081 1082
			st->fe_set_voltage =
				adap->fe[0]->ops.set_voltage;
1083
		}
1084
		break;
1085 1086
	}

1087 1088 1089
	if (adap->fe[0] == NULL) {
		info("DM04/QQBOX Not Powered up or not Supported");
		return -ENODEV;
1090
	}
1091

1092
	if (ret) {
1093 1094 1095
		if (adap->fe[0]) {
			dvb_frontend_detach(adap->fe[0]);
			adap->fe[0] = NULL;
1096
		}
1097
		d->rc_map = NULL;
1098
		return -ENODEV;
1099 1100
	}

1101
	st->fe_read_status = adap->fe[0]->ops.read_status;
1102 1103 1104 1105
	st->fe_read_signal_strength = adap->fe[0]->ops.read_signal_strength;
	st->fe_read_snr = adap->fe[0]->ops.read_snr;
	st->fe_read_ber = adap->fe[0]->ops.read_ber;
	st->fe_read_ucblocks = adap->fe[0]->ops.read_ucblocks;
1106 1107

	adap->fe[0]->ops.read_status = dm04_read_status;
1108 1109 1110 1111
	adap->fe[0]->ops.read_signal_strength = dm04_read_signal_strength;
	adap->fe[0]->ops.read_snr = dm04_read_snr;
	adap->fe[0]->ops.read_ber = dm04_read_ber;
	adap->fe[0]->ops.read_ucblocks = dm04_read_ucblocks;
1112
	adap->fe[0]->ops.set_voltage = dm04_lme2510_set_voltage;
1113

1114 1115 1116 1117 1118 1119
	ret = lme_name(adap);
	return ret;
}

static int dm04_lme2510_tuner(struct dvb_usb_adapter *adap)
{
1120 1121
	struct dvb_usb_device *d = adap_to_d(adap);
	struct lme2510_state *st = adap_to_priv(adap);
1122
	static const char * const tun_msg[] = {"", "TDA8263", "IX2505V", "DVB_PLL_OPERA", "RS2000"};
1123 1124 1125 1126
	int ret = 0;

	switch (st->tuner_config) {
	case TUNER_LG:
1127
		if (dvb_attach(tda826x_attach, adap->fe[0], 0x60,
1128
			&d->i2c_adap, 1))
1129 1130 1131
			ret = st->tuner_config;
		break;
	case TUNER_S7395:
1132 1133
		if (dvb_attach(ix2505v_attach , adap->fe[0], &lme_tuner,
			&d->i2c_adap))
1134 1135
			ret = st->tuner_config;
		break;
1136
	case TUNER_S0194:
1137
		if (dvb_attach(dvb_pll_attach , adap->fe[0], 0x60,
1138
			&d->i2c_adap, DVB_PLL_OPERA1))
1139 1140
			ret = st->tuner_config;
		break;
1141 1142 1143
	case TUNER_RS2000:
		ret = st->tuner_config;
		break;
1144 1145 1146 1147 1148 1149 1150
	default:
		break;
	}

	if (ret)
		info("TUN Found %s tuner", tun_msg[ret]);
	else {
1151
		info("TUN No tuner found --- resetting device");
1152
		lme_coldreset(d);
1153 1154 1155
		return -ENODEV;
	}

1156 1157 1158 1159 1160 1161
	/* Start the Interrupt*/
	ret = lme2510_int_read(adap);
	if (ret < 0) {
		info("INT Unable to start Interrupt Service");
		return -ENODEV;
	}
1162 1163

	return ret;
1164 1165 1166 1167 1168
}

static int lme2510_powerup(struct dvb_usb_device *d, int onoff)
{
	struct lme2510_state *st = d->priv;
1169 1170 1171
	static u8 lnb_on[] = LNB_ON;
	static u8 lnb_off[] = LNB_OFF;
	static u8 rbuf[1];
1172
	int ret = 0, len = 3, rlen = 1;
1173

1174
	mutex_lock(&d->i2c_mutex);
1175 1176

	if (onoff)
1177
		ret = lme2510_usb_talk(d, lnb_on, len, rbuf, rlen);
1178
	else
1179
		ret = lme2510_usb_talk(d, lnb_off, len, rbuf, rlen);
1180

1181
	st->i2c_talk_onoff = 1;
1182 1183 1184 1185

	mutex_unlock(&d->i2c_mutex);

	return ret;
1186 1187
}

1188
static int lme2510_get_adapter_count(struct dvb_usb_device *d)
1189
{
1190 1191
	return 1;
}
1192

1193 1194 1195
static int lme2510_identify_state(struct dvb_usb_device *d, const char **name)
{
	struct lme2510_state *st = d->priv;
1196

1197
	usb_reset_configuration(d->udev);
1198

1199
	usb_set_interface(d->udev,
1200
		d->props->bInterfaceNumber, 1);
1201

1202
	st->dvb_usb_lme2510_firmware = dvb_usb_lme2510_firmware;
1203

1204 1205 1206
	if (lme2510_return_status(d) == 0x44) {
		*name = lme_firmware_switch(d, 0);
		return COLD;
1207 1208
	}

1209
	return 0;
1210 1211
}

1212 1213 1214 1215
static int lme2510_get_stream_config(struct dvb_frontend *fe, u8 *ts_type,
		struct usb_data_stream_properties *stream)
{
	struct dvb_usb_adapter *adap = fe_to_adap(fe);
1216
	struct dvb_usb_device *d;
1217

1218 1219
	if (adap == NULL)
		return 0;
1220 1221 1222

	d = adap_to_d(adap);

1223 1224
	/* Turn PID filter on the fly by module option */
	if (pid_filter == 2) {
1225
		adap->pid_filtering  = true;
1226
		adap->max_feed_count = 15;
1227 1228
	}

1229 1230 1231
	if (!(le16_to_cpu(d->udev->descriptor.idProduct)
		== 0x1122))
		stream->endpoint = 0x8;
1232

1233 1234 1235 1236 1237 1238
	return 0;
}

static int lme2510_get_rc_config(struct dvb_usb_device *d,
	struct dvb_usb_rc *rc)
{
1239
	rc->allowed_protos = RC_BIT_NEC32;
1240 1241
	return 0;
}
1242

1243
static void *lme2510_exit_int(struct dvb_usb_device *d)
1244 1245
{
	struct lme2510_state *st = d->priv;
1246 1247 1248 1249
	struct dvb_usb_adapter *adap = &d->adapter[0];
	void *buffer = NULL;

	if (adap != NULL) {
1250
		lme2510_kill_urb(&adap->stream);
1251 1252
	}

1253
	if (st->usb_buffer != NULL) {
1254
		st->i2c_talk_onoff = 1;
1255 1256
		st->signal_level = 0;
		st->signal_sn = 0;
1257
		buffer = st->usb_buffer;
1258 1259 1260
	}

	if (st->lme_urb != NULL) {
1261
		usb_kill_urb(st->lme_urb);
1262
		usb_free_coherent(d->udev, 128, st->buffer,
1263
				  st->lme_urb->transfer_dma);
L
Lucas De Marchi 已提交
1264
		info("Interrupt Service Stopped");
1265
	}
1266

1267
	return buffer;
1268 1269
}

1270
static void lme2510_exit(struct dvb_usb_device *d)
1271
{
1272 1273
	void *usb_buffer;

1274
	if (d != NULL) {
1275
		usb_buffer = lme2510_exit_int(d);
1276
		kfree(usb_buffer);
1277 1278 1279
	}
}

1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328
static struct dvb_usb_device_properties lme2510_props = {
	.driver_name = KBUILD_MODNAME,
	.owner = THIS_MODULE,
	.bInterfaceNumber = 0,
	.adapter_nr = adapter_nr,
	.size_of_priv = sizeof(struct lme2510_state),

	.download_firmware = lme2510_download_firmware,

	.power_ctrl       = lme2510_powerup,
	.identify_state   = lme2510_identify_state,
	.i2c_algo         = &lme2510_i2c_algo,

	.frontend_attach  = dm04_lme2510_frontend_attach,
	.tuner_attach = dm04_lme2510_tuner,
	.get_stream_config = lme2510_get_stream_config,
	.get_adapter_count = lme2510_get_adapter_count,
	.streaming_ctrl   = lme2510_streaming_ctrl,

	.get_rc_config = lme2510_get_rc_config,

	.exit = lme2510_exit,
	.adapter = {
		{
			.caps = DVB_USB_ADAP_HAS_PID_FILTER|
				DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
			.pid_filter_count = 15,
			.pid_filter = lme2510_pid_filter,
			.pid_filter_ctrl  = lme2510_pid_filter_ctrl,
			.stream =
			DVB_USB_STREAM_BULK(0x86, 10, 4096),
		},
		{
		}
	},
};

static const struct usb_device_id lme2510_id_table[] = {
	{	DVB_USB_DEVICE(0x3344, 0x1122, &lme2510_props,
		"DM04_LME2510_DVB-S", RC_MAP_LME2510)	},
	{	DVB_USB_DEVICE(0x3344, 0x1120, &lme2510_props,
		"DM04_LME2510C_DVB-S", RC_MAP_LME2510)	},
	{	DVB_USB_DEVICE(0x3344, 0x22f0, &lme2510_props,
		"DM04_LME2510C_DVB-S RS2000", RC_MAP_LME2510)	},
	{}		/* Terminating entry */
};

MODULE_DEVICE_TABLE(usb, lme2510_id_table);

1329
static struct usb_driver lme2510_driver = {
1330 1331 1332 1333 1334 1335
	.name		= KBUILD_MODNAME,
	.probe		= dvb_usbv2_probe,
	.disconnect	= dvb_usbv2_disconnect,
	.id_table	= lme2510_id_table,
	.no_dynamic_id = 1,
	.soft_unbind = 1,
1336 1337
};

1338
module_usb_driver(lme2510_driver);
1339 1340

MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>");
1341
MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0");
1342
MODULE_VERSION("2.07");
1343
MODULE_LICENSE("GPL");
1344 1345 1346 1347 1348 1349 1350
MODULE_FIRMWARE(LME2510_C_S7395);
MODULE_FIRMWARE(LME2510_C_LG);
MODULE_FIRMWARE(LME2510_C_S0194);
MODULE_FIRMWARE(LME2510_C_RS2000);
MODULE_FIRMWARE(LME2510_LG);
MODULE_FIRMWARE(LME2510_S0194);