aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb-frontends
diff options
context:
space:
mode:
authorAntti Palosaari <crope@iki.fi>2013-11-26 10:53:46 -0500
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-03-05 13:38:28 -0500
commit8823f0288d345a26b27502c71f8ca3d05b4ac013 (patch)
tree12c7419d42bd1873db13cdea116635498c9d98a0 /drivers/media/dvb-frontends
parent3ca2418d707c9eeafa76f6096eb8e06d1cfa8bdb (diff)
[media] rtl2832: provide muxed I2C adapter
RTL2832 provides gated / repeater I2C adapter for tuner. Implement it as a muxed I2C adapter. Signed-off-by: Antti Palosaari <crope@iki.fi> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/media/dvb-frontends')
-rw-r--r--drivers/media/dvb-frontends/Kconfig2
-rw-r--r--drivers/media/dvb-frontends/rtl2832.c26
-rw-r--r--drivers/media/dvb-frontends/rtl2832.h13
-rw-r--r--drivers/media/dvb-frontends/rtl2832_priv.h2
4 files changed, 42 insertions, 1 deletions
diff --git a/drivers/media/dvb-frontends/Kconfig b/drivers/media/dvb-frontends/Kconfig
index 611c794856a9..025fc5496bfc 100644
--- a/drivers/media/dvb-frontends/Kconfig
+++ b/drivers/media/dvb-frontends/Kconfig
@@ -441,7 +441,7 @@ config DVB_RTL2830
441 441
442config DVB_RTL2832 442config DVB_RTL2832
443 tristate "Realtek RTL2832 DVB-T" 443 tristate "Realtek RTL2832 DVB-T"
444 depends on DVB_CORE && I2C 444 depends on DVB_CORE && I2C && I2C_MUX
445 default m if !MEDIA_SUBDRV_AUTOSELECT 445 default m if !MEDIA_SUBDRV_AUTOSELECT
446 help 446 help
447 Say Y when you want to support this frontend. 447 Say Y when you want to support this frontend.
diff --git a/drivers/media/dvb-frontends/rtl2832.c b/drivers/media/dvb-frontends/rtl2832.c
index 00e63b9f104d..dc46cf0841e0 100644
--- a/drivers/media/dvb-frontends/rtl2832.c
+++ b/drivers/media/dvb-frontends/rtl2832.c
@@ -891,9 +891,29 @@ static void rtl2832_release(struct dvb_frontend *fe)
891 struct rtl2832_priv *priv = fe->demodulator_priv; 891 struct rtl2832_priv *priv = fe->demodulator_priv;
892 892
893 dev_dbg(&priv->i2c->dev, "%s:\n", __func__); 893 dev_dbg(&priv->i2c->dev, "%s:\n", __func__);
894 i2c_del_mux_adapter(priv->i2c_adapter);
894 kfree(priv); 895 kfree(priv);
895} 896}
896 897
898static int rtl2832_select(struct i2c_adapter *adap, void *mux_priv, u32 chan)
899{
900 struct rtl2832_priv *priv = mux_priv;
901 return rtl2832_i2c_gate_ctrl(&priv->fe, 1);
902}
903
904static int rtl2832_deselect(struct i2c_adapter *adap, void *mux_priv, u32 chan)
905{
906 struct rtl2832_priv *priv = mux_priv;
907 return rtl2832_i2c_gate_ctrl(&priv->fe, 0);
908}
909
910struct i2c_adapter *rtl2832_get_i2c_adapter(struct dvb_frontend *fe)
911{
912 struct rtl2832_priv *priv = fe->demodulator_priv;
913 return priv->i2c_adapter;
914}
915EXPORT_SYMBOL(rtl2832_get_i2c_adapter);
916
897struct dvb_frontend *rtl2832_attach(const struct rtl2832_config *cfg, 917struct dvb_frontend *rtl2832_attach(const struct rtl2832_config *cfg,
898 struct i2c_adapter *i2c) 918 struct i2c_adapter *i2c)
899{ 919{
@@ -918,6 +938,12 @@ struct dvb_frontend *rtl2832_attach(const struct rtl2832_config *cfg,
918 if (ret) 938 if (ret)
919 goto err; 939 goto err;
920 940
941 /* create muxed i2c adapter */
942 priv->i2c_adapter = i2c_add_mux_adapter(i2c, &i2c->dev, priv, 0, 0, 0,
943 rtl2832_select, rtl2832_deselect);
944 if (priv->i2c_adapter == NULL)
945 goto err;
946
921 /* create dvb_frontend */ 947 /* create dvb_frontend */
922 memcpy(&priv->fe.ops, &rtl2832_ops, sizeof(struct dvb_frontend_ops)); 948 memcpy(&priv->fe.ops, &rtl2832_ops, sizeof(struct dvb_frontend_ops));
923 priv->fe.demodulator_priv = priv; 949 priv->fe.demodulator_priv = priv;
diff --git a/drivers/media/dvb-frontends/rtl2832.h b/drivers/media/dvb-frontends/rtl2832.h
index fa4e5f651aa7..a9202d72a8aa 100644
--- a/drivers/media/dvb-frontends/rtl2832.h
+++ b/drivers/media/dvb-frontends/rtl2832.h
@@ -55,7 +55,13 @@ struct dvb_frontend *rtl2832_attach(
55 const struct rtl2832_config *cfg, 55 const struct rtl2832_config *cfg,
56 struct i2c_adapter *i2c 56 struct i2c_adapter *i2c
57); 57);
58
59extern struct i2c_adapter *rtl2832_get_i2c_adapter(
60 struct dvb_frontend *fe
61);
62
58#else 63#else
64
59static inline struct dvb_frontend *rtl2832_attach( 65static inline struct dvb_frontend *rtl2832_attach(
60 const struct rtl2832_config *config, 66 const struct rtl2832_config *config,
61 struct i2c_adapter *i2c 67 struct i2c_adapter *i2c
@@ -64,6 +70,13 @@ static inline struct dvb_frontend *rtl2832_attach(
64 pr_warn("%s: driver disabled by Kconfig\n", __func__); 70 pr_warn("%s: driver disabled by Kconfig\n", __func__);
65 return NULL; 71 return NULL;
66} 72}
73
74static inline struct i2c_adapter *rtl2832_get_i2c_adapter(
75 struct dvb_frontend *fe
76)
77{
78 return NULL;
79}
67#endif 80#endif
68 81
69 82
diff --git a/drivers/media/dvb-frontends/rtl2832_priv.h b/drivers/media/dvb-frontends/rtl2832_priv.h
index 4c845af81ee9..ec26c9286756 100644
--- a/drivers/media/dvb-frontends/rtl2832_priv.h
+++ b/drivers/media/dvb-frontends/rtl2832_priv.h
@@ -23,9 +23,11 @@
23 23
24#include "dvb_frontend.h" 24#include "dvb_frontend.h"
25#include "rtl2832.h" 25#include "rtl2832.h"
26#include <linux/i2c-mux.h>
26 27
27struct rtl2832_priv { 28struct rtl2832_priv {
28 struct i2c_adapter *i2c; 29 struct i2c_adapter *i2c;
30 struct i2c_adapter *i2c_adapter;
29 struct dvb_frontend fe; 31 struct dvb_frontend fe;
30 struct rtl2832_config cfg; 32 struct rtl2832_config cfg;
31 33