File Index
Files and directories
Sign in
FILE

s2255drv.c

File preview with syntax highlighting.

linux-6.19.14/drivers/media/usb/s2255/s2255drv.c C
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 *  s2255drv.c - a driver for the Sensoray 2255 USB video capture device
   4 *
   5 *   Copyright (C) 2007-2014 by Sensoray Company Inc.
   6 *                              Dean Anderson
   7 *
   8 * Some video buffer code based on vivi driver:
   9 *
  10 * Sensoray 2255 device supports 4 simultaneous channels.
  11 * The channels are not "crossbar" inputs, they are physically
  12 * attached to separate video decoders.
  13 *
  14 * Because of USB2.0 bandwidth limitations. There is only a
  15 * certain amount of data which may be transferred at one time.
  16 *
  17 * Example maximum bandwidth utilization:
  18 *
  19 * -full size, color mode YUYV or YUV422P: 2 channels at once
  20 * -full or half size Grey scale: all 4 channels at once
  21 * -half size, color mode YUYV or YUV422P: all 4 channels at once
  22 * -full size, color mode YUYV or YUV422P 1/2 frame rate: all 4 channels
  23 *  at once.
  24 */
  25
  26#include <linux/module.h>
  27#include <linux/firmware.h>
  28#include <linux/kernel.h>
  29#include <linux/mutex.h>
  30#include <linux/slab.h>
  31#include <linux/videodev2.h>
  32#include <linux/mm.h>
  33#include <linux/vmalloc.h>
  34#include <linux/usb.h>
  35#include <media/videobuf2-v4l2.h>
  36#include <media/videobuf2-vmalloc.h>
  37#include <media/v4l2-common.h>
  38#include <media/v4l2-device.h>
  39#include <media/v4l2-ioctl.h>
  40#include <media/v4l2-ctrls.h>
  41#include <media/v4l2-event.h>
  42
  43#define S2255_VERSION		"1.25.1"
  44#define FIRMWARE_FILE_NAME "f2255usb.bin"
  45
  46/* default JPEG quality */
  47#define S2255_DEF_JPEG_QUAL     50
  48/* vendor request in */
  49#define S2255_VR_IN		0
  50/* vendor request out */
  51#define S2255_VR_OUT		1
  52/* firmware query */
  53#define S2255_VR_FW		0x30
  54/* USB endpoint number for configuring the device */
  55#define S2255_CONFIG_EP         2
  56/* maximum time for DSP to start responding after last FW word loaded(ms) */
  57#define S2255_DSP_BOOTTIME      800
  58/* maximum time to wait for firmware to load (ms) */
  59#define S2255_LOAD_TIMEOUT      (5000 + S2255_DSP_BOOTTIME)
  60#define S2255_MIN_BUFS          2
  61#define S2255_SETMODE_TIMEOUT   500
  62#define S2255_VIDSTATUS_TIMEOUT 350
  63#define S2255_MARKER_FRAME	cpu_to_le32(0x2255DA4AL)
  64#define S2255_MARKER_RESPONSE	cpu_to_le32(0x2255ACACL)
  65#define S2255_RESPONSE_SETMODE  cpu_to_le32(0x01)
  66#define S2255_RESPONSE_FW       cpu_to_le32(0x10)
  67#define S2255_RESPONSE_STATUS   cpu_to_le32(0x20)
  68#define S2255_USB_XFER_SIZE	(16 * 1024)
  69#define MAX_CHANNELS		4
  70#define SYS_FRAMES		4
  71/* maximum size is PAL full size plus room for the marker header(s) */
  72#define SYS_FRAMES_MAXSIZE	(720*288*2*2 + 4096)
  73#define DEF_USB_BLOCK		S2255_USB_XFER_SIZE
  74#define LINE_SZ_4CIFS_NTSC	640
  75#define LINE_SZ_2CIFS_NTSC	640
  76#define LINE_SZ_1CIFS_NTSC	320
  77#define LINE_SZ_4CIFS_PAL	704
  78#define LINE_SZ_2CIFS_PAL	704
  79#define LINE_SZ_1CIFS_PAL	352
  80#define NUM_LINES_4CIFS_NTSC	240
  81#define NUM_LINES_2CIFS_NTSC	240
  82#define NUM_LINES_1CIFS_NTSC	240
  83#define NUM_LINES_4CIFS_PAL	288
  84#define NUM_LINES_2CIFS_PAL	288
  85#define NUM_LINES_1CIFS_PAL	288
  86#define LINE_SZ_DEF		640
  87#define NUM_LINES_DEF		240
  88
  89
  90/* predefined settings */
  91#define FORMAT_NTSC	1
  92#define FORMAT_PAL	2
  93
  94#define SCALE_4CIFS	1	/* 640x480(NTSC) or 704x576(PAL) */
  95#define SCALE_2CIFS	2	/* 640x240(NTSC) or 704x288(PAL) */
  96#define SCALE_1CIFS	3	/* 320x240(NTSC) or 352x288(PAL) */
  97/* SCALE_4CIFSI is the 2 fields interpolated into one */
  98#define SCALE_4CIFSI	4	/* 640x480(NTSC) or 704x576(PAL) high quality */
  99
 100#define COLOR_YUVPL	1	/* YUV planar */
 101#define COLOR_YUVPK	2	/* YUV packed */
 102#define COLOR_Y8	4	/* monochrome */
 103#define COLOR_JPG       5       /* JPEG */
 104
 105#define MASK_COLOR       0x000000ff
 106#define MASK_JPG_QUALITY 0x0000ff00
 107#define MASK_INPUT_TYPE  0x000f0000
 108/* frame decimation. */
 109#define FDEC_1		1	/* capture every frame. default */
 110#define FDEC_2		2	/* capture every 2nd frame */
 111#define FDEC_3		3	/* capture every 3rd frame */
 112#define FDEC_5		5	/* capture every 5th frame */
 113
 114/*-------------------------------------------------------
 115 * Default mode parameters.
 116 *-------------------------------------------------------*/
 117#define DEF_SCALE	SCALE_4CIFS
 118#define DEF_COLOR	COLOR_YUVPL
 119#define DEF_FDEC	FDEC_1
 120#define DEF_BRIGHT	0
 121#define DEF_CONTRAST	0x5c
 122#define DEF_SATURATION	0x80
 123#define DEF_HUE		0
 124
 125/* usb config commands */
 126#define IN_DATA_TOKEN	cpu_to_le32(0x2255c0de)
 127#define CMD_2255	0xc2255000
 128#define CMD_SET_MODE	cpu_to_le32((CMD_2255 | 0x10))
 129#define CMD_START	cpu_to_le32((CMD_2255 | 0x20))
 130#define CMD_STOP	cpu_to_le32((CMD_2255 | 0x30))
 131#define CMD_STATUS	cpu_to_le32((CMD_2255 | 0x40))
 132
 133struct s2255_mode {
 134	u32 format;	/* input video format (NTSC, PAL) */
 135	u32 scale;	/* output video scale */
 136	u32 color;	/* output video color format */
 137	u32 fdec;	/* frame decimation */
 138	u32 bright;	/* brightness */
 139	u32 contrast;	/* contrast */
 140	u32 saturation;	/* saturation */
 141	u32 hue;	/* hue (NTSC only)*/
 142	u32 single;	/* capture 1 frame at a time (!=0), continuously (==0)*/
 143	u32 usb_block;	/* block size. should be 4096 of DEF_USB_BLOCK */
 144	u32 restart;	/* if DSP requires restart */
 145};
 146
 147
 148#define S2255_READ_IDLE		0
 149#define S2255_READ_FRAME	1
 150
 151/* frame structure */
 152struct s2255_framei {
 153	unsigned long size;
 154	unsigned long ulState;	/* ulState:S2255_READ_IDLE, S2255_READ_FRAME*/
 155	void *lpvbits;		/* image data */
 156	unsigned long cur_size;	/* current data copied to it */
 157};
 158
 159/* image buffer structure */
 160struct s2255_bufferi {
 161	unsigned long dwFrames;			/* number of frames in buffer */
 162	struct s2255_framei frame[SYS_FRAMES];	/* array of FRAME structures */
 163};
 164
 165#define DEF_MODEI_NTSC_CONT	{FORMAT_NTSC, DEF_SCALE, DEF_COLOR,	\
 166			DEF_FDEC, DEF_BRIGHT, DEF_CONTRAST, DEF_SATURATION, \
 167			DEF_HUE, 0, DEF_USB_BLOCK, 0}
 168
 169/* for firmware loading, fw_state */
 170#define S2255_FW_NOTLOADED	0
 171#define S2255_FW_LOADED_DSPWAIT	1
 172#define S2255_FW_SUCCESS	2
 173#define S2255_FW_FAILED		3
 174#define S2255_FW_DISCONNECTING  4
 175#define S2255_FW_MARKER		cpu_to_le32(0x22552f2f)
 176/* 2255 read states */
 177#define S2255_READ_IDLE         0
 178#define S2255_READ_FRAME        1
 179struct s2255_fw {
 180	int		      fw_loaded;
 181	int		      fw_size;
 182	struct urb	      *fw_urb;
 183	atomic_t	      fw_state;
 184	void		      *pfw_data;
 185	wait_queue_head_t     wait_fw;
 186	const struct firmware *fw;
 187};
 188
 189struct s2255_pipeinfo {
 190	u32 max_transfer_size;
 191	u32 cur_transfer_size;
 192	u8 *transfer_buffer;
 193	u32 state;
 194	void *stream_urb;
 195	void *dev;	/* back pointer to s2255_dev struct*/
 196	u32 err_count;
 197	u32 idx;
 198};
 199
 200struct s2255_fmt; /*forward declaration */
 201struct s2255_dev;
 202
 203/* 2255 video channel */
 204struct s2255_vc {
 205	struct s2255_dev        *dev;
 206	struct video_device	vdev;
 207	struct v4l2_ctrl_handler hdl;
 208	struct v4l2_ctrl	*jpegqual_ctrl;
 209	int			resources;
 210	struct list_head        buf_list;
 211	struct s2255_bufferi	buffer;
 212	struct s2255_mode	mode;
 213	v4l2_std_id		std;
 214	/* jpeg compression */
 215	unsigned		jpegqual;
 216	/* capture parameters (for high quality mode full size) */
 217	struct v4l2_captureparm cap_parm;
 218	int			cur_frame;
 219	int			last_frame;
 220	/* allocated image size */
 221	unsigned long		req_image_size;
 222	/* received packet size */
 223	unsigned long		pkt_size;
 224	int			bad_payload;
 225	unsigned long		frame_count;
 226	/* if JPEG image */
 227	int                     jpg_size;
 228	/* if channel configured to default state */
 229	int                     configured;
 230	wait_queue_head_t       wait_setmode;
 231	int                     setmode_ready;
 232	/* video status items */
 233	int                     vidstatus;
 234	wait_queue_head_t       wait_vidstatus;
 235	int                     vidstatus_ready;
 236	unsigned int		width;
 237	unsigned int		height;
 238	enum v4l2_field         field;
 239	const struct s2255_fmt	*fmt;
 240	int idx; /* channel number on device, 0-3 */
 241	struct vb2_queue vb_vidq;
 242	struct mutex vb_lock; /* streaming lock */
 243	spinlock_t qlock;
 244};
 245
 246
 247struct s2255_dev {
 248	struct s2255_vc         vc[MAX_CHANNELS];
 249	struct v4l2_device      v4l2_dev;
 250	refcount_t		num_channels;
 251	int			frames;
 252	struct mutex		lock;	/* channels[].vdev.lock */
 253	struct mutex		cmdlock; /* protects cmdbuf */
 254	struct usb_device	*udev;
 255	struct usb_interface	*interface;
 256	u8			read_endpoint;
 257	struct timer_list	timer;
 258	struct s2255_fw	*fw_data;
 259	struct s2255_pipeinfo	pipe;
 260	u32			cc;	/* current channel */
 261	int			frame_ready;
 262	int                     chn_ready;
 263	/* dsp firmware version (f2255usb.bin) */
 264	int                     dsp_fw_ver;
 265	u16                     pid; /* product id */
 266#define S2255_CMDBUF_SIZE 512
 267	__le32                  *cmdbuf;
 268};
 269
 270static inline struct s2255_dev *to_s2255_dev(struct v4l2_device *v4l2_dev)
 271{
 272	return container_of(v4l2_dev, struct s2255_dev, v4l2_dev);
 273}
 274
 275struct s2255_fmt {
 276	u32 fourcc;
 277	int depth;
 278};
 279
 280/* buffer for one video frame */
 281struct s2255_buffer {
 282	/* common v4l buffer stuff -- must be first */
 283	struct vb2_v4l2_buffer vb;
 284	struct list_head list;
 285};
 286
 287
 288/* current cypress EEPROM firmware version */
 289#define S2255_CUR_USB_FWVER	((3 << 8) | 12)
 290/* current DSP FW version */
 291#define S2255_CUR_DSP_FWVER     10104
 292/* Need DSP version 5+ for video status feature */
 293#define S2255_MIN_DSP_STATUS      5
 294#define S2255_MIN_DSP_COLORFILTER 8
 295#define S2255_NORMS		(V4L2_STD_ALL)
 296
 297/* private V4L2 controls */
 298
 299/*
 300 * The following chart displays how COLORFILTER should be set
 301 *  =========================================================
 302 *  =     fourcc              =     COLORFILTER             =
 303 *  =                         ===============================
 304 *  =                         =   0             =    1      =
 305 *  =========================================================
 306 *  =  V4L2_PIX_FMT_GREY(Y8)  = monochrome from = monochrome=
 307 *  =                         = s-video or      = composite =
 308 *  =                         = B/W camera      = input     =
 309 *  =========================================================
 310 *  =    other                = color, svideo   = color,    =
 311 *  =                         =                 = composite =
 312 *  =========================================================
 313 *
 314 * Notes:
 315 *   channels 0-3 on 2255 are composite
 316 *   channels 0-1 on 2257 are composite, 2-3 are s-video
 317 * If COLORFILTER is 0 with a composite color camera connected,
 318 * the output will appear monochrome but hatching
 319 * will occur.
 320 * COLORFILTER is different from "color killer" and "color effects"
 321 * for reasons above.
 322 */
 323#define S2255_V4L2_YC_ON  1
 324#define S2255_V4L2_YC_OFF 0
 325#define V4L2_CID_S2255_COLORFILTER (V4L2_CID_USER_S2255_BASE + 0)
 326
 327/* frame prefix size (sent once every frame) */
 328#define PREFIX_SIZE		512
 329
 330/* Channels on box are in reverse order */
 331static unsigned long G_chnmap[MAX_CHANNELS] = {3, 2, 1, 0};
 332
 333static int debug;
 334
 335static int s2255_start_readpipe(struct s2255_dev *dev);
 336static void s2255_stop_readpipe(struct s2255_dev *dev);
 337static int s2255_start_acquire(struct s2255_vc *vc);
 338static int s2255_stop_acquire(struct s2255_vc *vc);
 339static void s2255_fillbuff(struct s2255_vc *vc, struct s2255_buffer *buf,
 340			   int jpgsize);
 341static int s2255_set_mode(struct s2255_vc *vc, struct s2255_mode *mode);
 342static int s2255_board_shutdown(struct s2255_dev *dev);
 343static void s2255_fwload_start(struct s2255_dev *dev);
 344static void s2255_destroy(struct s2255_dev *dev);
 345static long s2255_vendor_req(struct s2255_dev *dev, unsigned char req,
 346			     u16 index, u16 value, void *buf,
 347			     s32 buf_len, int bOut);
 348
 349/* dev_err macro with driver name */
 350#define S2255_DRIVER_NAME "s2255"
 351#define s2255_dev_err(dev, fmt, arg...)					\
 352		dev_err(dev, S2255_DRIVER_NAME " - " fmt, ##arg)
 353
 354#define dprintk(dev, level, fmt, arg...) \
 355	v4l2_dbg(level, debug, &dev->v4l2_dev, fmt, ## arg)
 356
 357static struct usb_driver s2255_driver;
 358
 359/* start video number */
 360static int video_nr = -1;	/* /dev/videoN, -1 for autodetect */
 361
 362/* Enable jpeg capture. */
 363static int jpeg_enable = 1;
 364
 365module_param(debug, int, 0644);
 366MODULE_PARM_DESC(debug, "Debug level(0-100) default 0");
 367module_param(video_nr, int, 0644);
 368MODULE_PARM_DESC(video_nr, "start video minor(-1 default autodetect)");
 369module_param(jpeg_enable, int, 0644);
 370MODULE_PARM_DESC(jpeg_enable, "Jpeg enable(1-on 0-off) default 1");
 371
 372/* USB device table */
 373#define USB_SENSORAY_VID	0x1943
 374static const struct usb_device_id s2255_table[] = {
 375	{USB_DEVICE(USB_SENSORAY_VID, 0x2255)},
 376	{USB_DEVICE(USB_SENSORAY_VID, 0x2257)}, /*same family as 2255*/
 377	{ }			/* Terminating entry */
 378};
 379MODULE_DEVICE_TABLE(usb, s2255_table);
 380
 381#define BUFFER_TIMEOUT msecs_to_jiffies(400)
 382
 383/* image formats.  */
 384/* JPEG formats must be defined last to support jpeg_enable parameter */
 385static const struct s2255_fmt formats[] = {
 386	{
 387		.fourcc = V4L2_PIX_FMT_YUYV,
 388		.depth = 16
 389
 390	}, {
 391		.fourcc = V4L2_PIX_FMT_UYVY,
 392		.depth = 16
 393	}, {
 394		.fourcc = V4L2_PIX_FMT_YUV422P,
 395		.depth = 16
 396
 397	}, {
 398		.fourcc = V4L2_PIX_FMT_GREY,
 399		.depth = 8
 400	}, {
 401		.fourcc = V4L2_PIX_FMT_JPEG,
 402		.depth = 24
 403	}, {
 404		.fourcc = V4L2_PIX_FMT_MJPEG,
 405		.depth = 24
 406	}
 407};
 408
 409static int norm_maxw(struct s2255_vc *vc)
 410{
 411	return (vc->std & V4L2_STD_525_60) ?
 412	    LINE_SZ_4CIFS_NTSC : LINE_SZ_4CIFS_PAL;
 413}
 414
 415static int norm_maxh(struct s2255_vc *vc)
 416{
 417	return (vc->std & V4L2_STD_525_60) ?
 418	    (NUM_LINES_1CIFS_NTSC * 2) : (NUM_LINES_1CIFS_PAL * 2);
 419}
 420
 421static int norm_minw(struct s2255_vc *vc)
 422{
 423	return (vc->std & V4L2_STD_525_60) ?
 424	    LINE_SZ_1CIFS_NTSC : LINE_SZ_1CIFS_PAL;
 425}
 426
 427static int norm_minh(struct s2255_vc *vc)
 428{
 429	return (vc->std & V4L2_STD_525_60) ?
 430	    (NUM_LINES_1CIFS_NTSC) : (NUM_LINES_1CIFS_PAL);
 431}
 432
 433
 434/*
 435 * TODO: fixme: move YUV reordering to hardware
 436 * converts 2255 planar format to yuyv or uyvy
 437 */
 438static void planar422p_to_yuv_packed(const unsigned char *in,
 439				     unsigned char *out,
 440				     int width, int height,
 441				     int fmt)
 442{
 443	unsigned char *pY;
 444	unsigned char *pCb;
 445	unsigned char *pCr;
 446	unsigned long size = height * width;
 447	unsigned int i;
 448	pY = (unsigned char *)in;
 449	pCr = (unsigned char *)in + height * width;
 450	pCb = (unsigned char *)in + height * width + (height * width / 2);
 451	for (i = 0; i < size * 2; i += 4) {
 452		out[i] = (fmt == V4L2_PIX_FMT_YUYV) ? *pY++ : *pCr++;
 453		out[i + 1] = (fmt == V4L2_PIX_FMT_YUYV) ? *pCr++ : *pY++;
 454		out[i + 2] = (fmt == V4L2_PIX_FMT_YUYV) ? *pY++ : *pCb++;
 455		out[i + 3] = (fmt == V4L2_PIX_FMT_YUYV) ? *pCb++ : *pY++;
 456	}
 457	return;
 458}
 459
 460static void s2255_reset_dsppower(struct s2255_dev *dev)
 461{
 462	s2255_vendor_req(dev, 0x40, 0x0000, 0x0001, NULL, 0, 1);
 463	msleep(50);
 464	s2255_vendor_req(dev, 0x50, 0x0000, 0x0000, NULL, 0, 1);
 465	msleep(600);
 466	s2255_vendor_req(dev, 0x10, 0x0000, 0x0000, NULL, 0, 1);
 467	return;
 468}
 469
 470/* kickstarts the firmware loading. from probe
 471 */
 472static void s2255_timer(struct timer_list *t)
 473{
 474	struct s2255_dev *dev = timer_container_of(dev, t, timer);
 475	struct s2255_fw *data = dev->fw_data;
 476	if (usb_submit_urb(data->fw_urb, GFP_ATOMIC) < 0) {
 477		pr_err("s2255: can't submit urb\n");
 478		atomic_set(&data->fw_state, S2255_FW_FAILED);
 479		/* wake up anything waiting for the firmware */
 480		wake_up(&data->wait_fw);
 481		return;
 482	}
 483}
 484
 485
 486/* this loads the firmware asynchronously.
 487   Originally this was done synchronously in probe.
 488   But it is better to load it asynchronously here than block
 489   inside the probe function. Blocking inside probe affects boot time.
 490   FW loading is triggered by the timer in the probe function
 491*/
 492static void s2255_fwchunk_complete(struct urb *urb)
 493{
 494	struct s2255_fw *data = urb->context;
 495	struct usb_device *udev = urb->dev;
 496	int len;
 497	if (urb->status) {
 498		dev_err(&udev->dev, "URB failed with status %d\n", urb->status);
 499		atomic_set(&data->fw_state, S2255_FW_FAILED);
 500		/* wake up anything waiting for the firmware */
 501		wake_up(&data->wait_fw);
 502		return;
 503	}
 504	if (data->fw_urb == NULL) {
 505		s2255_dev_err(&udev->dev, "disconnected\n");
 506		atomic_set(&data->fw_state, S2255_FW_FAILED);
 507		/* wake up anything waiting for the firmware */
 508		wake_up(&data->wait_fw);
 509		return;
 510	}
 511#define CHUNK_SIZE 512
 512	/* all USB transfers must be done with continuous kernel memory.
 513	   can't allocate more than 128k in current linux kernel, so
 514	   upload the firmware in chunks
 515	 */
 516	if (data->fw_loaded < data->fw_size) {
 517		len = (data->fw_loaded + CHUNK_SIZE) > data->fw_size ?
 518		    data->fw_size % CHUNK_SIZE : CHUNK_SIZE;
 519
 520		if (len < CHUNK_SIZE)
 521			memset(data->pfw_data, 0, CHUNK_SIZE);
 522
 523		memcpy(data->pfw_data,
 524		       (char *) data->fw->data + data->fw_loaded, len);
 525
 526		usb_fill_bulk_urb(data->fw_urb, udev, usb_sndbulkpipe(udev, 2),
 527				  data->pfw_data, CHUNK_SIZE,
 528				  s2255_fwchunk_complete, data);
 529		if (usb_submit_urb(data->fw_urb, GFP_ATOMIC) < 0) {
 530			dev_err(&udev->dev, "failed submit URB\n");
 531			atomic_set(&data->fw_state, S2255_FW_FAILED);
 532			/* wake up anything waiting for the firmware */
 533			wake_up(&data->wait_fw);
 534			return;
 535		}
 536		data->fw_loaded += len;
 537	} else
 538		atomic_set(&data->fw_state, S2255_FW_LOADED_DSPWAIT);
 539	return;
 540
 541}
 542
 543static void s2255_got_frame(struct s2255_vc *vc, int jpgsize)
 544{
 545	struct s2255_buffer *buf;
 546	struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
 547	unsigned long flags = 0;
 548
 549	spin_lock_irqsave(&vc->qlock, flags);
 550	if (list_empty(&vc->buf_list)) {
 551		dprintk(dev, 1, "No active queue to serve\n");
 552		spin_unlock_irqrestore(&vc->qlock, flags);
 553		return;
 554	}
 555	buf = list_entry(vc->buf_list.next,
 556			 struct s2255_buffer, list);
 557	list_del(&buf->list);
 558	buf->vb.vb2_buf.timestamp = ktime_get_ns();
 559	buf->vb.field = vc->field;
 560	buf->vb.sequence = vc->frame_count;
 561	spin_unlock_irqrestore(&vc->qlock, flags);
 562
 563	s2255_fillbuff(vc, buf, jpgsize);
 564	/* tell v4l buffer was filled */
 565	vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
 566	dprintk(dev, 2, "%s: [buf] [%p]\n", __func__, buf);
 567}
 568
 569static const struct s2255_fmt *format_by_fourcc(int fourcc)
 570{
 571	unsigned int i;
 572	for (i = 0; i < ARRAY_SIZE(formats); i++) {
 573		if (-1 == formats[i].fourcc)
 574			continue;
 575		if (!jpeg_enable && ((formats[i].fourcc == V4L2_PIX_FMT_JPEG) ||
 576				     (formats[i].fourcc == V4L2_PIX_FMT_MJPEG)))
 577			continue;
 578		if (formats[i].fourcc == fourcc)
 579			return formats + i;
 580	}
 581	return NULL;
 582}
 583
 584/* video buffer vmalloc implementation based partly on VIVI driver which is
 585 *          Copyright (c) 2006 by
 586 *                  Mauro Carvalho Chehab <mchehab--a.t--infradead.org>
 587 *                  Ted Walther <ted--a.t--enumera.com>
 588 *                  John Sokol <sokol--a.t--videotechnology.com>
 589 *                  http://v4l.videotechnology.com/
 590 *
 591 */
 592static void s2255_fillbuff(struct s2255_vc *vc,
 593			   struct s2255_buffer *buf, int jpgsize)
 594{
 595	int pos = 0;
 596	const char *tmpbuf;
 597	char *vbuf = vb2_plane_vaddr(&buf->vb.vb2_buf, 0);
 598	unsigned long last_frame;
 599	struct s2255_dev *dev = vc->dev;
 600
 601	if (!vbuf)
 602		return;
 603	last_frame = vc->last_frame;
 604	if (last_frame != -1) {
 605		tmpbuf =
 606		    (const char *)vc->buffer.frame[last_frame].lpvbits;
 607		switch (vc->fmt->fourcc) {
 608		case V4L2_PIX_FMT_YUYV:
 609		case V4L2_PIX_FMT_UYVY:
 610			planar422p_to_yuv_packed((const unsigned char *)tmpbuf,
 611						 vbuf, vc->width,
 612						 vc->height,
 613						 vc->fmt->fourcc);
 614			break;
 615		case V4L2_PIX_FMT_GREY:
 616			memcpy(vbuf, tmpbuf, vc->width * vc->height);
 617			break;
 618		case V4L2_PIX_FMT_JPEG:
 619		case V4L2_PIX_FMT_MJPEG:
 620			vb2_set_plane_payload(&buf->vb.vb2_buf, 0, jpgsize);
 621			memcpy(vbuf, tmpbuf, jpgsize);
 622			break;
 623		case V4L2_PIX_FMT_YUV422P:
 624			memcpy(vbuf, tmpbuf,
 625			       vc->width * vc->height * 2);
 626			break;
 627		default:
 628			pr_info("s2255: unknown format?\n");
 629		}
 630		vc->last_frame = -1;
 631	} else {
 632		pr_err("s2255: =======no frame\n");
 633		return;
 634	}
 635	dprintk(dev, 2, "s2255fill at : Buffer %p size= %d\n",
 636		vbuf, pos);
 637}
 638
 639
 640/* ------------------------------------------------------------------
 641   Videobuf operations
 642   ------------------------------------------------------------------*/
 643
 644static int queue_setup(struct vb2_queue *vq,
 645		       unsigned int *nbuffers, unsigned int *nplanes,
 646		       unsigned int sizes[], struct device *alloc_devs[])
 647{
 648	struct s2255_vc *vc = vb2_get_drv_priv(vq);
 649	if (*nbuffers < S2255_MIN_BUFS)
 650		*nbuffers = S2255_MIN_BUFS;
 651	*nplanes = 1;
 652	sizes[0] = vc->width * vc->height * (vc->fmt->depth >> 3);
 653	return 0;
 654}
 655
 656static int buffer_prepare(struct vb2_buffer *vb)
 657{
 658	struct s2255_vc *vc = vb2_get_drv_priv(vb->vb2_queue);
 659	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
 660	struct s2255_buffer *buf = container_of(vbuf, struct s2255_buffer, vb);
 661	int w = vc->width;
 662	int h = vc->height;
 663	unsigned long size;
 664
 665	dprintk(vc->dev, 4, "%s\n", __func__);
 666	if (vc->fmt == NULL)
 667		return -EINVAL;
 668
 669	if ((w < norm_minw(vc)) ||
 670	    (w > norm_maxw(vc)) ||
 671	    (h < norm_minh(vc)) ||
 672	    (h > norm_maxh(vc))) {
 673		dprintk(vc->dev, 4, "invalid buffer prepare\n");
 674		return -EINVAL;
 675	}
 676	size = w * h * (vc->fmt->depth >> 3);
 677	if (vb2_plane_size(vb, 0) < size) {
 678		dprintk(vc->dev, 4, "invalid buffer prepare\n");
 679		return -EINVAL;
 680	}
 681
 682	vb2_set_plane_payload(&buf->vb.vb2_buf, 0, size);
 683	return 0;
 684}
 685
 686static void buffer_queue(struct vb2_buffer *vb)
 687{
 688	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
 689	struct s2255_buffer *buf = container_of(vbuf, struct s2255_buffer, vb);
 690	struct s2255_vc *vc = vb2_get_drv_priv(vb->vb2_queue);
 691	unsigned long flags = 0;
 692	dprintk(vc->dev, 1, "%s\n", __func__);
 693	spin_lock_irqsave(&vc->qlock, flags);
 694	list_add_tail(&buf->list, &vc->buf_list);
 695	spin_unlock_irqrestore(&vc->qlock, flags);
 696}
 697
 698static int start_streaming(struct vb2_queue *vq, unsigned int count);
 699static void stop_streaming(struct vb2_queue *vq);
 700
 701static const struct vb2_ops s2255_video_qops = {
 702	.queue_setup = queue_setup,
 703	.buf_prepare = buffer_prepare,
 704	.buf_queue = buffer_queue,
 705	.start_streaming = start_streaming,
 706	.stop_streaming = stop_streaming,
 707};
 708
 709static int vidioc_querycap(struct file *file, void *priv,
 710			   struct v4l2_capability *cap)
 711{
 712	struct s2255_vc *vc = video_drvdata(file);
 713	struct s2255_dev *dev = vc->dev;
 714
 715	strscpy(cap->driver, "s2255", sizeof(cap->driver));
 716	strscpy(cap->card, "s2255", sizeof(cap->card));
 717	usb_make_path(dev->udev, cap->bus_info, sizeof(cap->bus_info));
 718	return 0;
 719}
 720
 721static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
 722			       struct v4l2_fmtdesc *f)
 723{
 724	int index = f->index;
 725
 726	if (index >= ARRAY_SIZE(formats))
 727		return -EINVAL;
 728	if (!jpeg_enable && ((formats[index].fourcc == V4L2_PIX_FMT_JPEG) ||
 729			(formats[index].fourcc == V4L2_PIX_FMT_MJPEG)))
 730		return -EINVAL;
 731	f->pixelformat = formats[index].fourcc;
 732	return 0;
 733}
 734
 735static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
 736			    struct v4l2_format *f)
 737{
 738	struct s2255_vc *vc = video_drvdata(file);
 739	int is_ntsc = vc->std & V4L2_STD_525_60;
 740
 741	f->fmt.pix.width = vc->width;
 742	f->fmt.pix.height = vc->height;
 743	if (f->fmt.pix.height >=
 744	    (is_ntsc ? NUM_LINES_1CIFS_NTSC : NUM_LINES_1CIFS_PAL) * 2)
 745		f->fmt.pix.field = V4L2_FIELD_INTERLACED;
 746	else
 747		f->fmt.pix.field = V4L2_FIELD_TOP;
 748	f->fmt.pix.pixelformat = vc->fmt->fourcc;
 749	f->fmt.pix.bytesperline = f->fmt.pix.width * (vc->fmt->depth >> 3);
 750	f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
 751	f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
 752	return 0;
 753}
 754
 755static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
 756			      struct v4l2_format *f)
 757{
 758	const struct s2255_fmt *fmt;
 759	enum v4l2_field field;
 760	struct s2255_vc *vc = video_drvdata(file);
 761	int is_ntsc = vc->std & V4L2_STD_525_60;
 762
 763	fmt = format_by_fourcc(f->fmt.pix.pixelformat);
 764
 765	if (fmt == NULL)
 766		return -EINVAL;
 767
 768	dprintk(vc->dev, 50, "%s NTSC: %d suggested width: %d, height: %d\n",
 769		__func__, is_ntsc, f->fmt.pix.width, f->fmt.pix.height);
 770	if (is_ntsc) {
 771		/* NTSC */
 772		if (f->fmt.pix.height >= NUM_LINES_1CIFS_NTSC * 2) {
 773			f->fmt.pix.height = NUM_LINES_1CIFS_NTSC * 2;
 774			field = V4L2_FIELD_INTERLACED;
 775		} else {
 776			f->fmt.pix.height = NUM_LINES_1CIFS_NTSC;
 777			field = V4L2_FIELD_TOP;
 778		}
 779		if (f->fmt.pix.width >= LINE_SZ_4CIFS_NTSC)
 780			f->fmt.pix.width = LINE_SZ_4CIFS_NTSC;
 781		else
 782			f->fmt.pix.width = LINE_SZ_1CIFS_NTSC;
 783	} else {
 784		/* PAL */
 785		if (f->fmt.pix.height >= NUM_LINES_1CIFS_PAL * 2) {
 786			f->fmt.pix.height = NUM_LINES_1CIFS_PAL * 2;
 787			field = V4L2_FIELD_INTERLACED;
 788		} else {
 789			f->fmt.pix.height = NUM_LINES_1CIFS_PAL;
 790			field = V4L2_FIELD_TOP;
 791		}
 792		if (f->fmt.pix.width >= LINE_SZ_4CIFS_PAL)
 793			f->fmt.pix.width = LINE_SZ_4CIFS_PAL;
 794		else
 795			f->fmt.pix.width = LINE_SZ_1CIFS_PAL;
 796	}
 797	f->fmt.pix.field = field;
 798	f->fmt.pix.bytesperline = (f->fmt.pix.width * fmt->depth) >> 3;
 799	f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
 800	f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
 801	dprintk(vc->dev, 50, "%s: set width %d height %d field %d\n", __func__,
 802		f->fmt.pix.width, f->fmt.pix.height, f->fmt.pix.field);
 803	return 0;
 804}
 805
 806static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
 807			    struct v4l2_format *f)
 808{
 809	struct s2255_vc *vc = video_drvdata(file);
 810	const struct s2255_fmt *fmt;
 811	struct vb2_queue *q = &vc->vb_vidq;
 812	struct s2255_mode mode;
 813	int ret;
 814
 815	ret = vidioc_try_fmt_vid_cap(file, vc, f);
 816
 817	if (ret < 0)
 818		return ret;
 819
 820	fmt = format_by_fourcc(f->fmt.pix.pixelformat);
 821
 822	if (fmt == NULL)
 823		return -EINVAL;
 824
 825	if (vb2_is_busy(q)) {
 826		dprintk(vc->dev, 1, "queue busy\n");
 827		return -EBUSY;
 828	}
 829
 830	mode = vc->mode;
 831	vc->fmt = fmt;
 832	vc->width = f->fmt.pix.width;
 833	vc->height = f->fmt.pix.height;
 834	vc->field = f->fmt.pix.field;
 835	if (vc->width > norm_minw(vc)) {
 836		if (vc->height > norm_minh(vc)) {
 837			if (vc->cap_parm.capturemode &
 838			    V4L2_MODE_HIGHQUALITY)
 839				mode.scale = SCALE_4CIFSI;
 840			else
 841				mode.scale = SCALE_4CIFS;
 842		} else
 843			mode.scale = SCALE_2CIFS;
 844
 845	} else {
 846		mode.scale = SCALE_1CIFS;
 847	}
 848	/* color mode */
 849	switch (vc->fmt->fourcc) {
 850	case V4L2_PIX_FMT_GREY:
 851		mode.color &= ~MASK_COLOR;
 852		mode.color |= COLOR_Y8;
 853		break;
 854	case V4L2_PIX_FMT_JPEG:
 855	case V4L2_PIX_FMT_MJPEG:
 856		mode.color &= ~MASK_COLOR;
 857		mode.color |= COLOR_JPG;
 858		mode.color |= (vc->jpegqual << 8);
 859		break;
 860	case V4L2_PIX_FMT_YUV422P:
 861		mode.color &= ~MASK_COLOR;
 862		mode.color |= COLOR_YUVPL;
 863		break;
 864	case V4L2_PIX_FMT_YUYV:
 865	case V4L2_PIX_FMT_UYVY:
 866	default:
 867		mode.color &= ~MASK_COLOR;
 868		mode.color |= COLOR_YUVPK;
 869		break;
 870	}
 871	if ((mode.color & MASK_COLOR) != (vc->mode.color & MASK_COLOR))
 872		mode.restart = 1;
 873	else if (mode.scale != vc->mode.scale)
 874		mode.restart = 1;
 875	else if (mode.format != vc->mode.format)
 876		mode.restart = 1;
 877	vc->mode = mode;
 878	(void) s2255_set_mode(vc, &mode);
 879	return 0;
 880}
 881
 882
 883/* write to the configuration pipe, synchronously */
 884static int s2255_write_config(struct usb_device *udev, unsigned char *pbuf,
 885			      int size)
 886{
 887	int pipe;
 888	int done;
 889	long retval = -1;
 890	if (udev) {
 891		pipe = usb_sndbulkpipe(udev, S2255_CONFIG_EP);
 892		retval = usb_bulk_msg(udev, pipe, pbuf, size, &done, 500);
 893	}
 894	return retval;
 895}
 896
 897static u32 get_transfer_size(struct s2255_mode *mode)
 898{
 899	int linesPerFrame = LINE_SZ_DEF;
 900	int pixelsPerLine = NUM_LINES_DEF;
 901	u32 outImageSize;
 902	u32 usbInSize;
 903	unsigned int mask_mult;
 904
 905	if (mode == NULL)
 906		return 0;
 907
 908	if (mode->format == FORMAT_NTSC) {
 909		switch (mode->scale) {
 910		case SCALE_4CIFS:
 911		case SCALE_4CIFSI:
 912			linesPerFrame = NUM_LINES_4CIFS_NTSC * 2;
 913			pixelsPerLine = LINE_SZ_4CIFS_NTSC;
 914			break;
 915		case SCALE_2CIFS:
 916			linesPerFrame = NUM_LINES_2CIFS_NTSC;
 917			pixelsPerLine = LINE_SZ_2CIFS_NTSC;
 918			break;
 919		case SCALE_1CIFS:
 920			linesPerFrame = NUM_LINES_1CIFS_NTSC;
 921			pixelsPerLine = LINE_SZ_1CIFS_NTSC;
 922			break;
 923		default:
 924			break;
 925		}
 926	} else if (mode->format == FORMAT_PAL) {
 927		switch (mode->scale) {
 928		case SCALE_4CIFS:
 929		case SCALE_4CIFSI:
 930			linesPerFrame = NUM_LINES_4CIFS_PAL * 2;
 931			pixelsPerLine = LINE_SZ_4CIFS_PAL;
 932			break;
 933		case SCALE_2CIFS:
 934			linesPerFrame = NUM_LINES_2CIFS_PAL;
 935			pixelsPerLine = LINE_SZ_2CIFS_PAL;
 936			break;
 937		case SCALE_1CIFS:
 938			linesPerFrame = NUM_LINES_1CIFS_PAL;
 939			pixelsPerLine = LINE_SZ_1CIFS_PAL;
 940			break;
 941		default:
 942			break;
 943		}
 944	}
 945	outImageSize = linesPerFrame * pixelsPerLine;
 946	if ((mode->color & MASK_COLOR) != COLOR_Y8) {
 947		/* 2 bytes/pixel if not monochrome */
 948		outImageSize *= 2;
 949	}
 950
 951	/* total bytes to send including prefix and 4K padding;
 952	   must be a multiple of USB_READ_SIZE */
 953	usbInSize = outImageSize + PREFIX_SIZE;	/* always send prefix */
 954	mask_mult = 0xffffffffUL - DEF_USB_BLOCK + 1;
 955	/* if size not a multiple of USB_READ_SIZE */
 956	if (usbInSize & ~mask_mult)
 957		usbInSize = (usbInSize & mask_mult) + (DEF_USB_BLOCK);
 958	return usbInSize;
 959}
 960
 961static void s2255_print_cfg(struct s2255_dev *sdev, struct s2255_mode *mode)
 962{
 963	struct device *dev = &sdev->udev->dev;
 964	dev_info(dev, "------------------------------------------------\n");
 965	dev_info(dev, "format: %d\nscale %d\n", mode->format, mode->scale);
 966	dev_info(dev, "fdec: %d\ncolor %d\n", mode->fdec, mode->color);
 967	dev_info(dev, "bright: 0x%x\n", mode->bright);
 968	dev_info(dev, "------------------------------------------------\n");
 969}
 970
 971/*
 972 * set mode is the function which controls the DSP.
 973 * the restart parameter in struct s2255_mode should be set whenever
 974 * the image size could change via color format, video system or image
 975 * size.
 976 * When the restart parameter is set, we sleep for ONE frame to allow the
 977 * DSP time to get the new frame
 978 */
 979static int s2255_set_mode(struct s2255_vc *vc,
 980			  struct s2255_mode *mode)
 981{
 982	int res;
 983	unsigned long chn_rev;
 984	struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
 985	int i;
 986	__le32 *buffer = dev->cmdbuf;
 987
 988	mutex_lock(&dev->cmdlock);
 989	chn_rev = G_chnmap[vc->idx];
 990	dprintk(dev, 3, "%s channel: %d\n", __func__, vc->idx);
 991	/* if JPEG, set the quality */
 992	if ((mode->color & MASK_COLOR) == COLOR_JPG) {
 993		mode->color &= ~MASK_COLOR;
 994		mode->color |= COLOR_JPG;
 995		mode->color &= ~MASK_JPG_QUALITY;
 996		mode->color |= (vc->jpegqual << 8);
 997	}
 998	/* save the mode */
 999	vc->mode = *mode;
1000	vc->req_image_size = get_transfer_size(mode);
1001	dprintk(dev, 1, "%s: reqsize %ld\n", __func__, vc->req_image_size);
1002	/* set the mode */
1003	buffer[0] = IN_DATA_TOKEN;
1004	buffer[1] = (__le32) cpu_to_le32(chn_rev);
1005	buffer[2] = CMD_SET_MODE;
1006	for (i = 0; i < sizeof(struct s2255_mode) / sizeof(u32); i++)
1007		buffer[3 + i] = cpu_to_le32(((u32 *)&vc->mode)[i]);
1008	vc->setmode_ready = 0;
1009	res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
1010	if (debug)
1011		s2255_print_cfg(dev, mode);
1012	/* wait at least 3 frames before continuing */
1013	if (mode->restart) {
1014		wait_event_timeout(vc->wait_setmode,
1015				   (vc->setmode_ready != 0),
1016				   msecs_to_jiffies(S2255_SETMODE_TIMEOUT));
1017		if (vc->setmode_ready != 1) {
1018			dprintk(dev, 0, "s2255: no set mode response\n");
1019			res = -EFAULT;
1020		}
1021	}
1022	/* clear the restart flag */
1023	vc->mode.restart = 0;
1024	dprintk(dev, 1, "%s chn %d, result: %d\n", __func__, vc->idx, res);
1025	mutex_unlock(&dev->cmdlock);
1026	return res;
1027}
1028
1029static int s2255_cmd_status(struct s2255_vc *vc, u32 *pstatus)
1030{
1031	int res;
1032	u32 chn_rev;
1033	struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
1034	__le32 *buffer = dev->cmdbuf;
1035
1036	mutex_lock(&dev->cmdlock);
1037	chn_rev = G_chnmap[vc->idx];
1038	dprintk(dev, 4, "%s chan %d\n", __func__, vc->idx);
1039	/* form the get vid status command */
1040	buffer[0] = IN_DATA_TOKEN;
1041	buffer[1] = (__le32) cpu_to_le32(chn_rev);
1042	buffer[2] = CMD_STATUS;
1043	*pstatus = 0;
1044	vc->vidstatus_ready = 0;
1045	res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
1046	wait_event_timeout(vc->wait_vidstatus,
1047			   (vc->vidstatus_ready != 0),
1048			   msecs_to_jiffies(S2255_VIDSTATUS_TIMEOUT));
1049	if (vc->vidstatus_ready != 1) {
1050		dprintk(dev, 0, "s2255: no vidstatus response\n");
1051		res = -EFAULT;
1052	}
1053	*pstatus = vc->vidstatus;
1054	dprintk(dev, 4, "%s, vid status %d\n", __func__, *pstatus);
1055	mutex_unlock(&dev->cmdlock);
1056	return res;
1057}
1058
1059static int start_streaming(struct vb2_queue *vq, unsigned int count)
1060{
1061	struct s2255_vc *vc = vb2_get_drv_priv(vq);
1062	int j;
1063
1064	vc->last_frame = -1;
1065	vc->bad_payload = 0;
1066	vc->cur_frame = 0;
1067	vc->frame_count = 0;
1068	for (j = 0; j < SYS_FRAMES; j++) {
1069		vc->buffer.frame[j].ulState = S2255_READ_IDLE;
1070		vc->buffer.frame[j].cur_size = 0;
1071	}
1072	return s2255_start_acquire(vc);
1073}
1074
1075/* abort streaming and wait for last buffer */
1076static void stop_streaming(struct vb2_queue *vq)
1077{
1078	struct s2255_vc *vc = vb2_get_drv_priv(vq);
1079	struct s2255_buffer *buf, *node;
1080	unsigned long flags;
1081	(void) s2255_stop_acquire(vc);
1082	spin_lock_irqsave(&vc->qlock, flags);
1083	list_for_each_entry_safe(buf, node, &vc->buf_list, list) {
1084		list_del(&buf->list);
1085		vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
1086		dprintk(vc->dev, 2, "[%p/%d] done\n",
1087			buf, buf->vb.vb2_buf.index);
1088	}
1089	spin_unlock_irqrestore(&vc->qlock, flags);
1090}
1091
1092static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id i)
1093{
1094	struct s2255_vc *vc = video_drvdata(file);
1095	struct s2255_mode mode;
1096	struct vb2_queue *q = &vc->vb_vidq;
1097
1098	/*
1099	 * Changing the standard implies a format change, which is not allowed
1100	 * while buffers for use with streaming have already been allocated.
1101	 */
1102	if (vb2_is_busy(q))
1103		return -EBUSY;
1104
1105	mode = vc->mode;
1106	if (i & V4L2_STD_525_60) {
1107		dprintk(vc->dev, 4, "%s 60 Hz\n", __func__);
1108		/* if changing format, reset frame decimation/intervals */
1109		if (mode.format != FORMAT_NTSC) {
1110			mode.restart = 1;
1111			mode.format = FORMAT_NTSC;
1112			mode.fdec = FDEC_1;
1113			vc->width = LINE_SZ_4CIFS_NTSC;
1114			vc->height = NUM_LINES_4CIFS_NTSC * 2;
1115		}
1116	} else if (i & V4L2_STD_625_50) {
1117		dprintk(vc->dev, 4, "%s 50 Hz\n", __func__);
1118		if (mode.format != FORMAT_PAL) {
1119			mode.restart = 1;
1120			mode.format = FORMAT_PAL;
1121			mode.fdec = FDEC_1;
1122			vc->width = LINE_SZ_4CIFS_PAL;
1123			vc->height = NUM_LINES_4CIFS_PAL * 2;
1124		}
1125	} else
1126		return -EINVAL;
1127	vc->std = i;
1128	if (mode.restart)
1129		s2255_set_mode(vc, &mode);
1130	return 0;
1131}
1132
1133static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *i)
1134{
1135	struct s2255_vc *vc = video_drvdata(file);
1136
1137	*i = vc->std;
1138	return 0;
1139}
1140
1141/* Sensoray 2255 is a multiple channel capture device.
1142   It does not have a "crossbar" of inputs.
1143   We use one V4L device per channel. The user must
1144   be aware that certain combinations are not allowed.
1145   For instance, you cannot do full FPS on more than 2 channels(2 videodevs)
1146   at once in color(you can do full fps on 4 channels with greyscale.
1147*/
1148static int vidioc_enum_input(struct file *file, void *priv,
1149			     struct v4l2_input *inp)
1150{
1151	struct s2255_vc *vc = video_drvdata(file);
1152	struct s2255_dev *dev = vc->dev;
1153	u32 status = 0;
1154
1155	if (inp->index != 0)
1156		return -EINVAL;
1157	inp->type = V4L2_INPUT_TYPE_CAMERA;
1158	inp->std = S2255_NORMS;
1159	inp->status = 0;
1160	if (dev->dsp_fw_ver >= S2255_MIN_DSP_STATUS) {
1161		int rc;
1162		rc = s2255_cmd_status(vc, &status);
1163		dprintk(dev, 4, "s2255_cmd_status rc: %d status %x\n",
1164			rc, status);
1165		if (rc == 0)
1166			inp->status =  (status & 0x01) ? 0
1167				: V4L2_IN_ST_NO_SIGNAL;
1168	}
1169	switch (dev->pid) {
1170	case 0x2255:
1171	default:
1172		strscpy(inp->name, "Composite", sizeof(inp->name));
1173		break;
1174	case 0x2257:
1175		strscpy(inp->name, (vc->idx < 2) ? "Composite" : "S-Video",
1176			sizeof(inp->name));
1177		break;
1178	}
1179	return 0;
1180}
1181
1182static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1183{
1184	*i = 0;
1185	return 0;
1186}
1187static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
1188{
1189	if (i > 0)
1190		return -EINVAL;
1191	return 0;
1192}
1193
1194static int s2255_s_ctrl(struct v4l2_ctrl *ctrl)
1195{
1196	struct s2255_vc *vc =
1197		container_of(ctrl->handler, struct s2255_vc, hdl);
1198	struct s2255_mode mode;
1199	mode = vc->mode;
1200	/* update the mode to the corresponding value */
1201	switch (ctrl->id) {
1202	case V4L2_CID_BRIGHTNESS:
1203		mode.bright = ctrl->val;
1204		break;
1205	case V4L2_CID_CONTRAST:
1206		mode.contrast = ctrl->val;
1207		break;
1208	case V4L2_CID_HUE:
1209		mode.hue = ctrl->val;
1210		break;
1211	case V4L2_CID_SATURATION:
1212		mode.saturation = ctrl->val;
1213		break;
1214	case V4L2_CID_S2255_COLORFILTER:
1215		mode.color &= ~MASK_INPUT_TYPE;
1216		mode.color |= !ctrl->val << 16;
1217		break;
1218	case V4L2_CID_JPEG_COMPRESSION_QUALITY:
1219		vc->jpegqual = ctrl->val;
1220		return 0;
1221	default:
1222		return -EINVAL;
1223	}
1224	mode.restart = 0;
1225	/* set mode here.  Note: stream does not need restarted.
1226	   some V4L programs restart stream unnecessarily
1227	   after a s_crtl.
1228	*/
1229	s2255_set_mode(vc, &mode);
1230	return 0;
1231}
1232
1233static int vidioc_g_jpegcomp(struct file *file, void *priv,
1234			 struct v4l2_jpegcompression *jc)
1235{
1236	struct s2255_vc *vc = video_drvdata(file);
1237
1238	memset(jc, 0, sizeof(*jc));
1239	jc->quality = vc->jpegqual;
1240	dprintk(vc->dev, 2, "%s: quality %d\n", __func__, jc->quality);
1241	return 0;
1242}
1243
1244static int vidioc_s_jpegcomp(struct file *file, void *priv,
1245			 const struct v4l2_jpegcompression *jc)
1246{
1247	struct s2255_vc *vc = video_drvdata(file);
1248
1249	if (jc->quality < 0 || jc->quality > 100)
1250		return -EINVAL;
1251	v4l2_ctrl_s_ctrl(vc->jpegqual_ctrl, jc->quality);
1252	dprintk(vc->dev, 2, "%s: quality %d\n", __func__, jc->quality);
1253	return 0;
1254}
1255
1256static int vidioc_g_parm(struct file *file, void *priv,
1257			 struct v4l2_streamparm *sp)
1258{
1259	__u32 def_num, def_dem;
1260	struct s2255_vc *vc = video_drvdata(file);
1261
1262	if (sp->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1263		return -EINVAL;
1264	sp->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
1265	sp->parm.capture.capturemode = vc->cap_parm.capturemode;
1266	sp->parm.capture.readbuffers = S2255_MIN_BUFS;
1267	def_num = (vc->mode.format == FORMAT_NTSC) ? 1001 : 1000;
1268	def_dem = (vc->mode.format == FORMAT_NTSC) ? 30000 : 25000;
1269	sp->parm.capture.timeperframe.denominator = def_dem;
1270	switch (vc->mode.fdec) {
1271	default:
1272	case FDEC_1:
1273		sp->parm.capture.timeperframe.numerator = def_num;
1274		break;
1275	case FDEC_2:
1276		sp->parm.capture.timeperframe.numerator = def_num * 2;
1277		break;
1278	case FDEC_3:
1279		sp->parm.capture.timeperframe.numerator = def_num * 3;
1280		break;
1281	case FDEC_5:
1282		sp->parm.capture.timeperframe.numerator = def_num * 5;
1283		break;
1284	}
1285	dprintk(vc->dev, 4, "%s capture mode, %d timeperframe %d/%d\n",
1286		__func__,
1287		sp->parm.capture.capturemode,
1288		sp->parm.capture.timeperframe.numerator,
1289		sp->parm.capture.timeperframe.denominator);
1290	return 0;
1291}
1292
1293static int vidioc_s_parm(struct file *file, void *priv,
1294			 struct v4l2_streamparm *sp)
1295{
1296	struct s2255_vc *vc = video_drvdata(file);
1297	struct s2255_mode mode;
1298	int fdec = FDEC_1;
1299	__u32 def_num, def_dem;
1300	if (sp->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1301		return -EINVAL;
1302	mode = vc->mode;
1303	/* high quality capture mode requires a stream restart */
1304	if ((vc->cap_parm.capturemode != sp->parm.capture.capturemode)
1305	    && vb2_is_streaming(&vc->vb_vidq))
1306		return -EBUSY;
1307	def_num = (mode.format == FORMAT_NTSC) ? 1001 : 1000;
1308	def_dem = (mode.format == FORMAT_NTSC) ? 30000 : 25000;
1309	if (def_dem != sp->parm.capture.timeperframe.denominator)
1310		sp->parm.capture.timeperframe.numerator = def_num;
1311	else if (sp->parm.capture.timeperframe.numerator <= def_num)
1312		sp->parm.capture.timeperframe.numerator = def_num;
1313	else if (sp->parm.capture.timeperframe.numerator <= (def_num * 2)) {
1314		sp->parm.capture.timeperframe.numerator = def_num * 2;
1315		fdec = FDEC_2;
1316	} else if (sp->parm.capture.timeperframe.numerator <= (def_num * 3)) {
1317		sp->parm.capture.timeperframe.numerator = def_num * 3;
1318		fdec = FDEC_3;
1319	} else {
1320		sp->parm.capture.timeperframe.numerator = def_num * 5;
1321		fdec = FDEC_5;
1322	}
1323	mode.fdec = fdec;
1324	sp->parm.capture.timeperframe.denominator = def_dem;
1325	sp->parm.capture.readbuffers = S2255_MIN_BUFS;
1326	s2255_set_mode(vc, &mode);
1327	dprintk(vc->dev, 4, "%s capture mode, %d timeperframe %d/%d, fdec %d\n",
1328		__func__,
1329		sp->parm.capture.capturemode,
1330		sp->parm.capture.timeperframe.numerator,
1331		sp->parm.capture.timeperframe.denominator, fdec);
1332	return 0;
1333}
1334
1335#define NUM_SIZE_ENUMS 3
1336static const struct v4l2_frmsize_discrete ntsc_sizes[] = {
1337	{ 640, 480 },
1338	{ 640, 240 },
1339	{ 320, 240 },
1340};
1341static const struct v4l2_frmsize_discrete pal_sizes[] = {
1342	{ 704, 576 },
1343	{ 704, 288 },
1344	{ 352, 288 },
1345};
1346
1347static int vidioc_enum_framesizes(struct file *file, void *priv,
1348			    struct v4l2_frmsizeenum *fe)
1349{
1350	struct s2255_vc *vc = video_drvdata(file);
1351	int is_ntsc = vc->std & V4L2_STD_525_60;
1352	const struct s2255_fmt *fmt;
1353
1354	if (fe->index >= NUM_SIZE_ENUMS)
1355		return -EINVAL;
1356
1357	fmt = format_by_fourcc(fe->pixel_format);
1358	if (fmt == NULL)
1359		return -EINVAL;
1360	fe->type = V4L2_FRMSIZE_TYPE_DISCRETE;
1361	fe->discrete = is_ntsc ?  ntsc_sizes[fe->index] : pal_sizes[fe->index];
1362	return 0;
1363}
1364
1365static int vidioc_enum_frameintervals(struct file *file, void *priv,
1366			    struct v4l2_frmivalenum *fe)
1367{
1368	struct s2255_vc *vc = video_drvdata(file);
1369	const struct s2255_fmt *fmt;
1370	const struct v4l2_frmsize_discrete *sizes;
1371	int is_ntsc = vc->std & V4L2_STD_525_60;
1372#define NUM_FRAME_ENUMS 4
1373	int frm_dec[NUM_FRAME_ENUMS] = {1, 2, 3, 5};
1374	int i;
1375
1376	if (fe->index >= NUM_FRAME_ENUMS)
1377		return -EINVAL;
1378
1379	fmt = format_by_fourcc(fe->pixel_format);
1380	if (fmt == NULL)
1381		return -EINVAL;
1382
1383	sizes = is_ntsc ? ntsc_sizes : pal_sizes;
1384	for (i = 0; i < NUM_SIZE_ENUMS; i++, sizes++)
1385		if (fe->width == sizes->width &&
1386		    fe->height == sizes->height)
1387			break;
1388	if (i == NUM_SIZE_ENUMS)
1389		return -EINVAL;
1390
1391	fe->type = V4L2_FRMIVAL_TYPE_DISCRETE;
1392	fe->discrete.denominator = is_ntsc ? 30000 : 25000;
1393	fe->discrete.numerator = (is_ntsc ? 1001 : 1000) * frm_dec[fe->index];
1394	dprintk(vc->dev, 4, "%s discrete %d/%d\n", __func__,
1395		fe->discrete.numerator,
1396		fe->discrete.denominator);
1397	return 0;
1398}
1399
1400static int s2255_open(struct file *file)
1401{
1402	struct s2255_vc *vc = video_drvdata(file);
1403	struct s2255_dev *dev = vc->dev;
1404	int state;
1405	int rc = 0;
1406
1407	rc = v4l2_fh_open(file);
1408	if (rc != 0)
1409		return rc;
1410
1411	dprintk(dev, 1, "s2255: %s\n", __func__);
1412	state = atomic_read(&dev->fw_data->fw_state);
1413	switch (state) {
1414	case S2255_FW_DISCONNECTING:
1415		return -ENODEV;
1416	case S2255_FW_FAILED:
1417		s2255_dev_err(&dev->udev->dev,
1418			"firmware load failed. retrying.\n");
1419		s2255_fwload_start(dev);
1420		wait_event_timeout(dev->fw_data->wait_fw,
1421				   ((atomic_read(&dev->fw_data->fw_state)
1422				     == S2255_FW_SUCCESS) ||
1423				    (atomic_read(&dev->fw_data->fw_state)
1424				     == S2255_FW_DISCONNECTING)),
1425				   msecs_to_jiffies(S2255_LOAD_TIMEOUT));
1426		/* state may have changed, re-read */
1427		state = atomic_read(&dev->fw_data->fw_state);
1428		break;
1429	case S2255_FW_NOTLOADED:
1430	case S2255_FW_LOADED_DSPWAIT:
1431		/* give S2255_LOAD_TIMEOUT time for firmware to load in case
1432		   driver loaded and then device immediately opened */
1433		pr_info("%s waiting for firmware load\n", __func__);
1434		wait_event_timeout(dev->fw_data->wait_fw,
1435				   ((atomic_read(&dev->fw_data->fw_state)
1436				     == S2255_FW_SUCCESS) ||
1437				    (atomic_read(&dev->fw_data->fw_state)
1438				     == S2255_FW_DISCONNECTING)),
1439				   msecs_to_jiffies(S2255_LOAD_TIMEOUT));
1440		/* state may have changed, re-read */
1441		state = atomic_read(&dev->fw_data->fw_state);
1442		break;
1443	case S2255_FW_SUCCESS:
1444	default:
1445		break;
1446	}
1447	/* state may have changed in above switch statement */
1448	switch (state) {
1449	case S2255_FW_SUCCESS:
1450		break;
1451	case S2255_FW_FAILED:
1452		pr_info("2255 firmware load failed.\n");
1453		return -ENODEV;
1454	case S2255_FW_DISCONNECTING:
1455		pr_info("%s: disconnecting\n", __func__);
1456		return -ENODEV;
1457	case S2255_FW_LOADED_DSPWAIT:
1458	case S2255_FW_NOTLOADED:
1459		pr_info("%s: firmware not loaded, please retry\n",
1460			__func__);
1461		/*
1462		 * Timeout on firmware load means device unusable.
1463		 * Set firmware failure state.
1464		 * On next s2255_open the firmware will be reloaded.
1465		 */
1466		atomic_set(&dev->fw_data->fw_state,
1467			   S2255_FW_FAILED);
1468		return -EAGAIN;
1469	default:
1470		pr_info("%s: unknown state\n", __func__);
1471		return -EFAULT;
1472	}
1473	if (!vc->configured) {
1474		/* configure channel to default state */
1475		vc->fmt = &formats[0];
1476		s2255_set_mode(vc, &vc->mode);
1477		vc->configured = 1;
1478	}
1479	return 0;
1480}
1481
1482static void s2255_destroy(struct s2255_dev *dev)
1483{
1484	dprintk(dev, 1, "%s", __func__);
1485	/* board shutdown stops the read pipe if it is running */
1486	s2255_board_shutdown(dev);
1487	/* make sure firmware still not trying to load */
1488	timer_shutdown_sync(&dev->timer);  /* only started in .probe and .open */
1489	if (dev->fw_data->fw_urb) {
1490		usb_kill_urb(dev->fw_data->fw_urb);
1491		usb_free_urb(dev->fw_data->fw_urb);
1492		dev->fw_data->fw_urb = NULL;
1493	}
1494	release_firmware(dev->fw_data->fw);
1495	kfree(dev->fw_data->pfw_data);
1496	kfree(dev->fw_data);
1497	/* reset the DSP so firmware can be reloaded next time */
1498	s2255_reset_dsppower(dev);
1499	mutex_destroy(&dev->lock);
1500	usb_put_dev(dev->udev);
1501	v4l2_device_unregister(&dev->v4l2_dev);
1502	kfree(dev->cmdbuf);
1503	kfree(dev);
1504}
1505
1506static const struct v4l2_file_operations s2255_fops_v4l = {
1507	.owner = THIS_MODULE,
1508	.open = s2255_open,
1509	.release = vb2_fop_release,
1510	.poll = vb2_fop_poll,
1511	.unlocked_ioctl = video_ioctl2,	/* V4L2 ioctl handler */
1512	.mmap = vb2_fop_mmap,
1513	.read = vb2_fop_read,
1514};
1515
1516static const struct v4l2_ioctl_ops s2255_ioctl_ops = {
1517	.vidioc_querycap = vidioc_querycap,
1518	.vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
1519	.vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
1520	.vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
1521	.vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
1522	.vidioc_reqbufs = vb2_ioctl_reqbufs,
1523	.vidioc_querybuf = vb2_ioctl_querybuf,
1524	.vidioc_qbuf = vb2_ioctl_qbuf,
1525	.vidioc_dqbuf = vb2_ioctl_dqbuf,
1526	.vidioc_s_std = vidioc_s_std,
1527	.vidioc_g_std = vidioc_g_std,
1528	.vidioc_enum_input = vidioc_enum_input,
1529	.vidioc_g_input = vidioc_g_input,
1530	.vidioc_s_input = vidioc_s_input,
1531	.vidioc_streamon = vb2_ioctl_streamon,
1532	.vidioc_streamoff = vb2_ioctl_streamoff,
1533	.vidioc_s_jpegcomp = vidioc_s_jpegcomp,
1534	.vidioc_g_jpegcomp = vidioc_g_jpegcomp,
1535	.vidioc_s_parm = vidioc_s_parm,
1536	.vidioc_g_parm = vidioc_g_parm,
1537	.vidioc_enum_framesizes = vidioc_enum_framesizes,
1538	.vidioc_enum_frameintervals = vidioc_enum_frameintervals,
1539	.vidioc_log_status  = v4l2_ctrl_log_status,
1540	.vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
1541	.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1542};
1543
1544static void s2255_video_device_release(struct video_device *vdev)
1545{
1546	struct s2255_dev *dev = to_s2255_dev(vdev->v4l2_dev);
1547	struct s2255_vc *vc =
1548		container_of(vdev, struct s2255_vc, vdev);
1549
1550	dprintk(dev, 4, "%s, chnls: %d\n", __func__,
1551		refcount_read(&dev->num_channels));
1552
1553	v4l2_ctrl_handler_free(&vc->hdl);
1554
1555	if (refcount_dec_and_test(&dev->num_channels))
1556		s2255_destroy(dev);
1557	return;
1558}
1559
1560static const struct video_device template = {
1561	.name = "s2255v",
1562	.fops = &s2255_fops_v4l,
1563	.ioctl_ops = &s2255_ioctl_ops,
1564	.release = s2255_video_device_release,
1565	.tvnorms = S2255_NORMS,
1566};
1567
1568static const struct v4l2_ctrl_ops s2255_ctrl_ops = {
1569	.s_ctrl = s2255_s_ctrl,
1570};
1571
1572static const struct v4l2_ctrl_config color_filter_ctrl = {
1573	.ops = &s2255_ctrl_ops,
1574	.name = "Color Filter",
1575	.id = V4L2_CID_S2255_COLORFILTER,
1576	.type = V4L2_CTRL_TYPE_BOOLEAN,
1577	.max = 1,
1578	.step = 1,
1579	.def = 1,
1580};
1581
1582static int s2255_probe_v4l(struct s2255_dev *dev)
1583{
1584	int ret;
1585	int i;
1586	int cur_nr = video_nr;
1587	struct s2255_vc *vc;
1588	struct vb2_queue *q;
1589
1590	ret = v4l2_device_register(&dev->interface->dev, &dev->v4l2_dev);
1591	if (ret)
1592		return ret;
1593	/* initialize all video 4 linux */
1594	/* register 4 video devices */
1595	for (i = 0; i < MAX_CHANNELS; i++) {
1596		vc = &dev->vc[i];
1597		INIT_LIST_HEAD(&vc->buf_list);
1598
1599		v4l2_ctrl_handler_init(&vc->hdl, 6);
1600		v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
1601				V4L2_CID_BRIGHTNESS, -127, 127, 1, DEF_BRIGHT);
1602		v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
1603				V4L2_CID_CONTRAST, 0, 255, 1, DEF_CONTRAST);
1604		v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
1605				V4L2_CID_SATURATION, 0, 255, 1, DEF_SATURATION);
1606		v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
1607				V4L2_CID_HUE, 0, 255, 1, DEF_HUE);
1608		vc->jpegqual_ctrl = v4l2_ctrl_new_std(&vc->hdl,
1609				&s2255_ctrl_ops,
1610				V4L2_CID_JPEG_COMPRESSION_QUALITY,
1611				0, 100, 1, S2255_DEF_JPEG_QUAL);
1612		if (dev->dsp_fw_ver >= S2255_MIN_DSP_COLORFILTER &&
1613		    (dev->pid != 0x2257 || vc->idx <= 1))
1614			v4l2_ctrl_new_custom(&vc->hdl, &color_filter_ctrl,
1615					     NULL);
1616		if (vc->hdl.error) {
1617			ret = vc->hdl.error;
1618			v4l2_ctrl_handler_free(&vc->hdl);
1619			dev_err(&dev->udev->dev, "couldn't register control\n");
1620			break;
1621		}
1622		q = &vc->vb_vidq;
1623		q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1624		q->io_modes = VB2_MMAP | VB2_READ | VB2_USERPTR;
1625		q->drv_priv = vc;
1626		q->lock = &vc->vb_lock;
1627		q->buf_struct_size = sizeof(struct s2255_buffer);
1628		q->mem_ops = &vb2_vmalloc_memops;
1629		q->ops = &s2255_video_qops;
1630		q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1631		ret = vb2_queue_init(q);
1632		if (ret != 0) {
1633			dev_err(&dev->udev->dev,
1634				"%s vb2_queue_init 0x%x\n", __func__, ret);
1635			break;
1636		}
1637		/* register video devices */
1638		vc->vdev = template;
1639		vc->vdev.queue = q;
1640		vc->vdev.ctrl_handler = &vc->hdl;
1641		vc->vdev.lock = &dev->lock;
1642		vc->vdev.v4l2_dev = &dev->v4l2_dev;
1643		vc->vdev.device_caps = V4L2_CAP_VIDEO_CAPTURE |
1644				       V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;
1645		video_set_drvdata(&vc->vdev, vc);
1646		if (video_nr == -1)
1647			ret = video_register_device(&vc->vdev,
1648						    VFL_TYPE_VIDEO,
1649						    video_nr);
1650		else
1651			ret = video_register_device(&vc->vdev,
1652						    VFL_TYPE_VIDEO,
1653						    cur_nr + i);
1654
1655		if (ret) {
1656			dev_err(&dev->udev->dev,
1657				"failed to register video device!\n");
1658			break;
1659		}
1660		refcount_inc(&dev->num_channels);
1661		v4l2_info(&dev->v4l2_dev, "V4L2 device registered as %s\n",
1662			  video_device_node_name(&vc->vdev));
1663
1664	}
1665	pr_info("Sensoray 2255 V4L driver Revision: %s\n",
1666		S2255_VERSION);
1667	/* if no channels registered, return error and probe will fail*/
1668	if (refcount_read(&dev->num_channels) == 0) {
1669		v4l2_device_unregister(&dev->v4l2_dev);
1670		return ret;
1671	}
1672	if (refcount_read(&dev->num_channels) != MAX_CHANNELS)
1673		pr_warn("s2255: Not all channels available.\n");
1674	return 0;
1675}
1676
1677/* this function moves the usb stream read pipe data
1678 * into the system buffers.
1679 * returns 0 on success, EAGAIN if more data to process( call this
1680 * function again).
1681 *
1682 * Received frame structure:
1683 * bytes 0-3:  marker : 0x2255DA4AL (S2255_MARKER_FRAME)
1684 * bytes 4-7:  channel: 0-3
1685 * bytes 8-11: payload size:  size of the frame
1686 * bytes 12-payloadsize+12:  frame data
1687 */
1688static int save_frame(struct s2255_dev *dev, struct s2255_pipeinfo *pipe_info)
1689{
1690	char *pdest;
1691	u32 offset = 0;
1692	int bframe = 0;
1693	char *psrc;
1694	unsigned long copy_size;
1695	unsigned long size;
1696	s32 idx = -1;
1697	struct s2255_framei *frm;
1698	unsigned char *pdata;
1699	struct s2255_vc *vc;
1700	dprintk(dev, 100, "buffer to user\n");
1701	vc = &dev->vc[dev->cc];
1702	idx = vc->cur_frame;
1703	frm = &vc->buffer.frame[idx];
1704	if (frm->ulState == S2255_READ_IDLE) {
1705		int jj;
1706		unsigned int cc;
1707		__le32 *pdword; /*data from dsp is little endian */
1708		int payload;
1709		/* search for marker codes */
1710		pdata = (unsigned char *)pipe_info->transfer_buffer;
1711		pdword = (__le32 *)pdata;
1712		for (jj = 0; jj < (pipe_info->cur_transfer_size - 12); jj++) {
1713			switch (*pdword) {
1714			case S2255_MARKER_FRAME:
1715				dprintk(dev, 4, "marker @ offset: %d [%x %x]\n",
1716					jj, pdata[0], pdata[1]);
1717				offset = jj + PREFIX_SIZE;
1718				bframe = 1;
1719				cc = le32_to_cpu(pdword[1]);
1720				if (cc >= MAX_CHANNELS) {
1721					dprintk(dev, 0,
1722						"bad channel\n");
1723					return -EINVAL;
1724				}
1725				/* reverse it */
1726				dev->cc = G_chnmap[cc];
1727				vc = &dev->vc[dev->cc];
1728				payload =  le32_to_cpu(pdword[3]);
1729				if (payload > vc->req_image_size) {
1730					vc->bad_payload++;
1731					/* discard the bad frame */
1732					return -EINVAL;
1733				}
1734				vc->pkt_size = payload;
1735				vc->jpg_size = le32_to_cpu(pdword[4]);
1736				break;
1737			case S2255_MARKER_RESPONSE:
1738
1739				pdata += DEF_USB_BLOCK;
1740				jj += DEF_USB_BLOCK;
1741				if (le32_to_cpu(pdword[1]) >= MAX_CHANNELS)
1742					break;
1743				cc = G_chnmap[le32_to_cpu(pdword[1])];
1744				if (cc >= MAX_CHANNELS)
1745					break;
1746				vc = &dev->vc[cc];
1747				switch (pdword[2]) {
1748				case S2255_RESPONSE_SETMODE:
1749					/* check if channel valid */
1750					/* set mode ready */
1751					vc->setmode_ready = 1;
1752					wake_up(&vc->wait_setmode);
1753					dprintk(dev, 5, "setmode rdy %d\n", cc);
1754					break;
1755				case S2255_RESPONSE_FW:
1756					dev->chn_ready |= (1 << cc);
1757					if ((dev->chn_ready & 0x0f) != 0x0f)
1758						break;
1759					/* all channels ready */
1760					pr_info("s2255: fw loaded\n");
1761					atomic_set(&dev->fw_data->fw_state,
1762						   S2255_FW_SUCCESS);
1763					wake_up(&dev->fw_data->wait_fw);
1764					break;
1765				case S2255_RESPONSE_STATUS:
1766					vc->vidstatus = le32_to_cpu(pdword[3]);
1767					vc->vidstatus_ready = 1;
1768					wake_up(&vc->wait_vidstatus);
1769					dprintk(dev, 5, "vstat %x chan %d\n",
1770						le32_to_cpu(pdword[3]), cc);
1771					break;
1772				default:
1773					pr_info("s2255 unknown resp\n");
1774				}
1775				pdata++;
1776				break;
1777			default:
1778				pdata++;
1779				break;
1780			}
1781			if (bframe)
1782				break;
1783		} /* for */
1784		if (!bframe)
1785			return -EINVAL;
1786	}
1787	vc = &dev->vc[dev->cc];
1788	idx = vc->cur_frame;
1789	frm = &vc->buffer.frame[idx];
1790	/* search done.  now find out if should be acquiring on this channel */
1791	if (!vb2_is_streaming(&vc->vb_vidq)) {
1792		/* we found a frame, but this channel is turned off */
1793		frm->ulState = S2255_READ_IDLE;
1794		return -EINVAL;
1795	}
1796
1797	if (frm->ulState == S2255_READ_IDLE) {
1798		frm->ulState = S2255_READ_FRAME;
1799		frm->cur_size = 0;
1800	}
1801
1802	/* skip the marker 512 bytes (and offset if out of sync) */
1803	psrc = (u8 *)pipe_info->transfer_buffer + offset;
1804
1805
1806	if (frm->lpvbits == NULL) {
1807		dprintk(dev, 1, "s2255 frame buffer == NULL.%p %p %d %d",
1808			frm, dev, dev->cc, idx);
1809		return -ENOMEM;
1810	}
1811
1812	pdest = frm->lpvbits + frm->cur_size;
1813
1814	copy_size = (pipe_info->cur_transfer_size - offset);
1815
1816	size = vc->pkt_size - PREFIX_SIZE;
1817
1818	/* sanity check on pdest */
1819	if ((copy_size + frm->cur_size) < vc->req_image_size)
1820		memcpy(pdest, psrc, copy_size);
1821
1822	frm->cur_size += copy_size;
1823	dprintk(dev, 4, "cur_size: %lu, size: %lu\n", frm->cur_size, size);
1824
1825	if (frm->cur_size >= size) {
1826		dprintk(dev, 2, "******[%d]Buffer[%d]full*******\n",
1827			dev->cc, idx);
1828		vc->last_frame = vc->cur_frame;
1829		vc->cur_frame++;
1830		/* end of system frame ring buffer, start at zero */
1831		if ((vc->cur_frame == SYS_FRAMES) ||
1832		    (vc->cur_frame == vc->buffer.dwFrames))
1833			vc->cur_frame = 0;
1834		/* frame ready */
1835		if (vb2_is_streaming(&vc->vb_vidq))
1836			s2255_got_frame(vc, vc->jpg_size);
1837		vc->frame_count++;
1838		frm->ulState = S2255_READ_IDLE;
1839		frm->cur_size = 0;
1840
1841	}
1842	/* done successfully */
1843	return 0;
1844}
1845
1846static void s2255_read_video_callback(struct s2255_dev *dev,
1847				      struct s2255_pipeinfo *pipe_info)
1848{
1849	int res;
1850	dprintk(dev, 50, "callback read video\n");
1851
1852	if (dev->cc >= MAX_CHANNELS) {
1853		dev->cc = 0;
1854		dev_err(&dev->udev->dev, "invalid channel\n");
1855		return;
1856	}
1857	/* otherwise copy to the system buffers */
1858	res = save_frame(dev, pipe_info);
1859	if (res != 0)
1860		dprintk(dev, 4, "s2255: read callback failed\n");
1861
1862	dprintk(dev, 50, "callback read video done\n");
1863	return;
1864}
1865
1866static long s2255_vendor_req(struct s2255_dev *dev, unsigned char Request,
1867			     u16 Index, u16 Value, void *TransferBuffer,
1868			     s32 TransferBufferLength, int bOut)
1869{
1870	int r;
1871	unsigned char *buf;
1872
1873	buf = kmalloc(TransferBufferLength, GFP_KERNEL);
1874	if (!buf)
1875		return -ENOMEM;
1876
1877	if (!bOut) {
1878		r = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0),
1879				    Request,
1880				    USB_TYPE_VENDOR | USB_RECIP_DEVICE |
1881				    USB_DIR_IN,
1882				    Value, Index, buf,
1883				    TransferBufferLength, USB_CTRL_SET_TIMEOUT);
1884
1885		if (r >= 0)
1886			memcpy(TransferBuffer, buf, TransferBufferLength);
1887	} else {
1888		memcpy(buf, TransferBuffer, TransferBufferLength);
1889		r = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
1890				    Request, USB_TYPE_VENDOR | USB_RECIP_DEVICE,
1891				    Value, Index, buf,
1892				    TransferBufferLength, USB_CTRL_SET_TIMEOUT);
1893	}
1894	kfree(buf);
1895	return r;
1896}
1897
1898/*
1899 * retrieve FX2 firmware version. future use.
1900 * @param dev pointer to device extension
1901 * @return -1 for fail, else returns firmware version as an int(16 bits)
1902 */
1903static int s2255_get_fx2fw(struct s2255_dev *dev)
1904{
1905	int fw;
1906	int ret;
1907	u8 transBuffer[2] = {};
1908
1909	ret = s2255_vendor_req(dev, S2255_VR_FW, 0, 0, transBuffer,
1910			       sizeof(transBuffer), S2255_VR_IN);
1911	if (ret < 0)
1912		dprintk(dev, 2, "get fw error: %x\n", ret);
1913	fw = transBuffer[0] + (transBuffer[1] << 8);
1914	dprintk(dev, 2, "Get FW %x %x\n", transBuffer[0], transBuffer[1]);
1915	return fw;
1916}
1917
1918/*
1919 * Create the system ring buffer to copy frames into from the
1920 * usb read pipe.
1921 */
1922static int s2255_create_sys_buffers(struct s2255_vc *vc)
1923{
1924	unsigned long i;
1925	unsigned long reqsize;
1926	vc->buffer.dwFrames = SYS_FRAMES;
1927	/* always allocate maximum size(PAL) for system buffers */
1928	reqsize = SYS_FRAMES_MAXSIZE;
1929
1930	if (reqsize > SYS_FRAMES_MAXSIZE)
1931		reqsize = SYS_FRAMES_MAXSIZE;
1932
1933	for (i = 0; i < SYS_FRAMES; i++) {
1934		/* allocate the frames */
1935		vc->buffer.frame[i].lpvbits = vmalloc(reqsize);
1936		vc->buffer.frame[i].size = reqsize;
1937		if (vc->buffer.frame[i].lpvbits == NULL) {
1938			pr_info("out of memory.  using less frames\n");
1939			vc->buffer.dwFrames = i;
1940			break;
1941		}
1942	}
1943
1944	/* make sure internal states are set */
1945	for (i = 0; i < SYS_FRAMES; i++) {
1946		vc->buffer.frame[i].ulState = 0;
1947		vc->buffer.frame[i].cur_size = 0;
1948	}
1949
1950	vc->cur_frame = 0;
1951	vc->last_frame = -1;
1952	return 0;
1953}
1954
1955static int s2255_release_sys_buffers(struct s2255_vc *vc)
1956{
1957	unsigned long i;
1958	for (i = 0; i < SYS_FRAMES; i++) {
1959		vfree(vc->buffer.frame[i].lpvbits);
1960		vc->buffer.frame[i].lpvbits = NULL;
1961	}
1962	return 0;
1963}
1964
1965static int s2255_board_init(struct s2255_dev *dev)
1966{
1967	struct s2255_mode mode_def = DEF_MODEI_NTSC_CONT;
1968	int fw_ver;
1969	int j;
1970	struct s2255_pipeinfo *pipe = &dev->pipe;
1971	dprintk(dev, 4, "board init: %p", dev);
1972	memset(pipe, 0, sizeof(*pipe));
1973	pipe->dev = dev;
1974	pipe->cur_transfer_size = S2255_USB_XFER_SIZE;
1975	pipe->max_transfer_size = S2255_USB_XFER_SIZE;
1976
1977	pipe->transfer_buffer = kzalloc(pipe->max_transfer_size,
1978					GFP_KERNEL);
1979	if (pipe->transfer_buffer == NULL) {
1980		dprintk(dev, 1, "out of memory!\n");
1981		return -ENOMEM;
1982	}
1983	/* query the firmware */
1984	fw_ver = s2255_get_fx2fw(dev);
1985
1986	pr_info("s2255: usb firmware version %d.%d\n",
1987		(fw_ver >> 8) & 0xff,
1988		fw_ver & 0xff);
1989
1990	if (fw_ver < S2255_CUR_USB_FWVER)
1991		pr_info("s2255: newer USB firmware available\n");
1992
1993	for (j = 0; j < MAX_CHANNELS; j++) {
1994		struct s2255_vc *vc = &dev->vc[j];
1995		vc->mode = mode_def;
1996		if (dev->pid == 0x2257 && j > 1)
1997			vc->mode.color |= (1 << 16);
1998		vc->jpegqual = S2255_DEF_JPEG_QUAL;
1999		vc->width = LINE_SZ_4CIFS_NTSC;
2000		vc->height = NUM_LINES_4CIFS_NTSC * 2;
2001		vc->std = V4L2_STD_NTSC_M;
2002		vc->fmt = &formats[0];
2003		vc->mode.restart = 1;
2004		vc->req_image_size = get_transfer_size(&mode_def);
2005		vc->frame_count = 0;
2006		/* create the system buffers */
2007		s2255_create_sys_buffers(vc);
2008	}
2009	/* start read pipe */
2010	s2255_start_readpipe(dev);
2011	dprintk(dev, 1, "%s: success\n", __func__);
2012	return 0;
2013}
2014
2015static int s2255_board_shutdown(struct s2255_dev *dev)
2016{
2017	u32 i;
2018	dprintk(dev, 1, "%s: dev: %p", __func__,  dev);
2019
2020	for (i = 0; i < MAX_CHANNELS; i++) {
2021		if (vb2_is_streaming(&dev->vc[i].vb_vidq))
2022			s2255_stop_acquire(&dev->vc[i]);
2023	}
2024	s2255_stop_readpipe(dev);
2025	for (i = 0; i < MAX_CHANNELS; i++)
2026		s2255_release_sys_buffers(&dev->vc[i]);
2027	/* release transfer buffer */
2028	kfree(dev->pipe.transfer_buffer);
2029	return 0;
2030}
2031
2032static void read_pipe_completion(struct urb *purb)
2033{
2034	struct s2255_pipeinfo *pipe_info;
2035	struct s2255_dev *dev;
2036	int status;
2037	int pipe;
2038	pipe_info = purb->context;
2039	if (pipe_info == NULL) {
2040		dev_err(&purb->dev->dev, "no context!\n");
2041		return;
2042	}
2043	dev = pipe_info->dev;
2044	if (dev == NULL) {
2045		dev_err(&purb->dev->dev, "no context!\n");
2046		return;
2047	}
2048	status = purb->status;
2049	/* if shutting down, do not resubmit, exit immediately */
2050	if (status == -ESHUTDOWN) {
2051		dprintk(dev, 2, "%s: err shutdown\n", __func__);
2052		pipe_info->err_count++;
2053		return;
2054	}
2055
2056	if (pipe_info->state == 0) {
2057		dprintk(dev, 2, "%s: exiting USB pipe", __func__);
2058		return;
2059	}
2060
2061	if (status == 0)
2062		s2255_read_video_callback(dev, pipe_info);
2063	else {
2064		pipe_info->err_count++;
2065		dprintk(dev, 1, "%s: failed URB %d\n", __func__, status);
2066	}
2067
2068	pipe = usb_rcvbulkpipe(dev->udev, dev->read_endpoint);
2069	/* reuse urb */
2070	usb_fill_bulk_urb(pipe_info->stream_urb, dev->udev,
2071			  pipe,
2072			  pipe_info->transfer_buffer,
2073			  pipe_info->cur_transfer_size,
2074			  read_pipe_completion, pipe_info);
2075
2076	if (pipe_info->state != 0) {
2077		if (usb_submit_urb(pipe_info->stream_urb, GFP_ATOMIC))
2078			dev_err(&dev->udev->dev, "error submitting urb\n");
2079	} else {
2080		dprintk(dev, 2, "%s :complete state 0\n", __func__);
2081	}
2082	return;
2083}
2084
2085static int s2255_start_readpipe(struct s2255_dev *dev)
2086{
2087	int pipe;
2088	int retval;
2089	struct s2255_pipeinfo *pipe_info = &dev->pipe;
2090	pipe = usb_rcvbulkpipe(dev->udev, dev->read_endpoint);
2091	dprintk(dev, 2, "%s: IN %d\n", __func__, dev->read_endpoint);
2092	pipe_info->state = 1;
2093	pipe_info->err_count = 0;
2094	pipe_info->stream_urb = usb_alloc_urb(0, GFP_KERNEL);
2095	if (!pipe_info->stream_urb)
2096		return -ENOMEM;
2097	/* transfer buffer allocated in board_init */
2098	usb_fill_bulk_urb(pipe_info->stream_urb, dev->udev,
2099			  pipe,
2100			  pipe_info->transfer_buffer,
2101			  pipe_info->cur_transfer_size,
2102			  read_pipe_completion, pipe_info);
2103	retval = usb_submit_urb(pipe_info->stream_urb, GFP_KERNEL);
2104	if (retval) {
2105		pr_err("s2255: start read pipe failed\n");
2106		return retval;
2107	}
2108	return 0;
2109}
2110
2111/* starts acquisition process */
2112static int s2255_start_acquire(struct s2255_vc *vc)
2113{
2114	int res;
2115	unsigned long chn_rev;
2116	int j;
2117	struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
2118	__le32 *buffer = dev->cmdbuf;
2119
2120	mutex_lock(&dev->cmdlock);
2121	chn_rev = G_chnmap[vc->idx];
2122	vc->last_frame = -1;
2123	vc->bad_payload = 0;
2124	vc->cur_frame = 0;
2125	for (j = 0; j < SYS_FRAMES; j++) {
2126		vc->buffer.frame[j].ulState = 0;
2127		vc->buffer.frame[j].cur_size = 0;
2128	}
2129
2130	/* send the start command */
2131	buffer[0] = IN_DATA_TOKEN;
2132	buffer[1] = (__le32) cpu_to_le32(chn_rev);
2133	buffer[2] = CMD_START;
2134	res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
2135	if (res != 0)
2136		dev_err(&dev->udev->dev, "CMD_START error\n");
2137
2138	dprintk(dev, 2, "start acquire exit[%d] %d\n", vc->idx, res);
2139	mutex_unlock(&dev->cmdlock);
2140	return res;
2141}
2142
2143static int s2255_stop_acquire(struct s2255_vc *vc)
2144{
2145	int res;
2146	unsigned long chn_rev;
2147	struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
2148	__le32 *buffer = dev->cmdbuf;
2149
2150	mutex_lock(&dev->cmdlock);
2151	chn_rev = G_chnmap[vc->idx];
2152	/* send the stop command */
2153	buffer[0] = IN_DATA_TOKEN;
2154	buffer[1] = (__le32) cpu_to_le32(chn_rev);
2155	buffer[2] = CMD_STOP;
2156
2157	res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
2158	if (res != 0)
2159		dev_err(&dev->udev->dev, "CMD_STOP error\n");
2160
2161	dprintk(dev, 4, "%s: chn %d, res %d\n", __func__, vc->idx, res);
2162	mutex_unlock(&dev->cmdlock);
2163	return res;
2164}
2165
2166static void s2255_stop_readpipe(struct s2255_dev *dev)
2167{
2168	struct s2255_pipeinfo *pipe = &dev->pipe;
2169
2170	pipe->state = 0;
2171	if (pipe->stream_urb) {
2172		/* cancel urb */
2173		usb_kill_urb(pipe->stream_urb);
2174		usb_free_urb(pipe->stream_urb);
2175		pipe->stream_urb = NULL;
2176	}
2177	dprintk(dev, 4, "%s", __func__);
2178	return;
2179}
2180
2181static void s2255_fwload_start(struct s2255_dev *dev)
2182{
2183	s2255_reset_dsppower(dev);
2184	dev->fw_data->fw_size = dev->fw_data->fw->size;
2185	atomic_set(&dev->fw_data->fw_state, S2255_FW_NOTLOADED);
2186	memcpy(dev->fw_data->pfw_data,
2187	       dev->fw_data->fw->data, CHUNK_SIZE);
2188	dev->fw_data->fw_loaded = CHUNK_SIZE;
2189	usb_fill_bulk_urb(dev->fw_data->fw_urb, dev->udev,
2190			  usb_sndbulkpipe(dev->udev, 2),
2191			  dev->fw_data->pfw_data,
2192			  CHUNK_SIZE, s2255_fwchunk_complete,
2193			  dev->fw_data);
2194	mod_timer(&dev->timer, jiffies + HZ);
2195}
2196
2197/* standard usb probe function */
2198static int s2255_probe(struct usb_interface *interface,
2199		       const struct usb_device_id *id)
2200{
2201	struct s2255_dev *dev = NULL;
2202	struct usb_host_interface *iface_desc;
2203	struct usb_endpoint_descriptor *endpoint;
2204	int i;
2205	int retval = -ENOMEM;
2206	__le32 *pdata;
2207	int fw_size;
2208
2209	/* allocate memory for our device state and initialize it to zero */
2210	dev = kzalloc(sizeof(struct s2255_dev), GFP_KERNEL);
2211	if (dev == NULL) {
2212		s2255_dev_err(&interface->dev, "out of memory\n");
2213		return -ENOMEM;
2214	}
2215
2216	dev->cmdbuf = kzalloc(S2255_CMDBUF_SIZE, GFP_KERNEL);
2217	if (dev->cmdbuf == NULL) {
2218		s2255_dev_err(&interface->dev, "out of memory\n");
2219		goto errorFWDATA1;
2220	}
2221
2222	refcount_set(&dev->num_channels, 0);
2223	dev->pid = id->idProduct;
2224	dev->fw_data = kzalloc(sizeof(struct s2255_fw), GFP_KERNEL);
2225	if (!dev->fw_data)
2226		goto errorFWDATA1;
2227	mutex_init(&dev->lock);
2228	mutex_init(&dev->cmdlock);
2229	/* grab usb_device and save it */
2230	dev->udev = usb_get_dev(interface_to_usbdev(interface));
2231	if (dev->udev == NULL) {
2232		dev_err(&interface->dev, "null usb device\n");
2233		retval = -ENODEV;
2234		goto errorUDEV;
2235	}
2236	dev_dbg(&interface->dev, "dev: %p, udev %p interface %p\n",
2237		dev, dev->udev, interface);
2238	dev->interface = interface;
2239	/* set up the endpoint information  */
2240	iface_desc = interface->cur_altsetting;
2241	dev_dbg(&interface->dev, "num EP: %d\n",
2242		iface_desc->desc.bNumEndpoints);
2243	for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
2244		endpoint = &iface_desc->endpoint[i].desc;
2245		if (!dev->read_endpoint && usb_endpoint_is_bulk_in(endpoint)) {
2246			/* we found the bulk in endpoint */
2247			dev->read_endpoint = endpoint->bEndpointAddress;
2248		}
2249	}
2250
2251	if (!dev->read_endpoint) {
2252		dev_err(&interface->dev, "Could not find bulk-in endpoint\n");
2253		goto errorEP;
2254	}
2255	timer_setup(&dev->timer, s2255_timer, 0);
2256	init_waitqueue_head(&dev->fw_data->wait_fw);
2257	for (i = 0; i < MAX_CHANNELS; i++) {
2258		struct s2255_vc *vc = &dev->vc[i];
2259		vc->idx = i;
2260		vc->dev = dev;
2261		init_waitqueue_head(&vc->wait_setmode);
2262		init_waitqueue_head(&vc->wait_vidstatus);
2263		spin_lock_init(&vc->qlock);
2264		mutex_init(&vc->vb_lock);
2265	}
2266
2267	dev->fw_data->fw_urb = usb_alloc_urb(0, GFP_KERNEL);
2268	if (!dev->fw_data->fw_urb)
2269		goto errorFWURB;
2270
2271	dev->fw_data->pfw_data = kzalloc(CHUNK_SIZE, GFP_KERNEL);
2272	if (!dev->fw_data->pfw_data) {
2273		dev_err(&interface->dev, "out of memory!\n");
2274		goto errorFWDATA2;
2275	}
2276	/* load the first chunk */
2277	if (request_firmware(&dev->fw_data->fw,
2278			     FIRMWARE_FILE_NAME, &dev->udev->dev)) {
2279		dev_err(&interface->dev, "sensoray 2255 failed to get firmware\n");
2280		goto errorREQFW;
2281	}
2282	/* check the firmware is valid */
2283	fw_size = dev->fw_data->fw->size;
2284	pdata = (__le32 *) &dev->fw_data->fw->data[fw_size - 8];
2285
2286	if (*pdata != S2255_FW_MARKER) {
2287		dev_err(&interface->dev, "Firmware invalid.\n");
2288		retval = -ENODEV;
2289		goto errorFWMARKER;
2290	} else {
2291		/* make sure firmware is the latest */
2292		__le32 *pRel;
2293		pRel = (__le32 *) &dev->fw_data->fw->data[fw_size - 4];
2294		pr_info("s2255 dsp fw version %x\n", le32_to_cpu(*pRel));
2295		dev->dsp_fw_ver = le32_to_cpu(*pRel);
2296		if (dev->dsp_fw_ver < S2255_CUR_DSP_FWVER)
2297			pr_info("s2255: f2255usb.bin out of date.\n");
2298		if (dev->pid == 0x2257 &&
2299				dev->dsp_fw_ver < S2255_MIN_DSP_COLORFILTER)
2300			pr_warn("2257 needs firmware %d or above.\n",
2301				S2255_MIN_DSP_COLORFILTER);
2302	}
2303	usb_reset_device(dev->udev);
2304	/* load 2255 board specific */
2305	retval = s2255_board_init(dev);
2306	if (retval)
2307		goto errorBOARDINIT;
2308	s2255_fwload_start(dev);
2309	/* loads v4l specific */
2310	retval = s2255_probe_v4l(dev);
2311	if (retval)
2312		goto errorBOARDINIT;
2313	dev_info(&interface->dev, "Sensoray 2255 detected\n");
2314	return 0;
2315errorBOARDINIT:
2316	s2255_board_shutdown(dev);
2317errorFWMARKER:
2318	release_firmware(dev->fw_data->fw);
2319errorREQFW:
2320	kfree(dev->fw_data->pfw_data);
2321errorFWDATA2:
2322	usb_free_urb(dev->fw_data->fw_urb);
2323errorFWURB:
2324	timer_shutdown_sync(&dev->timer);
2325errorEP:
2326	usb_put_dev(dev->udev);
2327errorUDEV:
2328	kfree(dev->fw_data);
2329	mutex_destroy(&dev->lock);
2330errorFWDATA1:
2331	kfree(dev->cmdbuf);
2332	kfree(dev);
2333	pr_warn("Sensoray 2255 driver load failed: 0x%x\n", retval);
2334	return retval;
2335}
2336
2337/* disconnect routine. when board is removed physically or with rmmod */
2338static void s2255_disconnect(struct usb_interface *interface)
2339{
2340	struct s2255_dev *dev = to_s2255_dev(usb_get_intfdata(interface));
2341	int i;
2342	int channels = refcount_read(&dev->num_channels);
2343	mutex_lock(&dev->lock);
2344	v4l2_device_disconnect(&dev->v4l2_dev);
2345	mutex_unlock(&dev->lock);
2346	/*see comments in the uvc_driver.c usb disconnect function */
2347	refcount_inc(&dev->num_channels);
2348	/* unregister each video device. */
2349	for (i = 0; i < channels; i++)
2350		video_unregister_device(&dev->vc[i].vdev);
2351	/* wake up any of our timers */
2352	atomic_set(&dev->fw_data->fw_state, S2255_FW_DISCONNECTING);
2353	wake_up(&dev->fw_data->wait_fw);
2354	for (i = 0; i < MAX_CHANNELS; i++) {
2355		dev->vc[i].setmode_ready = 1;
2356		wake_up(&dev->vc[i].wait_setmode);
2357		dev->vc[i].vidstatus_ready = 1;
2358		wake_up(&dev->vc[i].wait_vidstatus);
2359	}
2360	if (refcount_dec_and_test(&dev->num_channels))
2361		s2255_destroy(dev);
2362	dev_info(&interface->dev, "%s\n", __func__);
2363}
2364
2365static struct usb_driver s2255_driver = {
2366	.name = S2255_DRIVER_NAME,
2367	.probe = s2255_probe,
2368	.disconnect = s2255_disconnect,
2369	.id_table = s2255_table,
2370};
2371
2372module_usb_driver(s2255_driver);
2373
2374MODULE_DESCRIPTION("Sensoray 2255 Video for Linux driver");
2375MODULE_AUTHOR("Dean Anderson (Sensoray Company Inc.)");
2376MODULE_LICENSE("GPL");
2377MODULE_VERSION(S2255_VERSION);
2378MODULE_FIRMWARE(FIRMWARE_FILE_NAME);
~/ Read-only file preview.