|
@@ -373,7 +373,6 @@ static struct tda18271_config kworld_ub435q_v2_config = {
|
|
|
};
|
|
|
|
|
|
static struct tda18212_config kworld_ub435q_v3_config = {
|
|
|
- .i2c_address = 0x60,
|
|
|
.if_atsc_vsb = 3600,
|
|
|
.if_atsc_qam = 3600,
|
|
|
};
|
|
@@ -1437,6 +1436,15 @@ static int em28xx_dvb_init(struct em28xx *dev)
|
|
|
}
|
|
|
break;
|
|
|
case EM2874_BOARD_KWORLD_UB435Q_V3:
|
|
|
+ {
|
|
|
+ struct i2c_client *client;
|
|
|
+ struct i2c_adapter *adapter = &dev->i2c_adap[dev->def_i2c_bus];
|
|
|
+ struct i2c_board_info board_info = {
|
|
|
+ .type = "tda18212",
|
|
|
+ .addr = 0x60,
|
|
|
+ .platform_data = &kworld_ub435q_v3_config,
|
|
|
+ };
|
|
|
+
|
|
|
dvb->fe[0] = dvb_attach(lgdt3305_attach,
|
|
|
&em2874_lgdt3305_nogate_dev,
|
|
|
&dev->i2c_adap[dev->def_i2c_bus]);
|
|
@@ -1445,14 +1453,26 @@ static int em28xx_dvb_init(struct em28xx *dev)
|
|
|
goto out_free;
|
|
|
}
|
|
|
|
|
|
- /* Attach the demodulator. */
|
|
|
- if (!dvb_attach(tda18212_attach, dvb->fe[0],
|
|
|
- &dev->i2c_adap[dev->def_i2c_bus],
|
|
|
- &kworld_ub435q_v3_config)) {
|
|
|
- result = -EINVAL;
|
|
|
+ /* attach tuner */
|
|
|
+ kworld_ub435q_v3_config.fe = dvb->fe[0];
|
|
|
+ request_module("tda18212");
|
|
|
+ client = i2c_new_device(adapter, &board_info);
|
|
|
+ if (client == NULL || client->dev.driver == NULL) {
|
|
|
+ dvb_frontend_detach(dvb->fe[0]);
|
|
|
+ result = -ENODEV;
|
|
|
goto out_free;
|
|
|
}
|
|
|
+
|
|
|
+ if (!try_module_get(client->dev.driver->owner)) {
|
|
|
+ i2c_unregister_device(client);
|
|
|
+ dvb_frontend_detach(dvb->fe[0]);
|
|
|
+ result = -ENODEV;
|
|
|
+ goto out_free;
|
|
|
+ }
|
|
|
+
|
|
|
+ dvb->i2c_client_tuner = client;
|
|
|
break;
|
|
|
+ }
|
|
|
case EM2874_BOARD_PCTV_HD_MINI_80E:
|
|
|
dvb->fe[0] = dvb_attach(drx39xxj_attach, &dev->i2c_adap[dev->def_i2c_bus]);
|
|
|
if (dvb->fe[0] != NULL) {
|