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