Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+17 −9
Original line number Diff line number Diff line
@@ -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;
}

/*