Lines Matching refs:pdev
120 static void pwc_isoc_cleanup(struct pwc_device *pdev);
159 static struct pwc_frame_buf *pwc_get_next_fill_buf(struct pwc_device *pdev) in pwc_get_next_fill_buf() argument
164 spin_lock_irqsave(&pdev->queued_bufs_lock, flags); in pwc_get_next_fill_buf()
165 if (list_empty(&pdev->queued_bufs)) in pwc_get_next_fill_buf()
168 buf = list_entry(pdev->queued_bufs.next, struct pwc_frame_buf, list); in pwc_get_next_fill_buf()
171 spin_unlock_irqrestore(&pdev->queued_bufs_lock, flags); in pwc_get_next_fill_buf()
175 static void pwc_snapshot_button(struct pwc_device *pdev, int down) in pwc_snapshot_button() argument
184 if (pdev->button_dev) { in pwc_snapshot_button()
185 input_report_key(pdev->button_dev, KEY_CAMERA, down); in pwc_snapshot_button()
186 input_sync(pdev->button_dev); in pwc_snapshot_button()
191 static void pwc_frame_complete(struct pwc_device *pdev) in pwc_frame_complete() argument
193 struct pwc_frame_buf *fbuf = pdev->fill_buf; in pwc_frame_complete()
199 if (pdev->type == 730) { in pwc_frame_complete()
204 pdev->drop_frames += 2; in pwc_frame_complete()
206 if ((ptr[0] ^ pdev->vmirror) & 0x01) { in pwc_frame_complete()
207 pwc_snapshot_button(pdev, ptr[0] & 0x01); in pwc_frame_complete()
209 if ((ptr[0] ^ pdev->vmirror) & 0x02) { in pwc_frame_complete()
215 pdev->vmirror = ptr[0] & 0x03; in pwc_frame_complete()
226 pdev->drop_frames++; in pwc_frame_complete()
227 } else if (pdev->type == 740 || pdev->type == 720) { in pwc_frame_complete()
229 if ((ptr[0] ^ pdev->vmirror) & 0x01) { in pwc_frame_complete()
230 pwc_snapshot_button(pdev, ptr[0] & 0x01); in pwc_frame_complete()
232 pdev->vmirror = ptr[0] & 0x03; in pwc_frame_complete()
236 if (pdev->drop_frames > 0) { in pwc_frame_complete()
237 pdev->drop_frames--; in pwc_frame_complete()
240 if (fbuf->filled < pdev->frame_total_size) { in pwc_frame_complete()
245 fbuf->vb.sequence = pdev->vframe_count; in pwc_frame_complete()
247 pdev->fill_buf = NULL; in pwc_frame_complete()
248 pdev->vsync = 0; in pwc_frame_complete()
251 pdev->vframe_count++; in pwc_frame_complete()
259 struct pwc_device *pdev = (struct pwc_device *)urb->context; in pwc_isoc_handler() local
269 if (pdev->fill_buf == NULL) in pwc_isoc_handler()
270 pdev->fill_buf = pwc_get_next_fill_buf(pdev); in pwc_isoc_handler()
287 if (++pdev->visoc_errors > MAX_ISOC_ERRORS) in pwc_isoc_handler()
290 if (pdev->fill_buf) { in pwc_isoc_handler()
291 vb2_buffer_done(&pdev->fill_buf->vb.vb2_buf, in pwc_isoc_handler()
293 pdev->fill_buf = NULL; in pwc_isoc_handler()
296 pdev->vsync = 0; /* Drop the current frame */ in pwc_isoc_handler()
301 pdev->visoc_errors = 0; in pwc_isoc_handler()
316 if (flen > 0 && pdev->vsync) { in pwc_isoc_handler()
317 struct pwc_frame_buf *fbuf = pdev->fill_buf; in pwc_isoc_handler()
319 if (pdev->vsync == 1) { in pwc_isoc_handler()
322 pdev->vsync = 2; in pwc_isoc_handler()
325 if (flen + fbuf->filled > pdev->frame_total_size) { in pwc_isoc_handler()
328 pdev->frame_total_size); in pwc_isoc_handler()
329 pdev->vsync = 0; /* Let's wait for an EOF */ in pwc_isoc_handler()
336 if (flen < pdev->vlast_packet_size) { in pwc_isoc_handler()
338 if (pdev->vsync == 2) in pwc_isoc_handler()
339 pwc_frame_complete(pdev); in pwc_isoc_handler()
340 if (pdev->fill_buf == NULL) in pwc_isoc_handler()
341 pdev->fill_buf = pwc_get_next_fill_buf(pdev); in pwc_isoc_handler()
342 if (pdev->fill_buf) { in pwc_isoc_handler()
343 pdev->fill_buf->filled = 0; in pwc_isoc_handler()
344 pdev->vsync = 1; in pwc_isoc_handler()
347 pdev->vlast_packet_size = flen; in pwc_isoc_handler()
357 static int pwc_isoc_init(struct pwc_device *pdev) in pwc_isoc_init() argument
366 pdev->vsync = 0; in pwc_isoc_init()
367 pdev->vlast_packet_size = 0; in pwc_isoc_init()
368 pdev->fill_buf = NULL; in pwc_isoc_init()
369 pdev->vframe_count = 0; in pwc_isoc_init()
370 pdev->visoc_errors = 0; in pwc_isoc_init()
371 udev = pdev->udev; in pwc_isoc_init()
376 ret = pwc_set_video_mode(pdev, pdev->width, pdev->height, pdev->pixfmt, in pwc_isoc_init()
377 pdev->vframes, &compression, 1); in pwc_isoc_init()
382 idesc = usb_altnum_to_altsetting(intf, pdev->valternate); in pwc_isoc_init()
387 pdev->vmax_packet_size = -1; in pwc_isoc_init()
389 if ((idesc->endpoint[i].desc.bEndpointAddress & 0xF) == pdev->vendpoint) { in pwc_isoc_init()
390 pdev->vmax_packet_size = le16_to_cpu(idesc->endpoint[i].desc.wMaxPacketSize); in pwc_isoc_init()
395 if (pdev->vmax_packet_size < 0 || pdev->vmax_packet_size > ISO_MAX_FRAME_SIZE) { in pwc_isoc_init()
401 PWC_DEBUG_OPEN("Setting alternate interface %d\n", pdev->valternate); in pwc_isoc_init()
402 ret = usb_set_interface(pdev->udev, 0, pdev->valternate); in pwc_isoc_init()
415 pwc_isoc_cleanup(pdev); in pwc_isoc_init()
418 pdev->urbs[i] = urb; in pwc_isoc_init()
423 urb->pipe = usb_rcvisocpipe(udev, pdev->vendpoint); in pwc_isoc_init()
431 pwc_isoc_cleanup(pdev); in pwc_isoc_init()
436 urb->context = pdev; in pwc_isoc_init()
441 urb->iso_frame_desc[j].length = pdev->vmax_packet_size; in pwc_isoc_init()
447 ret = usb_submit_urb(pdev->urbs[i], GFP_KERNEL); in pwc_isoc_init()
450 pwc_isoc_cleanup(pdev); in pwc_isoc_init()
455 pwc_isoc_cleanup(pdev); in pwc_isoc_init()
458 PWC_DEBUG_MEMORY("URB 0x%p submitted.\n", pdev->urbs[i]); in pwc_isoc_init()
466 static void pwc_iso_stop(struct pwc_device *pdev) in pwc_iso_stop() argument
472 if (pdev->urbs[i]) { in pwc_iso_stop()
473 PWC_DEBUG_MEMORY("Unlinking URB %p\n", pdev->urbs[i]); in pwc_iso_stop()
474 usb_kill_urb(pdev->urbs[i]); in pwc_iso_stop()
479 static void pwc_iso_free(struct pwc_device *pdev) in pwc_iso_free() argument
485 if (pdev->urbs[i]) { in pwc_iso_free()
487 if (pdev->urbs[i]->transfer_buffer) { in pwc_iso_free()
488 usb_free_coherent(pdev->udev, in pwc_iso_free()
489 pdev->urbs[i]->transfer_buffer_length, in pwc_iso_free()
490 pdev->urbs[i]->transfer_buffer, in pwc_iso_free()
491 pdev->urbs[i]->transfer_dma); in pwc_iso_free()
493 usb_free_urb(pdev->urbs[i]); in pwc_iso_free()
494 pdev->urbs[i] = NULL; in pwc_iso_free()
500 static void pwc_isoc_cleanup(struct pwc_device *pdev) in pwc_isoc_cleanup() argument
504 pwc_iso_stop(pdev); in pwc_isoc_cleanup()
505 pwc_iso_free(pdev); in pwc_isoc_cleanup()
506 usb_set_interface(pdev->udev, 0, 0); in pwc_isoc_cleanup()
512 static void pwc_cleanup_queued_bufs(struct pwc_device *pdev, in pwc_cleanup_queued_bufs() argument
517 spin_lock_irqsave(&pdev->queued_bufs_lock, flags); in pwc_cleanup_queued_bufs()
518 while (!list_empty(&pdev->queued_bufs)) { in pwc_cleanup_queued_bufs()
521 buf = list_entry(pdev->queued_bufs.next, struct pwc_frame_buf, in pwc_cleanup_queued_bufs()
526 spin_unlock_irqrestore(&pdev->queued_bufs_lock, flags); in pwc_cleanup_queued_bufs()
564 struct pwc_device *pdev = container_of(v, struct pwc_device, v4l2_dev); in pwc_video_release() local
566 v4l2_ctrl_handler_free(&pdev->ctrl_handler); in pwc_video_release()
567 v4l2_device_unregister(&pdev->v4l2_dev); in pwc_video_release()
568 kfree(pdev->ctrl_buf); in pwc_video_release()
569 kfree(pdev); in pwc_video_release()
579 struct pwc_device *pdev = vb2_get_drv_priv(vq); in queue_setup() local
589 size = pwc_get_size(pdev, MAX_WIDTH, MAX_HEIGHT); in queue_setup()
612 struct pwc_device *pdev = vb2_get_drv_priv(vb->vb2_queue); in buffer_prepare() local
615 if (!pdev->udev) in buffer_prepare()
623 struct pwc_device *pdev = vb2_get_drv_priv(vb->vb2_queue); in buffer_finish() local
635 pwc_decompress(pdev, buf); in buffer_finish()
650 struct pwc_device *pdev = vb2_get_drv_priv(vb->vb2_queue); in buffer_queue() local
657 if (!pdev->udev) { in buffer_queue()
662 spin_lock_irqsave(&pdev->queued_bufs_lock, flags); in buffer_queue()
663 list_add_tail(&buf->list, &pdev->queued_bufs); in buffer_queue()
664 spin_unlock_irqrestore(&pdev->queued_bufs_lock, flags); in buffer_queue()
669 struct pwc_device *pdev = vb2_get_drv_priv(vq); in start_streaming() local
672 if (!pdev->udev) in start_streaming()
675 if (mutex_lock_interruptible(&pdev->v4l2_lock)) in start_streaming()
678 pwc_camera_power(pdev, 1); in start_streaming()
679 pwc_set_leds(pdev, leds[0], leds[1]); in start_streaming()
681 r = pwc_isoc_init(pdev); in start_streaming()
684 pwc_set_leds(pdev, 0, 0); in start_streaming()
685 pwc_camera_power(pdev, 0); in start_streaming()
687 pwc_cleanup_queued_bufs(pdev, VB2_BUF_STATE_QUEUED); in start_streaming()
689 mutex_unlock(&pdev->v4l2_lock); in start_streaming()
696 struct pwc_device *pdev = vb2_get_drv_priv(vq); in stop_streaming() local
698 mutex_lock(&pdev->v4l2_lock); in stop_streaming()
699 if (pdev->udev) { in stop_streaming()
700 pwc_set_leds(pdev, 0, 0); in stop_streaming()
701 pwc_camera_power(pdev, 0); in stop_streaming()
702 pwc_isoc_cleanup(pdev); in stop_streaming()
705 pwc_cleanup_queued_bufs(pdev, VB2_BUF_STATE_ERROR); in stop_streaming()
706 if (pdev->fill_buf) in stop_streaming()
707 vb2_buffer_done(&pdev->fill_buf->vb.vb2_buf, in stop_streaming()
709 mutex_unlock(&pdev->v4l2_lock); in stop_streaming()
735 struct pwc_device *pdev = NULL; in usb_pwc_probe() local
998 pdev = kzalloc(sizeof(struct pwc_device), GFP_KERNEL); in usb_pwc_probe()
999 if (pdev == NULL) { in usb_pwc_probe()
1003 pdev->type = type_id; in usb_pwc_probe()
1004 pdev->features = features; in usb_pwc_probe()
1005 pwc_construct(pdev); /* set min/max sizes correct */ in usb_pwc_probe()
1007 mutex_init(&pdev->v4l2_lock); in usb_pwc_probe()
1008 mutex_init(&pdev->vb_queue_lock); in usb_pwc_probe()
1009 spin_lock_init(&pdev->queued_bufs_lock); in usb_pwc_probe()
1010 INIT_LIST_HEAD(&pdev->queued_bufs); in usb_pwc_probe()
1012 pdev->udev = udev; in usb_pwc_probe()
1013 pdev->power_save = my_power_save; in usb_pwc_probe()
1016 pdev->vb_queue.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; in usb_pwc_probe()
1017 pdev->vb_queue.io_modes = VB2_MMAP | VB2_USERPTR | VB2_READ; in usb_pwc_probe()
1018 pdev->vb_queue.drv_priv = pdev; in usb_pwc_probe()
1019 pdev->vb_queue.buf_struct_size = sizeof(struct pwc_frame_buf); in usb_pwc_probe()
1020 pdev->vb_queue.ops = &pwc_vb_queue_ops; in usb_pwc_probe()
1021 pdev->vb_queue.mem_ops = &vb2_vmalloc_memops; in usb_pwc_probe()
1022 pdev->vb_queue.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; in usb_pwc_probe()
1023 rc = vb2_queue_init(&pdev->vb_queue); in usb_pwc_probe()
1030 pdev->vdev = pwc_template; in usb_pwc_probe()
1031 strcpy(pdev->vdev.name, name); in usb_pwc_probe()
1032 pdev->vdev.queue = &pdev->vb_queue; in usb_pwc_probe()
1033 pdev->vdev.queue->lock = &pdev->vb_queue_lock; in usb_pwc_probe()
1034 video_set_drvdata(&pdev->vdev, pdev); in usb_pwc_probe()
1036 pdev->release = le16_to_cpu(udev->descriptor.bcdDevice); in usb_pwc_probe()
1037 PWC_DEBUG_PROBE("Release: %04x\n", pdev->release); in usb_pwc_probe()
1040 pdev->ctrl_buf = kmalloc(sizeof(pdev->cmd_buf), GFP_KERNEL); in usb_pwc_probe()
1041 if (!pdev->ctrl_buf) { in usb_pwc_probe()
1049 if (pwc_get_cmos_sensor(pdev, &rc) >= 0) { in usb_pwc_probe()
1051 pdev->vdev.name, in usb_pwc_probe()
1057 pwc_set_leds(pdev, 0, 0); in usb_pwc_probe()
1060 rc = pwc_set_video_mode(pdev, MAX_WIDTH, MAX_HEIGHT, in usb_pwc_probe()
1066 rc = pwc_init_controls(pdev); in usb_pwc_probe()
1073 pwc_camera_power(pdev, 0); in usb_pwc_probe()
1076 pdev->v4l2_dev.release = pwc_video_release; in usb_pwc_probe()
1077 rc = v4l2_device_register(&intf->dev, &pdev->v4l2_dev); in usb_pwc_probe()
1083 pdev->v4l2_dev.ctrl_handler = &pdev->ctrl_handler; in usb_pwc_probe()
1084 pdev->vdev.v4l2_dev = &pdev->v4l2_dev; in usb_pwc_probe()
1085 pdev->vdev.lock = &pdev->v4l2_lock; in usb_pwc_probe()
1087 rc = video_register_device(&pdev->vdev, VFL_TYPE_GRABBER, -1); in usb_pwc_probe()
1092 PWC_INFO("Registered as %s.\n", video_device_node_name(&pdev->vdev)); in usb_pwc_probe()
1096 pdev->button_dev = input_allocate_device(); in usb_pwc_probe()
1097 if (!pdev->button_dev) { in usb_pwc_probe()
1102 usb_make_path(udev, pdev->button_phys, sizeof(pdev->button_phys)); in usb_pwc_probe()
1103 strlcat(pdev->button_phys, "/input0", sizeof(pdev->button_phys)); in usb_pwc_probe()
1105 pdev->button_dev->name = "PWC snapshot button"; in usb_pwc_probe()
1106 pdev->button_dev->phys = pdev->button_phys; in usb_pwc_probe()
1107 usb_to_input_id(pdev->udev, &pdev->button_dev->id); in usb_pwc_probe()
1108 pdev->button_dev->dev.parent = &pdev->udev->dev; in usb_pwc_probe()
1109 pdev->button_dev->evbit[0] = BIT_MASK(EV_KEY); in usb_pwc_probe()
1110 pdev->button_dev->keybit[BIT_WORD(KEY_CAMERA)] = BIT_MASK(KEY_CAMERA); in usb_pwc_probe()
1112 rc = input_register_device(pdev->button_dev); in usb_pwc_probe()
1114 input_free_device(pdev->button_dev); in usb_pwc_probe()
1115 pdev->button_dev = NULL; in usb_pwc_probe()
1123 video_unregister_device(&pdev->vdev); in usb_pwc_probe()
1125 v4l2_device_unregister(&pdev->v4l2_dev); in usb_pwc_probe()
1127 v4l2_ctrl_handler_free(&pdev->ctrl_handler); in usb_pwc_probe()
1129 kfree(pdev->ctrl_buf); in usb_pwc_probe()
1130 kfree(pdev); in usb_pwc_probe()
1138 struct pwc_device *pdev = container_of(v, struct pwc_device, v4l2_dev); in usb_pwc_disconnect() local
1140 mutex_lock(&pdev->vb_queue_lock); in usb_pwc_disconnect()
1141 mutex_lock(&pdev->v4l2_lock); in usb_pwc_disconnect()
1143 if (pdev->vb_queue.streaming) in usb_pwc_disconnect()
1144 pwc_isoc_cleanup(pdev); in usb_pwc_disconnect()
1145 pdev->udev = NULL; in usb_pwc_disconnect()
1147 v4l2_device_disconnect(&pdev->v4l2_dev); in usb_pwc_disconnect()
1148 video_unregister_device(&pdev->vdev); in usb_pwc_disconnect()
1149 mutex_unlock(&pdev->v4l2_lock); in usb_pwc_disconnect()
1150 mutex_unlock(&pdev->vb_queue_lock); in usb_pwc_disconnect()
1153 if (pdev->button_dev) in usb_pwc_disconnect()
1154 input_unregister_device(pdev->button_dev); in usb_pwc_disconnect()
1157 v4l2_device_put(&pdev->v4l2_dev); in usb_pwc_disconnect()