Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/v4l-dvb
* 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/v4l-dvb: (26 commits)
V4L/DVB (6548): pvrusb2: Fix oops on module removal
V4L/DVB (6547): V4L: remove PCI from VIDEO_VIVI depends
V4L/DVB (6532): Add the remaining addresses for tda9887
V4L/DVB (6531): Fix a regression caused by commit 153962364d
V4L/DVB (6518): Fix tvp5150 default values
V4L/DVB (6514): em28xx: Include linux/mm.h
V4L/DVB (6506): saa7134-alsa: Fix mmap support
V4L/DVB (6504): pvrusb2: Remove dead sysfs code
V4L/DVB (6503): pvrusb2: Fix associativity logic error
V4L/DVB (6501): stv0297: Signal strength fixes
V4L/DVB (6500): tda10021: Fix reported signal strength
V4L/DVB (6499): tda10021: Bit error counting fixed
V4L/DVB (6498): ves1820: Change the acquisition range for clock recovery from 120 ppm to 240ppm
V4L/DVB (6495): saa7146: saa7146_wait_for_debi_done fixes
V4L/DVB (6479): use input functions, should depend on INPUT
V4L/DVB (6478): ir-functions use input functions, should depend on INPUT
V4L/DVB (6432): tuner: fix CONFIG_TUNER_TEA5761=m
V4L/DVB (6407): planb: fix obvious interrupt handling bugs
V4L/DVB (6406): saa7134: fix analog audio in on medion md8800 quadro
V4L/DVB (6403): mt2131: replace comma with semicolon fix
...
This commit is contained in:
commit
41557e7c56
26 changed files with 224 additions and 72 deletions
|
@ -8,4 +8,7 @@
|
|||
7 -> Leadtek Winfast USB II (em2800)
|
||||
8 -> Kworld USB2800 (em2800)
|
||||
9 -> Pinnacle Dazzle DVC 90 (em2820/em2840) [2304:0207]
|
||||
10 -> Hauppauge WinTV HVR 900 (em2880)
|
||||
11 -> Terratec Hybrid XS (em2880)
|
||||
12 -> Kworld PVR TV 2800 RF (em2820/em2840)
|
||||
13 -> Terratec Prodigy XS (em2880)
|
||||
|
|
|
@ -151,6 +151,7 @@ config VIDEO_IR_I2C
|
|||
|
||||
config VIDEO_IR
|
||||
tristate
|
||||
depends on INPUT
|
||||
select VIDEO_IR_I2C if I2C
|
||||
|
||||
config VIDEO_TVEEPROM
|
||||
|
|
|
@ -59,43 +59,89 @@ void saa7146_setgpio(struct saa7146_dev *dev, int port, u32 data)
|
|||
}
|
||||
|
||||
/* This DEBI code is based on the saa7146 Stradis driver by Nathan Laredo */
|
||||
int saa7146_wait_for_debi_done(struct saa7146_dev *dev, int nobusyloop)
|
||||
static inline int saa7146_wait_for_debi_done_sleep(struct saa7146_dev *dev,
|
||||
unsigned long us1, unsigned long us2)
|
||||
{
|
||||
unsigned long start;
|
||||
unsigned long timeout;
|
||||
int err;
|
||||
|
||||
/* wait for registers to be programmed */
|
||||
start = jiffies;
|
||||
timeout = jiffies + usecs_to_jiffies(us1);
|
||||
while (1) {
|
||||
err = time_after(jiffies, start + HZ/20);
|
||||
err = time_after(jiffies, timeout);
|
||||
if (saa7146_read(dev, MC2) & 2)
|
||||
break;
|
||||
if (err) {
|
||||
DEB_S(("timed out while waiting for registers getting programmed\n"));
|
||||
printk(KERN_ERR "%s: %s timed out while waiting for "
|
||||
"registers getting programmed\n",
|
||||
dev->name, __FUNCTION__);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
if (nobusyloop)
|
||||
msleep(1);
|
||||
msleep(1);
|
||||
}
|
||||
|
||||
/* wait for transfer to complete */
|
||||
start = jiffies;
|
||||
timeout = jiffies + usecs_to_jiffies(us2);
|
||||
while (1) {
|
||||
err = time_after(jiffies, start + HZ/4);
|
||||
err = time_after(jiffies, timeout);
|
||||
if (!(saa7146_read(dev, PSR) & SPCI_DEBI_S))
|
||||
break;
|
||||
saa7146_read(dev, MC2);
|
||||
if (err) {
|
||||
DEB_S(("timed out while waiting for transfer completion\n"));
|
||||
DEB_S(("%s: %s timed out while waiting for transfer "
|
||||
"completion\n", dev->name, __FUNCTION__));
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
if (nobusyloop)
|
||||
msleep(1);
|
||||
msleep(1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int saa7146_wait_for_debi_done_busyloop(struct saa7146_dev *dev,
|
||||
unsigned long us1, unsigned long us2)
|
||||
{
|
||||
unsigned long loops;
|
||||
|
||||
/* wait for registers to be programmed */
|
||||
loops = us1;
|
||||
while (1) {
|
||||
if (saa7146_read(dev, MC2) & 2)
|
||||
break;
|
||||
if (!loops--) {
|
||||
printk(KERN_ERR "%s: %s timed out while waiting for "
|
||||
"registers getting programmed\n",
|
||||
dev->name, __FUNCTION__);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
/* wait for transfer to complete */
|
||||
loops = us2 / 5;
|
||||
while (1) {
|
||||
if (!(saa7146_read(dev, PSR) & SPCI_DEBI_S))
|
||||
break;
|
||||
saa7146_read(dev, MC2);
|
||||
if (!loops--) {
|
||||
DEB_S(("%s: %s timed out while waiting for transfer "
|
||||
"completion\n", dev->name, __FUNCTION__));
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
udelay(5);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int saa7146_wait_for_debi_done(struct saa7146_dev *dev, int nobusyloop)
|
||||
{
|
||||
if (nobusyloop)
|
||||
return saa7146_wait_for_debi_done_sleep(dev, 50000, 250000);
|
||||
else
|
||||
return saa7146_wait_for_debi_done_busyloop(dev, 50000, 250000);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* general helper functions
|
||||
****************************************************************************/
|
||||
|
|
|
@ -116,7 +116,7 @@ static int mt2131_set_params(struct dvb_frontend *fe,
|
|||
f_lo1 = (f_lo1 / 250) * 250;
|
||||
f_lo2 = f_lo1 - freq - MT2131_IF2;
|
||||
|
||||
priv->frequency = (f_lo1 - f_lo2 - MT2131_IF2) * 1000,
|
||||
priv->frequency = (f_lo1 - f_lo2 - MT2131_IF2) * 1000;
|
||||
|
||||
/* Frequency LO1 = 16MHz * (DIV1 + NUM1/8192 ) */
|
||||
num1 = f_lo1 * 64 / (MT2131_FREF / 128);
|
||||
|
|
|
@ -42,6 +42,9 @@ struct s5h1409_state {
|
|||
fe_modulation_t current_modulation;
|
||||
|
||||
u32 current_frequency;
|
||||
|
||||
u32 is_qam_locked;
|
||||
u32 qam_state;
|
||||
};
|
||||
|
||||
static int debug = 0;
|
||||
|
@ -94,6 +97,7 @@ static struct init_tab {
|
|||
{ 0xac, 0x1003, },
|
||||
{ 0xad, 0x103f, },
|
||||
{ 0xe2, 0x0100, },
|
||||
{ 0xe3, 0x0000, },
|
||||
{ 0x28, 0x1010, },
|
||||
{ 0xb1, 0x000e, },
|
||||
};
|
||||
|
@ -335,6 +339,8 @@ static int s5h1409_softreset(struct dvb_frontend* fe)
|
|||
|
||||
s5h1409_writereg(state, 0xf5, 0);
|
||||
s5h1409_writereg(state, 0xf5, 1);
|
||||
state->is_qam_locked = 0;
|
||||
state->qam_state = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -349,6 +355,11 @@ static int s5h1409_set_if_freq(struct dvb_frontend* fe, int KHz)
|
|||
s5h1409_writereg(state, 0x87, 0x01be);
|
||||
s5h1409_writereg(state, 0x88, 0x0436);
|
||||
s5h1409_writereg(state, 0x89, 0x054d);
|
||||
} else
|
||||
if (KHz == 4000) {
|
||||
s5h1409_writereg(state, 0x87, 0x014b);
|
||||
s5h1409_writereg(state, 0x88, 0x0cb5);
|
||||
s5h1409_writereg(state, 0x89, 0x03e2);
|
||||
} else {
|
||||
printk("%s() Invalid arg = %d KHz\n", __FUNCTION__, KHz);
|
||||
ret = -1;
|
||||
|
@ -361,7 +372,7 @@ static int s5h1409_set_spectralinversion(struct dvb_frontend* fe, int inverted)
|
|||
{
|
||||
struct s5h1409_state* state = fe->demodulator_priv;
|
||||
|
||||
dprintk("%s()\n", __FUNCTION__);
|
||||
dprintk("%s(%d)\n", __FUNCTION__, inverted);
|
||||
|
||||
if(inverted == 1)
|
||||
return s5h1409_writereg(state, 0x1b, 0x1101); /* Inverted */
|
||||
|
@ -382,14 +393,10 @@ static int s5h1409_enable_modulation(struct dvb_frontend* fe,
|
|||
s5h1409_writereg(state, 0xf4, 0);
|
||||
break;
|
||||
case QAM_64:
|
||||
dprintk("%s() QAM_64\n", __FUNCTION__);
|
||||
s5h1409_writereg(state, 0xf4, 1);
|
||||
s5h1409_writereg(state, 0x85, 0x100);
|
||||
break;
|
||||
case QAM_256:
|
||||
dprintk("%s() QAM_256\n", __FUNCTION__);
|
||||
dprintk("%s() QAM_AUTO (64/256)\n", __FUNCTION__);
|
||||
s5h1409_writereg(state, 0xf4, 1);
|
||||
s5h1409_writereg(state, 0x85, 0x101);
|
||||
s5h1409_writereg(state, 0x85, 0x110);
|
||||
break;
|
||||
default:
|
||||
dprintk("%s() Invalid modulation\n", __FUNCTION__);
|
||||
|
@ -423,7 +430,7 @@ static int s5h1409_set_gpio(struct dvb_frontend* fe, int enable)
|
|||
if (enable)
|
||||
return s5h1409_writereg(state, 0xe3, 0x1100);
|
||||
else
|
||||
return s5h1409_writereg(state, 0xe3, 0);
|
||||
return s5h1409_writereg(state, 0xe3, 0x1000);
|
||||
}
|
||||
|
||||
static int s5h1409_sleep(struct dvb_frontend* fe, int enable)
|
||||
|
@ -444,6 +451,66 @@ static int s5h1409_register_reset(struct dvb_frontend* fe)
|
|||
return s5h1409_writereg(state, 0xfa, 0);
|
||||
}
|
||||
|
||||
static void s5h1409_set_qam_amhum_mode(struct dvb_frontend *fe)
|
||||
{
|
||||
struct s5h1409_state *state = fe->demodulator_priv;
|
||||
u16 reg;
|
||||
|
||||
if (state->is_qam_locked)
|
||||
return;
|
||||
|
||||
/* QAM EQ lock check */
|
||||
reg = s5h1409_readreg(state, 0xf0);
|
||||
|
||||
if ((reg >> 13) & 0x1) {
|
||||
|
||||
state->is_qam_locked = 1;
|
||||
reg &= 0xff;
|
||||
|
||||
s5h1409_writereg(state, 0x96, 0x00c);
|
||||
if ((reg < 0x38) || (reg > 0x68) ) {
|
||||
s5h1409_writereg(state, 0x93, 0x3332);
|
||||
s5h1409_writereg(state, 0x9e, 0x2c37);
|
||||
} else {
|
||||
s5h1409_writereg(state, 0x93, 0x3130);
|
||||
s5h1409_writereg(state, 0x9e, 0x2836);
|
||||
}
|
||||
|
||||
} else {
|
||||
s5h1409_writereg(state, 0x96, 0x0008);
|
||||
s5h1409_writereg(state, 0x93, 0x3332);
|
||||
s5h1409_writereg(state, 0x9e, 0x2c37);
|
||||
}
|
||||
}
|
||||
|
||||
static void s5h1409_set_qam_interleave_mode(struct dvb_frontend *fe)
|
||||
{
|
||||
struct s5h1409_state *state = fe->demodulator_priv;
|
||||
u16 reg, reg1, reg2;
|
||||
|
||||
reg = s5h1409_readreg(state, 0xf1);
|
||||
|
||||
/* Master lock */
|
||||
if ((reg >> 15) & 0x1) {
|
||||
if (state->qam_state != 2) {
|
||||
state->qam_state = 2;
|
||||
reg1 = s5h1409_readreg(state, 0xb2);
|
||||
reg2 = s5h1409_readreg(state, 0xad);
|
||||
|
||||
s5h1409_writereg(state, 0x96, 0x20);
|
||||
s5h1409_writereg(state, 0xad,
|
||||
( ((reg1 & 0xf000) >> 4) | (reg2 & 0xf0ff)) );
|
||||
s5h1409_writereg(state, 0xab, 0x1100);
|
||||
}
|
||||
} else {
|
||||
if (state->qam_state != 1) {
|
||||
state->qam_state = 1;
|
||||
s5h1409_writereg(state, 0x96, 0x08);
|
||||
s5h1409_writereg(state, 0xab, 0x1101);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Talk to the demod, set the FEC, GUARD, QAM settings etc */
|
||||
static int s5h1409_set_frontend (struct dvb_frontend* fe,
|
||||
struct dvb_frontend_parameters *p)
|
||||
|
@ -458,12 +525,21 @@ static int s5h1409_set_frontend (struct dvb_frontend* fe,
|
|||
|
||||
s5h1409_enable_modulation(fe, p->u.vsb.modulation);
|
||||
|
||||
/* Allow the demod to settle */
|
||||
msleep(100);
|
||||
|
||||
if (fe->ops.tuner_ops.set_params) {
|
||||
if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 1);
|
||||
fe->ops.tuner_ops.set_params(fe, p);
|
||||
if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0);
|
||||
}
|
||||
|
||||
/* Optimize the demod for QAM */
|
||||
if (p->u.vsb.modulation != VSB_8) {
|
||||
s5h1409_set_qam_amhum_mode(fe);
|
||||
s5h1409_set_qam_interleave_mode(fe);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -495,8 +571,8 @@ static int s5h1409_init (struct dvb_frontend* fe)
|
|||
s5h1409_set_gpio(fe, state->config->gpio);
|
||||
s5h1409_softreset(fe);
|
||||
|
||||
/* Note: Leaving the I2C gate open here. */
|
||||
s5h1409_i2c_gate_ctrl(fe, 1);
|
||||
/* Note: Leaving the I2C gate closed. */
|
||||
s5h1409_i2c_gate_ctrl(fe, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -358,11 +358,23 @@ static int stv0297_read_ber(struct dvb_frontend *fe, u32 * ber)
|
|||
static int stv0297_read_signal_strength(struct dvb_frontend *fe, u16 * strength)
|
||||
{
|
||||
struct stv0297_state *state = fe->demodulator_priv;
|
||||
u8 STRENGTH[2];
|
||||
|
||||
stv0297_readregs(state, 0x41, STRENGTH, 2);
|
||||
*strength = (STRENGTH[1] & 0x03) << 8 | STRENGTH[0];
|
||||
u8 STRENGTH[3];
|
||||
u16 tmp;
|
||||
|
||||
stv0297_readregs(state, 0x41, STRENGTH, 3);
|
||||
tmp = (STRENGTH[1] & 0x03) << 8 | STRENGTH[0];
|
||||
if (STRENGTH[2] & 0x20) {
|
||||
if (tmp < 0x200)
|
||||
tmp = 0;
|
||||
else
|
||||
tmp = tmp - 0x200;
|
||||
} else {
|
||||
if (tmp > 0x1ff)
|
||||
tmp = 0;
|
||||
else
|
||||
tmp = 0x1ff - tmp;
|
||||
}
|
||||
*strength = (tmp << 7) | (tmp >> 2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -301,6 +301,8 @@ static int tda10021_read_ber(struct dvb_frontend* fe, u32* ber)
|
|||
u32 _ber = tda10021_readreg(state, 0x14) |
|
||||
(tda10021_readreg(state, 0x15) << 8) |
|
||||
((tda10021_readreg(state, 0x16) & 0x0f) << 16);
|
||||
_tda10021_writereg(state, 0x10, (tda10021_readreg(state, 0x10) & ~0xc0)
|
||||
| (tda10021_inittab[0x10] & 0xc0));
|
||||
*ber = 10 * _ber;
|
||||
|
||||
return 0;
|
||||
|
@ -310,7 +312,11 @@ static int tda10021_read_signal_strength(struct dvb_frontend* fe, u16* strength)
|
|||
{
|
||||
struct tda10021_state* state = fe->demodulator_priv;
|
||||
|
||||
u8 config = tda10021_readreg(state, 0x02);
|
||||
u8 gain = tda10021_readreg(state, 0x17);
|
||||
if (config & 0x02)
|
||||
/* the agc value is inverted */
|
||||
gain = ~gain;
|
||||
*strength = (gain << 8) | gain;
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -47,7 +47,7 @@ struct ves1820_state {
|
|||
static int verbose;
|
||||
|
||||
static u8 ves1820_inittab[] = {
|
||||
0x69, 0x6A, 0x93, 0x12, 0x12, 0x46, 0x26, 0x1A,
|
||||
0x69, 0x6A, 0x93, 0x1A, 0x12, 0x46, 0x26, 0x1A,
|
||||
0x43, 0x6A, 0xAA, 0xAA, 0x1E, 0x85, 0x43, 0x20,
|
||||
0xE0, 0x00, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
|
||||
|
|
|
@ -84,7 +84,7 @@ config DVB_BUDGET
|
|||
|
||||
config DVB_BUDGET_CI
|
||||
tristate "Budget cards with onboard CI connector"
|
||||
depends on DVB_CORE && PCI && I2C && VIDEO_V4L1
|
||||
depends on DVB_CORE && PCI && I2C && VIDEO_V4L1 && INPUT
|
||||
select VIDEO_SAA7146
|
||||
select DVB_STV0297 if !DVB_FE_CUSTOMISE
|
||||
select DVB_STV0299 if !DVB_FE_CUSTOMISE
|
||||
|
|
|
@ -363,7 +363,7 @@ endmenu # encoder / decoder chips
|
|||
|
||||
config VIDEO_VIVI
|
||||
tristate "Virtual Video Driver"
|
||||
depends on VIDEO_V4L2 && !SPARC32 && !SPARC64 && PCI
|
||||
depends on VIDEO_V4L2 && !SPARC32 && !SPARC64
|
||||
select VIDEOBUF_VMALLOC
|
||||
default n
|
||||
---help---
|
||||
|
|
|
@ -2881,10 +2881,6 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file,
|
|||
if (NULL == fmt)
|
||||
return -EINVAL;
|
||||
mutex_lock(&fh->cap.lock);
|
||||
if (fmt->depth != pic->depth) {
|
||||
retval = -EINVAL;
|
||||
goto fh_unlock_and_return;
|
||||
}
|
||||
if (fmt->flags & FORMAT_FLAGS_RAW) {
|
||||
/* VIDIOCMCAPTURE uses gbufsize, not RAW_BPL *
|
||||
RAW_LINES * 2. F1 is stored at offset 0, F2
|
||||
|
@ -3117,6 +3113,8 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file,
|
|||
vm->width,vm->height,field);
|
||||
if (0 != retval)
|
||||
goto fh_unlock_and_return;
|
||||
btv->init.width = vm->width;
|
||||
btv->init.height = vm->height;
|
||||
spin_lock_irqsave(&btv->s_lock,flags);
|
||||
buffer_queue(&fh->cap,&buf->vb);
|
||||
spin_unlock_irqrestore(&btv->s_lock,flags);
|
||||
|
|
|
@ -3,6 +3,9 @@
|
|||
* multifunction chip. Currently works with the Omnivision OV7670
|
||||
* sensor.
|
||||
*
|
||||
* The data sheet for this device can be found at:
|
||||
* http://www.marvell.com/products/pcconn/88ALP01.jsp
|
||||
*
|
||||
* Copyright 2006 One Laptop Per Child Association, Inc.
|
||||
* Copyright 2006-7 Jonathan Corbet <corbet@lwn.net>
|
||||
*
|
||||
|
@ -2232,13 +2235,16 @@ static int cafe_pci_suspend(struct pci_dev *pdev, pm_message_t state)
|
|||
{
|
||||
struct cafe_camera *cam = cafe_find_by_pdev(pdev);
|
||||
int ret;
|
||||
enum cafe_state cstate;
|
||||
|
||||
ret = pci_save_state(pdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
cstate = cam->state; /* HACK - stop_dma sets to idle */
|
||||
cafe_ctlr_stop_dma(cam);
|
||||
cafe_ctlr_power_down(cam);
|
||||
pci_disable_device(pdev);
|
||||
cam->state = cstate;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
config VIDEO_CX23885
|
||||
tristate "Conexant cx23885 (2388x successor) support"
|
||||
depends on DVB_CORE && VIDEO_DEV && PCI && I2C
|
||||
depends on DVB_CORE && VIDEO_DEV && PCI && I2C && INPUT
|
||||
select I2C_ALGOBIT
|
||||
select FW_LOADER
|
||||
select VIDEO_BTCX
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
config VIDEO_CX88
|
||||
tristate "Conexant 2388x (bt878 successor) support"
|
||||
depends on VIDEO_DEV && PCI && I2C
|
||||
depends on VIDEO_DEV && PCI && I2C && INPUT
|
||||
select I2C_ALGOBIT
|
||||
select FW_LOADER
|
||||
select VIDEO_BTCX
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
config VIDEO_EM28XX
|
||||
tristate "Empia EM2800/2820/2840 USB video capture support"
|
||||
depends on VIDEO_V4L1 && I2C
|
||||
depends on VIDEO_V4L1 && I2C && INPUT
|
||||
select VIDEO_TUNER
|
||||
select VIDEO_TVEEPROM
|
||||
select VIDEO_IR
|
||||
|
|
|
@ -416,8 +416,10 @@ static int attach_inform(struct i2c_client *client)
|
|||
struct em28xx *dev = client->adapter->algo_data;
|
||||
|
||||
switch (client->addr << 1) {
|
||||
case 0x43:
|
||||
case 0x4b:
|
||||
case 0x86:
|
||||
case 0x84:
|
||||
case 0x96:
|
||||
case 0x94:
|
||||
{
|
||||
struct tuner_setup tun_setup;
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include <linux/usb.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/video_decoder.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
|
|
|
@ -91,7 +91,6 @@ static void planb_close(struct video_device *);
|
|||
static int planb_ioctl(struct video_device *, unsigned int, void *);
|
||||
static int planb_init_done(struct video_device *);
|
||||
static int planb_mmap(struct video_device *, const char *, unsigned long);
|
||||
static void planb_irq(int, void *);
|
||||
static void release_planb(void);
|
||||
int init_planbs(struct video_init *);
|
||||
|
||||
|
@ -1315,7 +1314,7 @@ static volatile struct dbdma_cmd *setup_grab_cmd(int fr, struct planb *pb)
|
|||
return c1;
|
||||
}
|
||||
|
||||
static void planb_irq(int irq, void *dev_id)
|
||||
static irqreturn_t planb_irq(int irq, void *dev_id)
|
||||
{
|
||||
unsigned int stat, astat;
|
||||
struct planb *pb = (struct planb *)dev_id;
|
||||
|
@ -1358,13 +1357,14 @@ static void planb_irq(int irq, void *dev_id)
|
|||
pb->frame_stat[fr] = GBUFFER_DONE;
|
||||
pb->grabbing--;
|
||||
wake_up_interruptible(&pb->capq);
|
||||
return;
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
/* incorrect interrupts? */
|
||||
pb->intr_mask = PLANB_CLR_IRQ;
|
||||
out_le32(&pb->planb_base->intr_stat, PLANB_CLR_IRQ);
|
||||
printk(KERN_ERR "PlanB: IRQ lockup, cleared intrrupts"
|
||||
" unconditionally\n");
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/*******************************
|
||||
|
@ -2090,7 +2090,7 @@ static int init_planb(struct planb *pb)
|
|||
/* clear interrupt mask */
|
||||
pb->intr_mask = PLANB_CLR_IRQ;
|
||||
|
||||
result = request_irq(pb->irq, planb_irq, 0, "PlanB", (void *)pb);
|
||||
result = request_irq(pb->irq, planb_irq, 0, "PlanB", pb);
|
||||
if (result < 0) {
|
||||
if (result==-EINVAL)
|
||||
printk(KERN_ERR "PlanB: Bad irq number (%d) "
|
||||
|
|
|
@ -410,7 +410,7 @@ static int parse_mtoken(const char *ptr,unsigned int len,
|
|||
int msk;
|
||||
*valptr = 0;
|
||||
for (idx = 0, msk = 1; valid_bits; idx++, msk <<= 1) {
|
||||
if (!msk & valid_bits) continue;
|
||||
if (!(msk & valid_bits)) continue;
|
||||
valid_bits &= ~msk;
|
||||
if (!names[idx]) continue;
|
||||
slen = strlen(names[idx]);
|
||||
|
|
|
@ -136,14 +136,13 @@ static int __init pvr_init(void)
|
|||
|
||||
static void __exit pvr_exit(void)
|
||||
{
|
||||
|
||||
pvr2_trace(PVR2_TRACE_INIT,"pvr_exit");
|
||||
|
||||
usb_deregister(&pvr_driver);
|
||||
|
||||
#ifdef CONFIG_VIDEO_PVRUSB2_SYSFS
|
||||
pvr2_sysfs_class_destroy(class_ptr);
|
||||
#endif /* CONFIG_VIDEO_PVRUSB2_SYSFS */
|
||||
|
||||
usb_deregister(&pvr_driver);
|
||||
}
|
||||
|
||||
module_init(pvr_init);
|
||||
|
|
|
@ -905,13 +905,6 @@ struct pvr2_sysfs *pvr2_sysfs_create(struct pvr2_context *mp,
|
|||
}
|
||||
|
||||
|
||||
static int pvr2_sysfs_hotplug(struct device *d,
|
||||
struct kobj_uevent_env *env)
|
||||
{
|
||||
/* Even though we don't do anything here, we still need this function
|
||||
because sysfs will still try to call it. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct pvr2_sysfs_class *pvr2_sysfs_class_create(void)
|
||||
{
|
||||
|
@ -922,7 +915,6 @@ struct pvr2_sysfs_class *pvr2_sysfs_class_create(void)
|
|||
clp->class.name = "pvrusb2";
|
||||
clp->class.class_release = pvr2_sysfs_class_release;
|
||||
clp->class.dev_release = pvr2_sysfs_release;
|
||||
clp->class.dev_uevent = pvr2_sysfs_hotplug;
|
||||
if (class_register(&clp->class)) {
|
||||
pvr2_sysfs_trace(
|
||||
"Registration failed for pvr2_sysfs_class id=%p",clp);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
config VIDEO_SAA7134
|
||||
tristate "Philips SAA7134 support"
|
||||
depends on VIDEO_DEV && PCI && I2C
|
||||
depends on VIDEO_DEV && PCI && I2C && INPUT
|
||||
select VIDEOBUF_DMA_SG
|
||||
select VIDEO_IR
|
||||
select VIDEO_TUNER
|
||||
|
|
|
@ -543,8 +543,10 @@ static int snd_card_saa7134_hw_params(struct snd_pcm_substream * substream,
|
|||
V4L functions, and force ALSA to use that as the DMA area */
|
||||
|
||||
substream->runtime->dma_area = dev->dmasound.dma.vmalloc;
|
||||
substream->runtime->dma_bytes = dev->dmasound.bufsize;
|
||||
substream->runtime->dma_addr = 0;
|
||||
|
||||
return 1;
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
@ -651,6 +653,17 @@ static int snd_card_saa7134_capture_open(struct snd_pcm_substream * substream)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* page callback (needed for mmap)
|
||||
*/
|
||||
|
||||
static struct page *snd_card_saa7134_page(struct snd_pcm_substream *substream,
|
||||
unsigned long offset)
|
||||
{
|
||||
void *pageptr = substream->runtime->dma_area + offset;
|
||||
return vmalloc_to_page(pageptr);
|
||||
}
|
||||
|
||||
/*
|
||||
* ALSA capture callbacks definition
|
||||
*/
|
||||
|
@ -664,6 +677,7 @@ static struct snd_pcm_ops snd_card_saa7134_capture_ops = {
|
|||
.prepare = snd_card_saa7134_capture_prepare,
|
||||
.trigger = snd_card_saa7134_capture_trigger,
|
||||
.pointer = snd_card_saa7134_capture_pointer,
|
||||
.page = snd_card_saa7134_page,
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -2996,11 +2996,11 @@ struct saa7134_board saa7134_boards[] = {
|
|||
},{
|
||||
.name = name_comp1,
|
||||
.vmux = 0,
|
||||
.amux = LINE2,
|
||||
.amux = LINE1,
|
||||
},{
|
||||
.name = name_svideo,
|
||||
.vmux = 8,
|
||||
.amux = LINE2,
|
||||
.amux = LINE1,
|
||||
}},
|
||||
},
|
||||
[SAA7134_BOARD_FLYDVBS_LR300] = {
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
|
||||
/* standard i2c insmod options */
|
||||
static unsigned short normal_i2c[] = {
|
||||
#ifdef CONFIG_TUNER_TEA5761
|
||||
#if defined(CONFIG_TUNER_TEA5761) || (defined(CONFIG_TUNER_TEA5761_MODULE) && defined(MODULE))
|
||||
0x10,
|
||||
#endif
|
||||
0x42, 0x43, 0x4a, 0x4b, /* tda8290 */
|
||||
|
@ -292,7 +292,6 @@ static void set_type(struct i2c_client *c, unsigned int type,
|
|||
}
|
||||
t->mode_mask = T_RADIO;
|
||||
break;
|
||||
#ifdef CONFIG_TUNER_TEA5761
|
||||
case TUNER_TEA5761:
|
||||
if (tea5761_attach(&t->fe, t->i2c.adapter, t->i2c.addr) == NULL) {
|
||||
t->type = TUNER_ABSENT;
|
||||
|
@ -301,7 +300,6 @@ static void set_type(struct i2c_client *c, unsigned int type,
|
|||
}
|
||||
t->mode_mask = T_RADIO;
|
||||
break;
|
||||
#endif
|
||||
case TUNER_PHILIPS_FMD1216ME_MK3:
|
||||
buffer[0] = 0x0b;
|
||||
buffer[1] = 0xdc;
|
||||
|
@ -594,7 +592,6 @@ static int tuner_attach(struct i2c_adapter *adap, int addr, int kind)
|
|||
/* autodetection code based on the i2c addr */
|
||||
if (!no_autodetect) {
|
||||
switch (addr) {
|
||||
#ifdef CONFIG_TUNER_TEA5761
|
||||
case 0x10:
|
||||
if (tea5761_autodetection(t->i2c.adapter, t->i2c.addr) != EINVAL) {
|
||||
t->type = TUNER_TEA5761;
|
||||
|
@ -606,7 +603,6 @@ static int tuner_attach(struct i2c_adapter *adap, int addr, int kind)
|
|||
goto register_client;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
case 0x42:
|
||||
case 0x43:
|
||||
case 0x4a:
|
||||
|
|
|
@ -799,10 +799,10 @@ static inline void tvp5150_reset(struct i2c_client *c)
|
|||
tvp5150_write_inittab(c, tvp5150_init_enable);
|
||||
|
||||
/* Initialize image preferences */
|
||||
tvp5150_write(c, TVP5150_BRIGHT_CTL, decoder->bright >> 8);
|
||||
tvp5150_write(c, TVP5150_CONTRAST_CTL, decoder->contrast >> 8);
|
||||
tvp5150_write(c, TVP5150_SATURATION_CTL, decoder->contrast >> 8);
|
||||
tvp5150_write(c, TVP5150_HUE_CTL, (decoder->hue - 32768) >> 8);
|
||||
tvp5150_write(c, TVP5150_BRIGHT_CTL, decoder->bright);
|
||||
tvp5150_write(c, TVP5150_CONTRAST_CTL, decoder->contrast);
|
||||
tvp5150_write(c, TVP5150_SATURATION_CTL, decoder->contrast);
|
||||
tvp5150_write(c, TVP5150_HUE_CTL, decoder->hue);
|
||||
|
||||
tvp5150_set_std(c, decoder->norm);
|
||||
};
|
||||
|
@ -1077,10 +1077,10 @@ static int tvp5150_detect_client(struct i2c_adapter *adapter,
|
|||
core->norm = V4L2_STD_ALL; /* Default is autodetect */
|
||||
core->route.input = TVP5150_COMPOSITE1;
|
||||
core->enable = 1;
|
||||
core->bright = 32768;
|
||||
core->contrast = 32768;
|
||||
core->hue = 32768;
|
||||
core->sat = 32768;
|
||||
core->bright = 128;
|
||||
core->contrast = 128;
|
||||
core->hue = 0;
|
||||
core->sat = 128;
|
||||
|
||||
if (rv) {
|
||||
kfree(c);
|
||||
|
|
Loading…
Reference in a new issue