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