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