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

rtl28xxu.c (52302B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Realtek RTL28xxU DVB USB driver
      4 *
      5 * Copyright (C) 2009 Antti Palosaari <crope@iki.fi>
      6 * Copyright (C) 2011 Antti Palosaari <crope@iki.fi>
      7 * Copyright (C) 2012 Thomas Mair <thomas.mair86@googlemail.com>
      8 */
      9
     10#include "rtl28xxu.h"
     11
     12static int rtl28xxu_disable_rc;
     13module_param_named(disable_rc, rtl28xxu_disable_rc, int, 0644);
     14MODULE_PARM_DESC(disable_rc, "disable RTL2832U remote controller");
     15DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
     16
     17static int rtl28xxu_ctrl_msg(struct dvb_usb_device *d, struct rtl28xxu_req *req)
     18{
     19	struct rtl28xxu_dev *dev = d->priv;
     20	int ret;
     21	unsigned int pipe;
     22	u8 requesttype;
     23
     24	mutex_lock(&d->usb_mutex);
     25
     26	if (req->size > sizeof(dev->buf)) {
     27		dev_err(&d->intf->dev, "too large message %u\n", req->size);
     28		ret = -EINVAL;
     29		goto err_mutex_unlock;
     30	}
     31
     32	if (req->index & CMD_WR_FLAG) {
     33		/* write */
     34		memcpy(dev->buf, req->data, req->size);
     35		requesttype = (USB_TYPE_VENDOR | USB_DIR_OUT);
     36		pipe = usb_sndctrlpipe(d->udev, 0);
     37	} else {
     38		/* read */
     39		requesttype = (USB_TYPE_VENDOR | USB_DIR_IN);
     40
     41		/*
     42		 * Zero-length transfers must use usb_sndctrlpipe() and
     43		 * rtl28xxu_identify_state() uses a zero-length i2c read
     44		 * command to determine the chip type.
     45		 */
     46		if (req->size)
     47			pipe = usb_rcvctrlpipe(d->udev, 0);
     48		else
     49			pipe = usb_sndctrlpipe(d->udev, 0);
     50	}
     51
     52	ret = usb_control_msg(d->udev, pipe, 0, requesttype, req->value,
     53			req->index, dev->buf, req->size, 1000);
     54	dvb_usb_dbg_usb_control_msg(d->udev, 0, requesttype, req->value,
     55			req->index, dev->buf, req->size);
     56	if (ret < 0)
     57		goto err_mutex_unlock;
     58
     59	/* read request, copy returned data to return buf */
     60	if (requesttype == (USB_TYPE_VENDOR | USB_DIR_IN))
     61		memcpy(req->data, dev->buf, req->size);
     62
     63	mutex_unlock(&d->usb_mutex);
     64
     65	return 0;
     66err_mutex_unlock:
     67	mutex_unlock(&d->usb_mutex);
     68	dev_dbg(&d->intf->dev, "failed=%d\n", ret);
     69	return ret;
     70}
     71
     72static int rtl28xxu_wr_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
     73{
     74	struct rtl28xxu_req req;
     75
     76	if (reg < 0x3000)
     77		req.index = CMD_USB_WR;
     78	else if (reg < 0x4000)
     79		req.index = CMD_SYS_WR;
     80	else
     81		req.index = CMD_IR_WR;
     82
     83	req.value = reg;
     84	req.size = len;
     85	req.data = val;
     86
     87	return rtl28xxu_ctrl_msg(d, &req);
     88}
     89
     90static int rtl28xxu_rd_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
     91{
     92	struct rtl28xxu_req req;
     93
     94	if (reg < 0x3000)
     95		req.index = CMD_USB_RD;
     96	else if (reg < 0x4000)
     97		req.index = CMD_SYS_RD;
     98	else
     99		req.index = CMD_IR_RD;
    100
    101	req.value = reg;
    102	req.size = len;
    103	req.data = val;
    104
    105	return rtl28xxu_ctrl_msg(d, &req);
    106}
    107
    108static int rtl28xxu_wr_reg(struct dvb_usb_device *d, u16 reg, u8 val)
    109{
    110	return rtl28xxu_wr_regs(d, reg, &val, 1);
    111}
    112
    113static int rtl28xxu_rd_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
    114{
    115	return rtl28xxu_rd_regs(d, reg, val, 1);
    116}
    117
    118static int rtl28xxu_wr_reg_mask(struct dvb_usb_device *d, u16 reg, u8 val,
    119		u8 mask)
    120{
    121	int ret;
    122	u8 tmp;
    123
    124	/* no need for read if whole reg is written */
    125	if (mask != 0xff) {
    126		ret = rtl28xxu_rd_reg(d, reg, &tmp);
    127		if (ret)
    128			return ret;
    129
    130		val &= mask;
    131		tmp &= ~mask;
    132		val |= tmp;
    133	}
    134
    135	return rtl28xxu_wr_reg(d, reg, val);
    136}
    137
    138/* I2C */
    139static int rtl28xxu_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
    140	int num)
    141{
    142	int ret;
    143	struct dvb_usb_device *d = i2c_get_adapdata(adap);
    144	struct rtl28xxu_dev *dev = d->priv;
    145	struct rtl28xxu_req req;
    146
    147	/*
    148	 * It is not known which are real I2C bus xfer limits, but testing
    149	 * with RTL2831U + MT2060 gives max RD 24 and max WR 22 bytes.
    150	 * TODO: find out RTL2832U lens
    151	 */
    152
    153	/*
    154	 * I2C adapter logic looks rather complicated due to fact it handles
    155	 * three different access methods. Those methods are;
    156	 * 1) integrated demod access
    157	 * 2) old I2C access
    158	 * 3) new I2C access
    159	 *
    160	 * Used method is selected in order 1, 2, 3. Method 3 can handle all
    161	 * requests but there is two reasons why not use it always;
    162	 * 1) It is most expensive, usually two USB messages are needed
    163	 * 2) At least RTL2831U does not support it
    164	 *
    165	 * Method 3 is needed in case of I2C write+read (typical register read)
    166	 * where write is more than one byte.
    167	 */
    168
    169	if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
    170		return -EAGAIN;
    171
    172	if (num == 2 && !(msg[0].flags & I2C_M_RD) &&
    173		(msg[1].flags & I2C_M_RD)) {
    174		if (msg[0].len > 24 || msg[1].len > 24) {
    175			/* TODO: check msg[0].len max */
    176			ret = -EOPNOTSUPP;
    177			goto err_mutex_unlock;
    178		} else if (msg[0].addr == 0x10) {
    179			/* method 1 - integrated demod */
    180			if (msg[0].buf[0] == 0x00) {
    181				/* return demod page from driver cache */
    182				msg[1].buf[0] = dev->page;
    183				ret = 0;
    184			} else {
    185				req.value = (msg[0].buf[0] << 8) | (msg[0].addr << 1);
    186				req.index = CMD_DEMOD_RD | dev->page;
    187				req.size = msg[1].len;
    188				req.data = &msg[1].buf[0];
    189				ret = rtl28xxu_ctrl_msg(d, &req);
    190			}
    191		} else if (msg[0].len < 2) {
    192			/* method 2 - old I2C */
    193			req.value = (msg[0].buf[0] << 8) | (msg[0].addr << 1);
    194			req.index = CMD_I2C_RD;
    195			req.size = msg[1].len;
    196			req.data = &msg[1].buf[0];
    197			ret = rtl28xxu_ctrl_msg(d, &req);
    198		} else {
    199			/* method 3 - new I2C */
    200			req.value = (msg[0].addr << 1);
    201			req.index = CMD_I2C_DA_WR;
    202			req.size = msg[0].len;
    203			req.data = msg[0].buf;
    204			ret = rtl28xxu_ctrl_msg(d, &req);
    205			if (ret)
    206				goto err_mutex_unlock;
    207
    208			req.value = (msg[0].addr << 1);
    209			req.index = CMD_I2C_DA_RD;
    210			req.size = msg[1].len;
    211			req.data = msg[1].buf;
    212			ret = rtl28xxu_ctrl_msg(d, &req);
    213		}
    214	} else if (num == 1 && !(msg[0].flags & I2C_M_RD)) {
    215		if (msg[0].len > 22) {
    216			/* TODO: check msg[0].len max */
    217			ret = -EOPNOTSUPP;
    218			goto err_mutex_unlock;
    219		} else if (msg[0].addr == 0x10) {
    220			/* method 1 - integrated demod */
    221			if (msg[0].buf[0] == 0x00) {
    222				/* save demod page for later demod access */
    223				dev->page = msg[0].buf[1];
    224				ret = 0;
    225			} else {
    226				req.value = (msg[0].buf[0] << 8) |
    227					(msg[0].addr << 1);
    228				req.index = CMD_DEMOD_WR | dev->page;
    229				req.size = msg[0].len-1;
    230				req.data = &msg[0].buf[1];
    231				ret = rtl28xxu_ctrl_msg(d, &req);
    232			}
    233		} else if ((msg[0].len < 23) && (!dev->new_i2c_write)) {
    234			/* method 2 - old I2C */
    235			req.value = (msg[0].buf[0] << 8) | (msg[0].addr << 1);
    236			req.index = CMD_I2C_WR;
    237			req.size = msg[0].len-1;
    238			req.data = &msg[0].buf[1];
    239			ret = rtl28xxu_ctrl_msg(d, &req);
    240		} else {
    241			/* method 3 - new I2C */
    242			req.value = (msg[0].addr << 1);
    243			req.index = CMD_I2C_DA_WR;
    244			req.size = msg[0].len;
    245			req.data = msg[0].buf;
    246			ret = rtl28xxu_ctrl_msg(d, &req);
    247		}
    248	} else if (num == 1 && (msg[0].flags & I2C_M_RD)) {
    249		req.value = (msg[0].addr << 1);
    250		req.index = CMD_I2C_DA_RD;
    251		req.size = msg[0].len;
    252		req.data = msg[0].buf;
    253		ret = rtl28xxu_ctrl_msg(d, &req);
    254	} else {
    255		ret = -EOPNOTSUPP;
    256	}
    257
    258	/* Retry failed I2C messages */
    259	if (ret == -EPIPE)
    260		ret = -EAGAIN;
    261
    262err_mutex_unlock:
    263	mutex_unlock(&d->i2c_mutex);
    264
    265	return ret ? ret : num;
    266}
    267
    268static u32 rtl28xxu_i2c_func(struct i2c_adapter *adapter)
    269{
    270	return I2C_FUNC_I2C;
    271}
    272
    273static struct i2c_algorithm rtl28xxu_i2c_algo = {
    274	.master_xfer   = rtl28xxu_i2c_xfer,
    275	.functionality = rtl28xxu_i2c_func,
    276};
    277
    278static int rtl2831u_read_config(struct dvb_usb_device *d)
    279{
    280	struct rtl28xxu_dev *dev = d_to_priv(d);
    281	int ret;
    282	u8 buf[1];
    283	/* open RTL2831U/RTL2830 I2C gate */
    284	struct rtl28xxu_req req_gate_open = {0x0120, 0x0011, 0x0001, "\x08"};
    285	/* tuner probes */
    286	struct rtl28xxu_req req_mt2060 = {0x00c0, CMD_I2C_RD, 1, buf};
    287	struct rtl28xxu_req req_qt1010 = {0x0fc4, CMD_I2C_RD, 1, buf};
    288
    289	dev_dbg(&d->intf->dev, "\n");
    290
    291	/*
    292	 * RTL2831U GPIOs
    293	 * =========================================================
    294	 * GPIO0 | tuner#0 | 0 off | 1 on  | MXL5005S (?)
    295	 * GPIO2 | LED     | 0 off | 1 on  |
    296	 * GPIO4 | tuner#1 | 0 on  | 1 off | MT2060
    297	 */
    298
    299	/* GPIO direction */
    300	ret = rtl28xxu_wr_reg(d, SYS_GPIO_DIR, 0x0a);
    301	if (ret)
    302		goto err;
    303
    304	/* enable as output GPIO0, GPIO2, GPIO4 */
    305	ret = rtl28xxu_wr_reg(d, SYS_GPIO_OUT_EN, 0x15);
    306	if (ret)
    307		goto err;
    308
    309	/*
    310	 * Probe used tuner. We need to know used tuner before demod attach
    311	 * since there is some demod params needed to set according to tuner.
    312	 */
    313
    314	/* demod needs some time to wake up */
    315	msleep(20);
    316
    317	dev->tuner_name = "NONE";
    318
    319	/* open demod I2C gate */
    320	ret = rtl28xxu_ctrl_msg(d, &req_gate_open);
    321	if (ret)
    322		goto err;
    323
    324	/* check QT1010 ID(?) register; reg=0f val=2c */
    325	ret = rtl28xxu_ctrl_msg(d, &req_qt1010);
    326	if (ret == 0 && buf[0] == 0x2c) {
    327		dev->tuner = TUNER_RTL2830_QT1010;
    328		dev->tuner_name = "QT1010";
    329		goto found;
    330	}
    331
    332	/* open demod I2C gate */
    333	ret = rtl28xxu_ctrl_msg(d, &req_gate_open);
    334	if (ret)
    335		goto err;
    336
    337	/* check MT2060 ID register; reg=00 val=63 */
    338	ret = rtl28xxu_ctrl_msg(d, &req_mt2060);
    339	if (ret == 0 && buf[0] == 0x63) {
    340		dev->tuner = TUNER_RTL2830_MT2060;
    341		dev->tuner_name = "MT2060";
    342		goto found;
    343	}
    344
    345	/* assume MXL5005S */
    346	dev->tuner = TUNER_RTL2830_MXL5005S;
    347	dev->tuner_name = "MXL5005S";
    348	goto found;
    349
    350found:
    351	dev_dbg(&d->intf->dev, "tuner=%s\n", dev->tuner_name);
    352
    353	return 0;
    354err:
    355	dev_dbg(&d->intf->dev, "failed=%d\n", ret);
    356	return ret;
    357}
    358
    359static int rtl2832u_read_config(struct dvb_usb_device *d)
    360{
    361	struct rtl28xxu_dev *dev = d_to_priv(d);
    362	int ret;
    363	u8 buf[2];
    364	/* open RTL2832U/RTL2832 I2C gate */
    365	struct rtl28xxu_req req_gate_open = {0x0120, 0x0011, 0x0001, "\x18"};
    366	/* close RTL2832U/RTL2832 I2C gate */
    367	struct rtl28xxu_req req_gate_close = {0x0120, 0x0011, 0x0001, "\x10"};
    368	/* tuner probes */
    369	struct rtl28xxu_req req_fc0012 = {0x00c6, CMD_I2C_RD, 1, buf};
    370	struct rtl28xxu_req req_fc0013 = {0x00c6, CMD_I2C_RD, 1, buf};
    371	struct rtl28xxu_req req_mt2266 = {0x00c0, CMD_I2C_RD, 1, buf};
    372	struct rtl28xxu_req req_fc2580 = {0x01ac, CMD_I2C_RD, 1, buf};
    373	struct rtl28xxu_req req_mt2063 = {0x00c0, CMD_I2C_RD, 1, buf};
    374	struct rtl28xxu_req req_max3543 = {0x00c0, CMD_I2C_RD, 1, buf};
    375	struct rtl28xxu_req req_tua9001 = {0x7ec0, CMD_I2C_RD, 2, buf};
    376	struct rtl28xxu_req req_mxl5007t = {0xd9c0, CMD_I2C_RD, 1, buf};
    377	struct rtl28xxu_req req_e4000 = {0x02c8, CMD_I2C_RD, 1, buf};
    378	struct rtl28xxu_req req_tda18272 = {0x00c0, CMD_I2C_RD, 2, buf};
    379	struct rtl28xxu_req req_r820t = {0x0034, CMD_I2C_RD, 1, buf};
    380	struct rtl28xxu_req req_r828d = {0x0074, CMD_I2C_RD, 1, buf};
    381	struct rtl28xxu_req req_mn88472 = {0xff38, CMD_I2C_RD, 1, buf};
    382	struct rtl28xxu_req req_mn88473 = {0xff38, CMD_I2C_RD, 1, buf};
    383	struct rtl28xxu_req req_cxd2837er = {0xfdd8, CMD_I2C_RD, 1, buf};
    384	struct rtl28xxu_req req_si2157 = {0x00c0, CMD_I2C_RD, 1, buf};
    385	struct rtl28xxu_req req_si2168 = {0x00c8, CMD_I2C_RD, 1, buf};
    386
    387	dev_dbg(&d->intf->dev, "\n");
    388
    389	/* enable GPIO3 and GPIO6 as output */
    390	ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_DIR, 0x00, 0x40);
    391	if (ret)
    392		goto err;
    393
    394	ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_EN, 0x48, 0x48);
    395	if (ret)
    396		goto err;
    397
    398	/*
    399	 * Probe used tuner. We need to know used tuner before demod attach
    400	 * since there is some demod params needed to set according to tuner.
    401	 */
    402
    403	/* open demod I2C gate */
    404	ret = rtl28xxu_ctrl_msg(d, &req_gate_open);
    405	if (ret)
    406		goto err;
    407
    408	dev->tuner_name = "NONE";
    409
    410	/* check FC0012 ID register; reg=00 val=a1 */
    411	ret = rtl28xxu_ctrl_msg(d, &req_fc0012);
    412	if (ret == 0 && buf[0] == 0xa1) {
    413		dev->tuner = TUNER_RTL2832_FC0012;
    414		dev->tuner_name = "FC0012";
    415		goto tuner_found;
    416	}
    417
    418	/* check FC0013 ID register; reg=00 val=a3 */
    419	ret = rtl28xxu_ctrl_msg(d, &req_fc0013);
    420	if (ret == 0 && buf[0] == 0xa3) {
    421		dev->tuner = TUNER_RTL2832_FC0013;
    422		dev->tuner_name = "FC0013";
    423		goto tuner_found;
    424	}
    425
    426	/* check MT2266 ID register; reg=00 val=85 */
    427	ret = rtl28xxu_ctrl_msg(d, &req_mt2266);
    428	if (ret == 0 && buf[0] == 0x85) {
    429		dev->tuner = TUNER_RTL2832_MT2266;
    430		dev->tuner_name = "MT2266";
    431		goto tuner_found;
    432	}
    433
    434	/* check FC2580 ID register; reg=01 val=56 */
    435	ret = rtl28xxu_ctrl_msg(d, &req_fc2580);
    436	if (ret == 0 && buf[0] == 0x56) {
    437		dev->tuner = TUNER_RTL2832_FC2580;
    438		dev->tuner_name = "FC2580";
    439		goto tuner_found;
    440	}
    441
    442	/* check MT2063 ID register; reg=00 val=9e || 9c */
    443	ret = rtl28xxu_ctrl_msg(d, &req_mt2063);
    444	if (ret == 0 && (buf[0] == 0x9e || buf[0] == 0x9c)) {
    445		dev->tuner = TUNER_RTL2832_MT2063;
    446		dev->tuner_name = "MT2063";
    447		goto tuner_found;
    448	}
    449
    450	/* check MAX3543 ID register; reg=00 val=38 */
    451	ret = rtl28xxu_ctrl_msg(d, &req_max3543);
    452	if (ret == 0 && buf[0] == 0x38) {
    453		dev->tuner = TUNER_RTL2832_MAX3543;
    454		dev->tuner_name = "MAX3543";
    455		goto tuner_found;
    456	}
    457
    458	/* check TUA9001 ID register; reg=7e val=2328 */
    459	ret = rtl28xxu_ctrl_msg(d, &req_tua9001);
    460	if (ret == 0 && buf[0] == 0x23 && buf[1] == 0x28) {
    461		dev->tuner = TUNER_RTL2832_TUA9001;
    462		dev->tuner_name = "TUA9001";
    463		goto tuner_found;
    464	}
    465
    466	/* check MXL5007R ID register; reg=d9 val=14 */
    467	ret = rtl28xxu_ctrl_msg(d, &req_mxl5007t);
    468	if (ret == 0 && buf[0] == 0x14) {
    469		dev->tuner = TUNER_RTL2832_MXL5007T;
    470		dev->tuner_name = "MXL5007T";
    471		goto tuner_found;
    472	}
    473
    474	/* check E4000 ID register; reg=02 val=40 */
    475	ret = rtl28xxu_ctrl_msg(d, &req_e4000);
    476	if (ret == 0 && buf[0] == 0x40) {
    477		dev->tuner = TUNER_RTL2832_E4000;
    478		dev->tuner_name = "E4000";
    479		goto tuner_found;
    480	}
    481
    482	/* check TDA18272 ID register; reg=00 val=c760  */
    483	ret = rtl28xxu_ctrl_msg(d, &req_tda18272);
    484	if (ret == 0 && (buf[0] == 0xc7 || buf[1] == 0x60)) {
    485		dev->tuner = TUNER_RTL2832_TDA18272;
    486		dev->tuner_name = "TDA18272";
    487		goto tuner_found;
    488	}
    489
    490	/* check R820T ID register; reg=00 val=69 */
    491	ret = rtl28xxu_ctrl_msg(d, &req_r820t);
    492	if (ret == 0 && buf[0] == 0x69) {
    493		dev->tuner = TUNER_RTL2832_R820T;
    494		dev->tuner_name = "R820T";
    495		goto tuner_found;
    496	}
    497
    498	/* check R828D ID register; reg=00 val=69 */
    499	ret = rtl28xxu_ctrl_msg(d, &req_r828d);
    500	if (ret == 0 && buf[0] == 0x69) {
    501		dev->tuner = TUNER_RTL2832_R828D;
    502		dev->tuner_name = "R828D";
    503		goto tuner_found;
    504	}
    505
    506	/* GPIO0 and GPIO5 to reset Si2157/Si2168 tuner and demod */
    507	ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, 0x00, 0x21);
    508	if (ret)
    509		goto err;
    510
    511	ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_EN, 0x00, 0x21);
    512	if (ret)
    513		goto err;
    514
    515	msleep(50);
    516
    517	ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, 0x21, 0x21);
    518	if (ret)
    519		goto err;
    520
    521	ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_EN, 0x21, 0x21);
    522	if (ret)
    523		goto err;
    524
    525	msleep(50);
    526
    527	/* check Si2157 ID register; reg=c0 val=80 */
    528	ret = rtl28xxu_ctrl_msg(d, &req_si2157);
    529	if (ret == 0 && ((buf[0] & 0x80) == 0x80)) {
    530		dev->tuner = TUNER_RTL2832_SI2157;
    531		dev->tuner_name = "SI2157";
    532		goto tuner_found;
    533	}
    534
    535tuner_found:
    536	dev_dbg(&d->intf->dev, "tuner=%s\n", dev->tuner_name);
    537
    538	/* probe slave demod */
    539	if (dev->tuner == TUNER_RTL2832_R828D) {
    540		/* power off slave demod on GPIO0 to reset CXD2837ER */
    541		ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, 0x00, 0x01);
    542		if (ret)
    543			goto err;
    544
    545		ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_EN, 0x00, 0x01);
    546		if (ret)
    547			goto err;
    548
    549		msleep(50);
    550
    551		/* power on slave demod on GPIO0 */
    552		ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, 0x01, 0x01);
    553		if (ret)
    554			goto err;
    555
    556		ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_DIR, 0x00, 0x01);
    557		if (ret)
    558			goto err;
    559
    560		ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_EN, 0x01, 0x01);
    561		if (ret)
    562			goto err;
    563
    564		/* slave demod needs some time to wake up */
    565		msleep(20);
    566
    567		/* check slave answers */
    568		ret = rtl28xxu_ctrl_msg(d, &req_mn88472);
    569		if (ret == 0 && buf[0] == 0x02) {
    570			dev_dbg(&d->intf->dev, "MN88472 found\n");
    571			dev->slave_demod = SLAVE_DEMOD_MN88472;
    572			goto demod_found;
    573		}
    574
    575		ret = rtl28xxu_ctrl_msg(d, &req_mn88473);
    576		if (ret == 0 && buf[0] == 0x03) {
    577			dev_dbg(&d->intf->dev, "MN88473 found\n");
    578			dev->slave_demod = SLAVE_DEMOD_MN88473;
    579			goto demod_found;
    580		}
    581
    582		ret = rtl28xxu_ctrl_msg(d, &req_cxd2837er);
    583		if (ret == 0 && buf[0] == 0xb1) {
    584			dev_dbg(&d->intf->dev, "CXD2837ER found\n");
    585			dev->slave_demod = SLAVE_DEMOD_CXD2837ER;
    586			goto demod_found;
    587		}
    588	}
    589	if (dev->tuner == TUNER_RTL2832_SI2157) {
    590		/* check Si2168 ID register; reg=c8 val=80 */
    591		ret = rtl28xxu_ctrl_msg(d, &req_si2168);
    592		if (ret == 0 && ((buf[0] & 0x80) == 0x80)) {
    593			dev_dbg(&d->intf->dev, "Si2168 found\n");
    594			dev->slave_demod = SLAVE_DEMOD_SI2168;
    595			goto demod_found;
    596		}
    597	}
    598
    599demod_found:
    600	/* close demod I2C gate */
    601	ret = rtl28xxu_ctrl_msg(d, &req_gate_close);
    602	if (ret < 0)
    603		goto err;
    604
    605	return 0;
    606err:
    607	dev_dbg(&d->intf->dev, "failed=%d\n", ret);
    608	return ret;
    609}
    610
    611static int rtl28xxu_read_config(struct dvb_usb_device *d)
    612{
    613	struct rtl28xxu_dev *dev = d_to_priv(d);
    614
    615	if (dev->chip_id == CHIP_ID_RTL2831U)
    616		return rtl2831u_read_config(d);
    617	else
    618		return rtl2832u_read_config(d);
    619}
    620
    621static int rtl28xxu_identify_state(struct dvb_usb_device *d, const char **name)
    622{
    623	struct rtl28xxu_dev *dev = d_to_priv(d);
    624	int ret;
    625	struct rtl28xxu_req req_demod_i2c = {0x0020, CMD_I2C_DA_RD, 0, NULL};
    626
    627	dev_dbg(&d->intf->dev, "\n");
    628
    629	/*
    630	 * Detect chip type using I2C command that is not supported
    631	 * by old RTL2831U.
    632	 */
    633	ret = rtl28xxu_ctrl_msg(d, &req_demod_i2c);
    634	if (ret == -EPIPE) {
    635		dev->chip_id = CHIP_ID_RTL2831U;
    636	} else if (ret == 0) {
    637		dev->chip_id = CHIP_ID_RTL2832U;
    638	} else {
    639		dev_err(&d->intf->dev, "chip type detection failed %d\n", ret);
    640		goto err;
    641	}
    642	dev_dbg(&d->intf->dev, "chip_id=%u\n", dev->chip_id);
    643
    644	/* Retry failed I2C messages */
    645	d->i2c_adap.retries = 3;
    646	d->i2c_adap.timeout = msecs_to_jiffies(10);
    647
    648	return WARM;
    649err:
    650	dev_dbg(&d->intf->dev, "failed=%d\n", ret);
    651	return ret;
    652}
    653
    654static const struct rtl2830_platform_data rtl2830_mt2060_platform_data = {
    655	.clk = 28800000,
    656	.spec_inv = 1,
    657	.vtop = 0x20,
    658	.krf = 0x04,
    659	.agc_targ_val = 0x2d,
    660
    661};
    662
    663static const struct rtl2830_platform_data rtl2830_qt1010_platform_data = {
    664	.clk = 28800000,
    665	.spec_inv = 1,
    666	.vtop = 0x20,
    667	.krf = 0x04,
    668	.agc_targ_val = 0x2d,
    669};
    670
    671static const struct rtl2830_platform_data rtl2830_mxl5005s_platform_data = {
    672	.clk = 28800000,
    673	.spec_inv = 0,
    674	.vtop = 0x3f,
    675	.krf = 0x04,
    676	.agc_targ_val = 0x3e,
    677};
    678
    679static int rtl2831u_frontend_attach(struct dvb_usb_adapter *adap)
    680{
    681	struct dvb_usb_device *d = adap_to_d(adap);
    682	struct rtl28xxu_dev *dev = d_to_priv(d);
    683	struct rtl2830_platform_data *pdata = &dev->rtl2830_platform_data;
    684	struct i2c_board_info board_info;
    685	struct i2c_client *client;
    686	int ret;
    687
    688	dev_dbg(&d->intf->dev, "\n");
    689
    690	switch (dev->tuner) {
    691	case TUNER_RTL2830_QT1010:
    692		*pdata = rtl2830_qt1010_platform_data;
    693		break;
    694	case TUNER_RTL2830_MT2060:
    695		*pdata = rtl2830_mt2060_platform_data;
    696		break;
    697	case TUNER_RTL2830_MXL5005S:
    698		*pdata = rtl2830_mxl5005s_platform_data;
    699		break;
    700	default:
    701		dev_err(&d->intf->dev, "unknown tuner %s\n", dev->tuner_name);
    702		ret = -ENODEV;
    703		goto err;
    704	}
    705
    706	/* attach demodulator */
    707	memset(&board_info, 0, sizeof(board_info));
    708	strscpy(board_info.type, "rtl2830", I2C_NAME_SIZE);
    709	board_info.addr = 0x10;
    710	board_info.platform_data = pdata;
    711	request_module("%s", board_info.type);
    712	client = i2c_new_client_device(&d->i2c_adap, &board_info);
    713	if (!i2c_client_has_driver(client)) {
    714		ret = -ENODEV;
    715		goto err;
    716	}
    717
    718	if (!try_module_get(client->dev.driver->owner)) {
    719		i2c_unregister_device(client);
    720		ret = -ENODEV;
    721		goto err;
    722	}
    723
    724	adap->fe[0] = pdata->get_dvb_frontend(client);
    725	dev->demod_i2c_adapter = pdata->get_i2c_adapter(client);
    726
    727	dev->i2c_client_demod = client;
    728
    729	return 0;
    730err:
    731	dev_dbg(&d->intf->dev, "failed=%d\n", ret);
    732	return ret;
    733}
    734
    735static const struct rtl2832_platform_data rtl2832_fc2580_platform_data = {
    736	.clk = 28800000,
    737	.tuner = TUNER_RTL2832_FC2580,
    738};
    739
    740static const struct rtl2832_platform_data rtl2832_fc0012_platform_data = {
    741	.clk = 28800000,
    742	.tuner = TUNER_RTL2832_FC0012
    743};
    744
    745static const struct rtl2832_platform_data rtl2832_fc0013_platform_data = {
    746	.clk = 28800000,
    747	.tuner = TUNER_RTL2832_FC0013
    748};
    749
    750static const struct rtl2832_platform_data rtl2832_tua9001_platform_data = {
    751	.clk = 28800000,
    752	.tuner = TUNER_RTL2832_TUA9001,
    753};
    754
    755static const struct rtl2832_platform_data rtl2832_e4000_platform_data = {
    756	.clk = 28800000,
    757	.tuner = TUNER_RTL2832_E4000,
    758};
    759
    760static const struct rtl2832_platform_data rtl2832_r820t_platform_data = {
    761	.clk = 28800000,
    762	.tuner = TUNER_RTL2832_R820T,
    763};
    764
    765static const struct rtl2832_platform_data rtl2832_si2157_platform_data = {
    766	.clk = 28800000,
    767	.tuner = TUNER_RTL2832_SI2157,
    768};
    769
    770static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
    771		int cmd, int arg)
    772{
    773	int ret;
    774	u8 val;
    775
    776	dev_dbg(&d->intf->dev, "cmd=%d arg=%d\n", cmd, arg);
    777
    778	switch (cmd) {
    779	case FC_FE_CALLBACK_VHF_ENABLE:
    780		/* set output values */
    781		ret = rtl28xxu_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
    782		if (ret)
    783			goto err;
    784
    785		if (arg)
    786			val &= 0xbf; /* set GPIO6 low */
    787		else
    788			val |= 0x40; /* set GPIO6 high */
    789
    790
    791		ret = rtl28xxu_wr_reg(d, SYS_GPIO_OUT_VAL, val);
    792		if (ret)
    793			goto err;
    794		break;
    795	default:
    796		ret = -EINVAL;
    797		goto err;
    798	}
    799	return 0;
    800err:
    801	dev_dbg(&d->intf->dev, "failed=%d\n", ret);
    802	return ret;
    803}
    804
    805static int rtl2832u_tua9001_tuner_callback(struct dvb_usb_device *d,
    806		int cmd, int arg)
    807{
    808	int ret;
    809	u8 val;
    810
    811	dev_dbg(&d->intf->dev, "cmd=%d arg=%d\n", cmd, arg);
    812
    813	/*
    814	 * CEN     always enabled by hardware wiring
    815	 * RESETN  GPIO4
    816	 * RXEN    GPIO1
    817	 */
    818
    819	switch (cmd) {
    820	case TUA9001_CMD_RESETN:
    821		if (arg)
    822			val = (1 << 4);
    823		else
    824			val = (0 << 4);
    825
    826		ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, val, 0x10);
    827		if (ret)
    828			goto err;
    829		break;
    830	case TUA9001_CMD_RXEN:
    831		if (arg)
    832			val = (1 << 1);
    833		else
    834			val = (0 << 1);
    835
    836		ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, val, 0x02);
    837		if (ret)
    838			goto err;
    839		break;
    840	}
    841
    842	return 0;
    843err:
    844	dev_dbg(&d->intf->dev, "failed=%d\n", ret);
    845	return ret;
    846}
    847
    848static int rtl2832u_frontend_callback(void *adapter_priv, int component,
    849		int cmd, int arg)
    850{
    851	struct i2c_adapter *adapter = adapter_priv;
    852	struct device *parent = adapter->dev.parent;
    853	struct i2c_adapter *parent_adapter;
    854	struct dvb_usb_device *d;
    855	struct rtl28xxu_dev *dev;
    856
    857	/*
    858	 * All tuners are connected to demod muxed I2C adapter. We have to
    859	 * resolve its parent adapter in order to get handle for this driver
    860	 * private data. That is a bit hackish solution, GPIO or direct driver
    861	 * callback would be better...
    862	 */
    863	if (parent != NULL && parent->type == &i2c_adapter_type)
    864		parent_adapter = to_i2c_adapter(parent);
    865	else
    866		return -EINVAL;
    867
    868	d = i2c_get_adapdata(parent_adapter);
    869	dev = d->priv;
    870
    871	dev_dbg(&d->intf->dev, "component=%d cmd=%d arg=%d\n",
    872		component, cmd, arg);
    873
    874	switch (component) {
    875	case DVB_FRONTEND_COMPONENT_TUNER:
    876		switch (dev->tuner) {
    877		case TUNER_RTL2832_FC0012:
    878			return rtl2832u_fc0012_tuner_callback(d, cmd, arg);
    879		case TUNER_RTL2832_TUA9001:
    880			return rtl2832u_tua9001_tuner_callback(d, cmd, arg);
    881		}
    882	}
    883
    884	return 0;
    885}
    886
    887static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
    888{
    889	struct dvb_usb_device *d = adap_to_d(adap);
    890	struct rtl28xxu_dev *dev = d_to_priv(d);
    891	struct rtl2832_platform_data *pdata = &dev->rtl2832_platform_data;
    892	struct i2c_board_info board_info;
    893	struct i2c_client *client;
    894	int ret;
    895
    896	dev_dbg(&d->intf->dev, "\n");
    897
    898	switch (dev->tuner) {
    899	case TUNER_RTL2832_FC0012:
    900		*pdata = rtl2832_fc0012_platform_data;
    901		break;
    902	case TUNER_RTL2832_FC0013:
    903		*pdata = rtl2832_fc0013_platform_data;
    904		break;
    905	case TUNER_RTL2832_FC2580:
    906		*pdata = rtl2832_fc2580_platform_data;
    907		break;
    908	case TUNER_RTL2832_TUA9001:
    909		*pdata = rtl2832_tua9001_platform_data;
    910		break;
    911	case TUNER_RTL2832_E4000:
    912		*pdata = rtl2832_e4000_platform_data;
    913		break;
    914	case TUNER_RTL2832_R820T:
    915	case TUNER_RTL2832_R828D:
    916		*pdata = rtl2832_r820t_platform_data;
    917		break;
    918	case TUNER_RTL2832_SI2157:
    919		*pdata = rtl2832_si2157_platform_data;
    920		break;
    921	default:
    922		dev_err(&d->intf->dev, "unknown tuner %s\n", dev->tuner_name);
    923		ret = -ENODEV;
    924		goto err;
    925	}
    926
    927	/* attach demodulator */
    928	memset(&board_info, 0, sizeof(board_info));
    929	strscpy(board_info.type, "rtl2832", I2C_NAME_SIZE);
    930	board_info.addr = 0x10;
    931	board_info.platform_data = pdata;
    932	request_module("%s", board_info.type);
    933	client = i2c_new_client_device(&d->i2c_adap, &board_info);
    934	if (!i2c_client_has_driver(client)) {
    935		ret = -ENODEV;
    936		goto err;
    937	}
    938
    939	if (!try_module_get(client->dev.driver->owner)) {
    940		i2c_unregister_device(client);
    941		ret = -ENODEV;
    942		goto err;
    943	}
    944
    945	adap->fe[0] = pdata->get_dvb_frontend(client);
    946	dev->demod_i2c_adapter = pdata->get_i2c_adapter(client);
    947
    948	dev->i2c_client_demod = client;
    949
    950	/* set fe callback */
    951	adap->fe[0]->callback = rtl2832u_frontend_callback;
    952
    953	if (dev->slave_demod) {
    954		struct i2c_board_info info = {};
    955
    956		/* attach slave demodulator */
    957		if (dev->slave_demod == SLAVE_DEMOD_MN88472) {
    958			struct mn88472_config mn88472_config = {};
    959
    960			mn88472_config.fe = &adap->fe[1];
    961			mn88472_config.i2c_wr_max = 22;
    962			strscpy(info.type, "mn88472", I2C_NAME_SIZE);
    963			mn88472_config.xtal = 20500000;
    964			mn88472_config.ts_mode = SERIAL_TS_MODE;
    965			mn88472_config.ts_clock = VARIABLE_TS_CLOCK;
    966			info.addr = 0x18;
    967			info.platform_data = &mn88472_config;
    968			request_module(info.type);
    969			client = i2c_new_client_device(&d->i2c_adap, &info);
    970			if (!i2c_client_has_driver(client))
    971				goto err_slave_demod_failed;
    972
    973			if (!try_module_get(client->dev.driver->owner)) {
    974				i2c_unregister_device(client);
    975				goto err_slave_demod_failed;
    976			}
    977
    978			dev->i2c_client_slave_demod = client;
    979		} else if (dev->slave_demod == SLAVE_DEMOD_MN88473) {
    980			struct mn88473_config mn88473_config = {};
    981
    982			mn88473_config.fe = &adap->fe[1];
    983			mn88473_config.i2c_wr_max = 22;
    984			strscpy(info.type, "mn88473", I2C_NAME_SIZE);
    985			info.addr = 0x18;
    986			info.platform_data = &mn88473_config;
    987			request_module(info.type);
    988			client = i2c_new_client_device(&d->i2c_adap, &info);
    989			if (!i2c_client_has_driver(client))
    990				goto err_slave_demod_failed;
    991
    992			if (!try_module_get(client->dev.driver->owner)) {
    993				i2c_unregister_device(client);
    994				goto err_slave_demod_failed;
    995			}
    996
    997			dev->i2c_client_slave_demod = client;
    998		} else if (dev->slave_demod == SLAVE_DEMOD_CXD2837ER) {
    999			struct cxd2841er_config cxd2837er_config = {};
   1000
   1001			cxd2837er_config.i2c_addr = 0xd8;
   1002			cxd2837er_config.xtal = SONY_XTAL_20500;
   1003			cxd2837er_config.flags = (CXD2841ER_AUTO_IFHZ |
   1004				CXD2841ER_NO_AGCNEG | CXD2841ER_TSBITS |
   1005				CXD2841ER_EARLY_TUNE | CXD2841ER_TS_SERIAL);
   1006			adap->fe[1] = dvb_attach(cxd2841er_attach_t_c,
   1007						 &cxd2837er_config,
   1008						 &d->i2c_adap);
   1009			if (!adap->fe[1])
   1010				goto err_slave_demod_failed;
   1011			adap->fe[1]->id = 1;
   1012			dev->i2c_client_slave_demod = NULL;
   1013		} else {
   1014			struct si2168_config si2168_config = {};
   1015			struct i2c_adapter *adapter;
   1016
   1017			si2168_config.i2c_adapter = &adapter;
   1018			si2168_config.fe = &adap->fe[1];
   1019			si2168_config.ts_mode = SI2168_TS_SERIAL;
   1020			si2168_config.ts_clock_inv = false;
   1021			si2168_config.ts_clock_gapped = true;
   1022			strscpy(info.type, "si2168", I2C_NAME_SIZE);
   1023			info.addr = 0x64;
   1024			info.platform_data = &si2168_config;
   1025			request_module(info.type);
   1026			client = i2c_new_client_device(&d->i2c_adap, &info);
   1027			if (!i2c_client_has_driver(client))
   1028				goto err_slave_demod_failed;
   1029
   1030			if (!try_module_get(client->dev.driver->owner)) {
   1031				i2c_unregister_device(client);
   1032				goto err_slave_demod_failed;
   1033			}
   1034
   1035			dev->i2c_client_slave_demod = client;
   1036
   1037			/* for Si2168 devices use only new I2C write method */
   1038			dev->new_i2c_write = true;
   1039		}
   1040	}
   1041	return 0;
   1042
   1043err:
   1044	dev_dbg(&d->intf->dev, "failed=%d\n", ret);
   1045	return ret;
   1046
   1047err_slave_demod_failed:
   1048	/*
   1049	 * We continue on reduced mode, without DVB-T2/C, using master
   1050	 * demod, when slave demod fails.
   1051	 */
   1052	dev->slave_demod = SLAVE_DEMOD_NONE;
   1053	return 0;
   1054}
   1055
   1056static int rtl28xxu_frontend_attach(struct dvb_usb_adapter *adap)
   1057{
   1058	struct rtl28xxu_dev *dev = adap_to_priv(adap);
   1059
   1060	if (dev->chip_id == CHIP_ID_RTL2831U)
   1061		return rtl2831u_frontend_attach(adap);
   1062	else
   1063		return rtl2832u_frontend_attach(adap);
   1064}
   1065
   1066static int rtl28xxu_frontend_detach(struct dvb_usb_adapter *adap)
   1067{
   1068	struct dvb_usb_device *d = adap_to_d(adap);
   1069	struct rtl28xxu_dev *dev = d_to_priv(d);
   1070	struct i2c_client *client;
   1071
   1072	dev_dbg(&d->intf->dev, "\n");
   1073
   1074	/* remove I2C slave demod */
   1075	client = dev->i2c_client_slave_demod;
   1076	if (client) {
   1077		module_put(client->dev.driver->owner);
   1078		i2c_unregister_device(client);
   1079	}
   1080
   1081	/* remove I2C demod */
   1082	client = dev->i2c_client_demod;
   1083	if (client) {
   1084		module_put(client->dev.driver->owner);
   1085		i2c_unregister_device(client);
   1086	}
   1087
   1088	return 0;
   1089}
   1090
   1091static struct qt1010_config rtl28xxu_qt1010_config = {
   1092	.i2c_address = 0x62, /* 0xc4 */
   1093};
   1094
   1095static struct mt2060_config rtl28xxu_mt2060_config = {
   1096	.i2c_address = 0x60, /* 0xc0 */
   1097	.clock_out = 0,
   1098};
   1099
   1100static struct mxl5005s_config rtl28xxu_mxl5005s_config = {
   1101	.i2c_address     = 0x63, /* 0xc6 */
   1102	.if_freq         = IF_FREQ_4570000HZ,
   1103	.xtal_freq       = CRYSTAL_FREQ_16000000HZ,
   1104	.agc_mode        = MXL_SINGLE_AGC,
   1105	.tracking_filter = MXL_TF_C_H,
   1106	.rssi_enable     = MXL_RSSI_ENABLE,
   1107	.cap_select      = MXL_CAP_SEL_ENABLE,
   1108	.div_out         = MXL_DIV_OUT_4,
   1109	.clock_out       = MXL_CLOCK_OUT_DISABLE,
   1110	.output_load     = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
   1111	.top		 = MXL5005S_TOP_25P2,
   1112	.mod_mode        = MXL_DIGITAL_MODE,
   1113	.if_mode         = MXL_ZERO_IF,
   1114	.AgcMasterByte   = 0x00,
   1115};
   1116
   1117static int rtl2831u_tuner_attach(struct dvb_usb_adapter *adap)
   1118{
   1119	int ret;
   1120	struct dvb_usb_device *d = adap_to_d(adap);
   1121	struct rtl28xxu_dev *dev = d_to_priv(d);
   1122	struct dvb_frontend *fe;
   1123
   1124	dev_dbg(&d->intf->dev, "\n");
   1125
   1126	switch (dev->tuner) {
   1127	case TUNER_RTL2830_QT1010:
   1128		fe = dvb_attach(qt1010_attach, adap->fe[0],
   1129				dev->demod_i2c_adapter,
   1130				&rtl28xxu_qt1010_config);
   1131		break;
   1132	case TUNER_RTL2830_MT2060:
   1133		fe = dvb_attach(mt2060_attach, adap->fe[0],
   1134				dev->demod_i2c_adapter,
   1135				&rtl28xxu_mt2060_config, 1220);
   1136		break;
   1137	case TUNER_RTL2830_MXL5005S:
   1138		fe = dvb_attach(mxl5005s_attach, adap->fe[0],
   1139				dev->demod_i2c_adapter,
   1140				&rtl28xxu_mxl5005s_config);
   1141		break;
   1142	default:
   1143		fe = NULL;
   1144		dev_err(&d->intf->dev, "unknown tuner %d\n", dev->tuner);
   1145	}
   1146
   1147	if (fe == NULL) {
   1148		ret = -ENODEV;
   1149		goto err;
   1150	}
   1151
   1152	return 0;
   1153err:
   1154	dev_dbg(&d->intf->dev, "failed=%d\n", ret);
   1155	return ret;
   1156}
   1157
   1158static const struct fc0012_config rtl2832u_fc0012_config = {
   1159	.i2c_address = 0x63, /* 0xc6 >> 1 */
   1160	.xtal_freq = FC_XTAL_28_8_MHZ,
   1161};
   1162
   1163static const struct r820t_config rtl2832u_r820t_config = {
   1164	.i2c_addr = 0x1a,
   1165	.xtal = 28800000,
   1166	.max_i2c_msg_len = 2,
   1167	.rafael_chip = CHIP_R820T,
   1168};
   1169
   1170static const struct r820t_config rtl2832u_r828d_config = {
   1171	.i2c_addr = 0x3a,
   1172	.xtal = 16000000,
   1173	.max_i2c_msg_len = 2,
   1174	.rafael_chip = CHIP_R828D,
   1175};
   1176
   1177static int rtl2832u_tuner_attach(struct dvb_usb_adapter *adap)
   1178{
   1179	int ret;
   1180	struct dvb_usb_device *d = adap_to_d(adap);
   1181	struct rtl28xxu_dev *dev = d_to_priv(d);
   1182	struct dvb_frontend *fe = NULL;
   1183	struct i2c_board_info info;
   1184	struct i2c_client *client;
   1185	struct v4l2_subdev *subdev = NULL;
   1186	struct platform_device *pdev;
   1187	struct rtl2832_sdr_platform_data pdata;
   1188
   1189	dev_dbg(&d->intf->dev, "\n");
   1190
   1191	memset(&info, 0, sizeof(struct i2c_board_info));
   1192	memset(&pdata, 0, sizeof(pdata));
   1193
   1194	switch (dev->tuner) {
   1195	case TUNER_RTL2832_FC0012:
   1196		fe = dvb_attach(fc0012_attach, adap->fe[0],
   1197			dev->demod_i2c_adapter, &rtl2832u_fc0012_config);
   1198
   1199		/* since fc0012 includs reading the signal strength delegate
   1200		 * that to the tuner driver */
   1201		adap->fe[0]->ops.read_signal_strength =
   1202				adap->fe[0]->ops.tuner_ops.get_rf_strength;
   1203		break;
   1204	case TUNER_RTL2832_FC0013:
   1205		fe = dvb_attach(fc0013_attach, adap->fe[0],
   1206			dev->demod_i2c_adapter, 0xc6>>1, 0, FC_XTAL_28_8_MHZ);
   1207
   1208		/* fc0013 also supports signal strength reading */
   1209		adap->fe[0]->ops.read_signal_strength =
   1210				adap->fe[0]->ops.tuner_ops.get_rf_strength;
   1211		break;
   1212	case TUNER_RTL2832_E4000: {
   1213			struct e4000_config e4000_config = {
   1214				.fe = adap->fe[0],
   1215				.clock = 28800000,
   1216			};
   1217
   1218			strscpy(info.type, "e4000", I2C_NAME_SIZE);
   1219			info.addr = 0x64;
   1220			info.platform_data = &e4000_config;
   1221
   1222			request_module(info.type);
   1223			client = i2c_new_client_device(dev->demod_i2c_adapter,
   1224						       &info);
   1225			if (!i2c_client_has_driver(client))
   1226				break;
   1227
   1228			if (!try_module_get(client->dev.driver->owner)) {
   1229				i2c_unregister_device(client);
   1230				break;
   1231			}
   1232
   1233			dev->i2c_client_tuner = client;
   1234			subdev = i2c_get_clientdata(client);
   1235		}
   1236		break;
   1237	case TUNER_RTL2832_FC2580: {
   1238			struct fc2580_platform_data fc2580_pdata = {
   1239				.dvb_frontend = adap->fe[0],
   1240			};
   1241			struct i2c_board_info board_info = {};
   1242
   1243			strscpy(board_info.type, "fc2580", I2C_NAME_SIZE);
   1244			board_info.addr = 0x56;
   1245			board_info.platform_data = &fc2580_pdata;
   1246			request_module("fc2580");
   1247			client = i2c_new_client_device(dev->demod_i2c_adapter,
   1248						       &board_info);
   1249			if (!i2c_client_has_driver(client))
   1250				break;
   1251			if (!try_module_get(client->dev.driver->owner)) {
   1252				i2c_unregister_device(client);
   1253				break;
   1254			}
   1255			dev->i2c_client_tuner = client;
   1256			subdev = fc2580_pdata.get_v4l2_subdev(client);
   1257		}
   1258		break;
   1259	case TUNER_RTL2832_TUA9001: {
   1260		struct tua9001_platform_data tua9001_pdata = {
   1261			.dvb_frontend = adap->fe[0],
   1262		};
   1263		struct i2c_board_info board_info = {};
   1264
   1265		/* enable GPIO1 and GPIO4 as output */
   1266		ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_DIR, 0x00, 0x12);
   1267		if (ret)
   1268			goto err;
   1269
   1270		ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_EN, 0x12, 0x12);
   1271		if (ret)
   1272			goto err;
   1273
   1274		strscpy(board_info.type, "tua9001", I2C_NAME_SIZE);
   1275		board_info.addr = 0x60;
   1276		board_info.platform_data = &tua9001_pdata;
   1277		request_module("tua9001");
   1278		client = i2c_new_client_device(dev->demod_i2c_adapter,
   1279					       &board_info);
   1280		if (!i2c_client_has_driver(client))
   1281			break;
   1282		if (!try_module_get(client->dev.driver->owner)) {
   1283			i2c_unregister_device(client);
   1284			break;
   1285		}
   1286		dev->i2c_client_tuner = client;
   1287		break;
   1288	}
   1289	case TUNER_RTL2832_R820T:
   1290		fe = dvb_attach(r820t_attach, adap->fe[0],
   1291				dev->demod_i2c_adapter,
   1292				&rtl2832u_r820t_config);
   1293
   1294		/* Use tuner to get the signal strength */
   1295		adap->fe[0]->ops.read_signal_strength =
   1296				adap->fe[0]->ops.tuner_ops.get_rf_strength;
   1297		break;
   1298	case TUNER_RTL2832_R828D:
   1299		fe = dvb_attach(r820t_attach, adap->fe[0],
   1300				dev->demod_i2c_adapter,
   1301				&rtl2832u_r828d_config);
   1302		adap->fe[0]->ops.read_signal_strength =
   1303				adap->fe[0]->ops.tuner_ops.get_rf_strength;
   1304
   1305		if (adap->fe[1]) {
   1306			fe = dvb_attach(r820t_attach, adap->fe[1],
   1307					dev->demod_i2c_adapter,
   1308					&rtl2832u_r828d_config);
   1309			adap->fe[1]->ops.read_signal_strength =
   1310					adap->fe[1]->ops.tuner_ops.get_rf_strength;
   1311		}
   1312		break;
   1313	case TUNER_RTL2832_SI2157: {
   1314			struct si2157_config si2157_config = {
   1315				.fe = adap->fe[0],
   1316				.if_port = 0,
   1317				.inversion = false,
   1318			};
   1319
   1320			strscpy(info.type, "si2157", I2C_NAME_SIZE);
   1321			info.addr = 0x60;
   1322			info.platform_data = &si2157_config;
   1323			request_module(info.type);
   1324			client = i2c_new_client_device(&d->i2c_adap, &info);
   1325			if (!i2c_client_has_driver(client))
   1326				break;
   1327
   1328			if (!try_module_get(client->dev.driver->owner)) {
   1329				i2c_unregister_device(client);
   1330				break;
   1331			}
   1332
   1333			dev->i2c_client_tuner = client;
   1334			subdev = i2c_get_clientdata(client);
   1335
   1336			/* copy tuner ops for 2nd FE as tuner is shared */
   1337			if (adap->fe[1]) {
   1338				adap->fe[1]->tuner_priv =
   1339						adap->fe[0]->tuner_priv;
   1340				memcpy(&adap->fe[1]->ops.tuner_ops,
   1341						&adap->fe[0]->ops.tuner_ops,
   1342						sizeof(struct dvb_tuner_ops));
   1343			}
   1344		}
   1345		break;
   1346	default:
   1347		dev_err(&d->intf->dev, "unknown tuner %d\n", dev->tuner);
   1348	}
   1349	if (fe == NULL && dev->i2c_client_tuner == NULL) {
   1350		ret = -ENODEV;
   1351		goto err;
   1352	}
   1353
   1354	/* register SDR */
   1355	switch (dev->tuner) {
   1356	case TUNER_RTL2832_FC2580:
   1357	case TUNER_RTL2832_FC0012:
   1358	case TUNER_RTL2832_FC0013:
   1359	case TUNER_RTL2832_E4000:
   1360	case TUNER_RTL2832_R820T:
   1361	case TUNER_RTL2832_R828D:
   1362		pdata.clk = dev->rtl2832_platform_data.clk;
   1363		pdata.tuner = dev->tuner;
   1364		pdata.regmap = dev->rtl2832_platform_data.regmap;
   1365		pdata.dvb_frontend = adap->fe[0];
   1366		pdata.dvb_usb_device = d;
   1367		pdata.v4l2_subdev = subdev;
   1368
   1369		request_module("%s", "rtl2832_sdr");
   1370		pdev = platform_device_register_data(&d->intf->dev,
   1371						     "rtl2832_sdr",
   1372						     PLATFORM_DEVID_AUTO,
   1373						     &pdata, sizeof(pdata));
   1374		if (IS_ERR(pdev) || pdev->dev.driver == NULL)
   1375			break;
   1376		dev->platform_device_sdr = pdev;
   1377		break;
   1378	default:
   1379		dev_dbg(&d->intf->dev, "no SDR for tuner=%d\n", dev->tuner);
   1380	}
   1381
   1382	return 0;
   1383err:
   1384	dev_dbg(&d->intf->dev, "failed=%d\n", ret);
   1385	return ret;
   1386}
   1387
   1388static int rtl28xxu_tuner_attach(struct dvb_usb_adapter *adap)
   1389{
   1390	struct rtl28xxu_dev *dev = adap_to_priv(adap);
   1391
   1392	if (dev->chip_id == CHIP_ID_RTL2831U)
   1393		return rtl2831u_tuner_attach(adap);
   1394	else
   1395		return rtl2832u_tuner_attach(adap);
   1396}
   1397
   1398static int rtl28xxu_tuner_detach(struct dvb_usb_adapter *adap)
   1399{
   1400	struct dvb_usb_device *d = adap_to_d(adap);
   1401	struct rtl28xxu_dev *dev = d_to_priv(d);
   1402	struct i2c_client *client;
   1403	struct platform_device *pdev;
   1404
   1405	dev_dbg(&d->intf->dev, "\n");
   1406
   1407	/* remove platform SDR */
   1408	pdev = dev->platform_device_sdr;
   1409	if (pdev)
   1410		platform_device_unregister(pdev);
   1411
   1412	/* remove I2C tuner */
   1413	client = dev->i2c_client_tuner;
   1414	if (client) {
   1415		module_put(client->dev.driver->owner);
   1416		i2c_unregister_device(client);
   1417	}
   1418
   1419	return 0;
   1420}
   1421
   1422static int rtl28xxu_init(struct dvb_usb_device *d)
   1423{
   1424	int ret;
   1425	u8 val;
   1426
   1427	dev_dbg(&d->intf->dev, "\n");
   1428
   1429	/* init USB endpoints */
   1430	ret = rtl28xxu_rd_reg(d, USB_SYSCTL_0, &val);
   1431	if (ret)
   1432		goto err;
   1433
   1434	/* enable DMA and Full Packet Mode*/
   1435	val |= 0x09;
   1436	ret = rtl28xxu_wr_reg(d, USB_SYSCTL_0, val);
   1437	if (ret)
   1438		goto err;
   1439
   1440	/* set EPA maximum packet size to 0x0200 */
   1441	ret = rtl28xxu_wr_regs(d, USB_EPA_MAXPKT, "\x00\x02\x00\x00", 4);
   1442	if (ret)
   1443		goto err;
   1444
   1445	/* change EPA FIFO length */
   1446	ret = rtl28xxu_wr_regs(d, USB_EPA_FIFO_CFG, "\x14\x00\x00\x00", 4);
   1447	if (ret)
   1448		goto err;
   1449
   1450	return ret;
   1451err:
   1452	dev_dbg(&d->intf->dev, "failed=%d\n", ret);
   1453	return ret;
   1454}
   1455
   1456static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
   1457{
   1458	int ret;
   1459	u8 gpio, sys0, epa_ctl[2];
   1460
   1461	dev_dbg(&d->intf->dev, "onoff=%d\n", onoff);
   1462
   1463	/* demod adc */
   1464	ret = rtl28xxu_rd_reg(d, SYS_SYS0, &sys0);
   1465	if (ret)
   1466		goto err;
   1467
   1468	/* tuner power, read GPIOs */
   1469	ret = rtl28xxu_rd_reg(d, SYS_GPIO_OUT_VAL, &gpio);
   1470	if (ret)
   1471		goto err;
   1472
   1473	dev_dbg(&d->intf->dev, "RD SYS0=%02x GPIO_OUT_VAL=%02x\n", sys0, gpio);
   1474
   1475	if (onoff) {
   1476		gpio |= 0x01; /* GPIO0 = 1 */
   1477		gpio &= (~0x10); /* GPIO4 = 0 */
   1478		gpio |= 0x04; /* GPIO2 = 1, LED on */
   1479		sys0 = sys0 & 0x0f;
   1480		sys0 |= 0xe0;
   1481		epa_ctl[0] = 0x00; /* clear stall */
   1482		epa_ctl[1] = 0x00; /* clear reset */
   1483	} else {
   1484		gpio &= (~0x01); /* GPIO0 = 0 */
   1485		gpio |= 0x10; /* GPIO4 = 1 */
   1486		gpio &= (~0x04); /* GPIO2 = 1, LED off */
   1487		sys0 = sys0 & (~0xc0);
   1488		epa_ctl[0] = 0x10; /* set stall */
   1489		epa_ctl[1] = 0x02; /* set reset */
   1490	}
   1491
   1492	dev_dbg(&d->intf->dev, "WR SYS0=%02x GPIO_OUT_VAL=%02x\n", sys0, gpio);
   1493
   1494	/* demod adc */
   1495	ret = rtl28xxu_wr_reg(d, SYS_SYS0, sys0);
   1496	if (ret)
   1497		goto err;
   1498
   1499	/* tuner power, write GPIOs */
   1500	ret = rtl28xxu_wr_reg(d, SYS_GPIO_OUT_VAL, gpio);
   1501	if (ret)
   1502		goto err;
   1503
   1504	/* streaming EP: stall & reset */
   1505	ret = rtl28xxu_wr_regs(d, USB_EPA_CTL, epa_ctl, 2);
   1506	if (ret)
   1507		goto err;
   1508
   1509	if (onoff)
   1510		usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, 0x81));
   1511
   1512	return ret;
   1513err:
   1514	dev_dbg(&d->intf->dev, "failed=%d\n", ret);
   1515	return ret;
   1516}
   1517
   1518static int rtl2832u_power_ctrl(struct dvb_usb_device *d, int onoff)
   1519{
   1520	int ret;
   1521
   1522	dev_dbg(&d->intf->dev, "onoff=%d\n", onoff);
   1523
   1524	if (onoff) {
   1525		/* GPIO3=1, GPIO4=0 */
   1526		ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, 0x08, 0x18);
   1527		if (ret)
   1528			goto err;
   1529
   1530		/* suspend? */
   1531		ret = rtl28xxu_wr_reg_mask(d, SYS_DEMOD_CTL1, 0x00, 0x10);
   1532		if (ret)
   1533			goto err;
   1534
   1535		/* enable PLL */
   1536		ret = rtl28xxu_wr_reg_mask(d, SYS_DEMOD_CTL, 0x80, 0x80);
   1537		if (ret)
   1538			goto err;
   1539
   1540		/* disable reset */
   1541		ret = rtl28xxu_wr_reg_mask(d, SYS_DEMOD_CTL, 0x20, 0x20);
   1542		if (ret)
   1543			goto err;
   1544
   1545		/* streaming EP: clear stall & reset */
   1546		ret = rtl28xxu_wr_regs(d, USB_EPA_CTL, "\x00\x00", 2);
   1547		if (ret)
   1548			goto err;
   1549
   1550		ret = usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, 0x81));
   1551		if (ret)
   1552			goto err;
   1553	} else {
   1554		/* GPIO4=1 */
   1555		ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, 0x10, 0x10);
   1556		if (ret)
   1557			goto err;
   1558
   1559		/* disable PLL */
   1560		ret = rtl28xxu_wr_reg_mask(d, SYS_DEMOD_CTL, 0x00, 0x80);
   1561		if (ret)
   1562			goto err;
   1563
   1564		/* streaming EP: set stall & reset */
   1565		ret = rtl28xxu_wr_regs(d, USB_EPA_CTL, "\x10\x02", 2);
   1566		if (ret)
   1567			goto err;
   1568	}
   1569
   1570	return ret;
   1571err:
   1572	dev_dbg(&d->intf->dev, "failed=%d\n", ret);
   1573	return ret;
   1574}
   1575
   1576static int rtl28xxu_power_ctrl(struct dvb_usb_device *d, int onoff)
   1577{
   1578	struct rtl28xxu_dev *dev = d_to_priv(d);
   1579
   1580	if (dev->chip_id == CHIP_ID_RTL2831U)
   1581		return rtl2831u_power_ctrl(d, onoff);
   1582	else
   1583		return rtl2832u_power_ctrl(d, onoff);
   1584}
   1585
   1586static int rtl28xxu_frontend_ctrl(struct dvb_frontend *fe, int onoff)
   1587{
   1588	struct dvb_usb_device *d = fe_to_d(fe);
   1589	struct rtl28xxu_dev *dev = fe_to_priv(fe);
   1590	struct rtl2832_platform_data *pdata = &dev->rtl2832_platform_data;
   1591	int ret;
   1592	u8 val;
   1593
   1594	dev_dbg(&d->intf->dev, "fe=%d onoff=%d\n", fe->id, onoff);
   1595
   1596	if (dev->chip_id == CHIP_ID_RTL2831U)
   1597		return 0;
   1598
   1599	if (fe->id == 0) {
   1600		/* control internal demod ADC */
   1601		if (onoff)
   1602			val = 0x48; /* enable ADC */
   1603		else
   1604			val = 0x00; /* disable ADC */
   1605
   1606		ret = rtl28xxu_wr_reg_mask(d, SYS_DEMOD_CTL, val, 0x48);
   1607		if (ret)
   1608			goto err;
   1609	} else if (fe->id == 1) {
   1610		/* bypass slave demod TS through master demod */
   1611		ret = pdata->slave_ts_ctrl(dev->i2c_client_demod, onoff);
   1612		if (ret)
   1613			goto err;
   1614	}
   1615
   1616	return 0;
   1617err:
   1618	dev_dbg(&d->intf->dev, "failed=%d\n", ret);
   1619	return ret;
   1620}
   1621
   1622#if IS_ENABLED(CONFIG_RC_CORE)
   1623static int rtl2831u_rc_query(struct dvb_usb_device *d)
   1624{
   1625	int ret, i;
   1626	struct rtl28xxu_dev *dev = d->priv;
   1627	u8 buf[5];
   1628	u32 rc_code;
   1629	static const struct rtl28xxu_reg_val rc_nec_tab[] = {
   1630		{ 0x3033, 0x80 },
   1631		{ 0x3020, 0x43 },
   1632		{ 0x3021, 0x16 },
   1633		{ 0x3022, 0x16 },
   1634		{ 0x3023, 0x5a },
   1635		{ 0x3024, 0x2d },
   1636		{ 0x3025, 0x16 },
   1637		{ 0x3026, 0x01 },
   1638		{ 0x3028, 0xb0 },
   1639		{ 0x3029, 0x04 },
   1640		{ 0x302c, 0x88 },
   1641		{ 0x302e, 0x13 },
   1642		{ 0x3030, 0xdf },
   1643		{ 0x3031, 0x05 },
   1644	};
   1645
   1646	/* init remote controller */
   1647	if (!dev->rc_active) {
   1648		for (i = 0; i < ARRAY_SIZE(rc_nec_tab); i++) {
   1649			ret = rtl28xxu_wr_reg(d, rc_nec_tab[i].reg,
   1650					rc_nec_tab[i].val);
   1651			if (ret)
   1652				goto err;
   1653		}
   1654		dev->rc_active = true;
   1655	}
   1656
   1657	ret = rtl28xxu_rd_regs(d, SYS_IRRC_RP, buf, 5);
   1658	if (ret)
   1659		goto err;
   1660
   1661	if (buf[4] & 0x01) {
   1662		enum rc_proto proto;
   1663
   1664		if (buf[2] == (u8) ~buf[3]) {
   1665			if (buf[0] == (u8) ~buf[1]) {
   1666				/* NEC standard (16 bit) */
   1667				rc_code = RC_SCANCODE_NEC(buf[0], buf[2]);
   1668				proto = RC_PROTO_NEC;
   1669			} else {
   1670				/* NEC extended (24 bit) */
   1671				rc_code = RC_SCANCODE_NECX(buf[0] << 8 | buf[1],
   1672							   buf[2]);
   1673				proto = RC_PROTO_NECX;
   1674			}
   1675		} else {
   1676			/* NEC full (32 bit) */
   1677			rc_code = RC_SCANCODE_NEC32(buf[0] << 24 | buf[1] << 16 |
   1678						    buf[2] << 8  | buf[3]);
   1679			proto = RC_PROTO_NEC32;
   1680		}
   1681
   1682		rc_keydown(d->rc_dev, proto, rc_code, 0);
   1683
   1684		ret = rtl28xxu_wr_reg(d, SYS_IRRC_SR, 1);
   1685		if (ret)
   1686			goto err;
   1687
   1688		/* repeated intentionally to avoid extra keypress */
   1689		ret = rtl28xxu_wr_reg(d, SYS_IRRC_SR, 1);
   1690		if (ret)
   1691			goto err;
   1692	}
   1693
   1694	return ret;
   1695err:
   1696	dev_dbg(&d->intf->dev, "failed=%d\n", ret);
   1697	return ret;
   1698}
   1699
   1700static int rtl2831u_get_rc_config(struct dvb_usb_device *d,
   1701		struct dvb_usb_rc *rc)
   1702{
   1703	rc->map_name = RC_MAP_EMPTY;
   1704	rc->allowed_protos = RC_PROTO_BIT_NEC | RC_PROTO_BIT_NECX |
   1705							RC_PROTO_BIT_NEC32;
   1706	rc->query = rtl2831u_rc_query;
   1707	rc->interval = 400;
   1708
   1709	return 0;
   1710}
   1711
   1712static int rtl2832u_rc_query(struct dvb_usb_device *d)
   1713{
   1714	int ret, i, len;
   1715	struct rtl28xxu_dev *dev = d->priv;
   1716	struct ir_raw_event ev = {};
   1717	u8 buf[128];
   1718	static const struct rtl28xxu_reg_val_mask refresh_tab[] = {
   1719		{IR_RX_IF,               0x03, 0xff},
   1720		{IR_RX_BUF_CTRL,         0x80, 0xff},
   1721		{IR_RX_CTRL,             0x80, 0xff},
   1722	};
   1723
   1724	/* init remote controller */
   1725	if (!dev->rc_active) {
   1726		static const struct rtl28xxu_reg_val_mask init_tab[] = {
   1727			{SYS_DEMOD_CTL1,         0x00, 0x04},
   1728			{SYS_DEMOD_CTL1,         0x00, 0x08},
   1729			{USB_CTRL,               0x20, 0x20},
   1730			{SYS_GPIO_DIR,           0x00, 0x08},
   1731			{SYS_GPIO_OUT_EN,        0x08, 0x08},
   1732			{SYS_GPIO_OUT_VAL,       0x08, 0x08},
   1733			{IR_MAX_DURATION0,       0xd0, 0xff},
   1734			{IR_MAX_DURATION1,       0x07, 0xff},
   1735			{IR_IDLE_LEN0,           0xc0, 0xff},
   1736			{IR_IDLE_LEN1,           0x00, 0xff},
   1737			{IR_GLITCH_LEN,          0x03, 0xff},
   1738			{IR_RX_CLK,              0x09, 0xff},
   1739			{IR_RX_CFG,              0x1c, 0xff},
   1740			{IR_MAX_H_TOL_LEN,       0x1e, 0xff},
   1741			{IR_MAX_L_TOL_LEN,       0x1e, 0xff},
   1742			{IR_RX_CTRL,             0x80, 0xff},
   1743		};
   1744
   1745		for (i = 0; i < ARRAY_SIZE(init_tab); i++) {
   1746			ret = rtl28xxu_wr_reg_mask(d, init_tab[i].reg,
   1747					init_tab[i].val, init_tab[i].mask);
   1748			if (ret)
   1749				goto err;
   1750		}
   1751
   1752		dev->rc_active = true;
   1753	}
   1754
   1755	ret = rtl28xxu_rd_reg(d, IR_RX_IF, &buf[0]);
   1756	if (ret)
   1757		goto err;
   1758
   1759	if (buf[0] != 0x83)
   1760		goto exit;
   1761
   1762	ret = rtl28xxu_rd_reg(d, IR_RX_BC, &buf[0]);
   1763	if (ret || buf[0] > sizeof(buf))
   1764		goto err;
   1765
   1766	len = buf[0];
   1767
   1768	/* read raw code from hw */
   1769	ret = rtl28xxu_rd_regs(d, IR_RX_BUF, buf, len);
   1770	if (ret)
   1771		goto err;
   1772
   1773	/* let hw receive new code */
   1774	for (i = 0; i < ARRAY_SIZE(refresh_tab); i++) {
   1775		ret = rtl28xxu_wr_reg_mask(d, refresh_tab[i].reg,
   1776				refresh_tab[i].val, refresh_tab[i].mask);
   1777		if (ret)
   1778			goto err;
   1779	}
   1780
   1781	/* pass data to Kernel IR decoder */
   1782	for (i = 0; i < len; i++) {
   1783		ev.pulse = buf[i] >> 7;
   1784		ev.duration = 51 * (buf[i] & 0x7f);
   1785		ir_raw_event_store_with_filter(d->rc_dev, &ev);
   1786	}
   1787
   1788	/* 'flush' ir_raw_event_store_with_filter() */
   1789	ir_raw_event_handle(d->rc_dev);
   1790exit:
   1791	return ret;
   1792err:
   1793	dev_dbg(&d->intf->dev, "failed=%d\n", ret);
   1794	return ret;
   1795}
   1796
   1797static int rtl2832u_get_rc_config(struct dvb_usb_device *d,
   1798		struct dvb_usb_rc *rc)
   1799{
   1800	/* disable IR interrupts in order to avoid SDR sample loss */
   1801	if (rtl28xxu_disable_rc)
   1802		return rtl28xxu_wr_reg(d, IR_RX_IE, 0x00);
   1803
   1804	/* load empty to enable rc */
   1805	if (!rc->map_name)
   1806		rc->map_name = RC_MAP_EMPTY;
   1807	rc->allowed_protos = RC_PROTO_BIT_ALL_IR_DECODER;
   1808	rc->driver_type = RC_DRIVER_IR_RAW;
   1809	rc->query = rtl2832u_rc_query;
   1810	rc->interval = 200;
   1811	/* we program idle len to 0xc0, set timeout to one less */
   1812	rc->timeout = 0xbf * 51;
   1813
   1814	return 0;
   1815}
   1816
   1817static int rtl28xxu_get_rc_config(struct dvb_usb_device *d,
   1818		struct dvb_usb_rc *rc)
   1819{
   1820	struct rtl28xxu_dev *dev = d_to_priv(d);
   1821
   1822	if (dev->chip_id == CHIP_ID_RTL2831U)
   1823		return rtl2831u_get_rc_config(d, rc);
   1824	else
   1825		return rtl2832u_get_rc_config(d, rc);
   1826}
   1827#else
   1828#define rtl28xxu_get_rc_config NULL
   1829#endif
   1830
   1831static int rtl28xxu_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
   1832{
   1833	struct rtl28xxu_dev *dev = adap_to_priv(adap);
   1834
   1835	if (dev->chip_id == CHIP_ID_RTL2831U) {
   1836		struct rtl2830_platform_data *pdata = &dev->rtl2830_platform_data;
   1837
   1838		return pdata->pid_filter_ctrl(adap->fe[0], onoff);
   1839	} else {
   1840		struct rtl2832_platform_data *pdata = &dev->rtl2832_platform_data;
   1841
   1842		return pdata->pid_filter_ctrl(adap->fe[0], onoff);
   1843	}
   1844}
   1845
   1846static int rtl28xxu_pid_filter(struct dvb_usb_adapter *adap, int index,
   1847			       u16 pid, int onoff)
   1848{
   1849	struct rtl28xxu_dev *dev = adap_to_priv(adap);
   1850
   1851	if (dev->chip_id == CHIP_ID_RTL2831U) {
   1852		struct rtl2830_platform_data *pdata = &dev->rtl2830_platform_data;
   1853
   1854		return pdata->pid_filter(adap->fe[0], index, pid, onoff);
   1855	} else {
   1856		struct rtl2832_platform_data *pdata = &dev->rtl2832_platform_data;
   1857
   1858		return pdata->pid_filter(adap->fe[0], index, pid, onoff);
   1859	}
   1860}
   1861
   1862static const struct dvb_usb_device_properties rtl28xxu_props = {
   1863	.driver_name = KBUILD_MODNAME,
   1864	.owner = THIS_MODULE,
   1865	.adapter_nr = adapter_nr,
   1866	.size_of_priv = sizeof(struct rtl28xxu_dev),
   1867
   1868	.identify_state = rtl28xxu_identify_state,
   1869	.power_ctrl = rtl28xxu_power_ctrl,
   1870	.frontend_ctrl = rtl28xxu_frontend_ctrl,
   1871	.i2c_algo = &rtl28xxu_i2c_algo,
   1872	.read_config = rtl28xxu_read_config,
   1873	.frontend_attach = rtl28xxu_frontend_attach,
   1874	.frontend_detach = rtl28xxu_frontend_detach,
   1875	.tuner_attach = rtl28xxu_tuner_attach,
   1876	.tuner_detach = rtl28xxu_tuner_detach,
   1877	.init = rtl28xxu_init,
   1878	.get_rc_config = rtl28xxu_get_rc_config,
   1879
   1880	.num_adapters = 1,
   1881	.adapter = {
   1882		{
   1883			.caps = DVB_USB_ADAP_HAS_PID_FILTER |
   1884				DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
   1885
   1886			.pid_filter_count = 32,
   1887			.pid_filter_ctrl = rtl28xxu_pid_filter_ctrl,
   1888			.pid_filter = rtl28xxu_pid_filter,
   1889
   1890			.stream = DVB_USB_STREAM_BULK(0x81, 6, 8 * 512),
   1891		},
   1892	},
   1893};
   1894
   1895static const struct usb_device_id rtl28xxu_id_table[] = {
   1896	/* RTL2831U devices: */
   1897	{ DVB_USB_DEVICE(USB_VID_REALTEK, USB_PID_REALTEK_RTL2831U,
   1898		&rtl28xxu_props, "Realtek RTL2831U reference design", NULL) },
   1899	{ DVB_USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_FREECOM_DVBT,
   1900		&rtl28xxu_props, "Freecom USB2.0 DVB-T", NULL) },
   1901	{ DVB_USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_FREECOM_DVBT_2,
   1902		&rtl28xxu_props, "Freecom USB2.0 DVB-T", NULL) },
   1903
   1904	/* RTL2832U devices: */
   1905	{ DVB_USB_DEVICE(USB_VID_REALTEK, 0x2832,
   1906		&rtl28xxu_props, "Realtek RTL2832U reference design", NULL) },
   1907	{ DVB_USB_DEVICE(USB_VID_REALTEK, 0x2838,
   1908		&rtl28xxu_props, "Realtek RTL2832U reference design", NULL) },
   1909	{ DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1,
   1910		&rtl28xxu_props, "TerraTec Cinergy T Stick Black", RC_MAP_TERRATEC_SLIM) },
   1911	{ DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_DELOCK_USB2_DVBT,
   1912		&rtl28xxu_props, "G-Tek Electronics Group Lifeview LV5TDLX DVB-T", NULL) },
   1913	{ DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_NOXON_DAB_STICK,
   1914		&rtl28xxu_props, "TerraTec NOXON DAB Stick", NULL) },
   1915	{ DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_NOXON_DAB_STICK_REV2,
   1916		&rtl28xxu_props, "TerraTec NOXON DAB Stick (rev 2)", NULL) },
   1917	{ DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_NOXON_DAB_STICK_REV3,
   1918		&rtl28xxu_props, "TerraTec NOXON DAB Stick (rev 3)", NULL) },
   1919	{ DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_TREKSTOR_TERRES_2_0,
   1920		&rtl28xxu_props, "Trekstor DVB-T Stick Terres 2.0", NULL) },
   1921	{ DVB_USB_DEVICE(USB_VID_DEXATEK, 0x1101,
   1922		&rtl28xxu_props, "Dexatek DK DVB-T Dongle", NULL) },
   1923	{ DVB_USB_DEVICE(USB_VID_LEADTEK, 0x6680,
   1924		&rtl28xxu_props, "DigitalNow Quad DVB-T Receiver", NULL) },
   1925	{ DVB_USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_MINID,
   1926		&rtl28xxu_props, "Leadtek Winfast DTV Dongle Mini D", NULL) },
   1927	{ DVB_USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV2000DS_PLUS,
   1928		&rtl28xxu_props, "Leadtek WinFast DTV2000DS Plus", RC_MAP_LEADTEK_Y04G0051) },
   1929	{ DVB_USB_DEVICE(USB_VID_TERRATEC, 0x00d3,
   1930		&rtl28xxu_props, "TerraTec Cinergy T Stick RC (Rev. 3)", NULL) },
   1931	{ DVB_USB_DEVICE(USB_VID_DEXATEK, 0x1102,
   1932		&rtl28xxu_props, "Dexatek DK mini DVB-T Dongle", NULL) },
   1933	{ DVB_USB_DEVICE(USB_VID_TERRATEC, 0x00d7,
   1934		&rtl28xxu_props, "TerraTec Cinergy T Stick+", NULL) },
   1935	{ DVB_USB_DEVICE(USB_VID_KWORLD_2, 0xd3a8,
   1936		&rtl28xxu_props, "ASUS My Cinema-U3100Mini Plus V2", NULL) },
   1937	{ DVB_USB_DEVICE(USB_VID_KWORLD_2, 0xd393,
   1938		&rtl28xxu_props, "GIGABYTE U7300", NULL) },
   1939	{ DVB_USB_DEVICE(USB_VID_DEXATEK, 0x1104,
   1940		&rtl28xxu_props, "MSI DIGIVOX Micro HD", NULL) },
   1941	{ DVB_USB_DEVICE(USB_VID_COMPRO, 0x0620,
   1942		&rtl28xxu_props, "Compro VideoMate U620F", NULL) },
   1943	{ DVB_USB_DEVICE(USB_VID_COMPRO, 0x0650,
   1944		&rtl28xxu_props, "Compro VideoMate U650F", NULL) },
   1945	{ DVB_USB_DEVICE(USB_VID_KWORLD_2, 0xd394,
   1946		&rtl28xxu_props, "MaxMedia HU394-T", NULL) },
   1947	{ DVB_USB_DEVICE(USB_VID_LEADTEK, 0x6a03,
   1948		&rtl28xxu_props, "Leadtek WinFast DTV Dongle mini", NULL) },
   1949	{ DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_CPYTO_REDI_PC50A,
   1950		&rtl28xxu_props, "Crypto ReDi PC 50 A", NULL) },
   1951	{ DVB_USB_DEVICE(USB_VID_KYE, 0x707f,
   1952		&rtl28xxu_props, "Genius TVGo DVB-T03", NULL) },
   1953	{ DVB_USB_DEVICE(USB_VID_KWORLD_2, 0xd395,
   1954		&rtl28xxu_props, "Peak DVB-T USB", NULL) },
   1955	{ DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV20_RTL2832U,
   1956		&rtl28xxu_props, "Sveon STV20", NULL) },
   1957	{ DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV21,
   1958		&rtl28xxu_props, "Sveon STV21", NULL) },
   1959	{ DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV27,
   1960		&rtl28xxu_props, "Sveon STV27", NULL) },
   1961	{ DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_TURBOX_DTT_2000,
   1962		&rtl28xxu_props, "TURBO-X Pure TV Tuner DTT-2000", NULL) },
   1963	{ DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_PROLECTRIX_DV107669,
   1964		&rtl28xxu_props, "PROlectrix DV107669", NULL) },
   1965
   1966	/* RTL2832P devices: */
   1967	{ DVB_USB_DEVICE(USB_VID_HANFTEK, 0x0131,
   1968		&rtl28xxu_props, "Astrometa DVB-T2",
   1969		RC_MAP_ASTROMETA_T2HYBRID) },
   1970	{ DVB_USB_DEVICE(0x5654, 0xca42,
   1971		&rtl28xxu_props, "GoTView MasterHD 3", NULL) },
   1972	{ }
   1973};
   1974MODULE_DEVICE_TABLE(usb, rtl28xxu_id_table);
   1975
   1976static struct usb_driver rtl28xxu_usb_driver = {
   1977	.name = KBUILD_MODNAME,
   1978	.id_table = rtl28xxu_id_table,
   1979	.probe = dvb_usbv2_probe,
   1980	.disconnect = dvb_usbv2_disconnect,
   1981	.suspend = dvb_usbv2_suspend,
   1982	.resume = dvb_usbv2_resume,
   1983	.reset_resume = dvb_usbv2_reset_resume,
   1984	.no_dynamic_id = 1,
   1985	.soft_unbind = 1,
   1986};
   1987
   1988module_usb_driver(rtl28xxu_usb_driver);
   1989
   1990MODULE_DESCRIPTION("Realtek RTL28xxU DVB USB driver");
   1991MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
   1992MODULE_AUTHOR("Thomas Mair <thomas.mair86@googlemail.com>");
   1993MODULE_LICENSE("GPL");