Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
[safe/jmp/linux-2.6] / drivers / media / video / gspca / spca508.c
index 7f262f2..edf0fe1 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * SPCA508 chip based cameras subdriver
  *
- * V4L2 by Jean-Francois Moine <http://moinejf.free.fr>
+ * Copyright (C) 2009 Jean-Francois Moine <http://moinejf.free.fr>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,9 +22,6 @@
 
 #include "gspca.h"
 
-#define DRIVER_VERSION_NUMBER  KERNEL_VERSION(2, 1, 5)
-static const char version[] = "2.1.5";
-
 MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>");
 MODULE_DESCRIPTION("GSPCA/SPCA508 USB Camera Driver");
 MODULE_LICENSE("GPL");
@@ -33,13 +30,9 @@ MODULE_LICENSE("GPL");
 struct sd {
        struct gspca_dev gspca_dev;             /* !! must be the first item */
 
-       int buflen;
-       unsigned char tmpbuf[352 * 288 * 3 / 2]; /* YUVY per line */
-       unsigned char tmpbuf2[352 * 288 * 2];   /* YUYV */
-
-       unsigned char brightness;
+       u8 brightness;
 
-       char subtype;
+       u8 subtype;
 #define CreativeVista 0
 #define HamaUSBSightcam 1
 #define HamaUSBSightcam2 2
@@ -52,7 +45,7 @@ struct sd {
 static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val);
 static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val);
 
-static struct ctrl sd_ctrls[] = {
+static const struct ctrl sd_ctrls[] = {
        {
            {
                .id      = V4L2_CID_BRIGHTNESS,
@@ -69,83 +62,58 @@ static struct ctrl sd_ctrls[] = {
        },
 };
 
-static struct v4l2_pix_format sif_mode[] = {
-       {160, 120, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE,
-               .bytesperline = 160 * 2,
-               .sizeimage = 160 * 120 * 2,
+static const struct v4l2_pix_format sif_mode[] = {
+       {160, 120, V4L2_PIX_FMT_SPCA508, V4L2_FIELD_NONE,
+               .bytesperline = 160,
+               .sizeimage = 160 * 120 * 3 / 2,
                .colorspace = V4L2_COLORSPACE_SRGB,
                .priv = 3},
-       {176, 144, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE,
-               .bytesperline = 176 * 2,
-               .sizeimage = 176 * 144 * 2,
+       {176, 144, V4L2_PIX_FMT_SPCA508, V4L2_FIELD_NONE,
+               .bytesperline = 176,
+               .sizeimage = 176 * 144 * 3 / 2,
                .colorspace = V4L2_COLORSPACE_SRGB,
                .priv = 2},
-       {320, 240, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE,
-               .bytesperline = 320 * 2,
-               .sizeimage = 320 * 240 * 2,
+       {320, 240, V4L2_PIX_FMT_SPCA508, V4L2_FIELD_NONE,
+               .bytesperline = 320,
+               .sizeimage = 320 * 240 * 3 / 2,
                .colorspace = V4L2_COLORSPACE_SRGB,
                .priv = 1},
-       {352, 288, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE,
-               .bytesperline = 352 * 2,
-               .sizeimage = 352 * 288 * 2,
+       {352, 288, V4L2_PIX_FMT_SPCA508, V4L2_FIELD_NONE,
+               .bytesperline = 352,
+               .sizeimage = 352 * 288 * 3 / 2,
                .colorspace = V4L2_COLORSPACE_SRGB,
                .priv = 0},
 };
 
 /* Frame packet header offsets for the spca508 */
-#define SPCA508_OFFSET_TYPE 1
-#define SPCA508_OFFSET_COMPRESS 2
-#define SPCA508_OFFSET_FRAMSEQ 8
-#define SPCA508_OFFSET_WIN1LUM 11
 #define SPCA508_OFFSET_DATA 37
 
-#define SPCA508_SNAPBIT 0x20
-#define SPCA508_SNAPCTRL 0x40
-/*************** I2c ****************/
-#define SPCA508_INDEX_I2C_BASE 0x8800
-
 /*
  * Initialization data: this is the first set-up data written to the
  * device (before the open data).
  */
-static const __u16 spca508_init_data[][3] =
-#define IGN(x)                 /* nothing */
+static const u16 spca508_init_data[][2] =
 {
-       /*  line   URB      value, index */
-       /* 44274  1804 */ {0x0000, 0x870b},
-
-       /* 44299  1805 */ {0x0020, 0x8112},
-       /* Video drop enable, ISO streaming disable */
-       /* 44324  1806 */ {0x0003, 0x8111},
-       /* Reset compression & memory */
-       /* 44349  1807 */ {0x0000, 0x8110},
-       /* Disable all outputs */
-       /* 44372  1808 */ /* READ {0x0000, 0x8114} -> 0000: 00  */
-       /* 44398  1809 */ {0x0000, 0x8114},
-       /* SW GPIO data */
-       /* 44423  1810 */ {0x0008, 0x8110},
-       /* Enable charge pump output */
-       /* 44527  1811 */ {0x0002, 0x8116},
-       /* 200 kHz pump clock */
-       /* 44555  1812 */
-               /* UNKNOWN DIRECTION (URB_FUNCTION_SELECT_INTERFACE:) */
-       /* 44590  1813 */ {0x0003, 0x8111},
-       /* Reset compression & memory */
-       /* 44615  1814 */ {0x0000, 0x8111},
-       /* Normal mode (not reset) */
-       /* 44640  1815 */ {0x0098, 0x8110},
-       /* Enable charge pump output, sync.serial,external 2x clock */
-       /* 44665  1816 */ {0x000d, 0x8114},
-       /* SW GPIO data */
-       /* 44690  1817 */ {0x0002, 0x8116},
-       /* 200 kHz pump clock */
-       /* 44715  1818 */ {0x0020, 0x8112},
-       /* Video drop enable, ISO streaming disable */
+       {0x0000, 0x870b},
+
+       {0x0020, 0x8112},       /* Video drop enable, ISO streaming disable */
+       {0x0003, 0x8111},       /* Reset compression & memory */
+       {0x0000, 0x8110},       /* Disable all outputs */
+       /* READ {0x0000, 0x8114} -> 0000: 00  */
+       {0x0000, 0x8114},       /* SW GPIO data */
+       {0x0008, 0x8110},       /* Enable charge pump output */
+       {0x0002, 0x8116},       /* 200 kHz pump clock */
+       /* UNKNOWN DIRECTION (URB_FUNCTION_SELECT_INTERFACE:) */
+       {0x0003, 0x8111},       /* Reset compression & memory */
+       {0x0000, 0x8111},       /* Normal mode (not reset) */
+       {0x0098, 0x8110},
+               /* Enable charge pump output, sync.serial,external 2x clock */
+       {0x000d, 0x8114},       /* SW GPIO data */
+       {0x0002, 0x8116},       /* 200 kHz pump clock */
+       {0x0020, 0x8112},       /* Video drop enable, ISO streaming disable */
 /* --------------------------------------- */
-       /* 44740  1819 */ {0x000f, 0x8402},
-       /* memory bank */
-       /* 44765  1820 */ {0x0000, 0x8403},
-       /* ... address */
+       {0x000f, 0x8402},       /* memory bank */
+       {0x0000, 0x8403},       /* ... address */
 /* --------------------------------------- */
 /* 0x88__ is Synchronous Serial Interface. */
 /* TBD: This table could be expressed more compactly */
@@ -153,475 +121,412 @@ static const __u16 spca508_init_data[][3] =
 /* TBD: Should see if the values in spca50x_i2c_data */
 /* would work with the VQ110 instead of the values */
 /* below. */
-       /* 44790  1821 */ {0x00c0, 0x8804},
-       /* SSI slave addr */
-       /* 44815  1822 */ {0x0008, 0x8802},
-       /* 375 Khz SSI clock */
-       /* 44838  1823 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 44862  1824 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 44888  1825 */ {0x0008, 0x8802},
-       /* 375 Khz SSI clock */
-       /* 44913  1826 */ {0x0012, 0x8801},
-       /* SSI reg addr */
-       /* 44938  1827 */ {0x0080, 0x8800},
-       /* SSI data to write */
-       /* 44961  1828 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 44985  1829 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 45009  1830 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 45035  1831 */ {0x0008, 0x8802},
-       /* 375 Khz SSI clock */
-       /* 45060  1832 */ {0x0012, 0x8801},
-       /* SSI reg addr */
-       /* 45085  1833 */ {0x0000, 0x8800},
-       /* SSI data to write */
-       /* 45108  1834 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 45132  1835 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 45156  1836 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 45182  1837 */ {0x0008, 0x8802},
-       /* 375 Khz SSI clock */
-       /* 45207  1838 */ {0x0011, 0x8801},
-       /* SSI reg addr */
-       /* 45232  1839 */ {0x0040, 0x8800},
-       /* SSI data to write */
-       /* 45255  1840 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 45279  1841 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 45303  1842 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 45329  1843 */ {0x0008, 0x8802},
-       /* 45354  1844 */ {0x0013, 0x8801},
-       /* 45379  1845 */ {0x0000, 0x8800},
-       /* 45402  1846 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 45426  1847 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 45450  1848 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 45476  1849 */ {0x0008, 0x8802},
-       /* 45501  1850 */ {0x0014, 0x8801},
-       /* 45526  1851 */ {0x0000, 0x8800},
-       /* 45549  1852 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 45573  1853 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 45597  1854 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 45623  1855 */ {0x0008, 0x8802},
-       /* 45648  1856 */ {0x0015, 0x8801},
-       /* 45673  1857 */ {0x0001, 0x8800},
-       /* 45696  1858 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 45720  1859 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 45744  1860 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 45770  1861 */ {0x0008, 0x8802},
-       /* 45795  1862 */ {0x0016, 0x8801},
-       /* 45820  1863 */ {0x0003, 0x8800},
-       /* 45843  1864 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 45867  1865 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 45891  1866 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 45917  1867 */ {0x0008, 0x8802},
-       /* 45942  1868 */ {0x0017, 0x8801},
-       /* 45967  1869 */ {0x0036, 0x8800},
-       /* 45990  1870 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 46014  1871 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 46038  1872 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 46064  1873 */ {0x0008, 0x8802},
-       /* 46089  1874 */ {0x0018, 0x8801},
-       /* 46114  1875 */ {0x00ec, 0x8800},
-       /* 46137  1876 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 46161  1877 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 46185  1878 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 46211  1879 */ {0x0008, 0x8802},
-       /* 46236  1880 */ {0x001a, 0x8801},
-       /* 46261  1881 */ {0x0094, 0x8800},
-       /* 46284  1882 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 46308  1883 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 46332  1884 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 46358  1885 */ {0x0008, 0x8802},
-       /* 46383  1886 */ {0x001b, 0x8801},
-       /* 46408  1887 */ {0x0000, 0x8800},
-       /* 46431  1888 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 46455  1889 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 46479  1890 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 46505  1891 */ {0x0008, 0x8802},
-       /* 46530  1892 */ {0x0027, 0x8801},
-       /* 46555  1893 */ {0x00a2, 0x8800},
-       /* 46578  1894 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 46602  1895 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 46626  1896 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 46652  1897 */ {0x0008, 0x8802},
-       /* 46677  1898 */ {0x0028, 0x8801},
-       /* 46702  1899 */ {0x0040, 0x8800},
-       /* 46725  1900 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 46749  1901 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 46773  1902 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 46799  1903 */ {0x0008, 0x8802},
-       /* 46824  1904 */ {0x002a, 0x8801},
-       /* 46849  1905 */ {0x0084, 0x8800},
-       /* 46872  1906 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 46896  1907 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
-       /* 46920  1908 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 46946  1909 */ {0x0008, 0x8802},
-       /* 46971  1910 */ {0x002b, 0x8801},
-       /* 46996  1911 */ {0x00a8, 0x8800},
-       /* 47019  1912 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 47043  1913 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 47067  1914 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 47093  1915 */ {0x0008, 0x8802},
-       /* 47118  1916 */ {0x002c, 0x8801},
-       /* 47143  1917 */ {0x00fe, 0x8800},
-       /* 47166  1918 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 47190  1919 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 47214  1920 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 47240  1921 */ {0x0008, 0x8802},
-       /* 47265  1922 */ {0x002d, 0x8801},
-       /* 47290  1923 */ {0x0003, 0x8800},
-       /* 47313  1924 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 47337  1925 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 47361  1926 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 47387  1927 */ {0x0008, 0x8802},
-       /* 47412  1928 */ {0x0038, 0x8801},
-       /* 47437  1929 */ {0x0083, 0x8800},
-       /* 47460  1930 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 47484  1931 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 47508  1932 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 47534  1933 */ {0x0008, 0x8802},
-       /* 47559  1934 */ {0x0033, 0x8801},
-       /* 47584  1935 */ {0x0081, 0x8800},
-       /* 47607  1936 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 47631  1937 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 47655  1938 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 47681  1939 */ {0x0008, 0x8802},
-       /* 47706  1940 */ {0x0034, 0x8801},
-       /* 47731  1941 */ {0x004a, 0x8800},
-       /* 47754  1942 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 47778  1943 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 47802  1944 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 47828  1945 */ {0x0008, 0x8802},
-       /* 47853  1946 */ {0x0039, 0x8801},
-       /* 47878  1947 */ {0x0000, 0x8800},
-       /* 47901  1948 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 47925  1949 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 47949  1950 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 47975  1951 */ {0x0008, 0x8802},
-       /* 48000  1952 */ {0x0010, 0x8801},
-       /* 48025  1953 */ {0x00a8, 0x8800},
-       /* 48048  1954 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 48072  1955 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 48096  1956 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 48122  1957 */ {0x0008, 0x8802},
-       /* 48147  1958 */ {0x0006, 0x8801},
-       /* 48172  1959 */ {0x0058, 0x8800},
-       /* 48195  1960 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 48219  1961 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
-       /* 48243  1962 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 48269  1963 */ {0x0008, 0x8802},
-       /* 48294  1964 */ {0x0000, 0x8801},
-       /* 48319  1965 */ {0x0004, 0x8800},
-       /* 48342  1966 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 48366  1967 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 48390  1968 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 48416  1969 */ {0x0008, 0x8802},
-       /* 48441  1970 */ {0x0040, 0x8801},
-       /* 48466  1971 */ {0x0080, 0x8800},
-       /* 48489  1972 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 48513  1973 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 48537  1974 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 48563  1975 */ {0x0008, 0x8802},
-       /* 48588  1976 */ {0x0041, 0x8801},
-       /* 48613  1977 */ {0x000c, 0x8800},
-       /* 48636  1978 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 48660  1979 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 48684  1980 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 48710  1981 */ {0x0008, 0x8802},
-       /* 48735  1982 */ {0x0042, 0x8801},
-       /* 48760  1983 */ {0x000c, 0x8800},
-       /* 48783  1984 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 48807  1985 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 48831  1986 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 48857  1987 */ {0x0008, 0x8802},
-       /* 48882  1988 */ {0x0043, 0x8801},
-       /* 48907  1989 */ {0x0028, 0x8800},
-       /* 48930  1990 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 48954  1991 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 48978  1992 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 49004  1993 */ {0x0008, 0x8802},
-       /* 49029  1994 */ {0x0044, 0x8801},
-       /* 49054  1995 */ {0x0080, 0x8800},
-       /* 49077  1996 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 49101  1997 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 49125  1998 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 49151  1999 */ {0x0008, 0x8802},
-       /* 49176  2000 */ {0x0045, 0x8801},
-       /* 49201  2001 */ {0x0020, 0x8800},
-       /* 49224  2002 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 49248  2003 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 49272  2004 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 49298  2005 */ {0x0008, 0x8802},
-       /* 49323  2006 */ {0x0046, 0x8801},
-       /* 49348  2007 */ {0x0020, 0x8800},
-       /* 49371  2008 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 49395  2009 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 49419  2010 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 49445  2011 */ {0x0008, 0x8802},
-       /* 49470  2012 */ {0x0047, 0x8801},
-       /* 49495  2013 */ {0x0080, 0x8800},
-       /* 49518  2014 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 49542  2015 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 49566  2016 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 49592  2017 */ {0x0008, 0x8802},
-       /* 49617  2018 */ {0x0048, 0x8801},
-       /* 49642  2019 */ {0x004c, 0x8800},
-       /* 49665  2020 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 49689  2021 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 49713  2022 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 49739  2023 */ {0x0008, 0x8802},
-       /* 49764  2024 */ {0x0049, 0x8801},
-       /* 49789  2025 */ {0x0084, 0x8800},
-       /* 49812  2026 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 49836  2027 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 49860  2028 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 49886  2029 */ {0x0008, 0x8802},
-       /* 49911  2030 */ {0x004a, 0x8801},
-       /* 49936  2031 */ {0x0084, 0x8800},
-       /* 49959  2032 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 49983  2033 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 50007  2034 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 50033  2035 */ {0x0008, 0x8802},
-       /* 50058  2036 */ {0x004b, 0x8801},
-       /* 50083  2037 */ {0x0084, 0x8800},
-       /* 50106  2038 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
+       {0x00c0, 0x8804},       /* SSI slave addr */
+       {0x0008, 0x8802},       /* 375 Khz SSI clock */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},       /* 375 Khz SSI clock */
+       {0x0012, 0x8801},       /* SSI reg addr */
+       {0x0080, 0x8800},       /* SSI data to write */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},       /* 375 Khz SSI clock */
+       {0x0012, 0x8801},       /* SSI reg addr */
+       {0x0000, 0x8800},       /* SSI data to write */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},       /* 375 Khz SSI clock */
+       {0x0011, 0x8801},       /* SSI reg addr */
+       {0x0040, 0x8800},       /* SSI data to write */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0013, 0x8801},
+       {0x0000, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0014, 0x8801},
+       {0x0000, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0015, 0x8801},
+       {0x0001, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0016, 0x8801},
+       {0x0003, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0017, 0x8801},
+       {0x0036, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0018, 0x8801},
+       {0x00ec, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x001a, 0x8801},
+       {0x0094, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x001b, 0x8801},
+       {0x0000, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0027, 0x8801},
+       {0x00a2, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0028, 0x8801},
+       {0x0040, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x002a, 0x8801},
+       {0x0084, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00 */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x002b, 0x8801},
+       {0x00a8, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x002c, 0x8801},
+       {0x00fe, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x002d, 0x8801},
+       {0x0003, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0038, 0x8801},
+       {0x0083, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0033, 0x8801},
+       {0x0081, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0034, 0x8801},
+       {0x004a, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0039, 0x8801},
+       {0x0000, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0010, 0x8801},
+       {0x00a8, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0006, 0x8801},
+       {0x0058, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00 */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0000, 0x8801},
+       {0x0004, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0040, 0x8801},
+       {0x0080, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0041, 0x8801},
+       {0x000c, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0042, 0x8801},
+       {0x000c, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0043, 0x8801},
+       {0x0028, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0044, 0x8801},
+       {0x0080, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0045, 0x8801},
+       {0x0020, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0046, 0x8801},
+       {0x0020, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0047, 0x8801},
+       {0x0080, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0048, 0x8801},
+       {0x004c, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x0049, 0x8801},
+       {0x0084, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x004a, 0x8801},
+       {0x0084, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x0008, 0x8802},
+       {0x004b, 0x8801},
+       {0x0084, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
        /* --------------------------------------- */
-       /* 50132  2039 */ {0x0012, 0x8700},
-       /* Clock speed 48Mhz/(2+2)/2= 6 Mhz */
-       /* 50157  2040 */ {0x0000, 0x8701},
-       /* CKx1 clock delay adj */
-       /* 50182  2041 */ {0x0000, 0x8701},
-       /* CKx1 clock delay adj */
-       /* 50207  2042 */ {0x0001, 0x870c},
-       /* CKOx2 output */
+       {0x0012, 0x8700},       /* Clock speed 48Mhz/(2+2)/2= 6 Mhz */
+       {0x0000, 0x8701},       /* CKx1 clock delay adj */
+       {0x0000, 0x8701},       /* CKx1 clock delay adj */
+       {0x0001, 0x870c},       /* CKOx2 output */
        /* --------------------------------------- */
-       /* 50232  2043 */ {0x0080, 0x8600},
-       /* Line memory read counter (L) */
-       /* 50257  2044 */ {0x0001, 0x8606},
-       /* reserved */
-       /* 50282  2045 */ {0x0064, 0x8607},
-       /* Line memory read counter (H) 0x6480=25,728 */
-       /* 50307  2046 */ {0x002a, 0x8601},
-       /* CDSP sharp interpolation mode,
+       {0x0080, 0x8600},       /* Line memory read counter (L) */
+       {0x0001, 0x8606},       /* reserved */
+       {0x0064, 0x8607},       /* Line memory read counter (H) 0x6480=25,728 */
+       {0x002a, 0x8601},       /* CDSP sharp interpolation mode,
         *                      line sel for color sep, edge enhance enab */
-       /* 50332  2047 */ {0x0000, 0x8602},
-       /* optical black level for user settng = 0 */
-       /* 50357  2048 */ {0x0080, 0x8600},
-       /* Line memory read counter (L) */
-       /* 50382  2049 */ {0x000a, 0x8603},
-       /* optical black level calc mode: auto; optical black offset = 10 */
-       /* 50407  2050 */ {0x00df, 0x865b},
-       /* Horiz offset for valid pixels (L)=0xdf */
-       /* 50432  2051 */ {0x0012, 0x865c},
-       /* Vert offset for valid lines (L)=0x12 */
+       {0x0000, 0x8602},       /* optical black level for user settng = 0 */
+       {0x0080, 0x8600},       /* Line memory read counter (L) */
+       {0x000a, 0x8603},       /* optical black level calc mode:
+                                * auto; optical black offset = 10 */
+       {0x00df, 0x865b},       /* Horiz offset for valid pixels (L)=0xdf */
+       {0x0012, 0x865c},       /* Vert offset for valid lines (L)=0x12 */
 
 /* The following two lines seem to be the "wrong" resolution. */
 /* But perhaps these indicate the actual size of the sensor */
 /* rather than the size of the current video mode. */
-       /* 50457  2052 */ {0x0058, 0x865d},
-       /* Horiz valid pixels (*4) (L) = 352 */
-       /* 50482  2053 */ {0x0048, 0x865e},
-       /* Vert valid lines (*4) (L) = 288 */
-
-       /* 50507  2054 */ {0x0015, 0x8608},
-       /* A11 Coef ... */
-       /* 50532  2055 */ {0x0030, 0x8609},
-       /* 50557  2056 */ {0x00fb, 0x860a},
-       /* 50582  2057 */ {0x003e, 0x860b},
-       /* 50607  2058 */ {0x00ce, 0x860c},
-       /* 50632  2059 */ {0x00f4, 0x860d},
-       /* 50657  2060 */ {0x00eb, 0x860e},
-       /* 50682  2061 */ {0x00dc, 0x860f},
-       /* 50707  2062 */ {0x0039, 0x8610},
-       /* 50732  2063 */ {0x0001, 0x8611},
-       /* R offset for white balance ... */
-       /* 50757  2064 */ {0x0000, 0x8612},
-       /* 50782  2065 */ {0x0001, 0x8613},
-       /* 50807  2066 */ {0x0000, 0x8614},
-       /* 50832  2067 */ {0x005b, 0x8651},
-       /* R gain for white balance ... */
-       /* 50857  2068 */ {0x0040, 0x8652},
-       /* 50882  2069 */ {0x0060, 0x8653},
-       /* 50907  2070 */ {0x0040, 0x8654},
-       /* 50932  2071 */ {0x0000, 0x8655},
-       /* 50957  2072 */ {0x0001, 0x863f},
-       /* Fixed gamma correction enable, USB control,
-        *                       lum filter disable, lum noise clip disable */
-       /* 50982  2073 */ {0x00a1, 0x8656},
-       /* Window1 size 256x256, Windows2 size 64x64,
-        *               gamma look-up disable, new edge enhancement enable */
-       /* 51007  2074 */ {0x0018, 0x8657},
-       /* Edge gain high thresh */
-       /* 51032  2075 */ {0x0020, 0x8658},
-       /* Edge gain low thresh */
-       /* 51057  2076 */ {0x000a, 0x8659},
-       /* Edge bandwidth high threshold */
-       /* 51082  2077 */ {0x0005, 0x865a},
-       /* Edge bandwidth low threshold */
+       {0x0058, 0x865d},       /* Horiz valid pixels (*4) (L) = 352 */
+       {0x0048, 0x865e},       /* Vert valid lines (*4) (L) = 288 */
+
+       {0x0015, 0x8608},       /* A11 Coef ... */
+       {0x0030, 0x8609},
+       {0x00fb, 0x860a},
+       {0x003e, 0x860b},
+       {0x00ce, 0x860c},
+       {0x00f4, 0x860d},
+       {0x00eb, 0x860e},
+       {0x00dc, 0x860f},
+       {0x0039, 0x8610},
+       {0x0001, 0x8611},       /* R offset for white balance ... */
+       {0x0000, 0x8612},
+       {0x0001, 0x8613},
+       {0x0000, 0x8614},
+       {0x005b, 0x8651},       /* R gain for white balance ... */
+       {0x0040, 0x8652},
+       {0x0060, 0x8653},
+       {0x0040, 0x8654},
+       {0x0000, 0x8655},
+       {0x0001, 0x863f},       /* Fixed gamma correction enable, USB control,
+                                * lum filter disable, lum noise clip disable */
+       {0x00a1, 0x8656},       /* Window1 size 256x256, Windows2 size 64x64,
+                                * gamma look-up disable,
+                                * new edge enhancement enable */
+       {0x0018, 0x8657},       /* Edge gain high thresh */
+       {0x0020, 0x8658},       /* Edge gain low thresh */
+       {0x000a, 0x8659},       /* Edge bandwidth high threshold */
+       {0x0005, 0x865a},       /* Edge bandwidth low threshold */
        /* -------------------------------- */
-       /* 51107  2078 */ {0x0030, 0x8112},
-       /* Video drop enable, ISO streaming enable */
-       /* 51130  2079 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 51154  2080 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 51180  2081 */ {0xa908, 0x8802},
-       /* 51205  2082 */ {0x0034, 0x8801},
-       /* SSI reg addr */
-       /* 51230  2083 */ {0x00ca, 0x8800},
+       {0x0030, 0x8112},       /* Video drop enable, ISO streaming enable */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0xa908, 0x8802},
+       {0x0034, 0x8801},       /* SSI reg addr */
+       {0x00ca, 0x8800},
        /* SSI data to write */
-       /* 51253  2084 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 51277  2085 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 51301  2086 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 51327  2087 */ {0x1f08, 0x8802},
-       /* 51352  2088 */ {0x0006, 0x8801},
-       /* 51377  2089 */ {0x0080, 0x8800},
-       /* 51400  2090 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0x1f08, 0x8802},
+       {0x0006, 0x8801},
+       {0x0080, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
 
 /* ----- Read back coefs we wrote earlier. */
-       /* 51424  2091 */ /* READ { 0, 0x0000, 0x8608 } -> 0000: 15  */
-       /* 51448  2092 */ /* READ { 0, 0x0000, 0x8609 } -> 0000: 30  */
-       /* 51472  2093 */ /* READ { 0, 0x0000, 0x860a } -> 0000: fb  */
-       /* 51496  2094 */ /* READ { 0, 0x0000, 0x860b } -> 0000: 3e  */
-       /* 51520  2095 */ /* READ { 0, 0x0000, 0x860c } -> 0000: ce  */
-       /* 51544  2096 */ /* READ { 0, 0x0000, 0x860d } -> 0000: f4  */
-       /* 51568  2097 */ /* READ { 0, 0x0000, 0x860e } -> 0000: eb  */
-       /* 51592  2098 */ /* READ { 0, 0x0000, 0x860f } -> 0000: dc  */
-       /* 51616  2099 */ /* READ { 0, 0x0000, 0x8610 } -> 0000: 39  */
-       /* 51640  2100 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 51664  2101 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08  */
-       /* 51690  2102 */ {0xb008, 0x8802},
-       /* 51715  2103 */ {0x0006, 0x8801},
-       /* 51740  2104 */ {0x007d, 0x8800},
-       /* 51763  2105 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0000, 0x8608 } -> 0000: 15  */
+       /* READ { 0x0000, 0x8609 } -> 0000: 30  */
+       /* READ { 0x0000, 0x860a } -> 0000: fb  */
+       /* READ { 0x0000, 0x860b } -> 0000: 3e  */
+       /* READ { 0x0000, 0x860c } -> 0000: ce  */
+       /* READ { 0x0000, 0x860d } -> 0000: f4  */
+       /* READ { 0x0000, 0x860e } -> 0000: eb  */
+       /* READ { 0x0000, 0x860f } -> 0000: dc  */
+       /* READ { 0x0000, 0x8610 } -> 0000: 39  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 08  */
+       {0xb008, 0x8802},
+       {0x0006, 0x8801},
+       {0x007d, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
 
 
        /* This chunk is seemingly redundant with */
        /* earlier commands (A11 Coef...), but if I disable it, */
        /* the image appears too dark.  Maybe there was some kind of */
        /* reset since the earlier commands, so this is necessary again. */
-       /* 51789  2106 */ {0x0015, 0x8608},
-       /* 51814  2107 */ {0x0030, 0x8609},
-       /* 51839  2108 */ {0xfffb, 0x860a},
-       /* 51864  2109 */ {0x003e, 0x860b},
-       /* 51889  2110 */ {0xffce, 0x860c},
-       /* 51914  2111 */ {0xfff4, 0x860d},
-       /* 51939  2112 */ {0xffeb, 0x860e},
-       /* 51964  2113 */ {0xffdc, 0x860f},
-       /* 51989  2114 */ {0x0039, 0x8610},
-       /* 52014  2115 */ {0x0018, 0x8657},
-
-       /* 52039  2116 */ {0x0000, 0x8508},
-       /* Disable compression. */
+       {0x0015, 0x8608},
+       {0x0030, 0x8609},
+       {0xfffb, 0x860a},
+       {0x003e, 0x860b},
+       {0xffce, 0x860c},
+       {0xfff4, 0x860d},
+       {0xffeb, 0x860e},
+       {0xffdc, 0x860f},
+       {0x0039, 0x8610},
+       {0x0018, 0x8657},
+
+       {0x0000, 0x8508},       /* Disable compression. */
        /* Previous line was:
-        * 52039  2116 *  { 0, 0x0021, 0x8508 },  * Enable compression. */
-       /* 52064  2117 */ {0x0032, 0x850b},
-       /* compression stuff */
-       /* 52089  2118 */ {0x0003, 0x8509},
-       /* compression stuff */
-       /* 52114  2119 */ {0x0011, 0x850a},
-       /* compression stuff */
-       /* 52139  2120 */ {0x0021, 0x850d},
-       /* compression stuff */
-       /* 52164  2121 */ {0x0010, 0x850c},
-       /* compression stuff */
-       /* 52189  2122 */ {0x0003, 0x8500},
-       /* *** Video mode: 160x120 */
-       /* 52214  2123 */ {0x0001, 0x8501},
-       /* Hardware-dominated snap control */
-       /* 52239  2124 */ {0x0061, 0x8656},
-       /* Window1 size 128x128, Windows2 size 128x128,
-        *              gamma look-up disable, new edge enhancement enable */
-       /* 52264  2125 */ {0x0018, 0x8617},
-       /* Window1 start X (*2) */
-       /* 52289  2126 */ {0x0008, 0x8618},
-       /* Window1 start Y (*2) */
-       /* 52314  2127 */ {0x0061, 0x8656},
-       /* Window1 size 128x128, Windows2 size 128x128,
-        *              gamma look-up disable, new edge enhancement enable */
-       /* 52339  2128 */ {0x0058, 0x8619},
-       /* Window2 start X (*2) */
-       /* 52364  2129 */ {0x0008, 0x861a},
-       /* Window2 start Y (*2) */
-       /* 52389  2130 */ {0x00ff, 0x8615},
-       /* High lum thresh for white balance */
-       /* 52414  2131 */ {0x0000, 0x8616},
-       /* Low lum thresh for white balance */
-       /* 52439  2132 */ {0x0012, 0x8700},
-       /* Clock speed 48Mhz/(2+2)/2= 6 Mhz */
-       /* 52464  2133 */ {0x0012, 0x8700},
-       /* Clock speed 48Mhz/(2+2)/2= 6 Mhz */
-       /* 52487  2134 */ /* READ { 0, 0x0000, 0x8656 } -> 0000: 61  */
-       /* 52513  2135 */ {0x0028, 0x8802},
-       /* 375 Khz SSI clock, SSI r/w sync with VSYNC */
-       /* 52536  2136 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 52560  2137 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 28  */
-       /* 52586  2138 */ {0x1f28, 0x8802},
-       /* 375 Khz SSI clock, SSI r/w sync with VSYNC */
-       /* 52611  2139 */ {0x0010, 0x8801},
-       /* SSI reg addr */
-       /* 52636  2140 */ {0x003e, 0x8800},
-       /* SSI data to write */
-       /* 52659  2141 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 52685  2142 */ {0x0028, 0x8802},
-       /* 52708  2143 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 52732  2144 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 28  */
-       /* 52758  2145 */ {0x1f28, 0x8802},
-       /* 52783  2146 */ {0x0000, 0x8801},
-       /* 52808  2147 */ {0x001f, 0x8800},
-       /* 52831  2148 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 52857  2149 */ {0x0001, 0x8602},
-       /* optical black level for user settning = 1 */
+       {0x0021, 0x8508},        * Enable compression. */
+       {0x0032, 0x850b},       /* compression stuff */
+       {0x0003, 0x8509},       /* compression stuff */
+       {0x0011, 0x850a},       /* compression stuff */
+       {0x0021, 0x850d},       /* compression stuff */
+       {0x0010, 0x850c},       /* compression stuff */
+       {0x0003, 0x8500},       /* *** Video mode: 160x120 */
+       {0x0001, 0x8501},       /* Hardware-dominated snap control */
+       {0x0061, 0x8656},       /* Window1 size 128x128, Windows2 size 128x128,
+                                * gamma look-up disable,
+                                * new edge enhancement enable */
+       {0x0018, 0x8617},       /* Window1 start X (*2) */
+       {0x0008, 0x8618},       /* Window1 start Y (*2) */
+       {0x0061, 0x8656},       /* Window1 size 128x128, Windows2 size 128x128,
+                                * gamma look-up disable,
+                                * new edge enhancement enable */
+       {0x0058, 0x8619},       /* Window2 start X (*2) */
+       {0x0008, 0x861a},       /* Window2 start Y (*2) */
+       {0x00ff, 0x8615},       /* High lum thresh for white balance */
+       {0x0000, 0x8616},       /* Low lum thresh for white balance */
+       {0x0012, 0x8700},       /* Clock speed 48Mhz/(2+2)/2= 6 Mhz */
+       {0x0012, 0x8700},       /* Clock speed 48Mhz/(2+2)/2= 6 Mhz */
+       /* READ { 0x0000, 0x8656 } -> 0000: 61  */
+       {0x0028, 0x8802},    /* 375 Khz SSI clock, SSI r/w sync with VSYNC */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 28  */
+       {0x1f28, 0x8802},    /* 375 Khz SSI clock, SSI r/w sync with VSYNC */
+       {0x0010, 0x8801},       /* SSI reg addr */
+       {0x003e, 0x8800},       /* SSI data to write */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       {0x0028, 0x8802},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 28  */
+       {0x1f28, 0x8802},
+       {0x0000, 0x8801},
+       {0x001f, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       {0x0001, 0x8602},    /* optical black level for user settning = 1 */
 
        /* Original: */
-       /* 52882  2150 */ {0x0023, 0x8700},
-       /* Clock speed 48Mhz/(3+2)/4= 2.4 Mhz */
-       /* 52907  2151 */ {0x000f, 0x8602},
-       /* optical black level for user settning = 15 */
-
-       /* 52932  2152 */ {0x0028, 0x8802},
-       /* 52955  2153 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 52979  2154 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 28  */
-       /* 53005  2155 */ {0x1f28, 0x8802},
-       /* 53030  2156 */ {0x0010, 0x8801},
-       /* 53055  2157 */ {0x007b, 0x8800},
-       /* 53078  2158 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00  */
-       /* 53104  2159 */ {0x002f, 0x8651},
-       /* R gain for white balance ... */
-       /* 53129  2160 */ {0x0080, 0x8653},
-       /* 53152  2161 */ /* READ { 0, 0x0000, 0x8655 } -> 0000: 00  */
-       /* 53178  2162 */ {0x0000, 0x8655},
-
-       /* 53203  2163 */ {0x0030, 0x8112},
-       /* Video drop enable, ISO streaming enable */
-       /* 53228  2164 */ {0x0020, 0x8112},
-       /* Video drop enable, ISO streaming disable */
-       /* 53252  2165 */
-            /* UNKNOWN DIRECTION (URB_FUNCTION_SELECT_INTERFACE: (ALT=0) ) */
+       {0x0023, 0x8700},       /* Clock speed 48Mhz/(3+2)/4= 2.4 Mhz */
+       {0x000f, 0x8602},    /* optical black level for user settning = 15 */
+
+       {0x0028, 0x8802},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 28  */
+       {0x1f28, 0x8802},
+       {0x0010, 0x8801},
+       {0x007b, 0x8800},
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       {0x002f, 0x8651},       /* R gain for white balance ... */
+       {0x0080, 0x8653},
+       /* READ { 0x0000, 0x8655 } -> 0000: 00  */
+       {0x0000, 0x8655},
+
+       {0x0030, 0x8112},       /* Video drop enable, ISO streaming enable */
+       {0x0020, 0x8112},       /* Video drop enable, ISO streaming disable */
+       /* UNKNOWN DIRECTION (URB_FUNCTION_SELECT_INTERFACE: (ALT=0) ) */
        {}
 };
 
-
 /*
  * Initialization data for Intel EasyPC Camera CS110
  */
-static const __u16 spca508cs110_init_data[][3] = {
-       {0x0000, 0x870b}, /* Reset CTL3 */
-       {0x0003, 0x8111}, /* Soft Reset compression, memory, TG & CDSP */
-       {0x0000, 0x8111}, /* Normal operation on reset */
+static const u16 spca508cs110_init_data[][2] = {
+       {0x0000, 0x870b},       /* Reset CTL3 */
+       {0x0003, 0x8111},       /* Soft Reset compression, memory, TG & CDSP */
+       {0x0000, 0x8111},       /* Normal operation on reset */
        {0x0090, 0x8110},
                 /* External Clock 2x & Synchronous Serial Interface Output */
-       {0x0020, 0x8112}, /* Video Drop packet enable */
-       {0x0000, 0x8114}, /* Software GPIO output data */
+       {0x0020, 0x8112},       /* Video Drop packet enable */
+       {0x0000, 0x8114},       /* Software GPIO output data */
        {0x0001, 0x8114},
        {0x0001, 0x8114},
        {0x0001, 0x8114},
        {0x0003, 0x8114},
 
        /* Initial sequence Synchronous Serial Interface */
-       {0x000f, 0x8402}, /* Memory bank Address */
-       {0x0000, 0x8403}, /* Memory bank Address */
-       {0x00ba, 0x8804}, /* SSI Slave address */
-       {0x0010, 0x8802}, /* 93.75kHz SSI Clock Two DataByte */
-       {0x0010, 0x8802}, /* 93.75kHz SSI Clock two DataByte */
+       {0x000f, 0x8402},       /* Memory bank Address */
+       {0x0000, 0x8403},       /* Memory bank Address */
+       {0x00ba, 0x8804},       /* SSI Slave address */
+       {0x0010, 0x8802},       /* 93.75kHz SSI Clock Two DataByte */
+       {0x0010, 0x8802},       /* 93.75kHz SSI Clock two DataByte */
 
        {0x0001, 0x8801},
-       {0x000a, 0x8805},/* a - NWG: Dunno what this is about */
+       {0x000a, 0x8805},       /* a - NWG: Dunno what this is about */
        {0x0000, 0x8800},
        {0x0010, 0x8802},
 
@@ -655,477 +560,477 @@ static const __u16 spca508cs110_init_data[][3] = {
        {0x0000, 0x8800},
        {0x0010, 0x8802},
 
-       {0x0002, 0x8704}, /* External input CKIx1 */
-       {0x0001, 0x8606}, /* 1 Line memory Read Counter (H) Result: (d)410 */
-       {0x009a, 0x8600}, /* Line memory Read Counter (L) */
-       {0x0001, 0x865b}, /* 1 Horizontal Offset for Valid Pixel(L) */
-       {0x0003, 0x865c}, /* 3 Vertical Offset for Valid Lines(L) */
-       {0x0058, 0x865d}, /* 58 Horizontal Valid Pixel Window(L) */
-
-       {0x0006, 0x8660}, /* Nibble data + input order */
-
-       {0x000a, 0x8602}, /* Optical black level set to 0x0a */
-/* 1945 */ {0x0000, 0x8603}, /* Optical black level Offset */
-
-/* 1962 *  {0, 0x0000, 0x8611},  * 0 R  Offset for white Balance */
-/* 1963 *  {0, 0x0000, 0x8612},  * 1 Gr Offset for white Balance */
-/* 1964 *  {0, 0x0000, 0x8613},  * 1f B  Offset for white Balance */
-/* 1965 *  {0, 0x0000, 0x8614},  * f0 Gb Offset for white Balance */
-
-       {0x0040, 0x8651}, /* 2b BLUE gain for white balance  good at all 60 */
-       {0x0030, 0x8652}, /* 41 Gr Gain for white Balance (L) */
-       {0x0035, 0x8653}, /* 26 RED gain for white balance */
-       {0x0035, 0x8654}, /* 40Gb Gain for white Balance (L) */
+       {0x0002, 0x8704},       /* External input CKIx1 */
+       {0x0001, 0x8606},    /* 1 Line memory Read Counter (H) Result: (d)410 */
+       {0x009a, 0x8600},       /* Line memory Read Counter (L) */
+       {0x0001, 0x865b},       /* 1 Horizontal Offset for Valid Pixel(L) */
+       {0x0003, 0x865c},       /* 3 Vertical Offset for Valid Lines(L) */
+       {0x0058, 0x865d},       /* 58 Horizontal Valid Pixel Window(L) */
+
+       {0x0006, 0x8660},       /* Nibble data + input order */
+
+       {0x000a, 0x8602},       /* Optical black level set to 0x0a */
+       {0x0000, 0x8603},       /* Optical black level Offset */
+
+/*     {0x0000, 0x8611},        * 0 R  Offset for white Balance */
+/*     {0x0000, 0x8612},        * 1 Gr Offset for white Balance */
+/*     {0x0000, 0x8613},        * 1f B  Offset for white Balance */
+/*     {0x0000, 0x8614},        * f0 Gb Offset for white Balance */
+
+       {0x0040, 0x8651},   /* 2b BLUE gain for white balance  good at all 60 */
+       {0x0030, 0x8652},       /* 41 Gr Gain for white Balance (L) */
+       {0x0035, 0x8653},       /* 26 RED gain for white balance */
+       {0x0035, 0x8654},       /* 40Gb Gain for white Balance (L) */
        {0x0041, 0x863f},
              /* Fixed Gamma correction enabled (makes colours look better) */
 
-/* 2422 */ {0x0000, 0x8655},
-       /* High bits for white balance*****brightness control*** */
+       {0x0000, 0x8655},
+               /* High bits for white balance*****brightness control*** */
        {}
 };
 
-static const __u16 spca508_sightcam_init_data[][3] = {
+static const u16 spca508_sightcam_init_data[][2] = {
 /* This line seems to setup the frame/canvas */
-       /*368  */ {0x000f, 0x8402},
+       {0x000f, 0x8402},
 
 /* Theese 6 lines are needed to startup the webcam */
-       /*398  */ {0x0090, 0x8110},
-       /*399  */ {0x0001, 0x8114},
-       /*400  */ {0x0001, 0x8114},
-       /*401  */ {0x0001, 0x8114},
-       /*402  */ {0x0003, 0x8114},
-       /*403  */ {0x0080, 0x8804},
+       {0x0090, 0x8110},
+       {0x0001, 0x8114},
+       {0x0001, 0x8114},
+       {0x0001, 0x8114},
+       {0x0003, 0x8114},
+       {0x0080, 0x8804},
 
 /* This part seems to make the pictures darker? (autobrightness?) */
-       /*436  */ {0x0001, 0x8801},
-       /*437  */ {0x0004, 0x8800},
-       /*439  */ {0x0003, 0x8801},
-       /*440  */ {0x00e0, 0x8800},
-       /*442  */ {0x0004, 0x8801},
-       /*443  */ {0x00b4, 0x8800},
-       /*445  */ {0x0005, 0x8801},
-       /*446  */ {0x0000, 0x8800},
-
-       /*448  */ {0x0006, 0x8801},
-       /*449  */ {0x00e0, 0x8800},
-       /*451  */ {0x0007, 0x8801},
-       /*452  */ {0x000c, 0x8800},
+       {0x0001, 0x8801},
+       {0x0004, 0x8800},
+       {0x0003, 0x8801},
+       {0x00e0, 0x8800},
+       {0x0004, 0x8801},
+       {0x00b4, 0x8800},
+       {0x0005, 0x8801},
+       {0x0000, 0x8800},
+
+       {0x0006, 0x8801},
+       {0x00e0, 0x8800},
+       {0x0007, 0x8801},
+       {0x000c, 0x8800},
 
 /* This section is just needed, it probably
  * does something like the previous section,
  * but the cam won't start if it's not included.
  */
-       /*484  */ {0x0014, 0x8801},
-       /*485  */ {0x0008, 0x8800},
-       /*487  */ {0x0015, 0x8801},
-       /*488  */ {0x0067, 0x8800},
-       /*490  */ {0x0016, 0x8801},
-       /*491  */ {0x0000, 0x8800},
-       /*493  */ {0x0017, 0x8801},
-       /*494  */ {0x0020, 0x8800},
-       /*496  */ {0x0018, 0x8801},
-       /*497  */ {0x0044, 0x8800},
+       {0x0014, 0x8801},
+       {0x0008, 0x8800},
+       {0x0015, 0x8801},
+       {0x0067, 0x8800},
+       {0x0016, 0x8801},
+       {0x0000, 0x8800},
+       {0x0017, 0x8801},
+       {0x0020, 0x8800},
+       {0x0018, 0x8801},
+       {0x0044, 0x8800},
 
 /* Makes the picture darker - and the
  * cam won't start if not included
  */
-       /*505  */ {0x001e, 0x8801},
-       /*506  */ {0x00ea, 0x8800},
-       /*508  */ {0x001f, 0x8801},
-       /*509  */ {0x0001, 0x8800},
-       /*511  */ {0x0003, 0x8801},
-       /*512  */ {0x00e0, 0x8800},
+       {0x001e, 0x8801},
+       {0x00ea, 0x8800},
+       {0x001f, 0x8801},
+       {0x0001, 0x8800},
+       {0x0003, 0x8801},
+       {0x00e0, 0x8800},
 
 /* seems to place the colors ontop of each other #1 */
-       /*517  */ {0x0006, 0x8704},
-       /*518  */ {0x0001, 0x870c},
-       /*519  */ {0x0016, 0x8600},
-       /*520  */ {0x0002, 0x8606},
+       {0x0006, 0x8704},
+       {0x0001, 0x870c},
+       {0x0016, 0x8600},
+       {0x0002, 0x8606},
 
 /* if not included the pictures becomes _very_ dark */
-       /*521  */ {0x0064, 0x8607},
-       /*522  */ {0x003a, 0x8601},
-       /*523  */ {0x0000, 0x8602},
+       {0x0064, 0x8607},
+       {0x003a, 0x8601},
+       {0x0000, 0x8602},
 
 /* seems to place the colors ontop of each other #2 */
-       /*524  */ {0x0016, 0x8600},
-       /*525  */ {0x0018, 0x8617},
-       /*526  */ {0x0008, 0x8618},
-       /*527  */ {0x00a1, 0x8656},
+       {0x0016, 0x8600},
+       {0x0018, 0x8617},
+       {0x0008, 0x8618},
+       {0x00a1, 0x8656},
 
 /* webcam won't start if not included */
-       /*528  */ {0x0007, 0x865b},
-       /*529  */ {0x0001, 0x865c},
-       /*530  */ {0x0058, 0x865d},
-       /*531  */ {0x0048, 0x865e},
+       {0x0007, 0x865b},
+       {0x0001, 0x865c},
+       {0x0058, 0x865d},
+       {0x0048, 0x865e},
 
 /* adjusts the colors */
-       /*541  */ {0x0049, 0x8651},
-       /*542  */ {0x0040, 0x8652},
-       /*543  */ {0x004c, 0x8653},
-       /*544  */ {0x0040, 0x8654},
+       {0x0049, 0x8651},
+       {0x0040, 0x8652},
+       {0x004c, 0x8653},
+       {0x0040, 0x8654},
        {}
 };
 
-static const __u16 spca508_sightcam2_init_data[][3] = {
-/* 35 */ {0x0020, 0x8112},
-
-/* 36 */ {0x000f, 0x8402},
-/* 37 */ {0x0000, 0x8403},
-
-/* 38 */ {0x0008, 0x8201},
-/* 39 */ {0x0008, 0x8200},
-/* 40 */ {0x0001, 0x8200},
-/* 43 */ {0x0009, 0x8201},
-/* 44 */ {0x0008, 0x8200},
-/* 45 */ {0x0001, 0x8200},
-/* 48 */ {0x000a, 0x8201},
-/* 49 */ {0x0008, 0x8200},
-/* 50 */ {0x0001, 0x8200},
-/* 53 */ {0x000b, 0x8201},
-/* 54 */ {0x0008, 0x8200},
-/* 55 */ {0x0001, 0x8200},
-/* 58 */ {0x000c, 0x8201},
-/* 59 */ {0x0008, 0x8200},
-/* 60 */ {0x0001, 0x8200},
-/* 63 */ {0x000d, 0x8201},
-/* 64 */ {0x0008, 0x8200},
-/* 65 */ {0x0001, 0x8200},
-/* 68 */ {0x000e, 0x8201},
-/* 69 */ {0x0008, 0x8200},
-/* 70 */ {0x0001, 0x8200},
-/* 73 */ {0x0007, 0x8201},
-/* 74 */ {0x0008, 0x8200},
-/* 75 */ {0x0001, 0x8200},
-/* 78 */ {0x000f, 0x8201},
-/* 79 */ {0x0008, 0x8200},
-/* 80 */ {0x0001, 0x8200},
-
-/* 84 */ {0x0018, 0x8660},
-/* 85 */ {0x0010, 0x8201},
-
-/* 86 */ {0x0008, 0x8200},
-/* 87 */ {0x0001, 0x8200},
-/* 90 */ {0x0011, 0x8201},
-/* 91 */ {0x0008, 0x8200},
-/* 92 */ {0x0001, 0x8200},
-
-/* 95 */ {0x0000, 0x86b0},
-/* 96 */ {0x0034, 0x86b1},
-/* 97 */ {0x0000, 0x86b2},
-/* 98 */ {0x0049, 0x86b3},
-/* 99 */ {0x0000, 0x86b4},
-/* 100 */ {0x0000, 0x86b4},
-
-/* 101 */ {0x0012, 0x8201},
-/* 102 */ {0x0008, 0x8200},
-/* 103 */ {0x0001, 0x8200},
-/* 106 */ {0x0013, 0x8201},
-/* 107 */ {0x0008, 0x8200},
-/* 108 */ {0x0001, 0x8200},
-
-/* 111 */ {0x0001, 0x86b0},
-/* 112 */ {0x00aa, 0x86b1},
-/* 113 */ {0x0000, 0x86b2},
-/* 114 */ {0x00e4, 0x86b3},
-/* 115 */ {0x0000, 0x86b4},
-/* 116 */ {0x0000, 0x86b4},
-
-/* 118 */ {0x0018, 0x8660},
-
-/* 119 */ {0x0090, 0x8110},
-/* 120 */ {0x0001, 0x8114},
-/* 121 */ {0x0001, 0x8114},
-/* 122 */ {0x0001, 0x8114},
-/* 123 */ {0x0003, 0x8114},
-
-/* 124 */ {0x0080, 0x8804},
-/* 157 */ {0x0003, 0x8801},
-/* 158 */ {0x0012, 0x8800},
-/* 160 */ {0x0004, 0x8801},
-/* 161 */ {0x0005, 0x8800},
-/* 163 */ {0x0005, 0x8801},
-/* 164 */ {0x0000, 0x8800},
-/* 166 */ {0x0006, 0x8801},
-/* 167 */ {0x0000, 0x8800},
-/* 169 */ {0x0007, 0x8801},
-/* 170 */ {0x0000, 0x8800},
-/* 172 */ {0x0008, 0x8801},
-/* 173 */ {0x0005, 0x8800},
-/* 175 */ {0x000a, 0x8700},
-/* 176 */ {0x000e, 0x8801},
-/* 177 */ {0x0004, 0x8800},
-/* 179 */ {0x0005, 0x8801},
-/* 180 */ {0x0047, 0x8800},
-/* 182 */ {0x0006, 0x8801},
-/* 183 */ {0x0000, 0x8800},
-/* 185 */ {0x0007, 0x8801},
-/* 186 */ {0x00c0, 0x8800},
-/* 188 */ {0x0008, 0x8801},
-/* 189 */ {0x0003, 0x8800},
-/* 191 */ {0x0013, 0x8801},
-/* 192 */ {0x0001, 0x8800},
-/* 194 */ {0x0009, 0x8801},
-/* 195 */ {0x0000, 0x8800},
-/* 197 */ {0x000a, 0x8801},
-/* 198 */ {0x0000, 0x8800},
-/* 200 */ {0x000b, 0x8801},
-/* 201 */ {0x0000, 0x8800},
-/* 203 */ {0x000c, 0x8801},
-/* 204 */ {0x0000, 0x8800},
-/* 206 */ {0x000e, 0x8801},
-/* 207 */ {0x0004, 0x8800},
-/* 209 */ {0x000f, 0x8801},
-/* 210 */ {0x0000, 0x8800},
-/* 212 */ {0x0010, 0x8801},
-/* 213 */ {0x0006, 0x8800},
-/* 215 */ {0x0011, 0x8801},
-/* 216 */ {0x0006, 0x8800},
-/* 218 */ {0x0012, 0x8801},
-/* 219 */ {0x0000, 0x8800},
-/* 221 */ {0x0013, 0x8801},
-/* 222 */ {0x0001, 0x8800},
-
-/* 224 */ {0x000a, 0x8700},
-/* 225 */ {0x0000, 0x8702},
-/* 226 */ {0x0000, 0x8703},
-/* 227 */ {0x00c2, 0x8704},
-/* 228 */ {0x0001, 0x870c},
-
-/* 229 */ {0x0044, 0x8600},
-/* 230 */ {0x0002, 0x8606},
-/* 231 */ {0x0064, 0x8607},
-/* 232 */ {0x003a, 0x8601},
-/* 233 */ {0x0008, 0x8602},
-/* 234 */ {0x0044, 0x8600},
-/* 235 */ {0x0018, 0x8617},
-/* 236 */ {0x0008, 0x8618},
-/* 237 */ {0x00a1, 0x8656},
-/* 238 */ {0x0004, 0x865b},
-/* 239 */ {0x0002, 0x865c},
-/* 240 */ {0x0058, 0x865d},
-/* 241 */ {0x0048, 0x865e},
-/* 242 */ {0x0012, 0x8608},
-/* 243 */ {0x002c, 0x8609},
-/* 244 */ {0x0002, 0x860a},
-/* 245 */ {0x002c, 0x860b},
-/* 246 */ {0x00db, 0x860c},
-/* 247 */ {0x00f9, 0x860d},
-/* 248 */ {0x00f1, 0x860e},
-/* 249 */ {0x00e3, 0x860f},
-/* 250 */ {0x002c, 0x8610},
-/* 251 */ {0x006c, 0x8651},
-/* 252 */ {0x0041, 0x8652},
-/* 253 */ {0x0059, 0x8653},
-/* 254 */ {0x0040, 0x8654},
-/* 255 */ {0x00fa, 0x8611},
-/* 256 */ {0x00ff, 0x8612},
-/* 257 */ {0x00f8, 0x8613},
-/* 258 */ {0x0000, 0x8614},
-/* 259 */ {0x0001, 0x863f},
-/* 260 */ {0x0000, 0x8640},
-/* 261 */ {0x0026, 0x8641},
-/* 262 */ {0x0045, 0x8642},
-/* 263 */ {0x0060, 0x8643},
-/* 264 */ {0x0075, 0x8644},
-/* 265 */ {0x0088, 0x8645},
-/* 266 */ {0x009b, 0x8646},
-/* 267 */ {0x00b0, 0x8647},
-/* 268 */ {0x00c5, 0x8648},
-/* 269 */ {0x00d2, 0x8649},
-/* 270 */ {0x00dc, 0x864a},
-/* 271 */ {0x00e5, 0x864b},
-/* 272 */ {0x00eb, 0x864c},
-/* 273 */ {0x00f0, 0x864d},
-/* 274 */ {0x00f6, 0x864e},
-/* 275 */ {0x00fa, 0x864f},
-/* 276 */ {0x00ff, 0x8650},
-/* 277 */ {0x0060, 0x8657},
-/* 278 */ {0x0010, 0x8658},
-/* 279 */ {0x0018, 0x8659},
-/* 280 */ {0x0005, 0x865a},
-/* 281 */ {0x0018, 0x8660},
-/* 282 */ {0x0003, 0x8509},
-/* 283 */ {0x0011, 0x850a},
-/* 284 */ {0x0032, 0x850b},
-/* 285 */ {0x0010, 0x850c},
-/* 286 */ {0x0021, 0x850d},
-/* 287 */ {0x0001, 0x8500},
-/* 288 */ {0x0000, 0x8508},
-/* 289 */ {0x0012, 0x8608},
-/* 290 */ {0x002c, 0x8609},
-/* 291 */ {0x0002, 0x860a},
-/* 292 */ {0x0039, 0x860b},
-/* 293 */ {0x00d0, 0x860c},
-/* 294 */ {0x00f7, 0x860d},
-/* 295 */ {0x00ed, 0x860e},
-/* 296 */ {0x00db, 0x860f},
-/* 297 */ {0x0039, 0x8610},
-/* 298 */ {0x0012, 0x8657},
-/* 299 */ {0x000c, 0x8619},
-/* 300 */ {0x0004, 0x861a},
-/* 301 */ {0x00a1, 0x8656},
-/* 302 */ {0x00c8, 0x8615},
-/* 303 */ {0x0032, 0x8616},
-
-/* 306 */ {0x0030, 0x8112},
-/* 313 */ {0x0020, 0x8112},
-/* 314 */ {0x0020, 0x8112},
-/* 315 */ {0x000f, 0x8402},
-/* 316 */ {0x0000, 0x8403},
-
-/* 317 */ {0x0090, 0x8110},
-/* 318 */ {0x0001, 0x8114},
-/* 319 */ {0x0001, 0x8114},
-/* 320 */ {0x0001, 0x8114},
-/* 321 */ {0x0003, 0x8114},
-/* 322 */ {0x0080, 0x8804},
-
-/* 355 */ {0x0003, 0x8801},
-/* 356 */ {0x0012, 0x8800},
-/* 358 */ {0x0004, 0x8801},
-/* 359 */ {0x0005, 0x8800},
-/* 361 */ {0x0005, 0x8801},
-/* 362 */ {0x0047, 0x8800},
-/* 364 */ {0x0006, 0x8801},
-/* 365 */ {0x0000, 0x8800},
-/* 367 */ {0x0007, 0x8801},
-/* 368 */ {0x00c0, 0x8800},
-/* 370 */ {0x0008, 0x8801},
-/* 371 */ {0x0003, 0x8800},
-/* 373 */ {0x000a, 0x8700},
-/* 374 */ {0x000e, 0x8801},
-/* 375 */ {0x0004, 0x8800},
-/* 377 */ {0x0005, 0x8801},
-/* 378 */ {0x0047, 0x8800},
-/* 380 */ {0x0006, 0x8801},
-/* 381 */ {0x0000, 0x8800},
-/* 383 */ {0x0007, 0x8801},
-/* 384 */ {0x00c0, 0x8800},
-/* 386 */ {0x0008, 0x8801},
-/* 387 */ {0x0003, 0x8800},
-/* 389 */ {0x0013, 0x8801},
-/* 390 */ {0x0001, 0x8800},
-/* 392 */ {0x0009, 0x8801},
-/* 393 */ {0x0000, 0x8800},
-/* 395 */ {0x000a, 0x8801},
-/* 396 */ {0x0000, 0x8800},
-/* 398 */ {0x000b, 0x8801},
-/* 399 */ {0x0000, 0x8800},
-/* 401 */ {0x000c, 0x8801},
-/* 402 */ {0x0000, 0x8800},
-/* 404 */ {0x000e, 0x8801},
-/* 405 */ {0x0004, 0x8800},
-/* 407 */ {0x000f, 0x8801},
-/* 408 */ {0x0000, 0x8800},
-/* 410 */ {0x0010, 0x8801},
-/* 411 */ {0x0006, 0x8800},
-/* 413 */ {0x0011, 0x8801},
-/* 414 */ {0x0006, 0x8800},
-/* 416 */ {0x0012, 0x8801},
-/* 417 */ {0x0000, 0x8800},
-/* 419 */ {0x0013, 0x8801},
-/* 420 */ {0x0001, 0x8800},
-/* 422 */ {0x000a, 0x8700},
-/* 423 */ {0x0000, 0x8702},
-/* 424 */ {0x0000, 0x8703},
-/* 425 */ {0x00c2, 0x8704},
-/* 426 */ {0x0001, 0x870c},
-/* 427 */ {0x0044, 0x8600},
-/* 428 */ {0x0002, 0x8606},
-/* 429 */ {0x0064, 0x8607},
-/* 430 */ {0x003a, 0x8601},
-/* 431 */ {0x0008, 0x8602},
-/* 432 */ {0x0044, 0x8600},
-/* 433 */ {0x0018, 0x8617},
-/* 434 */ {0x0008, 0x8618},
-/* 435 */ {0x00a1, 0x8656},
-/* 436 */ {0x0004, 0x865b},
-/* 437 */ {0x0002, 0x865c},
-/* 438 */ {0x0058, 0x865d},
-/* 439 */ {0x0048, 0x865e},
-/* 440 */ {0x0012, 0x8608},
-/* 441 */ {0x002c, 0x8609},
-/* 442 */ {0x0002, 0x860a},
-/* 443 */ {0x002c, 0x860b},
-/* 444 */ {0x00db, 0x860c},
-/* 445 */ {0x00f9, 0x860d},
-/* 446 */ {0x00f1, 0x860e},
-/* 447 */ {0x00e3, 0x860f},
-/* 448 */ {0x002c, 0x8610},
-/* 449 */ {0x006c, 0x8651},
-/* 450 */ {0x0041, 0x8652},
-/* 451 */ {0x0059, 0x8653},
-/* 452 */ {0x0040, 0x8654},
-/* 453 */ {0x00fa, 0x8611},
-/* 454 */ {0x00ff, 0x8612},
-/* 455 */ {0x00f8, 0x8613},
-/* 456 */ {0x0000, 0x8614},
-/* 457 */ {0x0001, 0x863f},
-/* 458 */ {0x0000, 0x8640},
-/* 459 */ {0x0026, 0x8641},
-/* 460 */ {0x0045, 0x8642},
-/* 461 */ {0x0060, 0x8643},
-/* 462 */ {0x0075, 0x8644},
-/* 463 */ {0x0088, 0x8645},
-/* 464 */ {0x009b, 0x8646},
-/* 465 */ {0x00b0, 0x8647},
-/* 466 */ {0x00c5, 0x8648},
-/* 467 */ {0x00d2, 0x8649},
-/* 468 */ {0x00dc, 0x864a},
-/* 469 */ {0x00e5, 0x864b},
-/* 470 */ {0x00eb, 0x864c},
-/* 471 */ {0x00f0, 0x864d},
-/* 472 */ {0x00f6, 0x864e},
-/* 473 */ {0x00fa, 0x864f},
-/* 474 */ {0x00ff, 0x8650},
-/* 475 */ {0x0060, 0x8657},
-/* 476 */ {0x0010, 0x8658},
-/* 477 */ {0x0018, 0x8659},
-/* 478 */ {0x0005, 0x865a},
-/* 479 */ {0x0018, 0x8660},
-/* 480 */ {0x0003, 0x8509},
-/* 481 */ {0x0011, 0x850a},
-/* 482 */ {0x0032, 0x850b},
-/* 483 */ {0x0010, 0x850c},
-/* 484 */ {0x0021, 0x850d},
-/* 485 */ {0x0001, 0x8500},
-/* 486 */ {0x0000, 0x8508},
-
-/* 487 */ {0x0012, 0x8608},
-/* 488 */ {0x002c, 0x8609},
-/* 489 */ {0x0002, 0x860a},
-/* 490 */ {0x0039, 0x860b},
-/* 491 */ {0x00d0, 0x860c},
-/* 492 */ {0x00f7, 0x860d},
-/* 493 */ {0x00ed, 0x860e},
-/* 494 */ {0x00db, 0x860f},
-/* 495 */ {0x0039, 0x8610},
-/* 496 */ {0x0012, 0x8657},
-/* 497 */ {0x0064, 0x8619},
+static const u16 spca508_sightcam2_init_data[][2] = {
+       {0x0020, 0x8112},
+
+       {0x000f, 0x8402},
+       {0x0000, 0x8403},
+
+       {0x0008, 0x8201},
+       {0x0008, 0x8200},
+       {0x0001, 0x8200},
+       {0x0009, 0x8201},
+       {0x0008, 0x8200},
+       {0x0001, 0x8200},
+       {0x000a, 0x8201},
+       {0x0008, 0x8200},
+       {0x0001, 0x8200},
+       {0x000b, 0x8201},
+       {0x0008, 0x8200},
+       {0x0001, 0x8200},
+       {0x000c, 0x8201},
+       {0x0008, 0x8200},
+       {0x0001, 0x8200},
+       {0x000d, 0x8201},
+       {0x0008, 0x8200},
+       {0x0001, 0x8200},
+       {0x000e, 0x8201},
+       {0x0008, 0x8200},
+       {0x0001, 0x8200},
+       {0x0007, 0x8201},
+       {0x0008, 0x8200},
+       {0x0001, 0x8200},
+       {0x000f, 0x8201},
+       {0x0008, 0x8200},
+       {0x0001, 0x8200},
+
+       {0x0018, 0x8660},
+       {0x0010, 0x8201},
+
+       {0x0008, 0x8200},
+       {0x0001, 0x8200},
+       {0x0011, 0x8201},
+       {0x0008, 0x8200},
+       {0x0001, 0x8200},
+
+       {0x0000, 0x86b0},
+       {0x0034, 0x86b1},
+       {0x0000, 0x86b2},
+       {0x0049, 0x86b3},
+       {0x0000, 0x86b4},
+       {0x0000, 0x86b4},
+
+       {0x0012, 0x8201},
+       {0x0008, 0x8200},
+       {0x0001, 0x8200},
+       {0x0013, 0x8201},
+       {0x0008, 0x8200},
+       {0x0001, 0x8200},
+
+       {0x0001, 0x86b0},
+       {0x00aa, 0x86b1},
+       {0x0000, 0x86b2},
+       {0x00e4, 0x86b3},
+       {0x0000, 0x86b4},
+       {0x0000, 0x86b4},
+
+       {0x0018, 0x8660},
+
+       {0x0090, 0x8110},
+       {0x0001, 0x8114},
+       {0x0001, 0x8114},
+       {0x0001, 0x8114},
+       {0x0003, 0x8114},
+
+       {0x0080, 0x8804},
+       {0x0003, 0x8801},
+       {0x0012, 0x8800},
+       {0x0004, 0x8801},
+       {0x0005, 0x8800},
+       {0x0005, 0x8801},
+       {0x0000, 0x8800},
+       {0x0006, 0x8801},
+       {0x0000, 0x8800},
+       {0x0007, 0x8801},
+       {0x0000, 0x8800},
+       {0x0008, 0x8801},
+       {0x0005, 0x8800},
+       {0x000a, 0x8700},
+       {0x000e, 0x8801},
+       {0x0004, 0x8800},
+       {0x0005, 0x8801},
+       {0x0047, 0x8800},
+       {0x0006, 0x8801},
+       {0x0000, 0x8800},
+       {0x0007, 0x8801},
+       {0x00c0, 0x8800},
+       {0x0008, 0x8801},
+       {0x0003, 0x8800},
+       {0x0013, 0x8801},
+       {0x0001, 0x8800},
+       {0x0009, 0x8801},
+       {0x0000, 0x8800},
+       {0x000a, 0x8801},
+       {0x0000, 0x8800},
+       {0x000b, 0x8801},
+       {0x0000, 0x8800},
+       {0x000c, 0x8801},
+       {0x0000, 0x8800},
+       {0x000e, 0x8801},
+       {0x0004, 0x8800},
+       {0x000f, 0x8801},
+       {0x0000, 0x8800},
+       {0x0010, 0x8801},
+       {0x0006, 0x8800},
+       {0x0011, 0x8801},
+       {0x0006, 0x8800},
+       {0x0012, 0x8801},
+       {0x0000, 0x8800},
+       {0x0013, 0x8801},
+       {0x0001, 0x8800},
+
+       {0x000a, 0x8700},
+       {0x0000, 0x8702},
+       {0x0000, 0x8703},
+       {0x00c2, 0x8704},
+       {0x0001, 0x870c},
+
+       {0x0044, 0x8600},
+       {0x0002, 0x8606},
+       {0x0064, 0x8607},
+       {0x003a, 0x8601},
+       {0x0008, 0x8602},
+       {0x0044, 0x8600},
+       {0x0018, 0x8617},
+       {0x0008, 0x8618},
+       {0x00a1, 0x8656},
+       {0x0004, 0x865b},
+       {0x0002, 0x865c},
+       {0x0058, 0x865d},
+       {0x0048, 0x865e},
+       {0x0012, 0x8608},
+       {0x002c, 0x8609},
+       {0x0002, 0x860a},
+       {0x002c, 0x860b},
+       {0x00db, 0x860c},
+       {0x00f9, 0x860d},
+       {0x00f1, 0x860e},
+       {0x00e3, 0x860f},
+       {0x002c, 0x8610},
+       {0x006c, 0x8651},
+       {0x0041, 0x8652},
+       {0x0059, 0x8653},
+       {0x0040, 0x8654},
+       {0x00fa, 0x8611},
+       {0x00ff, 0x8612},
+       {0x00f8, 0x8613},
+       {0x0000, 0x8614},
+       {0x0001, 0x863f},
+       {0x0000, 0x8640},
+       {0x0026, 0x8641},
+       {0x0045, 0x8642},
+       {0x0060, 0x8643},
+       {0x0075, 0x8644},
+       {0x0088, 0x8645},
+       {0x009b, 0x8646},
+       {0x00b0, 0x8647},
+       {0x00c5, 0x8648},
+       {0x00d2, 0x8649},
+       {0x00dc, 0x864a},
+       {0x00e5, 0x864b},
+       {0x00eb, 0x864c},
+       {0x00f0, 0x864d},
+       {0x00f6, 0x864e},
+       {0x00fa, 0x864f},
+       {0x00ff, 0x8650},
+       {0x0060, 0x8657},
+       {0x0010, 0x8658},
+       {0x0018, 0x8659},
+       {0x0005, 0x865a},
+       {0x0018, 0x8660},
+       {0x0003, 0x8509},
+       {0x0011, 0x850a},
+       {0x0032, 0x850b},
+       {0x0010, 0x850c},
+       {0x0021, 0x850d},
+       {0x0001, 0x8500},
+       {0x0000, 0x8508},
+       {0x0012, 0x8608},
+       {0x002c, 0x8609},
+       {0x0002, 0x860a},
+       {0x0039, 0x860b},
+       {0x00d0, 0x860c},
+       {0x00f7, 0x860d},
+       {0x00ed, 0x860e},
+       {0x00db, 0x860f},
+       {0x0039, 0x8610},
+       {0x0012, 0x8657},
+       {0x000c, 0x8619},
+       {0x0004, 0x861a},
+       {0x00a1, 0x8656},
+       {0x00c8, 0x8615},
+       {0x0032, 0x8616},
+
+       {0x0030, 0x8112},
+       {0x0020, 0x8112},
+       {0x0020, 0x8112},
+       {0x000f, 0x8402},
+       {0x0000, 0x8403},
+
+       {0x0090, 0x8110},
+       {0x0001, 0x8114},
+       {0x0001, 0x8114},
+       {0x0001, 0x8114},
+       {0x0003, 0x8114},
+       {0x0080, 0x8804},
+
+       {0x0003, 0x8801},
+       {0x0012, 0x8800},
+       {0x0004, 0x8801},
+       {0x0005, 0x8800},
+       {0x0005, 0x8801},
+       {0x0047, 0x8800},
+       {0x0006, 0x8801},
+       {0x0000, 0x8800},
+       {0x0007, 0x8801},
+       {0x00c0, 0x8800},
+       {0x0008, 0x8801},
+       {0x0003, 0x8800},
+       {0x000a, 0x8700},
+       {0x000e, 0x8801},
+       {0x0004, 0x8800},
+       {0x0005, 0x8801},
+       {0x0047, 0x8800},
+       {0x0006, 0x8801},
+       {0x0000, 0x8800},
+       {0x0007, 0x8801},
+       {0x00c0, 0x8800},
+       {0x0008, 0x8801},
+       {0x0003, 0x8800},
+       {0x0013, 0x8801},
+       {0x0001, 0x8800},
+       {0x0009, 0x8801},
+       {0x0000, 0x8800},
+       {0x000a, 0x8801},
+       {0x0000, 0x8800},
+       {0x000b, 0x8801},
+       {0x0000, 0x8800},
+       {0x000c, 0x8801},
+       {0x0000, 0x8800},
+       {0x000e, 0x8801},
+       {0x0004, 0x8800},
+       {0x000f, 0x8801},
+       {0x0000, 0x8800},
+       {0x0010, 0x8801},
+       {0x0006, 0x8800},
+       {0x0011, 0x8801},
+       {0x0006, 0x8800},
+       {0x0012, 0x8801},
+       {0x0000, 0x8800},
+       {0x0013, 0x8801},
+       {0x0001, 0x8800},
+       {0x000a, 0x8700},
+       {0x0000, 0x8702},
+       {0x0000, 0x8703},
+       {0x00c2, 0x8704},
+       {0x0001, 0x870c},
+       {0x0044, 0x8600},
+       {0x0002, 0x8606},
+       {0x0064, 0x8607},
+       {0x003a, 0x8601},
+       {0x0008, 0x8602},
+       {0x0044, 0x8600},
+       {0x0018, 0x8617},
+       {0x0008, 0x8618},
+       {0x00a1, 0x8656},
+       {0x0004, 0x865b},
+       {0x0002, 0x865c},
+       {0x0058, 0x865d},
+       {0x0048, 0x865e},
+       {0x0012, 0x8608},
+       {0x002c, 0x8609},
+       {0x0002, 0x860a},
+       {0x002c, 0x860b},
+       {0x00db, 0x860c},
+       {0x00f9, 0x860d},
+       {0x00f1, 0x860e},
+       {0x00e3, 0x860f},
+       {0x002c, 0x8610},
+       {0x006c, 0x8651},
+       {0x0041, 0x8652},
+       {0x0059, 0x8653},
+       {0x0040, 0x8654},
+       {0x00fa, 0x8611},
+       {0x00ff, 0x8612},
+       {0x00f8, 0x8613},
+       {0x0000, 0x8614},
+       {0x0001, 0x863f},
+       {0x0000, 0x8640},
+       {0x0026, 0x8641},
+       {0x0045, 0x8642},
+       {0x0060, 0x8643},
+       {0x0075, 0x8644},
+       {0x0088, 0x8645},
+       {0x009b, 0x8646},
+       {0x00b0, 0x8647},
+       {0x00c5, 0x8648},
+       {0x00d2, 0x8649},
+       {0x00dc, 0x864a},
+       {0x00e5, 0x864b},
+       {0x00eb, 0x864c},
+       {0x00f0, 0x864d},
+       {0x00f6, 0x864e},
+       {0x00fa, 0x864f},
+       {0x00ff, 0x8650},
+       {0x0060, 0x8657},
+       {0x0010, 0x8658},
+       {0x0018, 0x8659},
+       {0x0005, 0x865a},
+       {0x0018, 0x8660},
+       {0x0003, 0x8509},
+       {0x0011, 0x850a},
+       {0x0032, 0x850b},
+       {0x0010, 0x850c},
+       {0x0021, 0x850d},
+       {0x0001, 0x8500},
+       {0x0000, 0x8508},
+
+       {0x0012, 0x8608},
+       {0x002c, 0x8609},
+       {0x0002, 0x860a},
+       {0x0039, 0x860b},
+       {0x00d0, 0x860c},
+       {0x00f7, 0x860d},
+       {0x00ed, 0x860e},
+       {0x00db, 0x860f},
+       {0x0039, 0x8610},
+       {0x0012, 0x8657},
+       {0x0064, 0x8619},
 
 /* This line starts it all, it is not needed here */
 /* since it has been build into the driver */
 /* jfm: don't start now */
-/* 590  *  {0x0030, 0x8112}, */
+/*     {0x0030, 0x8112}, */
        {}
 };
 
 /*
  * Initialization data for Creative Webcam Vista
  */
-static const __u16 spca508_vista_init_data[][3] = {
+static const u16 spca508_vista_init_data[][2] = {
        {0x0008, 0x8200},       /* Clear register */
        {0x0000, 0x870b},       /* Reset CTL3 */
        {0x0020, 0x8112},       /* Video Drop packet enable */
-       {0x0003, 0x8111},  /* Soft Reset compression, memory, TG & CDSP */
+       {0x0003, 0x8111},       /* Soft Reset compression, memory, TG & CDSP */
        {0x0000, 0x8110},       /* Disable everything */
        {0x0000, 0x8114},       /* Software GPIO output data */
        {0x0000, 0x8114},
 
        {0x0003, 0x8111},
        {0x0000, 0x8111},
-       {0x0090, 0x8110},  /* Enable: SSI output, External 2X clock output */
+       {0x0090, 0x8110},    /* Enable: SSI output, External 2X clock output */
        {0x0020, 0x8112},
        {0x0000, 0x8114},
        {0x0001, 0x8114},
@@ -1138,196 +1043,148 @@ static const __u16 spca508_vista_init_data[][3] = {
        {0x00ba, 0x8804},       /* SSI Slave address */
        {0x0010, 0x8802},       /* 93.75kHz SSI Clock Two DataByte */
 
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
-       /* READ { 0, 0x0001, 0x8802 } ->
-               0000: 10  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 10  */
        {0x0010, 0x8802},       /* Will write 2 bytes (DATA1+DATA2) */
        {0x0020, 0x8801},       /* Register address for SSI read/write */
        {0x0044, 0x8805},       /* DATA2 */
        {0x0004, 0x8800},       /* DATA1 -> write triggered */
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
 
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
-       /* READ { 0, 0x0001, 0x8802 } ->
-               0000: 10  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 10  */
        {0x0010, 0x8802},
        {0x0009, 0x8801},
        {0x0042, 0x8805},
        {0x0001, 0x8800},
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
 
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
-       /* READ { 0, 0x0001, 0x8802 } ->
-               0000: 10  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 10  */
        {0x0010, 0x8802},
        {0x003c, 0x8801},
        {0x0001, 0x8805},
        {0x0000, 0x8800},
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
 
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
-       /* READ { 0, 0x0001, 0x8802 } ->
-               0000: 10  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 10  */
        {0x0010, 0x8802},
        {0x0001, 0x8801},
        {0x000a, 0x8805},
        {0x0000, 0x8800},
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
 
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
-       /* READ { 0, 0x0001, 0x8802 } ->
-               0000: 10  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 10  */
        {0x0010, 0x8802},
        {0x0002, 0x8801},
        {0x0000, 0x8805},
        {0x0000, 0x8800},
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
 
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
-       /* READ { 0, 0x0001, 0x8802 } ->
-               0000: 10  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 10  */
        {0x0010, 0x8802},
        {0x0003, 0x8801},
        {0x0027, 0x8805},
        {0x0001, 0x8800},
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
 
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
-       /* READ { 0, 0x0001, 0x8802 } ->
-               0000: 10  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 10  */
        {0x0010, 0x8802},
        {0x0004, 0x8801},
        {0x0065, 0x8805},
        {0x0001, 0x8800},
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
 
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
-       /* READ { 0, 0x0001, 0x8802 } ->
-               0000: 10  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 10  */
        {0x0010, 0x8802},
        {0x0005, 0x8801},
        {0x0003, 0x8805},
        {0x0000, 0x8800},
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
 
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
-       /* READ { 0, 0x0001, 0x8802 } ->
-               0000: 10  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 10  */
        {0x0010, 0x8802},
        {0x0006, 0x8801},
        {0x001c, 0x8805},
        {0x0000, 0x8800},
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
 
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
-       /* READ { 0, 0x0001, 0x8802 } ->
-               0000: 10  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 10  */
        {0x0010, 0x8802},
        {0x0007, 0x8801},
        {0x002a, 0x8805},
        {0x0000, 0x8800},
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
 
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
-       /* READ { 0, 0x0001, 0x8802 } ->
-               0000: 10  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 10  */
        {0x0010, 0x8802},
        {0x000e, 0x8801},
        {0x0000, 0x8805},
        {0x0000, 0x8800},
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
 
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
-       /* READ { 0, 0x0001, 0x8802 } ->
-               0000: 10  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 10  */
        {0x0010, 0x8802},
        {0x0028, 0x8801},
        {0x002e, 0x8805},
        {0x0000, 0x8800},
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
 
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
-       /* READ { 0, 0x0001, 0x8802 } ->
-               0000: 10  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 10  */
        {0x0010, 0x8802},
        {0x0039, 0x8801},
        {0x0013, 0x8805},
        {0x0000, 0x8800},
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
 
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
-       /* READ { 0, 0x0001, 0x8802 } ->
-               0000: 10  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 10  */
        {0x0010, 0x8802},
        {0x003b, 0x8801},
        {0x000c, 0x8805},
        {0x0000, 0x8800},
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
 
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
-       /* READ { 0, 0x0001, 0x8802 } ->
-               0000: 10  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 10  */
        {0x0010, 0x8802},
        {0x0035, 0x8801},
        {0x0028, 0x8805},
        {0x0000, 0x8800},
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
 
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
-       /* READ { 0, 0x0001, 0x8802 } ->
-               0000: 10  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
+       /* READ { 0x0001, 0x8802 } -> 0000: 10  */
        {0x0010, 0x8802},
        {0x0009, 0x8801},
        {0x0042, 0x8805},
        {0x0001, 0x8800},
-       /* READ { 0, 0x0001, 0x8803 } ->
-               0000: 00  */
+       /* READ { 0x0001, 0x8803 } -> 0000: 00  */
 
        {0x0050, 0x8703},
        {0x0002, 0x8704},       /* External input CKIx1 */
-       {0x0001, 0x870C},       /* Select CKOx2 output */
-       {0x009A, 0x8600},       /* Line memory Read Counter (L) */
-       {0x0001, 0x8606},  /* 1 Line memory Read Counter (H) Result: (d)410 */
+       {0x0001, 0x870c},       /* Select CKOx2 output */
+       {0x009a, 0x8600},       /* Line memory Read Counter (L) */
+       {0x0001, 0x8606},    /* 1 Line memory Read Counter (H) Result: (d)410 */
        {0x0023, 0x8601},
        {0x0010, 0x8602},
-       {0x000A, 0x8603},
-       {0x009A, 0x8600},
-       {0x0001, 0x865B},       /* 1 Horizontal Offset for Valid Pixel(L) */
-       {0x0003, 0x865C},       /* Vertical offset for valid lines (L) */
-       {0x0058, 0x865D},       /* Horizontal valid pixels window (L) */
-       {0x0048, 0x865E},       /* Vertical valid lines window (L) */
-       {0x0000, 0x865F},
+       {0x000a, 0x8603},
+       {0x009a, 0x8600},
+       {0x0001, 0x865b},       /* 1 Horizontal Offset for Valid Pixel(L) */
+       {0x0003, 0x865c},       /* Vertical offset for valid lines (L) */
+       {0x0058, 0x865d},       /* Horizontal valid pixels window (L) */
+       {0x0048, 0x865e},       /* Vertical valid lines window (L) */
+       {0x0000, 0x865f},
 
        {0x0006, 0x8660},
                    /* Enable nibble data input, select nibble input order */
@@ -1335,87 +1192,79 @@ static const __u16 spca508_vista_init_data[][3] = {
        {0x0013, 0x8608},       /* A11 Coeficients for color correction */
        {0x0028, 0x8609},
                    /* Note: these values are confirmed at the end of array */
-       {0x0005, 0x860A},       /* ... */
-       {0x0025, 0x860B},
-       {0x00E1, 0x860C},
-       {0x00FA, 0x860D},
-       {0x00F4, 0x860E},
-       {0x00E8, 0x860F},
+       {0x0005, 0x860a},       /* ... */
+       {0x0025, 0x860b},
+       {0x00e1, 0x860c},
+       {0x00fa, 0x860d},
+       {0x00f4, 0x860e},
+       {0x00e8, 0x860f},
        {0x0025, 0x8610},       /* A33 Coef. */
-       {0x00FC, 0x8611},       /* White balance offset: R */
+       {0x00fc, 0x8611},       /* White balance offset: R */
        {0x0001, 0x8612},       /* White balance offset: Gr */
-       {0x00FE, 0x8613},       /* White balance offset: B */
+       {0x00fe, 0x8613},       /* White balance offset: B */
        {0x0000, 0x8614},       /* White balance offset: Gb */
 
        {0x0064, 0x8651},       /* R gain for white balance (L) */
        {0x0040, 0x8652},       /* Gr gain for white balance (L) */
        {0x0066, 0x8653},       /* B gain for white balance (L) */
        {0x0040, 0x8654},       /* Gb gain for white balance (L) */
-       {0x0001, 0x863F},       /* Enable fixed gamma correction */
+       {0x0001, 0x863f},       /* Enable fixed gamma correction */
 
-       {0x00A1, 0x8656},       /* Size - Window1: 256x256, Window2: 128x128 */
-       /* UV division: UV no change, Enable New edge enhancement */
+       {0x00a1, 0x8656},       /* Size - Window1: 256x256, Window2: 128x128,
+                                * UV division: UV no change,
+                                * Enable New edge enhancement */
        {0x0018, 0x8657},       /* Edge gain high threshold */
        {0x0020, 0x8658},       /* Edge gain low threshold */
-       {0x000A, 0x8659},       /* Edge bandwidth high threshold */
-       {0x0005, 0x865A},       /* Edge bandwidth low threshold */
+       {0x000a, 0x8659},       /* Edge bandwidth high threshold */
+       {0x0005, 0x865a},       /* Edge bandwidth low threshold */
        {0x0064, 0x8607},       /* UV filter enable */
 
        {0x0016, 0x8660},
-       {0x0000, 0x86B0},       /* Bad pixels compensation address */
-       {0x00DC, 0x86B1},       /* X coord for bad pixels compensation (L) */
-       {0x0000, 0x86B2},
-       {0x0009, 0x86B3},       /* Y coord for bad pixels compensation (L) */
-       {0x0000, 0x86B4},
-
-       {0x0001, 0x86B0},
-       {0x00F5, 0x86B1},
-       {0x0000, 0x86B2},
-       {0x00C6, 0x86B3},
-       {0x0000, 0x86B4},
-
-       {0x0002, 0x86B0},
-       {0x001C, 0x86B1},
-       {0x0001, 0x86B2},
-       {0x00D7, 0x86B3},
-       {0x0000, 0x86B4},
-
-       {0x0003, 0x86B0},
-       {0x001C, 0x86B1},
-       {0x0001, 0x86B2},
-       {0x00D8, 0x86B3},
-       {0x0000, 0x86B4},
-
-       {0x0004, 0x86B0},
-       {0x001D, 0x86B1},
-       {0x0001, 0x86B2},
-       {0x00D8, 0x86B3},
-       {0x0000, 0x86B4},
-       {0x001E, 0x8660},
-
-       /* READ { 0, 0x0000, 0x8608 } ->
-               0000: 13  */
-       /* READ { 0, 0x0000, 0x8609 } ->
-               0000: 28  */
-       /* READ { 0, 0x0000, 0x8610 } ->
-               0000: 05  */
-       /* READ { 0, 0x0000, 0x8611 } ->
-               0000: 25  */
-       /* READ { 0, 0x0000, 0x8612 } ->
-               0000: e1  */
-       /* READ { 0, 0x0000, 0x8613 } ->
-               0000: fa  */
-       /* READ { 0, 0x0000, 0x8614 } ->
-               0000: f4  */
-       /* READ { 0, 0x0000, 0x8615 } ->
-               0000: e8  */
-       /* READ { 0, 0x0000, 0x8616 } ->
-               0000: 25  */
+       {0x0000, 0x86b0},       /* Bad pixels compensation address */
+       {0x00dc, 0x86b1},       /* X coord for bad pixels compensation (L) */
+       {0x0000, 0x86b2},
+       {0x0009, 0x86b3},       /* Y coord for bad pixels compensation (L) */
+       {0x0000, 0x86b4},
+
+       {0x0001, 0x86b0},
+       {0x00f5, 0x86b1},
+       {0x0000, 0x86b2},
+       {0x00c6, 0x86b3},
+       {0x0000, 0x86b4},
+
+       {0x0002, 0x86b0},
+       {0x001c, 0x86b1},
+       {0x0001, 0x86b2},
+       {0x00d7, 0x86b3},
+       {0x0000, 0x86b4},
+
+       {0x0003, 0x86b0},
+       {0x001c, 0x86b1},
+       {0x0001, 0x86b2},
+       {0x00d8, 0x86b3},
+       {0x0000, 0x86b4},
+
+       {0x0004, 0x86b0},
+       {0x001d, 0x86b1},
+       {0x0001, 0x86b2},
+       {0x00d8, 0x86b3},
+       {0x0000, 0x86b4},
+       {0x001e, 0x8660},
+
+       /* READ { 0x0000, 0x8608 } -> 0000: 13  */
+       /* READ { 0x0000, 0x8609 } -> 0000: 28  */
+       /* READ { 0x0000, 0x8610 } -> 0000: 05  */
+       /* READ { 0x0000, 0x8611 } -> 0000: 25  */
+       /* READ { 0x0000, 0x8612 } -> 0000: e1  */
+       /* READ { 0x0000, 0x8613 } -> 0000: fa  */
+       /* READ { 0x0000, 0x8614 } -> 0000: f4  */
+       /* READ { 0x0000, 0x8615 } -> 0000: e8  */
+       /* READ { 0x0000, 0x8616 } -> 0000: 25  */
        {}
 };
 
 static int reg_write(struct usb_device *dev,
-                       __u16 index, __u16 value)
+                       u16 index, u16 value)
 {
        int ret;
 
@@ -1433,41 +1282,92 @@ static int reg_write(struct usb_device *dev,
 
 /* read 1 byte */
 /* returns: negative is error, pos or zero is data */
-static int reg_read(struct usb_device *dev,
-                       __u16 index)    /* wIndex */
+static int reg_read(struct gspca_dev *gspca_dev,
+                       u16 index)      /* wIndex */
 {
        int ret;
-       __u8 data;
 
-       ret = usb_control_msg(dev,
-                       usb_rcvctrlpipe(dev, 0),
+       ret = usb_control_msg(gspca_dev->dev,
+                       usb_rcvctrlpipe(gspca_dev->dev, 0),
                        0,                      /* register */
                        USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
-                       (__u16) 0,              /* value */
+                       0,              /* value */
                        index,
-                       &data, 1,
+                       gspca_dev->usb_buf, 1,
                        500);                   /* timeout */
-       PDEBUG(D_USBI, "reg read i:%04x --> %02x", index, data);
+       PDEBUG(D_USBI, "reg read i:%04x --> %02x",
+               index, gspca_dev->usb_buf[0]);
        if (ret < 0) {
                PDEBUG(D_ERR|D_USBI, "reg_read err %d", ret);
                return ret;
        }
-       return data;
+       return gspca_dev->usb_buf[0];
 }
 
-static int write_vector(struct gspca_dev *gspca_dev,
-                       const __u16 data[][3])
+/* send 1 or 2 bytes to the sensor via the Synchronous Serial Interface */
+static int ssi_w(struct gspca_dev *gspca_dev,
+               u16 reg, u16 val)
 {
        struct usb_device *dev = gspca_dev->dev;
-       int ret, i = 0;
+       int ret, retry;
 
-       while (data[i][1] != 0) {
-               ret = reg_write(dev, data[i][1], data[i][0]);
+       ret = reg_write(dev, 0x8802, reg >> 8);
+       if (ret < 0)
+               goto out;
+       ret = reg_write(dev, 0x8801, reg & 0x00ff);
+       if (ret < 0)
+               goto out;
+       if ((reg & 0xff00) == 0x1000) {         /* if 2 bytes */
+               ret = reg_write(dev, 0x8805, val & 0x00ff);
                if (ret < 0)
-                       return ret;
-               i++;
+                       goto out;
+               val >>= 8;
        }
-       return 0;
+       ret = reg_write(dev, 0x8800, val);
+       if (ret < 0)
+               goto out;
+
+       /* poll until not busy */
+       retry = 10;
+       for (;;) {
+               ret = reg_read(gspca_dev, 0x8803);
+               if (ret < 0)
+                       break;
+               if (gspca_dev->usb_buf[0] == 0)
+                       break;
+               if (--retry <= 0) {
+                       PDEBUG(D_ERR, "ssi_w busy %02x",
+                                       gspca_dev->usb_buf[0]);
+                       ret = -1;
+                       break;
+               }
+               msleep(8);
+       }
+
+out:
+       return ret;
+}
+
+static int write_vector(struct gspca_dev *gspca_dev,
+                       const u16 (*data)[2])
+{
+       struct usb_device *dev = gspca_dev->dev;
+       int ret = 0;
+
+       while ((*data)[1] != 0) {
+               if ((*data)[1] & 0x8000) {
+                       if ((*data)[1] == 0xdd00)       /* delay */
+                               msleep((*data)[0]);
+                       else
+                               ret = reg_write(dev, (*data)[1], (*data)[0]);
+               } else {
+                       ret = ssi_w(gspca_dev, (*data)[1], (*data)[0]);
+               }
+               if (ret < 0)
+                       break;
+               data++;
+       }
+       return ret;
 }
 
 /* this function is called at probe time */
@@ -1475,123 +1375,55 @@ static int sd_config(struct gspca_dev *gspca_dev,
                        const struct usb_device_id *id)
 {
        struct sd *sd = (struct sd *) gspca_dev;
-       struct usb_device *dev = gspca_dev->dev;
        struct cam *cam;
-       __u16 vendor;
-       __u16 product;
        int data1, data2;
-
-       vendor = id->idVendor;
-       product = id->idProduct;
-       switch (vendor) {
-       case 0x0130:            /* Clone webcam */
-/*             switch (product) { */
-/*             case 0x0130: */
-                       sd->subtype = HamaUSBSightcam;  /* same as Hama 0010 */
-/*                     break; */
-/*             } */
-               break;
-       case 0x041e:            /* Creative cameras */
-/*             switch (product) { */
-/*             case 0x4018: */
-                       sd->subtype = CreativeVista;
-/*                     break; */
-/*             } */
-               break;
-       case 0x0461:            /* MicroInnovation */
-/*             switch (product) { */
-/*             case 0x0815: */
-                       sd->subtype = MicroInnovationIC200;
-/*                     break; */
-/*             } */
-               break;
-       case 0x0733:    /* Rebadged ViewQuest (Intel) and ViewQuest cameras */
-/*             switch (product) { */
-/*             case 0x110: */
-                       sd->subtype = ViewQuestVQ110;
-/*                     break; */
-/*             } */
-               break;
-       case 0x0af9:            /* Hama cameras */
-               switch (product) {
-               case 0x0010:
-                       sd->subtype = HamaUSBSightcam;
-                       break;
-               case 0x0011:
-                       sd->subtype = HamaUSBSightcam2;
-                       break;
-               }
-               break;
-       case 0x8086:            /* Intel */
-/*             switch (product) { */
-/*             case 0x0110: */
-                       sd->subtype = IntelEasyPCCamera;
-/*                     break; */
-/*             } */
-               break;
-       }
+       const u16 (*init_data)[2];
+       static const u16 (*(init_data_tb[]))[2] = {
+               spca508_vista_init_data,        /* CreativeVista 0 */
+               spca508_sightcam_init_data,     /* HamaUSBSightcam 1 */
+               spca508_sightcam2_init_data,    /* HamaUSBSightcam2 2 */
+               spca508cs110_init_data,         /* IntelEasyPCCamera 3 */
+               spca508cs110_init_data,         /* MicroInnovationIC200 4 */
+               spca508_init_data,              /* ViewQuestVQ110 5 */
+       };
 
        /* Read from global register the USB product and vendor IDs, just to
         * prove that we can communicate with the device.  This works, which
         * confirms at we are communicating properly and that the device
         * is a 508. */
-       data1 = reg_read(dev, 0x8104);
-       data2 = reg_read(dev, 0x8105);
+       data1 = reg_read(gspca_dev, 0x8104);
+       data2 = reg_read(gspca_dev, 0x8105);
        PDEBUG(D_PROBE, "Webcam Vendor ID: 0x%02x%02x", data2, data1);
 
-       data1 = reg_read(dev, 0x8106);
-       data2 = reg_read(dev, 0x8107);
+       data1 = reg_read(gspca_dev, 0x8106);
+       data2 = reg_read(gspca_dev, 0x8107);
        PDEBUG(D_PROBE, "Webcam Product ID: 0x%02x%02x", data2, data1);
 
-       data1 = reg_read(dev, 0x8621);
+       data1 = reg_read(gspca_dev, 0x8621);
        PDEBUG(D_PROBE, "Window 1 average luminance: %d", data1);
 
        cam = &gspca_dev->cam;
-       cam->dev_name = (char *) id->driver_info;
-       cam->epaddr = 0x01;
        cam->cam_mode = sif_mode;
        cam->nmodes = ARRAY_SIZE(sif_mode);
+
+       sd->subtype = id->driver_info;
        sd->brightness = BRIGHTNESS_DEF;
 
-       switch (sd->subtype) {
-       case ViewQuestVQ110:
-               if (write_vector(gspca_dev, spca508_init_data))
-                       return -1;
-               break;
-       default:
-/*     case MicroInnovationIC200: */
-/*     case IntelEasyPCCamera: */
-               if (write_vector(gspca_dev, spca508cs110_init_data))
-                       return -1;
-               break;
-       case HamaUSBSightcam:
-               if (write_vector(gspca_dev, spca508_sightcam_init_data))
-                       return -1;
-               break;
-       case HamaUSBSightcam2:
-               if (write_vector(gspca_dev, spca508_sightcam2_init_data))
-                       return -1;
-               break;
-       case CreativeVista:
-               if (write_vector(gspca_dev, spca508_vista_init_data))
-                       return -1;
-               break;
-       }
-       return 0;                       /* success */
+       init_data = init_data_tb[sd->subtype];
+       return write_vector(gspca_dev, init_data);
 }
 
-/* this function is called at open time */
-static int sd_open(struct gspca_dev *gspca_dev)
+/* this function is called at probe and resume time */
+static int sd_init(struct gspca_dev *gspca_dev)
 {
-/*     write_vector(gspca_dev, spca508_open_data); */
        return 0;
 }
 
-static void sd_start(struct gspca_dev *gspca_dev)
+static int sd_start(struct gspca_dev *gspca_dev)
 {
        int mode;
 
-       mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;
+       mode = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv;
        reg_write(gspca_dev->dev, 0x8500, mode);
        switch (mode) {
        case 0:
@@ -1605,6 +1437,7 @@ static void sd_start(struct gspca_dev *gspca_dev)
                break;
        }
        reg_write(gspca_dev->dev, 0x8112, 0x10 | 0x20);
+       return 0;
 }
 
 static void sd_stopN(struct gspca_dev *gspca_dev)
@@ -1613,92 +1446,31 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
        reg_write(gspca_dev->dev, 0x8112, 0x20);
 }
 
-static void sd_stop0(struct gspca_dev *gspca_dev)
-{
-}
-
-/* this function is called at close time */
-static void sd_close(struct gspca_dev *gspca_dev)
-{
-}
-
-/* convert YUVY per line to YUYV (YUV 4:2:2) */
-static void yuvy_decode(unsigned char *out,
-                       unsigned char *in,
-                       int width,
-                       int height)
-{
-       unsigned char *Ui, *Vi, *yi, *yi1;
-       unsigned char *out1;
-       int i, j;
-
-       yi = in;
-       for (i = height / 2; --i >= 0; ) {
-               out1 = out + width * 2;         /* next line */
-               Ui = yi + width;
-               Vi = Ui + width / 2;
-               yi1 = Vi + width / 2;
-               for (j = width / 2; --j >= 0; ) {
-                       *out++ = 128 + *yi++;
-                       *out++ = 128 + *Ui;
-                       *out++ = 128 + *yi++;
-                       *out++ = 128 + *Vi;
-
-                       *out1++ = 128 + *yi1++;
-                       *out1++ = 128 + *Ui++;
-                       *out1++ = 128 + *yi1++;
-                       *out1++ = 128 + *Vi++;
-               }
-               yi += width * 2;
-               out = out1;
-       }
-}
-
 static void sd_pkt_scan(struct gspca_dev *gspca_dev,
-                       struct gspca_frame *frame,      /* target */
-                       __u8 *data,                     /* isoc packet */
+                       u8 *data,                       /* isoc packet */
                        int len)                        /* iso packet length */
 {
-       struct sd *sd = (struct sd *) gspca_dev;
-
        switch (data[0]) {
        case 0:                         /* start of frame */
-               if (gspca_dev->last_packet_type == FIRST_PACKET) {
-                       yuvy_decode(sd->tmpbuf2, sd->tmpbuf,
-                                       gspca_dev->width,
-                                       gspca_dev->height);
-                       frame = gspca_frame_add(gspca_dev,
-                                               LAST_PACKET,
-                                               frame,
-                                               sd->tmpbuf2,
-                                               gspca_dev->width
-                                                       * gspca_dev->height
-                                                       * 2);
-               }
-               gspca_frame_add(gspca_dev, FIRST_PACKET, frame,
-                               data, 0);
+               gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
                data += SPCA508_OFFSET_DATA;
                len -= SPCA508_OFFSET_DATA;
-               if (len > 0)
-                       memcpy(sd->tmpbuf, data, len);
-               else
-                       len = 0;
-               sd->buflen = len;
-               return;
+               gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);
+               break;
        case 0xff:                      /* drop */
-/*             gspca_dev->last_packet_type = DISCARD_PACKET; */
-               return;
+               break;
+       default:
+               data += 1;
+               len -= 1;
+               gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
+               break;
        }
-       data += 1;
-       len -= 1;
-       memcpy(&sd->tmpbuf[sd->buflen], data, len);
-       sd->buflen += len;
 }
 
 static void setbrightness(struct gspca_dev *gspca_dev)
 {
        struct sd *sd = (struct sd *) gspca_dev;
-       __u8 brightness = sd->brightness;
+       u8 brightness = sd->brightness;
 
        /* MX seem contrast */
        reg_write(gspca_dev->dev, 0x8651, brightness);
@@ -1707,13 +1479,6 @@ static void setbrightness(struct gspca_dev *gspca_dev)
        reg_write(gspca_dev->dev, 0x8654, brightness);
 }
 
-static void getbrightness(struct gspca_dev *gspca_dev)
-{
-       struct sd *sd = (struct sd *) gspca_dev;
-
-       sd->brightness = reg_read(gspca_dev->dev, 0x8651);
-}
-
 static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
 {
        struct sd *sd = (struct sd *) gspca_dev;
@@ -1728,7 +1493,6 @@ static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val)
 {
        struct sd *sd = (struct sd *) gspca_dev;
 
-       getbrightness(gspca_dev);
        *val = sd->brightness;
        return 0;
 }
@@ -1739,24 +1503,20 @@ static const struct sd_desc sd_desc = {
        .ctrls = sd_ctrls,
        .nctrls = ARRAY_SIZE(sd_ctrls),
        .config = sd_config,
-       .open = sd_open,
+       .init = sd_init,
        .start = sd_start,
        .stopN = sd_stopN,
-       .stop0 = sd_stop0,
-       .close = sd_close,
        .pkt_scan = sd_pkt_scan,
 };
 
 /* -- module initialisation -- */
-#define DVNM(name) .driver_info = (kernel_ulong_t) name
 static const __devinitdata struct usb_device_id device_table[] = {
-       {USB_DEVICE(0x0130, 0x0130), DVNM("Clone Digital Webcam 11043")},
-       {USB_DEVICE(0x041e, 0x4018), DVNM("Creative Webcam Vista (PD1100)")},
-       {USB_DEVICE(0x0461, 0x0815), DVNM("Micro Innovation IC200")},
-       {USB_DEVICE(0x0733, 0x0110), DVNM("ViewQuest VQ110")},
-       {USB_DEVICE(0x0af9, 0x0010), DVNM("Hama USB Sightcam 100")},
-       {USB_DEVICE(0x0af9, 0x0011), DVNM("Hama USB Sightcam 100")},
-       {USB_DEVICE(0x8086, 0x0110), DVNM("Intel Easy PC Camera")},
+       {USB_DEVICE(0x0130, 0x0130), .driver_info = HamaUSBSightcam},
+       {USB_DEVICE(0x041e, 0x4018), .driver_info = CreativeVista},
+       {USB_DEVICE(0x0733, 0x0110), .driver_info = ViewQuestVQ110},
+       {USB_DEVICE(0x0af9, 0x0010), .driver_info = HamaUSBSightcam},
+       {USB_DEVICE(0x0af9, 0x0011), .driver_info = HamaUSBSightcam2},
+       {USB_DEVICE(0x8086, 0x0110), .driver_info = IntelEasyPCCamera},
        {}
 };
 MODULE_DEVICE_TABLE(usb, device_table);
@@ -1774,14 +1534,21 @@ static struct usb_driver sd_driver = {
        .id_table = device_table,
        .probe = sd_probe,
        .disconnect = gspca_disconnect,
+#ifdef CONFIG_PM
+       .suspend = gspca_suspend,
+       .resume = gspca_resume,
+#endif
 };
 
 /* -- module insert / remove -- */
 static int __init sd_mod_init(void)
 {
-       if (usb_register(&sd_driver) < 0)
-               return -1;
-       PDEBUG(D_PROBE, "v%s registered", version);
+       int ret;
+
+       ret = usb_register(&sd_driver);
+       if (ret < 0)
+               return ret;
+       PDEBUG(D_PROBE, "registered");
        return 0;
 }
 static void __exit sd_mod_exit(void)