tree-wide: fix assorted typos all over the place
[safe/jmp/linux-2.6] / drivers / media / video / gspca / spca501.c
index 6537ace..66f9f00 100644 (file)
@@ -34,6 +34,8 @@ struct sd {
        unsigned short contrast;
        __u8 brightness;
        __u8 colors;
+       __u8 blue_balance;
+       __u8 red_balance;
 
        char subtype;
 #define Arowana300KCMOSCamera 0
@@ -52,6 +54,10 @@ 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_setblue_balance(struct gspca_dev *gspca_dev, __s32 val);
+static int sd_getblue_balance(struct gspca_dev *gspca_dev, __s32 *val);
+static int sd_setred_balance(struct gspca_dev *gspca_dev, __s32 val);
+static int sd_getred_balance(struct gspca_dev *gspca_dev, __s32 *val);
 
 static struct ctrl sd_ctrls[] = {
 #define MY_BRIGHTNESS 0
@@ -63,7 +69,7 @@ static struct ctrl sd_ctrls[] = {
                .minimum = 0,
                .maximum = 127,
                .step    = 1,
-               .default_value = 63,
+               .default_value = 0,
            },
            .set = sd_setbrightness,
            .get = sd_getbrightness,
@@ -75,9 +81,9 @@ static struct ctrl sd_ctrls[] = {
                .type    = V4L2_CTRL_TYPE_INTEGER,
                .name    = "Contrast",
                .minimum = 0,
-               .maximum = 0xffff,
+               .maximum = 64725,
                .step    = 1,
-               .default_value = 0xaa00,
+               .default_value = 64725,
            },
            .set = sd_setcontrast,
            .get = sd_getcontrast,
@@ -91,14 +97,42 @@ static struct ctrl sd_ctrls[] = {
                .minimum = 0,
                .maximum = 63,
                .step    = 1,
-               .default_value = 31,
+               .default_value = 20,
            },
            .set = sd_setcolors,
            .get = sd_getcolors,
        },
+#define MY_BLUE_BALANCE 3
+       {
+           {
+               .id      = V4L2_CID_BLUE_BALANCE,
+               .type    = V4L2_CTRL_TYPE_INTEGER,
+               .name    = "Blue Balance",
+               .minimum = 0,
+               .maximum = 127,
+               .step    = 1,
+               .default_value = 0,
+           },
+           .set = sd_setblue_balance,
+           .get = sd_getblue_balance,
+       },
+#define MY_RED_BALANCE 4
+       {
+           {
+               .id      = V4L2_CID_RED_BALANCE,
+               .type    = V4L2_CTRL_TYPE_INTEGER,
+               .name    = "Red Balance",
+               .minimum = 0,
+               .maximum = 127,
+               .step    = 1,
+               .default_value = 0,
+           },
+           .set = sd_setred_balance,
+           .get = sd_getred_balance,
+       },
 };
 
-static struct v4l2_pix_format vga_mode[] = {
+static const struct v4l2_pix_format vga_mode[] = {
        {160, 120, V4L2_PIX_FMT_SPCA501, V4L2_FIELD_NONE,
                .bytesperline = 160,
                .sizeimage = 160 * 120 * 3 / 2,
@@ -1602,7 +1636,7 @@ static const __u16 spca501c_arowana_init_data[][3] = {
        {}
 };
 
-/* Unknow camera from Ori Usbid 0x0000:0x0000 */
+/* Unknown camera from Ori Usbid 0x0000:0x0000 */
 /* Based on snoops from Ori Cohen */
 static const __u16 spca501c_mysterious_open_data[][3] = {
        {0x02, 0x000f, 0x0005},
@@ -1822,29 +1856,6 @@ static int reg_write(struct usb_device *dev,
        return ret;
 }
 
-/* returns: negative is error, pos or zero is data */
-static int reg_read(struct gspca_dev *gspca_dev,
-                       __u16 req,      /* bRequest */
-                       __u16 index,    /* wIndex */
-                       __u16 length)   /* wLength (1 or 2 only) */
-{
-       int ret;
-
-       gspca_dev->usb_buf[1] = 0;
-       ret = usb_control_msg(gspca_dev->dev,
-                       usb_rcvctrlpipe(gspca_dev->dev, 0),
-                       req,
-                       USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
-                       0,              /* value */
-                       index,
-                       gspca_dev->usb_buf, length,
-                       500);                   /* timeout */
-       if (ret < 0) {
-               PDEBUG(D_ERR, "reg_read err %d", ret);
-               return -1;
-       }
-       return (gspca_dev->usb_buf[1] << 8) + gspca_dev->usb_buf[0];
-}
 
 static int write_vector(struct gspca_dev *gspca_dev,
                        const __u16 data[][3])
@@ -1869,18 +1880,7 @@ static void setbrightness(struct gspca_dev *gspca_dev)
 {
        struct sd *sd = (struct sd *) gspca_dev;
 
-       reg_write(gspca_dev->dev, SPCA501_REG_CCDSP, 0x11, sd->brightness);
        reg_write(gspca_dev->dev, SPCA501_REG_CCDSP, 0x12, sd->brightness);
-       reg_write(gspca_dev->dev, SPCA501_REG_CCDSP, 0x13, sd->brightness);
-}
-
-static void getbrightness(struct gspca_dev *gspca_dev)
-{
-       struct sd *sd = (struct sd *) gspca_dev;
-       __u16 brightness;
-
-       brightness = reg_read(gspca_dev, SPCA501_REG_CCDSP, 0x11, 2);
-       sd->brightness = brightness << 1;
 }
 
 static void setcontrast(struct gspca_dev *gspca_dev)
@@ -1893,25 +1893,25 @@ static void setcontrast(struct gspca_dev *gspca_dev)
                                  sd->contrast & 0xff);
 }
 
-static void getcontrast(struct gspca_dev *gspca_dev)
+static void setcolors(struct gspca_dev *gspca_dev)
 {
-/*     spca50x->contrast = 0xaa01; */
+       struct sd *sd = (struct sd *) gspca_dev;
+
+       reg_write(gspca_dev->dev, SPCA501_REG_CCDSP, 0x0c, sd->colors);
 }
 
-static void setcolors(struct gspca_dev *gspca_dev)
+static void setblue_balance(struct gspca_dev *gspca_dev)
 {
        struct sd *sd = (struct sd *) gspca_dev;
 
-       reg_write(gspca_dev->dev, SPCA501_REG_CCDSP, 0x0c, sd->colors);
+       reg_write(gspca_dev->dev, SPCA501_REG_CCDSP, 0x11, sd->blue_balance);
 }
 
-static void getcolors(struct gspca_dev *gspca_dev)
+static void setred_balance(struct gspca_dev *gspca_dev)
 {
        struct sd *sd = (struct sd *) gspca_dev;
 
-       sd->colors = reg_read(gspca_dev, SPCA501_REG_CCDSP, 0x0c, 2);
-/*     sd->hue = (reg_read(gspca_dev, SPCA501_REG_CCDSP, 0x13, */
-/*                     2) & 0xFF) << 8; */
+       reg_write(gspca_dev->dev, SPCA501_REG_CCDSP, 0x13, sd->red_balance);
 }
 
 /* this function is called at probe time */
@@ -1920,67 +1920,23 @@ static int sd_config(struct gspca_dev *gspca_dev,
 {
        struct sd *sd = (struct sd *) gspca_dev;
        struct cam *cam;
-       __u16 vendor;
-       __u16 product;
-
-       vendor = id->idVendor;
-       product = id->idProduct;
-       switch (vendor) {
-       case 0x0000:            /* Unknow Camera */
-/*             switch (product) { */
-/*             case 0x0000: */
-                       sd->subtype = MystFromOriUnknownCamera;
-/*                     break; */
-/*             } */
-               break;
-       case 0x040a:            /* Kodak cameras */
-/*             switch (product) { */
-/*             case 0x0002: */
-                       sd->subtype = KodakDVC325;
-/*                     break; */
-/*             } */
-               break;
-       case 0x0497:            /* Smile International */
-/*             switch (product) { */
-/*             case 0xc001: */
-                       sd->subtype = SmileIntlCamera;
-/*                     break; */
-/*             } */
-               break;
-       case 0x0506:            /* 3COM cameras */
-/*             switch (product) { */
-/*             case 0x00df: */
-                       sd->subtype = ThreeComHomeConnectLite;
-/*                     break; */
-/*             } */
-               break;
-       case 0x0733:    /* Rebadged ViewQuest (Intel) and ViewQuest cameras */
-               switch (product) {
-               case 0x0401:
-                       sd->subtype = IntelCreateAndShare;
-                       break;
-               case 0x0402:
-                       sd->subtype = ViewQuestM318B;
-                       break;
-               }
-               break;
-       case 0x1776:            /* Arowana */
-/*             switch (product) { */
-/*             case 0x501c: */
-                       sd->subtype = Arowana300KCMOSCamera;
-/*                     break; */
-/*             } */
-               break;
-       }
+
        cam = &gspca_dev->cam;
-       cam->dev_name = (char *) id->driver_info;
-       cam->epaddr = 0x01;
        cam->cam_mode = vga_mode;
-       cam->nmodes = sizeof vga_mode / sizeof vga_mode[0];
+       cam->nmodes = ARRAY_SIZE(vga_mode);
+       sd->subtype = id->driver_info;
        sd->brightness = sd_ctrls[MY_BRIGHTNESS].qctrl.default_value;
        sd->contrast = sd_ctrls[MY_CONTRAST].qctrl.default_value;
        sd->colors = sd_ctrls[MY_COLOR].qctrl.default_value;
 
+       return 0;
+}
+
+/* this function is called at probe and resume time */
+static int sd_init(struct gspca_dev *gspca_dev)
+{
+       struct sd *sd = (struct sd *) gspca_dev;
+
        switch (sd->subtype) {
        case Arowana300KCMOSCamera:
        case SmileIntlCamera:
@@ -1989,7 +1945,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
                        goto error;
                break;
        case MystFromOriUnknownCamera:
-               /* UnKnow Ori CMOS Camera data */
+               /* Unknown Ori CMOS Camera data */
                if (write_vector(gspca_dev, spca501c_mysterious_open_data))
                        goto error;
                break;
@@ -1999,15 +1955,17 @@ static int sd_config(struct gspca_dev *gspca_dev,
                        goto error;
                break;
        }
+       PDEBUG(D_STREAM, "Initializing SPCA501 finished");
        return 0;
 error:
        return -EINVAL;
 }
 
-/* this function is called at open time */
-static int sd_open(struct gspca_dev *gspca_dev)
+static int sd_start(struct gspca_dev *gspca_dev)
 {
        struct sd *sd = (struct sd *) gspca_dev;
+       struct usb_device *dev = gspca_dev->dev;
+       int mode;
 
        switch (sd->subtype) {
        case ThreeComHomeConnectLite:
@@ -2020,21 +1978,13 @@ static int sd_open(struct gspca_dev *gspca_dev)
                write_vector(gspca_dev, spca501c_arowana_open_data);
                break;
        case MystFromOriUnknownCamera:
-               /* UnKnow  CMOS Camera data */
+               /* Unknown CMOS Camera data */
                write_vector(gspca_dev, spca501c_mysterious_init_data);
                break;
        default:
                /* Generic 501 open data */
                write_vector(gspca_dev, spca501_open_data);
        }
-       PDEBUG(D_STREAM, "Initializing SPCA501 finished");
-       return 0;
-}
-
-static void sd_start(struct gspca_dev *gspca_dev)
-{
-       struct usb_device *dev = gspca_dev->dev;
-       int mode;
 
        /* memorize the wanted pixel format */
        mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;
@@ -2063,6 +2013,7 @@ static void sd_start(struct gspca_dev *gspca_dev)
        setbrightness(gspca_dev);
        setcontrast(gspca_dev);
        setcolors(gspca_dev);
+       return 0;
 }
 
 static void sd_stopN(struct gspca_dev *gspca_dev)
@@ -2072,13 +2023,11 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
        reg_write(gspca_dev->dev, SPCA501_REG_CTLRL, 0x01, 0x00);
 }
 
+/* called on streamoff with alt 0 and on disconnect */
 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)
-{
+       if (!gspca_dev->present)
+               return;
        reg_write(gspca_dev->dev, SPCA501_REG_CTLRL, 0x05, 0x00);
 }
 
@@ -2122,7 +2071,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;
 }
@@ -2141,7 +2089,6 @@ static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val)
 {
        struct sd *sd = (struct sd *) gspca_dev;
 
-       getcontrast(gspca_dev);
        *val = sd->contrast;
        return 0;
 }
@@ -2160,35 +2107,68 @@ static int sd_getcolors(struct gspca_dev *gspca_dev, __s32 *val)
 {
        struct sd *sd = (struct sd *) gspca_dev;
 
-       getcolors(gspca_dev);
        *val = sd->colors;
        return 0;
 }
 
+static int sd_setblue_balance(struct gspca_dev *gspca_dev, __s32 val)
+{
+       struct sd *sd = (struct sd *) gspca_dev;
+
+       sd->blue_balance = val;
+       if (gspca_dev->streaming)
+               setblue_balance(gspca_dev);
+       return 0;
+}
+
+static int sd_getblue_balance(struct gspca_dev *gspca_dev, __s32 *val)
+{
+       struct sd *sd = (struct sd *) gspca_dev;
+
+       *val = sd->blue_balance;
+       return 0;
+}
+
+static int sd_setred_balance(struct gspca_dev *gspca_dev, __s32 val)
+{
+       struct sd *sd = (struct sd *) gspca_dev;
+
+       sd->red_balance = val;
+       if (gspca_dev->streaming)
+               setred_balance(gspca_dev);
+       return 0;
+}
+
+static int sd_getred_balance(struct gspca_dev *gspca_dev, __s32 *val)
+{
+       struct sd *sd = (struct sd *) gspca_dev;
+
+       *val = sd->red_balance;
+       return 0;
+}
+
 /* sub-driver description */
 static const struct sd_desc sd_desc = {
        .name = MODULE_NAME,
        .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(0x040a, 0x0002), DVNM("Kodak DVC-325")},
-       {USB_DEVICE(0x0497, 0xc001), DVNM("Smile International")},
-       {USB_DEVICE(0x0506, 0x00df), DVNM("3Com HomeConnect Lite")},
-       {USB_DEVICE(0x0733, 0x0401), DVNM("Intel Create and Share")},
-       {USB_DEVICE(0x0733, 0x0402), DVNM("ViewQuest M318B")},
-       {USB_DEVICE(0x1776, 0x501c), DVNM("Arowana 300K CMOS Camera")},
-       {USB_DEVICE(0x0000, 0x0000), DVNM("MystFromOri Unknow Camera")},
+       {USB_DEVICE(0x040a, 0x0002), .driver_info = KodakDVC325},
+       {USB_DEVICE(0x0497, 0xc001), .driver_info = SmileIntlCamera},
+       {USB_DEVICE(0x0506, 0x00df), .driver_info = ThreeComHomeConnectLite},
+       {USB_DEVICE(0x0733, 0x0401), .driver_info = IntelCreateAndShare},
+       {USB_DEVICE(0x0733, 0x0402), .driver_info = ViewQuestM318B},
+       {USB_DEVICE(0x1776, 0x501c), .driver_info = Arowana300KCMOSCamera},
+       {USB_DEVICE(0x0000, 0x0000), .driver_info = MystFromOriUnknownCamera},
        {}
 };
 MODULE_DEVICE_TABLE(usb, device_table);
@@ -2206,13 +2186,19 @@ 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;
+       int ret;
+       ret = usb_register(&sd_driver);
+       if (ret < 0)
+               return ret;
        PDEBUG(D_PROBE, "registered");
        return 0;
 }