cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

s2255drv.c (67962B)


      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	atomic_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 = from_timer(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	.wait_prepare = vb2_ops_wait_prepare,
    708	.wait_finish = vb2_ops_wait_finish,
    709};
    710
    711static int vidioc_querycap(struct file *file, void *priv,
    712			   struct v4l2_capability *cap)
    713{
    714	struct s2255_vc *vc = video_drvdata(file);
    715	struct s2255_dev *dev = vc->dev;
    716
    717	strscpy(cap->driver, "s2255", sizeof(cap->driver));
    718	strscpy(cap->card, "s2255", sizeof(cap->card));
    719	usb_make_path(dev->udev, cap->bus_info, sizeof(cap->bus_info));
    720	return 0;
    721}
    722
    723static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
    724			       struct v4l2_fmtdesc *f)
    725{
    726	int index = f->index;
    727
    728	if (index >= ARRAY_SIZE(formats))
    729		return -EINVAL;
    730	if (!jpeg_enable && ((formats[index].fourcc == V4L2_PIX_FMT_JPEG) ||
    731			(formats[index].fourcc == V4L2_PIX_FMT_MJPEG)))
    732		return -EINVAL;
    733	f->pixelformat = formats[index].fourcc;
    734	return 0;
    735}
    736
    737static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
    738			    struct v4l2_format *f)
    739{
    740	struct s2255_vc *vc = video_drvdata(file);
    741	int is_ntsc = vc->std & V4L2_STD_525_60;
    742
    743	f->fmt.pix.width = vc->width;
    744	f->fmt.pix.height = vc->height;
    745	if (f->fmt.pix.height >=
    746	    (is_ntsc ? NUM_LINES_1CIFS_NTSC : NUM_LINES_1CIFS_PAL) * 2)
    747		f->fmt.pix.field = V4L2_FIELD_INTERLACED;
    748	else
    749		f->fmt.pix.field = V4L2_FIELD_TOP;
    750	f->fmt.pix.pixelformat = vc->fmt->fourcc;
    751	f->fmt.pix.bytesperline = f->fmt.pix.width * (vc->fmt->depth >> 3);
    752	f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
    753	f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
    754	return 0;
    755}
    756
    757static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
    758			      struct v4l2_format *f)
    759{
    760	const struct s2255_fmt *fmt;
    761	enum v4l2_field field;
    762	struct s2255_vc *vc = video_drvdata(file);
    763	int is_ntsc = vc->std & V4L2_STD_525_60;
    764
    765	fmt = format_by_fourcc(f->fmt.pix.pixelformat);
    766
    767	if (fmt == NULL)
    768		return -EINVAL;
    769
    770	dprintk(vc->dev, 50, "%s NTSC: %d suggested width: %d, height: %d\n",
    771		__func__, is_ntsc, f->fmt.pix.width, f->fmt.pix.height);
    772	if (is_ntsc) {
    773		/* NTSC */
    774		if (f->fmt.pix.height >= NUM_LINES_1CIFS_NTSC * 2) {
    775			f->fmt.pix.height = NUM_LINES_1CIFS_NTSC * 2;
    776			field = V4L2_FIELD_INTERLACED;
    777		} else {
    778			f->fmt.pix.height = NUM_LINES_1CIFS_NTSC;
    779			field = V4L2_FIELD_TOP;
    780		}
    781		if (f->fmt.pix.width >= LINE_SZ_4CIFS_NTSC)
    782			f->fmt.pix.width = LINE_SZ_4CIFS_NTSC;
    783		else
    784			f->fmt.pix.width = LINE_SZ_1CIFS_NTSC;
    785	} else {
    786		/* PAL */
    787		if (f->fmt.pix.height >= NUM_LINES_1CIFS_PAL * 2) {
    788			f->fmt.pix.height = NUM_LINES_1CIFS_PAL * 2;
    789			field = V4L2_FIELD_INTERLACED;
    790		} else {
    791			f->fmt.pix.height = NUM_LINES_1CIFS_PAL;
    792			field = V4L2_FIELD_TOP;
    793		}
    794		if (f->fmt.pix.width >= LINE_SZ_4CIFS_PAL)
    795			f->fmt.pix.width = LINE_SZ_4CIFS_PAL;
    796		else
    797			f->fmt.pix.width = LINE_SZ_1CIFS_PAL;
    798	}
    799	f->fmt.pix.field = field;
    800	f->fmt.pix.bytesperline = (f->fmt.pix.width * fmt->depth) >> 3;
    801	f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
    802	f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
    803	dprintk(vc->dev, 50, "%s: set width %d height %d field %d\n", __func__,
    804		f->fmt.pix.width, f->fmt.pix.height, f->fmt.pix.field);
    805	return 0;
    806}
    807
    808static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
    809			    struct v4l2_format *f)
    810{
    811	struct s2255_vc *vc = video_drvdata(file);
    812	const struct s2255_fmt *fmt;
    813	struct vb2_queue *q = &vc->vb_vidq;
    814	struct s2255_mode mode;
    815	int ret;
    816
    817	ret = vidioc_try_fmt_vid_cap(file, vc, f);
    818
    819	if (ret < 0)
    820		return ret;
    821
    822	fmt = format_by_fourcc(f->fmt.pix.pixelformat);
    823
    824	if (fmt == NULL)
    825		return -EINVAL;
    826
    827	if (vb2_is_busy(q)) {
    828		dprintk(vc->dev, 1, "queue busy\n");
    829		return -EBUSY;
    830	}
    831
    832	mode = vc->mode;
    833	vc->fmt = fmt;
    834	vc->width = f->fmt.pix.width;
    835	vc->height = f->fmt.pix.height;
    836	vc->field = f->fmt.pix.field;
    837	if (vc->width > norm_minw(vc)) {
    838		if (vc->height > norm_minh(vc)) {
    839			if (vc->cap_parm.capturemode &
    840			    V4L2_MODE_HIGHQUALITY)
    841				mode.scale = SCALE_4CIFSI;
    842			else
    843				mode.scale = SCALE_4CIFS;
    844		} else
    845			mode.scale = SCALE_2CIFS;
    846
    847	} else {
    848		mode.scale = SCALE_1CIFS;
    849	}
    850	/* color mode */
    851	switch (vc->fmt->fourcc) {
    852	case V4L2_PIX_FMT_GREY:
    853		mode.color &= ~MASK_COLOR;
    854		mode.color |= COLOR_Y8;
    855		break;
    856	case V4L2_PIX_FMT_JPEG:
    857	case V4L2_PIX_FMT_MJPEG:
    858		mode.color &= ~MASK_COLOR;
    859		mode.color |= COLOR_JPG;
    860		mode.color |= (vc->jpegqual << 8);
    861		break;
    862	case V4L2_PIX_FMT_YUV422P:
    863		mode.color &= ~MASK_COLOR;
    864		mode.color |= COLOR_YUVPL;
    865		break;
    866	case V4L2_PIX_FMT_YUYV:
    867	case V4L2_PIX_FMT_UYVY:
    868	default:
    869		mode.color &= ~MASK_COLOR;
    870		mode.color |= COLOR_YUVPK;
    871		break;
    872	}
    873	if ((mode.color & MASK_COLOR) != (vc->mode.color & MASK_COLOR))
    874		mode.restart = 1;
    875	else if (mode.scale != vc->mode.scale)
    876		mode.restart = 1;
    877	else if (mode.format != vc->mode.format)
    878		mode.restart = 1;
    879	vc->mode = mode;
    880	(void) s2255_set_mode(vc, &mode);
    881	return 0;
    882}
    883
    884
    885/* write to the configuration pipe, synchronously */
    886static int s2255_write_config(struct usb_device *udev, unsigned char *pbuf,
    887			      int size)
    888{
    889	int pipe;
    890	int done;
    891	long retval = -1;
    892	if (udev) {
    893		pipe = usb_sndbulkpipe(udev, S2255_CONFIG_EP);
    894		retval = usb_bulk_msg(udev, pipe, pbuf, size, &done, 500);
    895	}
    896	return retval;
    897}
    898
    899static u32 get_transfer_size(struct s2255_mode *mode)
    900{
    901	int linesPerFrame = LINE_SZ_DEF;
    902	int pixelsPerLine = NUM_LINES_DEF;
    903	u32 outImageSize;
    904	u32 usbInSize;
    905	unsigned int mask_mult;
    906
    907	if (mode == NULL)
    908		return 0;
    909
    910	if (mode->format == FORMAT_NTSC) {
    911		switch (mode->scale) {
    912		case SCALE_4CIFS:
    913		case SCALE_4CIFSI:
    914			linesPerFrame = NUM_LINES_4CIFS_NTSC * 2;
    915			pixelsPerLine = LINE_SZ_4CIFS_NTSC;
    916			break;
    917		case SCALE_2CIFS:
    918			linesPerFrame = NUM_LINES_2CIFS_NTSC;
    919			pixelsPerLine = LINE_SZ_2CIFS_NTSC;
    920			break;
    921		case SCALE_1CIFS:
    922			linesPerFrame = NUM_LINES_1CIFS_NTSC;
    923			pixelsPerLine = LINE_SZ_1CIFS_NTSC;
    924			break;
    925		default:
    926			break;
    927		}
    928	} else if (mode->format == FORMAT_PAL) {
    929		switch (mode->scale) {
    930		case SCALE_4CIFS:
    931		case SCALE_4CIFSI:
    932			linesPerFrame = NUM_LINES_4CIFS_PAL * 2;
    933			pixelsPerLine = LINE_SZ_4CIFS_PAL;
    934			break;
    935		case SCALE_2CIFS:
    936			linesPerFrame = NUM_LINES_2CIFS_PAL;
    937			pixelsPerLine = LINE_SZ_2CIFS_PAL;
    938			break;
    939		case SCALE_1CIFS:
    940			linesPerFrame = NUM_LINES_1CIFS_PAL;
    941			pixelsPerLine = LINE_SZ_1CIFS_PAL;
    942			break;
    943		default:
    944			break;
    945		}
    946	}
    947	outImageSize = linesPerFrame * pixelsPerLine;
    948	if ((mode->color & MASK_COLOR) != COLOR_Y8) {
    949		/* 2 bytes/pixel if not monochrome */
    950		outImageSize *= 2;
    951	}
    952
    953	/* total bytes to send including prefix and 4K padding;
    954	   must be a multiple of USB_READ_SIZE */
    955	usbInSize = outImageSize + PREFIX_SIZE;	/* always send prefix */
    956	mask_mult = 0xffffffffUL - DEF_USB_BLOCK + 1;
    957	/* if size not a multiple of USB_READ_SIZE */
    958	if (usbInSize & ~mask_mult)
    959		usbInSize = (usbInSize & mask_mult) + (DEF_USB_BLOCK);
    960	return usbInSize;
    961}
    962
    963static void s2255_print_cfg(struct s2255_dev *sdev, struct s2255_mode *mode)
    964{
    965	struct device *dev = &sdev->udev->dev;
    966	dev_info(dev, "------------------------------------------------\n");
    967	dev_info(dev, "format: %d\nscale %d\n", mode->format, mode->scale);
    968	dev_info(dev, "fdec: %d\ncolor %d\n", mode->fdec, mode->color);
    969	dev_info(dev, "bright: 0x%x\n", mode->bright);
    970	dev_info(dev, "------------------------------------------------\n");
    971}
    972
    973/*
    974 * set mode is the function which controls the DSP.
    975 * the restart parameter in struct s2255_mode should be set whenever
    976 * the image size could change via color format, video system or image
    977 * size.
    978 * When the restart parameter is set, we sleep for ONE frame to allow the
    979 * DSP time to get the new frame
    980 */
    981static int s2255_set_mode(struct s2255_vc *vc,
    982			  struct s2255_mode *mode)
    983{
    984	int res;
    985	unsigned long chn_rev;
    986	struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
    987	int i;
    988	__le32 *buffer = dev->cmdbuf;
    989
    990	mutex_lock(&dev->cmdlock);
    991	chn_rev = G_chnmap[vc->idx];
    992	dprintk(dev, 3, "%s channel: %d\n", __func__, vc->idx);
    993	/* if JPEG, set the quality */
    994	if ((mode->color & MASK_COLOR) == COLOR_JPG) {
    995		mode->color &= ~MASK_COLOR;
    996		mode->color |= COLOR_JPG;
    997		mode->color &= ~MASK_JPG_QUALITY;
    998		mode->color |= (vc->jpegqual << 8);
    999	}
   1000	/* save the mode */
   1001	vc->mode = *mode;
   1002	vc->req_image_size = get_transfer_size(mode);
   1003	dprintk(dev, 1, "%s: reqsize %ld\n", __func__, vc->req_image_size);
   1004	/* set the mode */
   1005	buffer[0] = IN_DATA_TOKEN;
   1006	buffer[1] = (__le32) cpu_to_le32(chn_rev);
   1007	buffer[2] = CMD_SET_MODE;
   1008	for (i = 0; i < sizeof(struct s2255_mode) / sizeof(u32); i++)
   1009		buffer[3 + i] = cpu_to_le32(((u32 *)&vc->mode)[i]);
   1010	vc->setmode_ready = 0;
   1011	res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
   1012	if (debug)
   1013		s2255_print_cfg(dev, mode);
   1014	/* wait at least 3 frames before continuing */
   1015	if (mode->restart) {
   1016		wait_event_timeout(vc->wait_setmode,
   1017				   (vc->setmode_ready != 0),
   1018				   msecs_to_jiffies(S2255_SETMODE_TIMEOUT));
   1019		if (vc->setmode_ready != 1) {
   1020			dprintk(dev, 0, "s2255: no set mode response\n");
   1021			res = -EFAULT;
   1022		}
   1023	}
   1024	/* clear the restart flag */
   1025	vc->mode.restart = 0;
   1026	dprintk(dev, 1, "%s chn %d, result: %d\n", __func__, vc->idx, res);
   1027	mutex_unlock(&dev->cmdlock);
   1028	return res;
   1029}
   1030
   1031static int s2255_cmd_status(struct s2255_vc *vc, u32 *pstatus)
   1032{
   1033	int res;
   1034	u32 chn_rev;
   1035	struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
   1036	__le32 *buffer = dev->cmdbuf;
   1037
   1038	mutex_lock(&dev->cmdlock);
   1039	chn_rev = G_chnmap[vc->idx];
   1040	dprintk(dev, 4, "%s chan %d\n", __func__, vc->idx);
   1041	/* form the get vid status command */
   1042	buffer[0] = IN_DATA_TOKEN;
   1043	buffer[1] = (__le32) cpu_to_le32(chn_rev);
   1044	buffer[2] = CMD_STATUS;
   1045	*pstatus = 0;
   1046	vc->vidstatus_ready = 0;
   1047	res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
   1048	wait_event_timeout(vc->wait_vidstatus,
   1049			   (vc->vidstatus_ready != 0),
   1050			   msecs_to_jiffies(S2255_VIDSTATUS_TIMEOUT));
   1051	if (vc->vidstatus_ready != 1) {
   1052		dprintk(dev, 0, "s2255: no vidstatus response\n");
   1053		res = -EFAULT;
   1054	}
   1055	*pstatus = vc->vidstatus;
   1056	dprintk(dev, 4, "%s, vid status %d\n", __func__, *pstatus);
   1057	mutex_unlock(&dev->cmdlock);
   1058	return res;
   1059}
   1060
   1061static int start_streaming(struct vb2_queue *vq, unsigned int count)
   1062{
   1063	struct s2255_vc *vc = vb2_get_drv_priv(vq);
   1064	int j;
   1065
   1066	vc->last_frame = -1;
   1067	vc->bad_payload = 0;
   1068	vc->cur_frame = 0;
   1069	vc->frame_count = 0;
   1070	for (j = 0; j < SYS_FRAMES; j++) {
   1071		vc->buffer.frame[j].ulState = S2255_READ_IDLE;
   1072		vc->buffer.frame[j].cur_size = 0;
   1073	}
   1074	return s2255_start_acquire(vc);
   1075}
   1076
   1077/* abort streaming and wait for last buffer */
   1078static void stop_streaming(struct vb2_queue *vq)
   1079{
   1080	struct s2255_vc *vc = vb2_get_drv_priv(vq);
   1081	struct s2255_buffer *buf, *node;
   1082	unsigned long flags;
   1083	(void) s2255_stop_acquire(vc);
   1084	spin_lock_irqsave(&vc->qlock, flags);
   1085	list_for_each_entry_safe(buf, node, &vc->buf_list, list) {
   1086		list_del(&buf->list);
   1087		vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
   1088		dprintk(vc->dev, 2, "[%p/%d] done\n",
   1089			buf, buf->vb.vb2_buf.index);
   1090	}
   1091	spin_unlock_irqrestore(&vc->qlock, flags);
   1092}
   1093
   1094static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id i)
   1095{
   1096	struct s2255_vc *vc = video_drvdata(file);
   1097	struct s2255_mode mode;
   1098	struct vb2_queue *q = &vc->vb_vidq;
   1099
   1100	/*
   1101	 * Changing the standard implies a format change, which is not allowed
   1102	 * while buffers for use with streaming have already been allocated.
   1103	 */
   1104	if (vb2_is_busy(q))
   1105		return -EBUSY;
   1106
   1107	mode = vc->mode;
   1108	if (i & V4L2_STD_525_60) {
   1109		dprintk(vc->dev, 4, "%s 60 Hz\n", __func__);
   1110		/* if changing format, reset frame decimation/intervals */
   1111		if (mode.format != FORMAT_NTSC) {
   1112			mode.restart = 1;
   1113			mode.format = FORMAT_NTSC;
   1114			mode.fdec = FDEC_1;
   1115			vc->width = LINE_SZ_4CIFS_NTSC;
   1116			vc->height = NUM_LINES_4CIFS_NTSC * 2;
   1117		}
   1118	} else if (i & V4L2_STD_625_50) {
   1119		dprintk(vc->dev, 4, "%s 50 Hz\n", __func__);
   1120		if (mode.format != FORMAT_PAL) {
   1121			mode.restart = 1;
   1122			mode.format = FORMAT_PAL;
   1123			mode.fdec = FDEC_1;
   1124			vc->width = LINE_SZ_4CIFS_PAL;
   1125			vc->height = NUM_LINES_4CIFS_PAL * 2;
   1126		}
   1127	} else
   1128		return -EINVAL;
   1129	vc->std = i;
   1130	if (mode.restart)
   1131		s2255_set_mode(vc, &mode);
   1132	return 0;
   1133}
   1134
   1135static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *i)
   1136{
   1137	struct s2255_vc *vc = video_drvdata(file);
   1138
   1139	*i = vc->std;
   1140	return 0;
   1141}
   1142
   1143/* Sensoray 2255 is a multiple channel capture device.
   1144   It does not have a "crossbar" of inputs.
   1145   We use one V4L device per channel. The user must
   1146   be aware that certain combinations are not allowed.
   1147   For instance, you cannot do full FPS on more than 2 channels(2 videodevs)
   1148   at once in color(you can do full fps on 4 channels with greyscale.
   1149*/
   1150static int vidioc_enum_input(struct file *file, void *priv,
   1151			     struct v4l2_input *inp)
   1152{
   1153	struct s2255_vc *vc = video_drvdata(file);
   1154	struct s2255_dev *dev = vc->dev;
   1155	u32 status = 0;
   1156
   1157	if (inp->index != 0)
   1158		return -EINVAL;
   1159	inp->type = V4L2_INPUT_TYPE_CAMERA;
   1160	inp->std = S2255_NORMS;
   1161	inp->status = 0;
   1162	if (dev->dsp_fw_ver >= S2255_MIN_DSP_STATUS) {
   1163		int rc;
   1164		rc = s2255_cmd_status(vc, &status);
   1165		dprintk(dev, 4, "s2255_cmd_status rc: %d status %x\n",
   1166			rc, status);
   1167		if (rc == 0)
   1168			inp->status =  (status & 0x01) ? 0
   1169				: V4L2_IN_ST_NO_SIGNAL;
   1170	}
   1171	switch (dev->pid) {
   1172	case 0x2255:
   1173	default:
   1174		strscpy(inp->name, "Composite", sizeof(inp->name));
   1175		break;
   1176	case 0x2257:
   1177		strscpy(inp->name, (vc->idx < 2) ? "Composite" : "S-Video",
   1178			sizeof(inp->name));
   1179		break;
   1180	}
   1181	return 0;
   1182}
   1183
   1184static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
   1185{
   1186	*i = 0;
   1187	return 0;
   1188}
   1189static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
   1190{
   1191	if (i > 0)
   1192		return -EINVAL;
   1193	return 0;
   1194}
   1195
   1196static int s2255_s_ctrl(struct v4l2_ctrl *ctrl)
   1197{
   1198	struct s2255_vc *vc =
   1199		container_of(ctrl->handler, struct s2255_vc, hdl);
   1200	struct s2255_mode mode;
   1201	mode = vc->mode;
   1202	/* update the mode to the corresponding value */
   1203	switch (ctrl->id) {
   1204	case V4L2_CID_BRIGHTNESS:
   1205		mode.bright = ctrl->val;
   1206		break;
   1207	case V4L2_CID_CONTRAST:
   1208		mode.contrast = ctrl->val;
   1209		break;
   1210	case V4L2_CID_HUE:
   1211		mode.hue = ctrl->val;
   1212		break;
   1213	case V4L2_CID_SATURATION:
   1214		mode.saturation = ctrl->val;
   1215		break;
   1216	case V4L2_CID_S2255_COLORFILTER:
   1217		mode.color &= ~MASK_INPUT_TYPE;
   1218		mode.color |= !ctrl->val << 16;
   1219		break;
   1220	case V4L2_CID_JPEG_COMPRESSION_QUALITY:
   1221		vc->jpegqual = ctrl->val;
   1222		return 0;
   1223	default:
   1224		return -EINVAL;
   1225	}
   1226	mode.restart = 0;
   1227	/* set mode here.  Note: stream does not need restarted.
   1228	   some V4L programs restart stream unnecessarily
   1229	   after a s_crtl.
   1230	*/
   1231	s2255_set_mode(vc, &mode);
   1232	return 0;
   1233}
   1234
   1235static int vidioc_g_jpegcomp(struct file *file, void *priv,
   1236			 struct v4l2_jpegcompression *jc)
   1237{
   1238	struct s2255_vc *vc = video_drvdata(file);
   1239
   1240	memset(jc, 0, sizeof(*jc));
   1241	jc->quality = vc->jpegqual;
   1242	dprintk(vc->dev, 2, "%s: quality %d\n", __func__, jc->quality);
   1243	return 0;
   1244}
   1245
   1246static int vidioc_s_jpegcomp(struct file *file, void *priv,
   1247			 const struct v4l2_jpegcompression *jc)
   1248{
   1249	struct s2255_vc *vc = video_drvdata(file);
   1250
   1251	if (jc->quality < 0 || jc->quality > 100)
   1252		return -EINVAL;
   1253	v4l2_ctrl_s_ctrl(vc->jpegqual_ctrl, jc->quality);
   1254	dprintk(vc->dev, 2, "%s: quality %d\n", __func__, jc->quality);
   1255	return 0;
   1256}
   1257
   1258static int vidioc_g_parm(struct file *file, void *priv,
   1259			 struct v4l2_streamparm *sp)
   1260{
   1261	__u32 def_num, def_dem;
   1262	struct s2255_vc *vc = video_drvdata(file);
   1263
   1264	if (sp->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
   1265		return -EINVAL;
   1266	sp->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
   1267	sp->parm.capture.capturemode = vc->cap_parm.capturemode;
   1268	sp->parm.capture.readbuffers = S2255_MIN_BUFS;
   1269	def_num = (vc->mode.format == FORMAT_NTSC) ? 1001 : 1000;
   1270	def_dem = (vc->mode.format == FORMAT_NTSC) ? 30000 : 25000;
   1271	sp->parm.capture.timeperframe.denominator = def_dem;
   1272	switch (vc->mode.fdec) {
   1273	default:
   1274	case FDEC_1:
   1275		sp->parm.capture.timeperframe.numerator = def_num;
   1276		break;
   1277	case FDEC_2:
   1278		sp->parm.capture.timeperframe.numerator = def_num * 2;
   1279		break;
   1280	case FDEC_3:
   1281		sp->parm.capture.timeperframe.numerator = def_num * 3;
   1282		break;
   1283	case FDEC_5:
   1284		sp->parm.capture.timeperframe.numerator = def_num * 5;
   1285		break;
   1286	}
   1287	dprintk(vc->dev, 4, "%s capture mode, %d timeperframe %d/%d\n",
   1288		__func__,
   1289		sp->parm.capture.capturemode,
   1290		sp->parm.capture.timeperframe.numerator,
   1291		sp->parm.capture.timeperframe.denominator);
   1292	return 0;
   1293}
   1294
   1295static int vidioc_s_parm(struct file *file, void *priv,
   1296			 struct v4l2_streamparm *sp)
   1297{
   1298	struct s2255_vc *vc = video_drvdata(file);
   1299	struct s2255_mode mode;
   1300	int fdec = FDEC_1;
   1301	__u32 def_num, def_dem;
   1302	if (sp->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
   1303		return -EINVAL;
   1304	mode = vc->mode;
   1305	/* high quality capture mode requires a stream restart */
   1306	if ((vc->cap_parm.capturemode != sp->parm.capture.capturemode)
   1307	    && vb2_is_streaming(&vc->vb_vidq))
   1308		return -EBUSY;
   1309	def_num = (mode.format == FORMAT_NTSC) ? 1001 : 1000;
   1310	def_dem = (mode.format == FORMAT_NTSC) ? 30000 : 25000;
   1311	if (def_dem != sp->parm.capture.timeperframe.denominator)
   1312		sp->parm.capture.timeperframe.numerator = def_num;
   1313	else if (sp->parm.capture.timeperframe.numerator <= def_num)
   1314		sp->parm.capture.timeperframe.numerator = def_num;
   1315	else if (sp->parm.capture.timeperframe.numerator <= (def_num * 2)) {
   1316		sp->parm.capture.timeperframe.numerator = def_num * 2;
   1317		fdec = FDEC_2;
   1318	} else if (sp->parm.capture.timeperframe.numerator <= (def_num * 3)) {
   1319		sp->parm.capture.timeperframe.numerator = def_num * 3;
   1320		fdec = FDEC_3;
   1321	} else {
   1322		sp->parm.capture.timeperframe.numerator = def_num * 5;
   1323		fdec = FDEC_5;
   1324	}
   1325	mode.fdec = fdec;
   1326	sp->parm.capture.timeperframe.denominator = def_dem;
   1327	sp->parm.capture.readbuffers = S2255_MIN_BUFS;
   1328	s2255_set_mode(vc, &mode);
   1329	dprintk(vc->dev, 4, "%s capture mode, %d timeperframe %d/%d, fdec %d\n",
   1330		__func__,
   1331		sp->parm.capture.capturemode,
   1332		sp->parm.capture.timeperframe.numerator,
   1333		sp->parm.capture.timeperframe.denominator, fdec);
   1334	return 0;
   1335}
   1336
   1337#define NUM_SIZE_ENUMS 3
   1338static const struct v4l2_frmsize_discrete ntsc_sizes[] = {
   1339	{ 640, 480 },
   1340	{ 640, 240 },
   1341	{ 320, 240 },
   1342};
   1343static const struct v4l2_frmsize_discrete pal_sizes[] = {
   1344	{ 704, 576 },
   1345	{ 704, 288 },
   1346	{ 352, 288 },
   1347};
   1348
   1349static int vidioc_enum_framesizes(struct file *file, void *priv,
   1350			    struct v4l2_frmsizeenum *fe)
   1351{
   1352	struct s2255_vc *vc = video_drvdata(file);
   1353	int is_ntsc = vc->std & V4L2_STD_525_60;
   1354	const struct s2255_fmt *fmt;
   1355
   1356	if (fe->index >= NUM_SIZE_ENUMS)
   1357		return -EINVAL;
   1358
   1359	fmt = format_by_fourcc(fe->pixel_format);
   1360	if (fmt == NULL)
   1361		return -EINVAL;
   1362	fe->type = V4L2_FRMSIZE_TYPE_DISCRETE;
   1363	fe->discrete = is_ntsc ?  ntsc_sizes[fe->index] : pal_sizes[fe->index];
   1364	return 0;
   1365}
   1366
   1367static int vidioc_enum_frameintervals(struct file *file, void *priv,
   1368			    struct v4l2_frmivalenum *fe)
   1369{
   1370	struct s2255_vc *vc = video_drvdata(file);
   1371	const struct s2255_fmt *fmt;
   1372	const struct v4l2_frmsize_discrete *sizes;
   1373	int is_ntsc = vc->std & V4L2_STD_525_60;
   1374#define NUM_FRAME_ENUMS 4
   1375	int frm_dec[NUM_FRAME_ENUMS] = {1, 2, 3, 5};
   1376	int i;
   1377
   1378	if (fe->index >= NUM_FRAME_ENUMS)
   1379		return -EINVAL;
   1380
   1381	fmt = format_by_fourcc(fe->pixel_format);
   1382	if (fmt == NULL)
   1383		return -EINVAL;
   1384
   1385	sizes = is_ntsc ? ntsc_sizes : pal_sizes;
   1386	for (i = 0; i < NUM_SIZE_ENUMS; i++, sizes++)
   1387		if (fe->width == sizes->width &&
   1388		    fe->height == sizes->height)
   1389			break;
   1390	if (i == NUM_SIZE_ENUMS)
   1391		return -EINVAL;
   1392
   1393	fe->type = V4L2_FRMIVAL_TYPE_DISCRETE;
   1394	fe->discrete.denominator = is_ntsc ? 30000 : 25000;
   1395	fe->discrete.numerator = (is_ntsc ? 1001 : 1000) * frm_dec[fe->index];
   1396	dprintk(vc->dev, 4, "%s discrete %d/%d\n", __func__,
   1397		fe->discrete.numerator,
   1398		fe->discrete.denominator);
   1399	return 0;
   1400}
   1401
   1402static int s2255_open(struct file *file)
   1403{
   1404	struct s2255_vc *vc = video_drvdata(file);
   1405	struct s2255_dev *dev = vc->dev;
   1406	int state;
   1407	int rc = 0;
   1408
   1409	rc = v4l2_fh_open(file);
   1410	if (rc != 0)
   1411		return rc;
   1412
   1413	dprintk(dev, 1, "s2255: %s\n", __func__);
   1414	state = atomic_read(&dev->fw_data->fw_state);
   1415	switch (state) {
   1416	case S2255_FW_DISCONNECTING:
   1417		return -ENODEV;
   1418	case S2255_FW_FAILED:
   1419		s2255_dev_err(&dev->udev->dev,
   1420			"firmware load failed. retrying.\n");
   1421		s2255_fwload_start(dev);
   1422		wait_event_timeout(dev->fw_data->wait_fw,
   1423				   ((atomic_read(&dev->fw_data->fw_state)
   1424				     == S2255_FW_SUCCESS) ||
   1425				    (atomic_read(&dev->fw_data->fw_state)
   1426				     == S2255_FW_DISCONNECTING)),
   1427				   msecs_to_jiffies(S2255_LOAD_TIMEOUT));
   1428		/* state may have changed, re-read */
   1429		state = atomic_read(&dev->fw_data->fw_state);
   1430		break;
   1431	case S2255_FW_NOTLOADED:
   1432	case S2255_FW_LOADED_DSPWAIT:
   1433		/* give S2255_LOAD_TIMEOUT time for firmware to load in case
   1434		   driver loaded and then device immediately opened */
   1435		pr_info("%s waiting for firmware load\n", __func__);
   1436		wait_event_timeout(dev->fw_data->wait_fw,
   1437				   ((atomic_read(&dev->fw_data->fw_state)
   1438				     == S2255_FW_SUCCESS) ||
   1439				    (atomic_read(&dev->fw_data->fw_state)
   1440				     == S2255_FW_DISCONNECTING)),
   1441				   msecs_to_jiffies(S2255_LOAD_TIMEOUT));
   1442		/* state may have changed, re-read */
   1443		state = atomic_read(&dev->fw_data->fw_state);
   1444		break;
   1445	case S2255_FW_SUCCESS:
   1446	default:
   1447		break;
   1448	}
   1449	/* state may have changed in above switch statement */
   1450	switch (state) {
   1451	case S2255_FW_SUCCESS:
   1452		break;
   1453	case S2255_FW_FAILED:
   1454		pr_info("2255 firmware load failed.\n");
   1455		return -ENODEV;
   1456	case S2255_FW_DISCONNECTING:
   1457		pr_info("%s: disconnecting\n", __func__);
   1458		return -ENODEV;
   1459	case S2255_FW_LOADED_DSPWAIT:
   1460	case S2255_FW_NOTLOADED:
   1461		pr_info("%s: firmware not loaded, please retry\n",
   1462			__func__);
   1463		/*
   1464		 * Timeout on firmware load means device unusable.
   1465		 * Set firmware failure state.
   1466		 * On next s2255_open the firmware will be reloaded.
   1467		 */
   1468		atomic_set(&dev->fw_data->fw_state,
   1469			   S2255_FW_FAILED);
   1470		return -EAGAIN;
   1471	default:
   1472		pr_info("%s: unknown state\n", __func__);
   1473		return -EFAULT;
   1474	}
   1475	if (!vc->configured) {
   1476		/* configure channel to default state */
   1477		vc->fmt = &formats[0];
   1478		s2255_set_mode(vc, &vc->mode);
   1479		vc->configured = 1;
   1480	}
   1481	return 0;
   1482}
   1483
   1484static void s2255_destroy(struct s2255_dev *dev)
   1485{
   1486	dprintk(dev, 1, "%s", __func__);
   1487	/* board shutdown stops the read pipe if it is running */
   1488	s2255_board_shutdown(dev);
   1489	/* make sure firmware still not trying to load */
   1490	del_timer_sync(&dev->timer);  /* only started in .probe and .open */
   1491	if (dev->fw_data->fw_urb) {
   1492		usb_kill_urb(dev->fw_data->fw_urb);
   1493		usb_free_urb(dev->fw_data->fw_urb);
   1494		dev->fw_data->fw_urb = NULL;
   1495	}
   1496	release_firmware(dev->fw_data->fw);
   1497	kfree(dev->fw_data->pfw_data);
   1498	kfree(dev->fw_data);
   1499	/* reset the DSP so firmware can be reloaded next time */
   1500	s2255_reset_dsppower(dev);
   1501	mutex_destroy(&dev->lock);
   1502	usb_put_dev(dev->udev);
   1503	v4l2_device_unregister(&dev->v4l2_dev);
   1504	kfree(dev->cmdbuf);
   1505	kfree(dev);
   1506}
   1507
   1508static const struct v4l2_file_operations s2255_fops_v4l = {
   1509	.owner = THIS_MODULE,
   1510	.open = s2255_open,
   1511	.release = vb2_fop_release,
   1512	.poll = vb2_fop_poll,
   1513	.unlocked_ioctl = video_ioctl2,	/* V4L2 ioctl handler */
   1514	.mmap = vb2_fop_mmap,
   1515	.read = vb2_fop_read,
   1516};
   1517
   1518static const struct v4l2_ioctl_ops s2255_ioctl_ops = {
   1519	.vidioc_querycap = vidioc_querycap,
   1520	.vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
   1521	.vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
   1522	.vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
   1523	.vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
   1524	.vidioc_reqbufs = vb2_ioctl_reqbufs,
   1525	.vidioc_querybuf = vb2_ioctl_querybuf,
   1526	.vidioc_qbuf = vb2_ioctl_qbuf,
   1527	.vidioc_dqbuf = vb2_ioctl_dqbuf,
   1528	.vidioc_s_std = vidioc_s_std,
   1529	.vidioc_g_std = vidioc_g_std,
   1530	.vidioc_enum_input = vidioc_enum_input,
   1531	.vidioc_g_input = vidioc_g_input,
   1532	.vidioc_s_input = vidioc_s_input,
   1533	.vidioc_streamon = vb2_ioctl_streamon,
   1534	.vidioc_streamoff = vb2_ioctl_streamoff,
   1535	.vidioc_s_jpegcomp = vidioc_s_jpegcomp,
   1536	.vidioc_g_jpegcomp = vidioc_g_jpegcomp,
   1537	.vidioc_s_parm = vidioc_s_parm,
   1538	.vidioc_g_parm = vidioc_g_parm,
   1539	.vidioc_enum_framesizes = vidioc_enum_framesizes,
   1540	.vidioc_enum_frameintervals = vidioc_enum_frameintervals,
   1541	.vidioc_log_status  = v4l2_ctrl_log_status,
   1542	.vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
   1543	.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
   1544};
   1545
   1546static void s2255_video_device_release(struct video_device *vdev)
   1547{
   1548	struct s2255_dev *dev = to_s2255_dev(vdev->v4l2_dev);
   1549	struct s2255_vc *vc =
   1550		container_of(vdev, struct s2255_vc, vdev);
   1551
   1552	dprintk(dev, 4, "%s, chnls: %d\n", __func__,
   1553		atomic_read(&dev->num_channels));
   1554
   1555	v4l2_ctrl_handler_free(&vc->hdl);
   1556
   1557	if (atomic_dec_and_test(&dev->num_channels))
   1558		s2255_destroy(dev);
   1559	return;
   1560}
   1561
   1562static const struct video_device template = {
   1563	.name = "s2255v",
   1564	.fops = &s2255_fops_v4l,
   1565	.ioctl_ops = &s2255_ioctl_ops,
   1566	.release = s2255_video_device_release,
   1567	.tvnorms = S2255_NORMS,
   1568};
   1569
   1570static const struct v4l2_ctrl_ops s2255_ctrl_ops = {
   1571	.s_ctrl = s2255_s_ctrl,
   1572};
   1573
   1574static const struct v4l2_ctrl_config color_filter_ctrl = {
   1575	.ops = &s2255_ctrl_ops,
   1576	.name = "Color Filter",
   1577	.id = V4L2_CID_S2255_COLORFILTER,
   1578	.type = V4L2_CTRL_TYPE_BOOLEAN,
   1579	.max = 1,
   1580	.step = 1,
   1581	.def = 1,
   1582};
   1583
   1584static int s2255_probe_v4l(struct s2255_dev *dev)
   1585{
   1586	int ret;
   1587	int i;
   1588	int cur_nr = video_nr;
   1589	struct s2255_vc *vc;
   1590	struct vb2_queue *q;
   1591
   1592	ret = v4l2_device_register(&dev->interface->dev, &dev->v4l2_dev);
   1593	if (ret)
   1594		return ret;
   1595	/* initialize all video 4 linux */
   1596	/* register 4 video devices */
   1597	for (i = 0; i < MAX_CHANNELS; i++) {
   1598		vc = &dev->vc[i];
   1599		INIT_LIST_HEAD(&vc->buf_list);
   1600
   1601		v4l2_ctrl_handler_init(&vc->hdl, 6);
   1602		v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
   1603				V4L2_CID_BRIGHTNESS, -127, 127, 1, DEF_BRIGHT);
   1604		v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
   1605				V4L2_CID_CONTRAST, 0, 255, 1, DEF_CONTRAST);
   1606		v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
   1607				V4L2_CID_SATURATION, 0, 255, 1, DEF_SATURATION);
   1608		v4l2_ctrl_new_std(&vc->hdl, &s2255_ctrl_ops,
   1609				V4L2_CID_HUE, 0, 255, 1, DEF_HUE);
   1610		vc->jpegqual_ctrl = v4l2_ctrl_new_std(&vc->hdl,
   1611				&s2255_ctrl_ops,
   1612				V4L2_CID_JPEG_COMPRESSION_QUALITY,
   1613				0, 100, 1, S2255_DEF_JPEG_QUAL);
   1614		if (dev->dsp_fw_ver >= S2255_MIN_DSP_COLORFILTER &&
   1615		    (dev->pid != 0x2257 || vc->idx <= 1))
   1616			v4l2_ctrl_new_custom(&vc->hdl, &color_filter_ctrl,
   1617					     NULL);
   1618		if (vc->hdl.error) {
   1619			ret = vc->hdl.error;
   1620			v4l2_ctrl_handler_free(&vc->hdl);
   1621			dev_err(&dev->udev->dev, "couldn't register control\n");
   1622			break;
   1623		}
   1624		q = &vc->vb_vidq;
   1625		q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
   1626		q->io_modes = VB2_MMAP | VB2_READ | VB2_USERPTR;
   1627		q->drv_priv = vc;
   1628		q->lock = &vc->vb_lock;
   1629		q->buf_struct_size = sizeof(struct s2255_buffer);
   1630		q->mem_ops = &vb2_vmalloc_memops;
   1631		q->ops = &s2255_video_qops;
   1632		q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
   1633		ret = vb2_queue_init(q);
   1634		if (ret != 0) {
   1635			dev_err(&dev->udev->dev,
   1636				"%s vb2_queue_init 0x%x\n", __func__, ret);
   1637			break;
   1638		}
   1639		/* register video devices */
   1640		vc->vdev = template;
   1641		vc->vdev.queue = q;
   1642		vc->vdev.ctrl_handler = &vc->hdl;
   1643		vc->vdev.lock = &dev->lock;
   1644		vc->vdev.v4l2_dev = &dev->v4l2_dev;
   1645		vc->vdev.device_caps = V4L2_CAP_VIDEO_CAPTURE |
   1646				       V4L2_CAP_STREAMING | V4L2_CAP_READWRITE;
   1647		video_set_drvdata(&vc->vdev, vc);
   1648		if (video_nr == -1)
   1649			ret = video_register_device(&vc->vdev,
   1650						    VFL_TYPE_VIDEO,
   1651						    video_nr);
   1652		else
   1653			ret = video_register_device(&vc->vdev,
   1654						    VFL_TYPE_VIDEO,
   1655						    cur_nr + i);
   1656
   1657		if (ret) {
   1658			dev_err(&dev->udev->dev,
   1659				"failed to register video device!\n");
   1660			break;
   1661		}
   1662		atomic_inc(&dev->num_channels);
   1663		v4l2_info(&dev->v4l2_dev, "V4L2 device registered as %s\n",
   1664			  video_device_node_name(&vc->vdev));
   1665
   1666	}
   1667	pr_info("Sensoray 2255 V4L driver Revision: %s\n",
   1668		S2255_VERSION);
   1669	/* if no channels registered, return error and probe will fail*/
   1670	if (atomic_read(&dev->num_channels) == 0) {
   1671		v4l2_device_unregister(&dev->v4l2_dev);
   1672		return ret;
   1673	}
   1674	if (atomic_read(&dev->num_channels) != MAX_CHANNELS)
   1675		pr_warn("s2255: Not all channels available.\n");
   1676	return 0;
   1677}
   1678
   1679/* this function moves the usb stream read pipe data
   1680 * into the system buffers.
   1681 * returns 0 on success, EAGAIN if more data to process( call this
   1682 * function again).
   1683 *
   1684 * Received frame structure:
   1685 * bytes 0-3:  marker : 0x2255DA4AL (S2255_MARKER_FRAME)
   1686 * bytes 4-7:  channel: 0-3
   1687 * bytes 8-11: payload size:  size of the frame
   1688 * bytes 12-payloadsize+12:  frame data
   1689 */
   1690static int save_frame(struct s2255_dev *dev, struct s2255_pipeinfo *pipe_info)
   1691{
   1692	char *pdest;
   1693	u32 offset = 0;
   1694	int bframe = 0;
   1695	char *psrc;
   1696	unsigned long copy_size;
   1697	unsigned long size;
   1698	s32 idx = -1;
   1699	struct s2255_framei *frm;
   1700	unsigned char *pdata;
   1701	struct s2255_vc *vc;
   1702	dprintk(dev, 100, "buffer to user\n");
   1703	vc = &dev->vc[dev->cc];
   1704	idx = vc->cur_frame;
   1705	frm = &vc->buffer.frame[idx];
   1706	if (frm->ulState == S2255_READ_IDLE) {
   1707		int jj;
   1708		unsigned int cc;
   1709		__le32 *pdword; /*data from dsp is little endian */
   1710		int payload;
   1711		/* search for marker codes */
   1712		pdata = (unsigned char *)pipe_info->transfer_buffer;
   1713		pdword = (__le32 *)pdata;
   1714		for (jj = 0; jj < (pipe_info->cur_transfer_size - 12); jj++) {
   1715			switch (*pdword) {
   1716			case S2255_MARKER_FRAME:
   1717				dprintk(dev, 4, "marker @ offset: %d [%x %x]\n",
   1718					jj, pdata[0], pdata[1]);
   1719				offset = jj + PREFIX_SIZE;
   1720				bframe = 1;
   1721				cc = le32_to_cpu(pdword[1]);
   1722				if (cc >= MAX_CHANNELS) {
   1723					dprintk(dev, 0,
   1724						"bad channel\n");
   1725					return -EINVAL;
   1726				}
   1727				/* reverse it */
   1728				dev->cc = G_chnmap[cc];
   1729				vc = &dev->vc[dev->cc];
   1730				payload =  le32_to_cpu(pdword[3]);
   1731				if (payload > vc->req_image_size) {
   1732					vc->bad_payload++;
   1733					/* discard the bad frame */
   1734					return -EINVAL;
   1735				}
   1736				vc->pkt_size = payload;
   1737				vc->jpg_size = le32_to_cpu(pdword[4]);
   1738				break;
   1739			case S2255_MARKER_RESPONSE:
   1740
   1741				pdata += DEF_USB_BLOCK;
   1742				jj += DEF_USB_BLOCK;
   1743				if (le32_to_cpu(pdword[1]) >= MAX_CHANNELS)
   1744					break;
   1745				cc = G_chnmap[le32_to_cpu(pdword[1])];
   1746				if (cc >= MAX_CHANNELS)
   1747					break;
   1748				vc = &dev->vc[cc];
   1749				switch (pdword[2]) {
   1750				case S2255_RESPONSE_SETMODE:
   1751					/* check if channel valid */
   1752					/* set mode ready */
   1753					vc->setmode_ready = 1;
   1754					wake_up(&vc->wait_setmode);
   1755					dprintk(dev, 5, "setmode rdy %d\n", cc);
   1756					break;
   1757				case S2255_RESPONSE_FW:
   1758					dev->chn_ready |= (1 << cc);
   1759					if ((dev->chn_ready & 0x0f) != 0x0f)
   1760						break;
   1761					/* all channels ready */
   1762					pr_info("s2255: fw loaded\n");
   1763					atomic_set(&dev->fw_data->fw_state,
   1764						   S2255_FW_SUCCESS);
   1765					wake_up(&dev->fw_data->wait_fw);
   1766					break;
   1767				case S2255_RESPONSE_STATUS:
   1768					vc->vidstatus = le32_to_cpu(pdword[3]);
   1769					vc->vidstatus_ready = 1;
   1770					wake_up(&vc->wait_vidstatus);
   1771					dprintk(dev, 5, "vstat %x chan %d\n",
   1772						le32_to_cpu(pdword[3]), cc);
   1773					break;
   1774				default:
   1775					pr_info("s2255 unknown resp\n");
   1776				}
   1777				pdata++;
   1778				break;
   1779			default:
   1780				pdata++;
   1781				break;
   1782			}
   1783			if (bframe)
   1784				break;
   1785		} /* for */
   1786		if (!bframe)
   1787			return -EINVAL;
   1788	}
   1789	vc = &dev->vc[dev->cc];
   1790	idx = vc->cur_frame;
   1791	frm = &vc->buffer.frame[idx];
   1792	/* search done.  now find out if should be acquiring on this channel */
   1793	if (!vb2_is_streaming(&vc->vb_vidq)) {
   1794		/* we found a frame, but this channel is turned off */
   1795		frm->ulState = S2255_READ_IDLE;
   1796		return -EINVAL;
   1797	}
   1798
   1799	if (frm->ulState == S2255_READ_IDLE) {
   1800		frm->ulState = S2255_READ_FRAME;
   1801		frm->cur_size = 0;
   1802	}
   1803
   1804	/* skip the marker 512 bytes (and offset if out of sync) */
   1805	psrc = (u8 *)pipe_info->transfer_buffer + offset;
   1806
   1807
   1808	if (frm->lpvbits == NULL) {
   1809		dprintk(dev, 1, "s2255 frame buffer == NULL.%p %p %d %d",
   1810			frm, dev, dev->cc, idx);
   1811		return -ENOMEM;
   1812	}
   1813
   1814	pdest = frm->lpvbits + frm->cur_size;
   1815
   1816	copy_size = (pipe_info->cur_transfer_size - offset);
   1817
   1818	size = vc->pkt_size - PREFIX_SIZE;
   1819
   1820	/* sanity check on pdest */
   1821	if ((copy_size + frm->cur_size) < vc->req_image_size)
   1822		memcpy(pdest, psrc, copy_size);
   1823
   1824	frm->cur_size += copy_size;
   1825	dprintk(dev, 4, "cur_size: %lu, size: %lu\n", frm->cur_size, size);
   1826
   1827	if (frm->cur_size >= size) {
   1828		dprintk(dev, 2, "******[%d]Buffer[%d]full*******\n",
   1829			dev->cc, idx);
   1830		vc->last_frame = vc->cur_frame;
   1831		vc->cur_frame++;
   1832		/* end of system frame ring buffer, start at zero */
   1833		if ((vc->cur_frame == SYS_FRAMES) ||
   1834		    (vc->cur_frame == vc->buffer.dwFrames))
   1835			vc->cur_frame = 0;
   1836		/* frame ready */
   1837		if (vb2_is_streaming(&vc->vb_vidq))
   1838			s2255_got_frame(vc, vc->jpg_size);
   1839		vc->frame_count++;
   1840		frm->ulState = S2255_READ_IDLE;
   1841		frm->cur_size = 0;
   1842
   1843	}
   1844	/* done successfully */
   1845	return 0;
   1846}
   1847
   1848static void s2255_read_video_callback(struct s2255_dev *dev,
   1849				      struct s2255_pipeinfo *pipe_info)
   1850{
   1851	int res;
   1852	dprintk(dev, 50, "callback read video\n");
   1853
   1854	if (dev->cc >= MAX_CHANNELS) {
   1855		dev->cc = 0;
   1856		dev_err(&dev->udev->dev, "invalid channel\n");
   1857		return;
   1858	}
   1859	/* otherwise copy to the system buffers */
   1860	res = save_frame(dev, pipe_info);
   1861	if (res != 0)
   1862		dprintk(dev, 4, "s2255: read callback failed\n");
   1863
   1864	dprintk(dev, 50, "callback read video done\n");
   1865	return;
   1866}
   1867
   1868static long s2255_vendor_req(struct s2255_dev *dev, unsigned char Request,
   1869			     u16 Index, u16 Value, void *TransferBuffer,
   1870			     s32 TransferBufferLength, int bOut)
   1871{
   1872	int r;
   1873	unsigned char *buf;
   1874
   1875	buf = kmalloc(TransferBufferLength, GFP_KERNEL);
   1876	if (!buf)
   1877		return -ENOMEM;
   1878
   1879	if (!bOut) {
   1880		r = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0),
   1881				    Request,
   1882				    USB_TYPE_VENDOR | USB_RECIP_DEVICE |
   1883				    USB_DIR_IN,
   1884				    Value, Index, buf,
   1885				    TransferBufferLength, USB_CTRL_SET_TIMEOUT);
   1886
   1887		if (r >= 0)
   1888			memcpy(TransferBuffer, buf, TransferBufferLength);
   1889	} else {
   1890		memcpy(buf, TransferBuffer, TransferBufferLength);
   1891		r = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
   1892				    Request, USB_TYPE_VENDOR | USB_RECIP_DEVICE,
   1893				    Value, Index, buf,
   1894				    TransferBufferLength, USB_CTRL_SET_TIMEOUT);
   1895	}
   1896	kfree(buf);
   1897	return r;
   1898}
   1899
   1900/*
   1901 * retrieve FX2 firmware version. future use.
   1902 * @param dev pointer to device extension
   1903 * @return -1 for fail, else returns firmware version as an int(16 bits)
   1904 */
   1905static int s2255_get_fx2fw(struct s2255_dev *dev)
   1906{
   1907	int fw;
   1908	int ret;
   1909	unsigned char transBuffer[64];
   1910	ret = s2255_vendor_req(dev, S2255_VR_FW, 0, 0, transBuffer, 2,
   1911			       S2255_VR_IN);
   1912	if (ret < 0)
   1913		dprintk(dev, 2, "get fw error: %x\n", ret);
   1914	fw = transBuffer[0] + (transBuffer[1] << 8);
   1915	dprintk(dev, 2, "Get FW %x %x\n", transBuffer[0], transBuffer[1]);
   1916	return fw;
   1917}
   1918
   1919/*
   1920 * Create the system ring buffer to copy frames into from the
   1921 * usb read pipe.
   1922 */
   1923static int s2255_create_sys_buffers(struct s2255_vc *vc)
   1924{
   1925	unsigned long i;
   1926	unsigned long reqsize;
   1927	vc->buffer.dwFrames = SYS_FRAMES;
   1928	/* always allocate maximum size(PAL) for system buffers */
   1929	reqsize = SYS_FRAMES_MAXSIZE;
   1930
   1931	if (reqsize > SYS_FRAMES_MAXSIZE)
   1932		reqsize = SYS_FRAMES_MAXSIZE;
   1933
   1934	for (i = 0; i < SYS_FRAMES; i++) {
   1935		/* allocate the frames */
   1936		vc->buffer.frame[i].lpvbits = vmalloc(reqsize);
   1937		vc->buffer.frame[i].size = reqsize;
   1938		if (vc->buffer.frame[i].lpvbits == NULL) {
   1939			pr_info("out of memory.  using less frames\n");
   1940			vc->buffer.dwFrames = i;
   1941			break;
   1942		}
   1943	}
   1944
   1945	/* make sure internal states are set */
   1946	for (i = 0; i < SYS_FRAMES; i++) {
   1947		vc->buffer.frame[i].ulState = 0;
   1948		vc->buffer.frame[i].cur_size = 0;
   1949	}
   1950
   1951	vc->cur_frame = 0;
   1952	vc->last_frame = -1;
   1953	return 0;
   1954}
   1955
   1956static int s2255_release_sys_buffers(struct s2255_vc *vc)
   1957{
   1958	unsigned long i;
   1959	for (i = 0; i < SYS_FRAMES; i++) {
   1960		vfree(vc->buffer.frame[i].lpvbits);
   1961		vc->buffer.frame[i].lpvbits = NULL;
   1962	}
   1963	return 0;
   1964}
   1965
   1966static int s2255_board_init(struct s2255_dev *dev)
   1967{
   1968	struct s2255_mode mode_def = DEF_MODEI_NTSC_CONT;
   1969	int fw_ver;
   1970	int j;
   1971	struct s2255_pipeinfo *pipe = &dev->pipe;
   1972	dprintk(dev, 4, "board init: %p", dev);
   1973	memset(pipe, 0, sizeof(*pipe));
   1974	pipe->dev = dev;
   1975	pipe->cur_transfer_size = S2255_USB_XFER_SIZE;
   1976	pipe->max_transfer_size = S2255_USB_XFER_SIZE;
   1977
   1978	pipe->transfer_buffer = kzalloc(pipe->max_transfer_size,
   1979					GFP_KERNEL);
   1980	if (pipe->transfer_buffer == NULL) {
   1981		dprintk(dev, 1, "out of memory!\n");
   1982		return -ENOMEM;
   1983	}
   1984	/* query the firmware */
   1985	fw_ver = s2255_get_fx2fw(dev);
   1986
   1987	pr_info("s2255: usb firmware version %d.%d\n",
   1988		(fw_ver >> 8) & 0xff,
   1989		fw_ver & 0xff);
   1990
   1991	if (fw_ver < S2255_CUR_USB_FWVER)
   1992		pr_info("s2255: newer USB firmware available\n");
   1993
   1994	for (j = 0; j < MAX_CHANNELS; j++) {
   1995		struct s2255_vc *vc = &dev->vc[j];
   1996		vc->mode = mode_def;
   1997		if (dev->pid == 0x2257 && j > 1)
   1998			vc->mode.color |= (1 << 16);
   1999		vc->jpegqual = S2255_DEF_JPEG_QUAL;
   2000		vc->width = LINE_SZ_4CIFS_NTSC;
   2001		vc->height = NUM_LINES_4CIFS_NTSC * 2;
   2002		vc->std = V4L2_STD_NTSC_M;
   2003		vc->fmt = &formats[0];
   2004		vc->mode.restart = 1;
   2005		vc->req_image_size = get_transfer_size(&mode_def);
   2006		vc->frame_count = 0;
   2007		/* create the system buffers */
   2008		s2255_create_sys_buffers(vc);
   2009	}
   2010	/* start read pipe */
   2011	s2255_start_readpipe(dev);
   2012	dprintk(dev, 1, "%s: success\n", __func__);
   2013	return 0;
   2014}
   2015
   2016static int s2255_board_shutdown(struct s2255_dev *dev)
   2017{
   2018	u32 i;
   2019	dprintk(dev, 1, "%s: dev: %p", __func__,  dev);
   2020
   2021	for (i = 0; i < MAX_CHANNELS; i++) {
   2022		if (vb2_is_streaming(&dev->vc[i].vb_vidq))
   2023			s2255_stop_acquire(&dev->vc[i]);
   2024	}
   2025	s2255_stop_readpipe(dev);
   2026	for (i = 0; i < MAX_CHANNELS; i++)
   2027		s2255_release_sys_buffers(&dev->vc[i]);
   2028	/* release transfer buffer */
   2029	kfree(dev->pipe.transfer_buffer);
   2030	return 0;
   2031}
   2032
   2033static void read_pipe_completion(struct urb *purb)
   2034{
   2035	struct s2255_pipeinfo *pipe_info;
   2036	struct s2255_dev *dev;
   2037	int status;
   2038	int pipe;
   2039	pipe_info = purb->context;
   2040	if (pipe_info == NULL) {
   2041		dev_err(&purb->dev->dev, "no context!\n");
   2042		return;
   2043	}
   2044	dev = pipe_info->dev;
   2045	if (dev == NULL) {
   2046		dev_err(&purb->dev->dev, "no context!\n");
   2047		return;
   2048	}
   2049	status = purb->status;
   2050	/* if shutting down, do not resubmit, exit immediately */
   2051	if (status == -ESHUTDOWN) {
   2052		dprintk(dev, 2, "%s: err shutdown\n", __func__);
   2053		pipe_info->err_count++;
   2054		return;
   2055	}
   2056
   2057	if (pipe_info->state == 0) {
   2058		dprintk(dev, 2, "%s: exiting USB pipe", __func__);
   2059		return;
   2060	}
   2061
   2062	if (status == 0)
   2063		s2255_read_video_callback(dev, pipe_info);
   2064	else {
   2065		pipe_info->err_count++;
   2066		dprintk(dev, 1, "%s: failed URB %d\n", __func__, status);
   2067	}
   2068
   2069	pipe = usb_rcvbulkpipe(dev->udev, dev->read_endpoint);
   2070	/* reuse urb */
   2071	usb_fill_bulk_urb(pipe_info->stream_urb, dev->udev,
   2072			  pipe,
   2073			  pipe_info->transfer_buffer,
   2074			  pipe_info->cur_transfer_size,
   2075			  read_pipe_completion, pipe_info);
   2076
   2077	if (pipe_info->state != 0) {
   2078		if (usb_submit_urb(pipe_info->stream_urb, GFP_ATOMIC))
   2079			dev_err(&dev->udev->dev, "error submitting urb\n");
   2080	} else {
   2081		dprintk(dev, 2, "%s :complete state 0\n", __func__);
   2082	}
   2083	return;
   2084}
   2085
   2086static int s2255_start_readpipe(struct s2255_dev *dev)
   2087{
   2088	int pipe;
   2089	int retval;
   2090	struct s2255_pipeinfo *pipe_info = &dev->pipe;
   2091	pipe = usb_rcvbulkpipe(dev->udev, dev->read_endpoint);
   2092	dprintk(dev, 2, "%s: IN %d\n", __func__, dev->read_endpoint);
   2093	pipe_info->state = 1;
   2094	pipe_info->err_count = 0;
   2095	pipe_info->stream_urb = usb_alloc_urb(0, GFP_KERNEL);
   2096	if (!pipe_info->stream_urb)
   2097		return -ENOMEM;
   2098	/* transfer buffer allocated in board_init */
   2099	usb_fill_bulk_urb(pipe_info->stream_urb, dev->udev,
   2100			  pipe,
   2101			  pipe_info->transfer_buffer,
   2102			  pipe_info->cur_transfer_size,
   2103			  read_pipe_completion, pipe_info);
   2104	retval = usb_submit_urb(pipe_info->stream_urb, GFP_KERNEL);
   2105	if (retval) {
   2106		pr_err("s2255: start read pipe failed\n");
   2107		return retval;
   2108	}
   2109	return 0;
   2110}
   2111
   2112/* starts acquisition process */
   2113static int s2255_start_acquire(struct s2255_vc *vc)
   2114{
   2115	int res;
   2116	unsigned long chn_rev;
   2117	int j;
   2118	struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
   2119	__le32 *buffer = dev->cmdbuf;
   2120
   2121	mutex_lock(&dev->cmdlock);
   2122	chn_rev = G_chnmap[vc->idx];
   2123	vc->last_frame = -1;
   2124	vc->bad_payload = 0;
   2125	vc->cur_frame = 0;
   2126	for (j = 0; j < SYS_FRAMES; j++) {
   2127		vc->buffer.frame[j].ulState = 0;
   2128		vc->buffer.frame[j].cur_size = 0;
   2129	}
   2130
   2131	/* send the start command */
   2132	buffer[0] = IN_DATA_TOKEN;
   2133	buffer[1] = (__le32) cpu_to_le32(chn_rev);
   2134	buffer[2] = CMD_START;
   2135	res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
   2136	if (res != 0)
   2137		dev_err(&dev->udev->dev, "CMD_START error\n");
   2138
   2139	dprintk(dev, 2, "start acquire exit[%d] %d\n", vc->idx, res);
   2140	mutex_unlock(&dev->cmdlock);
   2141	return res;
   2142}
   2143
   2144static int s2255_stop_acquire(struct s2255_vc *vc)
   2145{
   2146	int res;
   2147	unsigned long chn_rev;
   2148	struct s2255_dev *dev = to_s2255_dev(vc->vdev.v4l2_dev);
   2149	__le32 *buffer = dev->cmdbuf;
   2150
   2151	mutex_lock(&dev->cmdlock);
   2152	chn_rev = G_chnmap[vc->idx];
   2153	/* send the stop command */
   2154	buffer[0] = IN_DATA_TOKEN;
   2155	buffer[1] = (__le32) cpu_to_le32(chn_rev);
   2156	buffer[2] = CMD_STOP;
   2157
   2158	res = s2255_write_config(dev->udev, (unsigned char *)buffer, 512);
   2159	if (res != 0)
   2160		dev_err(&dev->udev->dev, "CMD_STOP error\n");
   2161
   2162	dprintk(dev, 4, "%s: chn %d, res %d\n", __func__, vc->idx, res);
   2163	mutex_unlock(&dev->cmdlock);
   2164	return res;
   2165}
   2166
   2167static void s2255_stop_readpipe(struct s2255_dev *dev)
   2168{
   2169	struct s2255_pipeinfo *pipe = &dev->pipe;
   2170
   2171	pipe->state = 0;
   2172	if (pipe->stream_urb) {
   2173		/* cancel urb */
   2174		usb_kill_urb(pipe->stream_urb);
   2175		usb_free_urb(pipe->stream_urb);
   2176		pipe->stream_urb = NULL;
   2177	}
   2178	dprintk(dev, 4, "%s", __func__);
   2179	return;
   2180}
   2181
   2182static void s2255_fwload_start(struct s2255_dev *dev)
   2183{
   2184	s2255_reset_dsppower(dev);
   2185	dev->fw_data->fw_size = dev->fw_data->fw->size;
   2186	atomic_set(&dev->fw_data->fw_state, S2255_FW_NOTLOADED);
   2187	memcpy(dev->fw_data->pfw_data,
   2188	       dev->fw_data->fw->data, CHUNK_SIZE);
   2189	dev->fw_data->fw_loaded = CHUNK_SIZE;
   2190	usb_fill_bulk_urb(dev->fw_data->fw_urb, dev->udev,
   2191			  usb_sndbulkpipe(dev->udev, 2),
   2192			  dev->fw_data->pfw_data,
   2193			  CHUNK_SIZE, s2255_fwchunk_complete,
   2194			  dev->fw_data);
   2195	mod_timer(&dev->timer, jiffies + HZ);
   2196}
   2197
   2198/* standard usb probe function */
   2199static int s2255_probe(struct usb_interface *interface,
   2200		       const struct usb_device_id *id)
   2201{
   2202	struct s2255_dev *dev = NULL;
   2203	struct usb_host_interface *iface_desc;
   2204	struct usb_endpoint_descriptor *endpoint;
   2205	int i;
   2206	int retval = -ENOMEM;
   2207	__le32 *pdata;
   2208	int fw_size;
   2209
   2210	/* allocate memory for our device state and initialize it to zero */
   2211	dev = kzalloc(sizeof(struct s2255_dev), GFP_KERNEL);
   2212	if (dev == NULL) {
   2213		s2255_dev_err(&interface->dev, "out of memory\n");
   2214		return -ENOMEM;
   2215	}
   2216
   2217	dev->cmdbuf = kzalloc(S2255_CMDBUF_SIZE, GFP_KERNEL);
   2218	if (dev->cmdbuf == NULL) {
   2219		s2255_dev_err(&interface->dev, "out of memory\n");
   2220		goto errorFWDATA1;
   2221	}
   2222
   2223	atomic_set(&dev->num_channels, 0);
   2224	dev->pid = id->idProduct;
   2225	dev->fw_data = kzalloc(sizeof(struct s2255_fw), GFP_KERNEL);
   2226	if (!dev->fw_data)
   2227		goto errorFWDATA1;
   2228	mutex_init(&dev->lock);
   2229	mutex_init(&dev->cmdlock);
   2230	/* grab usb_device and save it */
   2231	dev->udev = usb_get_dev(interface_to_usbdev(interface));
   2232	if (dev->udev == NULL) {
   2233		dev_err(&interface->dev, "null usb device\n");
   2234		retval = -ENODEV;
   2235		goto errorUDEV;
   2236	}
   2237	dev_dbg(&interface->dev, "dev: %p, udev %p interface %p\n",
   2238		dev, dev->udev, interface);
   2239	dev->interface = interface;
   2240	/* set up the endpoint information  */
   2241	iface_desc = interface->cur_altsetting;
   2242	dev_dbg(&interface->dev, "num EP: %d\n",
   2243		iface_desc->desc.bNumEndpoints);
   2244	for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
   2245		endpoint = &iface_desc->endpoint[i].desc;
   2246		if (!dev->read_endpoint && usb_endpoint_is_bulk_in(endpoint)) {
   2247			/* we found the bulk in endpoint */
   2248			dev->read_endpoint = endpoint->bEndpointAddress;
   2249		}
   2250	}
   2251
   2252	if (!dev->read_endpoint) {
   2253		dev_err(&interface->dev, "Could not find bulk-in endpoint\n");
   2254		goto errorEP;
   2255	}
   2256	timer_setup(&dev->timer, s2255_timer, 0);
   2257	init_waitqueue_head(&dev->fw_data->wait_fw);
   2258	for (i = 0; i < MAX_CHANNELS; i++) {
   2259		struct s2255_vc *vc = &dev->vc[i];
   2260		vc->idx = i;
   2261		vc->dev = dev;
   2262		init_waitqueue_head(&vc->wait_setmode);
   2263		init_waitqueue_head(&vc->wait_vidstatus);
   2264		spin_lock_init(&vc->qlock);
   2265		mutex_init(&vc->vb_lock);
   2266	}
   2267
   2268	dev->fw_data->fw_urb = usb_alloc_urb(0, GFP_KERNEL);
   2269	if (!dev->fw_data->fw_urb)
   2270		goto errorFWURB;
   2271
   2272	dev->fw_data->pfw_data = kzalloc(CHUNK_SIZE, GFP_KERNEL);
   2273	if (!dev->fw_data->pfw_data) {
   2274		dev_err(&interface->dev, "out of memory!\n");
   2275		goto errorFWDATA2;
   2276	}
   2277	/* load the first chunk */
   2278	if (request_firmware(&dev->fw_data->fw,
   2279			     FIRMWARE_FILE_NAME, &dev->udev->dev)) {
   2280		dev_err(&interface->dev, "sensoray 2255 failed to get firmware\n");
   2281		goto errorREQFW;
   2282	}
   2283	/* check the firmware is valid */
   2284	fw_size = dev->fw_data->fw->size;
   2285	pdata = (__le32 *) &dev->fw_data->fw->data[fw_size - 8];
   2286
   2287	if (*pdata != S2255_FW_MARKER) {
   2288		dev_err(&interface->dev, "Firmware invalid.\n");
   2289		retval = -ENODEV;
   2290		goto errorFWMARKER;
   2291	} else {
   2292		/* make sure firmware is the latest */
   2293		__le32 *pRel;
   2294		pRel = (__le32 *) &dev->fw_data->fw->data[fw_size - 4];
   2295		pr_info("s2255 dsp fw version %x\n", le32_to_cpu(*pRel));
   2296		dev->dsp_fw_ver = le32_to_cpu(*pRel);
   2297		if (dev->dsp_fw_ver < S2255_CUR_DSP_FWVER)
   2298			pr_info("s2255: f2255usb.bin out of date.\n");
   2299		if (dev->pid == 0x2257 &&
   2300				dev->dsp_fw_ver < S2255_MIN_DSP_COLORFILTER)
   2301			pr_warn("2257 needs firmware %d or above.\n",
   2302				S2255_MIN_DSP_COLORFILTER);
   2303	}
   2304	usb_reset_device(dev->udev);
   2305	/* load 2255 board specific */
   2306	retval = s2255_board_init(dev);
   2307	if (retval)
   2308		goto errorBOARDINIT;
   2309	s2255_fwload_start(dev);
   2310	/* loads v4l specific */
   2311	retval = s2255_probe_v4l(dev);
   2312	if (retval)
   2313		goto errorBOARDINIT;
   2314	dev_info(&interface->dev, "Sensoray 2255 detected\n");
   2315	return 0;
   2316errorBOARDINIT:
   2317	s2255_board_shutdown(dev);
   2318errorFWMARKER:
   2319	release_firmware(dev->fw_data->fw);
   2320errorREQFW:
   2321	kfree(dev->fw_data->pfw_data);
   2322errorFWDATA2:
   2323	usb_free_urb(dev->fw_data->fw_urb);
   2324errorFWURB:
   2325	del_timer_sync(&dev->timer);
   2326errorEP:
   2327	usb_put_dev(dev->udev);
   2328errorUDEV:
   2329	kfree(dev->fw_data);
   2330	mutex_destroy(&dev->lock);
   2331errorFWDATA1:
   2332	kfree(dev->cmdbuf);
   2333	kfree(dev);
   2334	pr_warn("Sensoray 2255 driver load failed: 0x%x\n", retval);
   2335	return retval;
   2336}
   2337
   2338/* disconnect routine. when board is removed physically or with rmmod */
   2339static void s2255_disconnect(struct usb_interface *interface)
   2340{
   2341	struct s2255_dev *dev = to_s2255_dev(usb_get_intfdata(interface));
   2342	int i;
   2343	int channels = atomic_read(&dev->num_channels);
   2344	mutex_lock(&dev->lock);
   2345	v4l2_device_disconnect(&dev->v4l2_dev);
   2346	mutex_unlock(&dev->lock);
   2347	/*see comments in the uvc_driver.c usb disconnect function */
   2348	atomic_inc(&dev->num_channels);
   2349	/* unregister each video device. */
   2350	for (i = 0; i < channels; i++)
   2351		video_unregister_device(&dev->vc[i].vdev);
   2352	/* wake up any of our timers */
   2353	atomic_set(&dev->fw_data->fw_state, S2255_FW_DISCONNECTING);
   2354	wake_up(&dev->fw_data->wait_fw);
   2355	for (i = 0; i < MAX_CHANNELS; i++) {
   2356		dev->vc[i].setmode_ready = 1;
   2357		wake_up(&dev->vc[i].wait_setmode);
   2358		dev->vc[i].vidstatus_ready = 1;
   2359		wake_up(&dev->vc[i].wait_vidstatus);
   2360	}
   2361	if (atomic_dec_and_test(&dev->num_channels))
   2362		s2255_destroy(dev);
   2363	dev_info(&interface->dev, "%s\n", __func__);
   2364}
   2365
   2366static struct usb_driver s2255_driver = {
   2367	.name = S2255_DRIVER_NAME,
   2368	.probe = s2255_probe,
   2369	.disconnect = s2255_disconnect,
   2370	.id_table = s2255_table,
   2371};
   2372
   2373module_usb_driver(s2255_driver);
   2374
   2375MODULE_DESCRIPTION("Sensoray 2255 Video for Linux driver");
   2376MODULE_AUTHOR("Dean Anderson (Sensoray Company Inc.)");
   2377MODULE_LICENSE("GPL");
   2378MODULE_VERSION(S2255_VERSION);
   2379MODULE_FIRMWARE(FIRMWARE_FILE_NAME);