mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-18 01:34:14 +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:
parent
392296208b
commit
070ed82e32
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user