V4L/DVB (9561): gspca: Cleanup the source of ov519.
Signed-off-by: Jean-Francois Moine <moinejf@free.fr> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
917118745a
commit
ac40b1fae5
|
@ -40,22 +40,18 @@ struct sd {
|
|||
struct gspca_dev gspca_dev; /* !! must be the first item */
|
||||
|
||||
/* Determined by sensor type */
|
||||
char sif;
|
||||
__u8 sif;
|
||||
|
||||
unsigned char primary_i2c_slave; /* I2C write id of sensor */
|
||||
|
||||
unsigned char brightness;
|
||||
unsigned char contrast;
|
||||
unsigned char colors;
|
||||
__u8 brightness;
|
||||
__u8 contrast;
|
||||
__u8 colors;
|
||||
__u8 hflip;
|
||||
__u8 vflip;
|
||||
|
||||
char compress; /* Should the next frame be compressed? */
|
||||
char compress_inited; /* Are compression params uploaded? */
|
||||
char stopped; /* Streaming is temporarily paused */
|
||||
__u8 stopped; /* Streaming is temporarily paused */
|
||||
|
||||
char frame_rate; /* current Framerate (OV519 only) */
|
||||
char clockdiv; /* clockdiv override for OV519 only */
|
||||
__u8 frame_rate; /* current Framerate (OV519 only) */
|
||||
__u8 clockdiv; /* clockdiv override for OV519 only */
|
||||
|
||||
char sensor; /* Type of image sensor chip (SEN_*) */
|
||||
#define SEN_UNKNOWN 0
|
||||
|
@ -67,7 +63,6 @@ struct sd {
|
|||
#define SEN_OV7670 6
|
||||
#define SEN_OV76BE 7
|
||||
#define SEN_OV8610 8
|
||||
|
||||
};
|
||||
|
||||
/* V4L2 controls supported by the driver */
|
||||
|
@ -184,15 +179,15 @@ static struct v4l2_pix_format sif_mode[] = {
|
|||
};
|
||||
|
||||
/* OV519 Camera interface register numbers */
|
||||
#define OV519_CAM_H_SIZE 0x10
|
||||
#define OV519_CAM_V_SIZE 0x11
|
||||
#define OV519_CAM_X_OFFSETL 0x12
|
||||
#define OV519_CAM_X_OFFSETH 0x13
|
||||
#define OV519_CAM_Y_OFFSETL 0x14
|
||||
#define OV519_CAM_Y_OFFSETH 0x15
|
||||
#define OV519_CAM_DIVIDER 0x16
|
||||
#define OV519_CAM_DFR 0x20
|
||||
#define OV519_CAM_FORMAT 0x25
|
||||
#define OV519_R10_H_SIZE 0x10
|
||||
#define OV519_R11_V_SIZE 0x11
|
||||
#define OV519_R12_X_OFFSETL 0x12
|
||||
#define OV519_R13_X_OFFSETH 0x13
|
||||
#define OV519_R14_Y_OFFSETL 0x14
|
||||
#define OV519_R15_Y_OFFSETH 0x15
|
||||
#define OV519_R16_DIVIDER 0x16
|
||||
#define OV519_R20_DFR 0x20
|
||||
#define OV519_R25_FORMAT 0x25
|
||||
|
||||
/* OV519 System Controller register numbers */
|
||||
#define OV519_SYS_RESET1 0x51
|
||||
|
@ -562,8 +557,8 @@ static const struct ov_i2c_regvals norm_7670[] = {
|
|||
{ OV7670_REG_VSTOP, 0x7a },
|
||||
{ OV7670_REG_VREF, 0x0a },
|
||||
|
||||
{ OV7670_REG_COM3, 0 },
|
||||
{ OV7670_REG_COM14, 0 },
|
||||
{ OV7670_REG_COM3, 0x00 },
|
||||
{ OV7670_REG_COM14, 0x00 },
|
||||
/* Mystery scaling numbers */
|
||||
{ 0x70, 0x3a },
|
||||
{ 0x71, 0x35 },
|
||||
|
@ -595,8 +590,8 @@ static const struct ov_i2c_regvals norm_7670[] = {
|
|||
{ OV7670_REG_COM8, OV7670_COM8_FASTAEC
|
||||
| OV7670_COM8_AECSTEP
|
||||
| OV7670_COM8_BFILT },
|
||||
{ OV7670_REG_GAIN, 0 },
|
||||
{ OV7670_REG_AECH, 0 },
|
||||
{ OV7670_REG_GAIN, 0x00 },
|
||||
{ OV7670_REG_AECH, 0x00 },
|
||||
{ OV7670_REG_COM4, 0x40 }, /* magic reserved bit */
|
||||
{ OV7670_REG_COM9, 0x18 }, /* 4x gain + magic rsvd bit */
|
||||
{ OV7670_REG_BD50MAX, 0x05 },
|
||||
|
@ -634,16 +629,16 @@ static const struct ov_i2c_regvals norm_7670[] = {
|
|||
{ OV7670_REG_COM12, 0x78 },
|
||||
{ 0x4d, 0x40 },
|
||||
{ 0x4e, 0x20 },
|
||||
{ OV7670_REG_GFIX, 0 },
|
||||
{ OV7670_REG_GFIX, 0x00 },
|
||||
{ 0x6b, 0x4a },
|
||||
{ 0x74, 0x10 },
|
||||
{ 0x8d, 0x4f },
|
||||
{ 0x8e, 0 },
|
||||
{ 0x8f, 0 },
|
||||
{ 0x90, 0 },
|
||||
{ 0x91, 0 },
|
||||
{ 0x96, 0 },
|
||||
{ 0x9a, 0 },
|
||||
{ 0x8e, 0x00 },
|
||||
{ 0x8f, 0x00 },
|
||||
{ 0x90, 0x00 },
|
||||
{ 0x91, 0x00 },
|
||||
{ 0x96, 0x00 },
|
||||
{ 0x9a, 0x00 },
|
||||
{ 0xb0, 0x84 },
|
||||
{ 0xb1, 0x0c },
|
||||
{ 0xb2, 0x0e },
|
||||
|
@ -681,17 +676,17 @@ static const struct ov_i2c_regvals norm_7670[] = {
|
|||
/* Matrix coefficients */
|
||||
{ 0x4f, 0x80 },
|
||||
{ 0x50, 0x80 },
|
||||
{ 0x51, 0 },
|
||||
{ 0x51, 0x00 },
|
||||
{ 0x52, 0x22 },
|
||||
{ 0x53, 0x5e },
|
||||
{ 0x54, 0x80 },
|
||||
{ 0x58, 0x9e },
|
||||
|
||||
{ OV7670_REG_COM16, OV7670_COM16_AWBGAIN },
|
||||
{ OV7670_REG_EDGE, 0 },
|
||||
{ OV7670_REG_EDGE, 0x00 },
|
||||
{ 0x75, 0x05 },
|
||||
{ 0x76, 0xe1 },
|
||||
{ 0x4c, 0 },
|
||||
{ 0x4c, 0x00 },
|
||||
{ 0x77, 0x01 },
|
||||
{ OV7670_REG_COM13, OV7670_COM13_GAMMA
|
||||
| OV7670_COM13_UVSAT
|
||||
|
@ -704,7 +699,7 @@ static const struct ov_i2c_regvals norm_7670[] = {
|
|||
{ 0x34, 0x11 },
|
||||
{ OV7670_REG_COM11, OV7670_COM11_EXP|OV7670_COM11_HZAUTO },
|
||||
{ 0xa4, 0x88 },
|
||||
{ 0x96, 0 },
|
||||
{ 0x96, 0x00 },
|
||||
{ 0x97, 0x30 },
|
||||
{ 0x98, 0x20 },
|
||||
{ 0x99, 0x30 },
|
||||
|
@ -942,11 +937,11 @@ static int i2c_w(struct sd *sd,
|
|||
|
||||
/* Initiate 3-byte write cycle */
|
||||
rc = reg_w(sd, R518_I2C_CTL, 0x01);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
/* wait for write complete */
|
||||
msleep(4);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
return reg_r8(sd, R518_I2C_CTL);
|
||||
}
|
||||
|
||||
|
@ -1029,7 +1024,7 @@ static inline int ov51x_restart(struct sd *sd)
|
|||
*/
|
||||
static int init_ov_sensor(struct sd *sd)
|
||||
{
|
||||
int i, success;
|
||||
int i;
|
||||
|
||||
/* Reset the sensor */
|
||||
if (i2c_w(sd, 0x12, 0x80) < 0)
|
||||
|
@ -1038,11 +1033,11 @@ static int init_ov_sensor(struct sd *sd)
|
|||
/* Wait for it to initialize */
|
||||
msleep(150);
|
||||
|
||||
for (i = 0, success = 0; i < i2c_detect_tries && !success; i++) {
|
||||
for (i = 0; i < i2c_detect_tries; i++) {
|
||||
if (i2c_r(sd, OV7610_REG_ID_HIGH) == 0x7f &&
|
||||
i2c_r(sd, OV7610_REG_ID_LOW) == 0xa2) {
|
||||
success = 1;
|
||||
continue;
|
||||
PDEBUG(D_PROBE, "I2C synced in %d attempt(s)", i);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Reset the sensor */
|
||||
|
@ -1054,10 +1049,7 @@ static int init_ov_sensor(struct sd *sd)
|
|||
if (i2c_r(sd, 0x00) < 0)
|
||||
return -EIO;
|
||||
}
|
||||
if (!success)
|
||||
return -EIO;
|
||||
PDEBUG(D_PROBE, "I2C synced in %d attempt(s)", i);
|
||||
return 0;
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/* Set the read and write slave IDs. The "slave" argument is the write slave,
|
||||
|
@ -1073,7 +1065,6 @@ static int ov51x_set_slave_ids(struct sd *sd,
|
|||
rc = reg_w(sd, R51x_I2C_W_SID, slave);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
sd->primary_i2c_slave = slave;
|
||||
return reg_w(sd, R51x_I2C_R_SID, slave + 1);
|
||||
}
|
||||
|
||||
|
@ -1285,7 +1276,6 @@ static int ov6xx0_configure(struct sd *sd)
|
|||
/* Turns on or off the LED. Only has an effect with OV511+/OV518(+)/OV519 */
|
||||
static void ov51x_led_control(struct sd *sd, int on)
|
||||
{
|
||||
/* PDEBUG(D_STREAM, "LED (%s)", on ? "on" : "off"); */
|
||||
reg_w_mask(sd, OV519_GPIO_DATA_OUT0, !on, 1); /* 0 / 1 */
|
||||
}
|
||||
|
||||
|
@ -1352,7 +1342,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
|
|||
}
|
||||
if (ov8xx0_configure(sd) < 0) {
|
||||
PDEBUG(D_ERR,
|
||||
"Failed to configure OV8xx0 sensor");
|
||||
"Failed to configure OV8xx0 sensor");
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
@ -1482,7 +1472,7 @@ static int ov519_mode_init_regs(struct sd *sd)
|
|||
return -EIO;
|
||||
if (sd->sensor == SEN_OV7640) {
|
||||
/* Select 8-bit input mode */
|
||||
reg_w_mask(sd, OV519_CAM_DFR, 0x10, 0x10);
|
||||
reg_w_mask(sd, OV519_R20_DFR, 0x10, 0x10);
|
||||
}
|
||||
} else {
|
||||
if (write_regvals(sd, mode_init_519_ov7670,
|
||||
|
@ -1490,14 +1480,14 @@ static int ov519_mode_init_regs(struct sd *sd)
|
|||
return -EIO;
|
||||
}
|
||||
|
||||
reg_w(sd, OV519_CAM_H_SIZE, sd->gspca_dev.width >> 4);
|
||||
reg_w(sd, OV519_CAM_V_SIZE, sd->gspca_dev.height >> 3);
|
||||
reg_w(sd, OV519_CAM_X_OFFSETL, 0x00);
|
||||
reg_w(sd, OV519_CAM_X_OFFSETH, 0x00);
|
||||
reg_w(sd, OV519_CAM_Y_OFFSETL, 0x00);
|
||||
reg_w(sd, OV519_CAM_Y_OFFSETH, 0x00);
|
||||
reg_w(sd, OV519_CAM_DIVIDER, 0x00);
|
||||
reg_w(sd, OV519_CAM_FORMAT, 0x03); /* YUV422 */
|
||||
reg_w(sd, OV519_R10_H_SIZE, sd->gspca_dev.width >> 4);
|
||||
reg_w(sd, OV519_R11_V_SIZE, sd->gspca_dev.height >> 3);
|
||||
reg_w(sd, OV519_R12_X_OFFSETL, 0x00);
|
||||
reg_w(sd, OV519_R13_X_OFFSETH, 0x00);
|
||||
reg_w(sd, OV519_R14_Y_OFFSETL, 0x00);
|
||||
reg_w(sd, OV519_R15_Y_OFFSETH, 0x00);
|
||||
reg_w(sd, OV519_R16_DIVIDER, 0x00);
|
||||
reg_w(sd, OV519_R25_FORMAT, 0x03); /* YUV422 */
|
||||
reg_w(sd, 0x26, 0x00); /* Undocumented */
|
||||
|
||||
/******** Set the framerate ********/
|
||||
|
@ -1576,7 +1566,6 @@ static int ov519_mode_init_regs(struct sd *sd)
|
|||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1667,7 +1656,7 @@ static int mode_init_ov_sensor_regs(struct sd *sd)
|
|||
* the gain or the contrast. The "reserved" bits seem
|
||||
* to have some effect in this case. */
|
||||
i2c_w(sd, 0x2d, 0x85);
|
||||
} else if (sd->clockdiv >= 0) {
|
||||
} else {
|
||||
i2c_w(sd, 0x11, sd->clockdiv);
|
||||
}
|
||||
|
||||
|
@ -1869,7 +1858,6 @@ static int sd_start(struct gspca_dev *gspca_dev)
|
|||
ret = ov51x_restart(sd);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
PDEBUG(D_STREAM, "camera started alt: 0x%02x", gspca_dev->alt);
|
||||
ov51x_led_control(sd, 1);
|
||||
return 0;
|
||||
out:
|
||||
|
@ -1879,8 +1867,10 @@ out:
|
|||
|
||||
static void sd_stopN(struct gspca_dev *gspca_dev)
|
||||
{
|
||||
ov51x_stop((struct sd *) gspca_dev);
|
||||
ov51x_led_control((struct sd *) gspca_dev, 0);
|
||||
struct sd *sd = (struct sd *) gspca_dev;
|
||||
|
||||
ov51x_stop(sd);
|
||||
ov51x_led_control(sd, 0);
|
||||
}
|
||||
|
||||
static void sd_pkt_scan(struct gspca_dev *gspca_dev,
|
||||
|
@ -1935,9 +1925,6 @@ static void setbrightness(struct gspca_dev *gspca_dev)
|
|||
int val;
|
||||
|
||||
val = sd->brightness;
|
||||
PDEBUG(D_CONF, "brightness:%d", val);
|
||||
/* if (gspca_dev->streaming)
|
||||
* ov51x_stop(sd); */
|
||||
switch (sd->sensor) {
|
||||
case SEN_OV8610:
|
||||
case SEN_OV7610:
|
||||
|
@ -1959,8 +1946,6 @@ static void setbrightness(struct gspca_dev *gspca_dev)
|
|||
i2c_w(sd, OV7670_REG_BRIGHT, ov7670_abs_to_sm(val));
|
||||
break;
|
||||
}
|
||||
/* if (gspca_dev->streaming)
|
||||
* ov51x_restart(sd); */
|
||||
}
|
||||
|
||||
static void setcontrast(struct gspca_dev *gspca_dev)
|
||||
|
@ -1969,9 +1954,6 @@ static void setcontrast(struct gspca_dev *gspca_dev)
|
|||
int val;
|
||||
|
||||
val = sd->contrast;
|
||||
PDEBUG(D_CONF, "contrast:%d", val);
|
||||
/* if (gspca_dev->streaming)
|
||||
ov51x_stop(sd); */
|
||||
switch (sd->sensor) {
|
||||
case SEN_OV7610:
|
||||
case SEN_OV6620:
|
||||
|
@ -2007,8 +1989,6 @@ static void setcontrast(struct gspca_dev *gspca_dev)
|
|||
i2c_w(sd, OV7670_REG_CONTRAS, val >> 1);
|
||||
break;
|
||||
}
|
||||
/* if (gspca_dev->streaming)
|
||||
ov51x_restart(sd); */
|
||||
}
|
||||
|
||||
static void setcolors(struct gspca_dev *gspca_dev)
|
||||
|
@ -2017,9 +1997,6 @@ static void setcolors(struct gspca_dev *gspca_dev)
|
|||
int val;
|
||||
|
||||
val = sd->colors;
|
||||
PDEBUG(D_CONF, "saturation:%d", val);
|
||||
/* if (gspca_dev->streaming)
|
||||
ov51x_stop(sd); */
|
||||
switch (sd->sensor) {
|
||||
case SEN_OV8610:
|
||||
case SEN_OV7610:
|
||||
|
@ -2044,8 +2021,6 @@ static void setcolors(struct gspca_dev *gspca_dev)
|
|||
/* set REG_COM13 values for UV sat auto mode */
|
||||
break;
|
||||
}
|
||||
/* if (gspca_dev->streaming)
|
||||
ov51x_restart(sd); */
|
||||
}
|
||||
|
||||
static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
|
||||
|
@ -2053,7 +2028,8 @@ static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
|
|||
struct sd *sd = (struct sd *) gspca_dev;
|
||||
|
||||
sd->brightness = val;
|
||||
setbrightness(gspca_dev);
|
||||
if (gspca_dev->streaming)
|
||||
setbrightness(gspca_dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2070,7 +2046,8 @@ static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val)
|
|||
struct sd *sd = (struct sd *) gspca_dev;
|
||||
|
||||
sd->contrast = val;
|
||||
setcontrast(gspca_dev);
|
||||
if (gspca_dev->streaming)
|
||||
setcontrast(gspca_dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2087,7 +2064,8 @@ static int sd_setcolors(struct gspca_dev *gspca_dev, __s32 val)
|
|||
struct sd *sd = (struct sd *) gspca_dev;
|
||||
|
||||
sd->colors = val;
|
||||
setcolors(gspca_dev);
|
||||
if (gspca_dev->streaming)
|
||||
setcolors(gspca_dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2104,7 +2082,8 @@ static int sd_sethflip(struct gspca_dev *gspca_dev, __s32 val)
|
|||
struct sd *sd = (struct sd *) gspca_dev;
|
||||
|
||||
sd->hflip = val;
|
||||
sethvflip(sd);
|
||||
if (gspca_dev->streaming)
|
||||
sethvflip(sd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2121,7 +2100,8 @@ static int sd_setvflip(struct gspca_dev *gspca_dev, __s32 val)
|
|||
struct sd *sd = (struct sd *) gspca_dev;
|
||||
|
||||
sd->vflip = val;
|
||||
sethvflip(sd);
|
||||
if (gspca_dev->streaming)
|
||||
sethvflip(sd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2162,7 +2142,7 @@ static const __devinitdata struct usb_device_id device_table[] = {
|
|||
{USB_DEVICE(0x05a9, 0x8519)},
|
||||
{}
|
||||
};
|
||||
#undef DVNAME
|
||||
|
||||
MODULE_DEVICE_TABLE(usb, device_table);
|
||||
|
||||
/* -- device connect -- */
|
||||
|
|
Loading…
Reference in New Issue