]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/media/video/cx231xx/cx231xx-core.c
7beb201141c4d0066f5da252704a849b0dd20b7e
[karo-tx-linux.git] / 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/slab.h>
27 #include <linux/usb.h>
28 #include <linux/vmalloc.h>
29 #include <media/v4l2-common.h>
30 #include <media/tuner.h>
31
32 #include "cx231xx.h"
33 #include "cx231xx-reg.h"
34
35 /* #define ENABLE_DEBUG_ISOC_FRAMES */
36
37 static unsigned int core_debug;
38 module_param(core_debug, int, 0644);
39 MODULE_PARM_DESC(core_debug, "enable debug messages [core]");
40
41 #define cx231xx_coredbg(fmt, arg...) do {\
42         if (core_debug) \
43                 printk(KERN_INFO "%s %s :"fmt, \
44                          dev->name, __func__ , ##arg); } while (0)
45
46 static unsigned int reg_debug;
47 module_param(reg_debug, int, 0644);
48 MODULE_PARM_DESC(reg_debug, "enable debug messages [URB reg]");
49
50 #define cx231xx_regdbg(fmt, arg...) do {\
51         if (reg_debug) \
52                 printk(KERN_INFO "%s %s :"fmt, \
53                          dev->name, __func__ , ##arg); } while (0)
54
55 static int alt = CX231XX_PINOUT;
56 module_param(alt, int, 0644);
57 MODULE_PARM_DESC(alt, "alternate setting to use for video endpoint");
58
59 #define cx231xx_isocdbg(fmt, arg...) do {\
60         if (core_debug) \
61                 printk(KERN_INFO "%s %s :"fmt, \
62                          dev->name, __func__ , ##arg); } while (0)
63
64 /*****************************************************************
65 *             Device control list functions                                      *
66 ******************************************************************/
67
68 LIST_HEAD(cx231xx_devlist);
69 static DEFINE_MUTEX(cx231xx_devlist_mutex);
70
71 /*
72  * cx231xx_realease_resources()
73  * unregisters the v4l2,i2c and usb devices
74  * called when the device gets disconected or at module unload
75 */
76 void cx231xx_remove_from_devlist(struct cx231xx *dev)
77 {
78         if (dev == NULL)
79                 return;
80         if (dev->udev == NULL)
81                 return;
82
83         if (atomic_read(&dev->devlist_count) > 0) {
84                 mutex_lock(&cx231xx_devlist_mutex);
85                 list_del(&dev->devlist);
86                 atomic_dec(&dev->devlist_count);
87                 mutex_unlock(&cx231xx_devlist_mutex);
88         }
89 };
90
91 void cx231xx_add_into_devlist(struct cx231xx *dev)
92 {
93         mutex_lock(&cx231xx_devlist_mutex);
94         list_add_tail(&dev->devlist, &cx231xx_devlist);
95         atomic_inc(&dev->devlist_count);
96         mutex_unlock(&cx231xx_devlist_mutex);
97 };
98
99 static LIST_HEAD(cx231xx_extension_devlist);
100
101 int cx231xx_register_extension(struct cx231xx_ops *ops)
102 {
103         struct cx231xx *dev = NULL;
104
105         mutex_lock(&cx231xx_devlist_mutex);
106         list_add_tail(&ops->next, &cx231xx_extension_devlist);
107         list_for_each_entry(dev, &cx231xx_devlist, devlist)
108                 ops->init(dev);
109
110         printk(KERN_INFO DRIVER_NAME ": %s initialized\n", ops->name);
111         mutex_unlock(&cx231xx_devlist_mutex);
112         return 0;
113 }
114 EXPORT_SYMBOL(cx231xx_register_extension);
115
116 void cx231xx_unregister_extension(struct cx231xx_ops *ops)
117 {
118         struct cx231xx *dev = NULL;
119
120         mutex_lock(&cx231xx_devlist_mutex);
121         list_for_each_entry(dev, &cx231xx_devlist, devlist)
122                 ops->fini(dev);
123
124
125         printk(KERN_INFO DRIVER_NAME ": %s removed\n", ops->name);
126         list_del(&ops->next);
127         mutex_unlock(&cx231xx_devlist_mutex);
128 }
129 EXPORT_SYMBOL(cx231xx_unregister_extension);
130
131 void cx231xx_init_extension(struct cx231xx *dev)
132 {
133         struct cx231xx_ops *ops = NULL;
134
135         mutex_lock(&cx231xx_devlist_mutex);
136         if (!list_empty(&cx231xx_extension_devlist)) {
137                 list_for_each_entry(ops, &cx231xx_extension_devlist, next) {
138                         if (ops->init)
139                                 ops->init(dev);
140                 }
141         }
142         mutex_unlock(&cx231xx_devlist_mutex);
143 }
144
145 void cx231xx_close_extension(struct cx231xx *dev)
146 {
147         struct cx231xx_ops *ops = NULL;
148
149         mutex_lock(&cx231xx_devlist_mutex);
150         if (!list_empty(&cx231xx_extension_devlist)) {
151                 list_for_each_entry(ops, &cx231xx_extension_devlist, next) {
152                         if (ops->fini)
153                                 ops->fini(dev);
154                 }
155         }
156         mutex_unlock(&cx231xx_devlist_mutex);
157 }
158
159 /****************************************************************
160 *               U S B related functions                         *
161 *****************************************************************/
162 int cx231xx_send_usb_command(struct cx231xx_i2c *i2c_bus,
163                              struct cx231xx_i2c_xfer_data *req_data)
164 {
165         int status = 0;
166         struct cx231xx *dev = i2c_bus->dev;
167         struct VENDOR_REQUEST_IN ven_req;
168
169         u8 saddr_len = 0;
170         u8 _i2c_period = 0;
171         u8 _i2c_nostop = 0;
172         u8 _i2c_reserve = 0;
173
174         /* Get the I2C period, nostop and reserve parameters */
175         _i2c_period = i2c_bus->i2c_period;
176         _i2c_nostop = i2c_bus->i2c_nostop;
177         _i2c_reserve = i2c_bus->i2c_reserve;
178
179         saddr_len = req_data->saddr_len;
180
181         /* Set wValue */
182         if (saddr_len == 1)     /* need check saddr_len == 0  */
183                 ven_req.wValue =
184                     req_data->
185                     dev_addr << 9 | _i2c_period << 4 | saddr_len << 2 |
186                     _i2c_nostop << 1 | I2C_SYNC | _i2c_reserve << 6;
187         else
188                 ven_req.wValue =
189                     req_data->
190                     dev_addr << 9 | _i2c_period << 4 | saddr_len << 2 |
191                     _i2c_nostop << 1 | I2C_SYNC | _i2c_reserve << 6;
192
193         /* set channel number */
194         if (req_data->direction & I2C_M_RD) {
195                 /* channel number, for read,spec required channel_num +4 */
196                 ven_req.bRequest = i2c_bus->nr + 4;
197         } else
198                 ven_req.bRequest = i2c_bus->nr; /* channel number,  */
199
200         /* set index value */
201         switch (saddr_len) {
202         case 0:
203                 ven_req.wIndex = 0;     /* need check */
204                 break;
205         case 1:
206                 ven_req.wIndex = (req_data->saddr_dat & 0xff);
207                 break;
208         case 2:
209                 ven_req.wIndex = req_data->saddr_dat;
210                 break;
211         }
212
213         /* set wLength value */
214         ven_req.wLength = req_data->buf_size;
215
216         /* set bData value */
217         ven_req.bData = 0;
218
219         /* set the direction */
220         if (req_data->direction) {
221                 ven_req.direction = USB_DIR_IN;
222                 memset(req_data->p_buffer, 0x00, ven_req.wLength);
223         } else
224                 ven_req.direction = USB_DIR_OUT;
225
226         /* set the buffer for read / write */
227         ven_req.pBuff = req_data->p_buffer;
228
229
230         /* call common vendor command request */
231         status = cx231xx_send_vendor_cmd(dev, &ven_req);
232         if (status < 0) {
233                 cx231xx_info
234                     ("UsbInterface::sendCommand, failed with status -%d\n",
235                      status);
236         }
237
238         return status;
239 }
240 EXPORT_SYMBOL_GPL(cx231xx_send_usb_command);
241
242 /*
243  * cx231xx_read_ctrl_reg()
244  * reads data from the usb device specifying bRequest and wValue
245  */
246 int cx231xx_read_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg,
247                           char *buf, int len)
248 {
249         u8 val = 0;
250         int ret;
251         int pipe = usb_rcvctrlpipe(dev->udev, 0);
252
253         if (dev->state & DEV_DISCONNECTED)
254                 return -ENODEV;
255
256         if (len > URB_MAX_CTRL_SIZE)
257                 return -EINVAL;
258
259         switch (len) {
260         case 1:
261                 val = ENABLE_ONE_BYTE;
262                 break;
263         case 2:
264                 val = ENABLE_TWE_BYTE;
265                 break;
266         case 3:
267                 val = ENABLE_THREE_BYTE;
268                 break;
269         case 4:
270                 val = ENABLE_FOUR_BYTE;
271                 break;
272         default:
273                 val = 0xFF;     /* invalid option */
274         }
275
276         if (val == 0xFF)
277                 return -EINVAL;
278
279         if (reg_debug) {
280                 cx231xx_isocdbg("(pipe 0x%08x): "
281                                 "IN:  %02x %02x %02x %02x %02x %02x %02x %02x ",
282                                 pipe,
283                                 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
284                                 req, 0, val,
285                                 reg & 0xff, reg >> 8, len & 0xff, len >> 8);
286         }
287
288         mutex_lock(&dev->ctrl_urb_lock);
289         ret = usb_control_msg(dev->udev, pipe, req,
290                               USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
291                               val, reg, dev->urb_buf, len, HZ);
292         if (ret < 0) {
293                 cx231xx_isocdbg(" failed!\n");
294                 mutex_unlock(&dev->ctrl_urb_lock);
295                 return ret;
296         }
297
298         if (len)
299                 memcpy(buf, dev->urb_buf, len);
300
301         mutex_unlock(&dev->ctrl_urb_lock);
302
303         if (reg_debug) {
304                 int byte;
305
306                 cx231xx_isocdbg("<<<");
307                 for (byte = 0; byte < len; byte++)
308                         cx231xx_isocdbg(" %02x", (unsigned char)buf[byte]);
309                 cx231xx_isocdbg("\n");
310         }
311
312         return ret;
313 }
314
315 int cx231xx_send_vendor_cmd(struct cx231xx *dev,
316                                 struct VENDOR_REQUEST_IN *ven_req)
317 {
318         int ret;
319         int pipe = 0;
320         int unsend_size = 0;
321         u8 *pdata;
322
323         if (dev->state & DEV_DISCONNECTED)
324                 return -ENODEV;
325
326         if ((ven_req->wLength > URB_MAX_CTRL_SIZE))
327                 return -EINVAL;
328
329         if (ven_req->direction)
330                 pipe = usb_rcvctrlpipe(dev->udev, 0);
331         else
332                 pipe = usb_sndctrlpipe(dev->udev, 0);
333
334         if (reg_debug) {
335                 int byte;
336
337                 cx231xx_isocdbg("(pipe 0x%08x): "
338                                 "OUT: %02x %02x %02x %04x %04x %04x >>>",
339                                 pipe,
340                                 ven_req->
341                                 direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
342                                 ven_req->bRequest, 0, ven_req->wValue,
343                                 ven_req->wIndex, ven_req->wLength);
344
345                 for (byte = 0; byte < ven_req->wLength; byte++)
346                         cx231xx_isocdbg(" %02x",
347                                         (unsigned char)ven_req->pBuff[byte]);
348                 cx231xx_isocdbg("\n");
349         }
350
351
352 /*
353 If the cx23102 read more than 4 bytes with i2c bus,
354 need chop to 4 byte per request
355 */
356         if ((ven_req->wLength > 4) && ((ven_req->bRequest == 0x4) ||
357                                         (ven_req->bRequest == 0x5) ||
358                                         (ven_req->bRequest == 0x6))) {
359                 unsend_size = 0;
360                 pdata = ven_req->pBuff;
361
362
363                 unsend_size = ven_req->wLength;
364
365                 mutex_lock(&dev->ctrl_urb_lock);
366                 /* the first package*/
367                 ven_req->wValue = ven_req->wValue & 0xFFFB;
368                 ven_req->wValue = (ven_req->wValue & 0xFFBD) | 0x2;
369                 /*printk(KERN_INFO " !!!!! 0x%x 0x%x 0x%x 0x%x \n",
370                         ven_req->bRequest,
371                         ven_req->direction | USB_TYPE_VENDOR |
372                         USB_RECIP_DEVICE,ven_req->wValue,ven_req->wIndex);*/
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, pdata,
377                         0x0004, HZ);
378                 unsend_size = unsend_size - 4;
379                 mutex_unlock(&dev->ctrl_urb_lock);
380
381                 /* the middle package*/
382                 ven_req->wValue = (ven_req->wValue & 0xFFBD) | 0x42;
383                 while (unsend_size - 4 > 0) {
384                         pdata = pdata + 4;
385                         /*printk(KERN_INFO " !!!!! 0x%x 0x%x 0x%x 0x%x \n",
386                                 ven_req->bRequest,
387                                 ven_req->direction | USB_TYPE_VENDOR |
388                                 USB_RECIP_DEVICE,
389                                 ven_req->wValue,ven_req->wIndex);*/
390                         mutex_lock(&dev->ctrl_urb_lock);
391                         ret = usb_control_msg(dev->udev, pipe,
392                                  ven_req->bRequest,
393                                 ven_req->
394                                 direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
395                                 ven_req->wValue, ven_req->wIndex, pdata,
396                                 0x0004, HZ);
397                         mutex_unlock(&dev->ctrl_urb_lock);
398                         unsend_size = unsend_size - 4;
399                 }
400
401
402                 /* the last package*/
403                 ven_req->wValue = (ven_req->wValue & 0xFFBD) | 0x40;
404                 pdata = pdata + 4;
405                 /*printk(KERN_INFO " !!!!! 0x%x 0x%x 0x%x 0x%x \n",
406                         ven_req->bRequest,
407                         ven_req->direction | USB_TYPE_VENDOR |
408                         USB_RECIP_DEVICE,ven_req->wValue,ven_req->wIndex);*/
409                 mutex_lock(&dev->ctrl_urb_lock);
410                 ret = usb_control_msg(dev->udev, pipe, ven_req->bRequest,
411                         ven_req->
412                         direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
413                         ven_req->wValue, ven_req->wIndex, pdata,
414                         unsend_size, HZ);
415                 mutex_unlock(&dev->ctrl_urb_lock);
416                 /*printk(KERN_INFO " @@@@@ temp_buffer[0]=0x%x 0x%x 0x%x 0x%x
417                           0x%x 0x%x\n",ven_req->pBuff[0],ven_req->pBuff[1],
418                         ven_req->pBuff[2], ven_req->pBuff[3],ven_req->pBuff[4],
419                         ven_req->pBuff[5]);*/
420
421         } else {
422                 mutex_lock(&dev->ctrl_urb_lock);
423                 ret = usb_control_msg(dev->udev, pipe, ven_req->bRequest,
424                                 ven_req->
425                                 direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
426                                 ven_req->wValue, ven_req->wIndex,
427                                  ven_req->pBuff, ven_req->wLength, HZ);
428                 mutex_unlock(&dev->ctrl_urb_lock);
429
430         }
431
432         return ret;
433 }
434
435 /*
436  * cx231xx_write_ctrl_reg()
437  * sends data to the usb device, specifying bRequest
438  */
439 int cx231xx_write_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg, char *buf,
440                            int len)
441 {
442         u8 val = 0;
443         int ret;
444         int pipe = usb_sndctrlpipe(dev->udev, 0);
445
446         if (dev->state & DEV_DISCONNECTED)
447                 return -ENODEV;
448
449         if ((len < 1) || (len > URB_MAX_CTRL_SIZE))
450                 return -EINVAL;
451
452         switch (len) {
453         case 1:
454                 val = ENABLE_ONE_BYTE;
455                 break;
456         case 2:
457                 val = ENABLE_TWE_BYTE;
458                 break;
459         case 3:
460                 val = ENABLE_THREE_BYTE;
461                 break;
462         case 4:
463                 val = ENABLE_FOUR_BYTE;
464                 break;
465         default:
466                 val = 0xFF;     /* invalid option */
467         }
468
469         if (val == 0xFF)
470                 return -EINVAL;
471
472         if (reg_debug) {
473                 int byte;
474
475                 cx231xx_isocdbg("(pipe 0x%08x): "
476                         "OUT: %02x %02x %02x %02x %02x %02x %02x %02x >>>",
477                         pipe,
478                         USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
479                         req, 0, val, reg & 0xff,
480                         reg >> 8, len & 0xff, len >> 8);
481
482                 for (byte = 0; byte < len; byte++)
483                         cx231xx_isocdbg(" %02x", (unsigned char)buf[byte]);
484                 cx231xx_isocdbg("\n");
485         }
486
487         mutex_lock(&dev->ctrl_urb_lock);
488         memcpy(dev->urb_buf, buf, len);
489         ret = usb_control_msg(dev->udev, pipe, req,
490                               USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
491                               val, reg, dev->urb_buf, len, HZ);
492         mutex_unlock(&dev->ctrl_urb_lock);
493
494         return ret;
495 }
496
497 /****************************************************************
498 *           USB Alternate Setting functions                     *
499 *****************************************************************/
500
501 int cx231xx_set_video_alternate(struct cx231xx *dev)
502 {
503         int errCode, prev_alt = dev->video_mode.alt;
504         unsigned int min_pkt_size = dev->width * 2 + 4;
505         u32 usb_interface_index = 0;
506
507         /* When image size is bigger than a certain value,
508            the frame size should be increased, otherwise, only
509            green screen will be received.
510          */
511         if (dev->width * 2 * dev->height > 720 * 240 * 2)
512                 min_pkt_size *= 2;
513
514         if (dev->width > 360) {
515                 /* resolutions: 720,704,640 */
516                 dev->video_mode.alt = 3;
517         } else if (dev->width > 180) {
518                 /* resolutions: 360,352,320,240 */
519                 dev->video_mode.alt = 2;
520         } else if (dev->width > 0) {
521                 /* resolutions: 180,176,160,128,88 */
522                 dev->video_mode.alt = 1;
523         } else {
524                 /* Change to alt0 BULK to release USB bandwidth */
525                 dev->video_mode.alt = 0;
526         }
527
528         if (dev->USE_ISO == 0)
529                 dev->video_mode.alt = 0;
530
531         cx231xx_coredbg("dev->video_mode.alt= %d\n", dev->video_mode.alt);
532
533         /* Get the correct video interface Index */
534         usb_interface_index =
535             dev->current_pcb_config.hs_config_info[0].interface_info.
536             video_index + 1;
537
538         if (dev->video_mode.alt != prev_alt) {
539                 cx231xx_coredbg("minimum isoc packet size: %u (alt=%d)\n",
540                                 min_pkt_size, dev->video_mode.alt);
541
542                 if (dev->video_mode.alt_max_pkt_size != NULL)
543                         dev->video_mode.max_pkt_size =
544                         dev->video_mode.alt_max_pkt_size[dev->video_mode.alt];
545                 cx231xx_coredbg("setting alternate %d with wMaxPacketSize=%u\n",
546                                 dev->video_mode.alt,
547                                 dev->video_mode.max_pkt_size);
548                 errCode =
549                     usb_set_interface(dev->udev, usb_interface_index,
550                                       dev->video_mode.alt);
551                 if (errCode < 0) {
552                         cx231xx_errdev
553                             ("cannot change alt number to %d (error=%i)\n",
554                              dev->video_mode.alt, errCode);
555                         return errCode;
556                 }
557         }
558         return 0;
559 }
560
561 int cx231xx_set_alt_setting(struct cx231xx *dev, u8 index, u8 alt)
562 {
563         int status = 0;
564         u32 usb_interface_index = 0;
565         u32 max_pkt_size = 0;
566
567         switch (index) {
568         case INDEX_TS1:
569                 usb_interface_index =
570                     dev->current_pcb_config.hs_config_info[0].interface_info.
571                     ts1_index + 1;
572                 dev->ts1_mode.alt = alt;
573                 if (dev->ts1_mode.alt_max_pkt_size != NULL)
574                         max_pkt_size = dev->ts1_mode.max_pkt_size =
575                             dev->ts1_mode.alt_max_pkt_size[dev->ts1_mode.alt];
576                 break;
577         case INDEX_TS2:
578                 usb_interface_index =
579                     dev->current_pcb_config.hs_config_info[0].interface_info.
580                     ts2_index + 1;
581                 break;
582         case INDEX_AUDIO:
583                 usb_interface_index =
584                     dev->current_pcb_config.hs_config_info[0].interface_info.
585                     audio_index + 1;
586                 dev->adev.alt = alt;
587                 if (dev->adev.alt_max_pkt_size != NULL)
588                         max_pkt_size = dev->adev.max_pkt_size =
589                             dev->adev.alt_max_pkt_size[dev->adev.alt];
590                 break;
591         case INDEX_VIDEO:
592                 usb_interface_index =
593                     dev->current_pcb_config.hs_config_info[0].interface_info.
594                     video_index + 1;
595                 dev->video_mode.alt = alt;
596                 if (dev->video_mode.alt_max_pkt_size != NULL)
597                         max_pkt_size = dev->video_mode.max_pkt_size =
598                             dev->video_mode.alt_max_pkt_size[dev->video_mode.
599                                                              alt];
600                 break;
601         case INDEX_VANC:
602                 usb_interface_index =
603                     dev->current_pcb_config.hs_config_info[0].interface_info.
604                     vanc_index + 1;
605                 dev->vbi_mode.alt = alt;
606                 if (dev->vbi_mode.alt_max_pkt_size != NULL)
607                         max_pkt_size = dev->vbi_mode.max_pkt_size =
608                             dev->vbi_mode.alt_max_pkt_size[dev->vbi_mode.alt];
609                 break;
610         case INDEX_HANC:
611                 usb_interface_index =
612                     dev->current_pcb_config.hs_config_info[0].interface_info.
613                     hanc_index + 1;
614                 dev->sliced_cc_mode.alt = alt;
615                 if (dev->sliced_cc_mode.alt_max_pkt_size != NULL)
616                         max_pkt_size = dev->sliced_cc_mode.max_pkt_size =
617                             dev->sliced_cc_mode.alt_max_pkt_size[dev->
618                                                                  sliced_cc_mode.
619                                                                  alt];
620                 break;
621         default:
622                 break;
623         }
624
625         if (alt > 0 && max_pkt_size == 0) {
626                 cx231xx_errdev
627                 ("can't change interface %d alt no. to %d: Max. Pkt size = 0\n",
628                 usb_interface_index, alt);
629                 /*To workaround error number=-71 on EP0 for videograbber,
630                  need add following codes.*/
631                 if (dev->model != CX231XX_BOARD_CNXT_VIDEO_GRABBER)
632                         return -1;
633         }
634
635         cx231xx_coredbg("setting alternate %d with wMaxPacketSize=%u,"
636                         "Interface = %d\n", alt, max_pkt_size,
637                         usb_interface_index);
638
639         if (usb_interface_index > 0) {
640                 status = usb_set_interface(dev->udev, usb_interface_index, alt);
641                 if (status < 0) {
642                         cx231xx_errdev
643                         ("can't change interface %d alt no. to %d (err=%i)\n",
644                         usb_interface_index, alt, status);
645                         return status;
646                 }
647         }
648
649         return status;
650 }
651 EXPORT_SYMBOL_GPL(cx231xx_set_alt_setting);
652
653 int cx231xx_gpio_set(struct cx231xx *dev, struct cx231xx_reg_seq *gpio)
654 {
655         int rc = 0;
656
657         if (!gpio)
658                 return rc;
659
660         /* Send GPIO reset sequences specified at board entry */
661         while (gpio->sleep >= 0) {
662                 rc = cx231xx_set_gpio_value(dev, gpio->bit, gpio->val);
663                 if (rc < 0)
664                         return rc;
665
666                 if (gpio->sleep > 0)
667                         msleep(gpio->sleep);
668
669                 gpio++;
670         }
671         return rc;
672 }
673
674 int cx231xx_demod_reset(struct cx231xx *dev)
675 {
676
677         u8 status = 0;
678         u8 value[4] = { 0, 0, 0, 0 };
679
680         status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN,
681                                  value, 4);
682
683         cx231xx_coredbg("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", PWR_CTL_EN,
684                         value[0], value[1], value[2], value[3]);
685
686         cx231xx_coredbg("Enter cx231xx_demod_reset()\n");
687
688                 value[1] = (u8) 0x3;
689                 status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
690                                                 PWR_CTL_EN, value, 4);
691                         msleep(10);
692
693                 value[1] = (u8) 0x0;
694                 status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
695                                                 PWR_CTL_EN, value, 4);
696                         msleep(10);
697
698                 value[1] = (u8) 0x3;
699                 status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
700                                                 PWR_CTL_EN, value, 4);
701                         msleep(10);
702
703
704
705         status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN,
706                                  value, 4);
707
708         cx231xx_coredbg("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", PWR_CTL_EN,
709                         value[0], value[1], value[2], value[3]);
710
711         return status;
712 }
713 EXPORT_SYMBOL_GPL(cx231xx_demod_reset);
714 int is_fw_load(struct cx231xx *dev)
715 {
716         return cx231xx_check_fw(dev);
717 }
718 EXPORT_SYMBOL_GPL(is_fw_load);
719
720 int cx231xx_set_mode(struct cx231xx *dev, enum cx231xx_mode set_mode)
721 {
722         int errCode = 0;
723
724         if (dev->mode == set_mode)
725                 return 0;
726
727         if (set_mode == CX231XX_SUSPEND) {
728                 /* Set the chip in power saving mode */
729                 dev->mode = set_mode;
730         }
731
732         /* Resource is locked */
733         if (dev->mode != CX231XX_SUSPEND)
734                 return -EINVAL;
735
736         dev->mode = set_mode;
737
738         if (dev->mode == CX231XX_DIGITAL_MODE)/* Set Digital power mode */ {
739         /* set AGC mode to Digital */
740                 switch (dev->model) {
741                 case CX231XX_BOARD_CNXT_CARRAERA:
742                 case CX231XX_BOARD_CNXT_RDE_250:
743                 case CX231XX_BOARD_CNXT_SHELBY:
744                 case CX231XX_BOARD_CNXT_RDU_250:
745                 errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 0);
746                         break;
747                 case CX231XX_BOARD_CNXT_RDE_253S:
748                 case CX231XX_BOARD_CNXT_RDU_253S:
749                 case CX231XX_BOARD_HAUPPAUGE_EXETER:
750                 errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1);
751                         break;
752                 default:
753                         break;
754                 }
755         } else/* Set Analog Power mode */ {
756         /* set AGC mode to Analog */
757                 switch (dev->model) {
758                 case CX231XX_BOARD_CNXT_CARRAERA:
759                 case CX231XX_BOARD_CNXT_RDE_250:
760                 case CX231XX_BOARD_CNXT_SHELBY:
761                 case CX231XX_BOARD_CNXT_RDU_250:
762                 errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1);
763                         break;
764                 case CX231XX_BOARD_CNXT_RDE_253S:
765                 case CX231XX_BOARD_CNXT_RDU_253S:
766                 case CX231XX_BOARD_HAUPPAUGE_EXETER:
767                 errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 0);
768                         break;
769                 default:
770                         break;
771                 }
772         }
773
774         return 0;
775 }
776 EXPORT_SYMBOL_GPL(cx231xx_set_mode);
777
778 int cx231xx_ep5_bulkout(struct cx231xx *dev, u8 *firmware, u16 size)
779 {
780         int errCode = 0;
781         int actlen, ret = -ENOMEM;
782         u32 *buffer;
783
784 buffer = kzalloc(4096, GFP_KERNEL);
785         if (buffer == NULL) {
786                 cx231xx_info("out of mem\n");
787                 return -ENOMEM;
788         }
789         memcpy(&buffer[0], firmware, 4096);
790
791         ret = usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, 5),
792                                  buffer, 4096, &actlen, 2000);
793
794         if (ret)
795                 cx231xx_info("bulk message failed: %d (%d/%d)", ret,
796                                  size, actlen);
797         else {
798                 errCode = actlen != size ? -1 : 0;
799         }
800 kfree(buffer);
801         return 0;
802 }
803
804 /*****************************************************************
805 *                URB Streaming functions                         *
806 ******************************************************************/
807
808 /*
809  * IRQ callback, called by URB callback
810  */
811 static void cx231xx_isoc_irq_callback(struct urb *urb)
812 {
813         struct cx231xx_dmaqueue *dma_q = urb->context;
814         struct cx231xx_video_mode *vmode =
815             container_of(dma_q, struct cx231xx_video_mode, vidq);
816         struct cx231xx *dev = container_of(vmode, struct cx231xx, video_mode);
817         int rc, i;
818
819         switch (urb->status) {
820         case 0:         /* success */
821         case -ETIMEDOUT:        /* NAK */
822                 break;
823         case -ECONNRESET:       /* kill */
824         case -ENOENT:
825         case -ESHUTDOWN:
826                 return;
827         default:                /* error */
828                 cx231xx_isocdbg("urb completition error %d.\n", urb->status);
829                 break;
830         }
831
832         /* Copy data from URB */
833         spin_lock(&dev->video_mode.slock);
834         rc = dev->video_mode.isoc_ctl.isoc_copy(dev, urb);
835         spin_unlock(&dev->video_mode.slock);
836
837         /* Reset urb buffers */
838         for (i = 0; i < urb->number_of_packets; i++) {
839                 urb->iso_frame_desc[i].status = 0;
840                 urb->iso_frame_desc[i].actual_length = 0;
841         }
842         urb->status = 0;
843
844         urb->status = usb_submit_urb(urb, GFP_ATOMIC);
845         if (urb->status) {
846                 cx231xx_isocdbg("urb resubmit failed (error=%i)\n",
847                                 urb->status);
848         }
849 }
850 /*****************************************************************
851 *                URB Streaming functions                         *
852 ******************************************************************/
853
854 /*
855  * IRQ callback, called by URB callback
856  */
857 static void cx231xx_bulk_irq_callback(struct urb *urb)
858 {
859         struct cx231xx_dmaqueue *dma_q = urb->context;
860         struct cx231xx_video_mode *vmode =
861             container_of(dma_q, struct cx231xx_video_mode, vidq);
862         struct cx231xx *dev = container_of(vmode, struct cx231xx, video_mode);
863         int rc;
864
865         switch (urb->status) {
866         case 0:         /* success */
867         case -ETIMEDOUT:        /* NAK */
868                 break;
869         case -ECONNRESET:       /* kill */
870         case -ENOENT:
871         case -ESHUTDOWN:
872                 return;
873         default:                /* error */
874                 cx231xx_isocdbg("urb completition error %d.\n", urb->status);
875                 break;
876         }
877
878         /* Copy data from URB */
879         spin_lock(&dev->video_mode.slock);
880         rc = dev->video_mode.bulk_ctl.bulk_copy(dev, urb);
881         spin_unlock(&dev->video_mode.slock);
882
883         /* Reset urb buffers */
884         urb->status = 0;
885
886         urb->status = usb_submit_urb(urb, GFP_ATOMIC);
887         if (urb->status) {
888                 cx231xx_isocdbg("urb resubmit failed (error=%i)\n",
889                                 urb->status);
890         }
891 }
892 /*
893  * Stop and Deallocate URBs
894  */
895 void cx231xx_uninit_isoc(struct cx231xx *dev)
896 {
897         struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
898         struct urb *urb;
899         int i;
900
901         cx231xx_isocdbg("cx231xx: called cx231xx_uninit_isoc\n");
902
903         dev->video_mode.isoc_ctl.nfields = -1;
904         for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
905                 urb = dev->video_mode.isoc_ctl.urb[i];
906                 if (urb) {
907                         if (!irqs_disabled())
908                                 usb_kill_urb(urb);
909                         else
910                                 usb_unlink_urb(urb);
911
912                         if (dev->video_mode.isoc_ctl.transfer_buffer[i]) {
913                                 usb_free_coherent(dev->udev,
914                                                   urb->transfer_buffer_length,
915                                                   dev->video_mode.isoc_ctl.
916                                                   transfer_buffer[i],
917                                                   urb->transfer_dma);
918                         }
919                         usb_free_urb(urb);
920                         dev->video_mode.isoc_ctl.urb[i] = NULL;
921                 }
922                 dev->video_mode.isoc_ctl.transfer_buffer[i] = NULL;
923         }
924
925         kfree(dev->video_mode.isoc_ctl.urb);
926         kfree(dev->video_mode.isoc_ctl.transfer_buffer);
927         kfree(dma_q->p_left_data);
928
929         dev->video_mode.isoc_ctl.urb = NULL;
930         dev->video_mode.isoc_ctl.transfer_buffer = NULL;
931         dev->video_mode.isoc_ctl.num_bufs = 0;
932         dma_q->p_left_data = NULL;
933
934         if (dev->mode_tv == 0)
935                 cx231xx_capture_start(dev, 0, Raw_Video);
936         else
937                 cx231xx_capture_start(dev, 0, TS1_serial_mode);
938
939
940 }
941 EXPORT_SYMBOL_GPL(cx231xx_uninit_isoc);
942
943 /*
944  * Stop and Deallocate URBs
945  */
946 void cx231xx_uninit_bulk(struct cx231xx *dev)
947 {
948         struct urb *urb;
949         int i;
950
951         cx231xx_isocdbg("cx231xx: called cx231xx_uninit_bulk\n");
952
953         dev->video_mode.bulk_ctl.nfields = -1;
954         for (i = 0; i < dev->video_mode.bulk_ctl.num_bufs; i++) {
955                 urb = dev->video_mode.bulk_ctl.urb[i];
956                 if (urb) {
957                         if (!irqs_disabled())
958                                 usb_kill_urb(urb);
959                         else
960                                 usb_unlink_urb(urb);
961
962                         if (dev->video_mode.bulk_ctl.transfer_buffer[i]) {
963                                 usb_free_coherent(dev->udev,
964                                                 urb->transfer_buffer_length,
965                                                 dev->video_mode.isoc_ctl.
966                                                 transfer_buffer[i],
967                                                 urb->transfer_dma);
968                         }
969                         usb_free_urb(urb);
970                         dev->video_mode.bulk_ctl.urb[i] = NULL;
971                 }
972                 dev->video_mode.bulk_ctl.transfer_buffer[i] = NULL;
973         }
974
975         kfree(dev->video_mode.bulk_ctl.urb);
976         kfree(dev->video_mode.bulk_ctl.transfer_buffer);
977
978         dev->video_mode.bulk_ctl.urb = NULL;
979         dev->video_mode.bulk_ctl.transfer_buffer = NULL;
980         dev->video_mode.bulk_ctl.num_bufs = 0;
981
982         if (dev->mode_tv == 0)
983                 cx231xx_capture_start(dev, 0, Raw_Video);
984         else
985                 cx231xx_capture_start(dev, 0, TS1_serial_mode);
986
987
988 }
989 EXPORT_SYMBOL_GPL(cx231xx_uninit_bulk);
990
991 /*
992  * Allocate URBs and start IRQ
993  */
994 int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
995                       int num_bufs, int max_pkt_size,
996                       int (*isoc_copy) (struct cx231xx *dev, struct urb *urb))
997 {
998         struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
999         int i;
1000         int sb_size, pipe;
1001         struct urb *urb;
1002         int j, k;
1003         int rc;
1004
1005         dev->video_input = dev->video_input > 2 ? 2 : dev->video_input;
1006
1007         cx231xx_coredbg("Setting Video mux to %d\n", dev->video_input);
1008
1009         video_mux(dev, dev->video_input);
1010
1011         /* De-allocates all pending stuff */
1012         cx231xx_uninit_isoc(dev);
1013
1014         dma_q->p_left_data = kzalloc(4096, GFP_KERNEL);
1015         if (dma_q->p_left_data == NULL) {
1016                 cx231xx_info("out of mem\n");
1017                 return -ENOMEM;
1018         }
1019
1020
1021
1022         dev->video_mode.isoc_ctl.isoc_copy = isoc_copy;
1023         dev->video_mode.isoc_ctl.num_bufs = num_bufs;
1024         dma_q->pos = 0;
1025         dma_q->is_partial_line = 0;
1026         dma_q->last_sav = 0;
1027         dma_q->current_field = -1;
1028         dma_q->field1_done = 0;
1029         dma_q->lines_per_field = dev->height / 2;
1030         dma_q->bytes_left_in_line = dev->width << 1;
1031         dma_q->lines_completed = 0;
1032         dma_q->mpeg_buffer_done = 0;
1033         dma_q->left_data_count = 0;
1034         dma_q->mpeg_buffer_completed = 0;
1035         dma_q->add_ps_package_head = CX231XX_NEED_ADD_PS_PACKAGE_HEAD;
1036         dma_q->ps_head[0] = 0x00;
1037         dma_q->ps_head[1] = 0x00;
1038         dma_q->ps_head[2] = 0x01;
1039         dma_q->ps_head[3] = 0xBA;
1040         for (i = 0; i < 8; i++)
1041                 dma_q->partial_buf[i] = 0;
1042
1043         dev->video_mode.isoc_ctl.urb =
1044             kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
1045         if (!dev->video_mode.isoc_ctl.urb) {
1046                 cx231xx_errdev("cannot alloc memory for usb buffers\n");
1047                 return -ENOMEM;
1048         }
1049
1050         dev->video_mode.isoc_ctl.transfer_buffer =
1051             kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
1052         if (!dev->video_mode.isoc_ctl.transfer_buffer) {
1053                 cx231xx_errdev("cannot allocate memory for usbtransfer\n");
1054                 kfree(dev->video_mode.isoc_ctl.urb);
1055                 return -ENOMEM;
1056         }
1057
1058         dev->video_mode.isoc_ctl.max_pkt_size = max_pkt_size;
1059         dev->video_mode.isoc_ctl.buf = NULL;
1060
1061         sb_size = max_packets * dev->video_mode.isoc_ctl.max_pkt_size;
1062
1063         if (dev->mode_tv == 1)
1064                 dev->video_mode.end_point_addr = 0x81;
1065         else
1066                 dev->video_mode.end_point_addr = 0x84;
1067
1068
1069         /* allocate urbs and transfer buffers */
1070         for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
1071                 urb = usb_alloc_urb(max_packets, GFP_KERNEL);
1072                 if (!urb) {
1073                         cx231xx_err("cannot alloc isoc_ctl.urb %i\n", i);
1074                         cx231xx_uninit_isoc(dev);
1075                         return -ENOMEM;
1076                 }
1077                 dev->video_mode.isoc_ctl.urb[i] = urb;
1078
1079                 dev->video_mode.isoc_ctl.transfer_buffer[i] =
1080                     usb_alloc_coherent(dev->udev, sb_size, GFP_KERNEL,
1081                                        &urb->transfer_dma);
1082                 if (!dev->video_mode.isoc_ctl.transfer_buffer[i]) {
1083                         cx231xx_err("unable to allocate %i bytes for transfer"
1084                                     " buffer %i%s\n",
1085                                     sb_size, i,
1086                                     in_interrupt() ? " while in int" : "");
1087                         cx231xx_uninit_isoc(dev);
1088                         return -ENOMEM;
1089                 }
1090                 memset(dev->video_mode.isoc_ctl.transfer_buffer[i], 0, sb_size);
1091
1092                 pipe =
1093                     usb_rcvisocpipe(dev->udev, dev->video_mode.end_point_addr);
1094
1095                 usb_fill_int_urb(urb, dev->udev, pipe,
1096                                  dev->video_mode.isoc_ctl.transfer_buffer[i],
1097                                  sb_size, cx231xx_isoc_irq_callback, dma_q, 1);
1098
1099                 urb->number_of_packets = max_packets;
1100                 urb->transfer_flags = URB_ISO_ASAP;
1101
1102                 k = 0;
1103                 for (j = 0; j < max_packets; j++) {
1104                         urb->iso_frame_desc[j].offset = k;
1105                         urb->iso_frame_desc[j].length =
1106                             dev->video_mode.isoc_ctl.max_pkt_size;
1107                         k += dev->video_mode.isoc_ctl.max_pkt_size;
1108                 }
1109         }
1110
1111         init_waitqueue_head(&dma_q->wq);
1112
1113         /* submit urbs and enables IRQ */
1114         for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
1115                 rc = usb_submit_urb(dev->video_mode.isoc_ctl.urb[i],
1116                                     GFP_ATOMIC);
1117                 if (rc) {
1118                         cx231xx_err("submit of urb %i failed (error=%i)\n", i,
1119                                     rc);
1120                         cx231xx_uninit_isoc(dev);
1121                         return rc;
1122                 }
1123         }
1124
1125         if (dev->mode_tv == 0)
1126                 cx231xx_capture_start(dev, 1, Raw_Video);
1127         else
1128                 cx231xx_capture_start(dev, 1, TS1_serial_mode);
1129
1130         return 0;
1131 }
1132 EXPORT_SYMBOL_GPL(cx231xx_init_isoc);
1133
1134 /*
1135  * Allocate URBs and start IRQ
1136  */
1137 int cx231xx_init_bulk(struct cx231xx *dev, int max_packets,
1138                       int num_bufs, int max_pkt_size,
1139                       int (*bulk_copy) (struct cx231xx *dev, struct urb *urb))
1140 {
1141         struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
1142         int i;
1143         int sb_size, pipe;
1144         struct urb *urb;
1145         int rc;
1146
1147         dev->video_input = dev->video_input > 2 ? 2 : dev->video_input;
1148
1149         cx231xx_coredbg("Setting Video mux to %d\n", dev->video_input);
1150
1151         video_mux(dev, dev->video_input);
1152
1153         /* De-allocates all pending stuff */
1154         cx231xx_uninit_bulk(dev);
1155
1156         dev->video_mode.bulk_ctl.bulk_copy = bulk_copy;
1157         dev->video_mode.bulk_ctl.num_bufs = num_bufs;
1158         dma_q->pos = 0;
1159         dma_q->is_partial_line = 0;
1160         dma_q->last_sav = 0;
1161         dma_q->current_field = -1;
1162         dma_q->field1_done = 0;
1163         dma_q->lines_per_field = dev->height / 2;
1164         dma_q->bytes_left_in_line = dev->width << 1;
1165         dma_q->lines_completed = 0;
1166         dma_q->mpeg_buffer_done = 0;
1167         dma_q->left_data_count = 0;
1168         dma_q->mpeg_buffer_completed = 0;
1169         dma_q->ps_head[0] = 0x00;
1170         dma_q->ps_head[1] = 0x00;
1171         dma_q->ps_head[2] = 0x01;
1172         dma_q->ps_head[3] = 0xBA;
1173         for (i = 0; i < 8; i++)
1174                 dma_q->partial_buf[i] = 0;
1175
1176         dev->video_mode.bulk_ctl.urb =
1177             kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
1178         if (!dev->video_mode.bulk_ctl.urb) {
1179                 cx231xx_errdev("cannot alloc memory for usb buffers\n");
1180                 return -ENOMEM;
1181         }
1182
1183         dev->video_mode.bulk_ctl.transfer_buffer =
1184             kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
1185         if (!dev->video_mode.bulk_ctl.transfer_buffer) {
1186                 cx231xx_errdev("cannot allocate memory for usbtransfer\n");
1187                 kfree(dev->video_mode.bulk_ctl.urb);
1188                 return -ENOMEM;
1189         }
1190
1191         dev->video_mode.bulk_ctl.max_pkt_size = max_pkt_size;
1192         dev->video_mode.bulk_ctl.buf = NULL;
1193
1194         sb_size = max_packets * dev->video_mode.bulk_ctl.max_pkt_size;
1195
1196         if (dev->mode_tv == 1)
1197                 dev->video_mode.end_point_addr = 0x81;
1198         else
1199                 dev->video_mode.end_point_addr = 0x84;
1200
1201
1202         /* allocate urbs and transfer buffers */
1203         for (i = 0; i < dev->video_mode.bulk_ctl.num_bufs; i++) {
1204                 urb = usb_alloc_urb(0, GFP_KERNEL);
1205                 if (!urb) {
1206                         cx231xx_err("cannot alloc bulk_ctl.urb %i\n", i);
1207                         cx231xx_uninit_bulk(dev);
1208                         return -ENOMEM;
1209                 }
1210                 dev->video_mode.bulk_ctl.urb[i] = urb;
1211                 urb->transfer_flags = 0;
1212
1213                 dev->video_mode.bulk_ctl.transfer_buffer[i] =
1214                     usb_alloc_coherent(dev->udev, sb_size, GFP_KERNEL,
1215                                      &urb->transfer_dma);
1216                 if (!dev->video_mode.bulk_ctl.transfer_buffer[i]) {
1217                         cx231xx_err("unable to allocate %i bytes for transfer"
1218                                     " buffer %i%s\n",
1219                                     sb_size, i,
1220                                     in_interrupt() ? " while in int" : "");
1221                         cx231xx_uninit_bulk(dev);
1222                         return -ENOMEM;
1223                 }
1224                 memset(dev->video_mode.bulk_ctl.transfer_buffer[i], 0, sb_size);
1225
1226                 pipe = usb_rcvbulkpipe(dev->udev,
1227                                  dev->video_mode.end_point_addr);
1228                 usb_fill_bulk_urb(urb, dev->udev, pipe,
1229                                   dev->video_mode.bulk_ctl.transfer_buffer[i],
1230                                   sb_size, cx231xx_bulk_irq_callback, dma_q);
1231         }
1232
1233         init_waitqueue_head(&dma_q->wq);
1234
1235         /* submit urbs and enables IRQ */
1236         for (i = 0; i < dev->video_mode.bulk_ctl.num_bufs; i++) {
1237                 rc = usb_submit_urb(dev->video_mode.bulk_ctl.urb[i],
1238                                     GFP_ATOMIC);
1239                 if (rc) {
1240                         cx231xx_err("submit of urb %i failed (error=%i)\n", i,
1241                                     rc);
1242                         cx231xx_uninit_bulk(dev);
1243                         return rc;
1244                 }
1245         }
1246
1247         if (dev->mode_tv == 0)
1248                 cx231xx_capture_start(dev, 1, Raw_Video);
1249         else
1250                 cx231xx_capture_start(dev, 1, TS1_serial_mode);
1251
1252         return 0;
1253 }
1254 EXPORT_SYMBOL_GPL(cx231xx_init_bulk);
1255 void cx231xx_stop_TS1(struct cx231xx *dev)
1256 {
1257         int status = 0;
1258         u8 val[4] = { 0, 0, 0, 0 };
1259
1260                         val[0] = 0x00;
1261                         val[1] = 0x03;
1262                         val[2] = 0x00;
1263                         val[3] = 0x00;
1264                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1265                                  TS_MODE_REG, val, 4);
1266
1267                         val[0] = 0x00;
1268                         val[1] = 0x70;
1269                         val[2] = 0x04;
1270                         val[3] = 0x00;
1271                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1272                                  TS1_CFG_REG, val, 4);
1273 }
1274 /* EXPORT_SYMBOL_GPL(cx231xx_stop_TS1); */
1275 void cx231xx_start_TS1(struct cx231xx *dev)
1276 {
1277         int status = 0;
1278         u8 val[4] = { 0, 0, 0, 0 };
1279
1280                         val[0] = 0x03;
1281                         val[1] = 0x03;
1282                         val[2] = 0x00;
1283                         val[3] = 0x00;
1284                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1285                                  TS_MODE_REG, val, 4);
1286
1287                         val[0] = 0x04;
1288                         val[1] = 0xA3;
1289                         val[2] = 0x3B;
1290                         val[3] = 0x00;
1291                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1292                                  TS1_CFG_REG, val, 4);
1293 }
1294 /* EXPORT_SYMBOL_GPL(cx231xx_start_TS1); */
1295 /*****************************************************************
1296 *             Device Init/UnInit functions                       *
1297 ******************************************************************/
1298 int cx231xx_dev_init(struct cx231xx *dev)
1299 {
1300         int errCode = 0;
1301
1302         /* Initialize I2C bus */
1303
1304         /* External Master 1 Bus */
1305         dev->i2c_bus[0].nr = 0;
1306         dev->i2c_bus[0].dev = dev;
1307         dev->i2c_bus[0].i2c_period = I2C_SPEED_100K;    /* 100 KHz */
1308         dev->i2c_bus[0].i2c_nostop = 0;
1309         dev->i2c_bus[0].i2c_reserve = 0;
1310
1311         /* External Master 2 Bus */
1312         dev->i2c_bus[1].nr = 1;
1313         dev->i2c_bus[1].dev = dev;
1314         dev->i2c_bus[1].i2c_period = I2C_SPEED_100K;    /* 100 KHz */
1315         dev->i2c_bus[1].i2c_nostop = 0;
1316         dev->i2c_bus[1].i2c_reserve = 0;
1317
1318         /* Internal Master 3 Bus */
1319         dev->i2c_bus[2].nr = 2;
1320         dev->i2c_bus[2].dev = dev;
1321         dev->i2c_bus[2].i2c_period = I2C_SPEED_400K;    /* 400kHz */
1322         dev->i2c_bus[2].i2c_nostop = 0;
1323         dev->i2c_bus[2].i2c_reserve = 0;
1324
1325         /* register I2C buses */
1326         cx231xx_i2c_register(&dev->i2c_bus[0]);
1327         cx231xx_i2c_register(&dev->i2c_bus[1]);
1328         cx231xx_i2c_register(&dev->i2c_bus[2]);
1329
1330         /* init hardware */
1331         /* Note : with out calling set power mode function,
1332         afe can not be set up correctly */
1333         if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER) {
1334                 errCode = cx231xx_set_power_mode(dev,
1335                                  POLARIS_AVMODE_ENXTERNAL_AV);
1336                 if (errCode < 0) {
1337                         cx231xx_errdev
1338                         ("%s: Failed to set Power - errCode [%d]!\n",
1339                         __func__, errCode);
1340                         return errCode;
1341                 }
1342         } else {
1343                 errCode = cx231xx_set_power_mode(dev,
1344                                  POLARIS_AVMODE_ANALOGT_TV);
1345                 if (errCode < 0) {
1346                         cx231xx_errdev
1347                         ("%s: Failed to set Power - errCode [%d]!\n",
1348                         __func__, errCode);
1349                         return errCode;
1350                 }
1351         }
1352
1353         /* reset the Tuner */
1354         if ((dev->model == CX231XX_BOARD_CNXT_CARRAERA) ||
1355                 (dev->model == CX231XX_BOARD_CNXT_RDE_250) ||
1356                 (dev->model == CX231XX_BOARD_CNXT_SHELBY) ||
1357                 (dev->model == CX231XX_BOARD_CNXT_RDU_250))
1358                         cx231xx_gpio_set(dev, dev->board.tuner_gpio);
1359
1360         /* initialize Colibri block */
1361         errCode = cx231xx_afe_init_super_block(dev, 0x23c);
1362         if (errCode < 0) {
1363                 cx231xx_errdev
1364                     ("%s: cx231xx_afe init super block - errCode [%d]!\n",
1365                      __func__, errCode);
1366                 return errCode;
1367         }
1368         errCode = cx231xx_afe_init_channels(dev);
1369         if (errCode < 0) {
1370                 cx231xx_errdev
1371                     ("%s: cx231xx_afe init channels - errCode [%d]!\n",
1372                      __func__, errCode);
1373                 return errCode;
1374         }
1375
1376         /* Set DIF in By pass mode */
1377         errCode = cx231xx_dif_set_standard(dev, DIF_USE_BASEBAND);
1378         if (errCode < 0) {
1379                 cx231xx_errdev
1380                     ("%s: cx231xx_dif set to By pass mode - errCode [%d]!\n",
1381                      __func__, errCode);
1382                 return errCode;
1383         }
1384
1385         /* I2S block related functions */
1386         errCode = cx231xx_i2s_blk_initialize(dev);
1387         if (errCode < 0) {
1388                 cx231xx_errdev
1389                     ("%s: cx231xx_i2s block initialize - errCode [%d]!\n",
1390                      __func__, errCode);
1391                 return errCode;
1392         }
1393
1394         /* init control pins */
1395         errCode = cx231xx_init_ctrl_pin_status(dev);
1396         if (errCode < 0) {
1397                 cx231xx_errdev("%s: cx231xx_init ctrl pins - errCode [%d]!\n",
1398                                __func__, errCode);
1399                 return errCode;
1400         }
1401
1402         /* set AGC mode to Analog */
1403         switch (dev->model) {
1404         case CX231XX_BOARD_CNXT_CARRAERA:
1405         case CX231XX_BOARD_CNXT_RDE_250:
1406         case CX231XX_BOARD_CNXT_SHELBY:
1407         case CX231XX_BOARD_CNXT_RDU_250:
1408         errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1);
1409                 break;
1410         case CX231XX_BOARD_CNXT_RDE_253S:
1411         case CX231XX_BOARD_CNXT_RDU_253S:
1412         case CX231XX_BOARD_HAUPPAUGE_EXETER:
1413         errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 0);
1414                 break;
1415         default:
1416                 break;
1417         }
1418         if (errCode < 0) {
1419                 cx231xx_errdev
1420                     ("%s: cx231xx_AGC mode to Analog - errCode [%d]!\n",
1421                      __func__, errCode);
1422                 return errCode;
1423         }
1424
1425         /* set all alternate settings to zero initially */
1426         cx231xx_set_alt_setting(dev, INDEX_VIDEO, 0);
1427         cx231xx_set_alt_setting(dev, INDEX_VANC, 0);
1428         cx231xx_set_alt_setting(dev, INDEX_HANC, 0);
1429         if (dev->board.has_dvb)
1430                 cx231xx_set_alt_setting(dev, INDEX_TS1, 0);
1431
1432         /* set the I2C master port to 3 on channel 1 */
1433         if (dev->model != CX231XX_BOARD_CNXT_VIDEO_GRABBER)
1434                 errCode = cx231xx_enable_i2c_for_tuner(dev, I2C_3);
1435
1436         return errCode;
1437 }
1438 EXPORT_SYMBOL_GPL(cx231xx_dev_init);
1439
1440 void cx231xx_dev_uninit(struct cx231xx *dev)
1441 {
1442         /* Un Initialize I2C bus */
1443         cx231xx_i2c_unregister(&dev->i2c_bus[2]);
1444         cx231xx_i2c_unregister(&dev->i2c_bus[1]);
1445         cx231xx_i2c_unregister(&dev->i2c_bus[0]);
1446 }
1447 EXPORT_SYMBOL_GPL(cx231xx_dev_uninit);
1448
1449 /*****************************************************************
1450 *              G P I O related functions                         *
1451 ******************************************************************/
1452 int cx231xx_send_gpio_cmd(struct cx231xx *dev, u32 gpio_bit, u8 *gpio_val,
1453                           u8 len, u8 request, u8 direction)
1454 {
1455         int status = 0;
1456         struct VENDOR_REQUEST_IN ven_req;
1457
1458         /* Set wValue */
1459         ven_req.wValue = (u16) (gpio_bit >> 16 & 0xffff);
1460
1461         /* set request */
1462         if (!request) {
1463                 if (direction)
1464                         ven_req.bRequest = VRT_GET_GPIO;        /* 0x8 gpio */
1465                 else
1466                         ven_req.bRequest = VRT_SET_GPIO;        /* 0x9 gpio */
1467         } else {
1468                 if (direction)
1469                         ven_req.bRequest = VRT_GET_GPIE;        /* 0xa gpie */
1470                 else
1471                         ven_req.bRequest = VRT_SET_GPIE;        /* 0xb gpie */
1472         }
1473
1474         /* set index value */
1475         ven_req.wIndex = (u16) (gpio_bit & 0xffff);
1476
1477         /* set wLength value */
1478         ven_req.wLength = len;
1479
1480         /* set bData value */
1481         ven_req.bData = 0;
1482
1483         /* set the buffer for read / write */
1484         ven_req.pBuff = gpio_val;
1485
1486         /* set the direction */
1487         if (direction) {
1488                 ven_req.direction = USB_DIR_IN;
1489                 memset(ven_req.pBuff, 0x00, ven_req.wLength);
1490         } else
1491                 ven_req.direction = USB_DIR_OUT;
1492
1493
1494         /* call common vendor command request */
1495         status = cx231xx_send_vendor_cmd(dev, &ven_req);
1496         if (status < 0) {
1497                 cx231xx_info
1498                     ("UsbInterface::sendCommand, failed with status -%d\n",
1499                      status);
1500         }
1501
1502         return status;
1503 }
1504 EXPORT_SYMBOL_GPL(cx231xx_send_gpio_cmd);
1505
1506 /*****************************************************************
1507  *    C O N T R O L - Register R E A D / W R I T E functions     *
1508  *****************************************************************/
1509 int cx231xx_mode_register(struct cx231xx *dev, u16 address, u32 mode)
1510 {
1511         u8 value[4] = { 0x0, 0x0, 0x0, 0x0 };
1512         u32 tmp = 0;
1513         int status = 0;
1514
1515         status =
1516             cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, address, value, 4);
1517         if (status < 0)
1518                 return status;
1519
1520         tmp = *((u32 *) value);
1521         tmp |= mode;
1522
1523         value[0] = (u8) tmp;
1524         value[1] = (u8) (tmp >> 8);
1525         value[2] = (u8) (tmp >> 16);
1526         value[3] = (u8) (tmp >> 24);
1527
1528         status =
1529             cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, address, value, 4);
1530
1531         return status;
1532 }
1533
1534 /*****************************************************************
1535  *            I 2 C Internal C O N T R O L   functions           *
1536  *****************************************************************/
1537 int cx231xx_read_i2c_master(struct cx231xx *dev, u8 dev_addr, u16 saddr,
1538                           u8 saddr_len, u32 *data, u8 data_len, int master)
1539 {
1540         int status = 0;
1541         struct cx231xx_i2c_xfer_data req_data;
1542         u8 value[64] = "0";
1543
1544         if (saddr_len == 0)
1545                 saddr = 0;
1546         else if (saddr_len == 0)
1547                 saddr &= 0xff;
1548
1549         /* prepare xfer_data struct */
1550         req_data.dev_addr = dev_addr >> 1;
1551         req_data.direction = I2C_M_RD;
1552         req_data.saddr_len = saddr_len;
1553         req_data.saddr_dat = saddr;
1554         req_data.buf_size = data_len;
1555         req_data.p_buffer = (u8 *) value;
1556
1557         /* usb send command */
1558         if (master == 0)
1559                 status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0],
1560                                          &req_data);
1561         else if (master == 1)
1562                 status = dev->cx231xx_send_usb_command(&dev->i2c_bus[1],
1563                                          &req_data);
1564         else if (master == 2)
1565                 status = dev->cx231xx_send_usb_command(&dev->i2c_bus[2],
1566                                          &req_data);
1567
1568         if (status >= 0) {
1569                 /* Copy the data read back to main buffer */
1570                 if (data_len == 1)
1571                         *data = value[0];
1572                 else if (data_len == 4)
1573                         *data =
1574                             value[0] | value[1] << 8 | value[2] << 16 | value[3]
1575                             << 24;
1576                 else if (data_len > 4)
1577                         *data = value[saddr];
1578         }
1579
1580         return status;
1581 }
1582
1583 int cx231xx_write_i2c_master(struct cx231xx *dev, u8 dev_addr, u16 saddr,
1584                            u8 saddr_len, u32 data, u8 data_len, int master)
1585 {
1586         int status = 0;
1587         u8 value[4] = { 0, 0, 0, 0 };
1588         struct cx231xx_i2c_xfer_data req_data;
1589
1590         value[0] = (u8) data;
1591         value[1] = (u8) (data >> 8);
1592         value[2] = (u8) (data >> 16);
1593         value[3] = (u8) (data >> 24);
1594
1595         if (saddr_len == 0)
1596                 saddr = 0;
1597         else if (saddr_len == 0)
1598                 saddr &= 0xff;
1599
1600         /* prepare xfer_data struct */
1601         req_data.dev_addr = dev_addr >> 1;
1602         req_data.direction = 0;
1603         req_data.saddr_len = saddr_len;
1604         req_data.saddr_dat = saddr;
1605         req_data.buf_size = data_len;
1606         req_data.p_buffer = value;
1607
1608         /* usb send command */
1609         if (master == 0)
1610                 status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0],
1611                                  &req_data);
1612         else if (master == 1)
1613                 status = dev->cx231xx_send_usb_command(&dev->i2c_bus[1],
1614                                  &req_data);
1615         else if (master == 2)
1616                 status = dev->cx231xx_send_usb_command(&dev->i2c_bus[2],
1617                                  &req_data);
1618
1619         return status;
1620 }
1621
1622 int cx231xx_read_i2c_data(struct cx231xx *dev, u8 dev_addr, u16 saddr,
1623                           u8 saddr_len, u32 *data, u8 data_len)
1624 {
1625         int status = 0;
1626         struct cx231xx_i2c_xfer_data req_data;
1627         u8 value[4] = { 0, 0, 0, 0 };
1628
1629         if (saddr_len == 0)
1630                 saddr = 0;
1631         else if (saddr_len == 0)
1632                 saddr &= 0xff;
1633
1634         /* prepare xfer_data struct */
1635         req_data.dev_addr = dev_addr >> 1;
1636         req_data.direction = I2C_M_RD;
1637         req_data.saddr_len = saddr_len;
1638         req_data.saddr_dat = saddr;
1639         req_data.buf_size = data_len;
1640         req_data.p_buffer = (u8 *) value;
1641
1642         /* usb send command */
1643         status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0], &req_data);
1644
1645         if (status >= 0) {
1646                 /* Copy the data read back to main buffer */
1647                 if (data_len == 1)
1648                         *data = value[0];
1649                 else
1650                         *data =
1651                             value[0] | value[1] << 8 | value[2] << 16 | value[3]
1652                             << 24;
1653         }
1654
1655         return status;
1656 }
1657
1658 int cx231xx_write_i2c_data(struct cx231xx *dev, u8 dev_addr, u16 saddr,
1659                            u8 saddr_len, u32 data, u8 data_len)
1660 {
1661         int status = 0;
1662         u8 value[4] = { 0, 0, 0, 0 };
1663         struct cx231xx_i2c_xfer_data req_data;
1664
1665         value[0] = (u8) data;
1666         value[1] = (u8) (data >> 8);
1667         value[2] = (u8) (data >> 16);
1668         value[3] = (u8) (data >> 24);
1669
1670         if (saddr_len == 0)
1671                 saddr = 0;
1672         else if (saddr_len == 0)
1673                 saddr &= 0xff;
1674
1675         /* prepare xfer_data struct */
1676         req_data.dev_addr = dev_addr >> 1;
1677         req_data.direction = 0;
1678         req_data.saddr_len = saddr_len;
1679         req_data.saddr_dat = saddr;
1680         req_data.buf_size = data_len;
1681         req_data.p_buffer = value;
1682
1683         /* usb send command */
1684         status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0], &req_data);
1685
1686         return status;
1687 }
1688
1689 int cx231xx_reg_mask_write(struct cx231xx *dev, u8 dev_addr, u8 size,
1690                            u16 register_address, u8 bit_start, u8 bit_end,
1691                            u32 value)
1692 {
1693         int status = 0;
1694         u32 tmp;
1695         u32 mask = 0;
1696         int i;
1697
1698         if (bit_start > (size - 1) || bit_end > (size - 1))
1699                 return -1;
1700
1701         if (size == 8) {
1702                 status =
1703                     cx231xx_read_i2c_data(dev, dev_addr, register_address, 2,
1704                                           &tmp, 1);
1705         } else {
1706                 status =
1707                     cx231xx_read_i2c_data(dev, dev_addr, register_address, 2,
1708                                           &tmp, 4);
1709         }
1710
1711         if (status < 0)
1712                 return status;
1713
1714         mask = 1 << bit_end;
1715         for (i = bit_end; i > bit_start && i > 0; i--)
1716                 mask = mask + (1 << (i - 1));
1717
1718         value <<= bit_start;
1719
1720         if (size == 8) {
1721                 tmp &= ~mask;
1722                 tmp |= value;
1723                 tmp &= 0xff;
1724                 status =
1725                     cx231xx_write_i2c_data(dev, dev_addr, register_address, 2,
1726                                            tmp, 1);
1727         } else {
1728                 tmp &= ~mask;
1729                 tmp |= value;
1730                 status =
1731                     cx231xx_write_i2c_data(dev, dev_addr, register_address, 2,
1732                                            tmp, 4);
1733         }
1734
1735         return status;
1736 }
1737
1738 int cx231xx_read_modify_write_i2c_dword(struct cx231xx *dev, u8 dev_addr,
1739                                         u16 saddr, u32 mask, u32 value)
1740 {
1741         u32 temp;
1742         int status = 0;
1743
1744         status = cx231xx_read_i2c_data(dev, dev_addr, saddr, 2, &temp, 4);
1745
1746         if (status < 0)
1747                 return status;
1748
1749         temp &= ~mask;
1750         temp |= value;
1751
1752         status = cx231xx_write_i2c_data(dev, dev_addr, saddr, 2, temp, 4);
1753
1754         return status;
1755 }
1756
1757 u32 cx231xx_set_field(u32 field_mask, u32 data)
1758 {
1759         u32 temp;
1760
1761         for (temp = field_mask; (temp & 1) == 0; temp >>= 1)
1762                 data <<= 1;
1763
1764         return data;
1765 }