mirror of https://gitee.com/openkylin/linux.git
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: V4L/DVB (4750): AGC command1/2 is board specific V4L/DVB (4748): Fixed oops for Nova-T USB2 V4L/DVB (4746): HM12 is YUV 4:2:0, not YUV 4:1:1 V4L/DVB (4744): The Samsung TCPN2121P30A does not have a tda9887 V4L/DVB (4743): Fix oops in VIDIOC_G_PARM V4L/DVB (4742): Drivers/media/video: handle sysfs errors V4L/DVB (4741): {ov511,stv680}: handle sysfs errors V4L/DVB (4740): Fixed an if-block to avoid floating with debug-messages V4L/DVB (4739): SECAM support for saa7113 into saa7115 V4L/DVB (4738): Bt8xx/dvb-bt8xx.c: check kmalloc() return value. V4L/DVB (4734): Tda826x: fix frontend selection for dvb_attach V4L/DVB (4733): Tda10086: fix frontend selection for dvb_attach V4L/DVB (4732): Fix spelling error in Kconfig help text for DVB_CORE_ATTACH V4L/DVB (4731a): Kconfig: restore pvrusb2 menu items V4L/DVB (4729): Fix VIDIOC_G_FMT for NTSC in cx25840. V4L/DVB (4727): Support status readout for saa713x based FM radio V4L/DVB (4725): Fix vivi compile on parisc V4L/DVB (4692): Add WinTV-HVR3000 DVB-T support
This commit is contained in:
commit
ed75ded7dd
|
@ -51,7 +51,7 @@
|
||||||
50 -> NPG Tech Real TV FM Top 10 [14f1:0842]
|
50 -> NPG Tech Real TV FM Top 10 [14f1:0842]
|
||||||
51 -> WinFast DTV2000 H [107d:665e]
|
51 -> WinFast DTV2000 H [107d:665e]
|
||||||
52 -> Geniatech DVB-S [14f1:0084]
|
52 -> Geniatech DVB-S [14f1:0084]
|
||||||
53 -> Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DVB-T [0070:1404]
|
53 -> Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DVB-T [0070:1404,0070:1400,0070:1401,0070:1402]
|
||||||
54 -> Norwood Micro TV Tuner
|
54 -> Norwood Micro TV Tuner
|
||||||
55 -> Shenzhen Tungsten Ages Tech TE-DTV-250 / Swann OEM [c180:c980]
|
55 -> Shenzhen Tungsten Ages Tech TE-DTV-250 / Swann OEM [c180:c980]
|
||||||
56 -> Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder [0070:9600,0070:9601,0070:9602]
|
56 -> Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder [0070:9600,0070:9601,0070:9602]
|
||||||
|
|
|
@ -665,6 +665,10 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type)
|
||||||
case BTTV_BOARD_TWINHAN_DST:
|
case BTTV_BOARD_TWINHAN_DST:
|
||||||
/* DST is not a frontend driver !!! */
|
/* DST is not a frontend driver !!! */
|
||||||
state = (struct dst_state *) kmalloc(sizeof (struct dst_state), GFP_KERNEL);
|
state = (struct dst_state *) kmalloc(sizeof (struct dst_state), GFP_KERNEL);
|
||||||
|
if (!state) {
|
||||||
|
printk("dvb_bt8xx: No memory\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
/* Setup the Card */
|
/* Setup the Card */
|
||||||
state->config = &dst_config;
|
state->config = &dst_config;
|
||||||
state->i2c = card->i2c_adapter;
|
state->i2c = card->i2c_adapter;
|
||||||
|
|
|
@ -19,6 +19,6 @@ config DVB_CORE_ATTACH
|
||||||
allow the card drivers to only load the frontend modules
|
allow the card drivers to only load the frontend modules
|
||||||
they require. This saves several KBytes of memory.
|
they require. This saves several KBytes of memory.
|
||||||
|
|
||||||
Note: You will need moudule-init-tools v3.2 or later for this feature.
|
Note: You will need module-init-tools v3.2 or later for this feature.
|
||||||
|
|
||||||
If unsure say Y.
|
If unsure say Y.
|
||||||
|
|
|
@ -169,7 +169,7 @@ EXPORT_SYMBOL(dibusb_read_eeprom_byte);
|
||||||
// Config Adjacent channels Perf -cal22
|
// Config Adjacent channels Perf -cal22
|
||||||
static struct dibx000_agc_config dib3000p_mt2060_agc_config = {
|
static struct dibx000_agc_config dib3000p_mt2060_agc_config = {
|
||||||
.band_caps = BAND_VHF | BAND_UHF,
|
.band_caps = BAND_VHF | BAND_UHF,
|
||||||
.setup = (0 << 15) | (0 << 14) | (1 << 13) | (1 << 12) | (29 << 0),
|
.setup = (1 << 8) | (5 << 5) | (1 << 4) | (1 << 3) | (0 << 2) | (2 << 0),
|
||||||
|
|
||||||
.agc1_max = 48497,
|
.agc1_max = 48497,
|
||||||
.agc1_min = 23593,
|
.agc1_min = 23593,
|
||||||
|
@ -196,10 +196,14 @@ static struct dib3000mc_config stk3000p_dib3000p_config = {
|
||||||
.ln_adc_level = 0x1cc7,
|
.ln_adc_level = 0x1cc7,
|
||||||
|
|
||||||
.output_mpeg2_in_188_bytes = 1,
|
.output_mpeg2_in_188_bytes = 1,
|
||||||
|
|
||||||
|
.agc_command1 = 1,
|
||||||
|
.agc_command2 = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct dibx000_agc_config dib3000p_panasonic_agc_config = {
|
static struct dibx000_agc_config dib3000p_panasonic_agc_config = {
|
||||||
.setup = (0 << 15) | (0 << 14) | (1 << 13) | (1 << 12) | (29 << 0),
|
.band_caps = BAND_VHF | BAND_UHF,
|
||||||
|
.setup = (1 << 8) | (5 << 5) | (1 << 4) | (1 << 3) | (0 << 2) | (2 << 0),
|
||||||
|
|
||||||
.agc1_max = 56361,
|
.agc1_max = 56361,
|
||||||
.agc1_min = 22282,
|
.agc1_min = 22282,
|
||||||
|
@ -226,6 +230,9 @@ static struct dib3000mc_config mod3000p_dib3000p_config = {
|
||||||
.ln_adc_level = 0x1cc7,
|
.ln_adc_level = 0x1cc7,
|
||||||
|
|
||||||
.output_mpeg2_in_188_bytes = 1,
|
.output_mpeg2_in_188_bytes = 1,
|
||||||
|
|
||||||
|
.agc_command1 = 1,
|
||||||
|
.agc_command2 = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
int dibusb_dib3000mc_frontend_attach(struct dvb_usb_adapter *adap)
|
int dibusb_dib3000mc_frontend_attach(struct dvb_usb_adapter *adap)
|
||||||
|
|
|
@ -99,7 +99,9 @@
|
||||||
struct dibusb_state {
|
struct dibusb_state {
|
||||||
struct dib_fe_xfer_ops ops;
|
struct dib_fe_xfer_ops ops;
|
||||||
int mt2060_present;
|
int mt2060_present;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct dibusb_device_state {
|
||||||
/* for RC5 remote control */
|
/* for RC5 remote control */
|
||||||
int old_toggle;
|
int old_toggle;
|
||||||
int last_repeat_count;
|
int last_repeat_count;
|
||||||
|
|
|
@ -75,7 +75,7 @@ static int nova_t_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
|
||||||
u8 key[5],cmd[2] = { DIBUSB_REQ_POLL_REMOTE, 0x35 }, data,toggle,custom;
|
u8 key[5],cmd[2] = { DIBUSB_REQ_POLL_REMOTE, 0x35 }, data,toggle,custom;
|
||||||
u16 raw;
|
u16 raw;
|
||||||
int i;
|
int i;
|
||||||
struct dibusb_state *st = d->priv;
|
struct dibusb_device_state *st = d->priv;
|
||||||
|
|
||||||
dvb_usb_generic_rw(d,cmd,2,key,5,0);
|
dvb_usb_generic_rw(d,cmd,2,key,5,0);
|
||||||
|
|
||||||
|
@ -184,6 +184,7 @@ static struct dvb_usb_device_properties nova_t_properties = {
|
||||||
.size_of_priv = sizeof(struct dibusb_state),
|
.size_of_priv = sizeof(struct dibusb_state),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
.size_of_priv = sizeof(struct dibusb_device_state),
|
||||||
|
|
||||||
.power_ctrl = dibusb2_0_power_ctrl,
|
.power_ctrl = dibusb2_0_power_ctrl,
|
||||||
.read_mac_address = nova_t_read_mac_address,
|
.read_mac_address = nova_t_read_mac_address,
|
||||||
|
|
|
@ -345,7 +345,7 @@ static int dib3000mc_init(struct dvb_frontend *demod)
|
||||||
|
|
||||||
/* agc */
|
/* agc */
|
||||||
dib3000mc_write_word(state, 36, state->cfg->max_time);
|
dib3000mc_write_word(state, 36, state->cfg->max_time);
|
||||||
dib3000mc_write_word(state, 37, agc->setup);
|
dib3000mc_write_word(state, 37, (state->cfg->agc_command1 << 13) | (state->cfg->agc_command2 << 12) | (0x1d << 0));
|
||||||
dib3000mc_write_word(state, 38, state->cfg->pwm3_value);
|
dib3000mc_write_word(state, 38, state->cfg->pwm3_value);
|
||||||
dib3000mc_write_word(state, 39, state->cfg->ln_adc_level);
|
dib3000mc_write_word(state, 39, state->cfg->ln_adc_level);
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,9 @@ struct dib3000mc_config {
|
||||||
u16 max_time;
|
u16 max_time;
|
||||||
u16 ln_adc_level;
|
u16 ln_adc_level;
|
||||||
|
|
||||||
|
u8 agc_command1 :1;
|
||||||
|
u8 agc_command2 :1;
|
||||||
|
|
||||||
u8 mobile_mode;
|
u8 mobile_mode;
|
||||||
|
|
||||||
u8 output_mpeg2_in_188_bytes;
|
u8 output_mpeg2_in_188_bytes;
|
||||||
|
|
|
@ -35,7 +35,16 @@ struct tda10086_config
|
||||||
u8 invert;
|
u8 invert;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(CONFIG_DVB_TDA10086) || defined(CONFIG_DVB_TDA10086_MODULE)
|
||||||
extern struct dvb_frontend* tda10086_attach(const struct tda10086_config* config,
|
extern struct dvb_frontend* tda10086_attach(const struct tda10086_config* config,
|
||||||
struct i2c_adapter* i2c);
|
struct i2c_adapter* i2c);
|
||||||
|
#else
|
||||||
|
static inline struct dvb_frontend* tda10086_attach(const struct tda10086_config* config,
|
||||||
|
struct i2c_adapter* i2c)
|
||||||
|
{
|
||||||
|
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __FUNCTION__);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#endif // CONFIG_DVB_TDA10086
|
||||||
|
|
||||||
#endif // TDA10086_H
|
#endif // TDA10086_H
|
||||||
|
|
|
@ -35,6 +35,19 @@
|
||||||
* @param has_loopthrough Set to 1 if the card has a loopthrough RF connector.
|
* @param has_loopthrough Set to 1 if the card has a loopthrough RF connector.
|
||||||
* @return FE pointer on success, NULL on failure.
|
* @return FE pointer on success, NULL on failure.
|
||||||
*/
|
*/
|
||||||
extern struct dvb_frontend *tda826x_attach(struct dvb_frontend *fe, int addr, struct i2c_adapter *i2c, int has_loopthrough);
|
#if defined(CONFIG_DVB_TDA826X) || defined(CONFIG_DVB_TDA826X_MODULE)
|
||||||
|
extern struct dvb_frontend* tda826x_attach(struct dvb_frontend *fe, int addr,
|
||||||
|
struct i2c_adapter *i2c,
|
||||||
|
int has_loopthrough);
|
||||||
|
#else
|
||||||
|
static inline struct dvb_frontend* tda826x_attach(struct dvb_frontend *fe,
|
||||||
|
int addr,
|
||||||
|
struct i2c_adapter *i2c,
|
||||||
|
int has_loopthrough)
|
||||||
|
{
|
||||||
|
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __FUNCTION__);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#endif // CONFIG_DVB_TDA826X
|
||||||
|
|
||||||
#endif
|
#endif // __DVB_TDA826X_H__
|
||||||
|
|
|
@ -677,6 +677,8 @@ config VIDEO_M32R_AR_M64278
|
||||||
menu "V4L USB devices"
|
menu "V4L USB devices"
|
||||||
depends on USB && VIDEO_DEV
|
depends on USB && VIDEO_DEV
|
||||||
|
|
||||||
|
source "drivers/media/video/pvrusb2/Kconfig"
|
||||||
|
|
||||||
source "drivers/media/video/em28xx/Kconfig"
|
source "drivers/media/video/em28xx/Kconfig"
|
||||||
|
|
||||||
source "drivers/media/video/usbvideo/Kconfig"
|
source "drivers/media/video/usbvideo/Kconfig"
|
||||||
|
|
|
@ -235,6 +235,7 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg)
|
||||||
0, 0, V4L2_SLICED_VPS, 0, 0, /* 9 */
|
0, 0, V4L2_SLICED_VPS, 0, 0, /* 9 */
|
||||||
0, 0, 0, 0
|
0, 0, 0, 0
|
||||||
};
|
};
|
||||||
|
int is_pal = !(cx25840_get_v4lstd(client) & V4L2_STD_525_60);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
fmt = arg;
|
fmt = arg;
|
||||||
|
@ -246,6 +247,7 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg)
|
||||||
if ((cx25840_read(client, 0x404) & 0x10) == 0)
|
if ((cx25840_read(client, 0x404) & 0x10) == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
if (is_pal) {
|
||||||
for (i = 7; i <= 23; i++) {
|
for (i = 7; i <= 23; i++) {
|
||||||
u8 v = cx25840_read(client, 0x424 + i - 7);
|
u8 v = cx25840_read(client, 0x424 + i - 7);
|
||||||
|
|
||||||
|
@ -254,6 +256,17 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg)
|
||||||
svbi->service_set |=
|
svbi->service_set |=
|
||||||
svbi->service_lines[0][i] | svbi->service_lines[1][i];
|
svbi->service_lines[0][i] | svbi->service_lines[1][i];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (i = 10; i <= 21; i++) {
|
||||||
|
u8 v = cx25840_read(client, 0x424 + i - 10);
|
||||||
|
|
||||||
|
svbi->service_lines[0][i] = lcr2vbi[v >> 4];
|
||||||
|
svbi->service_lines[1][i] = lcr2vbi[v & 0xf];
|
||||||
|
svbi->service_set |=
|
||||||
|
svbi->service_lines[0][i] | svbi->service_lines[1][i];
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1230,6 +1230,7 @@ struct cx88_board cx88_boards[] = {
|
||||||
.vmux = 2,
|
.vmux = 2,
|
||||||
.gpio0 = 0x84bf,
|
.gpio0 = 0x84bf,
|
||||||
}},
|
}},
|
||||||
|
.mpeg = CX88_MPEG_DVB,
|
||||||
},
|
},
|
||||||
[CX88_BOARD_NORWOOD_MICRO] = {
|
[CX88_BOARD_NORWOOD_MICRO] = {
|
||||||
.name = "Norwood Micro TV Tuner",
|
.name = "Norwood Micro TV Tuner",
|
||||||
|
@ -1590,6 +1591,18 @@ struct cx88_subid cx88_subids[] = {
|
||||||
.subvendor = 0x0070,
|
.subvendor = 0x0070,
|
||||||
.subdevice = 0x9000,
|
.subdevice = 0x9000,
|
||||||
.card = CX88_BOARD_HAUPPAUGE_DVB_T1,
|
.card = CX88_BOARD_HAUPPAUGE_DVB_T1,
|
||||||
|
},{
|
||||||
|
.subvendor = 0x0070,
|
||||||
|
.subdevice = 0x1400,
|
||||||
|
.card = CX88_BOARD_HAUPPAUGE_HVR3000,
|
||||||
|
},{
|
||||||
|
.subvendor = 0x0070,
|
||||||
|
.subdevice = 0x1401,
|
||||||
|
.card = CX88_BOARD_HAUPPAUGE_HVR3000,
|
||||||
|
},{
|
||||||
|
.subvendor = 0x0070,
|
||||||
|
.subdevice = 0x1402,
|
||||||
|
.card = CX88_BOARD_HAUPPAUGE_HVR3000,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
const unsigned int cx88_idcount = ARRAY_SIZE(cx88_subids);
|
const unsigned int cx88_idcount = ARRAY_SIZE(cx88_subids);
|
||||||
|
@ -1633,7 +1646,15 @@ static void hauppauge_eeprom(struct cx88_core *core, u8 *eeprom_data)
|
||||||
/* Make sure we support the board model */
|
/* Make sure we support the board model */
|
||||||
switch (tv.model)
|
switch (tv.model)
|
||||||
{
|
{
|
||||||
|
case 14009: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in) */
|
||||||
|
case 14019: /* WinTV-HVR3000 (Retail, IR Blaster, b/panel video, 3.5mm audio in) */
|
||||||
|
case 14029: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge) */
|
||||||
|
case 14109: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - low profile) */
|
||||||
|
case 14129: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge - LP) */
|
||||||
|
case 14559: /* WinTV-HVR3000 (OEM, no IR, b/panel video, 3.5mm audio in) */
|
||||||
case 14569: /* WinTV-HVR3000 (OEM, no IR, no back panel video) */
|
case 14569: /* WinTV-HVR3000 (OEM, no IR, no back panel video) */
|
||||||
|
case 14659: /* WinTV-HVR3000 (OEM, no IR, b/panel video, RCA audio in - Low profile) */
|
||||||
|
case 14669: /* WinTV-HVR3000 (OEM, no IR, no b/panel video - Low profile) */
|
||||||
case 28552: /* WinTV-PVR 'Roslyn' (No IR) */
|
case 28552: /* WinTV-PVR 'Roslyn' (No IR) */
|
||||||
case 34519: /* WinTV-PCI-FM */
|
case 34519: /* WinTV-PCI-FM */
|
||||||
case 90002: /* Nova-T-PCI (9002) */
|
case 90002: /* Nova-T-PCI (9002) */
|
||||||
|
|
|
@ -315,15 +315,22 @@ static struct cx22702_config hauppauge_novat_config = {
|
||||||
.demod_address = 0x43,
|
.demod_address = 0x43,
|
||||||
.output_mode = CX22702_SERIAL_OUTPUT,
|
.output_mode = CX22702_SERIAL_OUTPUT,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct cx22702_config hauppauge_hvr1100_config = {
|
static struct cx22702_config hauppauge_hvr1100_config = {
|
||||||
.demod_address = 0x63,
|
.demod_address = 0x63,
|
||||||
.output_mode = CX22702_SERIAL_OUTPUT,
|
.output_mode = CX22702_SERIAL_OUTPUT,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct cx22702_config hauppauge_hvr1300_config = {
|
static struct cx22702_config hauppauge_hvr1300_config = {
|
||||||
.demod_address = 0x63,
|
.demod_address = 0x63,
|
||||||
.output_mode = CX22702_SERIAL_OUTPUT,
|
.output_mode = CX22702_SERIAL_OUTPUT,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct cx22702_config hauppauge_hvr3000_config = {
|
||||||
|
.demod_address = 0x63,
|
||||||
|
.output_mode = CX22702_SERIAL_OUTPUT,
|
||||||
|
};
|
||||||
|
|
||||||
static int or51132_set_ts_param(struct dvb_frontend* fe,
|
static int or51132_set_ts_param(struct dvb_frontend* fe,
|
||||||
int is_punctured)
|
int is_punctured)
|
||||||
{
|
{
|
||||||
|
@ -558,6 +565,16 @@ static int dvb_register(struct cx8802_dev *dev)
|
||||||
&dvb_pll_fmd1216me);
|
&dvb_pll_fmd1216me);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case CX88_BOARD_HAUPPAUGE_HVR3000:
|
||||||
|
dev->dvb.frontend = dvb_attach(cx22702_attach,
|
||||||
|
&hauppauge_hvr3000_config,
|
||||||
|
&dev->core->i2c_adap);
|
||||||
|
if (dev->dvb.frontend != NULL) {
|
||||||
|
dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x61,
|
||||||
|
&dev->core->i2c_adap,
|
||||||
|
&dvb_pll_fmd1216me);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS:
|
case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS:
|
||||||
dev->dvb.frontend = dvb_attach(mt352_attach,
|
dev->dvb.frontend = dvb_attach(mt352_attach,
|
||||||
&dvico_fusionhdtv,
|
&dvico_fusionhdtv,
|
||||||
|
|
|
@ -196,6 +196,7 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
|
||||||
case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1:
|
case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1:
|
||||||
case CX88_BOARD_HAUPPAUGE_HVR1100:
|
case CX88_BOARD_HAUPPAUGE_HVR1100:
|
||||||
case CX88_BOARD_HAUPPAUGE_HVR1300:
|
case CX88_BOARD_HAUPPAUGE_HVR1300:
|
||||||
|
case CX88_BOARD_HAUPPAUGE_HVR3000:
|
||||||
ir_codes = ir_codes_hauppauge_new;
|
ir_codes = ir_codes_hauppauge_new;
|
||||||
ir_type = IR_TYPE_RC5;
|
ir_type = IR_TYPE_RC5;
|
||||||
ir->sampling = 1;
|
ir->sampling = 1;
|
||||||
|
@ -419,6 +420,7 @@ void cx88_ir_irq(struct cx88_core *core)
|
||||||
case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1:
|
case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1:
|
||||||
case CX88_BOARD_HAUPPAUGE_HVR1100:
|
case CX88_BOARD_HAUPPAUGE_HVR1100:
|
||||||
case CX88_BOARD_HAUPPAUGE_HVR1300:
|
case CX88_BOARD_HAUPPAUGE_HVR1300:
|
||||||
|
case CX88_BOARD_HAUPPAUGE_HVR3000:
|
||||||
ircode = ir_decode_biphase(ir->samples, ir->scount, 5, 7);
|
ircode = ir_decode_biphase(ir->samples, ir->scount, 5, 7);
|
||||||
ir_dprintk("biphase decoded: %x\n", ircode);
|
ir_dprintk("biphase decoded: %x\n", ircode);
|
||||||
if ((ircode & 0xfffff000) != 0x3000)
|
if ((ircode & 0xfffff000) != 0x3000)
|
||||||
|
|
|
@ -973,16 +973,32 @@ static CLASS_DEVICE_ATTR(i2c_val, S_IRUGO | S_IWUSR,
|
||||||
et61x251_show_i2c_val, et61x251_store_i2c_val);
|
et61x251_show_i2c_val, et61x251_store_i2c_val);
|
||||||
|
|
||||||
|
|
||||||
static void et61x251_create_sysfs(struct et61x251_device* cam)
|
static int et61x251_create_sysfs(struct et61x251_device* cam)
|
||||||
{
|
{
|
||||||
struct video_device *v4ldev = cam->v4ldev;
|
struct video_device *v4ldev = cam->v4ldev;
|
||||||
|
int rc;
|
||||||
|
|
||||||
video_device_create_file(v4ldev, &class_device_attr_reg);
|
rc = video_device_create_file(v4ldev, &class_device_attr_reg);
|
||||||
video_device_create_file(v4ldev, &class_device_attr_val);
|
if (rc) goto err;
|
||||||
|
rc = video_device_create_file(v4ldev, &class_device_attr_val);
|
||||||
|
if (rc) goto err_reg;
|
||||||
if (cam->sensor.sysfs_ops) {
|
if (cam->sensor.sysfs_ops) {
|
||||||
video_device_create_file(v4ldev, &class_device_attr_i2c_reg);
|
rc = video_device_create_file(v4ldev, &class_device_attr_i2c_reg);
|
||||||
video_device_create_file(v4ldev, &class_device_attr_i2c_val);
|
if (rc) goto err_val;
|
||||||
|
rc = video_device_create_file(v4ldev, &class_device_attr_i2c_val);
|
||||||
|
if (rc) goto err_i2c_reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_i2c_reg:
|
||||||
|
video_device_remove_file(v4ldev, &class_device_attr_i2c_reg);
|
||||||
|
err_val:
|
||||||
|
video_device_remove_file(v4ldev, &class_device_attr_val);
|
||||||
|
err_reg:
|
||||||
|
video_device_remove_file(v4ldev, &class_device_attr_reg);
|
||||||
|
err:
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_VIDEO_ADV_DEBUG */
|
#endif /* CONFIG_VIDEO_ADV_DEBUG */
|
||||||
|
|
||||||
|
@ -2534,7 +2550,9 @@ et61x251_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
|
||||||
dev_nr = (dev_nr < ET61X251_MAX_DEVICES-1) ? dev_nr+1 : 0;
|
dev_nr = (dev_nr < ET61X251_MAX_DEVICES-1) ? dev_nr+1 : 0;
|
||||||
|
|
||||||
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
||||||
et61x251_create_sysfs(cam);
|
err = et61x251_create_sysfs(cam);
|
||||||
|
if (err)
|
||||||
|
goto fail2;
|
||||||
DBG(2, "Optional device control through 'sysfs' interface ready");
|
DBG(2, "Optional device control through 'sysfs' interface ready");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2544,6 +2562,13 @@ et61x251_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
||||||
|
fail2:
|
||||||
|
video_nr[dev_nr] = -1;
|
||||||
|
dev_nr = (dev_nr < ET61X251_MAX_DEVICES-1) ? dev_nr+1 : 0;
|
||||||
|
mutex_unlock(&cam->dev_mutex);
|
||||||
|
video_unregister_device(cam->v4ldev);
|
||||||
|
#endif
|
||||||
fail:
|
fail:
|
||||||
if (cam) {
|
if (cam) {
|
||||||
kfree(cam->control_buffer);
|
kfree(cam->control_buffer);
|
||||||
|
|
|
@ -5648,17 +5648,49 @@ static ssize_t show_exposure(struct class_device *cd, char *buf)
|
||||||
}
|
}
|
||||||
static CLASS_DEVICE_ATTR(exposure, S_IRUGO, show_exposure, NULL);
|
static CLASS_DEVICE_ATTR(exposure, S_IRUGO, show_exposure, NULL);
|
||||||
|
|
||||||
static void ov_create_sysfs(struct video_device *vdev)
|
static int ov_create_sysfs(struct video_device *vdev)
|
||||||
{
|
{
|
||||||
video_device_create_file(vdev, &class_device_attr_custom_id);
|
int rc;
|
||||||
video_device_create_file(vdev, &class_device_attr_model);
|
|
||||||
video_device_create_file(vdev, &class_device_attr_bridge);
|
rc = video_device_create_file(vdev, &class_device_attr_custom_id);
|
||||||
video_device_create_file(vdev, &class_device_attr_sensor);
|
if (rc) goto err;
|
||||||
video_device_create_file(vdev, &class_device_attr_brightness);
|
rc = video_device_create_file(vdev, &class_device_attr_model);
|
||||||
video_device_create_file(vdev, &class_device_attr_saturation);
|
if (rc) goto err_id;
|
||||||
video_device_create_file(vdev, &class_device_attr_contrast);
|
rc = video_device_create_file(vdev, &class_device_attr_bridge);
|
||||||
video_device_create_file(vdev, &class_device_attr_hue);
|
if (rc) goto err_model;
|
||||||
video_device_create_file(vdev, &class_device_attr_exposure);
|
rc = video_device_create_file(vdev, &class_device_attr_sensor);
|
||||||
|
if (rc) goto err_bridge;
|
||||||
|
rc = video_device_create_file(vdev, &class_device_attr_brightness);
|
||||||
|
if (rc) goto err_sensor;
|
||||||
|
rc = video_device_create_file(vdev, &class_device_attr_saturation);
|
||||||
|
if (rc) goto err_bright;
|
||||||
|
rc = video_device_create_file(vdev, &class_device_attr_contrast);
|
||||||
|
if (rc) goto err_sat;
|
||||||
|
rc = video_device_create_file(vdev, &class_device_attr_hue);
|
||||||
|
if (rc) goto err_contrast;
|
||||||
|
rc = video_device_create_file(vdev, &class_device_attr_exposure);
|
||||||
|
if (rc) goto err_hue;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_hue:
|
||||||
|
video_device_remove_file(vdev, &class_device_attr_hue);
|
||||||
|
err_contrast:
|
||||||
|
video_device_remove_file(vdev, &class_device_attr_contrast);
|
||||||
|
err_sat:
|
||||||
|
video_device_remove_file(vdev, &class_device_attr_saturation);
|
||||||
|
err_bright:
|
||||||
|
video_device_remove_file(vdev, &class_device_attr_brightness);
|
||||||
|
err_sensor:
|
||||||
|
video_device_remove_file(vdev, &class_device_attr_sensor);
|
||||||
|
err_bridge:
|
||||||
|
video_device_remove_file(vdev, &class_device_attr_bridge);
|
||||||
|
err_model:
|
||||||
|
video_device_remove_file(vdev, &class_device_attr_model);
|
||||||
|
err_id:
|
||||||
|
video_device_remove_file(vdev, &class_device_attr_custom_id);
|
||||||
|
err:
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -5817,7 +5849,11 @@ ov51x_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||||
ov->vdev->minor);
|
ov->vdev->minor);
|
||||||
|
|
||||||
usb_set_intfdata(intf, ov);
|
usb_set_intfdata(intf, ov);
|
||||||
ov_create_sysfs(ov->vdev);
|
if (ov_create_sysfs(ov->vdev)) {
|
||||||
|
err("ov_create_sysfs failed");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
|
|
|
@ -1024,12 +1024,25 @@ static ssize_t show_snapshot_button_status(struct class_device *class_dev, char
|
||||||
static CLASS_DEVICE_ATTR(button, S_IRUGO | S_IWUSR, show_snapshot_button_status,
|
static CLASS_DEVICE_ATTR(button, S_IRUGO | S_IWUSR, show_snapshot_button_status,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
static void pwc_create_sysfs_files(struct video_device *vdev)
|
static int pwc_create_sysfs_files(struct video_device *vdev)
|
||||||
{
|
{
|
||||||
struct pwc_device *pdev = video_get_drvdata(vdev);
|
struct pwc_device *pdev = video_get_drvdata(vdev);
|
||||||
if (pdev->features & FEATURE_MOTOR_PANTILT)
|
int rc;
|
||||||
video_device_create_file(vdev, &class_device_attr_pan_tilt);
|
|
||||||
video_device_create_file(vdev, &class_device_attr_button);
|
rc = video_device_create_file(vdev, &class_device_attr_button);
|
||||||
|
if (rc)
|
||||||
|
goto err;
|
||||||
|
if (pdev->features & FEATURE_MOTOR_PANTILT) {
|
||||||
|
rc = video_device_create_file(vdev,&class_device_attr_pan_tilt);
|
||||||
|
if (rc) goto err_button;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_button:
|
||||||
|
video_device_remove_file(vdev, &class_device_attr_button);
|
||||||
|
err:
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pwc_remove_sysfs_files(struct video_device *vdev)
|
static void pwc_remove_sysfs_files(struct video_device *vdev)
|
||||||
|
@ -1408,7 +1421,7 @@ static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id
|
||||||
struct usb_device *udev = interface_to_usbdev(intf);
|
struct usb_device *udev = interface_to_usbdev(intf);
|
||||||
struct pwc_device *pdev = NULL;
|
struct pwc_device *pdev = NULL;
|
||||||
int vendor_id, product_id, type_id;
|
int vendor_id, product_id, type_id;
|
||||||
int i, hint;
|
int i, hint, rc;
|
||||||
int features = 0;
|
int features = 0;
|
||||||
int video_nr = -1; /* default: use next available device */
|
int video_nr = -1; /* default: use next available device */
|
||||||
char serial_number[30], *name;
|
char serial_number[30], *name;
|
||||||
|
@ -1709,9 +1722,8 @@ static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id
|
||||||
i = video_register_device(pdev->vdev, VFL_TYPE_GRABBER, video_nr);
|
i = video_register_device(pdev->vdev, VFL_TYPE_GRABBER, video_nr);
|
||||||
if (i < 0) {
|
if (i < 0) {
|
||||||
PWC_ERROR("Failed to register as video device (%d).\n", i);
|
PWC_ERROR("Failed to register as video device (%d).\n", i);
|
||||||
video_device_release(pdev->vdev); /* Drip... drip... drip... */
|
rc = i;
|
||||||
kfree(pdev); /* Oops, no memory leaks please */
|
goto err;
|
||||||
return -EIO;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
PWC_INFO("Registered as /dev/video%d.\n", pdev->vdev->minor & 0x3F);
|
PWC_INFO("Registered as /dev/video%d.\n", pdev->vdev->minor & 0x3F);
|
||||||
|
@ -1723,13 +1735,24 @@ static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id
|
||||||
|
|
||||||
PWC_DEBUG_PROBE("probe() function returning struct at 0x%p.\n", pdev);
|
PWC_DEBUG_PROBE("probe() function returning struct at 0x%p.\n", pdev);
|
||||||
usb_set_intfdata (intf, pdev);
|
usb_set_intfdata (intf, pdev);
|
||||||
pwc_create_sysfs_files(pdev->vdev);
|
rc = pwc_create_sysfs_files(pdev->vdev);
|
||||||
|
if (rc)
|
||||||
|
goto err_unreg;
|
||||||
|
|
||||||
/* Set the leds off */
|
/* Set the leds off */
|
||||||
pwc_set_leds(pdev, 0, 0);
|
pwc_set_leds(pdev, 0, 0);
|
||||||
pwc_camera_power(pdev, 0);
|
pwc_camera_power(pdev, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err_unreg:
|
||||||
|
if (hint < MAX_DEV_HINTS)
|
||||||
|
device_hint[hint].pdev = NULL;
|
||||||
|
video_unregister_device(pdev->vdev);
|
||||||
|
err:
|
||||||
|
video_device_release(pdev->vdev); /* Drip... drip... drip... */
|
||||||
|
kfree(pdev); /* Oops, no memory leaks please */
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The user janked out the cable... */
|
/* The user janked out the cable... */
|
||||||
|
|
|
@ -960,6 +960,8 @@ static void saa711x_set_v4lstd(struct i2c_client *client, v4l2_std_id std)
|
||||||
reg |= 0x10;
|
reg |= 0x10;
|
||||||
} else if (std == V4L2_STD_NTSC_M_JP) {
|
} else if (std == V4L2_STD_NTSC_M_JP) {
|
||||||
reg |= 0x40;
|
reg |= 0x40;
|
||||||
|
} else if (std == V4L2_STD_SECAM) {
|
||||||
|
reg |= 0x50;
|
||||||
}
|
}
|
||||||
saa711x_write(client, R_0E_CHROMA_CNTL_1, reg);
|
saa711x_write(client, R_0E_CHROMA_CNTL_1, reg);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -2248,7 +2248,11 @@ static int radio_do_ioctl(struct inode *inode, struct file *file,
|
||||||
t->type = V4L2_TUNER_RADIO;
|
t->type = V4L2_TUNER_RADIO;
|
||||||
|
|
||||||
saa7134_i2c_call_clients(dev, VIDIOC_G_TUNER, t);
|
saa7134_i2c_call_clients(dev, VIDIOC_G_TUNER, t);
|
||||||
|
if (dev->input->amux == TV) {
|
||||||
|
t->signal = 0xf800 - ((saa_readb(0x581) & 0x1f) << 11);
|
||||||
|
t->rxsubchans = (saa_readb(0x529) & 0x08) ?
|
||||||
|
V4L2_TUNER_SUB_STEREO : V4L2_TUNER_SUB_MONO;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
case VIDIOC_S_TUNER:
|
case VIDIOC_S_TUNER:
|
||||||
|
|
|
@ -1240,23 +1240,53 @@ static CLASS_DEVICE_ATTR(frame_header, S_IRUGO,
|
||||||
sn9c102_show_frame_header, NULL);
|
sn9c102_show_frame_header, NULL);
|
||||||
|
|
||||||
|
|
||||||
static void sn9c102_create_sysfs(struct sn9c102_device* cam)
|
static int sn9c102_create_sysfs(struct sn9c102_device* cam)
|
||||||
{
|
{
|
||||||
struct video_device *v4ldev = cam->v4ldev;
|
struct video_device *v4ldev = cam->v4ldev;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = video_device_create_file(v4ldev, &class_device_attr_reg);
|
||||||
|
if (rc) goto err;
|
||||||
|
rc = video_device_create_file(v4ldev, &class_device_attr_val);
|
||||||
|
if (rc) goto err_reg;
|
||||||
|
rc = video_device_create_file(v4ldev, &class_device_attr_frame_header);
|
||||||
|
if (rc) goto err_val;
|
||||||
|
|
||||||
video_device_create_file(v4ldev, &class_device_attr_reg);
|
|
||||||
video_device_create_file(v4ldev, &class_device_attr_val);
|
|
||||||
video_device_create_file(v4ldev, &class_device_attr_frame_header);
|
|
||||||
if (cam->bridge == BRIDGE_SN9C101 || cam->bridge == BRIDGE_SN9C102)
|
|
||||||
video_device_create_file(v4ldev, &class_device_attr_green);
|
|
||||||
else if (cam->bridge == BRIDGE_SN9C103) {
|
|
||||||
video_device_create_file(v4ldev, &class_device_attr_blue);
|
|
||||||
video_device_create_file(v4ldev, &class_device_attr_red);
|
|
||||||
}
|
|
||||||
if (cam->sensor.sysfs_ops) {
|
if (cam->sensor.sysfs_ops) {
|
||||||
video_device_create_file(v4ldev, &class_device_attr_i2c_reg);
|
rc = video_device_create_file(v4ldev, &class_device_attr_i2c_reg);
|
||||||
video_device_create_file(v4ldev, &class_device_attr_i2c_val);
|
if (rc) goto err_frhead;
|
||||||
|
rc = video_device_create_file(v4ldev, &class_device_attr_i2c_val);
|
||||||
|
if (rc) goto err_i2c_reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cam->bridge == BRIDGE_SN9C101 || cam->bridge == BRIDGE_SN9C102) {
|
||||||
|
rc = video_device_create_file(v4ldev, &class_device_attr_green);
|
||||||
|
if (rc) goto err_i2c_val;
|
||||||
|
} else if (cam->bridge == BRIDGE_SN9C103) {
|
||||||
|
rc = video_device_create_file(v4ldev, &class_device_attr_blue);
|
||||||
|
if (rc) goto err_i2c_val;
|
||||||
|
rc = video_device_create_file(v4ldev, &class_device_attr_red);
|
||||||
|
if (rc) goto err_blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_blue:
|
||||||
|
video_device_remove_file(v4ldev, &class_device_attr_blue);
|
||||||
|
err_i2c_val:
|
||||||
|
if (cam->sensor.sysfs_ops)
|
||||||
|
video_device_remove_file(v4ldev, &class_device_attr_i2c_val);
|
||||||
|
err_i2c_reg:
|
||||||
|
if (cam->sensor.sysfs_ops)
|
||||||
|
video_device_remove_file(v4ldev, &class_device_attr_i2c_reg);
|
||||||
|
err_frhead:
|
||||||
|
video_device_remove_file(v4ldev, &class_device_attr_frame_header);
|
||||||
|
err_val:
|
||||||
|
video_device_remove_file(v4ldev, &class_device_attr_val);
|
||||||
|
err_reg:
|
||||||
|
video_device_remove_file(v4ldev, &class_device_attr_reg);
|
||||||
|
err:
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_VIDEO_ADV_DEBUG */
|
#endif /* CONFIG_VIDEO_ADV_DEBUG */
|
||||||
|
|
||||||
|
@ -2809,10 +2839,7 @@ sn9c102_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
|
||||||
DBG(1, "V4L2 device registration failed");
|
DBG(1, "V4L2 device registration failed");
|
||||||
if (err == -ENFILE && video_nr[dev_nr] == -1)
|
if (err == -ENFILE && video_nr[dev_nr] == -1)
|
||||||
DBG(1, "Free /dev/videoX node not found");
|
DBG(1, "Free /dev/videoX node not found");
|
||||||
video_nr[dev_nr] = -1;
|
goto fail2;
|
||||||
dev_nr = (dev_nr < SN9C102_MAX_DEVICES-1) ? dev_nr+1 : 0;
|
|
||||||
mutex_unlock(&cam->dev_mutex);
|
|
||||||
goto fail;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DBG(2, "V4L2 device registered as /dev/video%d", cam->v4ldev->minor);
|
DBG(2, "V4L2 device registered as /dev/video%d", cam->v4ldev->minor);
|
||||||
|
@ -2823,7 +2850,9 @@ sn9c102_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
|
||||||
dev_nr = (dev_nr < SN9C102_MAX_DEVICES-1) ? dev_nr+1 : 0;
|
dev_nr = (dev_nr < SN9C102_MAX_DEVICES-1) ? dev_nr+1 : 0;
|
||||||
|
|
||||||
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
||||||
sn9c102_create_sysfs(cam);
|
err = sn9c102_create_sysfs(cam);
|
||||||
|
if (err)
|
||||||
|
goto fail3;
|
||||||
DBG(2, "Optional device control through 'sysfs' interface ready");
|
DBG(2, "Optional device control through 'sysfs' interface ready");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2833,6 +2862,14 @@ sn9c102_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
||||||
|
fail3:
|
||||||
|
video_unregister_device(cam->v4ldev);
|
||||||
|
#endif
|
||||||
|
fail2:
|
||||||
|
video_nr[dev_nr] = -1;
|
||||||
|
dev_nr = (dev_nr < SN9C102_MAX_DEVICES-1) ? dev_nr+1 : 0;
|
||||||
|
mutex_unlock(&cam->dev_mutex);
|
||||||
fail:
|
fail:
|
||||||
if (cam) {
|
if (cam) {
|
||||||
kfree(cam->control_buffer);
|
kfree(cam->control_buffer);
|
||||||
|
|
|
@ -516,16 +516,45 @@ stv680_file(frames_read, framecount, "%d\n");
|
||||||
stv680_file(packets_dropped, dropped, "%d\n");
|
stv680_file(packets_dropped, dropped, "%d\n");
|
||||||
stv680_file(decoding_errors, error, "%d\n");
|
stv680_file(decoding_errors, error, "%d\n");
|
||||||
|
|
||||||
static void stv680_create_sysfs_files(struct video_device *vdev)
|
static int stv680_create_sysfs_files(struct video_device *vdev)
|
||||||
{
|
{
|
||||||
video_device_create_file(vdev, &class_device_attr_model);
|
int rc;
|
||||||
video_device_create_file(vdev, &class_device_attr_in_use);
|
|
||||||
video_device_create_file(vdev, &class_device_attr_streaming);
|
rc = video_device_create_file(vdev, &class_device_attr_model);
|
||||||
video_device_create_file(vdev, &class_device_attr_palette);
|
if (rc) goto err;
|
||||||
video_device_create_file(vdev, &class_device_attr_frames_total);
|
rc = video_device_create_file(vdev, &class_device_attr_in_use);
|
||||||
video_device_create_file(vdev, &class_device_attr_frames_read);
|
if (rc) goto err_model;
|
||||||
video_device_create_file(vdev, &class_device_attr_packets_dropped);
|
rc = video_device_create_file(vdev, &class_device_attr_streaming);
|
||||||
video_device_create_file(vdev, &class_device_attr_decoding_errors);
|
if (rc) goto err_inuse;
|
||||||
|
rc = video_device_create_file(vdev, &class_device_attr_palette);
|
||||||
|
if (rc) goto err_stream;
|
||||||
|
rc = video_device_create_file(vdev, &class_device_attr_frames_total);
|
||||||
|
if (rc) goto err_pal;
|
||||||
|
rc = video_device_create_file(vdev, &class_device_attr_frames_read);
|
||||||
|
if (rc) goto err_framtot;
|
||||||
|
rc = video_device_create_file(vdev, &class_device_attr_packets_dropped);
|
||||||
|
if (rc) goto err_framread;
|
||||||
|
rc = video_device_create_file(vdev, &class_device_attr_decoding_errors);
|
||||||
|
if (rc) goto err_dropped;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_dropped:
|
||||||
|
video_device_remove_file(vdev, &class_device_attr_packets_dropped);
|
||||||
|
err_framread:
|
||||||
|
video_device_remove_file(vdev, &class_device_attr_frames_read);
|
||||||
|
err_framtot:
|
||||||
|
video_device_remove_file(vdev, &class_device_attr_frames_total);
|
||||||
|
err_pal:
|
||||||
|
video_device_remove_file(vdev, &class_device_attr_palette);
|
||||||
|
err_stream:
|
||||||
|
video_device_remove_file(vdev, &class_device_attr_streaming);
|
||||||
|
err_inuse:
|
||||||
|
video_device_remove_file(vdev, &class_device_attr_in_use);
|
||||||
|
err_model:
|
||||||
|
video_device_remove_file(vdev, &class_device_attr_model);
|
||||||
|
err:
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void stv680_remove_sysfs_files(struct video_device *vdev)
|
static void stv680_remove_sysfs_files(struct video_device *vdev)
|
||||||
|
@ -1418,9 +1447,13 @@ static int stv680_probe (struct usb_interface *intf, const struct usb_device_id
|
||||||
PDEBUG (0, "STV(i): registered new video device: video%d", stv680->vdev->minor);
|
PDEBUG (0, "STV(i): registered new video device: video%d", stv680->vdev->minor);
|
||||||
|
|
||||||
usb_set_intfdata (intf, stv680);
|
usb_set_intfdata (intf, stv680);
|
||||||
stv680_create_sysfs_files(stv680->vdev);
|
retval = stv680_create_sysfs_files(stv680->vdev);
|
||||||
|
if (retval)
|
||||||
|
goto error_unreg;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
error_unreg:
|
||||||
|
video_unregister_device(stv680->vdev);
|
||||||
error_vdev:
|
error_vdev:
|
||||||
video_device_release(stv680->vdev);
|
video_device_release(stv680->vdev);
|
||||||
error:
|
error:
|
||||||
|
|
|
@ -1046,7 +1046,6 @@ static struct tuner_params tuner_samsung_tcpn_2121p30a_params[] = {
|
||||||
.type = TUNER_PARAM_TYPE_NTSC,
|
.type = TUNER_PARAM_TYPE_NTSC,
|
||||||
.ranges = tuner_samsung_tcpn_2121p30a_ntsc_ranges,
|
.ranges = tuner_samsung_tcpn_2121p30a_ntsc_ranges,
|
||||||
.count = ARRAY_SIZE(tuner_samsung_tcpn_2121p30a_ntsc_ranges),
|
.count = ARRAY_SIZE(tuner_samsung_tcpn_2121p30a_ntsc_ranges),
|
||||||
.has_tda9887 = 1,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -17,10 +17,11 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define dbgarg(cmd, fmt, arg...) \
|
#define dbgarg(cmd, fmt, arg...) \
|
||||||
if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) \
|
if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) { \
|
||||||
printk (KERN_DEBUG "%s: ", vfd->name); \
|
printk (KERN_DEBUG "%s: ", vfd->name); \
|
||||||
v4l_printk_ioctl(cmd); \
|
v4l_printk_ioctl(cmd); \
|
||||||
printk (KERN_DEBUG "%s: " fmt, vfd->name, ## arg);
|
printk (KERN_DEBUG "%s: " fmt, vfd->name, ## arg); \
|
||||||
|
}
|
||||||
|
|
||||||
#define dbgarg2(fmt, arg...) \
|
#define dbgarg2(fmt, arg...) \
|
||||||
if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) \
|
if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) \
|
||||||
|
@ -1287,6 +1288,7 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
|
||||||
ret=vfd->vidioc_g_parm(file, fh, p);
|
ret=vfd->vidioc_g_parm(file, fh, p);
|
||||||
} else {
|
} else {
|
||||||
struct v4l2_standard s;
|
struct v4l2_standard s;
|
||||||
|
int i;
|
||||||
|
|
||||||
if (!vfd->tvnormsize) {
|
if (!vfd->tvnormsize) {
|
||||||
printk (KERN_WARNING "%s: no TV norms defined!\n",
|
printk (KERN_WARNING "%s: no TV norms defined!\n",
|
||||||
|
@ -1297,8 +1299,14 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
|
||||||
if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
v4l2_video_std_construct(&s, vfd->tvnorms[vfd->current_norm].id,
|
for (i = 0; i < vfd->tvnormsize; i++)
|
||||||
vfd->tvnorms[vfd->current_norm].name);
|
if (vfd->tvnorms[i].id == vfd->current_norm)
|
||||||
|
break;
|
||||||
|
if (i >= vfd->tvnormsize)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
v4l2_video_std_construct(&s, vfd->current_norm,
|
||||||
|
vfd->tvnorms[i].name);
|
||||||
|
|
||||||
memset(p,0,sizeof(*p));
|
memset(p,0,sizeof(*p));
|
||||||
|
|
||||||
|
|
|
@ -272,7 +272,7 @@ static void gen_line(struct sg_to_addr to_addr[],int inipos,int pages,int wmax,
|
||||||
|
|
||||||
/* Get first addr pointed to pixel position */
|
/* Get first addr pointed to pixel position */
|
||||||
oldpg=get_addr_pos(pos,pages,to_addr);
|
oldpg=get_addr_pos(pos,pages,to_addr);
|
||||||
pg=pfn_to_page(to_addr[oldpg].sg->dma_address >> PAGE_SHIFT);
|
pg=pfn_to_page(sg_dma_address(to_addr[oldpg].sg) >> PAGE_SHIFT);
|
||||||
basep = kmap_atomic(pg, KM_BOUNCE_READ)+to_addr[oldpg].sg->offset;
|
basep = kmap_atomic(pg, KM_BOUNCE_READ)+to_addr[oldpg].sg->offset;
|
||||||
|
|
||||||
/* We will just duplicate the second pixel at the packet */
|
/* We will just duplicate the second pixel at the packet */
|
||||||
|
@ -287,7 +287,7 @@ static void gen_line(struct sg_to_addr to_addr[],int inipos,int pages,int wmax,
|
||||||
for (color=0;color<4;color++) {
|
for (color=0;color<4;color++) {
|
||||||
pgpos=get_addr_pos(pos,pages,to_addr);
|
pgpos=get_addr_pos(pos,pages,to_addr);
|
||||||
if (pgpos!=oldpg) {
|
if (pgpos!=oldpg) {
|
||||||
pg=pfn_to_page(to_addr[pgpos].sg->dma_address >> PAGE_SHIFT);
|
pg=pfn_to_page(sg_dma_address(to_addr[pgpos].sg) >> PAGE_SHIFT);
|
||||||
kunmap_atomic(basep, KM_BOUNCE_READ);
|
kunmap_atomic(basep, KM_BOUNCE_READ);
|
||||||
basep= kmap_atomic(pg, KM_BOUNCE_READ)+to_addr[pgpos].sg->offset;
|
basep= kmap_atomic(pg, KM_BOUNCE_READ)+to_addr[pgpos].sg->offset;
|
||||||
oldpg=pgpos;
|
oldpg=pgpos;
|
||||||
|
@ -339,8 +339,8 @@ static void gen_line(struct sg_to_addr to_addr[],int inipos,int pages,int wmax,
|
||||||
for (color=0;color<4;color++) {
|
for (color=0;color<4;color++) {
|
||||||
pgpos=get_addr_pos(pos,pages,to_addr);
|
pgpos=get_addr_pos(pos,pages,to_addr);
|
||||||
if (pgpos!=oldpg) {
|
if (pgpos!=oldpg) {
|
||||||
pg=pfn_to_page(to_addr[pgpos].
|
pg=pfn_to_page(sg_dma_address(
|
||||||
sg->dma_address
|
to_addr[pgpos].sg)
|
||||||
>> PAGE_SHIFT);
|
>> PAGE_SHIFT);
|
||||||
kunmap_atomic(basep,
|
kunmap_atomic(basep,
|
||||||
KM_BOUNCE_READ);
|
KM_BOUNCE_READ);
|
||||||
|
@ -386,7 +386,7 @@ static void vivi_fillbuff(struct vivi_dev *dev,struct vivi_buffer *buf)
|
||||||
struct timeval ts;
|
struct timeval ts;
|
||||||
|
|
||||||
/* Test if DMA mapping is ready */
|
/* Test if DMA mapping is ready */
|
||||||
if (!vb->dma.sglist[0].dma_address)
|
if (!sg_dma_address(&vb->dma.sglist[0]))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
prep_to_addr(to_addr,vb);
|
prep_to_addr(to_addr,vb);
|
||||||
|
@ -783,7 +783,7 @@ static int vivi_map_sg(void *dev, struct scatterlist *sg, int nents,
|
||||||
for (i = 0; i < nents; i++ ) {
|
for (i = 0; i < nents; i++ ) {
|
||||||
BUG_ON(!sg[i].page);
|
BUG_ON(!sg[i].page);
|
||||||
|
|
||||||
sg[i].dma_address = page_to_phys(sg[i].page) + sg[i].offset;
|
sg_dma_address(&sg[i]) = page_to_phys(sg[i].page) + sg[i].offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
return nents;
|
return nents;
|
||||||
|
|
|
@ -243,7 +243,7 @@ struct v4l2_pix_format
|
||||||
#define V4L2_PIX_FMT_YUV420 v4l2_fourcc('Y','U','1','2') /* 12 YUV 4:2:0 */
|
#define V4L2_PIX_FMT_YUV420 v4l2_fourcc('Y','U','1','2') /* 12 YUV 4:2:0 */
|
||||||
#define V4L2_PIX_FMT_YYUV v4l2_fourcc('Y','Y','U','V') /* 16 YUV 4:2:2 */
|
#define V4L2_PIX_FMT_YYUV v4l2_fourcc('Y','Y','U','V') /* 16 YUV 4:2:2 */
|
||||||
#define V4L2_PIX_FMT_HI240 v4l2_fourcc('H','I','2','4') /* 8 8-bit color */
|
#define V4L2_PIX_FMT_HI240 v4l2_fourcc('H','I','2','4') /* 8 8-bit color */
|
||||||
#define V4L2_PIX_FMT_HM12 v4l2_fourcc('H','M','1','2') /* 8 YUV 4:1:1 16x16 macroblocks */
|
#define V4L2_PIX_FMT_HM12 v4l2_fourcc('H','M','1','2') /* 8 YUV 4:2:0 16x16 macroblocks */
|
||||||
|
|
||||||
/* see http://www.siliconimaging.com/RGB%20Bayer.htm */
|
/* see http://www.siliconimaging.com/RGB%20Bayer.htm */
|
||||||
#define V4L2_PIX_FMT_SBGGR8 v4l2_fourcc('B','A','8','1') /* 8 BGBG.. GRGR.. */
|
#define V4L2_PIX_FMT_SBGGR8 v4l2_fourcc('B','A','8','1') /* 8 BGBG.. GRGR.. */
|
||||||
|
|
Loading…
Reference in New Issue