[media] em28xx: add support for the SpeedLink Vicious And Devine Laplace webcams
authorFrank Schaefer <fschaefer.oss@googlemail.com>
Sun, 1 Dec 2013 21:06:57 +0000 (18:06 -0300)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Tue, 10 Dec 2013 18:21:02 +0000 (16:21 -0200)
The SpeedLink Vicious And Devine Laplace webcam is using an EM2765 bridge and
an OV2640 sensor. It has a built-in microphone (USB standard device class)
and provides 3 buttons (snapshot, illumination, mute) and 2 LEDs (capturing/mute
and illumination/flash). It is also equipped with an eeprom.
The device is available in two colors: white (1ae7:9003) and black (1ae7:9004).
For further details see http://linuxtv.org/wiki/index.php/VAD_Laplace.
Please note the following limitations that need to be addressed later:
- resolution limited to 640x480 (sensor supports 1600x1200)
- picture quality needs to be improved
- AV-mute button doesn't work yet

Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
drivers/media/usb/em28xx/em28xx-cards.c
drivers/media/usb/em28xx/em28xx.h

index ebb112c17109d2ef9060c71fb04adba7cc32b960..64543098e8a6a8b9435a4f9be81a9d3261f4014b 100644 (file)
@@ -412,6 +412,21 @@ static struct em28xx_reg_seq pctv_520e[] = {
        {       -1,                     -1,     -1,     -1},
 };
 
+/* 1ae7:9003/9004 SpeedLink Vicious And Devine Laplace webcam
+ * reg 0x80/0x84:
+ * GPIO_0: capturing LED, 0=on, 1=off
+ * GPIO_2: AV mute button, 0=pressed, 1=unpressed
+ * GPIO 3: illumination button, 0=pressed, 1=unpressed
+ * GPIO_6: illumination/flash LED, 0=on, 1=off
+ * reg 0x81/0x85:
+ * GPIO_7: snapshot button, 0=pressed, 1=unpressed
+ */
+static struct em28xx_reg_seq speedlink_vad_laplace_reg_seq[] = {
+       {EM2820_R08_GPIO_CTRL,          0xf7,   0xff,   10},
+       {EM2874_R80_GPIO_P0_CTRL,       0xff,   0xb2,   10},
+       {       -1,                     -1,     -1,     -1},
+};
+
 /*
  *  Button definitions
  */
@@ -426,6 +441,41 @@ static struct em28xx_button std_snapshot_button[] = {
        {-1, 0, 0, 0, 0},
 };
 
+static struct em28xx_button speedlink_vad_laplace_buttons[] = {
+       {
+               .role     = EM28XX_BUTTON_SNAPSHOT,
+               .reg_r    = EM2874_R85_GPIO_P1_STATE,
+               .mask     = 0x80,
+               .inverted = 1,
+       },
+       {
+               .role     = EM28XX_BUTTON_ILLUMINATION,
+               .reg_r    = EM2874_R84_GPIO_P0_STATE,
+               .mask     = 0x08,
+               .inverted = 1,
+       },
+       {-1, 0, 0, 0, 0},
+};
+
+/*
+ *  LED definitions
+ */
+static struct em28xx_led speedlink_vad_laplace_leds[] = {
+       {
+               .role      = EM28XX_LED_ANALOG_CAPTURING,
+               .gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
+               .gpio_mask = 0x01,
+               .inverted  = 1,
+       },
+       {
+               .role      = EM28XX_LED_ILLUMINATION,
+               .gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
+               .gpio_mask = 0x40,
+               .inverted  = 1,
+       },
+       {-1, 0, 0, 0},
+};
+
 /*
  *  Board definitions
  */
@@ -2057,6 +2107,24 @@ struct em28xx_board em28xx_boards[] = {
                .tuner_gpio     = default_tuner_gpio,
                .def_i2c_bus    = 1,
        },
+       /* 1ae7:9003/9004 SpeedLink Vicious And Devine Laplace webcam
+        * Empia EM2765 + OmniVision OV2640 */
+       [EM2765_BOARD_SPEEDLINK_VAD_LAPLACE] = {
+               .name         = "SpeedLink Vicious And Devine Laplace webcam",
+               .xclk         = EM28XX_XCLK_FREQUENCY_24MHZ,
+               .i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
+                               EM28XX_I2C_FREQ_100_KHZ,
+               .def_i2c_bus  = 1,
+               .tuner_type   = TUNER_ABSENT,
+               .is_webcam    = 1,
+               .input        = { {
+                       .type     = EM28XX_VMUX_COMPOSITE1,
+                       .amux     = EM28XX_AMUX_VIDEO,
+                       .gpio     = speedlink_vad_laplace_reg_seq,
+               } },
+               .buttons = speedlink_vad_laplace_buttons,
+               .leds = speedlink_vad_laplace_leds,
+       },
 };
 const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
 
@@ -2222,6 +2290,10 @@ struct usb_device_id em28xx_id_table[] = {
                        .driver_info = EM2884_BOARD_PCTV_520E },
        { USB_DEVICE(0x1b80, 0xe1cc),
                        .driver_info = EM2874_BOARD_DELOCK_61959 },
+       { USB_DEVICE(0x1ae7, 0x9003),
+                       .driver_info = EM2765_BOARD_SPEEDLINK_VAD_LAPLACE },
+       { USB_DEVICE(0x1ae7, 0x9004),
+                       .driver_info = EM2765_BOARD_SPEEDLINK_VAD_LAPLACE },
        { },
 };
 MODULE_DEVICE_TABLE(usb, em28xx_id_table);
index 43e29683eb6afd051794c440a7a57499b90b1335..6e26fba094c8318f0579460b86aa8ce8055def49 100644 (file)
 #define EM2884_BOARD_C3TECH_DIGITAL_DUO                  88
 #define EM2874_BOARD_DELOCK_61959                89
 #define EM2874_BOARD_KWORLD_UB435Q_V2            90
+#define EM2765_BOARD_SPEEDLINK_VAD_LAPLACE       91
 
 /* Limits minimum and default number of buffers */
 #define EM28XX_MIN_BUF 4