lmedm04.c 30.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 58 59 60 61
 *
 *
 * 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.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 *
 * 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.
 *
62
 * QQbox suffers from noise on LNB voltage.
63
 *
64 65 66
 *	LME2510: SHARP:BS2F7HZ0194(MV0194) cannot cold reset and share system
 * with other tuners. After a cold reset streaming will not start.
 *
67
 * M88RS2000 suffers from loss of lock.
68 69 70 71
 */
#define DVB_USB_LOG_PREFIX "LME2510(C)"
#include <linux/usb.h>
#include <linux/usb/input.h>
72
#include <media/rc-core.h>
73

74
#include "dvb_usb.h"
75 76 77 78 79
#include "lmedm04.h"
#include "tda826x.h"
#include "tda10086.h"
#include "stv0288.h"
#include "ix2505v.h"
80 81 82
#include "stv0299.h"
#include "dvb-pll.h"
#include "z0194a.h"
83
#include "m88rs2000.h"
84
#include "ts2020.h"
85 86


87 88 89 90 91 92
#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";
93 94 95

/* debug */
static int dvb_usb_lme2510_debug;
96
#define lme_debug(var, level, args...) do { \
97
	if ((var >= level)) \
98
		pr_debug(DVB_USB_LOG_PREFIX": " args); \
99
} while (0)
100
#define deb_info(level, args...) lme_debug(dvb_usb_lme2510_debug, level, args)
101 102 103 104
#define debug_data_snipet(level, name, p) \
	 deb_info(level, name" (%02x%02x%02x%02x%02x%02x%02x%02x)", \
		*p, *(p+1), *(p+2), *(p+3), *(p+4), \
			*(p+5), *(p+6), *(p+7));
105
#define info(args...) pr_info(DVB_USB_LOG_PREFIX": "args)
106 107

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

110 111 112 113
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");

114 115
static int pid_filter;
module_param_named(pid, pid_filter, int, 0644);
116
MODULE_PARM_DESC(pid, "set default 0=default 1=off 2=on");
117

118

119
DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
120 121

#define TUNER_DEFAULT	0x0
122 123
#define TUNER_LG	0x1
#define TUNER_S7395	0x2
124
#define TUNER_S0194	0x3
125
#define TUNER_RS2000	0x4
126 127

struct lme2510_state {
128
	unsigned long int_urb_due;
129
	enum fe_status lock_status;
130 131 132 133 134 135 136 137 138 139
	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;
140
	u8 stream_on;
141
	u8 pid_size;
142
	u8 pid_off;
143 144 145
	void *buffer;
	struct urb *lme_urb;
	void *usb_buffer;
146
	/* Frontend original calls */
147
	int (*fe_read_status)(struct dvb_frontend *, enum fe_status *);
148 149 150 151
	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 *);
152
	int (*fe_set_voltage)(struct dvb_frontend *, enum fe_sec_voltage);
153
	u8 dvb_usb_lme2510_firmware;
154 155 156 157 158 159
};

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

161
	ret = usb_bulk_msg(dev, usb_sndbulkpipe(dev, pipe),
162
				snd, len , &actual_l, 100);
163 164 165 166 167 168 169 170 171
	return ret;
}

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

	ret = usb_bulk_msg(dev, usb_rcvbulkpipe(dev, pipe),
172
				 rev, len , &actual_l, 200);
173 174 175 176 177 178 179 180 181 182 183
	return ret;
}

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) {
184
		st->usb_buffer = kmalloc(64, GFP_KERNEL);
185 186 187 188 189 190 191 192 193 194 195 196
		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;

197 198
	/* the read/write capped at 64 */
	memcpy(buff, wbuf, (wlen < 64) ? wlen : 64);
199

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

202 203
	ret |= lme2510_bulk_read(d->udev, buff, (rlen < 64) ?
			rlen : 64 , 0x01);
204 205 206 207 208 209 210 211 212

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

	mutex_unlock(&d->usb_mutex);

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

213 214
static int lme2510_stream_restart(struct dvb_usb_device *d)
{
215 216 217
	struct lme2510_state *st = d->priv;
	u8 all_pids[] = LME_ALL_PIDS;
	u8 stream_on[] = LME_ST_ON_W;
218
	int ret;
219 220 221 222
	u8 rbuff[1];
	if (st->pid_off)
		ret = lme2510_usb_talk(d, all_pids, sizeof(all_pids),
			rbuff, sizeof(rbuff));
223
	/*Restart Stream Command*/
224
	ret = lme2510_usb_talk(d, stream_on, sizeof(stream_on),
225 226 227
			rbuff, sizeof(rbuff));
	return ret;
}
228

229 230 231 232 233 234
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;
235
	u8 pid_len = pid_no + 2;
236 237 238
	int ret = 0;
	deb_info(1, "PID Setting Pid %04x", pid_out);

239 240 241
	if (st->pid_size == 0)
		ret |= lme2510_stream_restart(d);

242 243 244 245 246
	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);

247 248 249
	if (pid_len > st->pid_size)
		st->pid_size = pid_len;
	pid_buff[7] = 0x80 + st->pid_size;
250 251 252 253

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

254
	if (st->stream_on)
255 256 257 258 259
		ret |= lme2510_stream_restart(d);

	return ret;
}

260 261 262
static void lme2510_int_response(struct urb *lme_urb)
{
	struct dvb_usb_adapter *adap = lme_urb->context;
263
	struct lme2510_state *st = adap_to_priv(adap);
264 265
	static u8 *ibuf, *rbuf;
	int i = 0, offset;
266
	u32 key;
267
	u8 signal_lock = 0;
268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293

	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:
294 295
			debug_data_snipet(1, "INT Remote data snipet", ibuf);
			if ((ibuf[4] + ibuf[5]) == 0xff) {
296 297 298
				key = RC_SCANCODE_NECX((ibuf[2] ^ 0xff) << 8 |
						       (ibuf[3] > 0) ? (ibuf[3] ^ 0xff) : 0,
						       ibuf[5]);
299
				deb_info(1, "INT Key =%08x", key);
300 301
				if (adap_to_d(adap)->rc_dev != NULL)
					rc_keydown(adap_to_d(adap)->rc_dev,
302
						   RC_TYPE_NEC, key, 0);
303
			}
304 305 306 307
			break;
		case 0xbb:
			switch (st->tuner_config) {
			case TUNER_LG:
308
				signal_lock = ibuf[2] & BIT(5);
309 310 311 312 313
				st->signal_level = ibuf[4];
				st->signal_sn = ibuf[3];
				st->time_key = ibuf[7];
				break;
			case TUNER_S7395:
314
			case TUNER_S0194:
315 316
				/* Tweak for earlier firmware*/
				if (ibuf[1] == 0x03) {
317
					signal_lock = ibuf[2] & BIT(4);
318
					st->signal_level = ibuf[3];
319
					st->signal_sn = ibuf[4];
320 321 322 323 324
				} else {
					st->signal_level = ibuf[4];
					st->signal_sn = ibuf[5];
				}
				break;
325
			case TUNER_RS2000:
326
				signal_lock = ibuf[2] & 0xee;
327 328
				st->signal_level = ibuf[5];
				st->signal_sn = ibuf[4];
329
				st->time_key = ibuf[7];
330 331 332
			default:
				break;
			}
333 334 335 336 337 338 339

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

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

340 341 342 343 344 345 346 347 348 349
			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;
		}
	}
350

351
	usb_submit_urb(lme_urb, GFP_ATOMIC);
352

353 354 355 356
	/* 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);
357 358 359 360
}

static int lme2510_int_read(struct dvb_usb_adapter *adap)
{
361 362
	struct dvb_usb_device *d = adap_to_d(adap);
	struct lme2510_state *lme_int = adap_to_priv(adap);
363
	struct usb_host_endpoint *ep;
364 365 366 367 368 369

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

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

370
	lme_int->buffer = usb_alloc_coherent(d->udev, 128, GFP_ATOMIC,
371 372 373 374 375 376
					&lme_int->lme_urb->transfer_dma);

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

	usb_fill_int_urb(lme_int->lme_urb,
377 378
				d->udev,
				usb_rcvintpipe(d->udev, 0xa),
379
				lme_int->buffer,
380
				128,
381 382
				lme2510_int_response,
				adap,
383
				8);
384

385 386 387 388 389 390
	/* 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),

391 392 393
	lme_int->lme_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;

	usb_submit_urb(lme_int->lme_urb, GFP_ATOMIC);
L
Lucas De Marchi 已提交
394
	info("INT Interrupt Service Started");
395 396 397 398

	return 0;
}

399 400
static int lme2510_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
{
401 402
	struct dvb_usb_device *d = adap_to_d(adap);
	struct lme2510_state *st = adap_to_priv(adap);
403
	static u8 clear_pid_reg[] = LME_ALL_PIDS;
404
	static u8 rbuf[1];
405
	int ret = 0;
406 407 408

	deb_info(1, "PID Clearing Filter");

409
	mutex_lock(&d->i2c_mutex);
410

411
	if (!onoff) {
412
		ret |= lme2510_usb_talk(d, clear_pid_reg,
413
			sizeof(clear_pid_reg), rbuf, sizeof(rbuf));
414 415 416
		st->pid_off = true;
	} else
		st->pid_off = false;
417

418 419
	st->pid_size = 0;

420
	mutex_unlock(&d->i2c_mutex);
421 422 423 424 425 426 427

	return 0;
}

static int lme2510_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
	int onoff)
{
428
	struct dvb_usb_device *d = adap_to_d(adap);
429 430 431 432 433
	int ret = 0;

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

434
	if (onoff) {
435 436 437
		mutex_lock(&d->i2c_mutex);
		ret |= lme2510_enable_pid(d, index, pid);
		mutex_unlock(&d->i2c_mutex);
438 439
	}

440 441 442 443 444

	return ret;
}


445
static int lme2510_return_status(struct dvb_usb_device *d)
446 447
{
	int ret = 0;
448 449 450 451 452
	u8 *data;

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

454
	ret |= usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0),
455 456 457
			0x06, 0x80, 0x0302, 0x00, data, 0x0006, 200);
	info("Firmware Status: %x (%x)", ret , data[2]);

458 459 460
	ret = (ret < 0) ? -ENODEV : data[2];
	kfree(data);
	return ret;
461 462 463 464 465 466 467
}

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

468
	st->i2c_talk_onoff = 1;
469

470
	return lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen);
471 472 473 474 475 476 477
}

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;
478
	static u8 obuf[64], ibuf[64];
479 480 481 482
	int i, read, read_o;
	u16 len;
	u8 gate = st->i2c_gate;

483 484
	mutex_lock(&d->i2c_mutex);

485 486 487 488
	if (gate == 0)
		gate = 5;

	for (i = 0; i < num; i++) {
489 490
		read_o = msg[i].flags & I2C_M_RD;
		read = i + 1 < num && msg[i + 1].flags & I2C_M_RD;
491 492 493 494 495 496 497 498 499 500 501 502
		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;

503 504
		obuf[2] = msg[i].addr << 1;

505 506 507 508 509 510 511 512 513 514 515 516 517
		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;
		}

518
		if (lme2510_msg(d, obuf, len, ibuf, 64) < 0) {
519
			deb_info(1, "i2c transfer failed.");
520
			mutex_unlock(&d->i2c_mutex);
521 522 523 524 525 526 527 528 529 530 531 532
			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++;
			}
		}
	}
533 534

	mutex_unlock(&d->i2c_mutex);
535 536 537 538 539 540 541 542 543 544 545 546 547
	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,
};

548
static int lme2510_streaming_ctrl(struct dvb_frontend *fe, int onoff)
549
{
550 551 552
	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);
553
	static u8 clear_reg_3[] = LME_ALL_PIDS;
554
	static u8 rbuf[1];
555
	int ret = 0, rlen = sizeof(rbuf);
556 557 558

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

559 560
	/* Streaming is started by FE_HAS_LOCK */
	if (onoff == 1)
561
		st->stream_on = 1;
562
	else {
563
		deb_info(1, "STM Steam Off");
564
		/* mutex is here only to avoid collision with I2C */
565
		mutex_lock(&d->i2c_mutex);
566

567
		ret = lme2510_usb_talk(d, clear_reg_3,
568
				sizeof(clear_reg_3), rbuf, rlen);
569
		st->stream_on = 0;
570
		st->i2c_talk_onoff = 1;
571

572
		mutex_unlock(&d->i2c_mutex);
573 574 575 576 577 578 579 580 581 582 583 584 585
	}

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

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

586
static int lme2510_download_firmware(struct dvb_usb_device *d,
587 588 589
					const struct firmware *fw)
{
	int ret = 0;
590
	u8 *data;
591 592 593 594 595 596 597
	u16 j, wlen, len_in, start, end;
	u8 packet_size, dlen, i;
	u8 *fw_data;

	packet_size = 0x31;
	len_in = 1;

598
	data = kzalloc(128, GFP_KERNEL);
599
	if (!data) {
600 601
		info("FRM Could not start Firmware Download"\
			"(Buffer allocation failed)");
602 603
		return -ENOMEM;
	}
604 605 606 607 608 609 610 611 612 613 614 615 616 617 618

	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;
			}
619 620 621 622 623
			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],
624
				data[dlen+2], data[dlen+3]);
625
			lme2510_usb_talk(d, data, wlen, data, len_in);
626
			ret |= (data[0] == 0x88) ? 0 : -1;
627 628
		}
	}
629

630 631 632
	data[0] = 0x8a;
	len_in = 1;
	msleep(2000);
633
	lme2510_usb_talk(d, data, len_in, data, len_in);
634 635 636 637 638 639 640
	msleep(400);

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

641
	kfree(data);
642
	return RECONNECTS_USB;
643 644
}

645
static void lme_coldreset(struct dvb_usb_device *d)
646
{
647
	u8 data[1] = {0};
648 649
	data[0] = 0x0a;
	info("FRM Firmware Cold Reset");
650 651

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

653 654 655
	return;
}

656 657 658 659 660 661 662
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;

663
static const char *lme_firmware_switch(struct dvb_usb_device *d, int cold)
664
{
665 666
	struct lme2510_state *st = d->priv;
	struct usb_device *udev = d->udev;
667
	const struct firmware *fw = NULL;
668
	const char *fw_lme;
669
	int ret = 0;
670

671 672
	cold = (cold > 0) ? (cold & 1) : 0;

673 674
	switch (le16_to_cpu(udev->descriptor.idProduct)) {
	case 0x1122:
675
		switch (st->dvb_usb_lme2510_firmware) {
676 677 678 679 680
		default:
		case TUNER_S0194:
			fw_lme = fw_s0194;
			ret = request_firmware(&fw, fw_lme, &udev->dev);
			if (ret == 0) {
681
				st->dvb_usb_lme2510_firmware = TUNER_S0194;
682
				cold = 0;
683 684
				break;
			}
685
			/* fall through */
686 687 688
		case TUNER_LG:
			fw_lme = fw_lg;
			ret = request_firmware(&fw, fw_lme, &udev->dev);
689 690
			if (ret == 0) {
				st->dvb_usb_lme2510_firmware = TUNER_LG;
691
				break;
692
			}
693
			st->dvb_usb_lme2510_firmware = TUNER_DEFAULT;
694 695
			break;
		}
696 697
		break;
	case 0x1120:
698
		switch (st->dvb_usb_lme2510_firmware) {
699 700 701 702
		default:
		case TUNER_S7395:
			fw_lme = fw_c_s7395;
			ret = request_firmware(&fw, fw_lme, &udev->dev);
703
			if (ret == 0) {
704
				st->dvb_usb_lme2510_firmware = TUNER_S7395;
705
				cold = 0;
706
				break;
707
			}
708
			/* fall through */
709 710 711
		case TUNER_LG:
			fw_lme = fw_c_lg;
			ret = request_firmware(&fw, fw_lme, &udev->dev);
712 713
			if (ret == 0) {
				st->dvb_usb_lme2510_firmware = TUNER_LG;
714
				break;
715 716
			}
			/* fall through */
717 718 719
		case TUNER_S0194:
			fw_lme = fw_c_s0194;
			ret = request_firmware(&fw, fw_lme, &udev->dev);
720 721
			if (ret == 0) {
				st->dvb_usb_lme2510_firmware = TUNER_S0194;
722
				break;
723
			}
724
			st->dvb_usb_lme2510_firmware = TUNER_DEFAULT;
725 726 727
			cold = 0;
			break;
		}
728 729 730
		break;
	case 0x22f0:
		fw_lme = fw_c_rs2000;
731
		st->dvb_usb_lme2510_firmware = TUNER_RS2000;
732 733 734
		break;
	default:
		fw_lme = fw_c_s7395;
735
	}
736

737 738
	release_firmware(fw);

739
	if (cold) {
740
		dvb_usb_lme2510_firmware = st->dvb_usb_lme2510_firmware;
741
		info("FRM Changing to %s firmware", fw_lme);
742 743
		lme_coldreset(d);
		return NULL;
744
	}
745

746
	return fw_lme;
747
}
748 749 750 751

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

753 754 755 756 757 758
	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;
759

760 761 762 763
	return 0;
}

static struct tda10086_config tda10086_config = {
764
	.demod_address = 0x0e,
765 766 767 768 769 770
	.invert = 0,
	.diseqc_tone = 1,
	.xtal_freq = TDA10086_XTAL_16M,
};

static struct stv0288_config lme_config = {
771
	.demod_address = 0x68,
772 773 774 775 776
	.min_delay_ms = 15,
	.inittab = s7395_inittab,
};

static struct ix2505v_config lme_tuner = {
777
	.tuner_address = 0x60,
778 779 780 781 782
	.min_delay_ms = 100,
	.tuner_gain = 0x0,
	.tuner_chargepump = 0x3,
};

783
static struct stv0299_config sharp_z0194_config = {
784
	.demod_address = 0x68,
785 786 787 788 789 790 791 792 793 794
	.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,
};

795
static struct m88rs2000_config m88rs2000_config = {
796
	.demod_addr = 0x68
797 798
};

799 800 801 802 803
static struct ts2020_config ts2020_config = {
	.tuner_address = 0x60,
	.clk_out_div = 7,
};

804
static int dm04_lme2510_set_voltage(struct dvb_frontend *fe,
805
				    enum fe_sec_voltage voltage)
806
{
807 808 809
	struct dvb_usb_device *d = fe_to_d(fe);
	struct lme2510_state *st = fe_to_priv(fe);
	static u8 voltage_low[] = LME_VOLTAGE_L;
810 811 812 813
	static u8 voltage_high[] = LME_VOLTAGE_H;
	static u8 rbuf[1];
	int ret = 0, len = 3, rlen = 1;

814
	mutex_lock(&d->i2c_mutex);
815

816 817
	switch (voltage) {
	case SEC_VOLTAGE_18:
818
		ret |= lme2510_usb_talk(d,
819
			voltage_high, len, rbuf, rlen);
820 821
		break;

822 823 824
	case SEC_VOLTAGE_OFF:
	case SEC_VOLTAGE_13:
	default:
825
		ret |= lme2510_usb_talk(d,
826 827
				voltage_low, len, rbuf, rlen);
		break;
828
	}
829

830 831 832 833 834 835
	mutex_unlock(&d->i2c_mutex);

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

836 837 838 839

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

840
static int dm04_read_status(struct dvb_frontend *fe, enum fe_status *status)
841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879
{
	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;

	if (!(*status & FE_HAS_LOCK))
		st->i2c_talk_onoff = 1;

	return ret;
}

880
static int dm04_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
881
{
882 883
	struct lme2510_state *st = fe_to_priv(fe);

884 885 886
	if (st->fe_read_signal_strength && !st->stream_on)
		return st->fe_read_signal_strength(fe, strength);

887 888 889 890 891 892 893 894 895 896 897 898 899
	switch (st->tuner_config) {
	case TUNER_LG:
		*strength = 0xff - st->signal_level;
		*strength |= *strength << 8;
		break;
	/* fall through */
	case TUNER_S7395:
	case TUNER_S0194:
		*strength = 0xffff - (((st->signal_level * 2) << 8) * 5 / 4);
		break;
	case TUNER_RS2000:
		*strength = (u16)((u32)st->signal_level * 0xffff / 0xff);
	}
900 901 902 903

	return 0;
}

904
static int dm04_read_snr(struct dvb_frontend *fe, u16 *snr)
905
{
906 907
	struct lme2510_state *st = fe_to_priv(fe);

908 909 910
	if (st->fe_read_snr && !st->stream_on)
		return st->fe_read_snr(fe, snr);

911 912 913 914 915 916 917 918 919 920 921 922 923
	switch (st->tuner_config) {
	case TUNER_LG:
		*snr = 0xff - st->signal_sn;
		*snr |= *snr << 8;
		break;
	/* fall through */
	case TUNER_S7395:
	case TUNER_S0194:
		*snr = (u16)((0xff - st->signal_sn - 0xa1) * 3) << 8;
		break;
	case TUNER_RS2000:
		*snr = (u16)((u32)st->signal_sn * 0xffff / 0x7f);
	}
924 925 926 927 928 929

	return 0;
}

static int dm04_read_ber(struct dvb_frontend *fe, u32 *ber)
{
930 931 932 933 934
	struct lme2510_state *st = fe_to_priv(fe);

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

935 936 937 938 939 940 941
	*ber = 0;

	return 0;
}

static int dm04_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
{
942 943 944 945 946
	struct lme2510_state *st = fe_to_priv(fe);

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

947
	*ucblocks = 0;
948 949 950 951

	return 0;
}

952 953
static int lme_name(struct dvb_usb_adapter *adap)
{
954 955 956
	struct dvb_usb_device *d = adap_to_d(adap);
	struct lme2510_state *st = adap_to_priv(adap);
	const char *desc = d->name;
957
	char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395",
958
				" SHARP:BS2F7HZ0194", " RS2000"};
959
	char *name = adap->fe[0]->ops.info.name;
960 961 962 963 964 965 966

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

	return 0;
}

967 968
static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
{
969 970
	struct dvb_usb_device *d = adap_to_d(adap);
	struct lme2510_state *st = d->priv;
971
	int ret = 0;
972 973

	st->i2c_talk_onoff = 1;
974
	switch (le16_to_cpu(d->udev->descriptor.idProduct)) {
975 976 977
	case 0x1122:
	case 0x1120:
		st->i2c_gate = 4;
978 979 980
		adap->fe[0] = dvb_attach(tda10086_attach,
			&tda10086_config, &d->i2c_adap);
		if (adap->fe[0]) {
981 982 983
			info("TUN Found Frontend TDA10086");
			st->i2c_tuner_gate_w = 4;
			st->i2c_tuner_gate_r = 4;
984
			st->i2c_tuner_addr = 0x60;
985
			st->tuner_config = TUNER_LG;
986 987 988
			if (st->dvb_usb_lme2510_firmware != TUNER_LG) {
				st->dvb_usb_lme2510_firmware = TUNER_LG;
				ret = lme_firmware_switch(d, 1) ? 0 : -ENODEV;
989 990 991
			}
			break;
		}
992

993
		st->i2c_gate = 4;
994 995 996
		adap->fe[0] = dvb_attach(stv0299_attach,
				&sharp_z0194_config, &d->i2c_adap);
		if (adap->fe[0]) {
997 998 999
			info("FE Found Stv0299");
			st->i2c_tuner_gate_w = 4;
			st->i2c_tuner_gate_r = 5;
1000
			st->i2c_tuner_addr = 0x60;
1001
			st->tuner_config = TUNER_S0194;
1002 1003 1004
			if (st->dvb_usb_lme2510_firmware != TUNER_S0194) {
				st->dvb_usb_lme2510_firmware = TUNER_S0194;
				ret = lme_firmware_switch(d, 1) ? 0 : -ENODEV;
1005 1006
			}
			break;
1007 1008
		}

1009
		st->i2c_gate = 5;
1010 1011
		adap->fe[0] = dvb_attach(stv0288_attach, &lme_config,
			&d->i2c_adap);
1012

1013
		if (adap->fe[0]) {
1014 1015 1016
			info("FE Found Stv0288");
			st->i2c_tuner_gate_w = 4;
			st->i2c_tuner_gate_r = 5;
1017
			st->i2c_tuner_addr = 0x60;
1018
			st->tuner_config = TUNER_S7395;
1019 1020 1021
			if (st->dvb_usb_lme2510_firmware != TUNER_S7395) {
				st->dvb_usb_lme2510_firmware = TUNER_S7395;
				ret = lme_firmware_switch(d, 1) ? 0 : -ENODEV;
1022 1023
			}
			break;
1024
		}
1025 1026
	case 0x22f0:
		st->i2c_gate = 5;
1027 1028
		adap->fe[0] = dvb_attach(m88rs2000_attach,
			&m88rs2000_config, &d->i2c_adap);
1029

1030
		if (adap->fe[0]) {
1031
			info("FE Found M88RS2000");
1032 1033
			dvb_attach(ts2020_attach, adap->fe[0], &ts2020_config,
					&d->i2c_adap);
1034 1035
			st->i2c_tuner_gate_w = 5;
			st->i2c_tuner_gate_r = 5;
1036
			st->i2c_tuner_addr = 0x60;
1037
			st->tuner_config = TUNER_RS2000;
1038 1039
			st->fe_set_voltage =
				adap->fe[0]->ops.set_voltage;
1040
		}
1041
		break;
1042 1043
	}

1044 1045 1046
	if (adap->fe[0] == NULL) {
		info("DM04/QQBOX Not Powered up or not Supported");
		return -ENODEV;
1047
	}
1048

1049
	if (ret) {
1050 1051 1052
		if (adap->fe[0]) {
			dvb_frontend_detach(adap->fe[0]);
			adap->fe[0] = NULL;
1053
		}
1054
		d->rc_map = NULL;
1055
		return -ENODEV;
1056 1057
	}

1058
	st->fe_read_status = adap->fe[0]->ops.read_status;
1059 1060 1061 1062
	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;
1063 1064

	adap->fe[0]->ops.read_status = dm04_read_status;
1065 1066 1067 1068
	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;
1069
	adap->fe[0]->ops.set_voltage = dm04_lme2510_set_voltage;
1070

1071 1072 1073 1074 1075 1076
	ret = lme_name(adap);
	return ret;
}

static int dm04_lme2510_tuner(struct dvb_usb_adapter *adap)
{
1077 1078
	struct dvb_usb_device *d = adap_to_d(adap);
	struct lme2510_state *st = adap_to_priv(adap);
1079
	char *tun_msg[] = {"", "TDA8263", "IX2505V", "DVB_PLL_OPERA", "RS2000"};
1080 1081 1082 1083
	int ret = 0;

	switch (st->tuner_config) {
	case TUNER_LG:
1084
		if (dvb_attach(tda826x_attach, adap->fe[0], 0x60,
1085
			&d->i2c_adap, 1))
1086 1087 1088
			ret = st->tuner_config;
		break;
	case TUNER_S7395:
1089 1090
		if (dvb_attach(ix2505v_attach , adap->fe[0], &lme_tuner,
			&d->i2c_adap))
1091 1092
			ret = st->tuner_config;
		break;
1093
	case TUNER_S0194:
1094
		if (dvb_attach(dvb_pll_attach , adap->fe[0], 0x60,
1095
			&d->i2c_adap, DVB_PLL_OPERA1))
1096 1097
			ret = st->tuner_config;
		break;
1098 1099 1100
	case TUNER_RS2000:
		ret = st->tuner_config;
		break;
1101 1102 1103 1104 1105 1106 1107
	default:
		break;
	}

	if (ret)
		info("TUN Found %s tuner", tun_msg[ret]);
	else {
1108
		info("TUN No tuner found --- resetting device");
1109
		lme_coldreset(d);
1110 1111 1112
		return -ENODEV;
	}

1113 1114 1115 1116 1117 1118
	/* Start the Interrupt*/
	ret = lme2510_int_read(adap);
	if (ret < 0) {
		info("INT Unable to start Interrupt Service");
		return -ENODEV;
	}
1119 1120

	return ret;
1121 1122 1123 1124 1125
}

static int lme2510_powerup(struct dvb_usb_device *d, int onoff)
{
	struct lme2510_state *st = d->priv;
1126 1127 1128
	static u8 lnb_on[] = LNB_ON;
	static u8 lnb_off[] = LNB_OFF;
	static u8 rbuf[1];
1129
	int ret = 0, len = 3, rlen = 1;
1130

1131
	mutex_lock(&d->i2c_mutex);
1132 1133

	if (onoff)
1134
		ret = lme2510_usb_talk(d, lnb_on, len, rbuf, rlen);
1135
	else
1136
		ret = lme2510_usb_talk(d, lnb_off, len, rbuf, rlen);
1137

1138
	st->i2c_talk_onoff = 1;
1139 1140 1141 1142

	mutex_unlock(&d->i2c_mutex);

	return ret;
1143 1144
}

1145
static int lme2510_get_adapter_count(struct dvb_usb_device *d)
1146
{
1147 1148
	return 1;
}
1149

1150 1151 1152
static int lme2510_identify_state(struct dvb_usb_device *d, const char **name)
{
	struct lme2510_state *st = d->priv;
1153

1154
	usb_reset_configuration(d->udev);
1155

1156
	usb_set_interface(d->udev,
1157
		d->props->bInterfaceNumber, 1);
1158

1159
	st->dvb_usb_lme2510_firmware = dvb_usb_lme2510_firmware;
1160

1161 1162 1163
	if (lme2510_return_status(d) == 0x44) {
		*name = lme_firmware_switch(d, 0);
		return COLD;
1164 1165
	}

1166
	return 0;
1167 1168
}

1169 1170 1171 1172
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);
1173
	struct dvb_usb_device *d;
1174

1175 1176
	if (adap == NULL)
		return 0;
1177 1178 1179

	d = adap_to_d(adap);

1180 1181
	/* Turn PID filter on the fly by module option */
	if (pid_filter == 2) {
1182
		adap->pid_filtering  = true;
1183
		adap->max_feed_count = 15;
1184 1185
	}

1186 1187 1188
	if (!(le16_to_cpu(d->udev->descriptor.idProduct)
		== 0x1122))
		stream->endpoint = 0x8;
1189

1190 1191 1192 1193 1194 1195
	return 0;
}

static int lme2510_get_rc_config(struct dvb_usb_device *d,
	struct dvb_usb_rc *rc)
{
1196
	rc->allowed_protos = RC_BIT_NEC;
1197 1198
	return 0;
}
1199

1200
static void *lme2510_exit_int(struct dvb_usb_device *d)
1201 1202
{
	struct lme2510_state *st = d->priv;
1203 1204 1205 1206
	struct dvb_usb_adapter *adap = &d->adapter[0];
	void *buffer = NULL;

	if (adap != NULL) {
1207
		lme2510_kill_urb(&adap->stream);
1208 1209
	}

1210
	if (st->usb_buffer != NULL) {
1211
		st->i2c_talk_onoff = 1;
1212 1213
		st->signal_level = 0;
		st->signal_sn = 0;
1214
		buffer = st->usb_buffer;
1215 1216 1217
	}

	if (st->lme_urb != NULL) {
1218
		usb_kill_urb(st->lme_urb);
1219
		usb_free_coherent(d->udev, 128, st->buffer,
1220
				  st->lme_urb->transfer_dma);
L
Lucas De Marchi 已提交
1221
		info("Interrupt Service Stopped");
1222
	}
1223

1224
	return buffer;
1225 1226
}

1227
static void lme2510_exit(struct dvb_usb_device *d)
1228
{
1229 1230
	void *usb_buffer;

1231
	if (d != NULL) {
1232
		usb_buffer = lme2510_exit_int(d);
1233
		kfree(usb_buffer);
1234 1235 1236
	}
}

1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285
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);

1286
static struct usb_driver lme2510_driver = {
1287 1288 1289 1290 1291 1292
	.name		= KBUILD_MODNAME,
	.probe		= dvb_usbv2_probe,
	.disconnect	= dvb_usbv2_disconnect,
	.id_table	= lme2510_id_table,
	.no_dynamic_id = 1,
	.soft_unbind = 1,
1293 1294
};

1295
module_usb_driver(lme2510_driver);
1296 1297

MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>");
1298
MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0");
1299
MODULE_VERSION("2.06");
1300
MODULE_LICENSE("GPL");
1301 1302 1303 1304 1305 1306 1307
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);