0x10, 0x61 and sd->hstart, vstart = 3, fixes ugly colored borders */
        {0x17, 0x10}, {0x18, 0x61},
        {0x37, 0x0f}, {0x38, 0x02}, {0x39, 0x43},
-       {0x3a, 0x00}, {0x69, 0x90}, {0x2d, 0xf6},
-       {0x2e, 0x0b}, {0x01, 0x78}, {0x02, 0x50},
+       {0x3a, 0x00}, {0x69, 0x90}, {0x2d, 0x00},
+       {0x2e, 0x00}, {0x01, 0x78}, {0x02, 0x50},
 };
 
 static const struct i2c_reg_u8 ov7670_init[] = {
        struct sd *sd = (struct sd *) gspca_dev;
        u8 exp[8] = {sd->i2c_intf, sd->i2c_addr,
                                0x00, 0x00, 0x00, 0x00, 0x00, 0x10};
-       int expo;
+       int expo, expo2;
 
        if (gspca_dev->streaming)
                exp[7] = 0x1e;
        case SENSOR_OV7670:
        case SENSOR_OV9655:
        case SENSOR_OV9650:
+               if (expo > 547)
+                       expo2 = 547;
+               else
+                       expo2 = expo;
+               exp[0] |= (2 << 4);
+               exp[2] = 0x10;                  /* AECH */
+               exp[3] = expo2 >> 2;
+               exp[7] = 0x10;
+               i2c_w(gspca_dev, exp);
+               exp[2] = 0x04;                  /* COM1 */
+               exp[3] = expo2 & 0x0003;
+               exp[7] = 0x10;
+               i2c_w(gspca_dev, exp);
+               expo -= expo2;
+               exp[7] = 0x1e;
                exp[0] |= (3 << 4);
-               exp[2] = 0x2d;
+               exp[2] = 0x2d;                  /* ADVFL & ADVFH */
                exp[3] = expo;
                exp[4] = expo >> 8;
                break;