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. ...
This commit is contained in:
commit
a205729e2c
39 changed files with 354 additions and 143 deletions
|
@ -526,7 +526,9 @@ static int dvb_frontend_thread(void *data)
|
|||
fepriv->delay = 3*HZ;
|
||||
fepriv->status = 0;
|
||||
fepriv->wakeup = 0;
|
||||
fepriv->reinitialise = 1;
|
||||
fepriv->reinitialise = 0;
|
||||
|
||||
dvb_frontend_init(fe);
|
||||
|
||||
while (1) {
|
||||
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)
|
|||
return ret;
|
||||
|
||||
if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
|
||||
|
||||
/* normal tune mode when opened R/W */
|
||||
fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT;
|
||||
fepriv->tone = -1;
|
||||
fepriv->voltage = -1;
|
||||
|
||||
ret = dvb_frontend_start (fe);
|
||||
if (ret)
|
||||
dvb_generic_release (inode, file);
|
||||
|
||||
/* empty event queue */
|
||||
fepriv->events.eventr = fepriv->events.eventw = 0;
|
||||
|
||||
/* normal tune mode when opened R/W */
|
||||
fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT;
|
||||
fepriv->tone = -1;
|
||||
fepriv->voltage = -1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -194,11 +194,11 @@ struct dvb_pll_desc dvb_pll_tda665x = {
|
|||
{ 253834000, 36249333, 166667, 0xca, 0x62 /* 011 0 0 0 10 */ },
|
||||
{ 383834000, 36249333, 166667, 0xca, 0xa2 /* 101 0 0 0 10 */ },
|
||||
{ 443834000, 36249333, 166667, 0xca, 0xc2 /* 110 0 0 0 10 */ },
|
||||
{ 444000000, 36249333, 166667, 0xca, 0xc3 /* 110 0 0 0 11 */ },
|
||||
{ 583834000, 36249333, 166667, 0xca, 0x63 /* 011 0 0 0 11 */ },
|
||||
{ 793834000, 36249333, 166667, 0xca, 0xa3 /* 101 0 0 0 11 */ },
|
||||
{ 444834000, 36249333, 166667, 0xca, 0xc3 /* 110 0 0 0 11 */ },
|
||||
{ 861000000, 36249333, 166667, 0xca, 0xe3 /* 111 0 0 0 11 */ },
|
||||
{ 444000000, 36249333, 166667, 0xca, 0xc4 /* 110 0 0 1 00 */ },
|
||||
{ 583834000, 36249333, 166667, 0xca, 0x64 /* 011 0 0 1 00 */ },
|
||||
{ 793834000, 36249333, 166667, 0xca, 0xa4 /* 101 0 0 1 00 */ },
|
||||
{ 444834000, 36249333, 166667, 0xca, 0xc4 /* 110 0 0 1 00 */ },
|
||||
{ 861000000, 36249333, 166667, 0xca, 0xe4 /* 111 0 0 1 00 */ },
|
||||
}
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_tda665x);
|
||||
|
@ -613,7 +613,21 @@ static struct dvb_tuner_ops dvb_pll_tuner_ops = {
|
|||
|
||||
int dvb_pll_attach(struct dvb_frontend *fe, int pll_addr, struct i2c_adapter *i2c, struct dvb_pll_desc *desc)
|
||||
{
|
||||
u8 b1 [] = { 0 };
|
||||
struct i2c_msg msg = { .addr = pll_addr, .flags = I2C_M_RD, .buf = b1, .len = 1 };
|
||||
struct dvb_pll_priv *priv = NULL;
|
||||
int ret;
|
||||
|
||||
if (i2c != NULL) {
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
fe->ops.i2c_gate_ctrl(fe, 1);
|
||||
|
||||
ret = i2c_transfer (i2c, &msg, 1);
|
||||
if (ret != 1)
|
||||
return -1;
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
fe->ops.i2c_gate_ctrl(fe, 0);
|
||||
}
|
||||
|
||||
priv = kzalloc(sizeof(struct dvb_pll_priv), GFP_KERNEL);
|
||||
if (priv == NULL)
|
||||
|
|
|
@ -2203,8 +2203,8 @@ static int frontend_init(struct av7110 *av7110)
|
|||
av7110->fe->ops.tuner_ops.set_params = nexusca_stv0297_tuner_set_params;
|
||||
|
||||
/* set TDA9819 into DVB mode */
|
||||
saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9198 pin9(STD)
|
||||
saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9198 pin30(VIF)
|
||||
saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD)
|
||||
saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF)
|
||||
|
||||
/* tuner on this needs a slower i2c bus speed */
|
||||
av7110->dev->i2c_bitrate = SAA7146_I2C_BUS_BIT_RATE_240;
|
||||
|
|
|
@ -272,8 +272,8 @@ static int av7110_dvb_c_switch(struct saa7146_fh *fh)
|
|||
if (ves1820_writereg(dev, 0x09, 0x0f, 0x60))
|
||||
dprintk(1, "setting band in demodulator failed.\n");
|
||||
} else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) {
|
||||
saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // TDA9198 pin9(STD)
|
||||
saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); // TDA9198 pin30(VIF)
|
||||
saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // TDA9819 pin9(STD)
|
||||
saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); // TDA9819 pin30(VIF)
|
||||
}
|
||||
if (i2c_writereg(av7110, 0x48, 0x02, 0xd0) != 1)
|
||||
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)
|
|||
if (ves1820_writereg(dev, 0x09, 0x0f, 0x20))
|
||||
dprintk(1, "setting band in demodulator failed.\n");
|
||||
} else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) {
|
||||
saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTLO); // TDA9198 pin9(STD)
|
||||
saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // TDA9198 pin30(VIF)
|
||||
saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD)
|
||||
saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -750,8 +750,8 @@ int av7110_init_analog_module(struct av7110 *av7110)
|
|||
if (ves1820_writereg(av7110->dev, 0x09, 0x0f, 0x20))
|
||||
dprintk(1, "setting band in demodulator failed.\n");
|
||||
} else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) {
|
||||
saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9198 pin9(STD)
|
||||
saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9198 pin30(VIF)
|
||||
saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD)
|
||||
saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF)
|
||||
}
|
||||
|
||||
/* init the saa7113 */
|
||||
|
|
|
@ -1303,6 +1303,9 @@ static int budget_av_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio
|
|||
budget_av->budget.dvb_adapter.priv = budget_av;
|
||||
frontend_init(budget_av);
|
||||
ciintf_init(budget_av);
|
||||
|
||||
ttpci_budget_init_hooks(&budget_av->budget);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1101,6 +1101,8 @@ static int budget_ci_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio
|
|||
budget_ci->budget.dvb_adapter.priv = budget_ci;
|
||||
frontend_init(budget_ci);
|
||||
|
||||
ttpci_budget_init_hooks(&budget_ci->budget);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -63,9 +63,6 @@ static int stop_ts_capture(struct budget *budget)
|
|||
{
|
||||
dprintk(2, "budget: %p\n", budget);
|
||||
|
||||
if (--budget->feeding)
|
||||
return budget->feeding;
|
||||
|
||||
saa7146_write(budget->dev, MC1, MASK_20); // DMA3 off
|
||||
SAA7146_IER_DISABLE(budget->dev, MASK_10);
|
||||
return 0;
|
||||
|
@ -77,8 +74,8 @@ static int start_ts_capture(struct budget *budget)
|
|||
|
||||
dprintk(2, "budget: %p\n", budget);
|
||||
|
||||
if (budget->feeding)
|
||||
return ++budget->feeding;
|
||||
if (!budget->feeding || !budget->fe_synced)
|
||||
return 0;
|
||||
|
||||
saa7146_write(dev, MC1, MASK_20); // DMA3 off
|
||||
|
||||
|
@ -139,7 +136,33 @@ static int start_ts_capture(struct budget *budget)
|
|||
SAA7146_IER_ENABLE(budget->dev, MASK_10); /* VPE */
|
||||
saa7146_write(dev, MC1, (MASK_04 | MASK_20)); /* DMA3 on */
|
||||
|
||||
return ++budget->feeding;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int budget_read_fe_status(struct dvb_frontend *fe, fe_status_t *status)
|
||||
{
|
||||
struct budget *budget = (struct budget *) fe->dvb->priv;
|
||||
int synced;
|
||||
int ret;
|
||||
|
||||
if (budget->read_fe_status)
|
||||
ret = budget->read_fe_status(fe, status);
|
||||
else
|
||||
ret = -EINVAL;
|
||||
|
||||
if (!ret) {
|
||||
synced = (*status & FE_HAS_LOCK);
|
||||
if (synced != budget->fe_synced) {
|
||||
budget->fe_synced = synced;
|
||||
spin_lock(&budget->feedlock);
|
||||
if (synced)
|
||||
start_ts_capture(budget);
|
||||
else
|
||||
stop_ts_capture(budget);
|
||||
spin_unlock(&budget->feedlock);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void vpeirq(unsigned long data)
|
||||
|
@ -267,7 +290,7 @@ static int budget_start_feed(struct dvb_demux_feed *feed)
|
|||
{
|
||||
struct dvb_demux *demux = feed->demux;
|
||||
struct budget *budget = (struct budget *) demux->priv;
|
||||
int status;
|
||||
int status = 0;
|
||||
|
||||
dprintk(2, "budget: %p\n", budget);
|
||||
|
||||
|
@ -276,7 +299,8 @@ static int budget_start_feed(struct dvb_demux_feed *feed)
|
|||
|
||||
spin_lock(&budget->feedlock);
|
||||
feed->pusi_seen = 0; /* have a clean section start */
|
||||
status = start_ts_capture(budget);
|
||||
if (budget->feeding++ == 0)
|
||||
status = start_ts_capture(budget);
|
||||
spin_unlock(&budget->feedlock);
|
||||
return status;
|
||||
}
|
||||
|
@ -285,12 +309,13 @@ static int budget_stop_feed(struct dvb_demux_feed *feed)
|
|||
{
|
||||
struct dvb_demux *demux = feed->demux;
|
||||
struct budget *budget = (struct budget *) demux->priv;
|
||||
int status;
|
||||
int status = 0;
|
||||
|
||||
dprintk(2, "budget: %p\n", budget);
|
||||
|
||||
spin_lock(&budget->feedlock);
|
||||
status = stop_ts_capture(budget);
|
||||
if (--budget->feeding == 0)
|
||||
status = stop_ts_capture(budget);
|
||||
spin_unlock(&budget->feedlock);
|
||||
return status;
|
||||
}
|
||||
|
@ -470,6 +495,14 @@ int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev,
|
|||
return ret;
|
||||
}
|
||||
|
||||
void ttpci_budget_init_hooks(struct budget *budget)
|
||||
{
|
||||
if (budget->dvb_frontend && !budget->read_fe_status) {
|
||||
budget->read_fe_status = budget->dvb_frontend->ops.read_status;
|
||||
budget->dvb_frontend->ops.read_status = budget_read_fe_status;
|
||||
}
|
||||
}
|
||||
|
||||
int ttpci_budget_deinit(struct budget *budget)
|
||||
{
|
||||
struct saa7146_dev *dev = budget->dev;
|
||||
|
@ -508,11 +541,8 @@ void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port)
|
|||
spin_lock(&budget->feedlock);
|
||||
budget->video_port = video_port;
|
||||
if (budget->feeding) {
|
||||
int oldfeeding = budget->feeding;
|
||||
budget->feeding = 1;
|
||||
stop_ts_capture(budget);
|
||||
start_ts_capture(budget);
|
||||
budget->feeding = oldfeeding;
|
||||
}
|
||||
spin_unlock(&budget->feedlock);
|
||||
}
|
||||
|
@ -520,6 +550,7 @@ void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port)
|
|||
EXPORT_SYMBOL_GPL(ttpci_budget_debiread);
|
||||
EXPORT_SYMBOL_GPL(ttpci_budget_debiwrite);
|
||||
EXPORT_SYMBOL_GPL(ttpci_budget_init);
|
||||
EXPORT_SYMBOL_GPL(ttpci_budget_init_hooks);
|
||||
EXPORT_SYMBOL_GPL(ttpci_budget_deinit);
|
||||
EXPORT_SYMBOL_GPL(ttpci_budget_irq10_handler);
|
||||
EXPORT_SYMBOL_GPL(ttpci_budget_set_video_port);
|
||||
|
|
|
@ -617,6 +617,8 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte
|
|||
budget->dvb_adapter.priv = budget;
|
||||
frontend_init(budget);
|
||||
|
||||
ttpci_budget_init_hooks(budget);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -375,9 +375,6 @@ static void frontend_init(struct budget *budget)
|
|||
if (budget->dvb_frontend) {
|
||||
budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params;
|
||||
budget->dvb_frontend->tuner_priv = &budget->i2c_adap;
|
||||
budget->dvb_frontend->ops.diseqc_send_master_cmd = budget_diseqc_send_master_cmd;
|
||||
budget->dvb_frontend->ops.diseqc_send_burst = budget_diseqc_send_burst;
|
||||
budget->dvb_frontend->ops.set_tone = budget_set_tone;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
@ -474,6 +471,8 @@ static int budget_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_
|
|||
budget->dvb_adapter.priv = budget;
|
||||
frontend_init(budget);
|
||||
|
||||
ttpci_budget_init_hooks(budget);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -52,9 +52,6 @@ struct budget {
|
|||
struct dmx_frontend hw_frontend;
|
||||
struct dmx_frontend mem_frontend;
|
||||
|
||||
int fe_synced;
|
||||
struct mutex pid_mutex;
|
||||
|
||||
int ci_present;
|
||||
int video_port;
|
||||
|
||||
|
@ -74,6 +71,9 @@ struct budget {
|
|||
|
||||
struct dvb_adapter dvb_adapter;
|
||||
struct dvb_frontend *dvb_frontend;
|
||||
int (*read_fe_status)(struct dvb_frontend *fe, fe_status_t *status);
|
||||
int fe_synced;
|
||||
|
||||
void *priv;
|
||||
};
|
||||
|
||||
|
@ -106,6 +106,7 @@ static struct saa7146_pci_extension_data x_var = { \
|
|||
extern int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev,
|
||||
struct saa7146_pci_extension_data *info,
|
||||
struct module *owner);
|
||||
extern void ttpci_budget_init_hooks(struct budget *budget);
|
||||
extern int ttpci_budget_deinit(struct budget *budget);
|
||||
extern void ttpci_budget_irq10_handler(struct saa7146_dev *dev, u32 * isr);
|
||||
extern void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port);
|
||||
|
|
|
@ -145,7 +145,7 @@ config VIDEO_SAA5246A
|
|||
|
||||
config VIDEO_SAA5249
|
||||
tristate "SAA5249 Teletext processor"
|
||||
depends on VIDEO_DEV && I2C
|
||||
depends on VIDEO_DEV && I2C && VIDEO_V4L1
|
||||
help
|
||||
Support for I2C bus based teletext using the SAA5249 chip. At the
|
||||
moment this is only useful on some European WinTV cards.
|
||||
|
@ -155,7 +155,7 @@ config VIDEO_SAA5249
|
|||
|
||||
config TUNER_3036
|
||||
tristate "SAB3036 tuner"
|
||||
depends on VIDEO_DEV && I2C
|
||||
depends on VIDEO_DEV && I2C && VIDEO_V4L1
|
||||
help
|
||||
Say Y here to include support for Philips SAB3036 compatible tuners.
|
||||
If in doubt, say N.
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
config VIDEO_BT848
|
||||
tristate "BT848 Video For Linux"
|
||||
depends on VIDEO_DEV && PCI && I2C && VIDEO_V4L2
|
||||
depends on VIDEO_DEV && PCI && I2C && VIDEO_V4L1
|
||||
select I2C_ALGOBIT
|
||||
select FW_LOADER
|
||||
select VIDEO_BTCX
|
||||
|
|
|
@ -3923,7 +3923,12 @@ static int __devinit bttv_register_video(struct bttv *btv)
|
|||
goto err;
|
||||
printk(KERN_INFO "bttv%d: registered device video%d\n",
|
||||
btv->c.nr,btv->video_dev->minor & 0x1f);
|
||||
video_device_create_file(btv->video_dev, &class_device_attr_card);
|
||||
if (class_device_create_file(&btv->video_dev->class_dev,
|
||||
&class_device_attr_card)<0) {
|
||||
printk(KERN_ERR "bttv%d: class_device_create_file 'card' "
|
||||
"failed\n", btv->c.nr);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* vbi */
|
||||
btv->vbi_dev = vdev_init(btv, &bttv_vbi_template, "vbi");
|
||||
|
@ -4287,6 +4292,8 @@ static struct pci_driver bttv_pci_driver = {
|
|||
|
||||
static int bttv_init_module(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
bttv_num = 0;
|
||||
|
||||
printk(KERN_INFO "bttv: driver version %d.%d.%d loaded\n",
|
||||
|
@ -4308,7 +4315,11 @@ static int bttv_init_module(void)
|
|||
|
||||
bttv_check_chipset();
|
||||
|
||||
bus_register(&bttv_sub_bus_type);
|
||||
ret = bus_register(&bttv_sub_bus_type);
|
||||
if (ret < 0) {
|
||||
printk(KERN_WARNING "bttv: bus_register error: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
return pci_register_driver(&bttv_pci_driver);
|
||||
}
|
||||
|
||||
|
|
|
@ -31,11 +31,16 @@
|
|||
#include <asm/io.h>
|
||||
#include "bttvp.h"
|
||||
|
||||
/* Offset from line sync pulse leading edge (0H) in 1 / sampling_rate:
|
||||
bt8x8 /HRESET pulse starts at 0H and has length 64 / fCLKx1 (E|O_VTC
|
||||
HSFMT = 0). VBI_HDELAY (always 0) is an offset from the trailing edge
|
||||
of /HRESET in 1 / fCLKx1, and the sampling_rate tvnorm->Fsc is fCLKx2. */
|
||||
#define VBI_OFFSET ((64 + 0) * 2)
|
||||
/* Offset from line sync pulse leading edge (0H) to start of VBI capture,
|
||||
in fCLKx2 pixels. According to the datasheet, VBI capture starts
|
||||
VBI_HDELAY fCLKx1 pixels from the tailing edgeof /HRESET, and /HRESET
|
||||
is 64 fCLKx1 pixels wide. VBI_HDELAY is set to 0, so this should be
|
||||
(64 + 0) * 2 = 128 fCLKx2 pixels. But it's not! The datasheet is
|
||||
Just Plain Wrong. The real value appears to be different for
|
||||
different revisions of the bt8x8 chips, and to be affected by the
|
||||
horizontal scaling factor. Experimentally, the value is measured
|
||||
to be about 244. */
|
||||
#define VBI_OFFSET 244
|
||||
|
||||
#define VBI_DEFLINES 16
|
||||
#define VBI_MAXLINES 32
|
||||
|
|
|
@ -490,6 +490,23 @@ static inline int put_v4l2_input(struct v4l2_input *kp, struct v4l2_input __user
|
|||
return 0;
|
||||
}
|
||||
|
||||
struct video_code32
|
||||
{
|
||||
char loadwhat[16]; /* name or tag of file being passed */
|
||||
compat_int_t datasize;
|
||||
unsigned char *data;
|
||||
};
|
||||
|
||||
static inline int microcode32(struct video_code *kp, struct video_code32 __user *up)
|
||||
{
|
||||
if(!access_ok(VERIFY_READ, up, sizeof(struct video_code32)) ||
|
||||
copy_from_user(kp->loadwhat, up->loadwhat, sizeof (up->loadwhat)) ||
|
||||
get_user(kp->datasize, &up->datasize) ||
|
||||
copy_from_user(kp->data, up->data, up->datasize))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define VIDIOCGTUNER32 _IOWR('v',4, struct video_tuner32)
|
||||
#define VIDIOCSTUNER32 _IOW('v',5, struct video_tuner32)
|
||||
#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
|
|||
#define VIDIOCSFBUF32 _IOW('v',12, struct video_buffer32)
|
||||
#define VIDIOCGFREQ32 _IOR('v',14, u32)
|
||||
#define VIDIOCSFREQ32 _IOW('v',15, u32)
|
||||
#define VIDIOCSMICROCODE32 _IOW('v',27, struct video_code32)
|
||||
|
||||
/* VIDIOC_ENUMINPUT32 is VIDIOC_ENUMINPUT minus 4 bytes of padding alignement */
|
||||
#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
|
|||
struct video_tuner vt;
|
||||
struct video_buffer vb;
|
||||
struct video_window vw;
|
||||
struct video_code vc;
|
||||
struct v4l2_format v2f;
|
||||
struct v4l2_buffer v2b;
|
||||
struct v4l2_framebuffer v2fb;
|
||||
|
@ -628,6 +647,7 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg
|
|||
case VIDIOC_G_INPUT32: cmd = VIDIOC_G_INPUT; break;
|
||||
case VIDIOC_S_INPUT32: cmd = VIDIOC_S_INPUT; break;
|
||||
case VIDIOC_TRY_FMT32: cmd = VIDIOC_TRY_FMT; break;
|
||||
case VIDIOCSMICROCODE32: cmd = VIDIOCSMICROCODE; break;
|
||||
};
|
||||
|
||||
switch(cmd) {
|
||||
|
@ -703,6 +723,10 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg
|
|||
case VIDIOC_G_FBUF:
|
||||
case VIDIOC_G_INPUT:
|
||||
compatible_arg = 0;
|
||||
case VIDIOCSMICROCODE:
|
||||
err = microcode32(&karg.vc, up);
|
||||
compatible_arg = 0;
|
||||
break;
|
||||
};
|
||||
|
||||
if(err)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
config VIDEO_CPIA2
|
||||
tristate "CPiA2 Video For Linux"
|
||||
depends on VIDEO_DEV && USB
|
||||
depends on VIDEO_DEV && USB && VIDEO_V4L1
|
||||
---help---
|
||||
This is the video4linux driver for cameras based on Vision's CPiA2
|
||||
(Colour Processor Interface ASIC), such as the Digital Blue QX5
|
||||
|
|
|
@ -89,7 +89,7 @@ static void cx88_ir_handle_key(struct cx88_IR *ir)
|
|||
|
||||
auxgpio = cx_read(MO_GP1_IO);
|
||||
/* Take out the parity part */
|
||||
gpio+=(gpio & 0x7fd) + (auxgpio & 0xef);
|
||||
gpio=(gpio & 0x7fd) + (auxgpio & 0xef);
|
||||
} else
|
||||
auxgpio = gpio;
|
||||
|
||||
|
|
|
@ -1180,7 +1180,6 @@ static int video_do_ioctl(struct inode *inode, struct file *file,
|
|||
V4L2_CAP_READWRITE |
|
||||
V4L2_CAP_STREAMING |
|
||||
V4L2_CAP_VBI_CAPTURE |
|
||||
V4L2_CAP_VIDEO_OVERLAY |
|
||||
0;
|
||||
if (UNSET != core->tuner_type)
|
||||
cap->capabilities |= V4L2_CAP_TUNER;
|
||||
|
@ -1226,7 +1225,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file,
|
|||
struct v4l2_format *f = arg;
|
||||
return cx8800_try_fmt(dev,fh,f);
|
||||
}
|
||||
#ifdef HAVE_V4L1
|
||||
#ifdef CONFIG_V4L1_COMPAT
|
||||
/* --- streaming capture ------------------------------------- */
|
||||
case VIDIOCGMBUF:
|
||||
{
|
||||
|
@ -1585,7 +1584,7 @@ static int radio_do_ioctl(struct inode *inode, struct file *file,
|
|||
*id = 0;
|
||||
return 0;
|
||||
}
|
||||
#ifdef HAVE_V4L1
|
||||
#ifdef CONFIG_V4L1_COMPAT
|
||||
case VIDIOCSTUNER:
|
||||
{
|
||||
struct video_tuner *v = arg;
|
||||
|
|
|
@ -362,7 +362,7 @@ int msp_sleep(struct msp_state *state, int timeout)
|
|||
}
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
#ifdef CONFIG_VIDEO_V4L1
|
||||
static int msp_mode_v4l2_to_v4l1(int rxsubchans, int audmode)
|
||||
{
|
||||
if (rxsubchans == V4L2_TUNER_SUB_MONO)
|
||||
|
@ -384,6 +384,7 @@ static int msp_mode_v4l1_to_v4l2(int mode)
|
|||
return V4L2_TUNER_MODE_LANG1;
|
||||
return V4L2_TUNER_MODE_MONO;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int msp_get_ctrl(struct i2c_client *client, struct v4l2_control *ctrl)
|
||||
{
|
||||
|
@ -509,6 +510,7 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
|||
/* --- v4l ioctls --- */
|
||||
/* take care: bttv does userspace copying, we'll get a
|
||||
kernel pointer here... */
|
||||
#ifdef CONFIG_VIDEO_V4L1
|
||||
case VIDIOCGAUDIO:
|
||||
{
|
||||
struct video_audio *va = arg;
|
||||
|
@ -577,6 +579,12 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
|||
}
|
||||
|
||||
case VIDIOCSFREQ:
|
||||
{
|
||||
/* new channel -- kick audio carrier scan */
|
||||
msp_wake_thread(client);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
case VIDIOC_S_FREQUENCY:
|
||||
{
|
||||
/* new channel -- kick audio carrier scan */
|
||||
|
|
|
@ -852,7 +852,6 @@ unsigned long pvr2_hdw_get_sn(struct pvr2_hdw *hdw)
|
|||
return hdw->serial_number;
|
||||
}
|
||||
|
||||
|
||||
int pvr2_hdw_get_unit_number(struct pvr2_hdw *hdw)
|
||||
{
|
||||
return hdw->unit_number;
|
||||
|
@ -2318,7 +2317,6 @@ void pvr2_hdw_poll_trigger_unlocked(struct pvr2_hdw *hdw)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/* Return name for this driver instance */
|
||||
const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *hdw)
|
||||
{
|
||||
|
@ -2542,6 +2540,10 @@ static void pvr2_ctl_timeout(unsigned long data)
|
|||
}
|
||||
|
||||
|
||||
/* Issue a command and get a response from the device. This extended
|
||||
version includes a probe flag (which if set means that device errors
|
||||
should not be logged or treated as fatal) and a timeout in jiffies.
|
||||
This can be used to non-lethally probe the health of endpoint 1. */
|
||||
static int pvr2_send_request_ex(struct pvr2_hdw *hdw,
|
||||
unsigned int timeout,int probe_fl,
|
||||
void *write_data,unsigned int write_len,
|
||||
|
@ -2970,6 +2972,7 @@ int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *hdw)
|
|||
}
|
||||
|
||||
|
||||
/* Stop / start video stream transport */
|
||||
static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl)
|
||||
{
|
||||
int status;
|
||||
|
@ -3068,6 +3071,7 @@ int pvr2_hdw_gpio_chg_out(struct pvr2_hdw *hdw,u32 msk,u32 val)
|
|||
}
|
||||
|
||||
|
||||
/* Find I2C address of eeprom */
|
||||
static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw)
|
||||
{
|
||||
int result;
|
||||
|
|
|
@ -26,6 +26,8 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
static const char *pvr2_buffer_state_decode(enum pvr2_buffer_state);
|
||||
|
||||
#define BUFFER_SIG 0x47653271
|
||||
|
||||
// #define SANITY_CHECK_BUFFERS
|
||||
|
@ -515,6 +517,10 @@ void pvr2_stream_set_callback(struct pvr2_stream *sp,
|
|||
}
|
||||
|
||||
/* Query / set the nominal buffer count */
|
||||
int pvr2_stream_get_buffer_count(struct pvr2_stream *sp)
|
||||
{
|
||||
return sp->buffer_target_count;
|
||||
}
|
||||
|
||||
int pvr2_stream_set_buffer_count(struct pvr2_stream *sp,unsigned int cnt)
|
||||
{
|
||||
|
@ -553,7 +559,6 @@ int pvr2_stream_get_ready_count(struct pvr2_stream *sp)
|
|||
return sp->r_count;
|
||||
}
|
||||
|
||||
|
||||
void pvr2_stream_kill(struct pvr2_stream *sp)
|
||||
{
|
||||
struct pvr2_buffer *bp;
|
||||
|
@ -607,7 +612,6 @@ int pvr2_buffer_queue(struct pvr2_buffer *bp)
|
|||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int pvr2_buffer_set_buffer(struct pvr2_buffer *bp,void *ptr,unsigned int cnt)
|
||||
{
|
||||
int ret = 0;
|
||||
|
@ -646,7 +650,6 @@ int pvr2_buffer_get_status(struct pvr2_buffer *bp)
|
|||
return bp->status;
|
||||
}
|
||||
|
||||
|
||||
int pvr2_buffer_get_id(struct pvr2_buffer *bp)
|
||||
{
|
||||
return bp->id;
|
||||
|
|
|
@ -47,6 +47,7 @@ void pvr2_stream_set_callback(struct pvr2_stream *,
|
|||
void *data);
|
||||
|
||||
/* Query / set the nominal buffer count */
|
||||
int pvr2_stream_get_buffer_count(struct pvr2_stream *);
|
||||
int pvr2_stream_set_buffer_count(struct pvr2_stream *,unsigned int);
|
||||
|
||||
/* 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);
|
|||
/* Find out how many buffers are idle or ready */
|
||||
int pvr2_stream_get_ready_count(struct pvr2_stream *);
|
||||
|
||||
|
||||
/* Kill all pending buffers and throw away any ready buffers as well */
|
||||
void pvr2_stream_kill(struct pvr2_stream *);
|
||||
|
||||
|
|
|
@ -213,7 +213,9 @@ int pvr2_ioread_setup(struct pvr2_ioread *cp,struct pvr2_stream *sp)
|
|||
" pvr2_ioread_setup (tear-down) id=%p",cp);
|
||||
pvr2_ioread_stop(cp);
|
||||
pvr2_stream_kill(cp->stream);
|
||||
pvr2_stream_set_buffer_count(cp->stream,0);
|
||||
if (pvr2_stream_get_buffer_count(cp->stream)) {
|
||||
pvr2_stream_set_buffer_count(cp->stream,0);
|
||||
}
|
||||
cp->stream = NULL;
|
||||
}
|
||||
if (sp) {
|
||||
|
@ -251,7 +253,6 @@ int pvr2_ioread_set_enabled(struct pvr2_ioread *cp,int fl)
|
|||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int pvr2_ioread_get_buffer(struct pvr2_ioread *cp)
|
||||
{
|
||||
int stat;
|
||||
|
|
|
@ -44,12 +44,16 @@ struct pvr2_sysfs {
|
|||
struct kobj_type ktype;
|
||||
struct class_device_attribute attr_v4l_minor_number;
|
||||
struct class_device_attribute attr_unit_number;
|
||||
int v4l_minor_number_created_ok;
|
||||
int unit_number_created_ok;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC
|
||||
struct pvr2_sysfs_debugifc {
|
||||
struct class_device_attribute attr_debugcmd;
|
||||
struct class_device_attribute attr_debuginfo;
|
||||
int debugcmd_created_ok;
|
||||
int debuginfo_created_ok;
|
||||
};
|
||||
#endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */
|
||||
|
||||
|
@ -67,6 +71,7 @@ struct pvr2_sysfs_ctl_item {
|
|||
struct pvr2_sysfs_ctl_item *item_next;
|
||||
struct attribute *attr_gen[7];
|
||||
struct attribute_group grp;
|
||||
int created_ok;
|
||||
char name[80];
|
||||
};
|
||||
|
||||
|
@ -487,6 +492,7 @@ static void pvr2_sysfs_add_control(struct pvr2_sysfs *sfp,int ctl_id)
|
|||
struct pvr2_sysfs_func_set *fp;
|
||||
struct pvr2_ctrl *cptr;
|
||||
unsigned int cnt,acnt;
|
||||
int ret;
|
||||
|
||||
if ((ctl_id < 0) || (ctl_id >= (sizeof(funcs)/sizeof(funcs[0])))) {
|
||||
return;
|
||||
|
@ -589,7 +595,13 @@ static void pvr2_sysfs_add_control(struct pvr2_sysfs *sfp,int ctl_id)
|
|||
cip->grp.name = cip->name;
|
||||
cip->grp.attrs = cip->attr_gen;
|
||||
|
||||
sysfs_create_group(&sfp->class_dev->kobj,&cip->grp);
|
||||
ret = sysfs_create_group(&sfp->class_dev->kobj,&cip->grp);
|
||||
if (ret) {
|
||||
printk(KERN_WARNING "%s: sysfs_create_group error: %d\n",
|
||||
__FUNCTION__, ret);
|
||||
return;
|
||||
}
|
||||
cip->created_ok = !0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC
|
||||
|
@ -600,6 +612,8 @@ static ssize_t debugcmd_store(struct class_device *,const char *,size_t count);
|
|||
static void pvr2_sysfs_add_debugifc(struct pvr2_sysfs *sfp)
|
||||
{
|
||||
struct pvr2_sysfs_debugifc *dip;
|
||||
int ret;
|
||||
|
||||
dip = kmalloc(sizeof(*dip),GFP_KERNEL);
|
||||
if (!dip) return;
|
||||
memset(dip,0,sizeof(*dip));
|
||||
|
@ -613,17 +627,34 @@ static void pvr2_sysfs_add_debugifc(struct pvr2_sysfs *sfp)
|
|||
dip->attr_debuginfo.attr.mode = S_IRUGO;
|
||||
dip->attr_debuginfo.show = debuginfo_show;
|
||||
sfp->debugifc = dip;
|
||||
class_device_create_file(sfp->class_dev,&dip->attr_debugcmd);
|
||||
class_device_create_file(sfp->class_dev,&dip->attr_debuginfo);
|
||||
ret = class_device_create_file(sfp->class_dev,&dip->attr_debugcmd);
|
||||
if (ret < 0) {
|
||||
printk(KERN_WARNING "%s: class_device_create_file error: %d\n",
|
||||
__FUNCTION__, ret);
|
||||
} else {
|
||||
dip->debugcmd_created_ok = !0;
|
||||
}
|
||||
ret = class_device_create_file(sfp->class_dev,&dip->attr_debuginfo);
|
||||
if (ret < 0) {
|
||||
printk(KERN_WARNING "%s: class_device_create_file error: %d\n",
|
||||
__FUNCTION__, ret);
|
||||
} else {
|
||||
dip->debuginfo_created_ok = !0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void pvr2_sysfs_tear_down_debugifc(struct pvr2_sysfs *sfp)
|
||||
{
|
||||
if (!sfp->debugifc) return;
|
||||
class_device_remove_file(sfp->class_dev,
|
||||
&sfp->debugifc->attr_debuginfo);
|
||||
class_device_remove_file(sfp->class_dev,&sfp->debugifc->attr_debugcmd);
|
||||
if (sfp->debugifc->debuginfo_created_ok) {
|
||||
class_device_remove_file(sfp->class_dev,
|
||||
&sfp->debugifc->attr_debuginfo);
|
||||
}
|
||||
if (sfp->debugifc->debugcmd_created_ok) {
|
||||
class_device_remove_file(sfp->class_dev,
|
||||
&sfp->debugifc->attr_debugcmd);
|
||||
}
|
||||
kfree(sfp->debugifc);
|
||||
sfp->debugifc = NULL;
|
||||
}
|
||||
|
@ -645,7 +676,9 @@ static void pvr2_sysfs_tear_down_controls(struct pvr2_sysfs *sfp)
|
|||
struct pvr2_sysfs_ctl_item *cip1,*cip2;
|
||||
for (cip1 = sfp->item_first; cip1; cip1 = cip2) {
|
||||
cip2 = cip1->item_next;
|
||||
sysfs_remove_group(&sfp->class_dev->kobj,&cip1->grp);
|
||||
if (cip1->created_ok) {
|
||||
sysfs_remove_group(&sfp->class_dev->kobj,&cip1->grp);
|
||||
}
|
||||
pvr2_sysfs_trace("Destroying pvr2_sysfs_ctl_item id=%p",cip1);
|
||||
kfree(cip1);
|
||||
}
|
||||
|
@ -675,8 +708,14 @@ static void class_dev_destroy(struct pvr2_sysfs *sfp)
|
|||
pvr2_sysfs_tear_down_debugifc(sfp);
|
||||
#endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */
|
||||
pvr2_sysfs_tear_down_controls(sfp);
|
||||
class_device_remove_file(sfp->class_dev,&sfp->attr_v4l_minor_number);
|
||||
class_device_remove_file(sfp->class_dev,&sfp->attr_unit_number);
|
||||
if (sfp->v4l_minor_number_created_ok) {
|
||||
class_device_remove_file(sfp->class_dev,
|
||||
&sfp->attr_v4l_minor_number);
|
||||
}
|
||||
if (sfp->unit_number_created_ok) {
|
||||
class_device_remove_file(sfp->class_dev,
|
||||
&sfp->attr_unit_number);
|
||||
}
|
||||
pvr2_sysfs_trace("Destroying class_dev id=%p",sfp->class_dev);
|
||||
sfp->class_dev->class_data = NULL;
|
||||
class_device_unregister(sfp->class_dev);
|
||||
|
@ -709,6 +748,8 @@ static void class_dev_create(struct pvr2_sysfs *sfp,
|
|||
{
|
||||
struct usb_device *usb_dev;
|
||||
struct class_device *class_dev;
|
||||
int ret;
|
||||
|
||||
usb_dev = pvr2_hdw_get_dev(sfp->channel.hdw);
|
||||
if (!usb_dev) return;
|
||||
class_dev = kmalloc(sizeof(*class_dev),GFP_KERNEL);
|
||||
|
@ -733,20 +774,40 @@ static void class_dev_create(struct pvr2_sysfs *sfp,
|
|||
|
||||
sfp->class_dev = class_dev;
|
||||
class_dev->class_data = sfp;
|
||||
class_device_register(class_dev);
|
||||
ret = class_device_register(class_dev);
|
||||
if (ret) {
|
||||
printk(KERN_ERR "%s: class_device_register failed\n",
|
||||
__FUNCTION__);
|
||||
kfree(class_dev);
|
||||
return;
|
||||
}
|
||||
|
||||
sfp->attr_v4l_minor_number.attr.owner = THIS_MODULE;
|
||||
sfp->attr_v4l_minor_number.attr.name = "v4l_minor_number";
|
||||
sfp->attr_v4l_minor_number.attr.mode = S_IRUGO;
|
||||
sfp->attr_v4l_minor_number.show = v4l_minor_number_show;
|
||||
sfp->attr_v4l_minor_number.store = NULL;
|
||||
class_device_create_file(sfp->class_dev,&sfp->attr_v4l_minor_number);
|
||||
ret = class_device_create_file(sfp->class_dev,
|
||||
&sfp->attr_v4l_minor_number);
|
||||
if (ret < 0) {
|
||||
printk(KERN_WARNING "%s: class_device_create_file error: %d\n",
|
||||
__FUNCTION__, ret);
|
||||
} else {
|
||||
sfp->v4l_minor_number_created_ok = !0;
|
||||
}
|
||||
|
||||
sfp->attr_unit_number.attr.owner = THIS_MODULE;
|
||||
sfp->attr_unit_number.attr.name = "unit_number";
|
||||
sfp->attr_unit_number.attr.mode = S_IRUGO;
|
||||
sfp->attr_unit_number.show = unit_number_show;
|
||||
sfp->attr_unit_number.store = NULL;
|
||||
class_device_create_file(sfp->class_dev,&sfp->attr_unit_number);
|
||||
ret = class_device_create_file(sfp->class_dev,&sfp->attr_unit_number);
|
||||
if (ret < 0) {
|
||||
printk(KERN_WARNING "%s: class_device_create_file error: %d\n",
|
||||
__FUNCTION__, ret);
|
||||
} else {
|
||||
sfp->unit_number_created_ok = !0;
|
||||
}
|
||||
|
||||
pvr2_sysfs_add_controls(sfp);
|
||||
#ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC
|
||||
|
|
|
@ -997,9 +997,9 @@ static int saa7134_alsa_init(void)
|
|||
struct saa7134_dev *dev = NULL;
|
||||
struct list_head *list;
|
||||
|
||||
if (!dmasound_init && !dmasound_exit) {
|
||||
dmasound_init = alsa_device_init;
|
||||
dmasound_exit = alsa_device_exit;
|
||||
if (!saa7134_dmasound_init && !saa7134_dmasound_exit) {
|
||||
saa7134_dmasound_init = alsa_device_init;
|
||||
saa7134_dmasound_exit = alsa_device_exit;
|
||||
} else {
|
||||
printk(KERN_WARNING "saa7134 ALSA: can't load, DMA sound handler already assigned (probably to OSS)\n");
|
||||
return -EBUSY;
|
||||
|
@ -1036,8 +1036,8 @@ static void saa7134_alsa_exit(void)
|
|||
snd_card_free(snd_saa7134_cards[idx]);
|
||||
}
|
||||
|
||||
dmasound_init = NULL;
|
||||
dmasound_exit = NULL;
|
||||
saa7134_dmasound_init = NULL;
|
||||
saa7134_dmasound_exit = NULL;
|
||||
printk(KERN_INFO "saa7134 ALSA driver for DMA sound unloaded\n");
|
||||
|
||||
return;
|
||||
|
|
|
@ -95,8 +95,8 @@ LIST_HEAD(saa7134_devlist);
|
|||
static LIST_HEAD(mops_list);
|
||||
static unsigned int saa7134_devcount;
|
||||
|
||||
int (*dmasound_init)(struct saa7134_dev *dev);
|
||||
int (*dmasound_exit)(struct saa7134_dev *dev);
|
||||
int (*saa7134_dmasound_init)(struct saa7134_dev *dev);
|
||||
int (*saa7134_dmasound_exit)(struct saa7134_dev *dev);
|
||||
|
||||
#define dprintk(fmt, arg...) if (core_debug) \
|
||||
printk(KERN_DEBUG "%s/core: " fmt, dev->name , ## arg)
|
||||
|
@ -1008,8 +1008,8 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
|
|||
/* check for signal */
|
||||
saa7134_irq_video_intl(dev);
|
||||
|
||||
if (dmasound_init && !dev->dmasound.priv_data) {
|
||||
dmasound_init(dev);
|
||||
if (saa7134_dmasound_init && !dev->dmasound.priv_data) {
|
||||
saa7134_dmasound_init(dev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -1036,8 +1036,8 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
|
|||
struct saa7134_mpeg_ops *mops;
|
||||
|
||||
/* Release DMA sound modules if present */
|
||||
if (dmasound_exit && dev->dmasound.priv_data) {
|
||||
dmasound_exit(dev);
|
||||
if (saa7134_dmasound_exit && dev->dmasound.priv_data) {
|
||||
saa7134_dmasound_exit(dev);
|
||||
}
|
||||
|
||||
/* debugging ... */
|
||||
|
@ -1169,8 +1169,8 @@ EXPORT_SYMBOL(saa7134_boards);
|
|||
|
||||
/* ----------------- for the DMA sound modules --------------- */
|
||||
|
||||
EXPORT_SYMBOL(dmasound_init);
|
||||
EXPORT_SYMBOL(dmasound_exit);
|
||||
EXPORT_SYMBOL(saa7134_dmasound_init);
|
||||
EXPORT_SYMBOL(saa7134_dmasound_exit);
|
||||
EXPORT_SYMBOL(saa7134_pgtable_free);
|
||||
EXPORT_SYMBOL(saa7134_pgtable_build);
|
||||
EXPORT_SYMBOL(saa7134_pgtable_alloc);
|
||||
|
|
|
@ -993,9 +993,9 @@ static int saa7134_oss_init(void)
|
|||
struct saa7134_dev *dev = NULL;
|
||||
struct list_head *list;
|
||||
|
||||
if (!dmasound_init && !dmasound_exit) {
|
||||
dmasound_init = oss_device_init;
|
||||
dmasound_exit = oss_device_exit;
|
||||
if (!saa7134_dmasound_init && !saa7134_dmasound_exit) {
|
||||
saa7134_dmasound_init = oss_device_init;
|
||||
saa7134_dmasound_exit = oss_device_exit;
|
||||
} else {
|
||||
printk(KERN_WARNING "saa7134 OSS: can't load, DMA sound handler already assigned (probably to ALSA)\n");
|
||||
return -EBUSY;
|
||||
|
@ -1037,8 +1037,8 @@ static void saa7134_oss_exit(void)
|
|||
|
||||
}
|
||||
|
||||
dmasound_init = NULL;
|
||||
dmasound_exit = NULL;
|
||||
saa7134_dmasound_init = NULL;
|
||||
saa7134_dmasound_exit = NULL;
|
||||
|
||||
printk(KERN_INFO "saa7134 OSS driver for DMA sound unloaded\n");
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
|
||||
static unsigned int video_debug = 0;
|
||||
static unsigned int gbuffers = 8;
|
||||
static unsigned int noninterlaced = 0;
|
||||
static unsigned int noninterlaced = 1;
|
||||
static unsigned int gbufsize = 720*576*4;
|
||||
static unsigned int gbufsize_max = 720*576*4;
|
||||
module_param(video_debug, int, 0644);
|
||||
|
@ -48,7 +48,7 @@ MODULE_PARM_DESC(video_debug,"enable debug messages [video]");
|
|||
module_param(gbuffers, int, 0444);
|
||||
MODULE_PARM_DESC(gbuffers,"number of capture buffers, range 2-32");
|
||||
module_param(noninterlaced, int, 0644);
|
||||
MODULE_PARM_DESC(noninterlaced,"video input is noninterlaced");
|
||||
MODULE_PARM_DESC(noninterlaced,"capture non interlaced video");
|
||||
|
||||
#define dprintk(fmt, arg...) if (video_debug) \
|
||||
printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg)
|
||||
|
@ -2087,7 +2087,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file,
|
|||
struct v4l2_format *f = arg;
|
||||
return saa7134_try_fmt(dev,fh,f);
|
||||
}
|
||||
#ifdef HAVE_V4L1
|
||||
#ifdef CONFIG_V4L1_COMPAT
|
||||
case VIDIOCGMBUF:
|
||||
{
|
||||
struct video_mbuf *mbuf = arg;
|
||||
|
|
|
@ -586,8 +586,8 @@ void saa7134_dma_free(struct videobuf_queue *q,struct saa7134_buf *buf);
|
|||
|
||||
int saa7134_set_dmabits(struct saa7134_dev *dev);
|
||||
|
||||
extern int (*dmasound_init)(struct saa7134_dev *dev);
|
||||
extern int (*dmasound_exit)(struct saa7134_dev *dev);
|
||||
extern int (*saa7134_dmasound_init)(struct saa7134_dev *dev);
|
||||
extern int (*saa7134_dmasound_exit)(struct saa7134_dev *dev);
|
||||
|
||||
|
||||
/* ----------------------------------------------------------- */
|
||||
|
|
|
@ -2181,7 +2181,6 @@ static struct pci_device_id stradis_pci_tbl[] = {
|
|||
{ 0 }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(pci, stradis_pci_tbl);
|
||||
|
||||
static struct pci_driver stradis_driver = {
|
||||
.name = "stradis",
|
||||
|
|
|
@ -196,14 +196,6 @@ static void set_type(struct i2c_client *c, unsigned int type,
|
|||
i2c_master_send(c, buffer, 4);
|
||||
default_tuner_init(c);
|
||||
break;
|
||||
case TUNER_LG_TDVS_H06XF:
|
||||
/* Set the Auxiliary Byte. */
|
||||
buffer[2] &= ~0x20;
|
||||
buffer[2] |= 0x18;
|
||||
buffer[3] = 0x20;
|
||||
i2c_master_send(c, buffer, 4);
|
||||
default_tuner_init(c);
|
||||
break;
|
||||
case TUNER_PHILIPS_TD1316:
|
||||
buffer[0] = 0x0b;
|
||||
buffer[1] = 0xdc;
|
||||
|
@ -598,6 +590,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
|||
if (t->standby)
|
||||
t->standby (client);
|
||||
break;
|
||||
#ifdef CONFIG_VIDEO_V4L1
|
||||
case VIDIOCSAUDIO:
|
||||
if (check_mode(t, "VIDIOCSAUDIO") == EINVAL)
|
||||
return 0;
|
||||
|
@ -607,17 +600,6 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
|||
/* Should be implemented, since bttv calls it */
|
||||
tuner_dbg("VIDIOCSAUDIO not implemented.\n");
|
||||
break;
|
||||
case TDA9887_SET_CONFIG:
|
||||
if (t->type == TUNER_TDA9887) {
|
||||
int *i = arg;
|
||||
|
||||
t->tda9887_config = *i;
|
||||
set_freq(client, t->tv_freq);
|
||||
}
|
||||
break;
|
||||
/* --- v4l ioctls --- */
|
||||
/* take care: bttv does userspace copying, we'll get a
|
||||
kernel pointer here... */
|
||||
case VIDIOCSCHAN:
|
||||
{
|
||||
static const v4l2_std_id map[] = {
|
||||
|
@ -701,7 +683,18 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
|||
? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
case TDA9887_SET_CONFIG:
|
||||
if (t->type == TUNER_TDA9887) {
|
||||
int *i = arg;
|
||||
|
||||
t->tda9887_config = *i;
|
||||
set_freq(client, t->tv_freq);
|
||||
}
|
||||
break;
|
||||
/* --- v4l ioctls --- */
|
||||
/* take care: bttv does userspace copying, we'll get a
|
||||
kernel pointer here... */
|
||||
case VIDIOC_S_STD:
|
||||
{
|
||||
v4l2_std_id *id = arg;
|
||||
|
|
|
@ -339,7 +339,20 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq)
|
|||
if (4 != (rc = i2c_master_send(c,buffer,4)))
|
||||
tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc);
|
||||
|
||||
if (t->type == TUNER_MICROTUNE_4042FI5) {
|
||||
switch (t->type) {
|
||||
case TUNER_LG_TDVS_H06XF:
|
||||
/* Set the Auxiliary Byte. */
|
||||
buffer[0] = buffer[2];
|
||||
buffer[0] &= ~0x20;
|
||||
buffer[0] |= 0x18;
|
||||
buffer[1] = 0x20;
|
||||
tuner_dbg("tv 0x%02x 0x%02x\n",buffer[0],buffer[1]);
|
||||
|
||||
if (2 != (rc = i2c_master_send(c,buffer,2)))
|
||||
tuner_warn("i2c i/o error: rc == %d (should be 2)\n",rc);
|
||||
break;
|
||||
case TUNER_MICROTUNE_4042FI5:
|
||||
{
|
||||
// FIXME - this may also work for other tuners
|
||||
unsigned long timeout = jiffies + msecs_to_jiffies(1);
|
||||
u8 status_byte = 0;
|
||||
|
@ -364,10 +377,12 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq)
|
|||
buffer[2] = config;
|
||||
buffer[3] = cb;
|
||||
tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n",
|
||||
buffer[0],buffer[1],buffer[2],buffer[3]);
|
||||
buffer[0],buffer[1],buffer[2],buffer[3]);
|
||||
|
||||
if (4 != (rc = i2c_master_send(c,buffer,4)))
|
||||
tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ config VIDEO_USBVIDEO
|
|||
|
||||
config USB_VICAM
|
||||
tristate "USB 3com HomeConnect (aka vicam) support (EXPERIMENTAL)"
|
||||
depends on USB && VIDEO_V4L1 && EXPERIMENTAL
|
||||
depends on USB && VIDEO_DEV && VIDEO_V4L1 && EXPERIMENTAL
|
||||
select VIDEO_USBVIDEO
|
||||
---help---
|
||||
Say Y here if you have 3com homeconnect camera (vicam).
|
||||
|
@ -13,7 +13,7 @@ config USB_VICAM
|
|||
|
||||
config USB_IBMCAM
|
||||
tristate "USB IBM (Xirlink) C-it Camera support"
|
||||
depends on USB && VIDEO_V4L1
|
||||
depends on USB && VIDEO_DEV && VIDEO_V4L1
|
||||
select VIDEO_USBVIDEO
|
||||
---help---
|
||||
Say Y here if you want to connect a IBM "C-It" camera, also known as
|
||||
|
@ -28,7 +28,7 @@ config USB_IBMCAM
|
|||
|
||||
config USB_KONICAWC
|
||||
tristate "USB Konica Webcam support"
|
||||
depends on USB && VIDEO_V4L1
|
||||
depends on USB && VIDEO_DEV && VIDEO_V4L1
|
||||
select VIDEO_USBVIDEO
|
||||
---help---
|
||||
Say Y here if you want support for webcams based on a Konica
|
||||
|
@ -39,7 +39,7 @@ config USB_KONICAWC
|
|||
|
||||
config USB_QUICKCAM_MESSENGER
|
||||
tristate "USB Logitech Quickcam Messenger"
|
||||
depends on USB && VIDEO_DEV
|
||||
depends on USB && VIDEO_DEV && VIDEO_V4L1
|
||||
select VIDEO_USBVIDEO
|
||||
---help---
|
||||
Say Y or M here to enable support for the USB Logitech Quickcam
|
||||
|
|
|
@ -202,7 +202,7 @@ static char *v4l2_memory_names[] = {
|
|||
/* ------------------------------------------------------------------ */
|
||||
/* debug help functions */
|
||||
|
||||
#ifdef HAVE_V4L1
|
||||
#ifdef CONFIG_V4L1_COMPAT
|
||||
static const char *v4l1_ioctls[] = {
|
||||
[_IOC_NR(VIDIOCGCAP)] = "VIDIOCGCAP",
|
||||
[_IOC_NR(VIDIOCGCHAN)] = "VIDIOCGCHAN",
|
||||
|
@ -301,7 +301,7 @@ static const char *v4l2_ioctls[] = {
|
|||
#define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
|
||||
|
||||
static const char *v4l2_int_ioctls[] = {
|
||||
#ifdef HAVE_VIDEO_DECODER
|
||||
#ifdef CONFIG_V4L1_COMPAT
|
||||
[_IOC_NR(DECODER_GET_CAPABILITIES)] = "DECODER_GET_CAPABILITIES",
|
||||
[_IOC_NR(DECODER_GET_STATUS)] = "DECODER_GET_STATUS",
|
||||
[_IOC_NR(DECODER_SET_NORM)] = "DECODER_SET_NORM",
|
||||
|
@ -367,7 +367,7 @@ void v4l_printk_ioctl(unsigned int cmd)
|
|||
(_IOC_NR(cmd) < V4L2_INT_IOCTLS) ?
|
||||
v4l2_int_ioctls[_IOC_NR(cmd)] : "UNKNOWN", dir, cmd);
|
||||
break;
|
||||
#ifdef HAVE_V4L1
|
||||
#ifdef CONFIG_V4L1_COMPAT
|
||||
case 'v':
|
||||
printk("v4l1 ioctl %s, dir=%s (0x%08x)\n",
|
||||
(_IOC_NR(cmd) < V4L1_IOCTLS) ?
|
||||
|
@ -414,6 +414,7 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg)
|
|||
printk ("%s: tuner type=%d\n", s, *p);
|
||||
break;
|
||||
}
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
case DECODER_SET_VBI_BYPASS:
|
||||
case DECODER_ENABLE_OUTPUT:
|
||||
case DECODER_GET_STATUS:
|
||||
|
@ -424,6 +425,7 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg)
|
|||
case VIDIOCCAPTURE:
|
||||
case VIDIOCSYNC:
|
||||
case VIDIOCSWRITEMODE:
|
||||
#endif
|
||||
case TUNER_SET_TYPE_ADDR:
|
||||
case TUNER_SET_STANDBY:
|
||||
case TDA9887_SET_CONFIG:
|
||||
|
@ -755,6 +757,7 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg)
|
|||
p->afc);
|
||||
break;
|
||||
}
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
case VIDIOCGVBIFMT:
|
||||
case VIDIOCSVBIFMT:
|
||||
{
|
||||
|
@ -924,6 +927,14 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg)
|
|||
p->clipcount);
|
||||
break;
|
||||
}
|
||||
case VIDIOCGFREQ:
|
||||
case VIDIOCSFREQ:
|
||||
{
|
||||
unsigned long *p=arg;
|
||||
printk ("%s: value=%lu\n", s, *p);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
case VIDIOC_INT_AUDIO_CLOCK_FREQ:
|
||||
case VIDIOC_INT_I2S_CLOCK_FREQ:
|
||||
case VIDIOC_INT_S_STANDBY:
|
||||
|
@ -933,13 +944,6 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg)
|
|||
printk ("%s: value=%d\n", s, *p);
|
||||
break;
|
||||
}
|
||||
case VIDIOCGFREQ:
|
||||
case VIDIOCSFREQ:
|
||||
{
|
||||
unsigned long *p=arg;
|
||||
printk ("%s: value=%lu\n", s, *p);
|
||||
break;
|
||||
}
|
||||
case VIDIOC_G_STD:
|
||||
case VIDIOC_S_STD:
|
||||
case VIDIOC_QUERYSTD:
|
||||
|
|
|
@ -760,7 +760,7 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
|
|||
ret=vfd->vidioc_overlay(file, fh, *i);
|
||||
break;
|
||||
}
|
||||
#ifdef HAVE_V4L1
|
||||
#ifdef CONFIG_V4L1_COMPAT
|
||||
/* --- streaming capture ------------------------------------- */
|
||||
case VIDIOCGMBUF:
|
||||
{
|
||||
|
@ -1512,6 +1512,7 @@ int video_register_device(struct video_device *vfd, int type, int nr)
|
|||
int i=0;
|
||||
int base;
|
||||
int end;
|
||||
int ret;
|
||||
char *name_base;
|
||||
|
||||
switch(type)
|
||||
|
@ -1537,6 +1538,8 @@ int video_register_device(struct video_device *vfd, int type, int nr)
|
|||
name_base = "radio";
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR "%s called with unknown type: %d\n",
|
||||
__FUNCTION__, type);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -1571,9 +1574,18 @@ int video_register_device(struct video_device *vfd, int type, int nr)
|
|||
vfd->class_dev.class = &video_class;
|
||||
vfd->class_dev.devt = MKDEV(VIDEO_MAJOR, vfd->minor);
|
||||
sprintf(vfd->class_dev.class_id, "%s%d", name_base, i - base);
|
||||
class_device_register(&vfd->class_dev);
|
||||
class_device_create_file(&vfd->class_dev,
|
||||
&class_device_attr_name);
|
||||
ret = class_device_register(&vfd->class_dev);
|
||||
if (ret < 0) {
|
||||
printk(KERN_ERR "%s: class_device_register failed\n",
|
||||
__FUNCTION__);
|
||||
goto fail_minor;
|
||||
}
|
||||
ret = class_device_create_file(&vfd->class_dev, &class_device_attr_name);
|
||||
if (ret < 0) {
|
||||
printk(KERN_ERR "%s: class_device_create_file 'name' failed\n",
|
||||
__FUNCTION__);
|
||||
goto fail_classdev;
|
||||
}
|
||||
|
||||
#if 1
|
||||
/* needed until all drivers are fixed */
|
||||
|
@ -1583,6 +1595,15 @@ int video_register_device(struct video_device *vfd, int type, int nr)
|
|||
"http://lwn.net/Articles/36850/\n", vfd->name);
|
||||
#endif
|
||||
return 0;
|
||||
|
||||
fail_classdev:
|
||||
class_device_unregister(&vfd->class_dev);
|
||||
fail_minor:
|
||||
mutex_lock(&videodev_lock);
|
||||
video_device[vfd->minor] = NULL;
|
||||
vfd->minor = -1;
|
||||
mutex_unlock(&videodev_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -986,7 +986,7 @@ static int vidioc_dqbuf (struct file *file, void *priv, struct v4l2_buffer *p)
|
|||
file->f_flags & O_NONBLOCK));
|
||||
}
|
||||
|
||||
#ifdef HAVE_V4L1
|
||||
#ifdef CONFIG_V4L1_COMPAT
|
||||
static int vidiocgmbuf (struct file *file, void *priv, struct video_mbuf *mbuf)
|
||||
{
|
||||
struct vivi_fh *fh=priv;
|
||||
|
@ -1328,7 +1328,7 @@ static struct video_device vivi = {
|
|||
.vidioc_s_ctrl = vidioc_s_ctrl,
|
||||
.vidioc_streamon = vidioc_streamon,
|
||||
.vidioc_streamoff = vidioc_streamoff,
|
||||
#ifdef HAVE_V4L1
|
||||
#ifdef CONFIG_V4L1_COMPAT
|
||||
.vidiocgmbuf = vidiocgmbuf,
|
||||
#endif
|
||||
.tvnorms = tvnorms,
|
||||
|
|
|
@ -12,10 +12,11 @@
|
|||
#ifndef __LINUX_VIDEODEV_H
|
||||
#define __LINUX_VIDEODEV_H
|
||||
|
||||
#define HAVE_V4L1 1
|
||||
|
||||
#include <linux/videodev2.h>
|
||||
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
#define HAVE_V4L1 1
|
||||
|
||||
struct video_capability
|
||||
{
|
||||
char name[32];
|
||||
|
@ -336,6 +337,8 @@ struct video_code
|
|||
#define VID_HARDWARE_SN9C102 38
|
||||
#define VID_HARDWARE_ARV 39
|
||||
|
||||
#endif /* CONFIG_VIDEO_V4L1_COMPAT */
|
||||
|
||||
#endif /* __LINUX_VIDEODEV_H */
|
||||
|
||||
/*
|
||||
|
|
|
@ -716,7 +716,7 @@ struct v4l2_ext_control
|
|||
__s64 value64;
|
||||
void *reserved;
|
||||
};
|
||||
};
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct v4l2_ext_controls
|
||||
{
|
||||
|
|
|
@ -341,11 +341,14 @@ extern int video_usercopy(struct inode *inode, struct file *file,
|
|||
extern struct video_device* video_devdata(struct file*);
|
||||
|
||||
#define to_video_device(cd) container_of(cd, struct video_device, class_dev)
|
||||
static inline void
|
||||
static inline int
|
||||
video_device_create_file(struct video_device *vfd,
|
||||
struct class_device_attribute *attr)
|
||||
{
|
||||
class_device_create_file(&vfd->class_dev, attr);
|
||||
int ret = class_device_create_file(&vfd->class_dev, attr);
|
||||
if (ret < 0)
|
||||
printk(KERN_WARNING "%s error: %d\n", __FUNCTION__, ret);
|
||||
return ret;
|
||||
}
|
||||
static inline void
|
||||
video_device_remove_file(struct video_device *vfd,
|
||||
|
|
Loading…
Reference in a new issue