From: Stefan Ringel <linuxtv@xxxxxxxxxxxxxxx> Signed-off-by: Stefan Ringel <linuxtv@xxxxxxxxxxxxxxx> --- drivers/media/common/tuners/mt2063.c | 118 ++++++++++----------------------- 1 files changed, 36 insertions(+), 82 deletions(-) diff --git a/drivers/media/common/tuners/mt2063.c b/drivers/media/common/tuners/mt2063.c index 31cb636..f659d4c 100644 --- a/drivers/media/common/tuners/mt2063.c +++ b/drivers/media/common/tuners/mt2063.c @@ -161,32 +161,22 @@ struct mt2063_state { u32 num_regs; u8 reg[MT2063_REG_END_REGS]; }; - -/* - * mt2063_write - Write data into the I2C bus - */ -static u32 mt2063_write(struct mt2063_state *state, u8 reg, u8 *data, u32 len) +static int mt2063_write(struct mt2063_state *state, u8 reg, u8 data) { - struct dvb_frontend *fe = state->frontend; int ret; - u8 buf[60]; + u8 buf[2] = { reg, data }; + struct i2c_msg msg = { - .addr = state->config->tuner_address, + .addr = state->i2c_addr, .flags = 0, .buf = buf, - .len = len + 1 + .len = 2, }; - dprintk(2, "\n"); - - msg.buf[0] = reg; - memcpy(msg.buf + 1, data, len); + dprintk(3, "writeing at address 0x%02x, subadresse 0x%02x, \ + value 0x%02x\n", state->i2c_addr, reg, data); - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); ret = i2c_transfer(state->i2c, &msg, 1); - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 0); if (ret < 0) printk(KERN_ERR "%s error ret=%d\n", __func__, ret); @@ -194,83 +184,48 @@ static u32 mt2063_write(struct mt2063_state *state, u8 reg, u8 *data, u32 len) return ret; } -/* - * mt2063_write - Write register data into the I2C bus, caching the value - */ -static u32 mt2063_setreg(struct mt2063_state *state, u8 reg, u8 val) +static int mt2063_read(struct mt2063_state *state, u8 reg, u8 *data) { - u32 status; + int ret = 0; - dprintk(2, "\n"); + struct i2c_msg msg[] = { { + .addr = state->i2c_addr, + .flags = 0, + .buf = ®, + .len = 1, + }, { + .addr = state->i2c_addr, + .flags = I2C_M_RD, + .buf = data, + .len = 1, + } }; - if (reg >= MT2063_REG_END_REGS) - return -ERANGE; + dprintk(3, "\n"); - status = mt2063_write(state, reg, &val, 1); - if (status < 0) - return status; + ret = i2c_transfer(state->i2c, msg, 2); + + if (ret < 0) + printk(KERN_ERR "Can't read from address 0x%02x,\n", reg); - state->reg[reg] = val; + dprintk(3, "readed at address 0x%02x, subadress 0x%02x, \ + value 0x%02x\n", state->i2c_addr, reg, data[0]); - return 0; + return ret; } -/* - * mt2063_read - Read data from the I2C bus - */ -static u32 mt2063_read(struct mt2063_state *state, - u8 subAddress, u8 *pData, u32 cnt) +static int mt2063_set_reg_mask(struct mt2063_state *state, u8 reg, + u8 val, u8 mask) { - u32 status = 0; /* Status to be returned */ - struct dvb_frontend *fe = state->frontend; - u32 i = 0; - - dprintk(2, "addr 0x%02x, cnt %d\n", subAddress, cnt); - - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 1); - - for (i = 0; i < cnt; i++) { - u8 b0[] = { subAddress + i }; - struct i2c_msg msg[] = { - { - .addr = state->config->tuner_address, - .flags = 0, - .buf = b0, - .len = 1 - }, { - .addr = state->config->tuner_address, - .flags = I2C_M_RD, - .buf = pData + i, - .len = 1 - } - }; + u8 old_val, new_val; - status = i2c_transfer(state->i2c, msg, 2); - dprintk(2, "addr 0x%02x, ret = %d, val = 0x%02x\n", - subAddress + i, status, *(pData + i)); - if (status < 0) - break; - } - if (fe->ops.i2c_gate_ctrl) - fe->ops.i2c_gate_ctrl(fe, 0); + dprintk(3, "\n"); - if (status < 0) - printk(KERN_ERR "Can't read from address 0x%02x,\n", - subAddress + i); + mt2063_read(state, reg, &old_val); - return status; -} + new_val = (old_val & ~mask) | (val & mask); -/* - * FIXME: Is this really needed? - */ -static int MT2063_Sleep(struct dvb_frontend *fe) -{ - /* - * ToDo: Add code here to implement a OS blocking - */ - msleep(100); + if (new_val != old_val) + mt2063_write(state, reg, new_val); return 0; } @@ -1303,7 +1258,6 @@ static struct dvb_tuner_ops mt2063_ops = { }, .init = mt2063_init, - .sleep = MT2063_Sleep, .get_status = mt2063_get_status, .set_analog_params = mt2063_set_analog_params, .set_params = mt2063_set_params, -- 1.7.7.6 -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html