|
@@ -43,7 +43,7 @@
|
|
|
|
|
|
#define ET8EK8_NAME "et8ek8"
|
|
|
#define ET8EK8_PRIV_MEM_SIZE 128
|
|
|
-#define ET8EK8_MAX_MSG 48
|
|
|
+#define ET8EK8_MAX_MSG 8
|
|
|
|
|
|
struct et8ek8_sensor {
|
|
|
struct v4l2_subdev subdev;
|
|
@@ -220,7 +220,8 @@ static void et8ek8_i2c_create_msg(struct i2c_client *client, u16 len, u16 reg,
|
|
|
|
|
|
/*
|
|
|
* A buffered write method that puts the wanted register write
|
|
|
- * commands in a message list and passes the list to the i2c framework
|
|
|
+ * commands in smaller number of message lists and passes the lists to
|
|
|
+ * the i2c framework
|
|
|
*/
|
|
|
static int et8ek8_i2c_buffered_write_regs(struct i2c_client *client,
|
|
|
const struct et8ek8_reg *wnext,
|
|
@@ -231,11 +232,7 @@ static int et8ek8_i2c_buffered_write_regs(struct i2c_client *client,
|
|
|
int wcnt = 0;
|
|
|
u16 reg, data_length;
|
|
|
u32 val;
|
|
|
-
|
|
|
- if (WARN_ONCE(cnt > ET8EK8_MAX_MSG,
|
|
|
- ET8EK8_NAME ": %s: too many messages.\n", __func__)) {
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
+ int rval;
|
|
|
|
|
|
/* Create new write messages for all writes */
|
|
|
while (wcnt < cnt) {
|
|
@@ -249,10 +246,21 @@ static int et8ek8_i2c_buffered_write_regs(struct i2c_client *client,
|
|
|
|
|
|
/* Update write count */
|
|
|
wcnt++;
|
|
|
+
|
|
|
+ if (wcnt < ET8EK8_MAX_MSG)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ rval = i2c_transfer(client->adapter, msg, wcnt);
|
|
|
+ if (rval < 0)
|
|
|
+ return rval;
|
|
|
+
|
|
|
+ cnt -= wcnt;
|
|
|
+ wcnt = 0;
|
|
|
}
|
|
|
|
|
|
- /* Now we send everything ... */
|
|
|
- return i2c_transfer(client->adapter, msg, wcnt);
|
|
|
+ rval = i2c_transfer(client->adapter, msg, wcnt);
|
|
|
+
|
|
|
+ return rval < 0 ? rval : 0;
|
|
|
}
|
|
|
|
|
|
/*
|