56 pipe = usb_sndctrlpipe(d->
udev, 0);
60 pipe = usb_rcvctrlpipe(d->
udev, 0);
83 dev_dbg(&d->
udev->dev,
"%s: failed=%d\n", __func__, ret);
93 else if (reg < 0x4000)
102 return rtl28xxu_ctrl_msg(d, &req);
111 else if (reg < 0x4000)
120 return rtl28xxu_ctrl_msg(d, &req);
125 return rtl28xx_wr_regs(d, reg, &val, 1);
130 return rtl2831_rd_regs(d, reg, val, 1);
141 ret = rtl28xx_rd_reg(d, reg, &tmp);
150 return rtl28xx_wr_reg(d, reg, val);
188 (msg[1].
flags & I2C_M_RD)) {
189 if (msg[0].len > 24 || msg[1].len > 24) {
192 goto err_mutex_unlock;
193 }
else if (msg[0].
addr == 0x10) {
199 ret = rtl28xxu_ctrl_msg(d, &req);
200 }
else if (msg[0].len < 2) {
206 ret = rtl28xxu_ctrl_msg(d, &req);
213 ret = rtl28xxu_ctrl_msg(d, &req);
215 goto err_mutex_unlock;
221 ret = rtl28xxu_ctrl_msg(d, &req);
223 }
else if (num == 1 && !(msg[0].
flags & I2C_M_RD)) {
224 if (msg[0].len > 22) {
227 goto err_mutex_unlock;
228 }
else if (msg[0].
addr == 0x10) {
230 if (msg[0].buf[0] == 0x00) {
240 ret = rtl28xxu_ctrl_msg(d, &req);
242 }
else if (msg[0].len < 23) {
248 ret = rtl28xxu_ctrl_msg(d, &req);
255 ret = rtl28xxu_ctrl_msg(d, &req);
264 return ret ? ret : num;
273 .master_xfer = rtl28xxu_i2c_xfer,
274 .functionality = rtl28xxu_i2c_func,
283 struct rtl28xxu_req req_gate_open = {0x0120, 0x0011, 0x0001,
"\x08"};
319 ret = rtl28xxu_ctrl_msg(d, &req_gate_open);
324 ret = rtl28xxu_ctrl_msg(d, &req_qt1010);
325 if (ret == 0 && buf[0] == 0x2c) {
332 ret = rtl28xxu_ctrl_msg(d, &req_gate_open);
337 ret = rtl28xxu_ctrl_msg(d, &req_mt2060);
338 if (ret == 0 && buf[0] == 0x63) {
354 dev_dbg(&d->
udev->dev,
"%s: failed=%d\n", __func__, ret);
364 struct rtl28xxu_req req_gate_open = {0x0120, 0x0011, 0x0001,
"\x18"};
366 struct rtl28xxu_req req_gate_close = {0x0120, 0x0011, 0x0001,
"\x10"};
396 ret = rtl28xxu_ctrl_msg(d, &req_gate_open);
403 ret = rtl28xxu_ctrl_msg(d, &req_fc0012);
404 if (ret == 0 && buf[0] == 0xa1) {
411 ret = rtl28xxu_ctrl_msg(d, &req_fc0013);
412 if (ret == 0 && buf[0] == 0xa3) {
419 ret = rtl28xxu_ctrl_msg(d, &req_mt2266);
420 if (ret == 0 && buf[0] == 0x85) {
427 ret = rtl28xxu_ctrl_msg(d, &req_fc2580);
428 if (ret == 0 && buf[0] == 0x56) {
435 ret = rtl28xxu_ctrl_msg(d, &req_mt2063);
436 if (ret == 0 && (buf[0] == 0x9e || buf[0] == 0x9c)) {
443 ret = rtl28xxu_ctrl_msg(d, &req_max3543);
444 if (ret == 0 && buf[0] == 0x38) {
451 ret = rtl28xxu_ctrl_msg(d, &req_tua9001);
452 if (ret == 0 && buf[0] == 0x23 && buf[1] == 0x28) {
459 ret = rtl28xxu_ctrl_msg(d, &req_mxl5007t);
460 if (ret == 0 && buf[0] == 0x14) {
467 ret = rtl28xxu_ctrl_msg(d, &req_e4000);
468 if (ret == 0 && buf[0] == 0x40) {
475 ret = rtl28xxu_ctrl_msg(d, &req_tda18272);
476 if (ret == 0 && (buf[0] == 0xc7 || buf[1] == 0x60)) {
486 ret = rtl28xxu_ctrl_msg(d, &req_gate_close);
492 dev_dbg(&d->
udev->dev,
"%s: failed=%d\n", __func__, ret);
503 .agc_targ_val = 0x2d,
514 .agc_targ_val = 0x2d,
524 .agc_targ_val = 0x3e,
536 switch (priv->
tuner) {
538 rtl2830_config = &rtl28xxu_rtl2830_qt1010_config;
541 rtl2830_config = &rtl28xxu_rtl2830_mt2060_config;
544 rtl2830_config = &rtl28xxu_rtl2830_mxl5005s_config;
562 dev_dbg(&d->
udev->dev,
"%s: failed=%d\n", __func__, ret);
592 static int rtl2832u_fc0012_tuner_callback(
struct dvb_usb_device *d,
598 dev_dbg(&d->
udev->dev,
"%s: cmd=%d arg=%d\n", __func__, cmd, arg);
623 dev_dbg(&d->
udev->dev,
"%s: failed=%d\n", __func__, ret);
627 static int rtl2832u_tua9001_tuner_callback(
struct dvb_usb_device *d,
633 dev_dbg(&d->
udev->dev,
"%s: cmd=%d arg=%d\n", __func__, cmd, arg);
666 dev_dbg(&d->
udev->dev,
"%s: failed=%d\n", __func__, ret);
670 static int rtl2832u_tuner_callback(
struct dvb_usb_device *d,
int cmd,
int arg)
674 switch (priv->
tuner) {
676 return rtl2832u_fc0012_tuner_callback(d, cmd, arg);
678 return rtl2832u_tua9001_tuner_callback(d, cmd, arg);
686 static int rtl2832u_frontend_callback(
void *adapter_priv,
int component,
692 dev_dbg(&d->
udev->dev,
"%s: component=%d cmd=%d arg=%d\n",
693 __func__, component, cmd, arg);
697 return rtl2832u_tuner_callback(d, cmd, arg);
714 switch (priv->
tuner) {
716 rtl2832_config = &rtl28xxu_rtl2832_fc0012_config;
719 rtl2832_config = &rtl28xxu_rtl2832_fc0013_config;
723 rtl2832_config = &rtl28xxu_rtl2832_fc0012_config;
726 rtl2832_config = &rtl28xxu_rtl2832_tua9001_config;
729 rtl2832_config = &rtl28xxu_rtl2832_e4000_config;
746 adap->
fe[0]->callback = rtl2832u_frontend_callback;
750 dev_dbg(&d->
udev->dev,
"%s: failed=%d\n", __func__, ret);
777 .AgcMasterByte = 0x00,
793 switch (priv->
tuner) {
796 rtl2830_tuner_i2c, &rtl28xxu_qt1010_config);
800 rtl2830_tuner_i2c, &rtl28xxu_mt2060_config,
805 rtl2830_tuner_i2c, &rtl28xxu_mxl5005s_config);
809 dev_err(&d->
udev->dev,
"%s: unknown tuner=%d\n", KBUILD_MODNAME,
820 dev_dbg(&d->
udev->dev,
"%s: failed=%d\n", __func__, ret);
824 static const struct e4000_config rtl2832u_e4000_config = {
847 switch (priv->
tuner) {
854 adap->
fe[0]->ops.read_signal_strength =
855 adap->
fe[0]->ops.tuner_ops.get_rf_strength;
863 adap->
fe[0]->ops.read_signal_strength =
864 adap->
fe[0]->ops.tuner_ops.get_rf_strength;
868 &rtl2832u_e4000_config);
872 &rtl2832u_fc2580_config);
885 &rtl2832u_tua9001_config);
889 dev_err(&d->
udev->dev,
"%s: unknown tuner=%d\n", KBUILD_MODNAME,
900 dev_dbg(&d->
udev->dev,
"%s: failed=%d\n", __func__, ret);
934 dev_dbg(&d->
udev->dev,
"%s: failed=%d\n", __func__, ret);
941 u8 gpio, sys0, epa_ctl[2];
943 dev_dbg(&d->
udev->dev,
"%s: onoff=%d\n", __func__, onoff);
946 ret = rtl28xx_rd_reg(d,
SYS_SYS0, &sys0);
955 dev_dbg(&d->
udev->dev,
"%s: RD SYS0=%02x GPIO_OUT_VAL=%02x\n", __func__,
970 sys0 = sys0 & (~0xc0);
975 dev_dbg(&d->
udev->dev,
"%s: WR SYS0=%02x GPIO_OUT_VAL=%02x\n", __func__,
979 ret = rtl28xx_wr_reg(d,
SYS_SYS0, sys0);
998 dev_dbg(&d->
udev->dev,
"%s: failed=%d\n", __func__, ret);
1002 static int rtl2832u_power_ctrl(
struct dvb_usb_device *d,
int onoff)
1007 dev_dbg(&d->
udev->dev,
"%s: onoff=%d\n", __func__, onoff);
1070 ret = rtl28xx_wr_regs(d,
USB_EPA_CTL,
"\x00\x00", 2);
1112 ret = rtl28xx_wr_regs(d,
USB_EPA_CTL,
"\x10\x02", 2);
1119 dev_dbg(&d->
udev->dev,
"%s: failed=%d\n", __func__, ret);
1149 for (i = 0; i <
ARRAY_SIZE(rc_nec_tab); i++) {
1150 ret = rtl28xx_wr_reg(d, rc_nec_tab[i].reg,
1162 if (buf[4] & 0x01) {
1163 if (buf[2] == (
u8) ~buf[3]) {
1164 if (buf[0] == (
u8) ~buf[1]) {
1166 rc_code = buf[0] << 8 | buf[2];
1169 rc_code = buf[0] << 16 |
1170 buf[1] << 8 | buf[2];
1174 rc_code = buf[0] << 24 | buf[1] << 16 |
1175 buf[2] << 8 | buf[3];
1192 dev_dbg(&d->
udev->dev,
"%s: failed=%d\n", __func__, ret);
1201 rc->
query = rtl2831u_rc_query;
1232 for (i = 0; i <
ARRAY_SIZE(rc_nec_tab); i++) {
1233 ret = rtl28xx_wr_reg(d, rc_nec_tab[i].reg,
1241 ret = rtl28xx_rd_reg(d,
IR_RX_IF, &buf[0]);
1248 ret = rtl28xx_rd_reg(d,
IR_RX_BC, &buf[0]);
1253 ret = rtl2831_rd_regs(d,
IR_RX_BUF, buf, len);
1257 ret = rtl28xx_wr_reg(d,
IR_RX_IF, 0x03);
1264 dev_dbg(&d->
udev->dev,
"%s: failed=%d\n", __func__, ret);
1273 rc->
query = rtl2832u_rc_query;
1280 .driver_name = KBUILD_MODNAME,
1285 .power_ctrl = rtl2831u_power_ctrl,
1286 .i2c_algo = &rtl28xxu_i2c_algo,
1287 .read_config = rtl2831u_read_config,
1288 .frontend_attach = rtl2831u_frontend_attach,
1289 .tuner_attach = rtl2831u_tuner_attach,
1290 .init = rtl28xxu_init,
1291 .get_rc_config = rtl2831u_get_rc_config,
1302 .driver_name = KBUILD_MODNAME,
1307 .power_ctrl = rtl2832u_power_ctrl,
1308 .i2c_algo = &rtl28xxu_i2c_algo,
1309 .read_config = rtl2832u_read_config,
1310 .frontend_attach = rtl2832u_frontend_attach,
1311 .tuner_attach = rtl2832u_tuner_attach,
1312 .init = rtl28xxu_init,
1313 .get_rc_config = rtl2832u_get_rc_config,
1325 &rtl2831u_props,
"Realtek RTL2831U reference design",
NULL) },
1327 &rtl2831u_props,
"Freecom USB2.0 DVB-T",
NULL) },
1329 &rtl2831u_props,
"Freecom USB2.0 DVB-T",
NULL) },
1332 &rtl2832u_props,
"Realtek RTL2832U reference design",
NULL) },
1334 &rtl2832u_props,
"Realtek RTL2832U reference design",
NULL) },
1336 &rtl2832u_props,
"Terratec Cinergy T Stick Black",
NULL) },
1338 &rtl2832u_props,
"G-Tek Electronics Group Lifeview LV5TDLX DVB-T",
NULL) },
1340 &rtl2832u_props,
"NOXON DAB/DAB+ USB dongle",
NULL) },
1342 &rtl2832u_props,
"Trekstor DVB-T Stick Terres 2.0",
NULL) },
1344 &rtl2832u_props,
"Dexatek DK DVB-T Dongle",
NULL) },
1346 &rtl2832u_props,
"DigitalNow Quad DVB-T Receiver",
NULL) },
1348 &rtl2832u_props,
"TerraTec Cinergy T Stick RC (Rev. 3)",
NULL) },
1350 &rtl2832u_props,
"Dexatek DK mini DVB-T Dongle",
NULL) },
1352 &rtl2832u_props,
"TerraTec Cinergy T Stick+",
NULL) },
1357 static struct usb_driver rtl28xxu_usb_driver = {
1358 .name = KBUILD_MODNAME,
1359 .id_table = rtl28xxu_id_table,