Merge branch 'bugfixes' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6
[pandora-kernel.git] / drivers / media / video / gspca / ov519.c
index 2b2cbdb..6cf6855 100644 (file)
@@ -57,10 +57,24 @@ static int frame_rate;
  * are getting "Failed to read sensor ID..." */
 static int i2c_detect_tries = 10;
 
+/* controls */
+enum e_ctrl {
+       BRIGHTNESS,
+       CONTRAST,
+       COLORS,
+       HFLIP,
+       VFLIP,
+       AUTOBRIGHT,
+       FREQ,
+       NCTRL           /* number of controls */
+};
+
 /* ov519 device descriptor */
 struct sd {
        struct gspca_dev gspca_dev;             /* !! must be the first item */
 
+       struct gspca_ctrl ctrls[NCTRL];
+
        __u8 packet_nr;
 
        char bridge;
@@ -82,13 +96,6 @@ struct sd {
        /* Determined by sensor type */
        __u8 sif;
 
-       __u8 brightness;
-       __u8 contrast;
-       __u8 colors;
-       __u8 hflip;
-       __u8 vflip;
-       __u8 autobrightness;
-       __u8 freq;
        __u8 quality;
 #define QUALITY_MIN 50
 #define QUALITY_MAX 70
@@ -130,29 +137,16 @@ struct sd {
 #include "w996Xcf.c"
 
 /* V4L2 controls supported by the driver */
-static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val);
-static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val);
-static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val);
-static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val);
-static int sd_setcolors(struct gspca_dev *gspca_dev, __s32 val);
-static int sd_getcolors(struct gspca_dev *gspca_dev, __s32 *val);
-static int sd_sethflip(struct gspca_dev *gspca_dev, __s32 val);
-static int sd_gethflip(struct gspca_dev *gspca_dev, __s32 *val);
-static int sd_setvflip(struct gspca_dev *gspca_dev, __s32 val);
-static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val);
-static int sd_setautobrightness(struct gspca_dev *gspca_dev, __s32 val);
-static int sd_getautobrightness(struct gspca_dev *gspca_dev, __s32 *val);
-static int sd_setfreq(struct gspca_dev *gspca_dev, __s32 val);
-static int sd_getfreq(struct gspca_dev *gspca_dev, __s32 *val);
 static void setbrightness(struct gspca_dev *gspca_dev);
 static void setcontrast(struct gspca_dev *gspca_dev);
 static void setcolors(struct gspca_dev *gspca_dev);
-static void setautobrightness(struct sd *sd);
-static void setfreq(struct sd *sd);
+static void sethvflip(struct gspca_dev *gspca_dev);
+static void setautobright(struct gspca_dev *gspca_dev);
+static void setfreq(struct gspca_dev *gspca_dev);
+static void setfreq_i(struct sd *sd);
 
 static const struct ctrl sd_ctrls[] = {
-#define BRIGHTNESS_IDX 0
-       {
+[BRIGHTNESS] = {
            {
                .id      = V4L2_CID_BRIGHTNESS,
                .type    = V4L2_CTRL_TYPE_INTEGER,
@@ -160,14 +154,11 @@ static const struct ctrl sd_ctrls[] = {
                .minimum = 0,
                .maximum = 255,
                .step    = 1,
-#define BRIGHTNESS_DEF 127
-               .default_value = BRIGHTNESS_DEF,
+               .default_value = 127,
            },
-           .set = sd_setbrightness,
-           .get = sd_getbrightness,
+           .set_control = setbrightness,
        },
-#define CONTRAST_IDX 1
-       {
+[CONTRAST] = {
            {
                .id      = V4L2_CID_CONTRAST,
                .type    = V4L2_CTRL_TYPE_INTEGER,
@@ -175,14 +166,11 @@ static const struct ctrl sd_ctrls[] = {
                .minimum = 0,
                .maximum = 255,
                .step    = 1,
-#define CONTRAST_DEF 127
-               .default_value = CONTRAST_DEF,
+               .default_value = 127,
            },
-           .set = sd_setcontrast,
-           .get = sd_getcontrast,
+           .set_control = setcontrast,
        },
-#define COLOR_IDX 2
-       {
+[COLORS] = {
            {
                .id      = V4L2_CID_SATURATION,
                .type    = V4L2_CTRL_TYPE_INTEGER,
@@ -190,15 +178,12 @@ static const struct ctrl sd_ctrls[] = {
                .minimum = 0,
                .maximum = 255,
                .step    = 1,
-#define COLOR_DEF 127
-               .default_value = COLOR_DEF,
+               .default_value = 127,
            },
-           .set = sd_setcolors,
-           .get = sd_getcolors,
+           .set_control = setcolors,
        },
 /* The flip controls work with ov7670 only */
-#define HFLIP_IDX 3
-       {
+[HFLIP] = {
            {
                .id      = V4L2_CID_HFLIP,
                .type    = V4L2_CTRL_TYPE_BOOLEAN,
@@ -206,14 +191,11 @@ static const struct ctrl sd_ctrls[] = {
                .minimum = 0,
                .maximum = 1,
                .step    = 1,
-#define HFLIP_DEF 0
-               .default_value = HFLIP_DEF,
+               .default_value = 0,
            },
-           .set = sd_sethflip,
-           .get = sd_gethflip,
+           .set_control = sethvflip,
        },
-#define VFLIP_IDX 4
-       {
+[VFLIP] = {
            {
                .id      = V4L2_CID_VFLIP,
                .type    = V4L2_CTRL_TYPE_BOOLEAN,
@@ -221,14 +203,11 @@ static const struct ctrl sd_ctrls[] = {
                .minimum = 0,
                .maximum = 1,
                .step    = 1,
-#define VFLIP_DEF 0
-               .default_value = VFLIP_DEF,
+               .default_value = 0,
            },
-           .set = sd_setvflip,
-           .get = sd_getvflip,
+           .set_control = sethvflip,
        },
-#define AUTOBRIGHT_IDX 5
-       {
+[AUTOBRIGHT] = {
            {
                .id      = V4L2_CID_AUTOBRIGHTNESS,
                .type    = V4L2_CTRL_TYPE_BOOLEAN,
@@ -236,14 +215,11 @@ static const struct ctrl sd_ctrls[] = {
                .minimum = 0,
                .maximum = 1,
                .step    = 1,
-#define AUTOBRIGHT_DEF 1
-               .default_value = AUTOBRIGHT_DEF,
+               .default_value = 1,
            },
-           .set = sd_setautobrightness,
-           .get = sd_getautobrightness,
+           .set_control = setautobright,
        },
-#define FREQ_IDX 6
-       {
+[FREQ] = {
            {
                .id      = V4L2_CID_POWER_LINE_FREQUENCY,
                .type    = V4L2_CTRL_TYPE_MENU,
@@ -251,26 +227,9 @@ static const struct ctrl sd_ctrls[] = {
                .minimum = 0,
                .maximum = 2,   /* 0: 0, 1: 50Hz, 2:60Hz */
                .step    = 1,
-#define FREQ_DEF 0
-               .default_value = FREQ_DEF,
-           },
-           .set = sd_setfreq,
-           .get = sd_getfreq,
-       },
-#define OV7670_FREQ_IDX 7
-       {
-           {
-               .id      = V4L2_CID_POWER_LINE_FREQUENCY,
-               .type    = V4L2_CTRL_TYPE_MENU,
-               .name    = "Light frequency filter",
-               .minimum = 0,
-               .maximum = 3,   /* 0: 0, 1: 50Hz, 2:60Hz 3: Auto Hz */
-               .step    = 1,
-#define OV7670_FREQ_DEF 3
-               .default_value = OV7670_FREQ_DEF,
+               .default_value = 0,
            },
-           .set = sd_setfreq,
-           .get = sd_getfreq,
+           .set_control = setfreq,
        },
 };
 
@@ -456,10 +415,10 @@ static const struct v4l2_pix_format ovfx2_ov3610_mode[] = {
 
 /* Registers common to OV511 / OV518 */
 #define R51x_FIFO_PSIZE                        0x30    /* 2 bytes wide w/ OV518(+) */
-#define R51x_SYS_RESET                 0x50
+#define R51x_SYS_RESET                 0x50
        /* Reset type flags */
        #define OV511_RESET_OMNICE      0x08
-#define R51x_SYS_INIT                  0x53
+#define R51x_SYS_INIT                  0x53
 #define R51x_SYS_SNAP                  0x52
 #define R51x_SYS_CUST_ID               0x5F
 #define R51x_COMP_LUT_BEGIN            0x80
@@ -644,13 +603,11 @@ struct ov_i2c_regvals {
 };
 
 /* Settings for OV2610 camera chip */
-static const struct ov_i2c_regvals norm_2610[] =
-{
+static const struct ov_i2c_regvals norm_2610[] = {
        { 0x12, 0x80 }, /* reset */
 };
 
-static const struct ov_i2c_regvals norm_3620b[] =
-{
+static const struct ov_i2c_regvals norm_3620b[] = {
        /*
         * From the datasheet: "Note that after writing to register COMH
         * (0x12) to change the sensor mode, registers related to the
@@ -1900,7 +1857,7 @@ static int reg_w(struct sd *sd, __u16 index, __u16 value)
                        sd->gspca_dev.usb_buf, 1, 500);
 leave:
        if (ret < 0) {
-               PDEBUG(D_ERR, "Write reg 0x%04x -> [0x%02x] failed",
+               err("Write reg 0x%04x -> [0x%02x] failed",
                       value, index);
                return ret;
        }
@@ -1938,7 +1895,7 @@ static int reg_r(struct sd *sd, __u16 index)
                ret = sd->gspca_dev.usb_buf[0];
                PDEBUG(D_USBI, "Read reg [0x%02X] -> 0x%04X", index, ret);
        } else
-               PDEBUG(D_ERR, "Read reg [0x%02x] failed", index);
+               err("Read reg [0x%02x] failed", index);
 
        return ret;
 }
@@ -1958,7 +1915,7 @@ static int reg_r8(struct sd *sd,
        if (ret >= 0)
                ret = sd->gspca_dev.usb_buf[0];
        else
-               PDEBUG(D_ERR, "Read reg 8 [0x%02x] failed", index);
+               err("Read reg 8 [0x%02x] failed", index);
 
        return ret;
 }
@@ -2006,7 +1963,7 @@ static int ov518_reg_w32(struct sd *sd, __u16 index, u32 value, int n)
                        0, index,
                        sd->gspca_dev.usb_buf, n, 500);
        if (ret < 0) {
-               PDEBUG(D_ERR, "Write reg32 [%02x] %08x failed", index, value);
+               err("Write reg32 [%02x] %08x failed", index, value);
                return ret;
        }
 
@@ -2203,7 +2160,7 @@ static int ovfx2_i2c_w(struct sd *sd, __u8 reg, __u8 value)
                        (__u16)value, (__u16)reg, NULL, 0, 500);
 
        if (ret < 0) {
-               PDEBUG(D_ERR, "i2c 0x%02x -> [0x%02x] failed", value, reg);
+               err("i2c 0x%02x -> [0x%02x] failed", value, reg);
                return ret;
        }
 
@@ -2225,7 +2182,7 @@ static int ovfx2_i2c_r(struct sd *sd, __u8 reg)
                ret = sd->gspca_dev.usb_buf[0];
                PDEBUG(D_USBI, "i2c [0x%02X] -> 0x%02X", reg, ret);
        } else
-               PDEBUG(D_ERR, "i2c read [0x%02x] failed", reg);
+               err("i2c read [0x%02x] failed", reg);
 
        return ret;
 }
@@ -2481,7 +2438,7 @@ static int ov_hires_configure(struct sd *sd)
        int high, low;
 
        if (sd->bridge != BRIDGE_OVFX2) {
-               PDEBUG(D_ERR, "error hires sensors only supported with ovfx2");
+               err("error hires sensors only supported with ovfx2");
                return -1;
        }
 
@@ -2498,7 +2455,7 @@ static int ov_hires_configure(struct sd *sd)
                PDEBUG(D_PROBE, "Sensor is an OV3610");
                sd->sensor = SEN_OV3610;
        } else {
-               PDEBUG(D_ERR, "Error unknown sensor type: 0x%02x%02x",
+               err("Error unknown sensor type: 0x%02x%02x",
                       high, low);
                return -1;
        }
@@ -2526,7 +2483,7 @@ static int ov8xx0_configure(struct sd *sd)
        if ((rc & 3) == 1) {
                sd->sensor = SEN_OV8610;
        } else {
-               PDEBUG(D_ERR, "Unknown image sensor version: %d", rc & 3);
+               err("Unknown image sensor version: %d", rc & 3);
                return -1;
        }
 
@@ -2589,9 +2546,8 @@ static int ov7xx0_configure(struct sd *sd)
                if (high == 0x76) {
                        switch (low) {
                        case 0x30:
-                               PDEBUG(D_PROBE, "Sensor is an OV7630/OV7635");
-                               PDEBUG(D_ERR,
-                                     "7630 is not supported by this driver");
+                               err("Sensor is an OV7630/OV7635");
+                               err("7630 is not supported by this driver");
                                return -1;
                        case 0x40:
                                PDEBUG(D_PROBE, "Sensor is an OV7645");
@@ -2614,7 +2570,7 @@ static int ov7xx0_configure(struct sd *sd)
                        sd->sensor = SEN_OV7620;
                }
        } else {
-               PDEBUG(D_ERR, "Unknown image sensor version: %d", rc & 3);
+               err("Unknown image sensor version: %d", rc & 3);
                return -1;
        }
 
@@ -2641,9 +2597,8 @@ static int ov6xx0_configure(struct sd *sd)
        switch (rc) {
        case 0x00:
                sd->sensor = SEN_OV6630;
-               PDEBUG(D_ERR,
-                       "WARNING: Sensor is an OV66308. Your camera may have");
-               PDEBUG(D_ERR, "been misdetected in previous driver versions.");
+               warn("WARNING: Sensor is an OV66308. Your camera may have");
+               warn("been misdetected in previous driver versions.");
                break;
        case 0x01:
                sd->sensor = SEN_OV6620;
@@ -2659,12 +2614,11 @@ static int ov6xx0_configure(struct sd *sd)
                break;
        case 0x90:
                sd->sensor = SEN_OV6630;
-               PDEBUG(D_ERR,
-                       "WARNING: Sensor is an OV66307. Your camera may have");
-               PDEBUG(D_ERR, "been misdetected in previous driver versions.");
+               warn("WARNING: Sensor is an OV66307. Your camera may have");
+               warn("been misdetected in previous driver versions.");
                break;
        default:
-               PDEBUG(D_ERR, "FATAL: Unknown sensor version: 0x%02x", rc);
+               err("FATAL: Unknown sensor version: 0x%02x", rc);
                return -1;
        }
 
@@ -2823,7 +2777,7 @@ static int ov511_configure(struct gspca_dev *gspca_dev)
        };
 
        const struct ov_regvals norm_511[] = {
-               { R511_DRAM_FLOW_CTL,   0x01 },
+               { R511_DRAM_FLOW_CTL,   0x01 },
                { R51x_SYS_SNAP,        0x00 },
                { R51x_SYS_SNAP,        0x02 },
                { R51x_SYS_SNAP,        0x00 },
@@ -2907,7 +2861,7 @@ static int ov518_configure(struct gspca_dev *gspca_dev)
        const struct ov_regvals norm_518[] = {
                { R51x_SYS_SNAP,        0x02 }, /* Reset */
                { R51x_SYS_SNAP,        0x01 }, /* Enable */
-               { 0x31,                 0x0f },
+               { 0x31,                 0x0f },
                { 0x5d,                 0x03 },
                { 0x24,                 0x9f },
                { 0x25,                 0x90 },
@@ -2920,7 +2874,7 @@ static int ov518_configure(struct gspca_dev *gspca_dev)
        const struct ov_regvals norm_518_p[] = {
                { R51x_SYS_SNAP,        0x02 }, /* Reset */
                { R51x_SYS_SNAP,        0x01 }, /* Enable */
-               { 0x31,                 0x0f },
+               { 0x31,                 0x0f },
                { 0x5d,                 0x03 },
                { 0x24,                 0x9f },
                { 0x25,                 0x90 },
@@ -3082,7 +3036,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
                        goto error;
                }
        } else {
-               PDEBUG(D_ERR, "Can't determine sensor slave IDs");
+               err("Can't determine sensor slave IDs");
                goto error;
        }
 
@@ -3142,36 +3096,23 @@ static int sd_config(struct gspca_dev *gspca_dev,
                        goto error;
                break;
        }
-       sd->brightness = BRIGHTNESS_DEF;
-       if (sd->sensor == SEN_OV6630 || sd->sensor == SEN_OV66308AF)
-               sd->contrast = 200; /* The default is too low for the ov6630 */
+       gspca_dev->cam.ctrls = sd->ctrls;
+       if (sd->sensor == SEN_OV7670)
+               gspca_dev->ctrl_dis = 1 << COLORS;
        else
-               sd->contrast = CONTRAST_DEF;
-       sd->colors = COLOR_DEF;
-       sd->hflip = HFLIP_DEF;
-       sd->vflip = VFLIP_DEF;
-       sd->autobrightness = AUTOBRIGHT_DEF;
-       if (sd->sensor == SEN_OV7670) {
-               sd->freq = OV7670_FREQ_DEF;
-               gspca_dev->ctrl_dis = (1 << FREQ_IDX) | (1 << COLOR_IDX);
-       } else {
-               sd->freq = FREQ_DEF;
-               gspca_dev->ctrl_dis = (1 << HFLIP_IDX) | (1 << VFLIP_IDX) |
-                                     (1 << OV7670_FREQ_IDX);
-       }
+               gspca_dev->ctrl_dis = (1 << HFLIP) | (1 << VFLIP);
        sd->quality = QUALITY_DEF;
        if (sd->sensor == SEN_OV7640 ||
            sd->sensor == SEN_OV7648)
-               gspca_dev->ctrl_dis |= (1 << AUTOBRIGHT_IDX) |
-                                      (1 << CONTRAST_IDX);
+               gspca_dev->ctrl_dis |= (1 << AUTOBRIGHT) | (1 << CONTRAST);
        if (sd->sensor == SEN_OV7670)
-               gspca_dev->ctrl_dis |= 1 << AUTOBRIGHT_IDX;
+               gspca_dev->ctrl_dis |= 1 << AUTOBRIGHT;
        /* OV8610 Frequency filter control should work but needs testing */
        if (sd->sensor == SEN_OV8610)
-               gspca_dev->ctrl_dis |= 1 << FREQ_IDX;
+               gspca_dev->ctrl_dis |= 1 << FREQ;
        /* No controls for the OV2610/OV3610 */
        if (sd->sensor == SEN_OV2610 || sd->sensor == SEN_OV3610)
-               gspca_dev->ctrl_dis |= 0xFF;
+               gspca_dev->ctrl_dis |= (1 << NCTRL) - 1;
 
        return 0;
 error:
@@ -3206,6 +3147,8 @@ static int sd_init(struct gspca_dev *gspca_dev)
                break;
        case SEN_OV6630:
        case SEN_OV66308AF:
+               sd->ctrls[CONTRAST].def = 200;
+                                /* The default is too low for the ov6630 */
                if (write_i2c_regvals(sd, norm_6x30, ARRAY_SIZE(norm_6x30)))
                        return -EIO;
                break;
@@ -3228,6 +3171,8 @@ static int sd_init(struct gspca_dev *gspca_dev)
                        return -EIO;
                break;
        case SEN_OV7670:
+               sd->ctrls[FREQ].max = 3;        /* auto */
+               sd->ctrls[FREQ].def = 3;
                if (write_i2c_regvals(sd, norm_7670, ARRAY_SIZE(norm_7670)))
                        return -EIO;
                break;
@@ -3253,7 +3198,7 @@ static int ov511_mode_init_regs(struct sd *sd)
        intf = usb_ifnum_to_if(sd->gspca_dev.dev, sd->gspca_dev.iface);
        alt = usb_altnum_to_altsetting(intf, sd->gspca_dev.alt);
        if (!alt) {
-               PDEBUG(D_ERR, "Couldn't get altsetting");
+               err("Couldn't get altsetting");
                return -EIO;
        }
 
@@ -3377,7 +3322,7 @@ static int ov518_mode_init_regs(struct sd *sd)
        intf = usb_ifnum_to_if(sd->gspca_dev.dev, sd->gspca_dev.iface);
        alt = usb_altnum_to_altsetting(intf, sd->gspca_dev.alt);
        if (!alt) {
-               PDEBUG(D_ERR, "Couldn't get altsetting");
+               err("Couldn't get altsetting");
                return -EIO;
        }
 
@@ -3706,7 +3651,7 @@ static int mode_init_ov_sensor_regs(struct sd *sd)
                break;
        case SEN_OV7610:
                i2c_w_mask(sd, 0x14, qvga ? 0x20 : 0x00, 0x20);
-               i2c_w(sd, 0x35, qvga?0x1e:0x9e);
+               i2c_w(sd, 0x35, qvga ? 0x1e : 0x9e);
                i2c_w_mask(sd, 0x13, 0x00, 0x20); /* Select 16 bit data bus */
                i2c_w_mask(sd, 0x12, 0x04, 0x06); /* AWB: 1 Test pattern: 0 */
                break;
@@ -3798,15 +3743,17 @@ static int mode_init_ov_sensor_regs(struct sd *sd)
        return 0;
 }
 
-static void sethvflip(struct sd *sd)
+static void sethvflip(struct gspca_dev *gspca_dev)
 {
+       struct sd *sd = (struct sd *) gspca_dev;
+
        if (sd->sensor != SEN_OV7670)
                return;
        if (sd->gspca_dev.streaming)
                ov51x_stop(sd);
        i2c_w_mask(sd, OV7670_REG_MVFP,
-               OV7670_MVFP_MIRROR * sd->hflip
-                       | OV7670_MVFP_VFLIP * sd->vflip,
+               OV7670_MVFP_MIRROR * sd->ctrls[HFLIP].val
+                       | OV7670_MVFP_VFLIP * sd->ctrls[VFLIP].val,
                OV7670_MVFP_MIRROR | OV7670_MVFP_VFLIP);
        if (sd->gspca_dev.streaming)
                ov51x_restart(sd);
@@ -3957,9 +3904,9 @@ static int sd_start(struct gspca_dev *gspca_dev)
        setcontrast(gspca_dev);
        setbrightness(gspca_dev);
        setcolors(gspca_dev);
-       sethvflip(sd);
-       setautobrightness(sd);
-       setfreq(sd);
+       sethvflip(gspca_dev);
+       setautobright(gspca_dev);
+       setfreq_i(sd);
 
        /* Force clear snapshot state in case the snapshot button was
           pressed while we weren't streaming */
@@ -4000,7 +3947,7 @@ static void ov51x_handle_button(struct gspca_dev *gspca_dev, u8 state)
        struct sd *sd = (struct sd *) gspca_dev;
 
        if (sd->snapshot_pressed != state) {
-#ifdef CONFIG_INPUT
+#if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE)
                input_report_key(gspca_dev->input_dev, KEY_CAMERA, state);
                input_sync(gspca_dev->input_dev);
 #endif
@@ -4214,7 +4161,7 @@ static void setbrightness(struct gspca_dev *gspca_dev)
        struct sd *sd = (struct sd *) gspca_dev;
        int val;
 
-       val = sd->brightness;
+       val = sd->ctrls[BRIGHTNESS].val;
        switch (sd->sensor) {
        case SEN_OV8610:
        case SEN_OV7610:
@@ -4229,7 +4176,7 @@ static void setbrightness(struct gspca_dev *gspca_dev)
        case SEN_OV7620:
        case SEN_OV7620AE:
                /* 7620 doesn't like manual changes when in auto mode */
-               if (!sd->autobrightness)
+               if (!sd->ctrls[AUTOBRIGHT].val)
                        i2c_w(sd, OV7610_REG_BRT, val);
                break;
        case SEN_OV7670:
@@ -4245,7 +4192,7 @@ static void setcontrast(struct gspca_dev *gspca_dev)
        struct sd *sd = (struct sd *) gspca_dev;
        int val;
 
-       val = sd->contrast;
+       val = sd->ctrls[CONTRAST].val;
        switch (sd->sensor) {
        case SEN_OV7610:
        case SEN_OV6620:
@@ -4287,7 +4234,7 @@ static void setcolors(struct gspca_dev *gspca_dev)
        struct sd *sd = (struct sd *) gspca_dev;
        int val;
 
-       val = sd->colors;
+       val = sd->ctrls[COLORS].val;
        switch (sd->sensor) {
        case SEN_OV8610:
        case SEN_OV7610:
@@ -4317,23 +4264,25 @@ static void setcolors(struct gspca_dev *gspca_dev)
        }
 }
 
-static void setautobrightness(struct sd *sd)
+static void setautobright(struct gspca_dev *gspca_dev)
 {
+       struct sd *sd = (struct sd *) gspca_dev;
+
        if (sd->sensor == SEN_OV7640 || sd->sensor == SEN_OV7648 ||
            sd->sensor == SEN_OV7670 ||
            sd->sensor == SEN_OV2610 || sd->sensor == SEN_OV3610)
                return;
 
-       i2c_w_mask(sd, 0x2d, sd->autobrightness ? 0x10 : 0x00, 0x10);
+       i2c_w_mask(sd, 0x2d, sd->ctrls[AUTOBRIGHT].val ? 0x10 : 0x00, 0x10);
 }
 
-static void setfreq(struct sd *sd)
+static void setfreq_i(struct sd *sd)
 {
        if (sd->sensor == SEN_OV2610 || sd->sensor == SEN_OV3610)
                return;
 
        if (sd->sensor == SEN_OV7670) {
-               switch (sd->freq) {
+               switch (sd->ctrls[FREQ].val) {
                case 0: /* Banding filter disabled */
                        i2c_w_mask(sd, OV7670_REG_COM8, 0, OV7670_COM8_BFILT);
                        break;
@@ -4355,7 +4304,7 @@ static void setfreq(struct sd *sd)
                        break;
                }
        } else {
-               switch (sd->freq) {
+               switch (sd->ctrls[FREQ].val) {
                case 0: /* Banding filter disabled */
                        i2c_w_mask(sd, 0x2d, 0x00, 0x04);
                        i2c_w_mask(sd, 0x2a, 0x00, 0x80);
@@ -4387,135 +4336,15 @@ static void setfreq(struct sd *sd)
                }
        }
 }
-
-static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
-{
-       struct sd *sd = (struct sd *) gspca_dev;
-
-       sd->brightness = val;
-       if (gspca_dev->streaming)
-               setbrightness(gspca_dev);
-       return 0;
-}
-
-static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val)
-{
-       struct sd *sd = (struct sd *) gspca_dev;
-
-       *val = sd->brightness;
-       return 0;
-}
-
-static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val)
-{
-       struct sd *sd = (struct sd *) gspca_dev;
-
-       sd->contrast = val;
-       if (gspca_dev->streaming)
-               setcontrast(gspca_dev);
-       return 0;
-}
-
-static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val)
-{
-       struct sd *sd = (struct sd *) gspca_dev;
-
-       *val = sd->contrast;
-       return 0;
-}
-
-static int sd_setcolors(struct gspca_dev *gspca_dev, __s32 val)
-{
-       struct sd *sd = (struct sd *) gspca_dev;
-
-       sd->colors = val;
-       if (gspca_dev->streaming)
-               setcolors(gspca_dev);
-       return 0;
-}
-
-static int sd_getcolors(struct gspca_dev *gspca_dev, __s32 *val)
-{
-       struct sd *sd = (struct sd *) gspca_dev;
-
-       *val = sd->colors;
-       return 0;
-}
-
-static int sd_sethflip(struct gspca_dev *gspca_dev, __s32 val)
-{
-       struct sd *sd = (struct sd *) gspca_dev;
-
-       sd->hflip = val;
-       if (gspca_dev->streaming)
-               sethvflip(sd);
-       return 0;
-}
-
-static int sd_gethflip(struct gspca_dev *gspca_dev, __s32 *val)
-{
-       struct sd *sd = (struct sd *) gspca_dev;
-
-       *val = sd->hflip;
-       return 0;
-}
-
-static int sd_setvflip(struct gspca_dev *gspca_dev, __s32 val)
-{
-       struct sd *sd = (struct sd *) gspca_dev;
-
-       sd->vflip = val;
-       if (gspca_dev->streaming)
-               sethvflip(sd);
-       return 0;
-}
-
-static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val)
-{
-       struct sd *sd = (struct sd *) gspca_dev;
-
-       *val = sd->vflip;
-       return 0;
-}
-
-static int sd_setautobrightness(struct gspca_dev *gspca_dev, __s32 val)
-{
-       struct sd *sd = (struct sd *) gspca_dev;
-
-       sd->autobrightness = val;
-       if (gspca_dev->streaming)
-               setautobrightness(sd);
-       return 0;
-}
-
-static int sd_getautobrightness(struct gspca_dev *gspca_dev, __s32 *val)
-{
-       struct sd *sd = (struct sd *) gspca_dev;
-
-       *val = sd->autobrightness;
-       return 0;
-}
-
-static int sd_setfreq(struct gspca_dev *gspca_dev, __s32 val)
+static void setfreq(struct gspca_dev *gspca_dev)
 {
        struct sd *sd = (struct sd *) gspca_dev;
 
-       sd->freq = val;
-       if (gspca_dev->streaming) {
-               setfreq(sd);
-               /* Ugly but necessary */
-               if (sd->bridge == BRIDGE_W9968CF)
-                       w9968cf_set_crop_window(sd);
-       }
-       return 0;
-}
-
-static int sd_getfreq(struct gspca_dev *gspca_dev, __s32 *val)
-{
-       struct sd *sd = (struct sd *) gspca_dev;
+       setfreq_i(sd);
 
-       *val = sd->freq;
-       return 0;
+       /* Ugly but necessary */
+       if (sd->bridge == BRIDGE_W9968CF)
+               w9968cf_set_crop_window(sd);
 }
 
 static int sd_querymenu(struct gspca_dev *gspca_dev,
@@ -4601,7 +4430,7 @@ static const struct sd_desc sd_desc = {
        .querymenu = sd_querymenu,
        .get_jcomp = sd_get_jcomp,
        .set_jcomp = sd_set_jcomp,
-#ifdef CONFIG_INPUT
+#if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE)
        .other_input = 1,
 #endif
 };
@@ -4663,17 +4492,11 @@ static struct usb_driver sd_driver = {
 /* -- module insert / remove -- */
 static int __init sd_mod_init(void)
 {
-       int ret;
-       ret = usb_register(&sd_driver);
-       if (ret < 0)
-               return ret;
-       PDEBUG(D_PROBE, "registered");
-       return 0;
+       return usb_register(&sd_driver);
 }
 static void __exit sd_mod_exit(void)
 {
        usb_deregister(&sd_driver);
-       PDEBUG(D_PROBE, "deregistered");
 }
 
 module_init(sd_mod_init);