|
@@ -258,13 +258,11 @@ static int rtl2832_rd_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
|
|
|
return rtl2832_rd(priv, reg, val, len);
|
|
|
}
|
|
|
|
|
|
-#if 0 /* currently not used */
|
|
|
/* write single register */
|
|
|
static int rtl2832_wr_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 val)
|
|
|
{
|
|
|
return rtl2832_wr_regs(priv, reg, page, &val, 1);
|
|
|
}
|
|
|
-#endif
|
|
|
|
|
|
/* read single register */
|
|
|
static int rtl2832_rd_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val)
|
|
@@ -599,6 +597,11 @@ static int rtl2832_set_frontend(struct dvb_frontend *fe)
|
|
|
if (fe->ops.tuner_ops.set_params)
|
|
|
fe->ops.tuner_ops.set_params(fe);
|
|
|
|
|
|
+ /* PIP mode related */
|
|
|
+ ret = rtl2832_wr_regs(priv, 0x92, 1, "\x00\x0f\xff", 3);
|
|
|
+ if (ret)
|
|
|
+ goto err;
|
|
|
+
|
|
|
/* If the frontend has get_if_frequency(), use it */
|
|
|
if (fe->ops.tuner_ops.get_if_frequency) {
|
|
|
u32 if_freq;
|
|
@@ -661,7 +664,6 @@ static int rtl2832_set_frontend(struct dvb_frontend *fe)
|
|
|
if (ret)
|
|
|
goto err;
|
|
|
|
|
|
-
|
|
|
/* soft reset */
|
|
|
ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1);
|
|
|
if (ret)
|
|
@@ -1020,6 +1022,58 @@ static int rtl2832_deselect(struct i2c_adapter *adap, void *mux_priv,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+int rtl2832_enable_external_ts_if(struct dvb_frontend *fe)
|
|
|
+{
|
|
|
+ struct rtl2832_priv *priv = fe->demodulator_priv;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ dev_dbg(&priv->i2c->dev, "%s: setting PIP mode\n", __func__);
|
|
|
+
|
|
|
+ ret = rtl2832_wr_regs(priv, 0x0c, 1, "\x5f\xff", 2);
|
|
|
+ if (ret)
|
|
|
+ goto err;
|
|
|
+
|
|
|
+ ret = rtl2832_wr_demod_reg(priv, DVBT_PIP_ON, 0x1);
|
|
|
+ if (ret)
|
|
|
+ goto err;
|
|
|
+
|
|
|
+ ret = rtl2832_wr_reg(priv, 0xbc, 0, 0x18);
|
|
|
+ if (ret)
|
|
|
+ goto err;
|
|
|
+
|
|
|
+ ret = rtl2832_wr_reg(priv, 0x22, 0, 0x01);
|
|
|
+ if (ret)
|
|
|
+ goto err;
|
|
|
+
|
|
|
+ ret = rtl2832_wr_reg(priv, 0x26, 0, 0x1f);
|
|
|
+ if (ret)
|
|
|
+ goto err;
|
|
|
+
|
|
|
+ ret = rtl2832_wr_reg(priv, 0x27, 0, 0xff);
|
|
|
+ if (ret)
|
|
|
+ goto err;
|
|
|
+
|
|
|
+ ret = rtl2832_wr_regs(priv, 0x92, 1, "\x7f\xf7\xff", 3);
|
|
|
+ if (ret)
|
|
|
+ goto err;
|
|
|
+
|
|
|
+ /* soft reset */
|
|
|
+ ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1);
|
|
|
+ if (ret)
|
|
|
+ goto err;
|
|
|
+
|
|
|
+ ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x0);
|
|
|
+ if (ret)
|
|
|
+ goto err;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+err:
|
|
|
+ dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
|
|
|
+ return ret;
|
|
|
+
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(rtl2832_enable_external_ts_if);
|
|
|
+
|
|
|
struct i2c_adapter *rtl2832_get_i2c_adapter(struct dvb_frontend *fe)
|
|
|
{
|
|
|
struct rtl2832_priv *priv = fe->demodulator_priv;
|