V4L/DVB (5474): SN9C1xx driver updates
[linux-2.6.git] / drivers / media / video / sn9c102 / sn9c102_mi0343.c
index a33d1bc..441156d 100644 (file)
 #include "sn9c102_sensor.h"
 
 
-static struct sn9c102_sensor mi0343;
-static u8 mi0343_i2c_data[5+1];
-
-
 static int mi0343_init(struct sn9c102_device* cam)
 {
+       struct sn9c102_sensor* s = sn9c102_get_sensor(cam);
        int err = 0;
 
        err += sn9c102_write_reg(cam, 0x00, 0x10);
@@ -38,20 +35,20 @@ static int mi0343_init(struct sn9c102_device* cam)
        err += sn9c102_write_reg(cam, 0x07, 0x18);
        err += sn9c102_write_reg(cam, 0xa0, 0x19);
 
-       err += sn9c102_i2c_try_raw_write(cam, &mi0343, 4, mi0343.i2c_slave_id,
-                                        0x0d, 0x00, 0x01, 0, 0);
-       err += sn9c102_i2c_try_raw_write(cam, &mi0343, 4, mi0343.i2c_slave_id,
-                                        0x0d, 0x00, 0x00, 0, 0);
-       err += sn9c102_i2c_try_raw_write(cam, &mi0343, 4, mi0343.i2c_slave_id,
-                                        0x03, 0x01, 0xe1, 0, 0);
-       err += sn9c102_i2c_try_raw_write(cam, &mi0343, 4, mi0343.i2c_slave_id,
-                                        0x04, 0x02, 0x81, 0, 0);
-       err += sn9c102_i2c_try_raw_write(cam, &mi0343, 4, mi0343.i2c_slave_id,
-                                        0x05, 0x00, 0x17, 0, 0);
-       err += sn9c102_i2c_try_raw_write(cam, &mi0343, 4, mi0343.i2c_slave_id,
-                                        0x06, 0x00, 0x11, 0, 0);
-       err += sn9c102_i2c_try_raw_write(cam, &mi0343, 4, mi0343.i2c_slave_id,
-                                        0x62, 0x04, 0x9a, 0, 0);
+       err += sn9c102_i2c_try_raw_write(cam, s, 4, s->i2c_slave_id, 0x0d,
+                                        0x00, 0x01, 0, 0);
+       err += sn9c102_i2c_try_raw_write(cam, s, 4, s->i2c_slave_id, 0x0d,
+                                        0x00, 0x00, 0, 0);
+       err += sn9c102_i2c_try_raw_write(cam, s, 4, s->i2c_slave_id, 0x03,
+                                        0x01, 0xe1, 0, 0);
+       err += sn9c102_i2c_try_raw_write(cam, s, 4, s->i2c_slave_id, 0x04,
+                                        0x02, 0x81, 0, 0);
+       err += sn9c102_i2c_try_raw_write(cam, s, 4, s->i2c_slave_id, 0x05,
+                                        0x00, 0x17, 0, 0);
+       err += sn9c102_i2c_try_raw_write(cam, s, 4, s->i2c_slave_id, 0x06,
+                                        0x00, 0x11, 0, 0);
+       err += sn9c102_i2c_try_raw_write(cam, s, 4, s->i2c_slave_id, 0x62,
+                                        0x04, 0x9a, 0, 0);
 
        return err;
 }
@@ -60,43 +57,46 @@ static int mi0343_init(struct sn9c102_device* cam)
 static int mi0343_get_ctrl(struct sn9c102_device* cam,
                           struct v4l2_control* ctrl)
 {
+       struct sn9c102_sensor* s = sn9c102_get_sensor(cam);
+       u8 data[5+1];
+
        switch (ctrl->id) {
        case V4L2_CID_EXPOSURE:
-               if (sn9c102_i2c_try_raw_read(cam, &mi0343, mi0343.i2c_slave_id,
-                                            0x09, 2+1, mi0343_i2c_data) < 0)
+               if (sn9c102_i2c_try_raw_read(cam, s, s->i2c_slave_id, 0x09,
+                                            2+1, data) < 0)
                        return -EIO;
-               ctrl->value = mi0343_i2c_data[2];
+               ctrl->value = data[2];
                return 0;
        case V4L2_CID_GAIN:
-               if (sn9c102_i2c_try_raw_read(cam, &mi0343, mi0343.i2c_slave_id,
-                                            0x35, 2+1, mi0343_i2c_data) < 0)
+               if (sn9c102_i2c_try_raw_read(cam, s, s->i2c_slave_id, 0x35,
+                                            2+1, data) < 0)
                        return -EIO;
                break;
        case V4L2_CID_HFLIP:
-               if (sn9c102_i2c_try_raw_read(cam, &mi0343, mi0343.i2c_slave_id,
-                                            0x20, 2+1, mi0343_i2c_data) < 0)
+               if (sn9c102_i2c_try_raw_read(cam, s, s->i2c_slave_id, 0x20,
+                                            2+1, data) < 0)
                        return -EIO;
-               ctrl->value = mi0343_i2c_data[3] & 0x20 ? 1 : 0;
+               ctrl->value = data[3] & 0x20 ? 1 : 0;
                return 0;
        case V4L2_CID_VFLIP:
-               if (sn9c102_i2c_try_raw_read(cam, &mi0343, mi0343.i2c_slave_id,
-                                            0x20, 2+1, mi0343_i2c_data) < 0)
+               if (sn9c102_i2c_try_raw_read(cam, s, s->i2c_slave_id, 0x20,
+                                            2+1, data) < 0)
                        return -EIO;
-               ctrl->value = mi0343_i2c_data[3] & 0x80 ? 1 : 0;
+               ctrl->value = data[3] & 0x80 ? 1 : 0;
                return 0;
        case V4L2_CID_RED_BALANCE:
-               if (sn9c102_i2c_try_raw_read(cam, &mi0343, mi0343.i2c_slave_id,
-                                            0x2d, 2+1, mi0343_i2c_data) < 0)
+               if (sn9c102_i2c_try_raw_read(cam, s, s->i2c_slave_id, 0x2d,
+                                            2+1, data) < 0)
                        return -EIO;
                break;
        case V4L2_CID_BLUE_BALANCE:
-               if (sn9c102_i2c_try_raw_read(cam, &mi0343, mi0343.i2c_slave_id,
-                                            0x2c, 2+1, mi0343_i2c_data) < 0)
+               if (sn9c102_i2c_try_raw_read(cam, s, s->i2c_slave_id, 0x2c,
+                                            2+1, data) < 0)
                        return -EIO;
                break;
        case SN9C102_V4L2_CID_GREEN_BALANCE:
-               if (sn9c102_i2c_try_raw_read(cam, &mi0343, mi0343.i2c_slave_id,
-                                            0x2e, 2+1, mi0343_i2c_data) < 0)
+               if (sn9c102_i2c_try_raw_read(cam, s, s->i2c_slave_id, 0x2e,
+                                            2+1, data) < 0)
                        return -EIO;
                break;
        default:
@@ -108,7 +108,7 @@ static int mi0343_get_ctrl(struct sn9c102_device* cam,
        case V4L2_CID_RED_BALANCE:
        case V4L2_CID_BLUE_BALANCE:
        case SN9C102_V4L2_CID_GREEN_BALANCE:
-               ctrl->value = mi0343_i2c_data[3] | (mi0343_i2c_data[2] << 8);
+               ctrl->value = data[3] | (data[2] << 8);
                if (ctrl->value >= 0x10 && ctrl->value <= 0x3f)
                        ctrl->value -= 0x10;
                else if (ctrl->value >= 0x60 && ctrl->value <= 0x7f)
@@ -124,6 +124,7 @@ static int mi0343_get_ctrl(struct sn9c102_device* cam,
 static int mi0343_set_ctrl(struct sn9c102_device* cam,
                           const struct v4l2_control* ctrl)
 {
+       struct sn9c102_sensor* s = sn9c102_get_sensor(cam);
        u16 reg = 0;
        int err = 0;
 
@@ -143,50 +144,42 @@ static int mi0343_set_ctrl(struct sn9c102_device* cam,
 
        switch (ctrl->id) {
        case V4L2_CID_EXPOSURE:
-               err += sn9c102_i2c_try_raw_write(cam, &mi0343, 4,
-                                                mi0343.i2c_slave_id,
+               err += sn9c102_i2c_try_raw_write(cam, s, 4, s->i2c_slave_id,
                                                 0x09, ctrl->value, 0x00,
                                                 0, 0);
                break;
        case V4L2_CID_GAIN:
-               err += sn9c102_i2c_try_raw_write(cam, &mi0343, 4,
-                                                mi0343.i2c_slave_id,
+               err += sn9c102_i2c_try_raw_write(cam, s, 4, s->i2c_slave_id,
                                                 0x35, reg >> 8, reg & 0xff,
                                                 0, 0);
                break;
        case V4L2_CID_HFLIP:
-               err += sn9c102_i2c_try_raw_write(cam, &mi0343, 4,
-                                                mi0343.i2c_slave_id,
+               err += sn9c102_i2c_try_raw_write(cam, s, 4, s->i2c_slave_id,
                                                 0x20, ctrl->value ? 0x40:0x00,
                                                 ctrl->value ? 0x20:0x00,
                                                 0, 0);
                break;
        case V4L2_CID_VFLIP:
-               err += sn9c102_i2c_try_raw_write(cam, &mi0343, 4,
-                                                mi0343.i2c_slave_id,
+               err += sn9c102_i2c_try_raw_write(cam, s, 4, s->i2c_slave_id,
                                                 0x20, ctrl->value ? 0x80:0x00,
                                                 ctrl->value ? 0x80:0x00,
                                                 0, 0);
                break;
        case V4L2_CID_RED_BALANCE:
-               err += sn9c102_i2c_try_raw_write(cam, &mi0343, 4,
-                                                mi0343.i2c_slave_id,
+               err += sn9c102_i2c_try_raw_write(cam, s, 4, s->i2c_slave_id,
                                                 0x2d, reg >> 8, reg & 0xff,
                                                 0, 0);
                break;
        case V4L2_CID_BLUE_BALANCE:
-               err += sn9c102_i2c_try_raw_write(cam, &mi0343, 4,
-                                                mi0343.i2c_slave_id,
+               err += sn9c102_i2c_try_raw_write(cam, s, 4, s->i2c_slave_id,
                                                 0x2c, reg >> 8, reg & 0xff,
                                                 0, 0);
                break;
        case SN9C102_V4L2_CID_GREEN_BALANCE:
-               err += sn9c102_i2c_try_raw_write(cam, &mi0343, 4,
-                                                mi0343.i2c_slave_id,
+               err += sn9c102_i2c_try_raw_write(cam, s, 4, s->i2c_slave_id,
                                                 0x2b, reg >> 8, reg & 0xff,
                                                 0, 0);
-               err += sn9c102_i2c_try_raw_write(cam, &mi0343, 4,
-                                                mi0343.i2c_slave_id,
+               err += sn9c102_i2c_try_raw_write(cam, s, 4, s->i2c_slave_id,
                                                 0x2e, reg >> 8, reg & 0xff,
                                                 0, 0);
                break;
@@ -216,16 +209,15 @@ static int mi0343_set_crop(struct sn9c102_device* cam,
 static int mi0343_set_pix_format(struct sn9c102_device* cam,
                                 const struct v4l2_pix_format* pix)
 {
+       struct sn9c102_sensor* s = sn9c102_get_sensor(cam);
        int err = 0;
 
        if (pix->pixelformat == V4L2_PIX_FMT_SN9C10X) {
-               err += sn9c102_i2c_try_raw_write(cam, &mi0343, 4,
-                                                mi0343.i2c_slave_id,
+               err += sn9c102_i2c_try_raw_write(cam, s, 4, s->i2c_slave_id,
                                                 0x0a, 0x00, 0x03, 0, 0);
                err += sn9c102_write_reg(cam, 0x20, 0x19);
        } else {
-               err += sn9c102_i2c_try_raw_write(cam, &mi0343, 4,
-                                                mi0343.i2c_slave_id,
+               err += sn9c102_i2c_try_raw_write(cam, s, 4, s->i2c_slave_id,
                                                 0x0a, 0x00, 0x05, 0, 0);
                err += sn9c102_write_reg(cam, 0xa0, 0x19);
        }
@@ -237,7 +229,7 @@ static int mi0343_set_pix_format(struct sn9c102_device* cam,
 static struct sn9c102_sensor mi0343 = {
        .name = "MI-0343",
        .maintainer = "Luca Risolia <luca.risolia@studio.unibo.it>",
-       .supported_bridge = BRIDGE_SN9C101 | BRIDGE_SN9C102 | BRIDGE_SN9C103,
+       .supported_bridge = BRIDGE_SN9C101 | BRIDGE_SN9C102,
        .frequency = SN9C102_I2C_100KHZ,
        .interface = SN9C102_I2C_2WIRES,
        .i2c_slave_id = 0x5d,
@@ -343,6 +335,7 @@ static struct sn9c102_sensor mi0343 = {
 
 int sn9c102_probe_mi0343(struct sn9c102_device* cam)
 {
+       u8 data[5+1];
        int err = 0;
 
        err += sn9c102_write_reg(cam, 0x01, 0x01);
@@ -352,10 +345,10 @@ int sn9c102_probe_mi0343(struct sn9c102_device* cam)
                return -EIO;
 
        if (sn9c102_i2c_try_raw_read(cam, &mi0343, mi0343.i2c_slave_id, 0x00,
-                                    2, mi0343_i2c_data) < 0)
+                                    2, data) < 0)
                return -EIO;
 
-       if (mi0343_i2c_data[4] != 0x32 && mi0343_i2c_data[3] != 0xe3)
+       if (data[4] != 0x32 || data[3] != 0xe3)
                return -ENODEV;
 
        sn9c102_attach_sensor(cam, &mi0343);