lmedm04.c 29 KB

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