V4L/DVB: gspca_spca561: Fix LED on rev12a cameras
authorHans de Goede <hdegoede@redhat.com>
Sat, 27 Feb 2010 10:18:14 +0000 (07:18 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 18 May 2010 03:50:10 +0000 (00:50 -0300)
Fix LED control on rev12a cameras and remove the unneeded
sd_stop0 callback function.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/gspca/spca561.c

index b9c80e2103b9c99a1f76dae1406e6006c00464d1..6346ddc679672a8e5cef225fff17e8c1f917bbcf 100644 (file)
@@ -249,9 +249,9 @@ static const __u16 Pb100_2map8300[][2] = {
 };
 
 static const __u16 spca561_161rev12A_data1[][2] = {
-       {0x29, 0x8118},         /* white balance - was 21 */
-       {0x08, 0x8114},         /* white balance - was 01 */
-       {0x0e, 0x8112},         /* white balance - was 00 */
+       {0x29, 0x8118},         /* Control register (various enable bits) */
+       {0x08, 0x8114},         /* GPIO: Led off */
+       {0x0e, 0x8112},         /* 0x0e stream off 0x3e stream on */
        {0x00, 0x8102},         /* white balance - new */
        {0x92, 0x8804},
        {0x04, 0x8802},         /* windows uses 08 */
@@ -263,15 +263,11 @@ static const __u16 spca561_161rev12A_data2[][2] = {
        {0x07, 0x8601},
        {0x07, 0x8602},
        {0x04, 0x8501},
-       {0x21, 0x8118},
 
        {0x07, 0x8201},         /* windows uses 02 */
        {0x08, 0x8200},
        {0x01, 0x8200},
 
-       {0x00, 0x8114},
-       {0x01, 0x8114},         /* windows uses 00 */
-
        {0x90, 0x8604},
        {0x00, 0x8605},
        {0xb0, 0x8603},
@@ -302,6 +298,9 @@ static const __u16 spca561_161rev12A_data2[][2] = {
        {0xf0, 0x8505},
        {0x32, 0x850a},
 /*     {0x99, 0x8700},          * - white balance - new (removed) */
+       /* HDG we used to do this in stop0, making the init state and the state
+          after a start / stop different, so do this here instead. */
+       {0x29, 0x8118},
        {}
 };
 
@@ -645,6 +644,9 @@ static int sd_start_12a(struct gspca_dev *gspca_dev)
        setwhite(gspca_dev);
        setgain(gspca_dev);
        setexposure(gspca_dev);
+
+       /* Led ON (bit 3 -> 0 */
+       reg_w_val(gspca_dev->dev, 0x8114, 0x00);
        return 0;
 }
 static int sd_start_72a(struct gspca_dev *gspca_dev)
@@ -691,26 +693,14 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
 
        if (sd->chip_revision == Rev012A) {
                reg_w_val(gspca_dev->dev, 0x8112, 0x0e);
+               /* Led Off (bit 3 -> 1 */
+               reg_w_val(gspca_dev->dev, 0x8114, 0x08);
        } else {
                reg_w_val(gspca_dev->dev, 0x8112, 0x20);
 /*             reg_w_val(gspca_dev->dev, 0x8102, 0x00); ?? */
        }
 }
 
-/* called on streamoff with alt 0 and on disconnect */
-static void sd_stop0(struct gspca_dev *gspca_dev)
-{
-       struct sd *sd = (struct sd *) gspca_dev;
-
-       if (!gspca_dev->present)
-               return;
-       if (sd->chip_revision == Rev012A) {
-               reg_w_val(gspca_dev->dev, 0x8118, 0x29);
-               reg_w_val(gspca_dev->dev, 0x8114, 0x08);
-       }
-/*     reg_w_val(gspca_dev->dev, 0x8114, 0); */
-}
-
 static void do_autogain(struct gspca_dev *gspca_dev)
 {
        struct sd *sd = (struct sd *) gspca_dev;
@@ -1028,7 +1018,6 @@ static const struct sd_desc sd_desc_12a = {
        .init = sd_init_12a,
        .start = sd_start_12a,
        .stopN = sd_stopN,
-       .stop0 = sd_stop0,
        .pkt_scan = sd_pkt_scan,
 };
 static const struct sd_desc sd_desc_72a = {
@@ -1039,7 +1028,6 @@ static const struct sd_desc sd_desc_72a = {
        .init = sd_init_72a,
        .start = sd_start_72a,
        .stopN = sd_stopN,
-       .stop0 = sd_stop0,
        .pkt_scan = sd_pkt_scan,
        .dq_callback = do_autogain,
 };