1/* DVB USB compliant linux driver for
2 *
3 * 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 * MVB7395 (LME2510C+SHARP:BS2F7HZ7395)
10 * SHARP:BS2F7HZ7395 = (STV0288+Sharp IX2505V)
11 *
12 * MV001F (LME2510+LGTDQY-P001F)
13 * LG TDQY - P001F =(TDA8263 + TDA10086H)
14 *
15 * MVB0001F (LME2510C+LGTDQT-P001F)
16 *
17 * MV0194 (LME2510+SHARP:BS2F7HZ0194)
18 * SHARP:BS2F7HZ0194 = (STV0299+IX2410)
19 *
20 * MVB0194 (LME2510C+SHARP0194)
21 *
22 * LME2510C + M88RS2000
23 *
24 * For firmware see Documentation/dvb/lmedm04.txt
25 *
26 * I2C addresses:
27 * 0xd0 - STV0288	- Demodulator
28 * 0xc0 - Sharp IX2505V	- Tuner
29 * --
30 * 0x1c - TDA10086   - Demodulator
31 * 0xc0 - TDA8263    - Tuner
32 * --
33 * 0xd0 - STV0299	- Demodulator
34 * 0xc0 - IX2410	- Tuner
35 *
36 *
37 * VID = 3344  PID LME2510=1122 LME2510C=1120
38 *
39 * Copyright (C) 2010 Malcolm Priestley (tvboxspy@gmail.com)
40 * LME2510(C)(C) Leaguerme (Shenzhen) MicroElectronics Co., Ltd.
41 *
42 * This program is free software; you can redistribute it and/or modify
43 * it under the terms of the GNU General Public License Version 2, as
44 * published by the Free Software Foundation.
45 *
46 * This program is distributed in the hope that it will be useful,
47 * but WITHOUT ANY WARRANTY; without even the implied warranty of
48 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
49 * GNU General Public License for more details.
50 *
51 * You should have received a copy of the GNU General Public License
52 * along with this program; if not, write to the Free Software
53 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
54 *
55 *
56 * see Documentation/dvb/README.dvb-usb for more information
57 *
58 * Known Issues :
59 *	LME2510: Non Intel USB chipsets fail to maintain High Speed on
60 * Boot or Hot Plug.
61 *
62 * QQbox suffers from noise on LNB voltage.
63 *
64 *	LME2510: SHARP:BS2F7HZ0194(MV0194) cannot cold reset and share system
65 * with other tuners. After a cold reset streaming will not start.
66 *
67 * M88RS2000 suffers from loss of lock.
68 */
69#define DVB_USB_LOG_PREFIX "LME2510(C)"
70#include <linux/usb.h>
71#include <linux/usb/input.h>
72#include <media/rc-core.h>
73
74#include "dvb_usb.h"
75#include "lmedm04.h"
76#include "tda826x.h"
77#include "tda10086.h"
78#include "stv0288.h"
79#include "ix2505v.h"
80#include "stv0299.h"
81#include "dvb-pll.h"
82#include "z0194a.h"
83#include "m88rs2000.h"
84#include "ts2020.h"
85
86
87#define LME2510_C_S7395	"dvb-usb-lme2510c-s7395.fw";
88#define LME2510_C_LG	"dvb-usb-lme2510c-lg.fw";
89#define LME2510_C_S0194	"dvb-usb-lme2510c-s0194.fw";
90#define LME2510_C_RS2000 "dvb-usb-lme2510c-rs2000.fw";
91#define LME2510_LG	"dvb-usb-lme2510-lg.fw";
92#define LME2510_S0194	"dvb-usb-lme2510-s0194.fw";
93
94/* debug */
95static 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#define debug_data_snipet(level, name, p) \
102	 deb_info(level, name" (%02x%02x%02x%02x%02x%02x%02x%02x)", \
103		*p, *(p+1), *(p+2), *(p+3), *(p+4), \
104			*(p+5), *(p+6), *(p+7));
105#define info(args...) pr_info(DVB_USB_LOG_PREFIX": "args)
106
107module_param_named(debug, dvb_usb_lme2510_debug, int, 0644);
108MODULE_PARM_DESC(debug, "set debugging level (1=info (or-able)).");
109
110static int dvb_usb_lme2510_firmware;
111module_param_named(firmware, dvb_usb_lme2510_firmware, int, 0644);
112MODULE_PARM_DESC(firmware, "set default firmware 0=Sharp7395 1=LG");
113
114static int pid_filter;
115module_param_named(pid, pid_filter, int, 0644);
116MODULE_PARM_DESC(pid, "set default 0=default 1=off 2=on");
117
118
119DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
120
121#define TUNER_DEFAULT	0x0
122#define TUNER_LG	0x1
123#define TUNER_S7395	0x2
124#define TUNER_S0194	0x3
125#define TUNER_RS2000	0x4
126
127struct lme2510_state {
128	unsigned long int_urb_due;
129	u8 id;
130	u8 tuner_config;
131	u8 signal_lock;
132	u8 signal_level;
133	u8 signal_sn;
134	u8 time_key;
135	u8 i2c_talk_onoff;
136	u8 i2c_gate;
137	u8 i2c_tuner_gate_w;
138	u8 i2c_tuner_gate_r;
139	u8 i2c_tuner_addr;
140	u8 stream_on;
141	u8 pid_size;
142	u8 pid_off;
143	void *buffer;
144	struct urb *lme_urb;
145	void *usb_buffer;
146	int (*fe_set_voltage)(struct dvb_frontend *, fe_sec_voltage_t);
147	u8 dvb_usb_lme2510_firmware;
148};
149
150static int lme2510_bulk_write(struct usb_device *dev,
151				u8 *snd, int len, u8 pipe)
152{
153	int ret, actual_l;
154
155	ret = usb_bulk_msg(dev, usb_sndbulkpipe(dev, pipe),
156				snd, len , &actual_l, 100);
157	return ret;
158}
159
160static int lme2510_bulk_read(struct usb_device *dev,
161				u8 *rev, int len, u8 pipe)
162{
163	int ret, actual_l;
164
165	ret = usb_bulk_msg(dev, usb_rcvbulkpipe(dev, pipe),
166				 rev, len , &actual_l, 200);
167	return ret;
168}
169
170static int lme2510_usb_talk(struct dvb_usb_device *d,
171		u8 *wbuf, int wlen, u8 *rbuf, int rlen)
172{
173	struct lme2510_state *st = d->priv;
174	u8 *buff;
175	int ret = 0;
176
177	if (st->usb_buffer == NULL) {
178		st->usb_buffer = kmalloc(64, GFP_KERNEL);
179		if (st->usb_buffer == NULL) {
180			info("MEM Error no memory");
181			return -ENOMEM;
182		}
183	}
184	buff = st->usb_buffer;
185
186	ret = mutex_lock_interruptible(&d->usb_mutex);
187
188	if (ret < 0)
189		return -EAGAIN;
190
191	/* the read/write capped at 64 */
192	memcpy(buff, wbuf, (wlen < 64) ? wlen : 64);
193
194	ret |= lme2510_bulk_write(d->udev, buff, wlen , 0x01);
195
196	ret |= lme2510_bulk_read(d->udev, buff, (rlen < 64) ?
197			rlen : 64 , 0x01);
198
199	if (rlen > 0)
200		memcpy(rbuf, buff, rlen);
201
202	mutex_unlock(&d->usb_mutex);
203
204	return (ret < 0) ? -ENODEV : 0;
205}
206
207static int lme2510_stream_restart(struct dvb_usb_device *d)
208{
209	struct lme2510_state *st = d->priv;
210	u8 all_pids[] = LME_ALL_PIDS;
211	u8 stream_on[] = LME_ST_ON_W;
212	int ret;
213	u8 rbuff[1];
214	if (st->pid_off)
215		ret = lme2510_usb_talk(d, all_pids, sizeof(all_pids),
216			rbuff, sizeof(rbuff));
217	/*Restart Stream Command*/
218	ret = lme2510_usb_talk(d, stream_on, sizeof(stream_on),
219			rbuff, sizeof(rbuff));
220	return ret;
221}
222
223static int lme2510_enable_pid(struct dvb_usb_device *d, u8 index, u16 pid_out)
224{
225	struct lme2510_state *st = d->priv;
226	static u8 pid_buff[] = LME_ZERO_PID;
227	static u8 rbuf[1];
228	u8 pid_no = index * 2;
229	u8 pid_len = pid_no + 2;
230	int ret = 0;
231	deb_info(1, "PID Setting Pid %04x", pid_out);
232
233	if (st->pid_size == 0)
234		ret |= lme2510_stream_restart(d);
235
236	pid_buff[2] = pid_no;
237	pid_buff[3] = (u8)pid_out & 0xff;
238	pid_buff[4] = pid_no + 1;
239	pid_buff[5] = (u8)(pid_out >> 8);
240
241	if (pid_len > st->pid_size)
242		st->pid_size = pid_len;
243	pid_buff[7] = 0x80 + st->pid_size;
244
245	ret |= lme2510_usb_talk(d, pid_buff ,
246		sizeof(pid_buff) , rbuf, sizeof(rbuf));
247
248	if (st->stream_on)
249		ret |= lme2510_stream_restart(d);
250
251	return ret;
252}
253
254static void lme2510_int_response(struct urb *lme_urb)
255{
256	struct dvb_usb_adapter *adap = lme_urb->context;
257	struct lme2510_state *st = adap_to_priv(adap);
258	static u8 *ibuf, *rbuf;
259	int i = 0, offset;
260	u32 key;
261
262	switch (lme_urb->status) {
263	case 0:
264	case -ETIMEDOUT:
265		break;
266	case -ECONNRESET:
267	case -ENOENT:
268	case -ESHUTDOWN:
269		return;
270	default:
271		info("Error %x", lme_urb->status);
272		break;
273	}
274
275	rbuf = (u8 *) lme_urb->transfer_buffer;
276
277	offset = ((lme_urb->actual_length/8) > 4)
278			? 4 : (lme_urb->actual_length/8) ;
279
280	for (i = 0; i < offset; ++i) {
281		ibuf = (u8 *)&rbuf[i*8];
282		deb_info(5, "INT O/S C =%02x C/O=%02x Type =%02x%02x",
283		offset, i, ibuf[0], ibuf[1]);
284
285		switch (ibuf[0]) {
286		case 0xaa:
287			debug_data_snipet(1, "INT Remote data snipet", ibuf);
288			if ((ibuf[4] + ibuf[5]) == 0xff) {
289				key = RC_SCANCODE_NECX((ibuf[2] ^ 0xff) << 8 |
290						       (ibuf[3] > 0) ? (ibuf[3] ^ 0xff) : 0,
291						       ibuf[5]);
292				deb_info(1, "INT Key =%08x", key);
293				if (adap_to_d(adap)->rc_dev != NULL)
294					rc_keydown(adap_to_d(adap)->rc_dev,
295						   RC_TYPE_NEC, key, 0);
296			}
297			break;
298		case 0xbb:
299			switch (st->tuner_config) {
300			case TUNER_LG:
301				if (ibuf[2] > 0)
302					st->signal_lock = ibuf[2];
303				st->signal_level = ibuf[4];
304				st->signal_sn = ibuf[3];
305				st->time_key = ibuf[7];
306				break;
307			case TUNER_S7395:
308			case TUNER_S0194:
309				/* Tweak for earlier firmware*/
310				if (ibuf[1] == 0x03) {
311					if (ibuf[2] > 1)
312						st->signal_lock = ibuf[2];
313					st->signal_level = ibuf[3];
314					st->signal_sn = ibuf[4];
315				} else {
316					st->signal_level = ibuf[4];
317					st->signal_sn = ibuf[5];
318					st->signal_lock =
319						(st->signal_lock & 0xf7) +
320						((ibuf[2] & 0x01) << 0x03);
321				}
322				break;
323			case TUNER_RS2000:
324				if (ibuf[2] & 0x1)
325					st->signal_lock = 0xff;
326				else
327					st->signal_lock = 0x00;
328				st->signal_level = ibuf[5];
329				st->signal_sn = ibuf[4];
330				st->time_key = ibuf[7];
331			default:
332				break;
333			}
334			debug_data_snipet(5, "INT Remote data snipet in", ibuf);
335		break;
336		case 0xcc:
337			debug_data_snipet(1, "INT Control data snipet", ibuf);
338			break;
339		default:
340			debug_data_snipet(1, "INT Unknown data snipet", ibuf);
341		break;
342		}
343	}
344
345	usb_submit_urb(lme_urb, GFP_ATOMIC);
346
347	/* interrupt urb is due every 48 msecs while streaming
348	 *	add 12msecs for system lag */
349	st->int_urb_due = jiffies + msecs_to_jiffies(60);
350}
351
352static int lme2510_int_read(struct dvb_usb_adapter *adap)
353{
354	struct dvb_usb_device *d = adap_to_d(adap);
355	struct lme2510_state *lme_int = adap_to_priv(adap);
356
357	lme_int->lme_urb = usb_alloc_urb(0, GFP_ATOMIC);
358
359	if (lme_int->lme_urb == NULL)
360			return -ENOMEM;
361
362	lme_int->buffer = usb_alloc_coherent(d->udev, 128, GFP_ATOMIC,
363					&lme_int->lme_urb->transfer_dma);
364
365	if (lme_int->buffer == NULL)
366			return -ENOMEM;
367
368	usb_fill_int_urb(lme_int->lme_urb,
369				d->udev,
370				usb_rcvintpipe(d->udev, 0xa),
371				lme_int->buffer,
372				128,
373				lme2510_int_response,
374				adap,
375				8);
376
377	lme_int->lme_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
378
379	usb_submit_urb(lme_int->lme_urb, GFP_ATOMIC);
380	info("INT Interrupt Service Started");
381
382	return 0;
383}
384
385static int lme2510_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
386{
387	struct dvb_usb_device *d = adap_to_d(adap);
388	struct lme2510_state *st = adap_to_priv(adap);
389	static u8 clear_pid_reg[] = LME_ALL_PIDS;
390	static u8 rbuf[1];
391	int ret = 0;
392
393	deb_info(1, "PID Clearing Filter");
394
395	mutex_lock(&d->i2c_mutex);
396
397	if (!onoff) {
398		ret |= lme2510_usb_talk(d, clear_pid_reg,
399			sizeof(clear_pid_reg), rbuf, sizeof(rbuf));
400		st->pid_off = true;
401	} else
402		st->pid_off = false;
403
404	st->pid_size = 0;
405
406	mutex_unlock(&d->i2c_mutex);
407
408	return 0;
409}
410
411static int lme2510_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
412	int onoff)
413{
414	struct dvb_usb_device *d = adap_to_d(adap);
415	int ret = 0;
416
417	deb_info(3, "%s PID=%04x Index=%04x onoff=%02x", __func__,
418		pid, index, onoff);
419
420	if (onoff) {
421		mutex_lock(&d->i2c_mutex);
422		ret |= lme2510_enable_pid(d, index, pid);
423		mutex_unlock(&d->i2c_mutex);
424	}
425
426
427	return ret;
428}
429
430
431static int lme2510_return_status(struct dvb_usb_device *d)
432{
433	int ret = 0;
434	u8 *data;
435
436	data = kzalloc(10, GFP_KERNEL);
437	if (!data)
438		return -ENOMEM;
439
440	ret |= usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0),
441			0x06, 0x80, 0x0302, 0x00, data, 0x0006, 200);
442	info("Firmware Status: %x (%x)", ret , data[2]);
443
444	ret = (ret < 0) ? -ENODEV : data[2];
445	kfree(data);
446	return ret;
447}
448
449static int lme2510_msg(struct dvb_usb_device *d,
450		u8 *wbuf, int wlen, u8 *rbuf, int rlen)
451{
452	int ret = 0;
453	struct lme2510_state *st = d->priv;
454
455	if (st->i2c_talk_onoff == 1) {
456
457		ret = lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen);
458
459		switch (st->tuner_config) {
460		case TUNER_LG:
461			if (wbuf[2] == 0x1c) {
462				if (wbuf[3] == 0x0e) {
463					st->signal_lock = rbuf[1];
464					if ((st->stream_on & 1) &&
465						(st->signal_lock & 0x10)) {
466						lme2510_stream_restart(d);
467						st->i2c_talk_onoff = 0;
468					}
469					msleep(80);
470				}
471			}
472			break;
473		case TUNER_S7395:
474			if (wbuf[2] == 0xd0) {
475				if (wbuf[3] == 0x24) {
476					st->signal_lock = rbuf[1];
477					if ((st->stream_on & 1) &&
478						(st->signal_lock & 0x8)) {
479						lme2510_stream_restart(d);
480						st->i2c_talk_onoff = 0;
481					}
482				}
483			}
484			break;
485		case TUNER_S0194:
486			if (wbuf[2] == 0xd0) {
487				if (wbuf[3] == 0x1b) {
488					st->signal_lock = rbuf[1];
489					if ((st->stream_on & 1) &&
490						(st->signal_lock & 0x8)) {
491						lme2510_stream_restart(d);
492						st->i2c_talk_onoff = 0;
493					}
494				}
495			}
496			break;
497		case TUNER_RS2000:
498		default:
499			break;
500		}
501	} else {
502		/* TODO rewrite this section */
503		switch (st->tuner_config) {
504		case TUNER_LG:
505			switch (wbuf[3]) {
506			case 0x0e:
507				rbuf[0] = 0x55;
508				rbuf[1] = st->signal_lock;
509				break;
510			case 0x43:
511				rbuf[0] = 0x55;
512				rbuf[1] = st->signal_level;
513				break;
514			case 0x1c:
515				rbuf[0] = 0x55;
516				rbuf[1] = st->signal_sn;
517				break;
518			case 0x15:
519			case 0x16:
520			case 0x17:
521			case 0x18:
522				rbuf[0] = 0x55;
523				rbuf[1] = 0x00;
524				break;
525			default:
526				lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen);
527				st->i2c_talk_onoff = 1;
528				break;
529			}
530			break;
531		case TUNER_S7395:
532			switch (wbuf[3]) {
533			case 0x10:
534				rbuf[0] = 0x55;
535				rbuf[1] = (st->signal_level & 0x80)
536						? 0 : (st->signal_level * 2);
537				break;
538			case 0x2d:
539				rbuf[0] = 0x55;
540				rbuf[1] = st->signal_sn;
541				break;
542			case 0x24:
543				rbuf[0] = 0x55;
544				rbuf[1] = st->signal_lock;
545				break;
546			case 0x2e:
547			case 0x26:
548			case 0x27:
549				rbuf[0] = 0x55;
550				rbuf[1] = 0x00;
551				break;
552			default:
553				lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen);
554				st->i2c_talk_onoff = 1;
555				break;
556			}
557			break;
558		case TUNER_S0194:
559			switch (wbuf[3]) {
560			case 0x18:
561				rbuf[0] = 0x55;
562				rbuf[1] = (st->signal_level & 0x80)
563						? 0 : (st->signal_level * 2);
564				break;
565			case 0x24:
566				rbuf[0] = 0x55;
567				rbuf[1] = st->signal_sn;
568				break;
569			case 0x1b:
570				rbuf[0] = 0x55;
571				rbuf[1] = st->signal_lock;
572				break;
573			case 0x19:
574			case 0x25:
575			case 0x1e:
576			case 0x1d:
577				rbuf[0] = 0x55;
578				rbuf[1] = 0x00;
579				break;
580			default:
581				lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen);
582				st->i2c_talk_onoff = 1;
583				break;
584			}
585			break;
586		case TUNER_RS2000:
587			switch (wbuf[3]) {
588			case 0x8c:
589				rbuf[0] = 0x55;
590				rbuf[1] = st->signal_lock;
591
592				/* If int_urb_due overdue
593				 *  set rbuf[1] to 0 to clear lock */
594				if (time_after(jiffies,	st->int_urb_due))
595					rbuf[1] = 0;
596
597				break;
598			default:
599				lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen);
600				st->i2c_talk_onoff = 1;
601				break;
602			}
603		default:
604			break;
605		}
606
607		deb_info(4, "I2C From Interrupt Message out(%02x) in(%02x)",
608				wbuf[3], rbuf[1]);
609
610	}
611
612	return ret;
613}
614
615
616static int lme2510_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
617				 int num)
618{
619	struct dvb_usb_device *d = i2c_get_adapdata(adap);
620	struct lme2510_state *st = d->priv;
621	static u8 obuf[64], ibuf[64];
622	int i, read, read_o;
623	u16 len;
624	u8 gate = st->i2c_gate;
625
626	mutex_lock(&d->i2c_mutex);
627
628	if (gate == 0)
629		gate = 5;
630
631	for (i = 0; i < num; i++) {
632		read_o = msg[i].flags & I2C_M_RD;
633		read = i + 1 < num && msg[i + 1].flags & I2C_M_RD;
634		read |= read_o;
635		gate = (msg[i].addr == st->i2c_tuner_addr)
636			? (read)	? st->i2c_tuner_gate_r
637					: st->i2c_tuner_gate_w
638			: st->i2c_gate;
639		obuf[0] = gate | (read << 7);
640
641		if (gate == 5)
642			obuf[1] = (read) ? 2 : msg[i].len + 1;
643		else
644			obuf[1] = msg[i].len + read + 1;
645
646		obuf[2] = msg[i].addr << 1;
647
648		if (read) {
649			if (read_o)
650				len = 3;
651			else {
652				memcpy(&obuf[3], msg[i].buf, msg[i].len);
653				obuf[msg[i].len+3] = msg[i+1].len;
654				len = msg[i].len+4;
655			}
656		} else {
657			memcpy(&obuf[3], msg[i].buf, msg[i].len);
658			len = msg[i].len+3;
659		}
660
661		if (lme2510_msg(d, obuf, len, ibuf, 64) < 0) {
662			deb_info(1, "i2c transfer failed.");
663			mutex_unlock(&d->i2c_mutex);
664			return -EAGAIN;
665		}
666
667		if (read) {
668			if (read_o)
669				memcpy(msg[i].buf, &ibuf[1], msg[i].len);
670			else {
671				memcpy(msg[i+1].buf, &ibuf[1], msg[i+1].len);
672				i++;
673			}
674		}
675	}
676
677	mutex_unlock(&d->i2c_mutex);
678	return i;
679}
680
681static u32 lme2510_i2c_func(struct i2c_adapter *adapter)
682{
683	return I2C_FUNC_I2C;
684}
685
686static struct i2c_algorithm lme2510_i2c_algo = {
687	.master_xfer   = lme2510_i2c_xfer,
688	.functionality = lme2510_i2c_func,
689};
690
691static int lme2510_streaming_ctrl(struct dvb_frontend *fe, int onoff)
692{
693	struct dvb_usb_adapter *adap = fe_to_adap(fe);
694	struct dvb_usb_device *d = adap_to_d(adap);
695	struct lme2510_state *st = adap_to_priv(adap);
696	static u8 clear_reg_3[] = LME_ALL_PIDS;
697	static u8 rbuf[1];
698	int ret = 0, rlen = sizeof(rbuf);
699
700	deb_info(1, "STM  (%02x)", onoff);
701
702	/* Streaming is started by FE_HAS_LOCK */
703	if (onoff == 1)
704		st->stream_on = 1;
705	else {
706		deb_info(1, "STM Steam Off");
707		/* mutex is here only to avoid collision with I2C */
708		mutex_lock(&d->i2c_mutex);
709
710		ret = lme2510_usb_talk(d, clear_reg_3,
711				sizeof(clear_reg_3), rbuf, rlen);
712		st->stream_on = 0;
713		st->i2c_talk_onoff = 1;
714
715		mutex_unlock(&d->i2c_mutex);
716	}
717
718	return (ret < 0) ? -ENODEV : 0;
719}
720
721static u8 check_sum(u8 *p, u8 len)
722{
723	u8 sum = 0;
724	while (len--)
725		sum += *p++;
726	return sum;
727}
728
729static int lme2510_download_firmware(struct dvb_usb_device *d,
730					const struct firmware *fw)
731{
732	int ret = 0;
733	u8 *data;
734	u16 j, wlen, len_in, start, end;
735	u8 packet_size, dlen, i;
736	u8 *fw_data;
737
738	packet_size = 0x31;
739	len_in = 1;
740
741	data = kzalloc(128, GFP_KERNEL);
742	if (!data) {
743		info("FRM Could not start Firmware Download"\
744			"(Buffer allocation failed)");
745		return -ENOMEM;
746	}
747
748	info("FRM Starting Firmware Download");
749
750	for (i = 1; i < 3; i++) {
751		start = (i == 1) ? 0 : 512;
752		end = (i == 1) ? 512 : fw->size;
753		for (j = start; j < end; j += (packet_size+1)) {
754			fw_data = (u8 *)(fw->data + j);
755			if ((end - j) > packet_size) {
756				data[0] = i;
757				dlen = packet_size;
758			} else {
759				data[0] = i | 0x80;
760				dlen = (u8)(end - j)-1;
761			}
762			data[1] = dlen;
763			memcpy(&data[2], fw_data, dlen+1);
764			wlen = (u8) dlen + 4;
765			data[wlen-1] = check_sum(fw_data, dlen+1);
766			deb_info(1, "Data S=%02x:E=%02x CS= %02x", data[3],
767				data[dlen+2], data[dlen+3]);
768			lme2510_usb_talk(d, data, wlen, data, len_in);
769			ret |= (data[0] == 0x88) ? 0 : -1;
770		}
771	}
772
773	data[0] = 0x8a;
774	len_in = 1;
775	msleep(2000);
776	lme2510_usb_talk(d, data, len_in, data, len_in);
777	msleep(400);
778
779	if (ret < 0)
780		info("FRM Firmware Download Failed (%04x)" , ret);
781	else
782		info("FRM Firmware Download Completed - Resetting Device");
783
784	kfree(data);
785	return RECONNECTS_USB;
786}
787
788static void lme_coldreset(struct dvb_usb_device *d)
789{
790	u8 data[1] = {0};
791	data[0] = 0x0a;
792	info("FRM Firmware Cold Reset");
793
794	lme2510_usb_talk(d, data, sizeof(data), data, sizeof(data));
795
796	return;
797}
798
799static const char fw_c_s7395[] = LME2510_C_S7395;
800static const char fw_c_lg[] = LME2510_C_LG;
801static const char fw_c_s0194[] = LME2510_C_S0194;
802static const char fw_c_rs2000[] = LME2510_C_RS2000;
803static const char fw_lg[] = LME2510_LG;
804static const char fw_s0194[] = LME2510_S0194;
805
806static const char *lme_firmware_switch(struct dvb_usb_device *d, int cold)
807{
808	struct lme2510_state *st = d->priv;
809	struct usb_device *udev = d->udev;
810	const struct firmware *fw = NULL;
811	const char *fw_lme;
812	int ret = 0;
813
814	cold = (cold > 0) ? (cold & 1) : 0;
815
816	switch (le16_to_cpu(udev->descriptor.idProduct)) {
817	case 0x1122:
818		switch (st->dvb_usb_lme2510_firmware) {
819		default:
820			st->dvb_usb_lme2510_firmware = TUNER_S0194;
821		case TUNER_S0194:
822			fw_lme = fw_s0194;
823			ret = request_firmware(&fw, fw_lme, &udev->dev);
824			if (ret == 0) {
825				cold = 0;
826				break;
827			}
828			st->dvb_usb_lme2510_firmware = TUNER_LG;
829		case TUNER_LG:
830			fw_lme = fw_lg;
831			ret = request_firmware(&fw, fw_lme, &udev->dev);
832			if (ret == 0)
833				break;
834			st->dvb_usb_lme2510_firmware = TUNER_DEFAULT;
835			break;
836		}
837		break;
838	case 0x1120:
839		switch (st->dvb_usb_lme2510_firmware) {
840		default:
841			st->dvb_usb_lme2510_firmware = TUNER_S7395;
842		case TUNER_S7395:
843			fw_lme = fw_c_s7395;
844			ret = request_firmware(&fw, fw_lme, &udev->dev);
845			if (ret == 0) {
846				cold = 0;
847				break;
848			}
849			st->dvb_usb_lme2510_firmware = TUNER_LG;
850		case TUNER_LG:
851			fw_lme = fw_c_lg;
852			ret = request_firmware(&fw, fw_lme, &udev->dev);
853			if (ret == 0)
854				break;
855			st->dvb_usb_lme2510_firmware = TUNER_S0194;
856		case TUNER_S0194:
857			fw_lme = fw_c_s0194;
858			ret = request_firmware(&fw, fw_lme, &udev->dev);
859			if (ret == 0)
860				break;
861			st->dvb_usb_lme2510_firmware = TUNER_DEFAULT;
862			cold = 0;
863			break;
864		}
865		break;
866	case 0x22f0:
867		fw_lme = fw_c_rs2000;
868		st->dvb_usb_lme2510_firmware = TUNER_RS2000;
869		break;
870	default:
871		fw_lme = fw_c_s7395;
872	}
873
874	release_firmware(fw);
875
876	if (cold) {
877		dvb_usb_lme2510_firmware = st->dvb_usb_lme2510_firmware;
878		info("FRM Changing to %s firmware", fw_lme);
879		lme_coldreset(d);
880		return NULL;
881	}
882
883	return fw_lme;
884}
885
886static int lme2510_kill_urb(struct usb_data_stream *stream)
887{
888	int i;
889
890	for (i = 0; i < stream->urbs_submitted; i++) {
891		deb_info(3, "killing URB no. %d.", i);
892		/* stop the URB */
893		usb_kill_urb(stream->urb_list[i]);
894	}
895	stream->urbs_submitted = 0;
896
897	return 0;
898}
899
900static struct tda10086_config tda10086_config = {
901	.demod_address = 0x0e,
902	.invert = 0,
903	.diseqc_tone = 1,
904	.xtal_freq = TDA10086_XTAL_16M,
905};
906
907static struct stv0288_config lme_config = {
908	.demod_address = 0x68,
909	.min_delay_ms = 15,
910	.inittab = s7395_inittab,
911};
912
913static struct ix2505v_config lme_tuner = {
914	.tuner_address = 0x60,
915	.min_delay_ms = 100,
916	.tuner_gain = 0x0,
917	.tuner_chargepump = 0x3,
918};
919
920static struct stv0299_config sharp_z0194_config = {
921	.demod_address = 0x68,
922	.inittab = sharp_z0194a_inittab,
923	.mclk = 88000000UL,
924	.invert = 0,
925	.skip_reinit = 0,
926	.lock_output = STV0299_LOCKOUTPUT_1,
927	.volt13_op0_op1 = STV0299_VOLT13_OP1,
928	.min_delay_ms = 100,
929	.set_symbol_rate = sharp_z0194a_set_symbol_rate,
930};
931
932static int dm04_rs2000_set_ts_param(struct dvb_frontend *fe,
933	int caller)
934{
935	struct dvb_usb_adapter *adap = fe_to_adap(fe);
936	struct dvb_usb_device *d = adap_to_d(adap);
937	struct lme2510_state *st = d->priv;
938
939	mutex_lock(&d->i2c_mutex);
940	if ((st->i2c_talk_onoff == 1) && (st->stream_on & 1)) {
941		st->i2c_talk_onoff = 0;
942		lme2510_stream_restart(d);
943	}
944	mutex_unlock(&d->i2c_mutex);
945
946	return 0;
947}
948
949static struct m88rs2000_config m88rs2000_config = {
950	.demod_addr = 0x68,
951	.set_ts_params = dm04_rs2000_set_ts_param,
952};
953
954static struct ts2020_config ts2020_config = {
955	.tuner_address = 0x60,
956	.clk_out_div = 7,
957};
958
959static int dm04_lme2510_set_voltage(struct dvb_frontend *fe,
960					fe_sec_voltage_t voltage)
961{
962	struct dvb_usb_device *d = fe_to_d(fe);
963	struct lme2510_state *st = fe_to_priv(fe);
964	static u8 voltage_low[] = LME_VOLTAGE_L;
965	static u8 voltage_high[] = LME_VOLTAGE_H;
966	static u8 rbuf[1];
967	int ret = 0, len = 3, rlen = 1;
968
969	mutex_lock(&d->i2c_mutex);
970
971	switch (voltage) {
972	case SEC_VOLTAGE_18:
973		ret |= lme2510_usb_talk(d,
974			voltage_high, len, rbuf, rlen);
975		break;
976
977	case SEC_VOLTAGE_OFF:
978	case SEC_VOLTAGE_13:
979	default:
980		ret |= lme2510_usb_talk(d,
981				voltage_low, len, rbuf, rlen);
982		break;
983	}
984
985	mutex_unlock(&d->i2c_mutex);
986
987	if (st->tuner_config == TUNER_RS2000)
988		if (st->fe_set_voltage)
989			st->fe_set_voltage(fe, voltage);
990
991
992	return (ret < 0) ? -ENODEV : 0;
993}
994
995static int dm04_rs2000_read_signal_strength(struct dvb_frontend *fe,
996	u16 *strength)
997{
998	struct lme2510_state *st = fe_to_priv(fe);
999
1000	*strength = (u16)((u32)st->signal_level * 0xffff / 0xff);
1001
1002	return 0;
1003}
1004
1005static int dm04_rs2000_read_snr(struct dvb_frontend *fe, u16 *snr)
1006{
1007	struct lme2510_state *st = fe_to_priv(fe);
1008
1009	*snr = (u16)((u32)st->signal_sn * 0xffff / 0x7f);
1010
1011	return 0;
1012}
1013
1014static int dm04_read_ber(struct dvb_frontend *fe, u32 *ber)
1015{
1016	*ber = 0;
1017
1018	return 0;
1019}
1020
1021static int dm04_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
1022{
1023	*ucblocks = 0;
1024
1025	return 0;
1026}
1027
1028static int lme_name(struct dvb_usb_adapter *adap)
1029{
1030	struct dvb_usb_device *d = adap_to_d(adap);
1031	struct lme2510_state *st = adap_to_priv(adap);
1032	const char *desc = d->name;
1033	char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395",
1034				" SHARP:BS2F7HZ0194", " RS2000"};
1035	char *name = adap->fe[0]->ops.info.name;
1036
1037	strlcpy(name, desc, 128);
1038	strlcat(name, fe_name[st->tuner_config], 128);
1039
1040	return 0;
1041}
1042
1043static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
1044{
1045	struct dvb_usb_device *d = adap_to_d(adap);
1046	struct lme2510_state *st = d->priv;
1047	int ret = 0;
1048
1049	st->i2c_talk_onoff = 1;
1050	switch (le16_to_cpu(d->udev->descriptor.idProduct)) {
1051	case 0x1122:
1052	case 0x1120:
1053		st->i2c_gate = 4;
1054		adap->fe[0] = dvb_attach(tda10086_attach,
1055			&tda10086_config, &d->i2c_adap);
1056		if (adap->fe[0]) {
1057			info("TUN Found Frontend TDA10086");
1058			st->i2c_tuner_gate_w = 4;
1059			st->i2c_tuner_gate_r = 4;
1060			st->i2c_tuner_addr = 0x60;
1061			st->tuner_config = TUNER_LG;
1062			if (st->dvb_usb_lme2510_firmware != TUNER_LG) {
1063				st->dvb_usb_lme2510_firmware = TUNER_LG;
1064				ret = lme_firmware_switch(d, 1) ? 0 : -ENODEV;
1065			}
1066			break;
1067		}
1068
1069		st->i2c_gate = 4;
1070		adap->fe[0] = dvb_attach(stv0299_attach,
1071				&sharp_z0194_config, &d->i2c_adap);
1072		if (adap->fe[0]) {
1073			info("FE Found Stv0299");
1074			st->i2c_tuner_gate_w = 4;
1075			st->i2c_tuner_gate_r = 5;
1076			st->i2c_tuner_addr = 0x60;
1077			st->tuner_config = TUNER_S0194;
1078			if (st->dvb_usb_lme2510_firmware != TUNER_S0194) {
1079				st->dvb_usb_lme2510_firmware = TUNER_S0194;
1080				ret = lme_firmware_switch(d, 1) ? 0 : -ENODEV;
1081			}
1082			break;
1083		}
1084
1085		st->i2c_gate = 5;
1086		adap->fe[0] = dvb_attach(stv0288_attach, &lme_config,
1087			&d->i2c_adap);
1088
1089		if (adap->fe[0]) {
1090			info("FE Found Stv0288");
1091			st->i2c_tuner_gate_w = 4;
1092			st->i2c_tuner_gate_r = 5;
1093			st->i2c_tuner_addr = 0x60;
1094			st->tuner_config = TUNER_S7395;
1095			if (st->dvb_usb_lme2510_firmware != TUNER_S7395) {
1096				st->dvb_usb_lme2510_firmware = TUNER_S7395;
1097				ret = lme_firmware_switch(d, 1) ? 0 : -ENODEV;
1098			}
1099			break;
1100		}
1101	case 0x22f0:
1102		st->i2c_gate = 5;
1103		adap->fe[0] = dvb_attach(m88rs2000_attach,
1104			&m88rs2000_config, &d->i2c_adap);
1105
1106		if (adap->fe[0]) {
1107			info("FE Found M88RS2000");
1108			dvb_attach(ts2020_attach, adap->fe[0], &ts2020_config,
1109					&d->i2c_adap);
1110			st->i2c_tuner_gate_w = 5;
1111			st->i2c_tuner_gate_r = 5;
1112			st->i2c_tuner_addr = 0x60;
1113			st->tuner_config = TUNER_RS2000;
1114			st->fe_set_voltage =
1115				adap->fe[0]->ops.set_voltage;
1116
1117			adap->fe[0]->ops.read_signal_strength =
1118				dm04_rs2000_read_signal_strength;
1119			adap->fe[0]->ops.read_snr =
1120				dm04_rs2000_read_snr;
1121			adap->fe[0]->ops.read_ber =
1122				dm04_read_ber;
1123			adap->fe[0]->ops.read_ucblocks =
1124				dm04_read_ucblocks;
1125		}
1126		break;
1127	}
1128
1129	if (adap->fe[0] == NULL) {
1130		info("DM04/QQBOX Not Powered up or not Supported");
1131		return -ENODEV;
1132	}
1133
1134	if (ret) {
1135		if (adap->fe[0]) {
1136			dvb_frontend_detach(adap->fe[0]);
1137			adap->fe[0] = NULL;
1138		}
1139		d->rc_map = NULL;
1140		return -ENODEV;
1141	}
1142
1143	adap->fe[0]->ops.set_voltage = dm04_lme2510_set_voltage;
1144	ret = lme_name(adap);
1145	return ret;
1146}
1147
1148static int dm04_lme2510_tuner(struct dvb_usb_adapter *adap)
1149{
1150	struct dvb_usb_device *d = adap_to_d(adap);
1151	struct lme2510_state *st = adap_to_priv(adap);
1152	char *tun_msg[] = {"", "TDA8263", "IX2505V", "DVB_PLL_OPERA", "RS2000"};
1153	int ret = 0;
1154
1155	switch (st->tuner_config) {
1156	case TUNER_LG:
1157		if (dvb_attach(tda826x_attach, adap->fe[0], 0x60,
1158			&d->i2c_adap, 1))
1159			ret = st->tuner_config;
1160		break;
1161	case TUNER_S7395:
1162		if (dvb_attach(ix2505v_attach , adap->fe[0], &lme_tuner,
1163			&d->i2c_adap))
1164			ret = st->tuner_config;
1165		break;
1166	case TUNER_S0194:
1167		if (dvb_attach(dvb_pll_attach , adap->fe[0], 0x60,
1168			&d->i2c_adap, DVB_PLL_OPERA1))
1169			ret = st->tuner_config;
1170		break;
1171	case TUNER_RS2000:
1172		ret = st->tuner_config;
1173		break;
1174	default:
1175		break;
1176	}
1177
1178	if (ret)
1179		info("TUN Found %s tuner", tun_msg[ret]);
1180	else {
1181		info("TUN No tuner found --- resetting device");
1182		lme_coldreset(d);
1183		return -ENODEV;
1184	}
1185
1186	/* Start the Interrupt*/
1187	ret = lme2510_int_read(adap);
1188	if (ret < 0) {
1189		info("INT Unable to start Interrupt Service");
1190		return -ENODEV;
1191	}
1192
1193	return ret;
1194}
1195
1196static int lme2510_powerup(struct dvb_usb_device *d, int onoff)
1197{
1198	struct lme2510_state *st = d->priv;
1199	static u8 lnb_on[] = LNB_ON;
1200	static u8 lnb_off[] = LNB_OFF;
1201	static u8 rbuf[1];
1202	int ret = 0, len = 3, rlen = 1;
1203
1204	mutex_lock(&d->i2c_mutex);
1205
1206	if (onoff)
1207		ret = lme2510_usb_talk(d, lnb_on, len, rbuf, rlen);
1208	else
1209		ret = lme2510_usb_talk(d, lnb_off, len, rbuf, rlen);
1210
1211	st->i2c_talk_onoff = 1;
1212
1213	mutex_unlock(&d->i2c_mutex);
1214
1215	return ret;
1216}
1217
1218static int lme2510_get_adapter_count(struct dvb_usb_device *d)
1219{
1220	return 1;
1221}
1222
1223static int lme2510_identify_state(struct dvb_usb_device *d, const char **name)
1224{
1225	struct lme2510_state *st = d->priv;
1226
1227	usb_reset_configuration(d->udev);
1228
1229	usb_set_interface(d->udev,
1230		d->props->bInterfaceNumber, 1);
1231
1232	st->dvb_usb_lme2510_firmware = dvb_usb_lme2510_firmware;
1233
1234	if (lme2510_return_status(d) == 0x44) {
1235		*name = lme_firmware_switch(d, 0);
1236		return COLD;
1237	}
1238
1239	return 0;
1240}
1241
1242static int lme2510_get_stream_config(struct dvb_frontend *fe, u8 *ts_type,
1243		struct usb_data_stream_properties *stream)
1244{
1245	struct dvb_usb_adapter *adap = fe_to_adap(fe);
1246	struct dvb_usb_device *d;
1247
1248	if (adap == NULL)
1249		return 0;
1250
1251	d = adap_to_d(adap);
1252
1253	/* Turn PID filter on the fly by module option */
1254	if (pid_filter == 2) {
1255		adap->pid_filtering  = true;
1256		adap->max_feed_count = 15;
1257	}
1258
1259	if (!(le16_to_cpu(d->udev->descriptor.idProduct)
1260		== 0x1122))
1261		stream->endpoint = 0x8;
1262
1263	return 0;
1264}
1265
1266static int lme2510_get_rc_config(struct dvb_usb_device *d,
1267	struct dvb_usb_rc *rc)
1268{
1269	rc->allowed_protos = RC_BIT_NEC;
1270	return 0;
1271}
1272
1273static void *lme2510_exit_int(struct dvb_usb_device *d)
1274{
1275	struct lme2510_state *st = d->priv;
1276	struct dvb_usb_adapter *adap = &d->adapter[0];
1277	void *buffer = NULL;
1278
1279	if (adap != NULL) {
1280		lme2510_kill_urb(&adap->stream);
1281	}
1282
1283	if (st->usb_buffer != NULL) {
1284		st->i2c_talk_onoff = 1;
1285		st->signal_lock = 0;
1286		st->signal_level = 0;
1287		st->signal_sn = 0;
1288		buffer = st->usb_buffer;
1289	}
1290
1291	if (st->lme_urb != NULL) {
1292		usb_kill_urb(st->lme_urb);
1293		usb_free_coherent(d->udev, 128, st->buffer,
1294				  st->lme_urb->transfer_dma);
1295		info("Interrupt Service Stopped");
1296	}
1297
1298	return buffer;
1299}
1300
1301static void lme2510_exit(struct dvb_usb_device *d)
1302{
1303	void *usb_buffer;
1304
1305	if (d != NULL) {
1306		usb_buffer = lme2510_exit_int(d);
1307		kfree(usb_buffer);
1308	}
1309}
1310
1311static struct dvb_usb_device_properties lme2510_props = {
1312	.driver_name = KBUILD_MODNAME,
1313	.owner = THIS_MODULE,
1314	.bInterfaceNumber = 0,
1315	.adapter_nr = adapter_nr,
1316	.size_of_priv = sizeof(struct lme2510_state),
1317
1318	.download_firmware = lme2510_download_firmware,
1319
1320	.power_ctrl       = lme2510_powerup,
1321	.identify_state   = lme2510_identify_state,
1322	.i2c_algo         = &lme2510_i2c_algo,
1323
1324	.frontend_attach  = dm04_lme2510_frontend_attach,
1325	.tuner_attach = dm04_lme2510_tuner,
1326	.get_stream_config = lme2510_get_stream_config,
1327	.get_adapter_count = lme2510_get_adapter_count,
1328	.streaming_ctrl   = lme2510_streaming_ctrl,
1329
1330	.get_rc_config = lme2510_get_rc_config,
1331
1332	.exit = lme2510_exit,
1333	.adapter = {
1334		{
1335			.caps = DVB_USB_ADAP_HAS_PID_FILTER|
1336				DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
1337			.pid_filter_count = 15,
1338			.pid_filter = lme2510_pid_filter,
1339			.pid_filter_ctrl  = lme2510_pid_filter_ctrl,
1340			.stream =
1341			DVB_USB_STREAM_BULK(0x86, 10, 4096),
1342		},
1343		{
1344		}
1345	},
1346};
1347
1348static const struct usb_device_id lme2510_id_table[] = {
1349	{	DVB_USB_DEVICE(0x3344, 0x1122, &lme2510_props,
1350		"DM04_LME2510_DVB-S", RC_MAP_LME2510)	},
1351	{	DVB_USB_DEVICE(0x3344, 0x1120, &lme2510_props,
1352		"DM04_LME2510C_DVB-S", RC_MAP_LME2510)	},
1353	{	DVB_USB_DEVICE(0x3344, 0x22f0, &lme2510_props,
1354		"DM04_LME2510C_DVB-S RS2000", RC_MAP_LME2510)	},
1355	{}		/* Terminating entry */
1356};
1357
1358MODULE_DEVICE_TABLE(usb, lme2510_id_table);
1359
1360static struct usb_driver lme2510_driver = {
1361	.name		= KBUILD_MODNAME,
1362	.probe		= dvb_usbv2_probe,
1363	.disconnect	= dvb_usbv2_disconnect,
1364	.id_table	= lme2510_id_table,
1365	.no_dynamic_id = 1,
1366	.soft_unbind = 1,
1367};
1368
1369module_usb_driver(lme2510_driver);
1370
1371MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>");
1372MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0");
1373MODULE_VERSION("2.06");
1374MODULE_LICENSE("GPL");
1375MODULE_FIRMWARE(LME2510_C_S7395);
1376MODULE_FIRMWARE(LME2510_C_LG);
1377MODULE_FIRMWARE(LME2510_C_S0194);
1378MODULE_FIRMWARE(LME2510_C_RS2000);
1379MODULE_FIRMWARE(LME2510_LG);
1380MODULE_FIRMWARE(LME2510_S0194);
1381
1382