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:
Коммит
ed75ded7dd
|
@ -51,7 +51,7 @@
|
|||
50 -> NPG Tech Real TV FM Top 10 [14f1:0842]
|
||||
51 -> WinFast DTV2000 H [107d:665e]
|
||||
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
|
||||
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]
|
||||
|
|
|
@ -665,6 +665,10 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type)
|
|||
case BTTV_BOARD_TWINHAN_DST:
|
||||
/* DST is not a frontend driver !!! */
|
||||
state = (struct dst_state *) kmalloc(sizeof (struct dst_state), GFP_KERNEL);
|
||||
if (!state) {
|
||||
printk("dvb_bt8xx: No memory\n");
|
||||
break;
|
||||
}
|
||||
/* Setup the Card */
|
||||
state->config = &dst_config;
|
||||
state->i2c = card->i2c_adapter;
|
||||
|
|
|
@ -19,6 +19,6 @@ config DVB_CORE_ATTACH
|
|||
allow the card drivers to only load the frontend modules
|
||||
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.
|
||||
|
|
|
@ -169,7 +169,7 @@ EXPORT_SYMBOL(dibusb_read_eeprom_byte);
|
|||
// Config Adjacent channels Perf -cal22
|
||||
static struct dibx000_agc_config dib3000p_mt2060_agc_config = {
|
||||
.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_min = 23593,
|
||||
|
@ -196,10 +196,14 @@ static struct dib3000mc_config stk3000p_dib3000p_config = {
|
|||
.ln_adc_level = 0x1cc7,
|
||||
|
||||
.output_mpeg2_in_188_bytes = 1,
|
||||
|
||||
.agc_command1 = 1,
|
||||
.agc_command2 = 1,
|
||||
};
|
||||
|
||||
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_min = 22282,
|
||||
|
@ -226,6 +230,9 @@ static struct dib3000mc_config mod3000p_dib3000p_config = {
|
|||
.ln_adc_level = 0x1cc7,
|
||||
|
||||
.output_mpeg2_in_188_bytes = 1,
|
||||
|
||||
.agc_command1 = 1,
|
||||
.agc_command2 = 1,
|
||||
};
|
||||
|
||||
int dibusb_dib3000mc_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
|
|
|
@ -99,7 +99,9 @@
|
|||
struct dibusb_state {
|
||||
struct dib_fe_xfer_ops ops;
|
||||
int mt2060_present;
|
||||
};
|
||||
|
||||
struct dibusb_device_state {
|
||||
/* for RC5 remote control */
|
||||
int old_toggle;
|
||||
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;
|
||||
u16 raw;
|
||||
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);
|
||||
|
||||
|
@ -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_device_state),
|
||||
|
||||
.power_ctrl = dibusb2_0_power_ctrl,
|
||||
.read_mac_address = nova_t_read_mac_address,
|
||||
|
|
|
@ -345,7 +345,7 @@ static int dib3000mc_init(struct dvb_frontend *demod)
|
|||
|
||||
/* agc */
|
||||
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, 39, state->cfg->ln_adc_level);
|
||||
|
||||
|
|
|
@ -28,6 +28,9 @@ struct dib3000mc_config {
|
|||
u16 max_time;
|
||||
u16 ln_adc_level;
|
||||
|
||||
u8 agc_command1 :1;
|
||||
u8 agc_command2 :1;
|
||||
|
||||
u8 mobile_mode;
|
||||
|
||||
u8 output_mpeg2_in_188_bytes;
|
||||
|
|
|
@ -35,7 +35,16 @@ struct tda10086_config
|
|||
u8 invert;
|
||||
};
|
||||
|
||||
#if defined(CONFIG_DVB_TDA10086) || defined(CONFIG_DVB_TDA10086_MODULE)
|
||||
extern struct dvb_frontend* tda10086_attach(const struct tda10086_config* config,
|
||||
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
|
||||
|
|
|
@ -35,6 +35,19 @@
|
|||
* @param has_loopthrough Set to 1 if the card has a loopthrough RF connector.
|
||||
* @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"
|
||||
depends on USB && VIDEO_DEV
|
||||
|
||||
source "drivers/media/video/pvrusb2/Kconfig"
|
||||
|
||||
source "drivers/media/video/em28xx/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, 0, 0
|
||||
};
|
||||
int is_pal = !(cx25840_get_v4lstd(client) & V4L2_STD_525_60);
|
||||
int i;
|
||||
|
||||
fmt = arg;
|
||||
|
@ -246,13 +247,25 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg)
|
|||
if ((cx25840_read(client, 0x404) & 0x10) == 0)
|
||||
break;
|
||||
|
||||
for (i = 7; i <= 23; i++) {
|
||||
u8 v = cx25840_read(client, 0x424 + i - 7);
|
||||
if (is_pal) {
|
||||
for (i = 7; i <= 23; i++) {
|
||||
u8 v = cx25840_read(client, 0x424 + i - 7);
|
||||
|
||||
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];
|
||||
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];
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -1230,6 +1230,7 @@ struct cx88_board cx88_boards[] = {
|
|||
.vmux = 2,
|
||||
.gpio0 = 0x84bf,
|
||||
}},
|
||||
.mpeg = CX88_MPEG_DVB,
|
||||
},
|
||||
[CX88_BOARD_NORWOOD_MICRO] = {
|
||||
.name = "Norwood Micro TV Tuner",
|
||||
|
@ -1590,6 +1591,18 @@ struct cx88_subid cx88_subids[] = {
|
|||
.subvendor = 0x0070,
|
||||
.subdevice = 0x9000,
|
||||
.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);
|
||||
|
@ -1633,7 +1646,15 @@ static void hauppauge_eeprom(struct cx88_core *core, u8 *eeprom_data)
|
|||
/* Make sure we support the board 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 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 34519: /* WinTV-PCI-FM */
|
||||
case 90002: /* Nova-T-PCI (9002) */
|
||||
|
|
|
@ -315,15 +315,22 @@ static struct cx22702_config hauppauge_novat_config = {
|
|||
.demod_address = 0x43,
|
||||
.output_mode = CX22702_SERIAL_OUTPUT,
|
||||
};
|
||||
|
||||
static struct cx22702_config hauppauge_hvr1100_config = {
|
||||
.demod_address = 0x63,
|
||||
.output_mode = CX22702_SERIAL_OUTPUT,
|
||||
};
|
||||
|
||||
static struct cx22702_config hauppauge_hvr1300_config = {
|
||||
.demod_address = 0x63,
|
||||
.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,
|
||||
int is_punctured)
|
||||
{
|
||||
|
@ -558,6 +565,16 @@ static int dvb_register(struct cx8802_dev *dev)
|
|||
&dvb_pll_fmd1216me);
|
||||
}
|
||||
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:
|
||||
dev->dvb.frontend = dvb_attach(mt352_attach,
|
||||
&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_HVR1100:
|
||||
case CX88_BOARD_HAUPPAUGE_HVR1300:
|
||||
case CX88_BOARD_HAUPPAUGE_HVR3000:
|
||||
ir_codes = ir_codes_hauppauge_new;
|
||||
ir_type = IR_TYPE_RC5;
|
||||
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_HVR1100:
|
||||
case CX88_BOARD_HAUPPAUGE_HVR1300:
|
||||
case CX88_BOARD_HAUPPAUGE_HVR3000:
|
||||
ircode = ir_decode_biphase(ir->samples, ir->scount, 5, 7);
|
||||
ir_dprintk("biphase decoded: %x\n", ircode);
|
||||
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);
|
||||
|
||||
|
||||
static void et61x251_create_sysfs(struct et61x251_device* cam)
|
||||
static int et61x251_create_sysfs(struct et61x251_device* cam)
|
||||
{
|
||||
struct video_device *v4ldev = cam->v4ldev;
|
||||
int rc;
|
||||
|
||||
video_device_create_file(v4ldev, &class_device_attr_reg);
|
||||
video_device_create_file(v4ldev, &class_device_attr_val);
|
||||
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;
|
||||
if (cam->sensor.sysfs_ops) {
|
||||
video_device_create_file(v4ldev, &class_device_attr_i2c_reg);
|
||||
video_device_create_file(v4ldev, &class_device_attr_i2c_val);
|
||||
rc = video_device_create_file(v4ldev, &class_device_attr_i2c_reg);
|
||||
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 */
|
||||
|
||||
|
@ -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;
|
||||
|
||||
#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");
|
||||
#endif
|
||||
|
||||
|
@ -2544,6 +2562,13 @@ et61x251_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
|
|||
|
||||
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:
|
||||
if (cam) {
|
||||
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 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);
|
||||
video_device_create_file(vdev, &class_device_attr_model);
|
||||
video_device_create_file(vdev, &class_device_attr_bridge);
|
||||
video_device_create_file(vdev, &class_device_attr_sensor);
|
||||
video_device_create_file(vdev, &class_device_attr_brightness);
|
||||
video_device_create_file(vdev, &class_device_attr_saturation);
|
||||
video_device_create_file(vdev, &class_device_attr_contrast);
|
||||
video_device_create_file(vdev, &class_device_attr_hue);
|
||||
video_device_create_file(vdev, &class_device_attr_exposure);
|
||||
int rc;
|
||||
|
||||
rc = video_device_create_file(vdev, &class_device_attr_custom_id);
|
||||
if (rc) goto err;
|
||||
rc = video_device_create_file(vdev, &class_device_attr_model);
|
||||
if (rc) goto err_id;
|
||||
rc = video_device_create_file(vdev, &class_device_attr_bridge);
|
||||
if (rc) goto err_model;
|
||||
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);
|
||||
|
||||
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;
|
||||
|
||||
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,
|
||||
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);
|
||||
if (pdev->features & FEATURE_MOTOR_PANTILT)
|
||||
video_device_create_file(vdev, &class_device_attr_pan_tilt);
|
||||
video_device_create_file(vdev, &class_device_attr_button);
|
||||
int rc;
|
||||
|
||||
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)
|
||||
|
@ -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 pwc_device *pdev = NULL;
|
||||
int vendor_id, product_id, type_id;
|
||||
int i, hint;
|
||||
int i, hint, rc;
|
||||
int features = 0;
|
||||
int video_nr = -1; /* default: use next available device */
|
||||
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);
|
||||
if (i < 0) {
|
||||
PWC_ERROR("Failed to register as video device (%d).\n", i);
|
||||
video_device_release(pdev->vdev); /* Drip... drip... drip... */
|
||||
kfree(pdev); /* Oops, no memory leaks please */
|
||||
return -EIO;
|
||||
rc = i;
|
||||
goto err;
|
||||
}
|
||||
else {
|
||||
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);
|
||||
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 */
|
||||
pwc_set_leds(pdev, 0, 0);
|
||||
pwc_camera_power(pdev, 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... */
|
||||
|
|
|
@ -960,6 +960,8 @@ static void saa711x_set_v4lstd(struct i2c_client *client, v4l2_std_id std)
|
|||
reg |= 0x10;
|
||||
} else if (std == V4L2_STD_NTSC_M_JP) {
|
||||
reg |= 0x40;
|
||||
} else if (std == V4L2_STD_SECAM) {
|
||||
reg |= 0x50;
|
||||
}
|
||||
saa711x_write(client, R_0E_CHROMA_CNTL_1, reg);
|
||||
} else {
|
||||
|
|
|
@ -2248,7 +2248,11 @@ static int radio_do_ioctl(struct inode *inode, struct file *file,
|
|||
t->type = V4L2_TUNER_RADIO;
|
||||
|
||||
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;
|
||||
}
|
||||
case VIDIOC_S_TUNER:
|
||||
|
|
|
@ -1240,23 +1240,53 @@ static CLASS_DEVICE_ATTR(frame_header, S_IRUGO,
|
|||
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;
|
||||
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) {
|
||||
video_device_create_file(v4ldev, &class_device_attr_i2c_reg);
|
||||
video_device_create_file(v4ldev, &class_device_attr_i2c_val);
|
||||
rc = video_device_create_file(v4ldev, &class_device_attr_i2c_reg);
|
||||
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 */
|
||||
|
||||
|
@ -2809,10 +2839,7 @@ sn9c102_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
|
|||
DBG(1, "V4L2 device registration failed");
|
||||
if (err == -ENFILE && video_nr[dev_nr] == -1)
|
||||
DBG(1, "Free /dev/videoX node not found");
|
||||
video_nr[dev_nr] = -1;
|
||||
dev_nr = (dev_nr < SN9C102_MAX_DEVICES-1) ? dev_nr+1 : 0;
|
||||
mutex_unlock(&cam->dev_mutex);
|
||||
goto fail;
|
||||
goto fail2;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
#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");
|
||||
#endif
|
||||
|
||||
|
@ -2833,6 +2862,14 @@ sn9c102_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
|
|||
|
||||
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:
|
||||
if (cam) {
|
||||
kfree(cam->control_buffer);
|
||||
|
|
|
@ -516,16 +516,45 @@ stv680_file(frames_read, framecount, "%d\n");
|
|||
stv680_file(packets_dropped, dropped, "%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);
|
||||
video_device_create_file(vdev, &class_device_attr_in_use);
|
||||
video_device_create_file(vdev, &class_device_attr_streaming);
|
||||
video_device_create_file(vdev, &class_device_attr_palette);
|
||||
video_device_create_file(vdev, &class_device_attr_frames_total);
|
||||
video_device_create_file(vdev, &class_device_attr_frames_read);
|
||||
video_device_create_file(vdev, &class_device_attr_packets_dropped);
|
||||
video_device_create_file(vdev, &class_device_attr_decoding_errors);
|
||||
int rc;
|
||||
|
||||
rc = video_device_create_file(vdev, &class_device_attr_model);
|
||||
if (rc) goto err;
|
||||
rc = video_device_create_file(vdev, &class_device_attr_in_use);
|
||||
if (rc) goto err_model;
|
||||
rc = video_device_create_file(vdev, &class_device_attr_streaming);
|
||||
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)
|
||||
|
@ -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);
|
||||
|
||||
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;
|
||||
|
||||
error_unreg:
|
||||
video_unregister_device(stv680->vdev);
|
||||
error_vdev:
|
||||
video_device_release(stv680->vdev);
|
||||
error:
|
||||
|
|
|
@ -1046,7 +1046,6 @@ static struct tuner_params tuner_samsung_tcpn_2121p30a_params[] = {
|
|||
.type = TUNER_PARAM_TYPE_NTSC,
|
||||
.ranges = 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...) \
|
||||
if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) \
|
||||
if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) { \
|
||||
printk (KERN_DEBUG "%s: ", vfd->name); \
|
||||
v4l_printk_ioctl(cmd); \
|
||||
printk (KERN_DEBUG "%s: " fmt, vfd->name, ## arg);
|
||||
printk (KERN_DEBUG "%s: " fmt, vfd->name, ## arg); \
|
||||
}
|
||||
|
||||
#define dbgarg2(fmt, 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);
|
||||
} else {
|
||||
struct v4l2_standard s;
|
||||
int i;
|
||||
|
||||
if (!vfd->tvnormsize) {
|
||||
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)
|
||||
return -EINVAL;
|
||||
|
||||
v4l2_video_std_construct(&s, vfd->tvnorms[vfd->current_norm].id,
|
||||
vfd->tvnorms[vfd->current_norm].name);
|
||||
for (i = 0; i < vfd->tvnormsize; i++)
|
||||
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));
|
||||
|
||||
|
|
|
@ -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 */
|
||||
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;
|
||||
|
||||
/* 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++) {
|
||||
pgpos=get_addr_pos(pos,pages,to_addr);
|
||||
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);
|
||||
basep= kmap_atomic(pg, KM_BOUNCE_READ)+to_addr[pgpos].sg->offset;
|
||||
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++) {
|
||||
pgpos=get_addr_pos(pos,pages,to_addr);
|
||||
if (pgpos!=oldpg) {
|
||||
pg=pfn_to_page(to_addr[pgpos].
|
||||
sg->dma_address
|
||||
pg=pfn_to_page(sg_dma_address(
|
||||
to_addr[pgpos].sg)
|
||||
>> PAGE_SHIFT);
|
||||
kunmap_atomic(basep,
|
||||
KM_BOUNCE_READ);
|
||||
|
@ -386,7 +386,7 @@ static void vivi_fillbuff(struct vivi_dev *dev,struct vivi_buffer *buf)
|
|||
struct timeval ts;
|
||||
|
||||
/* Test if DMA mapping is ready */
|
||||
if (!vb->dma.sglist[0].dma_address)
|
||||
if (!sg_dma_address(&vb->dma.sglist[0]))
|
||||
return;
|
||||
|
||||
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++ ) {
|
||||
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;
|
||||
|
|
|
@ -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_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_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 */
|
||||
#define V4L2_PIX_FMT_SBGGR8 v4l2_fourcc('B','A','8','1') /* 8 BGBG.. GRGR.. */
|
||||
|
|
Загрузка…
Ссылка в новой задаче