aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/Makefile2
-rw-r--r--drivers/media/common/saa7146_video.c11
-rw-r--r--drivers/media/dvb/dvb-usb/Makefile3
-rw-r--r--drivers/media/dvb/dvb-usb/dibusb-common.c4
-rw-r--r--drivers/media/dvb/frontends/s5h1409.c11
-rw-r--r--drivers/media/dvb/frontends/tda10086.c14
-rw-r--r--drivers/media/dvb/frontends/zl10353.c4
-rw-r--r--drivers/media/dvb/frontends/zl10353.h2
-rw-r--r--drivers/media/video/bt866.c1
-rw-r--r--drivers/media/video/bt8xx/bttv-cards.c2
-rw-r--r--drivers/media/video/bt8xx/bttv-driver.c9
-rw-r--r--drivers/media/video/cx88/cx88-blackbird.c5
-rw-r--r--drivers/media/video/cx88/cx88-video.c5
-rw-r--r--drivers/media/video/em28xx/em28xx-video.c7
-rw-r--r--drivers/media/video/ivtv/ivtv-i2c.c2
-rw-r--r--drivers/media/video/ivtv/ivtv-i2c.h2
-rw-r--r--drivers/media/video/ivtv/ivtv-streams.c2
-rw-r--r--drivers/media/video/saa5246a.c10
-rw-r--r--drivers/media/video/saa5249.c8
-rw-r--r--drivers/media/video/saa7134/saa7134-alsa.c16
-rw-r--r--drivers/media/video/saa7134/saa7134-cards.c3
-rw-r--r--drivers/media/video/saa7134/saa7134-core.c21
-rw-r--r--drivers/media/video/saa7134/saa7134-dvb.c1
-rw-r--r--drivers/media/video/saa7134/saa7134-empress.c5
-rw-r--r--drivers/media/video/saa7134/saa7134-video.c5
-rw-r--r--drivers/media/video/tvp5150.c11
-rw-r--r--drivers/media/video/videobuf-core.c263
-rw-r--r--drivers/media/video/videobuf-vmalloc.c6
-rw-r--r--drivers/media/video/vivi.c1
29 files changed, 268 insertions, 168 deletions
diff --git a/drivers/media/Makefile b/drivers/media/Makefile
index 8fa19939c2b6..8cf91353b56a 100644
--- a/drivers/media/Makefile
+++ b/drivers/media/Makefile
@@ -3,6 +3,6 @@
3# 3#
4 4
5obj-y := common/ 5obj-y := common/
6obj-$(CONFIG_VIDEO_DEV) += video/ 6obj-y += video/
7obj-$(CONFIG_VIDEO_DEV) += radio/ 7obj-$(CONFIG_VIDEO_DEV) += radio/
8obj-$(CONFIG_DVB_CORE) += dvb/ 8obj-$(CONFIG_DVB_CORE) += dvb/
diff --git a/drivers/media/common/saa7146_video.c b/drivers/media/common/saa7146_video.c
index f245a3b2ef47..ae36d101006b 100644
--- a/drivers/media/common/saa7146_video.c
+++ b/drivers/media/common/saa7146_video.c
@@ -1205,13 +1205,10 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
1205 DEB_D(("VIDIOCGMBUF \n")); 1205 DEB_D(("VIDIOCGMBUF \n"));
1206 1206
1207 q = &fh->video_q; 1207 q = &fh->video_q;
1208 mutex_lock(&q->lock);
1209 err = videobuf_mmap_setup(q,gbuffers,gbufsize, 1208 err = videobuf_mmap_setup(q,gbuffers,gbufsize,
1210 V4L2_MEMORY_MMAP); 1209 V4L2_MEMORY_MMAP);
1211 if (err < 0) { 1210 if (err < 0)
1212 mutex_unlock(&q->lock);
1213 return err; 1211 return err;
1214 }
1215 1212
1216 gbuffers = err; 1213 gbuffers = err;
1217 memset(mbuf,0,sizeof(*mbuf)); 1214 memset(mbuf,0,sizeof(*mbuf));
@@ -1219,7 +1216,6 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
1219 mbuf->size = gbuffers * gbufsize; 1216 mbuf->size = gbuffers * gbufsize;
1220 for (i = 0; i < gbuffers; i++) 1217 for (i = 0; i < gbuffers; i++)
1221 mbuf->offsets[i] = i * gbufsize; 1218 mbuf->offsets[i] = i * gbufsize;
1222 mutex_unlock(&q->lock);
1223 return 0; 1219 return 0;
1224 } 1220 }
1225#endif 1221#endif
@@ -1440,10 +1436,7 @@ static void video_close(struct saa7146_dev *dev, struct file *file)
1440 err = saa7146_stop_preview(fh); 1436 err = saa7146_stop_preview(fh);
1441 } 1437 }
1442 1438
1443 // release all capture buffers 1439 videobuf_stop(q);
1444 mutex_lock(&q->lock);
1445 videobuf_read_stop(q);
1446 mutex_unlock(&q->lock);
1447 1440
1448 /* hmm, why is this function declared void? */ 1441 /* hmm, why is this function declared void? */
1449 /* return err */ 1442 /* return err */
diff --git a/drivers/media/dvb/dvb-usb/Makefile b/drivers/media/dvb/dvb-usb/Makefile
index 73ac0a93fdeb..60a910052c16 100644
--- a/drivers/media/dvb/dvb-usb/Makefile
+++ b/drivers/media/dvb/dvb-usb/Makefile
@@ -62,3 +62,6 @@ dvb-usb-af9005-remote-objs = af9005-remote.o
62obj-$(CONFIG_DVB_USB_AF9005_REMOTE) += dvb-usb-af9005-remote.o 62obj-$(CONFIG_DVB_USB_AF9005_REMOTE) += dvb-usb-af9005-remote.o
63 63
64EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/ 64EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/
65# due to tuner-xc3028
66EXTRA_CFLAGS += -Idrivers/media/video
67
diff --git a/drivers/media/dvb/dvb-usb/dibusb-common.c b/drivers/media/dvb/dvb-usb/dibusb-common.c
index 9a184da01c47..8ee6cd4da9e7 100644
--- a/drivers/media/dvb/dvb-usb/dibusb-common.c
+++ b/drivers/media/dvb/dvb-usb/dibusb-common.c
@@ -223,6 +223,9 @@ static struct dibx000_agc_config dib3000p_panasonic_agc_config = {
223 .agc2_slope2 = 0x1e, 223 .agc2_slope2 = 0x1e,
224}; 224};
225 225
226#if defined(CONFIG_DVB_DIB3000MC) || \
227 (defined(CONFIG_DVB_DIB3000MC_MODULE) && defined(MODULE))
228
226static struct dib3000mc_config mod3000p_dib3000p_config = { 229static struct dib3000mc_config mod3000p_dib3000p_config = {
227 &dib3000p_panasonic_agc_config, 230 &dib3000p_panasonic_agc_config,
228 231
@@ -305,6 +308,7 @@ int dibusb_dib3000mc_tuner_attach(struct dvb_usb_adapter *adap)
305 return 0; 308 return 0;
306} 309}
307EXPORT_SYMBOL(dibusb_dib3000mc_tuner_attach); 310EXPORT_SYMBOL(dibusb_dib3000mc_tuner_attach);
311#endif
308 312
309/* 313/*
310 * common remote control stuff 314 * common remote control stuff
diff --git a/drivers/media/dvb/frontends/s5h1409.c b/drivers/media/dvb/frontends/s5h1409.c
index 8dee7ec9456a..562d9208857a 100644
--- a/drivers/media/dvb/frontends/s5h1409.c
+++ b/drivers/media/dvb/frontends/s5h1409.c
@@ -107,7 +107,7 @@ static struct vsb_snr_tab {
107 u16 val; 107 u16 val;
108 u16 data; 108 u16 data;
109} vsb_snr_tab[] = { 109} vsb_snr_tab[] = {
110 { 1023, 770, }, 110 { 924, 300, },
111 { 923, 300, }, 111 { 923, 300, },
112 { 918, 295, }, 112 { 918, 295, },
113 { 915, 290, }, 113 { 915, 290, },
@@ -154,6 +154,7 @@ static struct qam64_snr_tab {
154 u16 val; 154 u16 val;
155 u16 data; 155 u16 data;
156} qam64_snr_tab[] = { 156} qam64_snr_tab[] = {
157 { 1, 0, },
157 { 12, 300, }, 158 { 12, 300, },
158 { 15, 290, }, 159 { 15, 290, },
159 { 18, 280, }, 160 { 18, 280, },
@@ -217,6 +218,7 @@ static struct qam64_snr_tab {
217 { 95, 202, }, 218 { 95, 202, },
218 { 96, 201, }, 219 { 96, 201, },
219 { 104, 200, }, 220 { 104, 200, },
221 { 255, 0, },
220}; 222};
221 223
222/* QAM256 SNR lookup table */ 224/* QAM256 SNR lookup table */
@@ -224,6 +226,7 @@ static struct qam256_snr_tab {
224 u16 val; 226 u16 val;
225 u16 data; 227 u16 data;
226} qam256_snr_tab[] = { 228} qam256_snr_tab[] = {
229 { 1, 0, },
227 { 12, 400, }, 230 { 12, 400, },
228 { 13, 390, }, 231 { 13, 390, },
229 { 15, 380, }, 232 { 15, 380, },
@@ -292,6 +295,7 @@ static struct qam256_snr_tab {
292 { 105, 262, }, 295 { 105, 262, },
293 { 106, 261, }, 296 { 106, 261, },
294 { 110, 260, }, 297 { 110, 260, },
298 { 255, 0, },
295}; 299};
296 300
297/* 8 bit registers, 16 bit values */ 301/* 8 bit registers, 16 bit values */
@@ -670,14 +674,15 @@ static int s5h1409_read_snr(struct dvb_frontend* fe, u16* snr)
670 u16 reg; 674 u16 reg;
671 dprintk("%s()\n", __FUNCTION__); 675 dprintk("%s()\n", __FUNCTION__);
672 676
673 reg = s5h1409_readreg(state, 0xf1) & 0x1ff;
674
675 switch(state->current_modulation) { 677 switch(state->current_modulation) {
676 case QAM_64: 678 case QAM_64:
679 reg = s5h1409_readreg(state, 0xf0) & 0xff;
677 return s5h1409_qam64_lookup_snr(fe, snr, reg); 680 return s5h1409_qam64_lookup_snr(fe, snr, reg);
678 case QAM_256: 681 case QAM_256:
682 reg = s5h1409_readreg(state, 0xf0) & 0xff;
679 return s5h1409_qam256_lookup_snr(fe, snr, reg); 683 return s5h1409_qam256_lookup_snr(fe, snr, reg);
680 case VSB_8: 684 case VSB_8:
685 reg = s5h1409_readreg(state, 0xf1) & 0x3ff;
681 return s5h1409_vsb_lookup_snr(fe, snr, reg); 686 return s5h1409_vsb_lookup_snr(fe, snr, reg);
682 default: 687 default:
683 break; 688 break;
diff --git a/drivers/media/dvb/frontends/tda10086.c b/drivers/media/dvb/frontends/tda10086.c
index 9a8ddc537f8f..9d26ace65151 100644
--- a/drivers/media/dvb/frontends/tda10086.c
+++ b/drivers/media/dvb/frontends/tda10086.c
@@ -158,7 +158,7 @@ static int tda10086_init(struct dvb_frontend* fe)
158 tda10086_write_byte(state, 0x3d, 0x80); 158 tda10086_write_byte(state, 0x3d, 0x80);
159 159
160 // setup SEC 160 // setup SEC
161 tda10086_write_byte(state, 0x36, 0x00); // all SEC off 161 tda10086_write_byte(state, 0x36, 0x80); // all SEC off, no 22k tone
162 tda10086_write_byte(state, 0x34, (((1<<19) * (22000/1000)) / (SACLK/1000))); // } tone frequency 162 tda10086_write_byte(state, 0x34, (((1<<19) * (22000/1000)) / (SACLK/1000))); // } tone frequency
163 tda10086_write_byte(state, 0x35, (((1<<19) * (22000/1000)) / (SACLK/1000)) >> 8); // } 163 tda10086_write_byte(state, 0x35, (((1<<19) * (22000/1000)) / (SACLK/1000)) >> 8); // }
164 164
@@ -183,13 +183,13 @@ static int tda10086_set_tone (struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
183 183
184 dprintk ("%s\n", __FUNCTION__); 184 dprintk ("%s\n", __FUNCTION__);
185 185
186 switch(tone) { 186 switch (tone) {
187 case SEC_TONE_OFF: 187 case SEC_TONE_OFF:
188 tda10086_write_byte(state, 0x36, 0x00); 188 tda10086_write_byte(state, 0x36, 0x80);
189 break; 189 break;
190 190
191 case SEC_TONE_ON: 191 case SEC_TONE_ON:
192 tda10086_write_byte(state, 0x36, 0x01); 192 tda10086_write_byte(state, 0x36, 0x81);
193 break; 193 break;
194 } 194 }
195 195
@@ -212,7 +212,7 @@ static int tda10086_send_master_cmd (struct dvb_frontend* fe,
212 for(i=0; i< cmd->msg_len; i++) { 212 for(i=0; i< cmd->msg_len; i++) {
213 tda10086_write_byte(state, 0x48+i, cmd->msg[i]); 213 tda10086_write_byte(state, 0x48+i, cmd->msg[i]);
214 } 214 }
215 tda10086_write_byte(state, 0x36, 0x08 | ((cmd->msg_len - 1) << 4)); 215 tda10086_write_byte(state, 0x36, 0x88 | ((cmd->msg_len - 1) << 4));
216 216
217 tda10086_diseqc_wait(state); 217 tda10086_diseqc_wait(state);
218 218
@@ -230,11 +230,11 @@ static int tda10086_send_burst (struct dvb_frontend* fe, fe_sec_mini_cmd_t minic
230 230
231 switch(minicmd) { 231 switch(minicmd) {
232 case SEC_MINI_A: 232 case SEC_MINI_A:
233 tda10086_write_byte(state, 0x36, 0x04); 233 tda10086_write_byte(state, 0x36, 0x84);
234 break; 234 break;
235 235
236 case SEC_MINI_B: 236 case SEC_MINI_B:
237 tda10086_write_byte(state, 0x36, 0x06); 237 tda10086_write_byte(state, 0x36, 0x86);
238 break; 238 break;
239 } 239 }
240 240
diff --git a/drivers/media/dvb/frontends/zl10353.c b/drivers/media/dvb/frontends/zl10353.c
index a97a7fd2c891..0106df4c55e8 100644
--- a/drivers/media/dvb/frontends/zl10353.c
+++ b/drivers/media/dvb/frontends/zl10353.c
@@ -122,7 +122,7 @@ static void zl10353_calc_nominal_rate(struct dvb_frontend *fe,
122 enum fe_bandwidth bandwidth, 122 enum fe_bandwidth bandwidth,
123 u16 *nominal_rate) 123 u16 *nominal_rate)
124{ 124{
125 u32 adc_clock = 22528; /* 20.480 MHz on the board(!?) */ 125 u32 adc_clock = 45056; /* 45.056 MHz */
126 u8 bw; 126 u8 bw;
127 struct zl10353_state *state = fe->demodulator_priv; 127 struct zl10353_state *state = fe->demodulator_priv;
128 128
@@ -142,7 +142,7 @@ static void zl10353_calc_nominal_rate(struct dvb_frontend *fe,
142 break; 142 break;
143 } 143 }
144 144
145 *nominal_rate = (64 * bw * (1<<16) / (7 * 8) * 4000 / adc_clock + 2) / 4; 145 *nominal_rate = (bw * (1 << 23) / 7 * 125 + adc_clock / 2) / adc_clock;
146 146
147 dprintk("%s: bw %d, adc_clock %d => 0x%x\n", 147 dprintk("%s: bw %d, adc_clock %d => 0x%x\n",
148 __FUNCTION__, bw, adc_clock, *nominal_rate); 148 __FUNCTION__, bw, adc_clock, *nominal_rate);
diff --git a/drivers/media/dvb/frontends/zl10353.h b/drivers/media/dvb/frontends/zl10353.h
index cb274dc12b82..1c3d494a6da9 100644
--- a/drivers/media/dvb/frontends/zl10353.h
+++ b/drivers/media/dvb/frontends/zl10353.h
@@ -30,7 +30,7 @@ struct zl10353_config
30 u8 demod_address; 30 u8 demod_address;
31 31
32 /* frequencies in kHz */ 32 /* frequencies in kHz */
33 int adc_clock; // default: 22528 33 int adc_clock; /* default: 45056 */
34 34
35 /* set if no pll is connected to the secondary i2c bus */ 35 /* set if no pll is connected to the secondary i2c bus */
36 int no_tuner; 36 int no_tuner;
diff --git a/drivers/media/video/bt866.c b/drivers/media/video/bt866.c
index b767b098d14b..96b415576f0d 100644
--- a/drivers/media/video/bt866.c
+++ b/drivers/media/video/bt866.c
@@ -300,7 +300,6 @@ static struct i2c_client bt866_client_tmpl =
300 .addr = 0, 300 .addr = 0,
301 .adapter = NULL, 301 .adapter = NULL,
302 .driver = &i2c_driver_bt866, 302 .driver = &i2c_driver_bt866,
303 .usage_count = 0
304}; 303};
305 304
306static int bt866_found_proc(struct i2c_adapter *adapter, 305static int bt866_found_proc(struct i2c_adapter *adapter,
diff --git a/drivers/media/video/bt8xx/bttv-cards.c b/drivers/media/video/bt8xx/bttv-cards.c
index 3abd9fa54d2c..585d1ef95afd 100644
--- a/drivers/media/video/bt8xx/bttv-cards.c
+++ b/drivers/media/video/bt8xx/bttv-cards.c
@@ -5080,7 +5080,7 @@ static void PXC200_muxsel(struct bttv *btv, unsigned int input)
5080/* ----------------------------------------------------------------------- */ 5080/* ----------------------------------------------------------------------- */
5081/* motherboard chipset specific stuff */ 5081/* motherboard chipset specific stuff */
5082 5082
5083void __devinit bttv_check_chipset(void) 5083void __init bttv_check_chipset(void)
5084{ 5084{
5085 int pcipci_fail = 0; 5085 int pcipci_fail = 0;
5086 struct pci_dev *dev = NULL; 5086 struct pci_dev *dev = NULL;
diff --git a/drivers/media/video/bt8xx/bttv-driver.c b/drivers/media/video/bt8xx/bttv-driver.c
index a88b56e6ca05..c02d92deacd2 100644
--- a/drivers/media/video/bt8xx/bttv-driver.c
+++ b/drivers/media/video/bt8xx/bttv-driver.c
@@ -3827,10 +3827,7 @@ static int bttv_release(struct inode *inode, struct file *file)
3827 3827
3828 /* stop vbi capture */ 3828 /* stop vbi capture */
3829 if (check_btres(fh, RESOURCE_VBI)) { 3829 if (check_btres(fh, RESOURCE_VBI)) {
3830 if (fh->vbi.streaming) 3830 videobuf_stop(&fh->vbi);
3831 videobuf_streamoff(&fh->vbi);
3832 if (fh->vbi.reading)
3833 videobuf_read_stop(&fh->vbi);
3834 free_btres(btv,fh,RESOURCE_VBI); 3831 free_btres(btv,fh,RESOURCE_VBI);
3835 } 3832 }
3836 3833
@@ -4988,7 +4985,7 @@ static struct pci_driver bttv_pci_driver = {
4988#endif 4985#endif
4989}; 4986};
4990 4987
4991static int bttv_init_module(void) 4988static int __init bttv_init_module(void)
4992{ 4989{
4993 int ret; 4990 int ret;
4994 4991
@@ -5021,7 +5018,7 @@ static int bttv_init_module(void)
5021 return pci_register_driver(&bttv_pci_driver); 5018 return pci_register_driver(&bttv_pci_driver);
5022} 5019}
5023 5020
5024static void bttv_cleanup_module(void) 5021static void __exit bttv_cleanup_module(void)
5025{ 5022{
5026 pci_unregister_driver(&bttv_pci_driver); 5023 pci_unregister_driver(&bttv_pci_driver);
5027 bus_unregister(&bttv_sub_bus_type); 5024 bus_unregister(&bttv_sub_bus_type);
diff --git a/drivers/media/video/cx88/cx88-blackbird.c b/drivers/media/video/cx88/cx88-blackbird.c
index f33f0b47142c..f802b5653569 100644
--- a/drivers/media/video/cx88/cx88-blackbird.c
+++ b/drivers/media/video/cx88/cx88-blackbird.c
@@ -1085,10 +1085,7 @@ static int mpeg_release(struct inode *inode, struct file *file)
1085 1085
1086 cx8802_cancel_buffers(fh->dev); 1086 cx8802_cancel_buffers(fh->dev);
1087 /* stop mpeg capture */ 1087 /* stop mpeg capture */
1088 if (fh->mpegq.streaming) 1088 videobuf_stop(&fh->mpegq);
1089 videobuf_streamoff(&fh->mpegq);
1090 if (fh->mpegq.reading)
1091 videobuf_read_stop(&fh->mpegq);
1092 1089
1093 videobuf_mmap_free(&fh->mpegq); 1090 videobuf_mmap_free(&fh->mpegq);
1094 file->private_data = NULL; 1091 file->private_data = NULL;
diff --git a/drivers/media/video/cx88/cx88-video.c b/drivers/media/video/cx88/cx88-video.c
index 5ee05f8f3fad..c84dafbdb991 100644
--- a/drivers/media/video/cx88/cx88-video.c
+++ b/drivers/media/video/cx88/cx88-video.c
@@ -851,10 +851,7 @@ static int video_release(struct inode *inode, struct file *file)
851 851
852 /* stop vbi capture */ 852 /* stop vbi capture */
853 if (res_check(fh, RESOURCE_VBI)) { 853 if (res_check(fh, RESOURCE_VBI)) {
854 if (fh->vbiq.streaming) 854 videobuf_stop(&fh->vbiq);
855 videobuf_streamoff(&fh->vbiq);
856 if (fh->vbiq.reading)
857 videobuf_read_stop(&fh->vbiq);
858 res_free(dev,fh,RESOURCE_VBI); 855 res_free(dev,fh,RESOURCE_VBI);
859 } 856 }
860 857
diff --git a/drivers/media/video/em28xx/em28xx-video.c b/drivers/media/video/em28xx/em28xx-video.c
index 2529c298b862..0906bc5766cc 100644
--- a/drivers/media/video/em28xx/em28xx-video.c
+++ b/drivers/media/video/em28xx/em28xx-video.c
@@ -144,7 +144,8 @@ static int em28xx_config(struct em28xx *dev)
144{ 144{
145 145
146 /* Sets I2C speed to 100 KHz */ 146 /* Sets I2C speed to 100 KHz */
147 em28xx_write_regs_req(dev, 0x00, 0x06, "\x40", 1); 147 if (!dev->is_em2800)
148 em28xx_write_regs_req(dev, 0x00, 0x06, "\x40", 1);
148 149
149 /* enable vbi capturing */ 150 /* enable vbi capturing */
150 151
@@ -570,7 +571,9 @@ static void em28xx_vm_close(struct vm_area_struct *vma)
570{ 571{
571 /* NOTE: buffers are not freed here */ 572 /* NOTE: buffers are not freed here */
572 struct em28xx_frame_t *f = vma->vm_private_data; 573 struct em28xx_frame_t *f = vma->vm_private_data;
573 f->vma_use_count--; 574
575 if (f->vma_use_count)
576 f->vma_use_count--;
574} 577}
575 578
576static struct vm_operations_struct em28xx_vm_ops = { 579static struct vm_operations_struct em28xx_vm_ops = {
diff --git a/drivers/media/video/ivtv/ivtv-i2c.c b/drivers/media/video/ivtv/ivtv-i2c.c
index 623eea2652ca..77b27dc750b1 100644
--- a/drivers/media/video/ivtv/ivtv-i2c.c
+++ b/drivers/media/video/ivtv/ivtv-i2c.c
@@ -706,7 +706,7 @@ void ivtv_call_i2c_clients(struct ivtv *itv, unsigned int cmd, void *arg)
706} 706}
707 707
708/* init + register i2c algo-bit adapter */ 708/* init + register i2c algo-bit adapter */
709int __devinit init_ivtv_i2c(struct ivtv *itv) 709int init_ivtv_i2c(struct ivtv *itv)
710{ 710{
711 IVTV_DEBUG_I2C("i2c init\n"); 711 IVTV_DEBUG_I2C("i2c init\n");
712 712
diff --git a/drivers/media/video/ivtv/ivtv-i2c.h b/drivers/media/video/ivtv/ivtv-i2c.h
index de6a07442298..987042c09b64 100644
--- a/drivers/media/video/ivtv/ivtv-i2c.h
+++ b/drivers/media/video/ivtv/ivtv-i2c.h
@@ -35,7 +35,7 @@ int ivtv_call_i2c_client(struct ivtv *itv, int addr, unsigned int cmd, void *arg
35void ivtv_call_i2c_clients(struct ivtv *itv, unsigned int cmd, void *arg); 35void ivtv_call_i2c_clients(struct ivtv *itv, unsigned int cmd, void *arg);
36 36
37/* init + register i2c algo-bit adapter */ 37/* init + register i2c algo-bit adapter */
38int __devinit init_ivtv_i2c(struct ivtv *itv); 38int init_ivtv_i2c(struct ivtv *itv);
39void exit_ivtv_i2c(struct ivtv *itv); 39void exit_ivtv_i2c(struct ivtv *itv);
40 40
41#endif 41#endif
diff --git a/drivers/media/video/ivtv/ivtv-streams.c b/drivers/media/video/ivtv/ivtv-streams.c
index aa03e61ef310..74fb0e021979 100644
--- a/drivers/media/video/ivtv/ivtv-streams.c
+++ b/drivers/media/video/ivtv/ivtv-streams.c
@@ -76,7 +76,7 @@ static struct {
76 int minor_offset; 76 int minor_offset;
77 int dma, pio; 77 int dma, pio;
78 enum v4l2_buf_type buf_type; 78 enum v4l2_buf_type buf_type;
79 struct file_operations *fops; 79 const struct file_operations *fops;
80} ivtv_stream_info[] = { 80} ivtv_stream_info[] = {
81 { /* IVTV_ENC_STREAM_TYPE_MPG */ 81 { /* IVTV_ENC_STREAM_TYPE_MPG */
82 "encoder MPG", 82 "encoder MPG",
diff --git a/drivers/media/video/saa5246a.c b/drivers/media/video/saa5246a.c
index ad0232935df6..996b49491f5a 100644
--- a/drivers/media/video/saa5246a.c
+++ b/drivers/media/video/saa5246a.c
@@ -187,12 +187,14 @@ static int i2c_senddata(struct saa5246a_device *t, ...)
187{ 187{
188 unsigned char buf[64]; 188 unsigned char buf[64];
189 int v; 189 int v;
190 int ct=0; 190 int ct = 0;
191 va_list argp; 191 va_list argp;
192 va_start(argp,t); 192 va_start(argp, t);
193 193
194 while((v=va_arg(argp,int))!=-1) 194 while ((v = va_arg(argp, int)) != -1)
195 buf[ct++]=v; 195 buf[ct++] = v;
196
197 va_end(argp);
196 return i2c_sendbuf(t, buf[0], ct-1, buf+1); 198 return i2c_sendbuf(t, buf[0], ct-1, buf+1);
197} 199}
198 200
diff --git a/drivers/media/video/saa5249.c b/drivers/media/video/saa5249.c
index 94bb59a32b17..f55d6e85f20f 100644
--- a/drivers/media/video/saa5249.c
+++ b/drivers/media/video/saa5249.c
@@ -282,12 +282,14 @@ static int i2c_senddata(struct saa5249_device *t, ...)
282{ 282{
283 unsigned char buf[64]; 283 unsigned char buf[64];
284 int v; 284 int v;
285 int ct=0; 285 int ct = 0;
286 va_list argp; 286 va_list argp;
287 va_start(argp,t); 287 va_start(argp,t);
288 288
289 while((v=va_arg(argp,int))!=-1) 289 while ((v = va_arg(argp, int)) != -1)
290 buf[ct++]=v; 290 buf[ct++] = v;
291
292 va_end(argp);
291 return i2c_sendbuf(t, buf[0], ct-1, buf+1); 293 return i2c_sendbuf(t, buf[0], ct-1, buf+1);
292} 294}
293 295
diff --git a/drivers/media/video/saa7134/saa7134-alsa.c b/drivers/media/video/saa7134/saa7134-alsa.c
index b9c5cf7dc849..4878f3067787 100644
--- a/drivers/media/video/saa7134/saa7134-alsa.c
+++ b/drivers/media/video/saa7134/saa7134-alsa.c
@@ -222,7 +222,8 @@ static irqreturn_t saa7134_alsa_irq(int irq, void *dev_id)
222 222
223 if (report & SAA7134_IRQ_REPORT_DONE_RA3) { 223 if (report & SAA7134_IRQ_REPORT_DONE_RA3) {
224 handled = 1; 224 handled = 1;
225 saa_writel(SAA7134_IRQ_REPORT,report); 225 saa_writel(SAA7134_IRQ_REPORT,
226 SAA7134_IRQ_REPORT_DONE_RA3);
226 saa7134_irq_alsa_done(dev, status); 227 saa7134_irq_alsa_done(dev, status);
227 } else { 228 } else {
228 goto out; 229 goto out;
@@ -457,7 +458,7 @@ static struct snd_pcm_hardware snd_card_saa7134_capture =
457 .buffer_bytes_max = (256*1024), 458 .buffer_bytes_max = (256*1024),
458 .period_bytes_min = 64, 459 .period_bytes_min = 64,
459 .period_bytes_max = (256*1024), 460 .period_bytes_max = (256*1024),
460 .periods_min = 2, 461 .periods_min = 4,
461 .periods_max = 1024, 462 .periods_max = 1024,
462}; 463};
463 464
@@ -491,7 +492,7 @@ static int snd_card_saa7134_hw_params(struct snd_pcm_substream * substream,
491 492
492 snd_assert(period_size >= 0x100 && period_size <= 0x10000, 493 snd_assert(period_size >= 0x100 && period_size <= 0x10000,
493 return -EINVAL); 494 return -EINVAL);
494 snd_assert(periods >= 2, return -EINVAL); 495 snd_assert(periods >= 4, return -EINVAL);
495 snd_assert(period_size * periods <= 1024 * 1024, return -EINVAL); 496 snd_assert(period_size * periods <= 1024 * 1024, return -EINVAL);
496 497
497 dev = saa7134->dev; 498 dev = saa7134->dev;
@@ -647,7 +648,14 @@ static int snd_card_saa7134_capture_open(struct snd_pcm_substream * substream)
647 saa7134_tvaudio_setmute(dev); 648 saa7134_tvaudio_setmute(dev);
648 } 649 }
649 650
650 if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) 651 err = snd_pcm_hw_constraint_integer(runtime,
652 SNDRV_PCM_HW_PARAM_PERIODS);
653 if (err < 0)
654 return err;
655
656 err = snd_pcm_hw_constraint_step(runtime, 0,
657 SNDRV_PCM_HW_PARAM_PERIODS, 2);
658 if (err < 0)
651 return err; 659 return err;
652 660
653 return 0; 661 return 0;
diff --git a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c
index 4f3dad9ae6d6..98c1b084a716 100644
--- a/drivers/media/video/saa7134/saa7134-cards.c
+++ b/drivers/media/video/saa7134/saa7134-cards.c
@@ -334,7 +334,7 @@ struct saa7134_board saa7134_boards[] = {
334 .tv = 1, 334 .tv = 1,
335 },{ 335 },{
336 .name = name_comp1, 336 .name = name_comp1,
337 .vmux = 2, 337 .vmux = 0,
338 .amux = LINE1, 338 .amux = LINE1,
339 },{ 339 },{
340 .name = name_comp2, 340 .name = name_comp2,
@@ -3221,6 +3221,7 @@ struct saa7134_board saa7134_boards[] = {
3221 .radio_type = UNSET, 3221 .radio_type = UNSET,
3222 .tuner_addr = ADDR_UNSET, 3222 .tuner_addr = ADDR_UNSET,
3223 .radio_addr = ADDR_UNSET, 3223 .radio_addr = ADDR_UNSET,
3224 .tuner_config = 1,
3224 .mpeg = SAA7134_MPEG_DVB, 3225 .mpeg = SAA7134_MPEG_DVB,
3225 .inputs = {{ 3226 .inputs = {{
3226 .name = name_tv, 3227 .name = name_tv,
diff --git a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c
index a499eea379e6..4fd187ac9d70 100644
--- a/drivers/media/video/saa7134/saa7134-core.c
+++ b/drivers/media/video/saa7134/saa7134-core.c
@@ -569,21 +569,22 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id)
569 for (loop = 0; loop < 10; loop++) { 569 for (loop = 0; loop < 10; loop++) {
570 report = saa_readl(SAA7134_IRQ_REPORT); 570 report = saa_readl(SAA7134_IRQ_REPORT);
571 status = saa_readl(SAA7134_IRQ_STATUS); 571 status = saa_readl(SAA7134_IRQ_STATUS);
572 if (0 == report) {
573 if (irq_debug > 1)
574 printk(KERN_DEBUG "%s/irq: no (more) work\n",
575 dev->name);
576 goto out;
577 }
578
579 /* If dmasound support is active and we get a sound report, exit
580 and let the saa7134-alsa/oss module deal with it */
581 572
573 /* If dmasound support is active and we get a sound report,
574 * mask out the report and let the saa7134-alsa module deal
575 * with it */
582 if ((report & SAA7134_IRQ_REPORT_DONE_RA3) && 576 if ((report & SAA7134_IRQ_REPORT_DONE_RA3) &&
583 (dev->dmasound.priv_data != NULL) ) 577 (dev->dmasound.priv_data != NULL) )
584 { 578 {
585 if (irq_debug > 1) 579 if (irq_debug > 1)
586 printk(KERN_DEBUG "%s/irq: ignoring interrupt for DMA sound\n", 580 printk(KERN_DEBUG "%s/irq: preserving DMA sound interrupt\n",
581 dev->name);
582 report &= ~SAA7134_IRQ_REPORT_DONE_RA3;
583 }
584
585 if (0 == report) {
586 if (irq_debug > 1)
587 printk(KERN_DEBUG "%s/irq: no (more) work\n",
587 dev->name); 588 dev->name);
588 goto out; 589 goto out;
589 } 590 }
diff --git a/drivers/media/video/saa7134/saa7134-dvb.c b/drivers/media/video/saa7134/saa7134-dvb.c
index 38d87332cc5d..e1ab099ec4c6 100644
--- a/drivers/media/video/saa7134/saa7134-dvb.c
+++ b/drivers/media/video/saa7134/saa7134-dvb.c
@@ -662,6 +662,7 @@ static struct tda1004x_config hauppauge_hvr_1110_config = {
662 .if_freq = TDA10046_FREQ_045, 662 .if_freq = TDA10046_FREQ_045,
663 .i2c_gate = 0x4b, 663 .i2c_gate = 0x4b,
664 .tuner_address = 0x61, 664 .tuner_address = 0x61,
665 .tuner_config = 1,
665 .request_firmware = philips_tda1004x_request_firmware 666 .request_firmware = philips_tda1004x_request_firmware
666}; 667};
667 668
diff --git a/drivers/media/video/saa7134/saa7134-empress.c b/drivers/media/video/saa7134/saa7134-empress.c
index 75d0c5bf46d2..9322f44865b8 100644
--- a/drivers/media/video/saa7134/saa7134-empress.c
+++ b/drivers/media/video/saa7134/saa7134-empress.c
@@ -110,11 +110,8 @@ static int ts_release(struct inode *inode, struct file *file)
110{ 110{
111 struct saa7134_dev *dev = file->private_data; 111 struct saa7134_dev *dev = file->private_data;
112 112
113 if (dev->empress_tsq.streaming)
114 videobuf_streamoff(&dev->empress_tsq);
115 mutex_lock(&dev->empress_tsq.lock); 113 mutex_lock(&dev->empress_tsq.lock);
116 if (dev->empress_tsq.reading) 114 videobuf_stop(&dev->empress_tsq);
117 videobuf_read_stop(&dev->empress_tsq);
118 videobuf_mmap_free(&dev->empress_tsq); 115 videobuf_mmap_free(&dev->empress_tsq);
119 dev->empress_users--; 116 dev->empress_users--;
120 117
diff --git a/drivers/media/video/saa7134/saa7134-video.c b/drivers/media/video/saa7134/saa7134-video.c
index 3b9ffb4b648a..6396d9b5c063 100644
--- a/drivers/media/video/saa7134/saa7134-video.c
+++ b/drivers/media/video/saa7134/saa7134-video.c
@@ -1445,10 +1445,7 @@ static int video_release(struct inode *inode, struct file *file)
1445 1445
1446 /* stop vbi capture */ 1446 /* stop vbi capture */
1447 if (res_check(fh, RESOURCE_VBI)) { 1447 if (res_check(fh, RESOURCE_VBI)) {
1448 if (fh->vbi.streaming) 1448 videobuf_stop(&fh->vbi);
1449 videobuf_streamoff(&fh->vbi);
1450 if (fh->vbi.reading)
1451 videobuf_read_stop(&fh->vbi);
1452 res_free(dev,fh,RESOURCE_VBI); 1449 res_free(dev,fh,RESOURCE_VBI);
1453 } 1450 }
1454 1451
diff --git a/drivers/media/video/tvp5150.c b/drivers/media/video/tvp5150.c
index 25d0aef88ef5..445eba4174d7 100644
--- a/drivers/media/video/tvp5150.c
+++ b/drivers/media/video/tvp5150.c
@@ -290,6 +290,7 @@ static inline void tvp5150_selmux(struct i2c_client *c)
290 int opmode=0; 290 int opmode=0;
291 struct tvp5150 *decoder = i2c_get_clientdata(c); 291 struct tvp5150 *decoder = i2c_get_clientdata(c);
292 int input = 0; 292 int input = 0;
293 unsigned char val;
293 294
294 if ((decoder->route.output & TVP5150_BLACK_SCREEN) || !decoder->enable) 295 if ((decoder->route.output & TVP5150_BLACK_SCREEN) || !decoder->enable)
295 input = 8; 296 input = 8;
@@ -315,6 +316,16 @@ static inline void tvp5150_selmux(struct i2c_client *c)
315 316
316 tvp5150_write(c, TVP5150_OP_MODE_CTL, opmode); 317 tvp5150_write(c, TVP5150_OP_MODE_CTL, opmode);
317 tvp5150_write(c, TVP5150_VD_IN_SRC_SEL_1, input); 318 tvp5150_write(c, TVP5150_VD_IN_SRC_SEL_1, input);
319
320 /* Svideo should enable YCrCb output and disable GPCL output
321 * For Composite and TV, it should be the reverse
322 */
323 val = tvp5150_read(c, TVP5150_MISC_CTL);
324 if (decoder->route.input == TVP5150_SVIDEO)
325 val = (val & ~0x40) | 0x10;
326 else
327 val = (val & ~0x10) | 0x40;
328 tvp5150_write(c, TVP5150_MISC_CTL, val);
318}; 329};
319 330
320struct i2c_reg_value { 331struct i2c_reg_value {
diff --git a/drivers/media/video/videobuf-core.c b/drivers/media/video/videobuf-core.c
index 89a44f16f0ba..c8a5cb57963b 100644
--- a/drivers/media/video/videobuf-core.c
+++ b/drivers/media/video/videobuf-core.c
@@ -141,6 +141,7 @@ void videobuf_queue_core_init(struct videobuf_queue* q,
141 INIT_LIST_HEAD(&q->stream); 141 INIT_LIST_HEAD(&q->stream);
142} 142}
143 143
144/* Locking: Only usage in bttv unsafe find way to remove */
144int videobuf_queue_is_busy(struct videobuf_queue *q) 145int videobuf_queue_is_busy(struct videobuf_queue *q)
145{ 146{
146 int i; 147 int i;
@@ -178,6 +179,7 @@ int videobuf_queue_is_busy(struct videobuf_queue *q)
178 return 0; 179 return 0;
179} 180}
180 181
182/* Locking: Caller holds q->lock */
181void videobuf_queue_cancel(struct videobuf_queue *q) 183void videobuf_queue_cancel(struct videobuf_queue *q)
182{ 184{
183 unsigned long flags=0; 185 unsigned long flags=0;
@@ -208,6 +210,7 @@ void videobuf_queue_cancel(struct videobuf_queue *q)
208 210
209/* --------------------------------------------------------------------- */ 211/* --------------------------------------------------------------------- */
210 212
213/* Locking: Caller holds q->lock */
211enum v4l2_field videobuf_next_field(struct videobuf_queue *q) 214enum v4l2_field videobuf_next_field(struct videobuf_queue *q)
212{ 215{
213 enum v4l2_field field = q->field; 216 enum v4l2_field field = q->field;
@@ -226,6 +229,7 @@ enum v4l2_field videobuf_next_field(struct videobuf_queue *q)
226 return field; 229 return field;
227} 230}
228 231
232/* Locking: Caller holds q->lock */
229static void videobuf_status(struct videobuf_queue *q, struct v4l2_buffer *b, 233static void videobuf_status(struct videobuf_queue *q, struct v4l2_buffer *b,
230 struct videobuf_buffer *vb, enum v4l2_buf_type type) 234 struct videobuf_buffer *vb, enum v4l2_buf_type type)
231{ 235{
@@ -281,20 +285,108 @@ static void videobuf_status(struct videobuf_queue *q, struct v4l2_buffer *b,
281 b->sequence = vb->field_count >> 1; 285 b->sequence = vb->field_count >> 1;
282} 286}
283 287
288/* Locking: Caller holds q->lock */
289static int __videobuf_mmap_free(struct videobuf_queue *q)
290{
291 int i;
292 int rc;
293
294 if (!q)
295 return 0;
296
297 MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
298
299 rc = CALL(q,mmap_free,q);
300 if (rc<0)
301 return rc;
302
303 for (i = 0; i < VIDEO_MAX_FRAME; i++) {
304 if (NULL == q->bufs[i])
305 continue;
306 q->ops->buf_release(q,q->bufs[i]);
307 kfree(q->bufs[i]);
308 q->bufs[i] = NULL;
309 }
310
311 return rc;
312}
313
314int videobuf_mmap_free(struct videobuf_queue *q)
315{
316 int ret;
317 mutex_lock(&q->lock);
318 ret = __videobuf_mmap_free(q);
319 mutex_unlock(&q->lock);
320 return ret;
321}
322
323/* Locking: Caller holds q->lock */
324static int __videobuf_mmap_setup(struct videobuf_queue *q,
325 unsigned int bcount, unsigned int bsize,
326 enum v4l2_memory memory)
327{
328 unsigned int i;
329 int err;
330
331 MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
332
333 err = __videobuf_mmap_free(q);
334 if (0 != err)
335 return err;
336
337 /* Allocate and initialize buffers */
338 for (i = 0; i < bcount; i++) {
339 q->bufs[i] = videobuf_alloc(q);
340
341 if (q->bufs[i] == NULL)
342 break;
343
344 q->bufs[i]->i = i;
345 q->bufs[i]->input = UNSET;
346 q->bufs[i]->memory = memory;
347 q->bufs[i]->bsize = bsize;
348 switch (memory) {
349 case V4L2_MEMORY_MMAP:
350 q->bufs[i]->boff = bsize * i;
351 break;
352 case V4L2_MEMORY_USERPTR:
353 case V4L2_MEMORY_OVERLAY:
354 /* nothing */
355 break;
356 }
357 }
358
359 if (!i)
360 return -ENOMEM;
361
362 dprintk(1,"mmap setup: %d buffers, %d bytes each\n",
363 i, bsize);
364
365 return i;
366}
367
368int videobuf_mmap_setup(struct videobuf_queue *q,
369 unsigned int bcount, unsigned int bsize,
370 enum v4l2_memory memory)
371{
372 int ret;
373 mutex_lock(&q->lock);
374 ret = __videobuf_mmap_setup(q, bcount, bsize, memory);
375 mutex_unlock(&q->lock);
376 return ret;
377}
378
284int videobuf_reqbufs(struct videobuf_queue *q, 379int videobuf_reqbufs(struct videobuf_queue *q,
285 struct v4l2_requestbuffers *req) 380 struct v4l2_requestbuffers *req)
286{ 381{
287 unsigned int size,count; 382 unsigned int size,count;
288 int retval; 383 int retval;
289 384
290 if (req->type != q->type) {
291 dprintk(1,"reqbufs: queue type invalid\n");
292 return -EINVAL;
293 }
294 if (req->count < 1) { 385 if (req->count < 1) {
295 dprintk(1,"reqbufs: count invalid (%d)\n",req->count); 386 dprintk(1,"reqbufs: count invalid (%d)\n",req->count);
296 return -EINVAL; 387 return -EINVAL;
297 } 388 }
389
298 if (req->memory != V4L2_MEMORY_MMAP && 390 if (req->memory != V4L2_MEMORY_MMAP &&
299 req->memory != V4L2_MEMORY_USERPTR && 391 req->memory != V4L2_MEMORY_USERPTR &&
300 req->memory != V4L2_MEMORY_OVERLAY) { 392 req->memory != V4L2_MEMORY_OVERLAY) {
@@ -303,6 +395,12 @@ int videobuf_reqbufs(struct videobuf_queue *q,
303 } 395 }
304 396
305 mutex_lock(&q->lock); 397 mutex_lock(&q->lock);
398 if (req->type != q->type) {
399 dprintk(1,"reqbufs: queue type invalid\n");
400 retval = -EINVAL;
401 goto done;
402 }
403
306 if (q->streaming) { 404 if (q->streaming) {
307 dprintk(1,"reqbufs: streaming already exists\n"); 405 dprintk(1,"reqbufs: streaming already exists\n");
308 retval = -EBUSY; 406 retval = -EBUSY;
@@ -323,7 +421,7 @@ int videobuf_reqbufs(struct videobuf_queue *q,
323 dprintk(1,"reqbufs: bufs=%d, size=0x%x [%d pages total]\n", 421 dprintk(1,"reqbufs: bufs=%d, size=0x%x [%d pages total]\n",
324 count, size, (count*size)>>PAGE_SHIFT); 422 count, size, (count*size)>>PAGE_SHIFT);
325 423
326 retval = videobuf_mmap_setup(q,count,size,req->memory); 424 retval = __videobuf_mmap_setup(q,count,size,req->memory);
327 if (retval < 0) { 425 if (retval < 0) {
328 dprintk(1,"reqbufs: mmap setup returned %d\n",retval); 426 dprintk(1,"reqbufs: mmap setup returned %d\n",retval);
329 goto done; 427 goto done;
@@ -338,20 +436,28 @@ int videobuf_reqbufs(struct videobuf_queue *q,
338 436
339int videobuf_querybuf(struct videobuf_queue *q, struct v4l2_buffer *b) 437int videobuf_querybuf(struct videobuf_queue *q, struct v4l2_buffer *b)
340{ 438{
439 int ret = -EINVAL;
440
441 mutex_lock(&q->lock);
341 if (unlikely(b->type != q->type)) { 442 if (unlikely(b->type != q->type)) {
342 dprintk(1,"querybuf: Wrong type.\n"); 443 dprintk(1,"querybuf: Wrong type.\n");
343 return -EINVAL; 444 goto done;
344 } 445 }
345 if (unlikely(b->index < 0 || b->index >= VIDEO_MAX_FRAME)) { 446 if (unlikely(b->index < 0 || b->index >= VIDEO_MAX_FRAME)) {
346 dprintk(1,"querybuf: index out of range.\n"); 447 dprintk(1,"querybuf: index out of range.\n");
347 return -EINVAL; 448 goto done;
348 } 449 }
349 if (unlikely(NULL == q->bufs[b->index])) { 450 if (unlikely(NULL == q->bufs[b->index])) {
350 dprintk(1,"querybuf: buffer is null.\n"); 451 dprintk(1,"querybuf: buffer is null.\n");
351 return -EINVAL; 452 goto done;
352 } 453 }
454
353 videobuf_status(q,b,q->bufs[b->index],q->type); 455 videobuf_status(q,b,q->bufs[b->index],q->type);
354 return 0; 456
457 ret = 0;
458done:
459 mutex_unlock(&q->lock);
460 return ret;
355} 461}
356 462
357int videobuf_qbuf(struct videobuf_queue *q, 463int videobuf_qbuf(struct videobuf_queue *q,
@@ -541,22 +647,30 @@ int videobuf_streamon(struct videobuf_queue *q)
541 return retval; 647 return retval;
542} 648}
543 649
544int videobuf_streamoff(struct videobuf_queue *q) 650/* Locking: Caller holds q->lock */
651static int __videobuf_streamoff(struct videobuf_queue *q)
545{ 652{
546 int retval = -EINVAL;
547
548 mutex_lock(&q->lock);
549 if (!q->streaming) 653 if (!q->streaming)
550 goto done; 654 return -EINVAL;
655
551 videobuf_queue_cancel(q); 656 videobuf_queue_cancel(q);
552 q->streaming = 0; 657 q->streaming = 0;
553 retval = 0;
554 658
555 done: 659 return 0;
660}
661
662int videobuf_streamoff(struct videobuf_queue *q)
663{
664 int retval;
665
666 mutex_lock(&q->lock);
667 retval = __videobuf_streamoff(q);
556 mutex_unlock(&q->lock); 668 mutex_unlock(&q->lock);
669
557 return retval; 670 return retval;
558} 671}
559 672
673/* Locking: Caller holds q->lock */
560static ssize_t videobuf_read_zerocopy(struct videobuf_queue *q, 674static ssize_t videobuf_read_zerocopy(struct videobuf_queue *q,
561 char __user *data, 675 char __user *data,
562 size_t count, loff_t *ppos) 676 size_t count, loff_t *ppos)
@@ -691,7 +805,8 @@ ssize_t videobuf_read_one(struct videobuf_queue *q,
691 return retval; 805 return retval;
692} 806}
693 807
694int videobuf_read_start(struct videobuf_queue *q) 808/* Locking: Caller holds q->lock */
809int __videobuf_read_start(struct videobuf_queue *q)
695{ 810{
696 enum v4l2_field field; 811 enum v4l2_field field;
697 unsigned long flags=0; 812 unsigned long flags=0;
@@ -705,7 +820,7 @@ int videobuf_read_start(struct videobuf_queue *q)
705 count = VIDEO_MAX_FRAME; 820 count = VIDEO_MAX_FRAME;
706 size = PAGE_ALIGN(size); 821 size = PAGE_ALIGN(size);
707 822
708 err = videobuf_mmap_setup(q, count, size, V4L2_MEMORY_USERPTR); 823 err = __videobuf_mmap_setup(q, count, size, V4L2_MEMORY_USERPTR);
709 if (err < 0) 824 if (err < 0)
710 return err; 825 return err;
711 826
@@ -728,12 +843,13 @@ int videobuf_read_start(struct videobuf_queue *q)
728 return 0; 843 return 0;
729} 844}
730 845
731void videobuf_read_stop(struct videobuf_queue *q) 846static void __videobuf_read_stop(struct videobuf_queue *q)
732{ 847{
733 int i; 848 int i;
734 849
850
735 videobuf_queue_cancel(q); 851 videobuf_queue_cancel(q);
736 videobuf_mmap_free(q); 852 __videobuf_mmap_free(q);
737 INIT_LIST_HEAD(&q->stream); 853 INIT_LIST_HEAD(&q->stream);
738 for (i = 0; i < VIDEO_MAX_FRAME; i++) { 854 for (i = 0; i < VIDEO_MAX_FRAME; i++) {
739 if (NULL == q->bufs[i]) 855 if (NULL == q->bufs[i])
@@ -743,8 +859,41 @@ void videobuf_read_stop(struct videobuf_queue *q)
743 } 859 }
744 q->read_buf = NULL; 860 q->read_buf = NULL;
745 q->reading = 0; 861 q->reading = 0;
862
746} 863}
747 864
865int videobuf_read_start(struct videobuf_queue *q)
866{
867 int rc;
868
869 mutex_lock(&q->lock);
870 rc = __videobuf_read_start(q);
871 mutex_unlock(&q->lock);
872
873 return rc;
874}
875
876void videobuf_read_stop(struct videobuf_queue *q)
877{
878 mutex_lock(&q->lock);
879 __videobuf_read_stop(q);
880 mutex_unlock(&q->lock);
881}
882
883void videobuf_stop(struct videobuf_queue *q)
884{
885 mutex_lock(&q->lock);
886
887 if (q->streaming)
888 __videobuf_streamoff(q);
889
890 if (q->reading)
891 __videobuf_read_stop(q);
892
893 mutex_unlock(&q->lock);
894}
895
896
748ssize_t videobuf_read_stream(struct videobuf_queue *q, 897ssize_t videobuf_read_stream(struct videobuf_queue *q,
749 char __user *data, size_t count, loff_t *ppos, 898 char __user *data, size_t count, loff_t *ppos,
750 int vbihack, int nonblocking) 899 int vbihack, int nonblocking)
@@ -760,7 +909,7 @@ ssize_t videobuf_read_stream(struct videobuf_queue *q,
760 if (q->streaming) 909 if (q->streaming)
761 goto done; 910 goto done;
762 if (!q->reading) { 911 if (!q->reading) {
763 retval = videobuf_read_start(q); 912 retval = __videobuf_read_start(q);
764 if (retval < 0) 913 if (retval < 0)
765 goto done; 914 goto done;
766 } 915 }
@@ -833,7 +982,7 @@ unsigned int videobuf_poll_stream(struct file *file,
833 struct videobuf_buffer, stream); 982 struct videobuf_buffer, stream);
834 } else { 983 } else {
835 if (!q->reading) 984 if (!q->reading)
836 videobuf_read_start(q); 985 __videobuf_read_start(q);
837 if (!q->reading) { 986 if (!q->reading) {
838 rc = POLLERR; 987 rc = POLLERR;
839 } else if (NULL == q->read_buf) { 988 } else if (NULL == q->read_buf) {
@@ -858,75 +1007,6 @@ unsigned int videobuf_poll_stream(struct file *file,
858 return rc; 1007 return rc;
859} 1008}
860 1009
861int videobuf_mmap_setup(struct videobuf_queue *q,
862 unsigned int bcount, unsigned int bsize,
863 enum v4l2_memory memory)
864{
865 unsigned int i;
866 int err;
867
868 MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
869
870 err = videobuf_mmap_free(q);
871 if (0 != err)
872 return err;
873
874 /* Allocate and initialize buffers */
875 for (i = 0; i < bcount; i++) {
876 q->bufs[i] = videobuf_alloc(q);
877
878 if (q->bufs[i] == NULL)
879 break;
880
881 q->bufs[i]->i = i;
882 q->bufs[i]->input = UNSET;
883 q->bufs[i]->memory = memory;
884 q->bufs[i]->bsize = bsize;
885 switch (memory) {
886 case V4L2_MEMORY_MMAP:
887 q->bufs[i]->boff = bsize * i;
888 break;
889 case V4L2_MEMORY_USERPTR:
890 case V4L2_MEMORY_OVERLAY:
891 /* nothing */
892 break;
893 }
894 }
895
896 if (!i)
897 return -ENOMEM;
898
899 dprintk(1,"mmap setup: %d buffers, %d bytes each\n",
900 i, bsize);
901
902 return i;
903}
904
905int videobuf_mmap_free(struct videobuf_queue *q)
906{
907 int i;
908 int rc;
909
910 if (!q)
911 return 0;
912
913 MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
914
915 rc = CALL(q,mmap_free,q);
916 if (rc<0)
917 return rc;
918
919 for (i = 0; i < VIDEO_MAX_FRAME; i++) {
920 if (NULL == q->bufs[i])
921 continue;
922 q->ops->buf_release(q,q->bufs[i]);
923 kfree(q->bufs[i]);
924 q->bufs[i] = NULL;
925 }
926
927 return rc;
928}
929
930int videobuf_mmap_mapper(struct videobuf_queue *q, 1010int videobuf_mmap_mapper(struct videobuf_queue *q,
931 struct vm_area_struct *vma) 1011 struct vm_area_struct *vma)
932{ 1012{
@@ -991,6 +1071,7 @@ EXPORT_SYMBOL_GPL(videobuf_streamoff);
991 1071
992EXPORT_SYMBOL_GPL(videobuf_read_start); 1072EXPORT_SYMBOL_GPL(videobuf_read_start);
993EXPORT_SYMBOL_GPL(videobuf_read_stop); 1073EXPORT_SYMBOL_GPL(videobuf_read_stop);
1074EXPORT_SYMBOL_GPL(videobuf_stop);
994EXPORT_SYMBOL_GPL(videobuf_read_stream); 1075EXPORT_SYMBOL_GPL(videobuf_read_stream);
995EXPORT_SYMBOL_GPL(videobuf_read_one); 1076EXPORT_SYMBOL_GPL(videobuf_read_one);
996EXPORT_SYMBOL_GPL(videobuf_poll_stream); 1077EXPORT_SYMBOL_GPL(videobuf_poll_stream);
diff --git a/drivers/media/video/videobuf-vmalloc.c b/drivers/media/video/videobuf-vmalloc.c
index cd74341c984f..e01259438bb2 100644
--- a/drivers/media/video/videobuf-vmalloc.c
+++ b/drivers/media/video/videobuf-vmalloc.c
@@ -51,7 +51,7 @@ videobuf_vm_open(struct vm_area_struct *vma)
51{ 51{
52 struct videobuf_mapping *map = vma->vm_private_data; 52 struct videobuf_mapping *map = vma->vm_private_data;
53 53
54 dprintk(2,"vm_open %p [count=%d,vma=%08lx-%08lx]\n",map, 54 dprintk(2,"vm_open %p [count=%u,vma=%08lx-%08lx]\n",map,
55 map->count,vma->vm_start,vma->vm_end); 55 map->count,vma->vm_start,vma->vm_end);
56 56
57 map->count++; 57 map->count++;
@@ -64,7 +64,7 @@ videobuf_vm_close(struct vm_area_struct *vma)
64 struct videobuf_queue *q = map->q; 64 struct videobuf_queue *q = map->q;
65 int i; 65 int i;
66 66
67 dprintk(2,"vm_close %p [count=%d,vma=%08lx-%08lx]\n",map, 67 dprintk(2,"vm_close %p [count=%u,vma=%08lx-%08lx]\n",map,
68 map->count,vma->vm_start,vma->vm_end); 68 map->count,vma->vm_start,vma->vm_end);
69 69
70 map->count--; 70 map->count--;
@@ -221,7 +221,7 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q,
221 } 221 }
222 222
223 /* create mapping + update buffer list */ 223 /* create mapping + update buffer list */
224 map = q->bufs[first]->map = kmalloc(sizeof(struct videobuf_mapping),GFP_KERNEL); 224 map = q->bufs[first]->map = kzalloc(sizeof(struct videobuf_mapping),GFP_KERNEL);
225 if (NULL == map) 225 if (NULL == map)
226 return -ENOMEM; 226 return -ENOMEM;
227 227
diff --git a/drivers/media/video/vivi.c b/drivers/media/video/vivi.c
index ee73dc75131c..9b54ff9d2e36 100644
--- a/drivers/media/video/vivi.c
+++ b/drivers/media/video/vivi.c
@@ -1076,6 +1076,7 @@ static int vivi_release(struct inode *inode, struct file *file)
1076 int minor = iminor(inode); 1076 int minor = iminor(inode);
1077 1077
1078 vivi_stop_thread(vidq); 1078 vivi_stop_thread(vidq);
1079 videobuf_stop(&fh->vb_vidq);
1079 videobuf_mmap_free(&fh->vb_vidq); 1080 videobuf_mmap_free(&fh->vb_vidq);
1080 1081
1081 kfree (fh); 1082 kfree (fh);