{
                struct i2c_client *client;
                struct i2c_adapter *adapter;
+               struct i2c_adapter *adapter2;
                struct i2c_board_info info = {};
                struct si2157_config si2157_config = {};
                struct lgdt3306a_config lgdt3306a_config = {};
+               struct si2168_config si2168_config = {};
 
-               /* attach demodulator chip */
+               /* attach first demodulator chip */
                lgdt3306a_config = hauppauge_955q_lgdt3306a_config;
                lgdt3306a_config.fe = &dev->dvb->frontend[0];
                lgdt3306a_config.i2c_adapter = &adapter;
+               lgdt3306a_config.deny_i2c_rptr = 0;
 
                strlcpy(info.type, "lgdt3306a", sizeof(info.type));
                info.addr = dev->board.demod_addr;
                }
 
                dvb->i2c_client_demod[0] = client;
-               dev->dvb->frontend[0]->ops.i2c_gate_ctrl = NULL;
+
+               /* attach second demodulator chip */
+               si2168_config.ts_mode = SI2168_TS_SERIAL;
+               si2168_config.fe = &dev->dvb->frontend[1];
+               si2168_config.i2c_adapter = &adapter2;
+               si2168_config.ts_clock_inv = true;
+
+               memset(&info, 0, sizeof(struct i2c_board_info));
+               strlcpy(info.type, "si2168", sizeof(info.type));
+               info.addr = dev->board.demod_addr2;
+               info.platform_data = &si2168_config;
+
+               request_module(info.type);
+               client = i2c_new_device(adapter, &info);
+               if (client == NULL || client->dev.driver == NULL) {
+                       dev_err(dev->dev,
+                               "Failed to attach %s frontend.\n", info.type);
+                       module_put(dvb->i2c_client_demod[0]->dev.driver->owner);
+                       i2c_unregister_device(dvb->i2c_client_demod[0]);
+                       result = -ENODEV;
+                       goto out_free;
+               }
+
+               if (!try_module_get(client->dev.driver->owner)) {
+                       i2c_unregister_device(client);
+                       module_put(dvb->i2c_client_demod[0]->dev.driver->owner);
+                       i2c_unregister_device(dvb->i2c_client_demod[0]);
+                       result = -ENODEV;
+                       goto out_free;
+               }
+
+               dvb->i2c_client_demod[1] = client;
+               dvb->frontend[1]->id = 1;
 
                /* define general-purpose callback pointer */
                dvb->frontend[0]->callback = cx231xx_tuner_callback;
+               dvb->frontend[1]->callback = cx231xx_tuner_callback;
 
                /* attach tuner */
                si2157_config.fe = dev->dvb->frontend[0];
 
                client = i2c_new_device(adapter, &info);
                if (client == NULL || client->dev.driver == NULL) {
+                       module_put(dvb->i2c_client_demod[1]->dev.driver->owner);
+                       i2c_unregister_device(dvb->i2c_client_demod[1]);
                        module_put(dvb->i2c_client_demod[0]->dev.driver->owner);
                        i2c_unregister_device(dvb->i2c_client_demod[0]);
                        result = -ENODEV;
                        dev_err(dev->dev,
                                "Failed to obtain %s tuner.\n", info.type);
                        i2c_unregister_device(client);
+                       module_put(dvb->i2c_client_demod[1]->dev.driver->owner);
+                       i2c_unregister_device(dvb->i2c_client_demod[1]);
                        module_put(dvb->i2c_client_demod[0]->dev.driver->owner);
                        i2c_unregister_device(dvb->i2c_client_demod[0]);
                        result = -ENODEV;
                }
 
                dev->cx231xx_reset_analog_tuner = NULL;
-               dev->dvb->i2c_client_tuner = client;
+               dvb->i2c_client_tuner = client;
+
+               dvb->frontend[1]->tuner_priv = dvb->frontend[0]->tuner_priv;
+
+               memcpy(&dvb->frontend[1]->ops.tuner_ops,
+                       &dvb->frontend[0]->ops.tuner_ops,
+                       sizeof(struct dvb_tuner_ops));
                break;
        }
        default: