lmedm04.c 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331
  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. u8 pid_size;
  118. void *buffer;
  119. struct urb *lme_urb;
  120. void *usb_buffer;
  121. };
  122. static int lme2510_bulk_write(struct usb_device *dev,
  123. u8 *snd, int len, u8 pipe)
  124. {
  125. int ret, actual_l;
  126. ret = usb_bulk_msg(dev, usb_sndbulkpipe(dev, pipe),
  127. snd, len , &actual_l, 100);
  128. return ret;
  129. }
  130. static int lme2510_bulk_read(struct usb_device *dev,
  131. u8 *rev, int len, u8 pipe)
  132. {
  133. int ret, actual_l;
  134. ret = usb_bulk_msg(dev, usb_rcvbulkpipe(dev, pipe),
  135. rev, len , &actual_l, 200);
  136. return ret;
  137. }
  138. static int lme2510_usb_talk(struct dvb_usb_device *d,
  139. u8 *wbuf, int wlen, u8 *rbuf, int rlen)
  140. {
  141. struct lme2510_state *st = d->priv;
  142. u8 *buff;
  143. int ret = 0;
  144. if (st->usb_buffer == NULL) {
  145. st->usb_buffer = kmalloc(512, GFP_KERNEL);
  146. if (st->usb_buffer == NULL) {
  147. info("MEM Error no memory");
  148. return -ENOMEM;
  149. }
  150. }
  151. buff = st->usb_buffer;
  152. ret = mutex_lock_interruptible(&d->usb_mutex);
  153. if (ret < 0)
  154. return -EAGAIN;
  155. /* the read/write capped at 512 */
  156. memcpy(buff, wbuf, (wlen > 512) ? 512 : wlen);
  157. ret |= usb_clear_halt(d->udev, usb_sndbulkpipe(d->udev, 0x01));
  158. ret |= lme2510_bulk_write(d->udev, buff, wlen , 0x01);
  159. msleep(10);
  160. ret |= usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, 0x01));
  161. ret |= lme2510_bulk_read(d->udev, buff, (rlen > 512) ?
  162. 512 : rlen , 0x01);
  163. if (rlen > 0)
  164. memcpy(rbuf, buff, rlen);
  165. mutex_unlock(&d->usb_mutex);
  166. return (ret < 0) ? -ENODEV : 0;
  167. }
  168. static int lme2510_stream_restart(struct dvb_usb_device *d)
  169. {
  170. static u8 stream_on[] = LME_ST_ON_W;
  171. int ret;
  172. u8 rbuff[10];
  173. /*Restart Stream Command*/
  174. ret = lme2510_usb_talk(d, stream_on, sizeof(stream_on),
  175. rbuff, sizeof(rbuff));
  176. return ret;
  177. }
  178. static int lme2510_remote_keypress(struct dvb_usb_adapter *adap, u32 keypress)
  179. {
  180. struct dvb_usb_device *d = adap->dev;
  181. deb_info(1, "INT Key Keypress =%04x", keypress);
  182. if (keypress > 0)
  183. rc_keydown(d->rc_dev, keypress, 0);
  184. return 0;
  185. }
  186. static int lme2510_enable_pid(struct dvb_usb_device *d, u8 index, u16 pid_out)
  187. {
  188. struct lme2510_state *st = d->priv;
  189. static u8 pid_buff[] = LME_ZERO_PID;
  190. static u8 rbuf[1];
  191. u8 pid_no = index * 2;
  192. u8 pid_len = pid_no + 2;
  193. int ret = 0;
  194. deb_info(1, "PID Setting Pid %04x", pid_out);
  195. if (st->pid_size == 0)
  196. ret |= lme2510_stream_restart(d);
  197. pid_buff[2] = pid_no;
  198. pid_buff[3] = (u8)pid_out & 0xff;
  199. pid_buff[4] = pid_no + 1;
  200. pid_buff[5] = (u8)(pid_out >> 8);
  201. if (pid_len > st->pid_size)
  202. st->pid_size = pid_len;
  203. pid_buff[7] = 0x80 + st->pid_size;
  204. ret |= lme2510_usb_talk(d, pid_buff ,
  205. sizeof(pid_buff) , rbuf, sizeof(rbuf));
  206. if (st->stream_on)
  207. ret |= lme2510_stream_restart(d);
  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. struct lme2510_state *st = adap->dev->priv;
  308. static u8 clear_pid_reg[] = LME_CLEAR_PID;
  309. static u8 rbuf[1];
  310. int ret;
  311. deb_info(1, "PID Clearing Filter");
  312. ret = mutex_lock_interruptible(&adap->dev->i2c_mutex);
  313. if (ret < 0)
  314. return -EAGAIN;
  315. if (!onoff)
  316. ret |= lme2510_usb_talk(adap->dev, clear_pid_reg,
  317. sizeof(clear_pid_reg), rbuf, sizeof(rbuf));
  318. st->pid_size = 0;
  319. mutex_unlock(&adap->dev->i2c_mutex);
  320. return 0;
  321. }
  322. static int lme2510_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
  323. int onoff)
  324. {
  325. int ret = 0;
  326. deb_info(3, "%s PID=%04x Index=%04x onoff=%02x", __func__,
  327. pid, index, onoff);
  328. if (onoff)
  329. if (!pid_filter) {
  330. ret = mutex_lock_interruptible(&adap->dev->i2c_mutex);
  331. if (ret < 0)
  332. return -EAGAIN;
  333. ret |= lme2510_enable_pid(adap->dev, index, pid);
  334. mutex_unlock(&adap->dev->i2c_mutex);
  335. }
  336. return ret;
  337. }
  338. static int lme2510_return_status(struct usb_device *dev)
  339. {
  340. int ret = 0;
  341. u8 *data;
  342. data = kzalloc(10, GFP_KERNEL);
  343. if (!data)
  344. return -ENOMEM;
  345. ret |= usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
  346. 0x06, 0x80, 0x0302, 0x00, data, 0x0006, 200);
  347. info("Firmware Status: %x (%x)", ret , data[2]);
  348. ret = (ret < 0) ? -ENODEV : data[2];
  349. kfree(data);
  350. return ret;
  351. }
  352. static int lme2510_msg(struct dvb_usb_device *d,
  353. u8 *wbuf, int wlen, u8 *rbuf, int rlen)
  354. {
  355. int ret = 0;
  356. struct lme2510_state *st = d->priv;
  357. if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
  358. return -EAGAIN;
  359. if (st->i2c_talk_onoff == 1) {
  360. ret = lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen);
  361. switch (st->tuner_config) {
  362. case TUNER_LG:
  363. if (wbuf[2] == 0x1c) {
  364. if (wbuf[3] == 0x0e) {
  365. st->signal_lock = rbuf[1];
  366. if ((st->stream_on & 1) &&
  367. (st->signal_lock & 0x10)) {
  368. lme2510_stream_restart(d);
  369. st->i2c_talk_onoff = 0;
  370. }
  371. msleep(80);
  372. }
  373. }
  374. break;
  375. case TUNER_S7395:
  376. if (wbuf[2] == 0xd0) {
  377. if (wbuf[3] == 0x24) {
  378. st->signal_lock = rbuf[1];
  379. if ((st->stream_on & 1) &&
  380. (st->signal_lock & 0x8)) {
  381. lme2510_stream_restart(d);
  382. st->i2c_talk_onoff = 0;
  383. }
  384. }
  385. if ((wbuf[3] != 0x6) & (wbuf[3] != 0x5))
  386. msleep(5);
  387. }
  388. break;
  389. case TUNER_S0194:
  390. if (wbuf[2] == 0xd0) {
  391. if (wbuf[3] == 0x1b) {
  392. st->signal_lock = rbuf[1];
  393. if ((st->stream_on & 1) &&
  394. (st->signal_lock & 0x8)) {
  395. lme2510_stream_restart(d);
  396. st->i2c_talk_onoff = 0;
  397. }
  398. }
  399. }
  400. break;
  401. default:
  402. break;
  403. }
  404. } else {
  405. switch (st->tuner_config) {
  406. case TUNER_LG:
  407. switch (wbuf[3]) {
  408. case 0x0e:
  409. rbuf[0] = 0x55;
  410. rbuf[1] = st->signal_lock;
  411. break;
  412. case 0x43:
  413. rbuf[0] = 0x55;
  414. rbuf[1] = st->signal_level;
  415. break;
  416. case 0x1c:
  417. rbuf[0] = 0x55;
  418. rbuf[1] = st->signal_sn;
  419. break;
  420. case 0x15:
  421. case 0x16:
  422. case 0x17:
  423. case 0x18:
  424. rbuf[0] = 0x55;
  425. rbuf[1] = 0x00;
  426. break;
  427. default:
  428. lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen);
  429. st->i2c_talk_onoff = 1;
  430. break;
  431. }
  432. break;
  433. case TUNER_S7395:
  434. switch (wbuf[3]) {
  435. case 0x10:
  436. rbuf[0] = 0x55;
  437. rbuf[1] = (st->signal_level & 0x80)
  438. ? 0 : (st->signal_level * 2);
  439. break;
  440. case 0x2d:
  441. rbuf[0] = 0x55;
  442. rbuf[1] = st->signal_sn;
  443. break;
  444. case 0x24:
  445. rbuf[0] = 0x55;
  446. rbuf[1] = st->signal_lock;
  447. break;
  448. case 0x2e:
  449. case 0x26:
  450. case 0x27:
  451. rbuf[0] = 0x55;
  452. rbuf[1] = 0x00;
  453. break;
  454. default:
  455. lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen);
  456. st->i2c_talk_onoff = 1;
  457. break;
  458. }
  459. break;
  460. case TUNER_S0194:
  461. switch (wbuf[3]) {
  462. case 0x18:
  463. rbuf[0] = 0x55;
  464. rbuf[1] = (st->signal_level & 0x80)
  465. ? 0 : (st->signal_level * 2);
  466. break;
  467. case 0x24:
  468. rbuf[0] = 0x55;
  469. rbuf[1] = st->signal_sn;
  470. break;
  471. case 0x1b:
  472. rbuf[0] = 0x55;
  473. rbuf[1] = st->signal_lock;
  474. break;
  475. case 0x19:
  476. case 0x25:
  477. case 0x1e:
  478. case 0x1d:
  479. rbuf[0] = 0x55;
  480. rbuf[1] = 0x00;
  481. break;
  482. default:
  483. lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen);
  484. st->i2c_talk_onoff = 1;
  485. break;
  486. }
  487. break;
  488. default:
  489. break;
  490. }
  491. deb_info(4, "I2C From Interrupt Message out(%02x) in(%02x)",
  492. wbuf[3], rbuf[1]);
  493. }
  494. mutex_unlock(&d->i2c_mutex);
  495. return ret;
  496. }
  497. static int lme2510_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
  498. int num)
  499. {
  500. struct dvb_usb_device *d = i2c_get_adapdata(adap);
  501. struct lme2510_state *st = d->priv;
  502. static u8 obuf[64], ibuf[512];
  503. int i, read, read_o;
  504. u16 len;
  505. u8 gate = st->i2c_gate;
  506. if (gate == 0)
  507. gate = 5;
  508. if (num > 2)
  509. warn("more than 2 i2c messages"
  510. "at a time is not handled yet. TODO.");
  511. for (i = 0; i < num; i++) {
  512. read_o = 1 & (msg[i].flags & I2C_M_RD);
  513. read = i+1 < num && (msg[i+1].flags & I2C_M_RD);
  514. read |= read_o;
  515. gate = (msg[i].addr == st->i2c_tuner_addr)
  516. ? (read) ? st->i2c_tuner_gate_r
  517. : st->i2c_tuner_gate_w
  518. : st->i2c_gate;
  519. obuf[0] = gate | (read << 7);
  520. if (gate == 5)
  521. obuf[1] = (read) ? 2 : msg[i].len + 1;
  522. else
  523. obuf[1] = msg[i].len + read + 1;
  524. obuf[2] = msg[i].addr;
  525. if (read) {
  526. if (read_o)
  527. len = 3;
  528. else {
  529. memcpy(&obuf[3], msg[i].buf, msg[i].len);
  530. obuf[msg[i].len+3] = msg[i+1].len;
  531. len = msg[i].len+4;
  532. }
  533. } else {
  534. memcpy(&obuf[3], msg[i].buf, msg[i].len);
  535. len = msg[i].len+3;
  536. }
  537. if (lme2510_msg(d, obuf, len, ibuf, 512) < 0) {
  538. deb_info(1, "i2c transfer failed.");
  539. return -EAGAIN;
  540. }
  541. if (read) {
  542. if (read_o)
  543. memcpy(msg[i].buf, &ibuf[1], msg[i].len);
  544. else {
  545. memcpy(msg[i+1].buf, &ibuf[1], msg[i+1].len);
  546. i++;
  547. }
  548. }
  549. }
  550. return i;
  551. }
  552. static u32 lme2510_i2c_func(struct i2c_adapter *adapter)
  553. {
  554. return I2C_FUNC_I2C;
  555. }
  556. static struct i2c_algorithm lme2510_i2c_algo = {
  557. .master_xfer = lme2510_i2c_xfer,
  558. .functionality = lme2510_i2c_func,
  559. };
  560. /* Callbacks for DVB USB */
  561. static int lme2510_identify_state(struct usb_device *udev,
  562. struct dvb_usb_device_properties *props,
  563. struct dvb_usb_device_description **desc,
  564. int *cold)
  565. {
  566. *cold = 0;
  567. return 0;
  568. }
  569. static int lme2510_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
  570. {
  571. struct lme2510_state *st = adap->dev->priv;
  572. static u8 clear_reg_3[] = LME_CLEAR_PID;
  573. static u8 rbuf[1];
  574. int ret = 0, rlen = sizeof(rbuf);
  575. deb_info(1, "STM (%02x)", onoff);
  576. /* Streaming is started by FE_HAS_LOCK */
  577. if (onoff == 1)
  578. st->stream_on = 1;
  579. else {
  580. deb_info(1, "STM Steam Off");
  581. /* mutex is here only to avoid collision with I2C */
  582. if (mutex_lock_interruptible(&adap->dev->i2c_mutex) < 0)
  583. return -EAGAIN;
  584. ret = lme2510_usb_talk(adap->dev, clear_reg_3,
  585. sizeof(clear_reg_3), rbuf, rlen);
  586. st->stream_on = 0;
  587. st->i2c_talk_onoff = 1;
  588. mutex_unlock(&adap->dev->i2c_mutex);
  589. }
  590. return (ret < 0) ? -ENODEV : 0;
  591. }
  592. static int lme2510_int_service(struct dvb_usb_adapter *adap)
  593. {
  594. struct dvb_usb_device *d = adap->dev;
  595. struct rc_dev *rc;
  596. int ret;
  597. info("STA Configuring Remote");
  598. rc = rc_allocate_device();
  599. if (!rc)
  600. return -ENOMEM;
  601. usb_make_path(d->udev, d->rc_phys, sizeof(d->rc_phys));
  602. strlcat(d->rc_phys, "/ir0", sizeof(d->rc_phys));
  603. rc->input_name = "LME2510 Remote Control";
  604. rc->input_phys = d->rc_phys;
  605. rc->map_name = RC_MAP_LME2510;
  606. rc->driver_name = "LME 2510";
  607. usb_to_input_id(d->udev, &rc->input_id);
  608. ret = rc_register_device(rc);
  609. if (ret) {
  610. rc_free_device(rc);
  611. return ret;
  612. }
  613. d->rc_dev = rc;
  614. /* Start the Interrupt */
  615. ret = lme2510_int_read(adap);
  616. if (ret < 0) {
  617. rc_unregister_device(rc);
  618. info("INT Unable to start Interrupt Service");
  619. return -ENODEV;
  620. }
  621. return 0;
  622. }
  623. static u8 check_sum(u8 *p, u8 len)
  624. {
  625. u8 sum = 0;
  626. while (len--)
  627. sum += *p++;
  628. return sum;
  629. }
  630. static int lme2510_download_firmware(struct usb_device *dev,
  631. const struct firmware *fw)
  632. {
  633. int ret = 0;
  634. u8 *data;
  635. u16 j, wlen, len_in, start, end;
  636. u8 packet_size, dlen, i;
  637. u8 *fw_data;
  638. packet_size = 0x31;
  639. len_in = 1;
  640. data = kzalloc(512, GFP_KERNEL);
  641. if (!data) {
  642. info("FRM Could not start Firmware Download (Buffer allocation failed)");
  643. return -ENOMEM;
  644. }
  645. info("FRM Starting Firmware Download");
  646. for (i = 1; i < 3; i++) {
  647. start = (i == 1) ? 0 : 512;
  648. end = (i == 1) ? 512 : fw->size;
  649. for (j = start; j < end; j += (packet_size+1)) {
  650. fw_data = (u8 *)(fw->data + j);
  651. if ((end - j) > packet_size) {
  652. data[0] = i;
  653. dlen = packet_size;
  654. } else {
  655. data[0] = i | 0x80;
  656. dlen = (u8)(end - j)-1;
  657. }
  658. data[1] = dlen;
  659. memcpy(&data[2], fw_data, dlen+1);
  660. wlen = (u8) dlen + 4;
  661. data[wlen-1] = check_sum(fw_data, dlen+1);
  662. deb_info(1, "Data S=%02x:E=%02x CS= %02x", data[3],
  663. data[dlen+2], data[dlen+3]);
  664. ret |= lme2510_bulk_write(dev, data, wlen, 1);
  665. ret |= lme2510_bulk_read(dev, data, len_in , 1);
  666. ret |= (data[0] == 0x88) ? 0 : -1;
  667. }
  668. }
  669. usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
  670. 0x06, 0x80, 0x0200, 0x00, data, 0x0109, 1000);
  671. data[0] = 0x8a;
  672. len_in = 1;
  673. msleep(2000);
  674. ret |= lme2510_bulk_write(dev, data , len_in, 1); /*Resetting*/
  675. ret |= lme2510_bulk_read(dev, data, len_in, 1);
  676. msleep(400);
  677. if (ret < 0)
  678. info("FRM Firmware Download Failed (%04x)" , ret);
  679. else
  680. info("FRM Firmware Download Completed - Resetting Device");
  681. kfree(data);
  682. return (ret < 0) ? -ENODEV : 0;
  683. }
  684. static void lme_coldreset(struct usb_device *dev)
  685. {
  686. int ret = 0, len_in;
  687. u8 data[512] = {0};
  688. data[0] = 0x0a;
  689. len_in = 1;
  690. info("FRM Firmware Cold Reset");
  691. ret |= lme2510_bulk_write(dev, data , len_in, 1); /*Cold Resetting*/
  692. ret |= lme2510_bulk_read(dev, data, len_in, 1);
  693. return;
  694. }
  695. static int lme_firmware_switch(struct usb_device *udev, int cold)
  696. {
  697. const struct firmware *fw = NULL;
  698. const char fw_c_s7395[] = "dvb-usb-lme2510c-s7395.fw";
  699. const char fw_c_lg[] = "dvb-usb-lme2510c-lg.fw";
  700. const char fw_c_s0194[] = "dvb-usb-lme2510c-s0194.fw";
  701. const char fw_lg[] = "dvb-usb-lme2510-lg.fw";
  702. const char fw_s0194[] = "dvb-usb-lme2510-s0194.fw";
  703. const char *fw_lme;
  704. int ret, cold_fw;
  705. cold = (cold > 0) ? (cold & 1) : 0;
  706. cold_fw = !cold;
  707. if (udev->descriptor.idProduct == 0x1122) {
  708. switch (dvb_usb_lme2510_firmware) {
  709. default:
  710. dvb_usb_lme2510_firmware = TUNER_S0194;
  711. case TUNER_S0194:
  712. fw_lme = fw_s0194;
  713. ret = request_firmware(&fw, fw_lme, &udev->dev);
  714. if (ret == 0) {
  715. cold = 0;
  716. break;
  717. }
  718. dvb_usb_lme2510_firmware = TUNER_LG;
  719. case TUNER_LG:
  720. fw_lme = fw_lg;
  721. ret = request_firmware(&fw, fw_lme, &udev->dev);
  722. if (ret == 0)
  723. break;
  724. info("FRM No Firmware Found - please install");
  725. dvb_usb_lme2510_firmware = TUNER_DEFAULT;
  726. cold = 0;
  727. cold_fw = 0;
  728. break;
  729. }
  730. } else {
  731. switch (dvb_usb_lme2510_firmware) {
  732. default:
  733. dvb_usb_lme2510_firmware = TUNER_S7395;
  734. case TUNER_S7395:
  735. fw_lme = fw_c_s7395;
  736. ret = request_firmware(&fw, fw_lme, &udev->dev);
  737. if (ret == 0) {
  738. cold = 0;
  739. break;
  740. }
  741. dvb_usb_lme2510_firmware = TUNER_LG;
  742. case TUNER_LG:
  743. fw_lme = fw_c_lg;
  744. ret = request_firmware(&fw, fw_lme, &udev->dev);
  745. if (ret == 0)
  746. break;
  747. dvb_usb_lme2510_firmware = TUNER_S0194;
  748. case TUNER_S0194:
  749. fw_lme = fw_c_s0194;
  750. ret = request_firmware(&fw, fw_lme, &udev->dev);
  751. if (ret == 0)
  752. break;
  753. info("FRM No Firmware Found - please install");
  754. dvb_usb_lme2510_firmware = TUNER_DEFAULT;
  755. cold = 0;
  756. cold_fw = 0;
  757. break;
  758. }
  759. }
  760. if (cold_fw) {
  761. info("FRM Loading %s file", fw_lme);
  762. ret = lme2510_download_firmware(udev, fw);
  763. }
  764. release_firmware(fw);
  765. if (cold) {
  766. info("FRM Changing to %s firmware", fw_lme);
  767. lme_coldreset(udev);
  768. return -ENODEV;
  769. }
  770. return ret;
  771. }
  772. static int lme2510_kill_urb(struct usb_data_stream *stream)
  773. {
  774. int i;
  775. for (i = 0; i < stream->urbs_submitted; i++) {
  776. deb_info(3, "killing URB no. %d.", i);
  777. /* stop the URB */
  778. usb_kill_urb(stream->urb_list[i]);
  779. }
  780. stream->urbs_submitted = 0;
  781. return 0;
  782. }
  783. static struct tda10086_config tda10086_config = {
  784. .demod_address = 0x1c,
  785. .invert = 0,
  786. .diseqc_tone = 1,
  787. .xtal_freq = TDA10086_XTAL_16M,
  788. };
  789. static struct stv0288_config lme_config = {
  790. .demod_address = 0xd0,
  791. .min_delay_ms = 15,
  792. .inittab = s7395_inittab,
  793. };
  794. static struct ix2505v_config lme_tuner = {
  795. .tuner_address = 0xc0,
  796. .min_delay_ms = 100,
  797. .tuner_gain = 0x0,
  798. .tuner_chargepump = 0x3,
  799. };
  800. static struct stv0299_config sharp_z0194_config = {
  801. .demod_address = 0xd0,
  802. .inittab = sharp_z0194a_inittab,
  803. .mclk = 88000000UL,
  804. .invert = 0,
  805. .skip_reinit = 0,
  806. .lock_output = STV0299_LOCKOUTPUT_1,
  807. .volt13_op0_op1 = STV0299_VOLT13_OP1,
  808. .min_delay_ms = 100,
  809. .set_symbol_rate = sharp_z0194a_set_symbol_rate,
  810. };
  811. static int dm04_lme2510_set_voltage(struct dvb_frontend *fe,
  812. fe_sec_voltage_t voltage)
  813. {
  814. struct dvb_usb_adapter *adap = fe->dvb->priv;
  815. static u8 voltage_low[] = LME_VOLTAGE_L;
  816. static u8 voltage_high[] = LME_VOLTAGE_H;
  817. static u8 rbuf[1];
  818. int ret = 0, len = 3, rlen = 1;
  819. if (mutex_lock_interruptible(&adap->dev->i2c_mutex) < 0)
  820. return -EAGAIN;
  821. switch (voltage) {
  822. case SEC_VOLTAGE_18:
  823. ret |= lme2510_usb_talk(adap->dev,
  824. voltage_high, len, rbuf, rlen);
  825. break;
  826. case SEC_VOLTAGE_OFF:
  827. case SEC_VOLTAGE_13:
  828. default:
  829. ret |= lme2510_usb_talk(adap->dev,
  830. voltage_low, len, rbuf, rlen);
  831. break;
  832. }
  833. mutex_unlock(&adap->dev->i2c_mutex);
  834. return (ret < 0) ? -ENODEV : 0;
  835. }
  836. static int lme_name(struct dvb_usb_adapter *adap)
  837. {
  838. struct lme2510_state *st = adap->dev->priv;
  839. const char *desc = adap->dev->desc->name;
  840. char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395",
  841. " SHARP:BS2F7HZ0194"};
  842. char *name = adap->fe->ops.info.name;
  843. strlcpy(name, desc, 128);
  844. strlcat(name, fe_name[st->tuner_config], 128);
  845. return 0;
  846. }
  847. static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
  848. {
  849. struct lme2510_state *st = adap->dev->priv;
  850. int ret = 0;
  851. st->i2c_talk_onoff = 1;
  852. st->i2c_gate = 4;
  853. adap->fe = dvb_attach(tda10086_attach, &tda10086_config,
  854. &adap->dev->i2c_adap);
  855. if (adap->fe) {
  856. info("TUN Found Frontend TDA10086");
  857. st->i2c_tuner_gate_w = 4;
  858. st->i2c_tuner_gate_r = 4;
  859. st->i2c_tuner_addr = 0xc0;
  860. st->tuner_config = TUNER_LG;
  861. if (dvb_usb_lme2510_firmware != TUNER_LG) {
  862. dvb_usb_lme2510_firmware = TUNER_LG;
  863. ret = lme_firmware_switch(adap->dev->udev, 1);
  864. }
  865. goto end;
  866. }
  867. st->i2c_gate = 4;
  868. adap->fe = dvb_attach(stv0299_attach, &sharp_z0194_config,
  869. &adap->dev->i2c_adap);
  870. if (adap->fe) {
  871. info("FE Found Stv0299");
  872. st->i2c_tuner_gate_w = 4;
  873. st->i2c_tuner_gate_r = 5;
  874. st->i2c_tuner_addr = 0xc0;
  875. st->tuner_config = TUNER_S0194;
  876. if (dvb_usb_lme2510_firmware != TUNER_S0194) {
  877. dvb_usb_lme2510_firmware = TUNER_S0194;
  878. ret = lme_firmware_switch(adap->dev->udev, 1);
  879. }
  880. goto end;
  881. }
  882. st->i2c_gate = 5;
  883. adap->fe = dvb_attach(stv0288_attach, &lme_config,
  884. &adap->dev->i2c_adap);
  885. if (adap->fe) {
  886. info("FE Found Stv0288");
  887. st->i2c_tuner_gate_w = 4;
  888. st->i2c_tuner_gate_r = 5;
  889. st->i2c_tuner_addr = 0xc0;
  890. st->tuner_config = TUNER_S7395;
  891. if (dvb_usb_lme2510_firmware != TUNER_S7395) {
  892. dvb_usb_lme2510_firmware = TUNER_S7395;
  893. ret = lme_firmware_switch(adap->dev->udev, 1);
  894. }
  895. } else {
  896. info("DM04 Not Supported");
  897. return -ENODEV;
  898. }
  899. end: if (ret) {
  900. kfree(adap->fe);
  901. adap->fe = NULL;
  902. return -ENODEV;
  903. }
  904. adap->fe->ops.set_voltage = dm04_lme2510_set_voltage;
  905. ret = lme_name(adap);
  906. return ret;
  907. }
  908. static int dm04_lme2510_tuner(struct dvb_usb_adapter *adap)
  909. {
  910. struct lme2510_state *st = adap->dev->priv;
  911. char *tun_msg[] = {"", "TDA8263", "IX2505V", "DVB_PLL_OPERA"};
  912. int ret = 0;
  913. switch (st->tuner_config) {
  914. case TUNER_LG:
  915. if (dvb_attach(tda826x_attach, adap->fe, 0xc0,
  916. &adap->dev->i2c_adap, 1))
  917. ret = st->tuner_config;
  918. break;
  919. case TUNER_S7395:
  920. if (dvb_attach(ix2505v_attach , adap->fe, &lme_tuner,
  921. &adap->dev->i2c_adap))
  922. ret = st->tuner_config;
  923. break;
  924. case TUNER_S0194:
  925. if (dvb_attach(dvb_pll_attach , adap->fe, 0xc0,
  926. &adap->dev->i2c_adap, DVB_PLL_OPERA1))
  927. ret = st->tuner_config;
  928. break;
  929. default:
  930. break;
  931. }
  932. if (ret)
  933. info("TUN Found %s tuner", tun_msg[ret]);
  934. else {
  935. info("TUN No tuner found --- reseting device");
  936. lme_coldreset(adap->dev->udev);
  937. return -ENODEV;
  938. }
  939. /* Start the Interrupt & Remote*/
  940. ret = lme2510_int_service(adap);
  941. return ret;
  942. }
  943. static int lme2510_powerup(struct dvb_usb_device *d, int onoff)
  944. {
  945. struct lme2510_state *st = d->priv;
  946. static u8 lnb_on[] = LNB_ON;
  947. static u8 lnb_off[] = LNB_OFF;
  948. static u8 rbuf[1];
  949. int ret, len = 3, rlen = 1;
  950. if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
  951. return -EAGAIN;
  952. if (onoff)
  953. ret = lme2510_usb_talk(d, lnb_on, len, rbuf, rlen);
  954. else
  955. ret = lme2510_usb_talk(d, lnb_off, len, rbuf, rlen);
  956. st->i2c_talk_onoff = 1;
  957. mutex_unlock(&d->i2c_mutex);
  958. return ret;
  959. }
  960. /* DVB USB Driver stuff */
  961. static struct dvb_usb_device_properties lme2510_properties;
  962. static struct dvb_usb_device_properties lme2510c_properties;
  963. static int lme2510_probe(struct usb_interface *intf,
  964. const struct usb_device_id *id)
  965. {
  966. struct usb_device *udev = interface_to_usbdev(intf);
  967. int ret = 0;
  968. usb_reset_configuration(udev);
  969. usb_set_interface(udev, intf->cur_altsetting->desc.bInterfaceNumber, 1);
  970. if (udev->speed != USB_SPEED_HIGH) {
  971. ret = usb_reset_device(udev);
  972. info("DEV Failed to connect in HIGH SPEED mode");
  973. return -ENODEV;
  974. }
  975. if (lme2510_return_status(udev) == 0x44) {
  976. lme_firmware_switch(udev, 0);
  977. return -ENODEV;
  978. }
  979. if (0 == dvb_usb_device_init(intf, &lme2510_properties,
  980. THIS_MODULE, NULL, adapter_nr)) {
  981. info("DEV registering device driver");
  982. return 0;
  983. }
  984. if (0 == dvb_usb_device_init(intf, &lme2510c_properties,
  985. THIS_MODULE, NULL, adapter_nr)) {
  986. info("DEV registering device driver");
  987. return 0;
  988. }
  989. info("DEV lme2510 Error");
  990. return -ENODEV;
  991. }
  992. static struct usb_device_id lme2510_table[] = {
  993. { USB_DEVICE(0x3344, 0x1122) }, /* LME2510 */
  994. { USB_DEVICE(0x3344, 0x1120) }, /* LME2510C */
  995. {} /* Terminating entry */
  996. };
  997. MODULE_DEVICE_TABLE(usb, lme2510_table);
  998. static struct dvb_usb_device_properties lme2510_properties = {
  999. .caps = DVB_USB_IS_AN_I2C_ADAPTER,
  1000. .size_of_priv = sizeof(struct lme2510_state),
  1001. .num_adapters = 1,
  1002. .adapter = {
  1003. {
  1004. .caps = DVB_USB_ADAP_HAS_PID_FILTER|
  1005. DVB_USB_ADAP_NEED_PID_FILTERING|
  1006. DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
  1007. .streaming_ctrl = lme2510_streaming_ctrl,
  1008. .pid_filter_count = 15,
  1009. .pid_filter = lme2510_pid_filter,
  1010. .pid_filter_ctrl = lme2510_pid_filter_ctrl,
  1011. .frontend_attach = dm04_lme2510_frontend_attach,
  1012. .tuner_attach = dm04_lme2510_tuner,
  1013. /* parameter for the MPEG2-data transfer */
  1014. .stream = {
  1015. .type = USB_BULK,
  1016. .count = 10,
  1017. .endpoint = 0x06,
  1018. .u = {
  1019. .bulk = {
  1020. .buffersize = 4096,
  1021. }
  1022. }
  1023. }
  1024. }
  1025. },
  1026. .power_ctrl = lme2510_powerup,
  1027. .identify_state = lme2510_identify_state,
  1028. .i2c_algo = &lme2510_i2c_algo,
  1029. .generic_bulk_ctrl_endpoint = 0,
  1030. .num_device_descs = 1,
  1031. .devices = {
  1032. { "DM04_LME2510_DVB-S",
  1033. { &lme2510_table[0], NULL },
  1034. },
  1035. }
  1036. };
  1037. static struct dvb_usb_device_properties lme2510c_properties = {
  1038. .caps = DVB_USB_IS_AN_I2C_ADAPTER,
  1039. .size_of_priv = sizeof(struct lme2510_state),
  1040. .num_adapters = 1,
  1041. .adapter = {
  1042. {
  1043. .caps = DVB_USB_ADAP_HAS_PID_FILTER|
  1044. DVB_USB_ADAP_NEED_PID_FILTERING|
  1045. DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
  1046. .streaming_ctrl = lme2510_streaming_ctrl,
  1047. .pid_filter_count = 15,
  1048. .pid_filter = lme2510_pid_filter,
  1049. .pid_filter_ctrl = lme2510_pid_filter_ctrl,
  1050. .frontend_attach = dm04_lme2510_frontend_attach,
  1051. .tuner_attach = dm04_lme2510_tuner,
  1052. /* parameter for the MPEG2-data transfer */
  1053. .stream = {
  1054. .type = USB_BULK,
  1055. .count = 10,
  1056. .endpoint = 0x8,
  1057. .u = {
  1058. .bulk = {
  1059. .buffersize = 4096,
  1060. }
  1061. }
  1062. }
  1063. }
  1064. },
  1065. .power_ctrl = lme2510_powerup,
  1066. .identify_state = lme2510_identify_state,
  1067. .i2c_algo = &lme2510_i2c_algo,
  1068. .generic_bulk_ctrl_endpoint = 0,
  1069. .num_device_descs = 1,
  1070. .devices = {
  1071. { "DM04_LME2510C_DVB-S",
  1072. { &lme2510_table[1], NULL },
  1073. },
  1074. }
  1075. };
  1076. static void *lme2510_exit_int(struct dvb_usb_device *d)
  1077. {
  1078. struct lme2510_state *st = d->priv;
  1079. struct dvb_usb_adapter *adap = &d->adapter[0];
  1080. void *buffer = NULL;
  1081. if (adap != NULL) {
  1082. lme2510_kill_urb(&adap->stream);
  1083. adap->feedcount = 0;
  1084. }
  1085. if (st->lme_urb != NULL) {
  1086. st->i2c_talk_onoff = 1;
  1087. st->signal_lock = 0;
  1088. st->signal_level = 0;
  1089. st->signal_sn = 0;
  1090. buffer = st->usb_buffer;
  1091. usb_kill_urb(st->lme_urb);
  1092. usb_free_coherent(d->udev, 5000, st->buffer,
  1093. st->lme_urb->transfer_dma);
  1094. info("Interrupt Service Stopped");
  1095. rc_unregister_device(d->rc_dev);
  1096. info("Remote Stopped");
  1097. }
  1098. return buffer;
  1099. }
  1100. static void lme2510_exit(struct usb_interface *intf)
  1101. {
  1102. struct dvb_usb_device *d = usb_get_intfdata(intf);
  1103. void *usb_buffer;
  1104. if (d != NULL) {
  1105. usb_buffer = lme2510_exit_int(d);
  1106. dvb_usb_device_exit(intf);
  1107. kfree(usb_buffer);
  1108. }
  1109. }
  1110. static struct usb_driver lme2510_driver = {
  1111. .name = "LME2510C_DVB-S",
  1112. .probe = lme2510_probe,
  1113. .disconnect = lme2510_exit,
  1114. .id_table = lme2510_table,
  1115. };
  1116. /* module stuff */
  1117. static int __init lme2510_module_init(void)
  1118. {
  1119. int result = usb_register(&lme2510_driver);
  1120. if (result) {
  1121. err("usb_register failed. Error number %d", result);
  1122. return result;
  1123. }
  1124. return 0;
  1125. }
  1126. static void __exit lme2510_module_exit(void)
  1127. {
  1128. /* deregister this driver from the USB subsystem */
  1129. usb_deregister(&lme2510_driver);
  1130. }
  1131. module_init(lme2510_module_init);
  1132. module_exit(lme2510_module_exit);
  1133. MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>");
  1134. MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0");
  1135. MODULE_VERSION("1.86");
  1136. MODULE_LICENSE("GPL");