2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2024-12-21 19:53:59 +08:00

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: Sakari Ailus <sakari.ailus@linux.intel.com>
Tested-by: Pavel Machek <pavel@ucw.cz>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
This commit is contained in:
Sakari Ailus 2017-08-16 03:28:16 -04:00 committed by Mauro Carvalho Chehab
parent 392296208b
commit 070ed82e32

View File

@ -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;
}
/*