These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / media / usb / cx231xx / cx231xx-cards.c
index fe00da1..4a117a5 100644 (file)
@@ -815,6 +815,32 @@ struct cx231xx_board cx231xx_boards[] = {
                        .gpio = NULL,
                } },
        },
+       [CX231XX_BOARD_TERRATEC_GRABBY] = {
+               .name = "Terratec Grabby",
+               .tuner_type = TUNER_ABSENT,
+               .decoder = CX231XX_AVDECODER,
+               .output_mode = OUT_MODE_VIP11,
+               .demod_xfer_mode = 0,
+               .ctl_pin_status_mask = 0xFFFFFFC4,
+               .agc_analog_digital_select_gpio = 0x0c,
+               .gpio_pin_status_mask = 0x4001000,
+               .norm = V4L2_STD_PAL,
+               .no_alt_vanc = 1,
+               .external_av = 1,
+               .input = {{
+                       .type = CX231XX_VMUX_COMPOSITE1,
+                       .vmux = CX231XX_VIN_2_1,
+                       .amux = CX231XX_AMUX_LINE_IN,
+                       .gpio = NULL,
+               }, {
+                       .type = CX231XX_VMUX_SVIDEO,
+                       .vmux = CX231XX_VIN_1_1 |
+                               (CX231XX_VIN_1_2 << 8) |
+                               CX25840_SVIDEO_ON,
+                       .amux = CX231XX_AMUX_LINE_IN,
+                       .gpio = NULL,
+               } },
+       },
 };
 const unsigned int cx231xx_bcount = ARRAY_SIZE(cx231xx_boards);
 
@@ -880,6 +906,8 @@ struct usb_device_id cx231xx_id_table[] = {
         .driver_info = CX231XX_BOARD_ELGATO_VIDEO_CAPTURE_V2},
        {USB_DEVICE(0x1f4d, 0x0102),
         .driver_info = CX231XX_BOARD_OTG102},
+       {USB_DEVICE(USB_VID_TERRATEC, 0x00a6),
+        .driver_info = CX231XX_BOARD_TERRATEC_GRABBY},
        {},
 };
 
@@ -1092,17 +1120,25 @@ void cx231xx_card_setup(struct cx231xx *dev)
        case CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx:
        case CX231XX_BOARD_HAUPPAUGE_955Q:
                {
-                       struct tveeprom tvee;
-                       static u8 eeprom[256];
-                       struct i2c_client client;
-
-                       memset(&client, 0, sizeof(client));
-                       client.adapter = cx231xx_get_i2c_adap(dev, I2C_1_MUX_1);
-                       client.addr = 0xa0 >> 1;
+                       struct eeprom {
+                               struct tveeprom tvee;
+                               u8 eeprom[256];
+                               struct i2c_client client;
+                       };
+                       struct eeprom *e = kzalloc(sizeof(*e), GFP_KERNEL);
+
+                       if (e == NULL) {
+                               dev_err(dev->dev,
+                                       "failed to allocate memory to read eeprom\n");
+                               break;
+                       }
+                       e->client.adapter = cx231xx_get_i2c_adap(dev, I2C_1_MUX_1);
+                       e->client.addr = 0xa0 >> 1;
 
-                       read_eeprom(dev, &client, eeprom, sizeof(eeprom));
-                       tveeprom_hauppauge_analog(&client,
-                                               &tvee, eeprom + 0xc0);
+                       read_eeprom(dev, &e->client, e->eeprom, sizeof(e->eeprom));
+                       tveeprom_hauppauge_analog(&e->client,
+                                               &e->tvee, e->eeprom + 0xc0);
+                       kfree(e);
                        break;
                }
        }