root/drivers/media/usb/s2255/s2255drv.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. to_s2255_dev
  2. norm_maxw
  3. norm_maxh
  4. norm_minw
  5. norm_minh
  6. planar422p_to_yuv_packed
  7. s2255_reset_dsppower
  8. s2255_timer
  9. s2255_fwchunk_complete
  10. s2255_got_frame
  11. format_by_fourcc
  12. s2255_fillbuff
  13. queue_setup
  14. buffer_prepare
  15. buffer_queue
  16. vidioc_querycap
  17. vidioc_enum_fmt_vid_cap
  18. vidioc_g_fmt_vid_cap
  19. vidioc_try_fmt_vid_cap
  20. vidioc_s_fmt_vid_cap
  21. s2255_write_config
  22. get_transfer_size
  23. s2255_print_cfg
  24. s2255_set_mode
  25. s2255_cmd_status
  26. start_streaming
  27. stop_streaming
  28. vidioc_s_std
  29. vidioc_g_std
  30. vidioc_enum_input
  31. vidioc_g_input
  32. vidioc_s_input
  33. s2255_s_ctrl
  34. vidioc_g_jpegcomp
  35. vidioc_s_jpegcomp
  36. vidioc_g_parm
  37. vidioc_s_parm
  38. vidioc_enum_framesizes
  39. vidioc_enum_frameintervals
  40. s2255_open
  41. s2255_destroy
  42. s2255_video_device_release
  43. s2255_probe_v4l
  44. save_frame
  45. s2255_read_video_callback
  46. s2255_vendor_req
  47. s2255_get_fx2fw
  48. s2255_create_sys_buffers
  49. s2255_release_sys_buffers
  50. s2255_board_init
  51. s2255_board_shutdown
  52. read_pipe_completion
  53. s2255_start_readpipe
  54. s2255_start_acquire
  55. s2255_stop_acquire
  56. s2255_stop_readpipe
  57. s2255_fwload_start
  58. s2255_probe
  59. s2255_disconnect

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

/* [<][>][^][v][top][bottom][index][help] */