Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 357361
b: refs/heads/master
c: f66d81b
h: refs/heads/master
i:
  357359: 3046b4b
v: v3
  • Loading branch information
Mauro Carvalho Chehab committed Jan 22, 2013
1 parent b35a7c8 commit 96d0a5e
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 45 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: dd4493ef34cb4062d59d87717aaf8a1c27d450c9
refs/heads/master: f66d81b54dac26d4e601d4d7faca53f3bdc98427
96 changes: 52 additions & 44 deletions trunk/drivers/media/dvb-frontends/mb86a20s.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
}
Expand All @@ -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);

Expand All @@ -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);

Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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);

Expand All @@ -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 {
Expand All @@ -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;
}

Expand Down Expand Up @@ -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);

Expand All @@ -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);
Expand All @@ -585,10 +592,11 @@ static int mb86a20s_initfe(struct dvb_frontend *fe)

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;
}
Expand All @@ -603,16 +611,14 @@ 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
* 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);

/*
Expand All @@ -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)
Expand All @@ -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);
Expand All @@ -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);
}
Expand All @@ -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;
}

Expand All @@ -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;
}
Expand Down

0 comments on commit 96d0a5e

Please sign in to comment.