go7007-usb.c 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345
  1. /*
  2. * Copyright (C) 2005-2006 Micronas USA Inc.
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License (Version 2) as
  6. * published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. */
  13. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  14. #include <linux/module.h>
  15. #include <linux/kernel.h>
  16. #include <linux/wait.h>
  17. #include <linux/list.h>
  18. #include <linux/slab.h>
  19. #include <linux/time.h>
  20. #include <linux/mm.h>
  21. #include <linux/usb.h>
  22. #include <linux/i2c.h>
  23. #include <asm/byteorder.h>
  24. #include <media/saa7115.h>
  25. #include <media/tuner.h>
  26. #include <media/uda1342.h>
  27. #include "go7007-priv.h"
  28. static unsigned int assume_endura;
  29. module_param(assume_endura, int, 0644);
  30. MODULE_PARM_DESC(assume_endura,
  31. "when probing fails, hardware is a Pelco Endura");
  32. /* #define GO7007_I2C_DEBUG */ /* for debugging the EZ-USB I2C adapter */
  33. #define HPI_STATUS_ADDR 0xFFF4
  34. #define INT_PARAM_ADDR 0xFFF6
  35. #define INT_INDEX_ADDR 0xFFF8
  36. /*
  37. * Pipes on EZ-USB interface:
  38. * 0 snd - Control
  39. * 0 rcv - Control
  40. * 2 snd - Download firmware (control)
  41. * 4 rcv - Read Interrupt (interrupt)
  42. * 6 rcv - Read Video (bulk)
  43. * 8 rcv - Read Audio (bulk)
  44. */
  45. #define GO7007_USB_EZUSB (1<<0)
  46. #define GO7007_USB_EZUSB_I2C (1<<1)
  47. struct go7007_usb_board {
  48. unsigned int flags;
  49. struct go7007_board_info main_info;
  50. };
  51. struct go7007_usb {
  52. const struct go7007_usb_board *board;
  53. struct mutex i2c_lock;
  54. struct usb_device *usbdev;
  55. struct urb *video_urbs[8];
  56. struct urb *audio_urbs[8];
  57. struct urb *intr_urb;
  58. };
  59. /*********************** Product specification data ***********************/
  60. static const struct go7007_usb_board board_matrix_ii = {
  61. .flags = GO7007_USB_EZUSB,
  62. .main_info = {
  63. .flags = GO7007_BOARD_HAS_AUDIO |
  64. GO7007_BOARD_USE_ONBOARD_I2C,
  65. .audio_flags = GO7007_AUDIO_I2S_MODE_1 |
  66. GO7007_AUDIO_WORD_16,
  67. .audio_rate = 48000,
  68. .audio_bclk_div = 8,
  69. .audio_main_div = 2,
  70. .hpi_buffer_cap = 7,
  71. .sensor_flags = GO7007_SENSOR_656 |
  72. GO7007_SENSOR_VALID_ENABLE |
  73. GO7007_SENSOR_TV |
  74. GO7007_SENSOR_SAA7115 |
  75. GO7007_SENSOR_VBI |
  76. GO7007_SENSOR_SCALING,
  77. .num_i2c_devs = 1,
  78. .i2c_devs = {
  79. {
  80. .type = "saa7115",
  81. .addr = 0x20,
  82. .is_video = 1,
  83. },
  84. },
  85. .num_inputs = 2,
  86. .inputs = {
  87. {
  88. .video_input = 0,
  89. .name = "Composite",
  90. },
  91. {
  92. .video_input = 9,
  93. .name = "S-Video",
  94. },
  95. },
  96. .video_config = SAA7115_IDQ_IS_DEFAULT,
  97. },
  98. };
  99. static const struct go7007_usb_board board_matrix_reload = {
  100. .flags = GO7007_USB_EZUSB,
  101. .main_info = {
  102. .flags = GO7007_BOARD_HAS_AUDIO |
  103. GO7007_BOARD_USE_ONBOARD_I2C,
  104. .audio_flags = GO7007_AUDIO_I2S_MODE_1 |
  105. GO7007_AUDIO_I2S_MASTER |
  106. GO7007_AUDIO_WORD_16,
  107. .audio_rate = 48000,
  108. .audio_bclk_div = 8,
  109. .audio_main_div = 2,
  110. .hpi_buffer_cap = 7,
  111. .sensor_flags = GO7007_SENSOR_656 |
  112. GO7007_SENSOR_TV,
  113. .num_i2c_devs = 1,
  114. .i2c_devs = {
  115. {
  116. .type = "saa7113",
  117. .addr = 0x25,
  118. .is_video = 1,
  119. },
  120. },
  121. .num_inputs = 2,
  122. .inputs = {
  123. {
  124. .video_input = 0,
  125. .name = "Composite",
  126. },
  127. {
  128. .video_input = 9,
  129. .name = "S-Video",
  130. },
  131. },
  132. .video_config = SAA7115_IDQ_IS_DEFAULT,
  133. },
  134. };
  135. static const struct go7007_usb_board board_star_trek = {
  136. .flags = GO7007_USB_EZUSB | GO7007_USB_EZUSB_I2C,
  137. .main_info = {
  138. .flags = GO7007_BOARD_HAS_AUDIO, /* |
  139. GO7007_BOARD_HAS_TUNER, */
  140. .sensor_flags = GO7007_SENSOR_656 |
  141. GO7007_SENSOR_VALID_ENABLE |
  142. GO7007_SENSOR_TV |
  143. GO7007_SENSOR_SAA7115 |
  144. GO7007_SENSOR_VBI |
  145. GO7007_SENSOR_SCALING,
  146. .audio_flags = GO7007_AUDIO_I2S_MODE_1 |
  147. GO7007_AUDIO_WORD_16,
  148. .audio_bclk_div = 8,
  149. .audio_main_div = 2,
  150. .hpi_buffer_cap = 7,
  151. .num_i2c_devs = 1,
  152. .i2c_devs = {
  153. {
  154. .type = "saa7115",
  155. .addr = 0x20,
  156. .is_video = 1,
  157. },
  158. },
  159. .num_inputs = 2,
  160. .inputs = {
  161. /* {
  162. * .video_input = 3,
  163. * .audio_index = AUDIO_TUNER,
  164. * .name = "Tuner",
  165. * },
  166. */
  167. {
  168. .video_input = 1,
  169. /* .audio_index = AUDIO_EXTERN, */
  170. .name = "Composite",
  171. },
  172. {
  173. .video_input = 8,
  174. /* .audio_index = AUDIO_EXTERN, */
  175. .name = "S-Video",
  176. },
  177. },
  178. .video_config = SAA7115_IDQ_IS_DEFAULT,
  179. },
  180. };
  181. static const struct go7007_usb_board board_px_tv402u = {
  182. .flags = GO7007_USB_EZUSB | GO7007_USB_EZUSB_I2C,
  183. .main_info = {
  184. .flags = GO7007_BOARD_HAS_AUDIO |
  185. GO7007_BOARD_HAS_TUNER,
  186. .sensor_flags = GO7007_SENSOR_656 |
  187. GO7007_SENSOR_VALID_ENABLE |
  188. GO7007_SENSOR_TV |
  189. GO7007_SENSOR_SAA7115 |
  190. GO7007_SENSOR_VBI |
  191. GO7007_SENSOR_SCALING,
  192. .audio_flags = GO7007_AUDIO_I2S_MODE_1 |
  193. GO7007_AUDIO_WORD_16,
  194. .audio_bclk_div = 8,
  195. .audio_main_div = 2,
  196. .hpi_buffer_cap = 7,
  197. .num_i2c_devs = 5,
  198. .i2c_devs = {
  199. {
  200. .type = "saa7115",
  201. .addr = 0x20,
  202. .is_video = 1,
  203. },
  204. {
  205. .type = "uda1342",
  206. .addr = 0x1a,
  207. .is_audio = 1,
  208. },
  209. {
  210. .type = "tuner",
  211. .addr = 0x60,
  212. },
  213. {
  214. .type = "tuner",
  215. .addr = 0x43,
  216. },
  217. {
  218. .type = "sony-btf-mpx",
  219. .addr = 0x44,
  220. },
  221. },
  222. .num_inputs = 3,
  223. .inputs = {
  224. {
  225. .video_input = 3,
  226. .audio_index = 0,
  227. .name = "Tuner",
  228. },
  229. {
  230. .video_input = 1,
  231. .audio_index = 1,
  232. .name = "Composite",
  233. },
  234. {
  235. .video_input = 8,
  236. .audio_index = 1,
  237. .name = "S-Video",
  238. },
  239. },
  240. .video_config = SAA7115_IDQ_IS_DEFAULT,
  241. .num_aud_inputs = 2,
  242. .aud_inputs = {
  243. {
  244. .audio_input = UDA1342_IN2,
  245. .name = "Tuner",
  246. },
  247. {
  248. .audio_input = UDA1342_IN1,
  249. .name = "Line In",
  250. },
  251. },
  252. },
  253. };
  254. static const struct go7007_usb_board board_xmen = {
  255. .flags = 0,
  256. .main_info = {
  257. .flags = GO7007_BOARD_USE_ONBOARD_I2C,
  258. .hpi_buffer_cap = 0,
  259. .sensor_flags = GO7007_SENSOR_VREF_POLAR,
  260. .sensor_width = 320,
  261. .sensor_height = 240,
  262. .sensor_framerate = 30030,
  263. .audio_flags = GO7007_AUDIO_ONE_CHANNEL |
  264. GO7007_AUDIO_I2S_MODE_3 |
  265. GO7007_AUDIO_WORD_14 |
  266. GO7007_AUDIO_I2S_MASTER |
  267. GO7007_AUDIO_BCLK_POLAR |
  268. GO7007_AUDIO_OKI_MODE,
  269. .audio_rate = 8000,
  270. .audio_bclk_div = 48,
  271. .audio_main_div = 1,
  272. .num_i2c_devs = 1,
  273. .i2c_devs = {
  274. {
  275. .type = "ov7640",
  276. .addr = 0x21,
  277. },
  278. },
  279. .num_inputs = 1,
  280. .inputs = {
  281. {
  282. .name = "Camera",
  283. },
  284. },
  285. },
  286. };
  287. static const struct go7007_usb_board board_matrix_revolution = {
  288. .flags = GO7007_USB_EZUSB,
  289. .main_info = {
  290. .flags = GO7007_BOARD_HAS_AUDIO |
  291. GO7007_BOARD_USE_ONBOARD_I2C,
  292. .audio_flags = GO7007_AUDIO_I2S_MODE_1 |
  293. GO7007_AUDIO_I2S_MASTER |
  294. GO7007_AUDIO_WORD_16,
  295. .audio_rate = 48000,
  296. .audio_bclk_div = 8,
  297. .audio_main_div = 2,
  298. .hpi_buffer_cap = 7,
  299. .sensor_flags = GO7007_SENSOR_656 |
  300. GO7007_SENSOR_TV |
  301. GO7007_SENSOR_VBI,
  302. .num_i2c_devs = 1,
  303. .i2c_devs = {
  304. {
  305. .type = "tw9903",
  306. .is_video = 1,
  307. .addr = 0x44,
  308. },
  309. },
  310. .num_inputs = 2,
  311. .inputs = {
  312. {
  313. .video_input = 2,
  314. .name = "Composite",
  315. },
  316. {
  317. .video_input = 8,
  318. .name = "S-Video",
  319. },
  320. },
  321. },
  322. };
  323. static const struct go7007_usb_board board_lifeview_lr192 = {
  324. .flags = GO7007_USB_EZUSB,
  325. .main_info = {
  326. .flags = GO7007_BOARD_HAS_AUDIO |
  327. GO7007_BOARD_USE_ONBOARD_I2C,
  328. .audio_flags = GO7007_AUDIO_I2S_MODE_1 |
  329. GO7007_AUDIO_WORD_16,
  330. .audio_rate = 48000,
  331. .audio_bclk_div = 8,
  332. .audio_main_div = 2,
  333. .hpi_buffer_cap = 7,
  334. .sensor_flags = GO7007_SENSOR_656 |
  335. GO7007_SENSOR_VALID_ENABLE |
  336. GO7007_SENSOR_TV |
  337. GO7007_SENSOR_VBI |
  338. GO7007_SENSOR_SCALING,
  339. .num_i2c_devs = 0,
  340. .num_inputs = 1,
  341. .inputs = {
  342. {
  343. .video_input = 0,
  344. .name = "Composite",
  345. },
  346. },
  347. },
  348. };
  349. static const struct go7007_usb_board board_endura = {
  350. .flags = 0,
  351. .main_info = {
  352. .flags = 0,
  353. .audio_flags = GO7007_AUDIO_I2S_MODE_1 |
  354. GO7007_AUDIO_I2S_MASTER |
  355. GO7007_AUDIO_WORD_16,
  356. .audio_rate = 8000,
  357. .audio_bclk_div = 48,
  358. .audio_main_div = 8,
  359. .hpi_buffer_cap = 0,
  360. .sensor_flags = GO7007_SENSOR_656 |
  361. GO7007_SENSOR_TV,
  362. .sensor_h_offset = 8,
  363. .num_i2c_devs = 0,
  364. .num_inputs = 1,
  365. .inputs = {
  366. {
  367. .name = "Camera",
  368. },
  369. },
  370. },
  371. };
  372. static const struct go7007_usb_board board_adlink_mpg24 = {
  373. .flags = 0,
  374. .main_info = {
  375. .flags = GO7007_BOARD_USE_ONBOARD_I2C,
  376. .audio_flags = GO7007_AUDIO_I2S_MODE_1 |
  377. GO7007_AUDIO_I2S_MASTER |
  378. GO7007_AUDIO_WORD_16,
  379. .audio_rate = 48000,
  380. .audio_bclk_div = 8,
  381. .audio_main_div = 2,
  382. .hpi_buffer_cap = 0,
  383. .sensor_flags = GO7007_SENSOR_656 |
  384. GO7007_SENSOR_TV |
  385. GO7007_SENSOR_VBI,
  386. .num_i2c_devs = 1,
  387. .i2c_devs = {
  388. {
  389. .type = "tw2804",
  390. .addr = 0x00, /* yes, really */
  391. .flags = I2C_CLIENT_TEN,
  392. .is_video = 1,
  393. },
  394. },
  395. .num_inputs = 1,
  396. .inputs = {
  397. {
  398. .name = "Composite",
  399. },
  400. },
  401. },
  402. };
  403. static const struct go7007_usb_board board_sensoray_2250 = {
  404. .flags = GO7007_USB_EZUSB | GO7007_USB_EZUSB_I2C,
  405. .main_info = {
  406. .audio_flags = GO7007_AUDIO_I2S_MODE_1 |
  407. GO7007_AUDIO_I2S_MASTER |
  408. GO7007_AUDIO_WORD_16,
  409. .flags = GO7007_BOARD_HAS_AUDIO,
  410. .audio_rate = 48000,
  411. .audio_bclk_div = 8,
  412. .audio_main_div = 2,
  413. .hpi_buffer_cap = 7,
  414. .sensor_flags = GO7007_SENSOR_656 |
  415. GO7007_SENSOR_TV,
  416. .num_i2c_devs = 1,
  417. .i2c_devs = {
  418. {
  419. .type = "s2250",
  420. .addr = 0x43,
  421. .is_video = 1,
  422. .is_audio = 1,
  423. },
  424. },
  425. .num_inputs = 2,
  426. .inputs = {
  427. {
  428. .video_input = 0,
  429. .name = "Composite",
  430. },
  431. {
  432. .video_input = 1,
  433. .name = "S-Video",
  434. },
  435. },
  436. .num_aud_inputs = 3,
  437. .aud_inputs = {
  438. {
  439. .audio_input = 0,
  440. .name = "Line In",
  441. },
  442. {
  443. .audio_input = 1,
  444. .name = "Mic",
  445. },
  446. {
  447. .audio_input = 2,
  448. .name = "Mic Boost",
  449. },
  450. },
  451. },
  452. };
  453. static const struct go7007_usb_board board_ads_usbav_709 = {
  454. .flags = GO7007_USB_EZUSB,
  455. .main_info = {
  456. .flags = GO7007_BOARD_HAS_AUDIO |
  457. GO7007_BOARD_USE_ONBOARD_I2C,
  458. .audio_flags = GO7007_AUDIO_I2S_MODE_1 |
  459. GO7007_AUDIO_I2S_MASTER |
  460. GO7007_AUDIO_WORD_16,
  461. .audio_rate = 48000,
  462. .audio_bclk_div = 8,
  463. .audio_main_div = 2,
  464. .hpi_buffer_cap = 7,
  465. .sensor_flags = GO7007_SENSOR_656 |
  466. GO7007_SENSOR_TV |
  467. GO7007_SENSOR_VBI,
  468. .num_i2c_devs = 1,
  469. .i2c_devs = {
  470. {
  471. .type = "tw9906",
  472. .is_video = 1,
  473. .addr = 0x44,
  474. },
  475. },
  476. .num_inputs = 2,
  477. .inputs = {
  478. {
  479. .video_input = 0,
  480. .name = "Composite",
  481. },
  482. {
  483. .video_input = 10,
  484. .name = "S-Video",
  485. },
  486. },
  487. },
  488. };
  489. static const struct usb_device_id go7007_usb_id_table[] = {
  490. {
  491. .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION |
  492. USB_DEVICE_ID_MATCH_INT_INFO,
  493. .idVendor = 0x0eb1, /* Vendor ID of WIS Technologies */
  494. .idProduct = 0x7007, /* Product ID of GO7007SB chip */
  495. .bcdDevice_lo = 0x200, /* Revision number of XMen */
  496. .bcdDevice_hi = 0x200,
  497. .bInterfaceClass = 255,
  498. .bInterfaceSubClass = 0,
  499. .bInterfaceProtocol = 255,
  500. .driver_info = (kernel_ulong_t)GO7007_BOARDID_XMEN,
  501. },
  502. {
  503. .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
  504. .idVendor = 0x0eb1, /* Vendor ID of WIS Technologies */
  505. .idProduct = 0x7007, /* Product ID of GO7007SB chip */
  506. .bcdDevice_lo = 0x202, /* Revision number of Matrix II */
  507. .bcdDevice_hi = 0x202,
  508. .driver_info = (kernel_ulong_t)GO7007_BOARDID_MATRIX_II,
  509. },
  510. {
  511. .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
  512. .idVendor = 0x0eb1, /* Vendor ID of WIS Technologies */
  513. .idProduct = 0x7007, /* Product ID of GO7007SB chip */
  514. .bcdDevice_lo = 0x204, /* Revision number of Matrix */
  515. .bcdDevice_hi = 0x204, /* Reloaded */
  516. .driver_info = (kernel_ulong_t)GO7007_BOARDID_MATRIX_RELOAD,
  517. },
  518. {
  519. .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION |
  520. USB_DEVICE_ID_MATCH_INT_INFO,
  521. .idVendor = 0x0eb1, /* Vendor ID of WIS Technologies */
  522. .idProduct = 0x7007, /* Product ID of GO7007SB chip */
  523. .bcdDevice_lo = 0x205, /* Revision number of XMen-II */
  524. .bcdDevice_hi = 0x205,
  525. .bInterfaceClass = 255,
  526. .bInterfaceSubClass = 0,
  527. .bInterfaceProtocol = 255,
  528. .driver_info = (kernel_ulong_t)GO7007_BOARDID_XMEN_II,
  529. },
  530. {
  531. .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
  532. .idVendor = 0x0eb1, /* Vendor ID of WIS Technologies */
  533. .idProduct = 0x7007, /* Product ID of GO7007SB chip */
  534. .bcdDevice_lo = 0x208, /* Revision number of Star Trek */
  535. .bcdDevice_hi = 0x208,
  536. .driver_info = (kernel_ulong_t)GO7007_BOARDID_STAR_TREK,
  537. },
  538. {
  539. .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION |
  540. USB_DEVICE_ID_MATCH_INT_INFO,
  541. .idVendor = 0x0eb1, /* Vendor ID of WIS Technologies */
  542. .idProduct = 0x7007, /* Product ID of GO7007SB chip */
  543. .bcdDevice_lo = 0x209, /* Revision number of XMen-III */
  544. .bcdDevice_hi = 0x209,
  545. .bInterfaceClass = 255,
  546. .bInterfaceSubClass = 0,
  547. .bInterfaceProtocol = 255,
  548. .driver_info = (kernel_ulong_t)GO7007_BOARDID_XMEN_III,
  549. },
  550. {
  551. .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
  552. .idVendor = 0x0eb1, /* Vendor ID of WIS Technologies */
  553. .idProduct = 0x7007, /* Product ID of GO7007SB chip */
  554. .bcdDevice_lo = 0x210, /* Revision number of Matrix */
  555. .bcdDevice_hi = 0x210, /* Revolution */
  556. .driver_info = (kernel_ulong_t)GO7007_BOARDID_MATRIX_REV,
  557. },
  558. {
  559. .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
  560. .idVendor = 0x093b, /* Vendor ID of Plextor */
  561. .idProduct = 0xa102, /* Product ID of M402U */
  562. .bcdDevice_lo = 0x1, /* revision number of Blueberry */
  563. .bcdDevice_hi = 0x1,
  564. .driver_info = (kernel_ulong_t)GO7007_BOARDID_PX_M402U,
  565. },
  566. {
  567. .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
  568. .idVendor = 0x093b, /* Vendor ID of Plextor */
  569. .idProduct = 0xa104, /* Product ID of TV402U */
  570. .bcdDevice_lo = 0x1,
  571. .bcdDevice_hi = 0x1,
  572. .driver_info = (kernel_ulong_t)GO7007_BOARDID_PX_TV402U,
  573. },
  574. {
  575. .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
  576. .idVendor = 0x10fd, /* Vendor ID of Anubis Electronics */
  577. .idProduct = 0xde00, /* Product ID of Lifeview LR192 */
  578. .bcdDevice_lo = 0x1,
  579. .bcdDevice_hi = 0x1,
  580. .driver_info = (kernel_ulong_t)GO7007_BOARDID_LIFEVIEW_LR192,
  581. },
  582. {
  583. .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
  584. .idVendor = 0x1943, /* Vendor ID Sensoray */
  585. .idProduct = 0x2250, /* Product ID of 2250/2251 */
  586. .bcdDevice_lo = 0x1,
  587. .bcdDevice_hi = 0x1,
  588. .driver_info = (kernel_ulong_t)GO7007_BOARDID_SENSORAY_2250,
  589. },
  590. {
  591. .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION,
  592. .idVendor = 0x06e1, /* Vendor ID of ADS Technologies */
  593. .idProduct = 0x0709, /* Product ID of DVD Xpress DX2 */
  594. .bcdDevice_lo = 0x204,
  595. .bcdDevice_hi = 0x204,
  596. .driver_info = (kernel_ulong_t)GO7007_BOARDID_ADS_USBAV_709,
  597. },
  598. { } /* Terminating entry */
  599. };
  600. MODULE_DEVICE_TABLE(usb, go7007_usb_id_table);
  601. /********************* Driver for EZ-USB HPI interface *********************/
  602. static int go7007_usb_vendor_request(struct go7007 *go, int request,
  603. int value, int index, void *transfer_buffer, int length, int in)
  604. {
  605. struct go7007_usb *usb = go->hpi_context;
  606. int timeout = 5000;
  607. if (in) {
  608. return usb_control_msg(usb->usbdev,
  609. usb_rcvctrlpipe(usb->usbdev, 0), request,
  610. USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
  611. value, index, transfer_buffer, length, timeout);
  612. } else {
  613. return usb_control_msg(usb->usbdev,
  614. usb_sndctrlpipe(usb->usbdev, 0), request,
  615. USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  616. value, index, transfer_buffer, length, timeout);
  617. }
  618. }
  619. static int go7007_usb_interface_reset(struct go7007 *go)
  620. {
  621. struct go7007_usb *usb = go->hpi_context;
  622. u16 intr_val, intr_data;
  623. if (go->status == STATUS_SHUTDOWN)
  624. return -1;
  625. /* Reset encoder */
  626. if (go7007_write_interrupt(go, 0x0001, 0x0001) < 0)
  627. return -1;
  628. msleep(100);
  629. if (usb->board->flags & GO7007_USB_EZUSB) {
  630. /* Reset buffer in EZ-USB */
  631. pr_debug("resetting EZ-USB buffers\n");
  632. if (go7007_usb_vendor_request(go, 0x10, 0, 0, NULL, 0, 0) < 0 ||
  633. go7007_usb_vendor_request(go, 0x10, 0, 0, NULL, 0, 0) < 0)
  634. return -1;
  635. /* Reset encoder again */
  636. if (go7007_write_interrupt(go, 0x0001, 0x0001) < 0)
  637. return -1;
  638. msleep(100);
  639. }
  640. /* Wait for an interrupt to indicate successful hardware reset */
  641. if (go7007_read_interrupt(go, &intr_val, &intr_data) < 0 ||
  642. (intr_val & ~0x1) != 0x55aa) {
  643. dev_err(go->dev, "unable to reset the USB interface\n");
  644. return -1;
  645. }
  646. return 0;
  647. }
  648. static int go7007_usb_ezusb_write_interrupt(struct go7007 *go,
  649. int addr, int data)
  650. {
  651. struct go7007_usb *usb = go->hpi_context;
  652. int i, r;
  653. u16 status_reg = 0;
  654. int timeout = 500;
  655. pr_debug("WriteInterrupt: %04x %04x\n", addr, data);
  656. for (i = 0; i < 100; ++i) {
  657. r = usb_control_msg(usb->usbdev,
  658. usb_rcvctrlpipe(usb->usbdev, 0), 0x14,
  659. USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
  660. 0, HPI_STATUS_ADDR, go->usb_buf,
  661. sizeof(status_reg), timeout);
  662. if (r < 0)
  663. break;
  664. status_reg = le16_to_cpu(*((__le16 *)go->usb_buf));
  665. if (!(status_reg & 0x0010))
  666. break;
  667. msleep(10);
  668. }
  669. if (r < 0)
  670. goto write_int_error;
  671. if (i == 100) {
  672. dev_err(go->dev, "device is hung, status reg = 0x%04x\n", status_reg);
  673. return -1;
  674. }
  675. r = usb_control_msg(usb->usbdev, usb_sndctrlpipe(usb->usbdev, 0), 0x12,
  676. USB_TYPE_VENDOR | USB_RECIP_DEVICE, data,
  677. INT_PARAM_ADDR, NULL, 0, timeout);
  678. if (r < 0)
  679. goto write_int_error;
  680. r = usb_control_msg(usb->usbdev, usb_sndctrlpipe(usb->usbdev, 0),
  681. 0x12, USB_TYPE_VENDOR | USB_RECIP_DEVICE, addr,
  682. INT_INDEX_ADDR, NULL, 0, timeout);
  683. if (r < 0)
  684. goto write_int_error;
  685. return 0;
  686. write_int_error:
  687. dev_err(go->dev, "error in WriteInterrupt: %d\n", r);
  688. return r;
  689. }
  690. static int go7007_usb_onboard_write_interrupt(struct go7007 *go,
  691. int addr, int data)
  692. {
  693. struct go7007_usb *usb = go->hpi_context;
  694. int r;
  695. int timeout = 500;
  696. pr_debug("WriteInterrupt: %04x %04x\n", addr, data);
  697. go->usb_buf[0] = data & 0xff;
  698. go->usb_buf[1] = data >> 8;
  699. go->usb_buf[2] = addr & 0xff;
  700. go->usb_buf[3] = addr >> 8;
  701. go->usb_buf[4] = go->usb_buf[5] = go->usb_buf[6] = go->usb_buf[7] = 0;
  702. r = usb_control_msg(usb->usbdev, usb_sndctrlpipe(usb->usbdev, 2), 0x00,
  703. USB_TYPE_VENDOR | USB_RECIP_ENDPOINT, 0x55aa,
  704. 0xf0f0, go->usb_buf, 8, timeout);
  705. if (r < 0) {
  706. dev_err(go->dev, "error in WriteInterrupt: %d\n", r);
  707. return r;
  708. }
  709. return 0;
  710. }
  711. static void go7007_usb_readinterrupt_complete(struct urb *urb)
  712. {
  713. struct go7007 *go = (struct go7007 *)urb->context;
  714. __le16 *regs = (__le16 *)urb->transfer_buffer;
  715. int status = urb->status;
  716. if (status) {
  717. if (status != -ESHUTDOWN &&
  718. go->status != STATUS_SHUTDOWN) {
  719. dev_err(go->dev, "error in read interrupt: %d\n", urb->status);
  720. } else {
  721. wake_up(&go->interrupt_waitq);
  722. return;
  723. }
  724. } else if (urb->actual_length != urb->transfer_buffer_length) {
  725. dev_err(go->dev, "short read in interrupt pipe!\n");
  726. } else {
  727. go->interrupt_available = 1;
  728. go->interrupt_data = __le16_to_cpu(regs[0]);
  729. go->interrupt_value = __le16_to_cpu(regs[1]);
  730. pr_debug("ReadInterrupt: %04x %04x\n",
  731. go->interrupt_value, go->interrupt_data);
  732. }
  733. wake_up(&go->interrupt_waitq);
  734. }
  735. static int go7007_usb_read_interrupt(struct go7007 *go)
  736. {
  737. struct go7007_usb *usb = go->hpi_context;
  738. int r;
  739. r = usb_submit_urb(usb->intr_urb, GFP_KERNEL);
  740. if (r < 0) {
  741. dev_err(go->dev, "unable to submit interrupt urb: %d\n", r);
  742. return r;
  743. }
  744. return 0;
  745. }
  746. static void go7007_usb_read_video_pipe_complete(struct urb *urb)
  747. {
  748. struct go7007 *go = (struct go7007 *)urb->context;
  749. int r, status = urb->status;
  750. if (!vb2_is_streaming(&go->vidq)) {
  751. wake_up_interruptible(&go->frame_waitq);
  752. return;
  753. }
  754. if (status) {
  755. dev_err(go->dev, "error in video pipe: %d\n", status);
  756. return;
  757. }
  758. if (urb->actual_length != urb->transfer_buffer_length) {
  759. dev_err(go->dev, "short read in video pipe!\n");
  760. return;
  761. }
  762. go7007_parse_video_stream(go, urb->transfer_buffer, urb->actual_length);
  763. r = usb_submit_urb(urb, GFP_ATOMIC);
  764. if (r < 0)
  765. dev_err(go->dev, "error in video pipe: %d\n", r);
  766. }
  767. static void go7007_usb_read_audio_pipe_complete(struct urb *urb)
  768. {
  769. struct go7007 *go = (struct go7007 *)urb->context;
  770. int r, status = urb->status;
  771. if (!vb2_is_streaming(&go->vidq))
  772. return;
  773. if (status) {
  774. dev_err(go->dev, "error in audio pipe: %d\n",
  775. status);
  776. return;
  777. }
  778. if (urb->actual_length != urb->transfer_buffer_length) {
  779. dev_err(go->dev, "short read in audio pipe!\n");
  780. return;
  781. }
  782. if (go->audio_deliver != NULL)
  783. go->audio_deliver(go, urb->transfer_buffer, urb->actual_length);
  784. r = usb_submit_urb(urb, GFP_ATOMIC);
  785. if (r < 0)
  786. dev_err(go->dev, "error in audio pipe: %d\n", r);
  787. }
  788. static int go7007_usb_stream_start(struct go7007 *go)
  789. {
  790. struct go7007_usb *usb = go->hpi_context;
  791. int i, r;
  792. for (i = 0; i < 8; ++i) {
  793. r = usb_submit_urb(usb->video_urbs[i], GFP_KERNEL);
  794. if (r < 0) {
  795. dev_err(go->dev, "error submitting video urb %d: %d\n", i, r);
  796. goto video_submit_failed;
  797. }
  798. }
  799. if (!go->audio_enabled)
  800. return 0;
  801. for (i = 0; i < 8; ++i) {
  802. r = usb_submit_urb(usb->audio_urbs[i], GFP_KERNEL);
  803. if (r < 0) {
  804. dev_err(go->dev, "error submitting audio urb %d: %d\n", i, r);
  805. goto audio_submit_failed;
  806. }
  807. }
  808. return 0;
  809. audio_submit_failed:
  810. for (i = 0; i < 7; ++i)
  811. usb_kill_urb(usb->audio_urbs[i]);
  812. video_submit_failed:
  813. for (i = 0; i < 8; ++i)
  814. usb_kill_urb(usb->video_urbs[i]);
  815. return -1;
  816. }
  817. static int go7007_usb_stream_stop(struct go7007 *go)
  818. {
  819. struct go7007_usb *usb = go->hpi_context;
  820. int i;
  821. if (go->status == STATUS_SHUTDOWN)
  822. return 0;
  823. for (i = 0; i < 8; ++i)
  824. usb_kill_urb(usb->video_urbs[i]);
  825. if (go->audio_enabled)
  826. for (i = 0; i < 8; ++i)
  827. usb_kill_urb(usb->audio_urbs[i]);
  828. return 0;
  829. }
  830. static int go7007_usb_send_firmware(struct go7007 *go, u8 *data, int len)
  831. {
  832. struct go7007_usb *usb = go->hpi_context;
  833. int transferred, pipe;
  834. int timeout = 500;
  835. pr_debug("DownloadBuffer sending %d bytes\n", len);
  836. if (usb->board->flags & GO7007_USB_EZUSB)
  837. pipe = usb_sndbulkpipe(usb->usbdev, 2);
  838. else
  839. pipe = usb_sndbulkpipe(usb->usbdev, 3);
  840. return usb_bulk_msg(usb->usbdev, pipe, data, len,
  841. &transferred, timeout);
  842. }
  843. static void go7007_usb_release(struct go7007 *go)
  844. {
  845. struct go7007_usb *usb = go->hpi_context;
  846. struct urb *vurb, *aurb;
  847. int i;
  848. if (usb->intr_urb) {
  849. usb_kill_urb(usb->intr_urb);
  850. kfree(usb->intr_urb->transfer_buffer);
  851. usb_free_urb(usb->intr_urb);
  852. }
  853. /* Free USB-related structs */
  854. for (i = 0; i < 8; ++i) {
  855. vurb = usb->video_urbs[i];
  856. if (vurb) {
  857. usb_kill_urb(vurb);
  858. kfree(vurb->transfer_buffer);
  859. usb_free_urb(vurb);
  860. }
  861. aurb = usb->audio_urbs[i];
  862. if (aurb) {
  863. usb_kill_urb(aurb);
  864. kfree(aurb->transfer_buffer);
  865. usb_free_urb(aurb);
  866. }
  867. }
  868. kfree(go->hpi_context);
  869. }
  870. static struct go7007_hpi_ops go7007_usb_ezusb_hpi_ops = {
  871. .interface_reset = go7007_usb_interface_reset,
  872. .write_interrupt = go7007_usb_ezusb_write_interrupt,
  873. .read_interrupt = go7007_usb_read_interrupt,
  874. .stream_start = go7007_usb_stream_start,
  875. .stream_stop = go7007_usb_stream_stop,
  876. .send_firmware = go7007_usb_send_firmware,
  877. .release = go7007_usb_release,
  878. };
  879. static struct go7007_hpi_ops go7007_usb_onboard_hpi_ops = {
  880. .interface_reset = go7007_usb_interface_reset,
  881. .write_interrupt = go7007_usb_onboard_write_interrupt,
  882. .read_interrupt = go7007_usb_read_interrupt,
  883. .stream_start = go7007_usb_stream_start,
  884. .stream_stop = go7007_usb_stream_stop,
  885. .send_firmware = go7007_usb_send_firmware,
  886. .release = go7007_usb_release,
  887. };
  888. /********************* Driver for EZ-USB I2C adapter *********************/
  889. static int go7007_usb_i2c_master_xfer(struct i2c_adapter *adapter,
  890. struct i2c_msg msgs[], int num)
  891. {
  892. struct go7007 *go = i2c_get_adapdata(adapter);
  893. struct go7007_usb *usb = go->hpi_context;
  894. u8 *buf = go->usb_buf;
  895. int buf_len, i;
  896. int ret = -EIO;
  897. if (go->status == STATUS_SHUTDOWN)
  898. return -ENODEV;
  899. mutex_lock(&usb->i2c_lock);
  900. for (i = 0; i < num; ++i) {
  901. /* The hardware command is "write some bytes then read some
  902. * bytes", so we try to coalesce a write followed by a read
  903. * into a single USB transaction */
  904. if (i + 1 < num && msgs[i].addr == msgs[i + 1].addr &&
  905. !(msgs[i].flags & I2C_M_RD) &&
  906. (msgs[i + 1].flags & I2C_M_RD)) {
  907. #ifdef GO7007_I2C_DEBUG
  908. pr_debug("i2c write/read %d/%d bytes on %02x\n",
  909. msgs[i].len, msgs[i + 1].len, msgs[i].addr);
  910. #endif
  911. buf[0] = 0x01;
  912. buf[1] = msgs[i].len + 1;
  913. buf[2] = msgs[i].addr << 1;
  914. memcpy(&buf[3], msgs[i].buf, msgs[i].len);
  915. buf_len = msgs[i].len + 3;
  916. buf[buf_len++] = msgs[++i].len;
  917. } else if (msgs[i].flags & I2C_M_RD) {
  918. #ifdef GO7007_I2C_DEBUG
  919. pr_debug("i2c read %d bytes on %02x\n",
  920. msgs[i].len, msgs[i].addr);
  921. #endif
  922. buf[0] = 0x01;
  923. buf[1] = 1;
  924. buf[2] = msgs[i].addr << 1;
  925. buf[3] = msgs[i].len;
  926. buf_len = 4;
  927. } else {
  928. #ifdef GO7007_I2C_DEBUG
  929. pr_debug("i2c write %d bytes on %02x\n",
  930. msgs[i].len, msgs[i].addr);
  931. #endif
  932. buf[0] = 0x00;
  933. buf[1] = msgs[i].len + 1;
  934. buf[2] = msgs[i].addr << 1;
  935. memcpy(&buf[3], msgs[i].buf, msgs[i].len);
  936. buf_len = msgs[i].len + 3;
  937. buf[buf_len++] = 0;
  938. }
  939. if (go7007_usb_vendor_request(go, 0x24, 0, 0,
  940. buf, buf_len, 0) < 0)
  941. goto i2c_done;
  942. if (msgs[i].flags & I2C_M_RD) {
  943. memset(buf, 0, msgs[i].len + 1);
  944. if (go7007_usb_vendor_request(go, 0x25, 0, 0, buf,
  945. msgs[i].len + 1, 1) < 0)
  946. goto i2c_done;
  947. memcpy(msgs[i].buf, buf + 1, msgs[i].len);
  948. }
  949. }
  950. ret = num;
  951. i2c_done:
  952. mutex_unlock(&usb->i2c_lock);
  953. return ret;
  954. }
  955. static u32 go7007_usb_functionality(struct i2c_adapter *adapter)
  956. {
  957. /* No errors are reported by the hardware, so we don't bother
  958. * supporting quick writes to avoid confusing probing */
  959. return (I2C_FUNC_SMBUS_EMUL) & ~I2C_FUNC_SMBUS_QUICK;
  960. }
  961. static struct i2c_algorithm go7007_usb_algo = {
  962. .master_xfer = go7007_usb_i2c_master_xfer,
  963. .functionality = go7007_usb_functionality,
  964. };
  965. static struct i2c_adapter go7007_usb_adap_templ = {
  966. .owner = THIS_MODULE,
  967. .name = "WIS GO7007SB EZ-USB",
  968. .algo = &go7007_usb_algo,
  969. };
  970. /********************* USB add/remove functions *********************/
  971. static int go7007_usb_probe(struct usb_interface *intf,
  972. const struct usb_device_id *id)
  973. {
  974. struct go7007 *go;
  975. struct go7007_usb *usb;
  976. const struct go7007_usb_board *board;
  977. struct usb_device *usbdev = interface_to_usbdev(intf);
  978. unsigned num_i2c_devs;
  979. char *name;
  980. int video_pipe, i, v_urb_len;
  981. pr_debug("probing new GO7007 USB board\n");
  982. switch (id->driver_info) {
  983. case GO7007_BOARDID_MATRIX_II:
  984. name = "WIS Matrix II or compatible";
  985. board = &board_matrix_ii;
  986. break;
  987. case GO7007_BOARDID_MATRIX_RELOAD:
  988. name = "WIS Matrix Reloaded or compatible";
  989. board = &board_matrix_reload;
  990. break;
  991. case GO7007_BOARDID_MATRIX_REV:
  992. name = "WIS Matrix Revolution or compatible";
  993. board = &board_matrix_revolution;
  994. break;
  995. case GO7007_BOARDID_STAR_TREK:
  996. name = "WIS Star Trek or compatible";
  997. board = &board_star_trek;
  998. break;
  999. case GO7007_BOARDID_XMEN:
  1000. name = "WIS XMen or compatible";
  1001. board = &board_xmen;
  1002. break;
  1003. case GO7007_BOARDID_XMEN_II:
  1004. name = "WIS XMen II or compatible";
  1005. board = &board_xmen;
  1006. break;
  1007. case GO7007_BOARDID_XMEN_III:
  1008. name = "WIS XMen III or compatible";
  1009. board = &board_xmen;
  1010. break;
  1011. case GO7007_BOARDID_PX_M402U:
  1012. name = "Plextor PX-M402U";
  1013. board = &board_matrix_ii;
  1014. break;
  1015. case GO7007_BOARDID_PX_TV402U:
  1016. name = "Plextor PX-TV402U (unknown tuner)";
  1017. board = &board_px_tv402u;
  1018. break;
  1019. case GO7007_BOARDID_LIFEVIEW_LR192:
  1020. dev_err(&intf->dev, "The Lifeview TV Walker Ultra is not supported. Sorry!\n");
  1021. return -ENODEV;
  1022. name = "Lifeview TV Walker Ultra";
  1023. board = &board_lifeview_lr192;
  1024. break;
  1025. case GO7007_BOARDID_SENSORAY_2250:
  1026. dev_info(&intf->dev, "Sensoray 2250 found\n");
  1027. name = "Sensoray 2250/2251";
  1028. board = &board_sensoray_2250;
  1029. break;
  1030. case GO7007_BOARDID_ADS_USBAV_709:
  1031. name = "ADS Tech DVD Xpress DX2";
  1032. board = &board_ads_usbav_709;
  1033. break;
  1034. default:
  1035. dev_err(&intf->dev, "unknown board ID %d!\n",
  1036. (unsigned int)id->driver_info);
  1037. return -ENODEV;
  1038. }
  1039. go = go7007_alloc(&board->main_info, &intf->dev);
  1040. if (go == NULL)
  1041. return -ENOMEM;
  1042. usb = kzalloc(sizeof(struct go7007_usb), GFP_KERNEL);
  1043. if (usb == NULL) {
  1044. kfree(go);
  1045. return -ENOMEM;
  1046. }
  1047. usb->board = board;
  1048. usb->usbdev = usbdev;
  1049. usb_make_path(usbdev, go->bus_info, sizeof(go->bus_info));
  1050. go->board_id = id->driver_info;
  1051. strncpy(go->name, name, sizeof(go->name));
  1052. if (board->flags & GO7007_USB_EZUSB)
  1053. go->hpi_ops = &go7007_usb_ezusb_hpi_ops;
  1054. else
  1055. go->hpi_ops = &go7007_usb_onboard_hpi_ops;
  1056. go->hpi_context = usb;
  1057. /* Allocate the URB and buffer for receiving incoming interrupts */
  1058. usb->intr_urb = usb_alloc_urb(0, GFP_KERNEL);
  1059. if (usb->intr_urb == NULL)
  1060. goto allocfail;
  1061. usb->intr_urb->transfer_buffer = kmalloc(2*sizeof(u16), GFP_KERNEL);
  1062. if (usb->intr_urb->transfer_buffer == NULL)
  1063. goto allocfail;
  1064. if (go->board_id == GO7007_BOARDID_SENSORAY_2250)
  1065. usb_fill_bulk_urb(usb->intr_urb, usb->usbdev,
  1066. usb_rcvbulkpipe(usb->usbdev, 4),
  1067. usb->intr_urb->transfer_buffer, 2*sizeof(u16),
  1068. go7007_usb_readinterrupt_complete, go);
  1069. else
  1070. usb_fill_int_urb(usb->intr_urb, usb->usbdev,
  1071. usb_rcvintpipe(usb->usbdev, 4),
  1072. usb->intr_urb->transfer_buffer, 2*sizeof(u16),
  1073. go7007_usb_readinterrupt_complete, go, 8);
  1074. usb_set_intfdata(intf, &go->v4l2_dev);
  1075. /* Boot the GO7007 */
  1076. if (go7007_boot_encoder(go, go->board_info->flags &
  1077. GO7007_BOARD_USE_ONBOARD_I2C) < 0)
  1078. goto allocfail;
  1079. /* Register the EZ-USB I2C adapter, if we're using it */
  1080. if (board->flags & GO7007_USB_EZUSB_I2C) {
  1081. memcpy(&go->i2c_adapter, &go7007_usb_adap_templ,
  1082. sizeof(go7007_usb_adap_templ));
  1083. mutex_init(&usb->i2c_lock);
  1084. go->i2c_adapter.dev.parent = go->dev;
  1085. i2c_set_adapdata(&go->i2c_adapter, go);
  1086. if (i2c_add_adapter(&go->i2c_adapter) < 0) {
  1087. dev_err(go->dev, "error: i2c_add_adapter failed\n");
  1088. goto allocfail;
  1089. }
  1090. go->i2c_adapter_online = 1;
  1091. }
  1092. /* Pelco and Adlink reused the XMen and XMen-III vendor and product
  1093. * IDs for their own incompatible designs. We can detect XMen boards
  1094. * by probing the sensor, but there is no way to probe the sensors on
  1095. * the Pelco and Adlink designs so we default to the Adlink. If it
  1096. * is actually a Pelco, the user must set the assume_endura module
  1097. * parameter. */
  1098. if ((go->board_id == GO7007_BOARDID_XMEN ||
  1099. go->board_id == GO7007_BOARDID_XMEN_III) &&
  1100. go->i2c_adapter_online) {
  1101. union i2c_smbus_data data;
  1102. /* Check to see if register 0x0A is 0x76 */
  1103. i2c_smbus_xfer(&go->i2c_adapter, 0x21, I2C_CLIENT_SCCB,
  1104. I2C_SMBUS_READ, 0x0A, I2C_SMBUS_BYTE_DATA, &data);
  1105. if (data.byte != 0x76) {
  1106. if (assume_endura) {
  1107. go->board_id = GO7007_BOARDID_ENDURA;
  1108. usb->board = board = &board_endura;
  1109. go->board_info = &board->main_info;
  1110. strncpy(go->name, "Pelco Endura",
  1111. sizeof(go->name));
  1112. } else {
  1113. u16 channel;
  1114. /* read channel number from GPIO[1:0] */
  1115. go7007_read_addr(go, 0x3c81, &channel);
  1116. channel &= 0x3;
  1117. go->board_id = GO7007_BOARDID_ADLINK_MPG24;
  1118. usb->board = board = &board_adlink_mpg24;
  1119. go->board_info = &board->main_info;
  1120. go->channel_number = channel;
  1121. snprintf(go->name, sizeof(go->name),
  1122. "Adlink PCI-MPG24, channel #%d",
  1123. channel);
  1124. }
  1125. go7007_update_board(go);
  1126. }
  1127. }
  1128. num_i2c_devs = go->board_info->num_i2c_devs;
  1129. /* Probe the tuner model on the TV402U */
  1130. if (go->board_id == GO7007_BOARDID_PX_TV402U) {
  1131. /* Board strapping indicates tuner model */
  1132. if (go7007_usb_vendor_request(go, 0x41, 0, 0, go->usb_buf, 3,
  1133. 1) < 0) {
  1134. dev_err(go->dev, "GPIO read failed!\n");
  1135. goto allocfail;
  1136. }
  1137. switch (go->usb_buf[0] >> 6) {
  1138. case 1:
  1139. go->tuner_type = TUNER_SONY_BTF_PG472Z;
  1140. go->std = V4L2_STD_PAL;
  1141. strncpy(go->name, "Plextor PX-TV402U-EU",
  1142. sizeof(go->name));
  1143. break;
  1144. case 2:
  1145. go->tuner_type = TUNER_SONY_BTF_PK467Z;
  1146. go->std = V4L2_STD_NTSC_M_JP;
  1147. num_i2c_devs -= 2;
  1148. strncpy(go->name, "Plextor PX-TV402U-JP",
  1149. sizeof(go->name));
  1150. break;
  1151. case 3:
  1152. go->tuner_type = TUNER_SONY_BTF_PB463Z;
  1153. num_i2c_devs -= 2;
  1154. strncpy(go->name, "Plextor PX-TV402U-NA",
  1155. sizeof(go->name));
  1156. break;
  1157. default:
  1158. pr_debug("unable to detect tuner type!\n");
  1159. break;
  1160. }
  1161. /* Configure tuner mode selection inputs connected
  1162. * to the EZ-USB GPIO output pins */
  1163. if (go7007_usb_vendor_request(go, 0x40, 0x7f02, 0,
  1164. NULL, 0, 0) < 0) {
  1165. dev_err(go->dev, "GPIO write failed!\n");
  1166. goto allocfail;
  1167. }
  1168. }
  1169. /* Print a nasty message if the user attempts to use a USB2.0 device in
  1170. * a USB1.1 port. There will be silent corruption of the stream. */
  1171. if ((board->flags & GO7007_USB_EZUSB) &&
  1172. usbdev->speed != USB_SPEED_HIGH)
  1173. dev_err(go->dev, "*** WARNING *** This device must be connected to a USB 2.0 port! Attempting to capture video through a USB 1.1 port will result in stream corruption, even at low bitrates!\n");
  1174. /* Allocate the URBs and buffers for receiving the video stream */
  1175. if (board->flags & GO7007_USB_EZUSB) {
  1176. v_urb_len = 1024;
  1177. video_pipe = usb_rcvbulkpipe(usb->usbdev, 6);
  1178. } else {
  1179. v_urb_len = 512;
  1180. video_pipe = usb_rcvbulkpipe(usb->usbdev, 1);
  1181. }
  1182. for (i = 0; i < 8; ++i) {
  1183. usb->video_urbs[i] = usb_alloc_urb(0, GFP_KERNEL);
  1184. if (usb->video_urbs[i] == NULL)
  1185. goto allocfail;
  1186. usb->video_urbs[i]->transfer_buffer =
  1187. kmalloc(v_urb_len, GFP_KERNEL);
  1188. if (usb->video_urbs[i]->transfer_buffer == NULL)
  1189. goto allocfail;
  1190. usb_fill_bulk_urb(usb->video_urbs[i], usb->usbdev, video_pipe,
  1191. usb->video_urbs[i]->transfer_buffer, v_urb_len,
  1192. go7007_usb_read_video_pipe_complete, go);
  1193. }
  1194. /* Allocate the URBs and buffers for receiving the audio stream */
  1195. if ((board->flags & GO7007_USB_EZUSB) &&
  1196. (board->flags & GO7007_BOARD_HAS_AUDIO)) {
  1197. for (i = 0; i < 8; ++i) {
  1198. usb->audio_urbs[i] = usb_alloc_urb(0, GFP_KERNEL);
  1199. if (usb->audio_urbs[i] == NULL)
  1200. goto allocfail;
  1201. usb->audio_urbs[i]->transfer_buffer = kmalloc(4096,
  1202. GFP_KERNEL);
  1203. if (usb->audio_urbs[i]->transfer_buffer == NULL)
  1204. goto allocfail;
  1205. usb_fill_bulk_urb(usb->audio_urbs[i], usb->usbdev,
  1206. usb_rcvbulkpipe(usb->usbdev, 8),
  1207. usb->audio_urbs[i]->transfer_buffer, 4096,
  1208. go7007_usb_read_audio_pipe_complete, go);
  1209. }
  1210. }
  1211. /* Do any final GO7007 initialization, then register the
  1212. * V4L2 and ALSA interfaces */
  1213. if (go7007_register_encoder(go, num_i2c_devs) < 0)
  1214. goto allocfail;
  1215. go->status = STATUS_ONLINE;
  1216. return 0;
  1217. allocfail:
  1218. go7007_usb_release(go);
  1219. kfree(go);
  1220. return -ENOMEM;
  1221. }
  1222. static void go7007_usb_disconnect(struct usb_interface *intf)
  1223. {
  1224. struct go7007 *go = to_go7007(usb_get_intfdata(intf));
  1225. mutex_lock(&go->queue_lock);
  1226. mutex_lock(&go->serialize_lock);
  1227. if (go->audio_enabled)
  1228. go7007_snd_remove(go);
  1229. go->status = STATUS_SHUTDOWN;
  1230. v4l2_device_disconnect(&go->v4l2_dev);
  1231. video_unregister_device(&go->vdev);
  1232. mutex_unlock(&go->serialize_lock);
  1233. mutex_unlock(&go->queue_lock);
  1234. v4l2_device_put(&go->v4l2_dev);
  1235. }
  1236. static struct usb_driver go7007_usb_driver = {
  1237. .name = "go7007",
  1238. .probe = go7007_usb_probe,
  1239. .disconnect = go7007_usb_disconnect,
  1240. .id_table = go7007_usb_id_table,
  1241. };
  1242. module_usb_driver(go7007_usb_driver);
  1243. MODULE_LICENSE("GPL v2");