cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

lmedm04.c (29907B)


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