go7007-usb.c 34 KB

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