^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Main USB camera driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2008-2011 Jean-François Moine <http://moinejf.free.fr>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Camera button input handling by Márton Németh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Copyright (C) 2009-2010 Márton Németh <nm127@freemail.hu>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #define GSPCA_VERSION "2.14.0"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/vmalloc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/mm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/pagemap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <asm/page.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/uaccess.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/ktime.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <media/v4l2-ioctl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <media/v4l2-ctrls.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <media/v4l2-fh.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include <media/v4l2-event.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include "gspca.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #if IS_ENABLED(CONFIG_INPUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include <linux/input.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include <linux/usb/input.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) /* global values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define DEF_NURBS 3 /* default number of URBs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #if DEF_NURBS > MAX_NURBS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #error "DEF_NURBS too big"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) MODULE_AUTHOR("Jean-François Moine <http://moinejf.free.fr>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) MODULE_DESCRIPTION("GSPCA USB Camera Driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) MODULE_VERSION(GSPCA_VERSION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) int gspca_debug;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) EXPORT_SYMBOL(gspca_debug);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) static void PDEBUG_MODE(struct gspca_dev *gspca_dev, int debug, char *txt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) __u32 pixfmt, int w, int h)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) if ((pixfmt >> 24) >= '0' && (pixfmt >> 24) <= 'z') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) gspca_dbg(gspca_dev, debug, "%s %c%c%c%c %dx%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) txt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) pixfmt & 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) (pixfmt >> 8) & 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) (pixfmt >> 16) & 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) pixfmt >> 24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) w, h);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) gspca_dbg(gspca_dev, debug, "%s 0x%08x %dx%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) txt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) pixfmt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) w, h);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) /* specific memory types - !! should be different from V4L2_MEMORY_xxx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define GSPCA_MEMORY_NO 0 /* V4L2_MEMORY_xxx starts from 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define GSPCA_MEMORY_READ 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) * Input and interrupt endpoint handling functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #if IS_ENABLED(CONFIG_INPUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) static void int_irq(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) struct gspca_dev *gspca_dev = (struct gspca_dev *) urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) ret = urb->status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) switch (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) if (gspca_dev->sd_desc->int_pkt_scan(gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) urb->transfer_buffer, urb->actual_length) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) gspca_err(gspca_dev, "Unknown packet received\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) case -ENOENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) case -ECONNRESET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) case -ENODEV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) case -ESHUTDOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) /* Stop is requested either by software or hardware is gone,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) * keep the ret value non-zero and don't resubmit later.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) gspca_err(gspca_dev, "URB error %i, resubmitting\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) urb->status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) urb->status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) if (ret == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) ret = usb_submit_urb(urb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) pr_err("Resubmit URB failed with error %i\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) static int gspca_input_connect(struct gspca_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) struct input_dev *input_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) dev->input_dev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) if (dev->sd_desc->int_pkt_scan || dev->sd_desc->other_input) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) input_dev = input_allocate_device();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) if (!input_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) usb_make_path(dev->dev, dev->phys, sizeof(dev->phys));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) strlcat(dev->phys, "/input0", sizeof(dev->phys));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) input_dev->name = dev->sd_desc->name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) input_dev->phys = dev->phys;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) usb_to_input_id(dev->dev, &input_dev->id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) input_dev->evbit[0] = BIT_MASK(EV_KEY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) input_dev->keybit[BIT_WORD(KEY_CAMERA)] = BIT_MASK(KEY_CAMERA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) input_dev->dev.parent = &dev->dev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) err = input_register_device(input_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) pr_err("Input device registration failed with error %i\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) input_dev->dev.parent = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) input_free_device(input_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) dev->input_dev = input_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) static int alloc_and_submit_int_urb(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) struct usb_endpoint_descriptor *ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) unsigned int buffer_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) int interval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) struct usb_device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) void *buffer = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) int ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) buffer_len = le16_to_cpu(ep->wMaxPacketSize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) interval = ep->bInterval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) gspca_dbg(gspca_dev, D_CONF, "found int in endpoint: 0x%x, buffer_len=%u, interval=%u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) ep->bEndpointAddress, buffer_len, interval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) dev = gspca_dev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) urb = usb_alloc_urb(0, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) if (!urb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) ret = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) buffer = usb_alloc_coherent(dev, buffer_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) GFP_KERNEL, &urb->transfer_dma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) if (!buffer) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) ret = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) goto error_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) usb_fill_int_urb(urb, dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) usb_rcvintpipe(dev, ep->bEndpointAddress),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) buffer, buffer_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) int_irq, (void *)gspca_dev, interval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) ret = usb_submit_urb(urb, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) gspca_err(gspca_dev, "submit int URB failed with error %i\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) goto error_submit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) gspca_dev->int_urb = urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) error_submit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) usb_free_coherent(dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) urb->transfer_buffer_length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) urb->transfer_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) urb->transfer_dma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) error_buffer:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) static void gspca_input_create_urb(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) struct usb_interface *intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) struct usb_host_interface *intf_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) struct usb_endpoint_descriptor *ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) if (gspca_dev->sd_desc->int_pkt_scan) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) intf = usb_ifnum_to_if(gspca_dev->dev, gspca_dev->iface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) intf_desc = intf->cur_altsetting;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) for (i = 0; i < intf_desc->desc.bNumEndpoints; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) ep = &intf_desc->endpoint[i].desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) if (usb_endpoint_dir_in(ep) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) usb_endpoint_xfer_int(ep)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) alloc_and_submit_int_urb(gspca_dev, ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) static void gspca_input_destroy_urb(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) urb = gspca_dev->int_urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) if (urb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) gspca_dev->int_urb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) usb_kill_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) usb_free_coherent(gspca_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) urb->transfer_buffer_length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) urb->transfer_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) urb->transfer_dma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) static inline void gspca_input_destroy_urb(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) static inline void gspca_input_create_urb(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) static inline int gspca_input_connect(struct gspca_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) * fill a video frame from an URB and resubmit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) static void fill_frame(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) u8 *data; /* address of data in the iso message */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) int i, len, st;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) cam_pkt_op pkt_scan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) if (urb->status != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) if (urb->status == -ESHUTDOWN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) return; /* disconnection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) if (gspca_dev->frozen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) gspca_err(gspca_dev, "urb status: %d\n", urb->status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) urb->status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) goto resubmit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) pkt_scan = gspca_dev->sd_desc->pkt_scan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) for (i = 0; i < urb->number_of_packets; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) len = urb->iso_frame_desc[i].actual_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) /* check the packet status and length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) st = urb->iso_frame_desc[i].status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) if (st) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) gspca_dbg(gspca_dev, D_PACK, "ISOC data error: [%d] len=%d, status=%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) i, len, st);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) gspca_dev->last_packet_type = DISCARD_PACKET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) if (len == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) if (gspca_dev->empty_packet == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) gspca_dev->empty_packet = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) /* let the packet be analyzed by the subdriver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) gspca_dbg(gspca_dev, D_PACK, "packet [%d] o:%d l:%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) i, urb->iso_frame_desc[i].offset, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) data = (u8 *) urb->transfer_buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) + urb->iso_frame_desc[i].offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) pkt_scan(gspca_dev, data, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) resubmit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) if (!gspca_dev->streaming)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) /* resubmit the URB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) st = usb_submit_urb(urb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) if (st < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) pr_err("usb_submit_urb() ret %d\n", st);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) * ISOC message interrupt from the USB device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) * Analyse each packet and call the subdriver for copy to the frame buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) static void isoc_irq(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) struct gspca_dev *gspca_dev = (struct gspca_dev *) urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) gspca_dbg(gspca_dev, D_PACK, "isoc irq\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) if (!gspca_dev->streaming)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) fill_frame(gspca_dev, urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) * bulk message interrupt from the USB device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) static void bulk_irq(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) struct gspca_dev *gspca_dev = (struct gspca_dev *) urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) int st;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) gspca_dbg(gspca_dev, D_PACK, "bulk irq\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) if (!gspca_dev->streaming)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) switch (urb->status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) case -ESHUTDOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) return; /* disconnection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) if (gspca_dev->frozen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) gspca_err(gspca_dev, "urb status: %d\n", urb->status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) urb->status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) goto resubmit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) gspca_dbg(gspca_dev, D_PACK, "packet l:%d\n", urb->actual_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) gspca_dev->sd_desc->pkt_scan(gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) urb->transfer_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) urb->actual_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) resubmit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) if (!gspca_dev->streaming)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) /* resubmit the URB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) if (gspca_dev->cam.bulk_nurbs != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) st = usb_submit_urb(urb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) if (st < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) pr_err("usb_submit_urb() ret %d\n", st);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) * add data to the current frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) * This function is called by the subdrivers at interrupt level.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) * To build a frame, these ones must add
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) * - one FIRST_PACKET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) * - 0 or many INTER_PACKETs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) * - one LAST_PACKET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) * DISCARD_PACKET invalidates the whole frame.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) void gspca_frame_add(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) enum gspca_packet_type packet_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) const u8 *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) struct gspca_buffer *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) gspca_dbg(gspca_dev, D_PACK, "add t:%d l:%d\n", packet_type, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) spin_lock_irqsave(&gspca_dev->qlock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) buf = list_first_entry_or_null(&gspca_dev->buf_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) typeof(*buf), list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) spin_unlock_irqrestore(&gspca_dev->qlock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) if (packet_type == FIRST_PACKET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) /* if there is no queued buffer, discard the whole frame */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) if (!buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) gspca_dev->last_packet_type = DISCARD_PACKET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) gspca_dev->sequence++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) gspca_dev->image = vb2_plane_vaddr(&buf->vb.vb2_buf, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) gspca_dev->image_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) switch (gspca_dev->last_packet_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) case DISCARD_PACKET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) if (packet_type == LAST_PACKET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) gspca_dev->last_packet_type = packet_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) gspca_dev->image = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) gspca_dev->image_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) case LAST_PACKET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) /* append the packet to the frame buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) if (len > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) if (gspca_dev->image_len + len > PAGE_ALIGN(gspca_dev->pixfmt.sizeimage)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) gspca_err(gspca_dev, "frame overflow %d > %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) gspca_dev->image_len + len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) PAGE_ALIGN(gspca_dev->pixfmt.sizeimage));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) packet_type = DISCARD_PACKET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) /* !! image is NULL only when last pkt is LAST or DISCARD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) if (gspca_dev->image == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) pr_err("gspca_frame_add() image == NULL\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) memcpy(gspca_dev->image + gspca_dev->image_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) data, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) gspca_dev->image_len += len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) gspca_dev->last_packet_type = packet_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) /* if last packet, invalidate packet concatenation until
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) * next first packet, wake up the application and advance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) * in the queue */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) if (packet_type == LAST_PACKET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) spin_lock_irqsave(&gspca_dev->qlock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) list_del(&buf->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) spin_unlock_irqrestore(&gspca_dev->qlock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) buf->vb.vb2_buf.timestamp = ktime_get_ns();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) vb2_set_plane_payload(&buf->vb.vb2_buf, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) gspca_dev->image_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) buf->vb.sequence = gspca_dev->sequence++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) buf->vb.field = V4L2_FIELD_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) gspca_dbg(gspca_dev, D_FRAM, "frame complete len:%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) gspca_dev->image_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) gspca_dev->image = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) gspca_dev->image_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) EXPORT_SYMBOL(gspca_frame_add);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) static void destroy_urbs(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) gspca_dbg(gspca_dev, D_STREAM, "kill transfer\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) /* Killing all URBs guarantee that no URB completion
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) * handler is running. Therefore, there shouldn't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) * be anyone trying to access gspca_dev->urb[i]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) for (i = 0; i < MAX_NURBS; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) usb_kill_urb(gspca_dev->urb[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) gspca_dbg(gspca_dev, D_STREAM, "releasing urbs\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) for (i = 0; i < MAX_NURBS; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) urb = gspca_dev->urb[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) if (!urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) gspca_dev->urb[i] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) usb_free_coherent(gspca_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) urb->transfer_buffer_length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) urb->transfer_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) urb->transfer_dma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) static int gspca_set_alt0(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) if (gspca_dev->alt == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) ret = usb_set_interface(gspca_dev->dev, gspca_dev->iface, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) pr_err("set alt 0 err %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) * look for an input transfer endpoint in an alternate setting.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) * If xfer_ep is invalid, return the first valid ep found, otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) * look for exactly the ep with address equal to xfer_ep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) static struct usb_host_endpoint *alt_xfer(struct usb_host_interface *alt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) int xfer, int xfer_ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) struct usb_host_endpoint *ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) int i, attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) for (i = 0; i < alt->desc.bNumEndpoints; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) ep = &alt->endpoint[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) attr = ep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) if (attr == xfer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) && ep->desc.wMaxPacketSize != 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) && usb_endpoint_dir_in(&ep->desc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) && (xfer_ep < 0 || ep->desc.bEndpointAddress == xfer_ep))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) return ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) /* compute the minimum bandwidth for the current transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) static u32 which_bandwidth(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) u32 bandwidth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) /* get the (max) image size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) bandwidth = gspca_dev->pixfmt.sizeimage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) /* if the image is compressed, estimate its mean size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) if (!gspca_dev->cam.needs_full_bandwidth &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) bandwidth < gspca_dev->pixfmt.width *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) gspca_dev->pixfmt.height)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) bandwidth = bandwidth * 3 / 8; /* 0.375 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) /* estimate the frame rate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) if (gspca_dev->sd_desc->get_streamparm) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) struct v4l2_streamparm parm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) gspca_dev->sd_desc->get_streamparm(gspca_dev, &parm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) bandwidth *= parm.parm.capture.timeperframe.denominator;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) bandwidth /= parm.parm.capture.timeperframe.numerator;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) /* don't hope more than 15 fps with USB 1.1 and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) * image resolution >= 640x480 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) if (gspca_dev->pixfmt.width >= 640
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) && gspca_dev->dev->speed == USB_SPEED_FULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) bandwidth *= 15; /* 15 fps */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) bandwidth *= 30; /* 30 fps */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) gspca_dbg(gspca_dev, D_STREAM, "min bandwidth: %d\n", bandwidth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) return bandwidth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) /* endpoint table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) #define MAX_ALT 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) struct ep_tb_s {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) u32 alt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) u32 bandwidth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) * build the table of the endpoints
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) * and compute the minimum bandwidth for the image transfer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) static int build_isoc_ep_tb(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) struct usb_interface *intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) struct ep_tb_s *ep_tb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) struct usb_host_endpoint *ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) int i, j, nbalt, psize, found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) u32 bandwidth, last_bw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) nbalt = intf->num_altsetting;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) if (nbalt > MAX_ALT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) nbalt = MAX_ALT; /* fixme: should warn */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) /* build the endpoint table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) last_bw = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) for (;;) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) ep_tb->bandwidth = 2000 * 2000 * 120;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) found = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) for (j = 0; j < nbalt; j++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) ep = alt_xfer(&intf->altsetting[j],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) USB_ENDPOINT_XFER_ISOC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) gspca_dev->xfer_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) if (ep == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) if (ep->desc.bInterval == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) pr_err("alt %d iso endp with 0 interval\n", j);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) psize = le16_to_cpu(ep->desc.wMaxPacketSize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) psize = (psize & 0x07ff) * (1 + ((psize >> 11) & 3));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) bandwidth = psize * 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) if (gspca_dev->dev->speed == USB_SPEED_HIGH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) || gspca_dev->dev->speed >= USB_SPEED_SUPER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) bandwidth *= 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) bandwidth /= 1 << (ep->desc.bInterval - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) if (bandwidth <= last_bw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) if (bandwidth < ep_tb->bandwidth) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) ep_tb->bandwidth = bandwidth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) ep_tb->alt = j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) found = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) if (!found)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) gspca_dbg(gspca_dev, D_STREAM, "alt %d bandwidth %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) ep_tb->alt, ep_tb->bandwidth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) last_bw = ep_tb->bandwidth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) ep_tb++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) * If the camera:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) * has a usb audio class interface (a built in usb mic); and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) * is a usb 1 full speed device; and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) * uses the max full speed iso bandwidth; and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) * and has more than 1 alt setting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) * then skip the highest alt setting to spare bandwidth for the mic
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) if (gspca_dev->audio &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) gspca_dev->dev->speed == USB_SPEED_FULL &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) last_bw >= 1000000 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) i > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) gspca_dbg(gspca_dev, D_STREAM, "dev has usb audio, skipping highest alt\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) i--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) ep_tb--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) /* get the requested bandwidth and start at the highest atlsetting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) bandwidth = which_bandwidth(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) ep_tb--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) while (i > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) ep_tb--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) if (ep_tb->bandwidth < bandwidth)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) i--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) return i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) * create the URBs for image transfer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) static int create_urbs(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) struct usb_host_endpoint *ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) int n, nurbs, i, psize, npkt, bsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) /* calculate the packet size and the number of packets */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) psize = le16_to_cpu(ep->desc.wMaxPacketSize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) if (!gspca_dev->cam.bulk) { /* isoc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) /* See paragraph 5.9 / table 5-11 of the usb 2.0 spec. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) if (gspca_dev->pkt_size == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) psize = (psize & 0x07ff) * (1 + ((psize >> 11) & 3));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) psize = gspca_dev->pkt_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) npkt = gspca_dev->cam.npkt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) if (npkt == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) npkt = 32; /* default value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) bsize = psize * npkt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) gspca_dbg(gspca_dev, D_STREAM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) "isoc %d pkts size %d = bsize:%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) npkt, psize, bsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) nurbs = DEF_NURBS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) } else { /* bulk */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) npkt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) bsize = gspca_dev->cam.bulk_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) if (bsize == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) bsize = psize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) gspca_dbg(gspca_dev, D_STREAM, "bulk bsize:%d\n", bsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) if (gspca_dev->cam.bulk_nurbs != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) nurbs = gspca_dev->cam.bulk_nurbs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) nurbs = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) for (n = 0; n < nurbs; n++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) urb = usb_alloc_urb(npkt, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) if (!urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) gspca_dev->urb[n] = urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) urb->transfer_buffer = usb_alloc_coherent(gspca_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) bsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) GFP_KERNEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) &urb->transfer_dma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) if (urb->transfer_buffer == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) pr_err("usb_alloc_coherent failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) urb->dev = gspca_dev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) urb->context = gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) urb->transfer_buffer_length = bsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) if (npkt != 0) { /* ISOC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) urb->pipe = usb_rcvisocpipe(gspca_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) ep->desc.bEndpointAddress);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) urb->transfer_flags = URB_ISO_ASAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) | URB_NO_TRANSFER_DMA_MAP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) urb->interval = 1 << (ep->desc.bInterval - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) urb->complete = isoc_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) urb->number_of_packets = npkt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) for (i = 0; i < npkt; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) urb->iso_frame_desc[i].length = psize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) urb->iso_frame_desc[i].offset = psize * i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) } else { /* bulk */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) urb->pipe = usb_rcvbulkpipe(gspca_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) ep->desc.bEndpointAddress);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) urb->complete = bulk_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) /* Note: both the queue and the usb locks should be held when calling this */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) static void gspca_stream_off(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) gspca_dev->streaming = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) gspca_dev->usb_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) if (gspca_dev->sd_desc->stopN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) gspca_dev->sd_desc->stopN(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) destroy_urbs(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) gspca_input_destroy_urb(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) gspca_set_alt0(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) if (gspca_dev->present)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) gspca_input_create_urb(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) if (gspca_dev->sd_desc->stop0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) gspca_dev->sd_desc->stop0(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) gspca_dbg(gspca_dev, D_STREAM, "stream off OK\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) * start the USB transfer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) static int gspca_init_transfer(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) struct usb_interface *intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) struct usb_host_endpoint *ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) struct ep_tb_s ep_tb[MAX_ALT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) int n, ret, xfer, alt, alt_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) /* reset the streaming variables */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) gspca_dev->image = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) gspca_dev->image_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) gspca_dev->last_packet_type = DISCARD_PACKET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) gspca_dev->usb_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) /* do the specific subdriver stuff before endpoint selection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) intf = usb_ifnum_to_if(gspca_dev->dev, gspca_dev->iface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) gspca_dev->alt = gspca_dev->cam.bulk ? intf->num_altsetting : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) if (gspca_dev->sd_desc->isoc_init) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) ret = gspca_dev->sd_desc->isoc_init(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) xfer = gspca_dev->cam.bulk ? USB_ENDPOINT_XFER_BULK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) : USB_ENDPOINT_XFER_ISOC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) /* if bulk or the subdriver forced an altsetting, get the endpoint */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) if (gspca_dev->alt != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) gspca_dev->alt--; /* (previous version compatibility) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) ep = alt_xfer(&intf->altsetting[gspca_dev->alt], xfer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) gspca_dev->xfer_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) if (ep == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) pr_err("bad altsetting %d\n", gspca_dev->alt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) ep_tb[0].alt = gspca_dev->alt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) alt_idx = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) /* else, compute the minimum bandwidth
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) * and build the endpoint table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) alt_idx = build_isoc_ep_tb(gspca_dev, intf, ep_tb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) if (alt_idx <= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) pr_err("no transfer endpoint found\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) /* set the highest alternate setting and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) * loop until urb submit succeeds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) gspca_input_destroy_urb(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) gspca_dev->alt = ep_tb[--alt_idx].alt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) alt = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) for (;;) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) if (alt != gspca_dev->alt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) alt = gspca_dev->alt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) if (intf->num_altsetting > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) ret = usb_set_interface(gspca_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) gspca_dev->iface,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) alt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) if (ret == -ENOSPC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) goto retry; /*fixme: ugly*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) pr_err("set alt %d err %d\n", alt, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) if (!gspca_dev->cam.no_urb_create) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) gspca_dbg(gspca_dev, D_STREAM, "init transfer alt %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) alt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) ret = create_urbs(gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) alt_xfer(&intf->altsetting[alt], xfer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) gspca_dev->xfer_ep));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) destroy_urbs(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) /* clear the bulk endpoint */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) if (gspca_dev->cam.bulk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) usb_clear_halt(gspca_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) gspca_dev->urb[0]->pipe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) /* start the cam */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) ret = gspca_dev->sd_desc->start(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) destroy_urbs(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) v4l2_ctrl_handler_setup(gspca_dev->vdev.ctrl_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) gspca_dev->streaming = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) /* some bulk transfers are started by the subdriver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) if (gspca_dev->cam.bulk && gspca_dev->cam.bulk_nurbs == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) /* submit the URBs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) for (n = 0; n < MAX_NURBS; n++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) urb = gspca_dev->urb[n];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) if (urb == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) ret = usb_submit_urb(urb, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) if (ret >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) break; /* transfer is started */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) /* something when wrong
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) * stop the webcam and free the transfer resources */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) gspca_stream_off(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) if (ret != -ENOSPC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) pr_err("usb_submit_urb alt %d err %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) gspca_dev->alt, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) /* the bandwidth is not wide enough
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) * negotiate or try a lower alternate setting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) retry:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) gspca_err(gspca_dev, "alt %d - bandwidth not wide enough, trying again\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) alt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) msleep(20); /* wait for kill complete */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) if (gspca_dev->sd_desc->isoc_nego) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) ret = gspca_dev->sd_desc->isoc_nego(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) if (alt_idx <= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) pr_err("no transfer endpoint found\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) ret = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) gspca_dev->alt = ep_tb[--alt_idx].alt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) gspca_input_create_urb(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) static void gspca_set_default_mode(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) i = gspca_dev->cam.nmodes - 1; /* take the highest mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) gspca_dev->curr_mode = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) gspca_dev->pixfmt = gspca_dev->cam.cam_mode[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) /* does nothing if ctrl_handler == NULL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) v4l2_ctrl_handler_setup(gspca_dev->vdev.ctrl_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) static int wxh_to_mode(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) int width, int height, u32 pixelformat)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) for (i = 0; i < gspca_dev->cam.nmodes; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) if (width == gspca_dev->cam.cam_mode[i].width
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) && height == gspca_dev->cam.cam_mode[i].height
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) && pixelformat == gspca_dev->cam.cam_mode[i].pixelformat)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) return i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) static int wxh_to_nearest_mode(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) int width, int height, u32 pixelformat)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) for (i = gspca_dev->cam.nmodes; --i >= 0; ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) if (width >= gspca_dev->cam.cam_mode[i].width
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) && height >= gspca_dev->cam.cam_mode[i].height
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) && pixelformat == gspca_dev->cam.cam_mode[i].pixelformat)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) return i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) for (i = gspca_dev->cam.nmodes; --i > 0; ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) if (width >= gspca_dev->cam.cam_mode[i].width
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) && height >= gspca_dev->cam.cam_mode[i].height)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) return i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) * search a mode with the right pixel format
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) static int gspca_get_mode(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) int mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) int pixfmt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) int modeU, modeD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) modeU = modeD = mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) while ((modeU < gspca_dev->cam.nmodes) || modeD >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) if (--modeD >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) if (gspca_dev->cam.cam_mode[modeD].pixelformat
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) == pixfmt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) return modeD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) if (++modeU < gspca_dev->cam.nmodes) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) if (gspca_dev->cam.cam_mode[modeU].pixelformat
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) == pixfmt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) return modeU;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) #ifdef CONFIG_VIDEO_ADV_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) static int vidioc_g_chip_info(struct file *file, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) struct v4l2_dbg_chip_info *chip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) struct gspca_dev *gspca_dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) gspca_dev->usb_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) if (gspca_dev->sd_desc->get_chip_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) return gspca_dev->sd_desc->get_chip_info(gspca_dev, chip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) return chip->match.addr ? -EINVAL : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) static int vidioc_g_register(struct file *file, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) struct v4l2_dbg_register *reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) struct gspca_dev *gspca_dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) gspca_dev->usb_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) return gspca_dev->sd_desc->get_register(gspca_dev, reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) static int vidioc_s_register(struct file *file, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) const struct v4l2_dbg_register *reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) struct gspca_dev *gspca_dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) gspca_dev->usb_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) return gspca_dev->sd_desc->set_register(gspca_dev, reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) struct v4l2_fmtdesc *fmtdesc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) struct gspca_dev *gspca_dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) int i, j, index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) __u32 fmt_tb[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) /* give an index to each format */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) for (i = gspca_dev->cam.nmodes; --i >= 0; ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) fmt_tb[index] = gspca_dev->cam.cam_mode[i].pixelformat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) j = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) for (;;) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) if (fmt_tb[j] == fmt_tb[index])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) j++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) if (j == index) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) if (fmtdesc->index == index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) break; /* new format */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) if (index >= ARRAY_SIZE(fmt_tb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) if (i < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) return -EINVAL; /* no more format */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) fmtdesc->pixelformat = fmt_tb[index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) static int vidioc_g_fmt_vid_cap(struct file *file, void *_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) struct v4l2_format *fmt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) struct gspca_dev *gspca_dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) u32 priv = fmt->fmt.pix.priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) fmt->fmt.pix = gspca_dev->pixfmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) /* some drivers use priv internally, so keep the original value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) fmt->fmt.pix.priv = priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) static int try_fmt_vid_cap(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) struct v4l2_format *fmt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) int w, h, mode, mode2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) w = fmt->fmt.pix.width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) h = fmt->fmt.pix.height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) PDEBUG_MODE(gspca_dev, D_CONF, "try fmt cap",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) fmt->fmt.pix.pixelformat, w, h);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) /* search the nearest mode for width and height */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) mode = wxh_to_nearest_mode(gspca_dev, w, h, fmt->fmt.pix.pixelformat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) /* OK if right palette */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) if (gspca_dev->cam.cam_mode[mode].pixelformat
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) != fmt->fmt.pix.pixelformat) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) /* else, search the closest mode with the same pixel format */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) mode2 = gspca_get_mode(gspca_dev, mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) fmt->fmt.pix.pixelformat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) if (mode2 >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) mode = mode2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) fmt->fmt.pix = gspca_dev->cam.cam_mode[mode];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) if (gspca_dev->sd_desc->try_fmt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) /* pass original resolution to subdriver try_fmt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) fmt->fmt.pix.width = w;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) fmt->fmt.pix.height = h;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) gspca_dev->sd_desc->try_fmt(gspca_dev, fmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) return mode; /* used when s_fmt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) static int vidioc_try_fmt_vid_cap(struct file *file, void *_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) struct v4l2_format *fmt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) struct gspca_dev *gspca_dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) u32 priv = fmt->fmt.pix.priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) if (try_fmt_vid_cap(gspca_dev, fmt) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) /* some drivers use priv internally, so keep the original value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) fmt->fmt.pix.priv = priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) static int vidioc_s_fmt_vid_cap(struct file *file, void *_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) struct v4l2_format *fmt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) struct gspca_dev *gspca_dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) u32 priv = fmt->fmt.pix.priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) int mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) if (vb2_is_busy(&gspca_dev->queue))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) mode = try_fmt_vid_cap(gspca_dev, fmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) if (mode < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) gspca_dev->curr_mode = mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) if (gspca_dev->sd_desc->try_fmt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) /* subdriver try_fmt can modify format parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) gspca_dev->pixfmt = fmt->fmt.pix;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) gspca_dev->pixfmt = gspca_dev->cam.cam_mode[mode];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) /* some drivers use priv internally, so keep the original value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) fmt->fmt.pix.priv = priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) static int vidioc_enum_framesizes(struct file *file, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) struct v4l2_frmsizeenum *fsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) struct gspca_dev *gspca_dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) __u32 index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) if (gspca_dev->sd_desc->enum_framesizes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) return gspca_dev->sd_desc->enum_framesizes(gspca_dev, fsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) for (i = 0; i < gspca_dev->cam.nmodes; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) if (fsize->pixel_format !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) gspca_dev->cam.cam_mode[i].pixelformat)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) if (fsize->index == index) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) fsize->discrete.width =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) gspca_dev->cam.cam_mode[i].width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) fsize->discrete.height =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) gspca_dev->cam.cam_mode[i].height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) static int vidioc_enum_frameintervals(struct file *filp, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) struct v4l2_frmivalenum *fival)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) struct gspca_dev *gspca_dev = video_drvdata(filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) int mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) __u32 i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) mode = wxh_to_mode(gspca_dev, fival->width, fival->height,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) fival->pixel_format);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) if (mode < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) if (gspca_dev->cam.mode_framerates == NULL ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) gspca_dev->cam.mode_framerates[mode].nrates == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) if (fival->pixel_format !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) gspca_dev->cam.cam_mode[mode].pixelformat)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) for (i = 0; i < gspca_dev->cam.mode_framerates[mode].nrates; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) if (fival->index == i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) fival->discrete.numerator = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) fival->discrete.denominator =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) gspca_dev->cam.mode_framerates[mode].rates[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) static void gspca_release(struct v4l2_device *v4l2_device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) struct gspca_dev *gspca_dev =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) container_of(v4l2_device, struct gspca_dev, v4l2_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) v4l2_ctrl_handler_free(gspca_dev->vdev.ctrl_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) v4l2_device_unregister(&gspca_dev->v4l2_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) kfree(gspca_dev->usb_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) kfree(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) static int vidioc_querycap(struct file *file, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) struct v4l2_capability *cap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) struct gspca_dev *gspca_dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) strscpy((char *)cap->driver, gspca_dev->sd_desc->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) sizeof(cap->driver));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) if (gspca_dev->dev->product != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) strscpy((char *)cap->card, gspca_dev->dev->product,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) sizeof(cap->card));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) snprintf((char *) cap->card, sizeof cap->card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) "USB Camera (%04x:%04x)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) le16_to_cpu(gspca_dev->dev->descriptor.idVendor),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) le16_to_cpu(gspca_dev->dev->descriptor.idProduct));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) usb_make_path(gspca_dev->dev, (char *) cap->bus_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) sizeof(cap->bus_info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) static int vidioc_enum_input(struct file *file, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) struct v4l2_input *input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) struct gspca_dev *gspca_dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) if (input->index != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) input->type = V4L2_INPUT_TYPE_CAMERA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) input->status = gspca_dev->cam.input_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) strscpy(input->name, gspca_dev->sd_desc->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) sizeof input->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) *i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) if (i > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) static int vidioc_g_jpegcomp(struct file *file, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) struct v4l2_jpegcompression *jpegcomp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) struct gspca_dev *gspca_dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) gspca_dev->usb_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) return gspca_dev->sd_desc->get_jcomp(gspca_dev, jpegcomp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) static int vidioc_s_jpegcomp(struct file *file, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) const struct v4l2_jpegcompression *jpegcomp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) struct gspca_dev *gspca_dev = video_drvdata(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) gspca_dev->usb_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) return gspca_dev->sd_desc->set_jcomp(gspca_dev, jpegcomp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) static int vidioc_g_parm(struct file *filp, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) struct v4l2_streamparm *parm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) struct gspca_dev *gspca_dev = video_drvdata(filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) parm->parm.capture.readbuffers = gspca_dev->queue.min_buffers_needed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) if (!gspca_dev->sd_desc->get_streamparm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) parm->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) gspca_dev->usb_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) gspca_dev->sd_desc->get_streamparm(gspca_dev, parm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) return gspca_dev->usb_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) static int vidioc_s_parm(struct file *filp, void *priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) struct v4l2_streamparm *parm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) struct gspca_dev *gspca_dev = video_drvdata(filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) parm->parm.capture.readbuffers = gspca_dev->queue.min_buffers_needed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) if (!gspca_dev->sd_desc->set_streamparm) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) parm->parm.capture.capability = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) parm->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) gspca_dev->usb_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) gspca_dev->sd_desc->set_streamparm(gspca_dev, parm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) return gspca_dev->usb_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) static int gspca_queue_setup(struct vb2_queue *vq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) unsigned int *nbuffers, unsigned int *nplanes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) unsigned int sizes[], struct device *alloc_devs[])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) struct gspca_dev *gspca_dev = vb2_get_drv_priv(vq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) unsigned int size = PAGE_ALIGN(gspca_dev->pixfmt.sizeimage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) if (*nplanes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) return sizes[0] < size ? -EINVAL : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) *nplanes = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) sizes[0] = size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) static int gspca_buffer_prepare(struct vb2_buffer *vb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) struct gspca_dev *gspca_dev = vb2_get_drv_priv(vb->vb2_queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) unsigned long size = PAGE_ALIGN(gspca_dev->pixfmt.sizeimage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) if (vb2_plane_size(vb, 0) < size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) gspca_err(gspca_dev, "buffer too small (%lu < %lu)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) vb2_plane_size(vb, 0), size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) static void gspca_buffer_finish(struct vb2_buffer *vb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) struct gspca_dev *gspca_dev = vb2_get_drv_priv(vb->vb2_queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) if (!gspca_dev->sd_desc->dq_callback)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) gspca_dev->usb_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) if (gspca_dev->present)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) gspca_dev->sd_desc->dq_callback(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) static void gspca_buffer_queue(struct vb2_buffer *vb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) struct gspca_dev *gspca_dev = vb2_get_drv_priv(vb->vb2_queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) struct gspca_buffer *buf = to_gspca_buffer(vb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) spin_lock_irqsave(&gspca_dev->qlock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) list_add_tail(&buf->list, &gspca_dev->buf_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) spin_unlock_irqrestore(&gspca_dev->qlock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) static void gspca_return_all_buffers(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) enum vb2_buffer_state state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) struct gspca_buffer *buf, *node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) spin_lock_irqsave(&gspca_dev->qlock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) list_for_each_entry_safe(buf, node, &gspca_dev->buf_list, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) vb2_buffer_done(&buf->vb.vb2_buf, state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) list_del(&buf->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) spin_unlock_irqrestore(&gspca_dev->qlock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) static int gspca_start_streaming(struct vb2_queue *vq, unsigned int count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) struct gspca_dev *gspca_dev = vb2_get_drv_priv(vq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) gspca_dev->sequence = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) ret = gspca_init_transfer(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) gspca_return_all_buffers(gspca_dev, VB2_BUF_STATE_QUEUED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) static void gspca_stop_streaming(struct vb2_queue *vq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) struct gspca_dev *gspca_dev = vb2_get_drv_priv(vq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) gspca_stream_off(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) /* Release all active buffers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) gspca_return_all_buffers(gspca_dev, VB2_BUF_STATE_ERROR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) static const struct vb2_ops gspca_qops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) .queue_setup = gspca_queue_setup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) .buf_prepare = gspca_buffer_prepare,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) .buf_finish = gspca_buffer_finish,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) .buf_queue = gspca_buffer_queue,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) .start_streaming = gspca_start_streaming,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) .stop_streaming = gspca_stop_streaming,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) .wait_prepare = vb2_ops_wait_prepare,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) .wait_finish = vb2_ops_wait_finish,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) static const struct v4l2_file_operations dev_fops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) .open = v4l2_fh_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) .release = vb2_fop_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) .unlocked_ioctl = video_ioctl2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) .read = vb2_fop_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) .mmap = vb2_fop_mmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) .poll = vb2_fop_poll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) static const struct v4l2_ioctl_ops dev_ioctl_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) .vidioc_querycap = vidioc_querycap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) .vidioc_enum_input = vidioc_enum_input,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) .vidioc_g_input = vidioc_g_input,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) .vidioc_s_input = vidioc_s_input,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) .vidioc_g_jpegcomp = vidioc_g_jpegcomp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) .vidioc_s_jpegcomp = vidioc_s_jpegcomp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) .vidioc_g_parm = vidioc_g_parm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) .vidioc_s_parm = vidioc_s_parm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) .vidioc_enum_framesizes = vidioc_enum_framesizes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) .vidioc_enum_frameintervals = vidioc_enum_frameintervals,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) .vidioc_reqbufs = vb2_ioctl_reqbufs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) .vidioc_create_bufs = vb2_ioctl_create_bufs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) .vidioc_querybuf = vb2_ioctl_querybuf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) .vidioc_qbuf = vb2_ioctl_qbuf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) .vidioc_dqbuf = vb2_ioctl_dqbuf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) .vidioc_expbuf = vb2_ioctl_expbuf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) .vidioc_streamon = vb2_ioctl_streamon,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) .vidioc_streamoff = vb2_ioctl_streamoff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) #ifdef CONFIG_VIDEO_ADV_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) .vidioc_g_chip_info = vidioc_g_chip_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) .vidioc_g_register = vidioc_g_register,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) .vidioc_s_register = vidioc_s_register,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) static const struct video_device gspca_template = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) .name = "gspca main driver",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) .fops = &dev_fops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) .ioctl_ops = &dev_ioctl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) .release = video_device_release_empty, /* We use v4l2_dev.release */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) * probe and create a new gspca device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) * This function must be called by the sub-driver when it is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) * called for probing a new device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) int gspca_dev_probe2(struct usb_interface *intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) const struct usb_device_id *id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) const struct sd_desc *sd_desc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) int dev_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) struct module *module)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) struct gspca_dev *gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) struct usb_device *dev = interface_to_usbdev(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) struct vb2_queue *q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) pr_info("%s-" GSPCA_VERSION " probing %04x:%04x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) sd_desc->name, id->idVendor, id->idProduct);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) /* create the device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) if (dev_size < sizeof *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) dev_size = sizeof *gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) gspca_dev = kzalloc(dev_size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) if (!gspca_dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) pr_err("couldn't kzalloc gspca struct\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) gspca_dev->usb_buf = kzalloc(USB_BUF_SZ, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) if (!gspca_dev->usb_buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) pr_err("out of memory\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) ret = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) gspca_dev->dev = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) gspca_dev->iface = intf->cur_altsetting->desc.bInterfaceNumber;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) gspca_dev->xfer_ep = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) /* check if any audio device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) if (dev->actconfig->desc.bNumInterfaces != 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) struct usb_interface *intf2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) intf2 = dev->actconfig->interface[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) if (intf2 != NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) && intf2->altsetting != NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) && intf2->altsetting->desc.bInterfaceClass ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) USB_CLASS_AUDIO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) gspca_dev->audio = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) gspca_dev->v4l2_dev.release = gspca_release;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) ret = v4l2_device_register(&intf->dev, &gspca_dev->v4l2_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) gspca_dev->present = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) gspca_dev->sd_desc = sd_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) gspca_dev->empty_packet = -1; /* don't check the empty packets */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) gspca_dev->vdev = gspca_template;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) gspca_dev->vdev.v4l2_dev = &gspca_dev->v4l2_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) gspca_dev->vdev.device_caps = V4L2_CAP_VIDEO_CAPTURE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) video_set_drvdata(&gspca_dev->vdev, gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) gspca_dev->module = module;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) mutex_init(&gspca_dev->usb_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) gspca_dev->vdev.lock = &gspca_dev->usb_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) init_waitqueue_head(&gspca_dev->wq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) /* Initialize the vb2 queue */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) q = &gspca_dev->queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF | VB2_READ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) q->drv_priv = gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) q->buf_struct_size = sizeof(struct gspca_buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) q->ops = &gspca_qops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) q->mem_ops = &vb2_vmalloc_memops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) q->min_buffers_needed = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) q->lock = &gspca_dev->usb_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) ret = vb2_queue_init(q);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) gspca_dev->vdev.queue = q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) INIT_LIST_HEAD(&gspca_dev->buf_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) spin_lock_init(&gspca_dev->qlock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) /* configure the subdriver and initialize the USB device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) ret = sd_desc->config(gspca_dev, id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) ret = sd_desc->init(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) if (sd_desc->init_controls)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) ret = sd_desc->init_controls(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) gspca_set_default_mode(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) ret = gspca_input_connect(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) #ifdef CONFIG_VIDEO_ADV_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) if (!gspca_dev->sd_desc->get_register)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) v4l2_disable_ioctl(&gspca_dev->vdev, VIDIOC_DBG_G_REGISTER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) if (!gspca_dev->sd_desc->set_register)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) v4l2_disable_ioctl(&gspca_dev->vdev, VIDIOC_DBG_S_REGISTER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) if (!gspca_dev->sd_desc->get_jcomp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) v4l2_disable_ioctl(&gspca_dev->vdev, VIDIOC_G_JPEGCOMP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) if (!gspca_dev->sd_desc->set_jcomp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) v4l2_disable_ioctl(&gspca_dev->vdev, VIDIOC_S_JPEGCOMP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) /* init video stuff */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) ret = video_register_device(&gspca_dev->vdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) VFL_TYPE_VIDEO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) pr_err("video_register_device err %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) usb_set_intfdata(intf, gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) gspca_dbg(gspca_dev, D_PROBE, "%s created\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) video_device_node_name(&gspca_dev->vdev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) gspca_input_create_urb(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) #if IS_ENABLED(CONFIG_INPUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) if (gspca_dev->input_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) input_unregister_device(gspca_dev->input_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) v4l2_ctrl_handler_free(gspca_dev->vdev.ctrl_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) v4l2_device_unregister(&gspca_dev->v4l2_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) if (sd_desc->probe_error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) sd_desc->probe_error(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) kfree(gspca_dev->usb_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) kfree(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) EXPORT_SYMBOL(gspca_dev_probe2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) /* same function as the previous one, but check the interface */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) int gspca_dev_probe(struct usb_interface *intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) const struct usb_device_id *id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) const struct sd_desc *sd_desc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) int dev_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) struct module *module)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) struct usb_device *dev = interface_to_usbdev(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) /* we don't handle multi-config cameras */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) if (dev->descriptor.bNumConfigurations != 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) pr_err("%04x:%04x too many config\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) id->idVendor, id->idProduct);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) /* the USB video interface must be the first one */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) if (dev->actconfig->desc.bNumInterfaces != 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) && intf->cur_altsetting->desc.bInterfaceNumber != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) return gspca_dev_probe2(intf, id, sd_desc, dev_size, module);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) EXPORT_SYMBOL(gspca_dev_probe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) * USB disconnection
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) * This function must be called by the sub-driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) * when the device disconnects, after the specific resources are freed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) void gspca_disconnect(struct usb_interface *intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) struct gspca_dev *gspca_dev = usb_get_intfdata(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) #if IS_ENABLED(CONFIG_INPUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) struct input_dev *input_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) gspca_dbg(gspca_dev, D_PROBE, "%s disconnect\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) video_device_node_name(&gspca_dev->vdev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) mutex_lock(&gspca_dev->usb_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) gspca_dev->present = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) destroy_urbs(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) gspca_input_destroy_urb(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) vb2_queue_error(&gspca_dev->queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) #if IS_ENABLED(CONFIG_INPUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) input_dev = gspca_dev->input_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) if (input_dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) gspca_dev->input_dev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) input_unregister_device(input_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) v4l2_device_disconnect(&gspca_dev->v4l2_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) video_unregister_device(&gspca_dev->vdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) mutex_unlock(&gspca_dev->usb_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) /* (this will call gspca_release() immediately or on last close) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) v4l2_device_put(&gspca_dev->v4l2_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) EXPORT_SYMBOL(gspca_disconnect);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) int gspca_suspend(struct usb_interface *intf, pm_message_t message)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) struct gspca_dev *gspca_dev = usb_get_intfdata(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) gspca_input_destroy_urb(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) if (!vb2_start_streaming_called(&gspca_dev->queue))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) mutex_lock(&gspca_dev->usb_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) gspca_dev->frozen = 1; /* avoid urb error messages */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) gspca_dev->usb_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) if (gspca_dev->sd_desc->stopN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) gspca_dev->sd_desc->stopN(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) destroy_urbs(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) gspca_set_alt0(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) if (gspca_dev->sd_desc->stop0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) gspca_dev->sd_desc->stop0(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) mutex_unlock(&gspca_dev->usb_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) EXPORT_SYMBOL(gspca_suspend);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) int gspca_resume(struct usb_interface *intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) struct gspca_dev *gspca_dev = usb_get_intfdata(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) int streaming, ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) mutex_lock(&gspca_dev->usb_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) gspca_dev->frozen = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) gspca_dev->usb_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) gspca_dev->sd_desc->init(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) * Most subdrivers send all ctrl values on sd_start and thus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) * only write to the device registers on s_ctrl when streaming ->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) * Clear streaming to avoid setting all ctrls twice.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) streaming = vb2_start_streaming_called(&gspca_dev->queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) if (streaming)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) ret = gspca_init_transfer(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) gspca_input_create_urb(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) mutex_unlock(&gspca_dev->usb_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) EXPORT_SYMBOL(gspca_resume);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) /* -- module insert / remove -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) static int __init gspca_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) pr_info("v" GSPCA_VERSION " registered\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) static void __exit gspca_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) module_init(gspca_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) module_exit(gspca_exit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) module_param_named(debug, gspca_debug, int, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) MODULE_PARM_DESC(debug,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) "1:probe 2:config 3:stream 4:frame 5:packet 6:usbi 7:usbo");