]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 23 Oct 2008 16:59:29 +0000 (09:59 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 23 Oct 2008 16:59:29 +0000 (09:59 -0700)
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: (36 commits)
  V4L/DVB (9336): cx88: always de-alloc frontends on fault condition
  V4L/DVB (9335): videobuf: split unregister bus creating self-contained frontend de-allocator
  V4L/DVB (9334): cx88: dvb_remove debug output
  V4L/DVB (9333): cx88: Not all boards that requires cx88-mpeg has frontends
  V4L/DVB (9332): cx88: initial fix for analogue only compilation
  V4L/DVB (9331): Remove unused inode parameter from video_ioctl2
  V4L/DVB (9330): Get rid of inode parameter at v4l_compat_translate_ioctl()
  V4L/DVB (9328): ivtvfb: FB_BLANK_POWERDOWN turns off video output
  V4L/DVB (9327): v4l: use video_device.num instead of minor in video%d
  V4L/DVB (9326): ivtv: avoid green flashing when loading ivtv
  V4L/DVB (9325): ivtv: switch to unlocked_ioctl.
  V4L/DVB (9324): v4l2: add video_ioctl2_unlocked for unlocked_ioctl support.
  V4L/DVB (9323): v4l2-int-if: Add enum_framesizes and enum_frameintervals ioctls.
  V4L/DVB (9322): v4l2-int-if: Export more interfaces to modules
  V4L/DVB (9321): v4l2-int-if: Define new power state changes
  V4L/DVB (9320): v4l2: Add 10-bit RAW Bayer formats
  V4L/DVB (9319): v4l2-int-if: Add cropcap, g_crop and s_crop commands.
  V4L/DVB (9318): v4l2-int-if: Add command to get slave private data.
  V4L/DVB (9316): s5h1411: Power down s5h1411 when not in use
  V4L/DVB (9315): s5h1411: Skip reconfiguring demod modulation if already at the desired modulation
  ...

58 files changed:
drivers/media/common/saa7146_fops.c
drivers/media/common/saa7146_video.c
drivers/media/dvb/frontends/s5h1411.c
drivers/media/dvb/frontends/s5h1411.h
drivers/media/radio/dsbr100.c
drivers/media/radio/radio-mr800.c
drivers/media/video/arv.c
drivers/media/video/bt8xx/bttv-driver.c
drivers/media/video/c-qcam.c
drivers/media/video/cafe_ccic.c
drivers/media/video/cpia.c
drivers/media/video/cpia2/cpia2_v4l.c
drivers/media/video/cx18/cx18-driver.c
drivers/media/video/cx18/cx18-io.h
drivers/media/video/cx18/cx18-streams.c
drivers/media/video/cx23885/cx23885-417.c
drivers/media/video/cx23885/cx23885-video.c
drivers/media/video/cx88/cx88-blackbird.c
drivers/media/video/cx88/cx88-cards.c
drivers/media/video/cx88/cx88-dvb.c
drivers/media/video/cx88/cx88-i2c.c
drivers/media/video/cx88/cx88-mpeg.c
drivers/media/video/cx88/cx88-video.c
drivers/media/video/em28xx/em28xx-video.c
drivers/media/video/et61x251/et61x251_core.c
drivers/media/video/ivtv/ivtv-driver.c
drivers/media/video/ivtv/ivtv-i2c.c
drivers/media/video/ivtv/ivtv-ioctl.c
drivers/media/video/ivtv/ivtv-ioctl.h
drivers/media/video/ivtv/ivtv-streams.c
drivers/media/video/ivtv/ivtvfb.c
drivers/media/video/pvrusb2/pvrusb2-encoder.c
drivers/media/video/pvrusb2/pvrusb2-hdw.c
drivers/media/video/pvrusb2/pvrusb2-v4l2.c
drivers/media/video/pwc/pwc-if.c
drivers/media/video/saa7134/saa7134-core.c
drivers/media/video/saa7134/saa7134-empress.c
drivers/media/video/se401.c
drivers/media/video/sn9c102/sn9c102_core.c
drivers/media/video/stk-webcam.c
drivers/media/video/stv680.c
drivers/media/video/usbvideo/usbvideo.c
drivers/media/video/usbvideo/vicam.c
drivers/media/video/usbvision/usbvision-i2c.c
drivers/media/video/usbvision/usbvision-video.c
drivers/media/video/uvc/uvc_v4l2.c
drivers/media/video/v4l1-compat.c
drivers/media/video/v4l2-int-device.c
drivers/media/video/v4l2-ioctl.c
drivers/media/video/videobuf-dvb.c
drivers/media/video/vivi.c
drivers/media/video/w9968cf.c
drivers/media/video/zc0301/zc0301_core.c
drivers/media/video/zr364xx.c
include/linux/videodev2.h
include/media/v4l2-int-device.h
include/media/v4l2-ioctl.h
include/media/videobuf-dvb.h

index 5b34c134aa25147dc118a3cc44a3ba49365166f6..127b0526a727f15ac9bf6f570e05ac0f352c08a7 100644 (file)
@@ -545,11 +545,11 @@ int saa7146_register_device(struct video_device **vid, struct saa7146_dev* dev,
        if( VFL_TYPE_GRABBER == type ) {
                vv->video_minor = vfd->minor;
                INFO(("%s: registered device video%d [v4l2]\n",
-                       dev->name, vfd->minor & 0x1f));
+                       dev->name, vfd->num));
        } else {
                vv->vbi_minor = vfd->minor;
                INFO(("%s: registered device vbi%d [v4l2]\n",
-                       dev->name, vfd->minor & 0x1f));
+                       dev->name, vfd->num));
        }
 
        *vid = vfd;
index 99be9e5c85f78c5221a4107ff06233e70a36e242..fe0bd55977e32a1c1858597ffcbf53314eec2071 100644 (file)
@@ -834,7 +834,7 @@ static int video_end(struct saa7146_fh *fh, struct file *file)
  * copying is done already, arg is a kernel pointer.
  */
 
-int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int cmd, void *arg)
+static int __saa7146_video_do_ioctl(struct file *file, unsigned int cmd, void *arg)
 {
        struct saa7146_fh *fh  = file->private_data;
        struct saa7146_dev *dev = fh->dev;
@@ -1215,12 +1215,18 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
        }
 #endif
        default:
-               return v4l_compat_translate_ioctl(inode,file,cmd,arg,
-                                                 saa7146_video_do_ioctl);
+               return v4l_compat_translate_ioctl(file, cmd, arg,
+                                                 __saa7146_video_do_ioctl);
        }
        return 0;
 }
 
+int saa7146_video_do_ioctl(struct inode *inode, struct file *file,
+                                   unsigned int cmd, void *arg)
+{
+       return __saa7146_video_do_ioctl(file, cmd, arg);
+}
+
 /*********************************************************************************/
 /* buffer handling functions                                                  */
 
index 2febfb5a846bc0922e31d75daf779c7cb0fe5ed3..40644aacffcb218dbbee77ee8a8b80e15b2b0164 100644 (file)
@@ -38,6 +38,7 @@ struct s5h1411_state {
        struct dvb_frontend frontend;
 
        fe_modulation_t current_modulation;
+       unsigned int first_tune:1;
 
        u32 current_frequency;
        int if_freq;
@@ -62,7 +63,7 @@ static struct init_tab {
        { S5H1411_I2C_TOP_ADDR, 0x08, 0x0047, },
        { S5H1411_I2C_TOP_ADDR, 0x1c, 0x0400, },
        { S5H1411_I2C_TOP_ADDR, 0x1e, 0x0370, },
-       { S5H1411_I2C_TOP_ADDR, 0x1f, 0x342a, },
+       { S5H1411_I2C_TOP_ADDR, 0x1f, 0x342c, },
        { S5H1411_I2C_TOP_ADDR, 0x24, 0x0231, },
        { S5H1411_I2C_TOP_ADDR, 0x25, 0x1011, },
        { S5H1411_I2C_TOP_ADDR, 0x26, 0x0f07, },
@@ -100,7 +101,6 @@ static struct init_tab {
        { S5H1411_I2C_TOP_ADDR, 0x78, 0x3141, },
        { S5H1411_I2C_TOP_ADDR, 0x7a, 0x3141, },
        { S5H1411_I2C_TOP_ADDR, 0xb3, 0x8003, },
-       { S5H1411_I2C_TOP_ADDR, 0xb5, 0xafbb, },
        { S5H1411_I2C_TOP_ADDR, 0xb5, 0xa6bb, },
        { S5H1411_I2C_TOP_ADDR, 0xb6, 0x0609, },
        { S5H1411_I2C_TOP_ADDR, 0xb7, 0x2f06, },
@@ -393,7 +393,7 @@ static int s5h1411_set_if_freq(struct dvb_frontend *fe, int KHz)
 
        switch (KHz) {
        case 3250:
-               s5h1411_writereg(state, S5H1411_I2C_TOP_ADDR, 0x38, 0x10d9);
+               s5h1411_writereg(state, S5H1411_I2C_TOP_ADDR, 0x38, 0x10d5);
                s5h1411_writereg(state, S5H1411_I2C_TOP_ADDR, 0x39, 0x5342);
                s5h1411_writereg(state, S5H1411_I2C_QAM_ADDR, 0x2c, 0x10d9);
                break;
@@ -464,13 +464,25 @@ static int s5h1411_set_spectralinversion(struct dvb_frontend *fe, int inversion)
 
        if (inversion == 1)
                val |= 0x1000; /* Inverted */
-       else
-               val |= 0x0000;
 
        state->inversion = inversion;
        return s5h1411_writereg(state, S5H1411_I2C_TOP_ADDR, 0x24, val);
 }
 
+static int s5h1411_set_serialmode(struct dvb_frontend *fe, int serial)
+{
+       struct s5h1411_state *state = fe->demodulator_priv;
+       u16 val;
+
+       dprintk("%s(%d)\n", __func__, serial);
+       val = s5h1411_readreg(state, S5H1411_I2C_TOP_ADDR, 0xbd) & ~0x100;
+
+       if (serial == 1)
+               val |= 0x100;
+
+       return s5h1411_writereg(state, S5H1411_I2C_TOP_ADDR, 0xbd, val);
+}
+
 static int s5h1411_enable_modulation(struct dvb_frontend *fe,
                                     fe_modulation_t m)
 {
@@ -478,6 +490,12 @@ static int s5h1411_enable_modulation(struct dvb_frontend *fe,
 
        dprintk("%s(0x%08x)\n", __func__, m);
 
+       if ((state->first_tune == 0) && (m == state->current_modulation)) {
+               dprintk("%s() Already at desired modulation.  Skipping...\n",
+                       __func__);
+               return 0;
+       }
+
        switch (m) {
        case VSB_8:
                dprintk("%s() VSB_8\n", __func__);
@@ -502,6 +520,7 @@ static int s5h1411_enable_modulation(struct dvb_frontend *fe,
        }
 
        state->current_modulation = m;
+       state->first_tune = 0;
        s5h1411_softreset(fe);
 
        return 0;
@@ -535,7 +554,7 @@ static int s5h1411_set_gpio(struct dvb_frontend *fe, int enable)
                return s5h1411_writereg(state, S5H1411_I2C_TOP_ADDR, 0xe0, val);
 }
 
-static int s5h1411_sleep(struct dvb_frontend *fe, int enable)
+static int s5h1411_set_powerstate(struct dvb_frontend *fe, int enable)
 {
        struct s5h1411_state *state = fe->demodulator_priv;
 
@@ -551,6 +570,11 @@ static int s5h1411_sleep(struct dvb_frontend *fe, int enable)
        return 0;
 }
 
+static int s5h1411_sleep(struct dvb_frontend *fe)
+{
+       return s5h1411_set_powerstate(fe, 1);
+}
+
 static int s5h1411_register_reset(struct dvb_frontend *fe)
 {
        struct s5h1411_state *state = fe->demodulator_priv;
@@ -574,9 +598,6 @@ static int s5h1411_set_frontend(struct dvb_frontend *fe,
 
        s5h1411_enable_modulation(fe, p->u.vsb.modulation);
 
-       /* Allow the demod to settle */
-       msleep(100);
-
        if (fe->ops.tuner_ops.set_params) {
                if (fe->ops.i2c_gate_ctrl)
                        fe->ops.i2c_gate_ctrl(fe, 1);
@@ -587,6 +608,10 @@ static int s5h1411_set_frontend(struct dvb_frontend *fe,
                        fe->ops.i2c_gate_ctrl(fe, 0);
        }
 
+       /* Issue a reset to the demod so it knows to resync against the
+          newly tuned frequency */
+       s5h1411_softreset(fe);
+
        return 0;
 }
 
@@ -599,7 +624,7 @@ static int s5h1411_init(struct dvb_frontend *fe)
 
        dprintk("%s()\n", __func__);
 
-       s5h1411_sleep(fe, 0);
+       s5h1411_set_powerstate(fe, 0);
        s5h1411_register_reset(fe);
 
        for (i = 0; i < ARRAY_SIZE(init_tab); i++)
@@ -610,12 +635,17 @@ static int s5h1411_init(struct dvb_frontend *fe)
        /* The datasheet says that after initialisation, VSB is default */
        state->current_modulation = VSB_8;
 
+       /* Although the datasheet says it's in VSB, empirical evidence
+          shows problems getting lock on the first tuning request.  Make
+          sure we call enable_modulation the first time around */
+       state->first_tune = 1;
+
        if (state->config->output_mode == S5H1411_SERIAL_OUTPUT)
                /* Serial */
-               s5h1411_writereg(state, S5H1411_I2C_TOP_ADDR, 0xbd, 0x1101);
+               s5h1411_set_serialmode(fe, 1);
        else
                /* Parallel */
-               s5h1411_writereg(state, S5H1411_I2C_TOP_ADDR, 0xbd, 0x1001);
+               s5h1411_set_serialmode(fe, 0);
 
        s5h1411_set_spectralinversion(fe, state->config->inversion);
        s5h1411_set_if_freq(fe, state->config->vsb_if);
@@ -637,28 +667,29 @@ static int s5h1411_read_status(struct dvb_frontend *fe, fe_status_t *status)
 
        *status = 0;
 
-       /* Get the demodulator status */
-       reg = (s5h1411_readreg(state, S5H1411_I2C_TOP_ADDR, 0xf2) >> 15)
-               & 0x0001;
-       if (reg)
-               *status |= FE_HAS_LOCK | FE_HAS_CARRIER | FE_HAS_SIGNAL;
+       /* Register F2 bit 15 = Master Lock, removed */
 
        switch (state->current_modulation) {
        case QAM_64:
        case QAM_256:
                reg = s5h1411_readreg(state, S5H1411_I2C_TOP_ADDR, 0xf0);
-               if (reg & 0x100)
-                       *status |= FE_HAS_VITERBI;
-               if (reg & 0x10)
-                       *status |= FE_HAS_SYNC;
+               if (reg & 0x10) /* QAM FEC Lock */
+                       *status |= FE_HAS_SYNC | FE_HAS_LOCK;
+               if (reg & 0x100) /* QAM EQ Lock */
+                       *status |= FE_HAS_VITERBI | FE_HAS_CARRIER | FE_HAS_SIGNAL;
+
                break;
        case VSB_8:
-               reg = s5h1411_readreg(state, S5H1411_I2C_TOP_ADDR, 0x5e);
-               if (reg & 0x0001)
-                       *status |= FE_HAS_SYNC;
                reg = s5h1411_readreg(state, S5H1411_I2C_TOP_ADDR, 0xf2);
-               if (reg & 0x1000)
-                       *status |= FE_HAS_VITERBI;
+               if (reg & 0x1000) /* FEC Lock */
+                       *status |= FE_HAS_SYNC | FE_HAS_LOCK;
+               if (reg & 0x2000) /* EQ Lock */
+                       *status |= FE_HAS_VITERBI | FE_HAS_CARRIER | FE_HAS_SIGNAL;
+
+               reg = s5h1411_readreg(state, S5H1411_I2C_TOP_ADDR, 0x53);
+               if (reg & 0x1) /* AFC Lock */
+                       *status |= FE_HAS_SIGNAL;
+
                break;
        default:
                return -EINVAL;
@@ -863,6 +894,7 @@ static struct dvb_frontend_ops s5h1411_ops = {
        },
 
        .init                 = s5h1411_init,
+       .sleep                = s5h1411_sleep,
        .i2c_gate_ctrl        = s5h1411_i2c_gate_ctrl,
        .set_frontend         = s5h1411_set_frontend,
        .get_frontend         = s5h1411_get_frontend,
index 7d542bc00c487e9ad9c27e92d2c2f12e9e3d9642..45ec0f82989c46f29ee628318afade0853bb6f57 100644 (file)
@@ -47,7 +47,7 @@ struct s5h1411_config {
        u16 mpeg_timing;
 
        /* IF Freq for QAM and VSB in KHz */
-#define S5H1411_IF_2500  2500
+#define S5H1411_IF_3250  3250
 #define S5H1411_IF_3500  3500
 #define S5H1411_IF_4000  4000
 #define S5H1411_IF_5380  5380
index 78f56944e640f53b53e37273f436ac3490e045db..a5ca176a7b083a80ef5201d2ac57d1a3475bbbbb 100644 (file)
@@ -171,11 +171,11 @@ static int dsbr100_start(struct dsbr100_device *radio)
        if (usb_control_msg(radio->usbdev, usb_rcvctrlpipe(radio->usbdev, 0),
                        USB_REQ_GET_STATUS,
                        USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
-                       0x00, 0xC7, radio->transfer_buffer, 8, 300)<0 ||
+                       0x00, 0xC7, radio->transfer_buffer, 8, 300) < 0 ||
        usb_control_msg(radio->usbdev, usb_rcvctrlpipe(radio->usbdev, 0),
                        DSB100_ONOFF,
                        USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
-                       0x01, 0x00, radio->transfer_buffer, 8, 300)<0)
+                       0x01, 0x00, radio->transfer_buffer, 8, 300) < 0)
                return -1;
        radio->muted=0;
        return (radio->transfer_buffer)[0];
@@ -188,11 +188,11 @@ static int dsbr100_stop(struct dsbr100_device *radio)
        if (usb_control_msg(radio->usbdev, usb_rcvctrlpipe(radio->usbdev, 0),
                        USB_REQ_GET_STATUS,
                        USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
-                       0x16, 0x1C, radio->transfer_buffer, 8, 300)<0 ||
+                       0x16, 0x1C, radio->transfer_buffer, 8, 300) < 0 ||
        usb_control_msg(radio->usbdev, usb_rcvctrlpipe(radio->usbdev, 0),
                        DSB100_ONOFF,
                        USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
-                       0x00, 0x00, radio->transfer_buffer, 8, 300)<0)
+                       0x00, 0x00, radio->transfer_buffer, 8, 300) < 0)
                return -1;
        radio->muted=1;
        return (radio->transfer_buffer)[0];
@@ -201,24 +201,24 @@ static int dsbr100_stop(struct dsbr100_device *radio)
 /* set a frequency, freq is defined by v4l's TUNER_LOW, i.e. 1/16th kHz */
 static int dsbr100_setfreq(struct dsbr100_device *radio, int freq)
 {
-       freq = (freq/16*80)/1000+856;
+       freq = (freq / 16 * 80) / 1000 + 856;
        if (usb_control_msg(radio->usbdev, usb_rcvctrlpipe(radio->usbdev, 0),
                        DSB100_TUNE,
                        USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
-                       (freq>>8)&0x00ff, freq&0xff,
-                       radio->transfer_buffer, 8, 300)<0 ||
+                       (freq >> 8) & 0x00ff, freq & 0xff,
+                       radio->transfer_buffer, 8, 300) < 0 ||
           usb_control_msg(radio->usbdev, usb_rcvctrlpipe(radio->usbdev, 0),
                        USB_REQ_GET_STATUS,
                        USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
-                       0x96, 0xB7, radio->transfer_buffer, 8, 300)<0 ||
+                       0x96, 0xB7, radio->transfer_buffer, 8, 300) < 0 ||
        usb_control_msg(radio->usbdev, usb_rcvctrlpipe(radio->usbdev, 0),
                        USB_REQ_GET_STATUS,
                        USB_TYPE_VENDOR | USB_RECIP_DEVICE |  USB_DIR_IN,
-                       0x00, 0x24, radio->transfer_buffer, 8, 300)<0) {
+                       0x00, 0x24, radio->transfer_buffer, 8, 300) < 0) {
                radio->stereo = -1;
                return -1;
        }
-       radio->stereo = ! ((radio->transfer_buffer)[0]&0x01);
+       radio->stereo = !((radio->transfer_buffer)[0] & 0x01);
        return (radio->transfer_buffer)[0];
 }
 
@@ -229,10 +229,10 @@ static void dsbr100_getstat(struct dsbr100_device *radio)
        if (usb_control_msg(radio->usbdev, usb_rcvctrlpipe(radio->usbdev, 0),
                USB_REQ_GET_STATUS,
                USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
-               0x00 , 0x24, radio->transfer_buffer, 8, 300)<0)
+               0x00 , 0x24, radio->transfer_buffer, 8, 300) < 0)
                radio->stereo = -1;
        else
-               radio->stereo = ! (radio->transfer_buffer[0]&0x01);
+               radio->stereo = !(radio->transfer_buffer[0] & 0x01);
 }
 
 
@@ -265,7 +265,7 @@ static int vidioc_querycap(struct file *file, void *priv,
 {
        strlcpy(v->driver, "dsbr100", sizeof(v->driver));
        strlcpy(v->card, "D-Link R-100 USB FM Radio", sizeof(v->card));
-       sprintf(v->bus_info, "ISA");
+       sprintf(v->bus_info, "USB");
        v->version = RADIO_VERSION;
        v->capabilities = V4L2_CAP_TUNER;
        return 0;
@@ -282,9 +282,9 @@ static int vidioc_g_tuner(struct file *file, void *priv,
        dsbr100_getstat(radio);
        strcpy(v->name, "FM");
        v->type = V4L2_TUNER_RADIO;
-       v->rangelow = FREQ_MIN*FREQ_MUL;
-       v->rangehigh = FREQ_MAX*FREQ_MUL;
-       v->rxsubchans = V4L2_TUNER_SUB_MONO|V4L2_TUNER_SUB_STEREO;
+       v->rangelow = FREQ_MIN * FREQ_MUL;
+       v->rangehigh = FREQ_MAX * FREQ_MUL;
+       v->rxsubchans = V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO;
        v->capability = V4L2_TUNER_CAP_LOW;
        if(radio->stereo)
                v->audmode = V4L2_TUNER_MODE_STEREO;
@@ -309,7 +309,7 @@ static int vidioc_s_frequency(struct file *file, void *priv,
        struct dsbr100_device *radio = video_drvdata(file);
 
        radio->curfreq = f->frequency;
-       if (dsbr100_setfreq(radio, radio->curfreq)==-1)
+       if (dsbr100_setfreq(radio, radio->curfreq) == -1)
                dev_warn(&radio->usbdev->dev, "Set frequency failed\n");
        return 0;
 }
@@ -331,8 +331,7 @@ static int vidioc_queryctrl(struct file *file, void *priv,
 
        for (i = 0; i < ARRAY_SIZE(radio_qctrl); i++) {
                if (qc->id && qc->id == radio_qctrl[i].id) {
-                       memcpy(qc, &(radio_qctrl[i]),
-                                               sizeof(*qc));
+                       memcpy(qc, &(radio_qctrl[i]), sizeof(*qc));
                        return 0;
                }
        }
@@ -412,19 +411,25 @@ static int vidioc_s_audio(struct file *file, void *priv,
 static int usb_dsbr100_open(struct inode *inode, struct file *file)
 {
        struct dsbr100_device *radio = video_drvdata(file);
+       int retval;
 
        lock_kernel();
        radio->users = 1;
        radio->muted = 1;
 
-       if (dsbr100_start(radio)<0) {
+       if (dsbr100_start(radio) < 0) {
                dev_warn(&radio->usbdev->dev,
                         "Radio did not start up properly\n");
                radio->users = 0;
                unlock_kernel();
                return -EIO;
        }
-       dsbr100_setfreq(radio, radio->curfreq);
+
+       retval = dsbr100_setfreq(radio, radio->curfreq);
+
+       if (retval == -1)
+               printk(KERN_WARNING KBUILD_MODNAME ": Set frequency failed\n");
+
        unlock_kernel();
        return 0;
 }
@@ -485,13 +490,20 @@ static int usb_dsbr100_probe(struct usb_interface *intf,
 {
        struct dsbr100_device *radio;
 
-       if (!(radio = kmalloc(sizeof(struct dsbr100_device), GFP_KERNEL)))
+       radio = kmalloc(sizeof(struct dsbr100_device), GFP_KERNEL);
+
+       if (!radio)
                return -ENOMEM;
-       if (!(radio->transfer_buffer = kmalloc(TB_LEN, GFP_KERNEL))) {
+
+       radio->transfer_buffer = kmalloc(TB_LEN, GFP_KERNEL);
+
+       if (!(radio->transfer_buffer)) {
                kfree(radio);
                return -ENOMEM;
        }
-       if (!(radio->videodev = video_device_alloc())) {
+       radio->videodev = video_device_alloc();
+
+       if (!(radio->videodev)) {
                kfree(radio->transfer_buffer);
                kfree(radio);
                return -ENOMEM;
@@ -501,7 +513,7 @@ static int usb_dsbr100_probe(struct usb_interface *intf,
        radio->removed = 0;
        radio->users = 0;
        radio->usbdev = interface_to_usbdev(intf);
-       radio->curfreq = FREQ_MIN*FREQ_MUL;
+       radio->curfreq = FREQ_MIN * FREQ_MUL;
        video_set_drvdata(radio->videodev, radio);
        if (video_register_device(radio->videodev, VFL_TYPE_RADIO, radio_nr) < 0) {
                dev_warn(&intf->dev, "Could not register video device\n");
index a33717c48003c8def8a0449e9f9a582732c6a5e9..256cbeffdcb6c274a80657fab1eb23f107e0b976 100644 (file)
@@ -469,16 +469,21 @@ static int usb_amradio_open(struct inode *inode, struct file *file)
 {
        struct amradio_device *radio = video_get_drvdata(video_devdata(file));
 
+       lock_kernel();
+
        radio->users = 1;
        radio->muted = 1;
 
        if (amradio_start(radio) < 0) {
                warn("Radio did not start up properly");
                radio->users = 0;
+               unlock_kernel();
                return -EIO;
        }
        if (amradio_setfreq(radio, radio->curfreq) < 0)
                warn("Set frequency failed");
+
+       unlock_kernel();
        return 0;
 }
 
index 218754b4906a7a4fee61b7840dc4b8ed1db92ad4..e09b006932308b81e3940dd204226538ac88afbc 100644 (file)
@@ -866,7 +866,7 @@ static int __init ar_init(void)
        }
 
        printk("video%d: Found M64278 VGA (IRQ %d, Freq %dMHz).\n",
-               ar->vdev->minor, M32R_IRQ_INT3, freq);
+               ar->vdev->num, M32R_IRQ_INT3, freq);
 
        return 0;
 
index 5858bf5ff41c3da1392bb21d337d13713bf56c45..9ec4cec2e52dada612a8857a1033325f6cb5415a 100644 (file)
@@ -4246,7 +4246,7 @@ static int __devinit bttv_register_video(struct bttv *btv)
                                  video_nr[btv->c.nr]) < 0)
                goto err;
        printk(KERN_INFO "bttv%d: registered device video%d\n",
-              btv->c.nr,btv->video_dev->minor & 0x1f);
+              btv->c.nr, btv->video_dev->num);
        if (device_create_file(&btv->video_dev->dev,
                                     &dev_attr_card)<0) {
                printk(KERN_ERR "bttv%d: device_create_file 'card' "
@@ -4263,7 +4263,7 @@ static int __devinit bttv_register_video(struct bttv *btv)
                                  vbi_nr[btv->c.nr]) < 0)
                goto err;
        printk(KERN_INFO "bttv%d: registered device vbi%d\n",
-              btv->c.nr,btv->vbi_dev->minor & 0x1f);
+              btv->c.nr, btv->vbi_dev->num);
 
        if (!btv->has_radio)
                return 0;
@@ -4275,7 +4275,7 @@ static int __devinit bttv_register_video(struct bttv *btv)
                                  radio_nr[btv->c.nr]) < 0)
                goto err;
        printk(KERN_INFO "bttv%d: registered device radio%d\n",
-              btv->c.nr,btv->radio_dev->minor & 0x1f);
+              btv->c.nr, btv->radio_dev->num);
 
        /* all done */
        return 0;
index 17aa0adb346703938b650c8c8164e3789eab5f88..0f930d35146619fea78c43a0370b6fec6fdaba0f 100644 (file)
@@ -815,7 +815,7 @@ static int init_cqcam(struct parport *port)
        }
 
        printk(KERN_INFO "video%d: Colour QuickCam found on %s\n",
-              qcam->vdev.minor, qcam->pport->name);
+              qcam->vdev.num, qcam->pport->name);
 
        qcams[num_cams++] = qcam;
 
index fc9497bdd322f008c6673ada3c7468be051c3706..a8c068e1de1cb30956e227e9d14a933c0c36735d 100644 (file)
@@ -2059,10 +2059,10 @@ static void cafe_dfs_cam_setup(struct cafe_camera *cam)
 
        if (!cafe_dfs_root)
                return;
-       sprintf(fname, "regs-%d", cam->v4ldev.minor);
+       sprintf(fname, "regs-%d", cam->v4ldev.num);
        cam->dfs_regs = debugfs_create_file(fname, 0444, cafe_dfs_root,
                        cam, &cafe_dfs_reg_ops);
-       sprintf(fname, "cam-%d", cam->v4ldev.minor);
+       sprintf(fname, "cam-%d", cam->v4ldev.num);
        cam->dfs_cam_regs = debugfs_create_file(fname, 0444, cafe_dfs_root,
                        cam, &cafe_dfs_cam_ops);
 }
index 1798b779a25a10993e767a469ee860317016a992..16c094f7785294230cdb5d9e1423fbf248454aa7 100644 (file)
@@ -1347,7 +1347,7 @@ static void create_proc_cpia_cam(struct cam_data *cam)
        if (!cpia_proc_root || !cam)
                return;
 
-       snprintf(name, sizeof(name), "video%d", cam->vdev.minor);
+       snprintf(name, sizeof(name), "video%d", cam->vdev.num);
 
        ent = create_proc_entry(name, S_IFREG|S_IRUGO|S_IWUSR, cpia_proc_root);
        if (!ent)
@@ -1372,7 +1372,7 @@ static void destroy_proc_cpia_cam(struct cam_data *cam)
        if (!cam || !cam->proc_entry)
                return;
 
-       snprintf(name, sizeof(name), "video%d", cam->vdev.minor);
+       snprintf(name, sizeof(name), "video%d", cam->vdev.num);
        remove_proc_entry(name, cpia_proc_root);
        cam->proc_entry = NULL;
 }
@@ -4005,7 +4005,7 @@ void cpia_unregister_camera(struct cam_data *cam)
        }
 
 #ifdef CONFIG_PROC_FS
-       DBG("destroying /proc/cpia/video%d\n", cam->vdev.minor);
+       DBG("destroying /proc/cpia/video%d\n", cam->vdev.num);
        destroy_proc_cpia_cam(cam);
 #endif
        if (!cam->open_count) {
index 897e8d1a5c3c0a08cadc5dfa470767c90095573d..1c6bd633f1939a5493bcef8a1e20f51df863aed9 100644 (file)
@@ -1973,7 +1973,7 @@ void cpia2_unregister_camera(struct camera_data *cam)
        } else {
                LOG("/dev/video%d removed while open, "
                    "deferring video_unregister_device\n",
-                   cam->vdev->minor);
+                   cam->vdev->num);
        }
 }
 
index 085121c2b47f3844aa07e60b21f7b5e4843437b6..7a1a7830a6b3fcc49ec0b1ff86c049c816c13b38 100644 (file)
@@ -613,6 +613,7 @@ static int __devinit cx18_probe(struct pci_dev *dev,
                                const struct pci_device_id *pci_id)
 {
        int retval = 0;
+       int i;
        int vbi_buf_size;
        u32 devtype;
        struct cx18 *cx;
@@ -698,7 +699,8 @@ static int __devinit cx18_probe(struct pci_dev *dev,
 
        /* active i2c  */
        CX18_DEBUG_INFO("activating i2c...\n");
-       if (init_cx18_i2c(cx)) {
+       retval = init_cx18_i2c(cx);
+       if (retval) {
                CX18_ERR("Could not initialize i2c\n");
                goto free_map;
        }
@@ -836,8 +838,11 @@ err:
        CX18_ERR("Error %d on initialization\n", retval);
        cx18_log_statistics(cx);
 
-       kfree(cx18_cards[cx18_cards_active]);
-       cx18_cards[cx18_cards_active] = NULL;
+       i = cx->num;
+       spin_lock(&cx18_cards_lock);
+       kfree(cx18_cards[i]);
+       cx18_cards[i] = NULL;
+       spin_unlock(&cx18_cards_lock);
        return retval;
 }
 
index 197d4fbd9f9544a8bf1d530adc8a4ee57dbf90cc..287a5e8bf67b8a988c88b4bb0cdb7315c2d3b613 100644 (file)
@@ -39,7 +39,7 @@ static inline void cx18_io_delay(struct cx18 *cx)
 
 /* Statistics gathering */
 static inline
-void cx18_log_write_retries(struct cx18 *cx, int i, const void *addr)
+void cx18_log_write_retries(struct cx18 *cx, int i, const void __iomem *addr)
 {
        if (i > CX18_MAX_MMIO_RETRIES)
                i = CX18_MAX_MMIO_RETRIES;
@@ -48,7 +48,7 @@ void cx18_log_write_retries(struct cx18 *cx, int i, const void *addr)
 }
 
 static inline
-void cx18_log_read_retries(struct cx18 *cx, int i, const void *addr)
+void cx18_log_read_retries(struct cx18 *cx, int i, const void __iomem *addr)
 {
        if (i > CX18_MAX_MMIO_RETRIES)
                i = CX18_MAX_MMIO_RETRIES;
index 0c8e7542cf6044ec86fbe8e0c6eb8931240c8e25..e5ff7705b7a134c8495566b264c1621b65071f32 100644 (file)
@@ -200,16 +200,18 @@ static int cx18_prep_dev(struct cx18 *cx, int type)
 /* Initialize v4l2 variables and register v4l2 devices */
 int cx18_streams_setup(struct cx18 *cx)
 {
-       int type;
+       int type, ret;
 
        /* Setup V4L2 Devices */
        for (type = 0; type < CX18_MAX_STREAMS; type++) {
                /* Prepare device */
-               if (cx18_prep_dev(cx, type))
+               ret = cx18_prep_dev(cx, type);
+               if (ret < 0)
                        break;
 
                /* Allocate Stream */
-               if (cx18_stream_alloc(&cx->streams[type]))
+               ret = cx18_stream_alloc(&cx->streams[type]);
+               if (ret < 0)
                        break;
        }
        if (type == CX18_MAX_STREAMS)
@@ -217,14 +219,14 @@ int cx18_streams_setup(struct cx18 *cx)
 
        /* One or more streams could not be initialized. Clean 'em all up. */
        cx18_streams_cleanup(cx, 0);
-       return -ENOMEM;
+       return ret;
 }
 
 static int cx18_reg_dev(struct cx18 *cx, int type)
 {
        struct cx18_stream *s = &cx->streams[type];
        int vfl_type = cx18_stream_info[type].vfl_type;
-       int num;
+       int num, ret;
 
        /* TODO: Shouldn't this be a VFL_TYPE_TRANSPORT or something?
         * We need a VFL_TYPE_TS defined.
@@ -233,9 +235,10 @@ static int cx18_reg_dev(struct cx18 *cx, int type)
                /* just return if no DVB is supported */
                if ((cx->card->hw_all & CX18_HW_DVB) == 0)
                        return 0;
-               if (cx18_dvb_register(s) < 0) {
+               ret = cx18_dvb_register(s);
+               if (ret < 0) {
                        CX18_ERR("DVB failed to register\n");
-                       return -EINVAL;
+                       return ret;
                }
        }
 
@@ -252,12 +255,13 @@ static int cx18_reg_dev(struct cx18 *cx, int type)
        }
 
        /* Register device. First try the desired minor, then any free one. */
-       if (video_register_device(s->v4l2dev, vfl_type, num)) {
+       ret = video_register_device(s->v4l2dev, vfl_type, num);
+       if (ret < 0) {
                CX18_ERR("Couldn't register v4l2 device for %s kernel number %d\n",
                        s->name, num);
                video_device_release(s->v4l2dev);
                s->v4l2dev = NULL;
-               return -ENOMEM;
+               return ret;
        }
        num = s->v4l2dev->num;
 
@@ -290,18 +294,22 @@ static int cx18_reg_dev(struct cx18 *cx, int type)
 int cx18_streams_register(struct cx18 *cx)
 {
        int type;
-       int err = 0;
+       int err;
+       int ret = 0;
 
        /* Register V4L2 devices */
-       for (type = 0; type < CX18_MAX_STREAMS; type++)
-               err |= cx18_reg_dev(cx, type);
+       for (type = 0; type < CX18_MAX_STREAMS; type++) {
+               err = cx18_reg_dev(cx, type);
+               if (err && ret == 0)
+                       ret = err;
+       }
 
-       if (err == 0)
+       if (ret == 0)
                return 0;
 
        /* One or more streams could not be initialized. Clean 'em all up. */
        cx18_streams_cleanup(cx, 1);
-       return -ENOMEM;
+       return ret;
 }
 
 /* Unregister v4l2 devices */
index 395c11fa47ceb486206eaf37f44145644762bc31..00831f3ef8f59b7f821d2281737987add37b74aa 100644 (file)
@@ -1815,7 +1815,7 @@ int cx23885_417_register(struct cx23885_dev *dev)
        cx23885_mc417_init(dev);
 
        printk(KERN_INFO "%s: registered device video%d [mpeg]\n",
-              dev->name, dev->v4l_device->minor & 0x1f);
+              dev->name, dev->v4l_device->num);
 
        return 0;
 }
index ab3110d6046ca08ac7fd2488da02fcaa19396bd2..c742a10be5cb2f9a94972b5f20d9eeb5ad355063 100644 (file)
@@ -1543,7 +1543,7 @@ int cx23885_video_register(struct cx23885_dev *dev)
                goto fail_unreg;
        }
        printk(KERN_INFO "%s/0: registered device video%d [v4l2]\n",
-              dev->name, dev->video_dev->minor & 0x1f);
+              dev->name, dev->video_dev->num);
        /* initial device configuration */
        mutex_lock(&dev->lock);
        cx23885_set_tvnorm(dev, dev->tvnorm);
index e71369754305cdfe21cab45990120115079aafa7..078be63195568433e9d673e6becd886415ce21b4 100644 (file)
@@ -1285,7 +1285,7 @@ static int blackbird_register_video(struct cx8802_dev *dev)
                return err;
        }
        printk(KERN_INFO "%s/2: registered device video%d [mpeg]\n",
-              dev->core->name,dev->mpeg_dev->minor & 0x1f);
+              dev->core->name, dev->mpeg_dev->num);
        return 0;
 }
 
index fbc224f46e0eb15ea596e7759cc05a39390f71b9..5bcbb4cc7c2a53e0656d56be53441ad085fb0874 100644 (file)
@@ -3044,8 +3044,8 @@ struct cx88_core *cx88_core_create(struct pci_dev *pci, int nr)
 
        memcpy(&core->board, &cx88_boards[core->boardnr], sizeof(core->board));
 
-       if (!core->board.num_frontends)
-               core->board.num_frontends=1;
+       if (!core->board.num_frontends && (core->board.mpeg & CX88_MPEG_DVB))
+               core->board.num_frontends = 1;
 
        info_printk(core, "subsystem: %04x:%04x, board: %s [card=%d,%s], frontend(s): %d\n",
                pci->subsystem_vendor, pci->subsystem_device, core->board.name,
index 6968ab0181aa6a6ee96672c7e856829c3135b697..cf6c30d4e545e5dcc6d7c02013738b51544a0b9a 100644 (file)
@@ -789,7 +789,7 @@ static int dvb_register(struct cx8802_dev *dev)
                if (fe0->dvb.frontend)
                        fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
                if (attach_xc3028(0x61, dev) < 0)
-                       return -EINVAL;
+                       goto frontend_detach;
                break;
        case CX88_BOARD_PCHDTV_HD3000:
                fe0->dvb.frontend = dvb_attach(or51132_attach, &pchdtv_hd3000,
@@ -1058,7 +1058,6 @@ static int dvb_register(struct cx8802_dev *dev)
                                        goto frontend_detach;
                                core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;
                                fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
-
                        }
                }
                break;
@@ -1110,10 +1109,7 @@ static int dvb_register(struct cx8802_dev *dev)
                &dev->pci->dev, adapter_nr, mfe_shared);
 
 frontend_detach:
-       if (fe0->dvb.frontend) {
-               dvb_frontend_detach(fe0->dvb.frontend);
-               fe0->dvb.frontend = NULL;
-       }
+       videobuf_dvb_dealloc_frontends(&dev->frontends);
        return -EINVAL;
 }
 
@@ -1246,8 +1242,11 @@ fail_core:
 
 static int cx8802_dvb_remove(struct cx8802_driver *drv)
 {
+       struct cx88_core *core = drv->core;
        struct cx8802_dev *dev = drv->core->dvbdev;
 
+       dprintk( 1, "%s\n", __func__);
+
        videobuf_dvb_unregister_bus(&dev->frontends);
 
        vp3054_i2c_remove(dev);
index 01de23007095f5d7d1de4b8371df34f26b9d0795..1ab691d2069268dc6d2db42ac0b304eef1f69288 100644 (file)
@@ -116,8 +116,10 @@ static int detach_inform(struct i2c_client *client)
 
 void cx88_call_i2c_clients(struct cx88_core *core, unsigned int cmd, void *arg)
 {
+#if defined(CONFIG_VIDEO_CX88_DVB) || defined(CONFIG_VIDEO_CX88_DVB_MODULE)
        struct videobuf_dvb_frontends *f = &core->dvbdev->frontends;
        struct videobuf_dvb_frontend *fe = NULL;
+#endif
        if (0 != core->i2c_rc)
                return;
 
index 6df5cf31418627025e16752fdecbab998040a7ed..a1c435b4b1cd3901f93022d6ecf25f65d16486f8 100644 (file)
@@ -768,8 +768,11 @@ static int __devinit cx8802_probe(struct pci_dev *pci_dev,
 {
        struct cx8802_dev *dev;
        struct cx88_core  *core;
+       int err;
+#if defined(CONFIG_VIDEO_CX88_DVB) || defined(CONFIG_VIDEO_CX88_DVB_MODULE)
        struct videobuf_dvb_frontend *demod;
-       int err,i;
+       int i;
+#endif
 
        /* general setup */
        core = cx88_core_get(pci_dev);
@@ -782,11 +785,6 @@ static int __devinit cx8802_probe(struct pci_dev *pci_dev,
        if (!core->board.mpeg)
                goto fail_core;
 
-       if (!core->board.num_frontends) {
-               printk(KERN_ERR "%s() .num_frontends should be non-zero, err = %d\n", __func__, err);
-               goto fail_core;
-       }
-
        err = -ENOMEM;
        dev = kzalloc(sizeof(*dev),GFP_KERNEL);
        if (NULL == dev)
@@ -801,10 +799,12 @@ static int __devinit cx8802_probe(struct pci_dev *pci_dev,
        INIT_LIST_HEAD(&dev->drvlist);
        list_add_tail(&dev->devlist,&cx8802_devlist);
 
+#if defined(CONFIG_VIDEO_CX88_DVB) || defined(CONFIG_VIDEO_CX88_DVB_MODULE)
        mutex_init(&dev->frontends.lock);
        INIT_LIST_HEAD(&dev->frontends.felist);
 
-       printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__, core->board.num_frontends);
+       if (core->board.num_frontends)
+               printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__, core->board.num_frontends);
 
        for (i = 1; i <= core->board.num_frontends; i++) {
                demod = videobuf_dvb_alloc_frontend(&dev->frontends, i);
@@ -814,6 +814,7 @@ static int __devinit cx8802_probe(struct pci_dev *pci_dev,
                        goto fail_free;
                }
        }
+#endif
 
        /* Maintain a reference so cx88-video can query the 8802 device. */
        core->dvbdev = dev;
index 3904b73f52ee2879ebc6058770d8692a80a57700..61265fd04d5603edb4198b7e4e46f3980a222b90 100644 (file)
@@ -1911,7 +1911,7 @@ static int __devinit cx8800_initdev(struct pci_dev *pci_dev,
                goto fail_unreg;
        }
        printk(KERN_INFO "%s/0: registered device video%d [v4l2]\n",
-              core->name,dev->video_dev->minor & 0x1f);
+              core->name, dev->video_dev->num);
 
        dev->vbi_dev = cx88_vdev_init(core,dev->pci,&cx8800_vbi_template,"vbi");
        err = video_register_device(dev->vbi_dev,VFL_TYPE_VBI,
@@ -1922,7 +1922,7 @@ static int __devinit cx8800_initdev(struct pci_dev *pci_dev,
                goto fail_unreg;
        }
        printk(KERN_INFO "%s/0: registered device vbi%d\n",
-              core->name,dev->vbi_dev->minor & 0x1f);
+              core->name, dev->vbi_dev->num);
 
        if (core->board.radio.type == CX88_RADIO) {
                dev->radio_dev = cx88_vdev_init(core,dev->pci,
@@ -1935,7 +1935,7 @@ static int __devinit cx8800_initdev(struct pci_dev *pci_dev,
                        goto fail_unreg;
                }
                printk(KERN_INFO "%s/0: registered device radio%d\n",
-                      core->name,dev->radio_dev->minor & 0x1f);
+                      core->name, dev->radio_dev->num);
        }
 
        /* everything worked */
index c53649e5315b0a815cd09633578dfcea263b41cd..a1ab2ef45578d491ea9951ef1ddfe933b85294fb 100644 (file)
@@ -2042,7 +2042,7 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
                        goto fail_unreg;
                }
                em28xx_info("Registered radio device as /dev/radio%d\n",
-                           dev->radio_dev->minor & 0x1f);
+                           dev->radio_dev->num);
        }
 
        /* init video dma queues */
index 7a85c41b0eea3b592ccc7554707421a40d70aaa3..9d0ef96c23ff47c6147059ee9b3a2b28b5986067 100644 (file)
@@ -588,7 +588,7 @@ static int et61x251_stream_interrupt(struct et61x251_device* cam)
                cam->state |= DEV_MISCONFIGURED;
                DBG(1, "URB timeout reached. The camera is misconfigured. To "
                       "use it, close and open /dev/video%d again.",
-                   cam->v4ldev->minor);
+                   cam->v4ldev->num);
                return -EIO;
        }
 
@@ -1195,7 +1195,7 @@ static void et61x251_release_resources(struct kref *kref)
 
        cam = container_of(kref, struct et61x251_device, kref);
 
-       DBG(2, "V4L2 device /dev/video%d deregistered", cam->v4ldev->minor);
+       DBG(2, "V4L2 device /dev/video%d deregistered", cam->v4ldev->num);
        video_set_drvdata(cam->v4ldev, NULL);
        video_unregister_device(cam->v4ldev);
        usb_put_dev(cam->usbdev);
@@ -1237,7 +1237,7 @@ static int et61x251_open(struct inode* inode, struct file* filp)
 
        if (cam->users) {
                DBG(2, "Device /dev/video%d is already in use",
-                      cam->v4ldev->minor);
+                      cam->v4ldev->num);
                DBG(3, "Simultaneous opens are not supported");
                if ((filp->f_flags & O_NONBLOCK) ||
                    (filp->f_flags & O_NDELAY)) {
@@ -1280,7 +1280,7 @@ static int et61x251_open(struct inode* inode, struct file* filp)
        cam->frame_count = 0;
        et61x251_empty_framequeues(cam);
 
-       DBG(3, "Video device /dev/video%d is open", cam->v4ldev->minor);
+       DBG(3, "Video device /dev/video%d is open", cam->v4ldev->num);
 
 out:
        mutex_unlock(&cam->open_mutex);
@@ -1304,7 +1304,7 @@ static int et61x251_release(struct inode* inode, struct file* filp)
        cam->users--;
        wake_up_interruptible_nr(&cam->wait_open, 1);
 
-       DBG(3, "Video device /dev/video%d closed", cam->v4ldev->minor);
+       DBG(3, "Video device /dev/video%d closed", cam->v4ldev->num);
 
        kref_put(&cam->kref, et61x251_release_resources);
 
@@ -1845,7 +1845,7 @@ et61x251_vidioc_s_crop(struct et61x251_device* cam, void __user * arg)
                cam->state |= DEV_MISCONFIGURED;
                DBG(1, "VIDIOC_S_CROP failed because of hardware problems. To "
                       "use the camera, close and open /dev/video%d again.",
-                   cam->v4ldev->minor);
+                   cam->v4ldev->num);
                return -EIO;
        }
 
@@ -1858,7 +1858,7 @@ et61x251_vidioc_s_crop(struct et61x251_device* cam, void __user * arg)
                cam->state |= DEV_MISCONFIGURED;
                DBG(1, "VIDIOC_S_CROP failed because of not enough memory. To "
                       "use the camera, close and open /dev/video%d again.",
-                   cam->v4ldev->minor);
+                   cam->v4ldev->num);
                return -ENOMEM;
        }
 
@@ -2068,7 +2068,7 @@ et61x251_vidioc_try_s_fmt(struct et61x251_device* cam, unsigned int cmd,
                cam->state |= DEV_MISCONFIGURED;
                DBG(1, "VIDIOC_S_FMT failed because of hardware problems. To "
                       "use the camera, close and open /dev/video%d again.",
-                   cam->v4ldev->minor);
+                   cam->v4ldev->num);
                return -EIO;
        }
 
@@ -2080,7 +2080,7 @@ et61x251_vidioc_try_s_fmt(struct et61x251_device* cam, unsigned int cmd,
                cam->state |= DEV_MISCONFIGURED;
                DBG(1, "VIDIOC_S_FMT failed because of not enough memory. To "
                       "use the camera, close and open /dev/video%d again.",
-                   cam->v4ldev->minor);
+                   cam->v4ldev->num);
                return -ENOMEM;
        }
 
@@ -2128,7 +2128,7 @@ et61x251_vidioc_s_jpegcomp(struct et61x251_device* cam, void __user * arg)
                cam->state |= DEV_MISCONFIGURED;
                DBG(1, "VIDIOC_S_JPEGCOMP failed because of hardware "
                       "problems. To use the camera, close and open "
-                      "/dev/video%d again.", cam->v4ldev->minor);
+                      "/dev/video%d again.", cam->v4ldev->num);
                return -EIO;
        }
 
@@ -2605,7 +2605,7 @@ et61x251_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
                goto fail;
        }
 
-       DBG(2, "V4L2 device registered as /dev/video%d", cam->v4ldev->minor);
+       DBG(2, "V4L2 device registered as /dev/video%d", cam->v4ldev->num);
 
        cam->module_param.force_munmap = force_munmap[dev_nr];
        cam->module_param.frame_timeout = frame_timeout[dev_nr];
@@ -2658,7 +2658,7 @@ static void et61x251_usb_disconnect(struct usb_interface* intf)
        if (cam->users) {
                DBG(2, "Device /dev/video%d is open! Deregistration and "
                       "memory deallocation are deferred.",
-                   cam->v4ldev->minor);
+                   cam->v4ldev->num);
                cam->state |= DEV_MISCONFIGURED;
                et61x251_stop_transfer(cam);
                cam->state |= DEV_DISCONNECTED;
index aeaa13f6cb3639edda26bbc3178e4105fcdb283b..d36485023b68a91b9244af8776c38f028474aaa5 100644 (file)
@@ -1211,6 +1211,10 @@ static int __devinit ivtv_probe(struct pci_dev *dev,
 
        if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT) {
                ivtv_call_i2c_clients(itv, VIDIOC_INT_S_STD_OUTPUT, &itv->std);
+               /* Turn off the output signal. The mpeg decoder is not yet
+                  active so without this you would get a green image until the
+                  mpeg decoder becomes active. */
+               ivtv_saa7127(itv, VIDIOC_STREAMOFF, NULL);
        }
 
        /* clear interrupt mask, effectively disabling interrupts */
@@ -1330,6 +1334,10 @@ int ivtv_init_on_first_open(struct ivtv *itv)
        ivtv_s_frequency(NULL, &fh, &vf);
 
        if (itv->card->v4l2_capabilities & V4L2_CAP_VIDEO_OUTPUT) {
+               /* Turn on the TV-out: ivtv_init_mpeg_decoder() initializes
+                  the mpeg decoder so now the saa7127 receives a proper
+                  signal. */
+               ivtv_saa7127(itv, VIDIOC_STREAMON, NULL);
                ivtv_init_mpeg_decoder(itv);
        }
        ivtv_s_std(NULL, &fh, &itv->tuner_std);
@@ -1366,6 +1374,10 @@ static void ivtv_remove(struct pci_dev *pci_dev)
 
                /* Stop all decoding */
                IVTV_DEBUG_INFO("Stopping decoding\n");
+
+               /* Turn off the TV-out */
+               if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)
+                       ivtv_saa7127(itv, VIDIOC_STREAMOFF, NULL);
                if (atomic_read(&itv->decoding) > 0) {
                        int type;
 
index 24700c211d5264e660696e64cf92373d69e82793..41dbbe9621a1fa34d95379444e60a0f5b01df9c1 100644 (file)
@@ -726,6 +726,7 @@ int ivtv_saa7127(struct ivtv *itv, unsigned int cmd, void *arg)
 {
        return ivtv_call_i2c_client(itv, IVTV_SAA7127_I2C_ADDR, cmd, arg);
 }
+EXPORT_SYMBOL(ivtv_saa7127);
 
 int ivtv_saa717x(struct ivtv *itv, unsigned int cmd, void *arg)
 {
index 208fb54842f2f4a91f8527f280e5023cd8780215..4bae38d21ef6099cd24cc21edfc3d7d3a4a56f44 100644 (file)
@@ -1756,12 +1756,12 @@ static int ivtv_default(struct file *file, void *fh, int cmd, void *arg)
        return 0;
 }
 
-static int ivtv_serialized_ioctl(struct ivtv *itv, struct inode *inode, struct file *filp,
+static long ivtv_serialized_ioctl(struct ivtv *itv, struct file *filp,
                unsigned int cmd, unsigned long arg)
 {
        struct video_device *vfd = video_devdata(filp);
        struct ivtv_open_id *id = (struct ivtv_open_id *)filp->private_data;
-       int ret;
+       long ret;
 
        /* Filter dvb ioctls that cannot be handled by the v4l ioctl framework */
        switch (cmd) {
@@ -1830,20 +1830,19 @@ static int ivtv_serialized_ioctl(struct ivtv *itv, struct inode *inode, struct f
 
        if (ivtv_debug & IVTV_DBGFLG_IOCTL)
                vfd->debug = V4L2_DEBUG_IOCTL | V4L2_DEBUG_IOCTL_ARG;
-       ret = video_ioctl2(inode, filp, cmd, arg);
+       ret = __video_ioctl2(filp, cmd, arg);
        vfd->debug = 0;
        return ret;
 }
 
-int ivtv_v4l2_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
-                   unsigned long arg)
+long ivtv_v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 {
        struct ivtv_open_id *id = (struct ivtv_open_id *)filp->private_data;
        struct ivtv *itv = id->itv;
-       int res;
+       long res;
 
        mutex_lock(&itv->serialize_lock);
-       res = ivtv_serialized_ioctl(itv, inode, filp, cmd, arg);
+       res = ivtv_serialized_ioctl(itv, filp, cmd, arg);
        mutex_unlock(&itv->serialize_lock);
        return res;
 }
index 70188588b4f4f1e07c5916371ef13d5fd3da6da6..58f003412afdd5141a854c41779b80ad38a4884d 100644 (file)
@@ -30,7 +30,6 @@ void ivtv_set_funcs(struct video_device *vdev);
 int ivtv_s_std(struct file *file, void *fh, v4l2_std_id *std);
 int ivtv_s_frequency(struct file *file, void *fh, struct v4l2_frequency *vf);
 int ivtv_s_input(struct file *file, void *fh, unsigned int inp);
-int ivtv_v4l2_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
-                   unsigned long arg);
+long ivtv_v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
 
 #endif
index 5bbf31e393048fd6b1cd6740a4c02b9ace8f051b..9b7aa79eb2677d49ddd3da33c1f95fc2f6429283 100644 (file)
@@ -48,7 +48,7 @@ static const struct file_operations ivtv_v4l2_enc_fops = {
        .read = ivtv_v4l2_read,
        .write = ivtv_v4l2_write,
        .open = ivtv_v4l2_open,
-       .ioctl = ivtv_v4l2_ioctl,
+       .unlocked_ioctl = ivtv_v4l2_ioctl,
        .compat_ioctl = v4l_compat_ioctl32,
        .release = ivtv_v4l2_close,
        .poll = ivtv_v4l2_enc_poll,
@@ -59,7 +59,7 @@ static const struct file_operations ivtv_v4l2_dec_fops = {
        .read = ivtv_v4l2_read,
        .write = ivtv_v4l2_write,
        .open = ivtv_v4l2_open,
-       .ioctl = ivtv_v4l2_ioctl,
+       .unlocked_ioctl = ivtv_v4l2_ioctl,
        .compat_ioctl = v4l_compat_ioctl32,
        .release = ivtv_v4l2_close,
        .poll = ivtv_v4l2_dec_poll,
index 8a4a150b12fb1083c787da3fb3ddcbdb9ab9a51c..921e281876f8181168fe60b8fdb3d7823e51a0bf 100644 (file)
@@ -48,6 +48,7 @@
 #endif
 
 #include "ivtv-driver.h"
+#include "ivtv-i2c.h"
 #include "ivtv-udma.h"
 #include "ivtv-mailbox.h"
 
@@ -894,11 +895,16 @@ static int ivtvfb_blank(int blank_mode, struct fb_info *info)
        switch (blank_mode) {
        case FB_BLANK_UNBLANK:
                ivtv_vapi(itv, CX2341X_OSD_SET_STATE, 1, 1);
+               ivtv_saa7127(itv, VIDIOC_STREAMON, NULL);
                break;
        case FB_BLANK_NORMAL:
        case FB_BLANK_HSYNC_SUSPEND:
        case FB_BLANK_VSYNC_SUSPEND:
+               ivtv_vapi(itv, CX2341X_OSD_SET_STATE, 1, 0);
+               ivtv_saa7127(itv, VIDIOC_STREAMON, NULL);
+               break;
        case FB_BLANK_POWERDOWN:
+               ivtv_saa7127(itv, VIDIOC_STREAMOFF, NULL);
                ivtv_vapi(itv, CX2341X_OSD_SET_STATE, 1, 0);
                break;
        }
index a1252d673b411331e36811dac8cdea5d65e052f4..273d2a1aa220f0b8a42ad41ae9722dd3c299de5c 100644 (file)
@@ -402,6 +402,10 @@ static int pvr2_encoder_prep_config(struct pvr2_hdw *hdw)
        ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4, 0,3,0,0);
        ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4,15,0,0,0);
 
+       /* prevent the PTSs from slowly drifting away in the generated
+          MPEG stream */
+       ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC, 2, 4, 1);
+
        return ret;
 }
 
index 94265bd3d926c1b2a8960ae743a05f962aec75c2..5b81ba469641c89b302a777d9f41f62043609133 100644 (file)
@@ -60,7 +60,6 @@ static struct pvr2_hdw *unit_pointers[PVR_NUM] = {[ 0 ... PVR_NUM-1 ] = NULL};
 static DEFINE_MUTEX(pvr2_unit_mtx);
 
 static int ctlchg;
-static int initusbreset = 1;
 static int procreload;
 static int tuner[PVR_NUM] = { [0 ... PVR_NUM-1] = -1 };
 static int tolerance[PVR_NUM] = { [0 ... PVR_NUM-1] = 0 };
@@ -71,8 +70,6 @@ module_param(ctlchg, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(ctlchg, "0=optimize ctl change 1=always accept new ctl value");
 module_param(init_pause_msec, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(init_pause_msec, "hardware initialization settling delay");
-module_param(initusbreset, int, S_IRUGO|S_IWUSR);
-MODULE_PARM_DESC(initusbreset, "Do USB reset device on probe");
 module_param(procreload, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(procreload,
                 "Attempt init failure recovery with firmware reload");
@@ -1967,9 +1964,6 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
        }
        hdw->fw1_state = FW1_STATE_OK;
 
-       if (initusbreset) {
-               pvr2_hdw_device_reset(hdw);
-       }
        if (!pvr2_hdw_dev_ok(hdw)) return;
 
        for (idx = 0; idx < hdw->hdw_desc->client_modules.cnt; idx++) {
index f048d80b77e58b8e7e5e05ff9c2fec798929e135..97ed95957992ff9d5107ff90b1c754f3f2c6bbdc 100644 (file)
@@ -168,7 +168,7 @@ static const char *get_v4l_name(int v4l_type)
  * This is part of Video 4 Linux API. The procedure handles ioctl() calls.
  *
  */
-static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
+static int __pvr2_v4l2_do_ioctl(struct file *file,
                              unsigned int cmd, void *arg)
 {
        struct pvr2_v4l2_fh *fh = file->private_data;
@@ -863,8 +863,8 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
 #endif
 
        default :
-               ret = v4l_compat_translate_ioctl(inode,file,cmd,
-                                                arg,pvr2_v4l2_do_ioctl);
+               ret = v4l_compat_translate_ioctl(file, cmd,
+                                                arg, __pvr2_v4l2_do_ioctl);
        }
 
        pvr2_hdw_commit_ctl(hdw);
@@ -890,10 +890,15 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
        return ret;
 }
 
+static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
+                             unsigned int cmd, void *arg)
+{
+       return __pvr2_v4l2_do_ioctl(file, cmd, arg);
+}
 
 static void pvr2_v4l2_dev_destroy(struct pvr2_v4l2_dev *dip)
 {
-       int minor_id = dip->devbase.minor;
+       int num = dip->devbase.num;
        struct pvr2_hdw *hdw = dip->v4lp->channel.mc_head->hdw;
        enum pvr2_config cfg = dip->config;
        int v4l_type = dip->v4l_type;
@@ -909,7 +914,7 @@ static void pvr2_v4l2_dev_destroy(struct pvr2_v4l2_dev *dip)
        video_unregister_device(&dip->devbase);
 
        printk(KERN_INFO "pvrusb2: unregistered device %s%u [%s]\n",
-              get_v4l_name(v4l_type),minor_id & 0x1f,
+              get_v4l_name(v4l_type), num,
               pvr2_config_get_name(cfg));
 
 }
@@ -1310,7 +1315,7 @@ static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip,
        }
 
        printk(KERN_INFO "pvrusb2: registered device %s%u [%s]\n",
-              get_v4l_name(dip->v4l_type),dip->devbase.minor & 0x1f,
+              get_v4l_name(dip->v4l_type), dip->devbase.num,
               pvr2_config_get_name(dip->config));
 
        pvr2_hdw_v4l_store_minor_number(vp->channel.mc_head->hdw,
index ab28389b4cdadf17d0e28282dd6c186237c2fe14..f3897a3fdb75b3542de06f693e60e213ed642f1a 100644 (file)
@@ -1795,7 +1795,7 @@ static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id
                goto err;
        }
        else {
-               PWC_INFO("Registered as /dev/video%d.\n", pdev->vdev->minor & 0x3F);
+               PWC_INFO("Registered as /dev/video%d.\n", pdev->vdev->num);
        }
 
        /* occupy slot */
index b686bfabbde0defb53a765a8b3bf8978e1f21b0a..24918445294906ce9152c05db70d1748dfc6a9af 100644 (file)
@@ -996,7 +996,7 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
                goto fail4;
        }
        printk(KERN_INFO "%s: registered device video%d [v4l2]\n",
-              dev->name,dev->video_dev->minor & 0x1f);
+              dev->name, dev->video_dev->num);
 
        dev->vbi_dev = vdev_init(dev, &saa7134_video_template, "vbi");
 
@@ -1005,7 +1005,7 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
        if (err < 0)
                goto fail4;
        printk(KERN_INFO "%s: registered device vbi%d\n",
-              dev->name,dev->vbi_dev->minor & 0x1f);
+              dev->name, dev->vbi_dev->num);
 
        if (card_has_radio(dev)) {
                dev->radio_dev = vdev_init(dev,&saa7134_radio_template,"radio");
@@ -1014,7 +1014,7 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
                if (err < 0)
                        goto fail4;
                printk(KERN_INFO "%s: registered device radio%d\n",
-                      dev->name,dev->radio_dev->minor & 0x1f);
+                      dev->name, dev->radio_dev->num);
        }
 
        /* everything worked */
index 9a8766a78a0c31f45ddadeb561d4d837662730ba..7f40511bcc04b9493423d2fc9826d57e2473af98 100644 (file)
@@ -534,7 +534,7 @@ static int empress_init(struct saa7134_dev *dev)
                return err;
        }
        printk(KERN_INFO "%s: registered device video%d [mpeg]\n",
-              dev->name,dev->empress_dev->minor & 0x1f);
+              dev->name, dev->empress_dev->num);
 
        videobuf_queue_sg_init(&dev->empress_tsq, &saa7134_ts_qops,
                            &dev->pci->dev, &dev->slock,
index ae3949180c4ed3ace8801f67b94c24899e0b916f..044a2e94c34dc5e5708d6e3f0c4deb944a8ff263 100644 (file)
@@ -1412,7 +1412,7 @@ static int se401_probe(struct usb_interface *intf,
                return -EIO;
        }
        dev_info(&intf->dev, "registered new video device: video%d\n",
-                se401->vdev.minor);
+                se401->vdev.num);
 
        usb_set_intfdata (intf, se401);
        return 0;
index 20e30bd9364be9eb3d988079e8764029ed8543c9..fcd2b62f92c43506456437fa3b46f7469fc4d25c 100644 (file)
@@ -1008,7 +1008,7 @@ static int sn9c102_stream_interrupt(struct sn9c102_device* cam)
                cam->state |= DEV_MISCONFIGURED;
                DBG(1, "URB timeout reached. The camera is misconfigured. "
                       "To use it, close and open /dev/video%d again.",
-                   cam->v4ldev->minor);
+                   cam->v4ldev->num);
                return -EIO;
        }
 
@@ -1734,7 +1734,7 @@ static void sn9c102_release_resources(struct kref *kref)
 
        cam = container_of(kref, struct sn9c102_device, kref);
 
-       DBG(2, "V4L2 device /dev/video%d deregistered", cam->v4ldev->minor);
+       DBG(2, "V4L2 device /dev/video%d deregistered", cam->v4ldev->num);
        video_set_drvdata(cam->v4ldev, NULL);
        video_unregister_device(cam->v4ldev);
        usb_put_dev(cam->usbdev);
@@ -1792,7 +1792,7 @@ static int sn9c102_open(struct inode* inode, struct file* filp)
 
        if (cam->users) {
                DBG(2, "Device /dev/video%d is already in use",
-                      cam->v4ldev->minor);
+                      cam->v4ldev->num);
                DBG(3, "Simultaneous opens are not supported");
                /*
                   open() must follow the open flags and should block
@@ -1845,7 +1845,7 @@ static int sn9c102_open(struct inode* inode, struct file* filp)
        cam->frame_count = 0;
        sn9c102_empty_framequeues(cam);
 
-       DBG(3, "Video device /dev/video%d is open", cam->v4ldev->minor);
+       DBG(3, "Video device /dev/video%d is open", cam->v4ldev->num);
 
 out:
        mutex_unlock(&cam->open_mutex);
@@ -1870,7 +1870,7 @@ static int sn9c102_release(struct inode* inode, struct file* filp)
        cam->users--;
        wake_up_interruptible_nr(&cam->wait_open, 1);
 
-       DBG(3, "Video device /dev/video%d closed", cam->v4ldev->minor);
+       DBG(3, "Video device /dev/video%d closed", cam->v4ldev->num);
 
        kref_put(&cam->kref, sn9c102_release_resources);
 
@@ -2432,7 +2432,7 @@ sn9c102_vidioc_s_crop(struct sn9c102_device* cam, void __user * arg)
                cam->state |= DEV_MISCONFIGURED;
                DBG(1, "VIDIOC_S_CROP failed because of hardware problems. To "
                       "use the camera, close and open /dev/video%d again.",
-                   cam->v4ldev->minor);
+                   cam->v4ldev->num);
                return -EIO;
        }
 
@@ -2445,7 +2445,7 @@ sn9c102_vidioc_s_crop(struct sn9c102_device* cam, void __user * arg)
                cam->state |= DEV_MISCONFIGURED;
                DBG(1, "VIDIOC_S_CROP failed because of not enough memory. To "
                       "use the camera, close and open /dev/video%d again.",
-                   cam->v4ldev->minor);
+                   cam->v4ldev->num);
                return -ENOMEM;
        }
 
@@ -2689,7 +2689,7 @@ sn9c102_vidioc_try_s_fmt(struct sn9c102_device* cam, unsigned int cmd,
                cam->state |= DEV_MISCONFIGURED;
                DBG(1, "VIDIOC_S_FMT failed because of hardware problems. To "
                       "use the camera, close and open /dev/video%d again.",
-                   cam->v4ldev->minor);
+                   cam->v4ldev->num);
                return -EIO;
        }
 
@@ -2701,7 +2701,7 @@ sn9c102_vidioc_try_s_fmt(struct sn9c102_device* cam, unsigned int cmd,
                cam->state |= DEV_MISCONFIGURED;
                DBG(1, "VIDIOC_S_FMT failed because of not enough memory. To "
                       "use the camera, close and open /dev/video%d again.",
-                   cam->v4ldev->minor);
+                   cam->v4ldev->num);
                return -ENOMEM;
        }
 
@@ -2748,7 +2748,7 @@ sn9c102_vidioc_s_jpegcomp(struct sn9c102_device* cam, void __user * arg)
                cam->state |= DEV_MISCONFIGURED;
                DBG(1, "VIDIOC_S_JPEGCOMP failed because of hardware "
                       "problems. To use the camera, close and open "
-                      "/dev/video%d again.", cam->v4ldev->minor);
+                      "/dev/video%d again.", cam->v4ldev->num);
                return -EIO;
        }
 
@@ -3348,7 +3348,7 @@ sn9c102_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
                goto fail;
        }
 
-       DBG(2, "V4L2 device registered as /dev/video%d", cam->v4ldev->minor);
+       DBG(2, "V4L2 device registered as /dev/video%d", cam->v4ldev->num);
 
        video_set_drvdata(cam->v4ldev, cam);
        cam->module_param.force_munmap = force_munmap[dev_nr];
@@ -3402,7 +3402,7 @@ static void sn9c102_usb_disconnect(struct usb_interface* intf)
        if (cam->users) {
                DBG(2, "Device /dev/video%d is open! Deregistration and "
                       "memory deallocation are deferred.",
-                   cam->v4ldev->minor);
+                   cam->v4ldev->num);
                cam->state |= DEV_MISCONFIGURED;
                sn9c102_stop_transfer(cam);
                cam->state |= DEV_DISCONNECTED;
index edaea4964513ef3027a3673034877ee886d5743d..e9eb6d754d5c85db037e9d41fa398a1e2589830a 100644 (file)
@@ -1331,7 +1331,7 @@ static int stk_register_video_device(struct stk_camera *dev)
                STK_ERROR("v4l registration failed\n");
        else
                STK_INFO("Syntek USB2.0 Camera is now controlling video device"
-                       " /dev/video%d\n", dev->vdev.minor);
+                       " /dev/video%d\n", dev->vdev.num);
        return err;
 }
 
@@ -1426,7 +1426,7 @@ static void stk_camera_disconnect(struct usb_interface *interface)
        stk_remove_sysfs_files(&dev->vdev);
 
        STK_INFO("Syntek USB2.0 Camera release resources "
-               "video device /dev/video%d\n", dev->vdev.minor);
+               "video device /dev/video%d\n", dev->vdev.num);
 
        video_unregister_device(&dev->vdev);
 }
index 9c549d93599426c3d0ad53348b481edeb8decb52..328c41b1517d1a0d0897a17baad51c0fe08c3a40 100644 (file)
@@ -1470,7 +1470,8 @@ static int stv680_probe (struct usb_interface *intf, const struct usb_device_id
                retval = -EIO;
                goto error_vdev;
        }
-       PDEBUG (0, "STV(i): registered new video device: video%d", stv680->vdev->minor);
+       PDEBUG(0, "STV(i): registered new video device: video%d",
+               stv680->vdev->num);
 
        usb_set_intfdata (intf, stv680);
        retval = stv680_create_sysfs_files(stv680->vdev);
index 07cd87d16f69f602dcbd8bf416347200ce79a8d0..7c575bb8184fd6a95c80750f7a3f795afc5f6a24 100644 (file)
@@ -1059,7 +1059,7 @@ int usbvideo_RegisterVideoDevice(struct uvd *uvd)
 
        dev_info(&uvd->dev->dev, "%s on /dev/video%d: canvas=%s videosize=%s\n",
                 (uvd->handle != NULL) ? uvd->handle->drvName : "???",
-                uvd->vdev.minor, tmp2, tmp1);
+                uvd->vdev.num, tmp2, tmp1);
 
        usb_get_dev(uvd->dev);
        return 0;
index 7a127d6bfdee5432770136980b3899afc6f25825..8e2d58bec48120c1991c78fd3f8be963c5095f47 100644 (file)
@@ -877,7 +877,8 @@ vicam_probe( struct usb_interface *intf, const struct usb_device_id *id)
                return -EIO;
        }
 
-       printk(KERN_INFO "ViCam webcam driver now controlling video device %d\n",cam->vdev.minor);
+       printk(KERN_INFO "ViCam webcam driver now controlling video device %d\n",
+                       cam->vdev.num);
 
        usb_set_intfdata (intf, cam);
 
index 92427fdc1459b2b62af94aabe79063a08dc335f3..9907b9aff2b9228bc9aecb92305c7d4418563d8f 100644 (file)
@@ -236,7 +236,7 @@ int usbvision_i2c_register(struct usb_usbvision *usbvision)
               sizeof(struct i2c_client));
 
        sprintf(usbvision->i2c_adap.name + strlen(usbvision->i2c_adap.name),
-               " #%d", usbvision->vdev->minor & 0x1f);
+               " #%d", usbvision->vdev->num);
        PDEBUG(DBG_I2C,"Adaptername: %s", usbvision->i2c_adap.name);
        usbvision->i2c_adap.dev.parent = &usbvision->dev->dev;
 
index 77aeb39b2750b1a34e660e3a733209e89da792af..d185b57fdcd0eb11108f9e2a482c6e869227f24e 100644 (file)
@@ -1440,7 +1440,7 @@ static void usbvision_unregister_video(struct usb_usbvision *usbvision)
        // vbi Device:
        if (usbvision->vbi) {
                PDEBUG(DBG_PROBE, "unregister /dev/vbi%d [v4l2]",
-                      usbvision->vbi->minor & 0x1f);
+                      usbvision->vbi->num);
                if (usbvision->vbi->minor != -1) {
                        video_unregister_device(usbvision->vbi);
                } else {
@@ -1452,7 +1452,7 @@ static void usbvision_unregister_video(struct usb_usbvision *usbvision)
        // Radio Device:
        if (usbvision->rdev) {
                PDEBUG(DBG_PROBE, "unregister /dev/radio%d [v4l2]",
-                      usbvision->rdev->minor & 0x1f);
+                      usbvision->rdev->num);
                if (usbvision->rdev->minor != -1) {
                        video_unregister_device(usbvision->rdev);
                } else {
@@ -1464,7 +1464,7 @@ static void usbvision_unregister_video(struct usb_usbvision *usbvision)
        // Video Device:
        if (usbvision->vdev) {
                PDEBUG(DBG_PROBE, "unregister /dev/video%d [v4l2]",
-                      usbvision->vdev->minor & 0x1f);
+                      usbvision->vdev->num);
                if (usbvision->vdev->minor != -1) {
                        video_unregister_device(usbvision->vdev);
                } else {
@@ -1490,7 +1490,7 @@ static int __devinit usbvision_register_video(struct usb_usbvision *usbvision)
                goto err_exit;
        }
        printk(KERN_INFO "USBVision[%d]: registered USBVision Video device /dev/video%d [v4l2]\n",
-              usbvision->nr,usbvision->vdev->minor & 0x1f);
+              usbvision->nr, usbvision->vdev->num);
 
        // Radio Device:
        if (usbvision_device_data[usbvision->DevModel].Radio) {
@@ -1507,7 +1507,7 @@ static int __devinit usbvision_register_video(struct usb_usbvision *usbvision)
                        goto err_exit;
                }
                printk(KERN_INFO "USBVision[%d]: registered USBVision Radio device /dev/radio%d [v4l2]\n",
-                      usbvision->nr, usbvision->rdev->minor & 0x1f);
+                      usbvision->nr, usbvision->rdev->num);
        }
        // vbi Device:
        if (usbvision_device_data[usbvision->DevModel].vbi) {
@@ -1523,7 +1523,7 @@ static int __devinit usbvision_register_video(struct usb_usbvision *usbvision)
                        goto err_exit;
                }
                printk(KERN_INFO "USBVision[%d]: registered USBVision VBI device /dev/vbi%d [v4l2] (Not Working Yet!)\n",
-                      usbvision->nr,usbvision->vbi->minor & 0x1f);
+                      usbvision->nr, usbvision->vbi->num);
        }
        // all done
        return 0;
index 78e4c4e09d89cb1c5fae161b7cce07f412712917..758dfefaba8d3854e7b2ad22e57467d40edb68c0 100644 (file)
@@ -464,7 +464,7 @@ static int uvc_v4l2_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-static int uvc_v4l2_do_ioctl(struct inode *inode, struct file *file,
+static int __uvc_v4l2_do_ioctl(struct file *file,
                     unsigned int cmd, void *arg)
 {
        struct video_device *vdev = video_devdata(file);
@@ -978,8 +978,8 @@ static int uvc_v4l2_do_ioctl(struct inode *inode, struct file *file,
                return uvc_xu_ctrl_query(video, arg, 1);
 
        default:
-               if ((ret = v4l_compat_translate_ioctl(inode, file, cmd, arg,
-                       uvc_v4l2_do_ioctl)) == -ENOIOCTLCMD)
+               if ((ret = v4l_compat_translate_ioctl(file, cmd, arg,
+                       __uvc_v4l2_do_ioctl)) == -ENOIOCTLCMD)
                        uvc_trace(UVC_TRACE_IOCTL, "Unknown ioctl 0x%08x\n",
                                  cmd);
                return ret;
@@ -988,6 +988,12 @@ static int uvc_v4l2_do_ioctl(struct inode *inode, struct file *file,
        return ret;
 }
 
+static int uvc_v4l2_do_ioctl(struct inode *inode, struct file *file,
+                             unsigned int cmd, void *arg)
+{
+       return __uvc_v4l2_do_ioctl(file, cmd, arg);
+}
+
 static int uvc_v4l2_ioctl(struct inode *inode, struct file *file,
                     unsigned int cmd, unsigned long arg)
 {
index 928cb4037372e963f648c96656a65b9058baf98a..f13c0a9d684fe997dcbe0ab593f04d1c49557c21 100644 (file)
@@ -57,8 +57,7 @@ MODULE_LICENSE("GPL");
  */
 
 static int
-get_v4l_control(struct inode            *inode,
-               struct file             *file,
+get_v4l_control(struct file             *file,
                int                     cid,
                v4l2_kioctl             drv)
 {
@@ -67,12 +66,12 @@ get_v4l_control(struct inode            *inode,
        int                     err;
 
        qctrl2.id = cid;
-       err = drv(inode, file, VIDIOC_QUERYCTRL, &qctrl2);
+       err = drv(file, VIDIOC_QUERYCTRL, &qctrl2);
        if (err < 0)
                dprintk("VIDIOC_QUERYCTRL: %d\n", err);
        if (err == 0 && !(qctrl2.flags & V4L2_CTRL_FLAG_DISABLED)) {
                ctrl2.id = qctrl2.id;
-               err = drv(inode, file, VIDIOC_G_CTRL, &ctrl2);
+               err = drv(file, VIDIOC_G_CTRL, &ctrl2);
                if (err < 0) {
                        dprintk("VIDIOC_G_CTRL: %d\n", err);
                        return 0;
@@ -85,8 +84,7 @@ get_v4l_control(struct inode            *inode,
 }
 
 static int
-set_v4l_control(struct inode            *inode,
-               struct file             *file,
+set_v4l_control(struct file             *file,
                int                     cid,
                int                     value,
                v4l2_kioctl             drv)
@@ -96,7 +94,7 @@ set_v4l_control(struct inode            *inode,
        int                     err;
 
        qctrl2.id = cid;
-       err = drv(inode, file, VIDIOC_QUERYCTRL, &qctrl2);
+       err = drv(file, VIDIOC_QUERYCTRL, &qctrl2);
        if (err < 0)
                dprintk("VIDIOC_QUERYCTRL: %d\n", err);
        if (err == 0 &&
@@ -114,7 +112,7 @@ set_v4l_control(struct inode            *inode,
                         + 32767)
                        / 65535;
                ctrl2.value += qctrl2.minimum;
-               err = drv(inode, file, VIDIOC_S_CTRL, &ctrl2);
+               err = drv(file, VIDIOC_S_CTRL, &ctrl2);
                if (err < 0)
                        dprintk("VIDIOC_S_CTRL: %d\n", err);
        }
@@ -222,7 +220,6 @@ static int poll_one(struct file *file, struct poll_wqueues *pwq)
 }
 
 static int count_inputs(
-                       struct inode *inode,
                        struct file *file,
                        v4l2_kioctl drv)
 {
@@ -232,14 +229,13 @@ static int count_inputs(
        for (i = 0;; i++) {
                memset(&input2, 0, sizeof(input2));
                input2.index = i;
-               if (0 != drv(inode, file, VIDIOC_ENUMINPUT, &input2))
+               if (0 != drv(file, VIDIOC_ENUMINPUT, &input2))
                        break;
        }
        return i;
 }
 
 static int check_size(
-               struct inode *inode,
                struct file *file,
                v4l2_kioctl drv,
                int *maxw,
@@ -252,14 +248,14 @@ static int check_size(
        memset(&fmt2, 0, sizeof(fmt2));
 
        desc2.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-       if (0 != drv(inode, file, VIDIOC_ENUM_FMT, &desc2))
+       if (0 != drv(file, VIDIOC_ENUM_FMT, &desc2))
                goto done;
 
        fmt2.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        fmt2.fmt.pix.width       = 10000;
        fmt2.fmt.pix.height      = 10000;
        fmt2.fmt.pix.pixelformat = desc2.pixelformat;
-       if (0 != drv(inode, file, VIDIOC_TRY_FMT, &fmt2))
+       if (0 != drv(file, VIDIOC_TRY_FMT, &fmt2))
                goto done;
 
        *maxw = fmt2.fmt.pix.width;
@@ -273,7 +269,6 @@ done:
 
 static noinline int v4l1_compat_get_capabilities(
                                        struct video_capability *cap,
-                                       struct inode *inode,
                                        struct file *file,
                                        v4l2_kioctl drv)
 {
@@ -289,13 +284,13 @@ static noinline int v4l1_compat_get_capabilities(
        memset(cap, 0, sizeof(*cap));
        memset(&fbuf, 0, sizeof(fbuf));
 
-       err = drv(inode, file, VIDIOC_QUERYCAP, cap2);
+       err = drv(file, VIDIOC_QUERYCAP, cap2);
        if (err < 0) {
                dprintk("VIDIOCGCAP / VIDIOC_QUERYCAP: %d\n", err);
                goto done;
        }
        if (cap2->capabilities & V4L2_CAP_VIDEO_OVERLAY) {
-               err = drv(inode, file, VIDIOC_G_FBUF, &fbuf);
+               err = drv(file, VIDIOC_G_FBUF, &fbuf);
                if (err < 0) {
                        dprintk("VIDIOCGCAP / VIDIOC_G_FBUF: %d\n", err);
                        memset(&fbuf, 0, sizeof(fbuf));
@@ -317,8 +312,8 @@ static noinline int v4l1_compat_get_capabilities(
        if (fbuf.capability & V4L2_FBUF_CAP_LIST_CLIPPING)
                cap->type |= VID_TYPE_CLIPPING;
 
-       cap->channels  = count_inputs(inode, file, drv);
-       check_size(inode, file, drv,
+       cap->channels  = count_inputs(file, drv);
+       check_size(file, drv,
                   &cap->maxwidth, &cap->maxheight);
        cap->audios    =  0; /* FIXME */
        cap->minwidth  = 48; /* FIXME */
@@ -331,7 +326,6 @@ done:
 
 static noinline int v4l1_compat_get_frame_buffer(
                                        struct video_buffer *buffer,
-                                       struct inode *inode,
                                        struct file *file,
                                        v4l2_kioctl drv)
 {
@@ -341,7 +335,7 @@ static noinline int v4l1_compat_get_frame_buffer(
        memset(buffer, 0, sizeof(*buffer));
        memset(&fbuf, 0, sizeof(fbuf));
 
-       err = drv(inode, file, VIDIOC_G_FBUF, &fbuf);
+       err = drv(file, VIDIOC_G_FBUF, &fbuf);
        if (err < 0) {
                dprintk("VIDIOCGFBUF / VIDIOC_G_FBUF: %d\n", err);
                goto done;
@@ -386,7 +380,6 @@ done:
 
 static noinline int v4l1_compat_set_frame_buffer(
                                        struct video_buffer *buffer,
-                                       struct inode *inode,
                                        struct file *file,
                                        v4l2_kioctl drv)
 {
@@ -415,7 +408,7 @@ static noinline int v4l1_compat_set_frame_buffer(
                break;
        }
        fbuf.fmt.bytesperline = buffer->bytesperline;
-       err = drv(inode, file, VIDIOC_S_FBUF, &fbuf);
+       err = drv(file, VIDIOC_S_FBUF, &fbuf);
        if (err < 0)
                dprintk("VIDIOCSFBUF / VIDIOC_S_FBUF: %d\n", err);
        return err;
@@ -423,7 +416,6 @@ static noinline int v4l1_compat_set_frame_buffer(
 
 static noinline int v4l1_compat_get_win_cap_dimensions(
                                        struct video_window *win,
-                                       struct inode *inode,
                                        struct file *file,
                                        v4l2_kioctl drv)
 {
@@ -438,7 +430,7 @@ static noinline int v4l1_compat_get_win_cap_dimensions(
        memset(win, 0, sizeof(*win));
 
        fmt->type = V4L2_BUF_TYPE_VIDEO_OVERLAY;
-       err = drv(inode, file, VIDIOC_G_FMT, fmt);
+       err = drv(file, VIDIOC_G_FMT, fmt);
        if (err < 0)
                dprintk("VIDIOCGWIN / VIDIOC_G_WIN: %d\n", err);
        if (err == 0) {
@@ -453,7 +445,7 @@ static noinline int v4l1_compat_get_win_cap_dimensions(
        }
 
        fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-       err = drv(inode, file, VIDIOC_G_FMT, fmt);
+       err = drv(file, VIDIOC_G_FMT, fmt);
        if (err < 0) {
                dprintk("VIDIOCGWIN / VIDIOC_G_FMT: %d\n", err);
                goto done;
@@ -472,7 +464,6 @@ done:
 
 static noinline int v4l1_compat_set_win_cap_dimensions(
                                        struct video_window *win,
-                                       struct inode *inode,
                                        struct file *file,
                                        v4l2_kioctl drv)
 {
@@ -485,8 +476,8 @@ static noinline int v4l1_compat_set_win_cap_dimensions(
                return err;
        }
        fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-       drv(inode, file, VIDIOC_STREAMOFF, &fmt->type);
-       err1 = drv(inode, file, VIDIOC_G_FMT, fmt);
+       drv(file, VIDIOC_STREAMOFF, &fmt->type);
+       err1 = drv(file, VIDIOC_G_FMT, fmt);
        if (err1 < 0)
                dprintk("VIDIOCSWIN / VIDIOC_G_FMT: %d\n", err1);
        if (err1 == 0) {
@@ -494,7 +485,7 @@ static noinline int v4l1_compat_set_win_cap_dimensions(
                fmt->fmt.pix.height = win->height;
                fmt->fmt.pix.field  = V4L2_FIELD_ANY;
                fmt->fmt.pix.bytesperline = 0;
-               err = drv(inode, file, VIDIOC_S_FMT, fmt);
+               err = drv(file, VIDIOC_S_FMT, fmt);
                if (err < 0)
                        dprintk("VIDIOCSWIN / VIDIOC_S_FMT #1: %d\n",
                                err);
@@ -511,7 +502,7 @@ static noinline int v4l1_compat_set_win_cap_dimensions(
        fmt->fmt.win.chromakey = win->chromakey;
        fmt->fmt.win.clips     = (void __user *)win->clips;
        fmt->fmt.win.clipcount = win->clipcount;
-       err2 = drv(inode, file, VIDIOC_S_FMT, fmt);
+       err2 = drv(file, VIDIOC_S_FMT, fmt);
        if (err2 < 0)
                dprintk("VIDIOCSWIN / VIDIOC_S_FMT #2: %d\n", err2);
 
@@ -525,7 +516,6 @@ static noinline int v4l1_compat_set_win_cap_dimensions(
 
 static noinline int v4l1_compat_turn_preview_on_off(
                                        int *on,
-                                       struct inode *inode,
                                        struct file *file,
                                        v4l2_kioctl drv)
 {
@@ -536,9 +526,9 @@ static noinline int v4l1_compat_turn_preview_on_off(
                /* dirty hack time.  But v4l1 has no STREAMOFF
                 * equivalent in the API, and this one at
                 * least comes close ... */
-               drv(inode, file, VIDIOC_STREAMOFF, &captype);
+               drv(file, VIDIOC_STREAMOFF, &captype);
        }
-       err = drv(inode, file, VIDIOC_OVERLAY, on);
+       err = drv(file, VIDIOC_OVERLAY, on);
        if (err < 0)
                dprintk("VIDIOCCAPTURE / VIDIOC_PREVIEW: %d\n", err);
        return err;
@@ -546,7 +536,6 @@ static noinline int v4l1_compat_turn_preview_on_off(
 
 static noinline int v4l1_compat_get_input_info(
                                        struct video_channel *chan,
-                                       struct inode *inode,
                                        struct file *file,
                                        v4l2_kioctl drv)
 {
@@ -556,7 +545,7 @@ static noinline int v4l1_compat_get_input_info(
 
        memset(&input2, 0, sizeof(input2));
        input2.index = chan->channel;
-       err = drv(inode, file, VIDIOC_ENUMINPUT, &input2);
+       err = drv(file, VIDIOC_ENUMINPUT, &input2);
        if (err < 0) {
                dprintk("VIDIOCGCHAN / VIDIOC_ENUMINPUT: "
                        "channel=%d err=%d\n", chan->channel, err);
@@ -578,7 +567,7 @@ static noinline int v4l1_compat_get_input_info(
                break;
        }
        chan->norm = 0;
-       err = drv(inode, file, VIDIOC_G_STD, &sid);
+       err = drv(file, VIDIOC_G_STD, &sid);
        if (err < 0)
                dprintk("VIDIOCGCHAN / VIDIOC_G_STD: %d\n", err);
        if (err == 0) {
@@ -595,14 +584,13 @@ done:
 
 static noinline int v4l1_compat_set_input(
                                        struct video_channel *chan,
-                                       struct inode *inode,
                                        struct file *file,
                                        v4l2_kioctl drv)
 {
        int err;
        v4l2_std_id sid = 0;
 
-       err = drv(inode, file, VIDIOC_S_INPUT, &chan->channel);
+       err = drv(file, VIDIOC_S_INPUT, &chan->channel);
        if (err < 0)
                dprintk("VIDIOCSCHAN / VIDIOC_S_INPUT: %d\n", err);
        switch (chan->norm) {
@@ -617,7 +605,7 @@ static noinline int v4l1_compat_set_input(
                break;
        }
        if (0 != sid) {
-               err = drv(inode, file, VIDIOC_S_STD, &sid);
+               err = drv(file, VIDIOC_S_STD, &sid);
                if (err < 0)
                        dprintk("VIDIOCSCHAN / VIDIOC_S_STD: %d\n", err);
        }
@@ -626,7 +614,6 @@ static noinline int v4l1_compat_set_input(
 
 static noinline int v4l1_compat_get_picture(
                                        struct video_picture *pict,
-                                       struct inode *inode,
                                        struct file *file,
                                        v4l2_kioctl drv)
 {
@@ -639,19 +626,19 @@ static noinline int v4l1_compat_get_picture(
                return err;
        }
 
-       pict->brightness = get_v4l_control(inode, file,
+       pict->brightness = get_v4l_control(file,
                                           V4L2_CID_BRIGHTNESS, drv);
-       pict->hue = get_v4l_control(inode, file,
+       pict->hue = get_v4l_control(file,
                                    V4L2_CID_HUE, drv);
-       pict->contrast = get_v4l_control(inode, file,
+       pict->contrast = get_v4l_control(file,
                                         V4L2_CID_CONTRAST, drv);
-       pict->colour = get_v4l_control(inode, file,
+       pict->colour = get_v4l_control(file,
                                       V4L2_CID_SATURATION, drv);
-       pict->whiteness = get_v4l_control(inode, file,
+       pict->whiteness = get_v4l_control(file,
                                          V4L2_CID_WHITENESS, drv);
 
        fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-       err = drv(inode, file, VIDIOC_G_FMT, fmt);
+       err = drv(file, VIDIOC_G_FMT, fmt);
        if (err < 0) {
                dprintk("VIDIOCGPICT / VIDIOC_G_FMT: %d\n", err);
                goto done;
@@ -669,7 +656,6 @@ done:
 
 static noinline int v4l1_compat_set_picture(
                                        struct video_picture *pict,
-                                       struct inode *inode,
                                        struct file *file,
                                        v4l2_kioctl drv)
 {
@@ -685,15 +671,15 @@ static noinline int v4l1_compat_set_picture(
        }
        memset(&fbuf, 0, sizeof(fbuf));
 
-       set_v4l_control(inode, file,
+       set_v4l_control(file,
                        V4L2_CID_BRIGHTNESS, pict->brightness, drv);
-       set_v4l_control(inode, file,
+       set_v4l_control(file,
                        V4L2_CID_HUE, pict->hue, drv);
-       set_v4l_control(inode, file,
+       set_v4l_control(file,
                        V4L2_CID_CONTRAST, pict->contrast, drv);
-       set_v4l_control(inode, file,
+       set_v4l_control(file,
                        V4L2_CID_SATURATION, pict->colour, drv);
-       set_v4l_control(inode, file,
+       set_v4l_control(file,
                        V4L2_CID_WHITENESS, pict->whiteness, drv);
        /*
         * V4L1 uses this ioctl to set both memory capture and overlay
@@ -703,7 +689,7 @@ static noinline int v4l1_compat_set_picture(
         */
 
        fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-       err = drv(inode, file, VIDIOC_G_FMT, fmt);
+       err = drv(file, VIDIOC_G_FMT, fmt);
        /* If VIDIOC_G_FMT failed, then the driver likely doesn't
           support memory capture.  Trying to set the memory capture
           parameters would be pointless.  */
@@ -714,13 +700,13 @@ static noinline int v4l1_compat_set_picture(
                 palette_to_pixelformat(pict->palette)) {
                fmt->fmt.pix.pixelformat = palette_to_pixelformat(
                        pict->palette);
-               mem_err = drv(inode, file, VIDIOC_S_FMT, fmt);
+               mem_err = drv(file, VIDIOC_S_FMT, fmt);
                if (mem_err < 0)
                        dprintk("VIDIOCSPICT / VIDIOC_S_FMT: %d\n",
                                mem_err);
        }
 
-       err = drv(inode, file, VIDIOC_G_FBUF, &fbuf);
+       err = drv(file, VIDIOC_G_FBUF, &fbuf);
        /* If VIDIOC_G_FBUF failed, then the driver likely doesn't
           support overlay.  Trying to set the overlay parameters
           would be quite pointless.  */
@@ -731,7 +717,7 @@ static noinline int v4l1_compat_set_picture(
                 palette_to_pixelformat(pict->palette)) {
                fbuf.fmt.pixelformat = palette_to_pixelformat(
                        pict->palette);
-               ovl_err = drv(inode, file, VIDIOC_S_FBUF, &fbuf);
+               ovl_err = drv(file, VIDIOC_S_FBUF, &fbuf);
                if (ovl_err < 0)
                        dprintk("VIDIOCSPICT / VIDIOC_S_FBUF: %d\n",
                                ovl_err);
@@ -752,7 +738,6 @@ static noinline int v4l1_compat_set_picture(
 
 static noinline int v4l1_compat_get_tuner(
                                        struct video_tuner *tun,
-                                       struct inode *inode,
                                        struct file *file,
                                        v4l2_kioctl drv)
 {
@@ -762,7 +747,7 @@ static noinline int v4l1_compat_get_tuner(
        v4l2_std_id             sid;
 
        memset(&tun2, 0, sizeof(tun2));
-       err = drv(inode, file, VIDIOC_G_TUNER, &tun2);
+       err = drv(file, VIDIOC_G_TUNER, &tun2);
        if (err < 0) {
                dprintk("VIDIOCGTUNER / VIDIOC_G_TUNER: %d\n", err);
                goto done;
@@ -778,7 +763,7 @@ static noinline int v4l1_compat_get_tuner(
        for (i = 0; i < 64; i++) {
                memset(&std2, 0, sizeof(std2));
                std2.index = i;
-               if (0 != drv(inode, file, VIDIOC_ENUMSTD, &std2))
+               if (0 != drv(file, VIDIOC_ENUMSTD, &std2))
                        break;
                if (std2.id & V4L2_STD_PAL)
                        tun->flags |= VIDEO_TUNER_PAL;
@@ -788,7 +773,7 @@ static noinline int v4l1_compat_get_tuner(
                        tun->flags |= VIDEO_TUNER_SECAM;
        }
 
-       err = drv(inode, file, VIDIOC_G_STD, &sid);
+       err = drv(file, VIDIOC_G_STD, &sid);
        if (err < 0)
                dprintk("VIDIOCGTUNER / VIDIOC_G_STD: %d\n", err);
        if (err == 0) {
@@ -811,7 +796,6 @@ done:
 
 static noinline int v4l1_compat_select_tuner(
                                        struct video_tuner *tun,
-                                       struct inode *inode,
                                        struct file *file,
                                        v4l2_kioctl drv)
 {
@@ -821,7 +805,7 @@ static noinline int v4l1_compat_select_tuner(
 
        t.index = tun->tuner;
 
-       err = drv(inode, file, VIDIOC_S_INPUT, &t);
+       err = drv(file, VIDIOC_S_INPUT, &t);
        if (err < 0)
                dprintk("VIDIOCSTUNER / VIDIOC_S_INPUT: %d\n", err);
        return err;
@@ -829,7 +813,6 @@ static noinline int v4l1_compat_select_tuner(
 
 static noinline int v4l1_compat_get_frequency(
                                        unsigned long *freq,
-                                       struct inode *inode,
                                        struct file *file,
                                        v4l2_kioctl drv)
 {
@@ -838,7 +821,7 @@ static noinline int v4l1_compat_get_frequency(
        memset(&freq2, 0, sizeof(freq2));
 
        freq2.tuner = 0;
-       err = drv(inode, file, VIDIOC_G_FREQUENCY, &freq2);
+       err = drv(file, VIDIOC_G_FREQUENCY, &freq2);
        if (err < 0)
                dprintk("VIDIOCGFREQ / VIDIOC_G_FREQUENCY: %d\n", err);
        if (0 == err)
@@ -848,7 +831,6 @@ static noinline int v4l1_compat_get_frequency(
 
 static noinline int v4l1_compat_set_frequency(
                                        unsigned long *freq,
-                                       struct inode *inode,
                                        struct file *file,
                                        v4l2_kioctl drv)
 {
@@ -856,9 +838,9 @@ static noinline int v4l1_compat_set_frequency(
        struct v4l2_frequency   freq2;
        memset(&freq2, 0, sizeof(freq2));
 
-       drv(inode, file, VIDIOC_G_FREQUENCY, &freq2);
+       drv(file, VIDIOC_G_FREQUENCY, &freq2);
        freq2.frequency = *freq;
-       err = drv(inode, file, VIDIOC_S_FREQUENCY, &freq2);
+       err = drv(file, VIDIOC_S_FREQUENCY, &freq2);
        if (err < 0)
                dprintk("VIDIOCSFREQ / VIDIOC_S_FREQUENCY: %d\n", err);
        return err;
@@ -866,7 +848,6 @@ static noinline int v4l1_compat_set_frequency(
 
 static noinline int v4l1_compat_get_audio(
                                        struct video_audio *aud,
-                                       struct inode *inode,
                                        struct file *file,
                                        v4l2_kioctl drv)
 {
@@ -876,7 +857,7 @@ static noinline int v4l1_compat_get_audio(
        struct v4l2_tuner       tun2;
        memset(&aud2, 0, sizeof(aud2));
 
-       err = drv(inode, file, VIDIOC_G_AUDIO, &aud2);
+       err = drv(file, VIDIOC_G_AUDIO, &aud2);
        if (err < 0) {
                dprintk("VIDIOCGAUDIO / VIDIOC_G_AUDIO: %d\n", err);
                goto done;
@@ -886,27 +867,27 @@ static noinline int v4l1_compat_get_audio(
        aud->name[sizeof(aud->name) - 1] = 0;
        aud->audio = aud2.index;
        aud->flags = 0;
-       i = get_v4l_control(inode, file, V4L2_CID_AUDIO_VOLUME, drv);
+       i = get_v4l_control(file, V4L2_CID_AUDIO_VOLUME, drv);
        if (i >= 0) {
                aud->volume = i;
                aud->flags |= VIDEO_AUDIO_VOLUME;
        }
-       i = get_v4l_control(inode, file, V4L2_CID_AUDIO_BASS, drv);
+       i = get_v4l_control(file, V4L2_CID_AUDIO_BASS, drv);
        if (i >= 0) {
                aud->bass = i;
                aud->flags |= VIDEO_AUDIO_BASS;
        }
-       i = get_v4l_control(inode, file, V4L2_CID_AUDIO_TREBLE, drv);
+       i = get_v4l_control(file, V4L2_CID_AUDIO_TREBLE, drv);
        if (i >= 0) {
                aud->treble = i;
                aud->flags |= VIDEO_AUDIO_TREBLE;
        }
-       i = get_v4l_control(inode, file, V4L2_CID_AUDIO_BALANCE, drv);
+       i = get_v4l_control(file, V4L2_CID_AUDIO_BALANCE, drv);
        if (i >= 0) {
                aud->balance = i;
                aud->flags |= VIDEO_AUDIO_BALANCE;
        }
-       i = get_v4l_control(inode, file, V4L2_CID_AUDIO_MUTE, drv);
+       i = get_v4l_control(file, V4L2_CID_AUDIO_MUTE, drv);
        if (i >= 0) {
                if (i)
                        aud->flags |= VIDEO_AUDIO_MUTE;
@@ -914,13 +895,13 @@ static noinline int v4l1_compat_get_audio(
        }
        aud->step = 1;
        qctrl2.id = V4L2_CID_AUDIO_VOLUME;
-       if (drv(inode, file, VIDIOC_QUERYCTRL, &qctrl2) == 0 &&
+       if (drv(file, VIDIOC_QUERYCTRL, &qctrl2) == 0 &&
            !(qctrl2.flags & V4L2_CTRL_FLAG_DISABLED))
                aud->step = qctrl2.step;
        aud->mode = 0;
 
        memset(&tun2, 0, sizeof(tun2));
-       err = drv(inode, file, VIDIOC_G_TUNER, &tun2);
+       err = drv(file, VIDIOC_G_TUNER, &tun2);
        if (err < 0) {
                dprintk("VIDIOCGAUDIO / VIDIOC_G_TUNER: %d\n", err);
                err = 0;
@@ -939,7 +920,6 @@ done:
 
 static noinline int v4l1_compat_set_audio(
                                        struct video_audio *aud,
-                                       struct inode *inode,
                                        struct file *file,
                                        v4l2_kioctl drv)
 {
@@ -951,24 +931,24 @@ static noinline int v4l1_compat_set_audio(
        memset(&tun2, 0, sizeof(tun2));
 
        aud2.index = aud->audio;
-       err = drv(inode, file, VIDIOC_S_AUDIO, &aud2);
+       err = drv(file, VIDIOC_S_AUDIO, &aud2);
        if (err < 0) {
                dprintk("VIDIOCSAUDIO / VIDIOC_S_AUDIO: %d\n", err);
                goto done;
        }
 
-       set_v4l_control(inode, file, V4L2_CID_AUDIO_VOLUME,
+       set_v4l_control(file, V4L2_CID_AUDIO_VOLUME,
                        aud->volume, drv);
-       set_v4l_control(inode, file, V4L2_CID_AUDIO_BASS,
+       set_v4l_control(file, V4L2_CID_AUDIO_BASS,
                        aud->bass, drv);
-       set_v4l_control(inode, file, V4L2_CID_AUDIO_TREBLE,
+       set_v4l_control(file, V4L2_CID_AUDIO_TREBLE,
                        aud->treble, drv);
-       set_v4l_control(inode, file, V4L2_CID_AUDIO_BALANCE,
+       set_v4l_control(file, V4L2_CID_AUDIO_BALANCE,
                        aud->balance, drv);
-       set_v4l_control(inode, file, V4L2_CID_AUDIO_MUTE,
+       set_v4l_control(file, V4L2_CID_AUDIO_MUTE,
                        !!(aud->flags & VIDEO_AUDIO_MUTE), drv);
 
-       err = drv(inode, file, VIDIOC_G_TUNER, &tun2);
+       err = drv(file, VIDIOC_G_TUNER, &tun2);
        if (err < 0)
                dprintk("VIDIOCSAUDIO / VIDIOC_G_TUNER: %d\n", err);
        if (err == 0) {
@@ -985,7 +965,7 @@ static noinline int v4l1_compat_set_audio(
                        tun2.audmode = V4L2_TUNER_MODE_LANG2;
                        break;
                }
-               err = drv(inode, file, VIDIOC_S_TUNER, &tun2);
+               err = drv(file, VIDIOC_S_TUNER, &tun2);
                if (err < 0)
                        dprintk("VIDIOCSAUDIO / VIDIOC_S_TUNER: %d\n", err);
        }
@@ -996,7 +976,6 @@ done:
 
 static noinline int v4l1_compat_capture_frame(
                                        struct video_mmap *mm,
-                                       struct inode *inode,
                                        struct file *file,
                                        v4l2_kioctl drv)
 {
@@ -1013,7 +992,7 @@ static noinline int v4l1_compat_capture_frame(
        memset(&buf, 0, sizeof(buf));
 
        fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-       err = drv(inode, file, VIDIOC_G_FMT, fmt);
+       err = drv(file, VIDIOC_G_FMT, fmt);
        if (err < 0) {
                dprintk("VIDIOCMCAPTURE / VIDIOC_G_FMT: %d\n", err);
                goto done;
@@ -1029,7 +1008,7 @@ static noinline int v4l1_compat_capture_frame(
                        palette_to_pixelformat(mm->format);
                fmt->fmt.pix.field = V4L2_FIELD_ANY;
                fmt->fmt.pix.bytesperline = 0;
-               err = drv(inode, file, VIDIOC_S_FMT, fmt);
+               err = drv(file, VIDIOC_S_FMT, fmt);
                if (err < 0) {
                        dprintk("VIDIOCMCAPTURE / VIDIOC_S_FMT: %d\n", err);
                        goto done;
@@ -1037,17 +1016,17 @@ static noinline int v4l1_compat_capture_frame(
        }
        buf.index = mm->frame;
        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-       err = drv(inode, file, VIDIOC_QUERYBUF, &buf);
+       err = drv(file, VIDIOC_QUERYBUF, &buf);
        if (err < 0) {
                dprintk("VIDIOCMCAPTURE / VIDIOC_QUERYBUF: %d\n", err);
                goto done;
        }
-       err = drv(inode, file, VIDIOC_QBUF, &buf);
+       err = drv(file, VIDIOC_QBUF, &buf);
        if (err < 0) {
                dprintk("VIDIOCMCAPTURE / VIDIOC_QBUF: %d\n", err);
                goto done;
        }
-       err = drv(inode, file, VIDIOC_STREAMON, &captype);
+       err = drv(file, VIDIOC_STREAMON, &captype);
        if (err < 0)
                dprintk("VIDIOCMCAPTURE / VIDIOC_STREAMON: %d\n", err);
 done:
@@ -1057,7 +1036,6 @@ done:
 
 static noinline int v4l1_compat_sync(
                                int *i,
-                               struct inode *inode,
                                struct file *file,
                                v4l2_kioctl drv)
 {
@@ -1069,7 +1047,7 @@ static noinline int v4l1_compat_sync(
        memset(&buf, 0, sizeof(buf));
        buf.index = *i;
        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-       err = drv(inode, file, VIDIOC_QUERYBUF, &buf);
+       err = drv(file, VIDIOC_QUERYBUF, &buf);
        if (err < 0) {
                /*  No such buffer */
                dprintk("VIDIOCSYNC / VIDIOC_QUERYBUF: %d\n", err);
@@ -1082,7 +1060,7 @@ static noinline int v4l1_compat_sync(
        }
 
        /* make sure capture actually runs so we don't block forever */
-       err = drv(inode, file, VIDIOC_STREAMON, &captype);
+       err = drv(file, VIDIOC_STREAMON, &captype);
        if (err < 0) {
                dprintk("VIDIOCSYNC / VIDIOC_STREAMON: %d\n", err);
                goto done;
@@ -1096,7 +1074,7 @@ static noinline int v4l1_compat_sync(
                if (err < 0 ||  /* error or sleep was interrupted  */
                    err == 0)   /* timeout? Shouldn't occur.  */
                        break;
-               err = drv(inode, file, VIDIOC_QUERYBUF, &buf);
+               err = drv(file, VIDIOC_QUERYBUF, &buf);
                if (err < 0)
                        dprintk("VIDIOCSYNC / VIDIOC_QUERYBUF: %d\n", err);
        }
@@ -1104,7 +1082,7 @@ static noinline int v4l1_compat_sync(
        if (!(buf.flags & V4L2_BUF_FLAG_DONE)) /* not done */
                goto done;
        do {
-               err = drv(inode, file, VIDIOC_DQBUF, &buf);
+               err = drv(file, VIDIOC_DQBUF, &buf);
                if (err < 0)
                        dprintk("VIDIOCSYNC / VIDIOC_DQBUF: %d\n", err);
        } while (err == 0 && buf.index != *i);
@@ -1114,7 +1092,6 @@ done:
 
 static noinline int v4l1_compat_get_vbi_format(
                                struct vbi_format *fmt,
-                               struct inode *inode,
                                struct file *file,
                                v4l2_kioctl drv)
 {
@@ -1128,7 +1105,7 @@ static noinline int v4l1_compat_get_vbi_format(
        }
        fmt2->type = V4L2_BUF_TYPE_VBI_CAPTURE;
 
-       err = drv(inode, file, VIDIOC_G_FMT, fmt2);
+       err = drv(file, VIDIOC_G_FMT, fmt2);
        if (err < 0) {
                dprintk("VIDIOCGVBIFMT / VIDIOC_G_FMT: %d\n", err);
                goto done;
@@ -1153,7 +1130,6 @@ done:
 
 static noinline int v4l1_compat_set_vbi_format(
                                struct vbi_format *fmt,
-                               struct inode *inode,
                                struct file *file,
                                v4l2_kioctl drv)
 {
@@ -1179,7 +1155,7 @@ static noinline int v4l1_compat_set_vbi_format(
        fmt2->fmt.vbi.start[1]         = fmt->start[1];
        fmt2->fmt.vbi.count[1]         = fmt->count[1];
        fmt2->fmt.vbi.flags            = fmt->flags;
-       err = drv(inode, file, VIDIOC_TRY_FMT, fmt2);
+       err = drv(file, VIDIOC_TRY_FMT, fmt2);
        if (err < 0) {
                dprintk("VIDIOCSVBIFMT / VIDIOC_TRY_FMT: %d\n", err);
                goto done;
@@ -1196,7 +1172,7 @@ static noinline int v4l1_compat_set_vbi_format(
                err = -EINVAL;
                goto done;
        }
-       err = drv(inode, file, VIDIOC_S_FMT, fmt2);
+       err = drv(file, VIDIOC_S_FMT, fmt2);
        if (err < 0)
                dprintk("VIDIOCSVBIFMT / VIDIOC_S_FMT: %d\n", err);
 done:
@@ -1208,8 +1184,7 @@ done:
  *     This function is exported.
  */
 int
-v4l_compat_translate_ioctl(struct inode         *inode,
-                          struct file          *file,
+v4l_compat_translate_ioctl(struct file         *file,
                           int                  cmd,
                           void                 *arg,
                           v4l2_kioctl          drv)
@@ -1218,64 +1193,64 @@ v4l_compat_translate_ioctl(struct inode         *inode,
 
        switch (cmd) {
        case VIDIOCGCAP:        /* capability */
-               err = v4l1_compat_get_capabilities(arg, inode, file, drv);
+               err = v4l1_compat_get_capabilities(arg, file, drv);
                break;
        case VIDIOCGFBUF: /*  get frame buffer  */
-               err = v4l1_compat_get_frame_buffer(arg, inode, file, drv);
+               err = v4l1_compat_get_frame_buffer(arg, file, drv);
                break;
        case VIDIOCSFBUF: /*  set frame buffer  */
-               err = v4l1_compat_set_frame_buffer(arg, inode, file, drv);
+               err = v4l1_compat_set_frame_buffer(arg, file, drv);
                break;
        case VIDIOCGWIN: /*  get window or capture dimensions  */
-               err = v4l1_compat_get_win_cap_dimensions(arg, inode, file, drv);
+               err = v4l1_compat_get_win_cap_dimensions(arg, file, drv);
                break;
        case VIDIOCSWIN: /*  set window and/or capture dimensions  */
-               err = v4l1_compat_set_win_cap_dimensions(arg, inode, file, drv);
+               err = v4l1_compat_set_win_cap_dimensions(arg, file, drv);
                break;
        case VIDIOCCAPTURE: /*  turn on/off preview  */
-               err = v4l1_compat_turn_preview_on_off(arg, inode, file, drv);
+               err = v4l1_compat_turn_preview_on_off(arg, file, drv);
                break;
        case VIDIOCGCHAN: /*  get input information  */
-               err = v4l1_compat_get_input_info(arg, inode, file, drv);
+               err = v4l1_compat_get_input_info(arg, file, drv);
                break;
        case VIDIOCSCHAN: /*  set input  */
-               err = v4l1_compat_set_input(arg, inode, file, drv);
+               err = v4l1_compat_set_input(arg, file, drv);
                break;
        case VIDIOCGPICT: /*  get tone controls & partial capture format  */
-               err = v4l1_compat_get_picture(arg, inode, file, drv);
+               err = v4l1_compat_get_picture(arg, file, drv);
                break;
        case VIDIOCSPICT: /*  set tone controls & partial capture format  */
-               err = v4l1_compat_set_picture(arg, inode, file, drv);
+               err = v4l1_compat_set_picture(arg, file, drv);
                break;
        case VIDIOCGTUNER: /*  get tuner information  */
-               err = v4l1_compat_get_tuner(arg, inode, file, drv);
+               err = v4l1_compat_get_tuner(arg, file, drv);
                break;
        case VIDIOCSTUNER: /*  select a tuner input  */
-               err = v4l1_compat_select_tuner(arg, inode, file, drv);
+               err = v4l1_compat_select_tuner(arg, file, drv);
                break;
        case VIDIOCGFREQ: /*  get frequency  */
-               err = v4l1_compat_get_frequency(arg, inode, file, drv);
+               err = v4l1_compat_get_frequency(arg, file, drv);
                break;
        case VIDIOCSFREQ: /*  set frequency  */
-               err = v4l1_compat_set_frequency(arg, inode, file, drv);
+               err = v4l1_compat_set_frequency(arg, file, drv);
                break;
        case VIDIOCGAUDIO: /*  get audio properties/controls  */
-               err = v4l1_compat_get_audio(arg, inode, file, drv);
+               err = v4l1_compat_get_audio(arg, file, drv);
                break;
        case VIDIOCSAUDIO: /*  set audio controls  */
-               err = v4l1_compat_set_audio(arg, inode, file, drv);
+               err = v4l1_compat_set_audio(arg, file, drv);
                break;
        case VIDIOCMCAPTURE: /*  capture a frame  */
-               err = v4l1_compat_capture_frame(arg, inode, file, drv);
+               err = v4l1_compat_capture_frame(arg, file, drv);
                break;
        case VIDIOCSYNC: /*  wait for a frame  */
-               err = v4l1_compat_sync(arg, inode, file, drv);
+               err = v4l1_compat_sync(arg, file, drv);
                break;
        case VIDIOCGVBIFMT: /* query VBI data capture format */
-               err = v4l1_compat_get_vbi_format(arg, inode, file, drv);
+               err = v4l1_compat_get_vbi_format(arg, file, drv);
                break;
        case VIDIOCSVBIFMT:
-               err = v4l1_compat_set_vbi_format(arg, inode, file, drv);
+               err = v4l1_compat_set_vbi_format(arg, file, drv);
                break;
        default:
                err = -ENOIOCTLCMD;
index 0e4549922f26df0bce6ea8a1c3ec4361c97408f5..a935bae538ef26f4455cea5f58e0bf1da2b7c159 100644 (file)
@@ -32,7 +32,7 @@
 static DEFINE_MUTEX(mutex);
 static LIST_HEAD(int_list);
 
-static void v4l2_int_device_try_attach_all(void)
+void v4l2_int_device_try_attach_all(void)
 {
        struct v4l2_int_device *m, *s;
 
@@ -66,6 +66,7 @@ static void v4l2_int_device_try_attach_all(void)
                }
        }
 }
+EXPORT_SYMBOL_GPL(v4l2_int_device_try_attach_all);
 
 static int ioctl_sort_cmp(const void *a, const void *b)
 {
@@ -144,6 +145,7 @@ int v4l2_int_ioctl_0(struct v4l2_int_device *d, int cmd)
                find_ioctl(d->u.slave, cmd,
                           (v4l2_int_ioctl_func *)no_such_ioctl_0))(d);
 }
+EXPORT_SYMBOL_GPL(v4l2_int_ioctl_0);
 
 static int no_such_ioctl_1(struct v4l2_int_device *d, void *arg)
 {
@@ -156,5 +158,6 @@ int v4l2_int_ioctl_1(struct v4l2_int_device *d, int cmd, void *arg)
                find_ioctl(d->u.slave, cmd,
                           (v4l2_int_ioctl_func *)no_such_ioctl_1))(d, arg);
 }
+EXPORT_SYMBOL_GPL(v4l2_int_ioctl_1);
 
 MODULE_LICENSE("GPL");
index 155c9d77a463531d43989b75e2505da632f901b2..710e1a40c422b1f787ce55b677b39ae4f029acff 100644 (file)
@@ -625,13 +625,13 @@ static int check_fmt(const struct v4l2_ioctl_ops *ops, enum v4l2_buf_type type)
        return -EINVAL;
 }
 
-static int __video_do_ioctl(struct inode *inode, struct file *file,
+static int __video_do_ioctl(struct file *file,
                unsigned int cmd, void *arg)
 {
        struct video_device *vfd = video_devdata(file);
        const struct v4l2_ioctl_ops *ops = vfd->ioctl_ops;
-       void                 *fh = file->private_data;
-       int                  ret = -EINVAL;
+       void *fh = file->private_data;
+       int ret = -EINVAL;
 
        if ((vfd->debug & V4L2_DEBUG_IOCTL) &&
                                !(vfd->debug & V4L2_DEBUG_IOCTL_ARG)) {
@@ -675,7 +675,7 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
         V4L2 ioctls.
         ********************************************************/
        if (_IOC_TYPE(cmd) == 'v' && _IOC_NR(cmd) < BASE_VIDIOCPRIVATE)
-               return v4l_compat_translate_ioctl(inode, file, cmd, arg,
+               return v4l_compat_translate_ioctl(file, cmd, arg,
                                                __video_do_ioctl);
 #endif
 
@@ -1768,7 +1768,7 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
        return ret;
 }
 
-int video_ioctl2(struct inode *inode, struct file *file,
+int __video_ioctl2(struct file *file,
               unsigned int cmd, unsigned long arg)
 {
        char    sbuf[128];
@@ -1832,7 +1832,7 @@ int video_ioctl2(struct inode *inode, struct file *file,
        }
 
        /* Handles IOCTL */
-       err = __video_do_ioctl(inode, file, cmd, parg);
+       err = __video_do_ioctl(file, cmd, parg);
        if (err == -ENOIOCTLCMD)
                err = -EINVAL;
        if (is_ext_ctrl) {
@@ -1860,4 +1860,11 @@ out:
        kfree(mbuf);
        return err;
 }
+EXPORT_SYMBOL(__video_ioctl2);
+
+int video_ioctl2(struct inode *inode, struct file *file,
+              unsigned int cmd, unsigned long arg)
+{
+       return __video_ioctl2(file, cmd, arg);
+}
 EXPORT_SYMBOL(video_ioctl2);
index 917277d3660562b670399c3dc8eae25d72777b89..0e7dcba8e4ae08aa902a0a4c06213630d077bb76 100644 (file)
@@ -296,29 +296,7 @@ EXPORT_SYMBOL(videobuf_dvb_register_bus);
 
 void videobuf_dvb_unregister_bus(struct videobuf_dvb_frontends *f)
 {
-       struct list_head *list, *q;
-       struct videobuf_dvb_frontend *fe;
-
-       mutex_lock(&f->lock);
-       list_for_each_safe(list, q, &f->felist) {
-               fe = list_entry(list, struct videobuf_dvb_frontend, felist);
-               if (fe->dvb.net.dvbdev) {
-                       dvb_net_release(&fe->dvb.net);
-                       fe->dvb.demux.dmx.remove_frontend(&fe->dvb.demux.dmx,
-                               &fe->dvb.fe_mem);
-                       fe->dvb.demux.dmx.remove_frontend(&fe->dvb.demux.dmx,
-                               &fe->dvb.fe_hw);
-                       dvb_dmxdev_release(&fe->dvb.dmxdev);
-                       dvb_dmx_release(&fe->dvb.demux);
-                       dvb_unregister_frontend(fe->dvb.frontend);
-               }
-               if (fe->dvb.frontend)
-                       /* always allocated, may have been reset */
-                       dvb_frontend_detach(fe->dvb.frontend);
-               list_del(list);
-               kfree(fe);
-       }
-       mutex_unlock(&f->lock);
+       videobuf_dvb_dealloc_frontends(f);
 
        dvb_unregister_adapter(&f->adapter);
 }
@@ -389,3 +367,31 @@ fail_alloc:
        return fe;
 }
 EXPORT_SYMBOL(videobuf_dvb_alloc_frontend);
+
+void videobuf_dvb_dealloc_frontends(struct videobuf_dvb_frontends *f)
+{
+       struct list_head *list, *q;
+       struct videobuf_dvb_frontend *fe;
+
+       mutex_lock(&f->lock);
+       list_for_each_safe(list, q, &f->felist) {
+               fe = list_entry(list, struct videobuf_dvb_frontend, felist);
+               if (fe->dvb.net.dvbdev) {
+                       dvb_net_release(&fe->dvb.net);
+                       fe->dvb.demux.dmx.remove_frontend(&fe->dvb.demux.dmx,
+                               &fe->dvb.fe_mem);
+                       fe->dvb.demux.dmx.remove_frontend(&fe->dvb.demux.dmx,
+                               &fe->dvb.fe_hw);
+                       dvb_dmxdev_release(&fe->dvb.dmxdev);
+                       dvb_dmx_release(&fe->dvb.demux);
+                       dvb_unregister_frontend(fe->dvb.frontend);
+               }
+               if (fe->dvb.frontend)
+                       /* always allocated, may have been reset */
+                       dvb_frontend_detach(fe->dvb.frontend);
+               list_del(list); /* remove list entry */
+               kfree(fe);      /* free frontend allocation */
+       }
+       mutex_unlock(&f->lock);
+}
+EXPORT_SYMBOL(videobuf_dvb_dealloc_frontends);
index 7d7e51def461b10d11d0efd7968b3fa21b6abb3d..e15e48f04be7511e788b5022f413952d10d93bc7 100644 (file)
@@ -1163,11 +1163,11 @@ static int vivi_release(void)
 
                if (-1 != dev->vfd->minor) {
                        printk(KERN_INFO "%s: unregistering /dev/video%d\n",
-                               VIVI_MODULE_NAME, dev->vfd->minor);
+                               VIVI_MODULE_NAME, dev->vfd->num);
                        video_unregister_device(dev->vfd);
                } else {
                        printk(KERN_INFO "%s: releasing /dev/video%d\n",
-                               VIVI_MODULE_NAME, dev->vfd->minor);
+                               VIVI_MODULE_NAME, dev->vfd->num);
                        video_device_release(dev->vfd);
                }
 
@@ -1307,7 +1307,7 @@ static int __init vivi_init(void)
 
                dev->vfd = vfd;
                printk(KERN_INFO "%s: V4L2 device registered as /dev/video%d\n",
-                       VIVI_MODULE_NAME, vfd->minor);
+                       VIVI_MODULE_NAME, vfd->num);
        }
 
        if (ret < 0) {
index dcd45dbd82dcfa0424b900f78a495d85f5a3ec9e..4dfb43bd1846b977edfe277d6f8e2d06898bb837 100644 (file)
@@ -2398,7 +2398,7 @@ error:
        cam->sensor = CC_UNKNOWN;
        DBG(1, "Image sensor initialization failed for %s (/dev/video%d). "
               "Try to detach and attach this device again",
-           symbolic(camlist, cam->id), cam->v4ldev->minor)
+           symbolic(camlist, cam->id), cam->v4ldev->num)
        return err;
 }
 
@@ -2644,7 +2644,7 @@ static void w9968cf_release_resources(struct w9968cf_device* cam)
 {
        mutex_lock(&w9968cf_devlist_mutex);
 
-       DBG(2, "V4L device deregistered: /dev/video%d", cam->v4ldev->minor)
+       DBG(2, "V4L device deregistered: /dev/video%d", cam->v4ldev->num)
 
        video_unregister_device(cam->v4ldev);
        list_del(&cam->v4llist);
@@ -2679,7 +2679,7 @@ static int w9968cf_open(struct inode* inode, struct file* filp)
                DBG(2, "No supported image sensor has been detected by the "
                       "'ovcamchip' module for the %s (/dev/video%d). Make "
                       "sure it is loaded *before* (re)connecting the camera.",
-                   symbolic(camlist, cam->id), cam->v4ldev->minor)
+                   symbolic(camlist, cam->id), cam->v4ldev->num)
                mutex_unlock(&cam->dev_mutex);
                up_read(&w9968cf_disconnect);
                return -ENODEV;
@@ -2687,7 +2687,7 @@ static int w9968cf_open(struct inode* inode, struct file* filp)
 
        if (cam->users) {
                DBG(2, "%s (/dev/video%d) has been already occupied by '%s'",
-                   symbolic(camlist, cam->id),cam->v4ldev->minor,cam->command)
+                   symbolic(camlist, cam->id), cam->v4ldev->num, cam->command)
                if ((filp->f_flags & O_NONBLOCK)||(filp->f_flags & O_NDELAY)) {
                        mutex_unlock(&cam->dev_mutex);
                        up_read(&w9968cf_disconnect);
@@ -2709,7 +2709,7 @@ static int w9968cf_open(struct inode* inode, struct file* filp)
        }
 
        DBG(5, "Opening '%s', /dev/video%d ...",
-           symbolic(camlist, cam->id), cam->v4ldev->minor)
+           symbolic(camlist, cam->id), cam->v4ldev->num)
 
        cam->streaming = 0;
        cam->misconfigured = 0;
@@ -2947,7 +2947,7 @@ static int w9968cf_v4l_ioctl(struct inode* inode, struct file* filp,
                        .minheight = cam->minheight,
                };
                sprintf(cap.name, "W996[87]CF USB Camera #%d",
-                       cam->v4ldev->minor);
+                       cam->v4ldev->num);
                cap.maxwidth = (cam->upscaling && w9968cf_vpp)
                               ? max((u16)W9968CF_MAX_WIDTH, cam->maxwidth)
                                 : cam->maxwidth;
@@ -3567,7 +3567,7 @@ w9968cf_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
                goto fail;
        }
 
-       DBG(2, "V4L device registered as /dev/video%d", cam->v4ldev->minor)
+       DBG(2, "V4L device registered as /dev/video%d", cam->v4ldev->num)
 
        /* Set some basic constants */
        w9968cf_configure_camera(cam, udev, mod_id, dev_nr);
@@ -3618,7 +3618,7 @@ static void w9968cf_usb_disconnect(struct usb_interface* intf)
                        DBG(2, "The device is open (/dev/video%d)! "
                               "Process name: %s. Deregistration and memory "
                               "deallocation are deferred on close.",
-                           cam->v4ldev->minor, cam->command)
+                           cam->v4ldev->num, cam->command)
                        cam->misconfigured = 1;
                        w9968cf_stop_transfer(cam);
                        wake_up_interruptible(&cam->wait_queue);
index 6a0902bcba6bee88a250b0511cee48269d9c57bf..9fc58170763827d241e50c7deb28a4077941e1c4 100644 (file)
@@ -539,7 +539,7 @@ static int zc0301_stream_interrupt(struct zc0301_device* cam)
                cam->state |= DEV_MISCONFIGURED;
                DBG(1, "URB timeout reached. The camera is misconfigured. To "
                       "use it, close and open /dev/video%d again.",
-                   cam->v4ldev->minor);
+                   cam->v4ldev->num);
                return -EIO;
        }
 
@@ -640,7 +640,7 @@ static void zc0301_release_resources(struct kref *kref)
 {
        struct zc0301_device *cam = container_of(kref, struct zc0301_device,
                                                 kref);
-       DBG(2, "V4L2 device /dev/video%d deregistered", cam->v4ldev->minor);
+       DBG(2, "V4L2 device /dev/video%d deregistered", cam->v4ldev->num);
        video_set_drvdata(cam->v4ldev, NULL);
        video_unregister_device(cam->v4ldev);
        usb_put_dev(cam->usbdev);
@@ -679,7 +679,7 @@ static int zc0301_open(struct inode* inode, struct file* filp)
        }
 
        if (cam->users) {
-               DBG(2, "Device /dev/video%d is busy...", cam->v4ldev->minor);
+               DBG(2, "Device /dev/video%d is busy...", cam->v4ldev->num);
                DBG(3, "Simultaneous opens are not supported");
                if ((filp->f_flags & O_NONBLOCK) ||
                    (filp->f_flags & O_NDELAY)) {
@@ -722,7 +722,7 @@ static int zc0301_open(struct inode* inode, struct file* filp)
        cam->frame_count = 0;
        zc0301_empty_framequeues(cam);
 
-       DBG(3, "Video device /dev/video%d is open", cam->v4ldev->minor);
+       DBG(3, "Video device /dev/video%d is open", cam->v4ldev->num);
 
 out:
        mutex_unlock(&cam->open_mutex);
@@ -746,7 +746,7 @@ static int zc0301_release(struct inode* inode, struct file* filp)
        cam->users--;
        wake_up_interruptible_nr(&cam->wait_open, 1);
 
-       DBG(3, "Video device /dev/video%d closed", cam->v4ldev->minor);
+       DBG(3, "Video device /dev/video%d closed", cam->v4ldev->num);
 
        kref_put(&cam->kref, zc0301_release_resources);
 
@@ -1275,7 +1275,7 @@ zc0301_vidioc_s_crop(struct zc0301_device* cam, void __user * arg)
                cam->state |= DEV_MISCONFIGURED;
                DBG(1, "VIDIOC_S_CROP failed because of hardware problems. To "
                       "use the camera, close and open /dev/video%d again.",
-                   cam->v4ldev->minor);
+                   cam->v4ldev->num);
                return -EIO;
        }
 
@@ -1288,7 +1288,7 @@ zc0301_vidioc_s_crop(struct zc0301_device* cam, void __user * arg)
                cam->state |= DEV_MISCONFIGURED;
                DBG(1, "VIDIOC_S_CROP failed because of not enough memory. To "
                       "use the camera, close and open /dev/video%d again.",
-                   cam->v4ldev->minor);
+                   cam->v4ldev->num);
                return -ENOMEM;
        }
 
@@ -1470,7 +1470,7 @@ zc0301_vidioc_try_s_fmt(struct zc0301_device* cam, unsigned int cmd,
                cam->state |= DEV_MISCONFIGURED;
                DBG(1, "VIDIOC_S_FMT failed because of hardware problems. To "
                       "use the camera, close and open /dev/video%d again.",
-                   cam->v4ldev->minor);
+                   cam->v4ldev->num);
                return -EIO;
        }
 
@@ -1482,7 +1482,7 @@ zc0301_vidioc_try_s_fmt(struct zc0301_device* cam, unsigned int cmd,
                cam->state |= DEV_MISCONFIGURED;
                DBG(1, "VIDIOC_S_FMT failed because of not enough memory. To "
                       "use the camera, close and open /dev/video%d again.",
-                   cam->v4ldev->minor);
+                   cam->v4ldev->num);
                return -ENOMEM;
        }
 
@@ -1529,7 +1529,7 @@ zc0301_vidioc_s_jpegcomp(struct zc0301_device* cam, void __user * arg)
                cam->state |= DEV_MISCONFIGURED;
                DBG(1, "VIDIOC_S_JPEGCOMP failed because of hardware "
                       "problems. To use the camera, close and open "
-                      "/dev/video%d again.", cam->v4ldev->minor);
+                      "/dev/video%d again.", cam->v4ldev->num);
                return -EIO;
        }
 
@@ -2005,7 +2005,7 @@ zc0301_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
                goto fail;
        }
 
-       DBG(2, "V4L2 device registered as /dev/video%d", cam->v4ldev->minor);
+       DBG(2, "V4L2 device registered as /dev/video%d", cam->v4ldev->num);
 
        cam->module_param.force_munmap = force_munmap[dev_nr];
        cam->module_param.frame_timeout = frame_timeout[dev_nr];
@@ -2044,7 +2044,7 @@ static void zc0301_usb_disconnect(struct usb_interface* intf)
        if (cam->users) {
                DBG(2, "Device /dev/video%d is open! Deregistration and "
                       "memory deallocation are deferred.",
-                   cam->v4ldev->minor);
+                   cam->v4ldev->num);
                cam->state |= DEV_MISCONFIGURED;
                zc0301_stop_transfer(cam);
                cam->state |= DEV_DISCONNECTED;
index 7cdac99deea69fe909b0a03e5be6e25459e54b12..a1d81ed44c7c965451ae5acb00727dc079305c5f 100644 (file)
@@ -885,7 +885,7 @@ static int zr364xx_probe(struct usb_interface *intf,
        usb_set_intfdata(intf, cam);
 
        dev_info(&udev->dev, DRIVER_DESC " controlling video device %d\n",
-                cam->vdev->minor);
+                cam->vdev->num);
        return 0;
 }
 
index d4b03034ee73af53507e2ec15bb68235139b029d..4669d7e72e75c92e5499fe74100e88ce09eedec1 100644 (file)
@@ -315,6 +315,13 @@ struct v4l2_pix_format {
 /* see http://www.siliconimaging.com/RGB%20Bayer.htm */
 #define V4L2_PIX_FMT_SBGGR8  v4l2_fourcc('B', 'A', '8', '1') /*  8  BGBG.. GRGR.. */
 #define V4L2_PIX_FMT_SGBRG8  v4l2_fourcc('G', 'B', 'R', 'G') /*  8  GBGB.. RGRG.. */
+/*
+ * 10bit raw bayer, expanded to 16 bits
+ * xxxxrrrrrrrrrrxxxxgggggggggg xxxxggggggggggxxxxbbbbbbbbbb...
+ */
+#define V4L2_PIX_FMT_SGRBG10 v4l2_fourcc('B', 'A', '1', '0')
+/* 10bit raw bayer DPCM compressed to 8 bits */
+#define V4L2_PIX_FMT_SGRBG10DPCM8 v4l2_fourcc('B', 'D', '1', '0')
 #define V4L2_PIX_FMT_SBGGR16 v4l2_fourcc('B', 'Y', 'R', '2') /* 16  BGBG.. GRGR.. */
 
 /* compressed formats */
index c8b80e0f065199e01102933d0ad4074075632782..9c2df41dbf92b7900a4966f26e0aedbec3f10099 100644 (file)
@@ -84,6 +84,8 @@ struct v4l2_int_device {
        void *priv;
 };
 
+void v4l2_int_device_try_attach_all(void);
+
 int v4l2_int_device_register(struct v4l2_int_device *d);
 void v4l2_int_device_unregister(struct v4l2_int_device *d);
 
@@ -96,6 +98,12 @@ int v4l2_int_ioctl_1(struct v4l2_int_device *d, int cmd, void *arg);
  *
  */
 
+enum v4l2_power {
+       V4L2_POWER_OFF = 0,
+       V4L2_POWER_ON,
+       V4L2_POWER_STANDBY,
+};
+
 /* Slave interface type. */
 enum v4l2_if_type {
        /*
@@ -170,6 +178,9 @@ enum v4l2_int_ioctl_num {
        vidioc_int_queryctrl_num,
        vidioc_int_g_ctrl_num,
        vidioc_int_s_ctrl_num,
+       vidioc_int_cropcap_num,
+       vidioc_int_g_crop_num,
+       vidioc_int_s_crop_num,
        vidioc_int_g_parm_num,
        vidioc_int_s_parm_num,
 
@@ -182,12 +193,19 @@ enum v4l2_int_ioctl_num {
        vidioc_int_dev_init_num = 1000,
        /* Delinitialise the device at slave detach. */
        vidioc_int_dev_exit_num,
-       /* Set device power state: 0 is off, non-zero is on. */
+       /* Set device power state. */
        vidioc_int_s_power_num,
+       /*
+       * Get slave private data, e.g. platform-specific slave
+       * configuration used by the master.
+       */
+       vidioc_int_g_priv_num,
        /* Get slave interface parameters. */
        vidioc_int_g_ifparm_num,
        /* Does the slave need to be reset after VIDIOC_DQBUF? */
        vidioc_int_g_needs_reset_num,
+       vidioc_int_enum_framesizes_num,
+       vidioc_int_enum_frameintervals_num,
 
        /*
         *
@@ -261,14 +279,20 @@ V4L2_INT_WRAPPER_1(try_fmt_cap, struct v4l2_format, *);
 V4L2_INT_WRAPPER_1(queryctrl, struct v4l2_queryctrl, *);
 V4L2_INT_WRAPPER_1(g_ctrl, struct v4l2_control, *);
 V4L2_INT_WRAPPER_1(s_ctrl, struct v4l2_control, *);
+V4L2_INT_WRAPPER_1(cropcap, struct v4l2_cropcap, *);
+V4L2_INT_WRAPPER_1(g_crop, struct v4l2_crop, *);
+V4L2_INT_WRAPPER_1(s_crop, struct v4l2_crop, *);
 V4L2_INT_WRAPPER_1(g_parm, struct v4l2_streamparm, *);
 V4L2_INT_WRAPPER_1(s_parm, struct v4l2_streamparm, *);
 
 V4L2_INT_WRAPPER_0(dev_init);
 V4L2_INT_WRAPPER_0(dev_exit);
-V4L2_INT_WRAPPER_1(s_power, int, );
+V4L2_INT_WRAPPER_1(s_power, enum v4l2_power, );
+V4L2_INT_WRAPPER_1(g_priv, void, *);
 V4L2_INT_WRAPPER_1(g_ifparm, struct v4l2_ifparm, *);
 V4L2_INT_WRAPPER_1(g_needs_reset, void, *);
+V4L2_INT_WRAPPER_1(enum_framesizes, struct v4l2_frmsizeenum, *);
+V4L2_INT_WRAPPER_1(enum_frameintervals, struct v4l2_frmivalenum, *);
 
 V4L2_INT_WRAPPER_0(reset);
 V4L2_INT_WRAPPER_0(init);
index 0bef03add7968c1b26053be42b52ffbc5da132d3..e6ba25b3d7c8bd345b5c5c30732f2c4f78d59f5a 100644 (file)
@@ -271,26 +271,38 @@ extern const char *v4l2_field_names[];
 extern const char *v4l2_type_names[];
 
 /*  Compatibility layer interface  --  v4l1-compat module */
-typedef int (*v4l2_kioctl)(struct inode *inode, struct file *file,
+typedef int (*v4l2_kioctl)(struct file *file,
                           unsigned int cmd, void *arg);
 #ifdef CONFIG_VIDEO_V4L1_COMPAT
-int v4l_compat_translate_ioctl(struct inode *inode, struct file *file,
+int v4l_compat_translate_ioctl(struct file *file,
                               int cmd, void *arg, v4l2_kioctl driver_ioctl);
 #else
-#define v4l_compat_translate_ioctl(inode, file, cmd, arg, ioctl) (-EINVAL)
+#define v4l_compat_translate_ioctl(file, cmd, arg, ioctl) (-EINVAL)
 #endif
 
 /* 32 Bits compatibility layer for 64 bits processors */
 extern long v4l_compat_ioctl32(struct file *file, unsigned int cmd,
                                unsigned long arg);
 
-extern int video_ioctl2(struct inode *inode, struct file *file,
-                         unsigned int cmd, unsigned long arg);
-
 /* Include support for obsoleted stuff */
 extern int video_usercopy(struct inode *inode, struct file *file,
                          unsigned int cmd, unsigned long arg,
                          int (*func)(struct inode *inode, struct file *file,
                                      unsigned int cmd, void *arg));
 
+/* Standard handlers for V4L ioctl's */
+
+/* This prototype is used on fops.unlocked_ioctl */
+extern int __video_ioctl2(struct file *file,
+                       unsigned int cmd, unsigned long arg);
+
+/* This prototype is used on fops.ioctl
+ * Since fops.ioctl enables Kernel Big Lock, it is preferred
+ * to use __video_ioctl2 instead.
+ * It should be noticed that there's no lock code inside
+ * video_ioctl2().
+ */
+extern int video_ioctl2(struct inode *inode, struct file *file,
+                       unsigned int cmd, unsigned long arg);
+
 #endif /* _V4L2_IOCTL_H */
index 80471c2b63436d3dc45a8cb730782552b8849f55..6ba4f1271d237f7af4c5166040992f7ad8a96200 100644 (file)
@@ -47,6 +47,7 @@ int videobuf_dvb_register_bus(struct videobuf_dvb_frontends *f,
 void videobuf_dvb_unregister_bus(struct videobuf_dvb_frontends *f);
 
 struct videobuf_dvb_frontend * videobuf_dvb_alloc_frontend(struct videobuf_dvb_frontends *f, int id);
+void videobuf_dvb_dealloc_frontends(struct videobuf_dvb_frontends *f);
 
 struct videobuf_dvb_frontend * videobuf_dvb_get_frontend(struct videobuf_dvb_frontends *f, int id);
 int videobuf_dvb_find_frontend(struct videobuf_dvb_frontends *f, struct dvb_frontend *p);