Commit 15f64864 authored by Jean-Francois Moine's avatar Jean-Francois Moine Committed by Mauro Carvalho Chehab

V4L/DVB (10046): gspca - ov534: Use the gspca usb buf for usb control messages.

Signed-off-by: default avatarJean-Francois Moine <moinejf@free.fr>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent f367b85d
...@@ -63,65 +63,66 @@ static struct v4l2_pix_format vga_mode[] = { ...@@ -63,65 +63,66 @@ static struct v4l2_pix_format vga_mode[] = {
.priv = 0}, .priv = 0},
}; };
static void ov534_reg_write(struct usb_device *udev, u16 reg, u8 val) static void ov534_reg_write(struct gspca_dev *gspca_dev, u16 reg, u8 val)
{ {
u8 data = val; struct usb_device *udev = gspca_dev->dev;
int ret; int ret;
PDEBUG(D_USBO, "reg=0x%04x, val=0%02x", reg, val); PDEBUG(D_USBO, "reg=0x%04x, val=0%02x", reg, val);
gspca_dev->usb_buf[0] = val;
ret = usb_control_msg(udev, ret = usb_control_msg(udev,
usb_sndctrlpipe(udev, 0), usb_sndctrlpipe(udev, 0),
0x1, 0x1,
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
0x0, reg, &data, 1, CTRL_TIMEOUT); 0x0, reg, gspca_dev->usb_buf, 1, CTRL_TIMEOUT);
if (ret < 0) if (ret < 0)
PDEBUG(D_ERR, "write failed"); PDEBUG(D_ERR, "write failed");
} }
static u8 ov534_reg_read(struct usb_device *udev, u16 reg) static u8 ov534_reg_read(struct gspca_dev *gspca_dev, u16 reg)
{ {
u8 data; struct usb_device *udev = gspca_dev->dev;
int ret; int ret;
ret = usb_control_msg(udev, ret = usb_control_msg(udev,
usb_rcvctrlpipe(udev, 0), usb_rcvctrlpipe(udev, 0),
0x1, 0x1,
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
0x0, reg, &data, 1, CTRL_TIMEOUT); 0x0, reg, gspca_dev->usb_buf, 1, CTRL_TIMEOUT);
PDEBUG(D_USBI, "reg=0x%04x, data=0x%02x", reg, data); PDEBUG(D_USBI, "reg=0x%04x, data=0x%02x", reg, gspca_dev->usb_buf[0]);
if (ret < 0) if (ret < 0)
PDEBUG(D_ERR, "read failed"); PDEBUG(D_ERR, "read failed");
return data; return gspca_dev->usb_buf[0];
} }
/* Two bits control LED: 0x21 bit 7 and 0x23 bit 7. /* Two bits control LED: 0x21 bit 7 and 0x23 bit 7.
* (direction and output)? */ * (direction and output)? */
static void ov534_set_led(struct usb_device *udev, int status) static void ov534_set_led(struct gspca_dev *gspca_dev, int status)
{ {
u8 data; u8 data;
PDEBUG(D_CONF, "led status: %d", status); PDEBUG(D_CONF, "led status: %d", status);
data = ov534_reg_read(udev, 0x21); data = ov534_reg_read(gspca_dev, 0x21);
data |= 0x80; data |= 0x80;
ov534_reg_write(udev, 0x21, data); ov534_reg_write(gspca_dev, 0x21, data);
data = ov534_reg_read(udev, 0x23); data = ov534_reg_read(gspca_dev, 0x23);
if (status) if (status)
data |= 0x80; data |= 0x80;
else else
data &= ~(0x80); data &= ~(0x80);
ov534_reg_write(udev, 0x23, data); ov534_reg_write(gspca_dev, 0x23, data);
} }
static int sccb_check_status(struct usb_device *udev) static int sccb_check_status(struct gspca_dev *gspca_dev)
{ {
u8 data; u8 data;
int i; int i;
for (i = 0; i < 5; i++) { for (i = 0; i < 5; i++) {
data = ov534_reg_read(udev, OV534_REG_STATUS); data = ov534_reg_read(gspca_dev, OV534_REG_STATUS);
switch (data) { switch (data) {
case 0x00: case 0x00:
...@@ -138,30 +139,30 @@ static int sccb_check_status(struct usb_device *udev) ...@@ -138,30 +139,30 @@ static int sccb_check_status(struct usb_device *udev)
return 0; return 0;
} }
static void sccb_reg_write(struct usb_device *udev, u16 reg, u8 val) static void sccb_reg_write(struct gspca_dev *gspca_dev, u16 reg, u8 val)
{ {
PDEBUG(D_USBO, "reg: 0x%04x, val: 0x%02x", reg, val); PDEBUG(D_USBO, "reg: 0x%04x, val: 0x%02x", reg, val);
ov534_reg_write(udev, OV534_REG_SUBADDR, reg); ov534_reg_write(gspca_dev, OV534_REG_SUBADDR, reg);
ov534_reg_write(udev, OV534_REG_WRITE, val); ov534_reg_write(gspca_dev, OV534_REG_WRITE, val);
ov534_reg_write(udev, OV534_REG_OPERATION, OV534_OP_WRITE_3); ov534_reg_write(gspca_dev, OV534_REG_OPERATION, OV534_OP_WRITE_3);
if (!sccb_check_status(udev)) if (!sccb_check_status(gspca_dev))
PDEBUG(D_ERR, "sccb_reg_write failed"); PDEBUG(D_ERR, "sccb_reg_write failed");
} }
#ifdef GSPCA_DEBUG #ifdef GSPCA_DEBUG
static u8 sccb_reg_read(struct usb_device *udev, u16 reg) static u8 sccb_reg_read(struct gspca_dev *gspca_dev, u16 reg)
{ {
ov534_reg_write(udev, OV534_REG_SUBADDR, reg); ov534_reg_write(gspca_dev, OV534_REG_SUBADDR, reg);
ov534_reg_write(udev, OV534_REG_OPERATION, OV534_OP_WRITE_2); ov534_reg_write(gspca_dev, OV534_REG_OPERATION, OV534_OP_WRITE_2);
if (!sccb_check_status(udev)) if (!sccb_check_status(gspca_dev))
PDEBUG(D_ERR, "sccb_reg_read failed 1"); PDEBUG(D_ERR, "sccb_reg_read failed 1");
ov534_reg_write(udev, OV534_REG_OPERATION, OV534_OP_READ_2); ov534_reg_write(gspca_dev, OV534_REG_OPERATION, OV534_OP_READ_2);
if (!sccb_check_status(udev)) if (!sccb_check_status(gspca_dev))
PDEBUG(D_ERR, "sccb_reg_read failed 2"); PDEBUG(D_ERR, "sccb_reg_read failed 2");
return ov534_reg_read(udev, OV534_REG_READ); return ov534_reg_read(gspca_dev, OV534_REG_READ);
} }
#endif #endif
...@@ -318,26 +319,26 @@ static void ov534_set_frame_rate(struct gspca_dev *gspca_dev) ...@@ -318,26 +319,26 @@ static void ov534_set_frame_rate(struct gspca_dev *gspca_dev)
switch (fr) { switch (fr) {
case 50: case 50:
sccb_reg_write(gspca_dev->dev, 0x11, 0x01); sccb_reg_write(gspca_dev, 0x11, 0x01);
sccb_reg_write(gspca_dev->dev, 0x0d, 0x41); sccb_reg_write(gspca_dev, 0x0d, 0x41);
ov534_reg_write(gspca_dev->dev, 0xe5, 0x02); ov534_reg_write(gspca_dev, 0xe5, 0x02);
break; break;
case 40: case 40:
sccb_reg_write(gspca_dev->dev, 0x11, 0x02); sccb_reg_write(gspca_dev, 0x11, 0x02);
sccb_reg_write(gspca_dev->dev, 0x0d, 0xc1); sccb_reg_write(gspca_dev, 0x0d, 0xc1);
ov534_reg_write(gspca_dev->dev, 0xe5, 0x04); ov534_reg_write(gspca_dev, 0xe5, 0x04);
break; break;
/* case 30: */ /* case 30: */
default: default:
fr = 30; fr = 30;
sccb_reg_write(gspca_dev->dev, 0x11, 0x04); sccb_reg_write(gspca_dev, 0x11, 0x04);
sccb_reg_write(gspca_dev->dev, 0x0d, 0x81); sccb_reg_write(gspca_dev, 0x0d, 0x81);
ov534_reg_write(gspca_dev->dev, 0xe5, 0x02); ov534_reg_write(gspca_dev, 0xe5, 0x02);
break; break;
case 15: case 15:
sccb_reg_write(gspca_dev->dev, 0x11, 0x03); sccb_reg_write(gspca_dev, 0x11, 0x03);
sccb_reg_write(gspca_dev->dev, 0x0d, 0x41); sccb_reg_write(gspca_dev, 0x0d, 0x41);
ov534_reg_write(gspca_dev->dev, 0xe5, 0x04); ov534_reg_write(gspca_dev, 0xe5, 0x04);
break; break;
} }
...@@ -346,27 +347,28 @@ static void ov534_set_frame_rate(struct gspca_dev *gspca_dev) ...@@ -346,27 +347,28 @@ static void ov534_set_frame_rate(struct gspca_dev *gspca_dev)
} }
/* setup method */ /* setup method */
static void ov534_setup(struct usb_device *udev) static void ov534_setup(struct gspca_dev *gspca_dev)
{ {
int i; int i;
/* Initialize bridge chip */ /* Initialize bridge chip */
for (i = 0; i < ARRAY_SIZE(ov534_reg_initdata); i++) for (i = 0; i < ARRAY_SIZE(ov534_reg_initdata); i++)
ov534_reg_write(udev, ov534_reg_initdata[i][0], ov534_reg_write(gspca_dev, ov534_reg_initdata[i][0],
ov534_reg_initdata[i][1]); ov534_reg_initdata[i][1]);
PDEBUG(D_PROBE, "sensor is ov%02x%02x", PDEBUG(D_PROBE, "sensor is ov%02x%02x",
sccb_reg_read(udev, 0x0a), sccb_reg_read(udev, 0x0b)); sccb_reg_read(gspca_dev, 0x0a),
sccb_reg_read(gspca_dev, 0x0b));
ov534_set_led(udev, 1); ov534_set_led(gspca_dev, 1);
/* Initialize sensor */ /* Initialize sensor */
for (i = 0; i < ARRAY_SIZE(ov772x_reg_initdata); i++) for (i = 0; i < ARRAY_SIZE(ov772x_reg_initdata); i++)
sccb_reg_write(udev, ov772x_reg_initdata[i][0], sccb_reg_write(gspca_dev, ov772x_reg_initdata[i][0],
ov772x_reg_initdata[i][1]); ov772x_reg_initdata[i][1]);
ov534_reg_write(udev, 0xe0, 0x09); ov534_reg_write(gspca_dev, 0xe0, 0x09);
ov534_set_led(udev, 0); ov534_set_led(gspca_dev, 0);
} }
/* this function is called at probe time */ /* this function is called at probe time */
...@@ -390,7 +392,7 @@ static int sd_config(struct gspca_dev *gspca_dev, ...@@ -390,7 +392,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
/* this function is called at probe and resume time */ /* this function is called at probe and resume time */
static int sd_init(struct gspca_dev *gspca_dev) static int sd_init(struct gspca_dev *gspca_dev)
{ {
ov534_setup(gspca_dev->dev); ov534_setup(gspca_dev);
ov534_set_frame_rate(gspca_dev); ov534_set_frame_rate(gspca_dev);
return 0; return 0;
...@@ -399,8 +401,8 @@ static int sd_init(struct gspca_dev *gspca_dev) ...@@ -399,8 +401,8 @@ static int sd_init(struct gspca_dev *gspca_dev)
static int sd_start(struct gspca_dev *gspca_dev) static int sd_start(struct gspca_dev *gspca_dev)
{ {
/* start streaming data */ /* start streaming data */
ov534_set_led(gspca_dev->dev, 1); ov534_set_led(gspca_dev, 1);
ov534_reg_write(gspca_dev->dev, 0xe0, 0x00); ov534_reg_write(gspca_dev, 0xe0, 0x00);
return 0; return 0;
} }
...@@ -408,8 +410,8 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -408,8 +410,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
static void sd_stopN(struct gspca_dev *gspca_dev) static void sd_stopN(struct gspca_dev *gspca_dev)
{ {
/* stop streaming data */ /* stop streaming data */
ov534_reg_write(gspca_dev->dev, 0xe0, 0x09); ov534_reg_write(gspca_dev, 0xe0, 0x09);
ov534_set_led(gspca_dev->dev, 0); ov534_set_led(gspca_dev, 0);
} }
/* Values for bmHeaderInfo (Video and Still Image Payload Headers, 2.4.3.3) */ /* Values for bmHeaderInfo (Video and Still Image Payload Headers, 2.4.3.3) */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment