V4L/DVB (9988): gspca - spca561: Separate the bridge and sensor tables of Rev72a
authorJean-Francois Moine <moinejf@free.fr>
Fri, 19 Dec 2008 10:21:26 +0000 (07:21 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 30 Dec 2008 11:39:41 +0000 (09:39 -0200)
Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/gspca/spca561.c

index b31772c6ed32b1b9adadeab7fef840076fefa1b2..0f7df3b3fba14a9eb7f750e319f1d0e3bd0a88bf 100644 (file)
@@ -146,7 +146,7 @@ static struct v4l2_pix_format sif_072a_mode[] = {
 #define SPCA561_SNAPBIT 0x20
 #define SPCA561_SNAPCTRL 0x40
 
-static const __u16 rev72a_init_data[][2] = {
+static const __u16 rev72a_init_data1[][2] = {
        {0x0000, 0x8114},       /* Software GPIO output data */
        {0x0001, 0x8114},       /* Software GPIO output data */
        {0x0000, 0x8112},       /* Some kind of reset */
@@ -156,44 +156,26 @@ static const __u16 rev72a_init_data[][2] = {
        {0x0001, 0x8118},       /* Conf sensor */
        {0x0092, 0x8804},       /* I know nothing about these */
        {0x0010, 0x8802},       /* 0x88xx registers, so I won't */
-       /***************/
        {0x000d, 0x8805},       /* sensor default setting */
-       {0x0001, 0x8801},       /* 1 <- 0x0d */
-       {0x0000, 0x8800},
-       {0x0018, 0x8805},
-       {0x0002, 0x8801},       /* 2 <- 0x18 */
-       {0x0000, 0x8800},
-       {0x0065, 0x8805},
-       {0x0004, 0x8801},       /* 4 <- 0x01 0x65 */
-       {0x0001, 0x8800},
-       {0x0021, 0x8805},
-       {0x0005, 0x8801},       /* 5 <- 0x21 */
-       {0x0000, 0x8800},
-       {0x00aa, 0x8805},
-       {0x0007, 0x8801},       /* 7 <- 0xaa */
-       {0x0000, 0x8800},
-       {0x0004, 0x8805},
-       {0x0020, 0x8801},       /* 0x20 <- 0x15 0x04 */
-       {0x0015, 0x8800},
-       {0x0002, 0x8805},
-       {0x0039, 0x8801},       /* 0x39 <- 0x02 */
-       {0x0000, 0x8800},
-       {0x0010, 0x8805},
-       {0x0035, 0x8801},       /* 0x35 <- 0x10 */
-       {0x0000, 0x8800},
-       {0x0049, 0x8805},
-       {0x0009, 0x8801},       /* 0x09 <- 0x10 0x49 */
-       {0x0010, 0x8800},
-       {0x000b, 0x8805},
-       {0x0028, 0x8801},       /* 0x28 <- 0x0b */
-       {0x0000, 0x8800},
-       {0x000f, 0x8805},
-       {0x003b, 0x8801},       /* 0x3b <- 0x0f */
-       {0x0000, 0x8800},
-       {0x0000, 0x8805},
-       {0x003c, 0x8801},       /* 0x3c <- 0x00 */
-       {0x0000, 0x8800},
-       /***************/
+       {}
+};
+static const __u16 rev72a_init_sensor1[][2] = {
+                               /* ms-win values */
+       {0x0001, 0x0018},       /* 0x01 <- 0x0d */
+       {0x0002, 0x0065},       /* 0x02 <- 0x18 */
+       {0x0004, 0x0121},       /* 0x04 <- 0x0165 */
+       {0x0005, 0x00aa},       /* 0x05 <- 0x21 */
+       {0x0007, 0x0004},       /* 0x07 <- 0xaa */
+       {0x0020, 0x1502},       /* 0x20 <- 0x1504 */
+       {0x0039, 0x0010},       /* 0x39 <- 0x02 */
+       {0x0035, 0x0049},       /* 0x35 <- 0x10 */
+       {0x0009, 0x100b},       /* 0x09 <- 0x1049 */
+       {0x0028, 0x000f},       /* 0x28 <- 0x0b */
+       {0x003b, 0x003c},       /* 0x3b <- 0x0f */
+       {0x003c, 0x0000},       /* 0x3c <- 0x00 */
+       {}
+};
+static const __u16 rev72a_init_data2[][2] = {
        {0x0018, 0x8601},       /* Pixel/line selection for color separation */
        {0x0000, 0x8602},       /* Optical black level for user setting */
        {0x0060, 0x8604},       /* Optical black horizontal offset */
@@ -234,29 +216,22 @@ static const __u16 rev72a_init_data[][2] = {
 
        {0x0002, 0x865b},       /* Horizontal offset for valid pixels */
        {0x0003, 0x865c},       /* Vertical offset for valid lines */
-       /***************/               /* sensor active */
-       {0x0003, 0x8801},       /* 0x03 <- 0x01 0x21 //289 */
-       {0x0021, 0x8805},
-       {0x0001, 0x8800},
-       {0x0004, 0x8801},       /* 0x04 <- 0x01 0x65 //357 */
-       {0x0065, 0x8805},
-       {0x0001, 0x8800},
-       {0x0005, 0x8801},       /* 0x05 <- 0x2f */
-       {0x002f, 0x8805},
-       {0x0000, 0x8800},
-       {0x0006, 0x8801},       /* 0x06 <- 0 */
-       {0x0000, 0x8805},
-       {0x0000, 0x8800},
-       {0x000a, 0x8801},       /* 0x0a <- 2 */
-       {0x0002, 0x8805},
-       {0x0000, 0x8800},
-       {0x0009, 0x8801},       /* 0x09 <- 0x1061 */
-       {0x0061, 0x8805},
-       {0x0010, 0x8800},
-       {0x0035, 0x8801},       /* 0x35 <-0x14 */
-       {0x0014, 0x8805},
-       {0x0000, 0x8800},
+       {}
+};
+static const __u16 rev72a_init_sensor2[][2] = {
+                               /* ms-win values */
+       {0x0003, 0x0121},       /* 0x03 <- 0x01 0x21 //289 */
+       {0x0004, 0x0165},       /* 0x04 <- 0x01 0x65 //357 */
+       {0x0005, 0x002f},       /* 0x05 <- 0x2f */
+       {0x0006, 0x0000},       /* 0x06 <- 0 */
+       {0x000a, 0x0002},       /* 0x0a <- 2 */
+       {0x0009, 0x1061},       /* 0x09 <- 0x1061 */
+       {0x0035, 0x0014},       /* 0x35 <- 0x14 */
+       {}
+};
+static const __u16 rev72a_init_data3[][2] = {
        {0x0030, 0x8112},       /* ISO and drop packet enable */
+/*fixme: should stop here*/
        {0x0000, 0x8112},       /* Some kind of reset ???? */
        {0x0009, 0x8118},       /* Enable sensor and set standby */
        {0x0000, 0x8114},       /* Software GPIO output data */
@@ -519,6 +494,15 @@ static void sensor_mapwrite(struct gspca_dev *gspca_dev,
        }
 }
 
+static void write_sensor_72a(struct gspca_dev *gspca_dev,
+                           const __u16 (*sensor)[2])
+{
+       while ((*sensor)[0]) {
+               i2c_write(gspca_dev, (*sensor)[1], (*sensor)[0]);
+               sensor++;
+       }
+}
+
 static void init_161rev12A(struct gspca_dev *gspca_dev)
 {
        write_vector(gspca_dev, spca561_161rev12A_data1);
@@ -588,7 +572,11 @@ static int sd_init_12a(struct gspca_dev *gspca_dev)
 static int sd_init_72a(struct gspca_dev *gspca_dev)
 {
        PDEBUG(D_STREAM, "Chip revision: 072a");
-       write_vector(gspca_dev, rev72a_init_data);
+       write_vector(gspca_dev, rev72a_init_data1);
+       write_sensor_72a(gspca_dev, rev72a_init_sensor1);
+       write_vector(gspca_dev, rev72a_init_data2);
+       write_sensor_72a(gspca_dev, rev72a_init_sensor2);
+       write_vector(gspca_dev, rev72a_init_data3);
        return 0;
 }