V4L/DVB (11131): cx231xx: avoid trying to access unfilled dev struct
[linux-2.6.git] / drivers / media / video / cx231xx / cx231xx-cards.c
1 /*
2    cx231xx-cards.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/module.h>
25 #include <linux/delay.h>
26 #include <linux/i2c.h>
27 #include <linux/usb.h>
28 #include <media/tuner.h>
29 #include <media/tveeprom.h>
30 #include <media/v4l2-common.h>
31 #include <media/v4l2-chip-ident.h>
32
33 #include <media/cx25840.h>
34 #include "xc5000.h"
35
36 #include "cx231xx.h"
37
38 static int tuner = -1;
39 module_param(tuner, int, 0444);
40 MODULE_PARM_DESC(tuner, "tuner type");
41
42 static unsigned int disable_ir;
43 module_param(disable_ir, int, 0444);
44 MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
45
46 /* Bitmask marking allocated devices from 0 to CX231XX_MAXBOARDS */
47 static unsigned long cx231xx_devused;
48
49 /*
50  *  Reset sequences for analog/digital modes
51  */
52
53 static struct cx231xx_reg_seq RDE250_XCV_TUNER[] = {
54         {0x03, 0x01, 10},
55         {0x03, 0x00, 30},
56         {0x03, 0x01, 10},
57         {-1, -1, -1},
58 };
59
60 /*
61  *  Board definitions
62  */
63 struct cx231xx_board cx231xx_boards[] = {
64         [CX231XX_BOARD_UNKNOWN] = {
65                 .name = "Unknown CX231xx video grabber",
66                 .tuner_type = TUNER_ABSENT,
67                 .input = {{
68                                 .type = CX231XX_VMUX_TELEVISION,
69                                 .vmux = CX231XX_VIN_3_1,
70                                 .amux = CX231XX_AMUX_VIDEO,
71                                 .gpio = 0,
72                         }, {
73                                 .type = CX231XX_VMUX_COMPOSITE1,
74                                 .vmux = CX231XX_VIN_2_1,
75                                 .amux = CX231XX_AMUX_LINE_IN,
76                                 .gpio = 0,
77                         }, {
78                                 .type = CX231XX_VMUX_SVIDEO,
79                                 .vmux = CX231XX_VIN_1_1 |
80                                         (CX231XX_VIN_1_2 << 8) |
81                                         CX25840_SVIDEO_ON,
82                                 .amux = CX231XX_AMUX_LINE_IN,
83                                 .gpio = 0,
84                         }
85                 },
86         },
87         [CX231XX_BOARD_CNXT_RDE_250] = {
88                 .name = "Conexant Hybrid TV - RDE250",
89                 .tuner_type = TUNER_XC5000,
90                 .tuner_addr = 0x61,
91                 .tuner_gpio = RDE250_XCV_TUNER,
92                 .tuner_sif_gpio = 0x05,
93                 .tuner_scl_gpio = 0x1a,
94                 .tuner_sda_gpio = 0x1b,
95                 .decoder = CX231XX_AVDECODER,
96                 .demod_xfer_mode = 0,
97                 .ctl_pin_status_mask = 0xFFFFFFC4,
98                 .agc_analog_digital_select_gpio = 0x0c,
99                 .gpio_pin_status_mask = 0x4001000,
100                 .tuner_i2c_master = 1,
101                 .demod_i2c_master = 2,
102                 .has_dvb = 1,
103                 .demod_addr = 0x02,
104                 .norm = V4L2_STD_PAL,
105
106                 .input = {{
107                                 .type = CX231XX_VMUX_TELEVISION,
108                                 .vmux = CX231XX_VIN_3_1,
109                                 .amux = CX231XX_AMUX_VIDEO,
110                                 .gpio = 0,
111                         }, {
112                                 .type = CX231XX_VMUX_COMPOSITE1,
113                                 .vmux = CX231XX_VIN_2_1,
114                                 .amux = CX231XX_AMUX_LINE_IN,
115                                 .gpio = 0,
116                         }, {
117                                 .type = CX231XX_VMUX_SVIDEO,
118                                 .vmux = CX231XX_VIN_1_1 |
119                                         (CX231XX_VIN_1_2 << 8) |
120                                         CX25840_SVIDEO_ON,
121                                 .amux = CX231XX_AMUX_LINE_IN,
122                                 .gpio = 0,
123                         }
124                 },
125         },
126
127         [CX231XX_BOARD_CNXT_RDU_250] = {
128                 .name = "Conexant Hybrid TV - RDU250",
129                 .tuner_type = TUNER_XC5000,
130                 .tuner_addr = 0x61,
131                 .tuner_gpio = RDE250_XCV_TUNER,
132                 .tuner_sif_gpio = 0x05,
133                 .tuner_scl_gpio = 0x1a,
134                 .tuner_sda_gpio = 0x1b,
135                 .decoder = CX231XX_AVDECODER,
136                 .demod_xfer_mode = 0,
137                 .ctl_pin_status_mask = 0xFFFFFFC4,
138                 .agc_analog_digital_select_gpio = 0x0c,
139                 .gpio_pin_status_mask = 0x4001000,
140                 .tuner_i2c_master = 1,
141                 .demod_i2c_master = 2,
142                 .has_dvb = 1,
143                 .demod_addr = 0x32,
144                 .norm = V4L2_STD_NTSC,
145
146                 .input = {{
147                                 .type = CX231XX_VMUX_TELEVISION,
148                                 .vmux = CX231XX_VIN_3_1,
149                                 .amux = CX231XX_AMUX_VIDEO,
150                                 .gpio = 0,
151                         }, {
152                                 .type = CX231XX_VMUX_COMPOSITE1,
153                                 .vmux = CX231XX_VIN_2_1,
154                                 .amux = CX231XX_AMUX_LINE_IN,
155                                 .gpio = 0,
156                         }, {
157                                 .type = CX231XX_VMUX_SVIDEO,
158                                 .vmux = CX231XX_VIN_1_1 |
159                                         (CX231XX_VIN_1_2 << 8) |
160                                         CX25840_SVIDEO_ON,
161                                 .amux = CX231XX_AMUX_LINE_IN,
162                                 .gpio = 0,
163                         }
164                 },
165         },
166 };
167 const unsigned int cx231xx_bcount = ARRAY_SIZE(cx231xx_boards);
168
169 /* table of devices that work with this driver */
170 struct usb_device_id cx231xx_id_table[] = {
171         {USB_DEVICE(0x0572, 0x5A3C),
172          .driver_info = CX231XX_BOARD_UNKNOWN},
173         {USB_DEVICE(0x0572, 0x58A2),
174          .driver_info = CX231XX_BOARD_CNXT_RDE_250},
175         {USB_DEVICE(0x0572, 0x58A1),
176          .driver_info = CX231XX_BOARD_CNXT_RDU_250},
177         {},
178 };
179
180 MODULE_DEVICE_TABLE(usb, cx231xx_id_table);
181
182 /* cx231xx_tuner_callback
183  * will be used to reset XC5000 tuner using GPIO pin
184  */
185
186 int cx231xx_tuner_callback(void *ptr, int component, int command, int arg)
187 {
188         int rc = 0;
189         struct cx231xx *dev = ptr;
190
191         if (dev->tuner_type == TUNER_XC5000) {
192                 if (command == XC5000_TUNER_RESET) {
193                         cx231xx_info
194                                 ("Tuner CB: RESET: cmd %d : tuner type %d \n",
195                                  command, dev->tuner_type);
196                         cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
197                                                1);
198                         msleep(10);
199                         cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
200                                                0);
201                         msleep(330);
202                         cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit,
203                                                1);
204                         msleep(10);
205                 }
206         }
207         return rc;
208 }
209 EXPORT_SYMBOL_GPL(cx231xx_tuner_callback);
210
211 static inline void cx231xx_set_model(struct cx231xx *dev)
212 {
213         memcpy(&dev->board, &cx231xx_boards[dev->model], sizeof(dev->board));
214 }
215
216 /* Since cx231xx_pre_card_setup() requires a proper dev->model,
217  * this won't work for boards with generic PCI IDs
218  */
219 void cx231xx_pre_card_setup(struct cx231xx *dev)
220 {
221
222         cx231xx_set_model(dev);
223
224         cx231xx_info("Identified as %s (card=%d)\n",
225                      dev->board.name, dev->model);
226
227         cx231xx_info("Precard: Board is %s\n", dev->board.name);
228         /* set the direction for GPIO pins */
229         cx231xx_set_gpio_direction(dev, dev->board.tuner_gpio->bit, 1);
230         cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit, 1);
231         cx231xx_set_gpio_direction(dev, dev->board.tuner_sif_gpio, 1);
232
233         /* request some modules if any required */
234
235         /* reset the Tuner */
236         cx231xx_gpio_set(dev, dev->board.tuner_gpio);
237
238         /* set the mode to Analog mode initially */
239         cx231xx_set_mode(dev, CX231XX_ANALOG_MODE);
240
241         /* Unlock device */
242         /* cx231xx_set_mode(dev, CX231XX_SUSPEND); */
243
244 }
245
246 static void cx231xx_config_tuner(struct cx231xx *dev)
247 {
248         struct tuner_setup tun_setup;
249         struct v4l2_frequency f;
250
251         if (dev->tuner_type == TUNER_ABSENT)
252                 return;
253
254         tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
255         tun_setup.type = dev->tuner_type;
256         tun_setup.addr = dev->tuner_addr;
257         tun_setup.tuner_callback = cx231xx_tuner_callback;
258
259         tuner_call(dev, tuner, s_type_addr, &tun_setup);
260
261 #if 0
262         if (tun_setup.type == TUNER_XC5000) {
263                 static struct xc2028_ctrl ctrl = {
264                         .fname = XC5000_DEFAULT_FIRMWARE,
265                         .max_len = 64,
266                         .demod = 0;
267                 };
268                 struct v4l2_priv_tun_config cfg = {
269                         .tuner = dev->tuner_type,
270                         .priv = &ctrl,
271                 };
272                 tuner_call(dev, tuner, s_config, &cfg);
273         }
274 #endif
275         /* configure tuner */
276         f.tuner = 0;
277         f.type = V4L2_TUNER_ANALOG_TV;
278         f.frequency = 9076;     /* just a magic number */
279         dev->ctl_freq = f.frequency;
280         call_all(dev, tuner, s_frequency, &f);
281
282 }
283
284 /* ----------------------------------------------------------------------- */
285 void cx231xx_set_ir(struct cx231xx *dev, struct IR_i2c *ir)
286 {
287         if (disable_ir) {
288                 ir->get_key = NULL;
289                 return;
290         }
291
292         /* detect & configure */
293         switch (dev->model) {
294
295         case CX231XX_BOARD_CNXT_RDE_250:
296                 break;
297         case CX231XX_BOARD_CNXT_RDU_250:
298                 break;
299         default:
300                 break;
301         }
302 }
303
304 void cx231xx_card_setup(struct cx231xx *dev)
305 {
306
307         cx231xx_set_model(dev);
308
309         dev->tuner_type = cx231xx_boards[dev->model].tuner_type;
310         if (cx231xx_boards[dev->model].tuner_addr)
311                 dev->tuner_addr = cx231xx_boards[dev->model].tuner_addr;
312
313         cx231xx_info(": tuner type %d, tuner address %d \n",
314                      dev->tuner_type, dev->tuner_addr);
315
316         /* Do card specific if any */
317         switch (dev->model) {
318         case CX231XX_BOARD_CNXT_RDE_250:
319                 /* do card specific GPIO settings if required */
320                 cx231xx_info("Board is Conexant RDE 250\n");
321                 break;
322         case CX231XX_BOARD_CNXT_RDU_250:
323                 /* do card specific GPIO settings if required */
324                 cx231xx_info("Board is Conexant RDU 250\n");
325                 break;
326         }
327
328         /* request some modules */
329         if (dev->board.decoder == CX231XX_AVDECODER) {
330                 cx231xx_info(": Requesting cx25840 module\n");
331                 dev->sd_cx25840 =
332                         v4l2_i2c_new_subdev(&dev->i2c_bus[0].i2c_adap,
333                                 "cx25840", "cx25840", 0x88 >> 1);
334                 if (dev->sd_cx25840 == NULL)
335                         cx231xx_info("cx25840 subdev registration failure\n");
336                 cx25840_call(dev, core, init, 0);
337
338         }
339
340         if (dev->board.tuner_type != TUNER_ABSENT) {
341                 cx231xx_info(": Requesting Tuner module\n");
342                 dev->sd_tuner =
343                         v4l2_i2c_new_subdev(&dev->i2c_bus[1].i2c_adap,
344                                 "tuner", "tuner", 0xc2 >> 1);
345                 if (dev->sd_tuner == NULL)
346                         cx231xx_info("tuner subdev registration failure\n");
347
348                 cx231xx_config_tuner(dev);
349         }
350
351         cx231xx_config_tuner(dev);
352
353 #if 0
354         /* TBD  IR will be added later */
355         cx231xx_ir_init(dev);
356 #endif
357 }
358
359 /*
360  * cx231xx_config()
361  * inits registers with sane defaults
362  */
363 int cx231xx_config(struct cx231xx *dev)
364 {
365         /* TBD need to add cx231xx specific code */
366         dev->mute = 1;          /* maybe not the right place... */
367         dev->volume = 0x1f;
368
369         return 0;
370 }
371
372 /*
373  * cx231xx_config_i2c()
374  * configure i2c attached devices
375  */
376 void cx231xx_config_i2c(struct cx231xx *dev)
377 {
378         struct v4l2_routing route;
379
380         route.input = INPUT(dev->video_input)->vmux;
381         route.output = 0;
382
383         call_all(dev, video, s_stream, 1);
384 }
385
386 /*
387  * cx231xx_realease_resources()
388  * unregisters the v4l2,i2c and usb devices
389  * called when the device gets disconected or at module unload
390 */
391 void cx231xx_release_resources(struct cx231xx *dev)
392 {
393
394 #if 0           /* TBD IR related  */
395         if (dev->ir)
396                 cx231xx_ir_fini(dev);
397 #endif
398
399         cx231xx_release_analog_resources(dev);
400
401         cx231xx_remove_from_devlist(dev);
402
403         cx231xx_dev_uninit(dev);
404
405         usb_put_dev(dev->udev);
406
407         /* Mark device as unused */
408         cx231xx_devused &= ~(1 << dev->devno);
409 }
410
411 /*
412  * cx231xx_init_dev()
413  * allocates and inits the device structs, registers i2c bus and v4l device
414  */
415 static int cx231xx_init_dev(struct cx231xx **devhandle, struct usb_device *udev,
416                             int minor)
417 {
418         struct cx231xx *dev = *devhandle;
419         int retval = -ENOMEM;
420         int errCode;
421         unsigned int maxh, maxw;
422
423         dev->udev = udev;
424         mutex_init(&dev->lock);
425         mutex_init(&dev->ctrl_urb_lock);
426         mutex_init(&dev->gpio_i2c_lock);
427
428         spin_lock_init(&dev->video_mode.slock);
429         spin_lock_init(&dev->vbi_mode.slock);
430         spin_lock_init(&dev->sliced_cc_mode.slock);
431
432         init_waitqueue_head(&dev->open);
433         init_waitqueue_head(&dev->wait_frame);
434         init_waitqueue_head(&dev->wait_stream);
435
436         dev->cx231xx_read_ctrl_reg = cx231xx_read_ctrl_reg;
437         dev->cx231xx_write_ctrl_reg = cx231xx_write_ctrl_reg;
438         dev->cx231xx_send_usb_command = cx231xx_send_usb_command;
439         dev->cx231xx_gpio_i2c_read = cx231xx_gpio_i2c_read;
440         dev->cx231xx_gpio_i2c_write = cx231xx_gpio_i2c_write;
441
442         /* Query cx231xx to find what pcb config it is related to */
443         initialize_cx231xx(dev);
444
445         /* Cx231xx pre card setup */
446         cx231xx_pre_card_setup(dev);
447
448         errCode = cx231xx_config(dev);
449         if (errCode) {
450                 cx231xx_errdev("error configuring device\n");
451                 return -ENOMEM;
452         }
453
454         /* set default norm */
455         dev->norm = dev->board.norm;
456
457         /* register i2c bus */
458         errCode = cx231xx_dev_init(dev);
459         if (errCode < 0) {
460                 cx231xx_errdev("%s: cx231xx_i2c_register - errCode [%d]!\n",
461                                __func__, errCode);
462                 return errCode;
463         }
464
465         /* Do board specific init */
466         cx231xx_card_setup(dev);
467
468         /* configure the device */
469         cx231xx_config_i2c(dev);
470
471         maxw = norm_maxw(dev);
472         maxh = norm_maxh(dev);
473
474         /* set default image size */
475         dev->width = maxw;
476         dev->height = maxh;
477         dev->interlaced = 0;
478         dev->hscale = 0;
479         dev->vscale = 0;
480         dev->video_input = 0;
481
482         errCode = cx231xx_config(dev);
483         if (errCode < 0) {
484                 cx231xx_errdev("%s: cx231xx_config - errCode [%d]!\n",
485                                __func__, errCode);
486                 return errCode;
487         }
488
489         /* init video dma queues */
490         INIT_LIST_HEAD(&dev->video_mode.vidq.active);
491         INIT_LIST_HEAD(&dev->video_mode.vidq.queued);
492
493         /* init vbi dma queues */
494         INIT_LIST_HEAD(&dev->vbi_mode.vidq.active);
495         INIT_LIST_HEAD(&dev->vbi_mode.vidq.queued);
496
497         /* Reset other chips required if they are tied up with GPIO pins */
498
499         cx231xx_add_into_devlist(dev);
500
501         retval = cx231xx_register_analog_devices(dev);
502         if (retval < 0) {
503                 cx231xx_release_resources(dev);
504                 goto fail_reg_devices;
505         }
506
507         cx231xx_init_extension(dev);
508
509         return 0;
510
511 fail_reg_devices:
512         mutex_unlock(&dev->lock);
513         return retval;
514 }
515
516 #if defined(CONFIG_MODULES) && defined(MODULE)
517 static void request_module_async(struct work_struct *work)
518 {
519         struct cx231xx *dev = container_of(work,
520                                            struct cx231xx, request_module_wk);
521
522         if (dev->has_alsa_audio)
523                 request_module("cx231xx-alsa");
524
525         if (dev->board.has_dvb)
526                 request_module("cx231xx-dvb");
527
528 }
529
530 static void request_modules(struct cx231xx *dev)
531 {
532         INIT_WORK(&dev->request_module_wk, request_module_async);
533         schedule_work(&dev->request_module_wk);
534 }
535 #else
536 #define request_modules(dev)
537 #endif /* CONFIG_MODULES */
538
539 /*
540  * cx231xx_usb_probe()
541  * checks for supported devices
542  */
543 static int cx231xx_usb_probe(struct usb_interface *interface,
544                              const struct usb_device_id *id)
545 {
546         struct usb_device *udev;
547         struct usb_interface *uif;
548         struct cx231xx *dev = NULL;
549         int retval = -ENODEV;
550         int nr = 0, ifnum;
551         int i, isoc_pipe = 0;
552         char *speed;
553         char descr[255] = "";
554         struct usb_interface *lif = NULL;
555         int skip_interface = 0;
556         struct usb_interface_assoc_descriptor *assoc_desc;
557
558         udev = usb_get_dev(interface_to_usbdev(interface));
559         ifnum = interface->altsetting[0].desc.bInterfaceNumber;
560
561         printk(DRIVER_NAME ": Interface Number %d\n", ifnum);
562
563         /* Interface number 0 - IR interface */
564         if (ifnum == 0) {
565                 /* Check to see next free device and mark as used */
566                 nr = find_first_zero_bit(&cx231xx_devused, CX231XX_MAXBOARDS);
567                 cx231xx_devused |= 1 << nr;
568
569                 if (nr >= CX231XX_MAXBOARDS) {
570                         cx231xx_err(DRIVER_NAME ": Supports only %i cx231xx boards.\n",
571                                      CX231XX_MAXBOARDS);
572                         cx231xx_devused &= ~(1 << nr);
573                         return -ENOMEM;
574                 }
575
576                 /* allocate memory for our device state and initialize it */
577                 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
578                 if (dev == NULL) {
579                         cx231xx_err(DRIVER_NAME ": out of memory!\n");
580                         cx231xx_devused &= ~(1 << nr);
581                         return -ENOMEM;
582                 }
583
584                 snprintf(dev->name, 29, "cx231xx #%d", nr);
585                 dev->devno = nr;
586                 dev->model = id->driver_info;
587                 dev->video_mode.alt = -1;
588                 dev->interface_count++;
589
590                 /* reset gpio dir and value */
591                 dev->gpio_dir = 0;
592                 dev->gpio_val = 0;
593                 dev->xc_fw_load_done = 0;
594                 dev->has_alsa_audio = 1;
595                 dev->power_mode = -1;
596
597                 /* 0 - vbi ; 1 -sliced cc mode */
598                 dev->vbi_or_sliced_cc_mode = 0;
599
600                 /* get maximum no.of IAD interfaces */
601                 assoc_desc = udev->actconfig->intf_assoc[0];
602                 dev->max_iad_interface_count = assoc_desc->bInterfaceCount;
603                 cx231xx_info("Found IAD interface count %d\n",
604                              dev->max_iad_interface_count);
605
606                 /* init CIR module TBD */
607
608                 /* store the current interface */
609                 lif = interface;
610
611         } else if (ifnum == 1) {
612
613                 /* Get dev structure first */
614                 dev = usb_get_intfdata(udev->actconfig->interface[0]);
615                 if (dev == NULL) {
616                         cx231xx_err(DRIVER_NAME ": out of first interface!\n");
617                         return -ENODEV;
618                 }
619
620                 /* store the interface 0 back */
621                 lif = udev->actconfig->interface[0];
622
623                 /* increment interface count */
624                 dev->interface_count++;
625
626                 /* get device number */
627                 nr = dev->devno;
628
629                 assoc_desc = udev->actconfig->intf_assoc[0];
630                 if (assoc_desc->bFirstInterface == ifnum) {
631                         cx231xx_info
632                         ("Found IAD interface match: AV Desc Start!! \n");
633                 } else {
634                         cx231xx_err(" Not found matching interface\n");
635                         return -ENODEV;
636                 }
637
638         } else if (ifnum >= 2) {
639                 /* Get dev structure first */
640                 dev = usb_get_intfdata(udev->actconfig->interface[0]);
641                 if (dev == NULL) {
642                         cx231xx_err(DRIVER_NAME ": out of first interface!\n");
643                         return -ENODEV;
644                 }
645
646                 /* store the interface 0 back */
647                 lif = udev->actconfig->interface[0];
648
649                 /* increment interface count */
650                 dev->interface_count++;
651
652                 /* get device number */
653                 nr = dev->devno;
654
655                 /* set skip interface */
656                 if ((dev->interface_count - 1) != dev->max_iad_interface_count)
657                         skip_interface = 1;     /* set skipping */
658                 else {
659                         cx231xx_info
660                         ("Found IAD interface no. match with AV Device no.!\n");
661                 }
662         }
663
664         switch (udev->speed) {
665         case USB_SPEED_LOW:
666                 speed = "1.5";
667                 break;
668         case USB_SPEED_UNKNOWN:
669         case USB_SPEED_FULL:
670                 speed = "12";
671                 break;
672         case USB_SPEED_HIGH:
673                 speed = "480";
674                 break;
675         default:
676                 speed = "unknown";
677         }
678
679         if (udev->manufacturer)
680                 strlcpy(descr, udev->manufacturer, sizeof(descr));
681
682         if (udev->product) {
683                 if (*descr)
684                         strlcat(descr, " ", sizeof(descr));
685                 strlcat(descr, udev->product, sizeof(descr));
686         }
687         if (*descr)
688                 strlcat(descr, " ", sizeof(descr));
689
690         cx231xx_info("New device %s@ %s Mbps "
691                      "(%04x:%04x, interface %d, class %d)\n",
692                      descr,
693                      speed,
694                      le16_to_cpu(udev->descriptor.idVendor),
695                      le16_to_cpu(udev->descriptor.idProduct),
696                      ifnum, interface->altsetting->desc.bInterfaceNumber);
697
698         /* AV device initialization */
699         if ((dev->interface_count - 1) == dev->max_iad_interface_count) {
700                 cx231xx_info(" Calling init_dev\n");
701
702                 /* Create v4l2 device */
703                 snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name),
704                                         "%s-%03d", "cx231xx", nr);
705                 retval = v4l2_device_register(&udev->dev, &dev->v4l2_dev);
706                 if (retval) {
707                         printk(KERN_ERR "%s() v4l2_device_register failed\n",
708                                __func__);
709                         cx231xx_devused &= ~(1 << nr);
710                         kfree(dev);
711                         return -EIO;
712                 }
713
714                 /* allocate device struct */
715                 retval = cx231xx_init_dev(&dev, udev, nr);
716                 if (retval) {
717                         cx231xx_devused &= ~(1 << dev->devno);
718                         v4l2_device_unregister(&dev->v4l2_dev);
719                         kfree(dev);
720                         return retval;
721                 }
722
723                 /* compute alternate max packet sizes for video */
724                 uif =
725                     udev->actconfig->interface[dev->current_pcb_config.
726                                                hs_config_info[0].interface_info.
727                                                video_index + 1];
728
729                 dev->video_mode.end_point_addr =
730                     le16_to_cpu(uif->altsetting[0].endpoint[isoc_pipe].desc.
731                                 bEndpointAddress);
732
733                 dev->video_mode.num_alt = uif->num_altsetting;
734                 cx231xx_info(": EndPoint Addr 0x%x, Alternate settings: %i\n",
735                              dev->video_mode.end_point_addr,
736                              dev->video_mode.num_alt);
737                 dev->video_mode.alt_max_pkt_size =
738                     kmalloc(32 * dev->video_mode.num_alt, GFP_KERNEL);
739
740                 if (dev->video_mode.alt_max_pkt_size == NULL) {
741                         cx231xx_errdev("out of memory!\n");
742                         cx231xx_devused &= ~(1 << nr);
743                         v4l2_device_unregister(&dev->v4l2_dev);
744                         kfree(dev);
745                         return -ENOMEM;
746                 }
747
748                 for (i = 0; i < dev->video_mode.num_alt; i++) {
749                         u16 tmp =
750                             le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
751                                         desc.wMaxPacketSize);
752                         dev->video_mode.alt_max_pkt_size[i] =
753                             (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
754                         cx231xx_info("Alternate setting %i, max size= %i\n", i,
755                                      dev->video_mode.alt_max_pkt_size[i]);
756                 }
757
758                 /* compute alternate max packet sizes for vbi */
759                 uif =
760                     udev->actconfig->interface[dev->current_pcb_config.
761                                                hs_config_info[0].interface_info.
762                                                vanc_index + 1];
763
764                 dev->vbi_mode.end_point_addr =
765                     le16_to_cpu(uif->altsetting[0].endpoint[isoc_pipe].desc.
766                                 bEndpointAddress);
767
768                 dev->vbi_mode.num_alt = uif->num_altsetting;
769                 cx231xx_info(": EndPoint Addr 0x%x, Alternate settings: %i\n",
770                              dev->vbi_mode.end_point_addr,
771                              dev->vbi_mode.num_alt);
772                 dev->vbi_mode.alt_max_pkt_size =
773                     kmalloc(32 * dev->vbi_mode.num_alt, GFP_KERNEL);
774
775                 if (dev->vbi_mode.alt_max_pkt_size == NULL) {
776                         cx231xx_errdev("out of memory!\n");
777                         cx231xx_devused &= ~(1 << nr);
778                         v4l2_device_unregister(&dev->v4l2_dev);
779                         kfree(dev);
780                         return -ENOMEM;
781                 }
782
783                 for (i = 0; i < dev->vbi_mode.num_alt; i++) {
784                         u16 tmp =
785                             le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
786                                         desc.wMaxPacketSize);
787                         dev->vbi_mode.alt_max_pkt_size[i] =
788                             (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
789                         cx231xx_info("Alternate setting %i, max size= %i\n", i,
790                                      dev->vbi_mode.alt_max_pkt_size[i]);
791                 }
792
793                 /* compute alternate max packet sizes for sliced CC */
794                 uif =
795                     udev->actconfig->interface[dev->current_pcb_config.
796                                                hs_config_info[0].interface_info.
797                                                hanc_index + 1];
798
799                 dev->sliced_cc_mode.end_point_addr =
800                     le16_to_cpu(uif->altsetting[0].endpoint[isoc_pipe].desc.
801                                 bEndpointAddress);
802
803                 dev->sliced_cc_mode.num_alt = uif->num_altsetting;
804                 cx231xx_info(": EndPoint Addr 0x%x, Alternate settings: %i\n",
805                              dev->sliced_cc_mode.end_point_addr,
806                              dev->sliced_cc_mode.num_alt);
807                 dev->sliced_cc_mode.alt_max_pkt_size =
808                     kmalloc(32 * dev->sliced_cc_mode.num_alt, GFP_KERNEL);
809
810                 if (dev->sliced_cc_mode.alt_max_pkt_size == NULL) {
811                         cx231xx_errdev("out of memory!\n");
812                         cx231xx_devused &= ~(1 << nr);
813                         v4l2_device_unregister(&dev->v4l2_dev);
814                         kfree(dev);
815                         return -ENOMEM;
816                 }
817
818                 for (i = 0; i < dev->sliced_cc_mode.num_alt; i++) {
819                         u16 tmp =
820                             le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].
821                                         desc.wMaxPacketSize);
822                         dev->sliced_cc_mode.alt_max_pkt_size[i] =
823                             (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
824                         cx231xx_info("Alternate setting %i, max size= %i\n", i,
825                                      dev->sliced_cc_mode.alt_max_pkt_size[i]);
826                 }
827
828                 if (dev->current_pcb_config.ts1_source != 0xff) {
829
830                         /* compute alternate max packet sizes for TS1 */
831                         uif =
832                             udev->actconfig->interface[dev->current_pcb_config.
833                                                        hs_config_info[0].
834                                                        interface_info.
835                                                        ts1_index + 1];
836
837                         dev->ts1_mode.end_point_addr =
838                             le16_to_cpu(uif->altsetting[0].endpoint[isoc_pipe].
839                                         desc.bEndpointAddress);
840
841                         dev->ts1_mode.num_alt = uif->num_altsetting;
842                         cx231xx_info
843                             (": EndPoint Addr 0x%x, Alternate settings: %i\n",
844                              dev->ts1_mode.end_point_addr,
845                              dev->ts1_mode.num_alt);
846                         dev->ts1_mode.alt_max_pkt_size =
847                             kmalloc(32 * dev->ts1_mode.num_alt, GFP_KERNEL);
848
849                         if (dev->ts1_mode.alt_max_pkt_size == NULL) {
850                                 cx231xx_errdev("out of memory!\n");
851                                 cx231xx_devused &= ~(1 << nr);
852                                 v4l2_device_unregister(&dev->v4l2_dev);
853                                 kfree(dev);
854                                 return -ENOMEM;
855                         }
856
857                         for (i = 0; i < dev->ts1_mode.num_alt; i++) {
858                                 u16 tmp =
859                                     le16_to_cpu(uif->altsetting[i].
860                                                 endpoint[isoc_pipe].desc.
861                                                 wMaxPacketSize);
862                                 dev->ts1_mode.alt_max_pkt_size[i] =
863                                     (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) +
864                                                       1);
865                                 cx231xx_info
866                                     ("Alternate setting %i, max size= %i\n", i,
867                                      dev->ts1_mode.alt_max_pkt_size[i]);
868                         }
869                 }
870
871         }
872
873         /* save our data pointer in this interface device */
874         usb_set_intfdata(lif, dev);
875
876         /* load other modules required */
877         if ((dev->interface_count - 1) == dev->max_iad_interface_count) {
878                 cx231xx_info("Calling request modules\n");
879                 request_modules(dev);
880         }
881
882         if (skip_interface) {
883                 cx231xx_info("Skipping the interface\n");
884                 return -ENODEV;
885         }
886
887         return 0;
888 }
889
890 /*
891  * cx231xx_usb_disconnect()
892  * called when the device gets diconencted
893  * video device will be unregistered on v4l2_close in case it is still open
894  */
895 static void cx231xx_usb_disconnect(struct usb_interface *interface)
896 {
897         struct cx231xx *dev;
898
899         dev = usb_get_intfdata(interface);
900         usb_set_intfdata(interface, NULL);
901
902         if (!dev)
903                 return;
904
905         /* delete v4l2 device */
906         v4l2_device_unregister(&dev->v4l2_dev);
907
908         /* wait until all current v4l2 io is finished then deallocate
909            resources */
910         mutex_lock(&dev->lock);
911
912         wake_up_interruptible_all(&dev->open);
913
914         if (dev->users) {
915                 cx231xx_warn
916                     ("device /dev/video%d is open! Deregistration and memory "
917                      "deallocation are deferred on close.\n", dev->vdev->num);
918
919                 dev->state |= DEV_MISCONFIGURED;
920                 cx231xx_uninit_isoc(dev);
921                 dev->state |= DEV_DISCONNECTED;
922                 wake_up_interruptible(&dev->wait_frame);
923                 wake_up_interruptible(&dev->wait_stream);
924         } else {
925                 dev->state |= DEV_DISCONNECTED;
926                 cx231xx_release_resources(dev);
927         }
928
929         cx231xx_close_extension(dev);
930
931         mutex_unlock(&dev->lock);
932
933         if (!dev->users) {
934                 kfree(dev->video_mode.alt_max_pkt_size);
935                 kfree(dev->vbi_mode.alt_max_pkt_size);
936                 kfree(dev->sliced_cc_mode.alt_max_pkt_size);
937                 kfree(dev->ts1_mode.alt_max_pkt_size);
938                 kfree(dev);
939         }
940 }
941
942 static struct usb_driver cx231xx_usb_driver = {
943         .name = "cx231xx",
944         .probe = cx231xx_usb_probe,
945         .disconnect = cx231xx_usb_disconnect,
946         .id_table = cx231xx_id_table,
947 };
948
949 static int __init cx231xx_module_init(void)
950 {
951         int result;
952
953         printk(KERN_INFO DRIVER_NAME " v4l2 driver loaded.\n");
954
955         /* register this driver with the USB subsystem */
956         result = usb_register(&cx231xx_usb_driver);
957         if (result)
958                 cx231xx_err(DRIVER_NAME
959                             " usb_register failed. Error number %d.\n", result);
960
961         return result;
962 }
963
964 static void __exit cx231xx_module_exit(void)
965 {
966         /* deregister this driver with the USB subsystem */
967         usb_deregister(&cx231xx_usb_driver);
968 }
969
970 module_init(cx231xx_module_init);
971 module_exit(cx231xx_module_exit);