- patches.apparmor/remove_suid_new_case_in_2.6.22.diff: Merge fix.
[linux-flexiantxendom0-3.2.10.git] / drivers / media / video / sn9c102 / sn9c102_ov7660.c
index d670c24..4b64740 100644 (file)
 #include "sn9c102_sensor.h"
 
 
-static struct sn9c102_sensor ov7660;
-
-
 static int ov7660_init(struct sn9c102_device* cam)
 {
        int err = 0;
 
-       err += sn9c102_write_reg(cam, 0x40, 0x02);
-       err += sn9c102_write_reg(cam, 0x00, 0x03);
-       err += sn9c102_write_reg(cam, 0x1a, 0x04);
-       err += sn9c102_write_reg(cam, 0x03, 0x10);
-       err += sn9c102_write_reg(cam, 0x08, 0x14);
-       err += sn9c102_write_reg(cam, 0x20, 0x17);
-       err += sn9c102_write_reg(cam, 0x8b, 0x18);
-       err += sn9c102_write_reg(cam, 0x00, 0x19);
-       err += sn9c102_write_reg(cam, 0x1d, 0x1a);
-       err += sn9c102_write_reg(cam, 0x10, 0x1b);
-       err += sn9c102_write_reg(cam, 0x02, 0x1c);
-       err += sn9c102_write_reg(cam, 0x03, 0x1d);
-       err += sn9c102_write_reg(cam, 0x0f, 0x1e);
-       err += sn9c102_write_reg(cam, 0x0c, 0x1f);
-       err += sn9c102_write_reg(cam, 0x00, 0x20);
-       err += sn9c102_write_reg(cam, 0x29, 0x21);
-       err += sn9c102_write_reg(cam, 0x40, 0x22);
-       err += sn9c102_write_reg(cam, 0x54, 0x23);
-       err += sn9c102_write_reg(cam, 0x66, 0x24);
-       err += sn9c102_write_reg(cam, 0x76, 0x25);
-       err += sn9c102_write_reg(cam, 0x85, 0x26);
-       err += sn9c102_write_reg(cam, 0x94, 0x27);
-       err += sn9c102_write_reg(cam, 0xa1, 0x28);
-       err += sn9c102_write_reg(cam, 0xae, 0x29);
-       err += sn9c102_write_reg(cam, 0xbb, 0x2a);
-       err += sn9c102_write_reg(cam, 0xc7, 0x2b);
-       err += sn9c102_write_reg(cam, 0xd3, 0x2c);
-       err += sn9c102_write_reg(cam, 0xde, 0x2d);
-       err += sn9c102_write_reg(cam, 0xea, 0x2e);
-       err += sn9c102_write_reg(cam, 0xf4, 0x2f);
-       err += sn9c102_write_reg(cam, 0xff, 0x30);
-       err += sn9c102_write_reg(cam, 0x00, 0x3F);
-       err += sn9c102_write_reg(cam, 0xC7, 0x40);
-       err += sn9c102_write_reg(cam, 0x01, 0x41);
-       err += sn9c102_write_reg(cam, 0x44, 0x42);
-       err += sn9c102_write_reg(cam, 0x00, 0x43);
-       err += sn9c102_write_reg(cam, 0x44, 0x44);
-       err += sn9c102_write_reg(cam, 0x00, 0x45);
-       err += sn9c102_write_reg(cam, 0x44, 0x46);
-       err += sn9c102_write_reg(cam, 0x00, 0x47);
-       err += sn9c102_write_reg(cam, 0xC7, 0x48);
-       err += sn9c102_write_reg(cam, 0x01, 0x49);
-       err += sn9c102_write_reg(cam, 0xC7, 0x4A);
-       err += sn9c102_write_reg(cam, 0x01, 0x4B);
-       err += sn9c102_write_reg(cam, 0xC7, 0x4C);
-       err += sn9c102_write_reg(cam, 0x01, 0x4D);
-       err += sn9c102_write_reg(cam, 0x44, 0x4E);
-       err += sn9c102_write_reg(cam, 0x00, 0x4F);
-       err += sn9c102_write_reg(cam, 0x44, 0x50);
-       err += sn9c102_write_reg(cam, 0x00, 0x51);
-       err += sn9c102_write_reg(cam, 0x44, 0x52);
-       err += sn9c102_write_reg(cam, 0x00, 0x53);
-       err += sn9c102_write_reg(cam, 0xC7, 0x54);
-       err += sn9c102_write_reg(cam, 0x01, 0x55);
-       err += sn9c102_write_reg(cam, 0xC7, 0x56);
-       err += sn9c102_write_reg(cam, 0x01, 0x57);
-       err += sn9c102_write_reg(cam, 0xC7, 0x58);
-       err += sn9c102_write_reg(cam, 0x01, 0x59);
-       err += sn9c102_write_reg(cam, 0x44, 0x5A);
-       err += sn9c102_write_reg(cam, 0x00, 0x5B);
-       err += sn9c102_write_reg(cam, 0x44, 0x5C);
-       err += sn9c102_write_reg(cam, 0x00, 0x5D);
-       err += sn9c102_write_reg(cam, 0x44, 0x5E);
-       err += sn9c102_write_reg(cam, 0x00, 0x5F);
-       err += sn9c102_write_reg(cam, 0xC7, 0x60);
-       err += sn9c102_write_reg(cam, 0x01, 0x61);
-       err += sn9c102_write_reg(cam, 0xC7, 0x62);
-       err += sn9c102_write_reg(cam, 0x01, 0x63);
-       err += sn9c102_write_reg(cam, 0xC7, 0x64);
-       err += sn9c102_write_reg(cam, 0x01, 0x65);
-       err += sn9c102_write_reg(cam, 0x44, 0x66);
-       err += sn9c102_write_reg(cam, 0x00, 0x67);
-       err += sn9c102_write_reg(cam, 0x44, 0x68);
-       err += sn9c102_write_reg(cam, 0x00, 0x69);
-       err += sn9c102_write_reg(cam, 0x44, 0x6A);
-       err += sn9c102_write_reg(cam, 0x00, 0x6B);
-       err += sn9c102_write_reg(cam, 0xC7, 0x6C);
-       err += sn9c102_write_reg(cam, 0x01, 0x6D);
-       err += sn9c102_write_reg(cam, 0xC7, 0x6E);
-       err += sn9c102_write_reg(cam, 0x01, 0x6F);
-       err += sn9c102_write_reg(cam, 0xC7, 0x70);
-       err += sn9c102_write_reg(cam, 0x01, 0x71);
-       err += sn9c102_write_reg(cam, 0x44, 0x72);
-       err += sn9c102_write_reg(cam, 0x00, 0x73);
-       err += sn9c102_write_reg(cam, 0x44, 0x74);
-       err += sn9c102_write_reg(cam, 0x00, 0x75);
-       err += sn9c102_write_reg(cam, 0x44, 0x76);
-       err += sn9c102_write_reg(cam, 0x00, 0x77);
-       err += sn9c102_write_reg(cam, 0xC7, 0x78);
-       err += sn9c102_write_reg(cam, 0x01, 0x79);
-       err += sn9c102_write_reg(cam, 0xC7, 0x7A);
-       err += sn9c102_write_reg(cam, 0x01, 0x7B);
-       err += sn9c102_write_reg(cam, 0xC7, 0x7C);
-       err += sn9c102_write_reg(cam, 0x01, 0x7D);
-       err += sn9c102_write_reg(cam, 0x44, 0x7E);
-       err += sn9c102_write_reg(cam, 0x00, 0x7F);
-       err += sn9c102_write_reg(cam, 0x14, 0x84);
-       err += sn9c102_write_reg(cam, 0x00, 0x85);
-       err += sn9c102_write_reg(cam, 0x27, 0x86);
-       err += sn9c102_write_reg(cam, 0x00, 0x87);
-       err += sn9c102_write_reg(cam, 0x07, 0x88);
-       err += sn9c102_write_reg(cam, 0x00, 0x89);
-       err += sn9c102_write_reg(cam, 0xEC, 0x8A);
-       err += sn9c102_write_reg(cam, 0x0f, 0x8B);
-       err += sn9c102_write_reg(cam, 0xD8, 0x8C);
-       err += sn9c102_write_reg(cam, 0x0f, 0x8D);
-       err += sn9c102_write_reg(cam, 0x3D, 0x8E);
-       err += sn9c102_write_reg(cam, 0x00, 0x8F);
-       err += sn9c102_write_reg(cam, 0x3D, 0x90);
-       err += sn9c102_write_reg(cam, 0x00, 0x91);
-       err += sn9c102_write_reg(cam, 0xCD, 0x92);
-       err += sn9c102_write_reg(cam, 0x0f, 0x93);
-       err += sn9c102_write_reg(cam, 0xf7, 0x94);
-       err += sn9c102_write_reg(cam, 0x0f, 0x95);
-       err += sn9c102_write_reg(cam, 0x0C, 0x96);
-       err += sn9c102_write_reg(cam, 0x00, 0x97);
-       err += sn9c102_write_reg(cam, 0x00, 0x98);
-       err += sn9c102_write_reg(cam, 0x66, 0x99);
-       err += sn9c102_write_reg(cam, 0x05, 0x9A);
-       err += sn9c102_write_reg(cam, 0x00, 0x9B);
-       err += sn9c102_write_reg(cam, 0x04, 0x9C);
-       err += sn9c102_write_reg(cam, 0x00, 0x9D);
-       err += sn9c102_write_reg(cam, 0x08, 0x9E);
-       err += sn9c102_write_reg(cam, 0x00, 0x9F);
-       err += sn9c102_write_reg(cam, 0x2D, 0xC0);
-       err += sn9c102_write_reg(cam, 0x2D, 0xC1);
-       err += sn9c102_write_reg(cam, 0x3A, 0xC2);
-       err += sn9c102_write_reg(cam, 0x05, 0xC3);
-       err += sn9c102_write_reg(cam, 0x04, 0xC4);
-       err += sn9c102_write_reg(cam, 0x3F, 0xC5);
-       err += sn9c102_write_reg(cam, 0x00, 0xC6);
-       err += sn9c102_write_reg(cam, 0x00, 0xC7);
-       err += sn9c102_write_reg(cam, 0x50, 0xC8);
-       err += sn9c102_write_reg(cam, 0x3C, 0xC9);
-       err += sn9c102_write_reg(cam, 0x28, 0xCA);
-       err += sn9c102_write_reg(cam, 0xD8, 0xCB);
-       err += sn9c102_write_reg(cam, 0x14, 0xCC);
-       err += sn9c102_write_reg(cam, 0xEC, 0xCD);
-       err += sn9c102_write_reg(cam, 0x32, 0xCE);
-       err += sn9c102_write_reg(cam, 0xDD, 0xCF);
-       err += sn9c102_write_reg(cam, 0x32, 0xD0);
-       err += sn9c102_write_reg(cam, 0xDD, 0xD1);
-       err += sn9c102_write_reg(cam, 0x6A, 0xD2);
-       err += sn9c102_write_reg(cam, 0x50, 0xD3);
-       err += sn9c102_write_reg(cam, 0x00, 0xD4);
-       err += sn9c102_write_reg(cam, 0x00, 0xD5);
-       err += sn9c102_write_reg(cam, 0x00, 0xD6);
+       err = sn9c102_write_const_regs(cam, {0x40, 0x02}, {0x00, 0x03},
+                                      {0x1a, 0x04}, {0x03, 0x10},
+                                      {0x08, 0x14}, {0x20, 0x17},
+                                      {0x8b, 0x18}, {0x00, 0x19},
+                                      {0x1d, 0x1a}, {0x10, 0x1b},
+                                      {0x02, 0x1c}, {0x03, 0x1d},
+                                      {0x0f, 0x1e}, {0x0c, 0x1f},
+                                      {0x00, 0x20}, {0x29, 0x21},
+                                      {0x40, 0x22}, {0x54, 0x23},
+                                      {0x66, 0x24}, {0x76, 0x25},
+                                      {0x85, 0x26}, {0x94, 0x27},
+                                      {0xa1, 0x28}, {0xae, 0x29},
+                                      {0xbb, 0x2a}, {0xc7, 0x2b},
+                                      {0xd3, 0x2c}, {0xde, 0x2d},
+                                      {0xea, 0x2e}, {0xf4, 0x2f},
+                                      {0xff, 0x30}, {0x00, 0x3F},
+                                      {0xC7, 0x40}, {0x01, 0x41},
+                                      {0x44, 0x42}, {0x00, 0x43},
+                                      {0x44, 0x44}, {0x00, 0x45},
+                                      {0x44, 0x46}, {0x00, 0x47},
+                                      {0xC7, 0x48}, {0x01, 0x49},
+                                      {0xC7, 0x4A}, {0x01, 0x4B},
+                                      {0xC7, 0x4C}, {0x01, 0x4D},
+                                      {0x44, 0x4E}, {0x00, 0x4F},
+                                      {0x44, 0x50}, {0x00, 0x51},
+                                      {0x44, 0x52}, {0x00, 0x53},
+                                      {0xC7, 0x54}, {0x01, 0x55},
+                                      {0xC7, 0x56}, {0x01, 0x57},
+                                      {0xC7, 0x58}, {0x01, 0x59},
+                                      {0x44, 0x5A}, {0x00, 0x5B},
+                                      {0x44, 0x5C}, {0x00, 0x5D},
+                                      {0x44, 0x5E}, {0x00, 0x5F},
+                                      {0xC7, 0x60}, {0x01, 0x61},
+                                      {0xC7, 0x62}, {0x01, 0x63},
+                                      {0xC7, 0x64}, {0x01, 0x65},
+                                      {0x44, 0x66}, {0x00, 0x67},
+                                      {0x44, 0x68}, {0x00, 0x69},
+                                      {0x44, 0x6A}, {0x00, 0x6B},
+                                      {0xC7, 0x6C}, {0x01, 0x6D},
+                                      {0xC7, 0x6E}, {0x01, 0x6F},
+                                      {0xC7, 0x70}, {0x01, 0x71},
+                                      {0x44, 0x72}, {0x00, 0x73},
+                                      {0x44, 0x74}, {0x00, 0x75},
+                                      {0x44, 0x76}, {0x00, 0x77},
+                                      {0xC7, 0x78}, {0x01, 0x79},
+                                      {0xC7, 0x7A}, {0x01, 0x7B},
+                                      {0xC7, 0x7C}, {0x01, 0x7D},
+                                      {0x44, 0x7E}, {0x00, 0x7F},
+                                      {0x14, 0x84}, {0x00, 0x85},
+                                      {0x27, 0x86}, {0x00, 0x87},
+                                      {0x07, 0x88}, {0x00, 0x89},
+                                      {0xEC, 0x8A}, {0x0f, 0x8B},
+                                      {0xD8, 0x8C}, {0x0f, 0x8D},
+                                      {0x3D, 0x8E}, {0x00, 0x8F},
+                                      {0x3D, 0x90}, {0x00, 0x91},
+                                      {0xCD, 0x92}, {0x0f, 0x93},
+                                      {0xf7, 0x94}, {0x0f, 0x95},
+                                      {0x0C, 0x96}, {0x00, 0x97},
+                                      {0x00, 0x98}, {0x66, 0x99},
+                                      {0x05, 0x9A}, {0x00, 0x9B},
+                                      {0x04, 0x9C}, {0x00, 0x9D},
+                                      {0x08, 0x9E}, {0x00, 0x9F},
+                                      {0x2D, 0xC0}, {0x2D, 0xC1},
+                                      {0x3A, 0xC2}, {0x05, 0xC3},
+                                      {0x04, 0xC4}, {0x3F, 0xC5},
+                                      {0x00, 0xC6}, {0x00, 0xC7},
+                                      {0x50, 0xC8}, {0x3C, 0xC9},
+                                      {0x28, 0xCA}, {0xD8, 0xCB},
+                                      {0x14, 0xCC}, {0xEC, 0xCD},
+                                      {0x32, 0xCE}, {0xDD, 0xCF},
+                                      {0x32, 0xD0}, {0xDD, 0xD1},
+                                      {0x6A, 0xD2}, {0x50, 0xD3},
+                                      {0x00, 0xD4}, {0x00, 0xD5},
+                                      {0x00, 0xD6});
 
        err += sn9c102_i2c_write(cam, 0x12, 0x80);
        err += sn9c102_i2c_write(cam, 0x11, 0x09);
        err += sn9c102_i2c_write(cam, 0x00, 0x0A);
-       err += sn9c102_i2c_write(cam, 0x01, 0x78);
-       err += sn9c102_i2c_write(cam, 0x02, 0x90);
+       err += sn9c102_i2c_write(cam, 0x01, 0x80);
+       err += sn9c102_i2c_write(cam, 0x02, 0x80);
        err += sn9c102_i2c_write(cam, 0x03, 0x00);
        err += sn9c102_i2c_write(cam, 0x04, 0x00);
        err += sn9c102_i2c_write(cam, 0x05, 0x08);
@@ -198,7 +122,7 @@ static int ov7660_init(struct sn9c102_device* cam)
        err += sn9c102_i2c_write(cam, 0x10, 0x20);
        err += sn9c102_i2c_write(cam, 0x11, 0x03);
        err += sn9c102_i2c_write(cam, 0x12, 0x05);
-       err += sn9c102_i2c_write(cam, 0x13, 0xF8);
+       err += sn9c102_i2c_write(cam, 0x13, 0xC7);
        err += sn9c102_i2c_write(cam, 0x14, 0x2C);
        err += sn9c102_i2c_write(cam, 0x15, 0x00);
        err += sn9c102_i2c_write(cam, 0x16, 0x02);
@@ -238,7 +162,7 @@ static int ov7660_init(struct sn9c102_device* cam)
        err += sn9c102_i2c_write(cam, 0x38, 0x02);
        err += sn9c102_i2c_write(cam, 0x39, 0x43);
        err += sn9c102_i2c_write(cam, 0x3A, 0x00);
-       err += sn9c102_i2c_write(cam, 0x3B, 0x02);
+       err += sn9c102_i2c_write(cam, 0x3B, 0x0A);
        err += sn9c102_i2c_write(cam, 0x3C, 0x6C);
        err += sn9c102_i2c_write(cam, 0x3D, 0x99);
        err += sn9c102_i2c_write(cam, 0x3E, 0x0E);
@@ -357,25 +281,34 @@ static int ov7660_get_ctrl(struct sn9c102_device* cam,
                        return -EIO;
                break;
        case V4L2_CID_DO_WHITE_BALANCE:
-               ctrl->value = sn9c102_pread_reg(cam, 0x02);
+               if ((ctrl->value = sn9c102_read_reg(cam, 0x02)) < 0)
+                       return -EIO;
                ctrl->value = (ctrl->value & 0x04) ? 1 : 0;
                break;
        case V4L2_CID_RED_BALANCE:
-               ctrl->value = sn9c102_pread_reg(cam, 0x05);
+               if ((ctrl->value = sn9c102_read_reg(cam, 0x05)) < 0)
+                       return -EIO;
                ctrl->value &= 0x7f;
                break;
        case V4L2_CID_BLUE_BALANCE:
-               ctrl->value = sn9c102_pread_reg(cam, 0x06);
+               if ((ctrl->value = sn9c102_read_reg(cam, 0x06)) < 0)
+                       return -EIO;
                ctrl->value &= 0x7f;
                break;
        case SN9C102_V4L2_CID_GREEN_BALANCE:
-               ctrl->value = sn9c102_pread_reg(cam, 0x07);
+               if ((ctrl->value = sn9c102_read_reg(cam, 0x07)) < 0)
+                       return -EIO;
                ctrl->value &= 0x7f;
                break;
+       case SN9C102_V4L2_CID_BAND_FILTER:
+               if ((ctrl->value = sn9c102_i2c_read(cam, 0x3b)) < 0)
+                       return -EIO;
+               ctrl->value &= 0x08;
+               break;
        case V4L2_CID_GAIN:
                if ((ctrl->value = sn9c102_i2c_read(cam, 0x00)) < 0)
                        return -EIO;
-               ctrl->value &= 0x7f;
+               ctrl->value &= 0x1f;
                break;
        case V4L2_CID_AUTOGAIN:
                if ((ctrl->value = sn9c102_i2c_read(cam, 0x13)) < 0)
@@ -411,12 +344,15 @@ static int ov7660_set_ctrl(struct sn9c102_device* cam,
        case SN9C102_V4L2_CID_GREEN_BALANCE:
                err += sn9c102_write_reg(cam, ctrl->value, 0x07);
                break;
+       case SN9C102_V4L2_CID_BAND_FILTER:
+               err += sn9c102_i2c_write(cam, ctrl->value << 3, 0x3b);
+               break;
        case V4L2_CID_GAIN:
-               err += sn9c102_i2c_write(cam, 0x00, ctrl->value);
+               err += sn9c102_i2c_write(cam, 0x00, 0x60 + ctrl->value);
                break;
        case V4L2_CID_AUTOGAIN:
-               err += sn9c102_i2c_write(cam, 0x13, 0xf0 | ctrl->value |
-                                                   (ctrl->value << 1));
+               err += sn9c102_i2c_write(cam, 0x13, 0xc0 |
+                                                   (ctrl->value * 0x07));
                break;
        default:
                return -EINVAL;
@@ -462,7 +398,7 @@ static int ov7660_set_pix_format(struct sn9c102_device* cam,
 }
 
 
-static struct sn9c102_sensor ov7660 = {
+static const struct sn9c102_sensor ov7660 = {
        .name = "OV7660",
        .maintainer = "Luca Risolia <luca.risolia@studio.unibo.it>",
        .supported_bridge = BRIDGE_SN9C105 | BRIDGE_SN9C120,
@@ -477,9 +413,9 @@ static struct sn9c102_sensor ov7660 = {
                        .type = V4L2_CTRL_TYPE_INTEGER,
                        .name = "global gain",
                        .minimum = 0x00,
-                       .maximum = 0x7f,
+                       .maximum = 0x1f,
                        .step = 0x01,
-                       .default_value = 0x0a,
+                       .default_value = 0x09,
                        .flags = 0,
                },
                {
@@ -489,7 +425,7 @@ static struct sn9c102_sensor ov7660 = {
                        .minimum = 0x00,
                        .maximum = 0xff,
                        .step = 0x01,
-                       .default_value = 0x50,
+                       .default_value = 0x27,
                        .flags = 0,
                },
                {
@@ -509,7 +445,7 @@ static struct sn9c102_sensor ov7660 = {
                        .minimum = 0x00,
                        .maximum = 0x7f,
                        .step = 0x01,
-                       .default_value = 0x1f,
+                       .default_value = 0x14,
                        .flags = 0,
                },
                {
@@ -519,7 +455,7 @@ static struct sn9c102_sensor ov7660 = {
                        .minimum = 0x00,
                        .maximum = 0x7f,
                        .step = 0x01,
-                       .default_value = 0x1e,
+                       .default_value = 0x14,
                        .flags = 0,
                },
                {
@@ -529,7 +465,7 @@ static struct sn9c102_sensor ov7660 = {
                        .minimum = 0x00,
                        .maximum = 0x01,
                        .step = 0x01,
-                       .default_value = 0x00,
+                       .default_value = 0x01,
                        .flags = 0,
                },
                {
@@ -539,7 +475,17 @@ static struct sn9c102_sensor ov7660 = {
                        .minimum = 0x00,
                        .maximum = 0x7f,
                        .step = 0x01,
-                       .default_value = 0x20,
+                       .default_value = 0x14,
+                       .flags = 0,
+               },
+               {
+                       .id = SN9C102_V4L2_CID_BAND_FILTER,
+                       .type = V4L2_CTRL_TYPE_BOOLEAN,
+                       .name = "band filter",
+                       .minimum = 0x00,
+                       .maximum = 0x01,
+                       .step = 0x01,
+                       .default_value = 0x00,
                        .flags = 0,
                },
        },
@@ -572,13 +518,11 @@ static struct sn9c102_sensor ov7660 = {
 
 int sn9c102_probe_ov7660(struct sn9c102_device* cam)
 {
-       int pid, ver, err = 0;
+       int pid, ver, err;
 
-       err += sn9c102_write_reg(cam, 0x01, 0xf1);
-       err += sn9c102_write_reg(cam, 0x00, 0xf1);
-       err += sn9c102_write_reg(cam, 0x01, 0x01);
-       err += sn9c102_write_reg(cam, 0x00, 0x01);
-       err += sn9c102_write_reg(cam, 0x28, 0x17);
+       err = sn9c102_write_const_regs(cam, {0x01, 0xf1}, {0x00, 0xf1},
+                                      {0x01, 0x01}, {0x00, 0x01},
+                                      {0x28, 0x17});
 
        pid = sn9c102_i2c_try_read(cam, &ov7660, 0x0a);
        ver = sn9c102_i2c_try_read(cam, &ov7660, 0x0b);
@@ -586,6 +530,7 @@ int sn9c102_probe_ov7660(struct sn9c102_device* cam)
                return -EIO;
        if (pid != 0x76 || ver != 0x60)
                return -ENODEV;
+
        sn9c102_attach_sensor(cam, &ov7660);
 
        return 0;