From ab47d5cd825310478900b33d712a0e39bf3bb716 Mon Sep 17 00:00:00 2001 From: Sakari Ailus Date: Wed, 5 Feb 2020 15:21:06 +0100 Subject: 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 Signed-off-by: Mauro Carvalho Chehab --- drivers/media/i2c/smiapp/Makefile | 2 +- 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 #include +#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 "); MODULE_DESCRIPTION("Generic SMIA/SMIA++ camera module driver"); -- cgit v1.2.3