Commit 49796e40 authored by Jean-Francois Moine's avatar Jean-Francois Moine Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (10432): gspca - vc032x: Cleanup source, optimize and check i2c_write.

parent 8d538699
Loading
Loading
Loading
Loading
+37 −56
Original line number Diff line number Diff line
@@ -1927,44 +1927,40 @@ static void reg_w(struct usb_device *dev,
			500);
}

static void read_sensor_register(struct gspca_dev *gspca_dev,
				__u16 address, __u16 *value)
static u16 read_sensor_register(struct gspca_dev *gspca_dev,
				u16 address)
{
	struct usb_device *dev = gspca_dev->dev;
	__u8 ldata, mdata, hdata;
	int retry = 50;

	*value = 0;

	reg_r(gspca_dev, 0xa1, 0xb33f, 1);
	/*PDEBUG(D_PROBE, " I2c Bus Busy Wait  0x%02X ", tmpvalue); */
	if (!(gspca_dev->usb_buf[0] & 0x02)) {
		PDEBUG(D_ERR, "I2c Bus Busy Wait %d",
			gspca_dev->usb_buf[0] & 0x02);
		return;
		PDEBUG(D_ERR, "I2c Bus Busy Wait %02x",
			gspca_dev->usb_buf[0]);
		return 0;
	}
	reg_w(dev, 0xa0, address, 0xb33a);
	reg_w(dev, 0xa0, 0x02, 0xb339);

	do {
		msleep(8);
		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);
	}
	} while (retry-- && gspca_dev->usb_buf[0]);

	reg_r(gspca_dev, 0xa1, 0xb33e, 1);
	ldata = 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);
	hdata = gspca_dev->usb_buf[0];
	if (hdata != 0 && mdata != 0 && ldata != 0)
		PDEBUG(D_PROBE, "Read Sensor %02x%02x %02x",
			hdata, mdata, ldata);
	reg_r(gspca_dev, 0xa1, 0xb334, 1);
	if (gspca_dev->usb_buf[0] == 0x02)
		*value = (hdata << 8) + mdata;
	else
		*value = hdata;
		return (hdata << 8) + mdata;
	return hdata;
}

static int vc032x_probe_sensor(struct gspca_dev *gspca_dev)
@@ -1985,7 +1981,7 @@ static int vc032x_probe_sensor(struct gspca_dev *gspca_dev)
		reg_w(dev, 0xa0, 0x0c, 0xb309);
		reg_w(dev, 0xa0, ptsensor_info->I2cAdd, 0xb335);
		reg_w(dev, 0xa0, ptsensor_info->op, 0xb301);
		read_sensor_register(gspca_dev, ptsensor_info->IdAdd, &value);
		value = read_sensor_register(gspca_dev, ptsensor_info->IdAdd);
		if (value == ptsensor_info->VpId)
			return ptsensor_info->sensorId;

@@ -1997,13 +1993,16 @@ static int vc032x_probe_sensor(struct gspca_dev *gspca_dev)
	return -1;
}

static __u8 i2c_write(struct gspca_dev *gspca_dev,
static void i2c_write(struct gspca_dev *gspca_dev,
			__u8 reg, const __u8 *val, __u8 size)
{
	struct usb_device *dev = gspca_dev->dev;
	int retry;

#ifdef GSPCA_DEBUG
	if (size > 3 || size < 1)
		return -EINVAL;
		return;
#endif
	reg_r(gspca_dev, 0xa1, 0xb33f, 1);
	reg_w(dev, 0xa0, size, 0xb334);
	reg_w(dev, 0xa0, reg, 0xb33a);
@@ -2015,18 +2014,23 @@ static __u8 i2c_write(struct gspca_dev *gspca_dev,
		reg_w(dev, 0xa0, val[0], 0xb336);
		reg_w(dev, 0xa0, val[1], 0xb337);
		break;
	case 3:
	default:
/*	case 3: */
		reg_w(dev, 0xa0, val[0], 0xb336);
		reg_w(dev, 0xa0, val[1], 0xb337);
		reg_w(dev, 0xa0, val[2], 0xb338);
		break;
	default:
		reg_w(dev, 0xa0, 0x01, 0xb334);
		return -EINVAL;
	}
	reg_w(dev, 0xa0, 0x01, 0xb339);
	retry = 4;
	do {
		reg_r(gspca_dev, 0xa1, 0xb33b, 1);
	return gspca_dev->usb_buf[0] == 0;
		if (gspca_dev->usb_buf[0] == 0)
			break;
		msleep(20);
	} while (--retry > 0);
	if (retry <= 0)
		PDEBUG(D_ERR, "i2c_write failed");
}

static void put_tab_to_reg(struct gspca_dev *gspca_dev,
@@ -2051,7 +2055,7 @@ static void usb_exchange(struct gspca_dev *gspca_dev,
			return;
		case 0xcc:			/* normal write */
			reg_w(dev, 0xa0, data[i][2],
					((data[i][0])<<8) | data[i][1]);
					(data[i][0]) << 8 | data[i][1]);
			break;
		case 0xaa:			/* i2c op */
			i2c_write(gspca_dev, data[i][1], &data[i][2], 1);
@@ -2068,11 +2072,6 @@ static void usb_exchange(struct gspca_dev *gspca_dev,
	/*not reached*/
}

/*
 "GammaT"=hex:04,17,31,4f,6a,83,99,ad,bf,ce,da,e5,ee,f5,fb,ff,ff
 "MatrixT"=hex:60,f9,e5,e7,50,05,f3,e6,66
 */

static void vc0321_reset(struct gspca_dev *gspca_dev)
{
	reg_w(gspca_dev->dev, 0xa0, 0x00, 0xb04d);
@@ -2176,7 +2175,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
	return 0;
}

/* this function is called at probe and time */
/* this function is called at probe and resume time */
static int sd_init(struct gspca_dev *gspca_dev)
{
	return 0;
@@ -2332,27 +2331,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
		put_tab_to_reg(gspca_dev, GammaT, 17, 0xb85b);
		put_tab_to_reg(gspca_dev, GammaT, 17, 0xb86c);
		put_tab_to_reg(gspca_dev, MatrixT, 9, 0xb82c);
		/* Seem SHARPNESS */
		/*
		reg_w(gspca_dev->dev, 0xa0, 0x80, 0xb80a);
		reg_w(gspca_dev->dev, 0xa0, 0xff, 0xb80b);
		reg_w(gspca_dev->dev, 0xa0, 0xff, 0xb80e);
		*/
		/* all 0x40 ??? do nothing
		reg_w(gspca_dev->dev, 0xa0, 0x40, 0xb822);
		reg_w(gspca_dev->dev, 0xa0, 0x40, 0xb823);
		reg_w(gspca_dev->dev, 0xa0, 0x40, 0xb824);
		*/
		/* Only works for HV7131R ??
		reg_r (gspca_dev, 0xa1, 0xb881, 1);
		reg_w(gspca_dev->dev, 0xa0, 0xfe01, 0xb881);
		reg_w(gspca_dev->dev, 0xa0, 0x79, 0xb801);
		*/
		/* only hv7131r et ov7660
		reg_w(gspca_dev->dev, 0xa0, 0x20, 0xb827);
		reg_w(gspca_dev->dev, 0xa0, 0xff, 0xb826); * ISP_GAIN 80
		reg_w(gspca_dev->dev, 0xa0, 0x23, 0xb800); * ISP CTRL_BAS
		*/

		/* set the led on 0x0892 0x0896 */
		if (sd->sensor != SENSOR_PO1200) {
			reg_w(gspca_dev->dev, 0x89, 0xffff, 0xfdff);
@@ -2502,7 +2481,8 @@ static int sd_querymenu(struct gspca_dev *gspca_dev,
		case 1:		/* V4L2_CID_POWER_LINE_FREQUENCY_50HZ */
			strcpy((char *) menu->name, "50 Hz");
			return 0;
		case 2:		/* V4L2_CID_POWER_LINE_FREQUENCY_60HZ */
		default:
/*		case 2:		 * V4L2_CID_POWER_LINE_FREQUENCY_60HZ */
			strcpy((char *) menu->name, "60 Hz");
			return 0;
		}
@@ -2565,6 +2545,7 @@ static struct usb_driver sd_driver = {
static int __init sd_mod_init(void)
{
	int ret;

	ret = usb_register(&sd_driver);
	if (ret < 0)
		return ret;