diff options
| author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-08-02 14:07:29 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-08-02 14:07:29 -0400 |
| commit | a205729e2cd8e51257cd0ea738524c64da99b9e0 (patch) | |
| tree | 22108eebc4097e906f35eb27b4f0daa1a7f2bd2b | |
| parent | 49b1e3ea19b1c95c2f012b8331ffb3b169e4c042 (diff) | |
| parent | ddecbe112b057c333a8e055fb417451a02b9df78 (diff) | |
Merge master.kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb
* master.kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb: (26 commits)
V4L/DVB (4380): Bttv: Revert VBI_OFFSET to previous value, it works better
V4L/DVB (4379): Videodev: Check return value of class_device_register() correctly
V4L/DVB (4373): Correctly handle sysfs error leg file removal in pvrusb2
V4L/DVB (4368): Bttv: use class_device_create_file and handle errors
V4L/DVB (4367): Videodev: Handle class_device related errors
V4L/DVB (4365): OVERLAY flag were enabled by mistake
V4L/DVB (4344): Fix broken dependencies on media Kconfig
V4L/DVB (4343): Fix for compilation without V4L1 or V4L1_COMPAT
V4L/DVB (4342): Fix ext_controls align on 64 bit architectures
V4L/DVB (4341): VIDIOCSMICROCODE were missing on compat_ioctl32
V4L/DVB (4322): Fix dvb-pll autoprobing
V4L/DVB (4311): Fix possible dvb-pll oops
V4L/DVB (4337): Refine dead code elimination in pvrusb2
V4L/DVB (4323): [budget/budget-av/budget-ci/budget-patch drivers] fixed DMA start/stop code
V4L/DVB (4316): Check __must_check warnings
V4L/DVB (4314): Set the Auxiliary Byte when tuning LG H06xF in analog mode
V4L/DVB (4313): Bugfix for keycode calculation on NPG remotes
V4L/DVB (4310): Saa7134: rename dmasound_{init, exit}
V4L/DVB (4306): Support non interlaced capture by default for saa713x
V4L/DVB (4298): Check all __must_check warnings in bttv.
...
39 files changed, 354 insertions, 143 deletions
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c index 59ac35ddd51e..57b34cda99f5 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c | |||
| @@ -526,7 +526,9 @@ static int dvb_frontend_thread(void *data) | |||
| 526 | fepriv->delay = 3*HZ; | 526 | fepriv->delay = 3*HZ; |
| 527 | fepriv->status = 0; | 527 | fepriv->status = 0; |
| 528 | fepriv->wakeup = 0; | 528 | fepriv->wakeup = 0; |
| 529 | fepriv->reinitialise = 1; | 529 | fepriv->reinitialise = 0; |
| 530 | |||
| 531 | dvb_frontend_init(fe); | ||
| 530 | 532 | ||
| 531 | while (1) { | 533 | while (1) { |
| 532 | up(&fepriv->sem); /* is locked when we enter the thread... */ | 534 | up(&fepriv->sem); /* is locked when we enter the thread... */ |
| @@ -1013,17 +1015,18 @@ static int dvb_frontend_open(struct inode *inode, struct file *file) | |||
| 1013 | return ret; | 1015 | return ret; |
| 1014 | 1016 | ||
| 1015 | if ((file->f_flags & O_ACCMODE) != O_RDONLY) { | 1017 | if ((file->f_flags & O_ACCMODE) != O_RDONLY) { |
| 1018 | |||
| 1019 | /* normal tune mode when opened R/W */ | ||
| 1020 | fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT; | ||
| 1021 | fepriv->tone = -1; | ||
| 1022 | fepriv->voltage = -1; | ||
| 1023 | |||
| 1016 | ret = dvb_frontend_start (fe); | 1024 | ret = dvb_frontend_start (fe); |
| 1017 | if (ret) | 1025 | if (ret) |
| 1018 | dvb_generic_release (inode, file); | 1026 | dvb_generic_release (inode, file); |
| 1019 | 1027 | ||
| 1020 | /* empty event queue */ | 1028 | /* empty event queue */ |
| 1021 | fepriv->events.eventr = fepriv->events.eventw = 0; | 1029 | fepriv->events.eventr = fepriv->events.eventw = 0; |
| 1022 | |||
| 1023 | /* normal tune mode when opened R/W */ | ||
| 1024 | fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT; | ||
| 1025 | fepriv->tone = -1; | ||
| 1026 | fepriv->voltage = -1; | ||
| 1027 | } | 1030 | } |
| 1028 | 1031 | ||
| 1029 | return ret; | 1032 | return ret; |
diff --git a/drivers/media/dvb/frontends/dvb-pll.c b/drivers/media/dvb/frontends/dvb-pll.c index a189683454b7..2be33f27c69f 100644 --- a/drivers/media/dvb/frontends/dvb-pll.c +++ b/drivers/media/dvb/frontends/dvb-pll.c | |||
| @@ -194,11 +194,11 @@ struct dvb_pll_desc dvb_pll_tda665x = { | |||
| 194 | { 253834000, 36249333, 166667, 0xca, 0x62 /* 011 0 0 0 10 */ }, | 194 | { 253834000, 36249333, 166667, 0xca, 0x62 /* 011 0 0 0 10 */ }, |
| 195 | { 383834000, 36249333, 166667, 0xca, 0xa2 /* 101 0 0 0 10 */ }, | 195 | { 383834000, 36249333, 166667, 0xca, 0xa2 /* 101 0 0 0 10 */ }, |
| 196 | { 443834000, 36249333, 166667, 0xca, 0xc2 /* 110 0 0 0 10 */ }, | 196 | { 443834000, 36249333, 166667, 0xca, 0xc2 /* 110 0 0 0 10 */ }, |
| 197 | { 444000000, 36249333, 166667, 0xca, 0xc3 /* 110 0 0 0 11 */ }, | 197 | { 444000000, 36249333, 166667, 0xca, 0xc4 /* 110 0 0 1 00 */ }, |
| 198 | { 583834000, 36249333, 166667, 0xca, 0x63 /* 011 0 0 0 11 */ }, | 198 | { 583834000, 36249333, 166667, 0xca, 0x64 /* 011 0 0 1 00 */ }, |
| 199 | { 793834000, 36249333, 166667, 0xca, 0xa3 /* 101 0 0 0 11 */ }, | 199 | { 793834000, 36249333, 166667, 0xca, 0xa4 /* 101 0 0 1 00 */ }, |
| 200 | { 444834000, 36249333, 166667, 0xca, 0xc3 /* 110 0 0 0 11 */ }, | 200 | { 444834000, 36249333, 166667, 0xca, 0xc4 /* 110 0 0 1 00 */ }, |
| 201 | { 861000000, 36249333, 166667, 0xca, 0xe3 /* 111 0 0 0 11 */ }, | 201 | { 861000000, 36249333, 166667, 0xca, 0xe4 /* 111 0 0 1 00 */ }, |
| 202 | } | 202 | } |
| 203 | }; | 203 | }; |
| 204 | EXPORT_SYMBOL(dvb_pll_tda665x); | 204 | EXPORT_SYMBOL(dvb_pll_tda665x); |
| @@ -613,7 +613,21 @@ static struct dvb_tuner_ops dvb_pll_tuner_ops = { | |||
| 613 | 613 | ||
| 614 | int dvb_pll_attach(struct dvb_frontend *fe, int pll_addr, struct i2c_adapter *i2c, struct dvb_pll_desc *desc) | 614 | int dvb_pll_attach(struct dvb_frontend *fe, int pll_addr, struct i2c_adapter *i2c, struct dvb_pll_desc *desc) |
| 615 | { | 615 | { |
| 616 | u8 b1 [] = { 0 }; | ||
| 617 | struct i2c_msg msg = { .addr = pll_addr, .flags = I2C_M_RD, .buf = b1, .len = 1 }; | ||
| 616 | struct dvb_pll_priv *priv = NULL; | 618 | struct dvb_pll_priv *priv = NULL; |
| 619 | int ret; | ||
| 620 | |||
| 621 | if (i2c != NULL) { | ||
| 622 | if (fe->ops.i2c_gate_ctrl) | ||
| 623 | fe->ops.i2c_gate_ctrl(fe, 1); | ||
| 624 | |||
| 625 | ret = i2c_transfer (i2c, &msg, 1); | ||
| 626 | if (ret != 1) | ||
| 627 | return -1; | ||
| 628 | if (fe->ops.i2c_gate_ctrl) | ||
| 629 | fe->ops.i2c_gate_ctrl(fe, 0); | ||
| 630 | } | ||
| 617 | 631 | ||
| 618 | priv = kzalloc(sizeof(struct dvb_pll_priv), GFP_KERNEL); | 632 | priv = kzalloc(sizeof(struct dvb_pll_priv), GFP_KERNEL); |
| 619 | if (priv == NULL) | 633 | if (priv == NULL) |
diff --git a/drivers/media/dvb/ttpci/av7110.c b/drivers/media/dvb/ttpci/av7110.c index 500f15c10aaf..4506165c5de2 100644 --- a/drivers/media/dvb/ttpci/av7110.c +++ b/drivers/media/dvb/ttpci/av7110.c | |||
| @@ -2203,8 +2203,8 @@ static int frontend_init(struct av7110 *av7110) | |||
| 2203 | av7110->fe->ops.tuner_ops.set_params = nexusca_stv0297_tuner_set_params; | 2203 | av7110->fe->ops.tuner_ops.set_params = nexusca_stv0297_tuner_set_params; |
| 2204 | 2204 | ||
| 2205 | /* set TDA9819 into DVB mode */ | 2205 | /* set TDA9819 into DVB mode */ |
| 2206 | saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9198 pin9(STD) | 2206 | saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD) |
| 2207 | saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9198 pin30(VIF) | 2207 | saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF) |
| 2208 | 2208 | ||
| 2209 | /* tuner on this needs a slower i2c bus speed */ | 2209 | /* tuner on this needs a slower i2c bus speed */ |
| 2210 | av7110->dev->i2c_bitrate = SAA7146_I2C_BUS_BIT_RATE_240; | 2210 | av7110->dev->i2c_bitrate = SAA7146_I2C_BUS_BIT_RATE_240; |
diff --git a/drivers/media/dvb/ttpci/av7110_v4l.c b/drivers/media/dvb/ttpci/av7110_v4l.c index 64055461559d..6ffe53fdcf57 100644 --- a/drivers/media/dvb/ttpci/av7110_v4l.c +++ b/drivers/media/dvb/ttpci/av7110_v4l.c | |||
| @@ -272,8 +272,8 @@ static int av7110_dvb_c_switch(struct saa7146_fh *fh) | |||
| 272 | if (ves1820_writereg(dev, 0x09, 0x0f, 0x60)) | 272 | if (ves1820_writereg(dev, 0x09, 0x0f, 0x60)) |
| 273 | dprintk(1, "setting band in demodulator failed.\n"); | 273 | dprintk(1, "setting band in demodulator failed.\n"); |
| 274 | } else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) { | 274 | } else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) { |
| 275 | saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // TDA9198 pin9(STD) | 275 | saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // TDA9819 pin9(STD) |
| 276 | saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); // TDA9198 pin30(VIF) | 276 | saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); // TDA9819 pin30(VIF) |
| 277 | } | 277 | } |
| 278 | if (i2c_writereg(av7110, 0x48, 0x02, 0xd0) != 1) | 278 | if (i2c_writereg(av7110, 0x48, 0x02, 0xd0) != 1) |
| 279 | dprintk(1, "saa7113 write failed @ card %d", av7110->dvb_adapter.num); | 279 | dprintk(1, "saa7113 write failed @ card %d", av7110->dvb_adapter.num); |
| @@ -308,8 +308,8 @@ static int av7110_dvb_c_switch(struct saa7146_fh *fh) | |||
| 308 | if (ves1820_writereg(dev, 0x09, 0x0f, 0x20)) | 308 | if (ves1820_writereg(dev, 0x09, 0x0f, 0x20)) |
| 309 | dprintk(1, "setting band in demodulator failed.\n"); | 309 | dprintk(1, "setting band in demodulator failed.\n"); |
| 310 | } else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) { | 310 | } else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) { |
| 311 | saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTLO); // TDA9198 pin9(STD) | 311 | saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD) |
| 312 | saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // TDA9198 pin30(VIF) | 312 | saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF) |
| 313 | } | 313 | } |
| 314 | } | 314 | } |
| 315 | 315 | ||
| @@ -750,8 +750,8 @@ int av7110_init_analog_module(struct av7110 *av7110) | |||
| 750 | if (ves1820_writereg(av7110->dev, 0x09, 0x0f, 0x20)) | 750 | if (ves1820_writereg(av7110->dev, 0x09, 0x0f, 0x20)) |
| 751 | dprintk(1, "setting band in demodulator failed.\n"); | 751 | dprintk(1, "setting band in demodulator failed.\n"); |
| 752 | } else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) { | 752 | } else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) { |
| 753 | saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9198 pin9(STD) | 753 | saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD) |
| 754 | saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9198 pin30(VIF) | 754 | saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF) |
| 755 | } | 755 | } |
| 756 | 756 | ||
| 757 | /* init the saa7113 */ | 757 | /* init the saa7113 */ |
diff --git a/drivers/media/dvb/ttpci/budget-av.c b/drivers/media/dvb/ttpci/budget-av.c index 5f111d407730..2d21fec23b4d 100644 --- a/drivers/media/dvb/ttpci/budget-av.c +++ b/drivers/media/dvb/ttpci/budget-av.c | |||
| @@ -1303,6 +1303,9 @@ static int budget_av_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio | |||
| 1303 | budget_av->budget.dvb_adapter.priv = budget_av; | 1303 | budget_av->budget.dvb_adapter.priv = budget_av; |
| 1304 | frontend_init(budget_av); | 1304 | frontend_init(budget_av); |
| 1305 | ciintf_init(budget_av); | 1305 | ciintf_init(budget_av); |
| 1306 | |||
| 1307 | ttpci_budget_init_hooks(&budget_av->budget); | ||
| 1308 | |||
| 1306 | return 0; | 1309 | return 0; |
| 1307 | } | 1310 | } |
| 1308 | 1311 | ||
diff --git a/drivers/media/dvb/ttpci/budget-ci.c b/drivers/media/dvb/ttpci/budget-ci.c index 4b966eea3834..ffbbb3e34be4 100644 --- a/drivers/media/dvb/ttpci/budget-ci.c +++ b/drivers/media/dvb/ttpci/budget-ci.c | |||
| @@ -1101,6 +1101,8 @@ static int budget_ci_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio | |||
| 1101 | budget_ci->budget.dvb_adapter.priv = budget_ci; | 1101 | budget_ci->budget.dvb_adapter.priv = budget_ci; |
| 1102 | frontend_init(budget_ci); | 1102 | frontend_init(budget_ci); |
| 1103 | 1103 | ||
| 1104 | ttpci_budget_init_hooks(&budget_ci->budget); | ||
| 1105 | |||
| 1104 | return 0; | 1106 | return 0; |
| 1105 | } | 1107 | } |
| 1106 | 1108 | ||
diff --git a/drivers/media/dvb/ttpci/budget-core.c b/drivers/media/dvb/ttpci/budget-core.c index e4cf7775e07f..e15562f81664 100644 --- a/drivers/media/dvb/ttpci/budget-core.c +++ b/drivers/media/dvb/ttpci/budget-core.c | |||
| @@ -63,9 +63,6 @@ static int stop_ts_capture(struct budget *budget) | |||
| 63 | { | 63 | { |
| 64 | dprintk(2, "budget: %p\n", budget); | 64 | dprintk(2, "budget: %p\n", budget); |
| 65 | 65 | ||
| 66 | if (--budget->feeding) | ||
| 67 | return budget->feeding; | ||
| 68 | |||
| 69 | saa7146_write(budget->dev, MC1, MASK_20); // DMA3 off | 66 | saa7146_write(budget->dev, MC1, MASK_20); // DMA3 off |
| 70 | SAA7146_IER_DISABLE(budget->dev, MASK_10); | 67 | SAA7146_IER_DISABLE(budget->dev, MASK_10); |
| 71 | return 0; | 68 | return 0; |
| @@ -77,8 +74,8 @@ static int start_ts_capture(struct budget *budget) | |||
| 77 | 74 | ||
| 78 | dprintk(2, "budget: %p\n", budget); | 75 | dprintk(2, "budget: %p\n", budget); |
| 79 | 76 | ||
| 80 | if (budget->feeding) | 77 | if (!budget->feeding || !budget->fe_synced) |
| 81 | return ++budget->feeding; | 78 | return 0; |
| 82 | 79 | ||
| 83 | saa7146_write(dev, MC1, MASK_20); // DMA3 off | 80 | saa7146_write(dev, MC1, MASK_20); // DMA3 off |
| 84 | 81 | ||
| @@ -139,7 +136,33 @@ static int start_ts_capture(struct budget *budget) | |||
| 139 | SAA7146_IER_ENABLE(budget->dev, MASK_10); /* VPE */ | 136 | SAA7146_IER_ENABLE(budget->dev, MASK_10); /* VPE */ |
| 140 | saa7146_write(dev, MC1, (MASK_04 | MASK_20)); /* DMA3 on */ | 137 | saa7146_write(dev, MC1, (MASK_04 | MASK_20)); /* DMA3 on */ |
| 141 | 138 | ||
| 142 | return ++budget->feeding; | 139 | return 0; |
| 140 | } | ||
| 141 | |||
| 142 | static int budget_read_fe_status(struct dvb_frontend *fe, fe_status_t *status) | ||
| 143 | { | ||
| 144 | struct budget *budget = (struct budget *) fe->dvb->priv; | ||
| 145 | int synced; | ||
| 146 | int ret; | ||
| 147 | |||
| 148 | if (budget->read_fe_status) | ||
| 149 | ret = budget->read_fe_status(fe, status); | ||
| 150 | else | ||
| 151 | ret = -EINVAL; | ||
| 152 | |||
| 153 | if (!ret) { | ||
| 154 | synced = (*status & FE_HAS_LOCK); | ||
| 155 | if (synced != budget->fe_synced) { | ||
| 156 | budget->fe_synced = synced; | ||
| 157 | spin_lock(&budget->feedlock); | ||
| 158 | if (synced) | ||
| 159 | start_ts_capture(budget); | ||
| 160 | else | ||
| 161 | stop_ts_capture(budget); | ||
| 162 | spin_unlock(&budget->feedlock); | ||
| 163 | } | ||
| 164 | } | ||
| 165 | return ret; | ||
| 143 | } | 166 | } |
| 144 | 167 | ||
| 145 | static void vpeirq(unsigned long data) | 168 | static void vpeirq(unsigned long data) |
| @@ -267,7 +290,7 @@ static int budget_start_feed(struct dvb_demux_feed *feed) | |||
| 267 | { | 290 | { |
| 268 | struct dvb_demux *demux = feed->demux; | 291 | struct dvb_demux *demux = feed->demux; |
| 269 | struct budget *budget = (struct budget *) demux->priv; | 292 | struct budget *budget = (struct budget *) demux->priv; |
| 270 | int status; | 293 | int status = 0; |
| 271 | 294 | ||
| 272 | dprintk(2, "budget: %p\n", budget); | 295 | dprintk(2, "budget: %p\n", budget); |
| 273 | 296 | ||
| @@ -276,7 +299,8 @@ static int budget_start_feed(struct dvb_demux_feed *feed) | |||
| 276 | 299 | ||
| 277 | spin_lock(&budget->feedlock); | 300 | spin_lock(&budget->feedlock); |
| 278 | feed->pusi_seen = 0; /* have a clean section start */ | 301 | feed->pusi_seen = 0; /* have a clean section start */ |
| 279 | status = start_ts_capture(budget); | 302 | if (budget->feeding++ == 0) |
| 303 | status = start_ts_capture(budget); | ||
| 280 | spin_unlock(&budget->feedlock); | 304 | spin_unlock(&budget->feedlock); |
| 281 | return status; | 305 | return status; |
| 282 | } | 306 | } |
| @@ -285,12 +309,13 @@ static int budget_stop_feed(struct dvb_demux_feed *feed) | |||
| 285 | { | 309 | { |
| 286 | struct dvb_demux *demux = feed->demux; | 310 | struct dvb_demux *demux = feed->demux; |
| 287 | struct budget *budget = (struct budget *) demux->priv; | 311 | struct budget *budget = (struct budget *) demux->priv; |
| 288 | int status; | 312 | int status = 0; |
| 289 | 313 | ||
| 290 | dprintk(2, "budget: %p\n", budget); | 314 | dprintk(2, "budget: %p\n", budget); |
| 291 | 315 | ||
| 292 | spin_lock(&budget->feedlock); | 316 | spin_lock(&budget->feedlock); |
| 293 | status = stop_ts_capture(budget); | 317 | if (--budget->feeding == 0) |
| 318 | status = stop_ts_capture(budget); | ||
| 294 | spin_unlock(&budget->feedlock); | 319 | spin_unlock(&budget->feedlock); |
| 295 | return status; | 320 | return status; |
| 296 | } | 321 | } |
| @@ -470,6 +495,14 @@ err: | |||
| 470 | return ret; | 495 | return ret; |
| 471 | } | 496 | } |
| 472 | 497 | ||
| 498 | void ttpci_budget_init_hooks(struct budget *budget) | ||
| 499 | { | ||
| 500 | if (budget->dvb_frontend && !budget->read_fe_status) { | ||
| 501 | budget->read_fe_status = budget->dvb_frontend->ops.read_status; | ||
| 502 | budget->dvb_frontend->ops.read_status = budget_read_fe_status; | ||
| 503 | } | ||
| 504 | } | ||
| 505 | |||
| 473 | int ttpci_budget_deinit(struct budget *budget) | 506 | int ttpci_budget_deinit(struct budget *budget) |
| 474 | { | 507 | { |
| 475 | struct saa7146_dev *dev = budget->dev; | 508 | struct saa7146_dev *dev = budget->dev; |
| @@ -508,11 +541,8 @@ void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port) | |||
| 508 | spin_lock(&budget->feedlock); | 541 | spin_lock(&budget->feedlock); |
| 509 | budget->video_port = video_port; | 542 | budget->video_port = video_port; |
| 510 | if (budget->feeding) { | 543 | if (budget->feeding) { |
| 511 | int oldfeeding = budget->feeding; | ||
| 512 | budget->feeding = 1; | ||
| 513 | stop_ts_capture(budget); | 544 | stop_ts_capture(budget); |
| 514 | start_ts_capture(budget); | 545 | start_ts_capture(budget); |
| 515 | budget->feeding = oldfeeding; | ||
| 516 | } | 546 | } |
| 517 | spin_unlock(&budget->feedlock); | 547 | spin_unlock(&budget->feedlock); |
| 518 | } | 548 | } |
| @@ -520,6 +550,7 @@ void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port) | |||
| 520 | EXPORT_SYMBOL_GPL(ttpci_budget_debiread); | 550 | EXPORT_SYMBOL_GPL(ttpci_budget_debiread); |
| 521 | EXPORT_SYMBOL_GPL(ttpci_budget_debiwrite); | 551 | EXPORT_SYMBOL_GPL(ttpci_budget_debiwrite); |
| 522 | EXPORT_SYMBOL_GPL(ttpci_budget_init); | 552 | EXPORT_SYMBOL_GPL(ttpci_budget_init); |
| 553 | EXPORT_SYMBOL_GPL(ttpci_budget_init_hooks); | ||
| 523 | EXPORT_SYMBOL_GPL(ttpci_budget_deinit); | 554 | EXPORT_SYMBOL_GPL(ttpci_budget_deinit); |
| 524 | EXPORT_SYMBOL_GPL(ttpci_budget_irq10_handler); | 555 | EXPORT_SYMBOL_GPL(ttpci_budget_irq10_handler); |
| 525 | EXPORT_SYMBOL_GPL(ttpci_budget_set_video_port); | 556 | EXPORT_SYMBOL_GPL(ttpci_budget_set_video_port); |
diff --git a/drivers/media/dvb/ttpci/budget-patch.c b/drivers/media/dvb/ttpci/budget-patch.c index ee60ce90a400..57227441891e 100644 --- a/drivers/media/dvb/ttpci/budget-patch.c +++ b/drivers/media/dvb/ttpci/budget-patch.c | |||
| @@ -617,6 +617,8 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte | |||
| 617 | budget->dvb_adapter.priv = budget; | 617 | budget->dvb_adapter.priv = budget; |
| 618 | frontend_init(budget); | 618 | frontend_init(budget); |
| 619 | 619 | ||
| 620 | ttpci_budget_init_hooks(budget); | ||
| 621 | |||
| 620 | return 0; | 622 | return 0; |
| 621 | } | 623 | } |
| 622 | 624 | ||
diff --git a/drivers/media/dvb/ttpci/budget.c b/drivers/media/dvb/ttpci/budget.c index 35761f13c12b..863dffb4ed8e 100644 --- a/drivers/media/dvb/ttpci/budget.c +++ b/drivers/media/dvb/ttpci/budget.c | |||
| @@ -375,9 +375,6 @@ static void frontend_init(struct budget *budget) | |||
| 375 | if (budget->dvb_frontend) { | 375 | if (budget->dvb_frontend) { |
| 376 | budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; | 376 | budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; |
| 377 | budget->dvb_frontend->tuner_priv = &budget->i2c_adap; | 377 | budget->dvb_frontend->tuner_priv = &budget->i2c_adap; |
| 378 | budget->dvb_frontend->ops.diseqc_send_master_cmd = budget_diseqc_send_master_cmd; | ||
| 379 | budget->dvb_frontend->ops.diseqc_send_burst = budget_diseqc_send_burst; | ||
| 380 | budget->dvb_frontend->ops.set_tone = budget_set_tone; | ||
| 381 | break; | 378 | break; |
| 382 | } | 379 | } |
| 383 | break; | 380 | break; |
| @@ -474,6 +471,8 @@ static int budget_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_ | |||
| 474 | budget->dvb_adapter.priv = budget; | 471 | budget->dvb_adapter.priv = budget; |
| 475 | frontend_init(budget); | 472 | frontend_init(budget); |
| 476 | 473 | ||
| 474 | ttpci_budget_init_hooks(budget); | ||
| 475 | |||
| 477 | return 0; | 476 | return 0; |
| 478 | } | 477 | } |
| 479 | 478 | ||
diff --git a/drivers/media/dvb/ttpci/budget.h b/drivers/media/dvb/ttpci/budget.h index ecea3a13030e..e8a5c79178e1 100644 --- a/drivers/media/dvb/ttpci/budget.h +++ b/drivers/media/dvb/ttpci/budget.h | |||
| @@ -52,9 +52,6 @@ struct budget { | |||
| 52 | struct dmx_frontend hw_frontend; | 52 | struct dmx_frontend hw_frontend; |
| 53 | struct dmx_frontend mem_frontend; | 53 | struct dmx_frontend mem_frontend; |
| 54 | 54 | ||
| 55 | int fe_synced; | ||
| 56 | struct mutex pid_mutex; | ||
| 57 | |||
| 58 | int ci_present; | 55 | int ci_present; |
| 59 | int video_port; | 56 | int video_port; |
| 60 | 57 | ||
| @@ -74,6 +71,9 @@ struct budget { | |||
| 74 | 71 | ||
| 75 | struct dvb_adapter dvb_adapter; | 72 | struct dvb_adapter dvb_adapter; |
| 76 | struct dvb_frontend *dvb_frontend; | 73 | struct dvb_frontend *dvb_frontend; |
| 74 | int (*read_fe_status)(struct dvb_frontend *fe, fe_status_t *status); | ||
| 75 | int fe_synced; | ||
| 76 | |||
| 77 | void *priv; | 77 | void *priv; |
| 78 | }; | 78 | }; |
| 79 | 79 | ||
| @@ -106,6 +106,7 @@ static struct saa7146_pci_extension_data x_var = { \ | |||
| 106 | extern int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev, | 106 | extern int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev, |
| 107 | struct saa7146_pci_extension_data *info, | 107 | struct saa7146_pci_extension_data *info, |
| 108 | struct module *owner); | 108 | struct module *owner); |
| 109 | extern void ttpci_budget_init_hooks(struct budget *budget); | ||
| 109 | extern int ttpci_budget_deinit(struct budget *budget); | 110 | extern int ttpci_budget_deinit(struct budget *budget); |
| 110 | extern void ttpci_budget_irq10_handler(struct saa7146_dev *dev, u32 * isr); | 111 | extern void ttpci_budget_irq10_handler(struct saa7146_dev *dev, u32 * isr); |
| 111 | extern void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port); | 112 | extern void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port); |
diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig index 6d532f170ce5..fe56862d51e4 100644 --- a/drivers/media/video/Kconfig +++ b/drivers/media/video/Kconfig | |||
| @@ -145,7 +145,7 @@ config VIDEO_SAA5246A | |||
| 145 | 145 | ||
| 146 | config VIDEO_SAA5249 | 146 | config VIDEO_SAA5249 |
| 147 | tristate "SAA5249 Teletext processor" | 147 | tristate "SAA5249 Teletext processor" |
| 148 | depends on VIDEO_DEV && I2C | 148 | depends on VIDEO_DEV && I2C && VIDEO_V4L1 |
| 149 | help | 149 | help |
| 150 | Support for I2C bus based teletext using the SAA5249 chip. At the | 150 | Support for I2C bus based teletext using the SAA5249 chip. At the |
| 151 | moment this is only useful on some European WinTV cards. | 151 | moment this is only useful on some European WinTV cards. |
| @@ -155,7 +155,7 @@ config VIDEO_SAA5249 | |||
| 155 | 155 | ||
| 156 | config TUNER_3036 | 156 | config TUNER_3036 |
| 157 | tristate "SAB3036 tuner" | 157 | tristate "SAB3036 tuner" |
| 158 | depends on VIDEO_DEV && I2C | 158 | depends on VIDEO_DEV && I2C && VIDEO_V4L1 |
| 159 | help | 159 | help |
| 160 | Say Y here to include support for Philips SAB3036 compatible tuners. | 160 | Say Y here to include support for Philips SAB3036 compatible tuners. |
| 161 | If in doubt, say N. | 161 | If in doubt, say N. |
diff --git a/drivers/media/video/bt8xx/Kconfig b/drivers/media/video/bt8xx/Kconfig index 153f6a4a96c9..cdcf55650714 100644 --- a/drivers/media/video/bt8xx/Kconfig +++ b/drivers/media/video/bt8xx/Kconfig | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | config VIDEO_BT848 | 1 | config VIDEO_BT848 |
| 2 | tristate "BT848 Video For Linux" | 2 | tristate "BT848 Video For Linux" |
| 3 | depends on VIDEO_DEV && PCI && I2C && VIDEO_V4L2 | 3 | depends on VIDEO_DEV && PCI && I2C && VIDEO_V4L1 |
| 4 | select I2C_ALGOBIT | 4 | select I2C_ALGOBIT |
| 5 | select FW_LOADER | 5 | select FW_LOADER |
| 6 | select VIDEO_BTCX | 6 | select VIDEO_BTCX |
diff --git a/drivers/media/video/bt8xx/bttv-driver.c b/drivers/media/video/bt8xx/bttv-driver.c index 5764a89d3562..20dff7c316eb 100644 --- a/drivers/media/video/bt8xx/bttv-driver.c +++ b/drivers/media/video/bt8xx/bttv-driver.c | |||
| @@ -3923,7 +3923,12 @@ static int __devinit bttv_register_video(struct bttv *btv) | |||
| 3923 | goto err; | 3923 | goto err; |
| 3924 | printk(KERN_INFO "bttv%d: registered device video%d\n", | 3924 | printk(KERN_INFO "bttv%d: registered device video%d\n", |
| 3925 | btv->c.nr,btv->video_dev->minor & 0x1f); | 3925 | btv->c.nr,btv->video_dev->minor & 0x1f); |
| 3926 | video_device_create_file(btv->video_dev, &class_device_attr_card); | 3926 | if (class_device_create_file(&btv->video_dev->class_dev, |
| 3927 | &class_device_attr_card)<0) { | ||
| 3928 | printk(KERN_ERR "bttv%d: class_device_create_file 'card' " | ||
| 3929 | "failed\n", btv->c.nr); | ||
| 3930 | goto err; | ||
| 3931 | } | ||
| 3927 | 3932 | ||
| 3928 | /* vbi */ | 3933 | /* vbi */ |
| 3929 | btv->vbi_dev = vdev_init(btv, &bttv_vbi_template, "vbi"); | 3934 | btv->vbi_dev = vdev_init(btv, &bttv_vbi_template, "vbi"); |
| @@ -4287,6 +4292,8 @@ static struct pci_driver bttv_pci_driver = { | |||
| 4287 | 4292 | ||
| 4288 | static int bttv_init_module(void) | 4293 | static int bttv_init_module(void) |
| 4289 | { | 4294 | { |
| 4295 | int ret; | ||
| 4296 | |||
| 4290 | bttv_num = 0; | 4297 | bttv_num = 0; |
| 4291 | 4298 | ||
| 4292 | printk(KERN_INFO "bttv: driver version %d.%d.%d loaded\n", | 4299 | printk(KERN_INFO "bttv: driver version %d.%d.%d loaded\n", |
| @@ -4308,7 +4315,11 @@ static int bttv_init_module(void) | |||
| 4308 | 4315 | ||
| 4309 | bttv_check_chipset(); | 4316 | bttv_check_chipset(); |
| 4310 | 4317 | ||
| 4311 | bus_register(&bttv_sub_bus_type); | 4318 | ret = bus_register(&bttv_sub_bus_type); |
| 4319 | if (ret < 0) { | ||
| 4320 | printk(KERN_WARNING "bttv: bus_register error: %d\n", ret); | ||
| 4321 | return ret; | ||
| 4322 | } | ||
| 4312 | return pci_register_driver(&bttv_pci_driver); | 4323 | return pci_register_driver(&bttv_pci_driver); |
| 4313 | } | 4324 | } |
| 4314 | 4325 | ||
diff --git a/drivers/media/video/bt8xx/bttv-vbi.c b/drivers/media/video/bt8xx/bttv-vbi.c index 8c9f0f7cf467..63676e7bd635 100644 --- a/drivers/media/video/bt8xx/bttv-vbi.c +++ b/drivers/media/video/bt8xx/bttv-vbi.c | |||
| @@ -31,11 +31,16 @@ | |||
| 31 | #include <asm/io.h> | 31 | #include <asm/io.h> |
| 32 | #include "bttvp.h" | 32 | #include "bttvp.h" |
| 33 | 33 | ||
| 34 | /* Offset from line sync pulse leading edge (0H) in 1 / sampling_rate: | 34 | /* Offset from line sync pulse leading edge (0H) to start of VBI capture, |
| 35 | bt8x8 /HRESET pulse starts at 0H and has length 64 / fCLKx1 (E|O_VTC | 35 | in fCLKx2 pixels. According to the datasheet, VBI capture starts |
| 36 | HSFMT = 0). VBI_HDELAY (always 0) is an offset from the trailing edge | 36 | VBI_HDELAY fCLKx1 pixels from the tailing edgeof /HRESET, and /HRESET |
| 37 | of /HRESET in 1 / fCLKx1, and the sampling_rate tvnorm->Fsc is fCLKx2. */ | 37 | is 64 fCLKx1 pixels wide. VBI_HDELAY is set to 0, so this should be |
| 38 | #define VBI_OFFSET ((64 + 0) * 2) | 38 | (64 + 0) * 2 = 128 fCLKx2 pixels. But it's not! The datasheet is |
| 39 | Just Plain Wrong. The real value appears to be different for | ||
| 40 | different revisions of the bt8x8 chips, and to be affected by the | ||
| 41 | horizontal scaling factor. Experimentally, the value is measured | ||
| 42 | to be about 244. */ | ||
| 43 | #define VBI_OFFSET 244 | ||
| 39 | 44 | ||
| 40 | #define VBI_DEFLINES 16 | 45 | #define VBI_DEFLINES 16 |
| 41 | #define VBI_MAXLINES 32 | 46 | #define VBI_MAXLINES 32 |
diff --git a/drivers/media/video/compat_ioctl32.c b/drivers/media/video/compat_ioctl32.c index 353d02b67c33..9dddff42ec13 100644 --- a/drivers/media/video/compat_ioctl32.c +++ b/drivers/media/video/compat_ioctl32.c | |||
| @@ -490,6 +490,23 @@ static inline int put_v4l2_input(struct v4l2_input *kp, struct v4l2_input __user | |||
| 490 | return 0; | 490 | return 0; |
| 491 | } | 491 | } |
| 492 | 492 | ||
| 493 | struct video_code32 | ||
| 494 | { | ||
| 495 | char loadwhat[16]; /* name or tag of file being passed */ | ||
| 496 | compat_int_t datasize; | ||
| 497 | unsigned char *data; | ||
| 498 | }; | ||
| 499 | |||
| 500 | static inline int microcode32(struct video_code *kp, struct video_code32 __user *up) | ||
| 501 | { | ||
| 502 | if(!access_ok(VERIFY_READ, up, sizeof(struct video_code32)) || | ||
| 503 | copy_from_user(kp->loadwhat, up->loadwhat, sizeof (up->loadwhat)) || | ||
| 504 | get_user(kp->datasize, &up->datasize) || | ||
| 505 | copy_from_user(kp->data, up->data, up->datasize)) | ||
| 506 | return -EFAULT; | ||
| 507 | return 0; | ||
| 508 | } | ||
| 509 | |||
| 493 | #define VIDIOCGTUNER32 _IOWR('v',4, struct video_tuner32) | 510 | #define VIDIOCGTUNER32 _IOWR('v',4, struct video_tuner32) |
| 494 | #define VIDIOCSTUNER32 _IOW('v',5, struct video_tuner32) | 511 | #define VIDIOCSTUNER32 _IOW('v',5, struct video_tuner32) |
| 495 | #define VIDIOCGWIN32 _IOR('v',9, struct video_window32) | 512 | #define VIDIOCGWIN32 _IOR('v',9, struct video_window32) |
| @@ -498,6 +515,7 @@ static inline int put_v4l2_input(struct v4l2_input *kp, struct v4l2_input __user | |||
| 498 | #define VIDIOCSFBUF32 _IOW('v',12, struct video_buffer32) | 515 | #define VIDIOCSFBUF32 _IOW('v',12, struct video_buffer32) |
| 499 | #define VIDIOCGFREQ32 _IOR('v',14, u32) | 516 | #define VIDIOCGFREQ32 _IOR('v',14, u32) |
| 500 | #define VIDIOCSFREQ32 _IOW('v',15, u32) | 517 | #define VIDIOCSFREQ32 _IOW('v',15, u32) |
| 518 | #define VIDIOCSMICROCODE32 _IOW('v',27, struct video_code32) | ||
| 501 | 519 | ||
| 502 | /* VIDIOC_ENUMINPUT32 is VIDIOC_ENUMINPUT minus 4 bytes of padding alignement */ | 520 | /* VIDIOC_ENUMINPUT32 is VIDIOC_ENUMINPUT minus 4 bytes of padding alignement */ |
| 503 | #define VIDIOC_ENUMINPUT32 VIDIOC_ENUMINPUT - _IOC(0, 0, 0, 4) | 521 | #define VIDIOC_ENUMINPUT32 VIDIOC_ENUMINPUT - _IOC(0, 0, 0, 4) |
| @@ -590,6 +608,7 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg | |||
| 590 | struct video_tuner vt; | 608 | struct video_tuner vt; |
| 591 | struct video_buffer vb; | 609 | struct video_buffer vb; |
| 592 | struct video_window vw; | 610 | struct video_window vw; |
| 611 | struct video_code vc; | ||
| 593 | struct v4l2_format v2f; | 612 | struct v4l2_format v2f; |
| 594 | struct v4l2_buffer v2b; | 613 | struct v4l2_buffer v2b; |
| 595 | struct v4l2_framebuffer v2fb; | 614 | struct v4l2_framebuffer v2fb; |
| @@ -628,6 +647,7 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg | |||
| 628 | case VIDIOC_G_INPUT32: cmd = VIDIOC_G_INPUT; break; | 647 | case VIDIOC_G_INPUT32: cmd = VIDIOC_G_INPUT; break; |
| 629 | case VIDIOC_S_INPUT32: cmd = VIDIOC_S_INPUT; break; | 648 | case VIDIOC_S_INPUT32: cmd = VIDIOC_S_INPUT; break; |
| 630 | case VIDIOC_TRY_FMT32: cmd = VIDIOC_TRY_FMT; break; | 649 | case VIDIOC_TRY_FMT32: cmd = VIDIOC_TRY_FMT; break; |
| 650 | case VIDIOCSMICROCODE32: cmd = VIDIOCSMICROCODE; break; | ||
| 631 | }; | 651 | }; |
| 632 | 652 | ||
| 633 | switch(cmd) { | 653 | switch(cmd) { |
| @@ -703,6 +723,10 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg | |||
| 703 | case VIDIOC_G_FBUF: | 723 | case VIDIOC_G_FBUF: |
| 704 | case VIDIOC_G_INPUT: | 724 | case VIDIOC_G_INPUT: |
| 705 | compatible_arg = 0; | 725 | compatible_arg = 0; |
| 726 | case VIDIOCSMICROCODE: | ||
| 727 | err = microcode32(&karg.vc, up); | ||
| 728 | compatible_arg = 0; | ||
| 729 | break; | ||
| 706 | }; | 730 | }; |
| 707 | 731 | ||
| 708 | if(err) | 732 | if(err) |
diff --git a/drivers/media/video/cpia2/Kconfig b/drivers/media/video/cpia2/Kconfig index 513cc0927389..e39a96152004 100644 --- a/drivers/media/video/cpia2/Kconfig +++ b/drivers/media/video/cpia2/Kconfig | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | config VIDEO_CPIA2 | 1 | config VIDEO_CPIA2 |
| 2 | tristate "CPiA2 Video For Linux" | 2 | tristate "CPiA2 Video For Linux" |
| 3 | depends on VIDEO_DEV && USB | 3 | depends on VIDEO_DEV && USB && VIDEO_V4L1 |
| 4 | ---help--- | 4 | ---help--- |
| 5 | This is the video4linux driver for cameras based on Vision's CPiA2 | 5 | This is the video4linux driver for cameras based on Vision's CPiA2 |
| 6 | (Colour Processor Interface ASIC), such as the Digital Blue QX5 | 6 | (Colour Processor Interface ASIC), such as the Digital Blue QX5 |
diff --git a/drivers/media/video/cx88/cx88-input.c b/drivers/media/video/cx88/cx88-input.c index 72b630a91f41..c25564648993 100644 --- a/drivers/media/video/cx88/cx88-input.c +++ b/drivers/media/video/cx88/cx88-input.c | |||
| @@ -89,7 +89,7 @@ static void cx88_ir_handle_key(struct cx88_IR *ir) | |||
| 89 | 89 | ||
| 90 | auxgpio = cx_read(MO_GP1_IO); | 90 | auxgpio = cx_read(MO_GP1_IO); |
| 91 | /* Take out the parity part */ | 91 | /* Take out the parity part */ |
| 92 | gpio+=(gpio & 0x7fd) + (auxgpio & 0xef); | 92 | gpio=(gpio & 0x7fd) + (auxgpio & 0xef); |
| 93 | } else | 93 | } else |
| 94 | auxgpio = gpio; | 94 | auxgpio = gpio; |
| 95 | 95 | ||
diff --git a/drivers/media/video/cx88/cx88-video.c b/drivers/media/video/cx88/cx88-video.c index 2225d4b94140..547cdbdb644d 100644 --- a/drivers/media/video/cx88/cx88-video.c +++ b/drivers/media/video/cx88/cx88-video.c | |||
| @@ -1180,7 +1180,6 @@ static int video_do_ioctl(struct inode *inode, struct file *file, | |||
| 1180 | V4L2_CAP_READWRITE | | 1180 | V4L2_CAP_READWRITE | |
| 1181 | V4L2_CAP_STREAMING | | 1181 | V4L2_CAP_STREAMING | |
| 1182 | V4L2_CAP_VBI_CAPTURE | | 1182 | V4L2_CAP_VBI_CAPTURE | |
| 1183 | V4L2_CAP_VIDEO_OVERLAY | | ||
| 1184 | 0; | 1183 | 0; |
| 1185 | if (UNSET != core->tuner_type) | 1184 | if (UNSET != core->tuner_type) |
| 1186 | cap->capabilities |= V4L2_CAP_TUNER; | 1185 | cap->capabilities |= V4L2_CAP_TUNER; |
| @@ -1226,7 +1225,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file, | |||
| 1226 | struct v4l2_format *f = arg; | 1225 | struct v4l2_format *f = arg; |
| 1227 | return cx8800_try_fmt(dev,fh,f); | 1226 | return cx8800_try_fmt(dev,fh,f); |
| 1228 | } | 1227 | } |
| 1229 | #ifdef HAVE_V4L1 | 1228 | #ifdef CONFIG_V4L1_COMPAT |
| 1230 | /* --- streaming capture ------------------------------------- */ | 1229 | /* --- streaming capture ------------------------------------- */ |
| 1231 | case VIDIOCGMBUF: | 1230 | case VIDIOCGMBUF: |
| 1232 | { | 1231 | { |
| @@ -1585,7 +1584,7 @@ static int radio_do_ioctl(struct inode *inode, struct file *file, | |||
| 1585 | *id = 0; | 1584 | *id = 0; |
| 1586 | return 0; | 1585 | return 0; |
| 1587 | } | 1586 | } |
| 1588 | #ifdef HAVE_V4L1 | 1587 | #ifdef CONFIG_V4L1_COMPAT |
| 1589 | case VIDIOCSTUNER: | 1588 | case VIDIOCSTUNER: |
| 1590 | { | 1589 | { |
| 1591 | struct video_tuner *v = arg; | 1590 | struct video_tuner *v = arg; |
diff --git a/drivers/media/video/msp3400-driver.c b/drivers/media/video/msp3400-driver.c index dbb75a7db199..56246b8578f3 100644 --- a/drivers/media/video/msp3400-driver.c +++ b/drivers/media/video/msp3400-driver.c | |||
| @@ -362,7 +362,7 @@ int msp_sleep(struct msp_state *state, int timeout) | |||
| 362 | } | 362 | } |
| 363 | 363 | ||
| 364 | /* ------------------------------------------------------------------------ */ | 364 | /* ------------------------------------------------------------------------ */ |
| 365 | 365 | #ifdef CONFIG_VIDEO_V4L1 | |
| 366 | static int msp_mode_v4l2_to_v4l1(int rxsubchans, int audmode) | 366 | static int msp_mode_v4l2_to_v4l1(int rxsubchans, int audmode) |
| 367 | { | 367 | { |
| 368 | if (rxsubchans == V4L2_TUNER_SUB_MONO) | 368 | if (rxsubchans == V4L2_TUNER_SUB_MONO) |
| @@ -384,6 +384,7 @@ static int msp_mode_v4l1_to_v4l2(int mode) | |||
| 384 | return V4L2_TUNER_MODE_LANG1; | 384 | return V4L2_TUNER_MODE_LANG1; |
| 385 | return V4L2_TUNER_MODE_MONO; | 385 | return V4L2_TUNER_MODE_MONO; |
| 386 | } | 386 | } |
| 387 | #endif | ||
| 387 | 388 | ||
| 388 | static int msp_get_ctrl(struct i2c_client *client, struct v4l2_control *ctrl) | 389 | static int msp_get_ctrl(struct i2c_client *client, struct v4l2_control *ctrl) |
| 389 | { | 390 | { |
| @@ -509,6 +510,7 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 509 | /* --- v4l ioctls --- */ | 510 | /* --- v4l ioctls --- */ |
| 510 | /* take care: bttv does userspace copying, we'll get a | 511 | /* take care: bttv does userspace copying, we'll get a |
| 511 | kernel pointer here... */ | 512 | kernel pointer here... */ |
| 513 | #ifdef CONFIG_VIDEO_V4L1 | ||
| 512 | case VIDIOCGAUDIO: | 514 | case VIDIOCGAUDIO: |
| 513 | { | 515 | { |
| 514 | struct video_audio *va = arg; | 516 | struct video_audio *va = arg; |
| @@ -577,6 +579,12 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 577 | } | 579 | } |
| 578 | 580 | ||
| 579 | case VIDIOCSFREQ: | 581 | case VIDIOCSFREQ: |
| 582 | { | ||
| 583 | /* new channel -- kick audio carrier scan */ | ||
| 584 | msp_wake_thread(client); | ||
| 585 | break; | ||
| 586 | } | ||
| 587 | #endif | ||
| 580 | case VIDIOC_S_FREQUENCY: | 588 | case VIDIOC_S_FREQUENCY: |
| 581 | { | 589 | { |
| 582 | /* new channel -- kick audio carrier scan */ | 590 | /* new channel -- kick audio carrier scan */ |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c index 9b48abcf6089..be1e5cc78081 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c | |||
| @@ -852,7 +852,6 @@ unsigned long pvr2_hdw_get_sn(struct pvr2_hdw *hdw) | |||
| 852 | return hdw->serial_number; | 852 | return hdw->serial_number; |
| 853 | } | 853 | } |
| 854 | 854 | ||
| 855 | |||
| 856 | int pvr2_hdw_get_unit_number(struct pvr2_hdw *hdw) | 855 | int pvr2_hdw_get_unit_number(struct pvr2_hdw *hdw) |
| 857 | { | 856 | { |
| 858 | return hdw->unit_number; | 857 | return hdw->unit_number; |
| @@ -2318,7 +2317,6 @@ void pvr2_hdw_poll_trigger_unlocked(struct pvr2_hdw *hdw) | |||
| 2318 | } | 2317 | } |
| 2319 | } | 2318 | } |
| 2320 | 2319 | ||
| 2321 | |||
| 2322 | /* Return name for this driver instance */ | 2320 | /* Return name for this driver instance */ |
| 2323 | const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *hdw) | 2321 | const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *hdw) |
| 2324 | { | 2322 | { |
| @@ -2542,6 +2540,10 @@ static void pvr2_ctl_timeout(unsigned long data) | |||
| 2542 | } | 2540 | } |
| 2543 | 2541 | ||
| 2544 | 2542 | ||
| 2543 | /* Issue a command and get a response from the device. This extended | ||
| 2544 | version includes a probe flag (which if set means that device errors | ||
| 2545 | should not be logged or treated as fatal) and a timeout in jiffies. | ||
| 2546 | This can be used to non-lethally probe the health of endpoint 1. */ | ||
| 2545 | static int pvr2_send_request_ex(struct pvr2_hdw *hdw, | 2547 | static int pvr2_send_request_ex(struct pvr2_hdw *hdw, |
| 2546 | unsigned int timeout,int probe_fl, | 2548 | unsigned int timeout,int probe_fl, |
| 2547 | void *write_data,unsigned int write_len, | 2549 | void *write_data,unsigned int write_len, |
| @@ -2970,6 +2972,7 @@ int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *hdw) | |||
| 2970 | } | 2972 | } |
| 2971 | 2973 | ||
| 2972 | 2974 | ||
| 2975 | /* Stop / start video stream transport */ | ||
| 2973 | static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl) | 2976 | static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl) |
| 2974 | { | 2977 | { |
| 2975 | int status; | 2978 | int status; |
| @@ -3068,6 +3071,7 @@ int pvr2_hdw_gpio_chg_out(struct pvr2_hdw *hdw,u32 msk,u32 val) | |||
| 3068 | } | 3071 | } |
| 3069 | 3072 | ||
| 3070 | 3073 | ||
| 3074 | /* Find I2C address of eeprom */ | ||
| 3071 | static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw) | 3075 | static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw) |
| 3072 | { | 3076 | { |
| 3073 | int result; | 3077 | int result; |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-io.c b/drivers/media/video/pvrusb2/pvrusb2-io.c index 681f79c8064e..1e393762546c 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-io.c +++ b/drivers/media/video/pvrusb2/pvrusb2-io.c | |||
| @@ -26,6 +26,8 @@ | |||
| 26 | #include <linux/slab.h> | 26 | #include <linux/slab.h> |
| 27 | #include <linux/mutex.h> | 27 | #include <linux/mutex.h> |
| 28 | 28 | ||
| 29 | static const char *pvr2_buffer_state_decode(enum pvr2_buffer_state); | ||
| 30 | |||
| 29 | #define BUFFER_SIG 0x47653271 | 31 | #define BUFFER_SIG 0x47653271 |
| 30 | 32 | ||
| 31 | // #define SANITY_CHECK_BUFFERS | 33 | // #define SANITY_CHECK_BUFFERS |
| @@ -515,6 +517,10 @@ void pvr2_stream_set_callback(struct pvr2_stream *sp, | |||
| 515 | } | 517 | } |
| 516 | 518 | ||
| 517 | /* Query / set the nominal buffer count */ | 519 | /* Query / set the nominal buffer count */ |
| 520 | int pvr2_stream_get_buffer_count(struct pvr2_stream *sp) | ||
| 521 | { | ||
| 522 | return sp->buffer_target_count; | ||
| 523 | } | ||
| 518 | 524 | ||
| 519 | int pvr2_stream_set_buffer_count(struct pvr2_stream *sp,unsigned int cnt) | 525 | int pvr2_stream_set_buffer_count(struct pvr2_stream *sp,unsigned int cnt) |
| 520 | { | 526 | { |
| @@ -553,7 +559,6 @@ int pvr2_stream_get_ready_count(struct pvr2_stream *sp) | |||
| 553 | return sp->r_count; | 559 | return sp->r_count; |
| 554 | } | 560 | } |
| 555 | 561 | ||
| 556 | |||
| 557 | void pvr2_stream_kill(struct pvr2_stream *sp) | 562 | void pvr2_stream_kill(struct pvr2_stream *sp) |
| 558 | { | 563 | { |
| 559 | struct pvr2_buffer *bp; | 564 | struct pvr2_buffer *bp; |
| @@ -607,7 +612,6 @@ int pvr2_buffer_queue(struct pvr2_buffer *bp) | |||
| 607 | return ret; | 612 | return ret; |
| 608 | } | 613 | } |
| 609 | 614 | ||
| 610 | |||
| 611 | int pvr2_buffer_set_buffer(struct pvr2_buffer *bp,void *ptr,unsigned int cnt) | 615 | int pvr2_buffer_set_buffer(struct pvr2_buffer *bp,void *ptr,unsigned int cnt) |
| 612 | { | 616 | { |
| 613 | int ret = 0; | 617 | int ret = 0; |
| @@ -646,7 +650,6 @@ int pvr2_buffer_get_status(struct pvr2_buffer *bp) | |||
| 646 | return bp->status; | 650 | return bp->status; |
| 647 | } | 651 | } |
| 648 | 652 | ||
| 649 | |||
| 650 | int pvr2_buffer_get_id(struct pvr2_buffer *bp) | 653 | int pvr2_buffer_get_id(struct pvr2_buffer *bp) |
| 651 | { | 654 | { |
| 652 | return bp->id; | 655 | return bp->id; |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-io.h b/drivers/media/video/pvrusb2/pvrusb2-io.h index 96285ad234a6..93279cc2a35e 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-io.h +++ b/drivers/media/video/pvrusb2/pvrusb2-io.h | |||
| @@ -47,6 +47,7 @@ void pvr2_stream_set_callback(struct pvr2_stream *, | |||
| 47 | void *data); | 47 | void *data); |
| 48 | 48 | ||
| 49 | /* Query / set the nominal buffer count */ | 49 | /* Query / set the nominal buffer count */ |
| 50 | int pvr2_stream_get_buffer_count(struct pvr2_stream *); | ||
| 50 | int pvr2_stream_set_buffer_count(struct pvr2_stream *,unsigned int); | 51 | int pvr2_stream_set_buffer_count(struct pvr2_stream *,unsigned int); |
| 51 | 52 | ||
| 52 | /* Get a pointer to a buffer that is either idle, ready, or is specified | 53 | /* Get a pointer to a buffer that is either idle, ready, or is specified |
| @@ -58,6 +59,7 @@ struct pvr2_buffer *pvr2_stream_get_buffer(struct pvr2_stream *sp,int id); | |||
| 58 | /* Find out how many buffers are idle or ready */ | 59 | /* Find out how many buffers are idle or ready */ |
| 59 | int pvr2_stream_get_ready_count(struct pvr2_stream *); | 60 | int pvr2_stream_get_ready_count(struct pvr2_stream *); |
| 60 | 61 | ||
| 62 | |||
| 61 | /* Kill all pending buffers and throw away any ready buffers as well */ | 63 | /* Kill all pending buffers and throw away any ready buffers as well */ |
| 62 | void pvr2_stream_kill(struct pvr2_stream *); | 64 | void pvr2_stream_kill(struct pvr2_stream *); |
| 63 | 65 | ||
diff --git a/drivers/media/video/pvrusb2/pvrusb2-ioread.c b/drivers/media/video/pvrusb2/pvrusb2-ioread.c index f7a2e225a002..b71f9a961f8a 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-ioread.c +++ b/drivers/media/video/pvrusb2/pvrusb2-ioread.c | |||
| @@ -213,7 +213,9 @@ int pvr2_ioread_setup(struct pvr2_ioread *cp,struct pvr2_stream *sp) | |||
| 213 | " pvr2_ioread_setup (tear-down) id=%p",cp); | 213 | " pvr2_ioread_setup (tear-down) id=%p",cp); |
| 214 | pvr2_ioread_stop(cp); | 214 | pvr2_ioread_stop(cp); |
| 215 | pvr2_stream_kill(cp->stream); | 215 | pvr2_stream_kill(cp->stream); |
| 216 | pvr2_stream_set_buffer_count(cp->stream,0); | 216 | if (pvr2_stream_get_buffer_count(cp->stream)) { |
| 217 | pvr2_stream_set_buffer_count(cp->stream,0); | ||
| 218 | } | ||
| 217 | cp->stream = NULL; | 219 | cp->stream = NULL; |
| 218 | } | 220 | } |
| 219 | if (sp) { | 221 | if (sp) { |
| @@ -251,7 +253,6 @@ int pvr2_ioread_set_enabled(struct pvr2_ioread *cp,int fl) | |||
| 251 | return ret; | 253 | return ret; |
| 252 | } | 254 | } |
| 253 | 255 | ||
| 254 | |||
| 255 | static int pvr2_ioread_get_buffer(struct pvr2_ioread *cp) | 256 | static int pvr2_ioread_get_buffer(struct pvr2_ioread *cp) |
| 256 | { | 257 | { |
| 257 | int stat; | 258 | int stat; |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-sysfs.c b/drivers/media/video/pvrusb2/pvrusb2-sysfs.c index 6af55a8b6f05..d1dda5caf406 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-sysfs.c +++ b/drivers/media/video/pvrusb2/pvrusb2-sysfs.c | |||
| @@ -44,12 +44,16 @@ struct pvr2_sysfs { | |||
| 44 | struct kobj_type ktype; | 44 | struct kobj_type ktype; |
| 45 | struct class_device_attribute attr_v4l_minor_number; | 45 | struct class_device_attribute attr_v4l_minor_number; |
| 46 | struct class_device_attribute attr_unit_number; | 46 | struct class_device_attribute attr_unit_number; |
| 47 | int v4l_minor_number_created_ok; | ||
| 48 | int unit_number_created_ok; | ||
| 47 | }; | 49 | }; |
| 48 | 50 | ||
| 49 | #ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC | 51 | #ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC |
| 50 | struct pvr2_sysfs_debugifc { | 52 | struct pvr2_sysfs_debugifc { |
| 51 | struct class_device_attribute attr_debugcmd; | 53 | struct class_device_attribute attr_debugcmd; |
| 52 | struct class_device_attribute attr_debuginfo; | 54 | struct class_device_attribute attr_debuginfo; |
| 55 | int debugcmd_created_ok; | ||
| 56 | int debuginfo_created_ok; | ||
| 53 | }; | 57 | }; |
| 54 | #endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */ | 58 | #endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */ |
| 55 | 59 | ||
| @@ -67,6 +71,7 @@ struct pvr2_sysfs_ctl_item { | |||
| 67 | struct pvr2_sysfs_ctl_item *item_next; | 71 | struct pvr2_sysfs_ctl_item *item_next; |
| 68 | struct attribute *attr_gen[7]; | 72 | struct attribute *attr_gen[7]; |
| 69 | struct attribute_group grp; | 73 | struct attribute_group grp; |
| 74 | int created_ok; | ||
| 70 | char name[80]; | 75 | char name[80]; |
| 71 | }; | 76 | }; |
| 72 | 77 | ||
| @@ -487,6 +492,7 @@ static void pvr2_sysfs_add_control(struct pvr2_sysfs *sfp,int ctl_id) | |||
| 487 | struct pvr2_sysfs_func_set *fp; | 492 | struct pvr2_sysfs_func_set *fp; |
| 488 | struct pvr2_ctrl *cptr; | 493 | struct pvr2_ctrl *cptr; |
| 489 | unsigned int cnt,acnt; | 494 | unsigned int cnt,acnt; |
| 495 | int ret; | ||
| 490 | 496 | ||
| 491 | if ((ctl_id < 0) || (ctl_id >= (sizeof(funcs)/sizeof(funcs[0])))) { | 497 | if ((ctl_id < 0) || (ctl_id >= (sizeof(funcs)/sizeof(funcs[0])))) { |
| 492 | return; | 498 | return; |
| @@ -589,7 +595,13 @@ static void pvr2_sysfs_add_control(struct pvr2_sysfs *sfp,int ctl_id) | |||
| 589 | cip->grp.name = cip->name; | 595 | cip->grp.name = cip->name; |
| 590 | cip->grp.attrs = cip->attr_gen; | 596 | cip->grp.attrs = cip->attr_gen; |
| 591 | 597 | ||
| 592 | sysfs_create_group(&sfp->class_dev->kobj,&cip->grp); | 598 | ret = sysfs_create_group(&sfp->class_dev->kobj,&cip->grp); |
| 599 | if (ret) { | ||
| 600 | printk(KERN_WARNING "%s: sysfs_create_group error: %d\n", | ||
| 601 | __FUNCTION__, ret); | ||
| 602 | return; | ||
| 603 | } | ||
| 604 | cip->created_ok = !0; | ||
| 593 | } | 605 | } |
| 594 | 606 | ||
| 595 | #ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC | 607 | #ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC |
| @@ -600,6 +612,8 @@ static ssize_t debugcmd_store(struct class_device *,const char *,size_t count); | |||
| 600 | static void pvr2_sysfs_add_debugifc(struct pvr2_sysfs *sfp) | 612 | static void pvr2_sysfs_add_debugifc(struct pvr2_sysfs *sfp) |
| 601 | { | 613 | { |
| 602 | struct pvr2_sysfs_debugifc *dip; | 614 | struct pvr2_sysfs_debugifc *dip; |
| 615 | int ret; | ||
| 616 | |||
| 603 | dip = kmalloc(sizeof(*dip),GFP_KERNEL); | 617 | dip = kmalloc(sizeof(*dip),GFP_KERNEL); |
| 604 | if (!dip) return; | 618 | if (!dip) return; |
| 605 | memset(dip,0,sizeof(*dip)); | 619 | memset(dip,0,sizeof(*dip)); |
| @@ -613,17 +627,34 @@ static void pvr2_sysfs_add_debugifc(struct pvr2_sysfs *sfp) | |||
| 613 | dip->attr_debuginfo.attr.mode = S_IRUGO; | 627 | dip->attr_debuginfo.attr.mode = S_IRUGO; |
| 614 | dip->attr_debuginfo.show = debuginfo_show; | 628 | dip->attr_debuginfo.show = debuginfo_show; |
| 615 | sfp->debugifc = dip; | 629 | sfp->debugifc = dip; |
| 616 | class_device_create_file(sfp->class_dev,&dip->attr_debugcmd); | 630 | ret = class_device_create_file(sfp->class_dev,&dip->attr_debugcmd); |
| 617 | class_device_create_file(sfp->class_dev,&dip->attr_debuginfo); | 631 | if (ret < 0) { |
| 632 | printk(KERN_WARNING "%s: class_device_create_file error: %d\n", | ||
| 633 | __FUNCTION__, ret); | ||
| 634 | } else { | ||
| 635 | dip->debugcmd_created_ok = !0; | ||
| 636 | } | ||
| 637 | ret = class_device_create_file(sfp->class_dev,&dip->attr_debuginfo); | ||
| 638 | if (ret < 0) { | ||
| 639 | printk(KERN_WARNING "%s: class_device_create_file error: %d\n", | ||
| 640 | __FUNCTION__, ret); | ||
| 641 | } else { | ||
| 642 | dip->debuginfo_created_ok = !0; | ||
| 643 | } | ||
| 618 | } | 644 | } |
| 619 | 645 | ||
| 620 | 646 | ||
| 621 | static void pvr2_sysfs_tear_down_debugifc(struct pvr2_sysfs *sfp) | 647 | static void pvr2_sysfs_tear_down_debugifc(struct pvr2_sysfs *sfp) |
| 622 | { | 648 | { |
| 623 | if (!sfp->debugifc) return; | 649 | if (!sfp->debugifc) return; |
| 624 | class_device_remove_file(sfp->class_dev, | 650 | if (sfp->debugifc->debuginfo_created_ok) { |
| 625 | &sfp->debugifc->attr_debuginfo); | 651 | class_device_remove_file(sfp->class_dev, |
| 626 | class_device_remove_file(sfp->class_dev,&sfp->debugifc->attr_debugcmd); | 652 | &sfp->debugifc->attr_debuginfo); |
| 653 | } | ||
| 654 | if (sfp->debugifc->debugcmd_created_ok) { | ||
| 655 | class_device_remove_file(sfp->class_dev, | ||
| 656 | &sfp->debugifc->attr_debugcmd); | ||
| 657 | } | ||
| 627 | kfree(sfp->debugifc); | 658 | kfree(sfp->debugifc); |
| 628 | sfp->debugifc = NULL; | 659 | sfp->debugifc = NULL; |
| 629 | } | 660 | } |
| @@ -645,7 +676,9 @@ static void pvr2_sysfs_tear_down_controls(struct pvr2_sysfs *sfp) | |||
| 645 | struct pvr2_sysfs_ctl_item *cip1,*cip2; | 676 | struct pvr2_sysfs_ctl_item *cip1,*cip2; |
| 646 | for (cip1 = sfp->item_first; cip1; cip1 = cip2) { | 677 | for (cip1 = sfp->item_first; cip1; cip1 = cip2) { |
| 647 | cip2 = cip1->item_next; | 678 | cip2 = cip1->item_next; |
| 648 | sysfs_remove_group(&sfp->class_dev->kobj,&cip1->grp); | 679 | if (cip1->created_ok) { |
| 680 | sysfs_remove_group(&sfp->class_dev->kobj,&cip1->grp); | ||
| 681 | } | ||
| 649 | pvr2_sysfs_trace("Destroying pvr2_sysfs_ctl_item id=%p",cip1); | 682 | pvr2_sysfs_trace("Destroying pvr2_sysfs_ctl_item id=%p",cip1); |
| 650 | kfree(cip1); | 683 | kfree(cip1); |
| 651 | } | 684 | } |
| @@ -675,8 +708,14 @@ static void class_dev_destroy(struct pvr2_sysfs *sfp) | |||
| 675 | pvr2_sysfs_tear_down_debugifc(sfp); | 708 | pvr2_sysfs_tear_down_debugifc(sfp); |
| 676 | #endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */ | 709 | #endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */ |
| 677 | pvr2_sysfs_tear_down_controls(sfp); | 710 | pvr2_sysfs_tear_down_controls(sfp); |
| 678 | class_device_remove_file(sfp->class_dev,&sfp->attr_v4l_minor_number); | 711 | if (sfp->v4l_minor_number_created_ok) { |
| 679 | class_device_remove_file(sfp->class_dev,&sfp->attr_unit_number); | 712 | class_device_remove_file(sfp->class_dev, |
| 713 | &sfp->attr_v4l_minor_number); | ||
| 714 | } | ||
| 715 | if (sfp->unit_number_created_ok) { | ||
| 716 | class_device_remove_file(sfp->class_dev, | ||
| 717 | &sfp->attr_unit_number); | ||
| 718 | } | ||
| 680 | pvr2_sysfs_trace("Destroying class_dev id=%p",sfp->class_dev); | 719 | pvr2_sysfs_trace("Destroying class_dev id=%p",sfp->class_dev); |
| 681 | sfp->class_dev->class_data = NULL; | 720 | sfp->class_dev->class_data = NULL; |
| 682 | class_device_unregister(sfp->class_dev); | 721 | class_device_unregister(sfp->class_dev); |
| @@ -709,6 +748,8 @@ static void class_dev_create(struct pvr2_sysfs *sfp, | |||
| 709 | { | 748 | { |
| 710 | struct usb_device *usb_dev; | 749 | struct usb_device *usb_dev; |
| 711 | struct class_device *class_dev; | 750 | struct class_device *class_dev; |
| 751 | int ret; | ||
| 752 | |||
| 712 | usb_dev = pvr2_hdw_get_dev(sfp->channel.hdw); | 753 | usb_dev = pvr2_hdw_get_dev(sfp->channel.hdw); |
| 713 | if (!usb_dev) return; | 754 | if (!usb_dev) return; |
| 714 | class_dev = kmalloc(sizeof(*class_dev),GFP_KERNEL); | 755 | class_dev = kmalloc(sizeof(*class_dev),GFP_KERNEL); |
| @@ -733,20 +774,40 @@ static void class_dev_create(struct pvr2_sysfs *sfp, | |||
| 733 | 774 | ||
| 734 | sfp->class_dev = class_dev; | 775 | sfp->class_dev = class_dev; |
| 735 | class_dev->class_data = sfp; | 776 | class_dev->class_data = sfp; |
| 736 | class_device_register(class_dev); | 777 | ret = class_device_register(class_dev); |
| 778 | if (ret) { | ||
| 779 | printk(KERN_ERR "%s: class_device_register failed\n", | ||
| 780 | __FUNCTION__); | ||
| 781 | kfree(class_dev); | ||
| 782 | return; | ||
| 783 | } | ||
| 737 | 784 | ||
| 738 | sfp->attr_v4l_minor_number.attr.owner = THIS_MODULE; | 785 | sfp->attr_v4l_minor_number.attr.owner = THIS_MODULE; |
| 739 | sfp->attr_v4l_minor_number.attr.name = "v4l_minor_number"; | 786 | sfp->attr_v4l_minor_number.attr.name = "v4l_minor_number"; |
| 740 | sfp->attr_v4l_minor_number.attr.mode = S_IRUGO; | 787 | sfp->attr_v4l_minor_number.attr.mode = S_IRUGO; |
| 741 | sfp->attr_v4l_minor_number.show = v4l_minor_number_show; | 788 | sfp->attr_v4l_minor_number.show = v4l_minor_number_show; |
| 742 | sfp->attr_v4l_minor_number.store = NULL; | 789 | sfp->attr_v4l_minor_number.store = NULL; |
| 743 | class_device_create_file(sfp->class_dev,&sfp->attr_v4l_minor_number); | 790 | ret = class_device_create_file(sfp->class_dev, |
| 791 | &sfp->attr_v4l_minor_number); | ||
| 792 | if (ret < 0) { | ||
| 793 | printk(KERN_WARNING "%s: class_device_create_file error: %d\n", | ||
| 794 | __FUNCTION__, ret); | ||
| 795 | } else { | ||
| 796 | sfp->v4l_minor_number_created_ok = !0; | ||
| 797 | } | ||
| 798 | |||
| 744 | sfp->attr_unit_number.attr.owner = THIS_MODULE; | 799 | sfp->attr_unit_number.attr.owner = THIS_MODULE; |
| 745 | sfp->attr_unit_number.attr.name = "unit_number"; | 800 | sfp->attr_unit_number.attr.name = "unit_number"; |
| 746 | sfp->attr_unit_number.attr.mode = S_IRUGO; | 801 | sfp->attr_unit_number.attr.mode = S_IRUGO; |
| 747 | sfp->attr_unit_number.show = unit_number_show; | 802 | sfp->attr_unit_number.show = unit_number_show; |
| 748 | sfp->attr_unit_number.store = NULL; | 803 | sfp->attr_unit_number.store = NULL; |
| 749 | class_device_create_file(sfp->class_dev,&sfp->attr_unit_number); | 804 | ret = class_device_create_file(sfp->class_dev,&sfp->attr_unit_number); |
| 805 | if (ret < 0) { | ||
| 806 | printk(KERN_WARNING "%s: class_device_create_file error: %d\n", | ||
| 807 | __FUNCTION__, ret); | ||
| 808 | } else { | ||
| 809 | sfp->unit_number_created_ok = !0; | ||
| 810 | } | ||
| 750 | 811 | ||
| 751 | pvr2_sysfs_add_controls(sfp); | 812 | pvr2_sysfs_add_controls(sfp); |
| 752 | #ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC | 813 | #ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC |
diff --git a/drivers/media/video/saa7134/saa7134-alsa.c b/drivers/media/video/saa7134/saa7134-alsa.c index f1fd69e7f119..d73cff1970ae 100644 --- a/drivers/media/video/saa7134/saa7134-alsa.c +++ b/drivers/media/video/saa7134/saa7134-alsa.c | |||
| @@ -997,9 +997,9 @@ static int saa7134_alsa_init(void) | |||
| 997 | struct saa7134_dev *dev = NULL; | 997 | struct saa7134_dev *dev = NULL; |
| 998 | struct list_head *list; | 998 | struct list_head *list; |
| 999 | 999 | ||
| 1000 | if (!dmasound_init && !dmasound_exit) { | 1000 | if (!saa7134_dmasound_init && !saa7134_dmasound_exit) { |
| 1001 | dmasound_init = alsa_device_init; | 1001 | saa7134_dmasound_init = alsa_device_init; |
| 1002 | dmasound_exit = alsa_device_exit; | 1002 | saa7134_dmasound_exit = alsa_device_exit; |
| 1003 | } else { | 1003 | } else { |
| 1004 | printk(KERN_WARNING "saa7134 ALSA: can't load, DMA sound handler already assigned (probably to OSS)\n"); | 1004 | printk(KERN_WARNING "saa7134 ALSA: can't load, DMA sound handler already assigned (probably to OSS)\n"); |
| 1005 | return -EBUSY; | 1005 | return -EBUSY; |
| @@ -1036,8 +1036,8 @@ static void saa7134_alsa_exit(void) | |||
| 1036 | snd_card_free(snd_saa7134_cards[idx]); | 1036 | snd_card_free(snd_saa7134_cards[idx]); |
| 1037 | } | 1037 | } |
| 1038 | 1038 | ||
| 1039 | dmasound_init = NULL; | 1039 | saa7134_dmasound_init = NULL; |
| 1040 | dmasound_exit = NULL; | 1040 | saa7134_dmasound_exit = NULL; |
| 1041 | printk(KERN_INFO "saa7134 ALSA driver for DMA sound unloaded\n"); | 1041 | printk(KERN_INFO "saa7134 ALSA driver for DMA sound unloaded\n"); |
| 1042 | 1042 | ||
| 1043 | return; | 1043 | return; |
diff --git a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c index 6e97cc84ba89..be3a81fc90a2 100644 --- a/drivers/media/video/saa7134/saa7134-core.c +++ b/drivers/media/video/saa7134/saa7134-core.c | |||
| @@ -95,8 +95,8 @@ LIST_HEAD(saa7134_devlist); | |||
| 95 | static LIST_HEAD(mops_list); | 95 | static LIST_HEAD(mops_list); |
| 96 | static unsigned int saa7134_devcount; | 96 | static unsigned int saa7134_devcount; |
| 97 | 97 | ||
| 98 | int (*dmasound_init)(struct saa7134_dev *dev); | 98 | int (*saa7134_dmasound_init)(struct saa7134_dev *dev); |
| 99 | int (*dmasound_exit)(struct saa7134_dev *dev); | 99 | int (*saa7134_dmasound_exit)(struct saa7134_dev *dev); |
| 100 | 100 | ||
| 101 | #define dprintk(fmt, arg...) if (core_debug) \ | 101 | #define dprintk(fmt, arg...) if (core_debug) \ |
| 102 | printk(KERN_DEBUG "%s/core: " fmt, dev->name , ## arg) | 102 | printk(KERN_DEBUG "%s/core: " fmt, dev->name , ## arg) |
| @@ -1008,8 +1008,8 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, | |||
| 1008 | /* check for signal */ | 1008 | /* check for signal */ |
| 1009 | saa7134_irq_video_intl(dev); | 1009 | saa7134_irq_video_intl(dev); |
| 1010 | 1010 | ||
| 1011 | if (dmasound_init && !dev->dmasound.priv_data) { | 1011 | if (saa7134_dmasound_init && !dev->dmasound.priv_data) { |
| 1012 | dmasound_init(dev); | 1012 | saa7134_dmasound_init(dev); |
| 1013 | } | 1013 | } |
| 1014 | 1014 | ||
| 1015 | return 0; | 1015 | return 0; |
| @@ -1036,8 +1036,8 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev) | |||
| 1036 | struct saa7134_mpeg_ops *mops; | 1036 | struct saa7134_mpeg_ops *mops; |
| 1037 | 1037 | ||
| 1038 | /* Release DMA sound modules if present */ | 1038 | /* Release DMA sound modules if present */ |
| 1039 | if (dmasound_exit && dev->dmasound.priv_data) { | 1039 | if (saa7134_dmasound_exit && dev->dmasound.priv_data) { |
| 1040 | dmasound_exit(dev); | 1040 | saa7134_dmasound_exit(dev); |
| 1041 | } | 1041 | } |
| 1042 | 1042 | ||
| 1043 | /* debugging ... */ | 1043 | /* debugging ... */ |
| @@ -1169,8 +1169,8 @@ EXPORT_SYMBOL(saa7134_boards); | |||
| 1169 | 1169 | ||
| 1170 | /* ----------------- for the DMA sound modules --------------- */ | 1170 | /* ----------------- for the DMA sound modules --------------- */ |
| 1171 | 1171 | ||
| 1172 | EXPORT_SYMBOL(dmasound_init); | 1172 | EXPORT_SYMBOL(saa7134_dmasound_init); |
| 1173 | EXPORT_SYMBOL(dmasound_exit); | 1173 | EXPORT_SYMBOL(saa7134_dmasound_exit); |
| 1174 | EXPORT_SYMBOL(saa7134_pgtable_free); | 1174 | EXPORT_SYMBOL(saa7134_pgtable_free); |
| 1175 | EXPORT_SYMBOL(saa7134_pgtable_build); | 1175 | EXPORT_SYMBOL(saa7134_pgtable_build); |
| 1176 | EXPORT_SYMBOL(saa7134_pgtable_alloc); | 1176 | EXPORT_SYMBOL(saa7134_pgtable_alloc); |
diff --git a/drivers/media/video/saa7134/saa7134-oss.c b/drivers/media/video/saa7134/saa7134-oss.c index 3895d05804ae..2e3ba5f31453 100644 --- a/drivers/media/video/saa7134/saa7134-oss.c +++ b/drivers/media/video/saa7134/saa7134-oss.c | |||
| @@ -993,9 +993,9 @@ static int saa7134_oss_init(void) | |||
| 993 | struct saa7134_dev *dev = NULL; | 993 | struct saa7134_dev *dev = NULL; |
| 994 | struct list_head *list; | 994 | struct list_head *list; |
| 995 | 995 | ||
| 996 | if (!dmasound_init && !dmasound_exit) { | 996 | if (!saa7134_dmasound_init && !saa7134_dmasound_exit) { |
| 997 | dmasound_init = oss_device_init; | 997 | saa7134_dmasound_init = oss_device_init; |
| 998 | dmasound_exit = oss_device_exit; | 998 | saa7134_dmasound_exit = oss_device_exit; |
| 999 | } else { | 999 | } else { |
| 1000 | printk(KERN_WARNING "saa7134 OSS: can't load, DMA sound handler already assigned (probably to ALSA)\n"); | 1000 | printk(KERN_WARNING "saa7134 OSS: can't load, DMA sound handler already assigned (probably to ALSA)\n"); |
| 1001 | return -EBUSY; | 1001 | return -EBUSY; |
| @@ -1037,8 +1037,8 @@ static void saa7134_oss_exit(void) | |||
| 1037 | 1037 | ||
| 1038 | } | 1038 | } |
| 1039 | 1039 | ||
| 1040 | dmasound_init = NULL; | 1040 | saa7134_dmasound_init = NULL; |
| 1041 | dmasound_exit = NULL; | 1041 | saa7134_dmasound_exit = NULL; |
| 1042 | 1042 | ||
| 1043 | printk(KERN_INFO "saa7134 OSS driver for DMA sound unloaded\n"); | 1043 | printk(KERN_INFO "saa7134 OSS driver for DMA sound unloaded\n"); |
| 1044 | 1044 | ||
diff --git a/drivers/media/video/saa7134/saa7134-video.c b/drivers/media/video/saa7134/saa7134-video.c index e4156ec9c6d7..8656f2400e18 100644 --- a/drivers/media/video/saa7134/saa7134-video.c +++ b/drivers/media/video/saa7134/saa7134-video.c | |||
| @@ -40,7 +40,7 @@ | |||
| 40 | 40 | ||
| 41 | static unsigned int video_debug = 0; | 41 | static unsigned int video_debug = 0; |
| 42 | static unsigned int gbuffers = 8; | 42 | static unsigned int gbuffers = 8; |
| 43 | static unsigned int noninterlaced = 0; | 43 | static unsigned int noninterlaced = 1; |
| 44 | static unsigned int gbufsize = 720*576*4; | 44 | static unsigned int gbufsize = 720*576*4; |
| 45 | static unsigned int gbufsize_max = 720*576*4; | 45 | static unsigned int gbufsize_max = 720*576*4; |
| 46 | module_param(video_debug, int, 0644); | 46 | module_param(video_debug, int, 0644); |
| @@ -48,7 +48,7 @@ MODULE_PARM_DESC(video_debug,"enable debug messages [video]"); | |||
| 48 | module_param(gbuffers, int, 0444); | 48 | module_param(gbuffers, int, 0444); |
| 49 | MODULE_PARM_DESC(gbuffers,"number of capture buffers, range 2-32"); | 49 | MODULE_PARM_DESC(gbuffers,"number of capture buffers, range 2-32"); |
| 50 | module_param(noninterlaced, int, 0644); | 50 | module_param(noninterlaced, int, 0644); |
| 51 | MODULE_PARM_DESC(noninterlaced,"video input is noninterlaced"); | 51 | MODULE_PARM_DESC(noninterlaced,"capture non interlaced video"); |
| 52 | 52 | ||
| 53 | #define dprintk(fmt, arg...) if (video_debug) \ | 53 | #define dprintk(fmt, arg...) if (video_debug) \ |
| 54 | printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg) | 54 | printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg) |
| @@ -2087,7 +2087,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file, | |||
| 2087 | struct v4l2_format *f = arg; | 2087 | struct v4l2_format *f = arg; |
| 2088 | return saa7134_try_fmt(dev,fh,f); | 2088 | return saa7134_try_fmt(dev,fh,f); |
| 2089 | } | 2089 | } |
| 2090 | #ifdef HAVE_V4L1 | 2090 | #ifdef CONFIG_V4L1_COMPAT |
| 2091 | case VIDIOCGMBUF: | 2091 | case VIDIOCGMBUF: |
| 2092 | { | 2092 | { |
| 2093 | struct video_mbuf *mbuf = arg; | 2093 | struct video_mbuf *mbuf = arg; |
diff --git a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h index d5ee99c574cc..c04ce6152fd5 100644 --- a/drivers/media/video/saa7134/saa7134.h +++ b/drivers/media/video/saa7134/saa7134.h | |||
| @@ -586,8 +586,8 @@ void saa7134_dma_free(struct videobuf_queue *q,struct saa7134_buf *buf); | |||
| 586 | 586 | ||
| 587 | int saa7134_set_dmabits(struct saa7134_dev *dev); | 587 | int saa7134_set_dmabits(struct saa7134_dev *dev); |
| 588 | 588 | ||
| 589 | extern int (*dmasound_init)(struct saa7134_dev *dev); | 589 | extern int (*saa7134_dmasound_init)(struct saa7134_dev *dev); |
| 590 | extern int (*dmasound_exit)(struct saa7134_dev *dev); | 590 | extern int (*saa7134_dmasound_exit)(struct saa7134_dev *dev); |
| 591 | 591 | ||
| 592 | 592 | ||
| 593 | /* ----------------------------------------------------------- */ | 593 | /* ----------------------------------------------------------- */ |
diff --git a/drivers/media/video/stradis.c b/drivers/media/video/stradis.c index b36ba9fa3a28..5686547ba76a 100644 --- a/drivers/media/video/stradis.c +++ b/drivers/media/video/stradis.c | |||
| @@ -2181,7 +2181,6 @@ static struct pci_device_id stradis_pci_tbl[] = { | |||
| 2181 | { 0 } | 2181 | { 0 } |
| 2182 | }; | 2182 | }; |
| 2183 | 2183 | ||
| 2184 | MODULE_DEVICE_TABLE(pci, stradis_pci_tbl); | ||
| 2185 | 2184 | ||
| 2186 | static struct pci_driver stradis_driver = { | 2185 | static struct pci_driver stradis_driver = { |
| 2187 | .name = "stradis", | 2186 | .name = "stradis", |
diff --git a/drivers/media/video/tuner-core.c b/drivers/media/video/tuner-core.c index f7eb402d5f2b..40590bae5ff7 100644 --- a/drivers/media/video/tuner-core.c +++ b/drivers/media/video/tuner-core.c | |||
| @@ -196,14 +196,6 @@ static void set_type(struct i2c_client *c, unsigned int type, | |||
| 196 | i2c_master_send(c, buffer, 4); | 196 | i2c_master_send(c, buffer, 4); |
| 197 | default_tuner_init(c); | 197 | default_tuner_init(c); |
| 198 | break; | 198 | break; |
| 199 | case TUNER_LG_TDVS_H06XF: | ||
| 200 | /* Set the Auxiliary Byte. */ | ||
| 201 | buffer[2] &= ~0x20; | ||
| 202 | buffer[2] |= 0x18; | ||
| 203 | buffer[3] = 0x20; | ||
| 204 | i2c_master_send(c, buffer, 4); | ||
| 205 | default_tuner_init(c); | ||
| 206 | break; | ||
| 207 | case TUNER_PHILIPS_TD1316: | 199 | case TUNER_PHILIPS_TD1316: |
| 208 | buffer[0] = 0x0b; | 200 | buffer[0] = 0x0b; |
| 209 | buffer[1] = 0xdc; | 201 | buffer[1] = 0xdc; |
| @@ -598,6 +590,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 598 | if (t->standby) | 590 | if (t->standby) |
| 599 | t->standby (client); | 591 | t->standby (client); |
| 600 | break; | 592 | break; |
| 593 | #ifdef CONFIG_VIDEO_V4L1 | ||
| 601 | case VIDIOCSAUDIO: | 594 | case VIDIOCSAUDIO: |
| 602 | if (check_mode(t, "VIDIOCSAUDIO") == EINVAL) | 595 | if (check_mode(t, "VIDIOCSAUDIO") == EINVAL) |
| 603 | return 0; | 596 | return 0; |
| @@ -607,17 +600,6 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 607 | /* Should be implemented, since bttv calls it */ | 600 | /* Should be implemented, since bttv calls it */ |
| 608 | tuner_dbg("VIDIOCSAUDIO not implemented.\n"); | 601 | tuner_dbg("VIDIOCSAUDIO not implemented.\n"); |
| 609 | break; | 602 | break; |
| 610 | case TDA9887_SET_CONFIG: | ||
| 611 | if (t->type == TUNER_TDA9887) { | ||
| 612 | int *i = arg; | ||
| 613 | |||
| 614 | t->tda9887_config = *i; | ||
| 615 | set_freq(client, t->tv_freq); | ||
| 616 | } | ||
| 617 | break; | ||
| 618 | /* --- v4l ioctls --- */ | ||
| 619 | /* take care: bttv does userspace copying, we'll get a | ||
| 620 | kernel pointer here... */ | ||
| 621 | case VIDIOCSCHAN: | 603 | case VIDIOCSCHAN: |
| 622 | { | 604 | { |
| 623 | static const v4l2_std_id map[] = { | 605 | static const v4l2_std_id map[] = { |
| @@ -701,7 +683,18 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 701 | ? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO; | 683 | ? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO; |
| 702 | return 0; | 684 | return 0; |
| 703 | } | 685 | } |
| 686 | #endif | ||
| 687 | case TDA9887_SET_CONFIG: | ||
| 688 | if (t->type == TUNER_TDA9887) { | ||
| 689 | int *i = arg; | ||
| 704 | 690 | ||
| 691 | t->tda9887_config = *i; | ||
| 692 | set_freq(client, t->tv_freq); | ||
| 693 | } | ||
| 694 | break; | ||
| 695 | /* --- v4l ioctls --- */ | ||
| 696 | /* take care: bttv does userspace copying, we'll get a | ||
| 697 | kernel pointer here... */ | ||
| 705 | case VIDIOC_S_STD: | 698 | case VIDIOC_S_STD: |
| 706 | { | 699 | { |
| 707 | v4l2_std_id *id = arg; | 700 | v4l2_std_id *id = arg; |
diff --git a/drivers/media/video/tuner-simple.c b/drivers/media/video/tuner-simple.c index d071c5cbf013..abe37cf632c6 100644 --- a/drivers/media/video/tuner-simple.c +++ b/drivers/media/video/tuner-simple.c | |||
| @@ -339,7 +339,20 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) | |||
| 339 | if (4 != (rc = i2c_master_send(c,buffer,4))) | 339 | if (4 != (rc = i2c_master_send(c,buffer,4))) |
| 340 | tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc); | 340 | tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc); |
| 341 | 341 | ||
| 342 | if (t->type == TUNER_MICROTUNE_4042FI5) { | 342 | switch (t->type) { |
| 343 | case TUNER_LG_TDVS_H06XF: | ||
| 344 | /* Set the Auxiliary Byte. */ | ||
| 345 | buffer[0] = buffer[2]; | ||
| 346 | buffer[0] &= ~0x20; | ||
| 347 | buffer[0] |= 0x18; | ||
| 348 | buffer[1] = 0x20; | ||
| 349 | tuner_dbg("tv 0x%02x 0x%02x\n",buffer[0],buffer[1]); | ||
| 350 | |||
| 351 | if (2 != (rc = i2c_master_send(c,buffer,2))) | ||
| 352 | tuner_warn("i2c i/o error: rc == %d (should be 2)\n",rc); | ||
| 353 | break; | ||
| 354 | case TUNER_MICROTUNE_4042FI5: | ||
| 355 | { | ||
| 343 | // FIXME - this may also work for other tuners | 356 | // FIXME - this may also work for other tuners |
| 344 | unsigned long timeout = jiffies + msecs_to_jiffies(1); | 357 | unsigned long timeout = jiffies + msecs_to_jiffies(1); |
| 345 | u8 status_byte = 0; | 358 | u8 status_byte = 0; |
| @@ -364,10 +377,12 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) | |||
| 364 | buffer[2] = config; | 377 | buffer[2] = config; |
| 365 | buffer[3] = cb; | 378 | buffer[3] = cb; |
| 366 | tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n", | 379 | tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n", |
| 367 | buffer[0],buffer[1],buffer[2],buffer[3]); | 380 | buffer[0],buffer[1],buffer[2],buffer[3]); |
| 368 | 381 | ||
| 369 | if (4 != (rc = i2c_master_send(c,buffer,4))) | 382 | if (4 != (rc = i2c_master_send(c,buffer,4))) |
| 370 | tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc); | 383 | tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc); |
| 384 | break; | ||
| 385 | } | ||
| 371 | } | 386 | } |
| 372 | } | 387 | } |
| 373 | 388 | ||
diff --git a/drivers/media/video/usbvideo/Kconfig b/drivers/media/video/usbvideo/Kconfig index 59fb899f31f3..a0fd82b924f2 100644 --- a/drivers/media/video/usbvideo/Kconfig +++ b/drivers/media/video/usbvideo/Kconfig | |||
| @@ -3,7 +3,7 @@ config VIDEO_USBVIDEO | |||
| 3 | 3 | ||
| 4 | config USB_VICAM | 4 | config USB_VICAM |
| 5 | tristate "USB 3com HomeConnect (aka vicam) support (EXPERIMENTAL)" | 5 | tristate "USB 3com HomeConnect (aka vicam) support (EXPERIMENTAL)" |
| 6 | depends on USB && VIDEO_V4L1 && EXPERIMENTAL | 6 | depends on USB && VIDEO_DEV && VIDEO_V4L1 && EXPERIMENTAL |
| 7 | select VIDEO_USBVIDEO | 7 | select VIDEO_USBVIDEO |
| 8 | ---help--- | 8 | ---help--- |
| 9 | Say Y here if you have 3com homeconnect camera (vicam). | 9 | Say Y here if you have 3com homeconnect camera (vicam). |
| @@ -13,7 +13,7 @@ config USB_VICAM | |||
| 13 | 13 | ||
| 14 | config USB_IBMCAM | 14 | config USB_IBMCAM |
| 15 | tristate "USB IBM (Xirlink) C-it Camera support" | 15 | tristate "USB IBM (Xirlink) C-it Camera support" |
| 16 | depends on USB && VIDEO_V4L1 | 16 | depends on USB && VIDEO_DEV && VIDEO_V4L1 |
| 17 | select VIDEO_USBVIDEO | 17 | select VIDEO_USBVIDEO |
| 18 | ---help--- | 18 | ---help--- |
| 19 | Say Y here if you want to connect a IBM "C-It" camera, also known as | 19 | Say Y here if you want to connect a IBM "C-It" camera, also known as |
| @@ -28,7 +28,7 @@ config USB_IBMCAM | |||
| 28 | 28 | ||
| 29 | config USB_KONICAWC | 29 | config USB_KONICAWC |
| 30 | tristate "USB Konica Webcam support" | 30 | tristate "USB Konica Webcam support" |
| 31 | depends on USB && VIDEO_V4L1 | 31 | depends on USB && VIDEO_DEV && VIDEO_V4L1 |
| 32 | select VIDEO_USBVIDEO | 32 | select VIDEO_USBVIDEO |
| 33 | ---help--- | 33 | ---help--- |
| 34 | Say Y here if you want support for webcams based on a Konica | 34 | Say Y here if you want support for webcams based on a Konica |
| @@ -39,7 +39,7 @@ config USB_KONICAWC | |||
| 39 | 39 | ||
| 40 | config USB_QUICKCAM_MESSENGER | 40 | config USB_QUICKCAM_MESSENGER |
| 41 | tristate "USB Logitech Quickcam Messenger" | 41 | tristate "USB Logitech Quickcam Messenger" |
| 42 | depends on USB && VIDEO_DEV | 42 | depends on USB && VIDEO_DEV && VIDEO_V4L1 |
| 43 | select VIDEO_USBVIDEO | 43 | select VIDEO_USBVIDEO |
| 44 | ---help--- | 44 | ---help--- |
| 45 | Say Y or M here to enable support for the USB Logitech Quickcam | 45 | Say Y or M here to enable support for the USB Logitech Quickcam |
diff --git a/drivers/media/video/v4l2-common.c b/drivers/media/video/v4l2-common.c index f06dc19e504a..2ecbeffb559e 100644 --- a/drivers/media/video/v4l2-common.c +++ b/drivers/media/video/v4l2-common.c | |||
| @@ -202,7 +202,7 @@ static char *v4l2_memory_names[] = { | |||
| 202 | /* ------------------------------------------------------------------ */ | 202 | /* ------------------------------------------------------------------ */ |
| 203 | /* debug help functions */ | 203 | /* debug help functions */ |
| 204 | 204 | ||
| 205 | #ifdef HAVE_V4L1 | 205 | #ifdef CONFIG_V4L1_COMPAT |
| 206 | static const char *v4l1_ioctls[] = { | 206 | static const char *v4l1_ioctls[] = { |
| 207 | [_IOC_NR(VIDIOCGCAP)] = "VIDIOCGCAP", | 207 | [_IOC_NR(VIDIOCGCAP)] = "VIDIOCGCAP", |
| 208 | [_IOC_NR(VIDIOCGCHAN)] = "VIDIOCGCHAN", | 208 | [_IOC_NR(VIDIOCGCHAN)] = "VIDIOCGCHAN", |
| @@ -301,7 +301,7 @@ static const char *v4l2_ioctls[] = { | |||
| 301 | #define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls) | 301 | #define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls) |
| 302 | 302 | ||
| 303 | static const char *v4l2_int_ioctls[] = { | 303 | static const char *v4l2_int_ioctls[] = { |
| 304 | #ifdef HAVE_VIDEO_DECODER | 304 | #ifdef CONFIG_V4L1_COMPAT |
| 305 | [_IOC_NR(DECODER_GET_CAPABILITIES)] = "DECODER_GET_CAPABILITIES", | 305 | [_IOC_NR(DECODER_GET_CAPABILITIES)] = "DECODER_GET_CAPABILITIES", |
| 306 | [_IOC_NR(DECODER_GET_STATUS)] = "DECODER_GET_STATUS", | 306 | [_IOC_NR(DECODER_GET_STATUS)] = "DECODER_GET_STATUS", |
| 307 | [_IOC_NR(DECODER_SET_NORM)] = "DECODER_SET_NORM", | 307 | [_IOC_NR(DECODER_SET_NORM)] = "DECODER_SET_NORM", |
| @@ -367,7 +367,7 @@ void v4l_printk_ioctl(unsigned int cmd) | |||
| 367 | (_IOC_NR(cmd) < V4L2_INT_IOCTLS) ? | 367 | (_IOC_NR(cmd) < V4L2_INT_IOCTLS) ? |
| 368 | v4l2_int_ioctls[_IOC_NR(cmd)] : "UNKNOWN", dir, cmd); | 368 | v4l2_int_ioctls[_IOC_NR(cmd)] : "UNKNOWN", dir, cmd); |
| 369 | break; | 369 | break; |
| 370 | #ifdef HAVE_V4L1 | 370 | #ifdef CONFIG_V4L1_COMPAT |
| 371 | case 'v': | 371 | case 'v': |
| 372 | printk("v4l1 ioctl %s, dir=%s (0x%08x)\n", | 372 | printk("v4l1 ioctl %s, dir=%s (0x%08x)\n", |
| 373 | (_IOC_NR(cmd) < V4L1_IOCTLS) ? | 373 | (_IOC_NR(cmd) < V4L1_IOCTLS) ? |
| @@ -414,6 +414,7 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg) | |||
| 414 | printk ("%s: tuner type=%d\n", s, *p); | 414 | printk ("%s: tuner type=%d\n", s, *p); |
| 415 | break; | 415 | break; |
| 416 | } | 416 | } |
| 417 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | ||
| 417 | case DECODER_SET_VBI_BYPASS: | 418 | case DECODER_SET_VBI_BYPASS: |
| 418 | case DECODER_ENABLE_OUTPUT: | 419 | case DECODER_ENABLE_OUTPUT: |
| 419 | case DECODER_GET_STATUS: | 420 | case DECODER_GET_STATUS: |
| @@ -424,6 +425,7 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg) | |||
| 424 | case VIDIOCCAPTURE: | 425 | case VIDIOCCAPTURE: |
| 425 | case VIDIOCSYNC: | 426 | case VIDIOCSYNC: |
| 426 | case VIDIOCSWRITEMODE: | 427 | case VIDIOCSWRITEMODE: |
| 428 | #endif | ||
| 427 | case TUNER_SET_TYPE_ADDR: | 429 | case TUNER_SET_TYPE_ADDR: |
| 428 | case TUNER_SET_STANDBY: | 430 | case TUNER_SET_STANDBY: |
| 429 | case TDA9887_SET_CONFIG: | 431 | case TDA9887_SET_CONFIG: |
| @@ -755,6 +757,7 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg) | |||
| 755 | p->afc); | 757 | p->afc); |
| 756 | break; | 758 | break; |
| 757 | } | 759 | } |
| 760 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | ||
| 758 | case VIDIOCGVBIFMT: | 761 | case VIDIOCGVBIFMT: |
| 759 | case VIDIOCSVBIFMT: | 762 | case VIDIOCSVBIFMT: |
| 760 | { | 763 | { |
| @@ -924,6 +927,14 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg) | |||
| 924 | p->clipcount); | 927 | p->clipcount); |
| 925 | break; | 928 | break; |
| 926 | } | 929 | } |
| 930 | case VIDIOCGFREQ: | ||
| 931 | case VIDIOCSFREQ: | ||
| 932 | { | ||
| 933 | unsigned long *p=arg; | ||
| 934 | printk ("%s: value=%lu\n", s, *p); | ||
| 935 | break; | ||
| 936 | } | ||
| 937 | #endif | ||
| 927 | case VIDIOC_INT_AUDIO_CLOCK_FREQ: | 938 | case VIDIOC_INT_AUDIO_CLOCK_FREQ: |
| 928 | case VIDIOC_INT_I2S_CLOCK_FREQ: | 939 | case VIDIOC_INT_I2S_CLOCK_FREQ: |
| 929 | case VIDIOC_INT_S_STANDBY: | 940 | case VIDIOC_INT_S_STANDBY: |
| @@ -933,13 +944,6 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg) | |||
| 933 | printk ("%s: value=%d\n", s, *p); | 944 | printk ("%s: value=%d\n", s, *p); |
| 934 | break; | 945 | break; |
| 935 | } | 946 | } |
| 936 | case VIDIOCGFREQ: | ||
| 937 | case VIDIOCSFREQ: | ||
| 938 | { | ||
| 939 | unsigned long *p=arg; | ||
| 940 | printk ("%s: value=%lu\n", s, *p); | ||
| 941 | break; | ||
| 942 | } | ||
| 943 | case VIDIOC_G_STD: | 947 | case VIDIOC_G_STD: |
| 944 | case VIDIOC_S_STD: | 948 | case VIDIOC_S_STD: |
| 945 | case VIDIOC_QUERYSTD: | 949 | case VIDIOC_QUERYSTD: |
diff --git a/drivers/media/video/videodev.c b/drivers/media/video/videodev.c index b26ebaff226f..0fc90cd393f6 100644 --- a/drivers/media/video/videodev.c +++ b/drivers/media/video/videodev.c | |||
| @@ -760,7 +760,7 @@ static int __video_do_ioctl(struct inode *inode, struct file *file, | |||
| 760 | ret=vfd->vidioc_overlay(file, fh, *i); | 760 | ret=vfd->vidioc_overlay(file, fh, *i); |
| 761 | break; | 761 | break; |
| 762 | } | 762 | } |
| 763 | #ifdef HAVE_V4L1 | 763 | #ifdef CONFIG_V4L1_COMPAT |
| 764 | /* --- streaming capture ------------------------------------- */ | 764 | /* --- streaming capture ------------------------------------- */ |
| 765 | case VIDIOCGMBUF: | 765 | case VIDIOCGMBUF: |
| 766 | { | 766 | { |
| @@ -1512,6 +1512,7 @@ int video_register_device(struct video_device *vfd, int type, int nr) | |||
| 1512 | int i=0; | 1512 | int i=0; |
| 1513 | int base; | 1513 | int base; |
| 1514 | int end; | 1514 | int end; |
| 1515 | int ret; | ||
| 1515 | char *name_base; | 1516 | char *name_base; |
| 1516 | 1517 | ||
| 1517 | switch(type) | 1518 | switch(type) |
| @@ -1537,6 +1538,8 @@ int video_register_device(struct video_device *vfd, int type, int nr) | |||
| 1537 | name_base = "radio"; | 1538 | name_base = "radio"; |
| 1538 | break; | 1539 | break; |
| 1539 | default: | 1540 | default: |
| 1541 | printk(KERN_ERR "%s called with unknown type: %d\n", | ||
| 1542 | __FUNCTION__, type); | ||
| 1540 | return -1; | 1543 | return -1; |
| 1541 | } | 1544 | } |
| 1542 | 1545 | ||
| @@ -1571,9 +1574,18 @@ int video_register_device(struct video_device *vfd, int type, int nr) | |||
| 1571 | vfd->class_dev.class = &video_class; | 1574 | vfd->class_dev.class = &video_class; |
| 1572 | vfd->class_dev.devt = MKDEV(VIDEO_MAJOR, vfd->minor); | 1575 | vfd->class_dev.devt = MKDEV(VIDEO_MAJOR, vfd->minor); |
| 1573 | sprintf(vfd->class_dev.class_id, "%s%d", name_base, i - base); | 1576 | sprintf(vfd->class_dev.class_id, "%s%d", name_base, i - base); |
| 1574 | class_device_register(&vfd->class_dev); | 1577 | ret = class_device_register(&vfd->class_dev); |
| 1575 | class_device_create_file(&vfd->class_dev, | 1578 | if (ret < 0) { |
| 1576 | &class_device_attr_name); | 1579 | printk(KERN_ERR "%s: class_device_register failed\n", |
| 1580 | __FUNCTION__); | ||
| 1581 | goto fail_minor; | ||
| 1582 | } | ||
| 1583 | ret = class_device_create_file(&vfd->class_dev, &class_device_attr_name); | ||
| 1584 | if (ret < 0) { | ||
| 1585 | printk(KERN_ERR "%s: class_device_create_file 'name' failed\n", | ||
| 1586 | __FUNCTION__); | ||
| 1587 | goto fail_classdev; | ||
| 1588 | } | ||
| 1577 | 1589 | ||
| 1578 | #if 1 | 1590 | #if 1 |
| 1579 | /* needed until all drivers are fixed */ | 1591 | /* needed until all drivers are fixed */ |
| @@ -1583,6 +1595,15 @@ int video_register_device(struct video_device *vfd, int type, int nr) | |||
| 1583 | "http://lwn.net/Articles/36850/\n", vfd->name); | 1595 | "http://lwn.net/Articles/36850/\n", vfd->name); |
| 1584 | #endif | 1596 | #endif |
| 1585 | return 0; | 1597 | return 0; |
| 1598 | |||
| 1599 | fail_classdev: | ||
| 1600 | class_device_unregister(&vfd->class_dev); | ||
| 1601 | fail_minor: | ||
| 1602 | mutex_lock(&videodev_lock); | ||
| 1603 | video_device[vfd->minor] = NULL; | ||
| 1604 | vfd->minor = -1; | ||
| 1605 | mutex_unlock(&videodev_lock); | ||
| 1606 | return ret; | ||
| 1586 | } | 1607 | } |
| 1587 | 1608 | ||
| 1588 | /** | 1609 | /** |
diff --git a/drivers/media/video/vivi.c b/drivers/media/video/vivi.c index 41d23c8acbd8..38bd0c1018c2 100644 --- a/drivers/media/video/vivi.c +++ b/drivers/media/video/vivi.c | |||
| @@ -986,7 +986,7 @@ static int vidioc_dqbuf (struct file *file, void *priv, struct v4l2_buffer *p) | |||
| 986 | file->f_flags & O_NONBLOCK)); | 986 | file->f_flags & O_NONBLOCK)); |
| 987 | } | 987 | } |
| 988 | 988 | ||
| 989 | #ifdef HAVE_V4L1 | 989 | #ifdef CONFIG_V4L1_COMPAT |
| 990 | static int vidiocgmbuf (struct file *file, void *priv, struct video_mbuf *mbuf) | 990 | static int vidiocgmbuf (struct file *file, void *priv, struct video_mbuf *mbuf) |
| 991 | { | 991 | { |
| 992 | struct vivi_fh *fh=priv; | 992 | struct vivi_fh *fh=priv; |
| @@ -1328,7 +1328,7 @@ static struct video_device vivi = { | |||
| 1328 | .vidioc_s_ctrl = vidioc_s_ctrl, | 1328 | .vidioc_s_ctrl = vidioc_s_ctrl, |
| 1329 | .vidioc_streamon = vidioc_streamon, | 1329 | .vidioc_streamon = vidioc_streamon, |
| 1330 | .vidioc_streamoff = vidioc_streamoff, | 1330 | .vidioc_streamoff = vidioc_streamoff, |
| 1331 | #ifdef HAVE_V4L1 | 1331 | #ifdef CONFIG_V4L1_COMPAT |
| 1332 | .vidiocgmbuf = vidiocgmbuf, | 1332 | .vidiocgmbuf = vidiocgmbuf, |
| 1333 | #endif | 1333 | #endif |
| 1334 | .tvnorms = tvnorms, | 1334 | .tvnorms = tvnorms, |
diff --git a/include/linux/videodev.h b/include/linux/videodev.h index 41bc7e9603cd..518c7a32175e 100644 --- a/include/linux/videodev.h +++ b/include/linux/videodev.h | |||
| @@ -12,10 +12,11 @@ | |||
| 12 | #ifndef __LINUX_VIDEODEV_H | 12 | #ifndef __LINUX_VIDEODEV_H |
| 13 | #define __LINUX_VIDEODEV_H | 13 | #define __LINUX_VIDEODEV_H |
| 14 | 14 | ||
| 15 | #define HAVE_V4L1 1 | ||
| 16 | |||
| 17 | #include <linux/videodev2.h> | 15 | #include <linux/videodev2.h> |
| 18 | 16 | ||
| 17 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | ||
| 18 | #define HAVE_V4L1 1 | ||
| 19 | |||
| 19 | struct video_capability | 20 | struct video_capability |
| 20 | { | 21 | { |
| 21 | char name[32]; | 22 | char name[32]; |
| @@ -336,6 +337,8 @@ struct video_code | |||
| 336 | #define VID_HARDWARE_SN9C102 38 | 337 | #define VID_HARDWARE_SN9C102 38 |
| 337 | #define VID_HARDWARE_ARV 39 | 338 | #define VID_HARDWARE_ARV 39 |
| 338 | 339 | ||
| 340 | #endif /* CONFIG_VIDEO_V4L1_COMPAT */ | ||
| 341 | |||
| 339 | #endif /* __LINUX_VIDEODEV_H */ | 342 | #endif /* __LINUX_VIDEODEV_H */ |
| 340 | 343 | ||
| 341 | /* | 344 | /* |
diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index a62673dad76e..b7146956a929 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h | |||
| @@ -716,7 +716,7 @@ struct v4l2_ext_control | |||
| 716 | __s64 value64; | 716 | __s64 value64; |
| 717 | void *reserved; | 717 | void *reserved; |
| 718 | }; | 718 | }; |
| 719 | }; | 719 | } __attribute__ ((packed)); |
| 720 | 720 | ||
| 721 | struct v4l2_ext_controls | 721 | struct v4l2_ext_controls |
| 722 | { | 722 | { |
diff --git a/include/media/v4l2-dev.h b/include/media/v4l2-dev.h index 62dae1a8c441..f8665326ed9f 100644 --- a/include/media/v4l2-dev.h +++ b/include/media/v4l2-dev.h | |||
| @@ -341,11 +341,14 @@ extern int video_usercopy(struct inode *inode, struct file *file, | |||
| 341 | extern struct video_device* video_devdata(struct file*); | 341 | extern struct video_device* video_devdata(struct file*); |
| 342 | 342 | ||
| 343 | #define to_video_device(cd) container_of(cd, struct video_device, class_dev) | 343 | #define to_video_device(cd) container_of(cd, struct video_device, class_dev) |
| 344 | static inline void | 344 | static inline int |
| 345 | video_device_create_file(struct video_device *vfd, | 345 | video_device_create_file(struct video_device *vfd, |
| 346 | struct class_device_attribute *attr) | 346 | struct class_device_attribute *attr) |
| 347 | { | 347 | { |
| 348 | class_device_create_file(&vfd->class_dev, attr); | 348 | int ret = class_device_create_file(&vfd->class_dev, attr); |
| 349 | if (ret < 0) | ||
| 350 | printk(KERN_WARNING "%s error: %d\n", __FUNCTION__, ret); | ||
| 351 | return ret; | ||
| 349 | } | 352 | } |
| 350 | static inline void | 353 | static inline void |
| 351 | video_device_remove_file(struct video_device *vfd, | 354 | video_device_remove_file(struct video_device *vfd, |
