From: Sakari Ailus <sakari.ailus@linux.intel.com>
To: linux-media@vger.kernel.org
Cc: Bingbu Cao <bingbu.cao@intel.com>,
Hans de Goede <hansg@kernel.org>,
mehdi.djait@intel.com
Subject: [PATCH v2 22/23] media: i2c: ov01a10: Optimize setting h/vflip values
Date: Mon, 12 Jan 2026 11:59:48 +0200 [thread overview]
Message-ID: <20260112095949.3851-23-sakari.ailus@linux.intel.com> (raw)
In-Reply-To: <20260112095949.3851-1-sakari.ailus@linux.intel.com>
From: Hans de Goede <hansg@kernel.org>
Since ov01a10_global_setting[] sets the initial format1 register value,
there is no need to do a read-write-modify when setting the flip controls.
Only write format1 when setting the flip-controls and remove the now
unnecessary format1 register init from ov01a10_global_setting[].
Signed-off-by: Hans de Goede <hansg@kernel.org>
Tested-by: Mehdi Djait <mehdi.djait@linux.intel.com> # Dell XPS 9315
Reviewed-by: Mehdi Djait <mehdi.djait@linux.intel.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
drivers/media/i2c/ov01a10.c | 41 +++++++++++++++++++++++--------------
1 file changed, 26 insertions(+), 15 deletions(-)
diff --git a/drivers/media/i2c/ov01a10.c b/drivers/media/i2c/ov01a10.c
index a909f1ff8a76..6d245b638b2d 100644
--- a/drivers/media/i2c/ov01a10.c
+++ b/drivers/media/i2c/ov01a10.c
@@ -161,7 +161,6 @@ static const struct reg_sequence ov01a10_global_setting[] = {
{0x3815, 0x01},
{0x3816, 0x01},
{0x3817, 0x01},
- {0x3820, 0xa8},
{0x3822, 0x13},
{0x3832, 0x28},
{0x3833, 0x10},
@@ -240,6 +239,7 @@ struct ov01a10_sensor_cfg {
u32 bus_fmt;
int pattern_size;
int border_size;
+ u8 format1_base_val;
bool invert_hflip_shift;
bool invert_vflip_shift;
};
@@ -258,6 +258,8 @@ struct ov01a10 {
struct v4l2_ctrl *vblank;
struct v4l2_ctrl *hblank;
struct v4l2_ctrl *exposure;
+ struct v4l2_ctrl *hflip;
+ struct v4l2_ctrl *vflip;
u32 link_freq_index;
@@ -310,22 +312,33 @@ static int ov01a10_test_pattern(struct ov01a10 *ov01a10, u32 pattern)
NULL);
}
+static void ov01a10_set_format1(struct ov01a10 *ov01a10, int *ret)
+{
+ u8 val = ov01a10->cfg->format1_base_val;
+
+ /* hflip register bit is inverted */
+ if (!ov01a10->hflip->val)
+ val |= FIELD_PREP(OV01A10_HFLIP_MASK, 0x1);
+
+ if (ov01a10->vflip->val)
+ val |= FIELD_PREP(OV01A10_VFLIP_MASK, 0x1);
+
+ cci_write(ov01a10->regmap, OV01A10_REG_FORMAT1, val, ret);
+}
+
static int ov01a10_set_hflip(struct ov01a10 *ov01a10, bool hflip)
{
struct v4l2_rect *crop = ov01a10_get_active_crop(ov01a10);
const struct ov01a10_sensor_cfg *cfg = ov01a10->cfg;
- u32 val, offset;
+ u32 offset;
int ret = 0;
offset = crop->left;
if ((hflip ^ cfg->invert_hflip_shift) && cfg->border_size)
offset++;
- val = hflip ? 0 : FIELD_PREP(OV01A10_HFLIP_MASK, 0x1);
-
cci_write(ov01a10->regmap, OV01A10_REG_X_WIN, offset, &ret);
- cci_update_bits(ov01a10->regmap, OV01A10_REG_FORMAT1,
- OV01A10_HFLIP_MASK, val, &ret);
+ ov01a10_set_format1(ov01a10, &ret);
return ret;
}
@@ -334,18 +347,15 @@ static int ov01a10_set_vflip(struct ov01a10 *ov01a10, bool vflip)
{
struct v4l2_rect *crop = ov01a10_get_active_crop(ov01a10);
const struct ov01a10_sensor_cfg *cfg = ov01a10->cfg;
- u32 val, offset;
+ u32 offset;
int ret = 0;
offset = crop->top;
if ((vflip ^ cfg->invert_vflip_shift) && cfg->border_size)
offset++;
- val = vflip ? FIELD_PREP(OV01A10_VFLIP_MASK, 0x1) : 0;
-
cci_write(ov01a10->regmap, OV01A10_REG_Y_WIN, offset, &ret);
- cci_update_bits(ov01a10->regmap, OV01A10_REG_FORMAT1,
- OV01A10_VFLIP_MASK, val, &ret);
+ ov01a10_set_format1(ov01a10, &ret);
return ret;
}
@@ -474,10 +484,10 @@ static int ov01a10_init_controls(struct ov01a10 *ov01a10)
ARRAY_SIZE(ov01a10_test_pattern_menu) - 1,
0, 0, ov01a10_test_pattern_menu);
- v4l2_ctrl_new_std(ctrl_hdlr, &ov01a10_ctrl_ops, V4L2_CID_HFLIP,
- 0, 1, 1, 0);
- v4l2_ctrl_new_std(ctrl_hdlr, &ov01a10_ctrl_ops, V4L2_CID_VFLIP,
- 0, 1, 1, 0);
+ ov01a10->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &ov01a10_ctrl_ops,
+ V4L2_CID_HFLIP, 0, 1, 1, 0);
+ ov01a10->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &ov01a10_ctrl_ops,
+ V4L2_CID_VFLIP, 0, 1, 1, 0);
ret = v4l2_ctrl_new_fwnode_properties(ctrl_hdlr, &ov01a10_ctrl_ops,
&props);
@@ -1087,6 +1097,7 @@ static const struct ov01a10_sensor_cfg ov01a10_cfg = {
.bus_fmt = MEDIA_BUS_FMT_SBGGR10_1X10,
.pattern_size = 2, /* 2x2 */
.border_size = 2,
+ .format1_base_val = 0xa0,
.invert_hflip_shift = true,
.invert_vflip_shift = false,
};
--
2.47.3
next prev parent reply other threads:[~2026-01-12 10:00 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-12 9:59 [PATCH v2 00/23] media: i2c: ov01a10: Add crop, ov01a1b support Sakari Ailus
2026-01-12 9:59 ` [PATCH v2 01/23] media: i2c: ov01a10: Fix the horizontal flip control Sakari Ailus
2026-01-12 9:59 ` [PATCH v2 02/23] media: i2c: ov01a10: Fix reported pixel-rate value Sakari Ailus
2026-01-13 2:43 ` Bingbu Cao
2026-01-12 9:59 ` [PATCH v2 03/23] media: i2c: ov01a10: Fix analogue gain range Sakari Ailus
2026-01-13 2:42 ` Bingbu Cao
2026-01-12 9:59 ` [PATCH v2 04/23] media: i2c: ov01a10: Add missing v4l2_subdev_cleanup() calls Sakari Ailus
2026-01-12 9:59 ` [PATCH v2 05/23] media: i2c: ov01a10: Fix passing stream instead of pad to v4l2_subdev_state_get_format() Sakari Ailus
2026-01-12 9:59 ` [PATCH v2 06/23] media: i2c: ov01a10: Fix test-pattern disabling Sakari Ailus
2026-01-13 2:59 ` Bingbu Cao
2026-01-13 8:14 ` Sakari Ailus
2026-01-13 10:41 ` Hans de Goede
2026-01-13 10:40 ` Hans de Goede
2026-01-12 9:59 ` [PATCH v2 07/23] media: i2c: ov01a10: Change default vblank value to a vblank resulting in 30 fps Sakari Ailus
2026-01-12 9:59 ` [PATCH v2 08/23] media: i2c: ov01a10: Convert to new CCI register access helpers Sakari Ailus
2026-01-12 9:59 ` [PATCH v2 09/23] media: i2c: ov01a10: Remove overly verbose probe() error reporting Sakari Ailus
2026-01-12 9:59 ` [PATCH v2 10/23] media: i2c: ov01a10: Store dev pointer in struct ov01a10 Sakari Ailus
2026-01-12 9:59 ` [PATCH v2 11/23] media: i2c: ov01a10: Add ov01a10_check_hwcfg() function Sakari Ailus
2026-01-12 9:59 ` [PATCH v2 12/23] media: i2c: ov01a10: Add power on/off sequencing support Sakari Ailus
2026-01-12 9:59 ` [PATCH v2 13/23] media: i2c: ov01a10: Don't update pixel_rate and link_freq from set_fmt Sakari Ailus
2026-01-12 9:59 ` [PATCH v2 14/23] media: i2c: ov01a10: Move setting of ctrl->flags to after checking ctrl_hdlr->error Sakari Ailus
2026-01-12 9:59 ` [PATCH v2 15/23] media: i2c: ov01a10: Use native and default for pixel-array size names Sakari Ailus
2026-01-12 9:59 ` [PATCH v2 16/23] media: i2c: ov01a10: Add cropping support / allow arbitrary sizes Sakari Ailus
2026-01-12 9:59 ` [PATCH v2 17/23] media: i2c: ov01a10: Remove struct ov01a10_reg_list Sakari Ailus
2026-01-12 9:59 ` [PATCH v2 18/23] media: i2c: ov01a10: Replace exposure->min/step with direct define use Sakari Ailus
2026-01-12 9:59 ` [PATCH v2 19/23] media: i2c: ov01a10: Only set register 0x0305 once Sakari Ailus
2026-01-12 9:59 ` [PATCH v2 20/23] media: i2c: ov01a10: Remove values set by controls from global_setting[] Sakari Ailus
2026-01-12 9:59 ` [PATCH v2 21/23] media: i2c: ov01a10: Add ov01a10_sensor_cfg struct Sakari Ailus
2026-01-12 9:59 ` Sakari Ailus [this message]
2026-01-12 9:59 ` [PATCH v2 23/23] media: i2c: ov01a10: Add ov01a1b support Sakari Ailus
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=20260112095949.3851-23-sakari.ailus@linux.intel.com \
--to=sakari.ailus@linux.intel.com \
--cc=bingbu.cao@intel.com \
--cc=hansg@kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=mehdi.djait@intel.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