Lines Matching refs:gspca_dev
66 static void PDEBUG_MODE(struct gspca_dev *gspca_dev, int debug, char *txt, in PDEBUG_MODE() argument
121 struct gspca_dev *gspca_dev = (struct gspca_dev *) urb->context; in int_irq() local
127 if (gspca_dev->sd_desc->int_pkt_scan(gspca_dev, in int_irq()
155 static int gspca_input_connect(struct gspca_dev *dev) in gspca_input_connect()
192 static int alloc_and_submit_int_urb(struct gspca_dev *gspca_dev, in alloc_and_submit_int_urb() argument
208 dev = gspca_dev->dev; in alloc_and_submit_int_urb()
225 int_irq, (void *)gspca_dev, interval); in alloc_and_submit_int_urb()
232 gspca_dev->int_urb = urb; in alloc_and_submit_int_urb()
246 static void gspca_input_create_urb(struct gspca_dev *gspca_dev) in gspca_input_create_urb() argument
253 if (gspca_dev->sd_desc->int_pkt_scan) { in gspca_input_create_urb()
254 intf = usb_ifnum_to_if(gspca_dev->dev, gspca_dev->iface); in gspca_input_create_urb()
261 alloc_and_submit_int_urb(gspca_dev, ep); in gspca_input_create_urb()
268 static void gspca_input_destroy_urb(struct gspca_dev *gspca_dev) in gspca_input_destroy_urb() argument
272 urb = gspca_dev->int_urb; in gspca_input_destroy_urb()
274 gspca_dev->int_urb = NULL; in gspca_input_destroy_urb()
276 usb_free_coherent(gspca_dev->dev, in gspca_input_destroy_urb()
284 static inline void gspca_input_destroy_urb(struct gspca_dev *gspca_dev) in gspca_input_destroy_urb() argument
288 static inline void gspca_input_create_urb(struct gspca_dev *gspca_dev) in gspca_input_create_urb() argument
292 static inline int gspca_input_connect(struct gspca_dev *dev) in gspca_input_connect()
301 static void fill_frame(struct gspca_dev *gspca_dev, in fill_frame() argument
312 if (gspca_dev->frozen) in fill_frame()
319 pkt_scan = gspca_dev->sd_desc->pkt_scan; in fill_frame()
328 gspca_dev->last_packet_type = DISCARD_PACKET; in fill_frame()
332 if (gspca_dev->empty_packet == 0) in fill_frame()
333 gspca_dev->empty_packet = 1; in fill_frame()
342 pkt_scan(gspca_dev, data, len); in fill_frame()
359 struct gspca_dev *gspca_dev = (struct gspca_dev *) urb->context; in isoc_irq() local
362 if (!gspca_dev->streaming) in isoc_irq()
364 fill_frame(gspca_dev, urb); in isoc_irq()
372 struct gspca_dev *gspca_dev = (struct gspca_dev *) urb->context; in bulk_irq() local
376 if (!gspca_dev->streaming) in bulk_irq()
385 if (gspca_dev->frozen) in bulk_irq()
394 gspca_dev->sd_desc->pkt_scan(gspca_dev, in bulk_irq()
400 if (gspca_dev->cam.bulk_nurbs != 0) { in bulk_irq()
418 void gspca_frame_add(struct gspca_dev *gspca_dev, in gspca_frame_add() argument
429 i = atomic_read(&gspca_dev->fr_i); in gspca_frame_add()
432 if (i == atomic_read(&gspca_dev->fr_q)) { in gspca_frame_add()
433 gspca_dev->last_packet_type = DISCARD_PACKET; in gspca_frame_add()
434 gspca_dev->sequence++; in gspca_frame_add()
437 j = gspca_dev->fr_queue[i]; in gspca_frame_add()
438 frame = &gspca_dev->frame[j]; in gspca_frame_add()
440 frame->v4l2_buf.sequence = gspca_dev->sequence++; in gspca_frame_add()
441 gspca_dev->image = frame->data; in gspca_frame_add()
442 gspca_dev->image_len = 0; in gspca_frame_add()
444 switch (gspca_dev->last_packet_type) { in gspca_frame_add()
447 gspca_dev->last_packet_type = packet_type; in gspca_frame_add()
448 gspca_dev->image = NULL; in gspca_frame_add()
449 gspca_dev->image_len = 0; in gspca_frame_add()
459 if (gspca_dev->image_len + len > gspca_dev->frsz) { in gspca_frame_add()
461 gspca_dev->image_len + len, in gspca_frame_add()
462 gspca_dev->frsz); in gspca_frame_add()
471 memcpy(gspca_dev->image + gspca_dev->image_len, in gspca_frame_add()
473 gspca_dev->image_len += len; in gspca_frame_add()
476 gspca_dev->last_packet_type = packet_type; in gspca_frame_add()
482 i = atomic_read(&gspca_dev->fr_i); in gspca_frame_add()
483 j = gspca_dev->fr_queue[i]; in gspca_frame_add()
484 frame = &gspca_dev->frame[j]; in gspca_frame_add()
485 frame->v4l2_buf.bytesused = gspca_dev->image_len; in gspca_frame_add()
490 atomic_set(&gspca_dev->fr_i, i); in gspca_frame_add()
491 wake_up_interruptible(&gspca_dev->wq); /* event = new frame */ in gspca_frame_add()
494 gspca_dev->image = NULL; in gspca_frame_add()
495 gspca_dev->image_len = 0; in gspca_frame_add()
500 static int frame_alloc(struct gspca_dev *gspca_dev, struct file *file, in frame_alloc() argument
507 frsz = gspca_dev->pixfmt.sizeimage; in frame_alloc()
512 gspca_dev->frbuf = vmalloc_32(frsz * count); in frame_alloc()
513 if (!gspca_dev->frbuf) { in frame_alloc()
517 gspca_dev->capt_file = file; in frame_alloc()
518 gspca_dev->memory = memory; in frame_alloc()
519 gspca_dev->frsz = frsz; in frame_alloc()
520 gspca_dev->nframes = count; in frame_alloc()
522 frame = &gspca_dev->frame[i]; in frame_alloc()
530 frame->data = gspca_dev->frbuf + i * frsz; in frame_alloc()
533 atomic_set(&gspca_dev->fr_q, 0); in frame_alloc()
534 atomic_set(&gspca_dev->fr_i, 0); in frame_alloc()
535 gspca_dev->fr_o = 0; in frame_alloc()
539 static void frame_free(struct gspca_dev *gspca_dev) in frame_free() argument
544 if (gspca_dev->frbuf != NULL) { in frame_free()
545 vfree(gspca_dev->frbuf); in frame_free()
546 gspca_dev->frbuf = NULL; in frame_free()
547 for (i = 0; i < gspca_dev->nframes; i++) in frame_free()
548 gspca_dev->frame[i].data = NULL; in frame_free()
550 gspca_dev->nframes = 0; in frame_free()
551 gspca_dev->frsz = 0; in frame_free()
552 gspca_dev->capt_file = NULL; in frame_free()
553 gspca_dev->memory = GSPCA_MEMORY_NO; in frame_free()
556 static void destroy_urbs(struct gspca_dev *gspca_dev) in destroy_urbs() argument
563 urb = gspca_dev->urb[i]; in destroy_urbs()
567 gspca_dev->urb[i] = NULL; in destroy_urbs()
569 usb_free_coherent(gspca_dev->dev, in destroy_urbs()
577 static int gspca_set_alt0(struct gspca_dev *gspca_dev) in gspca_set_alt0() argument
581 if (gspca_dev->alt == 0) in gspca_set_alt0()
583 ret = usb_set_interface(gspca_dev->dev, gspca_dev->iface, 0); in gspca_set_alt0()
590 static void gspca_stream_off(struct gspca_dev *gspca_dev) in gspca_stream_off() argument
592 gspca_dev->streaming = 0; in gspca_stream_off()
593 gspca_dev->usb_err = 0; in gspca_stream_off()
594 if (gspca_dev->sd_desc->stopN) in gspca_stream_off()
595 gspca_dev->sd_desc->stopN(gspca_dev); in gspca_stream_off()
596 destroy_urbs(gspca_dev); in gspca_stream_off()
597 gspca_input_destroy_urb(gspca_dev); in gspca_stream_off()
598 gspca_set_alt0(gspca_dev); in gspca_stream_off()
599 gspca_input_create_urb(gspca_dev); in gspca_stream_off()
600 if (gspca_dev->sd_desc->stop0) in gspca_stream_off()
601 gspca_dev->sd_desc->stop0(gspca_dev); in gspca_stream_off()
630 static u32 which_bandwidth(struct gspca_dev *gspca_dev) in which_bandwidth() argument
635 bandwidth = gspca_dev->pixfmt.sizeimage; in which_bandwidth()
638 if (!gspca_dev->cam.needs_full_bandwidth && in which_bandwidth()
639 bandwidth < gspca_dev->pixfmt.width * in which_bandwidth()
640 gspca_dev->pixfmt.height) in which_bandwidth()
644 if (gspca_dev->sd_desc->get_streamparm) { in which_bandwidth()
647 gspca_dev->sd_desc->get_streamparm(gspca_dev, &parm); in which_bandwidth()
654 if (gspca_dev->pixfmt.width >= 640 in which_bandwidth()
655 && gspca_dev->dev->speed == USB_SPEED_FULL) in which_bandwidth()
676 static int build_isoc_ep_tb(struct gspca_dev *gspca_dev, in build_isoc_ep_tb() argument
697 gspca_dev->xfer_ep); in build_isoc_ep_tb()
707 if (gspca_dev->dev->speed == USB_SPEED_HIGH in build_isoc_ep_tb()
708 || gspca_dev->dev->speed == USB_SPEED_SUPER) in build_isoc_ep_tb()
736 if (gspca_dev->audio && in build_isoc_ep_tb()
737 gspca_dev->dev->speed == USB_SPEED_FULL && in build_isoc_ep_tb()
746 bandwidth = which_bandwidth(gspca_dev); in build_isoc_ep_tb()
760 static int create_urbs(struct gspca_dev *gspca_dev, in create_urbs() argument
769 if (!gspca_dev->cam.bulk) { /* isoc */ in create_urbs()
772 if (gspca_dev->pkt_size == 0) in create_urbs()
775 psize = gspca_dev->pkt_size; in create_urbs()
776 npkt = gspca_dev->cam.npkt; in create_urbs()
786 bsize = gspca_dev->cam.bulk_size; in create_urbs()
790 if (gspca_dev->cam.bulk_nurbs != 0) in create_urbs()
791 nurbs = gspca_dev->cam.bulk_nurbs; in create_urbs()
802 gspca_dev->urb[n] = urb; in create_urbs()
803 urb->transfer_buffer = usb_alloc_coherent(gspca_dev->dev, in create_urbs()
812 urb->dev = gspca_dev->dev; in create_urbs()
813 urb->context = gspca_dev; in create_urbs()
816 urb->pipe = usb_rcvisocpipe(gspca_dev->dev, in create_urbs()
828 urb->pipe = usb_rcvbulkpipe(gspca_dev->dev, in create_urbs()
840 static int gspca_init_transfer(struct gspca_dev *gspca_dev) in gspca_init_transfer() argument
849 gspca_dev->image = NULL; in gspca_init_transfer()
850 gspca_dev->image_len = 0; in gspca_init_transfer()
851 gspca_dev->last_packet_type = DISCARD_PACKET; in gspca_init_transfer()
852 gspca_dev->sequence = 0; in gspca_init_transfer()
854 gspca_dev->usb_err = 0; in gspca_init_transfer()
857 intf = usb_ifnum_to_if(gspca_dev->dev, gspca_dev->iface); in gspca_init_transfer()
858 gspca_dev->alt = gspca_dev->cam.bulk ? intf->num_altsetting : 0; in gspca_init_transfer()
859 if (gspca_dev->sd_desc->isoc_init) { in gspca_init_transfer()
860 ret = gspca_dev->sd_desc->isoc_init(gspca_dev); in gspca_init_transfer()
864 xfer = gspca_dev->cam.bulk ? USB_ENDPOINT_XFER_BULK in gspca_init_transfer()
868 if (gspca_dev->alt != 0) { in gspca_init_transfer()
869 gspca_dev->alt--; /* (previous version compatibility) */ in gspca_init_transfer()
870 ep = alt_xfer(&intf->altsetting[gspca_dev->alt], xfer, in gspca_init_transfer()
871 gspca_dev->xfer_ep); in gspca_init_transfer()
873 pr_err("bad altsetting %d\n", gspca_dev->alt); in gspca_init_transfer()
876 ep_tb[0].alt = gspca_dev->alt; in gspca_init_transfer()
881 alt_idx = build_isoc_ep_tb(gspca_dev, intf, ep_tb); in gspca_init_transfer()
890 gspca_input_destroy_urb(gspca_dev); in gspca_init_transfer()
892 gspca_dev->alt = ep_tb[--alt_idx].alt; in gspca_init_transfer()
895 if (alt != gspca_dev->alt) { in gspca_init_transfer()
896 alt = gspca_dev->alt; in gspca_init_transfer()
898 ret = usb_set_interface(gspca_dev->dev, in gspca_init_transfer()
899 gspca_dev->iface, in gspca_init_transfer()
909 if (!gspca_dev->cam.no_urb_create) { in gspca_init_transfer()
911 ret = create_urbs(gspca_dev, in gspca_init_transfer()
913 gspca_dev->xfer_ep)); in gspca_init_transfer()
915 destroy_urbs(gspca_dev); in gspca_init_transfer()
921 if (gspca_dev->cam.bulk) in gspca_init_transfer()
922 usb_clear_halt(gspca_dev->dev, in gspca_init_transfer()
923 gspca_dev->urb[0]->pipe); in gspca_init_transfer()
926 ret = gspca_dev->sd_desc->start(gspca_dev); in gspca_init_transfer()
928 destroy_urbs(gspca_dev); in gspca_init_transfer()
931 gspca_dev->streaming = 1; in gspca_init_transfer()
932 v4l2_ctrl_handler_setup(gspca_dev->vdev.ctrl_handler); in gspca_init_transfer()
935 if (gspca_dev->cam.bulk && gspca_dev->cam.bulk_nurbs == 0) in gspca_init_transfer()
940 urb = gspca_dev->urb[n]; in gspca_init_transfer()
952 gspca_stream_off(gspca_dev); in gspca_init_transfer()
955 gspca_dev->alt, ret); in gspca_init_transfer()
964 if (gspca_dev->sd_desc->isoc_nego) { in gspca_init_transfer()
965 ret = gspca_dev->sd_desc->isoc_nego(gspca_dev); in gspca_init_transfer()
974 gspca_dev->alt = ep_tb[--alt_idx].alt; in gspca_init_transfer()
978 gspca_input_create_urb(gspca_dev); in gspca_init_transfer()
982 static void gspca_set_default_mode(struct gspca_dev *gspca_dev) in gspca_set_default_mode() argument
986 i = gspca_dev->cam.nmodes - 1; /* take the highest mode */ in gspca_set_default_mode()
987 gspca_dev->curr_mode = i; in gspca_set_default_mode()
988 gspca_dev->pixfmt = gspca_dev->cam.cam_mode[i]; in gspca_set_default_mode()
991 v4l2_ctrl_handler_setup(gspca_dev->vdev.ctrl_handler); in gspca_set_default_mode()
994 static int wxh_to_mode(struct gspca_dev *gspca_dev, in wxh_to_mode() argument
999 for (i = gspca_dev->cam.nmodes; --i > 0; ) { in wxh_to_mode()
1000 if (width >= gspca_dev->cam.cam_mode[i].width in wxh_to_mode()
1001 && height >= gspca_dev->cam.cam_mode[i].height) in wxh_to_mode()
1010 static int gspca_get_mode(struct gspca_dev *gspca_dev, in gspca_get_mode() argument
1017 while ((modeU < gspca_dev->cam.nmodes) || modeD >= 0) { in gspca_get_mode()
1019 if (gspca_dev->cam.cam_mode[modeD].pixelformat in gspca_get_mode()
1023 if (++modeU < gspca_dev->cam.nmodes) { in gspca_get_mode()
1024 if (gspca_dev->cam.cam_mode[modeU].pixelformat in gspca_get_mode()
1036 struct gspca_dev *gspca_dev = video_drvdata(file); in vidioc_g_chip_info() local
1038 gspca_dev->usb_err = 0; in vidioc_g_chip_info()
1039 if (gspca_dev->sd_desc->get_chip_info) in vidioc_g_chip_info()
1040 return gspca_dev->sd_desc->get_chip_info(gspca_dev, chip); in vidioc_g_chip_info()
1047 struct gspca_dev *gspca_dev = video_drvdata(file); in vidioc_g_register() local
1049 gspca_dev->usb_err = 0; in vidioc_g_register()
1050 return gspca_dev->sd_desc->get_register(gspca_dev, reg); in vidioc_g_register()
1056 struct gspca_dev *gspca_dev = video_drvdata(file); in vidioc_s_register() local
1058 gspca_dev->usb_err = 0; in vidioc_s_register()
1059 return gspca_dev->sd_desc->set_register(gspca_dev, reg); in vidioc_s_register()
1066 struct gspca_dev *gspca_dev = video_drvdata(file); in vidioc_enum_fmt_vid_cap() local
1073 for (i = gspca_dev->cam.nmodes; --i >= 0; ) { in vidioc_enum_fmt_vid_cap()
1074 fmt_tb[index] = gspca_dev->cam.cam_mode[i].pixelformat; in vidioc_enum_fmt_vid_cap()
1093 if (gspca_dev->cam.cam_mode[i].sizeimage < in vidioc_enum_fmt_vid_cap()
1094 gspca_dev->cam.cam_mode[i].width * in vidioc_enum_fmt_vid_cap()
1095 gspca_dev->cam.cam_mode[i].height) in vidioc_enum_fmt_vid_cap()
1108 struct gspca_dev *gspca_dev = video_drvdata(file); in vidioc_g_fmt_vid_cap() local
1110 fmt->fmt.pix = gspca_dev->pixfmt; in vidioc_g_fmt_vid_cap()
1117 static int try_fmt_vid_cap(struct gspca_dev *gspca_dev, in try_fmt_vid_cap() argument
1125 PDEBUG_MODE(gspca_dev, D_CONF, "try fmt cap", in try_fmt_vid_cap()
1129 mode = wxh_to_mode(gspca_dev, w, h); in try_fmt_vid_cap()
1132 if (gspca_dev->cam.cam_mode[mode].pixelformat in try_fmt_vid_cap()
1136 mode2 = gspca_get_mode(gspca_dev, mode, in try_fmt_vid_cap()
1141 fmt->fmt.pix = gspca_dev->cam.cam_mode[mode]; in try_fmt_vid_cap()
1142 if (gspca_dev->sd_desc->try_fmt) { in try_fmt_vid_cap()
1146 gspca_dev->sd_desc->try_fmt(gspca_dev, fmt); in try_fmt_vid_cap()
1158 struct gspca_dev *gspca_dev = video_drvdata(file); in vidioc_try_fmt_vid_cap() local
1161 ret = try_fmt_vid_cap(gspca_dev, fmt); in vidioc_try_fmt_vid_cap()
1170 struct gspca_dev *gspca_dev = video_drvdata(file); in vidioc_s_fmt_vid_cap() local
1173 if (mutex_lock_interruptible(&gspca_dev->queue_lock)) in vidioc_s_fmt_vid_cap()
1176 ret = try_fmt_vid_cap(gspca_dev, fmt); in vidioc_s_fmt_vid_cap()
1180 if (gspca_dev->nframes != 0 in vidioc_s_fmt_vid_cap()
1181 && fmt->fmt.pix.sizeimage > gspca_dev->frsz) { in vidioc_s_fmt_vid_cap()
1186 if (gspca_dev->streaming) { in vidioc_s_fmt_vid_cap()
1190 gspca_dev->curr_mode = ret; in vidioc_s_fmt_vid_cap()
1191 if (gspca_dev->sd_desc->try_fmt) in vidioc_s_fmt_vid_cap()
1193 gspca_dev->pixfmt = fmt->fmt.pix; in vidioc_s_fmt_vid_cap()
1195 gspca_dev->pixfmt = gspca_dev->cam.cam_mode[ret]; in vidioc_s_fmt_vid_cap()
1199 mutex_unlock(&gspca_dev->queue_lock); in vidioc_s_fmt_vid_cap()
1206 struct gspca_dev *gspca_dev = video_drvdata(file); in vidioc_enum_framesizes() local
1210 if (gspca_dev->sd_desc->enum_framesizes) in vidioc_enum_framesizes()
1211 return gspca_dev->sd_desc->enum_framesizes(gspca_dev, fsize); in vidioc_enum_framesizes()
1213 for (i = 0; i < gspca_dev->cam.nmodes; i++) { in vidioc_enum_framesizes()
1215 gspca_dev->cam.cam_mode[i].pixelformat) in vidioc_enum_framesizes()
1221 gspca_dev->cam.cam_mode[i].width; in vidioc_enum_framesizes()
1223 gspca_dev->cam.cam_mode[i].height; in vidioc_enum_framesizes()
1235 struct gspca_dev *gspca_dev = video_drvdata(filp); in vidioc_enum_frameintervals() local
1236 int mode = wxh_to_mode(gspca_dev, fival->width, fival->height); in vidioc_enum_frameintervals()
1239 if (gspca_dev->cam.mode_framerates == NULL || in vidioc_enum_frameintervals()
1240 gspca_dev->cam.mode_framerates[mode].nrates == 0) in vidioc_enum_frameintervals()
1244 gspca_dev->cam.cam_mode[mode].pixelformat) in vidioc_enum_frameintervals()
1247 for (i = 0; i < gspca_dev->cam.mode_framerates[mode].nrates; i++) { in vidioc_enum_frameintervals()
1252 gspca_dev->cam.mode_framerates[mode].rates[i]; in vidioc_enum_frameintervals()
1262 struct gspca_dev *gspca_dev = in gspca_release() local
1263 container_of(v4l2_device, struct gspca_dev, v4l2_dev); in gspca_release()
1265 v4l2_ctrl_handler_free(gspca_dev->vdev.ctrl_handler); in gspca_release()
1266 v4l2_device_unregister(&gspca_dev->v4l2_dev); in gspca_release()
1267 kfree(gspca_dev->usb_buf); in gspca_release()
1268 kfree(gspca_dev); in gspca_release()
1273 struct gspca_dev *gspca_dev = video_drvdata(file); in dev_open() local
1279 if (!try_module_get(gspca_dev->module)) in dev_open()
1284 module_put(gspca_dev->module); in dev_open()
1290 struct gspca_dev *gspca_dev = video_drvdata(file); in dev_close() local
1295 if (mutex_lock_interruptible(&gspca_dev->usb_lock)) in dev_close()
1298 if (mutex_lock_interruptible(&gspca_dev->queue_lock)) { in dev_close()
1299 mutex_unlock(&gspca_dev->usb_lock); in dev_close()
1304 if (gspca_dev->capt_file == file) { in dev_close()
1305 if (gspca_dev->streaming) in dev_close()
1306 gspca_stream_off(gspca_dev); in dev_close()
1307 frame_free(gspca_dev); in dev_close()
1309 module_put(gspca_dev->module); in dev_close()
1310 mutex_unlock(&gspca_dev->queue_lock); in dev_close()
1311 mutex_unlock(&gspca_dev->usb_lock); in dev_close()
1321 struct gspca_dev *gspca_dev = video_drvdata(file); in vidioc_querycap() local
1323 strlcpy((char *) cap->driver, gspca_dev->sd_desc->name, in vidioc_querycap()
1325 if (gspca_dev->dev->product != NULL) { in vidioc_querycap()
1326 strlcpy((char *) cap->card, gspca_dev->dev->product, in vidioc_querycap()
1331 le16_to_cpu(gspca_dev->dev->descriptor.idVendor), in vidioc_querycap()
1332 le16_to_cpu(gspca_dev->dev->descriptor.idProduct)); in vidioc_querycap()
1334 usb_make_path(gspca_dev->dev, (char *) cap->bus_info, in vidioc_querycap()
1346 struct gspca_dev *gspca_dev = video_drvdata(file); in vidioc_enum_input() local
1351 input->status = gspca_dev->cam.input_flags; in vidioc_enum_input()
1352 strlcpy(input->name, gspca_dev->sd_desc->name, in vidioc_enum_input()
1373 struct gspca_dev *gspca_dev = video_drvdata(file); in vidioc_reqbufs() local
1385 if (mutex_lock_interruptible(&gspca_dev->queue_lock)) in vidioc_reqbufs()
1388 if (gspca_dev->memory != GSPCA_MEMORY_NO in vidioc_reqbufs()
1389 && gspca_dev->memory != GSPCA_MEMORY_READ in vidioc_reqbufs()
1390 && gspca_dev->memory != rb->memory) { in vidioc_reqbufs()
1396 if (gspca_dev->capt_file != NULL in vidioc_reqbufs()
1397 && gspca_dev->capt_file != file) { in vidioc_reqbufs()
1403 for (i = 0; i < gspca_dev->nframes; i++) { in vidioc_reqbufs()
1404 if (gspca_dev->frame[i].vma_use_count) { in vidioc_reqbufs()
1411 streaming = gspca_dev->streaming; in vidioc_reqbufs()
1413 gspca_stream_off(gspca_dev); in vidioc_reqbufs()
1417 if (gspca_dev->memory == GSPCA_MEMORY_READ) in vidioc_reqbufs()
1422 if (gspca_dev->nframes != 0) in vidioc_reqbufs()
1423 frame_free(gspca_dev); in vidioc_reqbufs()
1426 ret = frame_alloc(gspca_dev, file, rb->memory, rb->count); in vidioc_reqbufs()
1428 rb->count = gspca_dev->nframes; in vidioc_reqbufs()
1430 ret = gspca_init_transfer(gspca_dev); in vidioc_reqbufs()
1433 mutex_unlock(&gspca_dev->queue_lock); in vidioc_reqbufs()
1441 struct gspca_dev *gspca_dev = video_drvdata(file); in vidioc_querybuf() local
1444 if (v4l2_buf->index >= gspca_dev->nframes) in vidioc_querybuf()
1447 frame = &gspca_dev->frame[v4l2_buf->index]; in vidioc_querybuf()
1455 struct gspca_dev *gspca_dev = video_drvdata(file); in vidioc_streamon() local
1460 if (mutex_lock_interruptible(&gspca_dev->queue_lock)) in vidioc_streamon()
1464 if (gspca_dev->capt_file != file) { in vidioc_streamon()
1469 if (gspca_dev->nframes == 0 in vidioc_streamon()
1470 || !(gspca_dev->frame[0].v4l2_buf.flags & V4L2_BUF_FLAG_QUEUED)) { in vidioc_streamon()
1474 if (!gspca_dev->streaming) { in vidioc_streamon()
1475 ret = gspca_init_transfer(gspca_dev); in vidioc_streamon()
1479 PDEBUG_MODE(gspca_dev, D_STREAM, "stream on OK", in vidioc_streamon()
1480 gspca_dev->pixfmt.pixelformat, in vidioc_streamon()
1481 gspca_dev->pixfmt.width, gspca_dev->pixfmt.height); in vidioc_streamon()
1484 mutex_unlock(&gspca_dev->queue_lock); in vidioc_streamon()
1491 struct gspca_dev *gspca_dev = video_drvdata(file); in vidioc_streamoff() local
1497 if (mutex_lock_interruptible(&gspca_dev->queue_lock)) in vidioc_streamoff()
1500 if (!gspca_dev->streaming) { in vidioc_streamoff()
1506 if (gspca_dev->capt_file != file) { in vidioc_streamoff()
1512 gspca_stream_off(gspca_dev); in vidioc_streamoff()
1514 wake_up_interruptible(&gspca_dev->wq); in vidioc_streamoff()
1517 for (i = 0; i < gspca_dev->nframes; i++) in vidioc_streamoff()
1518 gspca_dev->frame[i].v4l2_buf.flags &= ~BUF_ALL_FLAGS; in vidioc_streamoff()
1519 atomic_set(&gspca_dev->fr_q, 0); in vidioc_streamoff()
1520 atomic_set(&gspca_dev->fr_i, 0); in vidioc_streamoff()
1521 gspca_dev->fr_o = 0; in vidioc_streamoff()
1524 mutex_unlock(&gspca_dev->queue_lock); in vidioc_streamoff()
1531 struct gspca_dev *gspca_dev = video_drvdata(file); in vidioc_g_jpegcomp() local
1533 gspca_dev->usb_err = 0; in vidioc_g_jpegcomp()
1534 return gspca_dev->sd_desc->get_jcomp(gspca_dev, jpegcomp); in vidioc_g_jpegcomp()
1540 struct gspca_dev *gspca_dev = video_drvdata(file); in vidioc_s_jpegcomp() local
1542 gspca_dev->usb_err = 0; in vidioc_s_jpegcomp()
1543 return gspca_dev->sd_desc->set_jcomp(gspca_dev, jpegcomp); in vidioc_s_jpegcomp()
1549 struct gspca_dev *gspca_dev = video_drvdata(filp); in vidioc_g_parm() local
1551 parm->parm.capture.readbuffers = gspca_dev->nbufread; in vidioc_g_parm()
1553 if (gspca_dev->sd_desc->get_streamparm) { in vidioc_g_parm()
1554 gspca_dev->usb_err = 0; in vidioc_g_parm()
1555 gspca_dev->sd_desc->get_streamparm(gspca_dev, parm); in vidioc_g_parm()
1556 return gspca_dev->usb_err; in vidioc_g_parm()
1564 struct gspca_dev *gspca_dev = video_drvdata(filp); in vidioc_s_parm() local
1569 parm->parm.capture.readbuffers = gspca_dev->nbufread; in vidioc_s_parm()
1571 gspca_dev->nbufread = n; in vidioc_s_parm()
1573 if (gspca_dev->sd_desc->set_streamparm) { in vidioc_s_parm()
1574 gspca_dev->usb_err = 0; in vidioc_s_parm()
1575 gspca_dev->sd_desc->set_streamparm(gspca_dev, parm); in vidioc_s_parm()
1576 return gspca_dev->usb_err; in vidioc_s_parm()
1584 struct gspca_dev *gspca_dev = video_drvdata(file); in dev_mmap() local
1594 if (mutex_lock_interruptible(&gspca_dev->queue_lock)) in dev_mmap()
1596 if (gspca_dev->capt_file != file) { in dev_mmap()
1602 for (i = 0; i < gspca_dev->nframes; ++i) { in dev_mmap()
1603 if (gspca_dev->frame[i].v4l2_buf.memory != V4L2_MEMORY_MMAP) { in dev_mmap()
1607 if ((gspca_dev->frame[i].v4l2_buf.m.offset >> PAGE_SHIFT) in dev_mmap()
1609 frame = &gspca_dev->frame[i]; in dev_mmap()
1646 mutex_unlock(&gspca_dev->queue_lock); in dev_mmap()
1650 static int frame_ready_nolock(struct gspca_dev *gspca_dev, struct file *file, in frame_ready_nolock() argument
1653 if (!gspca_dev->present) in frame_ready_nolock()
1655 if (gspca_dev->capt_file != file || gspca_dev->memory != memory || in frame_ready_nolock()
1656 !gspca_dev->streaming) in frame_ready_nolock()
1660 return gspca_dev->fr_o != atomic_read(&gspca_dev->fr_i); in frame_ready_nolock()
1663 static int frame_ready(struct gspca_dev *gspca_dev, struct file *file, in frame_ready() argument
1668 if (mutex_lock_interruptible(&gspca_dev->queue_lock)) in frame_ready()
1670 ret = frame_ready_nolock(gspca_dev, file, memory); in frame_ready()
1671 mutex_unlock(&gspca_dev->queue_lock); in frame_ready()
1683 struct gspca_dev *gspca_dev = video_drvdata(file); in vidioc_dqbuf() local
1689 if (mutex_lock_interruptible(&gspca_dev->queue_lock)) in vidioc_dqbuf()
1693 ret = frame_ready_nolock(gspca_dev, file, v4l2_buf->memory); in vidioc_dqbuf()
1699 mutex_unlock(&gspca_dev->queue_lock); in vidioc_dqbuf()
1705 ret = wait_event_interruptible_timeout(gspca_dev->wq, in vidioc_dqbuf()
1706 frame_ready(gspca_dev, file, v4l2_buf->memory), in vidioc_dqbuf()
1713 if (mutex_lock_interruptible(&gspca_dev->queue_lock)) in vidioc_dqbuf()
1717 i = gspca_dev->fr_o; in vidioc_dqbuf()
1718 j = gspca_dev->fr_queue[i]; in vidioc_dqbuf()
1719 frame = &gspca_dev->frame[j]; in vidioc_dqbuf()
1721 gspca_dev->fr_o = (i + 1) % GSPCA_MAX_FRAMES; in vidioc_dqbuf()
1728 if (gspca_dev->memory == V4L2_MEMORY_USERPTR) { in vidioc_dqbuf()
1737 mutex_unlock(&gspca_dev->queue_lock); in vidioc_dqbuf()
1739 if (ret == 0 && gspca_dev->sd_desc->dq_callback) { in vidioc_dqbuf()
1740 mutex_lock(&gspca_dev->usb_lock); in vidioc_dqbuf()
1741 gspca_dev->usb_err = 0; in vidioc_dqbuf()
1742 if (gspca_dev->present) in vidioc_dqbuf()
1743 gspca_dev->sd_desc->dq_callback(gspca_dev); in vidioc_dqbuf()
1744 mutex_unlock(&gspca_dev->usb_lock); in vidioc_dqbuf()
1759 struct gspca_dev *gspca_dev = video_drvdata(file); in vidioc_qbuf() local
1765 if (mutex_lock_interruptible(&gspca_dev->queue_lock)) in vidioc_qbuf()
1769 if ((unsigned) index >= gspca_dev->nframes) { in vidioc_qbuf()
1771 "qbuf idx %d >= %d", index, gspca_dev->nframes); in vidioc_qbuf()
1775 if (v4l2_buf->memory != gspca_dev->memory) { in vidioc_qbuf()
1781 frame = &gspca_dev->frame[index]; in vidioc_qbuf()
1796 i = atomic_read(&gspca_dev->fr_q); in vidioc_qbuf()
1797 gspca_dev->fr_queue[i] = index; in vidioc_qbuf()
1798 atomic_set(&gspca_dev->fr_q, (i + 1) % GSPCA_MAX_FRAMES); in vidioc_qbuf()
1804 mutex_unlock(&gspca_dev->queue_lock); in vidioc_qbuf()
1811 static int read_alloc(struct gspca_dev *gspca_dev, in read_alloc() argument
1819 if (mutex_lock_interruptible(&gspca_dev->usb_lock)) in read_alloc()
1822 if (gspca_dev->nframes == 0) { in read_alloc()
1826 rb.count = gspca_dev->nbufread; in read_alloc()
1829 ret = vidioc_reqbufs(file, gspca_dev, &rb); in read_alloc()
1837 for (i = 0; i < gspca_dev->nbufread; i++) { in read_alloc()
1839 ret = vidioc_qbuf(file, gspca_dev, &v4l2_buf); in read_alloc()
1848 ret = vidioc_streamon(file, gspca_dev, V4L2_BUF_TYPE_VIDEO_CAPTURE); in read_alloc()
1852 mutex_unlock(&gspca_dev->usb_lock); in read_alloc()
1858 struct gspca_dev *gspca_dev = video_drvdata(file); in dev_poll() local
1869 if (gspca_dev->memory == GSPCA_MEMORY_NO) { in dev_poll()
1870 if (read_alloc(gspca_dev, file) != 0) { in dev_poll()
1876 poll_wait(file, &gspca_dev->wq, wait); in dev_poll()
1879 if (mutex_lock_interruptible(&gspca_dev->queue_lock) != 0) { in dev_poll()
1883 if (gspca_dev->fr_o != atomic_read(&gspca_dev->fr_i)) in dev_poll()
1885 mutex_unlock(&gspca_dev->queue_lock); in dev_poll()
1889 if (!gspca_dev->present) in dev_poll()
1898 struct gspca_dev *gspca_dev = video_drvdata(file); in dev_read() local
1905 if (gspca_dev->memory == GSPCA_MEMORY_NO) { /* first time ? */ in dev_read()
1906 ret = read_alloc(gspca_dev, file); in dev_read()
1919 ret = vidioc_dqbuf(file, gspca_dev, &v4l2_buf); in dev_read()
1927 frame = &gspca_dev->frame[v4l2_buf.index]; in dev_read()
1932 ret = vidioc_qbuf(file, gspca_dev, &v4l2_buf); in dev_read()
1951 ret2 = vidioc_qbuf(file, gspca_dev, &v4l2_buf); in dev_read()
2016 struct gspca_dev *gspca_dev; in gspca_dev_probe2() local
2024 if (dev_size < sizeof *gspca_dev) in gspca_dev_probe2()
2025 dev_size = sizeof *gspca_dev; in gspca_dev_probe2()
2026 gspca_dev = kzalloc(dev_size, GFP_KERNEL); in gspca_dev_probe2()
2027 if (!gspca_dev) { in gspca_dev_probe2()
2031 gspca_dev->usb_buf = kmalloc(USB_BUF_SZ, GFP_KERNEL); in gspca_dev_probe2()
2032 if (!gspca_dev->usb_buf) { in gspca_dev_probe2()
2037 gspca_dev->dev = dev; in gspca_dev_probe2()
2038 gspca_dev->iface = intf->cur_altsetting->desc.bInterfaceNumber; in gspca_dev_probe2()
2039 gspca_dev->xfer_ep = -1; in gspca_dev_probe2()
2052 gspca_dev->audio = 1; in gspca_dev_probe2()
2058 gspca_dev->v4l2_dev.release = gspca_release; in gspca_dev_probe2()
2059 ret = v4l2_device_register(&intf->dev, &gspca_dev->v4l2_dev); in gspca_dev_probe2()
2062 gspca_dev->sd_desc = sd_desc; in gspca_dev_probe2()
2063 gspca_dev->nbufread = 2; in gspca_dev_probe2()
2064 gspca_dev->empty_packet = -1; /* don't check the empty packets */ in gspca_dev_probe2()
2065 gspca_dev->vdev = gspca_template; in gspca_dev_probe2()
2066 gspca_dev->vdev.v4l2_dev = &gspca_dev->v4l2_dev; in gspca_dev_probe2()
2067 video_set_drvdata(&gspca_dev->vdev, gspca_dev); in gspca_dev_probe2()
2068 gspca_dev->module = module; in gspca_dev_probe2()
2069 gspca_dev->present = 1; in gspca_dev_probe2()
2071 mutex_init(&gspca_dev->usb_lock); in gspca_dev_probe2()
2072 gspca_dev->vdev.lock = &gspca_dev->usb_lock; in gspca_dev_probe2()
2073 mutex_init(&gspca_dev->queue_lock); in gspca_dev_probe2()
2074 init_waitqueue_head(&gspca_dev->wq); in gspca_dev_probe2()
2077 ret = sd_desc->config(gspca_dev, id); in gspca_dev_probe2()
2080 ret = sd_desc->init(gspca_dev); in gspca_dev_probe2()
2084 ret = sd_desc->init_controls(gspca_dev); in gspca_dev_probe2()
2087 gspca_set_default_mode(gspca_dev); in gspca_dev_probe2()
2089 ret = gspca_input_connect(gspca_dev); in gspca_dev_probe2()
2098 v4l2_disable_ioctl_locking(&gspca_dev->vdev, VIDIOC_DQBUF); in gspca_dev_probe2()
2099 v4l2_disable_ioctl_locking(&gspca_dev->vdev, VIDIOC_QBUF); in gspca_dev_probe2()
2100 v4l2_disable_ioctl_locking(&gspca_dev->vdev, VIDIOC_QUERYBUF); in gspca_dev_probe2()
2102 if (!gspca_dev->sd_desc->get_register) in gspca_dev_probe2()
2103 v4l2_disable_ioctl(&gspca_dev->vdev, VIDIOC_DBG_G_REGISTER); in gspca_dev_probe2()
2104 if (!gspca_dev->sd_desc->set_register) in gspca_dev_probe2()
2105 v4l2_disable_ioctl(&gspca_dev->vdev, VIDIOC_DBG_S_REGISTER); in gspca_dev_probe2()
2107 if (!gspca_dev->sd_desc->get_jcomp) in gspca_dev_probe2()
2108 v4l2_disable_ioctl(&gspca_dev->vdev, VIDIOC_G_JPEGCOMP); in gspca_dev_probe2()
2109 if (!gspca_dev->sd_desc->set_jcomp) in gspca_dev_probe2()
2110 v4l2_disable_ioctl(&gspca_dev->vdev, VIDIOC_S_JPEGCOMP); in gspca_dev_probe2()
2113 ret = video_register_device(&gspca_dev->vdev, in gspca_dev_probe2()
2121 usb_set_intfdata(intf, gspca_dev); in gspca_dev_probe2()
2122 PDEBUG(D_PROBE, "%s created", video_device_node_name(&gspca_dev->vdev)); in gspca_dev_probe2()
2124 gspca_input_create_urb(gspca_dev); in gspca_dev_probe2()
2129 if (gspca_dev->input_dev) in gspca_dev_probe2()
2130 input_unregister_device(gspca_dev->input_dev); in gspca_dev_probe2()
2132 v4l2_ctrl_handler_free(gspca_dev->vdev.ctrl_handler); in gspca_dev_probe2()
2133 kfree(gspca_dev->usb_buf); in gspca_dev_probe2()
2134 kfree(gspca_dev); in gspca_dev_probe2()
2172 struct gspca_dev *gspca_dev = usb_get_intfdata(intf); in gspca_disconnect() local
2178 video_device_node_name(&gspca_dev->vdev)); in gspca_disconnect()
2180 mutex_lock(&gspca_dev->usb_lock); in gspca_disconnect()
2182 gspca_dev->present = 0; in gspca_disconnect()
2183 destroy_urbs(gspca_dev); in gspca_disconnect()
2186 gspca_input_destroy_urb(gspca_dev); in gspca_disconnect()
2187 input_dev = gspca_dev->input_dev; in gspca_disconnect()
2189 gspca_dev->input_dev = NULL; in gspca_disconnect()
2194 if (gspca_dev->sd_desc->stop0 && gspca_dev->streaming) in gspca_disconnect()
2195 gspca_dev->sd_desc->stop0(gspca_dev); in gspca_disconnect()
2196 gspca_dev->streaming = 0; in gspca_disconnect()
2197 gspca_dev->dev = NULL; in gspca_disconnect()
2198 wake_up_interruptible(&gspca_dev->wq); in gspca_disconnect()
2200 v4l2_device_disconnect(&gspca_dev->v4l2_dev); in gspca_disconnect()
2201 video_unregister_device(&gspca_dev->vdev); in gspca_disconnect()
2203 mutex_unlock(&gspca_dev->usb_lock); in gspca_disconnect()
2206 v4l2_device_put(&gspca_dev->v4l2_dev); in gspca_disconnect()
2213 struct gspca_dev *gspca_dev = usb_get_intfdata(intf); in gspca_suspend() local
2215 gspca_input_destroy_urb(gspca_dev); in gspca_suspend()
2217 if (!gspca_dev->streaming) in gspca_suspend()
2220 mutex_lock(&gspca_dev->usb_lock); in gspca_suspend()
2221 gspca_dev->frozen = 1; /* avoid urb error messages */ in gspca_suspend()
2222 gspca_dev->usb_err = 0; in gspca_suspend()
2223 if (gspca_dev->sd_desc->stopN) in gspca_suspend()
2224 gspca_dev->sd_desc->stopN(gspca_dev); in gspca_suspend()
2225 destroy_urbs(gspca_dev); in gspca_suspend()
2226 gspca_set_alt0(gspca_dev); in gspca_suspend()
2227 if (gspca_dev->sd_desc->stop0) in gspca_suspend()
2228 gspca_dev->sd_desc->stop0(gspca_dev); in gspca_suspend()
2229 mutex_unlock(&gspca_dev->usb_lock); in gspca_suspend()
2237 struct gspca_dev *gspca_dev = usb_get_intfdata(intf); in gspca_resume() local
2240 mutex_lock(&gspca_dev->usb_lock); in gspca_resume()
2241 gspca_dev->frozen = 0; in gspca_resume()
2242 gspca_dev->usb_err = 0; in gspca_resume()
2243 gspca_dev->sd_desc->init(gspca_dev); in gspca_resume()
2249 streaming = gspca_dev->streaming; in gspca_resume()
2250 gspca_dev->streaming = 0; in gspca_resume()
2252 ret = gspca_init_transfer(gspca_dev); in gspca_resume()
2254 gspca_input_create_urb(gspca_dev); in gspca_resume()
2255 mutex_unlock(&gspca_dev->usb_lock); in gspca_resume()