OSDN Git Service

media: smiapp: Calculate CCS limit offsets and limit buffer size
authorSakari Ailus <sakari.ailus@linux.intel.com>
Wed, 5 Feb 2020 14:21:06 +0000 (15:21 +0100)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Wed, 2 Dec 2020 14:28:20 +0000 (15:28 +0100)
Calculate the limit offsets and the size of the limit buffer. CCS limits
are read into this buffer, and the offsets are helpful in accessing the
information in it.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/i2c/smiapp/Makefile
drivers/media/i2c/smiapp/smiapp-core.c

index 86f57a4..efb643d 100644 (file)
@@ -1,6 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0-only
 smiapp-objs                    += smiapp-core.o smiapp-regs.o \
-                                  smiapp-quirk.o smiapp-limits.o
+                                  smiapp-quirk.o smiapp-limits.o ccs-limits.o
 obj-$(CONFIG_VIDEO_SMIAPP)     += smiapp.o
 
 ccflags-y += -I $(srctree)/drivers/media/i2c
index 105ef29..75862e7 100644 (file)
@@ -27,6 +27,7 @@
 #include <media/v4l2-fwnode.h>
 #include <media/v4l2-device.h>
 
+#include "ccs-limits.h"
 #include "smiapp.h"
 
 #define SMIAPP_ALIGN_DIM(dim, flags)   \
         ? ALIGN((dim), 2)              \
         : (dim) & ~1)
 
+static struct ccs_limit_offset {
+       u16     lim;
+       u16     info;
+} ccs_limit_offsets[CCS_L_LAST + 1];
+
 /*
  * smiapp_module_idents - supported camera modules
  */
@@ -3166,7 +3172,39 @@ static struct i2c_driver smiapp_i2c_driver = {
        .id_table = smiapp_id_table,
 };
 
-module_i2c_driver(smiapp_i2c_driver);
+static int smiapp_module_init(void)
+{
+       unsigned int i, l;
+
+       for (i = 0, l = 0; ccs_limits[i].size && l < CCS_L_LAST; i++) {
+               if (!(ccs_limits[i].flags & CCS_L_FL_SAME_REG)) {
+                       ccs_limit_offsets[l + 1].lim =
+                               ALIGN(ccs_limit_offsets[l].lim +
+                                     ccs_limits[i].size,
+                                     ccs_reg_width(ccs_limits[i + 1].reg));
+                       ccs_limit_offsets[l].info = i;
+                       l++;
+               } else {
+                       ccs_limit_offsets[l].lim += ccs_limits[i].size;
+               }
+       }
+
+       if (WARN_ON(ccs_limits[i].size))
+               return -EINVAL;
+
+       if (WARN_ON(l != CCS_L_LAST))
+               return -EINVAL;
+
+       return i2c_register_driver(THIS_MODULE, &smiapp_i2c_driver);
+}
+
+static void smiapp_module_cleanup(void)
+{
+       i2c_del_driver(&smiapp_i2c_driver);
+}
+
+module_init(smiapp_module_init);
+module_exit(smiapp_module_cleanup);
 
 MODULE_AUTHOR("Sakari Ailus <sakari.ailus@iki.fi>");
 MODULE_DESCRIPTION("Generic SMIA/SMIA++ camera module driver");