* [PATH v2] cxd2820r: fix possible out-of-array lookup
@ 2011-07-29 6:57 HoP
2011-07-29 12:54 ` Antti Palosaari
0 siblings, 1 reply; 7+ messages in thread
From: HoP @ 2011-07-29 6:57 UTC (permalink / raw)
To: linux-media, Antti
When I2C_WRITE is used the msg[] array contains one element only.
Don't access msg[1] in that case. Also moved rest of msg2[1]
setting to be used only if needed.
Signed-off-by: Honza Petrous <jpetrous@smartimp.cz>
---
diff -r ae517614bf00 drivers/media/dvb/frontends/cxd2820r_core.c
--- a/drivers/media/dvb/frontends/cxd2820r_core.c Thu Jul 28 15:44:49 2011 +0200
+++ b/drivers/media/dvb/frontends/cxd2820r_core.c Thu Jul 28 16:20:17 2011 +0200
@@ -747,12 +747,7 @@ static int cxd2820r_tuner_i2c_xfer(struc
.flags = 0,
.len = sizeof(obuf),
.buf = obuf,
- }, {
- .addr = priv->cfg.i2c_address,
- .flags = I2C_M_RD,
- .len = msg[1].len,
- .buf = msg[1].buf,
- }
+ },
};
obuf[0] = 0x09;
@@ -760,6 +755,11 @@ static int cxd2820r_tuner_i2c_xfer(struc
if (num == 2) { /* I2C read */
obuf[1] = (msg[0].addr << 1) | I2C_M_RD; /* I2C RD flag */
msg2[0].len = sizeof(obuf) - 1; /* maybe HW bug ? */
+
+ msg2[1].addr = priv->cfg.i2c_address,
+ msg2[1].flags = I2C_M_RD,
+ msg2[1].len = msg[1].len,
+ msg2[1].buf = msg[1].buf,
}
memcpy(&obuf[2], msg[0].buf, msg[0].len);
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATH v2] cxd2820r: fix possible out-of-array lookup 2011-07-29 6:57 [PATH v2] cxd2820r: fix possible out-of-array lookup HoP @ 2011-07-29 12:54 ` Antti Palosaari 2011-08-07 18:08 ` [PATCH] CXD2820R: Replace i2c message translation with repeater gate control Steve Kerrison 2011-08-21 22:59 ` [PATH v2] cxd2820r: fix possible out-of-array lookup Antti Palosaari 0 siblings, 2 replies; 7+ messages in thread From: Antti Palosaari @ 2011-07-29 12:54 UTC (permalink / raw) To: HoP; +Cc: linux-media On 07/29/2011 09:57 AM, HoP wrote: > When I2C_WRITE is used the msg[] array contains one element only. > Don't access msg[1] in that case. Also moved rest of msg2[1] > setting to be used only if needed. > > Signed-off-by: Honza Petrous <jpetrous@smartimp.cz> Acked-by: Antti Palosaari <crope@iki.fi> > > --- > > diff -r ae517614bf00 drivers/media/dvb/frontends/cxd2820r_core.c > --- a/drivers/media/dvb/frontends/cxd2820r_core.c Thu Jul 28 15:44:49 2011 +0200 > +++ b/drivers/media/dvb/frontends/cxd2820r_core.c Thu Jul 28 16:20:17 2011 +0200 > @@ -747,12 +747,7 @@ static int cxd2820r_tuner_i2c_xfer(struc > .flags = 0, > .len = sizeof(obuf), > .buf = obuf, > - }, { > - .addr = priv->cfg.i2c_address, > - .flags = I2C_M_RD, > - .len = msg[1].len, > - .buf = msg[1].buf, > - } > + }, > }; > > obuf[0] = 0x09; > @@ -760,6 +755,11 @@ static int cxd2820r_tuner_i2c_xfer(struc > if (num == 2) { /* I2C read */ > obuf[1] = (msg[0].addr << 1) | I2C_M_RD; /* I2C RD flag */ > msg2[0].len = sizeof(obuf) - 1; /* maybe HW bug ? */ > + > + msg2[1].addr = priv->cfg.i2c_address, > + msg2[1].flags = I2C_M_RD, > + msg2[1].len = msg[1].len, > + msg2[1].buf = msg[1].buf, > } > memcpy(&obuf[2], msg[0].buf, msg[0].len); -- http://palosaari.fi/ ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH] CXD2820R: Replace i2c message translation with repeater gate control 2011-07-29 12:54 ` Antti Palosaari @ 2011-08-07 18:08 ` Steve Kerrison 2011-08-08 23:16 ` Antti Palosaari 2011-08-21 22:59 ` [PATH v2] cxd2820r: fix possible out-of-array lookup Antti Palosaari 1 sibling, 1 reply; 7+ messages in thread From: Steve Kerrison @ 2011-08-07 18:08 UTC (permalink / raw) To: linux-media; +Cc: crope, robert_s, Steve Kerrison [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1: Type: text/plain, Size: 5999 bytes --] This patch implements an i2c_gate_ctrl op for the cxd2820r. Thanks to Robert Schlabbach for identifying the register address and field to set. The old i2c intercept code that prefixed messages with a passthrough byte has been removed and the PCTV nanoStick T2 290e entry in em28xx-dvb has been updated appropriately. Tested for DVB-T2 use; I would appreciate it if somebody with DVB-C capabilities could test it as well - from inspection I cannot see any problems. Signed-off-by: Steve Kerrison <steve@stevekerrison.com> --- drivers/media/dvb/frontends/cxd2820r_core.c | 73 +++------------------------ drivers/media/dvb/frontends/cxd2820r_priv.h | 1 - drivers/media/video/em28xx/em28xx-dvb.c | 7 +-- 3 files changed, 10 insertions(+), 71 deletions(-) diff --git a/drivers/media/dvb/frontends/cxd2820r_core.c b/drivers/media/dvb/frontends/cxd2820r_core.c index d416e85..15bfcf4 100644 --- a/drivers/media/dvb/frontends/cxd2820r_core.c +++ b/drivers/media/dvb/frontends/cxd2820r_core.c @@ -728,69 +728,20 @@ static void cxd2820r_release(struct dvb_frontend *fe) dbg("%s", __func__); if (fe->ops.info.type == FE_OFDM) { - i2c_del_adapter(&priv->tuner_i2c_adapter); kfree(priv); } return; } -static u32 cxd2820r_tuner_i2c_func(struct i2c_adapter *adapter) -{ - return I2C_FUNC_I2C; -} - -static int cxd2820r_tuner_i2c_xfer(struct i2c_adapter *i2c_adap, - struct i2c_msg msg[], int num) -{ - struct cxd2820r_priv *priv = i2c_get_adapdata(i2c_adap); - int ret; - u8 *obuf = kmalloc(msg[0].len + 2, GFP_KERNEL); - struct i2c_msg msg2[2] = { - { - .addr = priv->cfg.i2c_address, - .flags = 0, - .len = msg[0].len + 2, - .buf = obuf, - }, { - .addr = priv->cfg.i2c_address, - .flags = I2C_M_RD, - .len = msg[1].len, - .buf = msg[1].buf, - } - }; - - if (!obuf) - return -ENOMEM; - - obuf[0] = 0x09; - obuf[1] = (msg[0].addr << 1); - if (num == 2) { /* I2C read */ - obuf[1] = (msg[0].addr << 1) | I2C_M_RD; /* I2C RD flag */ - msg2[0].len = msg[0].len + 2 - 1; /* '-1' maybe HW bug ? */ - } - memcpy(&obuf[2], msg[0].buf, msg[0].len); - - ret = i2c_transfer(priv->i2c, msg2, num); - if (ret < 0) - warn("tuner i2c failed ret:%d", ret); - - kfree(obuf); - - return ret; -} - -static struct i2c_algorithm cxd2820r_tuner_i2c_algo = { - .master_xfer = cxd2820r_tuner_i2c_xfer, - .functionality = cxd2820r_tuner_i2c_func, -}; - -struct i2c_adapter *cxd2820r_get_tuner_i2c_adapter(struct dvb_frontend *fe) +static int cxd2820r_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) { struct cxd2820r_priv *priv = fe->demodulator_priv; - return &priv->tuner_i2c_adapter; + dbg("%s: %d", __func__, enable); + + /* Bit 0 of reg 0xdb in bank 0x00 controls I2C repeater */ + return cxd2820r_wr_reg_mask(priv, 0xdb, enable ? 1 : 0, 0x1); } -EXPORT_SYMBOL(cxd2820r_get_tuner_i2c_adapter); static struct dvb_frontend_ops cxd2820r_ops[2]; @@ -831,18 +782,6 @@ struct dvb_frontend *cxd2820r_attach(const struct cxd2820r_config *cfg, priv->fe[0].demodulator_priv = priv; priv->fe[1].demodulator_priv = priv; - /* create tuner i2c adapter */ - strlcpy(priv->tuner_i2c_adapter.name, - "CXD2820R tuner I2C adapter", - sizeof(priv->tuner_i2c_adapter.name)); - priv->tuner_i2c_adapter.algo = &cxd2820r_tuner_i2c_algo; - priv->tuner_i2c_adapter.algo_data = NULL; - i2c_set_adapdata(&priv->tuner_i2c_adapter, priv); - if (i2c_add_adapter(&priv->tuner_i2c_adapter) < 0) { - err("tuner I2C bus could not be initialized"); - goto error; - } - return &priv->fe[0]; } else { @@ -883,6 +822,7 @@ static struct dvb_frontend_ops cxd2820r_ops[2] = { .sleep = cxd2820r_sleep, .get_tune_settings = cxd2820r_get_tune_settings, + .i2c_gate_ctrl = cxd2820r_i2c_gate_ctrl, .get_frontend = cxd2820r_get_frontend, @@ -911,6 +851,7 @@ static struct dvb_frontend_ops cxd2820r_ops[2] = { .sleep = cxd2820r_sleep, .get_tune_settings = cxd2820r_get_tune_settings, + .i2c_gate_ctrl = cxd2820r_i2c_gate_ctrl, .set_frontend = cxd2820r_set_frontend, .get_frontend = cxd2820r_get_frontend, diff --git a/drivers/media/dvb/frontends/cxd2820r_priv.h b/drivers/media/dvb/frontends/cxd2820r_priv.h index 0c0ebc9..9553913 100644 --- a/drivers/media/dvb/frontends/cxd2820r_priv.h +++ b/drivers/media/dvb/frontends/cxd2820r_priv.h @@ -50,7 +50,6 @@ struct cxd2820r_priv { struct i2c_adapter *i2c; struct dvb_frontend fe[2]; struct cxd2820r_config cfg; - struct i2c_adapter tuner_i2c_adapter; struct mutex fe_lock; /* FE lock */ int active_fe:2; /* FE lock, -1=NONE, 0=DVB-T/T2, 1=DVB-C */ diff --git a/drivers/media/video/em28xx/em28xx-dvb.c b/drivers/media/video/em28xx/em28xx-dvb.c index e5916de..223a2fc 100644 --- a/drivers/media/video/em28xx/em28xx-dvb.c +++ b/drivers/media/video/em28xx/em28xx-dvb.c @@ -438,6 +438,7 @@ static struct cxd2820r_config em28xx_cxd2820r_config = { static struct tda18271_config em28xx_cxd2820r_tda18271_config = { .output_opt = TDA18271_OUTPUT_LT_OFF, + .gate = TDA18271_GATE_DIGITAL, }; /* ------------------------------------------------------------------ */ @@ -753,11 +754,9 @@ static int dvb_init(struct em28xx *dev) dvb->fe[0] = dvb_attach(cxd2820r_attach, &em28xx_cxd2820r_config, &dev->i2c_adap, NULL); if (dvb->fe[0]) { - struct i2c_adapter *i2c_tuner; - i2c_tuner = cxd2820r_get_tuner_i2c_adapter(dvb->fe[0]); /* FE 0 attach tuner */ if (!dvb_attach(tda18271_attach, dvb->fe[0], 0x60, - i2c_tuner, &em28xx_cxd2820r_tda18271_config)) { + &dev->i2c_adap, &em28xx_cxd2820r_tda18271_config)) { dvb_frontend_detach(dvb->fe[0]); result = -EINVAL; goto out_free; @@ -768,7 +767,7 @@ static int dvb_init(struct em28xx *dev) dvb->fe[1]->id = 1; /* FE 1 attach tuner */ if (!dvb_attach(tda18271_attach, dvb->fe[1], 0x60, - i2c_tuner, &em28xx_cxd2820r_tda18271_config)) { + &dev->i2c_adap, &em28xx_cxd2820r_tda18271_config)) { dvb_frontend_detach(dvb->fe[1]); /* leave FE 0 still active */ } -- 1.7.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] CXD2820R: Replace i2c message translation with repeater gate control 2011-08-07 18:08 ` [PATCH] CXD2820R: Replace i2c message translation with repeater gate control Steve Kerrison @ 2011-08-08 23:16 ` Antti Palosaari 2011-08-09 10:16 ` [PATCH v2] " Steve Kerrison 0 siblings, 1 reply; 7+ messages in thread From: Antti Palosaari @ 2011-08-08 23:16 UTC (permalink / raw) To: Steve Kerrison; +Cc: linux-media, robert_s Hello That patch is technically fine and I liked it much since get rid of complex repeater logic and going for normal I2C-gate. But fix these and send new patch: 1) there is a lot of style errors. you should use always checkpatch.pl before send patches. ./scripts/checkpatch.pl --file drivers/media/dvb/frontends/cxd2820r*.c 2) it still lefts definition of cxd2820r_get_tuner_i2c_adapter() to header regards Antti On 08/07/2011 09:08 PM, Steve Kerrison wrote: > This patch implements an i2c_gate_ctrl op for the cxd2820r. Thanks to Robert > Schlabbach for identifying the register address and field to set. > > The old i2c intercept code that prefixed messages with a passthrough byte has > been removed and the PCTV nanoStick T2 290e entry in em28xx-dvb has been > updated appropriately. > > Tested for DVB-T2 use; I would appreciate it if somebody with DVB-C capabilities > could test it as well - from inspection I cannot see any problems. > > Signed-off-by: Steve Kerrison <steve@stevekerrison.com> > --- > drivers/media/dvb/frontends/cxd2820r_core.c | 73 +++------------------------ > drivers/media/dvb/frontends/cxd2820r_priv.h | 1 - > drivers/media/video/em28xx/em28xx-dvb.c | 7 +-- > 3 files changed, 10 insertions(+), 71 deletions(-) > > diff --git a/drivers/media/dvb/frontends/cxd2820r_core.c b/drivers/media/dvb/frontends/cxd2820r_core.c > index d416e85..15bfcf4 100644 > --- a/drivers/media/dvb/frontends/cxd2820r_core.c > +++ b/drivers/media/dvb/frontends/cxd2820r_core.c > @@ -728,69 +728,20 @@ static void cxd2820r_release(struct dvb_frontend *fe) > dbg("%s", __func__); > > if (fe->ops.info.type == FE_OFDM) { > - i2c_del_adapter(&priv->tuner_i2c_adapter); > kfree(priv); > } > > return; > } > > -static u32 cxd2820r_tuner_i2c_func(struct i2c_adapter *adapter) > -{ > - return I2C_FUNC_I2C; > -} > - > -static int cxd2820r_tuner_i2c_xfer(struct i2c_adapter *i2c_adap, > - struct i2c_msg msg[], int num) > -{ > - struct cxd2820r_priv *priv = i2c_get_adapdata(i2c_adap); > - int ret; > - u8 *obuf = kmalloc(msg[0].len + 2, GFP_KERNEL); > - struct i2c_msg msg2[2] = { > - { > - .addr = priv->cfg.i2c_address, > - .flags = 0, > - .len = msg[0].len + 2, > - .buf = obuf, > - }, { > - .addr = priv->cfg.i2c_address, > - .flags = I2C_M_RD, > - .len = msg[1].len, > - .buf = msg[1].buf, > - } > - }; > - > - if (!obuf) > - return -ENOMEM; > - > - obuf[0] = 0x09; > - obuf[1] = (msg[0].addr << 1); > - if (num == 2) { /* I2C read */ > - obuf[1] = (msg[0].addr << 1) | I2C_M_RD; /* I2C RD flag */ > - msg2[0].len = msg[0].len + 2 - 1; /* '-1' maybe HW bug ? */ > - } > - memcpy(&obuf[2], msg[0].buf, msg[0].len); > - > - ret = i2c_transfer(priv->i2c, msg2, num); > - if (ret < 0) > - warn("tuner i2c failed ret:%d", ret); > - > - kfree(obuf); > - > - return ret; > -} > - > -static struct i2c_algorithm cxd2820r_tuner_i2c_algo = { > - .master_xfer = cxd2820r_tuner_i2c_xfer, > - .functionality = cxd2820r_tuner_i2c_func, > -}; > - > -struct i2c_adapter *cxd2820r_get_tuner_i2c_adapter(struct dvb_frontend *fe) > +static int cxd2820r_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) > { > struct cxd2820r_priv *priv = fe->demodulator_priv; > - return &priv->tuner_i2c_adapter; > + dbg("%s: %d", __func__, enable); > + > + /* Bit 0 of reg 0xdb in bank 0x00 controls I2C repeater */ > + return cxd2820r_wr_reg_mask(priv, 0xdb, enable ? 1 : 0, 0x1); > } > -EXPORT_SYMBOL(cxd2820r_get_tuner_i2c_adapter); > > static struct dvb_frontend_ops cxd2820r_ops[2]; > > @@ -831,18 +782,6 @@ struct dvb_frontend *cxd2820r_attach(const struct cxd2820r_config *cfg, > priv->fe[0].demodulator_priv = priv; > priv->fe[1].demodulator_priv = priv; > > - /* create tuner i2c adapter */ > - strlcpy(priv->tuner_i2c_adapter.name, > - "CXD2820R tuner I2C adapter", > - sizeof(priv->tuner_i2c_adapter.name)); > - priv->tuner_i2c_adapter.algo = &cxd2820r_tuner_i2c_algo; > - priv->tuner_i2c_adapter.algo_data = NULL; > - i2c_set_adapdata(&priv->tuner_i2c_adapter, priv); > - if (i2c_add_adapter(&priv->tuner_i2c_adapter) < 0) { > - err("tuner I2C bus could not be initialized"); > - goto error; > - } > - > return &priv->fe[0]; > > } else { > @@ -883,6 +822,7 @@ static struct dvb_frontend_ops cxd2820r_ops[2] = { > .sleep = cxd2820r_sleep, > > .get_tune_settings = cxd2820r_get_tune_settings, > + .i2c_gate_ctrl = cxd2820r_i2c_gate_ctrl, > > .get_frontend = cxd2820r_get_frontend, > > @@ -911,6 +851,7 @@ static struct dvb_frontend_ops cxd2820r_ops[2] = { > .sleep = cxd2820r_sleep, > > .get_tune_settings = cxd2820r_get_tune_settings, > + .i2c_gate_ctrl = cxd2820r_i2c_gate_ctrl, > > .set_frontend = cxd2820r_set_frontend, > .get_frontend = cxd2820r_get_frontend, > diff --git a/drivers/media/dvb/frontends/cxd2820r_priv.h b/drivers/media/dvb/frontends/cxd2820r_priv.h > index 0c0ebc9..9553913 100644 > --- a/drivers/media/dvb/frontends/cxd2820r_priv.h > +++ b/drivers/media/dvb/frontends/cxd2820r_priv.h > @@ -50,7 +50,6 @@ struct cxd2820r_priv { > struct i2c_adapter *i2c; > struct dvb_frontend fe[2]; > struct cxd2820r_config cfg; > - struct i2c_adapter tuner_i2c_adapter; > > struct mutex fe_lock; /*Â FE lock */ > int active_fe:2; /* FE lock, -1=NONE, 0=DVB-T/T2, 1=DVB-C */ > diff --git a/drivers/media/video/em28xx/em28xx-dvb.c b/drivers/media/video/em28xx/em28xx-dvb.c > index e5916de..223a2fc 100644 > --- a/drivers/media/video/em28xx/em28xx-dvb.c > +++ b/drivers/media/video/em28xx/em28xx-dvb.c > @@ -438,6 +438,7 @@ static struct cxd2820r_config em28xx_cxd2820r_config = { > > static struct tda18271_config em28xx_cxd2820r_tda18271_config = { > .output_opt = TDA18271_OUTPUT_LT_OFF, > + .gate = TDA18271_GATE_DIGITAL, > }; > > /* ------------------------------------------------------------------ */ > @@ -753,11 +754,9 @@ static int dvb_init(struct em28xx *dev) > dvb->fe[0] = dvb_attach(cxd2820r_attach, > &em28xx_cxd2820r_config, &dev->i2c_adap, NULL); > if (dvb->fe[0]) { > - struct i2c_adapter *i2c_tuner; > - i2c_tuner = cxd2820r_get_tuner_i2c_adapter(dvb->fe[0]); > /* FE 0 attach tuner */ > if (!dvb_attach(tda18271_attach, dvb->fe[0], 0x60, > - i2c_tuner, &em28xx_cxd2820r_tda18271_config)) { > + &dev->i2c_adap, &em28xx_cxd2820r_tda18271_config)) { > dvb_frontend_detach(dvb->fe[0]); > result = -EINVAL; > goto out_free; > @@ -768,7 +767,7 @@ static int dvb_init(struct em28xx *dev) > dvb->fe[1]->id = 1; > /* FE 1 attach tuner */ > if (!dvb_attach(tda18271_attach, dvb->fe[1], 0x60, > - i2c_tuner, &em28xx_cxd2820r_tda18271_config)) { > + &dev->i2c_adap, &em28xx_cxd2820r_tda18271_config)) { > dvb_frontend_detach(dvb->fe[1]); > /* leave FE 0 still active */ > } -- http://palosaari.fi/ ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2] CXD2820R: Replace i2c message translation with repeater gate control 2011-08-08 23:16 ` Antti Palosaari @ 2011-08-09 10:16 ` Steve Kerrison 2011-08-09 10:45 ` Antti Palosaari 0 siblings, 1 reply; 7+ messages in thread From: Steve Kerrison @ 2011-08-09 10:16 UTC (permalink / raw) To: linux-media; +Cc: Antti Palosaari, Robert Schlabbach, Steve Kerrison [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1: Type: text/plain, Size: 8183 bytes --] This patch implements an i2c_gate_ctrl op for the cxd2820r. Thanks to Robert Schlabbach for identifying the register address and field to set. The old i2c intercept code that prefixed messages with a passthrough byte has been removed and the PCTV nanoStick T2 290e entry in em28xx-dvb has been updated appropriately. Tested for DVB-T2 use; I would appreciate it if somebody with DVB-C capabilities could test it as well - from inspection I cannot see any problems. This is patch v2. It fixes some schoolboy style errors and removes superfluous i2c entries in cxd2820r.h. Signed-off-by: Steve Kerrison <steve@stevekerrison.com> --- drivers/media/dvb/frontends/cxd2820r.h | 9 --- drivers/media/dvb/frontends/cxd2820r_c.c | 1 - drivers/media/dvb/frontends/cxd2820r_core.c | 76 +++------------------------ drivers/media/dvb/frontends/cxd2820r_priv.h | 1 - drivers/media/dvb/frontends/cxd2820r_t.c | 1 - drivers/media/dvb/frontends/cxd2820r_t2.c | 1 - drivers/media/video/em28xx/em28xx-dvb.c | 7 +-- 7 files changed, 11 insertions(+), 85 deletions(-) diff --git a/drivers/media/dvb/frontends/cxd2820r.h b/drivers/media/dvb/frontends/cxd2820r.h index 2906582..03cab7b 100644 --- a/drivers/media/dvb/frontends/cxd2820r.h +++ b/drivers/media/dvb/frontends/cxd2820r.h @@ -93,9 +93,6 @@ extern struct dvb_frontend *cxd2820r_attach( struct i2c_adapter *i2c, struct dvb_frontend *fe ); -extern struct i2c_adapter *cxd2820r_get_tuner_i2c_adapter( - struct dvb_frontend *fe -); #else static inline struct dvb_frontend *cxd2820r_attach( const struct cxd2820r_config *config, @@ -106,12 +103,6 @@ static inline struct dvb_frontend *cxd2820r_attach( printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); return NULL; } -static inline struct i2c_adapter *cxd2820r_get_tuner_i2c_adapter( - struct dvb_frontend *fe -) -{ - return NULL; -} #endif diff --git a/drivers/media/dvb/frontends/cxd2820r_c.c b/drivers/media/dvb/frontends/cxd2820r_c.c index 3c07d40..b85f501 100644 --- a/drivers/media/dvb/frontends/cxd2820r_c.c +++ b/drivers/media/dvb/frontends/cxd2820r_c.c @@ -335,4 +335,3 @@ int cxd2820r_get_tune_settings_c(struct dvb_frontend *fe, return 0; } - diff --git a/drivers/media/dvb/frontends/cxd2820r_core.c b/drivers/media/dvb/frontends/cxd2820r_core.c index d416e85..0151267 100644 --- a/drivers/media/dvb/frontends/cxd2820r_core.c +++ b/drivers/media/dvb/frontends/cxd2820r_core.c @@ -727,70 +727,20 @@ static void cxd2820r_release(struct dvb_frontend *fe) struct cxd2820r_priv *priv = fe->demodulator_priv; dbg("%s", __func__); - if (fe->ops.info.type == FE_OFDM) { - i2c_del_adapter(&priv->tuner_i2c_adapter); + if (fe->ops.info.type == FE_OFDM) kfree(priv); - } return; } -static u32 cxd2820r_tuner_i2c_func(struct i2c_adapter *adapter) -{ - return I2C_FUNC_I2C; -} - -static int cxd2820r_tuner_i2c_xfer(struct i2c_adapter *i2c_adap, - struct i2c_msg msg[], int num) -{ - struct cxd2820r_priv *priv = i2c_get_adapdata(i2c_adap); - int ret; - u8 *obuf = kmalloc(msg[0].len + 2, GFP_KERNEL); - struct i2c_msg msg2[2] = { - { - .addr = priv->cfg.i2c_address, - .flags = 0, - .len = msg[0].len + 2, - .buf = obuf, - }, { - .addr = priv->cfg.i2c_address, - .flags = I2C_M_RD, - .len = msg[1].len, - .buf = msg[1].buf, - } - }; - - if (!obuf) - return -ENOMEM; - - obuf[0] = 0x09; - obuf[1] = (msg[0].addr << 1); - if (num == 2) { /* I2C read */ - obuf[1] = (msg[0].addr << 1) | I2C_M_RD; /* I2C RD flag */ - msg2[0].len = msg[0].len + 2 - 1; /* '-1' maybe HW bug ? */ - } - memcpy(&obuf[2], msg[0].buf, msg[0].len); - - ret = i2c_transfer(priv->i2c, msg2, num); - if (ret < 0) - warn("tuner i2c failed ret:%d", ret); - - kfree(obuf); - - return ret; -} - -static struct i2c_algorithm cxd2820r_tuner_i2c_algo = { - .master_xfer = cxd2820r_tuner_i2c_xfer, - .functionality = cxd2820r_tuner_i2c_func, -}; - -struct i2c_adapter *cxd2820r_get_tuner_i2c_adapter(struct dvb_frontend *fe) +static int cxd2820r_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) { struct cxd2820r_priv *priv = fe->demodulator_priv; - return &priv->tuner_i2c_adapter; + dbg("%s: %d", __func__, enable); + + /* Bit 0 of reg 0xdb in bank 0x00 controls I2C repeater */ + return cxd2820r_wr_reg_mask(priv, 0xdb, enable ? 1 : 0, 0x1); } -EXPORT_SYMBOL(cxd2820r_get_tuner_i2c_adapter); static struct dvb_frontend_ops cxd2820r_ops[2]; @@ -831,18 +781,6 @@ struct dvb_frontend *cxd2820r_attach(const struct cxd2820r_config *cfg, priv->fe[0].demodulator_priv = priv; priv->fe[1].demodulator_priv = priv; - /* create tuner i2c adapter */ - strlcpy(priv->tuner_i2c_adapter.name, - "CXD2820R tuner I2C adapter", - sizeof(priv->tuner_i2c_adapter.name)); - priv->tuner_i2c_adapter.algo = &cxd2820r_tuner_i2c_algo; - priv->tuner_i2c_adapter.algo_data = NULL; - i2c_set_adapdata(&priv->tuner_i2c_adapter, priv); - if (i2c_add_adapter(&priv->tuner_i2c_adapter) < 0) { - err("tuner I2C bus could not be initialized"); - goto error; - } - return &priv->fe[0]; } else { @@ -883,6 +821,7 @@ static struct dvb_frontend_ops cxd2820r_ops[2] = { .sleep = cxd2820r_sleep, .get_tune_settings = cxd2820r_get_tune_settings, + .i2c_gate_ctrl = cxd2820r_i2c_gate_ctrl, .get_frontend = cxd2820r_get_frontend, @@ -911,6 +850,7 @@ static struct dvb_frontend_ops cxd2820r_ops[2] = { .sleep = cxd2820r_sleep, .get_tune_settings = cxd2820r_get_tune_settings, + .i2c_gate_ctrl = cxd2820r_i2c_gate_ctrl, .set_frontend = cxd2820r_set_frontend, .get_frontend = cxd2820r_get_frontend, diff --git a/drivers/media/dvb/frontends/cxd2820r_priv.h b/drivers/media/dvb/frontends/cxd2820r_priv.h index 0c0ebc9..9553913 100644 --- a/drivers/media/dvb/frontends/cxd2820r_priv.h +++ b/drivers/media/dvb/frontends/cxd2820r_priv.h @@ -50,7 +50,6 @@ struct cxd2820r_priv { struct i2c_adapter *i2c; struct dvb_frontend fe[2]; struct cxd2820r_config cfg; - struct i2c_adapter tuner_i2c_adapter; struct mutex fe_lock; /* FE lock */ int active_fe:2; /* FE lock, -1=NONE, 0=DVB-T/T2, 1=DVB-C */ diff --git a/drivers/media/dvb/frontends/cxd2820r_t.c b/drivers/media/dvb/frontends/cxd2820r_t.c index 6582564..a04f9c8 100644 --- a/drivers/media/dvb/frontends/cxd2820r_t.c +++ b/drivers/media/dvb/frontends/cxd2820r_t.c @@ -446,4 +446,3 @@ int cxd2820r_get_tune_settings_t(struct dvb_frontend *fe, return 0; } - diff --git a/drivers/media/dvb/frontends/cxd2820r_t2.c b/drivers/media/dvb/frontends/cxd2820r_t2.c index c47b35c..6548588 100644 --- a/drivers/media/dvb/frontends/cxd2820r_t2.c +++ b/drivers/media/dvb/frontends/cxd2820r_t2.c @@ -420,4 +420,3 @@ int cxd2820r_get_tune_settings_t2(struct dvb_frontend *fe, return 0; } - diff --git a/drivers/media/video/em28xx/em28xx-dvb.c b/drivers/media/video/em28xx/em28xx-dvb.c index e5916de..223a2fc 100644 --- a/drivers/media/video/em28xx/em28xx-dvb.c +++ b/drivers/media/video/em28xx/em28xx-dvb.c @@ -438,6 +438,7 @@ static struct cxd2820r_config em28xx_cxd2820r_config = { static struct tda18271_config em28xx_cxd2820r_tda18271_config = { .output_opt = TDA18271_OUTPUT_LT_OFF, + .gate = TDA18271_GATE_DIGITAL, }; /* ------------------------------------------------------------------ */ @@ -753,11 +754,9 @@ static int dvb_init(struct em28xx *dev) dvb->fe[0] = dvb_attach(cxd2820r_attach, &em28xx_cxd2820r_config, &dev->i2c_adap, NULL); if (dvb->fe[0]) { - struct i2c_adapter *i2c_tuner; - i2c_tuner = cxd2820r_get_tuner_i2c_adapter(dvb->fe[0]); /* FE 0 attach tuner */ if (!dvb_attach(tda18271_attach, dvb->fe[0], 0x60, - i2c_tuner, &em28xx_cxd2820r_tda18271_config)) { + &dev->i2c_adap, &em28xx_cxd2820r_tda18271_config)) { dvb_frontend_detach(dvb->fe[0]); result = -EINVAL; goto out_free; @@ -768,7 +767,7 @@ static int dvb_init(struct em28xx *dev) dvb->fe[1]->id = 1; /* FE 1 attach tuner */ if (!dvb_attach(tda18271_attach, dvb->fe[1], 0x60, - i2c_tuner, &em28xx_cxd2820r_tda18271_config)) { + &dev->i2c_adap, &em28xx_cxd2820r_tda18271_config)) { dvb_frontend_detach(dvb->fe[1]); /* leave FE 0 still active */ } -- 1.7.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2] CXD2820R: Replace i2c message translation with repeater gate control 2011-08-09 10:16 ` [PATCH v2] " Steve Kerrison @ 2011-08-09 10:45 ` Antti Palosaari 0 siblings, 0 replies; 7+ messages in thread From: Antti Palosaari @ 2011-08-09 10:45 UTC (permalink / raw) To: Steve Kerrison; +Cc: linux-media, Robert Schlabbach Acked-by: Antti Palosaari <crope@iki.fi> Tested-by: Antti Palosaari <crope@iki.fi> On 08/09/2011 01:16 PM, Steve Kerrison wrote: > This patch implements an i2c_gate_ctrl op for the cxd2820r. Thanks to Robert > Schlabbach for identifying the register address and field to set. > > The old i2c intercept code that prefixed messages with a passthrough byte has > been removed and the PCTV nanoStick T2 290e entry in em28xx-dvb has been > updated appropriately. > > Tested for DVB-T2 use; I would appreciate it if somebody with DVB-C capabilities > could test it as well - from inspection I cannot see any problems. > > This is patch v2. It fixes some schoolboy style errors and removes superfluous > i2c entries in cxd2820r.h. > > Signed-off-by: Steve Kerrison <steve@stevekerrison.com> -- http://palosaari.fi/ ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATH v2] cxd2820r: fix possible out-of-array lookup 2011-07-29 12:54 ` Antti Palosaari 2011-08-07 18:08 ` [PATCH] CXD2820R: Replace i2c message translation with repeater gate control Steve Kerrison @ 2011-08-21 22:59 ` Antti Palosaari 1 sibling, 0 replies; 7+ messages in thread From: Antti Palosaari @ 2011-08-21 22:59 UTC (permalink / raw) To: Mauro Carvalho Chehab; +Cc: HoP, linux-media, Steve Kerrison Mauro, don't apply that patch since it is now obsolete after another patch [1] from Steve Kerrison. [1] https://patchwork.kernel.org/patch/1048832/ regards Antti On 07/29/2011 03:54 PM, Antti Palosaari wrote: > On 07/29/2011 09:57 AM, HoP wrote: >> When I2C_WRITE is used the msg[] array contains one element only. >> Don't access msg[1] in that case. Also moved rest of msg2[1] >> setting to be used only if needed. >> >> Signed-off-by: Honza Petrous <jpetrous@smartimp.cz> > Acked-by: Antti Palosaari <crope@iki.fi> > >> >> --- >> >> diff -r ae517614bf00 drivers/media/dvb/frontends/cxd2820r_core.c >> --- a/drivers/media/dvb/frontends/cxd2820r_core.c Thu Jul 28 15:44:49 2011 +0200 >> +++ b/drivers/media/dvb/frontends/cxd2820r_core.c Thu Jul 28 16:20:17 2011 +0200 >> @@ -747,12 +747,7 @@ static int cxd2820r_tuner_i2c_xfer(struc >> .flags = 0, >> .len = sizeof(obuf), >> .buf = obuf, >> - }, { >> - .addr = priv->cfg.i2c_address, >> - .flags = I2C_M_RD, >> - .len = msg[1].len, >> - .buf = msg[1].buf, >> - } >> + }, >> }; >> >> obuf[0] = 0x09; >> @@ -760,6 +755,11 @@ static int cxd2820r_tuner_i2c_xfer(struc >> if (num == 2) { /* I2C read */ >> obuf[1] = (msg[0].addr << 1) | I2C_M_RD; /* I2C RD flag */ >> msg2[0].len = sizeof(obuf) - 1; /* maybe HW bug ? */ >> + >> + msg2[1].addr = priv->cfg.i2c_address, >> + msg2[1].flags = I2C_M_RD, >> + msg2[1].len = msg[1].len, >> + msg2[1].buf = msg[1].buf, >> } >> memcpy(&obuf[2], msg[0].buf, msg[0].len); > > -- http://palosaari.fi/ ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2011-08-21 22:59 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-07-29 6:57 [PATH v2] cxd2820r: fix possible out-of-array lookup HoP 2011-07-29 12:54 ` Antti Palosaari 2011-08-07 18:08 ` [PATCH] CXD2820R: Replace i2c message translation with repeater gate control Steve Kerrison 2011-08-08 23:16 ` Antti Palosaari 2011-08-09 10:16 ` [PATCH v2] " Steve Kerrison 2011-08-09 10:45 ` Antti Palosaari 2011-08-21 22:59 ` [PATH v2] cxd2820r: fix possible out-of-array lookup Antti Palosaari
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox