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:
Linus Torvalds 2006-10-15 11:01:53 -07:00
commit ed75ded7dd
26 changed files with 341 additions and 80 deletions

View File

@ -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]

View File

@ -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;

View File

@ -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.

View File

@ -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)

View File

@ -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;

View File

@ -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,

View File

@ -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);

View File

@ -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;

View File

@ -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

View File

@ -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__

View File

@ -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"

View File

@ -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;
} }

View File

@ -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) */

View File

@ -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,

View File

@ -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)

View File

@ -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);

View File

@ -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:

View File

@ -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... */

View File

@ -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 {

View File

@ -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:

View File

@ -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);

View File

@ -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:

View File

@ -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,
}, },
}; };

View File

@ -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));

View File

@ -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;

View File

@ -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.. */