Skip to content

Commit

Permalink
[media] mt2060: add param to split long i2c writes
Browse files Browse the repository at this point in the history
Add configuration parameter to split long i2c writes as some I2C
adapters cannot write 10 bytes used as a one go.

Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
  • Loading branch information
Antti Palosaari authored and Mauro Carvalho Chehab committed Feb 3, 2017
1 parent 59e8b7a commit 433c486
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 4 deletions.
21 changes: 17 additions & 4 deletions drivers/media/tuners/mt2060.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,24 @@ static int mt2060_writereg(struct mt2060_priv *priv, u8 reg, u8 val)
// Writes a set of consecutive registers
static int mt2060_writeregs(struct mt2060_priv *priv,u8 *buf, u8 len)
{
int rem, val_len;
u8 xfer_buf[16];
struct i2c_msg msg = {
.addr = priv->cfg->i2c_address, .flags = 0, .buf = buf, .len = len
.addr = priv->cfg->i2c_address, .flags = 0, .buf = xfer_buf
};
if (i2c_transfer(priv->i2c, &msg, 1) != 1) {
printk(KERN_WARNING "mt2060 I2C write failed (len=%i)\n",(int)len);
return -EREMOTEIO;

for (rem = len - 1; rem > 0; rem -= priv->i2c_max_regs) {
val_len = min_t(int, rem, priv->i2c_max_regs);
msg.len = 1 + val_len;
xfer_buf[0] = buf[0] + len - 1 - rem;
memcpy(&xfer_buf[1], &buf[1 + len - 1 - rem], val_len);

if (i2c_transfer(priv->i2c, &msg, 1) != 1) {
printk(KERN_WARNING "mt2060 I2C write failed (len=%i)\n", val_len);
return -EREMOTEIO;
}
}

return 0;
}

Expand Down Expand Up @@ -365,6 +376,7 @@ struct dvb_frontend * mt2060_attach(struct dvb_frontend *fe, struct i2c_adapter
priv->cfg = cfg;
priv->i2c = i2c;
priv->if1_freq = if1;
priv->i2c_max_regs = ~0;

if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 1); /* open i2c_gate */
Expand Down Expand Up @@ -422,6 +434,7 @@ static int mt2060_probe(struct i2c_client *client,
dev->i2c = client->adapter;
dev->if1_freq = pdata->if1 ? pdata->if1 : 1220;
dev->client = client;
dev->i2c_max_regs = pdata->i2c_write_max ? pdata->i2c_write_max - 1 : ~0;

ret = mt2060_readreg(dev, REG_PART_REV, &chip_id);
if (ret) {
Expand Down
3 changes: 3 additions & 0 deletions drivers/media/tuners/mt2060.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,15 @@ struct i2c_adapter;
* struct mt2060_platform_data - Platform data for the mt2060 driver
* @clock_out: Clock output setting. 0 = off, 1 = CLK/4, 2 = CLK/2, 3 = CLK/1.
* @if1: First IF used [MHz]. 0 defaults to 1220.
* @i2c_write_max: Maximum number of bytes I2C adapter can write at once.
* 0 defaults to maximum.
* @dvb_frontend: DVB frontend.
*/

struct mt2060_platform_data {
u8 clock_out;
u16 if1;
unsigned int i2c_write_max:5;
struct dvb_frontend *dvb_frontend;
};

Expand Down
1 change: 1 addition & 0 deletions drivers/media/tuners/mt2060_priv.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ struct mt2060_priv {
struct i2c_client *client;
struct mt2060_config config;

u8 i2c_max_regs;
u32 frequency;
u16 if1_freq;
u8 fmfreq;
Expand Down

0 comments on commit 433c486

Please sign in to comment.