lmedm04.c 31 KB

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