]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/media/video/sn9c102/sn9c102_ov7660.c
Merge branch 'pci-for-jesse' of git://git.kernel.org/pub/scm/linux/kernel/git/tip...
[linux-2.6-omap-h63xx.git] / drivers / media / video / sn9c102 / sn9c102_ov7660.c
index c898e948fe8d07ed70212b426d101094d6cb0fee..8aae416ba8ec236bf06c88cc67ffbfb32e6a575c 100644 (file)
@@ -41,71 +41,71 @@ static int ov7660_init(struct sn9c102_device* cam)
                                       {0xbb, 0x2a}, {0xc7, 0x2b},
                                       {0xd3, 0x2c}, {0xde, 0x2d},
                                       {0xea, 0x2e}, {0xf4, 0x2f},
-                                      {0xff, 0x30}, {0x00, 0x3F},
-                                      {0xC7, 0x40}, {0x01, 0x41},
+                                      {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},
+                                      {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},
+                                      {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, 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},
+                                      {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},
+                                      {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},
+                                      {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});
+                                      {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);
@@ -122,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);
@@ -162,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);
@@ -281,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)
@@ -335,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;
@@ -386,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,
@@ -401,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,
                },
                {
@@ -413,7 +425,7 @@ static struct sn9c102_sensor ov7660 = {
                        .minimum = 0x00,
                        .maximum = 0xff,
                        .step = 0x01,
-                       .default_value = 0x50,
+                       .default_value = 0x27,
                        .flags = 0,
                },
                {
@@ -433,7 +445,7 @@ static struct sn9c102_sensor ov7660 = {
                        .minimum = 0x00,
                        .maximum = 0x7f,
                        .step = 0x01,
-                       .default_value = 0x1f,
+                       .default_value = 0x14,
                        .flags = 0,
                },
                {
@@ -443,7 +455,7 @@ static struct sn9c102_sensor ov7660 = {
                        .minimum = 0x00,
                        .maximum = 0x7f,
                        .step = 0x01,
-                       .default_value = 0x1e,
+                       .default_value = 0x14,
                        .flags = 0,
                },
                {
@@ -453,7 +465,7 @@ static struct sn9c102_sensor ov7660 = {
                        .minimum = 0x00,
                        .maximum = 0x01,
                        .step = 0x01,
-                       .default_value = 0x00,
+                       .default_value = 0x01,
                        .flags = 0,
                },
                {
@@ -463,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,
                },
        },
@@ -508,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;