* [PATCH 2/7] [media] mb86a20s: Fix i2c gate on error
2013-01-22 11:15 [PATCH 1/7] [media] mb86a20s: improve error handling at get_frontend Mauro Carvalho Chehab
@ 2013-01-22 11:15 ` Mauro Carvalho Chehab
2013-01-22 11:15 ` [PATCH 3/7] [media] mb86a20s: make AGC work better Mauro Carvalho Chehab
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Mauro Carvalho Chehab @ 2013-01-22 11:15 UTC (permalink / raw)
Cc: Mauro Carvalho Chehab, Linux Media Mailing List
If an error happens, restore tuner I2C gate to the right
value.
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
---
drivers/media/dvb-frontends/mb86a20s.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/media/dvb-frontends/mb86a20s.c b/drivers/media/dvb-frontends/mb86a20s.c
index 4ff3a0c..3c8587e 100644
--- a/drivers/media/dvb-frontends/mb86a20s.c
+++ b/drivers/media/dvb-frontends/mb86a20s.c
@@ -262,10 +262,10 @@ static int mb86a20s_initfe(struct dvb_frontend *fe)
goto err;
}
+err:
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 1);
-err:
if (rc < 0) {
state->need_init = true;
printk(KERN_INFO "mb86a20s: Init failed. Will try again later\n");
@@ -363,6 +363,10 @@ static int mb86a20s_set_frontend(struct dvb_frontend *fe)
dprintk("\n");
+ /*
+ * Gate should already be opened, but it doesn't hurt to
+ * double-check
+ */
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 1);
dprintk("Calling tuner set parameters\n");
--
1.7.11.7
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/7] [media] mb86a20s: make AGC work better
2013-01-22 11:15 [PATCH 1/7] [media] mb86a20s: improve error handling at get_frontend Mauro Carvalho Chehab
2013-01-22 11:15 ` [PATCH 2/7] [media] mb86a20s: Fix i2c gate on error Mauro Carvalho Chehab
@ 2013-01-22 11:15 ` Mauro Carvalho Chehab
2013-01-22 11:15 ` [PATCH 4/7] [media] mb86a20s: fix interleaving and FEC retrival Mauro Carvalho Chehab
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Mauro Carvalho Chehab @ 2013-01-22 11:15 UTC (permalink / raw)
Cc: Mauro Carvalho Chehab, Linux Media Mailing List
It is recommented to change register 0x0440 value to 0, in order
to fix some AGC bug.
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
---
drivers/media/dvb-frontends/mb86a20s.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/media/dvb-frontends/mb86a20s.c b/drivers/media/dvb-frontends/mb86a20s.c
index 3c8587e..40c6183 100644
--- a/drivers/media/dvb-frontends/mb86a20s.c
+++ b/drivers/media/dvb-frontends/mb86a20s.c
@@ -126,7 +126,8 @@ static struct regdata mb86a20s_init[] = {
{ 0x50, 0xd7 }, { 0x51, 0x3f },
{ 0x28, 0x74 }, { 0x29, 0x00 }, { 0x28, 0x74 }, { 0x29, 0x40 },
{ 0x28, 0x46 }, { 0x29, 0x2c }, { 0x28, 0x46 }, { 0x29, 0x0c },
- { 0x04, 0x40 }, { 0x05, 0x01 },
+
+ { 0x04, 0x40 }, { 0x05, 0x00 },
{ 0x28, 0x00 }, { 0x29, 0x10 },
{ 0x28, 0x05 }, { 0x29, 0x02 },
{ 0x1c, 0x01 },
--
1.7.11.7
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 4/7] [media] mb86a20s: fix interleaving and FEC retrival
2013-01-22 11:15 [PATCH 1/7] [media] mb86a20s: improve error handling at get_frontend Mauro Carvalho Chehab
2013-01-22 11:15 ` [PATCH 2/7] [media] mb86a20s: Fix i2c gate on error Mauro Carvalho Chehab
2013-01-22 11:15 ` [PATCH 3/7] [media] mb86a20s: make AGC work better Mauro Carvalho Chehab
@ 2013-01-22 11:15 ` Mauro Carvalho Chehab
2013-01-22 11:15 ` [PATCH 5/7] [media] mb86a20s: Split status read logic from DVB callback Mauro Carvalho Chehab
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Mauro Carvalho Chehab @ 2013-01-22 11:15 UTC (permalink / raw)
Cc: Mauro Carvalho Chehab, Linux Media Mailing List
Get the proper bits from the TMCC table registers.
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
---
drivers/media/dvb-frontends/mb86a20s.c | 22 +++++++++++++++++-----
1 file changed, 17 insertions(+), 5 deletions(-)
diff --git a/drivers/media/dvb-frontends/mb86a20s.c b/drivers/media/dvb-frontends/mb86a20s.c
index 40c6183..8f4fff1 100644
--- a/drivers/media/dvb-frontends/mb86a20s.c
+++ b/drivers/media/dvb-frontends/mb86a20s.c
@@ -413,7 +413,7 @@ static int mb86a20s_get_modulation(struct mb86a20s_state *state,
rc = mb86a20s_readreg(state, 0x6e);
if (rc < 0)
return rc;
- switch ((rc & 0x70) >> 4) {
+ switch ((rc >> 4) & 0x07) {
case 0:
return DQPSK;
case 1:
@@ -446,7 +446,7 @@ static int mb86a20s_get_fec(struct mb86a20s_state *state,
rc = mb86a20s_readreg(state, 0x6e);
if (rc < 0)
return rc;
- switch (rc) {
+ switch ((rc >> 4) & 0x07) {
case 0:
return FEC_1_2;
case 1:
@@ -481,9 +481,21 @@ static int mb86a20s_get_interleaving(struct mb86a20s_state *state,
rc = mb86a20s_readreg(state, 0x6e);
if (rc < 0)
return rc;
- if (rc > 3)
- return -EINVAL; /* Not used */
- return rc;
+
+ switch ((rc >> 4) & 0x07) {
+ case 1:
+ return GUARD_INTERVAL_1_4;
+ case 2:
+ return GUARD_INTERVAL_1_8;
+ case 3:
+ return GUARD_INTERVAL_1_16;
+ case 4:
+ return GUARD_INTERVAL_1_32;
+
+ default:
+ case 0:
+ return GUARD_INTERVAL_AUTO;
+ }
}
static int mb86a20s_get_segment_count(struct mb86a20s_state *state,
--
1.7.11.7
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 5/7] [media] mb86a20s: Split status read logic from DVB callback
2013-01-22 11:15 [PATCH 1/7] [media] mb86a20s: improve error handling at get_frontend Mauro Carvalho Chehab
` (2 preceding siblings ...)
2013-01-22 11:15 ` [PATCH 4/7] [media] mb86a20s: fix interleaving and FEC retrival Mauro Carvalho Chehab
@ 2013-01-22 11:15 ` Mauro Carvalho Chehab
2013-01-22 11:15 ` [PATCH 6/7] [media] mb86a20s: Function reorder Mauro Carvalho Chehab
2013-01-22 11:15 ` [PATCH 7/7] [media] mb86a20s: convert it to use dev_info/dev_err/dev_dbg Mauro Carvalho Chehab
5 siblings, 0 replies; 7+ messages in thread
From: Mauro Carvalho Chehab @ 2013-01-22 11:15 UTC (permalink / raw)
Cc: Mauro Carvalho Chehab, Linux Media Mailing List
Split the logic that reads the status from the DVB callback. That
helps to properly return an error code, if status read fails.
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
---
drivers/media/dvb-frontends/mb86a20s.c | 31 ++++++++++++++++++++++++-------
1 file changed, 24 insertions(+), 7 deletions(-)
diff --git a/drivers/media/dvb-frontends/mb86a20s.c b/drivers/media/dvb-frontends/mb86a20s.c
index 8f4fff1..03b74d3 100644
--- a/drivers/media/dvb-frontends/mb86a20s.c
+++ b/drivers/media/dvb-frontends/mb86a20s.c
@@ -320,16 +320,14 @@ static int mb86a20s_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
static int mb86a20s_read_status(struct dvb_frontend *fe, fe_status_t *status)
{
struct mb86a20s_state *state = fe->demodulator_priv;
- u8 val;
+ int val;
dprintk("\n");
*status = 0;
- if (fe->ops.i2c_gate_ctrl)
- fe->ops.i2c_gate_ctrl(fe, 0);
val = mb86a20s_readreg(state, 0x0a) & 0xf;
- if (fe->ops.i2c_gate_ctrl)
- fe->ops.i2c_gate_ctrl(fe, 1);
+ if (val < 0)
+ return val;
if (val >= 2)
*status |= FE_HAS_SIGNAL;
@@ -635,6 +633,25 @@ error:
}
+static int mb86a20s_read_status_gate(struct dvb_frontend *fe,
+ fe_status_t *status)
+{
+ int ret;
+
+ dprintk("\n");
+ *status = 0;
+
+ if (fe->ops.i2c_gate_ctrl)
+ fe->ops.i2c_gate_ctrl(fe, 0);
+
+ ret = mb86a20s_read_status(fe, status);
+
+ if (fe->ops.i2c_gate_ctrl)
+ fe->ops.i2c_gate_ctrl(fe, 1);
+
+ return ret;
+}
+
static int mb86a20s_tune(struct dvb_frontend *fe,
bool re_tune,
unsigned int mode_flags,
@@ -649,7 +666,7 @@ static int mb86a20s_tune(struct dvb_frontend *fe,
rc = mb86a20s_set_frontend(fe);
if (!(mode_flags & FE_TUNE_MODE_ONESHOT))
- mb86a20s_read_status(fe, status);
+ mb86a20s_read_status_gate(fe, status);
return rc;
}
@@ -730,7 +747,7 @@ static struct dvb_frontend_ops mb86a20s_ops = {
.init = mb86a20s_initfe,
.set_frontend = mb86a20s_set_frontend,
.get_frontend = mb86a20s_get_frontend,
- .read_status = mb86a20s_read_status,
+ .read_status = mb86a20s_read_status_gate,
.read_signal_strength = mb86a20s_read_signal_strength,
.tune = mb86a20s_tune,
};
--
1.7.11.7
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 6/7] [media] mb86a20s: Function reorder
2013-01-22 11:15 [PATCH 1/7] [media] mb86a20s: improve error handling at get_frontend Mauro Carvalho Chehab
` (3 preceding siblings ...)
2013-01-22 11:15 ` [PATCH 5/7] [media] mb86a20s: Split status read logic from DVB callback Mauro Carvalho Chehab
@ 2013-01-22 11:15 ` Mauro Carvalho Chehab
2013-01-22 11:15 ` [PATCH 7/7] [media] mb86a20s: convert it to use dev_info/dev_err/dev_dbg Mauro Carvalho Chehab
5 siblings, 0 replies; 7+ messages in thread
From: Mauro Carvalho Chehab @ 2013-01-22 11:15 UTC (permalink / raw)
Cc: Mauro Carvalho Chehab, Linux Media Mailing List
Reorder functions to have everything related to stats/status read
close. That will make the file more organized as other stats
routines will be added.
No functional changes.
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
---
drivers/media/dvb-frontends/mb86a20s.c | 215 +++++++++++++++++----------------
1 file changed, 110 insertions(+), 105 deletions(-)
diff --git a/drivers/media/dvb-frontends/mb86a20s.c b/drivers/media/dvb-frontends/mb86a20s.c
index 03b74d3..b348f97 100644
--- a/drivers/media/dvb-frontends/mb86a20s.c
+++ b/drivers/media/dvb-frontends/mb86a20s.c
@@ -175,6 +175,10 @@ static struct regdata mb86a20s_reset_reception[] = {
{ 0x08, 0x00 },
};
+/*
+ * I2C read/write functions and macros
+ */
+
static int mb86a20s_i2c_writereg(struct mb86a20s_state *state,
u8 i2c_addr, int reg, int data)
{
@@ -236,45 +240,36 @@ static int mb86a20s_i2c_readreg(struct mb86a20s_state *state,
mb86a20s_i2c_writeregdata(state, state->config->demod_address, \
regdata, ARRAY_SIZE(regdata))
-static int mb86a20s_initfe(struct dvb_frontend *fe)
+static int mb86a20s_read_status(struct dvb_frontend *fe, fe_status_t *status)
{
struct mb86a20s_state *state = fe->demodulator_priv;
- int rc;
- u8 regD5 = 1;
+ int val;
dprintk("\n");
+ *status = 0;
- if (fe->ops.i2c_gate_ctrl)
- fe->ops.i2c_gate_ctrl(fe, 0);
+ val = mb86a20s_readreg(state, 0x0a) & 0xf;
+ if (val < 0)
+ return val;
- /* Initialize the frontend */
- rc = mb86a20s_writeregdata(state, mb86a20s_init);
- if (rc < 0)
- goto err;
+ if (val >= 2)
+ *status |= FE_HAS_SIGNAL;
- if (!state->config->is_serial) {
- regD5 &= ~1;
+ if (val >= 4)
+ *status |= FE_HAS_CARRIER;
- rc = mb86a20s_writereg(state, 0x50, 0xd5);
- if (rc < 0)
- goto err;
- rc = mb86a20s_writereg(state, 0x51, regD5);
- if (rc < 0)
- goto err;
- }
+ if (val >= 5)
+ *status |= FE_HAS_VITERBI;
-err:
- if (fe->ops.i2c_gate_ctrl)
- fe->ops.i2c_gate_ctrl(fe, 1);
+ if (val >= 7)
+ *status |= FE_HAS_SYNC;
- if (rc < 0) {
- state->need_init = true;
- printk(KERN_INFO "mb86a20s: Init failed. Will try again later\n");
- } else {
- state->need_init = false;
- dprintk("Initialization succeeded.\n");
- }
- return rc;
+ if (val >= 8) /* Maybe 9? */
+ *status |= FE_HAS_LOCK;
+
+ dprintk("val = %d, status = 0x%02x\n", val, *status);
+
+ return 0;
}
static int mb86a20s_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
@@ -317,82 +312,6 @@ static int mb86a20s_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
return 0;
}
-static int mb86a20s_read_status(struct dvb_frontend *fe, fe_status_t *status)
-{
- struct mb86a20s_state *state = fe->demodulator_priv;
- int val;
-
- dprintk("\n");
- *status = 0;
-
- val = mb86a20s_readreg(state, 0x0a) & 0xf;
- if (val < 0)
- return val;
-
- if (val >= 2)
- *status |= FE_HAS_SIGNAL;
-
- if (val >= 4)
- *status |= FE_HAS_CARRIER;
-
- if (val >= 5)
- *status |= FE_HAS_VITERBI;
-
- if (val >= 7)
- *status |= FE_HAS_SYNC;
-
- if (val >= 8) /* Maybe 9? */
- *status |= FE_HAS_LOCK;
-
- dprintk("val = %d, status = 0x%02x\n", val, *status);
-
- return 0;
-}
-
-static int mb86a20s_set_frontend(struct dvb_frontend *fe)
-{
- struct mb86a20s_state *state = fe->demodulator_priv;
- int rc;
-#if 0
- /*
- * FIXME: Properly implement the set frontend properties
- */
- struct dtv_frontend_properties *c = &fe->dtv_property_cache;
-#endif
-
- dprintk("\n");
-
- /*
- * Gate should already be opened, but it doesn't hurt to
- * double-check
- */
- if (fe->ops.i2c_gate_ctrl)
- fe->ops.i2c_gate_ctrl(fe, 1);
- dprintk("Calling tuner set parameters\n");
- fe->ops.tuner_ops.set_params(fe);
-
- /*
- * Make it more reliable: if, for some reason, the initial
- * device initialization doesn't happen, initialize it when
- * a SBTVD parameters are adjusted.
- *
- * Unfortunately, due to a hard to track bug at tda829x/tda18271,
- * the agc callback logic is not called during DVB attach time,
- * causing mb86a20s to not be initialized with Kworld SBTVD.
- * So, this hack is needed, in order to make Kworld SBTVD to work.
- */
- if (state->need_init)
- mb86a20s_initfe(fe);
-
- if (fe->ops.i2c_gate_ctrl)
- fe->ops.i2c_gate_ctrl(fe, 0);
- rc = mb86a20s_writeregdata(state, mb86a20s_reset_reception);
- if (fe->ops.i2c_gate_ctrl)
- fe->ops.i2c_gate_ctrl(fe, 1);
-
- return rc;
-}
-
static int mb86a20s_get_modulation(struct mb86a20s_state *state,
unsigned layer)
{
@@ -633,6 +552,92 @@ error:
}
+static int mb86a20s_initfe(struct dvb_frontend *fe)
+{
+ struct mb86a20s_state *state = fe->demodulator_priv;
+ int rc;
+ u8 regD5 = 1;
+
+ dprintk("\n");
+
+ if (fe->ops.i2c_gate_ctrl)
+ fe->ops.i2c_gate_ctrl(fe, 0);
+
+ /* Initialize the frontend */
+ rc = mb86a20s_writeregdata(state, mb86a20s_init);
+ if (rc < 0)
+ goto err;
+
+ if (!state->config->is_serial) {
+ regD5 &= ~1;
+
+ rc = mb86a20s_writereg(state, 0x50, 0xd5);
+ if (rc < 0)
+ goto err;
+ rc = mb86a20s_writereg(state, 0x51, regD5);
+ if (rc < 0)
+ goto err;
+ }
+
+err:
+ if (fe->ops.i2c_gate_ctrl)
+ fe->ops.i2c_gate_ctrl(fe, 1);
+
+ if (rc < 0) {
+ state->need_init = true;
+ printk(KERN_INFO "mb86a20s: Init failed. Will try again later\n");
+ } else {
+ state->need_init = false;
+ dprintk("Initialization succeeded.\n");
+ }
+ return rc;
+}
+
+static int mb86a20s_set_frontend(struct dvb_frontend *fe)
+{
+ struct mb86a20s_state *state = fe->demodulator_priv;
+ int rc;
+#if 0
+ /*
+ * FIXME: Properly implement the set frontend properties
+ */
+ struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+#endif
+
+ dprintk("\n");
+
+ /*
+ * Gate should already be opened, but it doesn't hurt to
+ * double-check
+ */
+ if (fe->ops.i2c_gate_ctrl)
+ fe->ops.i2c_gate_ctrl(fe, 1);
+ dprintk("Calling tuner set parameters\n");
+ fe->ops.tuner_ops.set_params(fe);
+
+ /*
+ * Make it more reliable: if, for some reason, the initial
+ * device initialization doesn't happen, initialize it when
+ * a SBTVD parameters are adjusted.
+ *
+ * Unfortunately, due to a hard to track bug at tda829x/tda18271,
+ * the agc callback logic is not called during DVB attach time,
+ * causing mb86a20s to not be initialized with Kworld SBTVD.
+ * So, this hack is needed, in order to make Kworld SBTVD to work.
+ */
+ if (state->need_init)
+ mb86a20s_initfe(fe);
+
+ if (fe->ops.i2c_gate_ctrl)
+ fe->ops.i2c_gate_ctrl(fe, 0);
+ rc = mb86a20s_writeregdata(state, mb86a20s_reset_reception);
+ if (fe->ops.i2c_gate_ctrl)
+ fe->ops.i2c_gate_ctrl(fe, 1);
+
+ return rc;
+}
+
+
static int mb86a20s_read_status_gate(struct dvb_frontend *fe,
fe_status_t *status)
{
--
1.7.11.7
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 7/7] [media] mb86a20s: convert it to use dev_info/dev_err/dev_dbg
2013-01-22 11:15 [PATCH 1/7] [media] mb86a20s: improve error handling at get_frontend Mauro Carvalho Chehab
` (4 preceding siblings ...)
2013-01-22 11:15 ` [PATCH 6/7] [media] mb86a20s: Function reorder Mauro Carvalho Chehab
@ 2013-01-22 11:15 ` Mauro Carvalho Chehab
5 siblings, 0 replies; 7+ messages in thread
From: Mauro Carvalho Chehab @ 2013-01-22 11:15 UTC (permalink / raw)
Cc: Mauro Carvalho Chehab, Linux Media Mailing List
Instead of having its own set of macros, use the Kernel default
ones for debug, error and info.
While here, do some cleanup on the debug printk's.
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
---
drivers/media/dvb-frontends/mb86a20s.c | 96 ++++++++++++++++++----------------
1 file changed, 52 insertions(+), 44 deletions(-)
diff --git a/drivers/media/dvb-frontends/mb86a20s.c b/drivers/media/dvb-frontends/mb86a20s.c
index b348f97..c52ae2e 100644
--- a/drivers/media/dvb-frontends/mb86a20s.c
+++ b/drivers/media/dvb-frontends/mb86a20s.c
@@ -24,18 +24,6 @@ static int debug = 1;
module_param(debug, int, 0644);
MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)");
-#define rc(args...) do { \
- printk(KERN_ERR "mb86a20s: " args); \
-} while (0)
-
-#define dprintk(args...) \
- do { \
- if (debug) { \
- printk(KERN_DEBUG "mb86a20s: %s: ", __func__); \
- printk(args); \
- } \
- } while (0)
-
struct mb86a20s_state {
struct i2c_adapter *i2c;
const struct mb86a20s_config *config;
@@ -190,8 +178,9 @@ static int mb86a20s_i2c_writereg(struct mb86a20s_state *state,
rc = i2c_transfer(state->i2c, &msg, 1);
if (rc != 1) {
- printk("%s: writereg error (rc == %i, reg == 0x%02x,"
- " data == 0x%02x)\n", __func__, rc, reg, data);
+ dev_err(&state->i2c->dev,
+ "%s: writereg error (rc == %i, reg == 0x%02x, data == 0x%02x)\n",
+ __func__, rc, reg, data);
return rc;
}
@@ -225,8 +214,9 @@ static int mb86a20s_i2c_readreg(struct mb86a20s_state *state,
rc = i2c_transfer(state->i2c, msg, 2);
if (rc != 2) {
- rc("%s: reg=0x%x (error=%d)\n", __func__, reg, rc);
- return rc;
+ dev_err(&state->i2c->dev, "%s: reg=0x%x (error=%d)\n",
+ __func__, reg, rc);
+ return (rc < 0) ? rc : -EIO;
}
return val;
@@ -245,7 +235,6 @@ static int mb86a20s_read_status(struct dvb_frontend *fe, fe_status_t *status)
struct mb86a20s_state *state = fe->demodulator_priv;
int val;
- dprintk("\n");
*status = 0;
val = mb86a20s_readreg(state, 0x0a) & 0xf;
@@ -267,7 +256,8 @@ static int mb86a20s_read_status(struct dvb_frontend *fe, fe_status_t *status)
if (val >= 8) /* Maybe 9? */
*status |= FE_HAS_LOCK;
- dprintk("val = %d, status = 0x%02x\n", val, *status);
+ dev_dbg(&state->i2c->dev, "%s: Status = 0x%02x (state = %d)\n",
+ __func__, *status, val);
return 0;
}
@@ -278,8 +268,6 @@ static int mb86a20s_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
unsigned rf_max, rf_min, rf;
u8 val;
- dprintk("\n");
-
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 0);
@@ -300,12 +288,13 @@ static int mb86a20s_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
rf_max = (rf_max + rf_min) / 2;
if (rf_max - rf_min < 4) {
*strength = (((rf_max + rf_min) / 2) * 65535) / 4095;
+ dev_dbg(&state->i2c->dev,
+ "%s: signal strength = %d (%d < RF=%d < %d)\n",
+ __func__, rf, rf_min, rf >> 4, rf_max);
break;
}
} while (1);
- dprintk("signal strength = %d\n", *strength);
-
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 1);
@@ -419,15 +408,17 @@ static int mb86a20s_get_segment_count(struct mb86a20s_state *state,
unsigned layer)
{
int rc, count;
-
static unsigned char reg[] = {
[0] = 0x89, /* Layer A */
[1] = 0x8d, /* Layer B */
[2] = 0x91, /* Layer C */
};
+ dev_dbg(&state->i2c->dev, "%s called.\n", __func__);
+
if (layer >= ARRAY_SIZE(reg))
return -EINVAL;
+
rc = mb86a20s_writereg(state, 0x6d, reg[layer]);
if (rc < 0)
return rc;
@@ -436,13 +427,18 @@ static int mb86a20s_get_segment_count(struct mb86a20s_state *state,
return rc;
count = (rc >> 4) & 0x0f;
+ dev_dbg(&state->i2c->dev, "%s: segments: %d.\n", __func__, count);
+
return count;
}
static void mb86a20s_reset_frontend_cache(struct dvb_frontend *fe)
{
+ struct mb86a20s_state *state = fe->demodulator_priv;
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+ dev_dbg(&state->i2c->dev, "%s called.\n", __func__);
+
/* Fixed parameters */
c->delivery_system = SYS_ISDBT;
c->bandwidth_hz = 6000000;
@@ -461,6 +457,8 @@ static int mb86a20s_get_frontend(struct dvb_frontend *fe)
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
int i, rc;
+ dev_dbg(&state->i2c->dev, "%s called.\n", __func__);
+
/* Reset frontend cache to default values */
mb86a20s_reset_frontend_cache(fe);
@@ -479,9 +477,12 @@ static int mb86a20s_get_frontend(struct dvb_frontend *fe)
/* Get per-layer data */
for (i = 0; i < 3; i++) {
+ dev_dbg(&state->i2c->dev, "%s: getting data for layer %c.\n",
+ __func__, 'A' + i);
+
rc = mb86a20s_get_segment_count(state, i);
if (rc < 0)
- goto error;
+ goto noperlayer_error;
if (rc >= 0 && rc < 14)
c->layer[i].segment_count = rc;
else {
@@ -491,15 +492,21 @@ static int mb86a20s_get_frontend(struct dvb_frontend *fe)
c->isdbt_layer_enabled |= 1 << i;
rc = mb86a20s_get_modulation(state, i);
if (rc < 0)
- goto error;
+ goto noperlayer_error;
+ dev_dbg(&state->i2c->dev, "%s: modulation %d.\n",
+ __func__, rc);
c->layer[i].modulation = rc;
rc = mb86a20s_get_fec(state, i);
if (rc < 0)
- goto error;
+ goto noperlayer_error;
+ dev_dbg(&state->i2c->dev, "%s: FEC %d.\n",
+ __func__, rc);
c->layer[i].fec = rc;
rc = mb86a20s_get_interleaving(state, i);
if (rc < 0)
- goto error;
+ goto noperlayer_error;
+ dev_dbg(&state->i2c->dev, "%s: interleaving %d.\n",
+ __func__, rc);
c->layer[i].interleaving = rc;
}
@@ -544,7 +551,7 @@ static int mb86a20s_get_frontend(struct dvb_frontend *fe)
}
}
-error:
+noperlayer_error:
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 1);
@@ -558,7 +565,7 @@ static int mb86a20s_initfe(struct dvb_frontend *fe)
int rc;
u8 regD5 = 1;
- dprintk("\n");
+ dev_dbg(&state->i2c->dev, "%s called.\n", __func__);
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 0);
@@ -585,10 +592,11 @@ err:
if (rc < 0) {
state->need_init = true;
- printk(KERN_INFO "mb86a20s: Init failed. Will try again later\n");
+ dev_info(&state->i2c->dev,
+ "mb86a20s: Init failed. Will try again later\n");
} else {
state->need_init = false;
- dprintk("Initialization succeeded.\n");
+ dev_dbg(&state->i2c->dev, "Initialization succeeded.\n");
}
return rc;
}
@@ -603,8 +611,7 @@ static int mb86a20s_set_frontend(struct dvb_frontend *fe)
*/
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
#endif
-
- dprintk("\n");
+ dev_dbg(&state->i2c->dev, "%s called.\n", __func__);
/*
* Gate should already be opened, but it doesn't hurt to
@@ -612,7 +619,6 @@ static int mb86a20s_set_frontend(struct dvb_frontend *fe)
*/
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 1);
- dprintk("Calling tuner set parameters\n");
fe->ops.tuner_ops.set_params(fe);
/*
@@ -637,13 +643,11 @@ static int mb86a20s_set_frontend(struct dvb_frontend *fe)
return rc;
}
-
static int mb86a20s_read_status_gate(struct dvb_frontend *fe,
fe_status_t *status)
{
int ret;
- dprintk("\n");
*status = 0;
if (fe->ops.i2c_gate_ctrl)
@@ -663,9 +667,10 @@ static int mb86a20s_tune(struct dvb_frontend *fe,
unsigned int *delay,
fe_status_t *status)
{
+ struct mb86a20s_state *state = fe->demodulator_priv;
int rc = 0;
- dprintk("\n");
+ dev_dbg(&state->i2c->dev, "%s called.\n", __func__);
if (re_tune)
rc = mb86a20s_set_frontend(fe);
@@ -680,7 +685,7 @@ static void mb86a20s_release(struct dvb_frontend *fe)
{
struct mb86a20s_state *state = fe->demodulator_priv;
- dprintk("\n");
+ dev_dbg(&state->i2c->dev, "%s called.\n", __func__);
kfree(state);
}
@@ -690,15 +695,16 @@ static struct dvb_frontend_ops mb86a20s_ops;
struct dvb_frontend *mb86a20s_attach(const struct mb86a20s_config *config,
struct i2c_adapter *i2c)
{
+ struct mb86a20s_state *state;
u8 rev;
/* allocate memory for the internal state */
- struct mb86a20s_state *state =
- kzalloc(sizeof(struct mb86a20s_state), GFP_KERNEL);
+ state = kzalloc(sizeof(struct mb86a20s_state), GFP_KERNEL);
- dprintk("\n");
+ dev_dbg(&state->i2c->dev, "%s called.\n", __func__);
if (state == NULL) {
- rc("Unable to kzalloc\n");
+ dev_err(&state->i2c->dev,
+ "%s: unable to allocate memory for state\n", __func__);
goto error;
}
@@ -715,9 +721,11 @@ struct dvb_frontend *mb86a20s_attach(const struct mb86a20s_config *config,
rev = mb86a20s_readreg(state, 0);
if (rev == 0x13) {
- printk(KERN_INFO "Detected a Fujitsu mb86a20s frontend\n");
+ dev_info(&state->i2c->dev,
+ "Detected a Fujitsu mb86a20s frontend\n");
} else {
- printk(KERN_ERR "Frontend revision %d is unknown - aborting.\n",
+ dev_dbg(&state->i2c->dev,
+ "Frontend revision %d is unknown - aborting.\n",
rev);
goto error;
}
--
1.7.11.7
^ permalink raw reply related [flat|nested] 7+ messages in thread