diff options
author | Sakari Ailus <sakari.ailus@linux.intel.com> | 2020-02-05 15:21:06 +0100 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab+huawei@kernel.org> | 2020-12-02 15:28:20 +0100 |
commit | ab47d5cd825310478900b33d712a0e39bf3bb716 (patch) | |
tree | 1e56b805672b837ad7d75e9814a93311cb8f163c /drivers/media/i2c/smiapp | |
parent | 82731a194fc155eb734941bb1f777caea4077ffa (diff) | |
download | linux-ab47d5cd825310478900b33d712a0e39bf3bb716.tar.gz linux-ab47d5cd825310478900b33d712a0e39bf3bb716.tar.bz2 linux-ab47d5cd825310478900b33d712a0e39bf3bb716.zip |
media: smiapp: Calculate CCS limit offsets and limit buffer size
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>
Diffstat (limited to 'drivers/media/i2c/smiapp')
-rw-r--r-- | drivers/media/i2c/smiapp/Makefile | 2 | ||||
-rw-r--r-- | drivers/media/i2c/smiapp/smiapp-core.c | 40 |
2 files changed, 40 insertions, 2 deletions
diff --git a/drivers/media/i2c/smiapp/Makefile b/drivers/media/i2c/smiapp/Makefile index 86f57a43f8e8..efb643d2acac 100644 --- a/drivers/media/i2c/smiapp/Makefile +++ b/drivers/media/i2c/smiapp/Makefile @@ -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 diff --git a/drivers/media/i2c/smiapp/smiapp-core.c b/drivers/media/i2c/smiapp/smiapp-core.c index 105ef29152e8..75862e7647f8 100644 --- a/drivers/media/i2c/smiapp/smiapp-core.c +++ b/drivers/media/i2c/smiapp/smiapp-core.c @@ -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) \ @@ -34,6 +35,11 @@ ? 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"); |