On Tue Mar 24 13:24:25 2026 -0500, Bradford Love wrote:
> Fix em28xx driver to accommodate a device with two i2c client demods.
> 
> The em28xx driver already had a multi frontend aware device struct,
> with two fe, just not two i2c client demods. Since Hauppauge HVR975
> has transitioned from cx231xx to em2828X, this is required for full
> functionality of the devices.
> 
> Signed-off-by: Bradford Love <[email protected]>
> Signed-off-by: Hans Verkuil <[email protected]>

Patch committed.

Thanks,
Hans Verkuil

 drivers/media/usb/em28xx/em28xx-dvb.c | 81 ++++++++++++++++++-----------------
 1 file changed, 42 insertions(+), 39 deletions(-)

---

diff --git a/drivers/media/usb/em28xx/em28xx-dvb.c 
b/drivers/media/usb/em28xx/em28xx-dvb.c
index 95c6a38c9cc5..17808a4c0fe5 100644
--- a/drivers/media/usb/em28xx/em28xx-dvb.c
+++ b/drivers/media/usb/em28xx/em28xx-dvb.c
@@ -97,7 +97,7 @@ struct em28xx_dvb {
        struct semaphore      pll_mutex;
        bool                    dont_attach_fe1;
        int                     lna_gpio;
-       struct i2c_client       *i2c_client_demod;
+       struct i2c_client       *i2c_client_demod[2];
        struct i2c_client       *i2c_client_tuner;
        struct i2c_client       *i2c_client_sec;
 };
@@ -854,14 +854,14 @@ static void px_bcud_init(struct em28xx *dev)
        };
        em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x46);
        /* sleeping ISDB-T */
-       dev->dvb->i2c_client_demod->addr = 0x14;
+       dev->dvb->i2c_client_demod[0]->addr = 0x14;
        for (i = 0; i < ARRAY_SIZE(regs1); i++)
-               i2c_master_send(dev->dvb->i2c_client_demod,
+               i2c_master_send(dev->dvb->i2c_client_demod[0],
                                regs1[i].r, regs1[i].len);
        /* sleeping ISDB-S */
-       dev->dvb->i2c_client_demod->addr = 0x15;
+       dev->dvb->i2c_client_demod[0]->addr = 0x15;
        for (i = 0; i < ARRAY_SIZE(regs2); i++)
-               i2c_master_send(dev->dvb->i2c_client_demod, regs2[i].r,
+               i2c_master_send(dev->dvb->i2c_client_demod[0], regs2[i].r,
                                regs2[i].len);
        for (i = 0; i < ARRAY_SIZE(gpio); i++) {
                em28xx_write_reg_bits(dev, gpio[i].reg, gpio[i].val,
@@ -1155,13 +1155,13 @@ static int em28174_dvb_init_pctv_460e(struct em28xx 
*dev)
        tda10071_pdata.pll_multiplier = 20;
        tda10071_pdata.tuner_i2c_addr = 0x14;
 
-       dvb->i2c_client_demod = dvb_module_probe("tda10071", "tda10071_cx24118",
+       dvb->i2c_client_demod[0] = dvb_module_probe("tda10071", 
"tda10071_cx24118",
                                                 
&dev->i2c_adap[dev->def_i2c_bus],
                                                 0x55, &tda10071_pdata);
-       if (!dvb->i2c_client_demod)
+       if (!dvb->i2c_client_demod[0])
                return -ENODEV;
 
-       dvb->fe[0] = tda10071_pdata.get_dvb_frontend(dvb->i2c_client_demod);
+       dvb->fe[0] = tda10071_pdata.get_dvb_frontend(dvb->i2c_client_demod[0]);
 
        /* attach SEC */
        a8293_pdata.dvb_frontend = dvb->fe[0];
@@ -1170,7 +1170,7 @@ static int em28174_dvb_init_pctv_460e(struct em28xx *dev)
                                               &dev->i2c_adap[dev->def_i2c_bus],
                                               0x08, &a8293_pdata);
        if (!dvb->i2c_client_sec) {
-               dvb_module_release(dvb->i2c_client_demod);
+               dvb_module_release(dvb->i2c_client_demod[0]);
                return -ENODEV;
        }
 
@@ -1193,14 +1193,14 @@ static int em28178_dvb_init_pctv_461e(struct em28xx 
*dev)
        m88ds3103_pdata.ts_clk_pol = 1;
        m88ds3103_pdata.agc = 0x99;
 
-       dvb->i2c_client_demod = dvb_module_probe("m88ds3103", NULL,
+       dvb->i2c_client_demod[0] = dvb_module_probe("m88ds3103", NULL,
                                                 
&dev->i2c_adap[dev->def_i2c_bus],
                                                 0x68, &m88ds3103_pdata);
-       if (!dvb->i2c_client_demod)
+       if (!dvb->i2c_client_demod[0])
                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);
+       dvb->fe[0] = m88ds3103_pdata.get_dvb_frontend(dvb->i2c_client_demod[0]);
+       i2c_adapter = m88ds3103_pdata.get_i2c_adapter(dvb->i2c_client_demod[0]);
 
        /* attach tuner */
        ts2020_config.fe = dvb->fe[0];
@@ -1209,7 +1209,7 @@ static int em28178_dvb_init_pctv_461e(struct em28xx *dev)
                                                 i2c_adapter,
                                                 0x60, &ts2020_config);
        if (!dvb->i2c_client_tuner) {
-               dvb_module_release(dvb->i2c_client_demod);
+               dvb_module_release(dvb->i2c_client_demod[0]);
                return -ENODEV;
        }
 
@@ -1230,7 +1230,7 @@ static int em28178_dvb_init_pctv_461e(struct em28xx *dev)
                                               0x08, &a8293_pdata);
        if (!dvb->i2c_client_sec) {
                dvb_module_release(dvb->i2c_client_tuner);
-               dvb_module_release(dvb->i2c_client_demod);
+               dvb_module_release(dvb->i2c_client_demod[0]);
                return -ENODEV;
        }
 
@@ -1254,15 +1254,15 @@ 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 = dvb_module_probe("m88ds3103", "m88ds3103b",
+       dvb->i2c_client_demod[0] = dvb_module_probe("m88ds3103", "m88ds3103b",
                                                 
&dev->i2c_adap[dev->def_i2c_bus],
                                                 0x6a, &m88ds3103_pdata);
 
-       if (!dvb->i2c_client_demod)
+       if (!dvb->i2c_client_demod[0])
                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);
+       dvb->fe[0] = m88ds3103_pdata.get_dvb_frontend(dvb->i2c_client_demod[0]);
+       i2c_adapter = m88ds3103_pdata.get_i2c_adapter(dvb->i2c_client_demod[0]);
 
        /* attach tuner */
        ts2020_config.fe = dvb->fe[0];
@@ -1270,7 +1270,7 @@ static int em28178_dvb_init_pctv_461e_v2(struct em28xx 
*dev)
                                                 i2c_adapter,
                                                 0x60, &ts2020_config);
        if (!dvb->i2c_client_tuner) {
-               dvb_module_release(dvb->i2c_client_demod);
+               dvb_module_release(dvb->i2c_client_demod[0]);
                return -ENODEV;
        }
 
@@ -1285,7 +1285,7 @@ static int em28178_dvb_init_pctv_461e_v2(struct em28xx 
*dev)
                                               0x08, &a8293_pdata);
        if (!dvb->i2c_client_sec) {
                dvb_module_release(dvb->i2c_client_tuner);
-               dvb_module_release(dvb->i2c_client_demod);
+               dvb_module_release(dvb->i2c_client_demod[0]);
                return -ENODEV;
        }
 
@@ -1305,10 +1305,10 @@ static int em28178_dvb_init_pctv_292e(struct em28xx 
*dev)
        si2168_config.ts_mode = SI2168_TS_PARALLEL;
        si2168_config.spectral_inversion = true;
 
-       dvb->i2c_client_demod = dvb_module_probe("si2168", NULL,
+       dvb->i2c_client_demod[0] = dvb_module_probe("si2168", NULL,
                                                 
&dev->i2c_adap[dev->def_i2c_bus],
                                                 0x64, &si2168_config);
-       if (!dvb->i2c_client_demod)
+       if (!dvb->i2c_client_demod[0])
                return -ENODEV;
 
        /* attach tuner */
@@ -1321,7 +1321,7 @@ static int em28178_dvb_init_pctv_292e(struct em28xx *dev)
                                                 adapter,
                                                 0x60, &si2157_config);
        if (!dvb->i2c_client_tuner) {
-               dvb_module_release(dvb->i2c_client_demod);
+               dvb_module_release(dvb->i2c_client_demod[0]);
                return -ENODEV;
        }
        dvb->fe[0]->ops.set_lna = em28xx_pctv_292e_set_lna;
@@ -1341,10 +1341,10 @@ static int em28178_dvb_init_terratec_t2_stick_hd(struct 
em28xx *dev)
        si2168_config.fe = &dvb->fe[0];
        si2168_config.ts_mode = SI2168_TS_PARALLEL;
 
-       dvb->i2c_client_demod = dvb_module_probe("si2168", NULL,
+       dvb->i2c_client_demod[0] = dvb_module_probe("si2168", NULL,
                                                 
&dev->i2c_adap[dev->def_i2c_bus],
                                                 0x64, &si2168_config);
-       if (!dvb->i2c_client_demod)
+       if (!dvb->i2c_client_demod[0])
                return -ENODEV;
 
        /* attach tuner */
@@ -1358,7 +1358,7 @@ static int em28178_dvb_init_terratec_t2_stick_hd(struct 
em28xx *dev)
                                                 adapter,
                                                 0x60, &si2157_config);
        if (!dvb->i2c_client_tuner) {
-               dvb_module_release(dvb->i2c_client_demod);
+               dvb_module_release(dvb->i2c_client_demod[0]);
                return -ENODEV;
        }
 
@@ -1372,10 +1372,10 @@ static int em28178_dvb_init_plex_px_bcud(struct em28xx 
*dev)
        struct qm1d1c0042_config qm1d1c0042_config = {};
 
        /* attach demod */
-       dvb->i2c_client_demod = dvb_module_probe("tc90522", "tc90522sat",
+       dvb->i2c_client_demod[0] = dvb_module_probe("tc90522", "tc90522sat",
                                                 
&dev->i2c_adap[dev->def_i2c_bus],
                                                 0x15, &tc90522_config);
-       if (!dvb->i2c_client_demod)
+       if (!dvb->i2c_client_demod[0])
                return -ENODEV;
 
        /* attach tuner */
@@ -1386,7 +1386,7 @@ static int em28178_dvb_init_plex_px_bcud(struct em28xx 
*dev)
                                                 tc90522_config.tuner_i2c,
                                                 0x61, &qm1d1c0042_config);
        if (!dvb->i2c_client_tuner) {
-               dvb_module_release(dvb->i2c_client_demod);
+               dvb_module_release(dvb->i2c_client_demod[0]);
                return -ENODEV;
        }
 
@@ -1411,10 +1411,10 @@ static int 
em28174_dvb_init_hauppauge_wintv_dualhd_dvb(struct em28xx *dev)
        si2168_config.spectral_inversion = true;
        addr = (dev->ts == PRIMARY_TS) ? 0x64 : 0x67;
 
-       dvb->i2c_client_demod = dvb_module_probe("si2168", NULL,
+       dvb->i2c_client_demod[0] = dvb_module_probe("si2168", NULL,
                                                 
&dev->i2c_adap[dev->def_i2c_bus],
                                                 addr, &si2168_config);
-       if (!dvb->i2c_client_demod)
+       if (!dvb->i2c_client_demod[0])
                return -ENODEV;
 
        /* attach tuner */
@@ -1430,7 +1430,7 @@ static int 
em28174_dvb_init_hauppauge_wintv_dualhd_dvb(struct em28xx *dev)
                                                 adapter,
                                                 addr, &si2157_config);
        if (!dvb->i2c_client_tuner) {
-               dvb_module_release(dvb->i2c_client_demod);
+               dvb_module_release(dvb->i2c_client_demod[0]);
                return -ENODEV;
        }
 
@@ -1451,10 +1451,10 @@ static int 
em28174_dvb_init_hauppauge_wintv_dualhd_01595(struct em28xx *dev)
        lgdt3306a_config.i2c_adapter = &adapter;
        addr = (dev->ts == PRIMARY_TS) ? 0x59 : 0x0e;
 
-       dvb->i2c_client_demod = dvb_module_probe("lgdt3306a", NULL,
+       dvb->i2c_client_demod[0] = dvb_module_probe("lgdt3306a", NULL,
                                                 
&dev->i2c_adap[dev->def_i2c_bus],
                                                 addr, &lgdt3306a_config);
-       if (!dvb->i2c_client_demod)
+       if (!dvb->i2c_client_demod[0])
                return -ENODEV;
 
        /* attach tuner */
@@ -1470,7 +1470,7 @@ static int 
em28174_dvb_init_hauppauge_wintv_dualhd_01595(struct em28xx *dev)
                                                 adapter,
                                                 addr, &si2157_config);
        if (!dvb->i2c_client_tuner) {
-               dvb_module_release(dvb->i2c_client_demod);
+               dvb_module_release(dvb->i2c_client_demod[0]);
                return -ENODEV;
        }
 
@@ -1488,10 +1488,10 @@ static int em2874_dvb_init_hauppauge_usb_quadhd(struct 
em28xx *dev)
        mxl692_config.fe = &dvb->fe[0];
        addr = (dev->ts == PRIMARY_TS) ? 0x60 : 0x63;
 
-       dvb->i2c_client_demod = dvb_module_probe("mxl692", NULL,
+       dvb->i2c_client_demod[0] = dvb_module_probe("mxl692", NULL,
                                                 
&dev->i2c_adap[dev->def_i2c_bus],
                                                 addr, &mxl692_config);
-       if (!dvb->i2c_client_demod)
+       if (!dvb->i2c_client_demod[0])
                return -ENODEV;
 
        return 0;
@@ -1522,6 +1522,8 @@ static int em28xx_dvb_init(struct em28xx *dev)
        dev->dvb = dvb;
        dvb->fe[0] = NULL;
        dvb->fe[1] = NULL;
+       dvb->i2c_client_demod[0] = NULL;
+       dvb->i2c_client_demod[1] = NULL;
 
        /* pre-allocate DVB usb transfer buffers */
        if (dev->dvb_xfer_bulk) {
@@ -2083,7 +2085,8 @@ static int em28xx_dvb_fini(struct em28xx *dev)
        /* release I2C module bindings */
        dvb_module_release(dvb->i2c_client_sec);
        dvb_module_release(dvb->i2c_client_tuner);
-       dvb_module_release(dvb->i2c_client_demod);
+       dvb_module_release(dvb->i2c_client_demod[1]);
+       dvb_module_release(dvb->i2c_client_demod[0]);
 
        kfree(dvb);
        dev->dvb = NULL;
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to