lmedm04.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320
  1. /* DVB USB compliant linux driver for
  2. *
  3. * DM04/QQBOX DVB-S USB BOX LME2510C + SHARP:BS2F7HZ7395
  4. * LME2510C + LG TDQY-P001F
  5. * LME2510C + BS2F7HZ0194
  6. * LME2510 + LG TDQY-P001F
  7. * LME2510 + BS2F7HZ0194
  8. *
  9. * MVB7395 (LME2510C+SHARP:BS2F7HZ7395)
  10. * SHARP:BS2F7HZ7395 = (STV0288+Sharp IX2505V)
  11. *
  12. * MV001F (LME2510+LGTDQY-P001F)
  13. * LG TDQY - P001F =(TDA8263 + TDA10086H)
  14. *
  15. * MVB0001F (LME2510C+LGTDQT-P001F)
  16. *
  17. * MV0194 (LME2510+SHARP:BS2F7HZ0194)
  18. * SHARP:BS2F7HZ0194 = (STV0299+IX2410)
  19. *
  20. * MVB0194 (LME2510C+SHARP0194)
  21. *
  22. * For firmware see Documentation/dvb/lmedm04.txt
  23. *
  24. * I2C addresses:
  25. * 0xd0 - STV0288 - Demodulator
  26. * 0xc0 - Sharp IX2505V - Tuner
  27. * --
  28. * 0x1c - TDA10086 - Demodulator
  29. * 0xc0 - TDA8263 - Tuner
  30. * --
  31. * 0xd0 - STV0299 - Demodulator
  32. * 0xc0 - IX2410 - Tuner
  33. *
  34. *
  35. * VID = 3344 PID LME2510=1122 LME2510C=1120
  36. *
  37. * Copyright (C) 2010 Malcolm Priestley (tvboxspy@gmail.com)
  38. * LME2510(C)(C) Leaguerme (Shenzhen) MicroElectronics Co., Ltd.
  39. *
  40. * This program is free software; you can redistribute it and/or modify
  41. * it under the terms of the GNU General Public License Version 2, as
  42. * published by the Free Software Foundation.
  43. *
  44. * This program is distributed in the hope that it will be useful,
  45. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  46. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  47. * GNU General Public License for more details.
  48. *
  49. * You should have received a copy of the GNU General Public License
  50. * along with this program; if not, write to the Free Software
  51. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  52. *
  53. *
  54. * see Documentation/dvb/README.dvb-usb for more information
  55. *
  56. * Known Issues :
  57. * LME2510: Non Intel USB chipsets fail to maintain High Speed on
  58. * Boot or Hot Plug.
  59. *
  60. * QQbox suffers from noise on LNB voltage.
  61. *
  62. * LME2510: SHARP:BS2F7HZ0194(MV0194) cannot cold reset and share system
  63. * with other tuners. After a cold reset streaming will not start.
  64. *
  65. */
  66. #define DVB_USB_LOG_PREFIX "LME2510(C)"
  67. #include <linux/usb.h>
  68. #include <linux/usb/input.h>
  69. #include <media/rc-core.h>
  70. #include "dvb-usb.h"
  71. #include "lmedm04.h"
  72. #include "tda826x.h"
  73. #include "tda10086.h"
  74. #include "stv0288.h"
  75. #include "ix2505v.h"
  76. #include "stv0299.h"
  77. #include "dvb-pll.h"
  78. #include "z0194a.h"
  79. /* debug */
  80. static int dvb_usb_lme2510_debug;
  81. #define l_dprintk(var, level, args...) do { \
  82. if ((var >= level)) \
  83. printk(KERN_DEBUG DVB_USB_LOG_PREFIX ": " args); \
  84. } while (0)
  85. #define deb_info(level, args...) l_dprintk(dvb_usb_lme2510_debug, level, args)
  86. #define debug_data_snipet(level, name, p) \
  87. deb_info(level, name" (%02x%02x%02x%02x%02x%02x%02x%02x)", \
  88. *p, *(p+1), *(p+2), *(p+3), *(p+4), \
  89. *(p+5), *(p+6), *(p+7));
  90. module_param_named(debug, dvb_usb_lme2510_debug, int, 0644);
  91. MODULE_PARM_DESC(debug, "set debugging level (1=info (or-able))."
  92. DVB_USB_DEBUG_STATUS);
  93. static int dvb_usb_lme2510_firmware;
  94. module_param_named(firmware, dvb_usb_lme2510_firmware, int, 0644);
  95. MODULE_PARM_DESC(firmware, "set default firmware 0=Sharp7395 1=LG");
  96. static int pid_filter;
  97. module_param_named(pid, pid_filter, int, 0644);
  98. MODULE_PARM_DESC(pid, "set default 0=on 1=off");
  99. DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
  100. #define TUNER_DEFAULT 0x0
  101. #define TUNER_LG 0x1
  102. #define TUNER_S7395 0x2
  103. #define TUNER_S0194 0x3
  104. struct lme2510_state {
  105. u8 id;
  106. u8 tuner_config;
  107. u8 signal_lock;
  108. u8 signal_level;
  109. u8 signal_sn;
  110. u8 time_key;
  111. u8 i2c_talk_onoff;
  112. u8 i2c_gate;
  113. u8 i2c_tuner_gate_w;
  114. u8 i2c_tuner_gate_r;
  115. u8 i2c_tuner_addr;
  116. u8 stream_on;
  117. void *buffer;
  118. struct urb *lme_urb;
  119. void *usb_buffer;
  120. };
  121. static int lme2510_bulk_write(struct usb_device *dev,
  122. u8 *snd, int len, u8 pipe)
  123. {
  124. int ret, actual_l;
  125. ret = usb_bulk_msg(dev, usb_sndbulkpipe(dev, pipe),
  126. snd, len , &actual_l, 100);
  127. return ret;
  128. }
  129. static int lme2510_bulk_read(struct usb_device *dev,
  130. u8 *rev, int len, u8 pipe)
  131. {
  132. int ret, actual_l;
  133. ret = usb_bulk_msg(dev, usb_rcvbulkpipe(dev, pipe),
  134. rev, len , &actual_l, 200);
  135. return ret;
  136. }
  137. static int lme2510_usb_talk(struct dvb_usb_device *d,
  138. u8 *wbuf, int wlen, u8 *rbuf, int rlen)
  139. {
  140. struct lme2510_state *st = d->priv;
  141. u8 *buff;
  142. int ret = 0;
  143. if (st->usb_buffer == NULL) {
  144. st->usb_buffer = kmalloc(512, GFP_KERNEL);
  145. if (st->usb_buffer == NULL) {
  146. info("MEM Error no memory");
  147. return -ENOMEM;
  148. }
  149. }
  150. buff = st->usb_buffer;
  151. /* the read/write capped at 512 */
  152. memcpy(buff, wbuf, (wlen > 512) ? 512 : wlen);
  153. ret = mutex_lock_interruptible(&d->usb_mutex);
  154. if (ret < 0)
  155. return -EAGAIN;
  156. ret |= usb_clear_halt(d->udev, usb_sndbulkpipe(d->udev, 0x01));
  157. ret |= lme2510_bulk_write(d->udev, buff, wlen , 0x01);
  158. msleep(10);
  159. ret |= usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, 0x01));
  160. ret |= lme2510_bulk_read(d->udev, buff, (rlen > 512) ?
  161. 512 : rlen , 0x01);
  162. if (rlen > 0)
  163. memcpy(rbuf, buff, rlen);
  164. mutex_unlock(&d->usb_mutex);
  165. return (ret < 0) ? -ENODEV : 0;
  166. }
  167. static int lme2510_stream_restart(struct dvb_usb_device *d)
  168. {
  169. static u8 stream_on[] = LME_ST_ON_W;
  170. int ret;
  171. u8 rbuff[10];
  172. /*Restart Stream Command*/
  173. ret = lme2510_usb_talk(d, stream_on, sizeof(stream_on),
  174. rbuff, sizeof(rbuff));
  175. return ret;
  176. }
  177. static int lme2510_remote_keypress(struct dvb_usb_adapter *adap, u32 keypress)
  178. {
  179. struct dvb_usb_device *d = adap->dev;
  180. deb_info(1, "INT Key Keypress =%04x", keypress);
  181. if (keypress > 0)
  182. rc_keydown(d->rc_dev, keypress, 0);
  183. return 0;
  184. }
  185. static int lme2510_enable_pid(struct dvb_usb_device *d, u8 index, u16 pid_out)
  186. {
  187. struct lme2510_state *st = d->priv;
  188. static u8 pid_buff[] = LME_ZERO_PID;
  189. static u8 rbuf[1];
  190. u8 pid_no = index * 2;
  191. int ret = 0;
  192. deb_info(1, "PID Setting Pid %04x", pid_out);
  193. pid_buff[2] = pid_no;
  194. pid_buff[3] = (u8)pid_out & 0xff;
  195. pid_buff[4] = pid_no + 1;
  196. pid_buff[5] = (u8)(pid_out >> 8);
  197. /* wait for i2c mutex */
  198. ret = mutex_lock_interruptible(&d->i2c_mutex);
  199. if (ret < 0) {
  200. ret = -EAGAIN;
  201. return ret;
  202. }
  203. ret |= lme2510_usb_talk(d, pid_buff ,
  204. sizeof(pid_buff) , rbuf, sizeof(rbuf));
  205. if (st->stream_on & 1)
  206. ret |= lme2510_stream_restart(d);
  207. mutex_unlock(&d->i2c_mutex);
  208. return ret;
  209. }
  210. static void lme2510_int_response(struct urb *lme_urb)
  211. {
  212. struct dvb_usb_adapter *adap = lme_urb->context;
  213. struct lme2510_state *st = adap->dev->priv;
  214. static u8 *ibuf, *rbuf;
  215. int i = 0, offset;
  216. switch (lme_urb->status) {
  217. case 0:
  218. case -ETIMEDOUT:
  219. break;
  220. case -ECONNRESET:
  221. case -ENOENT:
  222. case -ESHUTDOWN:
  223. return;
  224. default:
  225. info("Error %x", lme_urb->status);
  226. break;
  227. }
  228. rbuf = (u8 *) lme_urb->transfer_buffer;
  229. offset = ((lme_urb->actual_length/8) > 4)
  230. ? 4 : (lme_urb->actual_length/8) ;
  231. for (i = 0; i < offset; ++i) {
  232. ibuf = (u8 *)&rbuf[i*8];
  233. deb_info(5, "INT O/S C =%02x C/O=%02x Type =%02x%02x",
  234. offset, i, ibuf[0], ibuf[1]);
  235. switch (ibuf[0]) {
  236. case 0xaa:
  237. debug_data_snipet(1, "INT Remote data snipet in", ibuf);
  238. lme2510_remote_keypress(adap,
  239. (u32)(ibuf[2] << 24) + (ibuf[3] << 16) +
  240. (ibuf[4] << 8) + ibuf[5]);
  241. break;
  242. case 0xbb:
  243. switch (st->tuner_config) {
  244. case TUNER_LG:
  245. if (ibuf[2] > 0)
  246. st->signal_lock = ibuf[2];
  247. st->signal_level = ibuf[4];
  248. st->signal_sn = ibuf[3];
  249. st->time_key = ibuf[7];
  250. break;
  251. case TUNER_S7395:
  252. case TUNER_S0194:
  253. /* Tweak for earlier firmware*/
  254. if (ibuf[1] == 0x03) {
  255. if (ibuf[2] > 1)
  256. st->signal_lock = ibuf[2];
  257. st->signal_level = ibuf[3];
  258. st->signal_sn = ibuf[4];
  259. } else {
  260. st->signal_level = ibuf[4];
  261. st->signal_sn = ibuf[5];
  262. st->signal_lock =
  263. (st->signal_lock & 0xf7) +
  264. ((ibuf[2] & 0x01) << 0x03);
  265. }
  266. break;
  267. default:
  268. break;
  269. }
  270. debug_data_snipet(5, "INT Remote data snipet in", ibuf);
  271. break;
  272. case 0xcc:
  273. debug_data_snipet(1, "INT Control data snipet", ibuf);
  274. break;
  275. default:
  276. debug_data_snipet(1, "INT Unknown data snipet", ibuf);
  277. break;
  278. }
  279. }
  280. usb_submit_urb(lme_urb, GFP_ATOMIC);
  281. }
  282. static int lme2510_int_read(struct dvb_usb_adapter *adap)
  283. {
  284. struct lme2510_state *lme_int = adap->dev->priv;
  285. lme_int->lme_urb = usb_alloc_urb(0, GFP_ATOMIC);
  286. if (lme_int->lme_urb == NULL)
  287. return -ENOMEM;
  288. lme_int->buffer = usb_alloc_coherent(adap->dev->udev, 5000, GFP_ATOMIC,
  289. &lme_int->lme_urb->transfer_dma);
  290. if (lme_int->buffer == NULL)
  291. return -ENOMEM;
  292. usb_fill_int_urb(lme_int->lme_urb,
  293. adap->dev->udev,
  294. usb_rcvintpipe(adap->dev->udev, 0xa),
  295. lme_int->buffer,
  296. 4096,
  297. lme2510_int_response,
  298. adap,
  299. 11);
  300. lme_int->lme_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
  301. usb_submit_urb(lme_int->lme_urb, GFP_ATOMIC);
  302. info("INT Interrupt Service Started");
  303. return 0;
  304. }
  305. static int lme2510_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
  306. {
  307. static u8 clear_pid_reg[] = LME_CLEAR_PID;
  308. static u8 rbuf[1];
  309. int ret = 0;
  310. deb_info(1, "PID Clearing Filter");
  311. ret = mutex_lock_interruptible(&adap->dev->i2c_mutex);
  312. if (!onoff)
  313. ret |= lme2510_usb_talk(adap->dev, clear_pid_reg,
  314. sizeof(clear_pid_reg), rbuf, sizeof(rbuf));
  315. mutex_unlock(&adap->dev->i2c_mutex);
  316. return 0;
  317. }
  318. static int lme2510_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
  319. int onoff)
  320. {
  321. int ret = 0;
  322. deb_info(3, "%s PID=%04x Index=%04x onoff=%02x", __func__,
  323. pid, index, onoff);
  324. if (onoff)
  325. if (!pid_filter)
  326. ret = lme2510_enable_pid(adap->dev, index, pid);
  327. return ret;
  328. }
  329. static int lme2510_return_status(struct usb_device *dev)
  330. {
  331. int ret = 0;
  332. u8 *data;
  333. data = kzalloc(10, GFP_KERNEL);
  334. if (!data)
  335. return -ENOMEM;
  336. ret |= usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
  337. 0x06, 0x80, 0x0302, 0x00, data, 0x0006, 200);
  338. info("Firmware Status: %x (%x)", ret , data[2]);
  339. ret = (ret < 0) ? -ENODEV : data[2];
  340. kfree(data);
  341. return ret;
  342. }
  343. static int lme2510_msg(struct dvb_usb_device *d,
  344. u8 *wbuf, int wlen, u8 *rbuf, int rlen)
  345. {
  346. int ret = 0;
  347. struct lme2510_state *st = d->priv;
  348. if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
  349. return -EAGAIN;
  350. if (st->i2c_talk_onoff == 1) {
  351. ret = lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen);
  352. switch (st->tuner_config) {
  353. case TUNER_LG:
  354. if (wbuf[2] == 0x1c) {
  355. if (wbuf[3] == 0x0e) {
  356. st->signal_lock = rbuf[1];
  357. if ((st->stream_on & 1) &&
  358. (st->signal_lock & 0x10)) {
  359. lme2510_stream_restart(d);
  360. st->i2c_talk_onoff = 0;
  361. }
  362. msleep(80);
  363. }
  364. }
  365. break;
  366. case TUNER_S7395:
  367. if (wbuf[2] == 0xd0) {
  368. if (wbuf[3] == 0x24) {
  369. st->signal_lock = rbuf[1];
  370. if ((st->stream_on & 1) &&
  371. (st->signal_lock & 0x8)) {
  372. lme2510_stream_restart(d);
  373. st->i2c_talk_onoff = 0;
  374. }
  375. }
  376. if ((wbuf[3] != 0x6) & (wbuf[3] != 0x5))
  377. msleep(5);
  378. }
  379. break;
  380. case TUNER_S0194:
  381. if (wbuf[2] == 0xd0) {
  382. if (wbuf[3] == 0x1b) {
  383. st->signal_lock = rbuf[1];
  384. if ((st->stream_on & 1) &&
  385. (st->signal_lock & 0x8)) {
  386. lme2510_stream_restart(d);
  387. st->i2c_talk_onoff = 0;
  388. }
  389. }
  390. }
  391. break;
  392. default:
  393. break;
  394. }
  395. } else {
  396. switch (st->tuner_config) {
  397. case TUNER_LG:
  398. switch (wbuf[3]) {
  399. case 0x0e:
  400. rbuf[0] = 0x55;
  401. rbuf[1] = st->signal_lock;
  402. break;
  403. case 0x43:
  404. rbuf[0] = 0x55;
  405. rbuf[1] = st->signal_level;
  406. break;
  407. case 0x1c:
  408. rbuf[0] = 0x55;
  409. rbuf[1] = st->signal_sn;
  410. break;
  411. case 0x15:
  412. case 0x16:
  413. case 0x17:
  414. case 0x18:
  415. rbuf[0] = 0x55;
  416. rbuf[1] = 0x00;
  417. break;
  418. default:
  419. lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen);
  420. st->i2c_talk_onoff = 1;
  421. break;
  422. }
  423. break;
  424. case TUNER_S7395:
  425. switch (wbuf[3]) {
  426. case 0x10:
  427. rbuf[0] = 0x55;
  428. rbuf[1] = (st->signal_level & 0x80)
  429. ? 0 : (st->signal_level * 2);
  430. break;
  431. case 0x2d:
  432. rbuf[0] = 0x55;
  433. rbuf[1] = st->signal_sn;
  434. break;
  435. case 0x24:
  436. rbuf[0] = 0x55;
  437. rbuf[1] = st->signal_lock;
  438. break;
  439. case 0x2e:
  440. case 0x26:
  441. case 0x27:
  442. rbuf[0] = 0x55;
  443. rbuf[1] = 0x00;
  444. break;
  445. default:
  446. lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen);
  447. st->i2c_talk_onoff = 1;
  448. break;
  449. }
  450. break;
  451. case TUNER_S0194:
  452. switch (wbuf[3]) {
  453. case 0x18:
  454. rbuf[0] = 0x55;
  455. rbuf[1] = (st->signal_level & 0x80)
  456. ? 0 : (st->signal_level * 2);
  457. break;
  458. case 0x24:
  459. rbuf[0] = 0x55;
  460. rbuf[1] = st->signal_sn;
  461. break;
  462. case 0x1b:
  463. rbuf[0] = 0x55;
  464. rbuf[1] = st->signal_lock;
  465. break;
  466. case 0x19:
  467. case 0x25:
  468. case 0x1e:
  469. case 0x1d:
  470. rbuf[0] = 0x55;
  471. rbuf[1] = 0x00;
  472. break;
  473. default:
  474. lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen);
  475. st->i2c_talk_onoff = 1;
  476. break;
  477. }
  478. break;
  479. default:
  480. break;
  481. }
  482. deb_info(4, "I2C From Interrupt Message out(%02x) in(%02x)",
  483. wbuf[3], rbuf[1]);
  484. }
  485. mutex_unlock(&d->i2c_mutex);
  486. return ret;
  487. }
  488. static int lme2510_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
  489. int num)
  490. {
  491. struct dvb_usb_device *d = i2c_get_adapdata(adap);
  492. struct lme2510_state *st = d->priv;
  493. static u8 obuf[64], ibuf[512];
  494. int i, read, read_o;
  495. u16 len;
  496. u8 gate = st->i2c_gate;
  497. if (gate == 0)
  498. gate = 5;
  499. if (num > 2)
  500. warn("more than 2 i2c messages"
  501. "at a time is not handled yet. TODO.");
  502. for (i = 0; i < num; i++) {
  503. read_o = 1 & (msg[i].flags & I2C_M_RD);
  504. read = i+1 < num && (msg[i+1].flags & I2C_M_RD);
  505. read |= read_o;
  506. gate = (msg[i].addr == st->i2c_tuner_addr)
  507. ? (read) ? st->i2c_tuner_gate_r
  508. : st->i2c_tuner_gate_w
  509. : st->i2c_gate;
  510. obuf[0] = gate | (read << 7);
  511. if (gate == 5)
  512. obuf[1] = (read) ? 2 : msg[i].len + 1;
  513. else
  514. obuf[1] = msg[i].len + read + 1;
  515. obuf[2] = msg[i].addr;
  516. if (read) {
  517. if (read_o)
  518. len = 3;
  519. else {
  520. memcpy(&obuf[3], msg[i].buf, msg[i].len);
  521. obuf[msg[i].len+3] = msg[i+1].len;
  522. len = msg[i].len+4;
  523. }
  524. } else {
  525. memcpy(&obuf[3], msg[i].buf, msg[i].len);
  526. len = msg[i].len+3;
  527. }
  528. if (lme2510_msg(d, obuf, len, ibuf, 512) < 0) {
  529. deb_info(1, "i2c transfer failed.");
  530. return -EAGAIN;
  531. }
  532. if (read) {
  533. if (read_o)
  534. memcpy(msg[i].buf, &ibuf[1], msg[i].len);
  535. else {
  536. memcpy(msg[i+1].buf, &ibuf[1], msg[i+1].len);
  537. i++;
  538. }
  539. }
  540. }
  541. return i;
  542. }
  543. static u32 lme2510_i2c_func(struct i2c_adapter *adapter)
  544. {
  545. return I2C_FUNC_I2C;
  546. }
  547. static struct i2c_algorithm lme2510_i2c_algo = {
  548. .master_xfer = lme2510_i2c_xfer,
  549. .functionality = lme2510_i2c_func,
  550. };
  551. /* Callbacks for DVB USB */
  552. static int lme2510_identify_state(struct usb_device *udev,
  553. struct dvb_usb_device_properties *props,
  554. struct dvb_usb_device_description **desc,
  555. int *cold)
  556. {
  557. *cold = 0;
  558. return 0;
  559. }
  560. static int lme2510_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
  561. {
  562. struct lme2510_state *st = adap->dev->priv;
  563. static u8 clear_reg_3[] = LME_CLEAR_PID;
  564. static u8 rbuf[1];
  565. int ret = 0, rlen = sizeof(rbuf);
  566. deb_info(1, "STM (%02x)", onoff);
  567. /* Streaming is started by FE_HAS_LOCK */
  568. if (onoff == 1)
  569. st->stream_on = 1;
  570. else {
  571. deb_info(1, "STM Steam Off");
  572. /* mutex is here only to avoid collision with I2C */
  573. if (mutex_lock_interruptible(&adap->dev->i2c_mutex) < 0)
  574. return -EAGAIN;
  575. ret = lme2510_usb_talk(adap->dev, clear_reg_3,
  576. sizeof(clear_reg_3), rbuf, rlen);
  577. st->stream_on = 0;
  578. st->i2c_talk_onoff = 1;
  579. mutex_unlock(&adap->dev->i2c_mutex);
  580. }
  581. return (ret < 0) ? -ENODEV : 0;
  582. }
  583. static int lme2510_int_service(struct dvb_usb_adapter *adap)
  584. {
  585. struct dvb_usb_device *d = adap->dev;
  586. struct rc_dev *rc;
  587. int ret;
  588. info("STA Configuring Remote");
  589. rc = rc_allocate_device();
  590. if (!rc)
  591. return -ENOMEM;
  592. usb_make_path(d->udev, d->rc_phys, sizeof(d->rc_phys));
  593. strlcat(d->rc_phys, "/ir0", sizeof(d->rc_phys));
  594. rc->input_name = "LME2510 Remote Control";
  595. rc->input_phys = d->rc_phys;
  596. rc->map_name = RC_MAP_LME2510;
  597. rc->driver_name = "LME 2510";
  598. usb_to_input_id(d->udev, &rc->input_id);
  599. ret = rc_register_device(rc);
  600. if (ret) {
  601. rc_free_device(rc);
  602. return ret;
  603. }
  604. d->rc_dev = rc;
  605. /* Start the Interrupt */
  606. ret = lme2510_int_read(adap);
  607. if (ret < 0) {
  608. rc_unregister_device(rc);
  609. info("INT Unable to start Interrupt Service");
  610. return -ENODEV;
  611. }
  612. return 0;
  613. }
  614. static u8 check_sum(u8 *p, u8 len)
  615. {
  616. u8 sum = 0;
  617. while (len--)
  618. sum += *p++;
  619. return sum;
  620. }
  621. static int lme2510_download_firmware(struct usb_device *dev,
  622. const struct firmware *fw)
  623. {
  624. int ret = 0;
  625. u8 *data;
  626. u16 j, wlen, len_in, start, end;
  627. u8 packet_size, dlen, i;
  628. u8 *fw_data;
  629. packet_size = 0x31;
  630. len_in = 1;
  631. data = kzalloc(512, GFP_KERNEL);
  632. if (!data) {
  633. info("FRM Could not start Firmware Download (Buffer allocation failed)");
  634. return -ENOMEM;
  635. }
  636. info("FRM Starting Firmware Download");
  637. for (i = 1; i < 3; i++) {
  638. start = (i == 1) ? 0 : 512;
  639. end = (i == 1) ? 512 : fw->size;
  640. for (j = start; j < end; j += (packet_size+1)) {
  641. fw_data = (u8 *)(fw->data + j);
  642. if ((end - j) > packet_size) {
  643. data[0] = i;
  644. dlen = packet_size;
  645. } else {
  646. data[0] = i | 0x80;
  647. dlen = (u8)(end - j)-1;
  648. }
  649. data[1] = dlen;
  650. memcpy(&data[2], fw_data, dlen+1);
  651. wlen = (u8) dlen + 4;
  652. data[wlen-1] = check_sum(fw_data, dlen+1);
  653. deb_info(1, "Data S=%02x:E=%02x CS= %02x", data[3],
  654. data[dlen+2], data[dlen+3]);
  655. ret |= lme2510_bulk_write(dev, data, wlen, 1);
  656. ret |= lme2510_bulk_read(dev, data, len_in , 1);
  657. ret |= (data[0] == 0x88) ? 0 : -1;
  658. }
  659. }
  660. usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
  661. 0x06, 0x80, 0x0200, 0x00, data, 0x0109, 1000);
  662. data[0] = 0x8a;
  663. len_in = 1;
  664. msleep(2000);
  665. ret |= lme2510_bulk_write(dev, data , len_in, 1); /*Resetting*/
  666. ret |= lme2510_bulk_read(dev, data, len_in, 1);
  667. msleep(400);
  668. if (ret < 0)
  669. info("FRM Firmware Download Failed (%04x)" , ret);
  670. else
  671. info("FRM Firmware Download Completed - Resetting Device");
  672. kfree(data);
  673. return (ret < 0) ? -ENODEV : 0;
  674. }
  675. static void lme_coldreset(struct usb_device *dev)
  676. {
  677. int ret = 0, len_in;
  678. u8 data[512] = {0};
  679. data[0] = 0x0a;
  680. len_in = 1;
  681. info("FRM Firmware Cold Reset");
  682. ret |= lme2510_bulk_write(dev, data , len_in, 1); /*Cold Resetting*/
  683. ret |= lme2510_bulk_read(dev, data, len_in, 1);
  684. return;
  685. }
  686. static int lme_firmware_switch(struct usb_device *udev, int cold)
  687. {
  688. const struct firmware *fw = NULL;
  689. const char fw_c_s7395[] = "dvb-usb-lme2510c-s7395.fw";
  690. const char fw_c_lg[] = "dvb-usb-lme2510c-lg.fw";
  691. const char fw_c_s0194[] = "dvb-usb-lme2510c-s0194.fw";
  692. const char fw_lg[] = "dvb-usb-lme2510-lg.fw";
  693. const char fw_s0194[] = "dvb-usb-lme2510-s0194.fw";
  694. const char *fw_lme;
  695. int ret, cold_fw;
  696. cold = (cold > 0) ? (cold & 1) : 0;
  697. cold_fw = !cold;
  698. if (udev->descriptor.idProduct == 0x1122) {
  699. switch (dvb_usb_lme2510_firmware) {
  700. default:
  701. dvb_usb_lme2510_firmware = TUNER_S0194;
  702. case TUNER_S0194:
  703. fw_lme = fw_s0194;
  704. ret = request_firmware(&fw, fw_lme, &udev->dev);
  705. if (ret == 0) {
  706. cold = 0;
  707. break;
  708. }
  709. dvb_usb_lme2510_firmware = TUNER_LG;
  710. case TUNER_LG:
  711. fw_lme = fw_lg;
  712. ret = request_firmware(&fw, fw_lme, &udev->dev);
  713. if (ret == 0)
  714. break;
  715. info("FRM No Firmware Found - please install");
  716. dvb_usb_lme2510_firmware = TUNER_DEFAULT;
  717. cold = 0;
  718. cold_fw = 0;
  719. break;
  720. }
  721. } else {
  722. switch (dvb_usb_lme2510_firmware) {
  723. default:
  724. dvb_usb_lme2510_firmware = TUNER_S7395;
  725. case TUNER_S7395:
  726. fw_lme = fw_c_s7395;
  727. ret = request_firmware(&fw, fw_lme, &udev->dev);
  728. if (ret == 0) {
  729. cold = 0;
  730. break;
  731. }
  732. dvb_usb_lme2510_firmware = TUNER_LG;
  733. case TUNER_LG:
  734. fw_lme = fw_c_lg;
  735. ret = request_firmware(&fw, fw_lme, &udev->dev);
  736. if (ret == 0)
  737. break;
  738. dvb_usb_lme2510_firmware = TUNER_S0194;
  739. case TUNER_S0194:
  740. fw_lme = fw_c_s0194;
  741. ret = request_firmware(&fw, fw_lme, &udev->dev);
  742. if (ret == 0)
  743. break;
  744. info("FRM No Firmware Found - please install");
  745. dvb_usb_lme2510_firmware = TUNER_DEFAULT;
  746. cold = 0;
  747. cold_fw = 0;
  748. break;
  749. }
  750. }
  751. if (cold_fw) {
  752. info("FRM Loading %s file", fw_lme);
  753. ret = lme2510_download_firmware(udev, fw);
  754. }
  755. release_firmware(fw);
  756. if (cold) {
  757. info("FRM Changing to %s firmware", fw_lme);
  758. lme_coldreset(udev);
  759. return -ENODEV;
  760. }
  761. return ret;
  762. }
  763. static int lme2510_kill_urb(struct usb_data_stream *stream)
  764. {
  765. int i;
  766. for (i = 0; i < stream->urbs_submitted; i++) {
  767. deb_info(3, "killing URB no. %d.", i);
  768. /* stop the URB */
  769. usb_kill_urb(stream->urb_list[i]);
  770. }
  771. stream->urbs_submitted = 0;
  772. return 0;
  773. }
  774. static struct tda10086_config tda10086_config = {
  775. .demod_address = 0x1c,
  776. .invert = 0,
  777. .diseqc_tone = 1,
  778. .xtal_freq = TDA10086_XTAL_16M,
  779. };
  780. static struct stv0288_config lme_config = {
  781. .demod_address = 0xd0,
  782. .min_delay_ms = 15,
  783. .inittab = s7395_inittab,
  784. };
  785. static struct ix2505v_config lme_tuner = {
  786. .tuner_address = 0xc0,
  787. .min_delay_ms = 100,
  788. .tuner_gain = 0x0,
  789. .tuner_chargepump = 0x3,
  790. };
  791. static struct stv0299_config sharp_z0194_config = {
  792. .demod_address = 0xd0,
  793. .inittab = sharp_z0194a_inittab,
  794. .mclk = 88000000UL,
  795. .invert = 0,
  796. .skip_reinit = 0,
  797. .lock_output = STV0299_LOCKOUTPUT_1,
  798. .volt13_op0_op1 = STV0299_VOLT13_OP1,
  799. .min_delay_ms = 100,
  800. .set_symbol_rate = sharp_z0194a_set_symbol_rate,
  801. };
  802. static int dm04_lme2510_set_voltage(struct dvb_frontend *fe,
  803. fe_sec_voltage_t voltage)
  804. {
  805. struct dvb_usb_adapter *adap = fe->dvb->priv;
  806. static u8 voltage_low[] = LME_VOLTAGE_L;
  807. static u8 voltage_high[] = LME_VOLTAGE_H;
  808. static u8 rbuf[1];
  809. int ret = 0, len = 3, rlen = 1;
  810. if (mutex_lock_interruptible(&adap->dev->i2c_mutex) < 0)
  811. return -EAGAIN;
  812. switch (voltage) {
  813. case SEC_VOLTAGE_18:
  814. ret |= lme2510_usb_talk(adap->dev,
  815. voltage_high, len, rbuf, rlen);
  816. break;
  817. case SEC_VOLTAGE_OFF:
  818. case SEC_VOLTAGE_13:
  819. default:
  820. ret |= lme2510_usb_talk(adap->dev,
  821. voltage_low, len, rbuf, rlen);
  822. break;
  823. }
  824. mutex_unlock(&adap->dev->i2c_mutex);
  825. return (ret < 0) ? -ENODEV : 0;
  826. }
  827. static int lme_name(struct dvb_usb_adapter *adap)
  828. {
  829. struct lme2510_state *st = adap->dev->priv;
  830. const char *desc = adap->dev->desc->name;
  831. char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395",
  832. " SHARP:BS2F7HZ0194"};
  833. char *name = adap->fe->ops.info.name;
  834. strlcpy(name, desc, 128);
  835. strlcat(name, fe_name[st->tuner_config], 128);
  836. return 0;
  837. }
  838. static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
  839. {
  840. struct lme2510_state *st = adap->dev->priv;
  841. int ret = 0;
  842. st->i2c_talk_onoff = 1;
  843. st->i2c_gate = 4;
  844. adap->fe = dvb_attach(tda10086_attach, &tda10086_config,
  845. &adap->dev->i2c_adap);
  846. if (adap->fe) {
  847. info("TUN Found Frontend TDA10086");
  848. st->i2c_tuner_gate_w = 4;
  849. st->i2c_tuner_gate_r = 4;
  850. st->i2c_tuner_addr = 0xc0;
  851. st->tuner_config = TUNER_LG;
  852. if (dvb_usb_lme2510_firmware != TUNER_LG) {
  853. dvb_usb_lme2510_firmware = TUNER_LG;
  854. ret = lme_firmware_switch(adap->dev->udev, 1);
  855. }
  856. goto end;
  857. }
  858. st->i2c_gate = 4;
  859. adap->fe = dvb_attach(stv0299_attach, &sharp_z0194_config,
  860. &adap->dev->i2c_adap);
  861. if (adap->fe) {
  862. info("FE Found Stv0299");
  863. st->i2c_tuner_gate_w = 4;
  864. st->i2c_tuner_gate_r = 5;
  865. st->i2c_tuner_addr = 0xc0;
  866. st->tuner_config = TUNER_S0194;
  867. if (dvb_usb_lme2510_firmware != TUNER_S0194) {
  868. dvb_usb_lme2510_firmware = TUNER_S0194;
  869. ret = lme_firmware_switch(adap->dev->udev, 1);
  870. }
  871. goto end;
  872. }
  873. st->i2c_gate = 5;
  874. adap->fe = dvb_attach(stv0288_attach, &lme_config,
  875. &adap->dev->i2c_adap);
  876. if (adap->fe) {
  877. info("FE Found Stv0288");
  878. st->i2c_tuner_gate_w = 4;
  879. st->i2c_tuner_gate_r = 5;
  880. st->i2c_tuner_addr = 0xc0;
  881. st->tuner_config = TUNER_S7395;
  882. if (dvb_usb_lme2510_firmware != TUNER_S7395) {
  883. dvb_usb_lme2510_firmware = TUNER_S7395;
  884. ret = lme_firmware_switch(adap->dev->udev, 1);
  885. }
  886. } else {
  887. info("DM04 Not Supported");
  888. return -ENODEV;
  889. }
  890. end: if (ret) {
  891. kfree(adap->fe);
  892. adap->fe = NULL;
  893. return -ENODEV;
  894. }
  895. adap->fe->ops.set_voltage = dm04_lme2510_set_voltage;
  896. ret = lme_name(adap);
  897. return ret;
  898. }
  899. static int dm04_lme2510_tuner(struct dvb_usb_adapter *adap)
  900. {
  901. struct lme2510_state *st = adap->dev->priv;
  902. char *tun_msg[] = {"", "TDA8263", "IX2505V", "DVB_PLL_OPERA"};
  903. int ret = 0;
  904. switch (st->tuner_config) {
  905. case TUNER_LG:
  906. if (dvb_attach(tda826x_attach, adap->fe, 0xc0,
  907. &adap->dev->i2c_adap, 1))
  908. ret = st->tuner_config;
  909. break;
  910. case TUNER_S7395:
  911. if (dvb_attach(ix2505v_attach , adap->fe, &lme_tuner,
  912. &adap->dev->i2c_adap))
  913. ret = st->tuner_config;
  914. break;
  915. case TUNER_S0194:
  916. if (dvb_attach(dvb_pll_attach , adap->fe, 0xc0,
  917. &adap->dev->i2c_adap, DVB_PLL_OPERA1))
  918. ret = st->tuner_config;
  919. break;
  920. default:
  921. break;
  922. }
  923. if (ret)
  924. info("TUN Found %s tuner", tun_msg[ret]);
  925. else {
  926. info("TUN No tuner found --- reseting device");
  927. lme_coldreset(adap->dev->udev);
  928. return -ENODEV;
  929. }
  930. /* Start the Interrupt & Remote*/
  931. ret = lme2510_int_service(adap);
  932. return ret;
  933. }
  934. static int lme2510_powerup(struct dvb_usb_device *d, int onoff)
  935. {
  936. struct lme2510_state *st = d->priv;
  937. static u8 lnb_on[] = LNB_ON;
  938. static u8 lnb_off[] = LNB_OFF;
  939. static u8 rbuf[1];
  940. int ret, len = 3, rlen = 1;
  941. if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
  942. return -EAGAIN;
  943. if (onoff)
  944. ret = lme2510_usb_talk(d, lnb_on, len, rbuf, rlen);
  945. else
  946. ret = lme2510_usb_talk(d, lnb_off, len, rbuf, rlen);
  947. st->i2c_talk_onoff = 1;
  948. mutex_unlock(&d->i2c_mutex);
  949. return ret;
  950. }
  951. /* DVB USB Driver stuff */
  952. static struct dvb_usb_device_properties lme2510_properties;
  953. static struct dvb_usb_device_properties lme2510c_properties;
  954. static int lme2510_probe(struct usb_interface *intf,
  955. const struct usb_device_id *id)
  956. {
  957. struct usb_device *udev = interface_to_usbdev(intf);
  958. int ret = 0;
  959. usb_reset_configuration(udev);
  960. usb_set_interface(udev, intf->cur_altsetting->desc.bInterfaceNumber, 1);
  961. if (udev->speed != USB_SPEED_HIGH) {
  962. ret = usb_reset_device(udev);
  963. info("DEV Failed to connect in HIGH SPEED mode");
  964. return -ENODEV;
  965. }
  966. if (lme2510_return_status(udev) == 0x44) {
  967. lme_firmware_switch(udev, 0);
  968. return -ENODEV;
  969. }
  970. if (0 == dvb_usb_device_init(intf, &lme2510_properties,
  971. THIS_MODULE, NULL, adapter_nr)) {
  972. info("DEV registering device driver");
  973. return 0;
  974. }
  975. if (0 == dvb_usb_device_init(intf, &lme2510c_properties,
  976. THIS_MODULE, NULL, adapter_nr)) {
  977. info("DEV registering device driver");
  978. return 0;
  979. }
  980. info("DEV lme2510 Error");
  981. return -ENODEV;
  982. }
  983. static struct usb_device_id lme2510_table[] = {
  984. { USB_DEVICE(0x3344, 0x1122) }, /* LME2510 */
  985. { USB_DEVICE(0x3344, 0x1120) }, /* LME2510C */
  986. {} /* Terminating entry */
  987. };
  988. MODULE_DEVICE_TABLE(usb, lme2510_table);
  989. static struct dvb_usb_device_properties lme2510_properties = {
  990. .caps = DVB_USB_IS_AN_I2C_ADAPTER,
  991. .size_of_priv = sizeof(struct lme2510_state),
  992. .num_adapters = 1,
  993. .adapter = {
  994. {
  995. .caps = DVB_USB_ADAP_HAS_PID_FILTER|
  996. DVB_USB_ADAP_NEED_PID_FILTERING|
  997. DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
  998. .streaming_ctrl = lme2510_streaming_ctrl,
  999. .pid_filter_count = 15,
  1000. .pid_filter = lme2510_pid_filter,
  1001. .pid_filter_ctrl = lme2510_pid_filter_ctrl,
  1002. .frontend_attach = dm04_lme2510_frontend_attach,
  1003. .tuner_attach = dm04_lme2510_tuner,
  1004. /* parameter for the MPEG2-data transfer */
  1005. .stream = {
  1006. .type = USB_BULK,
  1007. .count = 10,
  1008. .endpoint = 0x06,
  1009. .u = {
  1010. .bulk = {
  1011. .buffersize = 4096,
  1012. }
  1013. }
  1014. }
  1015. }
  1016. },
  1017. .power_ctrl = lme2510_powerup,
  1018. .identify_state = lme2510_identify_state,
  1019. .i2c_algo = &lme2510_i2c_algo,
  1020. .generic_bulk_ctrl_endpoint = 0,
  1021. .num_device_descs = 1,
  1022. .devices = {
  1023. { "DM04_LME2510_DVB-S",
  1024. { &lme2510_table[0], NULL },
  1025. },
  1026. }
  1027. };
  1028. static struct dvb_usb_device_properties lme2510c_properties = {
  1029. .caps = DVB_USB_IS_AN_I2C_ADAPTER,
  1030. .size_of_priv = sizeof(struct lme2510_state),
  1031. .num_adapters = 1,
  1032. .adapter = {
  1033. {
  1034. .caps = DVB_USB_ADAP_HAS_PID_FILTER|
  1035. DVB_USB_ADAP_NEED_PID_FILTERING|
  1036. DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
  1037. .streaming_ctrl = lme2510_streaming_ctrl,
  1038. .pid_filter_count = 15,
  1039. .pid_filter = lme2510_pid_filter,
  1040. .pid_filter_ctrl = lme2510_pid_filter_ctrl,
  1041. .frontend_attach = dm04_lme2510_frontend_attach,
  1042. .tuner_attach = dm04_lme2510_tuner,
  1043. /* parameter for the MPEG2-data transfer */
  1044. .stream = {
  1045. .type = USB_BULK,
  1046. .count = 10,
  1047. .endpoint = 0x8,
  1048. .u = {
  1049. .bulk = {
  1050. .buffersize = 4096,
  1051. }
  1052. }
  1053. }
  1054. }
  1055. },
  1056. .power_ctrl = lme2510_powerup,
  1057. .identify_state = lme2510_identify_state,
  1058. .i2c_algo = &lme2510_i2c_algo,
  1059. .generic_bulk_ctrl_endpoint = 0,
  1060. .num_device_descs = 1,
  1061. .devices = {
  1062. { "DM04_LME2510C_DVB-S",
  1063. { &lme2510_table[1], NULL },
  1064. },
  1065. }
  1066. };
  1067. void *lme2510_exit_int(struct dvb_usb_device *d)
  1068. {
  1069. struct lme2510_state *st = d->priv;
  1070. struct dvb_usb_adapter *adap = &d->adapter[0];
  1071. void *buffer = NULL;
  1072. if (adap != NULL) {
  1073. lme2510_kill_urb(&adap->stream);
  1074. adap->feedcount = 0;
  1075. }
  1076. if (st->lme_urb != NULL) {
  1077. st->i2c_talk_onoff = 1;
  1078. st->signal_lock = 0;
  1079. st->signal_level = 0;
  1080. st->signal_sn = 0;
  1081. buffer = st->usb_buffer;
  1082. usb_kill_urb(st->lme_urb);
  1083. usb_free_coherent(d->udev, 5000, st->buffer,
  1084. st->lme_urb->transfer_dma);
  1085. info("Interrupt Service Stopped");
  1086. rc_unregister_device(d->rc_dev);
  1087. info("Remote Stopped");
  1088. }
  1089. return buffer;
  1090. }
  1091. void lme2510_exit(struct usb_interface *intf)
  1092. {
  1093. struct dvb_usb_device *d = usb_get_intfdata(intf);
  1094. void *usb_buffer;
  1095. if (d != NULL) {
  1096. usb_buffer = lme2510_exit_int(d);
  1097. dvb_usb_device_exit(intf);
  1098. kfree(usb_buffer);
  1099. }
  1100. }
  1101. static struct usb_driver lme2510_driver = {
  1102. .name = "LME2510C_DVB-S",
  1103. .probe = lme2510_probe,
  1104. .disconnect = lme2510_exit,
  1105. .id_table = lme2510_table,
  1106. };
  1107. /* module stuff */
  1108. static int __init lme2510_module_init(void)
  1109. {
  1110. int result = usb_register(&lme2510_driver);
  1111. if (result) {
  1112. err("usb_register failed. Error number %d", result);
  1113. return result;
  1114. }
  1115. return 0;
  1116. }
  1117. static void __exit lme2510_module_exit(void)
  1118. {
  1119. /* deregister this driver from the USB subsystem */
  1120. usb_deregister(&lme2510_driver);
  1121. }
  1122. module_init(lme2510_module_init);
  1123. module_exit(lme2510_module_exit);
  1124. MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>");
  1125. MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0");
  1126. MODULE_VERSION("1.84");
  1127. MODULE_LICENSE("GPL");