提交 e435f95c 编写于 作者: M Michael Krufky 提交者: Mauro Carvalho Chehab

V4L/DVB (6801): tda18271: pass i2c gate configuration into tda18271_attach()

If we pass TDA18271_GATE_DIGITAL into tda18271_attach(), it will always try to
use the digital demodulator's i2c gate.

If we pass TDA18271_GATE_ANALOG into tda18271_attach(), it will always try to
use the analog demodulator's i2c gate.

If we pass TDA18271_GATE_AUTO into tda18271_attach(), it will try to use the
analog demodulator's i2c gate when tuning in analog mode, and it will try to
use the digital demodulator's i2c gate when tuning in digital mode.
Signed-off-by: NMichael Krufky <mkrufky@linuxtv.org>
Signed-off-by: NMauro Carvalho Chehab <mchehab@infradead.org>
上级 7206abbc
...@@ -40,7 +40,9 @@ struct tda18271_priv { ...@@ -40,7 +40,9 @@ struct tda18271_priv {
u8 i2c_addr; u8 i2c_addr;
struct i2c_adapter *i2c_adap; struct i2c_adapter *i2c_adap;
unsigned char tda18271_regs[TDA18271_NUM_REGS]; unsigned char tda18271_regs[TDA18271_NUM_REGS];
enum tda18271_mode mode; enum tda18271_mode mode;
enum tda18271_i2c_gate gate;
u32 frequency; u32 frequency;
u32 bandwidth; u32 bandwidth;
...@@ -50,17 +52,39 @@ static int tda18271_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) ...@@ -50,17 +52,39 @@ static int tda18271_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
{ {
struct tda18271_priv *priv = fe->tuner_priv; struct tda18271_priv *priv = fe->tuner_priv;
struct analog_tuner_ops *ops = fe->ops.analog_demod_ops; struct analog_tuner_ops *ops = fe->ops.analog_demod_ops;
enum tda18271_i2c_gate gate;
int ret = 0; int ret = 0;
switch (priv->gate) {
case TDA18271_GATE_DIGITAL:
case TDA18271_GATE_ANALOG:
gate = priv->gate;
break;
case TDA18271_GATE_AUTO:
default:
switch (priv->mode) { switch (priv->mode) {
case TDA18271_DIGITAL:
gate = TDA18271_GATE_DIGITAL;
break;
case TDA18271_ANALOG: case TDA18271_ANALOG:
default:
gate = TDA18271_GATE_ANALOG;
break;
}
}
switch (gate) {
case TDA18271_GATE_ANALOG:
if (ops && ops->i2c_gate_ctrl) if (ops && ops->i2c_gate_ctrl)
ret = ops->i2c_gate_ctrl(fe, enable); ret = ops->i2c_gate_ctrl(fe, enable);
break; break;
case TDA18271_DIGITAL: case TDA18271_GATE_DIGITAL:
if (fe->ops.i2c_gate_ctrl) if (fe->ops.i2c_gate_ctrl)
ret = fe->ops.i2c_gate_ctrl(fe, enable); ret = fe->ops.i2c_gate_ctrl(fe, enable);
break; break;
default:
ret = -EINVAL;
break;
} }
return ret; return ret;
...@@ -713,7 +737,8 @@ static struct dvb_tuner_ops tda18271_tuner_ops = { ...@@ -713,7 +737,8 @@ static struct dvb_tuner_ops tda18271_tuner_ops = {
}; };
struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr, struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
struct i2c_adapter *i2c) struct i2c_adapter *i2c,
enum tda18271_i2c_gate gate)
{ {
struct tda18271_priv *priv = NULL; struct tda18271_priv *priv = NULL;
...@@ -724,6 +749,7 @@ struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr, ...@@ -724,6 +749,7 @@ struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
priv->i2c_addr = addr; priv->i2c_addr = addr;
priv->i2c_adap = i2c; priv->i2c_adap = i2c;
priv->gate = gate;
memcpy(&fe->ops.tuner_ops, &tda18271_tuner_ops, memcpy(&fe->ops.tuner_ops, &tda18271_tuner_ops,
sizeof(struct dvb_tuner_ops)); sizeof(struct dvb_tuner_ops));
......
...@@ -24,13 +24,21 @@ ...@@ -24,13 +24,21 @@
#include <linux/i2c.h> #include <linux/i2c.h>
#include "dvb_frontend.h" #include "dvb_frontend.h"
enum tda18271_i2c_gate {
TDA18271_GATE_AUTO = 0,
TDA18271_GATE_ANALOG,
TDA18271_GATE_DIGITAL,
};
#if defined(CONFIG_DVB_TDA18271) || (defined(CONFIG_DVB_TDA18271_MODULE) && defined(MODULE)) #if defined(CONFIG_DVB_TDA18271) || (defined(CONFIG_DVB_TDA18271_MODULE) && defined(MODULE))
extern struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr, extern struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
struct i2c_adapter *i2c); struct i2c_adapter *i2c,
enum tda18271_i2c_gate gate);
#else #else
static inline struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, static inline struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe,
u8 addr, u8 addr,
struct i2c_adapter *i2c) struct i2c_adapter *i2c,
enum tda18271_i2c_gate gate);
{ {
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __FUNCTION__); printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __FUNCTION__);
return NULL; return NULL;
......
...@@ -574,7 +574,8 @@ static int tda829x_find_tuner(struct dvb_frontend *fe) ...@@ -574,7 +574,8 @@ static int tda829x_find_tuner(struct dvb_frontend *fe)
if (data == 0x83) { if (data == 0x83) {
priv->ver |= TDA18271; priv->ver |= TDA18271;
tda18271_attach(fe, priv->tda827x_addr, tda18271_attach(fe, priv->tda827x_addr,
priv->i2c_props.adap); priv->i2c_props.adap,
TDA18271_GATE_ANALOG);
} else { } else {
if ((data & 0x3c) == 0) if ((data & 0x3c) == 0)
priv->ver |= TDA8275; priv->ver |= TDA8275;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册