diff options
author | Antti Palosaari <crope@iki.fi> | 2013-11-26 10:53:46 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2014-03-05 13:38:28 -0500 |
commit | 8823f0288d345a26b27502c71f8ca3d05b4ac013 (patch) | |
tree | 12c7419d42bd1873db13cdea116635498c9d98a0 /drivers/media/dvb-frontends | |
parent | 3ca2418d707c9eeafa76f6096eb8e06d1cfa8bdb (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/Kconfig | 2 | ||||
-rw-r--r-- | drivers/media/dvb-frontends/rtl2832.c | 26 | ||||
-rw-r--r-- | drivers/media/dvb-frontends/rtl2832.h | 13 | ||||
-rw-r--r-- | drivers/media/dvb-frontends/rtl2832_priv.h | 2 |
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 | ||
442 | config DVB_RTL2832 | 442 | config 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 | ||
898 | static 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 | |||
904 | static 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 | |||
910 | struct 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 | } | ||
915 | EXPORT_SYMBOL(rtl2832_get_i2c_adapter); | ||
916 | |||
897 | struct dvb_frontend *rtl2832_attach(const struct rtl2832_config *cfg, | 917 | struct 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 | |||
59 | extern struct i2c_adapter *rtl2832_get_i2c_adapter( | ||
60 | struct dvb_frontend *fe | ||
61 | ); | ||
62 | |||
58 | #else | 63 | #else |
64 | |||
59 | static inline struct dvb_frontend *rtl2832_attach( | 65 | static 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 | |||
74 | static 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 | ||
27 | struct rtl2832_priv { | 28 | struct 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 | ||