]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/media/video/cx231xx/cx231xx-core.c
fe3d500424f3c7812543cb2944842336af61c771
[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                         errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1);
750                         break;
751                 case CX231XX_BOARD_HAUPPAUGE_EXETER:
752                         errCode = cx231xx_set_power_mode(dev,
753                                                 POLARIS_AVMODE_DIGITAL);
754                         break;
755                 default:
756                         break;
757                 }
758         } else/* Set Analog Power mode */ {
759         /* set AGC mode to Analog */
760                 switch (dev->model) {
761                 case CX231XX_BOARD_CNXT_CARRAERA:
762                 case CX231XX_BOARD_CNXT_RDE_250:
763                 case CX231XX_BOARD_CNXT_SHELBY:
764                 case CX231XX_BOARD_CNXT_RDU_250:
765                 errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1);
766                         break;
767                 case CX231XX_BOARD_CNXT_RDE_253S:
768                 case CX231XX_BOARD_CNXT_RDU_253S:
769                 case CX231XX_BOARD_HAUPPAUGE_EXETER:
770                 errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 0);
771                         break;
772                 default:
773                         break;
774                 }
775         }
776
777         return 0;
778 }
779 EXPORT_SYMBOL_GPL(cx231xx_set_mode);
780
781 int cx231xx_ep5_bulkout(struct cx231xx *dev, u8 *firmware, u16 size)
782 {
783         int errCode = 0;
784         int actlen, ret = -ENOMEM;
785         u32 *buffer;
786
787 buffer = kzalloc(4096, GFP_KERNEL);
788         if (buffer == NULL) {
789                 cx231xx_info("out of mem\n");
790                 return -ENOMEM;
791         }
792         memcpy(&buffer[0], firmware, 4096);
793
794         ret = usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, 5),
795                                  buffer, 4096, &actlen, 2000);
796
797         if (ret)
798                 cx231xx_info("bulk message failed: %d (%d/%d)", ret,
799                                  size, actlen);
800         else {
801                 errCode = actlen != size ? -1 : 0;
802         }
803 kfree(buffer);
804         return 0;
805 }
806
807 /*****************************************************************
808 *                URB Streaming functions                         *
809 ******************************************************************/
810
811 /*
812  * IRQ callback, called by URB callback
813  */
814 static void cx231xx_isoc_irq_callback(struct urb *urb)
815 {
816         struct cx231xx_dmaqueue *dma_q = urb->context;
817         struct cx231xx_video_mode *vmode =
818             container_of(dma_q, struct cx231xx_video_mode, vidq);
819         struct cx231xx *dev = container_of(vmode, struct cx231xx, video_mode);
820         int rc, i;
821
822         switch (urb->status) {
823         case 0:         /* success */
824         case -ETIMEDOUT:        /* NAK */
825                 break;
826         case -ECONNRESET:       /* kill */
827         case -ENOENT:
828         case -ESHUTDOWN:
829                 return;
830         default:                /* error */
831                 cx231xx_isocdbg("urb completition error %d.\n", urb->status);
832                 break;
833         }
834
835         /* Copy data from URB */
836         spin_lock(&dev->video_mode.slock);
837         rc = dev->video_mode.isoc_ctl.isoc_copy(dev, urb);
838         spin_unlock(&dev->video_mode.slock);
839
840         /* Reset urb buffers */
841         for (i = 0; i < urb->number_of_packets; i++) {
842                 urb->iso_frame_desc[i].status = 0;
843                 urb->iso_frame_desc[i].actual_length = 0;
844         }
845         urb->status = 0;
846
847         urb->status = usb_submit_urb(urb, GFP_ATOMIC);
848         if (urb->status) {
849                 cx231xx_isocdbg("urb resubmit failed (error=%i)\n",
850                                 urb->status);
851         }
852 }
853 /*****************************************************************
854 *                URB Streaming functions                         *
855 ******************************************************************/
856
857 /*
858  * IRQ callback, called by URB callback
859  */
860 static void cx231xx_bulk_irq_callback(struct urb *urb)
861 {
862         struct cx231xx_dmaqueue *dma_q = urb->context;
863         struct cx231xx_video_mode *vmode =
864             container_of(dma_q, struct cx231xx_video_mode, vidq);
865         struct cx231xx *dev = container_of(vmode, struct cx231xx, video_mode);
866         int rc;
867
868         switch (urb->status) {
869         case 0:         /* success */
870         case -ETIMEDOUT:        /* NAK */
871                 break;
872         case -ECONNRESET:       /* kill */
873         case -ENOENT:
874         case -ESHUTDOWN:
875                 return;
876         default:                /* error */
877                 cx231xx_isocdbg("urb completition error %d.\n", urb->status);
878                 break;
879         }
880
881         /* Copy data from URB */
882         spin_lock(&dev->video_mode.slock);
883         rc = dev->video_mode.bulk_ctl.bulk_copy(dev, urb);
884         spin_unlock(&dev->video_mode.slock);
885
886         /* Reset urb buffers */
887         urb->status = 0;
888
889         urb->status = usb_submit_urb(urb, GFP_ATOMIC);
890         if (urb->status) {
891                 cx231xx_isocdbg("urb resubmit failed (error=%i)\n",
892                                 urb->status);
893         }
894 }
895 /*
896  * Stop and Deallocate URBs
897  */
898 void cx231xx_uninit_isoc(struct cx231xx *dev)
899 {
900         struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
901         struct urb *urb;
902         int i;
903
904         cx231xx_isocdbg("cx231xx: called cx231xx_uninit_isoc\n");
905
906         dev->video_mode.isoc_ctl.nfields = -1;
907         for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
908                 urb = dev->video_mode.isoc_ctl.urb[i];
909                 if (urb) {
910                         if (!irqs_disabled())
911                                 usb_kill_urb(urb);
912                         else
913                                 usb_unlink_urb(urb);
914
915                         if (dev->video_mode.isoc_ctl.transfer_buffer[i]) {
916                                 usb_free_coherent(dev->udev,
917                                                   urb->transfer_buffer_length,
918                                                   dev->video_mode.isoc_ctl.
919                                                   transfer_buffer[i],
920                                                   urb->transfer_dma);
921                         }
922                         usb_free_urb(urb);
923                         dev->video_mode.isoc_ctl.urb[i] = NULL;
924                 }
925                 dev->video_mode.isoc_ctl.transfer_buffer[i] = NULL;
926         }
927
928         kfree(dev->video_mode.isoc_ctl.urb);
929         kfree(dev->video_mode.isoc_ctl.transfer_buffer);
930         kfree(dma_q->p_left_data);
931
932         dev->video_mode.isoc_ctl.urb = NULL;
933         dev->video_mode.isoc_ctl.transfer_buffer = NULL;
934         dev->video_mode.isoc_ctl.num_bufs = 0;
935         dma_q->p_left_data = NULL;
936
937         if (dev->mode_tv == 0)
938                 cx231xx_capture_start(dev, 0, Raw_Video);
939         else
940                 cx231xx_capture_start(dev, 0, TS1_serial_mode);
941
942
943 }
944 EXPORT_SYMBOL_GPL(cx231xx_uninit_isoc);
945
946 /*
947  * Stop and Deallocate URBs
948  */
949 void cx231xx_uninit_bulk(struct cx231xx *dev)
950 {
951         struct urb *urb;
952         int i;
953
954         cx231xx_isocdbg("cx231xx: called cx231xx_uninit_bulk\n");
955
956         dev->video_mode.bulk_ctl.nfields = -1;
957         for (i = 0; i < dev->video_mode.bulk_ctl.num_bufs; i++) {
958                 urb = dev->video_mode.bulk_ctl.urb[i];
959                 if (urb) {
960                         if (!irqs_disabled())
961                                 usb_kill_urb(urb);
962                         else
963                                 usb_unlink_urb(urb);
964
965                         if (dev->video_mode.bulk_ctl.transfer_buffer[i]) {
966                                 usb_free_coherent(dev->udev,
967                                                 urb->transfer_buffer_length,
968                                                 dev->video_mode.isoc_ctl.
969                                                 transfer_buffer[i],
970                                                 urb->transfer_dma);
971                         }
972                         usb_free_urb(urb);
973                         dev->video_mode.bulk_ctl.urb[i] = NULL;
974                 }
975                 dev->video_mode.bulk_ctl.transfer_buffer[i] = NULL;
976         }
977
978         kfree(dev->video_mode.bulk_ctl.urb);
979         kfree(dev->video_mode.bulk_ctl.transfer_buffer);
980
981         dev->video_mode.bulk_ctl.urb = NULL;
982         dev->video_mode.bulk_ctl.transfer_buffer = NULL;
983         dev->video_mode.bulk_ctl.num_bufs = 0;
984
985         if (dev->mode_tv == 0)
986                 cx231xx_capture_start(dev, 0, Raw_Video);
987         else
988                 cx231xx_capture_start(dev, 0, TS1_serial_mode);
989
990
991 }
992 EXPORT_SYMBOL_GPL(cx231xx_uninit_bulk);
993
994 /*
995  * Allocate URBs and start IRQ
996  */
997 int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
998                       int num_bufs, int max_pkt_size,
999                       int (*isoc_copy) (struct cx231xx *dev, struct urb *urb))
1000 {
1001         struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
1002         int i;
1003         int sb_size, pipe;
1004         struct urb *urb;
1005         int j, k;
1006         int rc;
1007
1008         /* De-allocates all pending stuff */
1009         cx231xx_uninit_isoc(dev);
1010
1011         dma_q->p_left_data = kzalloc(4096, GFP_KERNEL);
1012         if (dma_q->p_left_data == NULL) {
1013                 cx231xx_info("out of mem\n");
1014                 return -ENOMEM;
1015         }
1016
1017
1018
1019         dev->video_mode.isoc_ctl.isoc_copy = isoc_copy;
1020         dev->video_mode.isoc_ctl.num_bufs = num_bufs;
1021         dma_q->pos = 0;
1022         dma_q->is_partial_line = 0;
1023         dma_q->last_sav = 0;
1024         dma_q->current_field = -1;
1025         dma_q->field1_done = 0;
1026         dma_q->lines_per_field = dev->height / 2;
1027         dma_q->bytes_left_in_line = dev->width << 1;
1028         dma_q->lines_completed = 0;
1029         dma_q->mpeg_buffer_done = 0;
1030         dma_q->left_data_count = 0;
1031         dma_q->mpeg_buffer_completed = 0;
1032         dma_q->add_ps_package_head = CX231XX_NEED_ADD_PS_PACKAGE_HEAD;
1033         dma_q->ps_head[0] = 0x00;
1034         dma_q->ps_head[1] = 0x00;
1035         dma_q->ps_head[2] = 0x01;
1036         dma_q->ps_head[3] = 0xBA;
1037         for (i = 0; i < 8; i++)
1038                 dma_q->partial_buf[i] = 0;
1039
1040         dev->video_mode.isoc_ctl.urb =
1041             kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
1042         if (!dev->video_mode.isoc_ctl.urb) {
1043                 cx231xx_errdev("cannot alloc memory for usb buffers\n");
1044                 return -ENOMEM;
1045         }
1046
1047         dev->video_mode.isoc_ctl.transfer_buffer =
1048             kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
1049         if (!dev->video_mode.isoc_ctl.transfer_buffer) {
1050                 cx231xx_errdev("cannot allocate memory for usbtransfer\n");
1051                 kfree(dev->video_mode.isoc_ctl.urb);
1052                 return -ENOMEM;
1053         }
1054
1055         dev->video_mode.isoc_ctl.max_pkt_size = max_pkt_size;
1056         dev->video_mode.isoc_ctl.buf = NULL;
1057
1058         sb_size = max_packets * dev->video_mode.isoc_ctl.max_pkt_size;
1059
1060         if (dev->mode_tv == 1)
1061                 dev->video_mode.end_point_addr = 0x81;
1062         else
1063                 dev->video_mode.end_point_addr = 0x84;
1064
1065
1066         /* allocate urbs and transfer buffers */
1067         for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
1068                 urb = usb_alloc_urb(max_packets, GFP_KERNEL);
1069                 if (!urb) {
1070                         cx231xx_err("cannot alloc isoc_ctl.urb %i\n", i);
1071                         cx231xx_uninit_isoc(dev);
1072                         return -ENOMEM;
1073                 }
1074                 dev->video_mode.isoc_ctl.urb[i] = urb;
1075
1076                 dev->video_mode.isoc_ctl.transfer_buffer[i] =
1077                     usb_alloc_coherent(dev->udev, sb_size, GFP_KERNEL,
1078                                        &urb->transfer_dma);
1079                 if (!dev->video_mode.isoc_ctl.transfer_buffer[i]) {
1080                         cx231xx_err("unable to allocate %i bytes for transfer"
1081                                     " buffer %i%s\n",
1082                                     sb_size, i,
1083                                     in_interrupt() ? " while in int" : "");
1084                         cx231xx_uninit_isoc(dev);
1085                         return -ENOMEM;
1086                 }
1087                 memset(dev->video_mode.isoc_ctl.transfer_buffer[i], 0, sb_size);
1088
1089                 pipe =
1090                     usb_rcvisocpipe(dev->udev, dev->video_mode.end_point_addr);
1091
1092                 usb_fill_int_urb(urb, dev->udev, pipe,
1093                                  dev->video_mode.isoc_ctl.transfer_buffer[i],
1094                                  sb_size, cx231xx_isoc_irq_callback, dma_q, 1);
1095
1096                 urb->number_of_packets = max_packets;
1097                 urb->transfer_flags = URB_ISO_ASAP;
1098
1099                 k = 0;
1100                 for (j = 0; j < max_packets; j++) {
1101                         urb->iso_frame_desc[j].offset = k;
1102                         urb->iso_frame_desc[j].length =
1103                             dev->video_mode.isoc_ctl.max_pkt_size;
1104                         k += dev->video_mode.isoc_ctl.max_pkt_size;
1105                 }
1106         }
1107
1108         init_waitqueue_head(&dma_q->wq);
1109
1110         /* submit urbs and enables IRQ */
1111         for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
1112                 rc = usb_submit_urb(dev->video_mode.isoc_ctl.urb[i],
1113                                     GFP_ATOMIC);
1114                 if (rc) {
1115                         cx231xx_err("submit of urb %i failed (error=%i)\n", i,
1116                                     rc);
1117                         cx231xx_uninit_isoc(dev);
1118                         return rc;
1119                 }
1120         }
1121
1122         if (dev->mode_tv == 0)
1123                 cx231xx_capture_start(dev, 1, Raw_Video);
1124         else
1125                 cx231xx_capture_start(dev, 1, TS1_serial_mode);
1126
1127         return 0;
1128 }
1129 EXPORT_SYMBOL_GPL(cx231xx_init_isoc);
1130
1131 /*
1132  * Allocate URBs and start IRQ
1133  */
1134 int cx231xx_init_bulk(struct cx231xx *dev, int max_packets,
1135                       int num_bufs, int max_pkt_size,
1136                       int (*bulk_copy) (struct cx231xx *dev, struct urb *urb))
1137 {
1138         struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
1139         int i;
1140         int sb_size, pipe;
1141         struct urb *urb;
1142         int rc;
1143
1144         dev->video_input = dev->video_input > 2 ? 2 : dev->video_input;
1145
1146         cx231xx_coredbg("Setting Video mux to %d\n", dev->video_input);
1147
1148         video_mux(dev, dev->video_input);
1149
1150         /* De-allocates all pending stuff */
1151         cx231xx_uninit_bulk(dev);
1152
1153         dev->video_mode.bulk_ctl.bulk_copy = bulk_copy;
1154         dev->video_mode.bulk_ctl.num_bufs = num_bufs;
1155         dma_q->pos = 0;
1156         dma_q->is_partial_line = 0;
1157         dma_q->last_sav = 0;
1158         dma_q->current_field = -1;
1159         dma_q->field1_done = 0;
1160         dma_q->lines_per_field = dev->height / 2;
1161         dma_q->bytes_left_in_line = dev->width << 1;
1162         dma_q->lines_completed = 0;
1163         dma_q->mpeg_buffer_done = 0;
1164         dma_q->left_data_count = 0;
1165         dma_q->mpeg_buffer_completed = 0;
1166         dma_q->ps_head[0] = 0x00;
1167         dma_q->ps_head[1] = 0x00;
1168         dma_q->ps_head[2] = 0x01;
1169         dma_q->ps_head[3] = 0xBA;
1170         for (i = 0; i < 8; i++)
1171                 dma_q->partial_buf[i] = 0;
1172
1173         dev->video_mode.bulk_ctl.urb =
1174             kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
1175         if (!dev->video_mode.bulk_ctl.urb) {
1176                 cx231xx_errdev("cannot alloc memory for usb buffers\n");
1177                 return -ENOMEM;
1178         }
1179
1180         dev->video_mode.bulk_ctl.transfer_buffer =
1181             kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
1182         if (!dev->video_mode.bulk_ctl.transfer_buffer) {
1183                 cx231xx_errdev("cannot allocate memory for usbtransfer\n");
1184                 kfree(dev->video_mode.bulk_ctl.urb);
1185                 return -ENOMEM;
1186         }
1187
1188         dev->video_mode.bulk_ctl.max_pkt_size = max_pkt_size;
1189         dev->video_mode.bulk_ctl.buf = NULL;
1190
1191         sb_size = max_packets * dev->video_mode.bulk_ctl.max_pkt_size;
1192
1193         if (dev->mode_tv == 1)
1194                 dev->video_mode.end_point_addr = 0x81;
1195         else
1196                 dev->video_mode.end_point_addr = 0x84;
1197
1198
1199         /* allocate urbs and transfer buffers */
1200         for (i = 0; i < dev->video_mode.bulk_ctl.num_bufs; i++) {
1201                 urb = usb_alloc_urb(0, GFP_KERNEL);
1202                 if (!urb) {
1203                         cx231xx_err("cannot alloc bulk_ctl.urb %i\n", i);
1204                         cx231xx_uninit_bulk(dev);
1205                         return -ENOMEM;
1206                 }
1207                 dev->video_mode.bulk_ctl.urb[i] = urb;
1208                 urb->transfer_flags = 0;
1209
1210                 dev->video_mode.bulk_ctl.transfer_buffer[i] =
1211                     usb_alloc_coherent(dev->udev, sb_size, GFP_KERNEL,
1212                                      &urb->transfer_dma);
1213                 if (!dev->video_mode.bulk_ctl.transfer_buffer[i]) {
1214                         cx231xx_err("unable to allocate %i bytes for transfer"
1215                                     " buffer %i%s\n",
1216                                     sb_size, i,
1217                                     in_interrupt() ? " while in int" : "");
1218                         cx231xx_uninit_bulk(dev);
1219                         return -ENOMEM;
1220                 }
1221                 memset(dev->video_mode.bulk_ctl.transfer_buffer[i], 0, sb_size);
1222
1223                 pipe = usb_rcvbulkpipe(dev->udev,
1224                                  dev->video_mode.end_point_addr);
1225                 usb_fill_bulk_urb(urb, dev->udev, pipe,
1226                                   dev->video_mode.bulk_ctl.transfer_buffer[i],
1227                                   sb_size, cx231xx_bulk_irq_callback, dma_q);
1228         }
1229
1230         init_waitqueue_head(&dma_q->wq);
1231
1232         /* submit urbs and enables IRQ */
1233         for (i = 0; i < dev->video_mode.bulk_ctl.num_bufs; i++) {
1234                 rc = usb_submit_urb(dev->video_mode.bulk_ctl.urb[i],
1235                                     GFP_ATOMIC);
1236                 if (rc) {
1237                         cx231xx_err("submit of urb %i failed (error=%i)\n", i,
1238                                     rc);
1239                         cx231xx_uninit_bulk(dev);
1240                         return rc;
1241                 }
1242         }
1243
1244         if (dev->mode_tv == 0)
1245                 cx231xx_capture_start(dev, 1, Raw_Video);
1246         else
1247                 cx231xx_capture_start(dev, 1, TS1_serial_mode);
1248
1249         return 0;
1250 }
1251 EXPORT_SYMBOL_GPL(cx231xx_init_bulk);
1252 void cx231xx_stop_TS1(struct cx231xx *dev)
1253 {
1254         int status = 0;
1255         u8 val[4] = { 0, 0, 0, 0 };
1256
1257                         val[0] = 0x00;
1258                         val[1] = 0x03;
1259                         val[2] = 0x00;
1260                         val[3] = 0x00;
1261                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1262                                  TS_MODE_REG, val, 4);
1263
1264                         val[0] = 0x00;
1265                         val[1] = 0x70;
1266                         val[2] = 0x04;
1267                         val[3] = 0x00;
1268                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1269                                  TS1_CFG_REG, val, 4);
1270 }
1271 /* EXPORT_SYMBOL_GPL(cx231xx_stop_TS1); */
1272 void cx231xx_start_TS1(struct cx231xx *dev)
1273 {
1274         int status = 0;
1275         u8 val[4] = { 0, 0, 0, 0 };
1276
1277                         val[0] = 0x03;
1278                         val[1] = 0x03;
1279                         val[2] = 0x00;
1280                         val[3] = 0x00;
1281                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1282                                  TS_MODE_REG, val, 4);
1283
1284                         val[0] = 0x04;
1285                         val[1] = 0xA3;
1286                         val[2] = 0x3B;
1287                         val[3] = 0x00;
1288                         status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1289                                  TS1_CFG_REG, val, 4);
1290 }
1291 /* EXPORT_SYMBOL_GPL(cx231xx_start_TS1); */
1292 /*****************************************************************
1293 *             Device Init/UnInit functions                       *
1294 ******************************************************************/
1295 int cx231xx_dev_init(struct cx231xx *dev)
1296 {
1297         int errCode = 0;
1298
1299         /* Initialize I2C bus */
1300
1301         /* External Master 1 Bus */
1302         dev->i2c_bus[0].nr = 0;
1303         dev->i2c_bus[0].dev = dev;
1304         dev->i2c_bus[0].i2c_period = I2C_SPEED_100K;    /* 100 KHz */
1305         dev->i2c_bus[0].i2c_nostop = 0;
1306         dev->i2c_bus[0].i2c_reserve = 0;
1307
1308         /* External Master 2 Bus */
1309         dev->i2c_bus[1].nr = 1;
1310         dev->i2c_bus[1].dev = dev;
1311         dev->i2c_bus[1].i2c_period = I2C_SPEED_100K;    /* 100 KHz */
1312         dev->i2c_bus[1].i2c_nostop = 0;
1313         dev->i2c_bus[1].i2c_reserve = 0;
1314
1315         /* Internal Master 3 Bus */
1316         dev->i2c_bus[2].nr = 2;
1317         dev->i2c_bus[2].dev = dev;
1318         dev->i2c_bus[2].i2c_period = I2C_SPEED_400K;    /* 400kHz */
1319         dev->i2c_bus[2].i2c_nostop = 0;
1320         dev->i2c_bus[2].i2c_reserve = 0;
1321
1322         /* register I2C buses */
1323         cx231xx_i2c_register(&dev->i2c_bus[0]);
1324         cx231xx_i2c_register(&dev->i2c_bus[1]);
1325         cx231xx_i2c_register(&dev->i2c_bus[2]);
1326
1327         /* init hardware */
1328         /* Note : with out calling set power mode function,
1329         afe can not be set up correctly */
1330         if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER) {
1331                 errCode = cx231xx_set_power_mode(dev,
1332                                  POLARIS_AVMODE_ENXTERNAL_AV);
1333                 if (errCode < 0) {
1334                         cx231xx_errdev
1335                         ("%s: Failed to set Power - errCode [%d]!\n",
1336                         __func__, errCode);
1337                         return errCode;
1338                 }
1339         } else {
1340                 errCode = cx231xx_set_power_mode(dev,
1341                                  POLARIS_AVMODE_ANALOGT_TV);
1342                 if (errCode < 0) {
1343                         cx231xx_errdev
1344                         ("%s: Failed to set Power - errCode [%d]!\n",
1345                         __func__, errCode);
1346                         return errCode;
1347                 }
1348         }
1349
1350         /* reset the Tuner */
1351         if ((dev->model == CX231XX_BOARD_CNXT_CARRAERA) ||
1352                 (dev->model == CX231XX_BOARD_CNXT_RDE_250) ||
1353                 (dev->model == CX231XX_BOARD_CNXT_SHELBY) ||
1354                 (dev->model == CX231XX_BOARD_CNXT_RDU_250))
1355                         cx231xx_gpio_set(dev, dev->board.tuner_gpio);
1356
1357         /* initialize Colibri block */
1358         errCode = cx231xx_afe_init_super_block(dev, 0x23c);
1359         if (errCode < 0) {
1360                 cx231xx_errdev
1361                     ("%s: cx231xx_afe init super block - errCode [%d]!\n",
1362                      __func__, errCode);
1363                 return errCode;
1364         }
1365         errCode = cx231xx_afe_init_channels(dev);
1366         if (errCode < 0) {
1367                 cx231xx_errdev
1368                     ("%s: cx231xx_afe init channels - errCode [%d]!\n",
1369                      __func__, errCode);
1370                 return errCode;
1371         }
1372
1373         /* Set DIF in By pass mode */
1374         errCode = cx231xx_dif_set_standard(dev, DIF_USE_BASEBAND);
1375         if (errCode < 0) {
1376                 cx231xx_errdev
1377                     ("%s: cx231xx_dif set to By pass mode - errCode [%d]!\n",
1378                      __func__, errCode);
1379                 return errCode;
1380         }
1381
1382         /* I2S block related functions */
1383         errCode = cx231xx_i2s_blk_initialize(dev);
1384         if (errCode < 0) {
1385                 cx231xx_errdev
1386                     ("%s: cx231xx_i2s block initialize - errCode [%d]!\n",
1387                      __func__, errCode);
1388                 return errCode;
1389         }
1390
1391         /* init control pins */
1392         errCode = cx231xx_init_ctrl_pin_status(dev);
1393         if (errCode < 0) {
1394                 cx231xx_errdev("%s: cx231xx_init ctrl pins - errCode [%d]!\n",
1395                                __func__, errCode);
1396                 return errCode;
1397         }
1398
1399         /* set AGC mode to Analog */
1400         switch (dev->model) {
1401         case CX231XX_BOARD_CNXT_CARRAERA:
1402         case CX231XX_BOARD_CNXT_RDE_250:
1403         case CX231XX_BOARD_CNXT_SHELBY:
1404         case CX231XX_BOARD_CNXT_RDU_250:
1405         errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1);
1406                 break;
1407         case CX231XX_BOARD_CNXT_RDE_253S:
1408         case CX231XX_BOARD_CNXT_RDU_253S:
1409         case CX231XX_BOARD_HAUPPAUGE_EXETER:
1410         errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 0);
1411                 break;
1412         default:
1413                 break;
1414         }
1415         if (errCode < 0) {
1416                 cx231xx_errdev
1417                     ("%s: cx231xx_AGC mode to Analog - errCode [%d]!\n",
1418                      __func__, errCode);
1419                 return errCode;
1420         }
1421
1422         /* set all alternate settings to zero initially */
1423         cx231xx_set_alt_setting(dev, INDEX_VIDEO, 0);
1424         cx231xx_set_alt_setting(dev, INDEX_VANC, 0);
1425         cx231xx_set_alt_setting(dev, INDEX_HANC, 0);
1426         if (dev->board.has_dvb)
1427                 cx231xx_set_alt_setting(dev, INDEX_TS1, 0);
1428
1429         /* set the I2C master port to 3 on channel 1 */
1430         if (dev->model != CX231XX_BOARD_CNXT_VIDEO_GRABBER)
1431                 errCode = cx231xx_enable_i2c_for_tuner(dev, I2C_3);
1432
1433         return errCode;
1434 }
1435 EXPORT_SYMBOL_GPL(cx231xx_dev_init);
1436
1437 void cx231xx_dev_uninit(struct cx231xx *dev)
1438 {
1439         /* Un Initialize I2C bus */
1440         cx231xx_i2c_unregister(&dev->i2c_bus[2]);
1441         cx231xx_i2c_unregister(&dev->i2c_bus[1]);
1442         cx231xx_i2c_unregister(&dev->i2c_bus[0]);
1443 }
1444 EXPORT_SYMBOL_GPL(cx231xx_dev_uninit);
1445
1446 /*****************************************************************
1447 *              G P I O related functions                         *
1448 ******************************************************************/
1449 int cx231xx_send_gpio_cmd(struct cx231xx *dev, u32 gpio_bit, u8 *gpio_val,
1450                           u8 len, u8 request, u8 direction)
1451 {
1452         int status = 0;
1453         struct VENDOR_REQUEST_IN ven_req;
1454
1455         /* Set wValue */
1456         ven_req.wValue = (u16) (gpio_bit >> 16 & 0xffff);
1457
1458         /* set request */
1459         if (!request) {
1460                 if (direction)
1461                         ven_req.bRequest = VRT_GET_GPIO;        /* 0x8 gpio */
1462                 else
1463                         ven_req.bRequest = VRT_SET_GPIO;        /* 0x9 gpio */
1464         } else {
1465                 if (direction)
1466                         ven_req.bRequest = VRT_GET_GPIE;        /* 0xa gpie */
1467                 else
1468                         ven_req.bRequest = VRT_SET_GPIE;        /* 0xb gpie */
1469         }
1470
1471         /* set index value */
1472         ven_req.wIndex = (u16) (gpio_bit & 0xffff);
1473
1474         /* set wLength value */
1475         ven_req.wLength = len;
1476
1477         /* set bData value */
1478         ven_req.bData = 0;
1479
1480         /* set the buffer for read / write */
1481         ven_req.pBuff = gpio_val;
1482
1483         /* set the direction */
1484         if (direction) {
1485                 ven_req.direction = USB_DIR_IN;
1486                 memset(ven_req.pBuff, 0x00, ven_req.wLength);
1487         } else
1488                 ven_req.direction = USB_DIR_OUT;
1489
1490
1491         /* call common vendor command request */
1492         status = cx231xx_send_vendor_cmd(dev, &ven_req);
1493         if (status < 0) {
1494                 cx231xx_info
1495                     ("UsbInterface::sendCommand, failed with status -%d\n",
1496                      status);
1497         }
1498
1499         return status;
1500 }
1501 EXPORT_SYMBOL_GPL(cx231xx_send_gpio_cmd);
1502
1503 /*****************************************************************
1504  *    C O N T R O L - Register R E A D / W R I T E functions     *
1505  *****************************************************************/
1506 int cx231xx_mode_register(struct cx231xx *dev, u16 address, u32 mode)
1507 {
1508         u8 value[4] = { 0x0, 0x0, 0x0, 0x0 };
1509         u32 tmp = 0;
1510         int status = 0;
1511
1512         status =
1513             cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, address, value, 4);
1514         if (status < 0)
1515                 return status;
1516
1517         tmp = *((u32 *) value);
1518         tmp |= mode;
1519
1520         value[0] = (u8) tmp;
1521         value[1] = (u8) (tmp >> 8);
1522         value[2] = (u8) (tmp >> 16);
1523         value[3] = (u8) (tmp >> 24);
1524
1525         status =
1526             cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, address, value, 4);
1527
1528         return status;
1529 }
1530
1531 /*****************************************************************
1532  *            I 2 C Internal C O N T R O L   functions           *
1533  *****************************************************************/
1534 int cx231xx_read_i2c_master(struct cx231xx *dev, u8 dev_addr, u16 saddr,
1535                           u8 saddr_len, u32 *data, u8 data_len, int master)
1536 {
1537         int status = 0;
1538         struct cx231xx_i2c_xfer_data req_data;
1539         u8 value[64] = "0";
1540
1541         if (saddr_len == 0)
1542                 saddr = 0;
1543         else if (saddr_len == 0)
1544                 saddr &= 0xff;
1545
1546         /* prepare xfer_data struct */
1547         req_data.dev_addr = dev_addr >> 1;
1548         req_data.direction = I2C_M_RD;
1549         req_data.saddr_len = saddr_len;
1550         req_data.saddr_dat = saddr;
1551         req_data.buf_size = data_len;
1552         req_data.p_buffer = (u8 *) value;
1553
1554         /* usb send command */
1555         if (master == 0)
1556                 status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0],
1557                                          &req_data);
1558         else if (master == 1)
1559                 status = dev->cx231xx_send_usb_command(&dev->i2c_bus[1],
1560                                          &req_data);
1561         else if (master == 2)
1562                 status = dev->cx231xx_send_usb_command(&dev->i2c_bus[2],
1563                                          &req_data);
1564
1565         if (status >= 0) {
1566                 /* Copy the data read back to main buffer */
1567                 if (data_len == 1)
1568                         *data = value[0];
1569                 else if (data_len == 4)
1570                         *data =
1571                             value[0] | value[1] << 8 | value[2] << 16 | value[3]
1572                             << 24;
1573                 else if (data_len > 4)
1574                         *data = value[saddr];
1575         }
1576
1577         return status;
1578 }
1579
1580 int cx231xx_write_i2c_master(struct cx231xx *dev, u8 dev_addr, u16 saddr,
1581                            u8 saddr_len, u32 data, u8 data_len, int master)
1582 {
1583         int status = 0;
1584         u8 value[4] = { 0, 0, 0, 0 };
1585         struct cx231xx_i2c_xfer_data req_data;
1586
1587         value[0] = (u8) data;
1588         value[1] = (u8) (data >> 8);
1589         value[2] = (u8) (data >> 16);
1590         value[3] = (u8) (data >> 24);
1591
1592         if (saddr_len == 0)
1593                 saddr = 0;
1594         else if (saddr_len == 0)
1595                 saddr &= 0xff;
1596
1597         /* prepare xfer_data struct */
1598         req_data.dev_addr = dev_addr >> 1;
1599         req_data.direction = 0;
1600         req_data.saddr_len = saddr_len;
1601         req_data.saddr_dat = saddr;
1602         req_data.buf_size = data_len;
1603         req_data.p_buffer = value;
1604
1605         /* usb send command */
1606         if (master == 0)
1607                 status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0],
1608                                  &req_data);
1609         else if (master == 1)
1610                 status = dev->cx231xx_send_usb_command(&dev->i2c_bus[1],
1611                                  &req_data);
1612         else if (master == 2)
1613                 status = dev->cx231xx_send_usb_command(&dev->i2c_bus[2],
1614                                  &req_data);
1615
1616         return status;
1617 }
1618
1619 int cx231xx_read_i2c_data(struct cx231xx *dev, u8 dev_addr, u16 saddr,
1620                           u8 saddr_len, u32 *data, u8 data_len)
1621 {
1622         int status = 0;
1623         struct cx231xx_i2c_xfer_data req_data;
1624         u8 value[4] = { 0, 0, 0, 0 };
1625
1626         if (saddr_len == 0)
1627                 saddr = 0;
1628         else if (saddr_len == 0)
1629                 saddr &= 0xff;
1630
1631         /* prepare xfer_data struct */
1632         req_data.dev_addr = dev_addr >> 1;
1633         req_data.direction = I2C_M_RD;
1634         req_data.saddr_len = saddr_len;
1635         req_data.saddr_dat = saddr;
1636         req_data.buf_size = data_len;
1637         req_data.p_buffer = (u8 *) value;
1638
1639         /* usb send command */
1640         status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0], &req_data);
1641
1642         if (status >= 0) {
1643                 /* Copy the data read back to main buffer */
1644                 if (data_len == 1)
1645                         *data = value[0];
1646                 else
1647                         *data =
1648                             value[0] | value[1] << 8 | value[2] << 16 | value[3]
1649                             << 24;
1650         }
1651
1652         return status;
1653 }
1654
1655 int cx231xx_write_i2c_data(struct cx231xx *dev, u8 dev_addr, u16 saddr,
1656                            u8 saddr_len, u32 data, u8 data_len)
1657 {
1658         int status = 0;
1659         u8 value[4] = { 0, 0, 0, 0 };
1660         struct cx231xx_i2c_xfer_data req_data;
1661
1662         value[0] = (u8) data;
1663         value[1] = (u8) (data >> 8);
1664         value[2] = (u8) (data >> 16);
1665         value[3] = (u8) (data >> 24);
1666
1667         if (saddr_len == 0)
1668                 saddr = 0;
1669         else if (saddr_len == 0)
1670                 saddr &= 0xff;
1671
1672         /* prepare xfer_data struct */
1673         req_data.dev_addr = dev_addr >> 1;
1674         req_data.direction = 0;
1675         req_data.saddr_len = saddr_len;
1676         req_data.saddr_dat = saddr;
1677         req_data.buf_size = data_len;
1678         req_data.p_buffer = value;
1679
1680         /* usb send command */
1681         status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0], &req_data);
1682
1683         return status;
1684 }
1685
1686 int cx231xx_reg_mask_write(struct cx231xx *dev, u8 dev_addr, u8 size,
1687                            u16 register_address, u8 bit_start, u8 bit_end,
1688                            u32 value)
1689 {
1690         int status = 0;
1691         u32 tmp;
1692         u32 mask = 0;
1693         int i;
1694
1695         if (bit_start > (size - 1) || bit_end > (size - 1))
1696                 return -1;
1697
1698         if (size == 8) {
1699                 status =
1700                     cx231xx_read_i2c_data(dev, dev_addr, register_address, 2,
1701                                           &tmp, 1);
1702         } else {
1703                 status =
1704                     cx231xx_read_i2c_data(dev, dev_addr, register_address, 2,
1705                                           &tmp, 4);
1706         }
1707
1708         if (status < 0)
1709                 return status;
1710
1711         mask = 1 << bit_end;
1712         for (i = bit_end; i > bit_start && i > 0; i--)
1713                 mask = mask + (1 << (i - 1));
1714
1715         value <<= bit_start;
1716
1717         if (size == 8) {
1718                 tmp &= ~mask;
1719                 tmp |= value;
1720                 tmp &= 0xff;
1721                 status =
1722                     cx231xx_write_i2c_data(dev, dev_addr, register_address, 2,
1723                                            tmp, 1);
1724         } else {
1725                 tmp &= ~mask;
1726                 tmp |= value;
1727                 status =
1728                     cx231xx_write_i2c_data(dev, dev_addr, register_address, 2,
1729                                            tmp, 4);
1730         }
1731
1732         return status;
1733 }
1734
1735 int cx231xx_read_modify_write_i2c_dword(struct cx231xx *dev, u8 dev_addr,
1736                                         u16 saddr, u32 mask, u32 value)
1737 {
1738         u32 temp;
1739         int status = 0;
1740
1741         status = cx231xx_read_i2c_data(dev, dev_addr, saddr, 2, &temp, 4);
1742
1743         if (status < 0)
1744                 return status;
1745
1746         temp &= ~mask;
1747         temp |= value;
1748
1749         status = cx231xx_write_i2c_data(dev, dev_addr, saddr, 2, temp, 4);
1750
1751         return status;
1752 }
1753
1754 u32 cx231xx_set_field(u32 field_mask, u32 data)
1755 {
1756         u32 temp;
1757
1758         for (temp = field_mask; (temp & 1) == 0; temp >>= 1)
1759                 data <<= 1;
1760
1761         return data;
1762 }