From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C852730748D; Tue, 14 Oct 2025 17:40:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760463639; cv=none; b=UG23vxtAyRULN0drSch14cffZW0ROoI/8JXi1K6WQoH6PKGN7yGvsLYe3vZa8blqyH1c7z4/lLkK0N7r4i6BVae0xQ79bFIPzLqZKacnmcCQkUlEfcfmVglWpmuNSlAUVLOmZl4RtCyZDhjBHAMlpNJ2SOIW9WDZlGMz6vPCBDI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760463639; c=relaxed/simple; bh=Vh8iM7hNJ23f35N8QRB9sQtJlDEDa/xmJcy3XrrBLzk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TQGDT/ZYz6/Seq6kYuiCv3WhkzwotfLN/f5Ab6p+7u78BFHfEoOs5PUZjyUPPRLQVNbERc4v625ofbBeEKAhpUnLvmzNZdRZIEtD3C/CzaqC5dIZa0Hfi7NhpBEuQSffxwOlf45k/qZkyK/QtLsoBAsZFwGfChm0vO0PXh5OZ+c= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=oa+1w84E; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="oa+1w84E" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AD863C113D0; Tue, 14 Oct 2025 17:40:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1760463639; bh=Vh8iM7hNJ23f35N8QRB9sQtJlDEDa/xmJcy3XrrBLzk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oa+1w84EJeKIVpf7KKqfqhFnSSEckB4iqCLG7kf6U8Nx+XcKoMEkTSHiJi/c7sI6F 7e6MRheA0VlNLTbGI+B9EN1u43HvvHKkmwoRk8fYcpjH2cMECJLh8NFIIeszF9MTE8 nmedeCiZZm/vqXAIrrN4ZJSE2Gw4hV21Y6e4a6rZ/FXOjJc6f7paDAB7aNoOjrkNo0 jG0oOjFDJUTOAYVU9+S34REYn2lGO35E8xmTpmK9d+0FPw0MsrbHBf7XcrFEXaP6Nk BkejMeq7GYOUxW3psbwuq8UtXMbqC00slTAmR+kfK069pwZGOwDgpr4RBbFpAqo/tx 1idGtYzwt9UQQ== From: Hans de Goede To: Bingbu Cao , Sakari Ailus Cc: Hans de Goede , linux-media@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH 01/25] media: i2c: ov01a10: Fix the horizontal flip control Date: Tue, 14 Oct 2025 19:40:09 +0200 Message-ID: <20251014174033.20534-2-hansg@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251014174033.20534-1-hansg@kernel.org> References: <20251014174033.20534-1-hansg@kernel.org> Precedence: bulk X-Mailing-List: stable@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit During sensor calibration I noticed that with the hflip control set to false/disabled the image was mirrored. So it seems that the horizontal flip control is inverted and needs to be set to 1 to not flip (just like the similar problem recently fixed on the ov08x40 sensor). Invert the hflip control to fix the sensor mirroring by default. As the comment above the newly added OV01A10_MEDIA_BUS_FMT define explains the control being inverted also means that the native Bayer-order of the sensor actually is GBRG not BGGR, but so as to not break userspace the Bayer-order is kept at BGGR. Fixes: 0827b58dabff ("media: i2c: add ov01a10 image sensor driver") Cc: stable@vger.kernel.org Signed-off-by: Hans de Goede --- drivers/media/i2c/ov01a10.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/drivers/media/i2c/ov01a10.c b/drivers/media/i2c/ov01a10.c index 141cb6f75b55..e5df01f97978 100644 --- a/drivers/media/i2c/ov01a10.c +++ b/drivers/media/i2c/ov01a10.c @@ -75,6 +75,15 @@ #define OV01A10_REG_X_WIN 0x3811 #define OV01A10_REG_Y_WIN 0x3813 +/* + * The native ov01a10 bayer-pattern is GBRG, but there was a driver bug enabling + * hflip/mirroring by default resulting in BGGR. Because of this bug Intel's + * proprietary IPU6 userspace stack expects BGGR. So we report BGGR to not break + * userspace and fix things up by shifting the crop window-x coordinate by 1 + * when hflip is *disabled*. + */ +#define OV01A10_MEDIA_BUS_FMT MEDIA_BUS_FMT_SBGGR10_1X10 + struct ov01a10_reg { u16 address; u8 val; @@ -185,14 +194,14 @@ static const struct ov01a10_reg sensor_1280x800_setting[] = { {0x380e, 0x03}, {0x380f, 0x80}, {0x3810, 0x00}, - {0x3811, 0x08}, + {0x3811, 0x09}, {0x3812, 0x00}, {0x3813, 0x08}, {0x3814, 0x01}, {0x3815, 0x01}, {0x3816, 0x01}, {0x3817, 0x01}, - {0x3820, 0xa0}, + {0x3820, 0xa8}, {0x3822, 0x13}, {0x3832, 0x28}, {0x3833, 0x10}, @@ -411,7 +420,7 @@ static int ov01a10_set_hflip(struct ov01a10 *ov01a10, u32 hflip) int ret; u32 val, offset; - offset = hflip ? 0x9 : 0x8; + offset = hflip ? 0x8 : 0x9; ret = ov01a10_write_reg(ov01a10, OV01A10_REG_X_WIN, 1, offset); if (ret) return ret; @@ -420,8 +429,8 @@ static int ov01a10_set_hflip(struct ov01a10 *ov01a10, u32 hflip) if (ret) return ret; - val = hflip ? val | FIELD_PREP(OV01A10_HFLIP_MASK, 0x1) : - val & ~OV01A10_HFLIP_MASK; + val = hflip ? val & ~OV01A10_HFLIP_MASK : + val | FIELD_PREP(OV01A10_HFLIP_MASK, 0x1); return ov01a10_write_reg(ov01a10, OV01A10_REG_FORMAT1, 1, val); } @@ -610,7 +619,7 @@ static void ov01a10_update_pad_format(const struct ov01a10_mode *mode, { fmt->width = mode->width; fmt->height = mode->height; - fmt->code = MEDIA_BUS_FMT_SBGGR10_1X10; + fmt->code = OV01A10_MEDIA_BUS_FMT; fmt->field = V4L2_FIELD_NONE; fmt->colorspace = V4L2_COLORSPACE_RAW; } @@ -751,7 +760,7 @@ static int ov01a10_enum_mbus_code(struct v4l2_subdev *sd, if (code->index > 0) return -EINVAL; - code->code = MEDIA_BUS_FMT_SBGGR10_1X10; + code->code = OV01A10_MEDIA_BUS_FMT; return 0; } @@ -761,7 +770,7 @@ static int ov01a10_enum_frame_size(struct v4l2_subdev *sd, struct v4l2_subdev_frame_size_enum *fse) { if (fse->index >= ARRAY_SIZE(supported_modes) || - fse->code != MEDIA_BUS_FMT_SBGGR10_1X10) + fse->code != OV01A10_MEDIA_BUS_FMT) return -EINVAL; fse->min_width = supported_modes[fse->index].width; -- 2.51.0