]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - drivers/media/video/cx231xx/cx231xx-core.c
V4L/DVB (10954): Add cx231xx USB driver
[linux-2.6-omap-h63xx.git] / drivers / media / video / cx231xx / cx231xx-core.c
1 /*
2    cx231xx-core.c - driver for Conexant Cx23100/101/102 USB video capture devices
3
4    Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
5         Based on em28xx driver
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20  */
21
22 #include <linux/init.h>
23 #include <linux/list.h>
24 #include <linux/module.h>
25 #include <linux/usb.h>
26 #include <linux/vmalloc.h>
27 #include <media/v4l2-common.h>
28
29 #include "cx231xx.h"
30 #include "cx231xx-reg.h"
31
32 /* #define ENABLE_DEBUG_ISOC_FRAMES */
33
34 static unsigned int core_debug;
35 module_param(core_debug,int,0644);
36 MODULE_PARM_DESC(core_debug,"enable debug messages [core]");
37
38 #define cx231xx_coredbg(fmt, arg...) do {\
39         if (core_debug) \
40                 printk(KERN_INFO "%s %s :"fmt, \
41                          dev->name, __func__ , ##arg); } while (0)
42
43 static unsigned int reg_debug;
44 module_param(reg_debug,int,0644);
45 MODULE_PARM_DESC(reg_debug,"enable debug messages [URB reg]");
46
47 #define cx231xx_regdbg(fmt, arg...) do {\
48         if (reg_debug) \
49                 printk(KERN_INFO "%s %s :"fmt, \
50                          dev->name, __func__ , ##arg); } while (0)
51
52 static int alt = CX231XX_PINOUT;
53 module_param(alt, int, 0644);
54 MODULE_PARM_DESC(alt, "alternate setting to use for video endpoint");
55
56 /* FIXME */
57 #define cx231xx_isocdbg(fmt, arg...) do {\
58         if (core_debug) \
59                 printk(KERN_INFO "%s %s :"fmt, \
60                          dev->name, __func__ , ##arg); } while (0)
61
62
63
64 /************************************************************************************
65 *                              Device control list functions                        *
66 *************************************************************************************/
67
68 static LIST_HEAD(cx231xx_devlist);
69 static DEFINE_MUTEX(cx231xx_devlist_mutex);
70
71 struct cx231xx *cx231xx_get_device(int minor,
72                                  enum v4l2_buf_type *fh_type,
73                                  int *has_radio)
74 {
75         struct cx231xx *h, *dev = NULL;
76
77         *fh_type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
78         *has_radio = 0;
79
80         mutex_lock(&cx231xx_devlist_mutex);
81         list_for_each_entry(h, &cx231xx_devlist, devlist) {
82                 if (h->vdev->minor == minor)
83                         dev = h;
84                 if (h->vbi_dev->minor == minor) {
85                         dev = h;
86                         *fh_type = V4L2_BUF_TYPE_VBI_CAPTURE;
87                 }
88                 if (h->radio_dev &&
89                     h->radio_dev->minor == minor) {
90                         dev = h;
91                         *has_radio = 1;
92                 }
93         }
94         mutex_unlock(&cx231xx_devlist_mutex);
95
96         return dev;
97 }
98
99 /*
100  * cx231xx_realease_resources()
101  * unregisters the v4l2,i2c and usb devices
102  * called when the device gets disconected or at module unload
103 */
104 void cx231xx_remove_from_devlist(struct cx231xx *dev)
105 {
106         mutex_lock(&cx231xx_devlist_mutex);
107         list_del(&dev->devlist);
108         mutex_unlock(&cx231xx_devlist_mutex);
109 };
110
111 void cx231xx_add_into_devlist(struct cx231xx *dev)
112 {
113         mutex_lock(&cx231xx_devlist_mutex);
114         list_add_tail(&dev->devlist, &cx231xx_devlist);
115         mutex_unlock(&cx231xx_devlist_mutex);
116 };
117
118
119
120
121 static LIST_HEAD(cx231xx_extension_devlist);
122 static DEFINE_MUTEX(cx231xx_extension_devlist_lock);
123
124 int cx231xx_register_extension(struct cx231xx_ops *ops)
125 {
126         struct cx231xx *dev = NULL;
127
128         mutex_lock(&cx231xx_devlist_mutex);
129         mutex_lock(&cx231xx_extension_devlist_lock);
130         list_add_tail(&ops->next, &cx231xx_extension_devlist);
131         list_for_each_entry(dev, &cx231xx_devlist, devlist) {
132                 if (dev)
133                         ops->init(dev);
134         }
135         cx231xx_info("Cx231xx: Initialized (%s) extension\n", ops->name);
136         mutex_unlock(&cx231xx_extension_devlist_lock);
137         mutex_unlock(&cx231xx_devlist_mutex);
138         return 0;
139 }
140 EXPORT_SYMBOL(cx231xx_register_extension);
141
142 void cx231xx_unregister_extension(struct cx231xx_ops *ops)
143 {
144         struct cx231xx *dev = NULL;
145
146         mutex_lock(&cx231xx_devlist_mutex);
147         list_for_each_entry(dev, &cx231xx_devlist, devlist) {
148                 if (dev)
149                         ops->fini(dev);
150         }
151
152         mutex_lock(&cx231xx_extension_devlist_lock);
153         cx231xx_info("Cx231xx: Removed (%s) extension\n", ops->name);
154         list_del(&ops->next);
155         mutex_unlock(&cx231xx_extension_devlist_lock);
156         mutex_unlock(&cx231xx_devlist_mutex);
157 }
158 EXPORT_SYMBOL(cx231xx_unregister_extension);
159
160
161 void cx231xx_init_extension(struct cx231xx *dev)
162 {
163         struct cx231xx_ops *ops = NULL;
164
165         mutex_lock(&cx231xx_extension_devlist_lock);
166         if (!list_empty(&cx231xx_extension_devlist)) {
167                 list_for_each_entry(ops, &cx231xx_extension_devlist, next) {
168                         if (ops->init)
169                                 ops->init(dev);
170                 }
171         }
172         mutex_unlock(&cx231xx_extension_devlist_lock);
173 }
174
175 void cx231xx_close_extension(struct cx231xx *dev)
176 {
177         struct cx231xx_ops *ops = NULL;
178
179         mutex_lock(&cx231xx_extension_devlist_lock);
180         if (!list_empty(&cx231xx_extension_devlist)) {
181                 list_for_each_entry(ops, &cx231xx_extension_devlist, next) {
182                         if (ops->fini)
183                                 ops->fini(dev);
184                 }
185         }
186         mutex_unlock(&cx231xx_extension_devlist_lock);
187 }
188
189 /************************************************************************************
190 *                              U S B related functions                              *
191 *************************************************************************************/
192 int cx231xx_send_usb_command(struct cx231xx_i2c *i2c_bus,
193                    struct cx231xx_i2c_xfer_data *req_data)
194 {
195     int status = 0;
196     struct cx231xx *dev = i2c_bus->dev;
197     VENDOR_REQUEST_IN ven_req;
198
199     u8 saddr_len    = 0;
200     u8 _i2c_period  = 0;
201     u8 _i2c_nostop  = 0;
202     u8 _i2c_reserve = 0;
203
204     /* Get the I2C period, nostop and reserve parameters */
205     _i2c_period  = i2c_bus->i2c_period;
206     _i2c_nostop  = i2c_bus->i2c_nostop;
207     _i2c_reserve = i2c_bus->i2c_reserve;
208
209     saddr_len = req_data->saddr_len;
210
211     /* Set wValue */
212     if(saddr_len == 1)                          /* need check saddr_len == 0  */
213         ven_req.wValue = req_data->dev_addr<<9|_i2c_period<<4|saddr_len<<2|
214                         _i2c_nostop<<1|I2C_SYNC|_i2c_reserve<<6;
215     else
216         ven_req.wValue = req_data->dev_addr<<9|_i2c_period<<4|saddr_len<<2|
217                         _i2c_nostop<<1|I2C_SYNC|_i2c_reserve<<6;
218
219     /* set channel number */
220     if(req_data->direction & I2C_M_RD)
221         ven_req.bRequest = i2c_bus->nr + 4;   /* channel number, for read,
222                                                  spec required channel_num +4 */
223     else
224         ven_req.bRequest = i2c_bus->nr;       /* channel number,  */
225
226     /* set index value */
227     switch(saddr_len){
228         case 0:
229             ven_req.wIndex = 0;               /* need check */
230             break;
231         case 1:
232             ven_req.wIndex = (req_data->saddr_dat & 0xff);
233             break;
234         case 2:
235             ven_req.wIndex = req_data->saddr_dat;
236             break;
237     }
238
239     /* set wLength value */
240     ven_req.wLength = req_data->buf_size;
241
242     /* set bData value */
243     ven_req.bData = 0;
244
245     /* set the direction */
246     if(req_data->direction){
247         ven_req.direction = USB_DIR_IN;
248         memset(req_data->p_buffer, 0x00, ven_req.wLength);
249     }
250     else
251         ven_req.direction = USB_DIR_OUT;
252
253     /* set the buffer for read / write */
254     ven_req.pBuff = req_data->p_buffer;
255
256
257
258     /* call common vendor command request */
259     status = cx231xx_send_vendor_cmd(dev, &ven_req);
260     if (status < 0) {
261         cx231xx_info("UsbInterface::sendCommand, output buffer failed with status -%d\n", status);
262     }
263
264     return status;
265 }
266
267 EXPORT_SYMBOL_GPL(cx231xx_send_usb_command);
268 /*
269  * cx231xx_read_ctrl_reg()
270  * reads data from the usb device specifying bRequest and wValue
271  */
272 int cx231xx_read_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg,
273                             char *buf, int len)
274 {
275      u8 val = 0;
276         int ret;
277         int pipe = usb_rcvctrlpipe(dev->udev, 0);
278
279         if (dev->state & DEV_DISCONNECTED)
280                 return -ENODEV;
281
282         if (len > URB_MAX_CTRL_SIZE)
283                 return -EINVAL;
284
285     switch(len)
286     {
287         case 1:
288             val = ENABLE_ONE_BYTE;
289             break;
290         case 2:
291             val = ENABLE_TWE_BYTE;
292             break;
293         case 3:
294             val = ENABLE_THREE_BYTE;
295             break;
296         case 4:
297             val = ENABLE_FOUR_BYTE;
298             break;
299         default:
300             val = 0xFF; /* invalid option */
301     }
302
303     if(val == 0xFF)
304         return -EINVAL;
305
306         if (reg_debug) {
307                 cx231xx_isocdbg("(pipe 0x%08x): "
308                         "IN:  %02x %02x %02x %02x %02x %02x %02x %02x ",
309                         pipe,
310                         USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
311                         req, 0, val,
312                         reg & 0xff, reg >> 8,
313                         len & 0xff, len >> 8);
314         }
315
316         /* mutex_lock(&dev->ctrl_urb_lock);  */
317         ret = usb_control_msg(dev->udev, pipe, req,
318                               USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
319                               val, reg, dev->urb_buf, len, HZ);
320         if (ret < 0) {
321                 cx231xx_isocdbg(" failed!\n");
322                 /* mutex_unlock(&dev->ctrl_urb_lock); */
323                 return ret;
324         }
325
326         if (len)
327                 memcpy(buf, dev->urb_buf, len);
328
329         /* mutex_unlock(&dev->ctrl_urb_lock); */
330
331         if (reg_debug) {
332                 int byte;
333
334                 cx231xx_isocdbg("<<<");
335                 for (byte = 0; byte < len; byte++)
336                         cx231xx_isocdbg(" %02x", (unsigned char)buf[byte]);
337                 cx231xx_isocdbg("\n");
338         }
339
340         return ret;
341 }
342
343
344 int cx231xx_send_vendor_cmd(struct cx231xx *dev, VENDOR_REQUEST_IN *ven_req)
345 {
346     int ret;
347         int pipe = 0;
348
349         if (dev->state & DEV_DISCONNECTED)
350                 return -ENODEV;
351
352         if ((ven_req->wLength > URB_MAX_CTRL_SIZE))
353                 return -EINVAL;
354
355     if(ven_req->direction)
356         pipe = usb_rcvctrlpipe(dev->udev, 0);
357     else
358         pipe = usb_sndctrlpipe(dev->udev, 0);
359
360
361         if (reg_debug) {
362                 int byte;
363
364                 cx231xx_isocdbg("(pipe 0x%08x): "
365                         "OUT: %02x %02x %02x %04x %04x %04x >>>",
366                         pipe,
367                         ven_req->direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
368                         ven_req->bRequest, 0, ven_req->wValue,
369                         ven_req->wIndex,
370                         ven_req->wLength);
371
372                 for (byte = 0; byte < ven_req->wLength; byte++)
373                         cx231xx_isocdbg(" %02x", (unsigned char)ven_req->pBuff[byte]);
374                 cx231xx_isocdbg("\n");
375         }
376
377         /* mutex_lock(&dev->ctrl_urb_lock); */
378         ret = usb_control_msg(dev->udev, pipe, ven_req->bRequest,
379                               ven_req->direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
380                               ven_req->wValue, ven_req->wIndex, ven_req->pBuff, ven_req->wLength, HZ);
381         /* mutex_unlock(&dev->ctrl_urb_lock); */
382
383         return ret;
384 }
385
386 /*
387  * cx231xx_write_ctrl_reg()
388  * sends data to the usb device, specifying bRequest
389  */
390 int cx231xx_write_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg, char *buf,
391                                  int len)
392 {
393     u8 val = 0;
394         int ret;
395         int pipe = usb_sndctrlpipe(dev->udev, 0);
396
397         if (dev->state & DEV_DISCONNECTED)
398                 return -ENODEV;
399
400         if ((len < 1) || (len > URB_MAX_CTRL_SIZE))
401                 return -EINVAL;
402
403     switch(len)
404     {
405         case 1:
406             val = ENABLE_ONE_BYTE;
407             break;
408         case 2:
409             val = ENABLE_TWE_BYTE;
410             break;
411         case 3:
412             val = ENABLE_THREE_BYTE;
413             break;
414         case 4:
415             val = ENABLE_FOUR_BYTE;
416             break;
417         default:
418             val = 0xFF; /* invalid option */
419     }
420
421     if(val == 0xFF)
422         return -EINVAL;
423
424         if (reg_debug) {
425                 int byte;
426
427                 cx231xx_isocdbg("(pipe 0x%08x): "
428                         "OUT: %02x %02x %02x %02x %02x %02x %02x %02x >>>",
429                         pipe,
430                         USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
431                         req, 0, val,
432                         reg & 0xff, reg >> 8,
433                         len & 0xff, len >> 8);
434
435                 for (byte = 0; byte < len; byte++)
436                         cx231xx_isocdbg(" %02x", (unsigned char)buf[byte]);
437                 cx231xx_isocdbg("\n");
438         }
439
440         /* mutex_lock(&dev->ctrl_urb_lock); */
441         memcpy(dev->urb_buf, buf, len);
442         ret = usb_control_msg(dev->udev, pipe, req,
443                               USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
444                               val, reg, dev->urb_buf, len, HZ);
445         /* mutex_unlock(&dev->ctrl_urb_lock); */
446
447         return ret;
448 }
449
450
451 /************************************************************************************
452 *                         USB Alternate Setting functions                           *
453 *************************************************************************************/
454
455 int cx231xx_set_video_alternate(struct cx231xx *dev)
456 {
457         int errCode, prev_alt = dev->video_mode.alt;
458         unsigned int min_pkt_size = dev->width * 2 + 4;
459     u32 usb_interface_index = 0;
460
461         /* When image size is bigger than a certain value,
462            the frame size should be increased, otherwise, only
463            green screen will be received.
464          */
465         if (dev->width * 2 * dev->height > 720 * 240 * 2)
466                 min_pkt_size *= 2;
467
468     if(dev->width > 360) {
469         /* resolutions: 720,704,640 */
470         dev->video_mode.alt = 3;
471     } else if(dev->width > 180) {
472         /* resolutions: 360,352,320,240 */
473         dev->video_mode.alt = 2;
474     } else if(dev->width > 0) {
475         /* resolutions: 180,176,160,128,88 */
476         dev->video_mode.alt = 1;
477     } else {
478         /* Change to alt0 BULK to release USB bandwidth */
479         dev->video_mode.alt = 0;
480     }
481
482     /* Get the correct video interface Index */
483     usb_interface_index = dev->current_pcb_config.hs_config_info[0].interface_info.video_index+1;
484
485         if (dev->video_mode.alt != prev_alt) {
486                 cx231xx_coredbg("minimum isoc packet size: %u (alt=%d)\n",
487                                 min_pkt_size, dev->video_mode.alt);
488                 dev->video_mode.max_pkt_size = dev->video_mode.alt_max_pkt_size[dev->video_mode.alt];
489                 cx231xx_coredbg("setting alternate %d with wMaxPacketSize=%u\n",
490                                dev->video_mode.alt, dev->video_mode.max_pkt_size);
491         cx231xx_info(" setting alternate %d with wMaxPacketSize=%u , Interface = %d\n",
492                                dev->video_mode.alt, dev->video_mode.max_pkt_size, usb_interface_index);
493                 errCode = usb_set_interface(dev->udev, usb_interface_index, dev->video_mode.alt);
494                 if (errCode < 0) {
495                         cx231xx_errdev("cannot change alternate number to %d (error=%i)\n",
496                                         dev->video_mode.alt, errCode);
497                         return errCode;
498                 }
499         }
500         return 0;
501 }
502
503 int cx231xx_set_alt_setting(struct cx231xx *dev, u8 index, u8 alt)
504 {
505     int status = 0;
506     u32 usb_interface_index = 0;
507     u32 max_pkt_size = 0;
508
509     switch(index) {
510         case INDEX_TS1:
511             usb_interface_index = dev->current_pcb_config.hs_config_info[0].interface_info.ts1_index+1;
512             dev->video_mode.alt = alt;
513             if(dev->ts1_mode.alt_max_pkt_size != NULL)
514                 max_pkt_size = dev->ts1_mode.max_pkt_size = dev->ts1_mode.alt_max_pkt_size[dev->ts1_mode.alt];
515             break;
516         case INDEX_TS2:
517             usb_interface_index = dev->current_pcb_config.hs_config_info[0].interface_info.ts2_index+1;
518             break;
519         case INDEX_AUDIO:
520             usb_interface_index = dev->current_pcb_config.hs_config_info[0].interface_info.audio_index+1;
521             dev->adev.alt = alt;
522             if( dev->adev.alt_max_pkt_size != NULL)
523                 max_pkt_size = dev->adev.max_pkt_size = dev->adev.alt_max_pkt_size[dev->adev.alt];
524             break;
525         case INDEX_VIDEO:
526             usb_interface_index = dev->current_pcb_config.hs_config_info[0].interface_info.video_index+1;
527             dev->video_mode.alt = alt;
528             if(dev->video_mode.alt_max_pkt_size != NULL)
529                 max_pkt_size = dev->video_mode.max_pkt_size = dev->video_mode.alt_max_pkt_size[dev->video_mode.alt];
530             break;
531         case INDEX_VANC:
532             usb_interface_index = dev->current_pcb_config.hs_config_info[0].interface_info.vanc_index+1;
533             dev->vbi_mode.alt = alt;
534             if(dev->vbi_mode.alt_max_pkt_size != NULL)
535                 max_pkt_size = dev->vbi_mode.max_pkt_size = dev->vbi_mode.alt_max_pkt_size[dev->vbi_mode.alt];
536             break;
537         case INDEX_HANC:
538             usb_interface_index = dev->current_pcb_config.hs_config_info[0].interface_info.hanc_index+1;
539             dev->sliced_cc_mode.alt = alt;
540             if(dev->sliced_cc_mode.alt_max_pkt_size != NULL)
541                 max_pkt_size = dev->sliced_cc_mode.max_pkt_size = dev->sliced_cc_mode.alt_max_pkt_size[dev->sliced_cc_mode.alt];
542             break;
543         default:
544             break;
545     }
546
547     if(alt > 0 && max_pkt_size == 0 ) {
548         cx231xx_errdev("cannot change interface %d alternate number to %d : Max. Pkt size is ZERO\n",
549                                         usb_interface_index, alt);
550         return -1;
551     }
552
553     cx231xx_info(" setting alternate %d with wMaxPacketSize=%u , Interface = %d\n",
554                                alt, max_pkt_size, usb_interface_index);
555
556     if(usb_interface_index > 0 ) {
557         status = usb_set_interface(dev->udev, usb_interface_index, alt);
558                 if (status < 0) {
559                         cx231xx_errdev("cannot change interface %d alternate number to %d (error=%i)\n",
560                                         usb_interface_index, alt, status);
561                         return status;
562                 }
563     }
564
565     return status;
566 }
567 EXPORT_SYMBOL_GPL(cx231xx_set_alt_setting);
568
569 int cx231xx_gpio_set(struct cx231xx *dev, struct cx231xx_reg_seq *gpio)
570 {
571         int rc = 0;
572
573         if (!gpio)
574                 return rc;
575
576         /* Send GPIO reset sequences specified at board entry */
577         while (gpio->sleep >= 0) {
578         rc = cx231xx_set_gpio_value(dev, gpio->bit,
579                                                    gpio->val);
580                         if (rc < 0)
581                                 return rc;
582
583                 if (gpio->sleep > 0)
584                         msleep(gpio->sleep);
585
586                 gpio++;
587         }
588         return rc;
589 }
590
591 int cx231xx_set_mode(struct cx231xx *dev, enum cx231xx_mode set_mode)
592 {
593         if (dev->mode == set_mode)
594                 return 0;
595
596         if (set_mode == CX231XX_SUSPEND) {
597         /* Set the chip in power saving mode */
598                 dev->mode = set_mode;
599         }
600
601         /* Resource is locked */
602         if (dev->mode != CX231XX_SUSPEND)
603                 return -EINVAL;
604
605         dev->mode = set_mode;
606
607     if (dev->mode == CX231XX_DIGITAL_MODE) {
608         /* Set Digital power mode */
609     } else {
610         /* Set Analog Power mode*/
611     }
612     return 0;
613 }
614 EXPORT_SYMBOL_GPL(cx231xx_set_mode);
615
616 /************************************************************************************
617 *                               URB Streaming functions                             *
618 *************************************************************************************/
619
620 /*
621  * IRQ callback, called by URB callback
622  */
623 static void cx231xx_irq_callback(struct urb *urb)
624 {
625         struct cx231xx_dmaqueue  *dma_q = urb->context;
626     struct cx231xx_video_mode *vmode = container_of(dma_q, struct cx231xx_video_mode, vidq);
627     struct cx231xx *dev = container_of(vmode, struct cx231xx, video_mode);
628         int rc, i;
629
630
631     switch (urb->status) {
632             case 0:             /* success */
633             case -ETIMEDOUT:    /* NAK */
634                     break;
635             case -ECONNRESET:   /* kill */
636             case -ENOENT:
637             case -ESHUTDOWN:
638                     return;
639             default:            /* error */
640                     cx231xx_isocdbg("urb completition error %d.\n", urb->status);
641                     break;
642         }
643
644         /* Copy data from URB */
645         spin_lock(&dev->video_mode.slock);
646         rc = dev->video_mode.isoc_ctl.isoc_copy(dev, urb);
647         spin_unlock(&dev->video_mode.slock);
648
649         /* Reset urb buffers */
650         for (i = 0; i < urb->number_of_packets; i++) {
651                 urb->iso_frame_desc[i].status = 0;
652                 urb->iso_frame_desc[i].actual_length = 0;
653         }
654         urb->status = 0;
655
656         urb->status = usb_submit_urb(urb, GFP_ATOMIC);
657         if (urb->status) {
658                 cx231xx_isocdbg("urb resubmit failed (error=%i)\n",
659                                urb->status);
660         }
661 }
662
663 /*
664  * Stop and Deallocate URBs
665  */
666 void cx231xx_uninit_isoc(struct cx231xx *dev)
667 {
668         struct urb *urb;
669         int i;
670
671         cx231xx_isocdbg("cx231xx: called cx231xx_uninit_isoc\n");
672
673         dev->video_mode.isoc_ctl.nfields = -1;
674         for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
675                 urb = dev->video_mode.isoc_ctl.urb[i];
676                 if (urb) {
677             if (!irqs_disabled())
678                             usb_kill_urb(urb);
679             else
680                             usb_unlink_urb(urb);
681
682                         if (dev->video_mode.isoc_ctl.transfer_buffer[i]) {
683                                 usb_buffer_free(dev->udev,
684                                         urb->transfer_buffer_length,
685                                         dev->video_mode.isoc_ctl.transfer_buffer[i],
686                                         urb->transfer_dma);
687                         }
688                         usb_free_urb(urb);
689                         dev->video_mode.isoc_ctl.urb[i] = NULL;
690                 }
691                 dev->video_mode.isoc_ctl.transfer_buffer[i] = NULL;
692         }
693
694         kfree(dev->video_mode.isoc_ctl.urb);
695         kfree(dev->video_mode.isoc_ctl.transfer_buffer);
696
697         dev->video_mode.isoc_ctl.urb = NULL;
698         dev->video_mode.isoc_ctl.transfer_buffer = NULL;
699         dev->video_mode.isoc_ctl.num_bufs = 0;
700
701         cx231xx_capture_start(dev, 0, Raw_Video);
702 }
703 EXPORT_SYMBOL_GPL(cx231xx_uninit_isoc);
704
705 /*
706  * Allocate URBs and start IRQ
707  */
708 int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
709                      int num_bufs, int max_pkt_size,
710                      int (*isoc_copy) (struct cx231xx *dev, struct urb *urb))
711 {
712         struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
713         int i;
714         int sb_size, pipe;
715         struct urb *urb;
716         int j, k;
717         int rc;
718
719         cx231xx_isocdbg("cx231xx: called cx231xx_prepare_isoc\n");
720
721     dev->video_input = dev->video_input > 2?2:dev->video_input;
722
723     cx231xx_info("Setting Video mux to %d\n",dev->video_input);
724     video_mux(dev, dev->video_input);
725
726
727         /* De-allocates all pending stuff */
728         cx231xx_uninit_isoc(dev);
729
730         dev->video_mode.isoc_ctl.isoc_copy = isoc_copy;
731         dev->video_mode.isoc_ctl.num_bufs = num_bufs;
732     dma_q->pos = 0;
733     dma_q->is_partial_line = 0;
734     dma_q->last_sav = 0;
735     dma_q->current_field = -1;
736     dma_q->field1_done = 0;
737     dma_q->lines_per_field = dev->height/2;
738     dma_q->bytes_left_in_line = dev->width << 1;
739     dma_q->lines_completed = 0;
740     for(i = 0; i < 8 ; i++)
741         dma_q->partial_buf[i] = 0;
742
743         dev->video_mode.isoc_ctl.urb = kzalloc(sizeof(void *)*num_bufs,  GFP_KERNEL);
744         if (!dev->video_mode.isoc_ctl.urb) {
745                 cx231xx_errdev("cannot alloc memory for usb buffers\n");
746                 return -ENOMEM;
747         }
748
749         dev->video_mode.isoc_ctl.transfer_buffer = kzalloc(sizeof(void *)*num_bufs,
750                                               GFP_KERNEL);
751         if (!dev->video_mode.isoc_ctl.transfer_buffer) {
752                 cx231xx_errdev("cannot allocate memory for usbtransfer\n");
753                 kfree(dev->video_mode.isoc_ctl.urb);
754                 return -ENOMEM;
755         }
756
757         dev->video_mode.isoc_ctl.max_pkt_size = max_pkt_size;
758         dev->video_mode.isoc_ctl.buf = NULL;
759
760         sb_size = max_packets * dev->video_mode.isoc_ctl.max_pkt_size;
761
762         /* allocate urbs and transfer buffers */
763         for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
764                 urb = usb_alloc_urb(max_packets, GFP_KERNEL);
765                 if (!urb) {
766                         cx231xx_err("cannot alloc isoc_ctl.urb %i\n", i);
767                         cx231xx_uninit_isoc(dev);
768                         return -ENOMEM;
769                 }
770                 dev->video_mode.isoc_ctl.urb[i] = urb;
771
772                 dev->video_mode.isoc_ctl.transfer_buffer[i] = usb_buffer_alloc(dev->udev,
773                         sb_size, GFP_KERNEL, &urb->transfer_dma);
774                 if (!dev->video_mode.isoc_ctl.transfer_buffer[i]) {
775                         cx231xx_err("unable to allocate %i bytes for transfer"
776                                         " buffer %i%s\n",
777                                         sb_size, i,
778                                         in_interrupt()?" while in int":"");
779                         cx231xx_uninit_isoc(dev);
780                         return -ENOMEM;
781                 }
782                 memset(dev->video_mode.isoc_ctl.transfer_buffer[i], 0, sb_size);
783
784                 pipe = usb_rcvisocpipe(dev->udev, dev->video_mode.end_point_addr);
785
786                 usb_fill_int_urb(urb, dev->udev, pipe,
787                                  dev->video_mode.isoc_ctl.transfer_buffer[i], sb_size,
788                                  cx231xx_irq_callback, dma_q, 1);
789
790                 urb->number_of_packets = max_packets;
791                 urb->transfer_flags = URB_ISO_ASAP;
792
793                 k = 0;
794                 for (j = 0; j < max_packets; j++) {
795                         urb->iso_frame_desc[j].offset = k;
796                         urb->iso_frame_desc[j].length =
797                                                 dev->video_mode.isoc_ctl.max_pkt_size;
798                         k += dev->video_mode.isoc_ctl.max_pkt_size;
799                 }
800         }
801
802         init_waitqueue_head(&dma_q->wq);
803
804
805         /* submit urbs and enables IRQ */
806         for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
807                 rc = usb_submit_urb(dev->video_mode.isoc_ctl.urb[i], GFP_ATOMIC);
808                 if (rc) {
809                         cx231xx_err("submit of urb %i failed (error=%i)\n", i,
810                                    rc);
811                         cx231xx_uninit_isoc(dev);
812                         return rc;
813                 }
814         }
815
816     cx231xx_capture_start(dev, 1, Raw_Video);
817
818         return 0;
819 }
820 EXPORT_SYMBOL_GPL(cx231xx_init_isoc);
821
822 /************************************************************************************
823 *                          Device Init/UnInit functions                             *
824 *************************************************************************************/
825 int cx231xx_dev_init(struct cx231xx *dev)
826 {
827     int errCode = 0;
828
829     /* Initialize I2C bus */
830
831         /* External Master 1 Bus */
832         dev->i2c_bus[0].nr = 0;
833         dev->i2c_bus[0].dev = dev;
834         dev->i2c_bus[0].i2c_period = I2C_SPEED_1M;  /* 1MHz */
835     dev->i2c_bus[0].i2c_nostop = 0;
836     dev->i2c_bus[0].i2c_reserve = 0;
837
838         /* External Master 2 Bus */
839         dev->i2c_bus[1].nr = 1;
840         dev->i2c_bus[1].dev = dev;
841         dev->i2c_bus[1].i2c_period =  I2C_SPEED_1M;  /* 1MHz */
842     dev->i2c_bus[1].i2c_nostop = 0;
843     dev->i2c_bus[1].i2c_reserve = 0;
844
845         /* Internal Master 3 Bus */
846         dev->i2c_bus[2].nr = 2;
847         dev->i2c_bus[2].dev = dev;
848         dev->i2c_bus[2].i2c_period = I2C_SPEED_400K; /* 400kHz */
849     dev->i2c_bus[2].i2c_nostop = 0;
850     dev->i2c_bus[2].i2c_reserve = 0;
851
852     /* register I2C buses */
853         cx231xx_i2c_register(&dev->i2c_bus[0]);
854         cx231xx_i2c_register(&dev->i2c_bus[1]);
855         cx231xx_i2c_register(&dev->i2c_bus[2]);
856
857     /* init hardware */
858     /* Note : with out calling set power mode function, colibri can not be set up correctly */
859     errCode = cx231xx_set_power_mode(dev, POLARIS_AVMODE_ANALOGT_TV);
860     if (errCode < 0) {
861         cx231xx_errdev("%s: cx231xx_set_power_mode : Failed to set Power - errCode [%d]!\n",
862                         __func__, errCode);
863                 return errCode;
864         }
865
866     /* initialize Colibri block */
867     errCode = cx231xx_colibri_init_super_block(dev, 0x23c);
868         if (errCode < 0) {
869                 cx231xx_errdev("%s: cx231xx_colibri init super block - errCode [%d]!\n",
870                         __func__, errCode);
871                 return errCode;
872         }
873     errCode = cx231xx_colibri_init_channels(dev);
874     if (errCode < 0) {
875                 cx231xx_errdev("%s: cx231xx_colibri init channels - errCode [%d]!\n",
876                         __func__, errCode);
877                 return errCode;
878         }
879
880     /* Set DIF in By pass mode */
881     errCode = cx231xx_dif_set_standard(dev, DIF_USE_BASEBAND);
882     if (errCode < 0) {
883                 cx231xx_errdev("%s: cx231xx_dif set to By pass mode - errCode [%d]!\n",
884                         __func__, errCode);
885                 return errCode;
886         }
887
888     /* flatiron related functions */
889     errCode = cx231xx_flatiron_initialize(dev);
890     if (errCode < 0) {
891                 cx231xx_errdev("%s: cx231xx_flatiron initialize - errCode [%d]!\n",
892                         __func__, errCode);
893                 return errCode;
894         }
895
896     /* init control pins */
897     errCode = cx231xx_init_ctrl_pin_status(dev);
898     if (errCode < 0) {
899                 cx231xx_errdev("%s: cx231xx_init ctrl pins - errCode [%d]!\n",
900                         __func__, errCode);
901                 return errCode;
902         }
903
904     /* set AGC mode to Analog */
905     errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1);
906     if (errCode < 0) {
907                 cx231xx_errdev("%s: cx231xx_AGC mode to Analog - errCode [%d]!\n",
908                         __func__, errCode);
909                 return errCode;
910         }
911
912     /* set all alternate settings to zero initially */
913     cx231xx_set_alt_setting(dev, INDEX_VIDEO, 0);
914     cx231xx_set_alt_setting(dev, INDEX_VANC, 0);
915     cx231xx_set_alt_setting(dev, INDEX_HANC, 0);
916     if(dev->board.has_dvb)
917         cx231xx_set_alt_setting(dev, INDEX_TS1, 0);
918
919     /* set the I2C master port to 3 on channel 1 */
920     errCode = cx231xx_enable_i2c_for_tuner(dev, I2C_3);
921
922         return errCode;
923 }
924 EXPORT_SYMBOL_GPL(cx231xx_dev_init);
925
926 void cx231xx_dev_uninit(struct cx231xx *dev)
927 {
928     /* Un Initialize I2C bus */
929         cx231xx_i2c_unregister(&dev->i2c_bus[2]);
930         cx231xx_i2c_unregister(&dev->i2c_bus[1]);
931         cx231xx_i2c_unregister(&dev->i2c_bus[0]);
932 }
933 EXPORT_SYMBOL_GPL(cx231xx_dev_uninit);
934
935
936 /************************************************************************************
937 *                              G P I O related functions                            *
938 *************************************************************************************/
939 int cx231xx_send_gpio_cmd(struct cx231xx *dev, u32 gpio_bit, u8* gpio_val,
940                           u8 len, u8 request, u8 direction)
941 {
942     int status = 0;
943     VENDOR_REQUEST_IN ven_req;
944
945     /* Set wValue */
946     ven_req.wValue = (u16)(gpio_bit>>16 & 0xffff);
947
948     /* set request */
949     if(!request){
950         if(direction)
951             ven_req.bRequest = VRT_GET_GPIO; /* 0x8 gpio */
952         else
953             ven_req.bRequest = VRT_SET_GPIO; /* 0x9 gpio */
954     }
955     else {
956         if(direction)
957             ven_req.bRequest = VRT_GET_GPIE; /* 0xa gpie */
958         else
959             ven_req.bRequest = VRT_SET_GPIE; /* 0xb gpie */
960     }
961
962     /* set index value */
963     ven_req.wIndex = (u16)(gpio_bit & 0xffff);
964
965     /* set wLength value */
966     ven_req.wLength = len;
967
968     /* set bData value */
969     ven_req.bData = 0;
970
971         /* set the buffer for read / write */
972     ven_req.pBuff = gpio_val;
973
974     /* set the direction */
975     if(direction){
976         ven_req.direction = USB_DIR_IN;
977         memset(ven_req.pBuff, 0x00, ven_req.wLength);
978     }
979     else
980         ven_req.direction = USB_DIR_OUT;
981
982
983
984     /* call common vendor command request */
985     status = cx231xx_send_vendor_cmd(dev, &ven_req);
986     if (status < 0)
987     {
988         cx231xx_info("UsbInterface::sendCommand, output buffer failed with status -%d\n", status);
989     }
990
991     return status;
992 }
993
994 EXPORT_SYMBOL_GPL(cx231xx_send_gpio_cmd);
995
996 /*************************************************************************************
997  *               C O N T R O L - Register R E A D / W R I T E functions              *
998  *************************************************************************************/
999 int cx231xx_mode_register(struct cx231xx *dev, u16 address, u32 mode)
1000 {
1001     u8  value[4] = {0x0, 0x0, 0x0, 0x0};
1002     u32 tmp =0;
1003     int status = 0;
1004
1005     status = cx231xx_read_ctrl_reg(dev,VRT_GET_REGISTER, address,value,4);
1006     if(status < 0)
1007         return status;
1008
1009     tmp = *((u32 *)value);
1010     tmp |= mode;
1011
1012     value[0]=(u8) tmp;
1013     value[1]=(u8)(tmp>>8);
1014     value[2]=(u8)(tmp>>16);
1015     value[3]=(u8)(tmp>>24);
1016
1017     status = cx231xx_write_ctrl_reg(dev,VRT_SET_REGISTER, address,value,4);
1018
1019     return status;
1020 }
1021
1022 /*************************************************************************************
1023  *                      I 2 C Internal C O N T R O L   functions                     *
1024  *************************************************************************************/
1025 int cx231xx_read_i2c_data(struct cx231xx *dev, u8 dev_addr, u16 saddr,
1026                            u8 saddr_len, u32 *data, u8 data_len)
1027 {
1028     int status = 0;
1029     struct cx231xx_i2c_xfer_data req_data;
1030     u8 value[4] ={0,0,0,0};
1031
1032     if(saddr_len == 0)
1033         saddr = 0;
1034     else if(saddr_len == 0)
1035         saddr &= 0xff;
1036
1037     /* prepare xfer_data struct */
1038     req_data.dev_addr = dev_addr >> 1;
1039     req_data.direction = I2C_M_RD;
1040     req_data.saddr_len = saddr_len;
1041     req_data.saddr_dat = saddr;
1042     req_data.buf_size = data_len;
1043     req_data.p_buffer = (u8*)value;
1044
1045     /* usb send command */
1046     status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0], &req_data);
1047
1048     if(status >= 0)
1049     {
1050         /* Copy the data read back to main buffer */
1051         if(data_len == 1)
1052             *data = value[0];
1053         else
1054             *data = value[0] | value[1] << 8 | value[2] << 16 | value[3] << 24;
1055     }
1056
1057     return status;
1058 }
1059
1060 int cx231xx_write_i2c_data(struct cx231xx *dev, u8 dev_addr, u16 saddr,
1061                            u8 saddr_len, u32 data, u8 data_len)
1062 {
1063     int status = 0;
1064     u8 value[4] ={0,0,0,0};
1065     struct cx231xx_i2c_xfer_data req_data;
1066
1067     value[0]=(u8)data;
1068     value[1]=(u8)(data>>8);
1069     value[2]=(u8)(data>>16);
1070     value[3]=(u8)(data>>24);
1071
1072     if(saddr_len == 0)
1073         saddr = 0;
1074     else if(saddr_len == 0)
1075         saddr &= 0xff;
1076
1077     /* prepare xfer_data struct */
1078     req_data.dev_addr = dev_addr >> 1;
1079     req_data.direction = 0;
1080     req_data.saddr_len = saddr_len;
1081     req_data.saddr_dat = saddr;
1082     req_data.buf_size = data_len;
1083     req_data.p_buffer = value;
1084
1085     /* usb send command */
1086     status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0], &req_data);
1087
1088     return status;
1089 }
1090
1091 int cx231xx_reg_mask_write(struct cx231xx *dev, u8 dev_addr, u8 size, u16 register_address,
1092                            u8 bit_start,u8 bit_end, u32 value)
1093 {
1094     int status = 0;
1095     u32 tmp;
1096     u32 mask = 0;
1097     int i;
1098
1099     if (bit_start>(size-1) || bit_end>(size-1)) {
1100         return -1;
1101     }
1102
1103     if (size==8){
1104         status = cx231xx_read_i2c_data(dev, dev_addr, register_address, 2, &tmp, 1);
1105     } else {
1106         status = cx231xx_read_i2c_data(dev, dev_addr, register_address, 2, &tmp, 4);
1107     }
1108
1109     if (status < 0) {
1110         return status;
1111     }
1112
1113     mask = 1<<bit_end;
1114     for (i=bit_end; i>bit_start&&i>0; i--) {
1115         mask = mask + (1<<(i-1));
1116     }
1117
1118     value <<= bit_start;
1119
1120     if (size==8)
1121     {
1122         tmp &=  ~mask;
1123         tmp |=  value;
1124         tmp &= 0xff;
1125         status = cx231xx_write_i2c_data(dev, dev_addr, register_address, 2, tmp, 1);
1126     }
1127     else
1128     {
1129         tmp &=  ~mask;
1130         tmp |=  value;
1131         status = cx231xx_write_i2c_data(dev, dev_addr, register_address, 2, tmp, 4);
1132     }
1133
1134     return status;
1135 }
1136
1137
1138
1139 int cx231xx_read_modify_write_i2c_dword(struct cx231xx *dev, u8 dev_addr,
1140                                        u16 saddr, u32 mask, u32 value)
1141 {
1142     u32   temp;
1143     int status = 0;
1144
1145     status = cx231xx_read_i2c_data(dev, dev_addr, saddr, 2, &temp, 4);
1146
1147     if(status < 0)
1148         return status;
1149
1150     temp &= ~mask;
1151     temp |= value;
1152
1153     status = cx231xx_write_i2c_data(dev, dev_addr, saddr, 2, temp, 4);
1154
1155     return status;
1156 }
1157
1158 u32 cx231xx_set_field(u32 field_mask, u32 data)
1159 {
1160    u32 temp;
1161
1162    for (temp = field_mask; (temp & 1) == 0; temp >>= 1) {
1163       data <<= 1;
1164    }
1165
1166    return data;
1167 }