]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
media: em28xx: Add Hauppauge 461e v3
authorBradford Love <brad@nextdimension.cc>
Tue, 17 Mar 2026 20:57:48 +0000 (15:57 -0500)
committerHans Verkuil <hverkuil+cisco@kernel.org>
Wed, 25 Mar 2026 17:27:25 +0000 (18:27 +0100)
Same as 461v2, but uses Montage ds3103c instead of ds3103b

Signed-off-by: Bradford Love <brad@nextdimension.cc>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
drivers/media/usb/em28xx/em28xx-cards.c
drivers/media/usb/em28xx/em28xx-dvb.c
drivers/media/usb/em28xx/em28xx.h

index 0b89033d28cb571748ef6fb19f1d77adfba5a9e2..fbfb74eab47593b61688aef593e7d8d5a2627f9d 100644 (file)
@@ -387,14 +387,14 @@ static const struct em28xx_reg_seq c3tech_digital_duo_digital[] = {
  * GPIO 7 = P07_LED (green LED)
  */
 static const struct em28xx_reg_seq pctv_461e[] = {
-       {EM2874_R80_GPIO_P0_CTRL,      0x7f, 0xff,    0},
-       {0x0d,                 0xff, 0xff,    0},
-       {EM2874_R80_GPIO_P0_CTRL,      0x3f, 0xff,  100}, /* reset demod */
-       {EM2874_R80_GPIO_P0_CTRL,      0x7f, 0xff,  200}, /* reset demod */
-       {0x0d,                 0x42, 0xff,    0},
-       {EM2874_R80_GPIO_P0_CTRL,      0xeb, 0xff,    0},
-       {EM2874_R5F_TS_ENABLE, 0x84, 0x84,    0}, /* parallel? | null discard */
-       {                  -1,   -1,   -1,   -1},
+       {EM2874_R80_GPIO_P0_CTRL,       0x7f,   0xff,   0},
+       {0x0d,                          0xff,   0xff,   0},
+       {EM2874_R80_GPIO_P0_CTRL,       0x3f,   0xff,   100}, /* reset demod */
+       {EM2874_R80_GPIO_P0_CTRL,       0x7f,   0xff,   200}, /* reset demod */
+       {0x0d,                          0x42,   0xff,   0},
+       {EM2874_R80_GPIO_P0_CTRL,       0xeb,   0xff,   0},
+       {EM2874_R5F_TS_ENABLE,          0x84,   0x84,   0}, /* parallel? | null discard */
+       {-1,                            -1,     -1,     -1},
 };
 
 #if 0
@@ -2496,6 +2496,20 @@ const struct em28xx_board em28xx_boards[] = {
                .has_dvb       = 1,
                .ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
        },
+       /*
+        * 2013:x462 PCTV DVB-S2 Stick (461e_v3)
+        * Empia EM28178, Montage M88DS3103c, Montage M88TS2022, Allegro A8293
+        */
+       [EM28178_BOARD_PCTV_461E_V3] = {
+               .def_i2c_bus   = 1,
+               .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
+                                EM28XX_I2C_FREQ_400_KHZ,
+               .name          = "PCTV DVB-S2 Stick (461e v3)",
+               .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
@@ -3012,6 +3026,10 @@ struct usb_device_id em28xx_id_table[] = {
                        .driver_info = EM28178_BOARD_PCTV_461E_V2 },
        { USB_DEVICE(0x2013, 0x0259),
                        .driver_info = EM28178_BOARD_PCTV_461E_V2 },
+       { USB_DEVICE(0x2013, 0x0462),
+                       .driver_info = EM28178_BOARD_PCTV_461E_V3 },
+       { USB_DEVICE(0x2013, 0x8462), /* Bulk transport 461e v3 */
+                       .driver_info = EM28178_BOARD_PCTV_461E_V3 },
        { USB_DEVICE(0x2013, 0x025f),
                        .driver_info = EM28178_BOARD_PCTV_292E },
        { USB_DEVICE(0x2013, 0x0264), /* Hauppauge WinTV-soloHD 292e SE */
index e972619705c9fd85e0aaa6a14a3332457f51121d..938f1980d448d4271ea4f4c4f7e8fe54e5c84d7a 100644 (file)
@@ -1237,7 +1237,7 @@ static int em28178_dvb_init_pctv_461e(struct em28xx *dev)
        return 0;
 }
 
-static int em28178_dvb_init_pctv_461e_v2(struct em28xx *dev)
+static int em28178_dvb_init_pctv_461e_vX(struct em28xx *dev, int version)
 {
        struct em28xx_dvb *dvb = dev->dvb;
        struct i2c_adapter *i2c_adapter;
@@ -1254,9 +1254,19 @@ static int em28178_dvb_init_pctv_461e_v2(struct em28xx *dev)
        m88ds3103_pdata.agc = 0x99;
        m88ds3103_pdata.agc_inv = 0;
        m88ds3103_pdata.spec_inv = 0;
-       dvb->i2c_client_demod[0] = dvb_module_probe("m88ds3103", "m88ds3103b",
-                                                &dev->i2c_adap[dev->def_i2c_bus],
-                                                0x6a, &m88ds3103_pdata);
+
+       if (version == 2) {
+               dvb->i2c_client_demod[0] = dvb_module_probe("m88ds3103", "m88ds3103b",
+                                                           &dev->i2c_adap[dev->def_i2c_bus],
+                                                           0x6a, &m88ds3103_pdata);
+       } else {
+               m88ds3103_pdata.lnb_hv_pol = 1;
+               m88ds3103_pdata.lnb_en_pol = 1;
+
+               dvb->i2c_client_demod[0] = dvb_module_probe("m88ds3103", "m88ds3103c",
+                                                           &dev->i2c_adap[dev->def_i2c_bus],
+                                                           0x6a, &m88ds3103_pdata);
+       }
 
        if (!dvb->i2c_client_demod[0])
                return -ENODEV;
@@ -2144,7 +2154,12 @@ static int em28xx_dvb_init(struct em28xx *dev)
                        goto out_free;
                break;
        case EM28178_BOARD_PCTV_461E_V2:
-               result = em28178_dvb_init_pctv_461e_v2(dev);
+               result = em28178_dvb_init_pctv_461e_vX(dev, 2);
+               if (result)
+                       goto out_free;
+               break;
+       case EM28178_BOARD_PCTV_461E_V3:
+               result = em28178_dvb_init_pctv_461e_vX(dev, 3);
                if (result)
                        goto out_free;
                break;
index 26d251aede6100e9bc47a7879937c10e3fb61646..21c912403efcd7b55b468af2c4369bc595087bb8 100644 (file)
 #define EM2828X_BOARD_HAUPPAUGE_935_V2            109
 #define EM2828X_BOARD_HAUPPAUGE_955_V2            110
 #define EM2828X_BOARD_HAUPPAUGE_975_V2            111
+#define EM28178_BOARD_PCTV_461E_V3                112
 
 /* Limits minimum and default number of buffers */
 #define EM28XX_MIN_BUF 4