summaryrefslogtreecommitdiff
path: root/linux/drivers/media/video/gspca/vc032x.c
diff options
context:
space:
mode:
Diffstat (limited to 'linux/drivers/media/video/gspca/vc032x.c')
-rw-r--r--linux/drivers/media/video/gspca/vc032x.c129
1 files changed, 56 insertions, 73 deletions
diff --git a/linux/drivers/media/video/gspca/vc032x.c b/linux/drivers/media/video/gspca/vc032x.c
index 1129cbeb8..c811379c7 100644
--- a/linux/drivers/media/video/gspca/vc032x.c
+++ b/linux/drivers/media/video/gspca/vc032x.c
@@ -24,9 +24,6 @@
#include "gspca.h"
-#define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 5)
-static const char version[] = "2.1.5";
-
MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>");
MODULE_DESCRIPTION("GSPCA/VC032X USB Camera Driver");
MODULE_LICENSE("GPL");
@@ -58,7 +55,6 @@ static int sd_setfreq(struct gspca_dev *gspca_dev, __s32 val);
static int sd_getfreq(struct gspca_dev *gspca_dev, __s32 *val);
static struct ctrl sd_ctrls[] = {
-#define SD_AUTOGAIN 0
{
{
.id = V4L2_CID_AUTOGAIN,
@@ -67,20 +63,22 @@ static struct ctrl sd_ctrls[] = {
.minimum = 0,
.maximum = 1,
.step = 1,
- .default_value = 1,
+#define AUTOGAIN_DEF 1
+ .default_value = AUTOGAIN_DEF,
},
.set = sd_setautogain,
.get = sd_getautogain,
},
-#define SD_FREQ 1
{
{
.id = V4L2_CID_POWER_LINE_FREQUENCY,
.type = V4L2_CTRL_TYPE_MENU,
.name = "Light frequency filter",
.minimum = 0,
- .maximum = 2, /* 0: 0, 1: 50Hz, 2:60Hz */
+ .maximum = 2, /* 0: No, 1: 50Hz, 2:60Hz */
.step = 1,
+#define FREQ_DEF 1
+ .default_value = FREQ_DEF,
.default_value = 1,
},
.set = sd_setfreq,
@@ -89,12 +87,12 @@ static struct ctrl sd_ctrls[] = {
};
static struct v4l2_pix_format vc0321_mode[] = {
- {320, 240, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE,
+ {320, 240, V4L2_PIX_FMT_YUV420, V4L2_FIELD_NONE,
.bytesperline = 320 * 2,
.sizeimage = 320 * 240 * 2,
.colorspace = V4L2_COLORSPACE_SRGB,
.priv = 1},
- {640, 480, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE,
+ {640, 480, V4L2_PIX_FMT_YUV420, V4L2_FIELD_NONE,
.bytesperline = 640 * 2,
.sizeimage = 640 * 480 * 2,
.colorspace = V4L2_COLORSPACE_SRGB,
@@ -933,14 +931,14 @@ static const __u8 ov7660_initQVGA_data[][4] = {
{0xb8, 0x8f, 0xff, 0xcc}, /* ff */
{0x00, 0x29, 0x3c, 0xaa},
{0xb3, 0x01, 0x45, 0xcc}, /* 45 */
- {0x00, 0x00, 0x00, 0x00}
+ {}
};
static const __u8 ov7660_50HZ[][4] = {
{0x00, 0x3b, 0x08, 0xaa},
{0x00, 0x9d, 0x40, 0xaa},
{0x00, 0x13, 0xa7, 0xaa},
- {0x00, 0x00, 0x00, 0x00}
+ {}
};
static const __u8 ov7660_60HZ[][4] = {
@@ -1406,17 +1404,18 @@ static const struct sensor_info sensor_info_data[] = {
{SENSOR_MI1310_SOC, 0x80 | 0x5d, 0x00, 0x143a, 0x24, 0x25, 0x01},
};
-static void reg_r(struct usb_device *dev,
- __u16 req,
- __u16 index,
- __u8 *buffer, __u16 length)
+/* read 'len' bytes in gspca_dev->usb_buf */
+static void reg_r(struct gspca_dev *gspca_dev,
+ __u16 req,
+ __u16 index,
+ __u16 len)
{
- usb_control_msg(dev,
- usb_rcvctrlpipe(dev, 0),
+ usb_control_msg(gspca_dev->dev,
+ usb_rcvctrlpipe(gspca_dev->dev, 0),
req,
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
1, /* value */
- index, buffer, length,
+ index, gspca_dev->usb_buf, len,
500);
}
@@ -1433,55 +1432,55 @@ static void reg_w(struct usb_device *dev,
500);
}
-static void vc032x_read_sensor_register(struct usb_device *dev,
+static void read_sensor_register(struct gspca_dev *gspca_dev,
__u16 address, __u16 *value)
{
+ struct usb_device *dev = gspca_dev->dev;
__u8 ldata, mdata, hdata;
- __u8 tmpvalue = 0;
int retry = 50;
- ldata = 0;
- mdata = 0;
- hdata = 0;
+
*value = 0;
- reg_r(dev, 0xa1, 0xb33f, &tmpvalue, 1);
+ reg_r(gspca_dev, 0xa1, 0xb33f, 1);
/*PDEBUG(D_PROBE, " I2c Bus Busy Wait 0x%02X ", tmpvalue); */
- if (!(tmpvalue & 0x02)) {
- PDEBUG(D_ERR, "I2c Bus Busy Wait %d", tmpvalue & 0x02);
+ if (!(gspca_dev->usb_buf[0] & 0x02)) {
+ PDEBUG(D_ERR, "I2c Bus Busy Wait %d",
+ gspca_dev->usb_buf[0] & 0x02);
return;
}
reg_w(dev, 0xa0, address, 0xb33a);
reg_w(dev, 0xa0, 0x02, 0xb339);
- tmpvalue = 0;
- reg_r(dev, 0xa1, 0xb33b, &tmpvalue, 1);
- while (retry-- && tmpvalue) {
- reg_r(dev, 0xa1, 0xb33b, &tmpvalue, 1);
+ reg_r(gspca_dev, 0xa1, 0xb33b, 1);
+ while (retry-- && gspca_dev->usb_buf[0]) {
+ reg_r(gspca_dev, 0xa1, 0xb33b, 1);
/* PDEBUG(D_PROBE, "Read again 0xb33b %d", tmpvalue); */
msleep(1);
}
- reg_r(dev, 0xa1, 0xb33e, &hdata, 1);
- reg_r(dev, 0xa1, 0xb33d, &mdata, 1);
- reg_r(dev, 0xa1, 0xb33c, &ldata, 1);
+ reg_r(gspca_dev, 0xa1, 0xb33e, 1);
+ hdata = gspca_dev->usb_buf[0];
+ reg_r(gspca_dev, 0xa1, 0xb33d, 1);
+ mdata = gspca_dev->usb_buf[0];
+ reg_r(gspca_dev, 0xa1, 0xb33c, 1);
+ ldata = gspca_dev->usb_buf[0];
PDEBUG(D_PROBE, "Read Sensor h (0x%02X) m (0x%02X) l (0x%02X)",
hdata, mdata, ldata);
- tmpvalue = 0;
- reg_r(dev, 0xa1, 0xb334, &tmpvalue, 1);
- if (tmpvalue == 0x02)
+ reg_r(gspca_dev, 0xa1, 0xb334, 1);
+ if (gspca_dev->usb_buf[0] == 0x02)
*value = (ldata << 8) + mdata;
else
*value = ldata;
}
+
static int vc032x_probe_sensor(struct gspca_dev *gspca_dev)
{
struct usb_device *dev = gspca_dev->dev;
int i;
- __u8 data;
__u16 value;
const struct sensor_info *ptsensor_info;
- reg_r(dev, 0xa1, 0xbfcf, &data, 1);
- PDEBUG(D_PROBE, "check sensor header %d", data);
+ reg_r(gspca_dev, 0xa1, 0xbfcf, 1);
+ PDEBUG(D_PROBE, "check sensor header %d", gspca_dev->usb_buf[0]);
for (i = 0; i < ARRAY_SIZE(sensor_info_data); i++) {
ptsensor_info = &sensor_info_data[i];
reg_w(dev, 0xa0, 0x02, 0xb334);
@@ -1494,7 +1493,7 @@ static int vc032x_probe_sensor(struct gspca_dev *gspca_dev)
"check sensor VC032X -> %d Add -> ox%02X!",
i, ptsensor_info->I2cAdd); */
reg_w(dev, 0xa0, ptsensor_info->op, 0xb301);
- vc032x_read_sensor_register(dev, ptsensor_info->IdAdd, &value);
+ read_sensor_register(gspca_dev, ptsensor_info->IdAdd, &value);
if (value == ptsensor_info->VpId) {
/* PDEBUG(D_PROBE, "find sensor VC032X -> ox%04X!",
ptsensor_info->VpId); */
@@ -1504,14 +1503,14 @@ static int vc032x_probe_sensor(struct gspca_dev *gspca_dev)
return -1;
}
-static __u8 i2c_write(struct usb_device *dev,
+static __u8 i2c_write(struct gspca_dev *gspca_dev,
__u8 reg, const __u8 *val, __u8 size)
{
- __u8 retbyte;
+ struct usb_device *dev = gspca_dev->dev;
if (size > 3 || size < 1)
return -EINVAL;
- reg_r(dev, 0xa1, 0xb33f, &retbyte, 1);
+ reg_r(gspca_dev, 0xa1, 0xb33f, 1);
reg_w(dev, 0xa0, size, 0xb334);
reg_w(dev, 0xa0, reg, 0xb33a);
switch (size) {
@@ -1532,8 +1531,8 @@ static __u8 i2c_write(struct usb_device *dev,
return -EINVAL;
}
reg_w(dev, 0xa0, 0x01, 0xb339);
- reg_r(dev, 0xa1, 0xb33b, &retbyte, 1);
- return retbyte == 0;
+ reg_r(gspca_dev, 0xa1, 0xb33b, 1);
+ return gspca_dev->usb_buf[0] == 0;
}
static void put_tab_to_reg(struct gspca_dev *gspca_dev,
@@ -1561,10 +1560,10 @@ static void usb_exchange(struct gspca_dev *gspca_dev,
((data[i][0])<<8) | data[i][1]);
break;
case 0xaa: /* i2c op */
- i2c_write(dev, data[i][1], &data[i][2], 1);
+ i2c_write(gspca_dev, data[i][1], &data[i][2], 1);
break;
case 0xbb: /* i2c op */
- i2c_write(dev, data[i][0], &data[i][1], 2);
+ i2c_write(gspca_dev, data[i][0], &data[i][1], 2);
break;
case 0xdd:
msleep(data[i][2] + 10);
@@ -1596,30 +1595,14 @@ static int sd_config(struct gspca_dev *gspca_dev,
struct sd *sd = (struct sd *) gspca_dev;
struct usb_device *dev = gspca_dev->dev;
struct cam *cam;
- __u8 tmp2[4];
int sensor;
- __u16 vendor;
__u16 product;
- vendor = id->idVendor;
product = id->idProduct;
- switch (vendor) {
- case 0x046d: /* Logitech Labtec */
-/* switch (product) { */
-/* case 0x0892: */
-/* case 0x0896: */
- sd->bridge = BRIDGE_VC0321;
-/* break; */
-/* } */
- break;
+ sd->bridge = BRIDGE_VC0321;
+ switch (id->idVendor) {
case 0x0ac8: /* Vimicro z-star */
switch (product) {
- case 0x0321:
- case 0x0328:
- case 0xc001:
- case 0xc002:
- sd->bridge = BRIDGE_VC0321;
- break;
case 0x0323:
sd->bridge = BRIDGE_VC0323;
break;
@@ -1639,10 +1622,10 @@ static int sd_config(struct gspca_dev *gspca_dev,
cam->epaddr = 0x02;
if (sd->bridge == BRIDGE_VC0321) {
cam->cam_mode = vc0321_mode;
- cam->nmodes = sizeof vc0321_mode / sizeof vc0321_mode[0];
+ cam->nmodes = ARRAY_SIZE(vc0321_mode);
} else {
cam->cam_mode = vc0323_mode;
- cam->nmodes = sizeof vc0323_mode / sizeof vc0323_mode[0];
+ cam->nmodes = ARRAY_SIZE(vc0323_mode);
}
vc0321_reset(gspca_dev);
@@ -1678,13 +1661,14 @@ static int sd_config(struct gspca_dev *gspca_dev,
}
sd->qindex = 7;
- sd->autogain = sd_ctrls[SD_AUTOGAIN].qctrl.default_value;
+ sd->autogain = AUTOGAIN_DEF;
+ sd->lightfreq = FREQ_DEF;
if (sd->bridge == BRIDGE_VC0321) {
- reg_r(dev, 0x8a, 0, tmp2, 3);
+ reg_r(gspca_dev, 0x8a, 0, 3);
reg_w(dev, 0x87, 0x00, 0x0f0f);
- reg_r(dev, 0x8b, 0, tmp2, 3);
+ reg_r(gspca_dev, 0x8b, 0, 3);
reg_w(dev, 0x88, 0x00, 0x0202);
}
return 0;
@@ -1735,7 +1719,6 @@ static void setlightfreq(struct gspca_dev *gspca_dev)
static void sd_start(struct gspca_dev *gspca_dev)
{
struct sd *sd = (struct sd *) gspca_dev;
-/* __u8 tmp2; */
const __u8 *GammaT = NULL;
const __u8 *MatrixT = NULL;
int mode;
@@ -1837,7 +1820,7 @@ static void sd_start(struct gspca_dev *gspca_dev)
reg_w(gspca_dev->dev, 0xa0, 0x40, 0xb824);
*/
/* Only works for HV7131R ??
- reg_r (gspca_dev->dev, 0xa1, 0xb881, &tmp2, 1);
+ reg_r (gspca_dev, 0xa1, 0xb881, 1);
reg_w(gspca_dev->dev, 0xa0, 0xfe01, 0xb881);
reg_w(gspca_dev->dev, 0xa0, 0x79, 0xb801);
*/
@@ -2016,7 +1999,7 @@ static int __init sd_mod_init(void)
{
if (usb_register(&sd_driver) < 0)
return -1;
- PDEBUG(D_PROBE, "v%s registered", version);
+ PDEBUG(D_PROBE, "registered");
return 0;
}
static void __exit sd_mod_exit(void)