Lines Matching +full:b +full:- +full:facing
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * stk-webcam.c : Driver for Syntek 1125 USB webcam controller
6 * Copyright 2007-2008 Jaime Velasco Juan <jsagarribay@gmail.com>
9 * Copyright 2006-2007 Jonathan Corbet
25 #include <media/v4l2-common.h>
26 #include <media/v4l2-ioctl.h>
27 #include <media/v4l2-event.h>
29 #include "stk-webcam.h"
32 static int hflip = -1;
36 static int vflip = -1;
65 * typical Asus fashion (see the long long list for uvc cams inside v4l-utils),
66 * they mounted the webcam-module the wrong way up. So the hflip and vflip
72 * upside down under Linux. So now I was facing the choice of 2 options:
74 * a) Add a not-upside-down list to stkwebcam, which overrules the default.
76 * b) Do it like all the other drivers do, and make the default right for
77 * cams mounted the proper way and add an upside-down model list, with
78 * models where we need to flip-by-default.
80 * Despite knowing that going b) would cause a period of pain where we were
81 * building the table I opted to go for option b), since a) is just too ugly,
85 * So for any user report about upside-down images since kernel 3.6 ask them
104 .ident = "T12Rg-H",
107 DMI_MATCH(DMI_PRODUCT_NAME, "T12Rg-H")
126 struct usb_device *udev = dev->udev; in stk_camera_write_reg()
145 struct usb_device *udev = dev->udev; in stk_camera_read_reg()
151 return -ENOMEM; in stk_camera_read_reg()
180 return -ENODEV; in stk_start_stream()
183 return -EFAULT; in stk_start_stream()
185 ret = usb_set_interface(dev->udev, 0, 5); in stk_start_stream()
204 if (dev->isobufs[i].urb) { in stk_start_stream()
205 ret = usb_submit_urb(dev->isobufs[i].urb, GFP_KERNEL); in stk_start_stream()
206 atomic_inc(&dev->urbs_used); in stk_start_stream()
222 if (dev->isobufs != NULL) { in stk_stop_stream()
224 if (dev->isobufs[i].urb) in stk_stop_stream()
225 usb_kill_urb(dev->isobufs[i].urb); in stk_stop_stream()
230 if (usb_set_interface(dev->udev, 0, 0)) in stk_stop_stream()
281 return -ENODEV; in stk_initialise()
285 while (rv->reg != 0xffff) { in stk_initialise()
286 ret = stk_camera_write_reg(dev, rv->reg, rv->val); in stk_initialise()
295 return -1; in stk_initialise()
317 dev = (struct stk_camera *) urb->context; in stk_isoc_handler()
324 if (urb->status == -ENOENT || urb->status == -ECONNRESET in stk_isoc_handler()
325 || urb->status == -ESHUTDOWN) { in stk_isoc_handler()
326 atomic_dec(&dev->urbs_used); in stk_isoc_handler()
330 spin_lock_irqsave(&dev->spinlock, flags); in stk_isoc_handler()
332 if (urb->status != -EINPROGRESS && urb->status != 0) { in stk_isoc_handler()
333 pr_err("isoc_handler: urb->status == %d\n", urb->status); in stk_isoc_handler()
337 if (list_empty(&dev->sio_avail)) { in stk_isoc_handler()
342 fb = list_first_entry(&dev->sio_avail, in stk_isoc_handler()
344 fill = fb->buffer + fb->v4lbuf.bytesused; in stk_isoc_handler()
346 for (i = 0; i < urb->number_of_packets; i++) { in stk_isoc_handler()
347 if (urb->iso_frame_desc[i].status != 0) { in stk_isoc_handler()
348 if (urb->iso_frame_desc[i].status != -EXDEV) in stk_isoc_handler()
350 i, urb->iso_frame_desc[i].status); in stk_isoc_handler()
353 framelen = urb->iso_frame_desc[i].actual_length; in stk_isoc_handler()
354 iso_buf = urb->transfer_buffer + urb->iso_frame_desc[i].offset; in stk_isoc_handler()
369 framelen -= 8; in stk_isoc_handler()
372 if (fb->v4lbuf.bytesused != 0 in stk_isoc_handler()
373 && fb->v4lbuf.bytesused != dev->frame_size) { in stk_isoc_handler()
375 i, fb->v4lbuf.bytesused); in stk_isoc_handler()
376 fb->v4lbuf.bytesused = 0; in stk_isoc_handler()
377 fill = fb->buffer; in stk_isoc_handler()
378 } else if (fb->v4lbuf.bytesused == dev->frame_size) { in stk_isoc_handler()
379 if (list_is_singular(&dev->sio_avail)) { in stk_isoc_handler()
381 fb->v4lbuf.bytesused = 0; in stk_isoc_handler()
382 fill = fb->buffer; in stk_isoc_handler()
384 list_move_tail(dev->sio_avail.next, in stk_isoc_handler()
385 &dev->sio_full); in stk_isoc_handler()
386 wake_up(&dev->wait_frame); in stk_isoc_handler()
387 fb = list_first_entry(&dev->sio_avail, in stk_isoc_handler()
389 fb->v4lbuf.bytesused = 0; in stk_isoc_handler()
390 fill = fb->buffer; in stk_isoc_handler()
394 framelen -= 4; in stk_isoc_handler()
399 if (framelen + fb->v4lbuf.bytesused > dev->frame_size) { in stk_isoc_handler()
404 spin_unlock_irqrestore(&dev->spinlock, flags); in stk_isoc_handler()
406 spin_lock_irqsave(&dev->spinlock, flags); in stk_isoc_handler()
410 fb->v4lbuf.bytesused += framelen; in stk_isoc_handler()
414 spin_unlock_irqrestore(&dev->spinlock, flags); in stk_isoc_handler()
415 urb->dev = dev->udev; in stk_isoc_handler()
418 pr_err("Error (%d) re-submitting urb in stk_isoc_handler\n", in stk_isoc_handler()
423 /* -------------------------------------------- */
433 return -ENXIO; in stk_prepare_iso()
434 udev = dev->udev; in stk_prepare_iso()
436 if (dev->isobufs) in stk_prepare_iso()
439 dev->isobufs = kcalloc(MAX_ISO_BUFS, sizeof(*dev->isobufs), in stk_prepare_iso()
441 if (dev->isobufs == NULL) { in stk_prepare_iso()
443 return -ENOMEM; in stk_prepare_iso()
446 if (dev->isobufs[i].data == NULL) { in stk_prepare_iso()
452 dev->isobufs[i].data = kbuf; in stk_prepare_iso()
455 if (dev->isobufs[i].urb == NULL) { in stk_prepare_iso()
459 dev->isobufs[i].urb = urb; in stk_prepare_iso()
462 usb_kill_urb(dev->isobufs[i].urb); in stk_prepare_iso()
463 urb = dev->isobufs[i].urb; in stk_prepare_iso()
465 urb->interval = 1; in stk_prepare_iso()
466 urb->dev = udev; in stk_prepare_iso()
467 urb->pipe = usb_rcvisocpipe(udev, dev->isoc_ep); in stk_prepare_iso()
468 urb->transfer_flags = URB_ISO_ASAP; in stk_prepare_iso()
469 urb->transfer_buffer = dev->isobufs[i].data; in stk_prepare_iso()
470 urb->transfer_buffer_length = ISO_BUFFER_SIZE; in stk_prepare_iso()
471 urb->complete = stk_isoc_handler; in stk_prepare_iso()
472 urb->context = dev; in stk_prepare_iso()
473 urb->start_frame = 0; in stk_prepare_iso()
474 urb->number_of_packets = ISO_FRAMES_PER_DESC; in stk_prepare_iso()
477 urb->iso_frame_desc[j].offset = j * ISO_MAX_FRAME_SIZE; in stk_prepare_iso()
478 urb->iso_frame_desc[j].length = ISO_MAX_FRAME_SIZE; in stk_prepare_iso()
485 for (i = 0; i < MAX_ISO_BUFS && dev->isobufs[i].data; i++) in stk_prepare_iso()
486 kfree(dev->isobufs[i].data); in stk_prepare_iso()
487 for (i = 0; i < MAX_ISO_BUFS && dev->isobufs[i].urb; i++) in stk_prepare_iso()
488 usb_free_urb(dev->isobufs[i].urb); in stk_prepare_iso()
489 kfree(dev->isobufs); in stk_prepare_iso()
490 dev->isobufs = NULL; in stk_prepare_iso()
491 return -ENOMEM; in stk_prepare_iso()
498 if (dev == NULL || dev->isobufs == NULL) in stk_clean_iso()
504 urb = dev->isobufs[i].urb; in stk_clean_iso()
506 if (atomic_read(&dev->urbs_used) && is_present(dev)) in stk_clean_iso()
510 kfree(dev->isobufs[i].data); in stk_clean_iso()
512 kfree(dev->isobufs); in stk_clean_iso()
513 dev->isobufs = NULL; in stk_clean_iso()
519 struct stk_sio_buffer *buf = dev->sio_bufs + index; in stk_setup_siobuf()
520 INIT_LIST_HEAD(&buf->list); in stk_setup_siobuf()
521 buf->v4lbuf.length = PAGE_ALIGN(dev->frame_size); in stk_setup_siobuf()
522 buf->buffer = vmalloc_user(buf->v4lbuf.length); in stk_setup_siobuf()
523 if (buf->buffer == NULL) in stk_setup_siobuf()
524 return -ENOMEM; in stk_setup_siobuf()
525 buf->mapcount = 0; in stk_setup_siobuf()
526 buf->dev = dev; in stk_setup_siobuf()
527 buf->v4lbuf.index = index; in stk_setup_siobuf()
528 buf->v4lbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; in stk_setup_siobuf()
529 buf->v4lbuf.flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; in stk_setup_siobuf()
530 buf->v4lbuf.field = V4L2_FIELD_NONE; in stk_setup_siobuf()
531 buf->v4lbuf.memory = V4L2_MEMORY_MMAP; in stk_setup_siobuf()
532 buf->v4lbuf.m.offset = 2*index*buf->v4lbuf.length; in stk_setup_siobuf()
541 if (dev->n_sbufs == 0 || dev->sio_bufs == NULL) in stk_free_sio_buffers()
546 for (i = 0; i < dev->n_sbufs; i++) { in stk_free_sio_buffers()
547 if (dev->sio_bufs[i].mapcount > 0) in stk_free_sio_buffers()
548 return -EBUSY; in stk_free_sio_buffers()
553 spin_lock_irqsave(&dev->spinlock, flags); in stk_free_sio_buffers()
554 INIT_LIST_HEAD(&dev->sio_avail); in stk_free_sio_buffers()
555 INIT_LIST_HEAD(&dev->sio_full); in stk_free_sio_buffers()
556 nbufs = dev->n_sbufs; in stk_free_sio_buffers()
557 dev->n_sbufs = 0; in stk_free_sio_buffers()
558 spin_unlock_irqrestore(&dev->spinlock, flags); in stk_free_sio_buffers()
560 vfree(dev->sio_bufs[i].buffer); in stk_free_sio_buffers()
561 kfree(dev->sio_bufs); in stk_free_sio_buffers()
562 dev->sio_bufs = NULL; in stk_free_sio_buffers()
569 if (dev->sio_bufs != NULL) in stk_prepare_sio_buffers()
572 dev->sio_bufs = kcalloc(n_sbufs, in stk_prepare_sio_buffers()
575 if (dev->sio_bufs == NULL) in stk_prepare_sio_buffers()
576 return -ENOMEM; in stk_prepare_sio_buffers()
579 return (dev->n_sbufs > 1 ? 0 : -ENOMEM); in stk_prepare_sio_buffers()
580 dev->n_sbufs = i+1; in stk_prepare_sio_buffers()
607 /* -------------------------------------------- */
617 return -ENXIO; in v4l_stk_open()
619 if (mutex_lock_interruptible(&dev->lock)) in v4l_stk_open()
620 return -ERESTARTSYS; in v4l_stk_open()
621 if (!dev->first_init) in v4l_stk_open()
624 dev->first_init = 0; in v4l_stk_open()
628 usb_autopm_get_interface(dev->interface); in v4l_stk_open()
629 mutex_unlock(&dev->lock); in v4l_stk_open()
637 mutex_lock(&dev->lock); in v4l_stk_release()
638 if (dev->owner == fp) { in v4l_stk_release()
643 dev->owner = NULL; in v4l_stk_release()
646 usb_autopm_put_interface(dev->interface); in v4l_stk_release()
647 mutex_unlock(&dev->lock); in v4l_stk_release()
661 return -EIO; in stk_read()
662 if (dev->owner && (!dev->reading || dev->owner != fp)) in stk_read()
663 return -EBUSY; in stk_read()
664 dev->owner = fp; in stk_read()
669 return -ENOMEM; in stk_read()
670 dev->reading = 1; in stk_read()
671 spin_lock_irqsave(&dev->spinlock, flags); in stk_read()
672 for (i = 0; i < dev->n_sbufs; i++) { in stk_read()
673 list_add_tail(&dev->sio_bufs[i].list, &dev->sio_avail); in stk_read()
674 dev->sio_bufs[i].v4lbuf.flags = V4L2_BUF_FLAG_QUEUED; in stk_read()
676 spin_unlock_irqrestore(&dev->spinlock, flags); in stk_read()
679 if (fp->f_flags & O_NONBLOCK && list_empty(&dev->sio_full)) in stk_read()
680 return -EWOULDBLOCK; in stk_read()
681 ret = wait_event_interruptible(dev->wait_frame, in stk_read()
682 !list_empty(&dev->sio_full) || !is_present(dev)); in stk_read()
686 return -EIO; in stk_read()
688 if (count + *f_pos > dev->frame_size) in stk_read()
689 count = dev->frame_size - *f_pos; in stk_read()
690 spin_lock_irqsave(&dev->spinlock, flags); in stk_read()
691 if (list_empty(&dev->sio_full)) { in stk_read()
692 spin_unlock_irqrestore(&dev->spinlock, flags); in stk_read()
696 sbuf = list_first_entry(&dev->sio_full, struct stk_sio_buffer, list); in stk_read()
697 spin_unlock_irqrestore(&dev->spinlock, flags); in stk_read()
699 if (copy_to_user(buf, sbuf->buffer + *f_pos, count)) in stk_read()
700 return -EFAULT; in stk_read()
704 if (*f_pos >= dev->frame_size) { in stk_read()
706 spin_lock_irqsave(&dev->spinlock, flags); in stk_read()
707 list_move_tail(&sbuf->list, &dev->sio_avail); in stk_read()
708 spin_unlock_irqrestore(&dev->spinlock, flags); in stk_read()
719 if (mutex_lock_interruptible(&dev->lock)) in v4l_stk_read()
720 return -ERESTARTSYS; in v4l_stk_read()
722 mutex_unlock(&dev->lock); in v4l_stk_read()
731 poll_wait(fp, &dev->wait_frame, wait); in v4l_stk_poll()
736 if (!list_empty(&dev->sio_full)) in v4l_stk_poll()
745 struct stk_sio_buffer *sbuf = vma->vm_private_data; in stk_v4l_vm_open()
746 sbuf->mapcount++; in stk_v4l_vm_open()
750 struct stk_sio_buffer *sbuf = vma->vm_private_data; in stk_v4l_vm_close()
751 sbuf->mapcount--; in stk_v4l_vm_close()
752 if (sbuf->mapcount == 0) in stk_v4l_vm_close()
753 sbuf->v4lbuf.flags &= ~V4L2_BUF_FLAG_MAPPED; in stk_v4l_vm_close()
764 unsigned long offset = vma->vm_pgoff << PAGE_SHIFT; in v4l_stk_mmap()
768 if (!(vma->vm_flags & VM_WRITE) || !(vma->vm_flags & VM_SHARED)) in v4l_stk_mmap()
769 return -EINVAL; in v4l_stk_mmap()
771 for (i = 0; i < dev->n_sbufs; i++) { in v4l_stk_mmap()
772 if (dev->sio_bufs[i].v4lbuf.m.offset == offset) { in v4l_stk_mmap()
773 sbuf = dev->sio_bufs + i; in v4l_stk_mmap()
778 return -EINVAL; in v4l_stk_mmap()
779 ret = remap_vmalloc_range(vma, sbuf->buffer, 0); in v4l_stk_mmap()
782 vma->vm_flags |= VM_DONTEXPAND; in v4l_stk_mmap()
783 vma->vm_private_data = sbuf; in v4l_stk_mmap()
784 vma->vm_ops = &stk_v4l_vm_ops; in v4l_stk_mmap()
785 sbuf->v4lbuf.flags |= V4L2_BUF_FLAG_MAPPED; in v4l_stk_mmap()
797 strscpy(cap->driver, "stk", sizeof(cap->driver)); in stk_vidioc_querycap()
798 strscpy(cap->card, "stk", sizeof(cap->card)); in stk_vidioc_querycap()
799 usb_make_path(dev->udev, cap->bus_info, sizeof(cap->bus_info)); in stk_vidioc_querycap()
806 if (input->index != 0) in stk_vidioc_enum_input()
807 return -EINVAL; in stk_vidioc_enum_input()
809 strscpy(input->name, "Syntek USB Camera", sizeof(input->name)); in stk_vidioc_enum_input()
810 input->type = V4L2_INPUT_TYPE_CAMERA; in stk_vidioc_enum_input()
823 return i ? -EINVAL : 0; in stk_vidioc_s_input()
829 container_of(ctrl->handler, struct stk_camera, hdl); in stk_s_ctrl()
831 switch (ctrl->id) { in stk_s_ctrl()
833 return stk_sensor_set_brightness(dev, ctrl->val); in stk_s_ctrl()
836 dev->vsettings.hflip = !ctrl->val; in stk_s_ctrl()
838 dev->vsettings.hflip = ctrl->val; in stk_s_ctrl()
842 dev->vsettings.vflip = !ctrl->val; in stk_s_ctrl()
844 dev->vsettings.vflip = ctrl->val; in stk_s_ctrl()
847 return -EINVAL; in stk_s_ctrl()
856 switch (fmtd->index) { in stk_vidioc_enum_fmt_vid_cap()
858 fmtd->pixelformat = V4L2_PIX_FMT_RGB565; in stk_vidioc_enum_fmt_vid_cap()
861 fmtd->pixelformat = V4L2_PIX_FMT_RGB565X; in stk_vidioc_enum_fmt_vid_cap()
864 fmtd->pixelformat = V4L2_PIX_FMT_UYVY; in stk_vidioc_enum_fmt_vid_cap()
867 fmtd->pixelformat = V4L2_PIX_FMT_SBGGR8; in stk_vidioc_enum_fmt_vid_cap()
870 fmtd->pixelformat = V4L2_PIX_FMT_YUYV; in stk_vidioc_enum_fmt_vid_cap()
873 return -EINVAL; in stk_vidioc_enum_fmt_vid_cap()
893 struct v4l2_pix_format *pix_format = &f->fmt.pix; in stk_vidioc_g_fmt_vid_cap()
898 stk_sizes[i].m != dev->vsettings.mode; i++) in stk_vidioc_g_fmt_vid_cap()
902 return -EINVAL; in stk_vidioc_g_fmt_vid_cap()
904 pix_format->width = stk_sizes[i].w; in stk_vidioc_g_fmt_vid_cap()
905 pix_format->height = stk_sizes[i].h; in stk_vidioc_g_fmt_vid_cap()
906 pix_format->field = V4L2_FIELD_NONE; in stk_vidioc_g_fmt_vid_cap()
907 pix_format->colorspace = V4L2_COLORSPACE_SRGB; in stk_vidioc_g_fmt_vid_cap()
908 pix_format->pixelformat = dev->vsettings.palette; in stk_vidioc_g_fmt_vid_cap()
909 if (dev->vsettings.palette == V4L2_PIX_FMT_SBGGR8) in stk_vidioc_g_fmt_vid_cap()
910 pix_format->bytesperline = pix_format->width; in stk_vidioc_g_fmt_vid_cap()
912 pix_format->bytesperline = 2 * pix_format->width; in stk_vidioc_g_fmt_vid_cap()
913 pix_format->sizeimage = pix_format->bytesperline in stk_vidioc_g_fmt_vid_cap()
914 * pix_format->height; in stk_vidioc_g_fmt_vid_cap()
922 switch (fmtd->fmt.pix.pixelformat) { in stk_try_fmt_vid_cap()
930 return -EINVAL; in stk_try_fmt_vid_cap()
933 if (fmtd->fmt.pix.width > stk_sizes[i].w) in stk_try_fmt_vid_cap()
937 || (abs(fmtd->fmt.pix.width - stk_sizes[i-1].w) in stk_try_fmt_vid_cap()
938 < abs(fmtd->fmt.pix.width - stk_sizes[i].w))) { in stk_try_fmt_vid_cap()
939 fmtd->fmt.pix.height = stk_sizes[i-1].h; in stk_try_fmt_vid_cap()
940 fmtd->fmt.pix.width = stk_sizes[i-1].w; in stk_try_fmt_vid_cap()
942 *idx = i - 1; in stk_try_fmt_vid_cap()
944 fmtd->fmt.pix.height = stk_sizes[i].h; in stk_try_fmt_vid_cap()
945 fmtd->fmt.pix.width = stk_sizes[i].w; in stk_try_fmt_vid_cap()
950 fmtd->fmt.pix.field = V4L2_FIELD_NONE; in stk_try_fmt_vid_cap()
951 fmtd->fmt.pix.colorspace = V4L2_COLORSPACE_SRGB; in stk_try_fmt_vid_cap()
952 if (fmtd->fmt.pix.pixelformat == V4L2_PIX_FMT_SBGGR8) in stk_try_fmt_vid_cap()
953 fmtd->fmt.pix.bytesperline = fmtd->fmt.pix.width; in stk_try_fmt_vid_cap()
955 fmtd->fmt.pix.bytesperline = 2 * fmtd->fmt.pix.width; in stk_try_fmt_vid_cap()
956 fmtd->fmt.pix.sizeimage = fmtd->fmt.pix.bytesperline in stk_try_fmt_vid_cap()
957 * fmtd->fmt.pix.height; in stk_try_fmt_vid_cap()
971 if (dev->vsettings.palette == V4L2_PIX_FMT_SBGGR8) in stk_setup_format()
976 stk_sizes[i].m != dev->vsettings.mode) in stk_setup_format()
980 return -EFAULT; in stk_setup_format()
984 if (dev->vsettings.mode == MODE_SXGA) in stk_setup_format()
1011 return -ENODEV; in stk_vidioc_s_fmt_vid_cap()
1013 return -ENODEV; in stk_vidioc_s_fmt_vid_cap()
1015 return -EBUSY; in stk_vidioc_s_fmt_vid_cap()
1016 if (dev->owner) in stk_vidioc_s_fmt_vid_cap()
1017 return -EBUSY; in stk_vidioc_s_fmt_vid_cap()
1022 dev->vsettings.palette = fmtd->fmt.pix.pixelformat; in stk_vidioc_s_fmt_vid_cap()
1024 dev->frame_size = fmtd->fmt.pix.sizeimage; in stk_vidioc_s_fmt_vid_cap()
1025 dev->vsettings.mode = stk_sizes[idx].m; in stk_vidioc_s_fmt_vid_cap()
1037 return -ENODEV; in stk_vidioc_reqbufs()
1038 if (rb->memory != V4L2_MEMORY_MMAP) in stk_vidioc_reqbufs()
1039 return -EINVAL; in stk_vidioc_reqbufs()
1041 || (dev->owner && dev->owner != filp)) in stk_vidioc_reqbufs()
1042 return -EBUSY; in stk_vidioc_reqbufs()
1044 if (rb->count == 0) { in stk_vidioc_reqbufs()
1047 dev->owner = NULL; in stk_vidioc_reqbufs()
1050 dev->owner = filp; in stk_vidioc_reqbufs()
1053 if (rb->count < 3) in stk_vidioc_reqbufs()
1054 rb->count = 3; in stk_vidioc_reqbufs()
1056 else if (rb->count > 5) in stk_vidioc_reqbufs()
1057 rb->count = 5; in stk_vidioc_reqbufs()
1059 stk_allocate_buffers(dev, rb->count); in stk_vidioc_reqbufs()
1060 rb->count = dev->n_sbufs; in stk_vidioc_reqbufs()
1070 if (buf->index >= dev->n_sbufs) in stk_vidioc_querybuf()
1071 return -EINVAL; in stk_vidioc_querybuf()
1072 sbuf = dev->sio_bufs + buf->index; in stk_vidioc_querybuf()
1073 *buf = sbuf->v4lbuf; in stk_vidioc_querybuf()
1084 if (buf->memory != V4L2_MEMORY_MMAP) in stk_vidioc_qbuf()
1085 return -EINVAL; in stk_vidioc_qbuf()
1087 if (buf->index >= dev->n_sbufs) in stk_vidioc_qbuf()
1088 return -EINVAL; in stk_vidioc_qbuf()
1089 sbuf = dev->sio_bufs + buf->index; in stk_vidioc_qbuf()
1090 if (sbuf->v4lbuf.flags & V4L2_BUF_FLAG_QUEUED) in stk_vidioc_qbuf()
1092 sbuf->v4lbuf.flags |= V4L2_BUF_FLAG_QUEUED; in stk_vidioc_qbuf()
1093 sbuf->v4lbuf.flags &= ~V4L2_BUF_FLAG_DONE; in stk_vidioc_qbuf()
1094 spin_lock_irqsave(&dev->spinlock, flags); in stk_vidioc_qbuf()
1095 list_add_tail(&sbuf->list, &dev->sio_avail); in stk_vidioc_qbuf()
1096 *buf = sbuf->v4lbuf; in stk_vidioc_qbuf()
1097 spin_unlock_irqrestore(&dev->spinlock, flags); in stk_vidioc_qbuf()
1110 return -EINVAL; in stk_vidioc_dqbuf()
1112 if (filp->f_flags & O_NONBLOCK && list_empty(&dev->sio_full)) in stk_vidioc_dqbuf()
1113 return -EWOULDBLOCK; in stk_vidioc_dqbuf()
1114 ret = wait_event_interruptible(dev->wait_frame, in stk_vidioc_dqbuf()
1115 !list_empty(&dev->sio_full) || !is_present(dev)); in stk_vidioc_dqbuf()
1119 return -EIO; in stk_vidioc_dqbuf()
1121 spin_lock_irqsave(&dev->spinlock, flags); in stk_vidioc_dqbuf()
1122 sbuf = list_first_entry(&dev->sio_full, struct stk_sio_buffer, list); in stk_vidioc_dqbuf()
1123 list_del_init(&sbuf->list); in stk_vidioc_dqbuf()
1124 spin_unlock_irqrestore(&dev->spinlock, flags); in stk_vidioc_dqbuf()
1125 sbuf->v4lbuf.flags &= ~V4L2_BUF_FLAG_QUEUED; in stk_vidioc_dqbuf()
1126 sbuf->v4lbuf.flags |= V4L2_BUF_FLAG_DONE; in stk_vidioc_dqbuf()
1127 sbuf->v4lbuf.sequence = ++dev->sequence; in stk_vidioc_dqbuf()
1128 v4l2_buffer_set_timestamp(&sbuf->v4lbuf, ktime_get_ns()); in stk_vidioc_dqbuf()
1130 *buf = sbuf->v4lbuf; in stk_vidioc_dqbuf()
1140 if (dev->sio_bufs == NULL) in stk_vidioc_streamon()
1141 return -EINVAL; in stk_vidioc_streamon()
1142 dev->sequence = 0; in stk_vidioc_streamon()
1153 spin_lock_irqsave(&dev->spinlock, flags); in stk_vidioc_streamoff()
1154 INIT_LIST_HEAD(&dev->sio_avail); in stk_vidioc_streamoff()
1155 INIT_LIST_HEAD(&dev->sio_full); in stk_vidioc_streamoff()
1156 for (i = 0; i < dev->n_sbufs; i++) { in stk_vidioc_streamoff()
1157 INIT_LIST_HEAD(&dev->sio_bufs[i].list); in stk_vidioc_streamoff()
1158 dev->sio_bufs[i].v4lbuf.flags = 0; in stk_vidioc_streamoff()
1160 spin_unlock_irqrestore(&dev->spinlock, flags); in stk_vidioc_streamoff()
1169 sp->parm.capture.timeperframe.numerator = 1; in stk_vidioc_g_parm()
1170 sp->parm.capture.timeperframe.denominator = 30; in stk_vidioc_g_parm()
1171 sp->parm.capture.readbuffers = 2; in stk_vidioc_g_parm()
1178 if (frms->index >= ARRAY_SIZE(stk_sizes)) in stk_vidioc_enum_framesizes()
1179 return -EINVAL; in stk_vidioc_enum_framesizes()
1180 switch (frms->pixel_format) { in stk_vidioc_enum_framesizes()
1186 frms->type = V4L2_FRMSIZE_TYPE_DISCRETE; in stk_vidioc_enum_framesizes()
1187 frms->discrete.width = stk_sizes[frms->index].w; in stk_vidioc_enum_framesizes()
1188 frms->discrete.height = stk_sizes[frms->index].h; in stk_vidioc_enum_framesizes()
1190 default: return -EINVAL; in stk_vidioc_enum_framesizes()
1234 if (dev->sio_bufs != NULL || dev->isobufs != NULL) in stk_v4l_dev_release()
1236 usb_put_intf(dev->interface); in stk_v4l_dev_release()
1251 dev->vdev = stk_v4l_data; in stk_register_video_device()
1252 dev->vdev.lock = &dev->lock; in stk_register_video_device()
1253 dev->vdev.v4l2_dev = &dev->v4l2_dev; in stk_register_video_device()
1254 dev->vdev.device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE | in stk_register_video_device()
1256 video_set_drvdata(&dev->vdev, dev); in stk_register_video_device()
1257 err = video_register_device(&dev->vdev, VFL_TYPE_VIDEO, -1); in stk_register_video_device()
1262 video_device_node_name(&dev->vdev)); in stk_register_video_device()
1284 return -ENOMEM; in stk_camera_probe()
1286 err = v4l2_device_register(&interface->dev, &dev->v4l2_dev); in stk_camera_probe()
1288 dev_err(&udev->dev, "couldn't register v4l2_device\n"); in stk_camera_probe()
1292 hdl = &dev->hdl; in stk_camera_probe()
1300 if (hdl->error) { in stk_camera_probe()
1301 err = hdl->error; in stk_camera_probe()
1302 dev_err(&udev->dev, "couldn't register control\n"); in stk_camera_probe()
1305 dev->v4l2_dev.ctrl_handler = hdl; in stk_camera_probe()
1307 spin_lock_init(&dev->spinlock); in stk_camera_probe()
1308 mutex_init(&dev->lock); in stk_camera_probe()
1309 init_waitqueue_head(&dev->wait_frame); in stk_camera_probe()
1310 dev->first_init = 1; /* webcam LED management */ in stk_camera_probe()
1312 dev->udev = udev; in stk_camera_probe()
1313 dev->interface = interface; in stk_camera_probe()
1316 if (hflip != -1) in stk_camera_probe()
1317 dev->vsettings.hflip = hflip; in stk_camera_probe()
1319 dev->vsettings.hflip = 1; in stk_camera_probe()
1321 dev->vsettings.hflip = 0; in stk_camera_probe()
1322 if (vflip != -1) in stk_camera_probe()
1323 dev->vsettings.vflip = vflip; in stk_camera_probe()
1325 dev->vsettings.vflip = 1; in stk_camera_probe()
1327 dev->vsettings.vflip = 0; in stk_camera_probe()
1328 dev->n_sbufs = 0; in stk_camera_probe()
1332 * use only the first isoc-in endpoint in stk_camera_probe()
1334 iface_desc = interface->cur_altsetting; in stk_camera_probe()
1336 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { in stk_camera_probe()
1337 endpoint = &iface_desc->endpoint[i].desc; in stk_camera_probe()
1339 if (!dev->isoc_ep in stk_camera_probe()
1342 dev->isoc_ep = usb_endpoint_num(endpoint); in stk_camera_probe()
1346 if (!dev->isoc_ep) { in stk_camera_probe()
1347 pr_err("Could not find isoc-in endpoint\n"); in stk_camera_probe()
1348 err = -ENODEV; in stk_camera_probe()
1351 dev->vsettings.palette = V4L2_PIX_FMT_RGB565; in stk_camera_probe()
1352 dev->vsettings.mode = MODE_VGA; in stk_camera_probe()
1353 dev->frame_size = 640 * 480 * 2; in stk_camera_probe()
1355 INIT_LIST_HEAD(&dev->sio_avail); in stk_camera_probe()
1356 INIT_LIST_HEAD(&dev->sio_full); in stk_camera_probe()
1370 v4l2_device_unregister(&dev->v4l2_dev); in stk_camera_probe()
1382 wake_up_interruptible(&dev->wait_frame); in stk_camera_disconnect()
1385 video_device_node_name(&dev->vdev)); in stk_camera_disconnect()
1387 video_unregister_device(&dev->vdev); in stk_camera_disconnect()
1388 v4l2_ctrl_handler_free(&dev->hdl); in stk_camera_disconnect()
1389 v4l2_device_unregister(&dev->v4l2_dev); in stk_camera_disconnect()