rtl28xxu.c 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788
  1. /*
  2. * Realtek RTL28xxU DVB USB driver
  3. *
  4. * Copyright (C) 2009 Antti Palosaari <crope@iki.fi>
  5. * Copyright (C) 2011 Antti Palosaari <crope@iki.fi>
  6. * Copyright (C) 2012 Thomas Mair <thomas.mair86@googlemail.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License along
  19. * with this program; if not, write to the Free Software Foundation, Inc.,
  20. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  21. */
  22. #include "rtl28xxu.h"
  23. static int rtl28xxu_disable_rc;
  24. module_param_named(disable_rc, rtl28xxu_disable_rc, int, 0644);
  25. MODULE_PARM_DESC(disable_rc, "disable RTL2832U remote controller");
  26. DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
  27. static int rtl28xxu_ctrl_msg(struct dvb_usb_device *d, struct rtl28xxu_req *req)
  28. {
  29. struct rtl28xxu_dev *dev = d->priv;
  30. int ret;
  31. unsigned int pipe;
  32. u8 requesttype;
  33. if (req->index & CMD_WR_FLAG) {
  34. /* write */
  35. memcpy(dev->buf, req->data, req->size);
  36. requesttype = (USB_TYPE_VENDOR | USB_DIR_OUT);
  37. pipe = usb_sndctrlpipe(d->udev, 0);
  38. } else {
  39. /* read */
  40. requesttype = (USB_TYPE_VENDOR | USB_DIR_IN);
  41. pipe = usb_rcvctrlpipe(d->udev, 0);
  42. }
  43. ret = usb_control_msg(d->udev, pipe, 0, requesttype, req->value,
  44. req->index, dev->buf, req->size, 1000);
  45. dvb_usb_dbg_usb_control_msg(d->udev, 0, requesttype, req->value,
  46. req->index, dev->buf, req->size);
  47. if (ret < 0)
  48. goto err;
  49. /* read request, copy returned data to return buf */
  50. if (requesttype == (USB_TYPE_VENDOR | USB_DIR_IN))
  51. memcpy(req->data, dev->buf, req->size);
  52. return 0;
  53. err:
  54. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  55. return ret;
  56. }
  57. static int rtl28xxu_wr_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
  58. {
  59. struct rtl28xxu_req req;
  60. if (reg < 0x3000)
  61. req.index = CMD_USB_WR;
  62. else if (reg < 0x4000)
  63. req.index = CMD_SYS_WR;
  64. else
  65. req.index = CMD_IR_WR;
  66. req.value = reg;
  67. req.size = len;
  68. req.data = val;
  69. return rtl28xxu_ctrl_msg(d, &req);
  70. }
  71. static int rtl28xxu_rd_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
  72. {
  73. struct rtl28xxu_req req;
  74. if (reg < 0x3000)
  75. req.index = CMD_USB_RD;
  76. else if (reg < 0x4000)
  77. req.index = CMD_SYS_RD;
  78. else
  79. req.index = CMD_IR_RD;
  80. req.value = reg;
  81. req.size = len;
  82. req.data = val;
  83. return rtl28xxu_ctrl_msg(d, &req);
  84. }
  85. static int rtl28xxu_wr_reg(struct dvb_usb_device *d, u16 reg, u8 val)
  86. {
  87. return rtl28xxu_wr_regs(d, reg, &val, 1);
  88. }
  89. static int rtl28xxu_rd_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
  90. {
  91. return rtl28xxu_rd_regs(d, reg, val, 1);
  92. }
  93. static int rtl28xxu_wr_reg_mask(struct dvb_usb_device *d, u16 reg, u8 val,
  94. u8 mask)
  95. {
  96. int ret;
  97. u8 tmp;
  98. /* no need for read if whole reg is written */
  99. if (mask != 0xff) {
  100. ret = rtl28xxu_rd_reg(d, reg, &tmp);
  101. if (ret)
  102. return ret;
  103. val &= mask;
  104. tmp &= ~mask;
  105. val |= tmp;
  106. }
  107. return rtl28xxu_wr_reg(d, reg, val);
  108. }
  109. /* I2C */
  110. static int rtl28xxu_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
  111. int num)
  112. {
  113. int ret;
  114. struct dvb_usb_device *d = i2c_get_adapdata(adap);
  115. struct rtl28xxu_dev *dev = d->priv;
  116. struct rtl28xxu_req req;
  117. /*
  118. * It is not known which are real I2C bus xfer limits, but testing
  119. * with RTL2831U + MT2060 gives max RD 24 and max WR 22 bytes.
  120. * TODO: find out RTL2832U lens
  121. */
  122. /*
  123. * I2C adapter logic looks rather complicated due to fact it handles
  124. * three different access methods. Those methods are;
  125. * 1) integrated demod access
  126. * 2) old I2C access
  127. * 3) new I2C access
  128. *
  129. * Used method is selected in order 1, 2, 3. Method 3 can handle all
  130. * requests but there is two reasons why not use it always;
  131. * 1) It is most expensive, usually two USB messages are needed
  132. * 2) At least RTL2831U does not support it
  133. *
  134. * Method 3 is needed in case of I2C write+read (typical register read)
  135. * where write is more than one byte.
  136. */
  137. if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
  138. return -EAGAIN;
  139. if (num == 2 && !(msg[0].flags & I2C_M_RD) &&
  140. (msg[1].flags & I2C_M_RD)) {
  141. if (msg[0].len > 24 || msg[1].len > 24) {
  142. /* TODO: check msg[0].len max */
  143. ret = -EOPNOTSUPP;
  144. goto err_mutex_unlock;
  145. } else if (msg[0].addr == 0x10) {
  146. /* method 1 - integrated demod */
  147. req.value = (msg[0].buf[0] << 8) | (msg[0].addr << 1);
  148. req.index = CMD_DEMOD_RD | dev->page;
  149. req.size = msg[1].len;
  150. req.data = &msg[1].buf[0];
  151. ret = rtl28xxu_ctrl_msg(d, &req);
  152. } else if (msg[0].len < 2) {
  153. /* method 2 - old I2C */
  154. req.value = (msg[0].buf[0] << 8) | (msg[0].addr << 1);
  155. req.index = CMD_I2C_RD;
  156. req.size = msg[1].len;
  157. req.data = &msg[1].buf[0];
  158. ret = rtl28xxu_ctrl_msg(d, &req);
  159. } else {
  160. /* method 3 - new I2C */
  161. req.value = (msg[0].addr << 1);
  162. req.index = CMD_I2C_DA_WR;
  163. req.size = msg[0].len;
  164. req.data = msg[0].buf;
  165. ret = rtl28xxu_ctrl_msg(d, &req);
  166. if (ret)
  167. goto err_mutex_unlock;
  168. req.value = (msg[0].addr << 1);
  169. req.index = CMD_I2C_DA_RD;
  170. req.size = msg[1].len;
  171. req.data = msg[1].buf;
  172. ret = rtl28xxu_ctrl_msg(d, &req);
  173. }
  174. } else if (num == 1 && !(msg[0].flags & I2C_M_RD)) {
  175. if (msg[0].len > 22) {
  176. /* TODO: check msg[0].len max */
  177. ret = -EOPNOTSUPP;
  178. goto err_mutex_unlock;
  179. } else if (msg[0].addr == 0x10) {
  180. /* method 1 - integrated demod */
  181. if (msg[0].buf[0] == 0x00) {
  182. /* save demod page for later demod access */
  183. dev->page = msg[0].buf[1];
  184. ret = 0;
  185. } else {
  186. req.value = (msg[0].buf[0] << 8) |
  187. (msg[0].addr << 1);
  188. req.index = CMD_DEMOD_WR | dev->page;
  189. req.size = msg[0].len-1;
  190. req.data = &msg[0].buf[1];
  191. ret = rtl28xxu_ctrl_msg(d, &req);
  192. }
  193. } else if (msg[0].len < 23) {
  194. /* method 2 - old I2C */
  195. req.value = (msg[0].buf[0] << 8) | (msg[0].addr << 1);
  196. req.index = CMD_I2C_WR;
  197. req.size = msg[0].len-1;
  198. req.data = &msg[0].buf[1];
  199. ret = rtl28xxu_ctrl_msg(d, &req);
  200. } else {
  201. /* method 3 - new I2C */
  202. req.value = (msg[0].addr << 1);
  203. req.index = CMD_I2C_DA_WR;
  204. req.size = msg[0].len;
  205. req.data = msg[0].buf;
  206. ret = rtl28xxu_ctrl_msg(d, &req);
  207. }
  208. } else {
  209. ret = -EINVAL;
  210. }
  211. err_mutex_unlock:
  212. mutex_unlock(&d->i2c_mutex);
  213. return ret ? ret : num;
  214. }
  215. static u32 rtl28xxu_i2c_func(struct i2c_adapter *adapter)
  216. {
  217. return I2C_FUNC_I2C;
  218. }
  219. static struct i2c_algorithm rtl28xxu_i2c_algo = {
  220. .master_xfer = rtl28xxu_i2c_xfer,
  221. .functionality = rtl28xxu_i2c_func,
  222. };
  223. static int rtl2831u_read_config(struct dvb_usb_device *d)
  224. {
  225. struct rtl28xxu_dev *dev = d_to_priv(d);
  226. int ret;
  227. u8 buf[1];
  228. /* open RTL2831U/RTL2830 I2C gate */
  229. struct rtl28xxu_req req_gate_open = {0x0120, 0x0011, 0x0001, "\x08"};
  230. /* tuner probes */
  231. struct rtl28xxu_req req_mt2060 = {0x00c0, CMD_I2C_RD, 1, buf};
  232. struct rtl28xxu_req req_qt1010 = {0x0fc4, CMD_I2C_RD, 1, buf};
  233. dev_dbg(&d->intf->dev, "\n");
  234. /*
  235. * RTL2831U GPIOs
  236. * =========================================================
  237. * GPIO0 | tuner#0 | 0 off | 1 on | MXL5005S (?)
  238. * GPIO2 | LED | 0 off | 1 on |
  239. * GPIO4 | tuner#1 | 0 on | 1 off | MT2060
  240. */
  241. /* GPIO direction */
  242. ret = rtl28xxu_wr_reg(d, SYS_GPIO_DIR, 0x0a);
  243. if (ret)
  244. goto err;
  245. /* enable as output GPIO0, GPIO2, GPIO4 */
  246. ret = rtl28xxu_wr_reg(d, SYS_GPIO_OUT_EN, 0x15);
  247. if (ret)
  248. goto err;
  249. /*
  250. * Probe used tuner. We need to know used tuner before demod attach
  251. * since there is some demod params needed to set according to tuner.
  252. */
  253. /* demod needs some time to wake up */
  254. msleep(20);
  255. dev->tuner_name = "NONE";
  256. /* open demod I2C gate */
  257. ret = rtl28xxu_ctrl_msg(d, &req_gate_open);
  258. if (ret)
  259. goto err;
  260. /* check QT1010 ID(?) register; reg=0f val=2c */
  261. ret = rtl28xxu_ctrl_msg(d, &req_qt1010);
  262. if (ret == 0 && buf[0] == 0x2c) {
  263. dev->tuner = TUNER_RTL2830_QT1010;
  264. dev->tuner_name = "QT1010";
  265. goto found;
  266. }
  267. /* open demod I2C gate */
  268. ret = rtl28xxu_ctrl_msg(d, &req_gate_open);
  269. if (ret)
  270. goto err;
  271. /* check MT2060 ID register; reg=00 val=63 */
  272. ret = rtl28xxu_ctrl_msg(d, &req_mt2060);
  273. if (ret == 0 && buf[0] == 0x63) {
  274. dev->tuner = TUNER_RTL2830_MT2060;
  275. dev->tuner_name = "MT2060";
  276. goto found;
  277. }
  278. /* assume MXL5005S */
  279. dev->tuner = TUNER_RTL2830_MXL5005S;
  280. dev->tuner_name = "MXL5005S";
  281. goto found;
  282. found:
  283. dev_dbg(&d->intf->dev, "tuner=%s\n", dev->tuner_name);
  284. return 0;
  285. err:
  286. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  287. return ret;
  288. }
  289. static int rtl2832u_read_config(struct dvb_usb_device *d)
  290. {
  291. struct rtl28xxu_dev *dev = d_to_priv(d);
  292. int ret;
  293. u8 buf[2];
  294. /* open RTL2832U/RTL2832 I2C gate */
  295. struct rtl28xxu_req req_gate_open = {0x0120, 0x0011, 0x0001, "\x18"};
  296. /* close RTL2832U/RTL2832 I2C gate */
  297. struct rtl28xxu_req req_gate_close = {0x0120, 0x0011, 0x0001, "\x10"};
  298. /* tuner probes */
  299. struct rtl28xxu_req req_fc0012 = {0x00c6, CMD_I2C_RD, 1, buf};
  300. struct rtl28xxu_req req_fc0013 = {0x00c6, CMD_I2C_RD, 1, buf};
  301. struct rtl28xxu_req req_mt2266 = {0x00c0, CMD_I2C_RD, 1, buf};
  302. struct rtl28xxu_req req_fc2580 = {0x01ac, CMD_I2C_RD, 1, buf};
  303. struct rtl28xxu_req req_mt2063 = {0x00c0, CMD_I2C_RD, 1, buf};
  304. struct rtl28xxu_req req_max3543 = {0x00c0, CMD_I2C_RD, 1, buf};
  305. struct rtl28xxu_req req_tua9001 = {0x7ec0, CMD_I2C_RD, 2, buf};
  306. struct rtl28xxu_req req_mxl5007t = {0xd9c0, CMD_I2C_RD, 1, buf};
  307. struct rtl28xxu_req req_e4000 = {0x02c8, CMD_I2C_RD, 1, buf};
  308. struct rtl28xxu_req req_tda18272 = {0x00c0, CMD_I2C_RD, 2, buf};
  309. struct rtl28xxu_req req_r820t = {0x0034, CMD_I2C_RD, 1, buf};
  310. struct rtl28xxu_req req_r828d = {0x0074, CMD_I2C_RD, 1, buf};
  311. struct rtl28xxu_req req_mn88472 = {0xff38, CMD_I2C_RD, 1, buf};
  312. struct rtl28xxu_req req_mn88473 = {0xff38, CMD_I2C_RD, 1, buf};
  313. dev_dbg(&d->intf->dev, "\n");
  314. /* enable GPIO3 and GPIO6 as output */
  315. ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_DIR, 0x00, 0x40);
  316. if (ret)
  317. goto err;
  318. ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_EN, 0x48, 0x48);
  319. if (ret)
  320. goto err;
  321. /*
  322. * Probe used tuner. We need to know used tuner before demod attach
  323. * since there is some demod params needed to set according to tuner.
  324. */
  325. /* open demod I2C gate */
  326. ret = rtl28xxu_ctrl_msg(d, &req_gate_open);
  327. if (ret)
  328. goto err;
  329. dev->tuner_name = "NONE";
  330. /* check FC0012 ID register; reg=00 val=a1 */
  331. ret = rtl28xxu_ctrl_msg(d, &req_fc0012);
  332. if (ret == 0 && buf[0] == 0xa1) {
  333. dev->tuner = TUNER_RTL2832_FC0012;
  334. dev->tuner_name = "FC0012";
  335. goto tuner_found;
  336. }
  337. /* check FC0013 ID register; reg=00 val=a3 */
  338. ret = rtl28xxu_ctrl_msg(d, &req_fc0013);
  339. if (ret == 0 && buf[0] == 0xa3) {
  340. dev->tuner = TUNER_RTL2832_FC0013;
  341. dev->tuner_name = "FC0013";
  342. goto tuner_found;
  343. }
  344. /* check MT2266 ID register; reg=00 val=85 */
  345. ret = rtl28xxu_ctrl_msg(d, &req_mt2266);
  346. if (ret == 0 && buf[0] == 0x85) {
  347. dev->tuner = TUNER_RTL2832_MT2266;
  348. dev->tuner_name = "MT2266";
  349. goto tuner_found;
  350. }
  351. /* check FC2580 ID register; reg=01 val=56 */
  352. ret = rtl28xxu_ctrl_msg(d, &req_fc2580);
  353. if (ret == 0 && buf[0] == 0x56) {
  354. dev->tuner = TUNER_RTL2832_FC2580;
  355. dev->tuner_name = "FC2580";
  356. goto tuner_found;
  357. }
  358. /* check MT2063 ID register; reg=00 val=9e || 9c */
  359. ret = rtl28xxu_ctrl_msg(d, &req_mt2063);
  360. if (ret == 0 && (buf[0] == 0x9e || buf[0] == 0x9c)) {
  361. dev->tuner = TUNER_RTL2832_MT2063;
  362. dev->tuner_name = "MT2063";
  363. goto tuner_found;
  364. }
  365. /* check MAX3543 ID register; reg=00 val=38 */
  366. ret = rtl28xxu_ctrl_msg(d, &req_max3543);
  367. if (ret == 0 && buf[0] == 0x38) {
  368. dev->tuner = TUNER_RTL2832_MAX3543;
  369. dev->tuner_name = "MAX3543";
  370. goto tuner_found;
  371. }
  372. /* check TUA9001 ID register; reg=7e val=2328 */
  373. ret = rtl28xxu_ctrl_msg(d, &req_tua9001);
  374. if (ret == 0 && buf[0] == 0x23 && buf[1] == 0x28) {
  375. dev->tuner = TUNER_RTL2832_TUA9001;
  376. dev->tuner_name = "TUA9001";
  377. goto tuner_found;
  378. }
  379. /* check MXL5007R ID register; reg=d9 val=14 */
  380. ret = rtl28xxu_ctrl_msg(d, &req_mxl5007t);
  381. if (ret == 0 && buf[0] == 0x14) {
  382. dev->tuner = TUNER_RTL2832_MXL5007T;
  383. dev->tuner_name = "MXL5007T";
  384. goto tuner_found;
  385. }
  386. /* check E4000 ID register; reg=02 val=40 */
  387. ret = rtl28xxu_ctrl_msg(d, &req_e4000);
  388. if (ret == 0 && buf[0] == 0x40) {
  389. dev->tuner = TUNER_RTL2832_E4000;
  390. dev->tuner_name = "E4000";
  391. goto tuner_found;
  392. }
  393. /* check TDA18272 ID register; reg=00 val=c760 */
  394. ret = rtl28xxu_ctrl_msg(d, &req_tda18272);
  395. if (ret == 0 && (buf[0] == 0xc7 || buf[1] == 0x60)) {
  396. dev->tuner = TUNER_RTL2832_TDA18272;
  397. dev->tuner_name = "TDA18272";
  398. goto tuner_found;
  399. }
  400. /* check R820T ID register; reg=00 val=69 */
  401. ret = rtl28xxu_ctrl_msg(d, &req_r820t);
  402. if (ret == 0 && buf[0] == 0x69) {
  403. dev->tuner = TUNER_RTL2832_R820T;
  404. dev->tuner_name = "R820T";
  405. goto tuner_found;
  406. }
  407. /* check R828D ID register; reg=00 val=69 */
  408. ret = rtl28xxu_ctrl_msg(d, &req_r828d);
  409. if (ret == 0 && buf[0] == 0x69) {
  410. dev->tuner = TUNER_RTL2832_R828D;
  411. dev->tuner_name = "R828D";
  412. goto tuner_found;
  413. }
  414. tuner_found:
  415. dev_dbg(&d->intf->dev, "tuner=%s\n", dev->tuner_name);
  416. /* probe slave demod */
  417. if (dev->tuner == TUNER_RTL2832_R828D) {
  418. /* power on MN88472 demod on GPIO0 */
  419. ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, 0x01, 0x01);
  420. if (ret)
  421. goto err;
  422. ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_DIR, 0x00, 0x01);
  423. if (ret)
  424. goto err;
  425. ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_EN, 0x01, 0x01);
  426. if (ret)
  427. goto err;
  428. /* check MN88472 answers */
  429. ret = rtl28xxu_ctrl_msg(d, &req_mn88472);
  430. if (ret == 0 && buf[0] == 0x02) {
  431. dev_dbg(&d->intf->dev, "MN88472 found\n");
  432. dev->slave_demod = SLAVE_DEMOD_MN88472;
  433. goto demod_found;
  434. }
  435. ret = rtl28xxu_ctrl_msg(d, &req_mn88473);
  436. if (ret == 0 && buf[0] == 0x03) {
  437. dev_dbg(&d->intf->dev, "MN88473 found\n");
  438. dev->slave_demod = SLAVE_DEMOD_MN88473;
  439. goto demod_found;
  440. }
  441. }
  442. demod_found:
  443. /* close demod I2C gate */
  444. ret = rtl28xxu_ctrl_msg(d, &req_gate_close);
  445. if (ret < 0)
  446. goto err;
  447. return 0;
  448. err:
  449. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  450. return ret;
  451. }
  452. static int rtl28xxu_read_config(struct dvb_usb_device *d)
  453. {
  454. struct rtl28xxu_dev *dev = d_to_priv(d);
  455. if (dev->chip_id == CHIP_ID_RTL2831U)
  456. return rtl2831u_read_config(d);
  457. else
  458. return rtl2832u_read_config(d);
  459. }
  460. static int rtl28xxu_identify_state(struct dvb_usb_device *d, const char **name)
  461. {
  462. struct rtl28xxu_dev *dev = d_to_priv(d);
  463. int ret;
  464. struct rtl28xxu_req req_demod_i2c = {0x0020, CMD_I2C_DA_RD, 0, NULL};
  465. dev_dbg(&d->intf->dev, "\n");
  466. /*
  467. * Detect chip type using I2C command that is not supported
  468. * by old RTL2831U.
  469. */
  470. ret = rtl28xxu_ctrl_msg(d, &req_demod_i2c);
  471. if (ret == -EPIPE) {
  472. dev->chip_id = CHIP_ID_RTL2831U;
  473. } else if (ret == 0) {
  474. dev->chip_id = CHIP_ID_RTL2832U;
  475. } else {
  476. dev_err(&d->intf->dev, "chip type detection failed %d\n", ret);
  477. goto err;
  478. }
  479. dev_dbg(&d->intf->dev, "chip_id=%u\n", dev->chip_id);
  480. return WARM;
  481. err:
  482. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  483. return ret;
  484. }
  485. static const struct rtl2830_platform_data rtl2830_mt2060_platform_data = {
  486. .clk = 28800000,
  487. .spec_inv = 1,
  488. .vtop = 0x20,
  489. .krf = 0x04,
  490. .agc_targ_val = 0x2d,
  491. };
  492. static const struct rtl2830_platform_data rtl2830_qt1010_platform_data = {
  493. .clk = 28800000,
  494. .spec_inv = 1,
  495. .vtop = 0x20,
  496. .krf = 0x04,
  497. .agc_targ_val = 0x2d,
  498. };
  499. static const struct rtl2830_platform_data rtl2830_mxl5005s_platform_data = {
  500. .clk = 28800000,
  501. .spec_inv = 0,
  502. .vtop = 0x3f,
  503. .krf = 0x04,
  504. .agc_targ_val = 0x3e,
  505. };
  506. static int rtl2831u_frontend_attach(struct dvb_usb_adapter *adap)
  507. {
  508. struct dvb_usb_device *d = adap_to_d(adap);
  509. struct rtl28xxu_dev *dev = d_to_priv(d);
  510. struct rtl2830_platform_data *pdata = &dev->rtl2830_platform_data;
  511. struct i2c_board_info board_info;
  512. struct i2c_client *client;
  513. int ret;
  514. dev_dbg(&d->intf->dev, "\n");
  515. switch (dev->tuner) {
  516. case TUNER_RTL2830_QT1010:
  517. *pdata = rtl2830_qt1010_platform_data;
  518. break;
  519. case TUNER_RTL2830_MT2060:
  520. *pdata = rtl2830_mt2060_platform_data;
  521. break;
  522. case TUNER_RTL2830_MXL5005S:
  523. *pdata = rtl2830_mxl5005s_platform_data;
  524. break;
  525. default:
  526. dev_err(&d->intf->dev, "unknown tuner %s\n", dev->tuner_name);
  527. ret = -ENODEV;
  528. goto err;
  529. }
  530. /* attach demodulator */
  531. memset(&board_info, 0, sizeof(board_info));
  532. strlcpy(board_info.type, "rtl2830", I2C_NAME_SIZE);
  533. board_info.addr = 0x10;
  534. board_info.platform_data = pdata;
  535. request_module("%s", board_info.type);
  536. client = i2c_new_device(&d->i2c_adap, &board_info);
  537. if (client == NULL || client->dev.driver == NULL) {
  538. ret = -ENODEV;
  539. goto err;
  540. }
  541. if (!try_module_get(client->dev.driver->owner)) {
  542. i2c_unregister_device(client);
  543. ret = -ENODEV;
  544. goto err;
  545. }
  546. adap->fe[0] = pdata->get_dvb_frontend(client);
  547. dev->demod_i2c_adapter = pdata->get_i2c_adapter(client);
  548. dev->i2c_client_demod = client;
  549. return 0;
  550. err:
  551. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  552. return ret;
  553. }
  554. static const struct rtl2832_platform_data rtl2832_fc0012_platform_data = {
  555. .clk = 28800000,
  556. .tuner = TUNER_RTL2832_FC0012
  557. };
  558. static const struct rtl2832_platform_data rtl2832_fc0013_platform_data = {
  559. .clk = 28800000,
  560. .tuner = TUNER_RTL2832_FC0013
  561. };
  562. static const struct rtl2832_platform_data rtl2832_tua9001_platform_data = {
  563. .clk = 28800000,
  564. .tuner = TUNER_RTL2832_TUA9001,
  565. };
  566. static const struct rtl2832_platform_data rtl2832_e4000_platform_data = {
  567. .clk = 28800000,
  568. .tuner = TUNER_RTL2832_E4000,
  569. };
  570. static const struct rtl2832_platform_data rtl2832_r820t_platform_data = {
  571. .clk = 28800000,
  572. .tuner = TUNER_RTL2832_R820T,
  573. };
  574. static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
  575. int cmd, int arg)
  576. {
  577. int ret;
  578. u8 val;
  579. dev_dbg(&d->intf->dev, "cmd=%d arg=%d\n", cmd, arg);
  580. switch (cmd) {
  581. case FC_FE_CALLBACK_VHF_ENABLE:
  582. /* set output values */
  583. ret = rtl28xxu_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
  584. if (ret)
  585. goto err;
  586. if (arg)
  587. val &= 0xbf; /* set GPIO6 low */
  588. else
  589. val |= 0x40; /* set GPIO6 high */
  590. ret = rtl28xxu_wr_reg(d, SYS_GPIO_OUT_VAL, val);
  591. if (ret)
  592. goto err;
  593. break;
  594. default:
  595. ret = -EINVAL;
  596. goto err;
  597. }
  598. return 0;
  599. err:
  600. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  601. return ret;
  602. }
  603. static int rtl2832u_tua9001_tuner_callback(struct dvb_usb_device *d,
  604. int cmd, int arg)
  605. {
  606. int ret;
  607. u8 val;
  608. dev_dbg(&d->intf->dev, "cmd=%d arg=%d\n", cmd, arg);
  609. /*
  610. * CEN always enabled by hardware wiring
  611. * RESETN GPIO4
  612. * RXEN GPIO1
  613. */
  614. switch (cmd) {
  615. case TUA9001_CMD_RESETN:
  616. if (arg)
  617. val = (1 << 4);
  618. else
  619. val = (0 << 4);
  620. ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, val, 0x10);
  621. if (ret)
  622. goto err;
  623. break;
  624. case TUA9001_CMD_RXEN:
  625. if (arg)
  626. val = (1 << 1);
  627. else
  628. val = (0 << 1);
  629. ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, val, 0x02);
  630. if (ret)
  631. goto err;
  632. break;
  633. }
  634. return 0;
  635. err:
  636. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  637. return ret;
  638. }
  639. static int rtl2832u_frontend_callback(void *adapter_priv, int component,
  640. int cmd, int arg)
  641. {
  642. struct i2c_adapter *adapter = adapter_priv;
  643. struct device *parent = adapter->dev.parent;
  644. struct i2c_adapter *parent_adapter;
  645. struct dvb_usb_device *d;
  646. struct rtl28xxu_dev *dev;
  647. /*
  648. * All tuners are connected to demod muxed I2C adapter. We have to
  649. * resolve its parent adapter in order to get handle for this driver
  650. * private data. That is a bit hackish solution, GPIO or direct driver
  651. * callback would be better...
  652. */
  653. if (parent != NULL && parent->type == &i2c_adapter_type)
  654. parent_adapter = to_i2c_adapter(parent);
  655. else
  656. return -EINVAL;
  657. d = i2c_get_adapdata(parent_adapter);
  658. dev = d->priv;
  659. dev_dbg(&d->intf->dev, "component=%d cmd=%d arg=%d\n",
  660. component, cmd, arg);
  661. switch (component) {
  662. case DVB_FRONTEND_COMPONENT_TUNER:
  663. switch (dev->tuner) {
  664. case TUNER_RTL2832_FC0012:
  665. return rtl2832u_fc0012_tuner_callback(d, cmd, arg);
  666. case TUNER_RTL2832_TUA9001:
  667. return rtl2832u_tua9001_tuner_callback(d, cmd, arg);
  668. }
  669. }
  670. return 0;
  671. }
  672. static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
  673. {
  674. struct dvb_usb_device *d = adap_to_d(adap);
  675. struct rtl28xxu_dev *dev = d_to_priv(d);
  676. struct rtl2832_platform_data *pdata = &dev->rtl2832_platform_data;
  677. struct i2c_board_info board_info;
  678. struct i2c_client *client;
  679. int ret;
  680. dev_dbg(&d->intf->dev, "\n");
  681. switch (dev->tuner) {
  682. case TUNER_RTL2832_FC0012:
  683. *pdata = rtl2832_fc0012_platform_data;
  684. break;
  685. case TUNER_RTL2832_FC0013:
  686. *pdata = rtl2832_fc0013_platform_data;
  687. break;
  688. case TUNER_RTL2832_FC2580:
  689. /* FIXME: do not abuse fc0012 settings */
  690. *pdata = rtl2832_fc0012_platform_data;
  691. break;
  692. case TUNER_RTL2832_TUA9001:
  693. *pdata = rtl2832_tua9001_platform_data;
  694. break;
  695. case TUNER_RTL2832_E4000:
  696. *pdata = rtl2832_e4000_platform_data;
  697. break;
  698. case TUNER_RTL2832_R820T:
  699. case TUNER_RTL2832_R828D:
  700. *pdata = rtl2832_r820t_platform_data;
  701. break;
  702. default:
  703. dev_err(&d->intf->dev, "unknown tuner %s\n", dev->tuner_name);
  704. ret = -ENODEV;
  705. goto err;
  706. }
  707. /* attach demodulator */
  708. memset(&board_info, 0, sizeof(board_info));
  709. strlcpy(board_info.type, "rtl2832", I2C_NAME_SIZE);
  710. board_info.addr = 0x10;
  711. board_info.platform_data = pdata;
  712. request_module("%s", board_info.type);
  713. client = i2c_new_device(&d->i2c_adap, &board_info);
  714. if (client == NULL || client->dev.driver == NULL) {
  715. ret = -ENODEV;
  716. goto err;
  717. }
  718. if (!try_module_get(client->dev.driver->owner)) {
  719. i2c_unregister_device(client);
  720. ret = -ENODEV;
  721. goto err;
  722. }
  723. adap->fe[0] = pdata->get_dvb_frontend(client);
  724. dev->demod_i2c_adapter = pdata->get_i2c_adapter(client);
  725. dev->i2c_client_demod = client;
  726. /* set fe callback */
  727. adap->fe[0]->callback = rtl2832u_frontend_callback;
  728. if (dev->slave_demod) {
  729. struct i2c_board_info info = {};
  730. /*
  731. * We continue on reduced mode, without DVB-T2/C, using master
  732. * demod, when slave demod fails.
  733. */
  734. ret = 0;
  735. /* attach slave demodulator */
  736. if (dev->slave_demod == SLAVE_DEMOD_MN88472) {
  737. struct mn88472_config mn88472_config = {};
  738. mn88472_config.fe = &adap->fe[1];
  739. mn88472_config.i2c_wr_max = 22,
  740. strlcpy(info.type, "mn88472", I2C_NAME_SIZE);
  741. mn88472_config.xtal = 20500000;
  742. mn88472_config.ts_mode = SERIAL_TS_MODE;
  743. mn88472_config.ts_clock = VARIABLE_TS_CLOCK;
  744. info.addr = 0x18;
  745. info.platform_data = &mn88472_config;
  746. request_module(info.type);
  747. client = i2c_new_device(&d->i2c_adap, &info);
  748. if (client == NULL || client->dev.driver == NULL) {
  749. dev->slave_demod = SLAVE_DEMOD_NONE;
  750. goto err_slave_demod_failed;
  751. }
  752. if (!try_module_get(client->dev.driver->owner)) {
  753. i2c_unregister_device(client);
  754. dev->slave_demod = SLAVE_DEMOD_NONE;
  755. goto err_slave_demod_failed;
  756. }
  757. dev->i2c_client_slave_demod = client;
  758. } else {
  759. struct mn88473_config mn88473_config = {};
  760. mn88473_config.fe = &adap->fe[1];
  761. mn88473_config.i2c_wr_max = 22,
  762. strlcpy(info.type, "mn88473", I2C_NAME_SIZE);
  763. info.addr = 0x18;
  764. info.platform_data = &mn88473_config;
  765. request_module(info.type);
  766. client = i2c_new_device(&d->i2c_adap, &info);
  767. if (client == NULL || client->dev.driver == NULL) {
  768. dev->slave_demod = SLAVE_DEMOD_NONE;
  769. goto err_slave_demod_failed;
  770. }
  771. if (!try_module_get(client->dev.driver->owner)) {
  772. i2c_unregister_device(client);
  773. dev->slave_demod = SLAVE_DEMOD_NONE;
  774. goto err_slave_demod_failed;
  775. }
  776. dev->i2c_client_slave_demod = client;
  777. }
  778. }
  779. return 0;
  780. err_slave_demod_failed:
  781. err:
  782. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  783. return ret;
  784. }
  785. static int rtl28xxu_frontend_attach(struct dvb_usb_adapter *adap)
  786. {
  787. struct rtl28xxu_dev *dev = adap_to_priv(adap);
  788. if (dev->chip_id == CHIP_ID_RTL2831U)
  789. return rtl2831u_frontend_attach(adap);
  790. else
  791. return rtl2832u_frontend_attach(adap);
  792. }
  793. static int rtl28xxu_frontend_detach(struct dvb_usb_adapter *adap)
  794. {
  795. struct dvb_usb_device *d = adap_to_d(adap);
  796. struct rtl28xxu_dev *dev = d_to_priv(d);
  797. struct i2c_client *client;
  798. dev_dbg(&d->intf->dev, "\n");
  799. /* remove I2C slave demod */
  800. client = dev->i2c_client_slave_demod;
  801. if (client) {
  802. module_put(client->dev.driver->owner);
  803. i2c_unregister_device(client);
  804. }
  805. /* remove I2C demod */
  806. client = dev->i2c_client_demod;
  807. if (client) {
  808. module_put(client->dev.driver->owner);
  809. i2c_unregister_device(client);
  810. }
  811. return 0;
  812. }
  813. static struct qt1010_config rtl28xxu_qt1010_config = {
  814. .i2c_address = 0x62, /* 0xc4 */
  815. };
  816. static struct mt2060_config rtl28xxu_mt2060_config = {
  817. .i2c_address = 0x60, /* 0xc0 */
  818. .clock_out = 0,
  819. };
  820. static struct mxl5005s_config rtl28xxu_mxl5005s_config = {
  821. .i2c_address = 0x63, /* 0xc6 */
  822. .if_freq = IF_FREQ_4570000HZ,
  823. .xtal_freq = CRYSTAL_FREQ_16000000HZ,
  824. .agc_mode = MXL_SINGLE_AGC,
  825. .tracking_filter = MXL_TF_C_H,
  826. .rssi_enable = MXL_RSSI_ENABLE,
  827. .cap_select = MXL_CAP_SEL_ENABLE,
  828. .div_out = MXL_DIV_OUT_4,
  829. .clock_out = MXL_CLOCK_OUT_DISABLE,
  830. .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
  831. .top = MXL5005S_TOP_25P2,
  832. .mod_mode = MXL_DIGITAL_MODE,
  833. .if_mode = MXL_ZERO_IF,
  834. .AgcMasterByte = 0x00,
  835. };
  836. static int rtl2831u_tuner_attach(struct dvb_usb_adapter *adap)
  837. {
  838. int ret;
  839. struct dvb_usb_device *d = adap_to_d(adap);
  840. struct rtl28xxu_dev *dev = d_to_priv(d);
  841. struct dvb_frontend *fe;
  842. dev_dbg(&d->intf->dev, "\n");
  843. switch (dev->tuner) {
  844. case TUNER_RTL2830_QT1010:
  845. fe = dvb_attach(qt1010_attach, adap->fe[0],
  846. dev->demod_i2c_adapter,
  847. &rtl28xxu_qt1010_config);
  848. break;
  849. case TUNER_RTL2830_MT2060:
  850. fe = dvb_attach(mt2060_attach, adap->fe[0],
  851. dev->demod_i2c_adapter,
  852. &rtl28xxu_mt2060_config, 1220);
  853. break;
  854. case TUNER_RTL2830_MXL5005S:
  855. fe = dvb_attach(mxl5005s_attach, adap->fe[0],
  856. dev->demod_i2c_adapter,
  857. &rtl28xxu_mxl5005s_config);
  858. break;
  859. default:
  860. fe = NULL;
  861. dev_err(&d->intf->dev, "unknown tuner %d\n", dev->tuner);
  862. }
  863. if (fe == NULL) {
  864. ret = -ENODEV;
  865. goto err;
  866. }
  867. return 0;
  868. err:
  869. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  870. return ret;
  871. }
  872. static const struct fc2580_config rtl2832u_fc2580_config = {
  873. .i2c_addr = 0x56,
  874. .clock = 16384000,
  875. };
  876. static struct tua9001_config rtl2832u_tua9001_config = {
  877. .i2c_addr = 0x60,
  878. };
  879. static const struct fc0012_config rtl2832u_fc0012_config = {
  880. .i2c_address = 0x63, /* 0xc6 >> 1 */
  881. .xtal_freq = FC_XTAL_28_8_MHZ,
  882. };
  883. static const struct r820t_config rtl2832u_r820t_config = {
  884. .i2c_addr = 0x1a,
  885. .xtal = 28800000,
  886. .max_i2c_msg_len = 2,
  887. .rafael_chip = CHIP_R820T,
  888. };
  889. static const struct r820t_config rtl2832u_r828d_config = {
  890. .i2c_addr = 0x3a,
  891. .xtal = 16000000,
  892. .max_i2c_msg_len = 2,
  893. .rafael_chip = CHIP_R828D,
  894. };
  895. static int rtl2832u_tuner_attach(struct dvb_usb_adapter *adap)
  896. {
  897. int ret;
  898. struct dvb_usb_device *d = adap_to_d(adap);
  899. struct rtl28xxu_dev *dev = d_to_priv(d);
  900. struct dvb_frontend *fe = NULL;
  901. struct i2c_board_info info;
  902. struct i2c_client *client;
  903. struct v4l2_subdev *subdev = NULL;
  904. struct platform_device *pdev;
  905. struct rtl2832_sdr_platform_data pdata;
  906. dev_dbg(&d->intf->dev, "\n");
  907. memset(&info, 0, sizeof(struct i2c_board_info));
  908. memset(&pdata, 0, sizeof(pdata));
  909. switch (dev->tuner) {
  910. case TUNER_RTL2832_FC0012:
  911. fe = dvb_attach(fc0012_attach, adap->fe[0],
  912. dev->demod_i2c_adapter, &rtl2832u_fc0012_config);
  913. /* since fc0012 includs reading the signal strength delegate
  914. * that to the tuner driver */
  915. adap->fe[0]->ops.read_signal_strength =
  916. adap->fe[0]->ops.tuner_ops.get_rf_strength;
  917. break;
  918. case TUNER_RTL2832_FC0013:
  919. fe = dvb_attach(fc0013_attach, adap->fe[0],
  920. dev->demod_i2c_adapter, 0xc6>>1, 0, FC_XTAL_28_8_MHZ);
  921. /* fc0013 also supports signal strength reading */
  922. adap->fe[0]->ops.read_signal_strength =
  923. adap->fe[0]->ops.tuner_ops.get_rf_strength;
  924. break;
  925. case TUNER_RTL2832_E4000: {
  926. struct e4000_config e4000_config = {
  927. .fe = adap->fe[0],
  928. .clock = 28800000,
  929. };
  930. strlcpy(info.type, "e4000", I2C_NAME_SIZE);
  931. info.addr = 0x64;
  932. info.platform_data = &e4000_config;
  933. request_module(info.type);
  934. client = i2c_new_device(dev->demod_i2c_adapter, &info);
  935. if (client == NULL || client->dev.driver == NULL)
  936. break;
  937. if (!try_module_get(client->dev.driver->owner)) {
  938. i2c_unregister_device(client);
  939. break;
  940. }
  941. dev->i2c_client_tuner = client;
  942. subdev = i2c_get_clientdata(client);
  943. }
  944. break;
  945. case TUNER_RTL2832_FC2580:
  946. fe = dvb_attach(fc2580_attach, adap->fe[0],
  947. dev->demod_i2c_adapter,
  948. &rtl2832u_fc2580_config);
  949. break;
  950. case TUNER_RTL2832_TUA9001:
  951. /* enable GPIO1 and GPIO4 as output */
  952. ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_DIR, 0x00, 0x12);
  953. if (ret)
  954. goto err;
  955. ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_EN, 0x12, 0x12);
  956. if (ret)
  957. goto err;
  958. fe = dvb_attach(tua9001_attach, adap->fe[0],
  959. dev->demod_i2c_adapter,
  960. &rtl2832u_tua9001_config);
  961. break;
  962. case TUNER_RTL2832_R820T:
  963. fe = dvb_attach(r820t_attach, adap->fe[0],
  964. dev->demod_i2c_adapter,
  965. &rtl2832u_r820t_config);
  966. /* Use tuner to get the signal strength */
  967. adap->fe[0]->ops.read_signal_strength =
  968. adap->fe[0]->ops.tuner_ops.get_rf_strength;
  969. break;
  970. case TUNER_RTL2832_R828D:
  971. fe = dvb_attach(r820t_attach, adap->fe[0],
  972. dev->demod_i2c_adapter,
  973. &rtl2832u_r828d_config);
  974. adap->fe[0]->ops.read_signal_strength =
  975. adap->fe[0]->ops.tuner_ops.get_rf_strength;
  976. if (adap->fe[1]) {
  977. fe = dvb_attach(r820t_attach, adap->fe[1],
  978. dev->demod_i2c_adapter,
  979. &rtl2832u_r828d_config);
  980. adap->fe[1]->ops.read_signal_strength =
  981. adap->fe[1]->ops.tuner_ops.get_rf_strength;
  982. }
  983. break;
  984. default:
  985. dev_err(&d->intf->dev, "unknown tuner %d\n", dev->tuner);
  986. }
  987. if (fe == NULL && dev->i2c_client_tuner == NULL) {
  988. ret = -ENODEV;
  989. goto err;
  990. }
  991. /* register SDR */
  992. switch (dev->tuner) {
  993. case TUNER_RTL2832_FC0012:
  994. case TUNER_RTL2832_FC0013:
  995. case TUNER_RTL2832_E4000:
  996. case TUNER_RTL2832_R820T:
  997. case TUNER_RTL2832_R828D:
  998. pdata.clk = dev->rtl2832_platform_data.clk;
  999. pdata.tuner = dev->tuner;
  1000. pdata.i2c_client = dev->i2c_client_demod;
  1001. pdata.bulk_read = dev->rtl2832_platform_data.bulk_read;
  1002. pdata.bulk_write = dev->rtl2832_platform_data.bulk_write;
  1003. pdata.update_bits = dev->rtl2832_platform_data.update_bits;
  1004. pdata.dvb_frontend = adap->fe[0];
  1005. pdata.dvb_usb_device = d;
  1006. pdata.v4l2_subdev = subdev;
  1007. request_module("%s", "rtl2832_sdr");
  1008. pdev = platform_device_register_data(&d->intf->dev,
  1009. "rtl2832_sdr",
  1010. PLATFORM_DEVID_AUTO,
  1011. &pdata, sizeof(pdata));
  1012. if (pdev == NULL || pdev->dev.driver == NULL)
  1013. break;
  1014. dev->platform_device_sdr = pdev;
  1015. break;
  1016. default:
  1017. dev_dbg(&d->intf->dev, "no SDR for tuner=%d\n", dev->tuner);
  1018. }
  1019. return 0;
  1020. err:
  1021. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  1022. return ret;
  1023. }
  1024. static int rtl28xxu_tuner_attach(struct dvb_usb_adapter *adap)
  1025. {
  1026. struct rtl28xxu_dev *dev = adap_to_priv(adap);
  1027. if (dev->chip_id == CHIP_ID_RTL2831U)
  1028. return rtl2831u_tuner_attach(adap);
  1029. else
  1030. return rtl2832u_tuner_attach(adap);
  1031. }
  1032. static int rtl28xxu_tuner_detach(struct dvb_usb_adapter *adap)
  1033. {
  1034. struct dvb_usb_device *d = adap_to_d(adap);
  1035. struct rtl28xxu_dev *dev = d_to_priv(d);
  1036. struct i2c_client *client;
  1037. struct platform_device *pdev;
  1038. dev_dbg(&d->intf->dev, "\n");
  1039. /* remove platform SDR */
  1040. pdev = dev->platform_device_sdr;
  1041. if (pdev)
  1042. platform_device_unregister(pdev);
  1043. /* remove I2C tuner */
  1044. client = dev->i2c_client_tuner;
  1045. if (client) {
  1046. module_put(client->dev.driver->owner);
  1047. i2c_unregister_device(client);
  1048. }
  1049. return 0;
  1050. }
  1051. static int rtl28xxu_init(struct dvb_usb_device *d)
  1052. {
  1053. int ret;
  1054. u8 val;
  1055. dev_dbg(&d->intf->dev, "\n");
  1056. /* init USB endpoints */
  1057. ret = rtl28xxu_rd_reg(d, USB_SYSCTL_0, &val);
  1058. if (ret)
  1059. goto err;
  1060. /* enable DMA and Full Packet Mode*/
  1061. val |= 0x09;
  1062. ret = rtl28xxu_wr_reg(d, USB_SYSCTL_0, val);
  1063. if (ret)
  1064. goto err;
  1065. /* set EPA maximum packet size to 0x0200 */
  1066. ret = rtl28xxu_wr_regs(d, USB_EPA_MAXPKT, "\x00\x02\x00\x00", 4);
  1067. if (ret)
  1068. goto err;
  1069. /* change EPA FIFO length */
  1070. ret = rtl28xxu_wr_regs(d, USB_EPA_FIFO_CFG, "\x14\x00\x00\x00", 4);
  1071. if (ret)
  1072. goto err;
  1073. return ret;
  1074. err:
  1075. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  1076. return ret;
  1077. }
  1078. static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
  1079. {
  1080. int ret;
  1081. u8 gpio, sys0, epa_ctl[2];
  1082. dev_dbg(&d->intf->dev, "onoff=%d\n", onoff);
  1083. /* demod adc */
  1084. ret = rtl28xxu_rd_reg(d, SYS_SYS0, &sys0);
  1085. if (ret)
  1086. goto err;
  1087. /* tuner power, read GPIOs */
  1088. ret = rtl28xxu_rd_reg(d, SYS_GPIO_OUT_VAL, &gpio);
  1089. if (ret)
  1090. goto err;
  1091. dev_dbg(&d->intf->dev, "RD SYS0=%02x GPIO_OUT_VAL=%02x\n", sys0, gpio);
  1092. if (onoff) {
  1093. gpio |= 0x01; /* GPIO0 = 1 */
  1094. gpio &= (~0x10); /* GPIO4 = 0 */
  1095. gpio |= 0x04; /* GPIO2 = 1, LED on */
  1096. sys0 = sys0 & 0x0f;
  1097. sys0 |= 0xe0;
  1098. epa_ctl[0] = 0x00; /* clear stall */
  1099. epa_ctl[1] = 0x00; /* clear reset */
  1100. } else {
  1101. gpio &= (~0x01); /* GPIO0 = 0 */
  1102. gpio |= 0x10; /* GPIO4 = 1 */
  1103. gpio &= (~0x04); /* GPIO2 = 1, LED off */
  1104. sys0 = sys0 & (~0xc0);
  1105. epa_ctl[0] = 0x10; /* set stall */
  1106. epa_ctl[1] = 0x02; /* set reset */
  1107. }
  1108. dev_dbg(&d->intf->dev, "WR SYS0=%02x GPIO_OUT_VAL=%02x\n", sys0, gpio);
  1109. /* demod adc */
  1110. ret = rtl28xxu_wr_reg(d, SYS_SYS0, sys0);
  1111. if (ret)
  1112. goto err;
  1113. /* tuner power, write GPIOs */
  1114. ret = rtl28xxu_wr_reg(d, SYS_GPIO_OUT_VAL, gpio);
  1115. if (ret)
  1116. goto err;
  1117. /* streaming EP: stall & reset */
  1118. ret = rtl28xxu_wr_regs(d, USB_EPA_CTL, epa_ctl, 2);
  1119. if (ret)
  1120. goto err;
  1121. if (onoff)
  1122. usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, 0x81));
  1123. return ret;
  1124. err:
  1125. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  1126. return ret;
  1127. }
  1128. static int rtl2832u_power_ctrl(struct dvb_usb_device *d, int onoff)
  1129. {
  1130. int ret;
  1131. dev_dbg(&d->intf->dev, "onoff=%d\n", onoff);
  1132. if (onoff) {
  1133. /* GPIO3=1, GPIO4=0 */
  1134. ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, 0x08, 0x18);
  1135. if (ret)
  1136. goto err;
  1137. /* suspend? */
  1138. ret = rtl28xxu_wr_reg_mask(d, SYS_DEMOD_CTL1, 0x00, 0x10);
  1139. if (ret)
  1140. goto err;
  1141. /* enable PLL */
  1142. ret = rtl28xxu_wr_reg_mask(d, SYS_DEMOD_CTL, 0x80, 0x80);
  1143. if (ret)
  1144. goto err;
  1145. /* disable reset */
  1146. ret = rtl28xxu_wr_reg_mask(d, SYS_DEMOD_CTL, 0x20, 0x20);
  1147. if (ret)
  1148. goto err;
  1149. /* streaming EP: clear stall & reset */
  1150. ret = rtl28xxu_wr_regs(d, USB_EPA_CTL, "\x00\x00", 2);
  1151. if (ret)
  1152. goto err;
  1153. ret = usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, 0x81));
  1154. if (ret)
  1155. goto err;
  1156. } else {
  1157. /* GPIO4=1 */
  1158. ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, 0x10, 0x10);
  1159. if (ret)
  1160. goto err;
  1161. /* disable PLL */
  1162. ret = rtl28xxu_wr_reg_mask(d, SYS_DEMOD_CTL, 0x00, 0x80);
  1163. if (ret)
  1164. goto err;
  1165. /* streaming EP: set stall & reset */
  1166. ret = rtl28xxu_wr_regs(d, USB_EPA_CTL, "\x10\x02", 2);
  1167. if (ret)
  1168. goto err;
  1169. }
  1170. return ret;
  1171. err:
  1172. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  1173. return ret;
  1174. }
  1175. static int rtl28xxu_power_ctrl(struct dvb_usb_device *d, int onoff)
  1176. {
  1177. struct rtl28xxu_dev *dev = d_to_priv(d);
  1178. if (dev->chip_id == CHIP_ID_RTL2831U)
  1179. return rtl2831u_power_ctrl(d, onoff);
  1180. else
  1181. return rtl2832u_power_ctrl(d, onoff);
  1182. }
  1183. static int rtl28xxu_frontend_ctrl(struct dvb_frontend *fe, int onoff)
  1184. {
  1185. struct dvb_usb_device *d = fe_to_d(fe);
  1186. struct rtl28xxu_dev *dev = fe_to_priv(fe);
  1187. struct rtl2832_platform_data *pdata = &dev->rtl2832_platform_data;
  1188. int ret;
  1189. u8 val;
  1190. dev_dbg(&d->intf->dev, "fe=%d onoff=%d\n", fe->id, onoff);
  1191. if (dev->chip_id == CHIP_ID_RTL2831U)
  1192. return 0;
  1193. /* control internal demod ADC */
  1194. if (fe->id == 0 && onoff)
  1195. val = 0x48; /* enable ADC */
  1196. else
  1197. val = 0x00; /* disable ADC */
  1198. ret = rtl28xxu_wr_reg_mask(d, SYS_DEMOD_CTL, val, 0x48);
  1199. if (ret)
  1200. goto err;
  1201. /* bypass slave demod TS through master demod */
  1202. if (fe->id == 1 && onoff) {
  1203. ret = pdata->enable_slave_ts(dev->i2c_client_demod);
  1204. if (ret)
  1205. goto err;
  1206. }
  1207. return 0;
  1208. err:
  1209. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  1210. return ret;
  1211. }
  1212. #if IS_ENABLED(CONFIG_RC_CORE)
  1213. static int rtl2831u_rc_query(struct dvb_usb_device *d)
  1214. {
  1215. int ret, i;
  1216. struct rtl28xxu_dev *dev = d->priv;
  1217. u8 buf[5];
  1218. u32 rc_code;
  1219. struct rtl28xxu_reg_val rc_nec_tab[] = {
  1220. { 0x3033, 0x80 },
  1221. { 0x3020, 0x43 },
  1222. { 0x3021, 0x16 },
  1223. { 0x3022, 0x16 },
  1224. { 0x3023, 0x5a },
  1225. { 0x3024, 0x2d },
  1226. { 0x3025, 0x16 },
  1227. { 0x3026, 0x01 },
  1228. { 0x3028, 0xb0 },
  1229. { 0x3029, 0x04 },
  1230. { 0x302c, 0x88 },
  1231. { 0x302e, 0x13 },
  1232. { 0x3030, 0xdf },
  1233. { 0x3031, 0x05 },
  1234. };
  1235. /* init remote controller */
  1236. if (!dev->rc_active) {
  1237. for (i = 0; i < ARRAY_SIZE(rc_nec_tab); i++) {
  1238. ret = rtl28xxu_wr_reg(d, rc_nec_tab[i].reg,
  1239. rc_nec_tab[i].val);
  1240. if (ret)
  1241. goto err;
  1242. }
  1243. dev->rc_active = true;
  1244. }
  1245. ret = rtl28xxu_rd_regs(d, SYS_IRRC_RP, buf, 5);
  1246. if (ret)
  1247. goto err;
  1248. if (buf[4] & 0x01) {
  1249. if (buf[2] == (u8) ~buf[3]) {
  1250. if (buf[0] == (u8) ~buf[1]) {
  1251. /* NEC standard (16 bit) */
  1252. rc_code = RC_SCANCODE_NEC(buf[0], buf[2]);
  1253. } else {
  1254. /* NEC extended (24 bit) */
  1255. rc_code = RC_SCANCODE_NECX(buf[0] << 8 | buf[1],
  1256. buf[2]);
  1257. }
  1258. } else {
  1259. /* NEC full (32 bit) */
  1260. rc_code = RC_SCANCODE_NEC32(buf[0] << 24 | buf[1] << 16 |
  1261. buf[2] << 8 | buf[3]);
  1262. }
  1263. rc_keydown(d->rc_dev, RC_TYPE_NEC, rc_code, 0);
  1264. ret = rtl28xxu_wr_reg(d, SYS_IRRC_SR, 1);
  1265. if (ret)
  1266. goto err;
  1267. /* repeated intentionally to avoid extra keypress */
  1268. ret = rtl28xxu_wr_reg(d, SYS_IRRC_SR, 1);
  1269. if (ret)
  1270. goto err;
  1271. }
  1272. return ret;
  1273. err:
  1274. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  1275. return ret;
  1276. }
  1277. static int rtl2831u_get_rc_config(struct dvb_usb_device *d,
  1278. struct dvb_usb_rc *rc)
  1279. {
  1280. rc->map_name = RC_MAP_EMPTY;
  1281. rc->allowed_protos = RC_BIT_NEC;
  1282. rc->query = rtl2831u_rc_query;
  1283. rc->interval = 400;
  1284. return 0;
  1285. }
  1286. static int rtl2832u_rc_query(struct dvb_usb_device *d)
  1287. {
  1288. int ret, i, len;
  1289. struct rtl28xxu_dev *dev = d->priv;
  1290. struct ir_raw_event ev;
  1291. u8 buf[128];
  1292. static const struct rtl28xxu_reg_val_mask refresh_tab[] = {
  1293. {IR_RX_IF, 0x03, 0xff},
  1294. {IR_RX_BUF_CTRL, 0x80, 0xff},
  1295. {IR_RX_CTRL, 0x80, 0xff},
  1296. };
  1297. /* init remote controller */
  1298. if (!dev->rc_active) {
  1299. static const struct rtl28xxu_reg_val_mask init_tab[] = {
  1300. {SYS_DEMOD_CTL1, 0x00, 0x04},
  1301. {SYS_DEMOD_CTL1, 0x00, 0x08},
  1302. {USB_CTRL, 0x20, 0x20},
  1303. {SYS_GPIO_DIR, 0x00, 0x08},
  1304. {SYS_GPIO_OUT_EN, 0x08, 0x08},
  1305. {SYS_GPIO_OUT_VAL, 0x08, 0x08},
  1306. {IR_MAX_DURATION0, 0xd0, 0xff},
  1307. {IR_MAX_DURATION1, 0x07, 0xff},
  1308. {IR_IDLE_LEN0, 0xc0, 0xff},
  1309. {IR_IDLE_LEN1, 0x00, 0xff},
  1310. {IR_GLITCH_LEN, 0x03, 0xff},
  1311. {IR_RX_CLK, 0x09, 0xff},
  1312. {IR_RX_CFG, 0x1c, 0xff},
  1313. {IR_MAX_H_TOL_LEN, 0x1e, 0xff},
  1314. {IR_MAX_L_TOL_LEN, 0x1e, 0xff},
  1315. {IR_RX_CTRL, 0x80, 0xff},
  1316. };
  1317. for (i = 0; i < ARRAY_SIZE(init_tab); i++) {
  1318. ret = rtl28xxu_wr_reg_mask(d, init_tab[i].reg,
  1319. init_tab[i].val, init_tab[i].mask);
  1320. if (ret)
  1321. goto err;
  1322. }
  1323. dev->rc_active = true;
  1324. }
  1325. ret = rtl28xxu_rd_reg(d, IR_RX_IF, &buf[0]);
  1326. if (ret)
  1327. goto err;
  1328. if (buf[0] != 0x83)
  1329. goto exit;
  1330. ret = rtl28xxu_rd_reg(d, IR_RX_BC, &buf[0]);
  1331. if (ret)
  1332. goto err;
  1333. len = buf[0];
  1334. /* read raw code from hw */
  1335. ret = rtl28xxu_rd_regs(d, IR_RX_BUF, buf, len);
  1336. if (ret)
  1337. goto err;
  1338. /* let hw receive new code */
  1339. for (i = 0; i < ARRAY_SIZE(refresh_tab); i++) {
  1340. ret = rtl28xxu_wr_reg_mask(d, refresh_tab[i].reg,
  1341. refresh_tab[i].val, refresh_tab[i].mask);
  1342. if (ret)
  1343. goto err;
  1344. }
  1345. /* pass data to Kernel IR decoder */
  1346. init_ir_raw_event(&ev);
  1347. for (i = 0; i < len; i++) {
  1348. ev.pulse = buf[i] >> 7;
  1349. ev.duration = 50800 * (buf[i] & 0x7f);
  1350. ir_raw_event_store_with_filter(d->rc_dev, &ev);
  1351. }
  1352. /* 'flush' ir_raw_event_store_with_filter() */
  1353. ir_raw_event_set_idle(d->rc_dev, true);
  1354. ir_raw_event_handle(d->rc_dev);
  1355. exit:
  1356. return ret;
  1357. err:
  1358. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  1359. return ret;
  1360. }
  1361. static int rtl2832u_get_rc_config(struct dvb_usb_device *d,
  1362. struct dvb_usb_rc *rc)
  1363. {
  1364. /* disable IR interrupts in order to avoid SDR sample loss */
  1365. if (rtl28xxu_disable_rc)
  1366. return rtl28xxu_wr_reg(d, IR_RX_IE, 0x00);
  1367. /* load empty to enable rc */
  1368. if (!rc->map_name)
  1369. rc->map_name = RC_MAP_EMPTY;
  1370. rc->allowed_protos = RC_BIT_ALL;
  1371. rc->driver_type = RC_DRIVER_IR_RAW;
  1372. rc->query = rtl2832u_rc_query;
  1373. rc->interval = 200;
  1374. return 0;
  1375. }
  1376. static int rtl28xxu_get_rc_config(struct dvb_usb_device *d,
  1377. struct dvb_usb_rc *rc)
  1378. {
  1379. struct rtl28xxu_dev *dev = d_to_priv(d);
  1380. if (dev->chip_id == CHIP_ID_RTL2831U)
  1381. return rtl2831u_get_rc_config(d, rc);
  1382. else
  1383. return rtl2832u_get_rc_config(d, rc);
  1384. }
  1385. #else
  1386. #define rtl28xxu_get_rc_config NULL
  1387. #endif
  1388. static int rtl28xxu_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
  1389. {
  1390. struct rtl28xxu_dev *dev = adap_to_priv(adap);
  1391. if (dev->chip_id == CHIP_ID_RTL2831U) {
  1392. struct rtl2830_platform_data *pdata = &dev->rtl2830_platform_data;
  1393. return pdata->pid_filter_ctrl(adap->fe[0], onoff);
  1394. } else {
  1395. struct rtl2832_platform_data *pdata = &dev->rtl2832_platform_data;
  1396. return pdata->pid_filter_ctrl(adap->fe[0], onoff);
  1397. }
  1398. }
  1399. static int rtl28xxu_pid_filter(struct dvb_usb_adapter *adap, int index,
  1400. u16 pid, int onoff)
  1401. {
  1402. struct rtl28xxu_dev *dev = adap_to_priv(adap);
  1403. if (dev->chip_id == CHIP_ID_RTL2831U) {
  1404. struct rtl2830_platform_data *pdata = &dev->rtl2830_platform_data;
  1405. return pdata->pid_filter(adap->fe[0], index, pid, onoff);
  1406. } else {
  1407. struct rtl2832_platform_data *pdata = &dev->rtl2832_platform_data;
  1408. return pdata->pid_filter(adap->fe[0], index, pid, onoff);
  1409. }
  1410. }
  1411. static const struct dvb_usb_device_properties rtl28xxu_props = {
  1412. .driver_name = KBUILD_MODNAME,
  1413. .owner = THIS_MODULE,
  1414. .adapter_nr = adapter_nr,
  1415. .size_of_priv = sizeof(struct rtl28xxu_dev),
  1416. .identify_state = rtl28xxu_identify_state,
  1417. .power_ctrl = rtl28xxu_power_ctrl,
  1418. .frontend_ctrl = rtl28xxu_frontend_ctrl,
  1419. .i2c_algo = &rtl28xxu_i2c_algo,
  1420. .read_config = rtl28xxu_read_config,
  1421. .frontend_attach = rtl28xxu_frontend_attach,
  1422. .frontend_detach = rtl28xxu_frontend_detach,
  1423. .tuner_attach = rtl28xxu_tuner_attach,
  1424. .tuner_detach = rtl28xxu_tuner_detach,
  1425. .init = rtl28xxu_init,
  1426. .get_rc_config = rtl28xxu_get_rc_config,
  1427. .num_adapters = 1,
  1428. .adapter = {
  1429. {
  1430. .caps = DVB_USB_ADAP_HAS_PID_FILTER |
  1431. DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
  1432. .pid_filter_count = 32,
  1433. .pid_filter_ctrl = rtl28xxu_pid_filter_ctrl,
  1434. .pid_filter = rtl28xxu_pid_filter,
  1435. .stream = DVB_USB_STREAM_BULK(0x81, 6, 8 * 512),
  1436. },
  1437. },
  1438. };
  1439. static const struct usb_device_id rtl28xxu_id_table[] = {
  1440. /* RTL2831U devices: */
  1441. { DVB_USB_DEVICE(USB_VID_REALTEK, USB_PID_REALTEK_RTL2831U,
  1442. &rtl28xxu_props, "Realtek RTL2831U reference design", NULL) },
  1443. { DVB_USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_FREECOM_DVBT,
  1444. &rtl28xxu_props, "Freecom USB2.0 DVB-T", NULL) },
  1445. { DVB_USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_FREECOM_DVBT_2,
  1446. &rtl28xxu_props, "Freecom USB2.0 DVB-T", NULL) },
  1447. /* RTL2832U devices: */
  1448. { DVB_USB_DEVICE(USB_VID_REALTEK, 0x2832,
  1449. &rtl28xxu_props, "Realtek RTL2832U reference design", NULL) },
  1450. { DVB_USB_DEVICE(USB_VID_REALTEK, 0x2838,
  1451. &rtl28xxu_props, "Realtek RTL2832U reference design", NULL) },
  1452. { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1,
  1453. &rtl28xxu_props, "TerraTec Cinergy T Stick Black", RC_MAP_TERRATEC_SLIM) },
  1454. { DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_DELOCK_USB2_DVBT,
  1455. &rtl28xxu_props, "G-Tek Electronics Group Lifeview LV5TDLX DVB-T", NULL) },
  1456. { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_NOXON_DAB_STICK,
  1457. &rtl28xxu_props, "TerraTec NOXON DAB Stick", NULL) },
  1458. { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_NOXON_DAB_STICK_REV2,
  1459. &rtl28xxu_props, "TerraTec NOXON DAB Stick (rev 2)", NULL) },
  1460. { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_NOXON_DAB_STICK_REV3,
  1461. &rtl28xxu_props, "TerraTec NOXON DAB Stick (rev 3)", NULL) },
  1462. { DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_TREKSTOR_TERRES_2_0,
  1463. &rtl28xxu_props, "Trekstor DVB-T Stick Terres 2.0", NULL) },
  1464. { DVB_USB_DEVICE(USB_VID_DEXATEK, 0x1101,
  1465. &rtl28xxu_props, "Dexatek DK DVB-T Dongle", NULL) },
  1466. { DVB_USB_DEVICE(USB_VID_LEADTEK, 0x6680,
  1467. &rtl28xxu_props, "DigitalNow Quad DVB-T Receiver", NULL) },
  1468. { DVB_USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_MINID,
  1469. &rtl28xxu_props, "Leadtek Winfast DTV Dongle Mini D", NULL) },
  1470. { DVB_USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV2000DS_PLUS,
  1471. &rtl28xxu_props, "Leadtek WinFast DTV2000DS Plus", RC_MAP_LEADTEK_Y04G0051) },
  1472. { DVB_USB_DEVICE(USB_VID_TERRATEC, 0x00d3,
  1473. &rtl28xxu_props, "TerraTec Cinergy T Stick RC (Rev. 3)", NULL) },
  1474. { DVB_USB_DEVICE(USB_VID_DEXATEK, 0x1102,
  1475. &rtl28xxu_props, "Dexatek DK mini DVB-T Dongle", NULL) },
  1476. { DVB_USB_DEVICE(USB_VID_TERRATEC, 0x00d7,
  1477. &rtl28xxu_props, "TerraTec Cinergy T Stick+", NULL) },
  1478. { DVB_USB_DEVICE(USB_VID_KWORLD_2, 0xd3a8,
  1479. &rtl28xxu_props, "ASUS My Cinema-U3100Mini Plus V2", NULL) },
  1480. { DVB_USB_DEVICE(USB_VID_KWORLD_2, 0xd393,
  1481. &rtl28xxu_props, "GIGABYTE U7300", NULL) },
  1482. { DVB_USB_DEVICE(USB_VID_DEXATEK, 0x1104,
  1483. &rtl28xxu_props, "MSI DIGIVOX Micro HD", NULL) },
  1484. { DVB_USB_DEVICE(USB_VID_COMPRO, 0x0620,
  1485. &rtl28xxu_props, "Compro VideoMate U620F", NULL) },
  1486. { DVB_USB_DEVICE(USB_VID_KWORLD_2, 0xd394,
  1487. &rtl28xxu_props, "MaxMedia HU394-T", NULL) },
  1488. { DVB_USB_DEVICE(USB_VID_LEADTEK, 0x6a03,
  1489. &rtl28xxu_props, "Leadtek WinFast DTV Dongle mini", NULL) },
  1490. { DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_CPYTO_REDI_PC50A,
  1491. &rtl28xxu_props, "Crypto ReDi PC 50 A", NULL) },
  1492. { DVB_USB_DEVICE(USB_VID_KYE, 0x707f,
  1493. &rtl28xxu_props, "Genius TVGo DVB-T03", NULL) },
  1494. { DVB_USB_DEVICE(USB_VID_KWORLD_2, 0xd395,
  1495. &rtl28xxu_props, "Peak DVB-T USB", NULL) },
  1496. { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV20_RTL2832U,
  1497. &rtl28xxu_props, "Sveon STV20", NULL) },
  1498. { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV21,
  1499. &rtl28xxu_props, "Sveon STV21", NULL) },
  1500. { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV27,
  1501. &rtl28xxu_props, "Sveon STV27", NULL) },
  1502. { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_TURBOX_DTT_2000,
  1503. &rtl28xxu_props, "TURBO-X Pure TV Tuner DTT-2000", NULL) },
  1504. /* RTL2832P devices: */
  1505. { DVB_USB_DEVICE(USB_VID_HANFTEK, 0x0131,
  1506. &rtl28xxu_props, "Astrometa DVB-T2", NULL) },
  1507. { }
  1508. };
  1509. MODULE_DEVICE_TABLE(usb, rtl28xxu_id_table);
  1510. static struct usb_driver rtl28xxu_usb_driver = {
  1511. .name = KBUILD_MODNAME,
  1512. .id_table = rtl28xxu_id_table,
  1513. .probe = dvb_usbv2_probe,
  1514. .disconnect = dvb_usbv2_disconnect,
  1515. .suspend = dvb_usbv2_suspend,
  1516. .resume = dvb_usbv2_resume,
  1517. .reset_resume = dvb_usbv2_reset_resume,
  1518. .no_dynamic_id = 1,
  1519. .soft_unbind = 1,
  1520. };
  1521. module_usb_driver(rtl28xxu_usb_driver);
  1522. MODULE_DESCRIPTION("Realtek RTL28xxU DVB USB driver");
  1523. MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
  1524. MODULE_AUTHOR("Thomas Mair <thomas.mair86@googlemail.com>");
  1525. MODULE_LICENSE("GPL");