diff options
-rw-r--r-- | drivers/media/dvb-frontends/rtl2832.c | 60 | ||||
-rw-r--r-- | drivers/media/dvb-frontends/rtl2832.h | 11 |
2 files changed, 68 insertions, 3 deletions
diff --git a/drivers/media/dvb-frontends/rtl2832.c b/drivers/media/dvb-frontends/rtl2832.c index eb737cf29a36..9026e1aee163 100644 --- a/drivers/media/dvb-frontends/rtl2832.c +++ b/drivers/media/dvb-frontends/rtl2832.c | |||
@@ -258,13 +258,11 @@ static int rtl2832_rd_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val, | |||
258 | return rtl2832_rd(priv, reg, val, len); | 258 | return rtl2832_rd(priv, reg, val, len); |
259 | } | 259 | } |
260 | 260 | ||
261 | #if 0 /* currently not used */ | ||
262 | /* write single register */ | 261 | /* write single register */ |
263 | static int rtl2832_wr_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 val) | 262 | static int rtl2832_wr_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 val) |
264 | { | 263 | { |
265 | return rtl2832_wr_regs(priv, reg, page, &val, 1); | 264 | return rtl2832_wr_regs(priv, reg, page, &val, 1); |
266 | } | 265 | } |
267 | #endif | ||
268 | 266 | ||
269 | /* read single register */ | 267 | /* read single register */ |
270 | static int rtl2832_rd_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val) | 268 | 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) | |||
599 | if (fe->ops.tuner_ops.set_params) | 597 | if (fe->ops.tuner_ops.set_params) |
600 | fe->ops.tuner_ops.set_params(fe); | 598 | fe->ops.tuner_ops.set_params(fe); |
601 | 599 | ||
600 | /* PIP mode related */ | ||
601 | ret = rtl2832_wr_regs(priv, 0x92, 1, "\x00\x0f\xff", 3); | ||
602 | if (ret) | ||
603 | goto err; | ||
604 | |||
602 | /* If the frontend has get_if_frequency(), use it */ | 605 | /* If the frontend has get_if_frequency(), use it */ |
603 | if (fe->ops.tuner_ops.get_if_frequency) { | 606 | if (fe->ops.tuner_ops.get_if_frequency) { |
604 | u32 if_freq; | 607 | u32 if_freq; |
@@ -661,7 +664,6 @@ static int rtl2832_set_frontend(struct dvb_frontend *fe) | |||
661 | if (ret) | 664 | if (ret) |
662 | goto err; | 665 | goto err; |
663 | 666 | ||
664 | |||
665 | /* soft reset */ | 667 | /* soft reset */ |
666 | ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1); | 668 | ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1); |
667 | if (ret) | 669 | if (ret) |
@@ -1020,6 +1022,58 @@ static int rtl2832_deselect(struct i2c_adapter *adap, void *mux_priv, | |||
1020 | return 0; | 1022 | return 0; |
1021 | } | 1023 | } |
1022 | 1024 | ||
1025 | int rtl2832_enable_external_ts_if(struct dvb_frontend *fe) | ||
1026 | { | ||
1027 | struct rtl2832_priv *priv = fe->demodulator_priv; | ||
1028 | int ret; | ||
1029 | |||
1030 | dev_dbg(&priv->i2c->dev, "%s: setting PIP mode\n", __func__); | ||
1031 | |||
1032 | ret = rtl2832_wr_regs(priv, 0x0c, 1, "\x5f\xff", 2); | ||
1033 | if (ret) | ||
1034 | goto err; | ||
1035 | |||
1036 | ret = rtl2832_wr_demod_reg(priv, DVBT_PIP_ON, 0x1); | ||
1037 | if (ret) | ||
1038 | goto err; | ||
1039 | |||
1040 | ret = rtl2832_wr_reg(priv, 0xbc, 0, 0x18); | ||
1041 | if (ret) | ||
1042 | goto err; | ||
1043 | |||
1044 | ret = rtl2832_wr_reg(priv, 0x22, 0, 0x01); | ||
1045 | if (ret) | ||
1046 | goto err; | ||
1047 | |||
1048 | ret = rtl2832_wr_reg(priv, 0x26, 0, 0x1f); | ||
1049 | if (ret) | ||
1050 | goto err; | ||
1051 | |||
1052 | ret = rtl2832_wr_reg(priv, 0x27, 0, 0xff); | ||
1053 | if (ret) | ||
1054 | goto err; | ||
1055 | |||
1056 | ret = rtl2832_wr_regs(priv, 0x92, 1, "\x7f\xf7\xff", 3); | ||
1057 | if (ret) | ||
1058 | goto err; | ||
1059 | |||
1060 | /* soft reset */ | ||
1061 | ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1); | ||
1062 | if (ret) | ||
1063 | goto err; | ||
1064 | |||
1065 | ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x0); | ||
1066 | if (ret) | ||
1067 | goto err; | ||
1068 | |||
1069 | return 0; | ||
1070 | err: | ||
1071 | dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret); | ||
1072 | return ret; | ||
1073 | |||
1074 | } | ||
1075 | EXPORT_SYMBOL(rtl2832_enable_external_ts_if); | ||
1076 | |||
1023 | struct i2c_adapter *rtl2832_get_i2c_adapter(struct dvb_frontend *fe) | 1077 | struct i2c_adapter *rtl2832_get_i2c_adapter(struct dvb_frontend *fe) |
1024 | { | 1078 | { |
1025 | struct rtl2832_priv *priv = fe->demodulator_priv; | 1079 | struct rtl2832_priv *priv = fe->demodulator_priv; |
diff --git a/drivers/media/dvb-frontends/rtl2832.h b/drivers/media/dvb-frontends/rtl2832.h index cb3b6b0775b8..5254c1dfc8de 100644 --- a/drivers/media/dvb-frontends/rtl2832.h +++ b/drivers/media/dvb-frontends/rtl2832.h | |||
@@ -64,6 +64,10 @@ extern struct i2c_adapter *rtl2832_get_private_i2c_adapter( | |||
64 | struct dvb_frontend *fe | 64 | struct dvb_frontend *fe |
65 | ); | 65 | ); |
66 | 66 | ||
67 | extern int rtl2832_enable_external_ts_if( | ||
68 | struct dvb_frontend *fe | ||
69 | ); | ||
70 | |||
67 | #else | 71 | #else |
68 | 72 | ||
69 | static inline struct dvb_frontend *rtl2832_attach( | 73 | static inline struct dvb_frontend *rtl2832_attach( |
@@ -89,6 +93,13 @@ static inline struct i2c_adapter *rtl2832_get_private_i2c_adapter( | |||
89 | return NULL; | 93 | return NULL; |
90 | } | 94 | } |
91 | 95 | ||
96 | static inline int rtl2832_enable_external_ts_if( | ||
97 | struct dvb_frontend *fe | ||
98 | ) | ||
99 | { | ||
100 | return -ENODEV; | ||
101 | } | ||
102 | |||
92 | #endif | 103 | #endif |
93 | 104 | ||
94 | 105 | ||