Commit 070ed82e authored by Sakari Ailus's avatar Sakari Ailus Committed by Mauro Carvalho Chehab

media: et8ek8: Decrease stack usage

The et8ek8 driver combines I²C register writes to a single array that it
passes to i2c_transfer(). The maximum number of writes is 48 at once,
decrease it to 8 and make more transfers if needed.
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Tested-by: default avatarPavel Machek <pavel@ucw.cz>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 39229620
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
#define ET8EK8_NAME "et8ek8" #define ET8EK8_NAME "et8ek8"
#define ET8EK8_PRIV_MEM_SIZE 128 #define ET8EK8_PRIV_MEM_SIZE 128
#define ET8EK8_MAX_MSG 48 #define ET8EK8_MAX_MSG 8
struct et8ek8_sensor { struct et8ek8_sensor {
struct v4l2_subdev subdev; struct v4l2_subdev subdev;
...@@ -220,7 +220,8 @@ static void et8ek8_i2c_create_msg(struct i2c_client *client, u16 len, u16 reg, ...@@ -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 * 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, static int et8ek8_i2c_buffered_write_regs(struct i2c_client *client,
const struct et8ek8_reg *wnext, const struct et8ek8_reg *wnext,
...@@ -231,11 +232,7 @@ static int et8ek8_i2c_buffered_write_regs(struct i2c_client *client, ...@@ -231,11 +232,7 @@ static int et8ek8_i2c_buffered_write_regs(struct i2c_client *client,
int wcnt = 0; int wcnt = 0;
u16 reg, data_length; u16 reg, data_length;
u32 val; u32 val;
int rval;
if (WARN_ONCE(cnt > ET8EK8_MAX_MSG,
ET8EK8_NAME ": %s: too many messages.\n", __func__)) {
return -EINVAL;
}
/* Create new write messages for all writes */ /* Create new write messages for all writes */
while (wcnt < cnt) { while (wcnt < cnt) {
...@@ -249,10 +246,21 @@ static int et8ek8_i2c_buffered_write_regs(struct i2c_client *client, ...@@ -249,10 +246,21 @@ static int et8ek8_i2c_buffered_write_regs(struct i2c_client *client,
/* Update write count */ /* Update write count */
wcnt++; 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 ... */ rval = i2c_transfer(client->adapter, msg, wcnt);
return i2c_transfer(client->adapter, msg, wcnt);
return rval < 0 ? rval : 0;
} }
/* /*
......
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