Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: (38 commits) V4L/DVB (12441): siano: read buffer overflow V4L/DVB (12440): Use kzalloc for frontend states to have struct dvb_frontend properly V4L/DVB (12438): Read buffer overflow V4L/DVB (12437): dvb: siano uses/depends on INPUT V4L/DVB (12436): stk-webcam: read buffer overflow V4L/DVB (12432): em28xx: fix regression in Empire DualTV digital tuning V4L/DVB (12429): v4l2-ioctl: fix G_STD and G_PARM default handlers V4L/DVB (12428): hdpvr: add missing initialization of current_norm V4L/DVB (12424): soc-camera: fix recursive locking in .buf_queue() V4L/DVB (12422): media/zr364xx: fix build errors V4L/DVB (12405): em28xx-cards: move register 0x13 setting to the proper place V4L/DVB (12411): em28xx: Fix artifacts with Silvercrest webcam V4L/DVB (12410): em28xx: Move the non-board dependent part to be outside em28xx_pre_card_setup() V4L/DVB (12407): em28xx: Adjust Silvercrest xtal frequency V4L/DVB (12406): em28xx: fix: don't do image interlacing on webcams V4L/DVB (12403): em28xx: properly reports some em2710 chips V4L/DVB (12402): em28xx: fix: some em2710 chips use a different vendor ID V4L/DVB (12401): m9v011: add vflip/hflip controls to control mirror/upside down V4L/DVB (12400): em28xx: Allow changing fps on webcams V4L/DVB (12399): mt9v011: Add support for controlling frame rates ...
This commit is contained in:
Коммит
3011c7f0d4
|
@ -1,5 +1,5 @@
|
|||
0 -> Unknown EM2800 video grabber (em2800) [eb1a:2800]
|
||||
1 -> Unknown EM2750/28xx video grabber (em2820/em2840) [eb1a:2820,eb1a:2821,eb1a:2860,eb1a:2861,eb1a:2870,eb1a:2881,eb1a:2883]
|
||||
1 -> Unknown EM2750/28xx video grabber (em2820/em2840) [eb1a:2710,eb1a:2820,eb1a:2821,eb1a:2860,eb1a:2861,eb1a:2870,eb1a:2881,eb1a:2883]
|
||||
2 -> Terratec Cinergy 250 USB (em2820/em2840) [0ccd:0036]
|
||||
3 -> Pinnacle PCTV USB 2 (em2820/em2840) [2304:0208]
|
||||
4 -> Hauppauge WinTV USB 2 (em2820/em2840) [2040:4200,2040:4201]
|
||||
|
|
|
@ -153,8 +153,8 @@
|
|||
152 -> Asus Tiger Rev:1.00 [1043:4857]
|
||||
153 -> Kworld Plus TV Analog Lite PCI [17de:7128]
|
||||
154 -> Avermedia AVerTV GO 007 FM Plus [1461:f31d]
|
||||
155 -> Hauppauge WinTV-HVR1120 ATSC/QAM-Hybrid [0070:6706,0070:6708]
|
||||
156 -> Hauppauge WinTV-HVR1110r3 DVB-T/Hybrid [0070:6707,0070:6709,0070:670a]
|
||||
155 -> Hauppauge WinTV-HVR1150 ATSC/QAM-Hybrid [0070:6706,0070:6708]
|
||||
156 -> Hauppauge WinTV-HVR1120 DVB-T/Hybrid [0070:6707,0070:6709,0070:670a]
|
||||
157 -> Avermedia AVerTV Studio 507UA [1461:a11b]
|
||||
158 -> AVerMedia Cardbus TV/Radio (E501R) [1461:b7e9]
|
||||
159 -> Beholder BeholdTV 505 RDS [0000:505B]
|
||||
|
|
|
@ -2238,6 +2238,14 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git
|
|||
S: Maintained
|
||||
F: drivers/media/video/gspca/pac207.c
|
||||
|
||||
GSPCA SN9C20X SUBDRIVER
|
||||
P: Brian Johnson
|
||||
M: brijohn@gmail.com
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git
|
||||
S: Maintained
|
||||
F: drivers/media/video/gspca/sn9c20x.c
|
||||
|
||||
GSPCA T613 SUBDRIVER
|
||||
M: Leandro Costantino <lcostantino@gmail.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
|
|
|
@ -64,24 +64,22 @@ static int qt1010_writereg(struct qt1010_priv *priv, u8 reg, u8 val)
|
|||
/* dump all registers */
|
||||
static void qt1010_dump_regs(struct qt1010_priv *priv)
|
||||
{
|
||||
char buf[52], buf2[4];
|
||||
u8 reg, val;
|
||||
|
||||
for (reg = 0; ; reg++) {
|
||||
if (reg % 16 == 0) {
|
||||
if (reg)
|
||||
printk("%s\n", buf);
|
||||
sprintf(buf, "%02x: ", reg);
|
||||
printk(KERN_CONT "\n");
|
||||
printk(KERN_DEBUG "%02x:", reg);
|
||||
}
|
||||
if (qt1010_readreg(priv, reg, &val) == 0)
|
||||
sprintf(buf2, "%02x ", val);
|
||||
printk(KERN_CONT " %02x", val);
|
||||
else
|
||||
strcpy(buf2, "-- ");
|
||||
strcat(buf, buf2);
|
||||
printk(KERN_CONT " --");
|
||||
if (reg == 0x2f)
|
||||
break;
|
||||
}
|
||||
printk("%s\n", buf);
|
||||
printk(KERN_CONT "\n");
|
||||
}
|
||||
|
||||
static int qt1010_set_params(struct dvb_frontend *fe,
|
||||
|
|
|
@ -1119,8 +1119,8 @@ static int xc2028_sleep(struct dvb_frontend *fe)
|
|||
struct xc2028_data *priv = fe->tuner_priv;
|
||||
int rc = 0;
|
||||
|
||||
/* Avoid firmware reload on slow devices */
|
||||
if (no_poweroff)
|
||||
/* Avoid firmware reload on slow devices or if PM disabled */
|
||||
if (no_poweroff || priv->ctrl.disable_power_mgmt)
|
||||
return 0;
|
||||
|
||||
tuner_dbg("Putting xc2028/3028 into poweroff mode.\n");
|
||||
|
|
|
@ -38,6 +38,7 @@ struct xc2028_ctrl {
|
|||
unsigned int input1:1;
|
||||
unsigned int vhfbw7:1;
|
||||
unsigned int uhfbw8:1;
|
||||
unsigned int disable_power_mgmt:1;
|
||||
unsigned int demod;
|
||||
enum firmware_type type:2;
|
||||
};
|
||||
|
|
|
@ -81,7 +81,6 @@ static int af9015_rw_udev(struct usb_device *udev, struct req_t *req)
|
|||
|
||||
switch (req->cmd) {
|
||||
case GET_CONFIG:
|
||||
case BOOT:
|
||||
case READ_MEMORY:
|
||||
case RECONNECT_USB:
|
||||
case GET_IR_CODE:
|
||||
|
@ -100,6 +99,7 @@ static int af9015_rw_udev(struct usb_device *udev, struct req_t *req)
|
|||
case WRITE_VIRTUAL_MEMORY:
|
||||
case COPY_FIRMWARE:
|
||||
case DOWNLOAD_FIRMWARE:
|
||||
case BOOT:
|
||||
break;
|
||||
default:
|
||||
err("unknown command:%d", req->cmd);
|
||||
|
|
|
@ -380,7 +380,7 @@ struct dvb_frontend* cx22700_attach(const struct cx22700_config* config,
|
|||
struct cx22700_state* state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct cx22700_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct cx22700_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* setup the state */
|
||||
|
|
|
@ -580,7 +580,7 @@ struct dvb_frontend *cx22702_attach(const struct cx22702_config *config,
|
|||
struct cx22702_state *state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct cx22702_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct cx22702_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
goto error;
|
||||
|
||||
|
|
|
@ -598,7 +598,7 @@ struct dvb_frontend* cx24110_attach(const struct cx24110_config* config,
|
|||
int ret;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct cx24110_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct cx24110_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* setup the state */
|
||||
|
|
|
@ -117,7 +117,7 @@ struct dvb_frontend* dvb_dummy_fe_ofdm_attach(void)
|
|||
struct dvb_dummy_fe_state* state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* create dvb_frontend */
|
||||
|
@ -137,7 +137,7 @@ struct dvb_frontend *dvb_dummy_fe_qpsk_attach(void)
|
|||
struct dvb_dummy_fe_state* state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* create dvb_frontend */
|
||||
|
@ -157,7 +157,7 @@ struct dvb_frontend *dvb_dummy_fe_qam_attach(void)
|
|||
struct dvb_dummy_fe_state* state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* create dvb_frontend */
|
||||
|
|
|
@ -501,7 +501,7 @@ struct dvb_frontend* l64781_attach(const struct l64781_config* config,
|
|||
{ .addr = config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 1 } };
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct l64781_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct l64781_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* setup the state */
|
||||
|
|
|
@ -387,7 +387,7 @@ lgs8gl5_attach(const struct lgs8gl5_config *config, struct i2c_adapter *i2c)
|
|||
dprintk("%s\n", __func__);
|
||||
|
||||
/* Allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct lgs8gl5_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct lgs8gl5_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
goto error;
|
||||
|
||||
|
|
|
@ -782,7 +782,7 @@ struct dvb_frontend *mt312_attach(const struct mt312_config *config,
|
|||
struct mt312_state *state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct mt312_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct mt312_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
goto error;
|
||||
|
||||
|
|
|
@ -545,7 +545,7 @@ struct dvb_frontend* nxt6000_attach(const struct nxt6000_config* config,
|
|||
struct nxt6000_state* state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct nxt6000_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct nxt6000_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* setup the state */
|
||||
|
|
|
@ -562,7 +562,7 @@ struct dvb_frontend* or51132_attach(const struct or51132_config* config,
|
|||
struct or51132_state* state = NULL;
|
||||
|
||||
/* Allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct or51132_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct or51132_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
return NULL;
|
||||
|
||||
|
|
|
@ -527,7 +527,7 @@ struct dvb_frontend* or51211_attach(const struct or51211_config* config,
|
|||
struct or51211_state* state = NULL;
|
||||
|
||||
/* Allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct or51211_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct or51211_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
return NULL;
|
||||
|
||||
|
|
|
@ -796,7 +796,7 @@ struct dvb_frontend *s5h1409_attach(const struct s5h1409_config *config,
|
|||
u16 reg;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct s5h1409_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct s5h1409_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
goto error;
|
||||
|
||||
|
|
|
@ -844,7 +844,7 @@ struct dvb_frontend *s5h1411_attach(const struct s5h1411_config *config,
|
|||
u16 reg;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct s5h1411_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct s5h1411_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
goto error;
|
||||
|
||||
|
|
|
@ -928,7 +928,7 @@ struct dvb_frontend *si21xx_attach(const struct si21xx_config *config,
|
|||
dprintk("%s\n", __func__);
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct si21xx_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct si21xx_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
goto error;
|
||||
|
||||
|
|
|
@ -557,7 +557,7 @@ struct dvb_frontend* sp8870_attach(const struct sp8870_config* config,
|
|||
struct sp8870_state* state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct sp8870_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct sp8870_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* setup the state */
|
||||
|
|
|
@ -557,7 +557,7 @@ struct dvb_frontend* sp887x_attach(const struct sp887x_config* config,
|
|||
struct sp887x_state* state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct sp887x_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct sp887x_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* setup the state */
|
||||
|
|
|
@ -570,7 +570,7 @@ struct dvb_frontend *stv0288_attach(const struct stv0288_config *config,
|
|||
int id;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct stv0288_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct stv0288_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
goto error;
|
||||
|
||||
|
|
|
@ -663,7 +663,7 @@ struct dvb_frontend *stv0297_attach(const struct stv0297_config *config,
|
|||
struct stv0297_state *state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct stv0297_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct stv0297_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
goto error;
|
||||
|
||||
|
|
|
@ -667,7 +667,7 @@ struct dvb_frontend* stv0299_attach(const struct stv0299_config* config,
|
|||
int id;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct stv0299_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct stv0299_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* setup the state */
|
||||
|
|
|
@ -413,7 +413,7 @@ struct dvb_frontend* tda10021_attach(const struct tda1002x_config* config,
|
|||
u8 id;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct tda10021_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct tda10021_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* setup the state */
|
||||
|
|
|
@ -1095,7 +1095,7 @@ struct dvb_frontend *tda10048_attach(const struct tda10048_config *config,
|
|||
dprintk(1, "%s()\n", __func__);
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct tda10048_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct tda10048_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
goto error;
|
||||
|
||||
|
|
|
@ -1269,7 +1269,7 @@ struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config,
|
|||
int id;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct tda1004x_state), GFP_KERNEL);
|
||||
if (!state) {
|
||||
printk(KERN_ERR "Can't alocate memory for tda10045 state\n");
|
||||
return NULL;
|
||||
|
@ -1339,7 +1339,7 @@ struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config,
|
|||
int id;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct tda1004x_state), GFP_KERNEL);
|
||||
if (!state) {
|
||||
printk(KERN_ERR "Can't alocate memory for tda10046 state\n");
|
||||
return NULL;
|
||||
|
|
|
@ -745,7 +745,7 @@ struct dvb_frontend* tda10086_attach(const struct tda10086_config* config,
|
|||
dprintk ("%s\n", __func__);
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct tda10086_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct tda10086_state), GFP_KERNEL);
|
||||
if (!state)
|
||||
return NULL;
|
||||
|
||||
|
|
|
@ -417,7 +417,7 @@ struct dvb_frontend* tda8083_attach(const struct tda8083_config* config,
|
|||
struct tda8083_state* state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct tda8083_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct tda8083_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* setup the state */
|
||||
|
|
|
@ -374,7 +374,7 @@ struct dvb_frontend* ves1820_attach(const struct ves1820_config* config,
|
|||
struct ves1820_state* state = NULL;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct ves1820_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct ves1820_state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
goto error;
|
||||
|
||||
|
|
|
@ -456,7 +456,7 @@ struct dvb_frontend* ves1x93_attach(const struct ves1x93_config* config,
|
|||
u8 identity;
|
||||
|
||||
/* allocate memory for the internal state */
|
||||
state = kmalloc(sizeof(struct ves1x93_state), GFP_KERNEL);
|
||||
state = kzalloc(sizeof(struct ves1x93_state), GFP_KERNEL);
|
||||
if (state == NULL) goto error;
|
||||
|
||||
/* setup the state */
|
||||
|
|
|
@ -98,7 +98,6 @@ static int zl10353_read_register(struct zl10353_state *state, u8 reg)
|
|||
static void zl10353_dump_regs(struct dvb_frontend *fe)
|
||||
{
|
||||
struct zl10353_state *state = fe->demodulator_priv;
|
||||
char buf[52], buf2[4];
|
||||
int ret;
|
||||
u8 reg;
|
||||
|
||||
|
@ -106,19 +105,18 @@ static void zl10353_dump_regs(struct dvb_frontend *fe)
|
|||
for (reg = 0; ; reg++) {
|
||||
if (reg % 16 == 0) {
|
||||
if (reg)
|
||||
printk(KERN_DEBUG "%s\n", buf);
|
||||
sprintf(buf, "%02x: ", reg);
|
||||
printk(KERN_CONT "\n");
|
||||
printk(KERN_DEBUG "%02x:", reg);
|
||||
}
|
||||
ret = zl10353_read_register(state, reg);
|
||||
if (ret >= 0)
|
||||
sprintf(buf2, "%02x ", (u8)ret);
|
||||
printk(KERN_CONT " %02x", (u8)ret);
|
||||
else
|
||||
strcpy(buf2, "-- ");
|
||||
strcat(buf, buf2);
|
||||
printk(KERN_CONT " --");
|
||||
if (reg == 0xff)
|
||||
break;
|
||||
}
|
||||
printk(KERN_DEBUG "%s\n", buf);
|
||||
printk(KERN_CONT "\n");
|
||||
}
|
||||
|
||||
static void zl10353_calc_nominal_rate(struct dvb_frontend *fe,
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
config DVB_SIANO_SMS1XXX
|
||||
tristate "Siano SMS1XXX USB dongle support"
|
||||
depends on DVB_CORE && USB
|
||||
depends on DVB_CORE && USB && INPUT
|
||||
---help---
|
||||
Choose Y here if you have a USB dongle with a SMS1XXX chipset.
|
||||
|
||||
|
|
|
@ -116,99 +116,21 @@ static inline void sms_gpio_assign_11xx_default_led_config(
|
|||
|
||||
int sms_board_event(struct smscore_device_t *coredev,
|
||||
enum SMS_BOARD_EVENTS gevent) {
|
||||
int board_id = smscore_get_board_id(coredev);
|
||||
struct sms_board *board = sms_get_board(board_id);
|
||||
struct smscore_gpio_config MyGpioConfig;
|
||||
|
||||
sms_gpio_assign_11xx_default_led_config(&MyGpioConfig);
|
||||
|
||||
switch (gevent) {
|
||||
case BOARD_EVENT_POWER_INIT: /* including hotplug */
|
||||
switch (board_id) {
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
|
||||
/* set I/O and turn off all LEDs */
|
||||
smscore_gpio_configure(coredev,
|
||||
board->board_cfg.leds_power,
|
||||
&MyGpioConfig);
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.leds_power, 0);
|
||||
smscore_gpio_configure(coredev, board->board_cfg.led0,
|
||||
&MyGpioConfig);
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led0, 0);
|
||||
smscore_gpio_configure(coredev, board->board_cfg.led1,
|
||||
&MyGpioConfig);
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led1, 0);
|
||||
break;
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2:
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD:
|
||||
/* set I/O and turn off LNA */
|
||||
smscore_gpio_configure(coredev,
|
||||
board->board_cfg.foreign_lna0_ctrl,
|
||||
&MyGpioConfig);
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.foreign_lna0_ctrl,
|
||||
0);
|
||||
break;
|
||||
}
|
||||
break; /* BOARD_EVENT_BIND */
|
||||
|
||||
case BOARD_EVENT_POWER_SUSPEND:
|
||||
switch (board_id) {
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.leds_power, 0);
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led0, 0);
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led1, 0);
|
||||
break;
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2:
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD:
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.foreign_lna0_ctrl,
|
||||
0);
|
||||
break;
|
||||
}
|
||||
break; /* BOARD_EVENT_POWER_SUSPEND */
|
||||
|
||||
case BOARD_EVENT_POWER_RESUME:
|
||||
switch (board_id) {
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.leds_power, 1);
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led0, 1);
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led1, 0);
|
||||
break;
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2:
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD:
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.foreign_lna0_ctrl,
|
||||
1);
|
||||
break;
|
||||
}
|
||||
break; /* BOARD_EVENT_POWER_RESUME */
|
||||
|
||||
case BOARD_EVENT_BIND:
|
||||
switch (board_id) {
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.leds_power, 1);
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led0, 1);
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led1, 0);
|
||||
break;
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2:
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD:
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.foreign_lna0_ctrl,
|
||||
1);
|
||||
break;
|
||||
}
|
||||
break; /* BOARD_EVENT_BIND */
|
||||
|
||||
case BOARD_EVENT_SCAN_PROG:
|
||||
|
@ -218,20 +140,8 @@ int sms_board_event(struct smscore_device_t *coredev,
|
|||
case BOARD_EVENT_EMERGENCY_WARNING_SIGNAL:
|
||||
break; /* BOARD_EVENT_EMERGENCY_WARNING_SIGNAL */
|
||||
case BOARD_EVENT_FE_LOCK:
|
||||
switch (board_id) {
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led1, 1);
|
||||
break;
|
||||
}
|
||||
break; /* BOARD_EVENT_FE_LOCK */
|
||||
case BOARD_EVENT_FE_UNLOCK:
|
||||
switch (board_id) {
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led1, 0);
|
||||
break;
|
||||
}
|
||||
break; /* BOARD_EVENT_FE_UNLOCK */
|
||||
case BOARD_EVENT_DEMOD_LOCK:
|
||||
break; /* BOARD_EVENT_DEMOD_LOCK */
|
||||
|
@ -248,20 +158,8 @@ int sms_board_event(struct smscore_device_t *coredev,
|
|||
case BOARD_EVENT_RECEPTION_LOST_0:
|
||||
break; /* BOARD_EVENT_RECEPTION_LOST_0 */
|
||||
case BOARD_EVENT_MULTIPLEX_OK:
|
||||
switch (board_id) {
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led1, 1);
|
||||
break;
|
||||
}
|
||||
break; /* BOARD_EVENT_MULTIPLEX_OK */
|
||||
case BOARD_EVENT_MULTIPLEX_ERRORS:
|
||||
switch (board_id) {
|
||||
case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
|
||||
smscore_gpio_set_level(coredev,
|
||||
board->board_cfg.led1, 0);
|
||||
break;
|
||||
}
|
||||
break; /* BOARD_EVENT_MULTIPLEX_ERRORS */
|
||||
|
||||
default:
|
||||
|
|
|
@ -816,7 +816,7 @@ int smscore_set_device_mode(struct smscore_device_t *coredev, int mode)
|
|||
|
||||
sms_debug("set device mode to %d", mode);
|
||||
if (coredev->device_flags & SMS_DEVICE_FAMILY2) {
|
||||
if (mode < DEVICE_MODE_DVBT || mode > DEVICE_MODE_RAW_TUNER) {
|
||||
if (mode < DEVICE_MODE_DVBT || mode >= DEVICE_MODE_RAW_TUNER) {
|
||||
sms_err("invalid mode specified %d", mode);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
|
@ -920,6 +920,8 @@ source "drivers/media/video/pwc/Kconfig"
|
|||
config USB_ZR364XX
|
||||
tristate "USB ZR364XX Camera support"
|
||||
depends on VIDEO_V4L2
|
||||
select VIDEOBUF_GEN
|
||||
select VIDEOBUF_VMALLOC
|
||||
---help---
|
||||
Say Y here if you want to connect this type of camera to your
|
||||
computer's USB port.
|
||||
|
|
|
@ -992,7 +992,7 @@ static int accept_bwqcam(struct parport *port)
|
|||
|
||||
if (parport[0] && strncmp(parport[0], "auto", 4) != 0) {
|
||||
/* user gave parport parameters */
|
||||
for(n=0; parport[n] && n<MAX_CAMS; n++){
|
||||
for (n = 0; n < MAX_CAMS && parport[n]; n++) {
|
||||
char *ep;
|
||||
unsigned long r;
|
||||
r = simple_strtoul(parport[n], &ep, 0);
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include "cx18-driver.h"
|
||||
#include "cx18-cards.h"
|
||||
|
@ -317,7 +318,7 @@ int cx18_s_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *c)
|
|||
idx = p.audio_properties & 0x03;
|
||||
/* The audio clock of the digitizer must match the codec sample
|
||||
rate otherwise you get some very strange effects. */
|
||||
if (idx < sizeof(freqs))
|
||||
if (idx < ARRAY_SIZE(freqs))
|
||||
cx18_call_all(cx, audio, s_clock_freq, freqs[idx]);
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -1715,6 +1715,8 @@ static struct video_device cx23885_mpeg_template = {
|
|||
.fops = &mpeg_fops,
|
||||
.ioctl_ops = &mpeg_ioctl_ops,
|
||||
.minor = -1,
|
||||
.tvnorms = CX23885_NORMS,
|
||||
.current_norm = V4L2_STD_NTSC_M,
|
||||
};
|
||||
|
||||
void cx23885_417_unregister(struct cx23885_dev *dev)
|
||||
|
|
|
@ -3003,6 +3003,14 @@ void cx88_setup_xc3028(struct cx88_core *core, struct xc2028_ctrl *ctl)
|
|||
case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
|
||||
ctl->demod = XC3028_FE_OREN538;
|
||||
break;
|
||||
case CX88_BOARD_GENIATECH_X8000_MT:
|
||||
/* FIXME: For this board, the xc3028 never recovers after being
|
||||
powered down (the reset GPIO probably is not set properly).
|
||||
We don't have access to the hardware so we cannot determine
|
||||
which GPIO is used for xc3028, so just disable power xc3028
|
||||
power management for now */
|
||||
ctl->disable_power_mgmt = 1;
|
||||
break;
|
||||
case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
|
||||
case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
|
||||
case CX88_BOARD_PROLINK_PV_8000GT:
|
||||
|
|
|
@ -501,6 +501,7 @@ static struct zl10353_config cx88_pinnacle_hybrid_pctv = {
|
|||
static struct zl10353_config cx88_geniatech_x8000_mt = {
|
||||
.demod_address = (0x1e >> 1),
|
||||
.no_tuner = 1,
|
||||
.disable_i2c_gate_ctrl = 1,
|
||||
};
|
||||
|
||||
static struct s5h1411_config dvico_fusionhdtv7_config = {
|
||||
|
|
|
@ -116,6 +116,10 @@ static int cx8802_start_dma(struct cx8802_dev *dev,
|
|||
udelay(100);
|
||||
break;
|
||||
case CX88_BOARD_HAUPPAUGE_HVR1300:
|
||||
/* Enable MPEG parallel IO and video signal pins */
|
||||
cx_write(MO_PINMUX_IO, 0x88);
|
||||
cx_write(TS_SOP_STAT, 0);
|
||||
cx_write(TS_VALERR_CNTRL, 0);
|
||||
break;
|
||||
case CX88_BOARD_PINNACLE_PCTV_HD_800i:
|
||||
/* Enable MPEG parallel IO and video signal pins */
|
||||
|
|
|
@ -218,7 +218,7 @@ static struct em28xx_reg_seq silvercrest_reg_seq[] = {
|
|||
struct em28xx_board em28xx_boards[] = {
|
||||
[EM2750_BOARD_UNKNOWN] = {
|
||||
.name = "EM2710/EM2750/EM2751 webcam grabber",
|
||||
.xclk = EM28XX_XCLK_FREQUENCY_48MHZ,
|
||||
.xclk = EM28XX_XCLK_FREQUENCY_20MHZ,
|
||||
.tuner_type = TUNER_ABSENT,
|
||||
.is_webcam = 1,
|
||||
.input = { {
|
||||
|
@ -622,22 +622,27 @@ struct em28xx_board em28xx_boards[] = {
|
|||
},
|
||||
[EM2861_BOARD_PLEXTOR_PX_TV100U] = {
|
||||
.name = "Plextor ConvertX PX-TV100U",
|
||||
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
||||
.tuner_type = TUNER_TNF_5335MF,
|
||||
.xclk = EM28XX_XCLK_I2S_MSB_TIMING |
|
||||
EM28XX_XCLK_FREQUENCY_12MHZ,
|
||||
.tda9887_conf = TDA9887_PRESENT,
|
||||
.decoder = EM28XX_TVP5150,
|
||||
.has_msp34xx = 1,
|
||||
.input = { {
|
||||
.type = EM28XX_VMUX_TELEVISION,
|
||||
.vmux = TVP5150_COMPOSITE0,
|
||||
.amux = EM28XX_AMUX_LINE_IN,
|
||||
.gpio = pinnacle_hybrid_pro_analog,
|
||||
}, {
|
||||
.type = EM28XX_VMUX_COMPOSITE1,
|
||||
.vmux = TVP5150_COMPOSITE1,
|
||||
.amux = EM28XX_AMUX_LINE_IN,
|
||||
.gpio = pinnacle_hybrid_pro_analog,
|
||||
}, {
|
||||
.type = EM28XX_VMUX_SVIDEO,
|
||||
.vmux = TVP5150_SVIDEO,
|
||||
.amux = EM28XX_AMUX_LINE_IN,
|
||||
.gpio = pinnacle_hybrid_pro_analog,
|
||||
} },
|
||||
},
|
||||
|
||||
|
@ -1544,6 +1549,8 @@ struct usb_device_id em28xx_id_table[] = {
|
|||
.driver_info = EM2750_BOARD_UNKNOWN },
|
||||
{ USB_DEVICE(0xeb1a, 0x2800),
|
||||
.driver_info = EM2800_BOARD_UNKNOWN },
|
||||
{ USB_DEVICE(0xeb1a, 0x2710),
|
||||
.driver_info = EM2820_BOARD_UNKNOWN },
|
||||
{ USB_DEVICE(0xeb1a, 0x2820),
|
||||
.driver_info = EM2820_BOARD_UNKNOWN },
|
||||
{ USB_DEVICE(0xeb1a, 0x2821),
|
||||
|
@ -1761,6 +1768,7 @@ static int em28xx_hint_sensor(struct em28xx *dev)
|
|||
__be16 version_be;
|
||||
u16 version;
|
||||
|
||||
/* Micron sensor detection */
|
||||
dev->i2c_client.addr = 0xba >> 1;
|
||||
cmd = 0;
|
||||
i2c_master_send(&dev->i2c_client, &cmd, 1);
|
||||
|
@ -1769,15 +1777,27 @@ static int em28xx_hint_sensor(struct em28xx *dev)
|
|||
return -EINVAL;
|
||||
|
||||
version = be16_to_cpu(version_be);
|
||||
|
||||
switch (version) {
|
||||
case 0x8243: /* mt9v011 640x480 1.3 Mpix sensor */
|
||||
case 0x8232: /* mt9v011 640x480 1.3 Mpix sensor */
|
||||
case 0x8243: /* mt9v011 rev B 640x480 1.3 Mpix sensor */
|
||||
dev->model = EM2820_BOARD_SILVERCREST_WEBCAM;
|
||||
em28xx_set_model(dev);
|
||||
|
||||
sensor_name = "mt9v011";
|
||||
dev->em28xx_sensor = EM28XX_MT9V011;
|
||||
dev->sensor_xres = 640;
|
||||
dev->sensor_yres = 480;
|
||||
dev->sensor_xtal = 6300000;
|
||||
/*
|
||||
* FIXME: mt9v011 uses I2S speed as xtal clk - at least with
|
||||
* the Silvercrest cam I have here for testing - for higher
|
||||
* resolutions, a high clock cause horizontal artifacts, so we
|
||||
* need to use a lower xclk frequency.
|
||||
* Yet, it would be possible to adjust xclk depending on the
|
||||
* desired resolution, since this affects directly the
|
||||
* frame rate.
|
||||
*/
|
||||
dev->board.xclk = EM28XX_XCLK_FREQUENCY_4_3MHZ;
|
||||
dev->sensor_xtal = 4300000;
|
||||
|
||||
/* probably means GRGB 16 bit bayer */
|
||||
dev->vinmode = 0x0d;
|
||||
|
@ -1786,6 +1806,8 @@ static int em28xx_hint_sensor(struct em28xx *dev)
|
|||
break;
|
||||
case 0x8431:
|
||||
dev->model = EM2750_BOARD_UNKNOWN;
|
||||
em28xx_set_model(dev);
|
||||
|
||||
sensor_name = "mt9m001";
|
||||
dev->em28xx_sensor = EM28XX_MT9M001;
|
||||
em28xx_initialize_mt9m001(dev);
|
||||
|
@ -1802,6 +1824,9 @@ static int em28xx_hint_sensor(struct em28xx *dev)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Setup webcam defaults */
|
||||
em28xx_pre_card_setup(dev);
|
||||
|
||||
em28xx_errdev("Sensor is %s, using model %s entry.\n",
|
||||
sensor_name, em28xx_boards[dev->model].name);
|
||||
|
||||
|
@ -1813,60 +1838,6 @@ static int em28xx_hint_sensor(struct em28xx *dev)
|
|||
*/
|
||||
void em28xx_pre_card_setup(struct em28xx *dev)
|
||||
{
|
||||
int rc;
|
||||
|
||||
em28xx_set_model(dev);
|
||||
|
||||
em28xx_info("Identified as %s (card=%d)\n",
|
||||
dev->board.name, dev->model);
|
||||
|
||||
/* Set the default GPO/GPIO for legacy devices */
|
||||
dev->reg_gpo_num = EM2880_R04_GPO;
|
||||
dev->reg_gpio_num = EM28XX_R08_GPIO;
|
||||
|
||||
dev->wait_after_write = 5;
|
||||
|
||||
/* Based on the Chip ID, set the device configuration */
|
||||
rc = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);
|
||||
if (rc > 0) {
|
||||
dev->chip_id = rc;
|
||||
|
||||
switch (dev->chip_id) {
|
||||
case CHIP_ID_EM2750:
|
||||
em28xx_info("chip ID is em2750\n");
|
||||
break;
|
||||
case CHIP_ID_EM2820:
|
||||
em28xx_info("chip ID is em2710 or em2820\n");
|
||||
break;
|
||||
case CHIP_ID_EM2840:
|
||||
em28xx_info("chip ID is em2840\n");
|
||||
break;
|
||||
case CHIP_ID_EM2860:
|
||||
em28xx_info("chip ID is em2860\n");
|
||||
break;
|
||||
case CHIP_ID_EM2870:
|
||||
em28xx_info("chip ID is em2870\n");
|
||||
dev->wait_after_write = 0;
|
||||
break;
|
||||
case CHIP_ID_EM2874:
|
||||
em28xx_info("chip ID is em2874\n");
|
||||
dev->reg_gpio_num = EM2874_R80_GPIO;
|
||||
dev->wait_after_write = 0;
|
||||
break;
|
||||
case CHIP_ID_EM2883:
|
||||
em28xx_info("chip ID is em2882/em2883\n");
|
||||
dev->wait_after_write = 0;
|
||||
break;
|
||||
default:
|
||||
em28xx_info("em28xx chip ID = %d\n", dev->chip_id);
|
||||
}
|
||||
}
|
||||
|
||||
/* Prepopulate cached GPO register content */
|
||||
rc = em28xx_read_reg(dev, dev->reg_gpo_num);
|
||||
if (rc >= 0)
|
||||
dev->reg_gpo = rc;
|
||||
|
||||
/* Set the initial XCLK and I2C clock values based on the board
|
||||
definition */
|
||||
em28xx_write_reg(dev, EM28XX_R0F_XCLK, dev->board.xclk & 0x7f);
|
||||
|
@ -1876,9 +1847,8 @@ void em28xx_pre_card_setup(struct em28xx *dev)
|
|||
/* request some modules */
|
||||
switch (dev->model) {
|
||||
case EM2861_BOARD_PLEXTOR_PX_TV100U:
|
||||
/* FIXME guess */
|
||||
/* Turn on analog audio output */
|
||||
em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
|
||||
/* Sets the msp34xx I2S speed */
|
||||
dev->i2s_speed = 2048000;
|
||||
break;
|
||||
case EM2861_BOARD_KWORLD_PVRTV_300U:
|
||||
case EM2880_BOARD_KWORLD_DVB_305U:
|
||||
|
@ -2216,7 +2186,20 @@ void em28xx_register_i2c_ir(struct em28xx *dev)
|
|||
|
||||
void em28xx_card_setup(struct em28xx *dev)
|
||||
{
|
||||
em28xx_set_model(dev);
|
||||
/*
|
||||
* If the device can be a webcam, seek for a sensor.
|
||||
* If sensor is not found, then it isn't a webcam.
|
||||
*/
|
||||
if (dev->board.is_webcam) {
|
||||
if (em28xx_hint_sensor(dev) < 0)
|
||||
dev->board.is_webcam = 0;
|
||||
else
|
||||
dev->progressive = 1;
|
||||
} else
|
||||
em28xx_set_model(dev);
|
||||
|
||||
em28xx_info("Identified as %s (card=%d)\n",
|
||||
dev->board.name, dev->model);
|
||||
|
||||
dev->tuner_type = em28xx_boards[dev->model].tuner_type;
|
||||
if (em28xx_boards[dev->model].tuner_addr)
|
||||
|
@ -2290,10 +2273,6 @@ void em28xx_card_setup(struct em28xx *dev)
|
|||
em28xx_gpio_set(dev, dev->board.tuner_gpio);
|
||||
em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
|
||||
break;
|
||||
case EM2820_BOARD_SILVERCREST_WEBCAM:
|
||||
/* FIXME: need to document the registers bellow */
|
||||
em28xx_write_reg(dev, 0x0d, 0x42);
|
||||
em28xx_write_reg(dev, 0x13, 0x08);
|
||||
}
|
||||
|
||||
if (dev->board.has_snapshot_button)
|
||||
|
@ -2433,7 +2412,7 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
|
|||
int minor)
|
||||
{
|
||||
struct em28xx *dev = *devhandle;
|
||||
int retval = -ENOMEM;
|
||||
int retval;
|
||||
int errCode;
|
||||
|
||||
dev->udev = udev;
|
||||
|
@ -2450,6 +2429,58 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
|
|||
dev->em28xx_read_reg_req = em28xx_read_reg_req;
|
||||
dev->board.is_em2800 = em28xx_boards[dev->model].is_em2800;
|
||||
|
||||
em28xx_set_model(dev);
|
||||
|
||||
/* Set the default GPO/GPIO for legacy devices */
|
||||
dev->reg_gpo_num = EM2880_R04_GPO;
|
||||
dev->reg_gpio_num = EM28XX_R08_GPIO;
|
||||
|
||||
dev->wait_after_write = 5;
|
||||
|
||||
/* Based on the Chip ID, set the device configuration */
|
||||
retval = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);
|
||||
if (retval > 0) {
|
||||
dev->chip_id = retval;
|
||||
|
||||
switch (dev->chip_id) {
|
||||
case CHIP_ID_EM2710:
|
||||
em28xx_info("chip ID is em2710\n");
|
||||
break;
|
||||
case CHIP_ID_EM2750:
|
||||
em28xx_info("chip ID is em2750\n");
|
||||
break;
|
||||
case CHIP_ID_EM2820:
|
||||
em28xx_info("chip ID is em2820 (or em2710)\n");
|
||||
break;
|
||||
case CHIP_ID_EM2840:
|
||||
em28xx_info("chip ID is em2840\n");
|
||||
break;
|
||||
case CHIP_ID_EM2860:
|
||||
em28xx_info("chip ID is em2860\n");
|
||||
break;
|
||||
case CHIP_ID_EM2870:
|
||||
em28xx_info("chip ID is em2870\n");
|
||||
dev->wait_after_write = 0;
|
||||
break;
|
||||
case CHIP_ID_EM2874:
|
||||
em28xx_info("chip ID is em2874\n");
|
||||
dev->reg_gpio_num = EM2874_R80_GPIO;
|
||||
dev->wait_after_write = 0;
|
||||
break;
|
||||
case CHIP_ID_EM2883:
|
||||
em28xx_info("chip ID is em2882/em2883\n");
|
||||
dev->wait_after_write = 0;
|
||||
break;
|
||||
default:
|
||||
em28xx_info("em28xx chip ID = %d\n", dev->chip_id);
|
||||
}
|
||||
}
|
||||
|
||||
/* Prepopulate cached GPO register content */
|
||||
retval = em28xx_read_reg(dev, dev->reg_gpo_num);
|
||||
if (retval >= 0)
|
||||
dev->reg_gpo = retval;
|
||||
|
||||
em28xx_pre_card_setup(dev);
|
||||
|
||||
if (!dev->board.is_em2800) {
|
||||
|
@ -2484,14 +2515,6 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
|
|||
dev->vinmode = 0x10;
|
||||
dev->vinctl = 0x11;
|
||||
|
||||
/*
|
||||
* If the device can be a webcam, seek for a sensor.
|
||||
* If sensor is not found, then it isn't a webcam.
|
||||
*/
|
||||
if (dev->board.is_webcam)
|
||||
if (em28xx_hint_sensor(dev) < 0)
|
||||
dev->board.is_webcam = 0;
|
||||
|
||||
/* Do board specific init and eeprom reading */
|
||||
em28xx_card_setup(dev);
|
||||
|
||||
|
|
|
@ -632,6 +632,9 @@ int em28xx_capture_start(struct em28xx *dev, int start)
|
|||
return rc;
|
||||
}
|
||||
|
||||
if (dev->board.is_webcam)
|
||||
rc = em28xx_write_reg(dev, 0x13, 0x0c);
|
||||
|
||||
/* enable video capture */
|
||||
rc = em28xx_write_reg(dev, 0x48, 0x00);
|
||||
|
||||
|
@ -720,7 +723,10 @@ int em28xx_resolution_set(struct em28xx *dev)
|
|||
{
|
||||
int width, height;
|
||||
width = norm_maxw(dev);
|
||||
height = norm_maxh(dev) >> 1;
|
||||
height = norm_maxh(dev);
|
||||
|
||||
if (!dev->progressive)
|
||||
height >>= norm_maxh(dev);
|
||||
|
||||
em28xx_set_outfmt(dev);
|
||||
|
||||
|
|
|
@ -478,7 +478,6 @@ static int dvb_init(struct em28xx *dev)
|
|||
}
|
||||
break;
|
||||
case EM2880_BOARD_KWORLD_DVB_310U:
|
||||
case EM2880_BOARD_EMPIRE_DUAL_TV:
|
||||
dvb->frontend = dvb_attach(zl10353_attach,
|
||||
&em28xx_zl10353_with_xc3028,
|
||||
&dev->i2c_adap);
|
||||
|
@ -488,6 +487,7 @@ static int dvb_init(struct em28xx *dev)
|
|||
}
|
||||
break;
|
||||
case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
|
||||
case EM2880_BOARD_EMPIRE_DUAL_TV:
|
||||
dvb->frontend = dvb_attach(zl10353_attach,
|
||||
&em28xx_zl10353_xc3028_no_i2c_gate,
|
||||
&dev->i2c_adap);
|
||||
|
|
|
@ -176,7 +176,8 @@
|
|||
|
||||
/* FIXME: Need to be populated with the other chip ID's */
|
||||
enum em28xx_chip_id {
|
||||
CHIP_ID_EM2820 = 18, /* Also used by em2710 */
|
||||
CHIP_ID_EM2710 = 17,
|
||||
CHIP_ID_EM2820 = 18, /* Also used by some em2710 */
|
||||
CHIP_ID_EM2840 = 20,
|
||||
CHIP_ID_EM2750 = 33,
|
||||
CHIP_ID_EM2860 = 34,
|
||||
|
|
|
@ -194,15 +194,24 @@ static void em28xx_copy_video(struct em28xx *dev,
|
|||
startread = p;
|
||||
remain = len;
|
||||
|
||||
/* Interlaces frame */
|
||||
if (buf->top_field)
|
||||
if (dev->progressive)
|
||||
fieldstart = outp;
|
||||
else
|
||||
fieldstart = outp + bytesperline;
|
||||
else {
|
||||
/* Interlaces two half frames */
|
||||
if (buf->top_field)
|
||||
fieldstart = outp;
|
||||
else
|
||||
fieldstart = outp + bytesperline;
|
||||
}
|
||||
|
||||
linesdone = dma_q->pos / bytesperline;
|
||||
currlinedone = dma_q->pos % bytesperline;
|
||||
offset = linesdone * bytesperline * 2 + currlinedone;
|
||||
|
||||
if (dev->progressive)
|
||||
offset = linesdone * bytesperline + currlinedone;
|
||||
else
|
||||
offset = linesdone * bytesperline * 2 + currlinedone;
|
||||
|
||||
startwrite = fieldstart + offset;
|
||||
lencopy = bytesperline - currlinedone;
|
||||
lencopy = lencopy > remain ? remain : lencopy;
|
||||
|
@ -376,7 +385,7 @@ static inline int em28xx_isoc_copy(struct em28xx *dev, struct urb *urb)
|
|||
em28xx_isocdbg("Video frame %d, length=%i, %s\n", p[2],
|
||||
len, (p[2] & 1) ? "odd" : "even");
|
||||
|
||||
if (!(p[2] & 1)) {
|
||||
if (dev->progressive || !(p[2] & 1)) {
|
||||
if (buf != NULL)
|
||||
buffer_filled(dev, dma_q, buf);
|
||||
get_next_buf(dma_q, &buf);
|
||||
|
@ -689,7 +698,10 @@ static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
|
|||
f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
|
||||
/* FIXME: TOP? NONE? BOTTOM? ALTENATE? */
|
||||
f->fmt.pix.field = dev->interlaced ?
|
||||
if (dev->progressive)
|
||||
f->fmt.pix.field = V4L2_FIELD_NONE;
|
||||
else
|
||||
f->fmt.pix.field = dev->interlaced ?
|
||||
V4L2_FIELD_INTERLACED : V4L2_FIELD_TOP;
|
||||
|
||||
mutex_unlock(&dev->lock);
|
||||
|
@ -753,7 +765,11 @@ static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
|
|||
f->fmt.pix.bytesperline = (dev->width * fmt->depth + 7) >> 3;
|
||||
f->fmt.pix.sizeimage = f->fmt.pix.bytesperline * height;
|
||||
f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
f->fmt.pix.field = V4L2_FIELD_INTERLACED;
|
||||
if (dev->progressive)
|
||||
f->fmt.pix.field = V4L2_FIELD_NONE;
|
||||
else
|
||||
f->fmt.pix.field = dev->interlaced ?
|
||||
V4L2_FIELD_INTERLACED : V4L2_FIELD_TOP;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -846,6 +862,41 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *norm)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int vidioc_g_parm(struct file *file, void *priv,
|
||||
struct v4l2_streamparm *p)
|
||||
{
|
||||
struct em28xx_fh *fh = priv;
|
||||
struct em28xx *dev = fh->dev;
|
||||
int rc = 0;
|
||||
|
||||
if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
||||
return -EINVAL;
|
||||
|
||||
if (dev->board.is_webcam)
|
||||
rc = v4l2_device_call_until_err(&dev->v4l2_dev, 0,
|
||||
video, g_parm, p);
|
||||
else
|
||||
v4l2_video_std_frame_period(dev->norm,
|
||||
&p->parm.capture.timeperframe);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int vidioc_s_parm(struct file *file, void *priv,
|
||||
struct v4l2_streamparm *p)
|
||||
{
|
||||
struct em28xx_fh *fh = priv;
|
||||
struct em28xx *dev = fh->dev;
|
||||
|
||||
if (!dev->board.is_webcam)
|
||||
return -EINVAL;
|
||||
|
||||
if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
||||
return -EINVAL;
|
||||
|
||||
return v4l2_device_call_until_err(&dev->v4l2_dev, 0, video, s_parm, p);
|
||||
}
|
||||
|
||||
static const char *iname[] = {
|
||||
[EM28XX_VMUX_COMPOSITE1] = "Composite1",
|
||||
[EM28XX_VMUX_COMPOSITE2] = "Composite2",
|
||||
|
@ -1624,6 +1675,7 @@ static int em28xx_v4l2_open(struct file *filp)
|
|||
struct em28xx *dev;
|
||||
enum v4l2_buf_type fh_type;
|
||||
struct em28xx_fh *fh;
|
||||
enum v4l2_field field;
|
||||
|
||||
dev = em28xx_get_device(minor, &fh_type, &radio);
|
||||
|
||||
|
@ -1665,8 +1717,13 @@ static int em28xx_v4l2_open(struct file *filp)
|
|||
|
||||
dev->users++;
|
||||
|
||||
if (dev->progressive)
|
||||
field = V4L2_FIELD_NONE;
|
||||
else
|
||||
field = V4L2_FIELD_INTERLACED;
|
||||
|
||||
videobuf_queue_vmalloc_init(&fh->vb_vidq, &em28xx_video_qops,
|
||||
NULL, &dev->slock, fh->type, V4L2_FIELD_INTERLACED,
|
||||
NULL, &dev->slock, fh->type, field,
|
||||
sizeof(struct em28xx_buffer), fh);
|
||||
|
||||
mutex_unlock(&dev->lock);
|
||||
|
@ -1885,6 +1942,8 @@ static const struct v4l2_ioctl_ops video_ioctl_ops = {
|
|||
.vidioc_qbuf = vidioc_qbuf,
|
||||
.vidioc_dqbuf = vidioc_dqbuf,
|
||||
.vidioc_s_std = vidioc_s_std,
|
||||
.vidioc_g_parm = vidioc_g_parm,
|
||||
.vidioc_s_parm = vidioc_s_parm,
|
||||
.vidioc_enum_input = vidioc_enum_input,
|
||||
.vidioc_g_input = vidioc_g_input,
|
||||
.vidioc_s_input = vidioc_s_input,
|
||||
|
|
|
@ -484,6 +484,9 @@ struct em28xx {
|
|||
int sensor_xres, sensor_yres;
|
||||
int sensor_xtal;
|
||||
|
||||
/* Allows progressive (e. g. non-interlaced) mode */
|
||||
int progressive;
|
||||
|
||||
/* Vinmode/Vinctl used at the driver */
|
||||
int vinmode, vinctl;
|
||||
|
||||
|
|
|
@ -1220,6 +1220,8 @@ static const struct video_device hdpvr_video_template = {
|
|||
V4L2_STD_PAL_G | V4L2_STD_PAL_H | V4L2_STD_PAL_I |
|
||||
V4L2_STD_PAL_D | V4L2_STD_PAL_M | V4L2_STD_PAL_N |
|
||||
V4L2_STD_PAL_60,
|
||||
.current_norm = V4L2_STD_NTSC | V4L2_STD_PAL_M |
|
||||
V4L2_STD_PAL_60,
|
||||
};
|
||||
|
||||
int hdpvr_register_videodev(struct hdpvr_device *dev, struct device *parent,
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include "ivtv-driver.h"
|
||||
#include "ivtv-cards.h"
|
||||
|
@ -281,7 +282,7 @@ int ivtv_s_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *c)
|
|||
idx = p.audio_properties & 0x03;
|
||||
/* The audio clock of the digitizer must match the codec sample
|
||||
rate otherwise you get some very strange effects. */
|
||||
if (idx < sizeof(freqs))
|
||||
if (idx < ARRAY_SIZE(freqs))
|
||||
ivtv_call_all(itv, audio, s_clock_freq, freqs[idx]);
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -52,13 +52,34 @@ static struct v4l2_queryctrl mt9v011_qctrl[] = {
|
|||
.step = 1,
|
||||
.default_value = 0,
|
||||
.flags = 0,
|
||||
},
|
||||
}, {
|
||||
.id = V4L2_CID_HFLIP,
|
||||
.type = V4L2_CTRL_TYPE_BOOLEAN,
|
||||
.name = "Mirror",
|
||||
.minimum = 0,
|
||||
.maximum = 1,
|
||||
.step = 1,
|
||||
.default_value = 0,
|
||||
.flags = 0,
|
||||
}, {
|
||||
.id = V4L2_CID_VFLIP,
|
||||
.type = V4L2_CTRL_TYPE_BOOLEAN,
|
||||
.name = "Vflip",
|
||||
.minimum = 0,
|
||||
.maximum = 1,
|
||||
.step = 1,
|
||||
.default_value = 0,
|
||||
.flags = 0,
|
||||
}, {
|
||||
}
|
||||
};
|
||||
|
||||
struct mt9v011 {
|
||||
struct v4l2_subdev sd;
|
||||
unsigned width, height;
|
||||
unsigned xtal;
|
||||
unsigned hflip:1;
|
||||
unsigned vflip:1;
|
||||
|
||||
u16 global_gain, red_bal, blue_bal;
|
||||
};
|
||||
|
@ -131,7 +152,6 @@ static const struct i2c_reg_value mt9v011_init_default[] = {
|
|||
|
||||
{ R0A_MT9V011_CLK_SPEED, 0x0000 },
|
||||
{ R1E_MT9V011_DIGITAL_ZOOM, 0x0000 },
|
||||
{ R20_MT9V011_READ_MODE, 0x1000 },
|
||||
|
||||
{ R07_MT9V011_OUT_CTRL, 0x0002 }, /* chip enable */
|
||||
};
|
||||
|
@ -156,7 +176,7 @@ static void set_balance(struct v4l2_subdev *sd)
|
|||
mt9v011_write(sd, R2D_MT9V011_RED_GAIN, red_gain);
|
||||
}
|
||||
|
||||
static void calc_fps(struct v4l2_subdev *sd)
|
||||
static void calc_fps(struct v4l2_subdev *sd, u32 *numerator, u32 *denominator)
|
||||
{
|
||||
struct mt9v011 *core = to_mt9v011(sd);
|
||||
unsigned height, width, hblank, vblank, speed;
|
||||
|
@ -179,6 +199,51 @@ static void calc_fps(struct v4l2_subdev *sd)
|
|||
|
||||
v4l2_dbg(1, debug, sd, "Programmed to %u.%03u fps (%d pixel clcks)\n",
|
||||
tmp / 1000, tmp % 1000, t_time);
|
||||
|
||||
if (numerator && denominator) {
|
||||
*numerator = 1000;
|
||||
*denominator = (u32)frames_per_ms;
|
||||
}
|
||||
}
|
||||
|
||||
static u16 calc_speed(struct v4l2_subdev *sd, u32 numerator, u32 denominator)
|
||||
{
|
||||
struct mt9v011 *core = to_mt9v011(sd);
|
||||
unsigned height, width, hblank, vblank;
|
||||
unsigned row_time, line_time;
|
||||
u64 t_time, speed;
|
||||
|
||||
/* Avoid bogus calculus */
|
||||
if (!numerator || !denominator)
|
||||
return 0;
|
||||
|
||||
height = mt9v011_read(sd, R03_MT9V011_HEIGHT);
|
||||
width = mt9v011_read(sd, R04_MT9V011_WIDTH);
|
||||
hblank = mt9v011_read(sd, R05_MT9V011_HBLANK);
|
||||
vblank = mt9v011_read(sd, R06_MT9V011_VBLANK);
|
||||
|
||||
row_time = width + 113 + hblank;
|
||||
line_time = height + vblank + 1;
|
||||
|
||||
t_time = core->xtal * ((u64)numerator);
|
||||
/* round to the closest value */
|
||||
t_time += denominator / 2;
|
||||
do_div(t_time, denominator);
|
||||
|
||||
speed = t_time;
|
||||
do_div(speed, row_time * line_time);
|
||||
|
||||
/* Avoid having a negative value for speed */
|
||||
if (speed < 2)
|
||||
speed = 0;
|
||||
else
|
||||
speed -= 2;
|
||||
|
||||
/* Avoid speed overflow */
|
||||
if (speed > 15)
|
||||
return 15;
|
||||
|
||||
return (u16)speed;
|
||||
}
|
||||
|
||||
static void set_res(struct v4l2_subdev *sd)
|
||||
|
@ -207,9 +272,23 @@ static void set_res(struct v4l2_subdev *sd)
|
|||
mt9v011_write(sd, R03_MT9V011_HEIGHT, core->height);
|
||||
mt9v011_write(sd, R06_MT9V011_VBLANK, 508 - core->height);
|
||||
|
||||
calc_fps(sd);
|
||||
calc_fps(sd, NULL, NULL);
|
||||
};
|
||||
|
||||
static void set_read_mode(struct v4l2_subdev *sd)
|
||||
{
|
||||
struct mt9v011 *core = to_mt9v011(sd);
|
||||
unsigned mode = 0x1000;
|
||||
|
||||
if (core->hflip)
|
||||
mode |= 0x4000;
|
||||
|
||||
if (core->vflip)
|
||||
mode |= 0x8000;
|
||||
|
||||
mt9v011_write(sd, R20_MT9V011_READ_MODE, mode);
|
||||
}
|
||||
|
||||
static int mt9v011_reset(struct v4l2_subdev *sd, u32 val)
|
||||
{
|
||||
int i;
|
||||
|
@ -220,6 +299,7 @@ static int mt9v011_reset(struct v4l2_subdev *sd, u32 val)
|
|||
|
||||
set_balance(sd);
|
||||
set_res(sd);
|
||||
set_read_mode(sd);
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
@ -240,6 +320,12 @@ static int mt9v011_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
|
|||
case V4L2_CID_BLUE_BALANCE:
|
||||
ctrl->value = core->blue_bal;
|
||||
return 0;
|
||||
case V4L2_CID_HFLIP:
|
||||
ctrl->value = core->hflip ? 1 : 0;
|
||||
return 0;
|
||||
case V4L2_CID_VFLIP:
|
||||
ctrl->value = core->vflip ? 1 : 0;
|
||||
return 0;
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -288,6 +374,14 @@ static int mt9v011_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
|
|||
case V4L2_CID_BLUE_BALANCE:
|
||||
core->blue_bal = ctrl->value;
|
||||
break;
|
||||
case V4L2_CID_HFLIP:
|
||||
core->hflip = ctrl->value;
|
||||
set_read_mode(sd);
|
||||
return 0;
|
||||
case V4L2_CID_VFLIP:
|
||||
core->vflip = ctrl->value;
|
||||
set_read_mode(sd);
|
||||
return 0;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -322,6 +416,44 @@ static int mt9v011_try_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int mt9v011_g_parm(struct v4l2_subdev *sd, struct v4l2_streamparm *parms)
|
||||
{
|
||||
struct v4l2_captureparm *cp = &parms->parm.capture;
|
||||
|
||||
if (parms->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
||||
return -EINVAL;
|
||||
|
||||
memset(cp, 0, sizeof(struct v4l2_captureparm));
|
||||
cp->capability = V4L2_CAP_TIMEPERFRAME;
|
||||
calc_fps(sd,
|
||||
&cp->timeperframe.numerator,
|
||||
&cp->timeperframe.denominator);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mt9v011_s_parm(struct v4l2_subdev *sd, struct v4l2_streamparm *parms)
|
||||
{
|
||||
struct v4l2_captureparm *cp = &parms->parm.capture;
|
||||
struct v4l2_fract *tpf = &cp->timeperframe;
|
||||
u16 speed;
|
||||
|
||||
if (parms->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
||||
return -EINVAL;
|
||||
if (cp->extendedmode != 0)
|
||||
return -EINVAL;
|
||||
|
||||
speed = calc_speed(sd, tpf->numerator, tpf->denominator);
|
||||
|
||||
mt9v011_write(sd, R0A_MT9V011_CLK_SPEED, speed);
|
||||
v4l2_dbg(1, debug, sd, "Setting speed to %d\n", speed);
|
||||
|
||||
/* Recalculate and update fps info */
|
||||
calc_fps(sd, &tpf->numerator, &tpf->denominator);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mt9v011_s_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt)
|
||||
{
|
||||
struct v4l2_pix_format *pix = &fmt->fmt.pix;
|
||||
|
@ -393,10 +525,13 @@ static int mt9v011_s_register(struct v4l2_subdev *sd,
|
|||
static int mt9v011_g_chip_ident(struct v4l2_subdev *sd,
|
||||
struct v4l2_dbg_chip_ident *chip)
|
||||
{
|
||||
u16 version;
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
|
||||
version = mt9v011_read(sd, R00_MT9V011_CHIP_VERSION);
|
||||
|
||||
return v4l2_chip_ident_i2c_client(client, chip, V4L2_IDENT_MT9V011,
|
||||
MT9V011_VERSION);
|
||||
version);
|
||||
}
|
||||
|
||||
static const struct v4l2_subdev_core_ops mt9v011_core_ops = {
|
||||
|
@ -416,6 +551,8 @@ static const struct v4l2_subdev_video_ops mt9v011_video_ops = {
|
|||
.enum_fmt = mt9v011_enum_fmt,
|
||||
.try_fmt = mt9v011_try_fmt,
|
||||
.s_fmt = mt9v011_s_fmt,
|
||||
.g_parm = mt9v011_g_parm,
|
||||
.s_parm = mt9v011_s_parm,
|
||||
};
|
||||
|
||||
static const struct v4l2_subdev_ops mt9v011_ops = {
|
||||
|
@ -449,8 +586,9 @@ static int mt9v011_probe(struct i2c_client *c,
|
|||
|
||||
/* Check if the sensor is really a MT9V011 */
|
||||
version = mt9v011_read(sd, R00_MT9V011_CHIP_VERSION);
|
||||
if (version != MT9V011_VERSION) {
|
||||
v4l2_info(sd, "*** unknown micron chip detected (0x%04x.\n",
|
||||
if ((version != MT9V011_VERSION) &&
|
||||
(version != MT9V011_REV_B_VERSION)) {
|
||||
v4l2_info(sd, "*** unknown micron chip detected (0x%04x).\n",
|
||||
version);
|
||||
kfree(core);
|
||||
return -EINVAL;
|
||||
|
@ -461,8 +599,8 @@ static int mt9v011_probe(struct i2c_client *c,
|
|||
core->height = 480;
|
||||
core->xtal = 27000000; /* Hz */
|
||||
|
||||
v4l_info(c, "chip found @ 0x%02x (%s)\n",
|
||||
c->addr << 1, c->adapter->name);
|
||||
v4l_info(c, "chip found @ 0x%02x (%s - chip version 0x%04x)\n",
|
||||
c->addr << 1, c->adapter->name, version);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#define R35_MT9V011_GLOBAL_GAIN 0x35
|
||||
#define RF1_MT9V011_CHIP_ENABLE 0xf1
|
||||
|
||||
#define MT9V011_VERSION 0x8243
|
||||
#define MT9V011_VERSION 0x8232
|
||||
#define MT9V011_REV_B_VERSION 0x8243
|
||||
|
||||
#endif
|
||||
|
|
|
@ -234,6 +234,7 @@ static int mx1_camera_setup_dma(struct mx1_camera_dev *pcdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* Called under spinlock_irqsave(&pcdev->lock, ...) */
|
||||
static void mx1_videobuf_queue(struct videobuf_queue *vq,
|
||||
struct videobuf_buffer *vb)
|
||||
{
|
||||
|
@ -241,13 +242,10 @@ static void mx1_videobuf_queue(struct videobuf_queue *vq,
|
|||
struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
|
||||
struct mx1_camera_dev *pcdev = ici->priv;
|
||||
struct mx1_buffer *buf = container_of(vb, struct mx1_buffer, vb);
|
||||
unsigned long flags;
|
||||
|
||||
dev_dbg(&icd->dev, "%s (vb=0x%p) 0x%08lx %d\n", __func__,
|
||||
vb, vb->baddr, vb->bsize);
|
||||
|
||||
spin_lock_irqsave(&pcdev->lock, flags);
|
||||
|
||||
list_add_tail(&vb->queue, &pcdev->capture);
|
||||
|
||||
vb->state = VIDEOBUF_ACTIVE;
|
||||
|
@ -264,8 +262,6 @@ static void mx1_videobuf_queue(struct videobuf_queue *vq,
|
|||
__raw_writel(temp, pcdev->base + CSICR1);
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&pcdev->lock, flags);
|
||||
}
|
||||
|
||||
static void mx1_videobuf_release(struct videobuf_queue *vq,
|
||||
|
|
|
@ -332,7 +332,10 @@ static enum pixel_fmt fourcc_to_ipu_pix(__u32 fourcc)
|
|||
}
|
||||
}
|
||||
|
||||
/* Called with .vb_lock held */
|
||||
/*
|
||||
* Called with .vb_lock mutex held and
|
||||
* under spinlock_irqsave(&mx3_cam->lock, ...)
|
||||
*/
|
||||
static void mx3_videobuf_queue(struct videobuf_queue *vq,
|
||||
struct videobuf_buffer *vb)
|
||||
{
|
||||
|
@ -346,7 +349,8 @@ static void mx3_videobuf_queue(struct videobuf_queue *vq,
|
|||
struct idmac_video_param *video = &ichan->params.video;
|
||||
const struct soc_camera_data_format *data_fmt = icd->current_fmt;
|
||||
dma_cookie_t cookie;
|
||||
unsigned long flags;
|
||||
|
||||
BUG_ON(!irqs_disabled());
|
||||
|
||||
/* This is the configuration of one sg-element */
|
||||
video->out_pixel_fmt = fourcc_to_ipu_pix(data_fmt->fourcc);
|
||||
|
@ -359,8 +363,6 @@ static void mx3_videobuf_queue(struct videobuf_queue *vq,
|
|||
memset((void *)vb->baddr, 0xaa, vb->bsize);
|
||||
#endif
|
||||
|
||||
spin_lock_irqsave(&mx3_cam->lock, flags);
|
||||
|
||||
list_add_tail(&vb->queue, &mx3_cam->capture);
|
||||
|
||||
if (!mx3_cam->active) {
|
||||
|
@ -370,24 +372,23 @@ static void mx3_videobuf_queue(struct videobuf_queue *vq,
|
|||
vb->state = VIDEOBUF_QUEUED;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&mx3_cam->lock, flags);
|
||||
spin_unlock_irq(&mx3_cam->lock);
|
||||
|
||||
cookie = txd->tx_submit(txd);
|
||||
dev_dbg(&icd->dev, "Submitted cookie %d DMA 0x%08x\n", cookie, sg_dma_address(&buf->sg));
|
||||
|
||||
spin_lock_irq(&mx3_cam->lock);
|
||||
|
||||
if (cookie >= 0)
|
||||
return;
|
||||
|
||||
/* Submit error */
|
||||
vb->state = VIDEOBUF_PREPARED;
|
||||
|
||||
spin_lock_irqsave(&mx3_cam->lock, flags);
|
||||
|
||||
list_del_init(&vb->queue);
|
||||
|
||||
if (mx3_cam->active == buf)
|
||||
mx3_cam->active = NULL;
|
||||
|
||||
spin_unlock_irqrestore(&mx3_cam->lock, flags);
|
||||
}
|
||||
|
||||
/* Called with .vb_lock held */
|
||||
|
|
|
@ -612,6 +612,7 @@ static void pxa_camera_stop_capture(struct pxa_camera_dev *pcdev)
|
|||
dev_dbg(pcdev->soc_host.dev, "%s\n", __func__);
|
||||
}
|
||||
|
||||
/* Called under spinlock_irqsave(&pcdev->lock, ...) */
|
||||
static void pxa_videobuf_queue(struct videobuf_queue *vq,
|
||||
struct videobuf_buffer *vb)
|
||||
{
|
||||
|
@ -619,13 +620,10 @@ static void pxa_videobuf_queue(struct videobuf_queue *vq,
|
|||
struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
|
||||
struct pxa_camera_dev *pcdev = ici->priv;
|
||||
struct pxa_buffer *buf = container_of(vb, struct pxa_buffer, vb);
|
||||
unsigned long flags;
|
||||
|
||||
dev_dbg(&icd->dev, "%s (vb=0x%p) 0x%08lx %d active=%p\n", __func__,
|
||||
vb, vb->baddr, vb->bsize, pcdev->active);
|
||||
|
||||
spin_lock_irqsave(&pcdev->lock, flags);
|
||||
|
||||
list_add_tail(&vb->queue, &pcdev->capture);
|
||||
|
||||
vb->state = VIDEOBUF_ACTIVE;
|
||||
|
@ -633,8 +631,6 @@ static void pxa_videobuf_queue(struct videobuf_queue *vq,
|
|||
|
||||
if (!pcdev->active)
|
||||
pxa_camera_start_capture(pcdev);
|
||||
|
||||
spin_unlock_irqrestore(&pcdev->lock, flags);
|
||||
}
|
||||
|
||||
static void pxa_videobuf_release(struct videobuf_queue *vq,
|
||||
|
@ -1579,6 +1575,7 @@ static int __devinit pxa_camera_probe(struct platform_device *pdev)
|
|||
pcdev->mclk = 20000000;
|
||||
}
|
||||
|
||||
pcdev->soc_host.dev = &pdev->dev;
|
||||
pcdev->mclk_divisor = mclk_get_divisor(pcdev);
|
||||
|
||||
INIT_LIST_HEAD(&pcdev->capture);
|
||||
|
@ -1644,7 +1641,6 @@ static int __devinit pxa_camera_probe(struct platform_device *pdev)
|
|||
pcdev->soc_host.drv_name = PXA_CAM_DRV_NAME;
|
||||
pcdev->soc_host.ops = &pxa_soc_camera_host_ops;
|
||||
pcdev->soc_host.priv = pcdev;
|
||||
pcdev->soc_host.dev = &pdev->dev;
|
||||
pcdev->soc_host.nr = pdev->id;
|
||||
|
||||
err = soc_camera_host_register(&pcdev->soc_host);
|
||||
|
|
|
@ -3331,8 +3331,8 @@ struct saa7134_board saa7134_boards[] = {
|
|||
.gpio = 0x0200100,
|
||||
},
|
||||
},
|
||||
[SAA7134_BOARD_HAUPPAUGE_HVR1120] = {
|
||||
.name = "Hauppauge WinTV-HVR1120 ATSC/QAM-Hybrid",
|
||||
[SAA7134_BOARD_HAUPPAUGE_HVR1150] = {
|
||||
.name = "Hauppauge WinTV-HVR1150 ATSC/QAM-Hybrid",
|
||||
.audio_clock = 0x00187de7,
|
||||
.tuner_type = TUNER_PHILIPS_TDA8290,
|
||||
.radio_type = UNSET,
|
||||
|
@ -3363,8 +3363,8 @@ struct saa7134_board saa7134_boards[] = {
|
|||
.gpio = 0x0800100, /* GPIO 23 HI for FM */
|
||||
},
|
||||
},
|
||||
[SAA7134_BOARD_HAUPPAUGE_HVR1110R3] = {
|
||||
.name = "Hauppauge WinTV-HVR1110r3 DVB-T/Hybrid",
|
||||
[SAA7134_BOARD_HAUPPAUGE_HVR1120] = {
|
||||
.name = "Hauppauge WinTV-HVR1120 DVB-T/Hybrid",
|
||||
.audio_clock = 0x00187de7,
|
||||
.tuner_type = TUNER_PHILIPS_TDA8290,
|
||||
.radio_type = UNSET,
|
||||
|
@ -5862,31 +5862,31 @@ struct pci_device_id saa7134_pci_tbl[] = {
|
|||
.device = PCI_DEVICE_ID_PHILIPS_SAA7133,
|
||||
.subvendor = 0x0070,
|
||||
.subdevice = 0x6706,
|
||||
.driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1120,
|
||||
.driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1150,
|
||||
},{
|
||||
.vendor = PCI_VENDOR_ID_PHILIPS,
|
||||
.device = PCI_DEVICE_ID_PHILIPS_SAA7133,
|
||||
.subvendor = 0x0070,
|
||||
.subdevice = 0x6707,
|
||||
.driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1110R3,
|
||||
},{
|
||||
.vendor = PCI_VENDOR_ID_PHILIPS,
|
||||
.device = PCI_DEVICE_ID_PHILIPS_SAA7133,
|
||||
.subvendor = 0x0070,
|
||||
.subdevice = 0x6708,
|
||||
.driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1120,
|
||||
},{
|
||||
.vendor = PCI_VENDOR_ID_PHILIPS,
|
||||
.device = PCI_DEVICE_ID_PHILIPS_SAA7133,
|
||||
.subvendor = 0x0070,
|
||||
.subdevice = 0x6708,
|
||||
.driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1150,
|
||||
},{
|
||||
.vendor = PCI_VENDOR_ID_PHILIPS,
|
||||
.device = PCI_DEVICE_ID_PHILIPS_SAA7133,
|
||||
.subvendor = 0x0070,
|
||||
.subdevice = 0x6709,
|
||||
.driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1110R3,
|
||||
.driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1120,
|
||||
},{
|
||||
.vendor = PCI_VENDOR_ID_PHILIPS,
|
||||
.device = PCI_DEVICE_ID_PHILIPS_SAA7133,
|
||||
.subvendor = 0x0070,
|
||||
.subdevice = 0x670a,
|
||||
.driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1110R3,
|
||||
.driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1120,
|
||||
},{
|
||||
.vendor = PCI_VENDOR_ID_PHILIPS,
|
||||
.device = PCI_DEVICE_ID_PHILIPS_SAA7133,
|
||||
|
@ -6363,8 +6363,8 @@ static int saa7134_tda8290_18271_callback(struct saa7134_dev *dev,
|
|||
switch (command) {
|
||||
case TDA18271_CALLBACK_CMD_AGC_ENABLE: /* 0 */
|
||||
switch (dev->board) {
|
||||
case SAA7134_BOARD_HAUPPAUGE_HVR1150:
|
||||
case SAA7134_BOARD_HAUPPAUGE_HVR1120:
|
||||
case SAA7134_BOARD_HAUPPAUGE_HVR1110R3:
|
||||
ret = saa7134_tda18271_hvr11x0_toggle_agc(dev, arg);
|
||||
break;
|
||||
default:
|
||||
|
@ -6384,8 +6384,8 @@ static int saa7134_tda8290_callback(struct saa7134_dev *dev,
|
|||
int ret;
|
||||
|
||||
switch (dev->board) {
|
||||
case SAA7134_BOARD_HAUPPAUGE_HVR1150:
|
||||
case SAA7134_BOARD_HAUPPAUGE_HVR1120:
|
||||
case SAA7134_BOARD_HAUPPAUGE_HVR1110R3:
|
||||
/* tda8290 + tda18271 */
|
||||
ret = saa7134_tda8290_18271_callback(dev, command, arg);
|
||||
break;
|
||||
|
@ -6427,7 +6427,7 @@ static void hauppauge_eeprom(struct saa7134_dev *dev, u8 *eeprom_data)
|
|||
switch (tv.model) {
|
||||
case 67019: /* WinTV-HVR1110 (Retail, IR Blaster, hybrid, FM, SVid/Comp, 3.5mm audio in) */
|
||||
case 67109: /* WinTV-HVR1000 (Retail, IR Receive, analog, no FM, SVid/Comp, 3.5mm audio in) */
|
||||
case 67201: /* WinTV-HVR1120 (Retail, IR Receive, hybrid, FM, SVid/Comp, 3.5mm audio in) */
|
||||
case 67201: /* WinTV-HVR1150 (Retail, IR Receive, hybrid, FM, SVid/Comp, 3.5mm audio in) */
|
||||
case 67301: /* WinTV-HVR1000 (Retail, IR Receive, analog, no FM, SVid/Comp, 3.5mm audio in) */
|
||||
case 67209: /* WinTV-HVR1110 (Retail, IR Receive, hybrid, FM, SVid/Comp, 3.5mm audio in) */
|
||||
case 67559: /* WinTV-HVR1110 (OEM, no IR, hybrid, FM, SVid/Comp, RCA aud) */
|
||||
|
@ -6435,7 +6435,7 @@ static void hauppauge_eeprom(struct saa7134_dev *dev, u8 *eeprom_data)
|
|||
case 67579: /* WinTV-HVR1110 (OEM, no IR, hybrid, no FM) */
|
||||
case 67589: /* WinTV-HVR1110 (OEM, no IR, hybrid, no FM, SVid/Comp, RCA aud) */
|
||||
case 67599: /* WinTV-HVR1110 (OEM, no IR, hybrid, no FM, SVid/Comp, RCA aud) */
|
||||
case 67651: /* WinTV-HVR1120 (OEM, no IR, hybrid, FM, SVid/Comp, RCA aud) */
|
||||
case 67651: /* WinTV-HVR1150 (OEM, no IR, hybrid, FM, SVid/Comp, RCA aud) */
|
||||
case 67659: /* WinTV-HVR1110 (OEM, no IR, hybrid, FM, SVid/Comp, RCA aud) */
|
||||
break;
|
||||
default:
|
||||
|
@ -6625,8 +6625,8 @@ int saa7134_board_init1(struct saa7134_dev *dev)
|
|||
|
||||
saa_writeb (SAA7134_PRODUCTION_TEST_MODE, 0x00);
|
||||
break;
|
||||
case SAA7134_BOARD_HAUPPAUGE_HVR1150:
|
||||
case SAA7134_BOARD_HAUPPAUGE_HVR1120:
|
||||
case SAA7134_BOARD_HAUPPAUGE_HVR1110R3:
|
||||
/* GPIO 26 high for digital, low for analog */
|
||||
saa7134_set_gpio(dev, 26, 0);
|
||||
msleep(1);
|
||||
|
@ -6891,8 +6891,8 @@ int saa7134_board_init2(struct saa7134_dev *dev)
|
|||
dev->name, saa7134_boards[dev->board].name);
|
||||
}
|
||||
break;
|
||||
case SAA7134_BOARD_HAUPPAUGE_HVR1150:
|
||||
case SAA7134_BOARD_HAUPPAUGE_HVR1120:
|
||||
case SAA7134_BOARD_HAUPPAUGE_HVR1110R3:
|
||||
hauppauge_eeprom(dev, dev->eedata+0x80);
|
||||
break;
|
||||
case SAA7134_BOARD_HAUPPAUGE_HVR1110:
|
||||
|
|
|
@ -1119,7 +1119,7 @@ static int dvb_init(struct saa7134_dev *dev)
|
|||
&tda827x_cfg_2) < 0)
|
||||
goto dettach_frontend;
|
||||
break;
|
||||
case SAA7134_BOARD_HAUPPAUGE_HVR1110R3:
|
||||
case SAA7134_BOARD_HAUPPAUGE_HVR1120:
|
||||
fe0->dvb.frontend = dvb_attach(tda10048_attach,
|
||||
&hcw_tda10048_config,
|
||||
&dev->i2c_adap);
|
||||
|
@ -1147,7 +1147,7 @@ static int dvb_init(struct saa7134_dev *dev)
|
|||
&tda827x_cfg_1) < 0)
|
||||
goto dettach_frontend;
|
||||
break;
|
||||
case SAA7134_BOARD_HAUPPAUGE_HVR1120:
|
||||
case SAA7134_BOARD_HAUPPAUGE_HVR1150:
|
||||
fe0->dvb.frontend = dvb_attach(lgdt3305_attach,
|
||||
&hcw_lgdt3305_config,
|
||||
&dev->i2c_adap);
|
||||
|
|
|
@ -278,8 +278,8 @@ struct saa7134_format {
|
|||
#define SAA7134_BOARD_ASUSTeK_TIGER 152
|
||||
#define SAA7134_BOARD_KWORLD_PLUS_TV_ANALOG 153
|
||||
#define SAA7134_BOARD_AVERMEDIA_GO_007_FM_PLUS 154
|
||||
#define SAA7134_BOARD_HAUPPAUGE_HVR1120 155
|
||||
#define SAA7134_BOARD_HAUPPAUGE_HVR1110R3 156
|
||||
#define SAA7134_BOARD_HAUPPAUGE_HVR1150 155
|
||||
#define SAA7134_BOARD_HAUPPAUGE_HVR1120 156
|
||||
#define SAA7134_BOARD_AVERMEDIA_STUDIO_507UA 157
|
||||
#define SAA7134_BOARD_AVERMEDIA_CARDBUS_501 158
|
||||
#define SAA7134_BOARD_BEHOLD_505RDS 159
|
||||
|
|
|
@ -282,27 +282,24 @@ out:
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* Called under spinlock_irqsave(&pcdev->lock, ...) */
|
||||
static void sh_mobile_ceu_videobuf_queue(struct videobuf_queue *vq,
|
||||
struct videobuf_buffer *vb)
|
||||
{
|
||||
struct soc_camera_device *icd = vq->priv_data;
|
||||
struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
|
||||
struct sh_mobile_ceu_dev *pcdev = ici->priv;
|
||||
unsigned long flags;
|
||||
|
||||
dev_dbg(&icd->dev, "%s (vb=0x%p) 0x%08lx %zd\n", __func__,
|
||||
vb, vb->baddr, vb->bsize);
|
||||
|
||||
vb->state = VIDEOBUF_QUEUED;
|
||||
spin_lock_irqsave(&pcdev->lock, flags);
|
||||
list_add_tail(&vb->queue, &pcdev->capture);
|
||||
|
||||
if (!pcdev->active) {
|
||||
pcdev->active = vb;
|
||||
sh_mobile_ceu_capture(pcdev);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&pcdev->lock, flags);
|
||||
}
|
||||
|
||||
static void sh_mobile_ceu_videobuf_release(struct videobuf_queue *vq,
|
||||
|
|
|
@ -1050,8 +1050,8 @@ static int stk_setup_format(struct stk_camera *dev)
|
|||
depth = 1;
|
||||
else
|
||||
depth = 2;
|
||||
while (stk_sizes[i].m != dev->vsettings.mode
|
||||
&& i < ARRAY_SIZE(stk_sizes))
|
||||
while (i < ARRAY_SIZE(stk_sizes) &&
|
||||
stk_sizes[i].m != dev->vsettings.mode)
|
||||
i++;
|
||||
if (i == ARRAY_SIZE(stk_sizes)) {
|
||||
STK_ERROR("Something is broken in %s\n", __func__);
|
||||
|
|
|
@ -1845,11 +1845,29 @@ static struct usb_device_id uvc_ids[] = {
|
|||
.bInterfaceSubClass = 1,
|
||||
.bInterfaceProtocol = 0,
|
||||
.driver_info = UVC_QUIRK_STREAM_NO_FID },
|
||||
/* ViMicro */
|
||||
{ .match_flags = USB_DEVICE_ID_MATCH_VENDOR
|
||||
/* ViMicro Vega */
|
||||
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
||||
| USB_DEVICE_ID_MATCH_INT_INFO,
|
||||
.idVendor = 0x0ac8,
|
||||
.idProduct = 0x0000,
|
||||
.idProduct = 0x332d,
|
||||
.bInterfaceClass = USB_CLASS_VIDEO,
|
||||
.bInterfaceSubClass = 1,
|
||||
.bInterfaceProtocol = 0,
|
||||
.driver_info = UVC_QUIRK_FIX_BANDWIDTH },
|
||||
/* ViMicro - Minoru3D */
|
||||
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
||||
| USB_DEVICE_ID_MATCH_INT_INFO,
|
||||
.idVendor = 0x0ac8,
|
||||
.idProduct = 0x3410,
|
||||
.bInterfaceClass = USB_CLASS_VIDEO,
|
||||
.bInterfaceSubClass = 1,
|
||||
.bInterfaceProtocol = 0,
|
||||
.driver_info = UVC_QUIRK_FIX_BANDWIDTH },
|
||||
/* ViMicro Venus - Minoru3D */
|
||||
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
||||
| USB_DEVICE_ID_MATCH_INT_INFO,
|
||||
.idVendor = 0x0ac8,
|
||||
.idProduct = 0x3420,
|
||||
.bInterfaceClass = USB_CLASS_VIDEO,
|
||||
.bInterfaceSubClass = 1,
|
||||
.bInterfaceProtocol = 0,
|
||||
|
|
|
@ -145,8 +145,8 @@ static void uvc_status_complete(struct urb *urb)
|
|||
break;
|
||||
|
||||
default:
|
||||
uvc_printk(KERN_INFO, "unknown event type %u.\n",
|
||||
dev->status[0]);
|
||||
uvc_trace(UVC_TRACE_STATUS, "Unknown status event "
|
||||
"type %u.\n", dev->status[0]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1081,8 +1081,10 @@ static long __video_do_ioctl(struct file *file,
|
|||
/* Calls the specific handler */
|
||||
if (ops->vidioc_g_std)
|
||||
ret = ops->vidioc_g_std(file, fh, id);
|
||||
else
|
||||
else if (vfd->current_norm)
|
||||
*id = vfd->current_norm;
|
||||
else
|
||||
ret = -EINVAL;
|
||||
|
||||
if (!ret)
|
||||
dbgarg(cmd, "std=0x%08Lx\n", (long long unsigned)*id);
|
||||
|
@ -1553,12 +1555,19 @@ static long __video_do_ioctl(struct file *file,
|
|||
break;
|
||||
ret = ops->vidioc_g_parm(file, fh, p);
|
||||
} else {
|
||||
v4l2_std_id std = vfd->current_norm;
|
||||
|
||||
if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
||||
return -EINVAL;
|
||||
|
||||
v4l2_video_std_frame_period(vfd->current_norm,
|
||||
&p->parm.capture.timeperframe);
|
||||
ret = 0;
|
||||
if (ops->vidioc_g_std)
|
||||
ret = ops->vidioc_g_std(file, fh, &std);
|
||||
else if (std == 0)
|
||||
ret = -EINVAL;
|
||||
if (ret == 0)
|
||||
v4l2_video_std_frame_period(std,
|
||||
&p->parm.capture.timeperframe);
|
||||
}
|
||||
|
||||
dbgarg(cmd, "type=%d\n", p->type);
|
||||
|
|
Загрузка…
Ссылка в новой задаче