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

V4L/DVB (9561): gspca: Cleanup the source of ov519.

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