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:
Коммит
a205729e2c
|
@ -526,7 +526,9 @@ static int dvb_frontend_thread(void *data)
|
||||||
fepriv->delay = 3*HZ;
|
fepriv->delay = 3*HZ;
|
||||||
fepriv->status = 0;
|
fepriv->status = 0;
|
||||||
fepriv->wakeup = 0;
|
fepriv->wakeup = 0;
|
||||||
fepriv->reinitialise = 1;
|
fepriv->reinitialise = 0;
|
||||||
|
|
||||||
|
dvb_frontend_init(fe);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
up(&fepriv->sem); /* is locked when we enter the thread... */
|
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;
|
return ret;
|
||||||
|
|
||||||
if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
|
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);
|
ret = dvb_frontend_start (fe);
|
||||||
if (ret)
|
if (ret)
|
||||||
dvb_generic_release (inode, file);
|
dvb_generic_release (inode, file);
|
||||||
|
|
||||||
/* empty event queue */
|
/* empty event queue */
|
||||||
fepriv->events.eventr = fepriv->events.eventw = 0;
|
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;
|
return ret;
|
||||||
|
|
|
@ -194,11 +194,11 @@ struct dvb_pll_desc dvb_pll_tda665x = {
|
||||||
{ 253834000, 36249333, 166667, 0xca, 0x62 /* 011 0 0 0 10 */ },
|
{ 253834000, 36249333, 166667, 0xca, 0x62 /* 011 0 0 0 10 */ },
|
||||||
{ 383834000, 36249333, 166667, 0xca, 0xa2 /* 101 0 0 0 10 */ },
|
{ 383834000, 36249333, 166667, 0xca, 0xa2 /* 101 0 0 0 10 */ },
|
||||||
{ 443834000, 36249333, 166667, 0xca, 0xc2 /* 110 0 0 0 10 */ },
|
{ 443834000, 36249333, 166667, 0xca, 0xc2 /* 110 0 0 0 10 */ },
|
||||||
{ 444000000, 36249333, 166667, 0xca, 0xc3 /* 110 0 0 0 11 */ },
|
{ 444000000, 36249333, 166667, 0xca, 0xc4 /* 110 0 0 1 00 */ },
|
||||||
{ 583834000, 36249333, 166667, 0xca, 0x63 /* 011 0 0 0 11 */ },
|
{ 583834000, 36249333, 166667, 0xca, 0x64 /* 011 0 0 1 00 */ },
|
||||||
{ 793834000, 36249333, 166667, 0xca, 0xa3 /* 101 0 0 0 11 */ },
|
{ 793834000, 36249333, 166667, 0xca, 0xa4 /* 101 0 0 1 00 */ },
|
||||||
{ 444834000, 36249333, 166667, 0xca, 0xc3 /* 110 0 0 0 11 */ },
|
{ 444834000, 36249333, 166667, 0xca, 0xc4 /* 110 0 0 1 00 */ },
|
||||||
{ 861000000, 36249333, 166667, 0xca, 0xe3 /* 111 0 0 0 11 */ },
|
{ 861000000, 36249333, 166667, 0xca, 0xe4 /* 111 0 0 1 00 */ },
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
EXPORT_SYMBOL(dvb_pll_tda665x);
|
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)
|
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;
|
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);
|
priv = kzalloc(sizeof(struct dvb_pll_priv), GFP_KERNEL);
|
||||||
if (priv == NULL)
|
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;
|
av7110->fe->ops.tuner_ops.set_params = nexusca_stv0297_tuner_set_params;
|
||||||
|
|
||||||
/* set TDA9819 into DVB mode */
|
/* set TDA9819 into DVB mode */
|
||||||
saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9198 pin9(STD)
|
saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD)
|
||||||
saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9198 pin30(VIF)
|
saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF)
|
||||||
|
|
||||||
/* tuner on this needs a slower i2c bus speed */
|
/* tuner on this needs a slower i2c bus speed */
|
||||||
av7110->dev->i2c_bitrate = SAA7146_I2C_BUS_BIT_RATE_240;
|
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))
|
if (ves1820_writereg(dev, 0x09, 0x0f, 0x60))
|
||||||
dprintk(1, "setting band in demodulator failed.\n");
|
dprintk(1, "setting band in demodulator failed.\n");
|
||||||
} else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) {
|
} else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) {
|
||||||
saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // TDA9198 pin9(STD)
|
saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // TDA9819 pin9(STD)
|
||||||
saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); // TDA9198 pin30(VIF)
|
saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); // TDA9819 pin30(VIF)
|
||||||
}
|
}
|
||||||
if (i2c_writereg(av7110, 0x48, 0x02, 0xd0) != 1)
|
if (i2c_writereg(av7110, 0x48, 0x02, 0xd0) != 1)
|
||||||
dprintk(1, "saa7113 write failed @ card %d", av7110->dvb_adapter.num);
|
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))
|
if (ves1820_writereg(dev, 0x09, 0x0f, 0x20))
|
||||||
dprintk(1, "setting band in demodulator failed.\n");
|
dprintk(1, "setting band in demodulator failed.\n");
|
||||||
} else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) {
|
} else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) {
|
||||||
saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTLO); // TDA9198 pin9(STD)
|
saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD)
|
||||||
saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // TDA9198 pin30(VIF)
|
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))
|
if (ves1820_writereg(av7110->dev, 0x09, 0x0f, 0x20))
|
||||||
dprintk(1, "setting band in demodulator failed.\n");
|
dprintk(1, "setting band in demodulator failed.\n");
|
||||||
} else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) {
|
} else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) {
|
||||||
saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9198 pin9(STD)
|
saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD)
|
||||||
saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9198 pin30(VIF)
|
saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* init the saa7113 */
|
/* 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;
|
budget_av->budget.dvb_adapter.priv = budget_av;
|
||||||
frontend_init(budget_av);
|
frontend_init(budget_av);
|
||||||
ciintf_init(budget_av);
|
ciintf_init(budget_av);
|
||||||
|
|
||||||
|
ttpci_budget_init_hooks(&budget_av->budget);
|
||||||
|
|
||||||
return 0;
|
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;
|
budget_ci->budget.dvb_adapter.priv = budget_ci;
|
||||||
frontend_init(budget_ci);
|
frontend_init(budget_ci);
|
||||||
|
|
||||||
|
ttpci_budget_init_hooks(&budget_ci->budget);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,9 +63,6 @@ static int stop_ts_capture(struct budget *budget)
|
||||||
{
|
{
|
||||||
dprintk(2, "budget: %p\n", budget);
|
dprintk(2, "budget: %p\n", budget);
|
||||||
|
|
||||||
if (--budget->feeding)
|
|
||||||
return budget->feeding;
|
|
||||||
|
|
||||||
saa7146_write(budget->dev, MC1, MASK_20); // DMA3 off
|
saa7146_write(budget->dev, MC1, MASK_20); // DMA3 off
|
||||||
SAA7146_IER_DISABLE(budget->dev, MASK_10);
|
SAA7146_IER_DISABLE(budget->dev, MASK_10);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -77,8 +74,8 @@ static int start_ts_capture(struct budget *budget)
|
||||||
|
|
||||||
dprintk(2, "budget: %p\n", budget);
|
dprintk(2, "budget: %p\n", budget);
|
||||||
|
|
||||||
if (budget->feeding)
|
if (!budget->feeding || !budget->fe_synced)
|
||||||
return ++budget->feeding;
|
return 0;
|
||||||
|
|
||||||
saa7146_write(dev, MC1, MASK_20); // DMA3 off
|
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_IER_ENABLE(budget->dev, MASK_10); /* VPE */
|
||||||
saa7146_write(dev, MC1, (MASK_04 | MASK_20)); /* DMA3 on */
|
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)
|
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 dvb_demux *demux = feed->demux;
|
||||||
struct budget *budget = (struct budget *) demux->priv;
|
struct budget *budget = (struct budget *) demux->priv;
|
||||||
int status;
|
int status = 0;
|
||||||
|
|
||||||
dprintk(2, "budget: %p\n", budget);
|
dprintk(2, "budget: %p\n", budget);
|
||||||
|
|
||||||
|
@ -276,6 +299,7 @@ static int budget_start_feed(struct dvb_demux_feed *feed)
|
||||||
|
|
||||||
spin_lock(&budget->feedlock);
|
spin_lock(&budget->feedlock);
|
||||||
feed->pusi_seen = 0; /* have a clean section start */
|
feed->pusi_seen = 0; /* have a clean section start */
|
||||||
|
if (budget->feeding++ == 0)
|
||||||
status = start_ts_capture(budget);
|
status = start_ts_capture(budget);
|
||||||
spin_unlock(&budget->feedlock);
|
spin_unlock(&budget->feedlock);
|
||||||
return status;
|
return status;
|
||||||
|
@ -285,11 +309,12 @@ static int budget_stop_feed(struct dvb_demux_feed *feed)
|
||||||
{
|
{
|
||||||
struct dvb_demux *demux = feed->demux;
|
struct dvb_demux *demux = feed->demux;
|
||||||
struct budget *budget = (struct budget *) demux->priv;
|
struct budget *budget = (struct budget *) demux->priv;
|
||||||
int status;
|
int status = 0;
|
||||||
|
|
||||||
dprintk(2, "budget: %p\n", budget);
|
dprintk(2, "budget: %p\n", budget);
|
||||||
|
|
||||||
spin_lock(&budget->feedlock);
|
spin_lock(&budget->feedlock);
|
||||||
|
if (--budget->feeding == 0)
|
||||||
status = stop_ts_capture(budget);
|
status = stop_ts_capture(budget);
|
||||||
spin_unlock(&budget->feedlock);
|
spin_unlock(&budget->feedlock);
|
||||||
return status;
|
return status;
|
||||||
|
@ -470,6 +495,14 @@ err:
|
||||||
return ret;
|
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)
|
int ttpci_budget_deinit(struct budget *budget)
|
||||||
{
|
{
|
||||||
struct saa7146_dev *dev = budget->dev;
|
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);
|
spin_lock(&budget->feedlock);
|
||||||
budget->video_port = video_port;
|
budget->video_port = video_port;
|
||||||
if (budget->feeding) {
|
if (budget->feeding) {
|
||||||
int oldfeeding = budget->feeding;
|
|
||||||
budget->feeding = 1;
|
|
||||||
stop_ts_capture(budget);
|
stop_ts_capture(budget);
|
||||||
start_ts_capture(budget);
|
start_ts_capture(budget);
|
||||||
budget->feeding = oldfeeding;
|
|
||||||
}
|
}
|
||||||
spin_unlock(&budget->feedlock);
|
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_debiread);
|
||||||
EXPORT_SYMBOL_GPL(ttpci_budget_debiwrite);
|
EXPORT_SYMBOL_GPL(ttpci_budget_debiwrite);
|
||||||
EXPORT_SYMBOL_GPL(ttpci_budget_init);
|
EXPORT_SYMBOL_GPL(ttpci_budget_init);
|
||||||
|
EXPORT_SYMBOL_GPL(ttpci_budget_init_hooks);
|
||||||
EXPORT_SYMBOL_GPL(ttpci_budget_deinit);
|
EXPORT_SYMBOL_GPL(ttpci_budget_deinit);
|
||||||
EXPORT_SYMBOL_GPL(ttpci_budget_irq10_handler);
|
EXPORT_SYMBOL_GPL(ttpci_budget_irq10_handler);
|
||||||
EXPORT_SYMBOL_GPL(ttpci_budget_set_video_port);
|
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;
|
budget->dvb_adapter.priv = budget;
|
||||||
frontend_init(budget);
|
frontend_init(budget);
|
||||||
|
|
||||||
|
ttpci_budget_init_hooks(budget);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -375,9 +375,6 @@ static void frontend_init(struct budget *budget)
|
||||||
if (budget->dvb_frontend) {
|
if (budget->dvb_frontend) {
|
||||||
budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params;
|
budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params;
|
||||||
budget->dvb_frontend->tuner_priv = &budget->i2c_adap;
|
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;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -474,6 +471,8 @@ static int budget_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_
|
||||||
budget->dvb_adapter.priv = budget;
|
budget->dvb_adapter.priv = budget;
|
||||||
frontend_init(budget);
|
frontend_init(budget);
|
||||||
|
|
||||||
|
ttpci_budget_init_hooks(budget);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -52,9 +52,6 @@ struct budget {
|
||||||
struct dmx_frontend hw_frontend;
|
struct dmx_frontend hw_frontend;
|
||||||
struct dmx_frontend mem_frontend;
|
struct dmx_frontend mem_frontend;
|
||||||
|
|
||||||
int fe_synced;
|
|
||||||
struct mutex pid_mutex;
|
|
||||||
|
|
||||||
int ci_present;
|
int ci_present;
|
||||||
int video_port;
|
int video_port;
|
||||||
|
|
||||||
|
@ -74,6 +71,9 @@ struct budget {
|
||||||
|
|
||||||
struct dvb_adapter dvb_adapter;
|
struct dvb_adapter dvb_adapter;
|
||||||
struct dvb_frontend *dvb_frontend;
|
struct dvb_frontend *dvb_frontend;
|
||||||
|
int (*read_fe_status)(struct dvb_frontend *fe, fe_status_t *status);
|
||||||
|
int fe_synced;
|
||||||
|
|
||||||
void *priv;
|
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,
|
extern int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev,
|
||||||
struct saa7146_pci_extension_data *info,
|
struct saa7146_pci_extension_data *info,
|
||||||
struct module *owner);
|
struct module *owner);
|
||||||
|
extern void ttpci_budget_init_hooks(struct budget *budget);
|
||||||
extern int ttpci_budget_deinit(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_irq10_handler(struct saa7146_dev *dev, u32 * isr);
|
||||||
extern void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port);
|
extern void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port);
|
||||||
|
|
|
@ -145,7 +145,7 @@ config VIDEO_SAA5246A
|
||||||
|
|
||||||
config VIDEO_SAA5249
|
config VIDEO_SAA5249
|
||||||
tristate "SAA5249 Teletext processor"
|
tristate "SAA5249 Teletext processor"
|
||||||
depends on VIDEO_DEV && I2C
|
depends on VIDEO_DEV && I2C && VIDEO_V4L1
|
||||||
help
|
help
|
||||||
Support for I2C bus based teletext using the SAA5249 chip. At the
|
Support for I2C bus based teletext using the SAA5249 chip. At the
|
||||||
moment this is only useful on some European WinTV cards.
|
moment this is only useful on some European WinTV cards.
|
||||||
|
@ -155,7 +155,7 @@ config VIDEO_SAA5249
|
||||||
|
|
||||||
config TUNER_3036
|
config TUNER_3036
|
||||||
tristate "SAB3036 tuner"
|
tristate "SAB3036 tuner"
|
||||||
depends on VIDEO_DEV && I2C
|
depends on VIDEO_DEV && I2C && VIDEO_V4L1
|
||||||
help
|
help
|
||||||
Say Y here to include support for Philips SAB3036 compatible tuners.
|
Say Y here to include support for Philips SAB3036 compatible tuners.
|
||||||
If in doubt, say N.
|
If in doubt, say N.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
config VIDEO_BT848
|
config VIDEO_BT848
|
||||||
tristate "BT848 Video For Linux"
|
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 I2C_ALGOBIT
|
||||||
select FW_LOADER
|
select FW_LOADER
|
||||||
select VIDEO_BTCX
|
select VIDEO_BTCX
|
||||||
|
|
|
@ -3923,7 +3923,12 @@ static int __devinit bttv_register_video(struct bttv *btv)
|
||||||
goto err;
|
goto err;
|
||||||
printk(KERN_INFO "bttv%d: registered device video%d\n",
|
printk(KERN_INFO "bttv%d: registered device video%d\n",
|
||||||
btv->c.nr,btv->video_dev->minor & 0x1f);
|
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 */
|
/* vbi */
|
||||||
btv->vbi_dev = vdev_init(btv, &bttv_vbi_template, "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)
|
static int bttv_init_module(void)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
bttv_num = 0;
|
bttv_num = 0;
|
||||||
|
|
||||||
printk(KERN_INFO "bttv: driver version %d.%d.%d loaded\n",
|
printk(KERN_INFO "bttv: driver version %d.%d.%d loaded\n",
|
||||||
|
@ -4308,7 +4315,11 @@ static int bttv_init_module(void)
|
||||||
|
|
||||||
bttv_check_chipset();
|
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);
|
return pci_register_driver(&bttv_pci_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,11 +31,16 @@
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include "bttvp.h"
|
#include "bttvp.h"
|
||||||
|
|
||||||
/* Offset from line sync pulse leading edge (0H) in 1 / sampling_rate:
|
/* Offset from line sync pulse leading edge (0H) to start of VBI capture,
|
||||||
bt8x8 /HRESET pulse starts at 0H and has length 64 / fCLKx1 (E|O_VTC
|
in fCLKx2 pixels. According to the datasheet, VBI capture starts
|
||||||
HSFMT = 0). VBI_HDELAY (always 0) is an offset from the trailing edge
|
VBI_HDELAY fCLKx1 pixels from the tailing edgeof /HRESET, and /HRESET
|
||||||
of /HRESET in 1 / fCLKx1, and the sampling_rate tvnorm->Fsc is fCLKx2. */
|
is 64 fCLKx1 pixels wide. VBI_HDELAY is set to 0, so this should be
|
||||||
#define VBI_OFFSET ((64 + 0) * 2)
|
(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_DEFLINES 16
|
||||||
#define VBI_MAXLINES 32
|
#define VBI_MAXLINES 32
|
||||||
|
|
|
@ -490,6 +490,23 @@ static inline int put_v4l2_input(struct v4l2_input *kp, struct v4l2_input __user
|
||||||
return 0;
|
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 VIDIOCGTUNER32 _IOWR('v',4, struct video_tuner32)
|
||||||
#define VIDIOCSTUNER32 _IOW('v',5, struct video_tuner32)
|
#define VIDIOCSTUNER32 _IOW('v',5, struct video_tuner32)
|
||||||
#define VIDIOCGWIN32 _IOR('v',9, struct video_window32)
|
#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 VIDIOCSFBUF32 _IOW('v',12, struct video_buffer32)
|
||||||
#define VIDIOCGFREQ32 _IOR('v',14, u32)
|
#define VIDIOCGFREQ32 _IOR('v',14, u32)
|
||||||
#define VIDIOCSFREQ32 _IOW('v',15, 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 */
|
/* VIDIOC_ENUMINPUT32 is VIDIOC_ENUMINPUT minus 4 bytes of padding alignement */
|
||||||
#define VIDIOC_ENUMINPUT32 VIDIOC_ENUMINPUT - _IOC(0, 0, 0, 4)
|
#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_tuner vt;
|
||||||
struct video_buffer vb;
|
struct video_buffer vb;
|
||||||
struct video_window vw;
|
struct video_window vw;
|
||||||
|
struct video_code vc;
|
||||||
struct v4l2_format v2f;
|
struct v4l2_format v2f;
|
||||||
struct v4l2_buffer v2b;
|
struct v4l2_buffer v2b;
|
||||||
struct v4l2_framebuffer v2fb;
|
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_G_INPUT32: cmd = VIDIOC_G_INPUT; break;
|
||||||
case VIDIOC_S_INPUT32: cmd = VIDIOC_S_INPUT; break;
|
case VIDIOC_S_INPUT32: cmd = VIDIOC_S_INPUT; break;
|
||||||
case VIDIOC_TRY_FMT32: cmd = VIDIOC_TRY_FMT; break;
|
case VIDIOC_TRY_FMT32: cmd = VIDIOC_TRY_FMT; break;
|
||||||
|
case VIDIOCSMICROCODE32: cmd = VIDIOCSMICROCODE; break;
|
||||||
};
|
};
|
||||||
|
|
||||||
switch(cmd) {
|
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_FBUF:
|
||||||
case VIDIOC_G_INPUT:
|
case VIDIOC_G_INPUT:
|
||||||
compatible_arg = 0;
|
compatible_arg = 0;
|
||||||
|
case VIDIOCSMICROCODE:
|
||||||
|
err = microcode32(&karg.vc, up);
|
||||||
|
compatible_arg = 0;
|
||||||
|
break;
|
||||||
};
|
};
|
||||||
|
|
||||||
if(err)
|
if(err)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
config VIDEO_CPIA2
|
config VIDEO_CPIA2
|
||||||
tristate "CPiA2 Video For Linux"
|
tristate "CPiA2 Video For Linux"
|
||||||
depends on VIDEO_DEV && USB
|
depends on VIDEO_DEV && USB && VIDEO_V4L1
|
||||||
---help---
|
---help---
|
||||||
This is the video4linux driver for cameras based on Vision's CPiA2
|
This is the video4linux driver for cameras based on Vision's CPiA2
|
||||||
(Colour Processor Interface ASIC), such as the Digital Blue QX5
|
(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);
|
auxgpio = cx_read(MO_GP1_IO);
|
||||||
/* Take out the parity part */
|
/* Take out the parity part */
|
||||||
gpio+=(gpio & 0x7fd) + (auxgpio & 0xef);
|
gpio=(gpio & 0x7fd) + (auxgpio & 0xef);
|
||||||
} else
|
} else
|
||||||
auxgpio = gpio;
|
auxgpio = gpio;
|
||||||
|
|
||||||
|
|
|
@ -1180,7 +1180,6 @@ static int video_do_ioctl(struct inode *inode, struct file *file,
|
||||||
V4L2_CAP_READWRITE |
|
V4L2_CAP_READWRITE |
|
||||||
V4L2_CAP_STREAMING |
|
V4L2_CAP_STREAMING |
|
||||||
V4L2_CAP_VBI_CAPTURE |
|
V4L2_CAP_VBI_CAPTURE |
|
||||||
V4L2_CAP_VIDEO_OVERLAY |
|
|
||||||
0;
|
0;
|
||||||
if (UNSET != core->tuner_type)
|
if (UNSET != core->tuner_type)
|
||||||
cap->capabilities |= V4L2_CAP_TUNER;
|
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;
|
struct v4l2_format *f = arg;
|
||||||
return cx8800_try_fmt(dev,fh,f);
|
return cx8800_try_fmt(dev,fh,f);
|
||||||
}
|
}
|
||||||
#ifdef HAVE_V4L1
|
#ifdef CONFIG_V4L1_COMPAT
|
||||||
/* --- streaming capture ------------------------------------- */
|
/* --- streaming capture ------------------------------------- */
|
||||||
case VIDIOCGMBUF:
|
case VIDIOCGMBUF:
|
||||||
{
|
{
|
||||||
|
@ -1585,7 +1584,7 @@ static int radio_do_ioctl(struct inode *inode, struct file *file,
|
||||||
*id = 0;
|
*id = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifdef HAVE_V4L1
|
#ifdef CONFIG_V4L1_COMPAT
|
||||||
case VIDIOCSTUNER:
|
case VIDIOCSTUNER:
|
||||||
{
|
{
|
||||||
struct video_tuner *v = arg;
|
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)
|
static int msp_mode_v4l2_to_v4l1(int rxsubchans, int audmode)
|
||||||
{
|
{
|
||||||
if (rxsubchans == V4L2_TUNER_SUB_MONO)
|
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_LANG1;
|
||||||
return V4L2_TUNER_MODE_MONO;
|
return V4L2_TUNER_MODE_MONO;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int msp_get_ctrl(struct i2c_client *client, struct v4l2_control *ctrl)
|
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 --- */
|
/* --- v4l ioctls --- */
|
||||||
/* take care: bttv does userspace copying, we'll get a
|
/* take care: bttv does userspace copying, we'll get a
|
||||||
kernel pointer here... */
|
kernel pointer here... */
|
||||||
|
#ifdef CONFIG_VIDEO_V4L1
|
||||||
case VIDIOCGAUDIO:
|
case VIDIOCGAUDIO:
|
||||||
{
|
{
|
||||||
struct video_audio *va = arg;
|
struct video_audio *va = arg;
|
||||||
|
@ -577,6 +579,12 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
case VIDIOCSFREQ:
|
case VIDIOCSFREQ:
|
||||||
|
{
|
||||||
|
/* new channel -- kick audio carrier scan */
|
||||||
|
msp_wake_thread(client);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
case VIDIOC_S_FREQUENCY:
|
case VIDIOC_S_FREQUENCY:
|
||||||
{
|
{
|
||||||
/* new channel -- kick audio carrier scan */
|
/* new channel -- kick audio carrier scan */
|
||||||
|
|
|
@ -852,7 +852,6 @@ unsigned long pvr2_hdw_get_sn(struct pvr2_hdw *hdw)
|
||||||
return hdw->serial_number;
|
return hdw->serial_number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int pvr2_hdw_get_unit_number(struct pvr2_hdw *hdw)
|
int pvr2_hdw_get_unit_number(struct pvr2_hdw *hdw)
|
||||||
{
|
{
|
||||||
return hdw->unit_number;
|
return hdw->unit_number;
|
||||||
|
@ -2318,7 +2317,6 @@ void pvr2_hdw_poll_trigger_unlocked(struct pvr2_hdw *hdw)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Return name for this driver instance */
|
/* Return name for this driver instance */
|
||||||
const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *hdw)
|
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,
|
static int pvr2_send_request_ex(struct pvr2_hdw *hdw,
|
||||||
unsigned int timeout,int probe_fl,
|
unsigned int timeout,int probe_fl,
|
||||||
void *write_data,unsigned int write_len,
|
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)
|
static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl)
|
||||||
{
|
{
|
||||||
int status;
|
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)
|
static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|
|
@ -26,6 +26,8 @@
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
|
|
||||||
|
static const char *pvr2_buffer_state_decode(enum pvr2_buffer_state);
|
||||||
|
|
||||||
#define BUFFER_SIG 0x47653271
|
#define BUFFER_SIG 0x47653271
|
||||||
|
|
||||||
// #define SANITY_CHECK_BUFFERS
|
// #define SANITY_CHECK_BUFFERS
|
||||||
|
@ -515,6 +517,10 @@ void pvr2_stream_set_callback(struct pvr2_stream *sp,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Query / set the nominal buffer count */
|
/* 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)
|
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;
|
return sp->r_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void pvr2_stream_kill(struct pvr2_stream *sp)
|
void pvr2_stream_kill(struct pvr2_stream *sp)
|
||||||
{
|
{
|
||||||
struct pvr2_buffer *bp;
|
struct pvr2_buffer *bp;
|
||||||
|
@ -607,7 +612,6 @@ int pvr2_buffer_queue(struct pvr2_buffer *bp)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int pvr2_buffer_set_buffer(struct pvr2_buffer *bp,void *ptr,unsigned int cnt)
|
int pvr2_buffer_set_buffer(struct pvr2_buffer *bp,void *ptr,unsigned int cnt)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
@ -646,7 +650,6 @@ int pvr2_buffer_get_status(struct pvr2_buffer *bp)
|
||||||
return bp->status;
|
return bp->status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int pvr2_buffer_get_id(struct pvr2_buffer *bp)
|
int pvr2_buffer_get_id(struct pvr2_buffer *bp)
|
||||||
{
|
{
|
||||||
return bp->id;
|
return bp->id;
|
||||||
|
|
|
@ -47,6 +47,7 @@ void pvr2_stream_set_callback(struct pvr2_stream *,
|
||||||
void *data);
|
void *data);
|
||||||
|
|
||||||
/* Query / set the nominal buffer count */
|
/* 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);
|
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
|
/* 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 */
|
/* Find out how many buffers are idle or ready */
|
||||||
int pvr2_stream_get_ready_count(struct pvr2_stream *);
|
int pvr2_stream_get_ready_count(struct pvr2_stream *);
|
||||||
|
|
||||||
|
|
||||||
/* Kill all pending buffers and throw away any ready buffers as well */
|
/* Kill all pending buffers and throw away any ready buffers as well */
|
||||||
void pvr2_stream_kill(struct pvr2_stream *);
|
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_setup (tear-down) id=%p",cp);
|
||||||
pvr2_ioread_stop(cp);
|
pvr2_ioread_stop(cp);
|
||||||
pvr2_stream_kill(cp->stream);
|
pvr2_stream_kill(cp->stream);
|
||||||
|
if (pvr2_stream_get_buffer_count(cp->stream)) {
|
||||||
pvr2_stream_set_buffer_count(cp->stream,0);
|
pvr2_stream_set_buffer_count(cp->stream,0);
|
||||||
|
}
|
||||||
cp->stream = NULL;
|
cp->stream = NULL;
|
||||||
}
|
}
|
||||||
if (sp) {
|
if (sp) {
|
||||||
|
@ -251,7 +253,6 @@ int pvr2_ioread_set_enabled(struct pvr2_ioread *cp,int fl)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int pvr2_ioread_get_buffer(struct pvr2_ioread *cp)
|
static int pvr2_ioread_get_buffer(struct pvr2_ioread *cp)
|
||||||
{
|
{
|
||||||
int stat;
|
int stat;
|
||||||
|
|
|
@ -44,12 +44,16 @@ struct pvr2_sysfs {
|
||||||
struct kobj_type ktype;
|
struct kobj_type ktype;
|
||||||
struct class_device_attribute attr_v4l_minor_number;
|
struct class_device_attribute attr_v4l_minor_number;
|
||||||
struct class_device_attribute attr_unit_number;
|
struct class_device_attribute attr_unit_number;
|
||||||
|
int v4l_minor_number_created_ok;
|
||||||
|
int unit_number_created_ok;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC
|
#ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC
|
||||||
struct pvr2_sysfs_debugifc {
|
struct pvr2_sysfs_debugifc {
|
||||||
struct class_device_attribute attr_debugcmd;
|
struct class_device_attribute attr_debugcmd;
|
||||||
struct class_device_attribute attr_debuginfo;
|
struct class_device_attribute attr_debuginfo;
|
||||||
|
int debugcmd_created_ok;
|
||||||
|
int debuginfo_created_ok;
|
||||||
};
|
};
|
||||||
#endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */
|
#endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */
|
||||||
|
|
||||||
|
@ -67,6 +71,7 @@ struct pvr2_sysfs_ctl_item {
|
||||||
struct pvr2_sysfs_ctl_item *item_next;
|
struct pvr2_sysfs_ctl_item *item_next;
|
||||||
struct attribute *attr_gen[7];
|
struct attribute *attr_gen[7];
|
||||||
struct attribute_group grp;
|
struct attribute_group grp;
|
||||||
|
int created_ok;
|
||||||
char name[80];
|
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_sysfs_func_set *fp;
|
||||||
struct pvr2_ctrl *cptr;
|
struct pvr2_ctrl *cptr;
|
||||||
unsigned int cnt,acnt;
|
unsigned int cnt,acnt;
|
||||||
|
int ret;
|
||||||
|
|
||||||
if ((ctl_id < 0) || (ctl_id >= (sizeof(funcs)/sizeof(funcs[0])))) {
|
if ((ctl_id < 0) || (ctl_id >= (sizeof(funcs)/sizeof(funcs[0])))) {
|
||||||
return;
|
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.name = cip->name;
|
||||||
cip->grp.attrs = cip->attr_gen;
|
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
|
#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)
|
static void pvr2_sysfs_add_debugifc(struct pvr2_sysfs *sfp)
|
||||||
{
|
{
|
||||||
struct pvr2_sysfs_debugifc *dip;
|
struct pvr2_sysfs_debugifc *dip;
|
||||||
|
int ret;
|
||||||
|
|
||||||
dip = kmalloc(sizeof(*dip),GFP_KERNEL);
|
dip = kmalloc(sizeof(*dip),GFP_KERNEL);
|
||||||
if (!dip) return;
|
if (!dip) return;
|
||||||
memset(dip,0,sizeof(*dip));
|
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.attr.mode = S_IRUGO;
|
||||||
dip->attr_debuginfo.show = debuginfo_show;
|
dip->attr_debuginfo.show = debuginfo_show;
|
||||||
sfp->debugifc = dip;
|
sfp->debugifc = dip;
|
||||||
class_device_create_file(sfp->class_dev,&dip->attr_debugcmd);
|
ret = class_device_create_file(sfp->class_dev,&dip->attr_debugcmd);
|
||||||
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->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)
|
static void pvr2_sysfs_tear_down_debugifc(struct pvr2_sysfs *sfp)
|
||||||
{
|
{
|
||||||
if (!sfp->debugifc) return;
|
if (!sfp->debugifc) return;
|
||||||
|
if (sfp->debugifc->debuginfo_created_ok) {
|
||||||
class_device_remove_file(sfp->class_dev,
|
class_device_remove_file(sfp->class_dev,
|
||||||
&sfp->debugifc->attr_debuginfo);
|
&sfp->debugifc->attr_debuginfo);
|
||||||
class_device_remove_file(sfp->class_dev,&sfp->debugifc->attr_debugcmd);
|
}
|
||||||
|
if (sfp->debugifc->debugcmd_created_ok) {
|
||||||
|
class_device_remove_file(sfp->class_dev,
|
||||||
|
&sfp->debugifc->attr_debugcmd);
|
||||||
|
}
|
||||||
kfree(sfp->debugifc);
|
kfree(sfp->debugifc);
|
||||||
sfp->debugifc = NULL;
|
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;
|
struct pvr2_sysfs_ctl_item *cip1,*cip2;
|
||||||
for (cip1 = sfp->item_first; cip1; cip1 = cip2) {
|
for (cip1 = sfp->item_first; cip1; cip1 = cip2) {
|
||||||
cip2 = cip1->item_next;
|
cip2 = cip1->item_next;
|
||||||
|
if (cip1->created_ok) {
|
||||||
sysfs_remove_group(&sfp->class_dev->kobj,&cip1->grp);
|
sysfs_remove_group(&sfp->class_dev->kobj,&cip1->grp);
|
||||||
|
}
|
||||||
pvr2_sysfs_trace("Destroying pvr2_sysfs_ctl_item id=%p",cip1);
|
pvr2_sysfs_trace("Destroying pvr2_sysfs_ctl_item id=%p",cip1);
|
||||||
kfree(cip1);
|
kfree(cip1);
|
||||||
}
|
}
|
||||||
|
@ -675,8 +708,14 @@ static void class_dev_destroy(struct pvr2_sysfs *sfp)
|
||||||
pvr2_sysfs_tear_down_debugifc(sfp);
|
pvr2_sysfs_tear_down_debugifc(sfp);
|
||||||
#endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */
|
#endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */
|
||||||
pvr2_sysfs_tear_down_controls(sfp);
|
pvr2_sysfs_tear_down_controls(sfp);
|
||||||
class_device_remove_file(sfp->class_dev,&sfp->attr_v4l_minor_number);
|
if (sfp->v4l_minor_number_created_ok) {
|
||||||
class_device_remove_file(sfp->class_dev,&sfp->attr_unit_number);
|
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);
|
pvr2_sysfs_trace("Destroying class_dev id=%p",sfp->class_dev);
|
||||||
sfp->class_dev->class_data = NULL;
|
sfp->class_dev->class_data = NULL;
|
||||||
class_device_unregister(sfp->class_dev);
|
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 usb_device *usb_dev;
|
||||||
struct class_device *class_dev;
|
struct class_device *class_dev;
|
||||||
|
int ret;
|
||||||
|
|
||||||
usb_dev = pvr2_hdw_get_dev(sfp->channel.hdw);
|
usb_dev = pvr2_hdw_get_dev(sfp->channel.hdw);
|
||||||
if (!usb_dev) return;
|
if (!usb_dev) return;
|
||||||
class_dev = kmalloc(sizeof(*class_dev),GFP_KERNEL);
|
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;
|
sfp->class_dev = class_dev;
|
||||||
class_dev->class_data = sfp;
|
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.owner = THIS_MODULE;
|
||||||
sfp->attr_v4l_minor_number.attr.name = "v4l_minor_number";
|
sfp->attr_v4l_minor_number.attr.name = "v4l_minor_number";
|
||||||
sfp->attr_v4l_minor_number.attr.mode = S_IRUGO;
|
sfp->attr_v4l_minor_number.attr.mode = S_IRUGO;
|
||||||
sfp->attr_v4l_minor_number.show = v4l_minor_number_show;
|
sfp->attr_v4l_minor_number.show = v4l_minor_number_show;
|
||||||
sfp->attr_v4l_minor_number.store = NULL;
|
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.owner = THIS_MODULE;
|
||||||
sfp->attr_unit_number.attr.name = "unit_number";
|
sfp->attr_unit_number.attr.name = "unit_number";
|
||||||
sfp->attr_unit_number.attr.mode = S_IRUGO;
|
sfp->attr_unit_number.attr.mode = S_IRUGO;
|
||||||
sfp->attr_unit_number.show = unit_number_show;
|
sfp->attr_unit_number.show = unit_number_show;
|
||||||
sfp->attr_unit_number.store = NULL;
|
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);
|
pvr2_sysfs_add_controls(sfp);
|
||||||
#ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC
|
#ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC
|
||||||
|
|
|
@ -997,9 +997,9 @@ static int saa7134_alsa_init(void)
|
||||||
struct saa7134_dev *dev = NULL;
|
struct saa7134_dev *dev = NULL;
|
||||||
struct list_head *list;
|
struct list_head *list;
|
||||||
|
|
||||||
if (!dmasound_init && !dmasound_exit) {
|
if (!saa7134_dmasound_init && !saa7134_dmasound_exit) {
|
||||||
dmasound_init = alsa_device_init;
|
saa7134_dmasound_init = alsa_device_init;
|
||||||
dmasound_exit = alsa_device_exit;
|
saa7134_dmasound_exit = alsa_device_exit;
|
||||||
} else {
|
} else {
|
||||||
printk(KERN_WARNING "saa7134 ALSA: can't load, DMA sound handler already assigned (probably to OSS)\n");
|
printk(KERN_WARNING "saa7134 ALSA: can't load, DMA sound handler already assigned (probably to OSS)\n");
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
@ -1036,8 +1036,8 @@ static void saa7134_alsa_exit(void)
|
||||||
snd_card_free(snd_saa7134_cards[idx]);
|
snd_card_free(snd_saa7134_cards[idx]);
|
||||||
}
|
}
|
||||||
|
|
||||||
dmasound_init = NULL;
|
saa7134_dmasound_init = NULL;
|
||||||
dmasound_exit = NULL;
|
saa7134_dmasound_exit = NULL;
|
||||||
printk(KERN_INFO "saa7134 ALSA driver for DMA sound unloaded\n");
|
printk(KERN_INFO "saa7134 ALSA driver for DMA sound unloaded\n");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -95,8 +95,8 @@ LIST_HEAD(saa7134_devlist);
|
||||||
static LIST_HEAD(mops_list);
|
static LIST_HEAD(mops_list);
|
||||||
static unsigned int saa7134_devcount;
|
static unsigned int saa7134_devcount;
|
||||||
|
|
||||||
int (*dmasound_init)(struct saa7134_dev *dev);
|
int (*saa7134_dmasound_init)(struct saa7134_dev *dev);
|
||||||
int (*dmasound_exit)(struct saa7134_dev *dev);
|
int (*saa7134_dmasound_exit)(struct saa7134_dev *dev);
|
||||||
|
|
||||||
#define dprintk(fmt, arg...) if (core_debug) \
|
#define dprintk(fmt, arg...) if (core_debug) \
|
||||||
printk(KERN_DEBUG "%s/core: " fmt, dev->name , ## arg)
|
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 */
|
/* check for signal */
|
||||||
saa7134_irq_video_intl(dev);
|
saa7134_irq_video_intl(dev);
|
||||||
|
|
||||||
if (dmasound_init && !dev->dmasound.priv_data) {
|
if (saa7134_dmasound_init && !dev->dmasound.priv_data) {
|
||||||
dmasound_init(dev);
|
saa7134_dmasound_init(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1036,8 +1036,8 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
|
||||||
struct saa7134_mpeg_ops *mops;
|
struct saa7134_mpeg_ops *mops;
|
||||||
|
|
||||||
/* Release DMA sound modules if present */
|
/* Release DMA sound modules if present */
|
||||||
if (dmasound_exit && dev->dmasound.priv_data) {
|
if (saa7134_dmasound_exit && dev->dmasound.priv_data) {
|
||||||
dmasound_exit(dev);
|
saa7134_dmasound_exit(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* debugging ... */
|
/* debugging ... */
|
||||||
|
@ -1169,8 +1169,8 @@ EXPORT_SYMBOL(saa7134_boards);
|
||||||
|
|
||||||
/* ----------------- for the DMA sound modules --------------- */
|
/* ----------------- for the DMA sound modules --------------- */
|
||||||
|
|
||||||
EXPORT_SYMBOL(dmasound_init);
|
EXPORT_SYMBOL(saa7134_dmasound_init);
|
||||||
EXPORT_SYMBOL(dmasound_exit);
|
EXPORT_SYMBOL(saa7134_dmasound_exit);
|
||||||
EXPORT_SYMBOL(saa7134_pgtable_free);
|
EXPORT_SYMBOL(saa7134_pgtable_free);
|
||||||
EXPORT_SYMBOL(saa7134_pgtable_build);
|
EXPORT_SYMBOL(saa7134_pgtable_build);
|
||||||
EXPORT_SYMBOL(saa7134_pgtable_alloc);
|
EXPORT_SYMBOL(saa7134_pgtable_alloc);
|
||||||
|
|
|
@ -993,9 +993,9 @@ static int saa7134_oss_init(void)
|
||||||
struct saa7134_dev *dev = NULL;
|
struct saa7134_dev *dev = NULL;
|
||||||
struct list_head *list;
|
struct list_head *list;
|
||||||
|
|
||||||
if (!dmasound_init && !dmasound_exit) {
|
if (!saa7134_dmasound_init && !saa7134_dmasound_exit) {
|
||||||
dmasound_init = oss_device_init;
|
saa7134_dmasound_init = oss_device_init;
|
||||||
dmasound_exit = oss_device_exit;
|
saa7134_dmasound_exit = oss_device_exit;
|
||||||
} else {
|
} else {
|
||||||
printk(KERN_WARNING "saa7134 OSS: can't load, DMA sound handler already assigned (probably to ALSA)\n");
|
printk(KERN_WARNING "saa7134 OSS: can't load, DMA sound handler already assigned (probably to ALSA)\n");
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
@ -1037,8 +1037,8 @@ static void saa7134_oss_exit(void)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dmasound_init = NULL;
|
saa7134_dmasound_init = NULL;
|
||||||
dmasound_exit = NULL;
|
saa7134_dmasound_exit = NULL;
|
||||||
|
|
||||||
printk(KERN_INFO "saa7134 OSS driver for DMA sound unloaded\n");
|
printk(KERN_INFO "saa7134 OSS driver for DMA sound unloaded\n");
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@
|
||||||
|
|
||||||
static unsigned int video_debug = 0;
|
static unsigned int video_debug = 0;
|
||||||
static unsigned int gbuffers = 8;
|
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 = 720*576*4;
|
||||||
static unsigned int gbufsize_max = 720*576*4;
|
static unsigned int gbufsize_max = 720*576*4;
|
||||||
module_param(video_debug, int, 0644);
|
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_param(gbuffers, int, 0444);
|
||||||
MODULE_PARM_DESC(gbuffers,"number of capture buffers, range 2-32");
|
MODULE_PARM_DESC(gbuffers,"number of capture buffers, range 2-32");
|
||||||
module_param(noninterlaced, int, 0644);
|
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) \
|
#define dprintk(fmt, arg...) if (video_debug) \
|
||||||
printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg)
|
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;
|
struct v4l2_format *f = arg;
|
||||||
return saa7134_try_fmt(dev,fh,f);
|
return saa7134_try_fmt(dev,fh,f);
|
||||||
}
|
}
|
||||||
#ifdef HAVE_V4L1
|
#ifdef CONFIG_V4L1_COMPAT
|
||||||
case VIDIOCGMBUF:
|
case VIDIOCGMBUF:
|
||||||
{
|
{
|
||||||
struct video_mbuf *mbuf = arg;
|
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);
|
int saa7134_set_dmabits(struct saa7134_dev *dev);
|
||||||
|
|
||||||
extern int (*dmasound_init)(struct saa7134_dev *dev);
|
extern int (*saa7134_dmasound_init)(struct saa7134_dev *dev);
|
||||||
extern int (*dmasound_exit)(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 }
|
{ 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
MODULE_DEVICE_TABLE(pci, stradis_pci_tbl);
|
|
||||||
|
|
||||||
static struct pci_driver stradis_driver = {
|
static struct pci_driver stradis_driver = {
|
||||||
.name = "stradis",
|
.name = "stradis",
|
||||||
|
|
|
@ -196,14 +196,6 @@ static void set_type(struct i2c_client *c, unsigned int type,
|
||||||
i2c_master_send(c, buffer, 4);
|
i2c_master_send(c, buffer, 4);
|
||||||
default_tuner_init(c);
|
default_tuner_init(c);
|
||||||
break;
|
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:
|
case TUNER_PHILIPS_TD1316:
|
||||||
buffer[0] = 0x0b;
|
buffer[0] = 0x0b;
|
||||||
buffer[1] = 0xdc;
|
buffer[1] = 0xdc;
|
||||||
|
@ -598,6 +590,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
||||||
if (t->standby)
|
if (t->standby)
|
||||||
t->standby (client);
|
t->standby (client);
|
||||||
break;
|
break;
|
||||||
|
#ifdef CONFIG_VIDEO_V4L1
|
||||||
case VIDIOCSAUDIO:
|
case VIDIOCSAUDIO:
|
||||||
if (check_mode(t, "VIDIOCSAUDIO") == EINVAL)
|
if (check_mode(t, "VIDIOCSAUDIO") == EINVAL)
|
||||||
return 0;
|
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 */
|
/* Should be implemented, since bttv calls it */
|
||||||
tuner_dbg("VIDIOCSAUDIO not implemented.\n");
|
tuner_dbg("VIDIOCSAUDIO not implemented.\n");
|
||||||
break;
|
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:
|
case VIDIOCSCHAN:
|
||||||
{
|
{
|
||||||
static const v4l2_std_id map[] = {
|
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;
|
? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO;
|
||||||
return 0;
|
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:
|
case VIDIOC_S_STD:
|
||||||
{
|
{
|
||||||
v4l2_std_id *id = arg;
|
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)))
|
if (4 != (rc = i2c_master_send(c,buffer,4)))
|
||||||
tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc);
|
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
|
// FIXME - this may also work for other tuners
|
||||||
unsigned long timeout = jiffies + msecs_to_jiffies(1);
|
unsigned long timeout = jiffies + msecs_to_jiffies(1);
|
||||||
u8 status_byte = 0;
|
u8 status_byte = 0;
|
||||||
|
@ -368,6 +381,8 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq)
|
||||||
|
|
||||||
if (4 != (rc = i2c_master_send(c,buffer,4)))
|
if (4 != (rc = i2c_master_send(c,buffer,4)))
|
||||||
tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc);
|
tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ config VIDEO_USBVIDEO
|
||||||
|
|
||||||
config USB_VICAM
|
config USB_VICAM
|
||||||
tristate "USB 3com HomeConnect (aka vicam) support (EXPERIMENTAL)"
|
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
|
select VIDEO_USBVIDEO
|
||||||
---help---
|
---help---
|
||||||
Say Y here if you have 3com homeconnect camera (vicam).
|
Say Y here if you have 3com homeconnect camera (vicam).
|
||||||
|
@ -13,7 +13,7 @@ config USB_VICAM
|
||||||
|
|
||||||
config USB_IBMCAM
|
config USB_IBMCAM
|
||||||
tristate "USB IBM (Xirlink) C-it Camera support"
|
tristate "USB IBM (Xirlink) C-it Camera support"
|
||||||
depends on USB && VIDEO_V4L1
|
depends on USB && VIDEO_DEV && VIDEO_V4L1
|
||||||
select VIDEO_USBVIDEO
|
select VIDEO_USBVIDEO
|
||||||
---help---
|
---help---
|
||||||
Say Y here if you want to connect a IBM "C-It" camera, also known as
|
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
|
config USB_KONICAWC
|
||||||
tristate "USB Konica Webcam support"
|
tristate "USB Konica Webcam support"
|
||||||
depends on USB && VIDEO_V4L1
|
depends on USB && VIDEO_DEV && VIDEO_V4L1
|
||||||
select VIDEO_USBVIDEO
|
select VIDEO_USBVIDEO
|
||||||
---help---
|
---help---
|
||||||
Say Y here if you want support for webcams based on a Konica
|
Say Y here if you want support for webcams based on a Konica
|
||||||
|
@ -39,7 +39,7 @@ config USB_KONICAWC
|
||||||
|
|
||||||
config USB_QUICKCAM_MESSENGER
|
config USB_QUICKCAM_MESSENGER
|
||||||
tristate "USB Logitech Quickcam Messenger"
|
tristate "USB Logitech Quickcam Messenger"
|
||||||
depends on USB && VIDEO_DEV
|
depends on USB && VIDEO_DEV && VIDEO_V4L1
|
||||||
select VIDEO_USBVIDEO
|
select VIDEO_USBVIDEO
|
||||||
---help---
|
---help---
|
||||||
Say Y or M here to enable support for the USB Logitech Quickcam
|
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 */
|
/* debug help functions */
|
||||||
|
|
||||||
#ifdef HAVE_V4L1
|
#ifdef CONFIG_V4L1_COMPAT
|
||||||
static const char *v4l1_ioctls[] = {
|
static const char *v4l1_ioctls[] = {
|
||||||
[_IOC_NR(VIDIOCGCAP)] = "VIDIOCGCAP",
|
[_IOC_NR(VIDIOCGCAP)] = "VIDIOCGCAP",
|
||||||
[_IOC_NR(VIDIOCGCHAN)] = "VIDIOCGCHAN",
|
[_IOC_NR(VIDIOCGCHAN)] = "VIDIOCGCHAN",
|
||||||
|
@ -301,7 +301,7 @@ static const char *v4l2_ioctls[] = {
|
||||||
#define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
|
#define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
|
||||||
|
|
||||||
static const char *v4l2_int_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_CAPABILITIES)] = "DECODER_GET_CAPABILITIES",
|
||||||
[_IOC_NR(DECODER_GET_STATUS)] = "DECODER_GET_STATUS",
|
[_IOC_NR(DECODER_GET_STATUS)] = "DECODER_GET_STATUS",
|
||||||
[_IOC_NR(DECODER_SET_NORM)] = "DECODER_SET_NORM",
|
[_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) ?
|
(_IOC_NR(cmd) < V4L2_INT_IOCTLS) ?
|
||||||
v4l2_int_ioctls[_IOC_NR(cmd)] : "UNKNOWN", dir, cmd);
|
v4l2_int_ioctls[_IOC_NR(cmd)] : "UNKNOWN", dir, cmd);
|
||||||
break;
|
break;
|
||||||
#ifdef HAVE_V4L1
|
#ifdef CONFIG_V4L1_COMPAT
|
||||||
case 'v':
|
case 'v':
|
||||||
printk("v4l1 ioctl %s, dir=%s (0x%08x)\n",
|
printk("v4l1 ioctl %s, dir=%s (0x%08x)\n",
|
||||||
(_IOC_NR(cmd) < V4L1_IOCTLS) ?
|
(_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);
|
printk ("%s: tuner type=%d\n", s, *p);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||||
case DECODER_SET_VBI_BYPASS:
|
case DECODER_SET_VBI_BYPASS:
|
||||||
case DECODER_ENABLE_OUTPUT:
|
case DECODER_ENABLE_OUTPUT:
|
||||||
case DECODER_GET_STATUS:
|
case DECODER_GET_STATUS:
|
||||||
|
@ -424,6 +425,7 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg)
|
||||||
case VIDIOCCAPTURE:
|
case VIDIOCCAPTURE:
|
||||||
case VIDIOCSYNC:
|
case VIDIOCSYNC:
|
||||||
case VIDIOCSWRITEMODE:
|
case VIDIOCSWRITEMODE:
|
||||||
|
#endif
|
||||||
case TUNER_SET_TYPE_ADDR:
|
case TUNER_SET_TYPE_ADDR:
|
||||||
case TUNER_SET_STANDBY:
|
case TUNER_SET_STANDBY:
|
||||||
case TDA9887_SET_CONFIG:
|
case TDA9887_SET_CONFIG:
|
||||||
|
@ -755,6 +757,7 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg)
|
||||||
p->afc);
|
p->afc);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||||
case VIDIOCGVBIFMT:
|
case VIDIOCGVBIFMT:
|
||||||
case VIDIOCSVBIFMT:
|
case VIDIOCSVBIFMT:
|
||||||
{
|
{
|
||||||
|
@ -924,6 +927,14 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg)
|
||||||
p->clipcount);
|
p->clipcount);
|
||||||
break;
|
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_AUDIO_CLOCK_FREQ:
|
||||||
case VIDIOC_INT_I2S_CLOCK_FREQ:
|
case VIDIOC_INT_I2S_CLOCK_FREQ:
|
||||||
case VIDIOC_INT_S_STANDBY:
|
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);
|
printk ("%s: value=%d\n", s, *p);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case VIDIOCGFREQ:
|
|
||||||
case VIDIOCSFREQ:
|
|
||||||
{
|
|
||||||
unsigned long *p=arg;
|
|
||||||
printk ("%s: value=%lu\n", s, *p);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case VIDIOC_G_STD:
|
case VIDIOC_G_STD:
|
||||||
case VIDIOC_S_STD:
|
case VIDIOC_S_STD:
|
||||||
case VIDIOC_QUERYSTD:
|
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);
|
ret=vfd->vidioc_overlay(file, fh, *i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#ifdef HAVE_V4L1
|
#ifdef CONFIG_V4L1_COMPAT
|
||||||
/* --- streaming capture ------------------------------------- */
|
/* --- streaming capture ------------------------------------- */
|
||||||
case VIDIOCGMBUF:
|
case VIDIOCGMBUF:
|
||||||
{
|
{
|
||||||
|
@ -1512,6 +1512,7 @@ int video_register_device(struct video_device *vfd, int type, int nr)
|
||||||
int i=0;
|
int i=0;
|
||||||
int base;
|
int base;
|
||||||
int end;
|
int end;
|
||||||
|
int ret;
|
||||||
char *name_base;
|
char *name_base;
|
||||||
|
|
||||||
switch(type)
|
switch(type)
|
||||||
|
@ -1537,6 +1538,8 @@ int video_register_device(struct video_device *vfd, int type, int nr)
|
||||||
name_base = "radio";
|
name_base = "radio";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
printk(KERN_ERR "%s called with unknown type: %d\n",
|
||||||
|
__FUNCTION__, type);
|
||||||
return -1;
|
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.class = &video_class;
|
||||||
vfd->class_dev.devt = MKDEV(VIDEO_MAJOR, vfd->minor);
|
vfd->class_dev.devt = MKDEV(VIDEO_MAJOR, vfd->minor);
|
||||||
sprintf(vfd->class_dev.class_id, "%s%d", name_base, i - base);
|
sprintf(vfd->class_dev.class_id, "%s%d", name_base, i - base);
|
||||||
class_device_register(&vfd->class_dev);
|
ret = class_device_register(&vfd->class_dev);
|
||||||
class_device_create_file(&vfd->class_dev,
|
if (ret < 0) {
|
||||||
&class_device_attr_name);
|
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
|
#if 1
|
||||||
/* needed until all drivers are fixed */
|
/* 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);
|
"http://lwn.net/Articles/36850/\n", vfd->name);
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
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));
|
file->f_flags & O_NONBLOCK));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_V4L1
|
#ifdef CONFIG_V4L1_COMPAT
|
||||||
static int vidiocgmbuf (struct file *file, void *priv, struct video_mbuf *mbuf)
|
static int vidiocgmbuf (struct file *file, void *priv, struct video_mbuf *mbuf)
|
||||||
{
|
{
|
||||||
struct vivi_fh *fh=priv;
|
struct vivi_fh *fh=priv;
|
||||||
|
@ -1328,7 +1328,7 @@ static struct video_device vivi = {
|
||||||
.vidioc_s_ctrl = vidioc_s_ctrl,
|
.vidioc_s_ctrl = vidioc_s_ctrl,
|
||||||
.vidioc_streamon = vidioc_streamon,
|
.vidioc_streamon = vidioc_streamon,
|
||||||
.vidioc_streamoff = vidioc_streamoff,
|
.vidioc_streamoff = vidioc_streamoff,
|
||||||
#ifdef HAVE_V4L1
|
#ifdef CONFIG_V4L1_COMPAT
|
||||||
.vidiocgmbuf = vidiocgmbuf,
|
.vidiocgmbuf = vidiocgmbuf,
|
||||||
#endif
|
#endif
|
||||||
.tvnorms = tvnorms,
|
.tvnorms = tvnorms,
|
||||||
|
|
|
@ -12,10 +12,11 @@
|
||||||
#ifndef __LINUX_VIDEODEV_H
|
#ifndef __LINUX_VIDEODEV_H
|
||||||
#define __LINUX_VIDEODEV_H
|
#define __LINUX_VIDEODEV_H
|
||||||
|
|
||||||
#define HAVE_V4L1 1
|
|
||||||
|
|
||||||
#include <linux/videodev2.h>
|
#include <linux/videodev2.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||||
|
#define HAVE_V4L1 1
|
||||||
|
|
||||||
struct video_capability
|
struct video_capability
|
||||||
{
|
{
|
||||||
char name[32];
|
char name[32];
|
||||||
|
@ -336,6 +337,8 @@ struct video_code
|
||||||
#define VID_HARDWARE_SN9C102 38
|
#define VID_HARDWARE_SN9C102 38
|
||||||
#define VID_HARDWARE_ARV 39
|
#define VID_HARDWARE_ARV 39
|
||||||
|
|
||||||
|
#endif /* CONFIG_VIDEO_V4L1_COMPAT */
|
||||||
|
|
||||||
#endif /* __LINUX_VIDEODEV_H */
|
#endif /* __LINUX_VIDEODEV_H */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -716,7 +716,7 @@ struct v4l2_ext_control
|
||||||
__s64 value64;
|
__s64 value64;
|
||||||
void *reserved;
|
void *reserved;
|
||||||
};
|
};
|
||||||
};
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
struct v4l2_ext_controls
|
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*);
|
extern struct video_device* video_devdata(struct file*);
|
||||||
|
|
||||||
#define to_video_device(cd) container_of(cd, struct video_device, class_dev)
|
#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,
|
video_device_create_file(struct video_device *vfd,
|
||||||
struct class_device_attribute *attr)
|
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
|
static inline void
|
||||||
video_device_remove_file(struct video_device *vfd,
|
video_device_remove_file(struct video_device *vfd,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче