Commit 433c4864 authored by Antti Palosaari's avatar Antti Palosaari Committed by Mauro Carvalho Chehab

[media] mt2060: add param to split long i2c writes

Add configuration parameter to split long i2c writes as some I2C
adapters cannot write 10 bytes used as a one go.
Signed-off-by: default avatarAntti Palosaari <crope@iki.fi>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 59e8b7aa
...@@ -67,13 +67,24 @@ static int mt2060_writereg(struct mt2060_priv *priv, u8 reg, u8 val) ...@@ -67,13 +67,24 @@ static int mt2060_writereg(struct mt2060_priv *priv, u8 reg, u8 val)
// Writes a set of consecutive registers // Writes a set of consecutive registers
static int mt2060_writeregs(struct mt2060_priv *priv,u8 *buf, u8 len) static int mt2060_writeregs(struct mt2060_priv *priv,u8 *buf, u8 len)
{ {
int rem, val_len;
u8 xfer_buf[16];
struct i2c_msg msg = { 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); for (rem = len - 1; rem > 0; rem -= priv->i2c_max_regs) {
return -EREMOTEIO; 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; return 0;
} }
...@@ -365,6 +376,7 @@ struct dvb_frontend * mt2060_attach(struct dvb_frontend *fe, struct i2c_adapter ...@@ -365,6 +376,7 @@ struct dvb_frontend * mt2060_attach(struct dvb_frontend *fe, struct i2c_adapter
priv->cfg = cfg; priv->cfg = cfg;
priv->i2c = i2c; priv->i2c = i2c;
priv->if1_freq = if1; priv->if1_freq = if1;
priv->i2c_max_regs = ~0;
if (fe->ops.i2c_gate_ctrl) if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 1); /* open i2c_gate */ fe->ops.i2c_gate_ctrl(fe, 1); /* open i2c_gate */
...@@ -422,6 +434,7 @@ static int mt2060_probe(struct i2c_client *client, ...@@ -422,6 +434,7 @@ static int mt2060_probe(struct i2c_client *client,
dev->i2c = client->adapter; dev->i2c = client->adapter;
dev->if1_freq = pdata->if1 ? pdata->if1 : 1220; dev->if1_freq = pdata->if1 ? pdata->if1 : 1220;
dev->client = client; 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); ret = mt2060_readreg(dev, REG_PART_REV, &chip_id);
if (ret) { if (ret) {
......
...@@ -30,12 +30,15 @@ struct i2c_adapter; ...@@ -30,12 +30,15 @@ struct i2c_adapter;
* struct mt2060_platform_data - Platform data for the mt2060 driver * 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. * @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. * @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. * @dvb_frontend: DVB frontend.
*/ */
struct mt2060_platform_data { struct mt2060_platform_data {
u8 clock_out; u8 clock_out;
u16 if1; u16 if1;
unsigned int i2c_write_max:5;
struct dvb_frontend *dvb_frontend; struct dvb_frontend *dvb_frontend;
}; };
......
...@@ -94,6 +94,7 @@ struct mt2060_priv { ...@@ -94,6 +94,7 @@ struct mt2060_priv {
struct i2c_client *client; struct i2c_client *client;
struct mt2060_config config; struct mt2060_config config;
u8 i2c_max_regs;
u32 frequency; u32 frequency;
u16 if1_freq; u16 if1_freq;
u8 fmfreq; u8 fmfreq;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment