]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/media/video/cx231xx/cx231xx-core.c
[media] cx231xx: do not call video_mux as part of isoc setup
[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         /* De-allocates all pending stuff */
1006         cx231xx_uninit_isoc(dev);
1007
1008         dma_q->p_left_data = kzalloc(4096, GFP_KERNEL);
1009         if (dma_q->p_left_data == NULL) {
1010                 cx231xx_info("out of mem\n");
1011                 return -ENOMEM;
1012         }
1013
1014
1015
1016         dev->video_mode.isoc_ctl.isoc_copy = isoc_copy;
1017         dev->video_mode.isoc_ctl.num_bufs = num_bufs;
1018         dma_q->pos = 0;
1019         dma_q->is_partial_line = 0;
1020         dma_q->last_sav = 0;
1021         dma_q->current_field = -1;
1022         dma_q->field1_done = 0;
1023         dma_q->lines_per_field = dev->height / 2;
1024         dma_q->bytes_left_in_line = dev->width << 1;
1025         dma_q->lines_completed = 0;
1026         dma_q->mpeg_buffer_done = 0;
1027         dma_q->left_data_count = 0;
1028         dma_q->mpeg_buffer_completed = 0;
1029         dma_q->add_ps_package_head = CX231XX_NEED_ADD_PS_PACKAGE_HEAD;
1030         dma_q->ps_head[0] = 0x00;
1031         dma_q->ps_head[1] = 0x00;
1032         dma_q->ps_head[2] = 0x01;
1033         dma_q->ps_head[3] = 0xBA;
1034         for (i = 0; i < 8; i++)
1035                 dma_q->partial_buf[i] = 0;
1036
1037         dev->video_mode.isoc_ctl.urb =
1038             kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
1039         if (!dev->video_mode.isoc_ctl.urb) {
1040                 cx231xx_errdev("cannot alloc memory for usb buffers\n");
1041                 return -ENOMEM;
1042         }
1043
1044         dev->video_mode.isoc_ctl.transfer_buffer =
1045             kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
1046         if (!dev->video_mode.isoc_ctl.transfer_buffer) {
1047                 cx231xx_errdev("cannot allocate memory for usbtransfer\n");
1048                 kfree(dev->video_mode.isoc_ctl.urb);
1049                 return -ENOMEM;
1050         }
1051
1052         dev->video_mode.isoc_ctl.max_pkt_size = max_pkt_size;
1053         dev->video_mode.isoc_ctl.buf = NULL;
1054
1055         sb_size = max_packets * dev->video_mode.isoc_ctl.max_pkt_size;
1056
1057         if (dev->mode_tv == 1)
1058                 dev->video_mode.end_point_addr = 0x81;
1059         else
1060                 dev->video_mode.end_point_addr = 0x84;
1061
1062
1063         /* allocate urbs and transfer buffers */
1064         for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
1065                 urb = usb_alloc_urb(max_packets, GFP_KERNEL);
1066                 if (!urb) {
1067                         cx231xx_err("cannot alloc isoc_ctl.urb %i\n", i);
1068                         cx231xx_uninit_isoc(dev);
1069                         return -ENOMEM;
1070                 }
1071                 dev->video_mode.isoc_ctl.urb[i] = urb;
1072
1073                 dev->video_mode.isoc_ctl.transfer_buffer[i] =
1074                     usb_alloc_coherent(dev->udev, sb_size, GFP_KERNEL,
1075                                        &urb->transfer_dma);
1076                 if (!dev->video_mode.isoc_ctl.transfer_buffer[i]) {
1077                         cx231xx_err("unable to allocate %i bytes for transfer"
1078                                     " buffer %i%s\n",
1079                                     sb_size, i,
1080                                     in_interrupt() ? " while in int" : "");
1081                         cx231xx_uninit_isoc(dev);
1082                         return -ENOMEM;
1083                 }
1084                 memset(dev->video_mode.isoc_ctl.transfer_buffer[i], 0, sb_size);
1085
1086                 pipe =
1087                     usb_rcvisocpipe(dev->udev, dev->video_mode.end_point_addr);
1088
1089                 usb_fill_int_urb(urb, dev->udev, pipe,
1090                                  dev->video_mode.isoc_ctl.transfer_buffer[i],
1091                                  sb_size, cx231xx_isoc_irq_callback, dma_q, 1);
1092
1093                 urb->number_of_packets = max_packets;
1094                 urb->transfer_flags = URB_ISO_ASAP;
1095
1096                 k = 0;
1097                 for (j = 0; j < max_packets; j++) {
1098                         urb->iso_frame_desc[j].offset = k;
1099                         urb->iso_frame_desc[j].length =
1100                             dev->video_mode.isoc_ctl.max_pkt_size;
1101                         k += dev->video_mode.isoc_ctl.max_pkt_size;
1102                 }
1103         }
1104
1105         init_waitqueue_head(&dma_q->wq);
1106
1107         /* submit urbs and enables IRQ */
1108         for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
1109                 rc = usb_submit_urb(dev->video_mode.isoc_ctl.urb[i],
1110                                     GFP_ATOMIC);
1111                 if (rc) {
1112                         cx231xx_err("submit of urb %i failed (error=%i)\n", i,
1113                                     rc);
1114                         cx231xx_uninit_isoc(dev);
1115                         return rc;
1116                 }
1117         }
1118
1119         if (dev->mode_tv == 0)
1120                 cx231xx_capture_start(dev, 1, Raw_Video);
1121         else
1122                 cx231xx_capture_start(dev, 1, TS1_serial_mode);
1123
1124         return 0;
1125 }
1126 EXPORT_SYMBOL_GPL(cx231xx_init_isoc);
1127
1128 /*
1129  * Allocate URBs and start IRQ
1130  */
1131 int cx231xx_init_bulk(struct cx231xx *dev, int max_packets,
1132                       int num_bufs, int max_pkt_size,
1133                       int (*bulk_copy) (struct cx231xx *dev, struct urb *urb))
1134 {
1135         struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
1136         int i;
1137         int sb_size, pipe;
1138         struct urb *urb;
1139         int rc;
1140
1141         dev->video_input = dev->video_input > 2 ? 2 : dev->video_input;
1142
1143         cx231xx_coredbg("Setting Video mux to %d\n", dev->video_input);
1144
1145         video_mux(dev, dev->video_input);
1146
1147         /* De-allocates all pending stuff */
1148         cx231xx_uninit_bulk(dev);
1149
1150         dev->video_mode.bulk_ctl.bulk_copy = bulk_copy;
1151         dev->video_mode.bulk_ctl.num_bufs = num_bufs;
1152         dma_q->pos = 0;
1153         dma_q->is_partial_line = 0;
1154         dma_q->last_sav = 0;
1155         dma_q->current_field = -1;
1156         dma_q->field1_done = 0;
1157         dma_q->lines_per_field = dev->height / 2;
1158         dma_q->bytes_left_in_line = dev->width << 1;
1159         dma_q->lines_completed = 0;
1160         dma_q->mpeg_buffer_done = 0;
1161         dma_q->left_data_count = 0;
1162         dma_q->mpeg_buffer_completed = 0;
1163         dma_q->ps_head[0] = 0x00;
1164         dma_q->ps_head[1] = 0x00;
1165         dma_q->ps_head[2] = 0x01;
1166         dma_q->ps_head[3] = 0xBA;
1167         for (i = 0; i < 8; i++)
1168                 dma_q->partial_buf[i] = 0;
1169
1170         dev->video_mode.bulk_ctl.urb =
1171             kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
1172         if (!dev->video_mode.bulk_ctl.urb) {
1173                 cx231xx_errdev("cannot alloc memory for usb buffers\n");
1174                 return -ENOMEM;
1175         }
1176
1177         dev->video_mode.bulk_ctl.transfer_buffer =
1178             kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
1179         if (!dev->video_mode.bulk_ctl.transfer_buffer) {
1180                 cx231xx_errdev("cannot allocate memory for usbtransfer\n");
1181                 kfree(dev->video_mode.bulk_ctl.urb);
1182                 return -ENOMEM;
1183         }
1184
1185         dev->video_mode.bulk_ctl.max_pkt_size = max_pkt_size;
1186         dev->video_mode.bulk_ctl.buf = NULL;
1187
1188         sb_size = max_packets * dev->video_mode.bulk_ctl.max_pkt_size;
1189
1190         if (dev->mode_tv == 1)
1191                 dev->video_mode.end_point_addr = 0x81;
1192         else
1193                 dev->video_mode.end_point_addr = 0x84;
1194
1195
1196         /* allocate urbs and transfer buffers */
1197         for (i = 0; i < dev->video_mode.bulk_ctl.num_bufs; i++) {
1198                 urb = usb_alloc_urb(0, GFP_KERNEL);
1199                 if (!urb) {
1200                         cx231xx_err("cannot alloc bulk_ctl.urb %i\n", i);
1201                         cx231xx_uninit_bulk(dev);
1202                         return -ENOMEM;
1203                 }
1204                 dev->video_mode.bulk_ctl.urb[i] = urb;
1205                 urb->transfer_flags = 0;
1206
1207                 dev->video_mode.bulk_ctl.transfer_buffer[i] =
1208                     usb_alloc_coherent(dev->udev, sb_size, GFP_KERNEL,
1209                                      &urb->transfer_dma);
1210                 if (!dev->video_mode.bulk_ctl.transfer_buffer[i]) {
1211                         cx231xx_err("unable to allocate %i bytes for transfer"
1212                                     " buffer %i%s\n",
1213                                     sb_size, i,
1214                                     in_interrupt() ? " while in int" : "");
1215                         cx231xx_uninit_bulk(dev);
1216                         return -ENOMEM;
1217                 }
1218                 memset(dev->video_mode.bulk_ctl.transfer_buffer[i], 0, sb_size);
1219
1220                 pipe = usb_rcvbulkpipe(dev->udev,
1221                                  dev->video_mode.end_point_addr);
1222                 usb_fill_bulk_urb(urb, dev->udev, pipe,
1223                                   dev->video_mode.bulk_ctl.transfer_buffer[i],
1224                                   sb_size, cx231xx_bulk_irq_callback, dma_q);
1225         }
1226
1227         init_waitqueue_head(&dma_q->wq);
1228
1229         /* submit urbs and enables IRQ */
1230         for (i = 0; i < dev->video_mode.bulk_ctl.num_bufs; i++) {
1231                 rc = usb_submit_urb(dev->video_mode.bulk_ctl.urb[i],
1232                                     GFP_ATOMIC);
1233                 if (rc) {
1234                         cx231xx_err("submit of urb %i failed (error=%i)\n", i,
1235                                     rc);
1236                         cx231xx_uninit_bulk(dev);
1237                         return rc;
1238                 }
1239         }
1240
1241         if (dev->mode_tv == 0)
1242                 cx231xx_capture_start(dev, 1, Raw_Video);
1243         else
1244                 cx231xx_capture_start(dev, 1, TS1_serial_mode);
1245
1246         return 0;
1247 }
1248 EXPORT_SYMBOL_GPL(cx231xx_init_bulk);
1249 void cx231xx_stop_TS1(struct cx231xx *dev)
1250 {
1251         int status = 0;
1252         u8 val[4] = { 0, 0, 0, 0 };
1253
1254                         val[0] = 0x00;
1255                         val[1] = 0x03;
1256                         val[2] = 0x00;
1257                         val[3] = 0x00;
1258                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1259                                  TS_MODE_REG, val, 4);
1260
1261                         val[0] = 0x00;
1262                         val[1] = 0x70;
1263                         val[2] = 0x04;
1264                         val[3] = 0x00;
1265                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1266                                  TS1_CFG_REG, val, 4);
1267 }
1268 /* EXPORT_SYMBOL_GPL(cx231xx_stop_TS1); */
1269 void cx231xx_start_TS1(struct cx231xx *dev)
1270 {
1271         int status = 0;
1272         u8 val[4] = { 0, 0, 0, 0 };
1273
1274                         val[0] = 0x03;
1275                         val[1] = 0x03;
1276                         val[2] = 0x00;
1277                         val[3] = 0x00;
1278                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1279                                  TS_MODE_REG, val, 4);
1280
1281                         val[0] = 0x04;
1282                         val[1] = 0xA3;
1283                         val[2] = 0x3B;
1284                         val[3] = 0x00;
1285                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1286                                  TS1_CFG_REG, val, 4);
1287 }
1288 /* EXPORT_SYMBOL_GPL(cx231xx_start_TS1); */
1289 /*****************************************************************
1290 *             Device Init/UnInit functions                       *
1291 ******************************************************************/
1292 int cx231xx_dev_init(struct cx231xx *dev)
1293 {
1294         int errCode = 0;
1295
1296         /* Initialize I2C bus */
1297
1298         /* External Master 1 Bus */
1299         dev->i2c_bus[0].nr = 0;
1300         dev->i2c_bus[0].dev = dev;
1301         dev->i2c_bus[0].i2c_period = I2C_SPEED_100K;    /* 100 KHz */
1302         dev->i2c_bus[0].i2c_nostop = 0;
1303         dev->i2c_bus[0].i2c_reserve = 0;
1304
1305         /* External Master 2 Bus */
1306         dev->i2c_bus[1].nr = 1;
1307         dev->i2c_bus[1].dev = dev;
1308         dev->i2c_bus[1].i2c_period = I2C_SPEED_100K;    /* 100 KHz */
1309         dev->i2c_bus[1].i2c_nostop = 0;
1310         dev->i2c_bus[1].i2c_reserve = 0;
1311
1312         /* Internal Master 3 Bus */
1313         dev->i2c_bus[2].nr = 2;
1314         dev->i2c_bus[2].dev = dev;
1315         dev->i2c_bus[2].i2c_period = I2C_SPEED_400K;    /* 400kHz */
1316         dev->i2c_bus[2].i2c_nostop = 0;
1317         dev->i2c_bus[2].i2c_reserve = 0;
1318
1319         /* register I2C buses */
1320         cx231xx_i2c_register(&dev->i2c_bus[0]);
1321         cx231xx_i2c_register(&dev->i2c_bus[1]);
1322         cx231xx_i2c_register(&dev->i2c_bus[2]);
1323
1324         /* init hardware */
1325         /* Note : with out calling set power mode function,
1326         afe can not be set up correctly */
1327         if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER) {
1328                 errCode = cx231xx_set_power_mode(dev,
1329                                  POLARIS_AVMODE_ENXTERNAL_AV);
1330                 if (errCode < 0) {
1331                         cx231xx_errdev
1332                         ("%s: Failed to set Power - errCode [%d]!\n",
1333                         __func__, errCode);
1334                         return errCode;
1335                 }
1336         } else {
1337                 errCode = cx231xx_set_power_mode(dev,
1338                                  POLARIS_AVMODE_ANALOGT_TV);
1339                 if (errCode < 0) {
1340                         cx231xx_errdev
1341                         ("%s: Failed to set Power - errCode [%d]!\n",
1342                         __func__, errCode);
1343                         return errCode;
1344                 }
1345         }
1346
1347         /* reset the Tuner */
1348         if ((dev->model == CX231XX_BOARD_CNXT_CARRAERA) ||
1349                 (dev->model == CX231XX_BOARD_CNXT_RDE_250) ||
1350                 (dev->model == CX231XX_BOARD_CNXT_SHELBY) ||
1351                 (dev->model == CX231XX_BOARD_CNXT_RDU_250))
1352                         cx231xx_gpio_set(dev, dev->board.tuner_gpio);
1353
1354         /* initialize Colibri block */
1355         errCode = cx231xx_afe_init_super_block(dev, 0x23c);
1356         if (errCode < 0) {
1357                 cx231xx_errdev
1358                     ("%s: cx231xx_afe init super block - errCode [%d]!\n",
1359                      __func__, errCode);
1360                 return errCode;
1361         }
1362         errCode = cx231xx_afe_init_channels(dev);
1363         if (errCode < 0) {
1364                 cx231xx_errdev
1365                     ("%s: cx231xx_afe init channels - errCode [%d]!\n",
1366                      __func__, errCode);
1367                 return errCode;
1368         }
1369
1370         /* Set DIF in By pass mode */
1371         errCode = cx231xx_dif_set_standard(dev, DIF_USE_BASEBAND);
1372         if (errCode < 0) {
1373                 cx231xx_errdev
1374                     ("%s: cx231xx_dif set to By pass mode - errCode [%d]!\n",
1375                      __func__, errCode);
1376                 return errCode;
1377         }
1378
1379         /* I2S block related functions */
1380         errCode = cx231xx_i2s_blk_initialize(dev);
1381         if (errCode < 0) {
1382                 cx231xx_errdev
1383                     ("%s: cx231xx_i2s block initialize - errCode [%d]!\n",
1384                      __func__, errCode);
1385                 return errCode;
1386         }
1387
1388         /* init control pins */
1389         errCode = cx231xx_init_ctrl_pin_status(dev);
1390         if (errCode < 0) {
1391                 cx231xx_errdev("%s: cx231xx_init ctrl pins - errCode [%d]!\n",
1392                                __func__, errCode);
1393                 return errCode;
1394         }
1395
1396         /* set AGC mode to Analog */
1397         switch (dev->model) {
1398         case CX231XX_BOARD_CNXT_CARRAERA:
1399         case CX231XX_BOARD_CNXT_RDE_250:
1400         case CX231XX_BOARD_CNXT_SHELBY:
1401         case CX231XX_BOARD_CNXT_RDU_250:
1402         errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1);
1403                 break;
1404         case CX231XX_BOARD_CNXT_RDE_253S:
1405         case CX231XX_BOARD_CNXT_RDU_253S:
1406         case CX231XX_BOARD_HAUPPAUGE_EXETER:
1407         errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 0);
1408                 break;
1409         default:
1410                 break;
1411         }
1412         if (errCode < 0) {
1413                 cx231xx_errdev
1414                     ("%s: cx231xx_AGC mode to Analog - errCode [%d]!\n",
1415                      __func__, errCode);
1416                 return errCode;
1417         }
1418
1419         /* set all alternate settings to zero initially */
1420         cx231xx_set_alt_setting(dev, INDEX_VIDEO, 0);
1421         cx231xx_set_alt_setting(dev, INDEX_VANC, 0);
1422         cx231xx_set_alt_setting(dev, INDEX_HANC, 0);
1423         if (dev->board.has_dvb)
1424                 cx231xx_set_alt_setting(dev, INDEX_TS1, 0);
1425
1426         /* set the I2C master port to 3 on channel 1 */
1427         if (dev->model != CX231XX_BOARD_CNXT_VIDEO_GRABBER)
1428                 errCode = cx231xx_enable_i2c_for_tuner(dev, I2C_3);
1429
1430         return errCode;
1431 }
1432 EXPORT_SYMBOL_GPL(cx231xx_dev_init);
1433
1434 void cx231xx_dev_uninit(struct cx231xx *dev)
1435 {
1436         /* Un Initialize I2C bus */
1437         cx231xx_i2c_unregister(&dev->i2c_bus[2]);
1438         cx231xx_i2c_unregister(&dev->i2c_bus[1]);
1439         cx231xx_i2c_unregister(&dev->i2c_bus[0]);
1440 }
1441 EXPORT_SYMBOL_GPL(cx231xx_dev_uninit);
1442
1443 /*****************************************************************
1444 *              G P I O related functions                         *
1445 ******************************************************************/
1446 int cx231xx_send_gpio_cmd(struct cx231xx *dev, u32 gpio_bit, u8 *gpio_val,
1447                           u8 len, u8 request, u8 direction)
1448 {
1449         int status = 0;
1450         struct VENDOR_REQUEST_IN ven_req;
1451
1452         /* Set wValue */
1453         ven_req.wValue = (u16) (gpio_bit >> 16 & 0xffff);
1454
1455         /* set request */
1456         if (!request) {
1457                 if (direction)
1458                         ven_req.bRequest = VRT_GET_GPIO;        /* 0x8 gpio */
1459                 else
1460                         ven_req.bRequest = VRT_SET_GPIO;        /* 0x9 gpio */
1461         } else {
1462                 if (direction)
1463                         ven_req.bRequest = VRT_GET_GPIE;        /* 0xa gpie */
1464                 else
1465                         ven_req.bRequest = VRT_SET_GPIE;        /* 0xb gpie */
1466         }
1467
1468         /* set index value */
1469         ven_req.wIndex = (u16) (gpio_bit & 0xffff);
1470
1471         /* set wLength value */
1472         ven_req.wLength = len;
1473
1474         /* set bData value */
1475         ven_req.bData = 0;
1476
1477         /* set the buffer for read / write */
1478         ven_req.pBuff = gpio_val;
1479
1480         /* set the direction */
1481         if (direction) {
1482                 ven_req.direction = USB_DIR_IN;
1483                 memset(ven_req.pBuff, 0x00, ven_req.wLength);
1484         } else
1485                 ven_req.direction = USB_DIR_OUT;
1486
1487
1488         /* call common vendor command request */
1489         status = cx231xx_send_vendor_cmd(dev, &ven_req);
1490         if (status < 0) {
1491                 cx231xx_info
1492                     ("UsbInterface::sendCommand, failed with status -%d\n",
1493                      status);
1494         }
1495
1496         return status;
1497 }
1498 EXPORT_SYMBOL_GPL(cx231xx_send_gpio_cmd);
1499
1500 /*****************************************************************
1501  *    C O N T R O L - Register R E A D / W R I T E functions     *
1502  *****************************************************************/
1503 int cx231xx_mode_register(struct cx231xx *dev, u16 address, u32 mode)
1504 {
1505         u8 value[4] = { 0x0, 0x0, 0x0, 0x0 };
1506         u32 tmp = 0;
1507         int status = 0;
1508
1509         status =
1510             cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, address, value, 4);
1511         if (status < 0)
1512                 return status;
1513
1514         tmp = *((u32 *) value);
1515         tmp |= mode;
1516
1517         value[0] = (u8) tmp;
1518         value[1] = (u8) (tmp >> 8);
1519         value[2] = (u8) (tmp >> 16);
1520         value[3] = (u8) (tmp >> 24);
1521
1522         status =
1523             cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, address, value, 4);
1524
1525         return status;
1526 }
1527
1528 /*****************************************************************
1529  *            I 2 C Internal C O N T R O L   functions           *
1530  *****************************************************************/
1531 int cx231xx_read_i2c_master(struct cx231xx *dev, u8 dev_addr, u16 saddr,
1532                           u8 saddr_len, u32 *data, u8 data_len, int master)
1533 {
1534         int status = 0;
1535         struct cx231xx_i2c_xfer_data req_data;
1536         u8 value[64] = "0";
1537
1538         if (saddr_len == 0)
1539                 saddr = 0;
1540         else if (saddr_len == 0)
1541                 saddr &= 0xff;
1542
1543         /* prepare xfer_data struct */
1544         req_data.dev_addr = dev_addr >> 1;
1545         req_data.direction = I2C_M_RD;
1546         req_data.saddr_len = saddr_len;
1547         req_data.saddr_dat = saddr;
1548         req_data.buf_size = data_len;
1549         req_data.p_buffer = (u8 *) value;
1550
1551         /* usb send command */
1552         if (master == 0)
1553                 status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0],
1554                                          &req_data);
1555         else if (master == 1)
1556                 status = dev->cx231xx_send_usb_command(&dev->i2c_bus[1],
1557                                          &req_data);
1558         else if (master == 2)
1559                 status = dev->cx231xx_send_usb_command(&dev->i2c_bus[2],
1560                                          &req_data);
1561
1562         if (status >= 0) {
1563                 /* Copy the data read back to main buffer */
1564                 if (data_len == 1)
1565                         *data = value[0];
1566                 else if (data_len == 4)
1567                         *data =
1568                             value[0] | value[1] << 8 | value[2] << 16 | value[3]
1569                             << 24;
1570                 else if (data_len > 4)
1571                         *data = value[saddr];
1572         }
1573
1574         return status;
1575 }
1576
1577 int cx231xx_write_i2c_master(struct cx231xx *dev, u8 dev_addr, u16 saddr,
1578                            u8 saddr_len, u32 data, u8 data_len, int master)
1579 {
1580         int status = 0;
1581         u8 value[4] = { 0, 0, 0, 0 };
1582         struct cx231xx_i2c_xfer_data req_data;
1583
1584         value[0] = (u8) data;
1585         value[1] = (u8) (data >> 8);
1586         value[2] = (u8) (data >> 16);
1587         value[3] = (u8) (data >> 24);
1588
1589         if (saddr_len == 0)
1590                 saddr = 0;
1591         else if (saddr_len == 0)
1592                 saddr &= 0xff;
1593
1594         /* prepare xfer_data struct */
1595         req_data.dev_addr = dev_addr >> 1;
1596         req_data.direction = 0;
1597         req_data.saddr_len = saddr_len;
1598         req_data.saddr_dat = saddr;
1599         req_data.buf_size = data_len;
1600         req_data.p_buffer = value;
1601
1602         /* usb send command */
1603         if (master == 0)
1604                 status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0],
1605                                  &req_data);
1606         else if (master == 1)
1607                 status = dev->cx231xx_send_usb_command(&dev->i2c_bus[1],
1608                                  &req_data);
1609         else if (master == 2)
1610                 status = dev->cx231xx_send_usb_command(&dev->i2c_bus[2],
1611                                  &req_data);
1612
1613         return status;
1614 }
1615
1616 int cx231xx_read_i2c_data(struct cx231xx *dev, u8 dev_addr, u16 saddr,
1617                           u8 saddr_len, u32 *data, u8 data_len)
1618 {
1619         int status = 0;
1620         struct cx231xx_i2c_xfer_data req_data;
1621         u8 value[4] = { 0, 0, 0, 0 };
1622
1623         if (saddr_len == 0)
1624                 saddr = 0;
1625         else if (saddr_len == 0)
1626                 saddr &= 0xff;
1627
1628         /* prepare xfer_data struct */
1629         req_data.dev_addr = dev_addr >> 1;
1630         req_data.direction = I2C_M_RD;
1631         req_data.saddr_len = saddr_len;
1632         req_data.saddr_dat = saddr;
1633         req_data.buf_size = data_len;
1634         req_data.p_buffer = (u8 *) value;
1635
1636         /* usb send command */
1637         status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0], &req_data);
1638
1639         if (status >= 0) {
1640                 /* Copy the data read back to main buffer */
1641                 if (data_len == 1)
1642                         *data = value[0];
1643                 else
1644                         *data =
1645                             value[0] | value[1] << 8 | value[2] << 16 | value[3]
1646                             << 24;
1647         }
1648
1649         return status;
1650 }
1651
1652 int cx231xx_write_i2c_data(struct cx231xx *dev, u8 dev_addr, u16 saddr,
1653                            u8 saddr_len, u32 data, u8 data_len)
1654 {
1655         int status = 0;
1656         u8 value[4] = { 0, 0, 0, 0 };
1657         struct cx231xx_i2c_xfer_data req_data;
1658
1659         value[0] = (u8) data;
1660         value[1] = (u8) (data >> 8);
1661         value[2] = (u8) (data >> 16);
1662         value[3] = (u8) (data >> 24);
1663
1664         if (saddr_len == 0)
1665                 saddr = 0;
1666         else if (saddr_len == 0)
1667                 saddr &= 0xff;
1668
1669         /* prepare xfer_data struct */
1670         req_data.dev_addr = dev_addr >> 1;
1671         req_data.direction = 0;
1672         req_data.saddr_len = saddr_len;
1673         req_data.saddr_dat = saddr;
1674         req_data.buf_size = data_len;
1675         req_data.p_buffer = value;
1676
1677         /* usb send command */
1678         status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0], &req_data);
1679
1680         return status;
1681 }
1682
1683 int cx231xx_reg_mask_write(struct cx231xx *dev, u8 dev_addr, u8 size,
1684                            u16 register_address, u8 bit_start, u8 bit_end,
1685                            u32 value)
1686 {
1687         int status = 0;
1688         u32 tmp;
1689         u32 mask = 0;
1690         int i;
1691
1692         if (bit_start > (size - 1) || bit_end > (size - 1))
1693                 return -1;
1694
1695         if (size == 8) {
1696                 status =
1697                     cx231xx_read_i2c_data(dev, dev_addr, register_address, 2,
1698                                           &tmp, 1);
1699         } else {
1700                 status =
1701                     cx231xx_read_i2c_data(dev, dev_addr, register_address, 2,
1702                                           &tmp, 4);
1703         }
1704
1705         if (status < 0)
1706                 return status;
1707
1708         mask = 1 << bit_end;
1709         for (i = bit_end; i > bit_start && i > 0; i--)
1710                 mask = mask + (1 << (i - 1));
1711
1712         value <<= bit_start;
1713
1714         if (size == 8) {
1715                 tmp &= ~mask;
1716                 tmp |= value;
1717                 tmp &= 0xff;
1718                 status =
1719                     cx231xx_write_i2c_data(dev, dev_addr, register_address, 2,
1720                                            tmp, 1);
1721         } else {
1722                 tmp &= ~mask;
1723                 tmp |= value;
1724                 status =
1725                     cx231xx_write_i2c_data(dev, dev_addr, register_address, 2,
1726                                            tmp, 4);
1727         }
1728
1729         return status;
1730 }
1731
1732 int cx231xx_read_modify_write_i2c_dword(struct cx231xx *dev, u8 dev_addr,
1733                                         u16 saddr, u32 mask, u32 value)
1734 {
1735         u32 temp;
1736         int status = 0;
1737
1738         status = cx231xx_read_i2c_data(dev, dev_addr, saddr, 2, &temp, 4);
1739
1740         if (status < 0)
1741                 return status;
1742
1743         temp &= ~mask;
1744         temp |= value;
1745
1746         status = cx231xx_write_i2c_data(dev, dev_addr, saddr, 2, temp, 4);
1747
1748         return status;
1749 }
1750
1751 u32 cx231xx_set_field(u32 field_mask, u32 data)
1752 {
1753         u32 temp;
1754
1755         for (temp = field_mask; (temp & 1) == 0; temp >>= 1)
1756                 data <<= 1;
1757
1758         return data;
1759 }