u8 blue;
        u8 red;
        u8 gamma;
-       u8 vflip;                       /* ov7630 only */
+       u8 vflip;                       /* ov7630/ov7648 only */
        u8 infrared;                    /* mt9v111 only */
 
        s8 ag_cnt;
            .set = sd_setautogain,
            .get = sd_getautogain,
        },
-/* ov7630 only */
+/* ov7630/ov7648 only */
 #define VFLIP_IDX 6
        {
            {
                .minimum = 0,
                .maximum = 1,
                .step    = 1,
-#define VFLIP_DEF 1
+#define VFLIP_DEF 0                    /* vflip def = 1 for ov7630 */
                .default_value = VFLIP_DEF,
            },
            .set = sd_setvflip,
                                                /* SENSOR_OM6802 4 */
        (1 << AUTOGAIN_IDX) | (1 << INFRARED_IDX),
                                                /* SENSOR_OV7630 5 */
-       (1 << AUTOGAIN_IDX) | (1 << INFRARED_IDX) | (1 << VFLIP_IDX),
+       (1 << INFRARED_IDX),
                                                /* SENSOR_OV7648 6 */
        (1 << AUTOGAIN_IDX) | (1 << INFRARED_IDX) | (1 << VFLIP_IDX),
                                                /* SENSOR_OV7660 7 */
        {0xb1, 0x21, 0x2d, 0x85, 0x00, 0x00, 0x00, 0x10},
 /*...*/
 /*     {0xa1, 0x21, 0x12, 0x08, 0x00, 0x00, 0x00, 0x10}, jfm done */
-/*     {0xa1, 0x21, 0x75, 0x06, 0x00, 0x00, 0x00, 0x10}, jfm done */
+/*     {0xa1, 0x21, 0x75, 0x06, 0x00, 0x00, 0x00, 0x10},   * COMN
+                                                        * set by setvflip */
        {0xa1, 0x21, 0x19, 0x02, 0x00, 0x00, 0x00, 0x10},
        {0xa1, 0x21, 0x10, 0x32, 0x00, 0x00, 0x00, 0x10},
 /*     {0xa1, 0x21, 0x16, 0x00, 0x00, 0x00, 0x00, 0x10}, jfm done */
        sd->gamma = GAMMA_DEF;
        sd->autogain = AUTOGAIN_DEF;
        sd->ag_cnt = -1;
-       sd->vflip = VFLIP_DEF;
+       if (sd->sensor != SENSOR_OV7630)
+               sd->vflip = 0;
+       else
+               sd->vflip = 1;
        sd->infrared = INFRARED_DEF;
 
        gspca_dev->ctrl_dis = ctrl_dis[sd->sensor];
 
        if (gspca_dev->ctrl_dis & (1 << AUTOGAIN_IDX))
                return;
+       switch (sd->sensor) {
+       case SENSOR_OV7630:
+       case SENSOR_OV7648: {
+               u8 comb;
+
+               if (sd->sensor == SENSOR_OV7630)
+                       comb = 0xc0;
+               else
+                       comb = 0xa0;
+               if (sd->autogain)
+                       comb |= 0x02;
+               i2c_w1(&sd->gspca_dev, 0x13, comb);
+               return;
+           }
+       }
        if (sd->autogain)
                sd->ag_cnt = AG_CNT_START;
        else
                sd->ag_cnt = -1;
 }
 
+/* ov7630/ov7648 only */
 static void setvflip(struct sd *sd)
 {
-       i2c_w1(&sd->gspca_dev, 0x75,                    /* COMN */
-               sd->vflip ? 0x82 : 0x02);
+       u8 comn;
+
+       if (sd->sensor == SENSOR_OV7630)
+               comn = 0x02;
+       else
+               comn = 0x06;
+       if (sd->vflip)
+               comn |= 0x80;
+       i2c_w1(&sd->gspca_dev, 0x75, comn);
 }
 
 static void setinfrared(struct sd *sd)