media: et8ek8: Decrease stack usage
authorSakari Ailus <sakari.ailus@linux.intel.com>
Wed, 16 Aug 2017 07:28:16 +0000 (03:28 -0400)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Sun, 20 Aug 2017 12:33:46 +0000 (08:33 -0400)
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>
drivers/media/i2c/et8ek8/et8ek8_driver.c

index f39f5179dd95792b5414a3132b8ccdf730abaded..c14f0fd6ded38ea26e2bb59decb2e2a8c40e69cf 100644 (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;
 }
 
 /*