media: em28xx: Enable Hauppauge 461e rev2
authorBrad Love <brad@nextdimension.cc>
Sat, 1 Feb 2020 21:48:25 +0000 (22:48 +0100)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Thu, 12 Mar 2020 08:26:18 +0000 (09:26 +0100)
Hauppauge 461e rev2 is a DVB-S/S2 usb device containing:
- m88ds3103b demod
- ts2022 tuner
- A8293 SEC

Device is the same as Hauppauge 461e,
except it contains updated m88ds3103b demod.

Signed-off-by: Brad Love <brad@nextdimension.cc>
Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/usb/em28xx/em28xx-cards.c
drivers/media/usb/em28xx/em28xx-dvb.c
drivers/media/usb/em28xx/em28xx.h

index def9cdd..a8c321d 100644 (file)
@@ -2398,6 +2398,20 @@ const struct em28xx_board em28xx_boards[] = {
                .ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
        },
        /*
+        * 2013:0259 PCTV DVB-S2 Stick (461e_v2)
+        * Empia EM28178, Montage M88DS3103b, Montage M88TS2022, Allegro A8293
+        */
+       [EM28178_BOARD_PCTV_461E_V2] = {
+               .def_i2c_bus   = 1,
+               .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
+                                EM28XX_I2C_FREQ_400_KHZ,
+               .name          = "PCTV DVB-S2 Stick (461e v2)",
+               .tuner_type    = TUNER_ABSENT,
+               .tuner_gpio    = pctv_461e,
+               .has_dvb       = 1,
+               .ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
+       },
+       /*
         * 2013:025f PCTV tripleStick (292e).
         * Empia EM28178, Silicon Labs Si2168, Silicon Labs Si2157
         */
@@ -2696,6 +2710,10 @@ struct usb_device_id em28xx_id_table[] = {
                        .driver_info = EM2765_BOARD_SPEEDLINK_VAD_LAPLACE },
        { USB_DEVICE(0x2013, 0x0258),
                        .driver_info = EM28178_BOARD_PCTV_461E },
+       { USB_DEVICE(0x2013, 0x0461),
+                       .driver_info = EM28178_BOARD_PCTV_461E_V2 },
+       { USB_DEVICE(0x2013, 0x0259),
+                       .driver_info = EM28178_BOARD_PCTV_461E_V2 },
        { USB_DEVICE(0x2013, 0x025f),
                        .driver_info = EM28178_BOARD_PCTV_292E },
        { USB_DEVICE(0x2013, 0x0264), /* Hauppauge WinTV-soloHD 292e SE */
index 0ab6c49..fb9cbfa 100644 (file)
@@ -1219,6 +1219,61 @@ static int em28178_dvb_init_pctv_461e(struct em28xx *dev)
        return 0;
 }
 
+static int em28178_dvb_init_pctv_461e_v2(struct em28xx *dev)
+{
+       struct em28xx_dvb *dvb = dev->dvb;
+       struct i2c_adapter *i2c_adapter;
+       struct m88ds3103_platform_data m88ds3103_pdata = {};
+       struct ts2020_config ts2020_config = {};
+       struct a8293_platform_data a8293_pdata = {};
+
+       /* attach demod */
+       m88ds3103_pdata.clk = 27000000;
+       m88ds3103_pdata.i2c_wr_max = 33;
+       m88ds3103_pdata.ts_mode = M88DS3103_TS_PARALLEL;
+       m88ds3103_pdata.ts_clk = 16000;
+       m88ds3103_pdata.ts_clk_pol = 0;
+       m88ds3103_pdata.agc = 0x99;
+       m88ds3103_pdata.agc_inv = 0;
+       m88ds3103_pdata.spec_inv = 0;
+       dvb->i2c_client_demod = dvb_module_probe("m88ds3103", "m88ds3103b",
+                                                &dev->i2c_adap[dev->def_i2c_bus],
+                                                0x6a, &m88ds3103_pdata);
+
+       if (!dvb->i2c_client_demod)
+               return -ENODEV;
+
+       dvb->fe[0] = m88ds3103_pdata.get_dvb_frontend(dvb->i2c_client_demod);
+       i2c_adapter = m88ds3103_pdata.get_i2c_adapter(dvb->i2c_client_demod);
+
+       /* attach tuner */
+       ts2020_config.fe = dvb->fe[0];
+       dvb->i2c_client_tuner = dvb_module_probe("ts2020", "ts2022",
+                                                i2c_adapter,
+                                                0x60, &ts2020_config);
+       if (!dvb->i2c_client_tuner) {
+               dvb_module_release(dvb->i2c_client_demod);
+               return -ENODEV;
+       }
+
+       /* delegate signal strength measurement to tuner */
+       dvb->fe[0]->ops.read_signal_strength =
+                       dvb->fe[0]->ops.tuner_ops.get_rf_strength;
+
+       /* attach SEC */
+       a8293_pdata.dvb_frontend = dvb->fe[0];
+       dvb->i2c_client_sec = dvb_module_probe("a8293", NULL,
+                                              &dev->i2c_adap[dev->def_i2c_bus],
+                                              0x08, &a8293_pdata);
+       if (!dvb->i2c_client_sec) {
+               dvb_module_release(dvb->i2c_client_tuner);
+               dvb_module_release(dvb->i2c_client_demod);
+               return -ENODEV;
+       }
+
+       return 0;
+}
+
 static int em28178_dvb_init_pctv_292e(struct em28xx *dev)
 {
        struct em28xx_dvb *dvb = dev->dvb;
@@ -1860,6 +1915,11 @@ static int em28xx_dvb_init(struct em28xx *dev)
                if (result)
                        goto out_free;
                break;
+       case EM28178_BOARD_PCTV_461E_V2:
+               result = em28178_dvb_init_pctv_461e_v2(dev);
+               if (result)
+                       goto out_free;
+               break;
        case EM28178_BOARD_PCTV_292E:
                result = em28178_dvb_init_pctv_292e(dev);
                if (result)
index 4ecadd5..acbb623 100644 (file)
 #define EM2884_BOARD_TERRATEC_H6                 101
 #define EM2882_BOARD_ZOLID_HYBRID_TV_STICK             102
 #define EM2861_BOARD_MAGIX_VIDEOWANDLER2          103
+#define EM28178_BOARD_PCTV_461E_V2                104
 
 /* Limits minimum and default number of buffers */
 #define EM28XX_MIN_BUF 4