rtl28xxu.c 46 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790
  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. default:
  670. return -EINVAL;
  671. }
  672. return 0;
  673. }
  674. static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
  675. {
  676. struct dvb_usb_device *d = adap_to_d(adap);
  677. struct rtl28xxu_dev *dev = d_to_priv(d);
  678. struct rtl2832_platform_data *pdata = &dev->rtl2832_platform_data;
  679. struct i2c_board_info board_info;
  680. struct i2c_client *client;
  681. int ret;
  682. dev_dbg(&d->intf->dev, "\n");
  683. switch (dev->tuner) {
  684. case TUNER_RTL2832_FC0012:
  685. *pdata = rtl2832_fc0012_platform_data;
  686. break;
  687. case TUNER_RTL2832_FC0013:
  688. *pdata = rtl2832_fc0013_platform_data;
  689. break;
  690. case TUNER_RTL2832_FC2580:
  691. /* FIXME: do not abuse fc0012 settings */
  692. *pdata = rtl2832_fc0012_platform_data;
  693. break;
  694. case TUNER_RTL2832_TUA9001:
  695. *pdata = rtl2832_tua9001_platform_data;
  696. break;
  697. case TUNER_RTL2832_E4000:
  698. *pdata = rtl2832_e4000_platform_data;
  699. break;
  700. case TUNER_RTL2832_R820T:
  701. case TUNER_RTL2832_R828D:
  702. *pdata = rtl2832_r820t_platform_data;
  703. break;
  704. default:
  705. dev_err(&d->intf->dev, "unknown tuner %s\n", dev->tuner_name);
  706. ret = -ENODEV;
  707. goto err;
  708. }
  709. /* attach demodulator */
  710. memset(&board_info, 0, sizeof(board_info));
  711. strlcpy(board_info.type, "rtl2832", I2C_NAME_SIZE);
  712. board_info.addr = 0x10;
  713. board_info.platform_data = pdata;
  714. request_module("%s", board_info.type);
  715. client = i2c_new_device(&d->i2c_adap, &board_info);
  716. if (client == NULL || client->dev.driver == NULL) {
  717. ret = -ENODEV;
  718. goto err;
  719. }
  720. if (!try_module_get(client->dev.driver->owner)) {
  721. i2c_unregister_device(client);
  722. ret = -ENODEV;
  723. goto err;
  724. }
  725. adap->fe[0] = pdata->get_dvb_frontend(client);
  726. dev->demod_i2c_adapter = pdata->get_i2c_adapter(client);
  727. dev->i2c_client_demod = client;
  728. /* set fe callback */
  729. adap->fe[0]->callback = rtl2832u_frontend_callback;
  730. if (dev->slave_demod) {
  731. struct i2c_board_info info = {};
  732. /*
  733. * We continue on reduced mode, without DVB-T2/C, using master
  734. * demod, when slave demod fails.
  735. */
  736. ret = 0;
  737. /* attach slave demodulator */
  738. if (dev->slave_demod == SLAVE_DEMOD_MN88472) {
  739. struct mn88472_config mn88472_config = {};
  740. mn88472_config.fe = &adap->fe[1];
  741. mn88472_config.i2c_wr_max = 22,
  742. strlcpy(info.type, "mn88472", I2C_NAME_SIZE);
  743. mn88472_config.xtal = 20500000;
  744. mn88472_config.ts_mode = SERIAL_TS_MODE;
  745. mn88472_config.ts_clock = VARIABLE_TS_CLOCK;
  746. info.addr = 0x18;
  747. info.platform_data = &mn88472_config;
  748. request_module(info.type);
  749. client = i2c_new_device(&d->i2c_adap, &info);
  750. if (client == NULL || client->dev.driver == NULL) {
  751. dev->slave_demod = SLAVE_DEMOD_NONE;
  752. goto err_slave_demod_failed;
  753. }
  754. if (!try_module_get(client->dev.driver->owner)) {
  755. i2c_unregister_device(client);
  756. dev->slave_demod = SLAVE_DEMOD_NONE;
  757. goto err_slave_demod_failed;
  758. }
  759. dev->i2c_client_slave_demod = client;
  760. } else {
  761. struct mn88473_config mn88473_config = {};
  762. mn88473_config.fe = &adap->fe[1];
  763. mn88473_config.i2c_wr_max = 22,
  764. strlcpy(info.type, "mn88473", I2C_NAME_SIZE);
  765. info.addr = 0x18;
  766. info.platform_data = &mn88473_config;
  767. request_module(info.type);
  768. client = i2c_new_device(&d->i2c_adap, &info);
  769. if (client == NULL || client->dev.driver == NULL) {
  770. dev->slave_demod = SLAVE_DEMOD_NONE;
  771. goto err_slave_demod_failed;
  772. }
  773. if (!try_module_get(client->dev.driver->owner)) {
  774. i2c_unregister_device(client);
  775. dev->slave_demod = SLAVE_DEMOD_NONE;
  776. goto err_slave_demod_failed;
  777. }
  778. dev->i2c_client_slave_demod = client;
  779. }
  780. }
  781. return 0;
  782. err_slave_demod_failed:
  783. err:
  784. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  785. return ret;
  786. }
  787. static int rtl28xxu_frontend_attach(struct dvb_usb_adapter *adap)
  788. {
  789. struct rtl28xxu_dev *dev = adap_to_priv(adap);
  790. if (dev->chip_id == CHIP_ID_RTL2831U)
  791. return rtl2831u_frontend_attach(adap);
  792. else
  793. return rtl2832u_frontend_attach(adap);
  794. }
  795. static int rtl28xxu_frontend_detach(struct dvb_usb_adapter *adap)
  796. {
  797. struct dvb_usb_device *d = adap_to_d(adap);
  798. struct rtl28xxu_dev *dev = d_to_priv(d);
  799. struct i2c_client *client;
  800. dev_dbg(&d->intf->dev, "\n");
  801. /* remove I2C slave demod */
  802. client = dev->i2c_client_slave_demod;
  803. if (client) {
  804. module_put(client->dev.driver->owner);
  805. i2c_unregister_device(client);
  806. }
  807. /* remove I2C demod */
  808. client = dev->i2c_client_demod;
  809. if (client) {
  810. module_put(client->dev.driver->owner);
  811. i2c_unregister_device(client);
  812. }
  813. return 0;
  814. }
  815. static struct qt1010_config rtl28xxu_qt1010_config = {
  816. .i2c_address = 0x62, /* 0xc4 */
  817. };
  818. static struct mt2060_config rtl28xxu_mt2060_config = {
  819. .i2c_address = 0x60, /* 0xc0 */
  820. .clock_out = 0,
  821. };
  822. static struct mxl5005s_config rtl28xxu_mxl5005s_config = {
  823. .i2c_address = 0x63, /* 0xc6 */
  824. .if_freq = IF_FREQ_4570000HZ,
  825. .xtal_freq = CRYSTAL_FREQ_16000000HZ,
  826. .agc_mode = MXL_SINGLE_AGC,
  827. .tracking_filter = MXL_TF_C_H,
  828. .rssi_enable = MXL_RSSI_ENABLE,
  829. .cap_select = MXL_CAP_SEL_ENABLE,
  830. .div_out = MXL_DIV_OUT_4,
  831. .clock_out = MXL_CLOCK_OUT_DISABLE,
  832. .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
  833. .top = MXL5005S_TOP_25P2,
  834. .mod_mode = MXL_DIGITAL_MODE,
  835. .if_mode = MXL_ZERO_IF,
  836. .AgcMasterByte = 0x00,
  837. };
  838. static int rtl2831u_tuner_attach(struct dvb_usb_adapter *adap)
  839. {
  840. int ret;
  841. struct dvb_usb_device *d = adap_to_d(adap);
  842. struct rtl28xxu_dev *dev = d_to_priv(d);
  843. struct dvb_frontend *fe;
  844. dev_dbg(&d->intf->dev, "\n");
  845. switch (dev->tuner) {
  846. case TUNER_RTL2830_QT1010:
  847. fe = dvb_attach(qt1010_attach, adap->fe[0],
  848. dev->demod_i2c_adapter,
  849. &rtl28xxu_qt1010_config);
  850. break;
  851. case TUNER_RTL2830_MT2060:
  852. fe = dvb_attach(mt2060_attach, adap->fe[0],
  853. dev->demod_i2c_adapter,
  854. &rtl28xxu_mt2060_config, 1220);
  855. break;
  856. case TUNER_RTL2830_MXL5005S:
  857. fe = dvb_attach(mxl5005s_attach, adap->fe[0],
  858. dev->demod_i2c_adapter,
  859. &rtl28xxu_mxl5005s_config);
  860. break;
  861. default:
  862. fe = NULL;
  863. dev_err(&d->intf->dev, "unknown tuner %d\n", dev->tuner);
  864. }
  865. if (fe == NULL) {
  866. ret = -ENODEV;
  867. goto err;
  868. }
  869. return 0;
  870. err:
  871. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  872. return ret;
  873. }
  874. static const struct fc2580_config rtl2832u_fc2580_config = {
  875. .i2c_addr = 0x56,
  876. .clock = 16384000,
  877. };
  878. static struct tua9001_config rtl2832u_tua9001_config = {
  879. .i2c_addr = 0x60,
  880. };
  881. static const struct fc0012_config rtl2832u_fc0012_config = {
  882. .i2c_address = 0x63, /* 0xc6 >> 1 */
  883. .xtal_freq = FC_XTAL_28_8_MHZ,
  884. };
  885. static const struct r820t_config rtl2832u_r820t_config = {
  886. .i2c_addr = 0x1a,
  887. .xtal = 28800000,
  888. .max_i2c_msg_len = 2,
  889. .rafael_chip = CHIP_R820T,
  890. };
  891. static const struct r820t_config rtl2832u_r828d_config = {
  892. .i2c_addr = 0x3a,
  893. .xtal = 16000000,
  894. .max_i2c_msg_len = 2,
  895. .rafael_chip = CHIP_R828D,
  896. };
  897. static int rtl2832u_tuner_attach(struct dvb_usb_adapter *adap)
  898. {
  899. int ret;
  900. struct dvb_usb_device *d = adap_to_d(adap);
  901. struct rtl28xxu_dev *dev = d_to_priv(d);
  902. struct dvb_frontend *fe = NULL;
  903. struct i2c_board_info info;
  904. struct i2c_client *client;
  905. struct v4l2_subdev *subdev = NULL;
  906. struct platform_device *pdev;
  907. struct rtl2832_sdr_platform_data pdata;
  908. dev_dbg(&d->intf->dev, "\n");
  909. memset(&info, 0, sizeof(struct i2c_board_info));
  910. memset(&pdata, 0, sizeof(pdata));
  911. switch (dev->tuner) {
  912. case TUNER_RTL2832_FC0012:
  913. fe = dvb_attach(fc0012_attach, adap->fe[0],
  914. dev->demod_i2c_adapter, &rtl2832u_fc0012_config);
  915. /* since fc0012 includs reading the signal strength delegate
  916. * that to the tuner driver */
  917. adap->fe[0]->ops.read_signal_strength =
  918. adap->fe[0]->ops.tuner_ops.get_rf_strength;
  919. break;
  920. case TUNER_RTL2832_FC0013:
  921. fe = dvb_attach(fc0013_attach, adap->fe[0],
  922. dev->demod_i2c_adapter, 0xc6>>1, 0, FC_XTAL_28_8_MHZ);
  923. /* fc0013 also supports signal strength reading */
  924. adap->fe[0]->ops.read_signal_strength =
  925. adap->fe[0]->ops.tuner_ops.get_rf_strength;
  926. break;
  927. case TUNER_RTL2832_E4000: {
  928. struct e4000_config e4000_config = {
  929. .fe = adap->fe[0],
  930. .clock = 28800000,
  931. };
  932. strlcpy(info.type, "e4000", I2C_NAME_SIZE);
  933. info.addr = 0x64;
  934. info.platform_data = &e4000_config;
  935. request_module(info.type);
  936. client = i2c_new_device(dev->demod_i2c_adapter, &info);
  937. if (client == NULL || client->dev.driver == NULL)
  938. break;
  939. if (!try_module_get(client->dev.driver->owner)) {
  940. i2c_unregister_device(client);
  941. break;
  942. }
  943. dev->i2c_client_tuner = client;
  944. subdev = i2c_get_clientdata(client);
  945. }
  946. break;
  947. case TUNER_RTL2832_FC2580:
  948. fe = dvb_attach(fc2580_attach, adap->fe[0],
  949. dev->demod_i2c_adapter,
  950. &rtl2832u_fc2580_config);
  951. break;
  952. case TUNER_RTL2832_TUA9001:
  953. /* enable GPIO1 and GPIO4 as output */
  954. ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_DIR, 0x00, 0x12);
  955. if (ret)
  956. goto err;
  957. ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_EN, 0x12, 0x12);
  958. if (ret)
  959. goto err;
  960. fe = dvb_attach(tua9001_attach, adap->fe[0],
  961. dev->demod_i2c_adapter,
  962. &rtl2832u_tua9001_config);
  963. break;
  964. case TUNER_RTL2832_R820T:
  965. fe = dvb_attach(r820t_attach, adap->fe[0],
  966. dev->demod_i2c_adapter,
  967. &rtl2832u_r820t_config);
  968. /* Use tuner to get the signal strength */
  969. adap->fe[0]->ops.read_signal_strength =
  970. adap->fe[0]->ops.tuner_ops.get_rf_strength;
  971. break;
  972. case TUNER_RTL2832_R828D:
  973. fe = dvb_attach(r820t_attach, adap->fe[0],
  974. dev->demod_i2c_adapter,
  975. &rtl2832u_r828d_config);
  976. adap->fe[0]->ops.read_signal_strength =
  977. adap->fe[0]->ops.tuner_ops.get_rf_strength;
  978. if (adap->fe[1]) {
  979. fe = dvb_attach(r820t_attach, adap->fe[1],
  980. dev->demod_i2c_adapter,
  981. &rtl2832u_r828d_config);
  982. adap->fe[1]->ops.read_signal_strength =
  983. adap->fe[1]->ops.tuner_ops.get_rf_strength;
  984. }
  985. break;
  986. default:
  987. dev_err(&d->intf->dev, "unknown tuner %d\n", dev->tuner);
  988. }
  989. if (fe == NULL && dev->i2c_client_tuner == NULL) {
  990. ret = -ENODEV;
  991. goto err;
  992. }
  993. /* register SDR */
  994. switch (dev->tuner) {
  995. case TUNER_RTL2832_FC0012:
  996. case TUNER_RTL2832_FC0013:
  997. case TUNER_RTL2832_E4000:
  998. case TUNER_RTL2832_R820T:
  999. case TUNER_RTL2832_R828D:
  1000. pdata.clk = dev->rtl2832_platform_data.clk;
  1001. pdata.tuner = dev->tuner;
  1002. pdata.i2c_client = dev->i2c_client_demod;
  1003. pdata.bulk_read = dev->rtl2832_platform_data.bulk_read;
  1004. pdata.bulk_write = dev->rtl2832_platform_data.bulk_write;
  1005. pdata.update_bits = dev->rtl2832_platform_data.update_bits;
  1006. pdata.dvb_frontend = adap->fe[0];
  1007. pdata.dvb_usb_device = d;
  1008. pdata.v4l2_subdev = subdev;
  1009. request_module("%s", "rtl2832_sdr");
  1010. pdev = platform_device_register_data(&d->intf->dev,
  1011. "rtl2832_sdr",
  1012. PLATFORM_DEVID_AUTO,
  1013. &pdata, sizeof(pdata));
  1014. if (pdev == NULL || pdev->dev.driver == NULL)
  1015. break;
  1016. dev->platform_device_sdr = pdev;
  1017. break;
  1018. default:
  1019. dev_dbg(&d->intf->dev, "no SDR for tuner=%d\n", dev->tuner);
  1020. }
  1021. return 0;
  1022. err:
  1023. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  1024. return ret;
  1025. }
  1026. static int rtl28xxu_tuner_attach(struct dvb_usb_adapter *adap)
  1027. {
  1028. struct rtl28xxu_dev *dev = adap_to_priv(adap);
  1029. if (dev->chip_id == CHIP_ID_RTL2831U)
  1030. return rtl2831u_tuner_attach(adap);
  1031. else
  1032. return rtl2832u_tuner_attach(adap);
  1033. }
  1034. static int rtl28xxu_tuner_detach(struct dvb_usb_adapter *adap)
  1035. {
  1036. struct dvb_usb_device *d = adap_to_d(adap);
  1037. struct rtl28xxu_dev *dev = d_to_priv(d);
  1038. struct i2c_client *client;
  1039. struct platform_device *pdev;
  1040. dev_dbg(&d->intf->dev, "\n");
  1041. /* remove platform SDR */
  1042. pdev = dev->platform_device_sdr;
  1043. if (pdev)
  1044. platform_device_unregister(pdev);
  1045. /* remove I2C tuner */
  1046. client = dev->i2c_client_tuner;
  1047. if (client) {
  1048. module_put(client->dev.driver->owner);
  1049. i2c_unregister_device(client);
  1050. }
  1051. return 0;
  1052. }
  1053. static int rtl28xxu_init(struct dvb_usb_device *d)
  1054. {
  1055. int ret;
  1056. u8 val;
  1057. dev_dbg(&d->intf->dev, "\n");
  1058. /* init USB endpoints */
  1059. ret = rtl28xxu_rd_reg(d, USB_SYSCTL_0, &val);
  1060. if (ret)
  1061. goto err;
  1062. /* enable DMA and Full Packet Mode*/
  1063. val |= 0x09;
  1064. ret = rtl28xxu_wr_reg(d, USB_SYSCTL_0, val);
  1065. if (ret)
  1066. goto err;
  1067. /* set EPA maximum packet size to 0x0200 */
  1068. ret = rtl28xxu_wr_regs(d, USB_EPA_MAXPKT, "\x00\x02\x00\x00", 4);
  1069. if (ret)
  1070. goto err;
  1071. /* change EPA FIFO length */
  1072. ret = rtl28xxu_wr_regs(d, USB_EPA_FIFO_CFG, "\x14\x00\x00\x00", 4);
  1073. if (ret)
  1074. goto err;
  1075. return ret;
  1076. err:
  1077. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  1078. return ret;
  1079. }
  1080. static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
  1081. {
  1082. int ret;
  1083. u8 gpio, sys0, epa_ctl[2];
  1084. dev_dbg(&d->intf->dev, "onoff=%d\n", onoff);
  1085. /* demod adc */
  1086. ret = rtl28xxu_rd_reg(d, SYS_SYS0, &sys0);
  1087. if (ret)
  1088. goto err;
  1089. /* tuner power, read GPIOs */
  1090. ret = rtl28xxu_rd_reg(d, SYS_GPIO_OUT_VAL, &gpio);
  1091. if (ret)
  1092. goto err;
  1093. dev_dbg(&d->intf->dev, "RD SYS0=%02x GPIO_OUT_VAL=%02x\n", sys0, gpio);
  1094. if (onoff) {
  1095. gpio |= 0x01; /* GPIO0 = 1 */
  1096. gpio &= (~0x10); /* GPIO4 = 0 */
  1097. gpio |= 0x04; /* GPIO2 = 1, LED on */
  1098. sys0 = sys0 & 0x0f;
  1099. sys0 |= 0xe0;
  1100. epa_ctl[0] = 0x00; /* clear stall */
  1101. epa_ctl[1] = 0x00; /* clear reset */
  1102. } else {
  1103. gpio &= (~0x01); /* GPIO0 = 0 */
  1104. gpio |= 0x10; /* GPIO4 = 1 */
  1105. gpio &= (~0x04); /* GPIO2 = 1, LED off */
  1106. sys0 = sys0 & (~0xc0);
  1107. epa_ctl[0] = 0x10; /* set stall */
  1108. epa_ctl[1] = 0x02; /* set reset */
  1109. }
  1110. dev_dbg(&d->intf->dev, "WR SYS0=%02x GPIO_OUT_VAL=%02x\n", sys0, gpio);
  1111. /* demod adc */
  1112. ret = rtl28xxu_wr_reg(d, SYS_SYS0, sys0);
  1113. if (ret)
  1114. goto err;
  1115. /* tuner power, write GPIOs */
  1116. ret = rtl28xxu_wr_reg(d, SYS_GPIO_OUT_VAL, gpio);
  1117. if (ret)
  1118. goto err;
  1119. /* streaming EP: stall & reset */
  1120. ret = rtl28xxu_wr_regs(d, USB_EPA_CTL, epa_ctl, 2);
  1121. if (ret)
  1122. goto err;
  1123. if (onoff)
  1124. usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, 0x81));
  1125. return ret;
  1126. err:
  1127. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  1128. return ret;
  1129. }
  1130. static int rtl2832u_power_ctrl(struct dvb_usb_device *d, int onoff)
  1131. {
  1132. int ret;
  1133. dev_dbg(&d->intf->dev, "onoff=%d\n", onoff);
  1134. if (onoff) {
  1135. /* GPIO3=1, GPIO4=0 */
  1136. ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, 0x08, 0x18);
  1137. if (ret)
  1138. goto err;
  1139. /* suspend? */
  1140. ret = rtl28xxu_wr_reg_mask(d, SYS_DEMOD_CTL1, 0x00, 0x10);
  1141. if (ret)
  1142. goto err;
  1143. /* enable PLL */
  1144. ret = rtl28xxu_wr_reg_mask(d, SYS_DEMOD_CTL, 0x80, 0x80);
  1145. if (ret)
  1146. goto err;
  1147. /* disable reset */
  1148. ret = rtl28xxu_wr_reg_mask(d, SYS_DEMOD_CTL, 0x20, 0x20);
  1149. if (ret)
  1150. goto err;
  1151. /* streaming EP: clear stall & reset */
  1152. ret = rtl28xxu_wr_regs(d, USB_EPA_CTL, "\x00\x00", 2);
  1153. if (ret)
  1154. goto err;
  1155. ret = usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, 0x81));
  1156. if (ret)
  1157. goto err;
  1158. } else {
  1159. /* GPIO4=1 */
  1160. ret = rtl28xxu_wr_reg_mask(d, SYS_GPIO_OUT_VAL, 0x10, 0x10);
  1161. if (ret)
  1162. goto err;
  1163. /* disable PLL */
  1164. ret = rtl28xxu_wr_reg_mask(d, SYS_DEMOD_CTL, 0x00, 0x80);
  1165. if (ret)
  1166. goto err;
  1167. /* streaming EP: set stall & reset */
  1168. ret = rtl28xxu_wr_regs(d, USB_EPA_CTL, "\x10\x02", 2);
  1169. if (ret)
  1170. goto err;
  1171. }
  1172. return ret;
  1173. err:
  1174. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  1175. return ret;
  1176. }
  1177. static int rtl28xxu_power_ctrl(struct dvb_usb_device *d, int onoff)
  1178. {
  1179. struct rtl28xxu_dev *dev = d_to_priv(d);
  1180. if (dev->chip_id == CHIP_ID_RTL2831U)
  1181. return rtl2831u_power_ctrl(d, onoff);
  1182. else
  1183. return rtl2832u_power_ctrl(d, onoff);
  1184. }
  1185. static int rtl28xxu_frontend_ctrl(struct dvb_frontend *fe, int onoff)
  1186. {
  1187. struct dvb_usb_device *d = fe_to_d(fe);
  1188. struct rtl28xxu_dev *dev = fe_to_priv(fe);
  1189. struct rtl2832_platform_data *pdata = &dev->rtl2832_platform_data;
  1190. int ret;
  1191. u8 val;
  1192. dev_dbg(&d->intf->dev, "fe=%d onoff=%d\n", fe->id, onoff);
  1193. if (dev->chip_id == CHIP_ID_RTL2831U)
  1194. return 0;
  1195. /* control internal demod ADC */
  1196. if (fe->id == 0 && onoff)
  1197. val = 0x48; /* enable ADC */
  1198. else
  1199. val = 0x00; /* disable ADC */
  1200. ret = rtl28xxu_wr_reg_mask(d, SYS_DEMOD_CTL, val, 0x48);
  1201. if (ret)
  1202. goto err;
  1203. /* bypass slave demod TS through master demod */
  1204. if (fe->id == 1 && onoff) {
  1205. ret = pdata->enable_slave_ts(dev->i2c_client_demod);
  1206. if (ret)
  1207. goto err;
  1208. }
  1209. return 0;
  1210. err:
  1211. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  1212. return ret;
  1213. }
  1214. #if IS_ENABLED(CONFIG_RC_CORE)
  1215. static int rtl2831u_rc_query(struct dvb_usb_device *d)
  1216. {
  1217. int ret, i;
  1218. struct rtl28xxu_dev *dev = d->priv;
  1219. u8 buf[5];
  1220. u32 rc_code;
  1221. struct rtl28xxu_reg_val rc_nec_tab[] = {
  1222. { 0x3033, 0x80 },
  1223. { 0x3020, 0x43 },
  1224. { 0x3021, 0x16 },
  1225. { 0x3022, 0x16 },
  1226. { 0x3023, 0x5a },
  1227. { 0x3024, 0x2d },
  1228. { 0x3025, 0x16 },
  1229. { 0x3026, 0x01 },
  1230. { 0x3028, 0xb0 },
  1231. { 0x3029, 0x04 },
  1232. { 0x302c, 0x88 },
  1233. { 0x302e, 0x13 },
  1234. { 0x3030, 0xdf },
  1235. { 0x3031, 0x05 },
  1236. };
  1237. /* init remote controller */
  1238. if (!dev->rc_active) {
  1239. for (i = 0; i < ARRAY_SIZE(rc_nec_tab); i++) {
  1240. ret = rtl28xxu_wr_reg(d, rc_nec_tab[i].reg,
  1241. rc_nec_tab[i].val);
  1242. if (ret)
  1243. goto err;
  1244. }
  1245. dev->rc_active = true;
  1246. }
  1247. ret = rtl28xxu_rd_regs(d, SYS_IRRC_RP, buf, 5);
  1248. if (ret)
  1249. goto err;
  1250. if (buf[4] & 0x01) {
  1251. if (buf[2] == (u8) ~buf[3]) {
  1252. if (buf[0] == (u8) ~buf[1]) {
  1253. /* NEC standard (16 bit) */
  1254. rc_code = RC_SCANCODE_NEC(buf[0], buf[2]);
  1255. } else {
  1256. /* NEC extended (24 bit) */
  1257. rc_code = RC_SCANCODE_NECX(buf[0] << 8 | buf[1],
  1258. buf[2]);
  1259. }
  1260. } else {
  1261. /* NEC full (32 bit) */
  1262. rc_code = RC_SCANCODE_NEC32(buf[0] << 24 | buf[1] << 16 |
  1263. buf[2] << 8 | buf[3]);
  1264. }
  1265. rc_keydown(d->rc_dev, RC_TYPE_NEC, rc_code, 0);
  1266. ret = rtl28xxu_wr_reg(d, SYS_IRRC_SR, 1);
  1267. if (ret)
  1268. goto err;
  1269. /* repeated intentionally to avoid extra keypress */
  1270. ret = rtl28xxu_wr_reg(d, SYS_IRRC_SR, 1);
  1271. if (ret)
  1272. goto err;
  1273. }
  1274. return ret;
  1275. err:
  1276. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  1277. return ret;
  1278. }
  1279. static int rtl2831u_get_rc_config(struct dvb_usb_device *d,
  1280. struct dvb_usb_rc *rc)
  1281. {
  1282. rc->map_name = RC_MAP_EMPTY;
  1283. rc->allowed_protos = RC_BIT_NEC;
  1284. rc->query = rtl2831u_rc_query;
  1285. rc->interval = 400;
  1286. return 0;
  1287. }
  1288. static int rtl2832u_rc_query(struct dvb_usb_device *d)
  1289. {
  1290. int ret, i, len;
  1291. struct rtl28xxu_dev *dev = d->priv;
  1292. struct ir_raw_event ev;
  1293. u8 buf[128];
  1294. static const struct rtl28xxu_reg_val_mask refresh_tab[] = {
  1295. {IR_RX_IF, 0x03, 0xff},
  1296. {IR_RX_BUF_CTRL, 0x80, 0xff},
  1297. {IR_RX_CTRL, 0x80, 0xff},
  1298. };
  1299. /* init remote controller */
  1300. if (!dev->rc_active) {
  1301. static const struct rtl28xxu_reg_val_mask init_tab[] = {
  1302. {SYS_DEMOD_CTL1, 0x00, 0x04},
  1303. {SYS_DEMOD_CTL1, 0x00, 0x08},
  1304. {USB_CTRL, 0x20, 0x20},
  1305. {SYS_GPIO_DIR, 0x00, 0x08},
  1306. {SYS_GPIO_OUT_EN, 0x08, 0x08},
  1307. {SYS_GPIO_OUT_VAL, 0x08, 0x08},
  1308. {IR_MAX_DURATION0, 0xd0, 0xff},
  1309. {IR_MAX_DURATION1, 0x07, 0xff},
  1310. {IR_IDLE_LEN0, 0xc0, 0xff},
  1311. {IR_IDLE_LEN1, 0x00, 0xff},
  1312. {IR_GLITCH_LEN, 0x03, 0xff},
  1313. {IR_RX_CLK, 0x09, 0xff},
  1314. {IR_RX_CFG, 0x1c, 0xff},
  1315. {IR_MAX_H_TOL_LEN, 0x1e, 0xff},
  1316. {IR_MAX_L_TOL_LEN, 0x1e, 0xff},
  1317. {IR_RX_CTRL, 0x80, 0xff},
  1318. };
  1319. for (i = 0; i < ARRAY_SIZE(init_tab); i++) {
  1320. ret = rtl28xxu_wr_reg_mask(d, init_tab[i].reg,
  1321. init_tab[i].val, init_tab[i].mask);
  1322. if (ret)
  1323. goto err;
  1324. }
  1325. dev->rc_active = true;
  1326. }
  1327. ret = rtl28xxu_rd_reg(d, IR_RX_IF, &buf[0]);
  1328. if (ret)
  1329. goto err;
  1330. if (buf[0] != 0x83)
  1331. goto exit;
  1332. ret = rtl28xxu_rd_reg(d, IR_RX_BC, &buf[0]);
  1333. if (ret)
  1334. goto err;
  1335. len = buf[0];
  1336. /* read raw code from hw */
  1337. ret = rtl28xxu_rd_regs(d, IR_RX_BUF, buf, len);
  1338. if (ret)
  1339. goto err;
  1340. /* let hw receive new code */
  1341. for (i = 0; i < ARRAY_SIZE(refresh_tab); i++) {
  1342. ret = rtl28xxu_wr_reg_mask(d, refresh_tab[i].reg,
  1343. refresh_tab[i].val, refresh_tab[i].mask);
  1344. if (ret)
  1345. goto err;
  1346. }
  1347. /* pass data to Kernel IR decoder */
  1348. init_ir_raw_event(&ev);
  1349. for (i = 0; i < len; i++) {
  1350. ev.pulse = buf[i] >> 7;
  1351. ev.duration = 50800 * (buf[i] & 0x7f);
  1352. ir_raw_event_store_with_filter(d->rc_dev, &ev);
  1353. }
  1354. /* 'flush' ir_raw_event_store_with_filter() */
  1355. ir_raw_event_set_idle(d->rc_dev, true);
  1356. ir_raw_event_handle(d->rc_dev);
  1357. exit:
  1358. return ret;
  1359. err:
  1360. dev_dbg(&d->intf->dev, "failed=%d\n", ret);
  1361. return ret;
  1362. }
  1363. static int rtl2832u_get_rc_config(struct dvb_usb_device *d,
  1364. struct dvb_usb_rc *rc)
  1365. {
  1366. /* disable IR interrupts in order to avoid SDR sample loss */
  1367. if (rtl28xxu_disable_rc)
  1368. return rtl28xxu_wr_reg(d, IR_RX_IE, 0x00);
  1369. /* load empty to enable rc */
  1370. if (!rc->map_name)
  1371. rc->map_name = RC_MAP_EMPTY;
  1372. rc->allowed_protos = RC_BIT_ALL;
  1373. rc->driver_type = RC_DRIVER_IR_RAW;
  1374. rc->query = rtl2832u_rc_query;
  1375. rc->interval = 200;
  1376. return 0;
  1377. }
  1378. static int rtl28xxu_get_rc_config(struct dvb_usb_device *d,
  1379. struct dvb_usb_rc *rc)
  1380. {
  1381. struct rtl28xxu_dev *dev = d_to_priv(d);
  1382. if (dev->chip_id == CHIP_ID_RTL2831U)
  1383. return rtl2831u_get_rc_config(d, rc);
  1384. else
  1385. return rtl2832u_get_rc_config(d, rc);
  1386. }
  1387. #else
  1388. #define rtl28xxu_get_rc_config NULL
  1389. #endif
  1390. static int rtl28xxu_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
  1391. {
  1392. struct rtl28xxu_dev *dev = adap_to_priv(adap);
  1393. if (dev->chip_id == CHIP_ID_RTL2831U) {
  1394. struct rtl2830_platform_data *pdata = &dev->rtl2830_platform_data;
  1395. return pdata->pid_filter_ctrl(adap->fe[0], onoff);
  1396. } else {
  1397. struct rtl2832_platform_data *pdata = &dev->rtl2832_platform_data;
  1398. return pdata->pid_filter_ctrl(adap->fe[0], onoff);
  1399. }
  1400. }
  1401. static int rtl28xxu_pid_filter(struct dvb_usb_adapter *adap, int index,
  1402. u16 pid, int onoff)
  1403. {
  1404. struct rtl28xxu_dev *dev = adap_to_priv(adap);
  1405. if (dev->chip_id == CHIP_ID_RTL2831U) {
  1406. struct rtl2830_platform_data *pdata = &dev->rtl2830_platform_data;
  1407. return pdata->pid_filter(adap->fe[0], index, pid, onoff);
  1408. } else {
  1409. struct rtl2832_platform_data *pdata = &dev->rtl2832_platform_data;
  1410. return pdata->pid_filter(adap->fe[0], index, pid, onoff);
  1411. }
  1412. }
  1413. static const struct dvb_usb_device_properties rtl28xxu_props = {
  1414. .driver_name = KBUILD_MODNAME,
  1415. .owner = THIS_MODULE,
  1416. .adapter_nr = adapter_nr,
  1417. .size_of_priv = sizeof(struct rtl28xxu_dev),
  1418. .identify_state = rtl28xxu_identify_state,
  1419. .power_ctrl = rtl28xxu_power_ctrl,
  1420. .frontend_ctrl = rtl28xxu_frontend_ctrl,
  1421. .i2c_algo = &rtl28xxu_i2c_algo,
  1422. .read_config = rtl28xxu_read_config,
  1423. .frontend_attach = rtl28xxu_frontend_attach,
  1424. .frontend_detach = rtl28xxu_frontend_detach,
  1425. .tuner_attach = rtl28xxu_tuner_attach,
  1426. .tuner_detach = rtl28xxu_tuner_detach,
  1427. .init = rtl28xxu_init,
  1428. .get_rc_config = rtl28xxu_get_rc_config,
  1429. .num_adapters = 1,
  1430. .adapter = {
  1431. {
  1432. .caps = DVB_USB_ADAP_HAS_PID_FILTER |
  1433. DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
  1434. .pid_filter_count = 32,
  1435. .pid_filter_ctrl = rtl28xxu_pid_filter_ctrl,
  1436. .pid_filter = rtl28xxu_pid_filter,
  1437. .stream = DVB_USB_STREAM_BULK(0x81, 6, 8 * 512),
  1438. },
  1439. },
  1440. };
  1441. static const struct usb_device_id rtl28xxu_id_table[] = {
  1442. /* RTL2831U devices: */
  1443. { DVB_USB_DEVICE(USB_VID_REALTEK, USB_PID_REALTEK_RTL2831U,
  1444. &rtl28xxu_props, "Realtek RTL2831U reference design", NULL) },
  1445. { DVB_USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_FREECOM_DVBT,
  1446. &rtl28xxu_props, "Freecom USB2.0 DVB-T", NULL) },
  1447. { DVB_USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_FREECOM_DVBT_2,
  1448. &rtl28xxu_props, "Freecom USB2.0 DVB-T", NULL) },
  1449. /* RTL2832U devices: */
  1450. { DVB_USB_DEVICE(USB_VID_REALTEK, 0x2832,
  1451. &rtl28xxu_props, "Realtek RTL2832U reference design", NULL) },
  1452. { DVB_USB_DEVICE(USB_VID_REALTEK, 0x2838,
  1453. &rtl28xxu_props, "Realtek RTL2832U reference design", NULL) },
  1454. { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1,
  1455. &rtl28xxu_props, "TerraTec Cinergy T Stick Black", RC_MAP_TERRATEC_SLIM) },
  1456. { DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_DELOCK_USB2_DVBT,
  1457. &rtl28xxu_props, "G-Tek Electronics Group Lifeview LV5TDLX DVB-T", NULL) },
  1458. { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_NOXON_DAB_STICK,
  1459. &rtl28xxu_props, "TerraTec NOXON DAB Stick", NULL) },
  1460. { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_NOXON_DAB_STICK_REV2,
  1461. &rtl28xxu_props, "TerraTec NOXON DAB Stick (rev 2)", NULL) },
  1462. { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_NOXON_DAB_STICK_REV3,
  1463. &rtl28xxu_props, "TerraTec NOXON DAB Stick (rev 3)", NULL) },
  1464. { DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_TREKSTOR_TERRES_2_0,
  1465. &rtl28xxu_props, "Trekstor DVB-T Stick Terres 2.0", NULL) },
  1466. { DVB_USB_DEVICE(USB_VID_DEXATEK, 0x1101,
  1467. &rtl28xxu_props, "Dexatek DK DVB-T Dongle", NULL) },
  1468. { DVB_USB_DEVICE(USB_VID_LEADTEK, 0x6680,
  1469. &rtl28xxu_props, "DigitalNow Quad DVB-T Receiver", NULL) },
  1470. { DVB_USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_MINID,
  1471. &rtl28xxu_props, "Leadtek Winfast DTV Dongle Mini D", NULL) },
  1472. { DVB_USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV2000DS_PLUS,
  1473. &rtl28xxu_props, "Leadtek WinFast DTV2000DS Plus", RC_MAP_LEADTEK_Y04G0051) },
  1474. { DVB_USB_DEVICE(USB_VID_TERRATEC, 0x00d3,
  1475. &rtl28xxu_props, "TerraTec Cinergy T Stick RC (Rev. 3)", NULL) },
  1476. { DVB_USB_DEVICE(USB_VID_DEXATEK, 0x1102,
  1477. &rtl28xxu_props, "Dexatek DK mini DVB-T Dongle", NULL) },
  1478. { DVB_USB_DEVICE(USB_VID_TERRATEC, 0x00d7,
  1479. &rtl28xxu_props, "TerraTec Cinergy T Stick+", NULL) },
  1480. { DVB_USB_DEVICE(USB_VID_KWORLD_2, 0xd3a8,
  1481. &rtl28xxu_props, "ASUS My Cinema-U3100Mini Plus V2", NULL) },
  1482. { DVB_USB_DEVICE(USB_VID_KWORLD_2, 0xd393,
  1483. &rtl28xxu_props, "GIGABYTE U7300", NULL) },
  1484. { DVB_USB_DEVICE(USB_VID_DEXATEK, 0x1104,
  1485. &rtl28xxu_props, "MSI DIGIVOX Micro HD", NULL) },
  1486. { DVB_USB_DEVICE(USB_VID_COMPRO, 0x0620,
  1487. &rtl28xxu_props, "Compro VideoMate U620F", NULL) },
  1488. { DVB_USB_DEVICE(USB_VID_KWORLD_2, 0xd394,
  1489. &rtl28xxu_props, "MaxMedia HU394-T", NULL) },
  1490. { DVB_USB_DEVICE(USB_VID_LEADTEK, 0x6a03,
  1491. &rtl28xxu_props, "Leadtek WinFast DTV Dongle mini", NULL) },
  1492. { DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_CPYTO_REDI_PC50A,
  1493. &rtl28xxu_props, "Crypto ReDi PC 50 A", NULL) },
  1494. { DVB_USB_DEVICE(USB_VID_KYE, 0x707f,
  1495. &rtl28xxu_props, "Genius TVGo DVB-T03", NULL) },
  1496. { DVB_USB_DEVICE(USB_VID_KWORLD_2, 0xd395,
  1497. &rtl28xxu_props, "Peak DVB-T USB", NULL) },
  1498. { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV20_RTL2832U,
  1499. &rtl28xxu_props, "Sveon STV20", NULL) },
  1500. { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV21,
  1501. &rtl28xxu_props, "Sveon STV21", NULL) },
  1502. { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV27,
  1503. &rtl28xxu_props, "Sveon STV27", NULL) },
  1504. { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_TURBOX_DTT_2000,
  1505. &rtl28xxu_props, "TURBO-X Pure TV Tuner DTT-2000", NULL) },
  1506. /* RTL2832P devices: */
  1507. { DVB_USB_DEVICE(USB_VID_HANFTEK, 0x0131,
  1508. &rtl28xxu_props, "Astrometa DVB-T2", NULL) },
  1509. { }
  1510. };
  1511. MODULE_DEVICE_TABLE(usb, rtl28xxu_id_table);
  1512. static struct usb_driver rtl28xxu_usb_driver = {
  1513. .name = KBUILD_MODNAME,
  1514. .id_table = rtl28xxu_id_table,
  1515. .probe = dvb_usbv2_probe,
  1516. .disconnect = dvb_usbv2_disconnect,
  1517. .suspend = dvb_usbv2_suspend,
  1518. .resume = dvb_usbv2_resume,
  1519. .reset_resume = dvb_usbv2_reset_resume,
  1520. .no_dynamic_id = 1,
  1521. .soft_unbind = 1,
  1522. };
  1523. module_usb_driver(rtl28xxu_usb_driver);
  1524. MODULE_DESCRIPTION("Realtek RTL28xxU DVB USB driver");
  1525. MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
  1526. MODULE_AUTHOR("Thomas Mair <thomas.mair86@googlemail.com>");
  1527. MODULE_LICENSE("GPL");