diff options
Diffstat (limited to 'drivers/media')
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 | ||
5 | obj-y := common/ | 5 | obj-y := common/ |
6 | obj-$(CONFIG_VIDEO_DEV) += video/ | 6 | obj-y += video/ |
7 | obj-$(CONFIG_VIDEO_DEV) += radio/ | 7 | obj-$(CONFIG_VIDEO_DEV) += radio/ |
8 | obj-$(CONFIG_DVB_CORE) += dvb/ | 8 | obj-$(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 | |||
62 | obj-$(CONFIG_DVB_USB_AF9005_REMOTE) += dvb-usb-af9005-remote.o | 62 | obj-$(CONFIG_DVB_USB_AF9005_REMOTE) += dvb-usb-af9005-remote.o |
63 | 63 | ||
64 | EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/ | 64 | EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/ |
65 | # due to tuner-xc3028 | ||
66 | EXTRA_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 | |||
226 | static struct dib3000mc_config mod3000p_dib3000p_config = { | 229 | static 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 | } |
307 | EXPORT_SYMBOL(dibusb_dib3000mc_tuner_attach); | 310 | EXPORT_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 | ||
306 | static int bt866_found_proc(struct i2c_adapter *adapter, | 305 | static 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 | ||
5083 | void __devinit bttv_check_chipset(void) | 5083 | void __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 | ||
4991 | static int bttv_init_module(void) | 4988 | static 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 | ||
5024 | static void bttv_cleanup_module(void) | 5021 | static 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 | ||
576 | static struct vm_operations_struct em28xx_vm_ops = { | 579 | static 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 */ |
709 | int __devinit init_ivtv_i2c(struct ivtv *itv) | 709 | int 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 | |||
35 | void ivtv_call_i2c_clients(struct ivtv *itv, unsigned int cmd, void *arg); | 35 | void 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 */ |
38 | int __devinit init_ivtv_i2c(struct ivtv *itv); | 38 | int init_ivtv_i2c(struct ivtv *itv); |
39 | void exit_ivtv_i2c(struct ivtv *itv); | 39 | void 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 | ||
320 | struct i2c_reg_value { | 331 | struct 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 */ | ||
144 | int videobuf_queue_is_busy(struct videobuf_queue *q) | 145 | int 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 */ | ||
181 | void videobuf_queue_cancel(struct videobuf_queue *q) | 183 | void 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 */ | ||
211 | enum v4l2_field videobuf_next_field(struct videobuf_queue *q) | 214 | enum 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 */ | ||
229 | static void videobuf_status(struct videobuf_queue *q, struct v4l2_buffer *b, | 233 | static 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 */ | ||
289 | static 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 | |||
314 | int 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 */ | ||
324 | static 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 | |||
368 | int 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 | |||
284 | int videobuf_reqbufs(struct videobuf_queue *q, | 379 | int 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 | ||
339 | int videobuf_querybuf(struct videobuf_queue *q, struct v4l2_buffer *b) | 437 | int 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; | ||
458 | done: | ||
459 | mutex_unlock(&q->lock); | ||
460 | return ret; | ||
355 | } | 461 | } |
356 | 462 | ||
357 | int videobuf_qbuf(struct videobuf_queue *q, | 463 | int 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 | ||
544 | int videobuf_streamoff(struct videobuf_queue *q) | 650 | /* Locking: Caller holds q->lock */ |
651 | static 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 | |||
662 | int 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 */ | ||
560 | static ssize_t videobuf_read_zerocopy(struct videobuf_queue *q, | 674 | static 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 | ||
694 | int videobuf_read_start(struct videobuf_queue *q) | 808 | /* Locking: Caller holds q->lock */ |
809 | int __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 | ||
731 | void videobuf_read_stop(struct videobuf_queue *q) | 846 | static 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 | ||
865 | int 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 | |||
876 | void 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 | |||
883 | void 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 | |||
748 | ssize_t videobuf_read_stream(struct videobuf_queue *q, | 897 | ssize_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 | ||
861 | int 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 | |||
905 | int 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 | |||
930 | int videobuf_mmap_mapper(struct videobuf_queue *q, | 1010 | int 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 | ||
992 | EXPORT_SYMBOL_GPL(videobuf_read_start); | 1072 | EXPORT_SYMBOL_GPL(videobuf_read_start); |
993 | EXPORT_SYMBOL_GPL(videobuf_read_stop); | 1073 | EXPORT_SYMBOL_GPL(videobuf_read_stop); |
1074 | EXPORT_SYMBOL_GPL(videobuf_stop); | ||
994 | EXPORT_SYMBOL_GPL(videobuf_read_stream); | 1075 | EXPORT_SYMBOL_GPL(videobuf_read_stream); |
995 | EXPORT_SYMBOL_GPL(videobuf_read_one); | 1076 | EXPORT_SYMBOL_GPL(videobuf_read_one); |
996 | EXPORT_SYMBOL_GPL(videobuf_poll_stream); | 1077 | EXPORT_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); |