From: Prabhakar <prabhakar.csengg@gmail.com>
To: Mauro Carvalho Chehab <mchehab@kernel.org>,
Sakari Ailus <sakari.ailus@linux.intel.com>,
Hans Verkuil <hverkuil@kernel.org>,
Hans de Goede <johannes.goede@oss.qualcomm.com>,
Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>,
Mehdi Djait <mehdi.djait@linux.intel.com>,
Xiaolei Wang <xiaolei.wang@windriver.com>,
Benjamin Mugnier <benjamin.mugnier@foss.st.com>,
Sylvain Petinot <sylvain.petinot@foss.st.com>,
Hardevsinh Palaniya <hardevsinh.palaniya@siliconsignals.io>
Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-renesas-soc@vger.kernel.org,
Prabhakar <prabhakar.csengg@gmail.com>,
Biju Das <biju.das.jz@bp.renesas.com>,
Fabrizio Castro <fabrizio.castro.jz@renesas.com>,
Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Subject: [PATCH 2/2] media: i2c: ov5645: Convert to CCI register access helpers
Date: Thu, 26 Mar 2026 14:21:07 +0000 [thread overview]
Message-ID: <20260326142107.297811-3-prabhakar.mahadev-lad.rj@bp.renesas.com> (raw)
In-Reply-To: <20260326142107.297811-1-prabhakar.mahadev-lad.rj@bp.renesas.com>
From: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Convert the ov5645 driver to use the V4L2 CCI register access helpers
and regmap infrastructure instead of the custom I2C register access
implementation.
Keep ov5645_set_register_array() as ov5645_global_init_setting requires
a delay between specific register writes, which cannot be expressed
through the generic CCI multi-write helper.
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
---
drivers/media/i2c/Kconfig | 1 +
drivers/media/i2c/ov5645.c | 901 ++++++++++++++++++-------------------
2 files changed, 429 insertions(+), 473 deletions(-)
diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index 20482be35f26..921186d36589 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -526,6 +526,7 @@ config VIDEO_OV5640
tristate "OmniVision OV5640 sensor support"
depends on OF
depends on GPIOLIB
+ select V4L2_CCI_I2C
help
This is a Video4Linux2 sensor driver for the Omnivision
OV5640 camera sensor with a MIPI CSI-2 interface.
diff --git a/drivers/media/i2c/ov5645.c b/drivers/media/i2c/ov5645.c
index df9001fce44d..04097289e119 100644
--- a/drivers/media/i2c/ov5645.c
+++ b/drivers/media/i2c/ov5645.c
@@ -25,40 +25,42 @@
#include <linux/of.h>
#include <linux/of_graph.h>
#include <linux/pm_runtime.h>
+#include <linux/regmap.h>
#include <linux/regulator/consumer.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <media/mipi-csi2.h>
+#include <media/v4l2-cci.h>
#include <media/v4l2-ctrls.h>
#include <media/v4l2-fwnode.h>
#include <media/v4l2-subdev.h>
-#define OV5645_SYSTEM_CTRL0 0x3008
+#define OV5645_SYSTEM_CTRL0 CCI_REG8(0x3008)
#define OV5645_SYSTEM_CTRL0_START 0x02
#define OV5645_SYSTEM_CTRL0_STOP 0x42
-#define OV5645_CHIP_ID_HIGH 0x300a
+#define OV5645_CHIP_ID_HIGH CCI_REG8(0x300a)
#define OV5645_CHIP_ID_HIGH_BYTE 0x56
-#define OV5645_CHIP_ID_LOW 0x300b
+#define OV5645_CHIP_ID_LOW CCI_REG8(0x300b)
#define OV5645_CHIP_ID_LOW_BYTE 0x45
-#define OV5645_IO_MIPI_CTRL00 0x300e
-#define OV5645_PAD_OUTPUT00 0x3019
-#define OV5645_AWB_MANUAL_CONTROL 0x3406
+#define OV5645_IO_MIPI_CTRL00 CCI_REG8(0x300e)
+#define OV5645_PAD_OUTPUT00 CCI_REG8(0x3019)
+#define OV5645_AWB_MANUAL_CONTROL CCI_REG8(0x3406)
#define OV5645_AWB_MANUAL_ENABLE BIT(0)
-#define OV5645_AEC_PK_MANUAL 0x3503
+#define OV5645_AEC_PK_MANUAL CCI_REG8(0x3503)
#define OV5645_AEC_MANUAL_ENABLE BIT(0)
#define OV5645_AGC_MANUAL_ENABLE BIT(1)
-#define OV5645_TIMING_TC_REG20 0x3820
+#define OV5645_TIMING_TC_REG20 CCI_REG8(0x3820)
#define OV5645_SENSOR_VFLIP BIT(1)
#define OV5645_ISP_VFLIP BIT(2)
-#define OV5645_TIMING_TC_REG21 0x3821
+#define OV5645_TIMING_TC_REG21 CCI_REG8(0x3821)
#define OV5645_SENSOR_MIRROR BIT(1)
-#define OV5645_MIPI_CTRL00 0x4800
-#define OV5645_PRE_ISP_TEST_SETTING_1 0x503d
+#define OV5645_MIPI_CTRL00 CCI_REG8(0x4800)
+#define OV5645_PRE_ISP_TEST_SETTING_1 CCI_REG8(0x503d)
#define OV5645_TEST_PATTERN_MASK 0x3
#define OV5645_SET_TEST_PATTERN(x) ((x) & OV5645_TEST_PATTERN_MASK)
#define OV5645_TEST_PATTERN_ENABLE BIT(7)
-#define OV5645_SDE_SAT_U 0x5583
-#define OV5645_SDE_SAT_V 0x5584
+#define OV5645_SDE_SAT_U CCI_REG8(0x5583)
+#define OV5645_SDE_SAT_V CCI_REG8(0x5584)
/* regulator supplies */
static const char * const ov5645_supply_name[] = {
@@ -71,15 +73,10 @@ static const char * const ov5645_supply_name[] = {
#define OV5645_PAD_SOURCE 0
-struct reg_value {
- u16 reg;
- u8 val;
-};
-
struct ov5645_mode_info {
u32 width;
u32 height;
- const struct reg_value *data;
+ const struct cci_reg_sequence *data;
u32 data_size;
u32 pixel_clock;
u32 link_freq;
@@ -88,6 +85,7 @@ struct ov5645_mode_info {
struct ov5645 {
struct i2c_client *i2c_client;
struct device *dev;
+ struct regmap *regmap;
struct v4l2_subdev sd;
struct media_pad pad;
struct v4l2_fwnode_endpoint ep;
@@ -103,9 +101,9 @@ struct ov5645 {
struct v4l2_ctrl *link_freq;
/* Cached register values */
- u8 aec_pk_manual;
- u8 timing_tc_reg20;
- u8 timing_tc_reg21;
+ u64 aec_pk_manual;
+ u64 timing_tc_reg20;
+ u64 timing_tc_reg21;
struct gpio_desc *enable_gpio;
struct gpio_desc *rst_gpio;
@@ -116,393 +114,393 @@ static inline struct ov5645 *to_ov5645(struct v4l2_subdev *sd)
return container_of(sd, struct ov5645, sd);
}
-static const struct reg_value ov5645_global_init_setting[] = {
- { 0x3103, 0x11 },
- { 0x3008, 0x42 },
- { 0x3103, 0x03 },
- { 0x3503, 0x07 },
- { 0x3002, 0x1c },
- { 0x3006, 0xc3 },
- { 0x3017, 0x00 },
- { 0x3018, 0x00 },
- { 0x302e, 0x0b },
- { 0x3037, 0x13 },
- { 0x3108, 0x01 },
- { 0x3611, 0x06 },
- { 0x3500, 0x00 },
- { 0x3501, 0x01 },
- { 0x3502, 0x00 },
- { 0x350a, 0x00 },
- { 0x350b, 0x3f },
- { 0x3620, 0x33 },
- { 0x3621, 0xe0 },
- { 0x3622, 0x01 },
- { 0x3630, 0x2e },
- { 0x3631, 0x00 },
- { 0x3632, 0x32 },
- { 0x3633, 0x52 },
- { 0x3634, 0x70 },
- { 0x3635, 0x13 },
- { 0x3636, 0x03 },
- { 0x3703, 0x5a },
- { 0x3704, 0xa0 },
- { 0x3705, 0x1a },
- { 0x3709, 0x12 },
- { 0x370b, 0x61 },
- { 0x370f, 0x10 },
- { 0x3715, 0x78 },
- { 0x3717, 0x01 },
- { 0x371b, 0x20 },
- { 0x3731, 0x12 },
- { 0x3901, 0x0a },
- { 0x3905, 0x02 },
- { 0x3906, 0x10 },
- { 0x3719, 0x86 },
- { 0x3810, 0x00 },
- { 0x3811, 0x10 },
- { 0x3812, 0x00 },
- { 0x3821, 0x01 },
- { 0x3824, 0x01 },
- { 0x3826, 0x03 },
- { 0x3828, 0x08 },
- { 0x3a19, 0xf8 },
- { 0x3c01, 0x34 },
- { 0x3c04, 0x28 },
- { 0x3c05, 0x98 },
- { 0x3c07, 0x07 },
- { 0x3c09, 0xc2 },
- { 0x3c0a, 0x9c },
- { 0x3c0b, 0x40 },
- { 0x3c01, 0x34 },
- { 0x4001, 0x02 },
- { 0x4514, 0x00 },
- { 0x4520, 0xb0 },
- { 0x460b, 0x37 },
- { 0x460c, 0x20 },
- { 0x4818, 0x01 },
- { 0x481d, 0xf0 },
- { 0x481f, 0x50 },
- { 0x4823, 0x70 },
- { 0x4831, 0x14 },
- { 0x5000, 0xa7 },
- { 0x5001, 0x83 },
- { 0x501d, 0x00 },
- { 0x501f, 0x00 },
- { 0x503d, 0x00 },
- { 0x505c, 0x30 },
- { 0x5181, 0x59 },
- { 0x5183, 0x00 },
- { 0x5191, 0xf0 },
- { 0x5192, 0x03 },
- { 0x5684, 0x10 },
- { 0x5685, 0xa0 },
- { 0x5686, 0x0c },
- { 0x5687, 0x78 },
- { 0x5a00, 0x08 },
- { 0x5a21, 0x00 },
- { 0x5a24, 0x00 },
- { 0x3008, 0x02 },
- { 0x3503, 0x00 },
- { 0x5180, 0xff },
- { 0x5181, 0xf2 },
- { 0x5182, 0x00 },
- { 0x5183, 0x14 },
- { 0x5184, 0x25 },
- { 0x5185, 0x24 },
- { 0x5186, 0x09 },
- { 0x5187, 0x09 },
- { 0x5188, 0x0a },
- { 0x5189, 0x75 },
- { 0x518a, 0x52 },
- { 0x518b, 0xea },
- { 0x518c, 0xa8 },
- { 0x518d, 0x42 },
- { 0x518e, 0x38 },
- { 0x518f, 0x56 },
- { 0x5190, 0x42 },
- { 0x5191, 0xf8 },
- { 0x5192, 0x04 },
- { 0x5193, 0x70 },
- { 0x5194, 0xf0 },
- { 0x5195, 0xf0 },
- { 0x5196, 0x03 },
- { 0x5197, 0x01 },
- { 0x5198, 0x04 },
- { 0x5199, 0x12 },
- { 0x519a, 0x04 },
- { 0x519b, 0x00 },
- { 0x519c, 0x06 },
- { 0x519d, 0x82 },
- { 0x519e, 0x38 },
- { 0x5381, 0x1e },
- { 0x5382, 0x5b },
- { 0x5383, 0x08 },
- { 0x5384, 0x0a },
- { 0x5385, 0x7e },
- { 0x5386, 0x88 },
- { 0x5387, 0x7c },
- { 0x5388, 0x6c },
- { 0x5389, 0x10 },
- { 0x538a, 0x01 },
- { 0x538b, 0x98 },
- { 0x5300, 0x08 },
- { 0x5301, 0x30 },
- { 0x5302, 0x10 },
- { 0x5303, 0x00 },
- { 0x5304, 0x08 },
- { 0x5305, 0x30 },
- { 0x5306, 0x08 },
- { 0x5307, 0x16 },
- { 0x5309, 0x08 },
- { 0x530a, 0x30 },
- { 0x530b, 0x04 },
- { 0x530c, 0x06 },
- { 0x5480, 0x01 },
- { 0x5481, 0x08 },
- { 0x5482, 0x14 },
- { 0x5483, 0x28 },
- { 0x5484, 0x51 },
- { 0x5485, 0x65 },
- { 0x5486, 0x71 },
- { 0x5487, 0x7d },
- { 0x5488, 0x87 },
- { 0x5489, 0x91 },
- { 0x548a, 0x9a },
- { 0x548b, 0xaa },
- { 0x548c, 0xb8 },
- { 0x548d, 0xcd },
- { 0x548e, 0xdd },
- { 0x548f, 0xea },
- { 0x5490, 0x1d },
- { 0x5580, 0x02 },
- { 0x5583, 0x40 },
- { 0x5584, 0x10 },
- { 0x5589, 0x10 },
- { 0x558a, 0x00 },
- { 0x558b, 0xf8 },
- { 0x5800, 0x3f },
- { 0x5801, 0x16 },
- { 0x5802, 0x0e },
- { 0x5803, 0x0d },
- { 0x5804, 0x17 },
- { 0x5805, 0x3f },
- { 0x5806, 0x0b },
- { 0x5807, 0x06 },
- { 0x5808, 0x04 },
- { 0x5809, 0x04 },
- { 0x580a, 0x06 },
- { 0x580b, 0x0b },
- { 0x580c, 0x09 },
- { 0x580d, 0x03 },
- { 0x580e, 0x00 },
- { 0x580f, 0x00 },
- { 0x5810, 0x03 },
- { 0x5811, 0x08 },
- { 0x5812, 0x0a },
- { 0x5813, 0x03 },
- { 0x5814, 0x00 },
- { 0x5815, 0x00 },
- { 0x5816, 0x04 },
- { 0x5817, 0x09 },
- { 0x5818, 0x0f },
- { 0x5819, 0x08 },
- { 0x581a, 0x06 },
- { 0x581b, 0x06 },
- { 0x581c, 0x08 },
- { 0x581d, 0x0c },
- { 0x581e, 0x3f },
- { 0x581f, 0x1e },
- { 0x5820, 0x12 },
- { 0x5821, 0x13 },
- { 0x5822, 0x21 },
- { 0x5823, 0x3f },
- { 0x5824, 0x68 },
- { 0x5825, 0x28 },
- { 0x5826, 0x2c },
- { 0x5827, 0x28 },
- { 0x5828, 0x08 },
- { 0x5829, 0x48 },
- { 0x582a, 0x64 },
- { 0x582b, 0x62 },
- { 0x582c, 0x64 },
- { 0x582d, 0x28 },
- { 0x582e, 0x46 },
- { 0x582f, 0x62 },
- { 0x5830, 0x60 },
- { 0x5831, 0x62 },
- { 0x5832, 0x26 },
- { 0x5833, 0x48 },
- { 0x5834, 0x66 },
- { 0x5835, 0x44 },
- { 0x5836, 0x64 },
- { 0x5837, 0x28 },
- { 0x5838, 0x66 },
- { 0x5839, 0x48 },
- { 0x583a, 0x2c },
- { 0x583b, 0x28 },
- { 0x583c, 0x26 },
- { 0x583d, 0xae },
- { 0x5025, 0x00 },
- { 0x3a0f, 0x30 },
- { 0x3a10, 0x28 },
- { 0x3a1b, 0x30 },
- { 0x3a1e, 0x26 },
- { 0x3a11, 0x60 },
- { 0x3a1f, 0x14 },
- { 0x0601, 0x02 },
- { 0x3008, 0x42 },
- { 0x3008, 0x02 },
+static const struct cci_reg_sequence ov5645_global_init_setting[] = {
+ { CCI_REG8(0x3103), 0x11 },
+ { CCI_REG8(0x3008), 0x42 },
+ { CCI_REG8(0x3103), 0x03 },
+ { CCI_REG8(0x3503), 0x07 },
+ { CCI_REG8(0x3002), 0x1c },
+ { CCI_REG8(0x3006), 0xc3 },
+ { CCI_REG8(0x3017), 0x00 },
+ { CCI_REG8(0x3018), 0x00 },
+ { CCI_REG8(0x302e), 0x0b },
+ { CCI_REG8(0x3037), 0x13 },
+ { CCI_REG8(0x3108), 0x01 },
+ { CCI_REG8(0x3611), 0x06 },
+ { CCI_REG8(0x3500), 0x00 },
+ { CCI_REG8(0x3501), 0x01 },
+ { CCI_REG8(0x3502), 0x00 },
+ { CCI_REG8(0x350a), 0x00 },
+ { CCI_REG8(0x350b), 0x3f },
+ { CCI_REG8(0x3620), 0x33 },
+ { CCI_REG8(0x3621), 0xe0 },
+ { CCI_REG8(0x3622), 0x01 },
+ { CCI_REG8(0x3630), 0x2e },
+ { CCI_REG8(0x3631), 0x00 },
+ { CCI_REG8(0x3632), 0x32 },
+ { CCI_REG8(0x3633), 0x52 },
+ { CCI_REG8(0x3634), 0x70 },
+ { CCI_REG8(0x3635), 0x13 },
+ { CCI_REG8(0x3636), 0x03 },
+ { CCI_REG8(0x3703), 0x5a },
+ { CCI_REG8(0x3704), 0xa0 },
+ { CCI_REG8(0x3705), 0x1a },
+ { CCI_REG8(0x3709), 0x12 },
+ { CCI_REG8(0x370b), 0x61 },
+ { CCI_REG8(0x370f), 0x10 },
+ { CCI_REG8(0x3715), 0x78 },
+ { CCI_REG8(0x3717), 0x01 },
+ { CCI_REG8(0x371b), 0x20 },
+ { CCI_REG8(0x3731), 0x12 },
+ { CCI_REG8(0x3901), 0x0a },
+ { CCI_REG8(0x3905), 0x02 },
+ { CCI_REG8(0x3906), 0x10 },
+ { CCI_REG8(0x3719), 0x86 },
+ { CCI_REG8(0x3810), 0x00 },
+ { CCI_REG8(0x3811), 0x10 },
+ { CCI_REG8(0x3812), 0x00 },
+ { CCI_REG8(0x3821), 0x01 },
+ { CCI_REG8(0x3824), 0x01 },
+ { CCI_REG8(0x3826), 0x03 },
+ { CCI_REG8(0x3828), 0x08 },
+ { CCI_REG8(0x3a19), 0xf8 },
+ { CCI_REG8(0x3c01), 0x34 },
+ { CCI_REG8(0x3c04), 0x28 },
+ { CCI_REG8(0x3c05), 0x98 },
+ { CCI_REG8(0x3c07), 0x07 },
+ { CCI_REG8(0x3c09), 0xc2 },
+ { CCI_REG8(0x3c0a), 0x9c },
+ { CCI_REG8(0x3c0b), 0x40 },
+ { CCI_REG8(0x3c01), 0x34 },
+ { CCI_REG8(0x4001), 0x02 },
+ { CCI_REG8(0x4514), 0x00 },
+ { CCI_REG8(0x4520), 0xb0 },
+ { CCI_REG8(0x460b), 0x37 },
+ { CCI_REG8(0x460c), 0x20 },
+ { CCI_REG8(0x4818), 0x01 },
+ { CCI_REG8(0x481d), 0xf0 },
+ { CCI_REG8(0x481f), 0x50 },
+ { CCI_REG8(0x4823), 0x70 },
+ { CCI_REG8(0x4831), 0x14 },
+ { CCI_REG8(0x5000), 0xa7 },
+ { CCI_REG8(0x5001), 0x83 },
+ { CCI_REG8(0x501d), 0x00 },
+ { CCI_REG8(0x501f), 0x00 },
+ { CCI_REG8(0x503d), 0x00 },
+ { CCI_REG8(0x505c), 0x30 },
+ { CCI_REG8(0x5181), 0x59 },
+ { CCI_REG8(0x5183), 0x00 },
+ { CCI_REG8(0x5191), 0xf0 },
+ { CCI_REG8(0x5192), 0x03 },
+ { CCI_REG8(0x5684), 0x10 },
+ { CCI_REG8(0x5685), 0xa0 },
+ { CCI_REG8(0x5686), 0x0c },
+ { CCI_REG8(0x5687), 0x78 },
+ { CCI_REG8(0x5a00), 0x08 },
+ { CCI_REG8(0x5a21), 0x00 },
+ { CCI_REG8(0x5a24), 0x00 },
+ { CCI_REG8(0x3008), 0x02 },
+ { CCI_REG8(0x3503), 0x00 },
+ { CCI_REG8(0x5180), 0xff },
+ { CCI_REG8(0x5181), 0xf2 },
+ { CCI_REG8(0x5182), 0x00 },
+ { CCI_REG8(0x5183), 0x14 },
+ { CCI_REG8(0x5184), 0x25 },
+ { CCI_REG8(0x5185), 0x24 },
+ { CCI_REG8(0x5186), 0x09 },
+ { CCI_REG8(0x5187), 0x09 },
+ { CCI_REG8(0x5188), 0x0a },
+ { CCI_REG8(0x5189), 0x75 },
+ { CCI_REG8(0x518a), 0x52 },
+ { CCI_REG8(0x518b), 0xea },
+ { CCI_REG8(0x518c), 0xa8 },
+ { CCI_REG8(0x518d), 0x42 },
+ { CCI_REG8(0x518e), 0x38 },
+ { CCI_REG8(0x518f), 0x56 },
+ { CCI_REG8(0x5190), 0x42 },
+ { CCI_REG8(0x5191), 0xf8 },
+ { CCI_REG8(0x5192), 0x04 },
+ { CCI_REG8(0x5193), 0x70 },
+ { CCI_REG8(0x5194), 0xf0 },
+ { CCI_REG8(0x5195), 0xf0 },
+ { CCI_REG8(0x5196), 0x03 },
+ { CCI_REG8(0x5197), 0x01 },
+ { CCI_REG8(0x5198), 0x04 },
+ { CCI_REG8(0x5199), 0x12 },
+ { CCI_REG8(0x519a), 0x04 },
+ { CCI_REG8(0x519b), 0x00 },
+ { CCI_REG8(0x519c), 0x06 },
+ { CCI_REG8(0x519d), 0x82 },
+ { CCI_REG8(0x519e), 0x38 },
+ { CCI_REG8(0x5381), 0x1e },
+ { CCI_REG8(0x5382), 0x5b },
+ { CCI_REG8(0x5383), 0x08 },
+ { CCI_REG8(0x5384), 0x0a },
+ { CCI_REG8(0x5385), 0x7e },
+ { CCI_REG8(0x5386), 0x88 },
+ { CCI_REG8(0x5387), 0x7c },
+ { CCI_REG8(0x5388), 0x6c },
+ { CCI_REG8(0x5389), 0x10 },
+ { CCI_REG8(0x538a), 0x01 },
+ { CCI_REG8(0x538b), 0x98 },
+ { CCI_REG8(0x5300), 0x08 },
+ { CCI_REG8(0x5301), 0x30 },
+ { CCI_REG8(0x5302), 0x10 },
+ { CCI_REG8(0x5303), 0x00 },
+ { CCI_REG8(0x5304), 0x08 },
+ { CCI_REG8(0x5305), 0x30 },
+ { CCI_REG8(0x5306), 0x08 },
+ { CCI_REG8(0x5307), 0x16 },
+ { CCI_REG8(0x5309), 0x08 },
+ { CCI_REG8(0x530a), 0x30 },
+ { CCI_REG8(0x530b), 0x04 },
+ { CCI_REG8(0x530c), 0x06 },
+ { CCI_REG8(0x5480), 0x01 },
+ { CCI_REG8(0x5481), 0x08 },
+ { CCI_REG8(0x5482), 0x14 },
+ { CCI_REG8(0x5483), 0x28 },
+ { CCI_REG8(0x5484), 0x51 },
+ { CCI_REG8(0x5485), 0x65 },
+ { CCI_REG8(0x5486), 0x71 },
+ { CCI_REG8(0x5487), 0x7d },
+ { CCI_REG8(0x5488), 0x87 },
+ { CCI_REG8(0x5489), 0x91 },
+ { CCI_REG8(0x548a), 0x9a },
+ { CCI_REG8(0x548b), 0xaa },
+ { CCI_REG8(0x548c), 0xb8 },
+ { CCI_REG8(0x548d), 0xcd },
+ { CCI_REG8(0x548e), 0xdd },
+ { CCI_REG8(0x548f), 0xea },
+ { CCI_REG8(0x5490), 0x1d },
+ { CCI_REG8(0x5580), 0x02 },
+ { CCI_REG8(0x5583), 0x40 },
+ { CCI_REG8(0x5584), 0x10 },
+ { CCI_REG8(0x5589), 0x10 },
+ { CCI_REG8(0x558a), 0x00 },
+ { CCI_REG8(0x558b), 0xf8 },
+ { CCI_REG8(0x5800), 0x3f },
+ { CCI_REG8(0x5801), 0x16 },
+ { CCI_REG8(0x5802), 0x0e },
+ { CCI_REG8(0x5803), 0x0d },
+ { CCI_REG8(0x5804), 0x17 },
+ { CCI_REG8(0x5805), 0x3f },
+ { CCI_REG8(0x5806), 0x0b },
+ { CCI_REG8(0x5807), 0x06 },
+ { CCI_REG8(0x5808), 0x04 },
+ { CCI_REG8(0x5809), 0x04 },
+ { CCI_REG8(0x580a), 0x06 },
+ { CCI_REG8(0x580b), 0x0b },
+ { CCI_REG8(0x580c), 0x09 },
+ { CCI_REG8(0x580d), 0x03 },
+ { CCI_REG8(0x580e), 0x00 },
+ { CCI_REG8(0x580f), 0x00 },
+ { CCI_REG8(0x5810), 0x03 },
+ { CCI_REG8(0x5811), 0x08 },
+ { CCI_REG8(0x5812), 0x0a },
+ { CCI_REG8(0x5813), 0x03 },
+ { CCI_REG8(0x5814), 0x00 },
+ { CCI_REG8(0x5815), 0x00 },
+ { CCI_REG8(0x5816), 0x04 },
+ { CCI_REG8(0x5817), 0x09 },
+ { CCI_REG8(0x5818), 0x0f },
+ { CCI_REG8(0x5819), 0x08 },
+ { CCI_REG8(0x581a), 0x06 },
+ { CCI_REG8(0x581b), 0x06 },
+ { CCI_REG8(0x581c), 0x08 },
+ { CCI_REG8(0x581d), 0x0c },
+ { CCI_REG8(0x581e), 0x3f },
+ { CCI_REG8(0x581f), 0x1e },
+ { CCI_REG8(0x5820), 0x12 },
+ { CCI_REG8(0x5821), 0x13 },
+ { CCI_REG8(0x5822), 0x21 },
+ { CCI_REG8(0x5823), 0x3f },
+ { CCI_REG8(0x5824), 0x68 },
+ { CCI_REG8(0x5825), 0x28 },
+ { CCI_REG8(0x5826), 0x2c },
+ { CCI_REG8(0x5827), 0x28 },
+ { CCI_REG8(0x5828), 0x08 },
+ { CCI_REG8(0x5829), 0x48 },
+ { CCI_REG8(0x582a), 0x64 },
+ { CCI_REG8(0x582b), 0x62 },
+ { CCI_REG8(0x582c), 0x64 },
+ { CCI_REG8(0x582d), 0x28 },
+ { CCI_REG8(0x582e), 0x46 },
+ { CCI_REG8(0x582f), 0x62 },
+ { CCI_REG8(0x5830), 0x60 },
+ { CCI_REG8(0x5831), 0x62 },
+ { CCI_REG8(0x5832), 0x26 },
+ { CCI_REG8(0x5833), 0x48 },
+ { CCI_REG8(0x5834), 0x66 },
+ { CCI_REG8(0x5835), 0x44 },
+ { CCI_REG8(0x5836), 0x64 },
+ { CCI_REG8(0x5837), 0x28 },
+ { CCI_REG8(0x5838), 0x66 },
+ { CCI_REG8(0x5839), 0x48 },
+ { CCI_REG8(0x583a), 0x2c },
+ { CCI_REG8(0x583b), 0x28 },
+ { CCI_REG8(0x583c), 0x26 },
+ { CCI_REG8(0x583d), 0xae },
+ { CCI_REG8(0x5025), 0x00 },
+ { CCI_REG8(0x3a0f), 0x30 },
+ { CCI_REG8(0x3a10), 0x28 },
+ { CCI_REG8(0x3a1b), 0x30 },
+ { CCI_REG8(0x3a1e), 0x26 },
+ { CCI_REG8(0x3a11), 0x60 },
+ { CCI_REG8(0x3a1f), 0x14 },
+ { CCI_REG8(0x0601), 0x02 },
+ { CCI_REG8(0x3008), 0x42 },
+ { CCI_REG8(0x3008), 0x02 },
{ OV5645_IO_MIPI_CTRL00, 0x40 },
{ OV5645_MIPI_CTRL00, 0x24 },
{ OV5645_PAD_OUTPUT00, 0x70 }
};
-static const struct reg_value ov5645_setting_sxga[] = {
- { 0x3612, 0xa9 },
- { 0x3614, 0x50 },
- { 0x3618, 0x00 },
- { 0x3034, 0x18 },
- { 0x3035, 0x21 },
- { 0x3036, 0x70 },
- { 0x3600, 0x09 },
- { 0x3601, 0x43 },
- { 0x3708, 0x66 },
- { 0x370c, 0xc3 },
- { 0x3800, 0x00 },
- { 0x3801, 0x00 },
- { 0x3802, 0x00 },
- { 0x3803, 0x06 },
- { 0x3804, 0x0a },
- { 0x3805, 0x3f },
- { 0x3806, 0x07 },
- { 0x3807, 0x9d },
- { 0x3808, 0x05 },
- { 0x3809, 0x00 },
- { 0x380a, 0x03 },
- { 0x380b, 0xc0 },
- { 0x380c, 0x07 },
- { 0x380d, 0x68 },
- { 0x380e, 0x03 },
- { 0x380f, 0xd8 },
- { 0x3813, 0x06 },
- { 0x3814, 0x31 },
- { 0x3815, 0x31 },
- { 0x3820, 0x47 },
- { 0x3a02, 0x03 },
- { 0x3a03, 0xd8 },
- { 0x3a08, 0x01 },
- { 0x3a09, 0xf8 },
- { 0x3a0a, 0x01 },
- { 0x3a0b, 0xa4 },
- { 0x3a0e, 0x02 },
- { 0x3a0d, 0x02 },
- { 0x3a14, 0x03 },
- { 0x3a15, 0xd8 },
- { 0x3a18, 0x00 },
- { 0x4004, 0x02 },
- { 0x4005, 0x18 },
- { 0x4300, 0x32 },
- { 0x4202, 0x00 }
+static const struct cci_reg_sequence ov5645_setting_sxga[] = {
+ { CCI_REG8(0x3612), 0xa9 },
+ { CCI_REG8(0x3614), 0x50 },
+ { CCI_REG8(0x3618), 0x00 },
+ { CCI_REG8(0x3034), 0x18 },
+ { CCI_REG8(0x3035), 0x21 },
+ { CCI_REG8(0x3036), 0x70 },
+ { CCI_REG8(0x3600), 0x09 },
+ { CCI_REG8(0x3601), 0x43 },
+ { CCI_REG8(0x3708), 0x66 },
+ { CCI_REG8(0x370c), 0xc3 },
+ { CCI_REG8(0x3800), 0x00 },
+ { CCI_REG8(0x3801), 0x00 },
+ { CCI_REG8(0x3802), 0x00 },
+ { CCI_REG8(0x3803), 0x06 },
+ { CCI_REG8(0x3804), 0x0a },
+ { CCI_REG8(0x3805), 0x3f },
+ { CCI_REG8(0x3806), 0x07 },
+ { CCI_REG8(0x3807), 0x9d },
+ { CCI_REG8(0x3808), 0x05 },
+ { CCI_REG8(0x3809), 0x00 },
+ { CCI_REG8(0x380a), 0x03 },
+ { CCI_REG8(0x380b), 0xc0 },
+ { CCI_REG8(0x380c), 0x07 },
+ { CCI_REG8(0x380d), 0x68 },
+ { CCI_REG8(0x380e), 0x03 },
+ { CCI_REG8(0x380f), 0xd8 },
+ { CCI_REG8(0x3813), 0x06 },
+ { CCI_REG8(0x3814), 0x31 },
+ { CCI_REG8(0x3815), 0x31 },
+ { CCI_REG8(0x3820), 0x47 },
+ { CCI_REG8(0x3a02), 0x03 },
+ { CCI_REG8(0x3a03), 0xd8 },
+ { CCI_REG8(0x3a08), 0x01 },
+ { CCI_REG8(0x3a09), 0xf8 },
+ { CCI_REG8(0x3a0a), 0x01 },
+ { CCI_REG8(0x3a0b), 0xa4 },
+ { CCI_REG8(0x3a0e), 0x02 },
+ { CCI_REG8(0x3a0d), 0x02 },
+ { CCI_REG8(0x3a14), 0x03 },
+ { CCI_REG8(0x3a15), 0xd8 },
+ { CCI_REG8(0x3a18), 0x00 },
+ { CCI_REG8(0x4004), 0x02 },
+ { CCI_REG8(0x4005), 0x18 },
+ { CCI_REG8(0x4300), 0x32 },
+ { CCI_REG8(0x4202), 0x00 }
};
-static const struct reg_value ov5645_setting_1080p[] = {
- { 0x3612, 0xab },
- { 0x3614, 0x50 },
- { 0x3618, 0x04 },
- { 0x3034, 0x18 },
- { 0x3035, 0x11 },
- { 0x3036, 0x54 },
- { 0x3600, 0x08 },
- { 0x3601, 0x33 },
- { 0x3708, 0x63 },
- { 0x370c, 0xc0 },
- { 0x3800, 0x01 },
- { 0x3801, 0x50 },
- { 0x3802, 0x01 },
- { 0x3803, 0xb2 },
- { 0x3804, 0x08 },
- { 0x3805, 0xef },
- { 0x3806, 0x05 },
- { 0x3807, 0xf1 },
- { 0x3808, 0x07 },
- { 0x3809, 0x80 },
- { 0x380a, 0x04 },
- { 0x380b, 0x38 },
- { 0x380c, 0x09 },
- { 0x380d, 0xc4 },
- { 0x380e, 0x04 },
- { 0x380f, 0x60 },
- { 0x3813, 0x04 },
- { 0x3814, 0x11 },
- { 0x3815, 0x11 },
- { 0x3820, 0x47 },
- { 0x4514, 0x88 },
- { 0x3a02, 0x04 },
- { 0x3a03, 0x60 },
- { 0x3a08, 0x01 },
- { 0x3a09, 0x50 },
- { 0x3a0a, 0x01 },
- { 0x3a0b, 0x18 },
- { 0x3a0e, 0x03 },
- { 0x3a0d, 0x04 },
- { 0x3a14, 0x04 },
- { 0x3a15, 0x60 },
- { 0x3a18, 0x00 },
- { 0x4004, 0x06 },
- { 0x4005, 0x18 },
- { 0x4300, 0x32 },
- { 0x4202, 0x00 },
- { 0x4837, 0x0b }
+static const struct cci_reg_sequence ov5645_setting_1080p[] = {
+ { CCI_REG8(0x3612), 0xab },
+ { CCI_REG8(0x3614), 0x50 },
+ { CCI_REG8(0x3618), 0x04 },
+ { CCI_REG8(0x3034), 0x18 },
+ { CCI_REG8(0x3035), 0x11 },
+ { CCI_REG8(0x3036), 0x54 },
+ { CCI_REG8(0x3600), 0x08 },
+ { CCI_REG8(0x3601), 0x33 },
+ { CCI_REG8(0x3708), 0x63 },
+ { CCI_REG8(0x370c), 0xc0 },
+ { CCI_REG8(0x3800), 0x01 },
+ { CCI_REG8(0x3801), 0x50 },
+ { CCI_REG8(0x3802), 0x01 },
+ { CCI_REG8(0x3803), 0xb2 },
+ { CCI_REG8(0x3804), 0x08 },
+ { CCI_REG8(0x3805), 0xef },
+ { CCI_REG8(0x3806), 0x05 },
+ { CCI_REG8(0x3807), 0xf1 },
+ { CCI_REG8(0x3808), 0x07 },
+ { CCI_REG8(0x3809), 0x80 },
+ { CCI_REG8(0x380a), 0x04 },
+ { CCI_REG8(0x380b), 0x38 },
+ { CCI_REG8(0x380c), 0x09 },
+ { CCI_REG8(0x380d), 0xc4 },
+ { CCI_REG8(0x380e), 0x04 },
+ { CCI_REG8(0x380f), 0x60 },
+ { CCI_REG8(0x3813), 0x04 },
+ { CCI_REG8(0x3814), 0x11 },
+ { CCI_REG8(0x3815), 0x11 },
+ { CCI_REG8(0x3820), 0x47 },
+ { CCI_REG8(0x4514), 0x88 },
+ { CCI_REG8(0x3a02), 0x04 },
+ { CCI_REG8(0x3a03), 0x60 },
+ { CCI_REG8(0x3a08), 0x01 },
+ { CCI_REG8(0x3a09), 0x50 },
+ { CCI_REG8(0x3a0a), 0x01 },
+ { CCI_REG8(0x3a0b), 0x18 },
+ { CCI_REG8(0x3a0e), 0x03 },
+ { CCI_REG8(0x3a0d), 0x04 },
+ { CCI_REG8(0x3a14), 0x04 },
+ { CCI_REG8(0x3a15), 0x60 },
+ { CCI_REG8(0x3a18), 0x00 },
+ { CCI_REG8(0x4004), 0x06 },
+ { CCI_REG8(0x4005), 0x18 },
+ { CCI_REG8(0x4300), 0x32 },
+ { CCI_REG8(0x4202), 0x00 },
+ { CCI_REG8(0x4837), 0x0b }
};
-static const struct reg_value ov5645_setting_full[] = {
- { 0x3612, 0xab },
- { 0x3614, 0x50 },
- { 0x3618, 0x04 },
- { 0x3034, 0x18 },
- { 0x3035, 0x11 },
- { 0x3036, 0x54 },
- { 0x3600, 0x08 },
- { 0x3601, 0x33 },
- { 0x3708, 0x63 },
- { 0x370c, 0xc0 },
- { 0x3800, 0x00 },
- { 0x3801, 0x00 },
- { 0x3802, 0x00 },
- { 0x3803, 0x00 },
- { 0x3804, 0x0a },
- { 0x3805, 0x3f },
- { 0x3806, 0x07 },
- { 0x3807, 0x9f },
- { 0x3808, 0x0a },
- { 0x3809, 0x20 },
- { 0x380a, 0x07 },
- { 0x380b, 0x98 },
- { 0x380c, 0x0b },
- { 0x380d, 0x1c },
- { 0x380e, 0x07 },
- { 0x380f, 0xb0 },
- { 0x3813, 0x06 },
- { 0x3814, 0x11 },
- { 0x3815, 0x11 },
- { 0x3820, 0x47 },
- { 0x4514, 0x88 },
- { 0x3a02, 0x07 },
- { 0x3a03, 0xb0 },
- { 0x3a08, 0x01 },
- { 0x3a09, 0x27 },
- { 0x3a0a, 0x00 },
- { 0x3a0b, 0xf6 },
- { 0x3a0e, 0x06 },
- { 0x3a0d, 0x08 },
- { 0x3a14, 0x07 },
- { 0x3a15, 0xb0 },
- { 0x3a18, 0x01 },
- { 0x4004, 0x06 },
- { 0x4005, 0x18 },
- { 0x4300, 0x32 },
- { 0x4837, 0x0b },
- { 0x4202, 0x00 }
+static const struct cci_reg_sequence ov5645_setting_full[] = {
+ { CCI_REG8(0x3612), 0xab },
+ { CCI_REG8(0x3614), 0x50 },
+ { CCI_REG8(0x3618), 0x04 },
+ { CCI_REG8(0x3034), 0x18 },
+ { CCI_REG8(0x3035), 0x11 },
+ { CCI_REG8(0x3036), 0x54 },
+ { CCI_REG8(0x3600), 0x08 },
+ { CCI_REG8(0x3601), 0x33 },
+ { CCI_REG8(0x3708), 0x63 },
+ { CCI_REG8(0x370c), 0xc0 },
+ { CCI_REG8(0x3800), 0x00 },
+ { CCI_REG8(0x3801), 0x00 },
+ { CCI_REG8(0x3802), 0x00 },
+ { CCI_REG8(0x3803), 0x00 },
+ { CCI_REG8(0x3804), 0x0a },
+ { CCI_REG8(0x3805), 0x3f },
+ { CCI_REG8(0x3806), 0x07 },
+ { CCI_REG8(0x3807), 0x9f },
+ { CCI_REG8(0x3808), 0x0a },
+ { CCI_REG8(0x3809), 0x20 },
+ { CCI_REG8(0x380a), 0x07 },
+ { CCI_REG8(0x380b), 0x98 },
+ { CCI_REG8(0x380c), 0x0b },
+ { CCI_REG8(0x380d), 0x1c },
+ { CCI_REG8(0x380e), 0x07 },
+ { CCI_REG8(0x380f), 0xb0 },
+ { CCI_REG8(0x3813), 0x06 },
+ { CCI_REG8(0x3814), 0x11 },
+ { CCI_REG8(0x3815), 0x11 },
+ { CCI_REG8(0x3820), 0x47 },
+ { CCI_REG8(0x4514), 0x88 },
+ { CCI_REG8(0x3a02), 0x07 },
+ { CCI_REG8(0x3a03), 0xb0 },
+ { CCI_REG8(0x3a08), 0x01 },
+ { CCI_REG8(0x3a09), 0x27 },
+ { CCI_REG8(0x3a0a), 0x00 },
+ { CCI_REG8(0x3a0b), 0xf6 },
+ { CCI_REG8(0x3a0e), 0x06 },
+ { CCI_REG8(0x3a0d), 0x08 },
+ { CCI_REG8(0x3a14), 0x07 },
+ { CCI_REG8(0x3a15), 0xb0 },
+ { CCI_REG8(0x3a18), 0x01 },
+ { CCI_REG8(0x4004), 0x06 },
+ { CCI_REG8(0x4005), 0x18 },
+ { CCI_REG8(0x4300), 0x32 },
+ { CCI_REG8(0x4837), 0x0b },
+ { CCI_REG8(0x4202), 0x00 }
};
static const s64 link_freq[] = {
@@ -537,50 +535,6 @@ static const struct ov5645_mode_info ov5645_mode_info_data[] = {
},
};
-static int ov5645_write_reg(struct ov5645 *ov5645, u16 reg, u8 val)
-{
- u8 regbuf[3];
- int ret;
-
- regbuf[0] = reg >> 8;
- regbuf[1] = reg & 0xff;
- regbuf[2] = val;
-
- ret = i2c_master_send(ov5645->i2c_client, regbuf, 3);
- if (ret < 0) {
- dev_err(ov5645->dev, "%s: write reg error %d: reg=%x, val=%x\n",
- __func__, ret, reg, val);
- return ret;
- }
-
- return 0;
-}
-
-static int ov5645_read_reg(struct ov5645 *ov5645, u16 reg, u8 *val)
-{
- u8 regbuf[2];
- int ret;
-
- regbuf[0] = reg >> 8;
- regbuf[1] = reg & 0xff;
-
- ret = i2c_master_send(ov5645->i2c_client, regbuf, 2);
- if (ret < 0) {
- dev_err(ov5645->dev, "%s: write reg error %d: reg=%x\n",
- __func__, ret, reg);
- return ret;
- }
-
- ret = i2c_master_recv(ov5645->i2c_client, val, 1);
- if (ret < 0) {
- dev_err(ov5645->dev, "%s: read reg error %d: reg=%x\n",
- __func__, ret, reg);
- return ret;
- }
-
- return 0;
-}
-
static int ov5645_set_aec_mode(struct ov5645 *ov5645, u32 mode)
{
u8 val = ov5645->aec_pk_manual;
@@ -591,7 +545,7 @@ static int ov5645_set_aec_mode(struct ov5645 *ov5645, u32 mode)
else /* V4L2_EXPOSURE_MANUAL */
val |= OV5645_AEC_MANUAL_ENABLE;
- ret = ov5645_write_reg(ov5645, OV5645_AEC_PK_MANUAL, val);
+ ret = cci_write(ov5645->regmap, OV5645_AEC_PK_MANUAL, val, NULL);
if (!ret)
ov5645->aec_pk_manual = val;
@@ -608,7 +562,7 @@ static int ov5645_set_agc_mode(struct ov5645 *ov5645, u32 enable)
else
val |= OV5645_AGC_MANUAL_ENABLE;
- ret = ov5645_write_reg(ov5645, OV5645_AEC_PK_MANUAL, val);
+ ret = cci_write(ov5645->regmap, OV5645_AEC_PK_MANUAL, val, NULL);
if (!ret)
ov5645->aec_pk_manual = val;
@@ -616,14 +570,14 @@ static int ov5645_set_agc_mode(struct ov5645 *ov5645, u32 enable)
}
static int ov5645_set_register_array(struct ov5645 *ov5645,
- const struct reg_value *settings,
+ const struct cci_reg_sequence *settings,
unsigned int num_settings)
{
unsigned int i;
int ret;
for (i = 0; i < num_settings; ++i, ++settings) {
- ret = ov5645_write_reg(ov5645, settings->reg, settings->val);
+ ret = cci_write(ov5645->regmap, settings->reg, settings->val, NULL);
if (ret < 0)
return ret;
@@ -640,7 +594,7 @@ static void __ov5645_set_power_off(struct device *dev)
struct v4l2_subdev *sd = dev_get_drvdata(dev);
struct ov5645 *ov5645 = to_ov5645(sd);
- ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x58);
+ cci_write(ov5645->regmap, OV5645_IO_MIPI_CTRL00, 0x58, NULL);
gpiod_set_value_cansleep(ov5645->rst_gpio, 1);
gpiod_set_value_cansleep(ov5645->enable_gpio, 0);
regulator_bulk_disable(OV5645_NUM_SUPPLIES, ov5645->supplies);
@@ -704,11 +658,11 @@ static int ov5645_set_saturation(struct ov5645 *ov5645, s32 value)
u32 reg_value = (value * 0x10) + 0x40;
int ret;
- ret = ov5645_write_reg(ov5645, OV5645_SDE_SAT_U, reg_value);
+ ret = cci_write(ov5645->regmap, OV5645_SDE_SAT_U, reg_value, NULL);
if (ret < 0)
return ret;
- return ov5645_write_reg(ov5645, OV5645_SDE_SAT_V, reg_value);
+ return cci_write(ov5645->regmap, OV5645_SDE_SAT_V, reg_value, NULL);
}
static int ov5645_set_hflip(struct ov5645 *ov5645, s32 value)
@@ -721,7 +675,7 @@ static int ov5645_set_hflip(struct ov5645 *ov5645, s32 value)
else
val |= (OV5645_SENSOR_MIRROR);
- ret = ov5645_write_reg(ov5645, OV5645_TIMING_TC_REG21, val);
+ ret = cci_write(ov5645->regmap, OV5645_TIMING_TC_REG21, val, NULL);
if (!ret)
ov5645->timing_tc_reg21 = val;
@@ -738,7 +692,7 @@ static int ov5645_set_vflip(struct ov5645 *ov5645, s32 value)
else
val &= ~(OV5645_SENSOR_VFLIP | OV5645_ISP_VFLIP);
- ret = ov5645_write_reg(ov5645, OV5645_TIMING_TC_REG20, val);
+ ret = cci_write(ov5645->regmap, OV5645_TIMING_TC_REG20, val, NULL);
if (!ret)
ov5645->timing_tc_reg20 = val;
@@ -754,7 +708,7 @@ static int ov5645_set_test_pattern(struct ov5645 *ov5645, s32 value)
val |= OV5645_TEST_PATTERN_ENABLE;
}
- return ov5645_write_reg(ov5645, OV5645_PRE_ISP_TEST_SETTING_1, val);
+ return cci_write(ov5645->regmap, OV5645_PRE_ISP_TEST_SETTING_1, val, NULL);
}
static const char * const ov5645_test_pattern_menu[] = {
@@ -772,7 +726,7 @@ static int ov5645_set_awb(struct ov5645 *ov5645, s32 enable_auto)
if (!enable_auto)
val = OV5645_AWB_MANUAL_ENABLE;
- return ov5645_write_reg(ov5645, OV5645_AWB_MANUAL_CONTROL, val);
+ return cci_write(ov5645->regmap, OV5645_AWB_MANUAL_CONTROL, val, NULL);
}
static int ov5645_s_ctrl(struct v4l2_ctrl *ctrl)
@@ -958,9 +912,8 @@ static int ov5645_enable_streams(struct v4l2_subdev *sd,
if (ret < 0)
return ret;
- ret = ov5645_set_register_array(ov5645,
- ov5645->current_mode->data,
- ov5645->current_mode->data_size);
+ ret = cci_multi_reg_write(ov5645->regmap, ov5645->current_mode->data,
+ ov5645->current_mode->data_size, NULL);
if (ret < 0) {
dev_err(ov5645->dev, "could not set mode %dx%d\n",
ov5645->current_mode->width,
@@ -973,12 +926,12 @@ static int ov5645_enable_streams(struct v4l2_subdev *sd,
goto err_rpm_put;
}
- ret = ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x45);
+ ret = cci_write(ov5645->regmap, OV5645_IO_MIPI_CTRL00, 0x45, NULL);
if (ret < 0)
goto err_rpm_put;
- ret = ov5645_write_reg(ov5645, OV5645_SYSTEM_CTRL0,
- OV5645_SYSTEM_CTRL0_START);
+ ret = cci_write(ov5645->regmap, OV5645_SYSTEM_CTRL0,
+ OV5645_SYSTEM_CTRL0_START, NULL);
if (ret < 0)
goto err_rpm_put;
@@ -996,12 +949,12 @@ static int ov5645_disable_streams(struct v4l2_subdev *sd,
struct ov5645 *ov5645 = to_ov5645(sd);
int ret;
- ret = ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x40);
+ ret = cci_write(ov5645->regmap, OV5645_IO_MIPI_CTRL00, 0x40, NULL);
if (ret < 0)
goto rpm_put;
- ret = ov5645_write_reg(ov5645, OV5645_SYSTEM_CTRL0,
- OV5645_SYSTEM_CTRL0_STOP);
+ ret = cci_write(ov5645->regmap, OV5645_SYSTEM_CTRL0,
+ OV5645_SYSTEM_CTRL0_STOP, NULL);
rpm_put:
pm_runtime_put_autosuspend(ov5645->dev);
@@ -1036,9 +989,9 @@ static const struct v4l2_subdev_internal_ops ov5645_internal_ops = {
static int ov5645_probe(struct i2c_client *client)
{
struct device *dev = &client->dev;
+ u64 chip_id_high, chip_id_low;
struct device_node *endpoint;
struct ov5645 *ov5645;
- u8 chip_id_high, chip_id_low;
unsigned int i;
u32 xclk_freq;
int ret;
@@ -1068,6 +1021,11 @@ static int ov5645_probe(struct i2c_client *client)
return dev_err_probe(dev, -EINVAL,
"invalid bus type, must be CSI2\n");
+ ov5645->regmap = devm_cci_regmap_init_i2c(client, 16);
+ if (IS_ERR(ov5645->regmap))
+ return dev_err_probe(ov5645->dev, PTR_ERR(ov5645->regmap),
+ "Failed to init CCI\n");
+
/* get system clock (xclk) */
ov5645->xclk = devm_v4l2_sensor_clk_get_legacy(dev, NULL, false, 0);
if (IS_ERR(ov5645->xclk))
@@ -1154,13 +1112,13 @@ static int ov5645_probe(struct i2c_client *client)
if (ret)
goto free_entity;
- ret = ov5645_read_reg(ov5645, OV5645_CHIP_ID_HIGH, &chip_id_high);
+ ret = cci_read(ov5645->regmap, OV5645_CHIP_ID_HIGH, &chip_id_high, NULL);
if (ret < 0 || chip_id_high != OV5645_CHIP_ID_HIGH_BYTE) {
ret = -ENODEV;
dev_err_probe(dev, ret, "could not read ID high\n");
goto power_down;
}
- ret = ov5645_read_reg(ov5645, OV5645_CHIP_ID_LOW, &chip_id_low);
+ ret = cci_read(ov5645->regmap, OV5645_CHIP_ID_LOW, &chip_id_low, NULL);
if (ret < 0 || chip_id_low != OV5645_CHIP_ID_LOW_BYTE) {
ret = -ENODEV;
dev_err_probe(dev, ret, "could not read ID low\n");
@@ -1169,24 +1127,21 @@ static int ov5645_probe(struct i2c_client *client)
dev_info(dev, "OV5645 detected at address 0x%02x\n", client->addr);
- ret = ov5645_read_reg(ov5645, OV5645_AEC_PK_MANUAL,
- &ov5645->aec_pk_manual);
+ ret = cci_read(ov5645->regmap, OV5645_AEC_PK_MANUAL, &ov5645->aec_pk_manual, NULL);
if (ret < 0) {
ret = -ENODEV;
dev_err_probe(dev, ret, "could not read AEC/AGC mode\n");
goto power_down;
}
- ret = ov5645_read_reg(ov5645, OV5645_TIMING_TC_REG20,
- &ov5645->timing_tc_reg20);
+ ret = cci_read(ov5645->regmap, OV5645_TIMING_TC_REG20, &ov5645->timing_tc_reg20, NULL);
if (ret < 0) {
ret = -ENODEV;
dev_err_probe(dev, ret, "could not read vflip value\n");
goto power_down;
}
- ret = ov5645_read_reg(ov5645, OV5645_TIMING_TC_REG21,
- &ov5645->timing_tc_reg21);
+ ret = cci_read(ov5645->regmap, OV5645_TIMING_TC_REG21, &ov5645->timing_tc_reg21, NULL);
if (ret < 0) {
ret = -ENODEV;
dev_err_probe(dev, ret, "could not read hflip value\n");
--
2.53.0
next prev parent reply other threads:[~2026-03-26 14:21 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-26 14:21 [PATCH 0/2] media: ov5645: Implement frame descriptor reporting and convert to CCI register access helpers Prabhakar
2026-03-26 14:21 ` [PATCH 1/2] media: i2c: ov5645: Report streams using frame descriptors Prabhakar
2026-03-26 14:21 ` Prabhakar [this message]
2026-03-26 14:59 ` [PATCH 2/2] media: i2c: ov5645: Convert to CCI register access helpers xiaolei wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260326142107.297811-3-prabhakar.mahadev-lad.rj@bp.renesas.com \
--to=prabhakar.csengg@gmail.com \
--cc=benjamin.mugnier@foss.st.com \
--cc=biju.das.jz@bp.renesas.com \
--cc=fabrizio.castro.jz@renesas.com \
--cc=hardevsinh.palaniya@siliconsignals.io \
--cc=hverkuil@kernel.org \
--cc=johannes.goede@oss.qualcomm.com \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux-renesas-soc@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=mehdi.djait@linux.intel.com \
--cc=prabhakar.mahadev-lad.rj@bp.renesas.com \
--cc=sakari.ailus@linux.intel.com \
--cc=sylvain.petinot@foss.st.com \
--cc=vladimir.zapolskiy@linaro.org \
--cc=xiaolei.wang@windriver.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox