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