]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/media/video/mt9v022.c
V4L/DVB: remove unused #include <version.h>
[linux-2.6-omap-h63xx.git] / drivers / media / video / mt9v022.c
index 56808cd2f8a96ac1079db1dbb2d33782194feaf9..2584201059d8570efff3d72a59325e9a11a9d82a 100644 (file)
@@ -134,34 +134,56 @@ static int reg_clear(struct soc_camera_device *icd, const u8 reg,
 static int mt9v022_init(struct soc_camera_device *icd)
 {
        struct mt9v022 *mt9v022 = container_of(icd, struct mt9v022, icd);
+       struct soc_camera_link *icl = mt9v022->client->dev.platform_data;
        int ret;
 
+       if (icl->power) {
+               ret = icl->power(&mt9v022->client->dev, 1);
+               if (ret < 0) {
+                       dev_err(icd->vdev->parent,
+                               "Platform failed to power-on the camera.\n");
+                       return ret;
+               }
+       }
+
+       /*
+        * The camera could have been already on, we hard-reset it additionally,
+        * if available. Soft reset is done in video_probe().
+        */
+       if (icl->reset)
+               icl->reset(&mt9v022->client->dev);
+
        /* Almost the default mode: master, parallel, simultaneous, and an
         * undocumented bit 0x200, which is present in table 7, but not in 8,
         * plus snapshot mode to disable scan for now */
        mt9v022->chip_control |= 0x10;
        ret = reg_write(icd, MT9V022_CHIP_CONTROL, mt9v022->chip_control);
-       if (ret >= 0)
-               reg_write(icd, MT9V022_READ_MODE, 0x300);
+       if (!ret)
+               ret = reg_write(icd, MT9V022_READ_MODE, 0x300);
 
        /* All defaults */
-       if (ret >= 0)
+       if (!ret)
                /* AEC, AGC on */
                ret = reg_set(icd, MT9V022_AEC_AGC_ENABLE, 0x3);
-       if (ret >= 0)
+       if (!ret)
                ret = reg_write(icd, MT9V022_MAX_TOTAL_SHUTTER_WIDTH, 480);
-       if (ret >= 0)
+       if (!ret)
                /* default - auto */
                ret = reg_clear(icd, MT9V022_BLACK_LEVEL_CALIB_CTRL, 1);
-       if (ret >= 0)
+       if (!ret)
                ret = reg_write(icd, MT9V022_DIGITAL_TEST_PATTERN, 0);
 
-       return ret >= 0 ? 0 : -EIO;
+       return ret;
 }
 
 static int mt9v022_release(struct soc_camera_device *icd)
 {
-       /* Nothing? */
+       struct mt9v022 *mt9v022 = container_of(icd, struct mt9v022, icd);
+       struct soc_camera_link *icl = mt9v022->client->dev.platform_data;
+
+       if (icl->power)
+               icl->power(&mt9v022->client->dev, 0);
+
        return 0;
 }
 
@@ -352,21 +374,21 @@ static int mt9v022_set_fmt_cap(struct soc_camera_device *icd,
                                        rect->height + icd->y_skip_top + 43);
        }
        /* Setup frame format: defaults apart from width and height */
-       if (ret >= 0)
+       if (!ret)
                ret = reg_write(icd, MT9V022_COLUMN_START, rect->left);
-       if (ret >= 0)
+       if (!ret)
                ret = reg_write(icd, MT9V022_ROW_START, rect->top);
-       if (ret >= 0)
+       if (!ret)
                /* Default 94, Phytec driver says:
                 * "width + horizontal blank >= 660" */
                ret = reg_write(icd, MT9V022_HORIZONTAL_BLANKING,
                                rect->width > 660 - 43 ? 43 :
                                660 - rect->width);
-       if (ret >= 0)
+       if (!ret)
                ret = reg_write(icd, MT9V022_VERTICAL_BLANKING, 45);
-       if (ret >= 0)
+       if (!ret)
                ret = reg_write(icd, MT9V022_WINDOW_WIDTH, rect->width);
-       if (ret >= 0)
+       if (!ret)
                ret = reg_write(icd, MT9V022_WINDOW_HEIGHT,
                                rect->height + icd->y_skip_top);
 
@@ -717,7 +739,7 @@ static int mt9v022_video_probe(struct soc_camera_device *icd)
                        icd->num_formats = 1;
        }
 
-       if (ret >= 0)
+       if (!ret)
                ret = soc_camera_video_start(icd);
        if (ret < 0)
                goto eisis;