From nobody Sun Sep 27 00:40:21 2026 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0070F4BC010 for ; Thu, 27 Aug 2026 18:18:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787854685; cv=none; b=MfWcXZqlyZK3t1zR4LT3pw/botwZq6mnOnytFdTOyv23qz+8NpizeYx0dpZxTgckyAs7m/EiDPJK+k120zp1FfQnrs9pYhY3J0Iijxhj/yDLo1Sdb/qWyuqEkRGoZvqTQapkkEKmAHLiaSpIVayr0f+2ophqZudQu33/eaehae8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787854685; c=relaxed/simple; bh=6EF7z2uySlV4sLNAOPuHFw8GGYhKTCfnk5/Qxtc2JUk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FjQgOLlmjx+6dBsszJu5TDngNBIfZFpOd2gf4vBBS85yfqdMk7nnXBojE87jWR8tkoQ5nGNP8KOkVdwyi6XiqDgj6WzsqVf6Er+HJHHMeT8GWNmVVb5Sfjlm/Q3uEGy1+VVtPMFQ5UEnJT0+1SdiReVXgV1NjQPXVUffZUrtsI4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=BKgPoYBE; arc=none smtp.client-ip=209.85.128.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="BKgPoYBE" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-4995b0343c1so187765e9.3 for ; Thu, 27 Aug 2026 11:18:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787854682; x=1788459482; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=4F+3K7V22Kkap0KpdpvpqiCWWLmTdrD5YToY0teInYs=; b=BKgPoYBEz5gySK4FzvULF12njfJAomVy/xulwX97cKbvPeq53h/WbbiPKlxhxkE+fZ l8c5L6bwc3B5LUSTMW+jV47CzAnyvz18flKSNSPRLf0nbnzckcX2HyeDPlHtTx575hIe OQb4HkU9m/PyM17GaJGau7qAjySalFAyYFArEIPVLSQlACIogbma92/GD/G//MCj38JF nkhmAa+8BRqB3IfkeRk1an1HjbSxt5vh4OF28xy4lf6nX9SE/mvyFNUd7MA3kNq48fr8 WWr1bVKBbE8ATNGbhSJWng8PFdAFOXVSeX8WT/vv09Z75ORJITzGFNo1lgHxGeAWzi5/ Oj+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787854682; x=1788459482; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=4F+3K7V22Kkap0KpdpvpqiCWWLmTdrD5YToY0teInYs=; b=Jo8JKU2iE8J3wR5ayjLP23inABXLmwD0gosyWgAZ0bAyEiLF5ZrpQw1jsXx2tV8tn+ l6gOiAxqTyESm9TPfpZK6FTId4zMx1zCmdaVcb+WX74g3AhSAFAD14XDIXK98psvTnsv 0oYhFmnuuXs/t67CnZHC5zqmK7SnJCrbGChX9Xm59eJsyWpUUoB1o71BpnF51frTYtcD uP0yn305oJGFTa7gydtCTrcbKP7Eepoi4NlyV0P8oMHRomtbH5CXC4lVJQb9Gh2ASR7y wMU7dG6GykN5LUybWPmWYF9Ksel/GcvetfTchioEi7/e5gcG6Rwmmw/XA6M+R3r0CD6o PAZg== X-Forwarded-Encrypted: i=1; AHgh+RoFV15WiB3jMITUekcXFkW5Rf60tlI9ipj0GMFU/8G9LxxSnHw+vV5K+2Fw1XG0LyTaVC6pR8OaDmjY/GM=@vger.kernel.org X-Gm-Message-State: AFuF++kAyhlYLizM5/LCChwpTaMPdCN7HBfN3tcT0taCnNgzB+H5g4id /ZafSOCqcWUqYUFcuUmGjYjxyP7McdWEq8RZD9HYqRsPWwSRPJj1nshH X-Gm-Gg: AR+sD12z/8NPOSAdQpmQ8WgaBQv8Oh5jwQLRwUfHJeekpxMcOR9pzNsT4DwxdKJDl3N f1KSqKdgyeroxZHTkdST9gjZIVElwoRbB2LdqBwxnqxm5q6dDEk2G9QNRe0HTxAnteE74zf1iDY wM2VWvjMvayycdYb4naNFQKGEMTNloY6ZTBpiEA2T8wBYfRF4tQMAJA+tEsua/sGzyd2PhWzaE4 DOaROOz9Avv9Lp331M/HYkPneqwxzcvdmRX2/FfEEIlrGQwaJQkl7LPd1tkOyCYBceC/eSitj0Y nGK+jyDiS96CBhpW4bk+j2F+WDQ7HHq79shnx9mqiSSSFJBYmB8pjCcXoxcvuWSy8IOMLCswuOZ 9zh5y3ez6mlTlopDgjcYaZylgqcIUnkuJSHo7a5LlBKBHyVHRNZ/OIj4PbLCSgHNwSctJhaPH0G WcyN9vlz4F+SllyO6W9j6kKx77wlgqbwcgOeXZkc/wcxX+BQOeke08lj8qoLcnqYBkBjDzBmgXY 6r+NdGzWbzmipyXmaO8fGG23MgO3fcWF0ixPTRuwDMa X-Received: by 2002:a05:600c:6091:b0:499:484a:98e7 with SMTP id 5b1f17b1804b1-49b91c4b3c5mr14656215e9.14.1787854682035; Thu, 27 Aug 2026 11:18:02 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b497fa9c5sm66270655e9.4.2026.08.27.11.18.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 11:18:01 -0700 (PDT) From: Maurizio Casciano To: linux-media@vger.kernel.org Cc: Mauro Carvalho Chehab , Sakari Ailus , Bingbu Cao , Jacopo Mondi , Nicholas Roth , Andy Shevchenko , Andy Shevchenko , Hans de Goede , Greg Kroah-Hartman , Jose Maria Martin , =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v2 01/11] media: ov8858: Extract digital gain programming Date: Thu, 27 Aug 2026 20:17:46 +0200 Message-ID: <20260827181756.2430054-2-mauriziocasciano7@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260827181756.2430054-1-mauriziocasciano7@gmail.com> References: <20260826132256.3343451-1-mauriziocasciano7@gmail.com> <20260827181756.2430054-1-mauriziocasciano7@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move the existing packed digital-gain register programming into a helper so clock-specific gain handling can be added separately. Assisted-by: Codex:gpt-5.6-sol sparse Signed-off-by: Maurizio Casciano --- drivers/media/i2c/ov8858.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/drivers/media/i2c/ov8858.c b/drivers/media/i2c/ov8858.c index 3f45f7fab833..f0b3b4a5d3bd 100644 --- a/drivers/media/i2c/ov8858.c +++ b/drivers/media/i2c/ov8858.c @@ -1523,6 +1523,23 @@ static int ov8858_enable_test_pattern(struct ov8858 = *ov8858, u32 pattern) return ov8858_write(ov8858, OV8858_REG_TEST_PATTERN, val, NULL); } =20 +static int ov8858_set_digital_gain(struct ov8858 *ov8858, u32 gain) +{ + u16 long_gain; + + /* + * Digital gain is assembled as: + * 0x350a[7:0] =3D dgain[13:6] + * 0x350b[5:0] =3D dgain[5:0] + * Reassemble the control value to write it in one go. + */ + long_gain =3D (gain & OV8858_LONG_DIGIGAIN_L_MASK) | + ((gain & OV8858_LONG_DIGIGAIN_H_MASK) << + OV8858_LONG_DIGIGAIN_H_SHIFT); + + return ov8858_write(ov8858, OV8858_REG_LONG_DIGIGAIN, long_gain, NULL); +} + static int ov8858_set_ctrl(struct v4l2_ctrl *ctrl) { struct ov8858 *ov8858 =3D container_of(ctrl->handler, @@ -1531,7 +1548,6 @@ static int ov8858_set_ctrl(struct v4l2_ctrl *ctrl) struct i2c_client *client =3D v4l2_get_subdevdata(&ov8858->subdev); struct v4l2_mbus_framefmt *format; struct v4l2_subdev_state *state; - u16 digi_gain; s64 max_exp; int ret; =20 @@ -1570,17 +1586,7 @@ static int ov8858_set_ctrl(struct v4l2_ctrl *ctrl) ctrl->val, NULL); break; case V4L2_CID_DIGITAL_GAIN: - /* - * Digital gain is assembled as: - * 0x350a[7:0] =3D dgain[13:6] - * 0x350b[5:0] =3D dgain[5:0] - * Reassemble the control value to write it in one go. - */ - digi_gain =3D (ctrl->val & OV8858_LONG_DIGIGAIN_L_MASK) - | ((ctrl->val & OV8858_LONG_DIGIGAIN_H_MASK) << - OV8858_LONG_DIGIGAIN_H_SHIFT); - ret =3D ov8858_write(ov8858, OV8858_REG_LONG_DIGIGAIN, - digi_gain, NULL); + ret =3D ov8858_set_digital_gain(ov8858, ctrl->val); break; case V4L2_CID_VBLANK: ret =3D ov8858_write(ov8858, OV8858_REG_VTS, --=20 2.53.0 From nobody Sun Sep 27 00:40:21 2026 Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EF8EC4C8FEC for ; Thu, 27 Aug 2026 18:18:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787854688; cv=none; b=pVA0ov8Koc746VQ+cCZAu1X9lwbiUgk7FqXOY9q/GgrMm/36PVNkP3oKpDqA67zf6wB1IVzH/MR6AbW8uhAhC7kGH96ZRy1fI2dnMzRMaPYq4h0dlseGSwMIwfRaM9eQQ0Al2ldJbwSXst+7Zyc3T3qAuKl3CVSvPOrLl+RCpC8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787854688; c=relaxed/simple; bh=YNX7By34Vbjk6uZtV8BsYmJMqcdL1930bdJ6ByoBlsw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uhjo4An6kiuNAhCPheCQ6AeDu+q2ZpckdS/76u0RG5jx1T7qWGQ/JMZKLllIKA7rX3Kvhouc8ExDuYteNWHBaNQotLgHspCuQyidCUfgzDXOYB8abfij5F8mS0Hn8eSjWqeXhtqD3wmhmgQUFF7asNbwzm182hwZgh+fTiOBeYs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=q9jIBeTW; arc=none smtp.client-ip=209.85.221.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="q9jIBeTW" Received: by mail-wr1-f54.google.com with SMTP id ffacd0b85a97d-482e2fdf5abso66060f8f.2 for ; Thu, 27 Aug 2026 11:18:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787854684; x=1788459484; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=KrTE0NEaNw83u8vsZX/37KxgJO69Dmhio94naZrt9Sg=; b=q9jIBeTWMCnox0J1gN15x0dBUkc1l+8ekBOwZg3S2YOXtwq+7/kNu59QYyDJ3vawZn 3RvAlqVHETF0KoWmC5Z8JIjdweM3FVlGyCcC9ssR5A45rxwO1CxvlfX6QeWU9JUFcIQu HTIF9WoLqwcUg0PyLRQcLYtOWgflxnJMNnJFqZAQi8GrkaL3NJHICj+jap8/Sv/yQOan uR94xRYYYjsKZxYcI+vaFereH9XkxH5XEmWpdgNH42qyipO2eWHsy+VgE3XBTw4LTA/9 YL3xHFNZw/skWRCx7FsrtJyL/e+c13niBsb4l02+vQQw6bgp4xTP0KC8r5r/DdSVXUZI qdyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787854684; x=1788459484; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=KrTE0NEaNw83u8vsZX/37KxgJO69Dmhio94naZrt9Sg=; b=r30lRlSYvUNFBkpuFH2OhZos0D2vRvDn3SWhlRU0+e+ZZ+ykSiUL11Qk6RdNlV141T 2K175wrxxxn5vw88jyHCQRwdBUxbM4WSG5LTKQUISivI/aRENoNHrxHpi5m2/L576pdI 4pRZZP13zYtHjudkPsU+ZSYi7BWy0DzhSL6nzn3GFNoL7Sf+gdeeHgYrxHvQoB1SRDaV V/DmB5Q/7Wv5gIbar5fBBcEjrGYWWYIITsggNdsiNvSQFWEuIxrv9VMs9d/xB1J4UASu bgDy4sKOywUwK0+oCzCLwLCvw/oXQPBmvs6r7CO8QtiwZqMW7125Hdqp3CFcUz54Tejv VLzg== X-Forwarded-Encrypted: i=1; AHgh+RoXAAtG2XFQeYFQoURCa7qmytsdqWHsCsmGyCt+vgsNtQ+hP98GAfRIJg3oxXtVoVBld76ayUe6nyOpQt8=@vger.kernel.org X-Gm-Message-State: AFuF++l49NJtIgr0/mq6itH+xR7MW81sNcxYi0xJQGUrSqEQSHldVgC3 O/jgwnDHy+bpOjsFduisLQxDD4rPgEoJr5U/TSj3EDqaRDSS85lge4k7l5Ht4ISD X-Gm-Gg: AR+sD12KBMY9eJ49Rp2fvROZhPIyVki+HMNOVMZelsfgSWm/b3O7IsBBSrKfeksqpT2 wB3axF1OkGKD+6sLbwb2nIc8a0K2wNzOwOP4hesBZ5P4sXVotuz34vBmgCxtG07i5XgKRHUhUb7 zaIS+ti8Vbf1cbkq5OO6ECsJKnSVP0nLwHcISBglmXzgGbMNSvoD2Jes76XhzwYrEokkAjnLt/T 09BUJ0zmfKhkNj+BAw/6DFLY7P9RXgZhprBNTdyzXM0Shwy1E/x1qm06MJgnZRXyeYOMhhR2xqo g/p8hanNLZY+uAJNVH+xtKBBco9VgHhvPDij4T6qTrsLcZyTcGvtqctfqOExE1557mHdgpFlH6W cn1DozCwytuKjDColPs72Sg4UZ8xjWp07FDPLAoVTyB0VKmatYTqemcmmvInZDFZpYhajfb/3vq BXoY+CrLIg/RKZT2c3RASBmRJusLeJdMP/9nluUNF2UlbLgiDx4nKeWL/EI3IK4itLWJPyEOuEZ NCtSspOpYkj2aeYog35rg6fX3hdl1iT2D/YP6zmtqN3 X-Received: by 2002:a05:600c:a03:b0:499:93b3:91ea with SMTP id 5b1f17b1804b1-49b91c5096dmr9536175e9.15.1787854684140; Thu, 27 Aug 2026 11:18:04 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b497fa9c5sm66270655e9.4.2026.08.27.11.18.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 11:18:03 -0700 (PDT) From: Maurizio Casciano To: linux-media@vger.kernel.org Cc: Mauro Carvalho Chehab , Sakari Ailus , Bingbu Cao , Jacopo Mondi , Nicholas Roth , Andy Shevchenko , Andy Shevchenko , Hans de Goede , Greg Kroah-Hartman , Jose Maria Martin , =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v2 02/11] media: ov8858: support 19.2 MHz clock and CHT gain setup Date: Thu, 27 Aug 2026 20:17:47 +0200 Message-ID: <20260827181756.2430054-3-mauriziocasciano7@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260827181756.2430054-1-mauriziocasciano7@gmail.com> References: <20260826132256.3343451-1-mauriziocasciano7@gmail.com> <20260827181756.2430054-1-mauriziocasciano7@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The Yoga Book drives its OV8858 from a 19.2 MHz platform clock, while the existing mode tables program the sensor PLL for 24 MHz. Reusing those settings produces incorrect internal and CSI-2 clocks. Accept both input rates and use the actual rate for the reset delay. For 19.2 MHz, apply the Cherry Trail MRD PLL and black-level settings after the generic mode table. The 19.2 MHz platform uses the per-channel manual white-balance registers for digital gain. Program registers 0x5032, 0x5034 and 0x5036 and expose their 1x-to-4x range, while retaining the existing long-exposure gain block for 24 MHz systems. The manual white-balance register definitions and programming follow the GPL-2.0 Intel OV5670 driver, so retain its 2017 Intel copyright notice in this file. No proprietary source or tuning binary is included. Tested on the Lenovo Yoga Book YB1-X91L OV8858 with full-range test bars and real 10-bit Bayer frames. Signed-off-by: Maurizio Casciano Assisted-by: Codex:gpt-5.6-sol sparse --- drivers/media/i2c/ov8858.c | 138 +++++++++++++++++++++++++++++++------ 1 file changed, 117 insertions(+), 21 deletions(-) diff --git a/drivers/media/i2c/ov8858.c b/drivers/media/i2c/ov8858.c index f0b3b4a5d3bd..b8c2f0d25505 100644 --- a/drivers/media/i2c/ov8858.c +++ b/drivers/media/i2c/ov8858.c @@ -3,10 +3,9 @@ * Copyright (C) 2023 Jacopo Mondi * Copyright (C) 2022 Nicholas Roth * Copyright (C) 2017 Fuzhou Rockchip Electronics Co., Ltd. + * Copyright (c) 2017 Intel Corporation. */ =20 -#include - #include #include #include @@ -18,6 +17,8 @@ #include #include #include +#include +#include =20 #include #include @@ -28,8 +29,9 @@ #include #include =20 -#define OV8858_LINK_FREQ 360000000U -#define OV8858_XVCLK_FREQ 24000000 +#define OV8858_LINK_FREQ (360 * HZ_PER_MHZ) +#define OV8858_XVCLK_FREQ_19_2MHZ (192 * HZ_PER_MHZ / 10) +#define OV8858_XVCLK_FREQ_24MHZ (24 * HZ_PER_MHZ) =20 #define OV8858_REG_SIZE_SHIFT 16 #define OV8858_REG_ADDR_MASK 0xffff @@ -59,6 +61,14 @@ #define OV8858_LONG_GAIN_STEP 1 #define OV8858_LONG_GAIN_DEFAULT 0x80 =20 +#define OV8858_REG_MWB_RED_GAIN OV8858_REG_16BIT(0x5032) +#define OV8858_REG_MWB_GREEN_GAIN OV8858_REG_16BIT(0x5034) +#define OV8858_REG_MWB_BLUE_GAIN OV8858_REG_16BIT(0x5036) +#define OV8858_MWB_GAIN_MIN 0x400 +#define OV8858_MWB_GAIN_MAX 0xfff +#define OV8858_MWB_GAIN_STEP 1 +#define OV8858_MWB_GAIN_DEFAULT 0x400 + #define OV8858_REG_LONG_DIGIGAIN OV8858_REG_16BIT(0x350a) #define OV8858_LONG_DIGIGAIN_H_MASK 0x3fc0 #define OV8858_LONG_DIGIGAIN_L_MASK 0x3f @@ -93,6 +103,33 @@ struct regval_modes { const struct regval *mode_4lanes; }; =20 +struct ov8858_gain_range { + u32 min; + u32 max; + u32 step; + u32 def; +}; + +enum ov8858_xvclk_index { + OV8858_XVCLK_24MHZ, + OV8858_XVCLK_19_2MHZ, +}; + +static const struct ov8858_gain_range ov8858_digital_gain_ranges[] =3D { + [OV8858_XVCLK_24MHZ] =3D { + .min =3D OV8858_LONG_DIGIGAIN_MIN, + .max =3D OV8858_LONG_DIGIGAIN_MAX, + .step =3D OV8858_LONG_DIGIGAIN_STEP, + .def =3D OV8858_LONG_DIGIGAIN_DEFAULT, + }, + [OV8858_XVCLK_19_2MHZ] =3D { + .min =3D OV8858_MWB_GAIN_MIN, + .max =3D OV8858_MWB_GAIN_MAX, + .step =3D OV8858_MWB_GAIN_STEP, + .def =3D OV8858_MWB_GAIN_DEFAULT, + }, +}; + struct ov8858_mode { u32 width; u32 height; @@ -104,6 +141,7 @@ struct ov8858_mode { =20 struct ov8858 { struct clk *xvclk; + unsigned long xvclk_rate; struct gpio_desc *reset_gpio; struct gpio_desc *pwdn_gpio; struct regulator_bulk_data supplies[ARRAY_SIZE(ov8858_supply_names)]; @@ -121,6 +159,41 @@ struct ov8858 { unsigned int num_lanes; }; =20 +/* + * Cherry Trail MRD production settings for a 19.2 MHz input and 360 MHz + * CSI-2 link. Apply these after the otherwise reusable 24 MHz mode table. + * + * Besides the corrected sensor/MIPI PLL divisors, keep the final common + * black-level settings here. The per-mode tables retain their resolution + * dependent black-column anchors and window sizes. + */ +static const struct regval ov8858_cht_mrd_19_2mhz[] =3D { + {0x0300, 0x00}, + {0x0302, 0x27}, + {0x0303, 0x00}, + {0x0304, 0x03}, + {0x030b, 0x00}, + {0x030d, 0x27}, + {0x030e, 0x00}, + {0x030f, 0x04}, + {0x0312, 0x01}, + {0x031e, 0x0c}, + {0x3f08, 0x08}, + {0x400a, 0x01}, + {0x400d, 0x10}, + {0x4011, 0x20}, + {0x403e, 0x08}, + {0x4040, 0x07}, + {0x4041, 0xc6}, + {0x4202, 0x00}, + {0x4500, 0x58}, + {0x470b, 0x28}, + {0x4837, 0x15}, + {0x58f4, 0x32}, + {0x58f8, 0x3d}, + {REG_NULL, 0x00}, +}; + static inline struct ov8858 *sd_to_ov8858(struct v4l2_subdev *sd) { return container_of(sd, struct ov8858, subdev); @@ -1345,6 +1418,13 @@ static int ov8858_start_stream(struct ov8858 *ov8858, if (ret) return ret; =20 + /* The mode tables contain PLL settings for a 24 MHz input clock. */ + if (ov8858->xvclk_rate =3D=3D OV8858_XVCLK_FREQ_19_2MHZ) { + ret =3D ov8858_write_array(ov8858, ov8858_cht_mrd_19_2mhz); + if (ret) + return ret; + } + /* 200 usec max to let PLL stabilize. */ fsleep(200); =20 @@ -1526,18 +1606,26 @@ static int ov8858_enable_test_pattern(struct ov8858= *ov8858, u32 pattern) static int ov8858_set_digital_gain(struct ov8858 *ov8858, u32 gain) { u16 long_gain; + int ret; =20 - /* - * Digital gain is assembled as: - * 0x350a[7:0] =3D dgain[13:6] - * 0x350b[5:0] =3D dgain[5:0] - * Reassemble the control value to write it in one go. - */ - long_gain =3D (gain & OV8858_LONG_DIGIGAIN_L_MASK) | - ((gain & OV8858_LONG_DIGIGAIN_H_MASK) << - OV8858_LONG_DIGIGAIN_H_SHIFT); + if (ov8858->xvclk_rate !=3D OV8858_XVCLK_FREQ_19_2MHZ) { + long_gain =3D (gain & OV8858_LONG_DIGIGAIN_L_MASK) | + ((gain & OV8858_LONG_DIGIGAIN_H_MASK) << + OV8858_LONG_DIGIGAIN_H_SHIFT); =20 - return ov8858_write(ov8858, OV8858_REG_LONG_DIGIGAIN, long_gain, NULL); + return ov8858_write(ov8858, OV8858_REG_LONG_DIGIGAIN, + long_gain, NULL); + } + + ret =3D ov8858_write(ov8858, OV8858_REG_MWB_RED_GAIN, gain, NULL); + if (ret) + return ret; + + ret =3D ov8858_write(ov8858, OV8858_REG_MWB_GREEN_GAIN, gain, NULL); + if (ret) + return ret; + + return ov8858_write(ov8858, OV8858_REG_MWB_BLUE_GAIN, gain, NULL); } =20 static int ov8858_set_ctrl(struct v4l2_ctrl *ctrl) @@ -1622,9 +1710,6 @@ static int ov8858_power_on(struct ov8858 *ov8858) unsigned long delay_us; int ret; =20 - if (clk_get_rate(ov8858->xvclk) !=3D OV8858_XVCLK_FREQ) - dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n"); - ret =3D clk_prepare_enable(ov8858->xvclk); if (ret < 0) { dev_err(dev, "Failed to enable xvclk\n"); @@ -1643,7 +1728,7 @@ static int ov8858_power_on(struct ov8858 *ov8858) * transaction, but a double sleep between the release of gpios * helps with sporadic failures observed at probe time. */ - delay_us =3D DIV_ROUND_UP(8192, OV8858_XVCLK_FREQ / 1000 / 1000); + delay_us =3D DIV_ROUND_UP(8192, ov8858->xvclk_rate / HZ_PER_MHZ); =20 gpiod_set_value_cansleep(ov8858->reset_gpio, 0); fsleep(delay_us); @@ -1701,9 +1786,11 @@ static int ov8858_init_ctrls(struct ov8858 *ov8858) { struct i2c_client *client =3D v4l2_get_subdevdata(&ov8858->subdev); struct v4l2_ctrl_handler *handler =3D &ov8858->ctrl_handler; + const struct ov8858_gain_range *digital_gain_range; const struct ov8858_mode *mode =3D &ov8858_modes[0]; struct v4l2_fwnode_device_properties props; s64 exposure_max, vblank_def; + unsigned int xvclk_index; unsigned int pixel_rate; struct v4l2_ctrl *ctrl; u32 h_blank; @@ -1746,10 +1833,12 @@ static int ov8858_init_ctrls(struct ov8858 *ov8858) OV8858_LONG_GAIN_MIN, OV8858_LONG_GAIN_MAX, OV8858_LONG_GAIN_STEP, OV8858_LONG_GAIN_DEFAULT); =20 + xvclk_index =3D ov8858->xvclk_rate =3D=3D OV8858_XVCLK_FREQ_19_2MHZ ? + OV8858_XVCLK_19_2MHZ : OV8858_XVCLK_24MHZ; + digital_gain_range =3D &ov8858_digital_gain_ranges[xvclk_index]; v4l2_ctrl_new_std(handler, &ov8858_ctrl_ops, V4L2_CID_DIGITAL_GAIN, - OV8858_LONG_DIGIGAIN_MIN, OV8858_LONG_DIGIGAIN_MAX, - OV8858_LONG_DIGIGAIN_STEP, - OV8858_LONG_DIGIGAIN_DEFAULT); + digital_gain_range->min, digital_gain_range->max, + digital_gain_range->step, digital_gain_range->def); =20 v4l2_ctrl_new_std_menu_items(handler, &ov8858_ctrl_ops, V4L2_CID_TEST_PATTERN, @@ -1887,6 +1976,13 @@ static int ov8858_probe(struct i2c_client *client) return dev_err_probe(dev, PTR_ERR(ov8858->xvclk), "Failed to get xvclk\n"); =20 + ov8858->xvclk_rate =3D clk_get_rate(ov8858->xvclk); + if (ov8858->xvclk_rate !=3D OV8858_XVCLK_FREQ_19_2MHZ && + ov8858->xvclk_rate !=3D OV8858_XVCLK_FREQ_24MHZ) + return dev_err_probe(dev, -EINVAL, + "Unsupported xvclk rate %lu Hz\n", + ov8858->xvclk_rate); + ov8858->reset_gpio =3D devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); if (IS_ERR(ov8858->reset_gpio)) --=20 2.53.0 From nobody Sun Sep 27 00:40:21 2026 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D9A644C9558 for ; Thu, 27 Aug 2026 18:18:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787854689; cv=none; b=ma3xEY3n5miEPcMxS03FWmCIKANih/m6rJH2rZDgud32xlJE9h4Kcl0VZlsHxg6HCssX/Ac27r58ZzNEUP5nUfTETnOi9GvK91CegtbsD3JoTclGusQoA8XMf3rGJpSj5iwLWBTZCp27wyQ+vlZ24jm68BtzhAg+zsDMAgtnxbI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787854689; c=relaxed/simple; bh=i4XP/y1OtMKTpjmyldq1NfyuUnIY9DtWEpicagMug+4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sdWyGesMkRUrTmIoga+ecfXacitVmmO7PvGjVGzs44tFDQA0MjpnTJOmpGwzpxUmKFMsuRJMndmco7eMySDw33IcPSf2bkNKeJm+1Wi9edAdfNyGqC4n7Evaoc3sQa3F4tTt8O+lWbmhEOogMX8Vk4jf+8Wei2HAI8qCwYkMju4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=cAmd6me6; arc=none smtp.client-ip=209.85.128.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="cAmd6me6" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-4953de5be0aso503155e9.0 for ; Thu, 27 Aug 2026 11:18:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787854686; x=1788459486; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=VEsNUYGlKy1ooscwN6zWUOqqar7TDxOoNVnM+VqT2yI=; b=cAmd6me6u+7OzDIBk/v2EYHMAcc9uKzlCaYiCqz7UywCNWXhBd/hDECXW7v9kxiEK+ HGAyHZFIDqOUUhvOybUuqD7CKpwqm4qMnNej3ErpV7Xr4wabMXPLfCflK8WeZoHGEao6 lkq7Ku7TAaljcUoQuJktrMbhkKI6KkNjnZ5K9udHMRMWCbAdoqHLnC1j4KZF2sIEtWae 44rwszqOdsaiHns75FzbXCWAbpK7eOPpCwp9f9vhs35XkeW014Joyig7RA+vqU+9ZXlZ XnTNyoQ0D9tGddxArYb5alXC/cNGbmaiOzdBjbmIm3Le1AQK1Mti48lwqBLzFrryy/Vw K9pA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787854686; x=1788459486; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=VEsNUYGlKy1ooscwN6zWUOqqar7TDxOoNVnM+VqT2yI=; b=qljAmXBJJC17iJpbeq7eaftVFe45hGosK6+IjtTONwP3QkmLoOX5TawGOF/ib8s2b/ ybv8CsfQxfjxHhworEvKIX46Z9fzV1eGe5sfq8GI0EEruJ5tb/pU2NmtopKDgubyFZbp ICif5oQ02Xjsf9/3uSovsXNgot2aRJBvXIEsSqiI5GRSlRLSZkilz7wm67W73U/yjRKg 294vE/0BYSDdWNphx1GbnqGdySWjlG33FeioOo3W47cPGJv8kqEIzFSjCaTRYUES1c5v 5IwxSEofo9zKYFDeBkms+YDS7qQdQUFTF5l5myNgLsfXxZxa9f8Etxo6fMD5gq9vSc8c NdUg== X-Forwarded-Encrypted: i=1; AHgh+Rr9zGyDhEOhXPEmUxxLHk5MbLK84lehLNoBE8ebNtq+rXt2w9QdncgnYUWTtD8YSn0m9mwt3eIzvmmPmY4=@vger.kernel.org X-Gm-Message-State: AFuF++kFK3lYJNmhKZIylSLgAIIYG9lv+XrD3yHFCMa0aGxBoGeZBLcZ p66yvrzTXHFCe8ejsOWmyQqMrJoiOEaAHxA7pLdOmI9PhBFE/NHfvqE7 X-Gm-Gg: AR+sD10tgZQa9YX0WK8iY/z5miWKW2v+BPCHQ6t2Irok7OwbNLM7LZ6gruGKDswQ0/k FLFBAw8VFab7b2IE+1zVQ1syzQMUvwe2RbkoWIsBPAkDaq8MbycIiJ6/Uof0a+8Ojson2WUXG9n 5nAhQOU52S3L3LxEJFiq2ld56EgsPxJJ2F3ERslxhNeWDLsS6mznZrraRUAllXQoY+3Kbf6zHpB bbmd+BCefEVwsB6MH0JFV9AHg6AyWCSiUtKgBzLoekb9gS3+iY/VECzRHmECT4szf17r3AU0Oj7 IkndA9aKFb4okdLXPInImr1LZa0X1oK43GvoCbDxshdvoA5q5vqBgAT5ppNOjy16sRtaB/FY/Qc Mru6d+llPph/WYntWdUSanYrApiY3Jve5zWG092dTv4zt593ziNIjP9D84vwsBUSqnZQjXgczlP vxWU1EqEfvvVtIumrVJUQqoa0b7V4DSnHDtAuNVfrwW2PwIYepH3W150nAyMsuHjSFxj0aoCbOM hBx8+3UxuuutufibsTt6Z7AHDap53pVEBcBA6zi3Z0f X-Received: by 2002:a05:600c:3107:b0:49b:4dc0:9a06 with SMTP id 5b1f17b1804b1-49b91c50f5emr10361015e9.13.1787854686006; Thu, 27 Aug 2026 11:18:06 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b497fa9c5sm66270655e9.4.2026.08.27.11.18.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 11:18:05 -0700 (PDT) From: Maurizio Casciano To: linux-media@vger.kernel.org Cc: Mauro Carvalho Chehab , Sakari Ailus , Bingbu Cao , Jacopo Mondi , Nicholas Roth , Andy Shevchenko , Andy Shevchenko , Hans de Goede , Greg Kroah-Hartman , Jose Maria Martin , =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v2 03/11] media: ov2740: Use C99 initializers for ACPI IDs Date: Thu, 27 Aug 2026 20:17:48 +0200 Message-ID: <20260827181756.2430054-4-mauriziocasciano7@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260827181756.2430054-1-mauriziocasciano7@gmail.com> References: <20260826132256.3343451-1-mauriziocasciano7@gmail.com> <20260827181756.2430054-1-mauriziocasciano7@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use designated initializers and the standard empty sentinel style before adding firmware IDs. Assisted-by: Codex:gpt-5.6-sol sparse Signed-off-by: Maurizio Casciano Reviewed-by: Andy Shevchenko Suggested-by: Andy Shevchenko --- drivers/media/i2c/ov2740.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/media/i2c/ov2740.c b/drivers/media/i2c/ov2740.c index 39003c1632ad..8f0ad5dbb245 100644 --- a/drivers/media/i2c/ov2740.c +++ b/drivers/media/i2c/ov2740.c @@ -1461,10 +1461,9 @@ static DEFINE_RUNTIME_DEV_PM_OPS(ov2740_pm_ops, ov27= 40_suspend, ov2740_resume, NULL); =20 static const struct acpi_device_id ov2740_acpi_ids[] =3D { - {"INT3474"}, - {} + { .id =3D "INT3474" }, + { } }; - MODULE_DEVICE_TABLE(acpi, ov2740_acpi_ids); =20 static struct i2c_driver ov2740_i2c_driver =3D { --=20 2.53.0 From nobody Sun Sep 27 00:40:21 2026 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E33C14CA292 for ; Thu, 27 Aug 2026 18:18:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787854691; cv=none; b=akM3RE49sJDreQ7L/b1A/ixZfxIjRhReKk8O4BDOlVfGFBqvANLdXEkP+Hrae7mmblyORJxjPGn+S4apoHHFmRvZgi0oBcfCPwmHe+zVSBd6+OH7C5ETxYp5g30s12PvmjLSWwxPGEeKdPMV3OKA5wNvNg9FVowSZd770/tEs8s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787854691; c=relaxed/simple; bh=GY/0GwAYKkdGCB2mGjNb9iNJ3uZoj4B7s9rKLLBlD0s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bhb/2OQ4/q4n+PGyWSDDbh8RVgVqCQjW2OHdQQggUeJFQzLEoqXvj3h9bgx41rQ91oqTdzPyJ4T2CPgWYuVkHuIRHbJB3xiu0sNFK4uwp12EySGnSYaWq6tSx02FU0TCrXoofv4MxJ5bC8CwyOAMH2UzIU6KydfIytatAaKaT2o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=e9fD0Qvi; arc=none smtp.client-ip=209.85.128.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="e9fD0Qvi" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-4995b0343c1so188525e9.3 for ; Thu, 27 Aug 2026 11:18:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787854688; x=1788459488; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=DOqePx/fvAb2uUxt/VBHwZXtTfO5bd6bJUnU0qX6xfA=; b=e9fD0QviteEKAZf51GIXV7KxTXkjgTTk+9Ko9lkXhUvY8iZsB1DvbHt/J7biDkr7ke DRML9PW0H9onwCPxTpJFozT/sF3BRrW43NF+chIGn4HvvQFIEYTXLm+Cm0CqtuR4U908 Z2ZuvyWwj7F8qW7xfb4rkqHhWlewm7+1HkFbQ1zFTGDKZBK3WumiDwba26l84hcUcZi+ KeAMQAZ38/joIu8maFOu2EHqny2Jv7ZB/acWnRALwnxCm2iVJGjduy77LmEgXB+ShtBG jcFkVK5/JMw7cJIN/6Y7tIbRAZksipXFwLBObQsrXcsL1ooxirL1gpt7BOQbNfKUuFUt CUjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787854688; x=1788459488; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=DOqePx/fvAb2uUxt/VBHwZXtTfO5bd6bJUnU0qX6xfA=; b=SzuTkPxg0nv6F9w7XA4esVXxceMJ6sIlzwwlY+9K9gVQnilvqBNuDiAk85PGwBEjyK vtfZMvc4FO0t749ITKpuWyGFM6C3jHIlYZN+Hxp/Yzmj4R/GqN9CXwHGX3Sw1lA7jR9P FDdPmfUxWNoizRx4WwMSH93yerurhzpq34TNU7kyikIJq+Ad1hAaH0aD7uCVxsezjh8f O75c5pl4taDIj3WdcSRXBNCzRoNEz0LqscLec65pvqcbOSS2/TL8wHyJ+MZChHEwro3r mm5xkUshllNuN2/ntMJrIDK838jMZHF185SX2AQkjpEObWIGLTpQCcjX/IVon0TVZM7r jfbA== X-Forwarded-Encrypted: i=1; AHgh+RrEZgpoNE4A+F1NGwchvxW51LFQgmYl2uMecmRCeIPL3wGv5IhncwjAtsRJyuDuaYXrPqDJkDBbgKTkDtk=@vger.kernel.org X-Gm-Message-State: AFuF++ngUsdCdXMoBhvnNm9SPpKVQ6StcKNdReo5EPJzJoj6gaqc/37f klwykmKzRIqXCeTLygQKIaecIr8oO/Te8Lyus0c9DJte8j8btwWnTBuC X-Gm-Gg: AR+sD136ZGWlMC/+FClwmEDIo0B81SB665KQ/4nzoLXRmmIHW5baESnm32oB9/Tt2Rp 0YOSGnWuXuyE8mPjK4iQiLbzmKium39yjYHlIE71aJUWnanC11yf8071I3gYcmbITwszwSg7nHN it22DnQz01aj+79uxzympf/fInM/8imMx77fgbUulA1N/mB5eELGH1weGWm537i6cBt2mjk87fS bgDdV7YiBHblIkgX38YDAl4H1rhKAzakkCD7ASh6W3hlKtcjcnzZOk94SMlQ1y7GGU23RclPxiP 2kvtQGL64wQSbD++ygDUh8tfFYxgYbsxZqYqjndWRMHCoyIm4xuyrys+6d44BCq5h2PsVRrWo9F qVV9NJU0BIfFX30zluuHgk5BlywKThqaZ5KmRb8PNgvRC3toSmMxX4J2gV+5tbT9pjpoEl9BIBo XAYrgp3Rfh9z5pi2Vbh9KBYx96/BppxZxgw61sFd4SjAkqu8hSlVCER8BPDtaTFnjiSEWG9TR92 6korJ5VxiP/iHfsALUuNMzFOMOja61wjXRcUgQTyNo+ X-Received: by 2002:a05:600c:c4aa:b0:499:d513:e507 with SMTP id 5b1f17b1804b1-49b91c17d72mr10375995e9.2.1787854687907; Thu, 27 Aug 2026 11:18:07 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b497fa9c5sm66270655e9.4.2026.08.27.11.18.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 11:18:07 -0700 (PDT) From: Maurizio Casciano To: linux-media@vger.kernel.org Cc: Mauro Carvalho Chehab , Sakari Ailus , Bingbu Cao , Jacopo Mondi , Nicholas Roth , Andy Shevchenko , Andy Shevchenko , Hans de Goede , Greg Kroah-Hartman , Jose Maria Martin , =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v2 04/11] media: ov2740: Add OVTI2740 ACPI ID Date: Thu, 27 Aug 2026 20:17:49 +0200 Message-ID: <20260827181756.2430054-5-mauriziocasciano7@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260827181756.2430054-1-mauriziocasciano7@gmail.com> References: <20260826132256.3343451-1-mauriziocasciano7@gmail.com> <20260827181756.2430054-1-mauriziocasciano7@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Firmware may enumerate OV2740 image sensors using the OVTI2740 ACPI ID. Add it to the existing ACPI match table. Signed-off-by: Maurizio Casciano --- drivers/media/i2c/ov2740.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/media/i2c/ov2740.c b/drivers/media/i2c/ov2740.c index 8f0ad5dbb245..18bb3ac9701f 100644 --- a/drivers/media/i2c/ov2740.c +++ b/drivers/media/i2c/ov2740.c @@ -1462,6 +1462,7 @@ static DEFINE_RUNTIME_DEV_PM_OPS(ov2740_pm_ops, ov274= 0_suspend, ov2740_resume, =20 static const struct acpi_device_id ov2740_acpi_ids[] =3D { { .id =3D "INT3474" }, + { .id =3D "OVTI2740" }, { } }; MODULE_DEVICE_TABLE(acpi, ov2740_acpi_ids); --=20 2.53.0 From nobody Sun Sep 27 00:40:21 2026 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 57C344CA28B for ; Thu, 27 Aug 2026 18:18:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787854693; cv=none; b=HOdEwsQaapNDVXqF1fPSbRCALCR21SCjzdl87e50KCEI3FHedN+aV6lDmA8iK6fj4e6ynXjQ00ZF4FWpF1SsVt6nJraB3QSCjPNCvbAp8TNMvZ8ngBhTu2sM41oYpQGfkvHGnirjXmXf83jdqvNugfF7bvWKErNuyZfYzIBS3tQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787854693; c=relaxed/simple; bh=0W86G1FVyLrH8eCxu7apKBLqbZHmbhKhBk09k3X289s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jUGaR7GWr44L4xXHJOTdgxNm710mjceQ6S+e0DTboxvDIohL/yuB2YB8MULVSQwQwg1Csit0vGpyeahaHdoQZt0wc5YEnzoJyB4B2YH2/5QPNZyz3c3AvENcCjVlGgksOKfPKuQiuPLiB0YI0SOI61g6JXJqAoUlEhhOX7RS37o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Hl3292NS; arc=none smtp.client-ip=209.85.128.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Hl3292NS" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-49b8eeb3ff2so372725e9.2 for ; Thu, 27 Aug 2026 11:18:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787854690; x=1788459490; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=3oYYPYPZQOW7+2xUgNgawJfoO4cMemnykLQ9bttw7OU=; b=Hl3292NSydJvei6gRxA//C+M55i8MERq0DeG7HIgnS6bO7A1uo803H2AbF/BPSLZhl 8U9foCd4g5q96rwJcgljPsvvHNVpOzr0lpGtdgT9ah4EmHxZ6N12fbhSHXrX3wVSVC0O /1ZaQ2+ohXEnP2Ckow2M5q6sTlUwDjsUO03+5rTEfO4LFcN00uvX2fAimdJXhw64MUwG n59I67reacElewBQ8JoeS0Dpm43cgG16lbj4xHtws9hEqka1dyNzhB5Lh8WAyf+iwl5l sN3HY4qGp+fwdBoyDq3wuwcXxkXE8rbbM0VFv2uRZEBa4WChcMcfPlhqNSRCqenC5seC HRnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787854690; x=1788459490; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=3oYYPYPZQOW7+2xUgNgawJfoO4cMemnykLQ9bttw7OU=; b=D6ckXsQIjWWeAymH9vXa61hM3X4opna7LTCygCCzywwTmCP5iHX/L0D5/UYP2zy3g1 GNnFs6ev7c0s1pB9flPUC+SJoqVVHzN+ZA7NRwZ5qF4lZ2BJS6jOLKKKNd9BBRSrqq6V n5C0ACF8eR6AaBtTnjKPEFQahXWczR6L7zogK1OuPipW3KCtzb5NrpLcTLchQkTX8GqC q0fv1WCFX7XxH6xgyy/E/21M+Pj+qRx77INLrjXZVwBNi/WuVCMTycHw2lUHGhLMnSUi 7d3OgFDNkBVBKkaRw+Q2uvc0QxN0MlSDNtQlCrArrUgdwR1chkyjCoWGpHgw7SOyGyYa 0pSQ== X-Forwarded-Encrypted: i=1; AHgh+Rr8d1vY7Q81rTx5tJ+D9dveNjioy7fv+M0/6JMNCt/QAWTLVPoUA6SPHDhiua8LB7PKWSbfQb+qsoDjB40=@vger.kernel.org X-Gm-Message-State: AFuF++lN9amCRXAuP5oZrFFbONo7qlbPDLY+dKfj9HatMv2L4Ou4rjoX zUD3YKRLS68z/DtLplvRcJdCi+4BIyoCFFCxwp6nCaxrPKAuP4DBJjkb X-Gm-Gg: AR+sD11kz+hscWx5VTNWXdrgeKF56gP74LOSXKWxVpBtEMRHSJyerNrVJ7P0mv/a1oS 9AJKh4LURb5BeY40p8yhLp12Fi5g+qiCWZei76QlNanaOx4zRRyHXHz0LhJdO1XiyNgy5AJwFwJ 7tXP4Qi+zKfGFjaNKCbIqdlt6jXcUTiNh74CHBuU9AOLSwBd37pU2/m3xwbT+HMmuWMSYy89iBL kCQeGpeBSkZBqXHJsWb/Q/OiPyiv4+ezkgJqiMvbMEOP4nbHluItzWZxsoZIHjASPNLn+ctk7kD T2ASyJ0vOjP6UVRBX0BOh6ungfA6pBI0+/RqdZ4z2L68HlbyZtH2RAG5ac3MOt1LFhNPwrpIK2P SwCjl8maOD87+vjKkoiE4OGASPOBf5ijxnfXUZfukzdQTcF06TKZgUx3dfp/qpGfsirKNWrd5zA iXzwxp/d9raqa5n334HI26uRMs98BGalBjcw9N6o01OjO+DirYJT8gP0BRMmZF/vY+RnOZ+OUbb oWOnzFkMbFF3uxPK3Gq9PWU/OCU+e7foJeUr1HPkNuEKMCKzb4RKrM= X-Received: by 2002:a05:600c:3549:b0:496:bffb:fb7b with SMTP id 5b1f17b1804b1-49b91c57464mr10724595e9.10.1787854689919; Thu, 27 Aug 2026 11:18:09 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b497fa9c5sm66270655e9.4.2026.08.27.11.18.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 11:18:09 -0700 (PDT) From: Maurizio Casciano To: linux-media@vger.kernel.org Cc: Mauro Carvalho Chehab , Sakari Ailus , Bingbu Cao , Jacopo Mondi , Nicholas Roth , Andy Shevchenko , Andy Shevchenko , Hans de Goede , Greg Kroah-Hartman , Jose Maria Martin , =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v2 05/11] media: ov8858: Add INT3477 ACPI ID Date: Thu, 27 Aug 2026 20:17:50 +0200 Message-ID: <20260827181756.2430054-6-mauriziocasciano7@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260827181756.2430054-1-mauriziocasciano7@gmail.com> References: <20260826132256.3343451-1-mauriziocasciano7@gmail.com> <20260827181756.2430054-1-mauriziocasciano7@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Firmware may use INT3477 as the ACPI hardware ID for an OV8858 image sensor. Add an ACPI match table for that ID. Signed-off-by: Maurizio Casciano --- drivers/media/i2c/ov8858.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/media/i2c/ov8858.c b/drivers/media/i2c/ov8858.c index b8c2f0d25505..b0ffc366a4e4 100644 --- a/drivers/media/i2c/ov8858.c +++ b/drivers/media/i2c/ov8858.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -2077,6 +2078,12 @@ static void ov8858_remove(struct i2c_client *client) pm_runtime_set_suspended(&client->dev); } =20 +static const struct acpi_device_id ov8858_acpi_match[] =3D { + { .id =3D "INT3477" }, + { } +}; +MODULE_DEVICE_TABLE(acpi, ov8858_acpi_match); + static const struct of_device_id ov8858_of_match[] =3D { { .compatible =3D "ovti,ov8858" }, { /* sentinel */ }, @@ -2087,6 +2094,7 @@ static struct i2c_driver ov8858_i2c_driver =3D { .driver =3D { .name =3D "ov8858", .pm =3D &ov8858_pm_ops, + .acpi_match_table =3D ov8858_acpi_match, .of_match_table =3D ov8858_of_match, }, .probe =3D ov8858_probe, --=20 2.53.0 From nobody Sun Sep 27 00:40:21 2026 Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 48F6B4D90C3 for ; Thu, 27 Aug 2026 18:18:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787854695; cv=none; b=MIUPDVxo6JUjarq4xCPRBpU6Za13IYItPGLNly7jg+PEnVbGrQzQ7KIWW/r8u3XcNV0UZnyiU0Cxz1X4ZLybz1RZibPq0q85Q4l3Vtgx7Ouo4DVl5eOahUWNRuCDaVrpJFtJdG7Scsfjg0GYsRick7VX6EYf5DElDZ/ivqlWkw8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787854695; c=relaxed/simple; bh=s55Ii6QEsvGG1AvHe17eNCXjO9Ihg5gS51wo2byNVTg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LHv9HhTjJC74SJs9idjvEwYktGkmq+FVCAPKVKUe4IE2o/Xh8UIxfffLyESG3BjuPJdwGemNJO2OvepSL9TA1NhfCKNUVFu+9hTlylrw4q4gI2maDAzMRGILro6L5I2qug8FsduW7kgKoBKmYIEiesZitYo4d/tQz82USlMpQIs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=rS8c6GRN; arc=none smtp.client-ip=209.85.128.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="rS8c6GRN" Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-49557167508so621335e9.1 for ; Thu, 27 Aug 2026 11:18:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787854692; x=1788459492; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=+2BPxcfXD6mUVU6jhTybUN7wv/xdZ8rSO2UHVcgmlHg=; b=rS8c6GRNzy8gd2CgbyJjFX1+/4c+4ZA16oDC33F4vfDwiQwodpx4qFWqcRr0khmY89 t4HFzQjI47OetUrg7HmReo1FC3NNL+3JabuvS4nHZuElhKtBj3PGSMXx4kh3BDtI0K5s ZnRIEBuuQtphFdBcG3qIzYYirbQqgvoTiTRDX1t/j5QxEN795Vxs8XgdJsGQPK7C+4l1 5+ZU4OCAXRa6JV58LWZlrxnHv+Yk4ClRZQiS4lgGGT1qRa2VqiGhd29V82Asgz/bK3fK u46Rud1Q5MIBavVlXdiWh25GnP8RDzbDVy+vlfjHsSx+q27Wn0mcCZhIg7Sn96L8csYq BmSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787854692; x=1788459492; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=+2BPxcfXD6mUVU6jhTybUN7wv/xdZ8rSO2UHVcgmlHg=; b=kdSe9WHbXfLSUIuS2IGCfi+16kJfyqv1eE0tslJKW/H7fqXpHbsKYVDoNOh61R/YPa 8Y9vhEgQs+kfuCs3enJ/1XBUEm9rrNPqdfktnv/KGk7zg4U+/XmV7EDu1Nb6LCSRQrZ+ gxBuWrCsgpKymi3mz9X3KfAmXdSDc3Fk/CMsAtxyGFBv3DdLcJk5/W1RbIfYBJbig3hw 3eS4frZN0DkDR0dF99cuxRBCeCZo8ymezNEwk+4J7JI0u7e3t+CXMgjIqA42w4OkUngh Y0f62a3xYdhqs5ZsbR1JmXUmUp6D6TK00KRhW2zX9A2BT8PaaXGHI/h2kTZjrjxL8WSm js/A== X-Forwarded-Encrypted: i=1; AHgh+RpOtt9e47eTuTVhDISatnXsnL+ohQxIqLvZIBGgxrmgehN6SxQJXLlkTiLJ3GpULr3bkv12sqMfY0/CPsc=@vger.kernel.org X-Gm-Message-State: AFuF++m+6MRKP0E1lhlWsIEM84QGcL0mHBnoYoIN0nyj2aC6c2gQo2l3 06LfzIiUBKmcaQP80TucveQj3tNWm7TyIq8FDiFYXHh3jODMzzEhs4Ku X-Gm-Gg: AR+sD10hPlnNABZjim0dI13WTbpjsjMEa+YWCqZQv7ZhWpmuK5Oj8Ny0oRdaZDu7H+x yzn9cEB1H3KnRegmr8BlV4pidTEuBtugPNYgn4Vko+w4QTPhJdHYGa3PqIJ6IVa6RE7BZFtOvkf wjTne77ArAPRoSfBlOSPxkgSxkC05yGlcwvz1WS6waLcVPi63zzzv+HVz82R8O7v8iZdezxfj6b Zy32QM4Ej+pjjKWWjdJAn/MATt2kODMTL+dsO2HCSaowwNTNeLLdSyGlp3f6Dld+vw36MsJiyr4 wzZAEIhcwvROMP3GL9PBqqqG975jEpXSJyl2cWyzCcZLuwdheL5LzDbg50ahfO09h33SX3w2rqw ULQX+QgYvyUjdq2HiBVaNFAMeq2HAphGgysu2wWcPqR3BgR9H75JGpmVRLmRRfsQVTmzK0aCc8A xZPfgyQ+3D3OC8VvGw/LIPP1cRnt2s3HLt5Ql6HLnn4EERzkViQwX6Ie5jetKYF0Cj3M6UsCZBC 4Eop3esuOmzvugDzGP9/cW136CO8zkfF3X7XgM2EfhcHC7Hm0g9DZQ= X-Received: by 2002:a05:600c:4e14:b0:499:ae94:be05 with SMTP id 5b1f17b1804b1-49b91bd78c0mr16681215e9.0.1787854692236; Thu, 27 Aug 2026 11:18:12 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b497fa9c5sm66270655e9.4.2026.08.27.11.18.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 11:18:11 -0700 (PDT) From: Maurizio Casciano To: linux-media@vger.kernel.org Cc: Mauro Carvalho Chehab , Sakari Ailus , Bingbu Cao , Jacopo Mondi , Nicholas Roth , Andy Shevchenko , Andy Shevchenko , Hans de Goede , Greg Kroah-Hartman , Jose Maria Martin , =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v2 06/11] media: intel: ipu-bridge: Add Yoga Book camera sensors Date: Thu, 27 Aug 2026 20:17:51 +0200 Message-ID: <20260827181756.2430054-7-mauriziocasciano7@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260827181756.2430054-1-mauriziocasciano7@gmail.com> References: <20260826132256.3343451-1-mauriziocasciano7@gmail.com> <20260827181756.2430054-1-mauriziocasciano7@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The Yoga Book YB1-X91 uses INT3477 for its OV8858 rear sensor and OVTI2740 for its OV2740 front sensor. Add link frequencies consumed by the sensor drivers when the IPU bridge constructs software endpoints. This supplies endpoint data only; it does not establish that either sensor can stream on the Yoga Book hardware. Signed-off-by: Maurizio Casciano Assisted-by: Codex:gpt-5.6-sol sparse --- drivers/media/pci/intel/ipu-bridge.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/media/pci/intel/ipu-bridge.c b/drivers/media/pci/intel= /ipu-bridge.c index 1bb3a3e98d6b..47317c423fad 100644 --- a/drivers/media/pci/intel/ipu-bridge.c +++ b/drivers/media/pci/intel/ipu-bridge.c @@ -65,6 +65,8 @@ static const struct ipu_sensor_config ipu_supported_senso= rs[] =3D { IPU_SENSOR_CONFIG("INT33F0", 1, 384000000), /* Omnivision OV2740 */ IPU_SENSOR_CONFIG("INT3474", 1, 180000000), + /* Omnivision OV8858 */ + IPU_SENSOR_CONFIG("INT3477", 1, 360000000), /* Omnivision OV5670 */ IPU_SENSOR_CONFIG("INT3479", 1, 422400000), /* Omnivision OV8865 */ @@ -93,6 +95,8 @@ static const struct ipu_sensor_config ipu_supported_senso= rs[] =3D { IPU_SENSOR_CONFIG("OVTIDB10", 1, 560000000), /* Omnivision OV2680 */ IPU_SENSOR_CONFIG("OVTI2680", 1, 331200000), + /* Omnivision OV2740 */ + IPU_SENSOR_CONFIG("OVTI2740", 1, 360000000), /* Omnivision OV5675 */ IPU_SENSOR_CONFIG("OVTI5675", 1, 450000000), /* Omnivision OV8856 */ --=20 2.53.0 From nobody Sun Sep 27 00:40:21 2026 Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CF3544D98FA for ; Thu, 27 Aug 2026 18:18:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787854698; cv=none; b=FkTsinhW7neKcg2F6brIpI8mMVddDTE6ThkQn+ESfiaotfDYxEcm8kKm97J0iQ0M5DmnRkk4Hv1u+qyMvYjURhSRtKEEK3v/M+SHFqRu4eRbjah72kiB6XMtuL1GCVWIipkD2vp9T1eARBocDDV/KPISmluwS0FIPPzI4AX8wok= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787854698; c=relaxed/simple; bh=zNg9hW5D8DfY6cxbJI9eBWDVBL+I9NugvrjlC/Bu+EA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=u+QXahqvB7/AZPH/P6Ht12wQEh3boNfQbZxC1n6IDU/uMcw7aJ6E5NVkBNiUQOA50ygF+L9KkRnfj1828Upi34+V4ngUu3L1rB2ANgdUFMwi7URDSWQyAmFiya48pQL+quWnJeWOD2biOCluVNVJb1NLolOQbrLvK7rSVxrpBog= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=PotZtWAI; arc=none smtp.client-ip=209.85.128.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="PotZtWAI" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-4980fe6b3beso8870445e9.0 for ; Thu, 27 Aug 2026 11:18:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787854695; x=1788459495; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=FKiURqLEO6GLiHVAiPzakCM7/0KgqMwtzahpI4nlMQg=; b=PotZtWAI/oP+3FE1mILaeqWztJ3Rzh3OfCA+Qs9YXfy0ELvnuXHRxBf2NEdSB8+Aq+ t8Tb/yIjLhB2eZ4Dpm1O8fjkZZ53ASOFnWMi9/L7H8c8b/2Wfz/2IlHwlsTgd6ncmxjy PSJX12Sv/VdSGi7wzbNFOxFxDJWdvpUs7PUSTjQegLoLjBGPKXZ1+FyLvR+hNjPulGYx oeyRvffPgx+EbW6PuJOHztuzIv9J2iwIb3cN57oIUZM2HA0fUWkOyTMOoH7OXaoxDjxZ ewsOrCufHzNVYQAVT+AG+hvuZTz0RKX0nctfu8scnWjt3xZid2H+wke02VwRU22JZKpx ftpg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787854695; x=1788459495; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=FKiURqLEO6GLiHVAiPzakCM7/0KgqMwtzahpI4nlMQg=; b=TGbCfMhpmmrDciMwAS8YfEGAMaryPKrcOay6jpL5Kz/U6X5MR3wUlnBNDWx+nA4RuM 8bJY6G6OSsTbT5zg87AGuK2+kFQWrP69saGBLpYwmX/Dtcj8QxoWdGP8s9LQ4fdHwYq1 5qCvz8fzhEPNOoKYgglM/8VCvjR/G3QOLcote+NjrCPbLY7m86oA1Y4LEecPn2rKgteY ZRwQy294VaHDn0vRshSQFqh1tf8PmVaj9e5ZDyW1pVSjFJZUUjF3rick8NslS4RddIYF k9w+g2rLUl5XAKhKWoya4iDwxhRufwsiF+qwasoHwdaU6F7taxfElZ+JGu2rYC/JBTCR gn+A== X-Forwarded-Encrypted: i=1; AHgh+RrpXg8sA8C9aGNdfDE50E3CzikBIKuttfaymFwzLKGxVH2FY8QImSIHr03ZiytE0fApozwX9nIZ+sOX2XA=@vger.kernel.org X-Gm-Message-State: AFuF++mHRlwrJjICUhSKl4hJJQb5NTrmRIXhW5Gdv7p/w5t8kYaIgBuA dZ4sZ3uM8O9MI3/8kAW4xg/GPFpHSfA+7bmCfhbwj1TuOJd9DkZEnlXu X-Gm-Gg: AR+sD108jovGWwICEYAiHSCfYSozMNSQylHlW2z1Zb9t0euLGyLoqCyxlm/JJ5ve+bz Kr7jZKW5EyanaSvHqUJ9sHLT4VBSxLS7sopMuLVHLcTi4lyPOHd37KxJqxI0bmMO+rzUeYhRiWW 4izaNTJfLOBW2mdfwHDLs7UW/4Y0hTvMx8jbv9Wlh08SzhB85DwLRegFDR3OcMiartTKL8Bz61J v0FTaZWesd/daooR5eNopye+qXtWnwmSKozgAQDgvdBEMy8vG6qXWEa0ibnSUvfc14eXn6QY5w/ pU6T5NexPRB1gUXogt8B466pSgrYxhK0UUtY4AIU8GV0DY+9elyx65m1TkdeNK98e5YoSGlw3sx JujjPjDRb/aNwaWnzyq1r0kaWnallIqprT8+w4ZrE8t9G8xkZpEjILeBbGROLgOC3y0z59BueER wHiYgVtKREll3u17POJE4sIVS3FUXw98pQicWSWYMnFIB75/DHISjG/7Hzi16sSIMnLOqzvnxP4 Ad6xys2SNYGEkSrM6l+54gA/VdL6Og+e/6DzCfMsGQl X-Received: by 2002:a05:600c:8b26:b0:49a:ce8f:1a5e with SMTP id 5b1f17b1804b1-49b91a2bab2mr17583105e9.2.1787854695146; Thu, 27 Aug 2026 11:18:15 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b497fa9c5sm66270655e9.4.2026.08.27.11.18.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 11:18:13 -0700 (PDT) From: Maurizio Casciano To: linux-media@vger.kernel.org Cc: Mauro Carvalho Chehab , Sakari Ailus , Bingbu Cao , Jacopo Mondi , Nicholas Roth , Andy Shevchenko , Andy Shevchenko , Hans de Goede , Greg Kroah-Hartman , Jose Maria Martin , =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v2 07/11] media: atomisp: Add Yoga Book camera configuration Date: Thu, 27 Aug 2026 20:17:52 +0200 Message-ID: <20260827181756.2430054-8-mauriziocasciano7@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260827181756.2430054-1-mauriziocasciano7@gmail.com> References: <20260826132256.3343451-1-mauriziocasciano7@gmail.com> <20260827181756.2430054-1-mauriziocasciano7@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The Yoga Book YB1-X91 firmware lacks usable AtomISP configuration for both cameras. Rear INT3477 OV8858 uses four CSI-2 lanes and a WV517S actuator; front OVTI2740 uses two lanes and no actuator. Add both sensor configurations and a DMI-scoped two-lane override for OVTI2740:00. Keep the quirk limited to Lenovo YB1-X91L systems. Binding and media nodes do not prove streaming; both sensors and the focus actuator still require physical tests. Signed-off-by: Maurizio Casciano Assisted-by: Codex:gpt-5.6-sol sparse --- .../media/atomisp/pci/atomisp_csi2_bridge.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drivers/staging/media/atomisp/pci/atomisp_csi2_bridge.c b/driv= ers/staging/media/atomisp/pci/atomisp_csi2_bridge.c index cca91c6d71a5..207ab69385b5 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_csi2_bridge.c +++ b/drivers/staging/media/atomisp/pci/atomisp_csi2_bridge.c @@ -74,6 +74,12 @@ static struct gmin_cfg_var lenovo_ideapad_miix_310_vars[= ] =3D { {} }; =20 +static struct gmin_cfg_var lenovo_yogabook_x91_vars[] =3D { + /* The vendor driver and sensor modes use two CSI data lanes. */ + { "OVTI2740:00", "CsiLanes", "2" }, + {} +}; + static struct gmin_cfg_var xiaomi_mipad2_vars[] =3D { /* _DSM contains the wrong CsiPort for the front facing OV5693 sensor */ { "INT33BE:00", "CsiPort", "0" }, @@ -83,6 +89,14 @@ static struct gmin_cfg_var xiaomi_mipad2_vars[] =3D { }; =20 static const struct dmi_system_id gmin_cfg_dmi_overrides[] =3D { + { + /* Lenovo Yoga Book X91L */ + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_NAME, "Lenovo YB1-X91L"), + }, + .driver_data =3D lenovo_yogabook_x91_vars, + }, { /* Lenovo Ideapad Miix 310 */ .matches =3D { @@ -360,6 +374,8 @@ static const struct acpi_device_id atomisp_sensor_confi= gs[] =3D { * an i2c-client for the VCM, so it is disabled for now. */ ATOMISP_SENSOR_CONFIG("INT33BE", 2, false), /* OV5693 */ + ATOMISP_SENSOR_CONFIG("INT3477", 4, true), /* OV8858 */ + ATOMISP_SENSOR_CONFIG("OVTI2740", 2, false), /* OV2740 */ {} }; =20 --=20 2.53.0 From nobody Sun Sep 27 00:40:21 2026 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 41141499F3E for ; Thu, 27 Aug 2026 18:18:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787854701; cv=none; b=R9ygKLsB/TAy9xbYHHYweyuT8lHNl1Sg1k6nK1Lil1zQ0k0ZdVmloELjIB/bHqL8HmBG4R/CxTG/dASX3zf7381V+gavxXsaXzpJO5kHst6Px43f/cW6TgV+I12QLkzWri/gASYMllHT7GzPPlgoryPP4Ak99IEYr8O16nbXJdw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787854701; c=relaxed/simple; bh=zJC2HB32+JXCjD512I7U1hVRTVGF6L/TxI8BVOW+7MY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VkeTqkl/pv9FKX7Q36lBk+Q6vC4VLerQ0S3chPvKIvJ75wYsZ1KyKiRurtt93dip3Jb2UAXRHBncbf4EP89QICPoaKLnRasYeiW2sk91EbXlx8FDxJQ2IA3YD+9+yc3IsXbUuh5uJKIRhD+8WB1wI3WcueeFnSdpBkYH9rBjozo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=iZ104WsH; arc=none smtp.client-ip=209.85.128.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="iZ104WsH" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-493b966dd74so106025e9.3 for ; Thu, 27 Aug 2026 11:18:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787854697; x=1788459497; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=4KiShH8teAy3Xcb1g5dIZwlXQwDYiidvazyGvfYvqzI=; b=iZ104WsHmaceIz2Xjl6ebR7wWFJWTbYiKcmyH34Fe36lzadIuWryGGqxbXVoAgCB4B zBJ+qLN5EUAAYa7AGtmghCJI2IGmz4OgIjuPEhoeWC7OE3lSvuS75hrqNSUL+sWWpBdn 83d0zSejb0zOaMEjqexeHtCHq8imasY6vklmSgPBAkeXEz7F3fK8SIXmF8a+AES3hRPV AcuX8TPe8n3sTswMFrsdAFIJtduqR3PLmiPXe+xmRK97WtTdQA+v/eBU8slNI/WQzQ/2 paAmZ5FoRgIP5vtbo7G0hZ8alXmghsz7kfjzO2b1GvfiBOJBhyS4dht0oPNoZvx/zSAe uEiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787854697; x=1788459497; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=4KiShH8teAy3Xcb1g5dIZwlXQwDYiidvazyGvfYvqzI=; b=K7puxtA/U8ITkso3CM2XWw90ujJeZT+mkQ2yZkokLRF20tBI7Tj+3XMd4U0r8V+OY2 mIEgWXCY0LdmxpEgd0SkofwoLXyiDttqoWd5w7pzy4mC3GznwLPrZHJNQnrnu2sZtu3g YdZ+SyJOHE9ChdABDzLrxCUcHU+/6b7y2TkS5BLvSC8Jjv/qAWvPqAK10Twx9wfmDKV2 pwZDWJQNLWaYgwt2ojpGb2Vn8rmZ1Pk8ZHEhdo93fD22djrt0DkM43wnm2W+h+QoVC2V jjA0h+rvMiDrCDB7zBu53+AT7BMDz3B6Uebk55VNRRlw3+kHuSn8299tT7PbX6KleYz8 vLTg== X-Forwarded-Encrypted: i=1; AHgh+RonzE3/iBg4dwlVSEzos8ETbAuu16saI9mXmsBeoEIef+hT+ufdUT/3D4Lm+VPzqZlHJplrfJ3p1TUn4J0=@vger.kernel.org X-Gm-Message-State: AFuF++kmhTjU3p0uvfKVaLG21nSCAVdRG14ceCZAFXrLwD8QDXsJQZYB 0OjDgkvwv6fZTVao+wIuQIkW91PHSzrk90uIzp24txqyZUjWqsCOlMbN X-Gm-Gg: AR+sD10O0LhdeQlhTNSMONdzFtcuePatz/VjpoacDd0Etfj7+1ESWkEInYmkx04x9C8 +QV06FILJcwxnyF/6Na1Khd1JM6gNZAU+L02Cm2WDOWz78YPmSIMKt//LkECCjt7Lh3bGAeNRsf CsuZDaqnS1SgBRYxDrXiJMjc5qzH7e41jtWuTaTqFUI+2ZNRaKflvkdkU/3TxLA8HfgRLxGs/E4 diLKTRbhJrnru/QQlldUt5PAF+GgxH1jTUe0L3j3xFNe3cpu+urx3wyCor+gXHLKOaMWd9L+Zie vkSNXpGYDwnd8CxjPfZlh6UOefXYPoaz7E3zTn2LOLetqsIN8umtu2LS9eOyo5YDWOKRF/p5yM9 rB5d6LYOWaqqaQcu2rmMNxwFbWrQ2HGa3tU8xDdZnu8jfJ36ixefk9892j6qG4xQDb6I4q/5KV9 IYb577rHYWXWHGhlN5BcucGb8iCMgL5rdfGnjmTRT/Z34DLdltqihcN5S/9mGsx7K/EkaVSQRXj +pdFM5VxAnPN3PEbl3s/7nbNVaTgmIvFAFJ8xaj8m8A X-Received: by 2002:a05:600c:8b86:b0:493:f5bf:4dc6 with SMTP id 5b1f17b1804b1-49b91c2777emr15338015e9.7.1787854697371; Thu, 27 Aug 2026 11:18:17 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b497fa9c5sm66270655e9.4.2026.08.27.11.18.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 11:18:16 -0700 (PDT) From: Maurizio Casciano To: linux-media@vger.kernel.org Cc: Mauro Carvalho Chehab , Sakari Ailus , Bingbu Cao , Jacopo Mondi , Nicholas Roth , Andy Shevchenko , Andy Shevchenko , Hans de Goede , Greg Kroah-Hartman , Jose Maria Martin , =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v2 08/11] media: atomisp: support the Yoga Book OV2740 link Date: Thu, 27 Aug 2026 20:17:53 +0200 Message-ID: <20260827181756.2430054-9-mauriziocasciano7@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260827181756.2430054-1-mauriziocasciano7@gmail.com> References: <20260826132256.3343451-1-mauriziocasciano7@gmail.com> <20260827181756.2430054-1-mauriziocasciano7@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The YB1-X91L firmware does not describe the complete camera link. Its front OV2740 uses two CSI-2 lanes at a 288 MHz link frequency and sends a 1932x1092 BGGR transport frame with 12 pixels of horizontal and vertical padding around the 1920x1080 image. Allow the AtomISP bridge to provide per-sensor link frequencies and padding, add the matching OV2740 mode, and derive ISP2401 D-PHY timing from the sensor link-frequency control. The register values are hardware configuration facts checked against the Lenovo YB1-X91L configuration and physical captures; no proprietary driver code or tuning binary is included. Tested on a Lenovo Yoga Book YB1-X91L with continuous front-camera raw capture. Signed-off-by: Maurizio Casciano Assisted-by: Codex:gpt-5.6-sol sparse --- drivers/media/i2c/ov2740.c | 103 +++++++++++++++++- drivers/media/pci/intel/ipu-bridge.c | 15 ++- .../staging/media/atomisp/pci/atomisp_csi2.c | 17 ++- .../staging/media/atomisp/pci/atomisp_csi2.h | 2 + .../media/atomisp/pci/atomisp_csi2_bridge.c | 53 ++++++++- include/media/ipu-bridge.h | 2 + 6 files changed, 173 insertions(+), 19 deletions(-) diff --git a/drivers/media/i2c/ov2740.c b/drivers/media/i2c/ov2740.c index 18bb3ac9701f..6083dd28e4ad 100644 --- a/drivers/media/i2c/ov2740.c +++ b/drivers/media/i2c/ov2740.c @@ -12,12 +12,14 @@ #include #include #include +#include #include #include #include =20 -#define OV2740_LINK_FREQ_360MHZ 360000000ULL -#define OV2740_LINK_FREQ_180MHZ 180000000ULL +#define OV2740_LINK_FREQ_360MHZ (360ULL * HZ_PER_MHZ) +#define OV2740_LINK_FREQ_288MHZ (288ULL * HZ_PER_MHZ) +#define OV2740_LINK_FREQ_180MHZ (180ULL * HZ_PER_MHZ) #define OV2740_SCLK 72000000LL #define OV2740_MCLK 19200000 #define OV2740_DATA_LANES 2 @@ -91,6 +93,7 @@ struct nvm_data { =20 enum { OV2740_LINK_FREQ_360MHZ_INDEX, + OV2740_LINK_FREQ_288MHZ_INDEX, OV2740_LINK_FREQ_180MHZ_INDEX, }; =20 @@ -130,6 +133,12 @@ struct ov2740_mode { /* Link frequency needed for this resolution */ u32 link_freq_index; =20 + /* Bayer order produced by this mode */ + u32 code; + + /* Optional common settings applied before the mode-specific settings */ + const struct ov2740_reg_list init_reg_list; + /* Sensor register settings for this resolution */ const struct ov2740_reg_list reg_list; }; @@ -142,6 +151,14 @@ static const struct ov2740_reg mipi_data_rate_720mbps[= ] =3D { {0x0312, 0x11}, }; =20 +static const struct ov2740_reg mipi_data_rate_576mbps[] =3D { + {0x0302, 0x1e}, + {0x0303, 0x00}, + {0x030d, 0x1e}, + {0x030e, 0x02}, + {0x0312, 0x01}, +}; + static const struct ov2740_reg mipi_data_rate_360mbps[] =3D { {0x0302, 0x4b}, {0x0303, 0x01}, @@ -458,6 +475,36 @@ static const struct ov2740_reg mode_1932x1092_regs_180= mhz[] =3D { {0x4003, 0x40}, /* set Black level to 0x40 */ }; =20 +/* + * Lenovo's Yoga Book vendor driver uses the generic initialization settin= gs + * above followed by these mode overrides. Unlike the generic 720 Mbps mo= de, + * this is a 576 Mbps two-lane mode with BGGR output from the optical arra= y. + */ +static const struct ov2740_reg mode_1932x1092_regs_288mhz[] =3D { + {0x0302, 0x1e}, + {0x0303, 0x00}, + {0x030d, 0x1e}, + {0x030e, 0x02}, + {0x0312, 0x01}, + {0x3808, 0x07}, + {0x3809, 0x8c}, + {0x380a, 0x04}, + {0x380b, 0x44}, + {0x380c, 0x04}, + {0x380d, 0x38}, + {0x380e, 0x06}, + {0x380f, 0xf0}, + {0x3810, 0x00}, + {0x3811, 0x02}, + {0x3812, 0x00}, + {0x3813, 0x02}, + {0x481f, 0x29}, + {0x4820, 0x01}, + {0x4837, 0x1b}, + {0x5000, 0x7f}, + {0x58f4, 0x32}, +}; + static const char * const ov2740_test_pattern_menu[] =3D { "Disabled", "Color Bar", @@ -468,6 +515,7 @@ static const char * const ov2740_test_pattern_menu[] = =3D { =20 static const s64 link_freq_menu_items[] =3D { OV2740_LINK_FREQ_360MHZ, + OV2740_LINK_FREQ_288MHZ, OV2740_LINK_FREQ_180MHZ, }; =20 @@ -478,6 +526,12 @@ static const struct ov2740_link_freq_config link_freq_= configs[] =3D { .regs =3D mipi_data_rate_720mbps, } }, + [OV2740_LINK_FREQ_288MHZ_INDEX] =3D { + .reg_list =3D { + .num_of_regs =3D ARRAY_SIZE(mipi_data_rate_576mbps), + .regs =3D mipi_data_rate_576mbps, + } + }, [OV2740_LINK_FREQ_180MHZ_INDEX] =3D { .reg_list =3D { .num_of_regs =3D ARRAY_SIZE(mipi_data_rate_360mbps), @@ -499,6 +553,28 @@ static const struct ov2740_mode supported_modes_360mhz= [] =3D { .regs =3D mode_1932x1092_regs_360mhz, }, .link_freq_index =3D OV2740_LINK_FREQ_360MHZ_INDEX, + .code =3D MEDIA_BUS_FMT_SGRBG10_1X10, + }, +}; + +static const struct ov2740_mode supported_modes_288mhz[] =3D { + { + .width =3D 1932, + .height =3D 1092, + .hts =3D 2160, + .vts_min =3D 1776, + .vts_def =3D 1776, + .vts_max =3D 32767, + .init_reg_list =3D { + .num_of_regs =3D ARRAY_SIZE(mode_1932x1092_regs_360mhz), + .regs =3D mode_1932x1092_regs_360mhz, + }, + .reg_list =3D { + .num_of_regs =3D ARRAY_SIZE(mode_1932x1092_regs_288mhz), + .regs =3D mode_1932x1092_regs_288mhz, + }, + .link_freq_index =3D OV2740_LINK_FREQ_288MHZ_INDEX, + .code =3D MEDIA_BUS_FMT_SBGGR10_1X10, }, }; =20 @@ -515,6 +591,7 @@ static const struct ov2740_mode supported_modes_180mhz[= ] =3D { .regs =3D mode_1932x1092_regs_180mhz, }, .link_freq_index =3D OV2740_LINK_FREQ_180MHZ_INDEX, + .code =3D MEDIA_BUS_FMT_SGRBG10_1X10, }, }; =20 @@ -842,7 +919,7 @@ static void ov2740_update_pad_format(const struct ov274= 0_mode *mode, { fmt->width =3D mode->width; fmt->height =3D mode->height; - fmt->code =3D MEDIA_BUS_FMT_SGRBG10_1X10; + fmt->code =3D mode->code; fmt->field =3D V4L2_FIELD_NONE; } =20 @@ -966,6 +1043,15 @@ static int ov2740_start_streaming(struct ov2740 *ov27= 40) return ret; } =20 + if (ov2740->cur_mode->init_reg_list.num_of_regs) { + reg_list =3D &ov2740->cur_mode->init_reg_list; + ret =3D ov2740_write_reg_list(ov2740, reg_list); + if (ret) { + dev_err(ov2740->dev, "failed to set common mode registers\n"); + return ret; + } + } + reg_list =3D &ov2740->cur_mode->reg_list; ret =3D ov2740_write_reg_list(ov2740, reg_list); if (ret) { @@ -1062,10 +1148,12 @@ static int ov2740_enum_mbus_code(struct v4l2_subdev= *sd, struct v4l2_subdev_state *sd_state, struct v4l2_subdev_mbus_code_enum *code) { + struct ov2740 *ov2740 =3D to_ov2740(sd); + if (code->index > 0) return -EINVAL; =20 - code->code =3D MEDIA_BUS_FMT_SGRBG10_1X10; + code->code =3D ov2740->supported_modes[0].code; =20 return 0; } @@ -1080,7 +1168,7 @@ static int ov2740_enum_frame_size(struct v4l2_subdev = *sd, if (fse->index >=3D ov2740->supported_modes_count) return -EINVAL; =20 - if (fse->code !=3D MEDIA_BUS_FMT_SGRBG10_1X10) + if (fse->code !=3D supported_modes[0].code) return -EINVAL; =20 fse->min_width =3D supported_modes[fse->index].width; @@ -1178,6 +1266,11 @@ static int ov2740_check_hwcfg(struct ov2740 *ov2740) ov2740->supported_modes_count =3D ARRAY_SIZE(supported_modes_360mhz); break; + case OV2740_LINK_FREQ_288MHZ_INDEX: + ov2740->supported_modes =3D supported_modes_288mhz; + ov2740->supported_modes_count =3D + ARRAY_SIZE(supported_modes_288mhz); + break; case OV2740_LINK_FREQ_180MHZ_INDEX: ov2740->supported_modes =3D supported_modes_180mhz; ov2740->supported_modes_count =3D diff --git a/drivers/media/pci/intel/ipu-bridge.c b/drivers/media/pci/intel= /ipu-bridge.c index 47317c423fad..5730a95767a2 100644 --- a/drivers/media/pci/intel/ipu-bridge.c +++ b/drivers/media/pci/intel/ipu-bridge.c @@ -520,11 +520,16 @@ static void ipu_bridge_create_fwnode_properties( sensor->prop_names.remote_endpoint, sensor->local_ref); =20 - if (cfg->nr_link_freqs > 0) - sensor->ep_properties[3] =3D PROPERTY_ENTRY_U64_ARRAY_LEN( - sensor->prop_names.link_frequencies, - cfg->link_freqs, - cfg->nr_link_freqs); + if (sensor->nr_link_freqs > 0) + sensor->ep_properties[3] =3D + PROPERTY_ENTRY_U64_ARRAY_LEN(names->link_frequencies, + sensor->link_freqs, + sensor->nr_link_freqs); + else if (cfg->nr_link_freqs > 0) + sensor->ep_properties[3] =3D + PROPERTY_ENTRY_U64_ARRAY_LEN(names->link_frequencies, + cfg->link_freqs, + cfg->nr_link_freqs); =20 sensor->ipu_properties[0] =3D PROPERTY_ENTRY_U32_ARRAY_LEN( sensor->prop_names.data_lanes, diff --git a/drivers/staging/media/atomisp/pci/atomisp_csi2.c b/drivers/sta= ging/media/atomisp/pci/atomisp_csi2.c index 95b9113d75e9..035f1addeaae 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_csi2.c +++ b/drivers/staging/media/atomisp/pci/atomisp_csi2.c @@ -5,6 +5,7 @@ * Copyright (c) 2010 Intel Corporation. All Rights Reserved. */ =20 +#include #include #include #include "atomisp_cmd.h" @@ -288,18 +289,19 @@ static void atomisp_csi2_configure_isp2401(struct ato= misp_sub_device *asd) int dat_termen; int dat_settle; =20 - struct v4l2_control ctrl; struct atomisp_device *isp =3D asd->isp; + struct v4l2_subdev *sensor; + s64 link_freq; int mipi_freq =3D 0; enum atomisp_camera_port port; int n; =20 port =3D isp->inputs[asd->input_curr].port; =20 - ctrl.id =3D V4L2_CID_LINK_FREQ; - if (v4l2_g_ctrl - (isp->inputs[asd->input_curr].sensor->ctrl_handler, &ctrl) =3D=3D 0) - mipi_freq =3D ctrl.value; + sensor =3D isp->inputs[asd->input_curr].sensor; + link_freq =3D v4l2_get_link_freq(&sensor->entity.pads[0], 0, 0); + if (link_freq > 0 && link_freq <=3D S32_MAX) + mipi_freq =3D link_freq; =20 clk_termen =3D atomisp_csi2_configure_calc(coeff_clk_termen, mipi_freq, TERMEN_DEFAULT); @@ -310,6 +312,11 @@ static void atomisp_csi2_configure_isp2401(struct atom= isp_sub_device *asd) dat_settle =3D atomisp_csi2_configure_calc(coeff_dat_settle, mipi_freq, SETTLE_DEFAULT); =20 + dev_dbg(isp->dev, + "CSI port %u link frequency %d Hz, clk timing %d/%d, data timing %d/%d\n= ", + port, mipi_freq, clk_termen, clk_settle, + dat_termen, dat_settle); + for (n =3D 0; n < csi2_port_lanes[port] + 1; n++) { hrt_address base =3D csi2_port_base[port] + csi2_lane_base[n]; =20 diff --git a/drivers/staging/media/atomisp/pci/atomisp_csi2.h b/drivers/sta= ging/media/atomisp/pci/atomisp_csi2.h index ec762f8fb922..9298c31bf11e 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_csi2.h +++ b/drivers/staging/media/atomisp/pci/atomisp_csi2.h @@ -45,6 +45,8 @@ int atomisp_mipi_csi2_register_entities(struct atomisp_mi= pi_csi2_device *csi2, struct v4l2_device *vdev); int atomisp_csi2_bridge_init(struct atomisp_device *isp); int atomisp_csi2_bridge_parse_firmware(struct atomisp_device *isp); +bool atomisp_csi2_get_sensor_padding(struct device *dev, + struct v4l2_area *padding); =20 void atomisp_csi2_configure(struct atomisp_sub_device *asd); =20 diff --git a/drivers/staging/media/atomisp/pci/atomisp_csi2_bridge.c b/driv= ers/staging/media/atomisp/pci/atomisp_csi2_bridge.c index 207ab69385b5..502c951cb687 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_csi2_bridge.c +++ b/drivers/staging/media/atomisp/pci/atomisp_csi2_bridge.c @@ -15,6 +15,7 @@ #include #include #include +#include =20 #include #include @@ -43,14 +44,16 @@ static const guid_t vcm_dsm_guid =3D 0x9f, 0x48, 0xa9, 0xc3, 0xb5, 0xda, 0x78, 0x9f); =20 struct atomisp_sensor_config { + u64 link_freq; int lanes; bool vcm; }; =20 -#define ATOMISP_SENSOR_CONFIG(_HID, _LANES, _VCM) \ +#define ATOMISP_SENSOR_CONFIG(_HID, _LANES, _VCM, _LINK_FREQ) \ { \ .id =3D _HID, \ .driver_data =3D (long)&((const struct atomisp_sensor_config) { \ + .link_freq =3D _LINK_FREQ, \ .lanes =3D _LANES, \ .vcm =3D _VCM, \ }) \ @@ -77,6 +80,9 @@ static struct gmin_cfg_var lenovo_ideapad_miix_310_vars[]= =3D { static struct gmin_cfg_var lenovo_yogabook_x91_vars[] =3D { /* The vendor driver and sensor modes use two CSI data lanes. */ { "OVTI2740:00", "CsiLanes", "2" }, + /* Crop the vendor mode's 1932x1092 transport frame to 1920x1080. */ + { "OVTI2740:00", "CsiPaddingWidth", "12" }, + { "OVTI2740:00", "CsiPaddingHeight", "12" }, {} }; =20 @@ -207,6 +213,40 @@ static int gmin_cfg_get_int(struct acpi_device *adev, = const char *key, int defau return default_val; } =20 +static u32 atomisp_csi2_get_padding_value(struct acpi_device *adev, + const char *key, u32 default_val) +{ + int val; + + val =3D gmin_cfg_get_int(adev, key, default_val); + if (val >=3D 0 && val <=3D 64 && !(val & 1)) + return val; + + acpi_handle_warn(adev->handle, "%s: Invalid %s=3D%d\n", + dev_name(&adev->dev), key, val); + return default_val; +} + +bool atomisp_csi2_get_sensor_padding(struct device *dev, + struct v4l2_area *padding) +{ + struct acpi_device *adev; + + padding->width =3D pad_w; + padding->height =3D pad_h; + + adev =3D ACPI_COMPANION(dev); + if (!adev) + return false; + + padding->width =3D atomisp_csi2_get_padding_value(adev, + "CsiPaddingWidth", pad_w); + padding->height =3D atomisp_csi2_get_padding_value(adev, + "CsiPaddingHeight", pad_h); + + return padding->width !=3D pad_w || padding->height !=3D pad_h; +} + static int atomisp_csi2_get_pmc_clk_nr_from_acpi_pr0(struct acpi_device *a= dev) { /* ACPI_PATH_SEGMENT_LENGTH is guaranteed to be big enough for name + 0 t= erm. */ @@ -373,9 +413,10 @@ static const struct acpi_device_id atomisp_sensor_conf= igs[] =3D { * the sensor fails to start streaming when instantiating * an i2c-client for the VCM, so it is disabled for now. */ - ATOMISP_SENSOR_CONFIG("INT33BE", 2, false), /* OV5693 */ - ATOMISP_SENSOR_CONFIG("INT3477", 4, true), /* OV8858 */ - ATOMISP_SENSOR_CONFIG("OVTI2740", 2, false), /* OV2740 */ + ATOMISP_SENSOR_CONFIG("INT33BE", 2, false, 0), /* OV5693 */ + ATOMISP_SENSOR_CONFIG("INT3477", 4, true, 0), /* OV8858 */ + /* OV2740 */ + ATOMISP_SENSOR_CONFIG("OVTI2740", 2, false, 288 * HZ_PER_MHZ), {} }; =20 @@ -394,6 +435,10 @@ static int atomisp_csi2_parse_sensor_fwnode(struct acp= i_device *adev, =20 lanes =3D cfg->lanes; vcm =3D cfg->vcm; + if (cfg->link_freq) { + sensor->link_freqs[0] =3D cfg->link_freq; + sensor->nr_link_freqs =3D 1; + } } =20 /* diff --git a/include/media/ipu-bridge.h b/include/media/ipu-bridge.h index 16fac765456e..633ef0c4cf59 100644 --- a/include/media/ipu-bridge.h +++ b/include/media/ipu-bridge.h @@ -135,6 +135,8 @@ struct ipu_sensor { =20 u8 link; u8 lanes; + u8 nr_link_freqs; + u64 link_freqs[MAX_NUM_LINK_FREQS]; u32 mclkspeed; u32 rotation; enum v4l2_fwnode_orientation orientation; --=20 2.53.0 From nobody Sun Sep 27 00:40:21 2026 Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 437694DA543 for ; Thu, 27 Aug 2026 18:18:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787854703; cv=none; b=EH8ib+efxZwQykG+YdDlIeKfa4LQLyOKZdodsIbjSjvHPgGZ/DvG51apKNHOf50bV0HAjIO46ZC1mJCUOKzc3DC4qimAMkxdwCAe/lAwNHkUXUVCy+mDEkmHj2J8ScT6hVx4S4Gug+s1hLFmWz4YRU6wlx+2zmIGix1qGbsGt/0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787854703; c=relaxed/simple; bh=q4QyCAxtft+YL/amDh4uvcwfSmyXggOPe+Bo7Y39AoE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=scFLjqXvLtb2nrpAvVmlje75HnfIJcU21WaZg0iOAECLe2RtN4Wtf1U2tC0M6lv0KsCkwJmuBe1YYDsK8HRU9gLPOd+Az/9zIL0DH9UqAvYU2vIF403C5CWuHX5lkFfQcdOvcjbiNsvysbKotB6LOhIHKBCXJJ3ae5gCiCm0d9c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=sdfrvsXC; arc=none smtp.client-ip=209.85.128.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="sdfrvsXC" Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-49800c6a846so469525e9.3 for ; Thu, 27 Aug 2026 11:18:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787854700; x=1788459500; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Hgz0BB40fX6hY+eQd47OjT3VIMJyYIXbhigyIL4PMGo=; b=sdfrvsXCI+wwaBvGGYZHdddXznW2zYjF+bVKL1GZ3nj0rKAsSeqWZ6EXxwMLgapegS gQ+IRQnRkoLEl4ImxVebJgTIKDf2r/d7xE2Y6pDh2yyTtwmQMSk43ryuLxsxqSscvakK rxOmlBjWJWEe2JV0K4lZTdXcYfzdrF57euv1H4dbwsowPLg6ZN+cAAu9Mw2eOQwDkN7E X+jhkr43mDdQ4IFNMdKhGdMdE/qeuq8egxqodrL5AvuyxBuwvPMB9TfsOLu4AjYBK5S4 ZPQwlI1S639NmQKJ3spPzPUj2LkX6saKy25B4Dq6NcCiwMvet9lhL5GakAIPDX2Ls9Yh NlvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787854700; x=1788459500; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=Hgz0BB40fX6hY+eQd47OjT3VIMJyYIXbhigyIL4PMGo=; b=aI2SrjjmE+vVRRCP2Q+XUBo5F8nTyMWstwFYCyuOdtkUBU1DOZPe182YaI+dyOV8cs LViGYOD9P+XTDkwLDGsT9Nek3TcDYBi0sHq9fjE+1aIlfTBGTck0wFCyMWZpN0wwZfZZ iFPJDKRak/NKinIfIj6/ICg9hEaKMbvCUIqWIlL1Jy6Qpq2PW0g38O4nPQeoatlRafXL mOQDUmrS2eb+SERvekV4Tavw203BRFc+9Bb0uBr7wZ9Lmq0XXyMfyo78RXCv3ZECqXFV oWtbeONuVcs+qgAo4zaPHNjbKz+lRtHFJTdgfEY8/OXQGoLCNAyzv2dRVEyp7M8u9xIR rdeA== X-Forwarded-Encrypted: i=1; AHgh+RryZziPb+nj1Fe7WV9Z3txgkRtdCZrA4UvTkehKizSVgNXMSy6zLNYHfDHdletKLqyx6MxF1TpL+umfiLc=@vger.kernel.org X-Gm-Message-State: AFuF++ketlUSWMTEbNr3LpRhNeLin5ivPbTO9saHI5FxlghP1VlutJhd UlSFWDelDzyCVYXCoYTN+/XtofKHZa+s0BmBa0Wb6DqlgpkOtPvo2x0i X-Gm-Gg: AR+sD11PmHL7vHfeH/3QLBKE6wWyZv7DCnuTwYxo74gk2p0sRnnFPN340yK+ebnXTpY 0xmYSds6Fj2gZ7anHGfzCC70jo9Fw0TjTzfeqifeLgexwxEuHvc8R/KPFZxI7V0qb46ZbPjxSeX D8c1pjaVKFsYeh0pk2opYy0qaGJ0Qq1LwZf9iCyJHqieEz4wywzRvUas7Z4RM4gvv0OBkSpoqNK 1l7uTkVLsB/y1AiJpnJDQ1TH93HIg7bE3KHKXtvYIsyW2OPO9enbusrAk1B8N1vRomwr3yCnJCR gkpmPAnOOyB44jaaGknSqILeZx3d/KCTHizBYbbBcuIKfgHPc+TVeckQvW+RrkbNlty62aSpLQV O6a2XVV5vMbkAq4IDOYnxPzH6AEuKfpUQERzbRIRuc4AxfZCIMhIHB7i08dMLcKIY8mSqEX8c3g cJ1c9kMq/iMy3GRswhrKAEwGRqzhV8DzxjpqtrYkJdoPW2VByO6775C6hZ6qGEPbG7VPEuUjiFX KRizd1hpyv3RPbI0X7f0d/f7+Zhj3vquecc+H0F7vqK X-Received: by 2002:a05:600c:1d8c:b0:49b:916f:1471 with SMTP id 5b1f17b1804b1-49b91c1df21mr13112225e9.3.1787854700424; Thu, 27 Aug 2026 11:18:20 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b497fa9c5sm66270655e9.4.2026.08.27.11.18.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 11:18:19 -0700 (PDT) From: Maurizio Casciano To: linux-media@vger.kernel.org Cc: Mauro Carvalho Chehab , Sakari Ailus , Bingbu Cao , Jacopo Mondi , Nicholas Roth , Andy Shevchenko , Andy Shevchenko , Hans de Goede , Greg Kroah-Hartman , Jose Maria Martin , =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v2 09/11] media: ov2740: add manual white balance controls Date: Thu, 27 Aug 2026 20:17:54 +0200 Message-ID: <20260827181756.2430054-10-mauriziocasciano7@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260827181756.2430054-1-mauriziocasciano7@gmail.com> References: <20260826132256.3343451-1-mauriziocasciano7@gmail.com> <20260827181756.2430054-1-mauriziocasciano7@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The sensor has separate red, green and blue manual white-balance gain registers, but the driver currently writes the same digital-gain value to all three channels. This prevents userspace from correcting the strong color cast of raw Bayer capture. Expose red- and blue-balance controls relative to the digital gain, update all three channels under group hold, and always release and launch the group even when a channel write fails. Tested on the Yoga Book OV2740 with live gain changes and continuous raw capture. Signed-off-by: Maurizio Casciano Assisted-by: Codex:gpt-5.6-sol sparse --- drivers/media/i2c/ov2740.c | 68 ++++++++++++++++++++++++++------------ 1 file changed, 47 insertions(+), 21 deletions(-) diff --git a/drivers/media/i2c/ov2740.c b/drivers/media/i2c/ov2740.c index 6083dd28e4ad..2d46d8685971 100644 --- a/drivers/media/i2c/ov2740.c +++ b/drivers/media/i2c/ov2740.c @@ -608,6 +608,9 @@ struct ov2740 { struct v4l2_ctrl *vblank; struct v4l2_ctrl *hblank; struct v4l2_ctrl *exposure; + struct v4l2_ctrl *digital_gain; + struct v4l2_ctrl *red_balance; + struct v4l2_ctrl *blue_balance; =20 /* GPIOs, clocks, regulators */ struct gpio_desc *reset_gpio; @@ -737,35 +740,42 @@ static int ov2740_identify_module(struct ov2740 *ov27= 40) return 0; } =20 -static int ov2740_update_digital_gain(struct ov2740 *ov2740, u32 d_gain) +static int ov2740_update_mwb_gains(struct ov2740 *ov2740) { - int ret; + u32 blue_gain, green_gain, red_gain; + int end_ret, launch_ret, ret; + + /* Balance controls use 1024 as unity relative to the digital gain. */ + green_gain =3D ov2740->digital_gain->val; + red_gain =3D DIV_ROUND_CLOSEST(green_gain * ov2740->red_balance->val, + OV2740_DGTL_GAIN_DEFAULT); + red_gain =3D min(red_gain, OV2740_DGTL_GAIN_MAX); + blue_gain =3D DIV_ROUND_CLOSEST(green_gain * ov2740->blue_balance->val, + OV2740_DGTL_GAIN_DEFAULT); + blue_gain =3D min(blue_gain, OV2740_DGTL_GAIN_MAX); =20 ret =3D ov2740_write_reg(ov2740, OV2740_REG_GROUP_ACCESS, 1, OV2740_GROUP_HOLD_START); if (ret) return ret; =20 - ret =3D ov2740_write_reg(ov2740, OV2740_REG_MWB_R_GAIN, 2, d_gain); + ret =3D ov2740_write_reg(ov2740, OV2740_REG_MWB_R_GAIN, 2, red_gain); if (ret) - return ret; + goto release_group; =20 - ret =3D ov2740_write_reg(ov2740, OV2740_REG_MWB_G_GAIN, 2, d_gain); + ret =3D ov2740_write_reg(ov2740, OV2740_REG_MWB_G_GAIN, 2, green_gain); if (ret) - return ret; + goto release_group; =20 - ret =3D ov2740_write_reg(ov2740, OV2740_REG_MWB_B_GAIN, 2, d_gain); - if (ret) - return ret; + ret =3D ov2740_write_reg(ov2740, OV2740_REG_MWB_B_GAIN, 2, blue_gain); =20 - ret =3D ov2740_write_reg(ov2740, OV2740_REG_GROUP_ACCESS, 1, - OV2740_GROUP_HOLD_END); - if (ret) - return ret; +release_group: + end_ret =3D ov2740_write_reg(ov2740, OV2740_REG_GROUP_ACCESS, 1, + OV2740_GROUP_HOLD_END); + launch_ret =3D ov2740_write_reg(ov2740, OV2740_REG_GROUP_ACCESS, 1, + OV2740_GROUP_HOLD_LAUNCH); =20 - ret =3D ov2740_write_reg(ov2740, OV2740_REG_GROUP_ACCESS, 1, - OV2740_GROUP_HOLD_LAUNCH); - return ret; + return ret ?: end_ret ?: launch_ret; } =20 static int ov2740_test_pattern(struct ov2740 *ov2740, u32 pattern) @@ -806,7 +816,9 @@ static int ov2740_set_ctrl(struct v4l2_ctrl *ctrl) break; =20 case V4L2_CID_DIGITAL_GAIN: - ret =3D ov2740_update_digital_gain(ov2740, ctrl->val); + case V4L2_CID_RED_BALANCE: + case V4L2_CID_BLUE_BALANCE: + ret =3D ov2740_update_mwb_gains(ov2740); break; =20 case V4L2_CID_EXPOSURE: @@ -847,7 +859,7 @@ static int ov2740_init_controls(struct ov2740 *ov2740) int ret; =20 ctrl_hdlr =3D &ov2740->ctrl_handler; - ret =3D v4l2_ctrl_handler_init(ctrl_hdlr, 10); + ret =3D v4l2_ctrl_handler_init(ctrl_hdlr, 12); if (ret) return ret; =20 @@ -882,9 +894,23 @@ static int ov2740_init_controls(struct ov2740 *ov2740) v4l2_ctrl_new_std(ctrl_hdlr, &ov2740_ctrl_ops, V4L2_CID_ANALOGUE_GAIN, OV2740_ANAL_GAIN_MIN, OV2740_ANAL_GAIN_MAX, OV2740_ANAL_GAIN_STEP, OV2740_ANAL_GAIN_MIN); - v4l2_ctrl_new_std(ctrl_hdlr, &ov2740_ctrl_ops, V4L2_CID_DIGITAL_GAIN, - OV2740_DGTL_GAIN_MIN, OV2740_DGTL_GAIN_MAX, - OV2740_DGTL_GAIN_STEP, OV2740_DGTL_GAIN_DEFAULT); + ov2740->digital_gain =3D + v4l2_ctrl_new_std(ctrl_hdlr, &ov2740_ctrl_ops, + V4L2_CID_DIGITAL_GAIN, + OV2740_DGTL_GAIN_MIN, OV2740_DGTL_GAIN_MAX, + OV2740_DGTL_GAIN_STEP, + OV2740_DGTL_GAIN_DEFAULT); + ov2740->red_balance =3D + v4l2_ctrl_new_std(ctrl_hdlr, &ov2740_ctrl_ops, + V4L2_CID_RED_BALANCE, + 1, OV2740_DGTL_GAIN_MAX, 1, + OV2740_DGTL_GAIN_DEFAULT); + ov2740->blue_balance =3D + v4l2_ctrl_new_std(ctrl_hdlr, &ov2740_ctrl_ops, + V4L2_CID_BLUE_BALANCE, + 1, OV2740_DGTL_GAIN_MAX, 1, + OV2740_DGTL_GAIN_DEFAULT); + v4l2_ctrl_cluster(3, &ov2740->digital_gain); exposure_max =3D ov2740->cur_mode->vts_def - OV2740_EXPOSURE_MAX_MARGIN; ov2740->exposure =3D v4l2_ctrl_new_std(ctrl_hdlr, &ov2740_ctrl_ops, V4L2_CID_EXPOSURE, --=20 2.53.0 From nobody Sun Sep 27 00:40:21 2026 Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 99C2A4DA556 for ; Thu, 27 Aug 2026 18:18:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787854706; cv=none; b=O1RksV2Wxf9mYxB8Ykd3DaoeUq2AebjQ1CJr5WqKiLUOOO4jxIA+rPREozTvC29UEOlf0VlwstWa4ftR+W9qElOxwMKXT25sLW0CV4SYKU9J2w0aOk6I0kU4KXGkJ+lJiTtFb2U176u79sxcOE66IEXU25TquKQWyIzbsobzCoI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787854706; c=relaxed/simple; bh=RYdrLwH4h+db+xtAWeNMl52pZgc+y52f5gMk/8n3UwI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IlqfBgiSMl8YPNkHzKYR4JSTn/j+bYkEeQU+0oE0A7qqAFbrVxIKtmpcXbts740yVmr/Cm8ebno+EmvYPHgYmNoeAI2muTOnP5mt7F6lTOwWqfF0qbf+9QkOBqjZur5MMNx+dpcxhw1NwWLe1fCA0SlcjNqUpNhBtFOHdlByO/c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=GiC7bbvu; arc=none smtp.client-ip=209.85.128.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="GiC7bbvu" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-49b8eeb3ff2so374975e9.2 for ; Thu, 27 Aug 2026 11:18:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787854703; x=1788459503; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=PdfQB75hwQ5O/YIBlhw3RWCBdEtxxEHY16kGD6NRP9U=; b=GiC7bbvuIw0p2uEJsEk3W0m8L2wTa5VXeVK3nUBtM/vLRJHhrUahsc1nE1YaQlDWJQ A0JEKfO/hCVzl+s970K0qreMc81LMeCBxagA5VDF8//iNKOE2t5/Jk9rG+Xzl7Ky5FdY KCxx8c8Dz4cIv/bDTVYJqHvAiP6QZXJonLf72vqZmEk7tJ6EpO+wTTixG3+Feybs7YDi XwecRiNwDOH3bdjNCDKSVQqrkTdv4hKFYcUenEMvNrt3ODJ53yrEKslPEkSu4wU2NJBw mJYBIf9fqBH4taRVf+d+YyL+bdDZEcfnM/hTuwatAcCyAeyMZaHhCi6zvXgd3X3GZszA G5IQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787854703; x=1788459503; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=PdfQB75hwQ5O/YIBlhw3RWCBdEtxxEHY16kGD6NRP9U=; b=UsfOLqD2O2mo0QljjzxpnGYmqHJ2Bi3JrkZwIoqDSZm4hhQFjCh4ZWfM5JH/JRo1O+ NijHmT1kJ6eeN/r7gSOWUkMul4guWVXDAj9kbqbTG/ot8cb1UqIaKL7J+0x7QqE6ce/5 LskQcTeJAsy/NkrSKQGBp1HSfPImbhvvrEbamIj9tyQX8Dq8YUAwgJVvmk/E1nCSEvwa DCWR7ZWPeWdyWXF+7NIWhQSskGDdZ8yTn55AcWqM47JXeIGQQEgjbx/pAPVcTnNCL/Bm l2+P+NeGWpjpwus0oYcNvq0fZ2ynQ11shkgSptOHUfOXK1suhWA2FZlWh+X4nV9aSa3m gB/g== X-Forwarded-Encrypted: i=1; AHgh+RpNPVYwYnEA9vUxz3o2Zw02yI2ZfYe5xWPZA5pz6kRwunj3BJfK6z53fBRKxH+Q0L/e85WY5mlLl9b67hE=@vger.kernel.org X-Gm-Message-State: AFuF++lnborFYM9k+0aPXC+EzrQ1bHRGKDzyg1Kv0PykxJMmfPMtVcR8 16yzpQtdKIo+4S/UFOBinyNQaEFhGLboYWZrrFZ4m7La3qeTFOPL8q55g64RPiPv X-Gm-Gg: AR+sD11+84izdsRBTyezK/56YdUDb6wJL2oEEwBwdv2EHgNqhZfN8X/DSSUNFpizZ2E qlWVZyaS6SCXVn4ANz1y9l8dGMGne/jSnliwqs+0DqdFAgpcZ/ujgEAK0CnWxv5hbbXFm79KbCW 0nBaunQecqOM4mqfAsy16M1i6ns/E8xUBjsDo6WIcDJWAJgTbz1H/37KFhzG+MfPKjLf/rXblz2 VWqN+wu6518SDqrmlNFXeK+YIcEC4h8hd4ftDwWrFVLXi7HGvmeay8SuGYKVshFlk3s32dfCams uwgRcJIgFwLYjDrJviMoNu4HEY+nRB+yv2Qv4cRIBnuz7FSKrw6fiTmdMX6rxVPA7hbKuWO62oi HgRMDAd4UujsAlfh29iSHKImuCfxApLfF9T90L73KrTyvZvY0SrryB59bxqUtKqt7Eyzc26/x9h kHdVmVs9XwbSw37z7EKFpwp3S2axhJuBRXB0o7VZnPkWnHqFIiEGJIWYRXQ/hqD2/kNtxL3tedX 2nyhVkwYJF262ly0LRpLpJBxiynS474UFVnnKYL5bGX X-Received: by 2002:a05:600c:4ecb:b0:499:d95a:44d with SMTP id 5b1f17b1804b1-49b91bd885fmr17247855e9.0.1787854702790; Thu, 27 Aug 2026 11:18:22 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b497fa9c5sm66270655e9.4.2026.08.27.11.18.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 11:18:22 -0700 (PDT) From: Maurizio Casciano To: linux-media@vger.kernel.org Cc: Mauro Carvalho Chehab , Sakari Ailus , Bingbu Cao , Jacopo Mondi , Nicholas Roth , Andy Shevchenko , Andy Shevchenko , Hans de Goede , Greg Kroah-Hartman , Jose Maria Martin , =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v2 10/11] media: atomisp: allow raw Bayer capture Date: Thu, 27 Aug 2026 20:17:55 +0200 Message-ID: <20260827181756.2430054-11-mauriziocasciano7@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260827181756.2430054-1-mauriziocasciano7@gmail.com> References: <20260826132256.3343451-1-mauriziocasciano7@gmail.com> <20260827181756.2430054-1-mauriziocasciano7@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" AtomISP currently rejects all raw formats and silently substitutes YUV420. This prevents userspace camera processing stacks from obtaining unprocessed sensor frames. Enumerate only the raw format matching the sensor media-bus code and reconcile raw format requests with the code selected by the sensor. Userspace explicitly opts into raw capture by selecting that raw V4L2 pixel format with VIDIOC_S_FMT; no separate module parameter is needed. Also apply the per-sensor padding discovered by the CSI-2 bridge when enumerating and negotiating processed frame sizes. Raw formats expose the full sensor transport frame so ISP2401 can use its copy pipeline. Existing systems retain the global padding defaults. Tested on a Lenovo Yoga Book YB1-X91L with raw capture from its OV2740 and OV8858 sensors. Signed-off-by: Maurizio Casciano Assisted-by: Codex:gpt-5.6-sol sparse --- .../staging/media/atomisp/pci/atomisp_cmd.c | 33 +++++++++++++++---- .../media/atomisp/pci/atomisp_internal.h | 3 ++ .../staging/media/atomisp/pci/atomisp_ioctl.c | 22 +++++++++++-- .../staging/media/atomisp/pci/atomisp_v4l2.c | 9 +++++ 4 files changed, 57 insertions(+), 10 deletions(-) diff --git a/drivers/staging/media/atomisp/pci/atomisp_cmd.c b/drivers/stag= ing/media/atomisp/pci/atomisp_cmd.c index 6cd500d9fd26..70ff9b55b52e 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_cmd.c +++ b/drivers/staging/media/atomisp/pci/atomisp_cmd.c @@ -3572,10 +3572,17 @@ void atomisp_get_padding(struct atomisp_device *isp= , u32 width, u32 height, u32 min_pad_w =3D ISP2400_MIN_PAD_W; u32 min_pad_h =3D ISP2400_MIN_PAD_H; struct v4l2_mbus_framefmt *sink; + u32 input_padding_w =3D pad_w; + u32 input_padding_h =3D pad_h; + + if (input->padding_override) { + input_padding_w =3D input->padding.width; + input_padding_h =3D input->padding.height; + } =20 if (!input->crop_support) { - *padding_w =3D pad_w; - *padding_h =3D pad_h; + *padding_w =3D input_padding_w; + *padding_h =3D input_padding_h; return; } =20 @@ -3588,8 +3595,10 @@ void atomisp_get_padding(struct atomisp_device *isp,= u32 width, u32 height, native_rect.height /=3D 2; } =20 - *padding_w =3D min_t(u32, (native_rect.width - width) & ~1, pad_w); - *padding_h =3D min_t(u32, (native_rect.height - height) & ~1, pad_h); + *padding_w =3D min_t(u32, (native_rect.width - width) & ~1, + input_padding_w); + *padding_h =3D min_t(u32, (native_rect.height - height) & ~1, + input_padding_h); =20 /* The below minimum padding requirements are for BYT / ISP2400 only */ if (IS_ISP2401) @@ -3804,8 +3813,7 @@ int atomisp_try_fmt(struct atomisp_device *isp, struc= t v4l2_pix_format *f, int ret; =20 fmt =3D atomisp_get_format_bridge(f->pixelformat); - /* Currently, raw formats are broken!!! */ - if (!fmt || fmt->sh_fmt =3D=3D IA_CSS_FRAME_FORMAT_RAW) { + if (!fmt) { f->pixelformat =3D V4L2_PIX_FMT_YUV420; =20 fmt =3D atomisp_get_format_bridge(f->pixelformat); @@ -3827,7 +3835,13 @@ int atomisp_try_fmt(struct atomisp_device *isp, stru= ct v4l2_pix_format *f, * resolution + padding. Add padding here and remove it again after * the set_fmt call, like atomisp_set_fmt_to_snr() does. */ - atomisp_get_padding(isp, f->width, f->height, &padding_w, &padding_h); + if (fmt->sh_fmt =3D=3D IA_CSS_FRAME_FORMAT_RAW) { + padding_w =3D 0; + padding_h =3D 0; + } else { + atomisp_get_padding(isp, f->width, f->height, + &padding_w, &padding_h); + } v4l2_fill_mbus_format(&ffmt, f, fmt->mbus_code); ffmt.width +=3D padding_w; ffmt.height +=3D padding_h; @@ -3846,6 +3860,11 @@ int atomisp_try_fmt(struct atomisp_device *isp, stru= ct v4l2_pix_format *f, ffmt.code); return -EINVAL; } + if (fmt->sh_fmt =3D=3D IA_CSS_FRAME_FORMAT_RAW && + fmt->mbus_code !=3D snr_fmt->mbus_code) { + fmt =3D snr_fmt; + f->pixelformat =3D fmt->pixelformat; + } =20 f->width =3D ffmt.width - padding_w; f->height =3D ffmt.height - padding_h; diff --git a/drivers/staging/media/atomisp/pci/atomisp_internal.h b/drivers= /staging/media/atomisp/pci/atomisp_internal.h index 5a69580b8251..66b12461bd40 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_internal.h +++ b/drivers/staging/media/atomisp/pci/atomisp_internal.h @@ -98,6 +98,7 @@ #define ATOMISP_CSS_SUPPORT_YUVPP 1 =20 #define ATOMISP_CSS_OUTPUT_SECOND_INDEX 1 + #define ATOMISP_CSS_OUTPUT_DEFAULT_INDEX 0 =20 /* ISP2401 */ @@ -116,6 +117,8 @@ struct atomisp_input_subdev { enum atomisp_camera_port port; u32 code; /* MEDIA_BUS_FMT_* */ + struct v4l2_area padding; + bool padding_override; bool binning_support; bool crop_support; bool sensor_on; diff --git a/drivers/staging/media/atomisp/pci/atomisp_ioctl.c b/drivers/st= aging/media/atomisp/pci/atomisp_ioctl.c index 50366bf10f32..cf3e68983e0d 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_ioctl.c +++ b/drivers/staging/media/atomisp/pci/atomisp_ioctl.c @@ -536,11 +536,19 @@ static int atomisp_enum_framesizes(struct file *file,= void *priv, .which =3D V4L2_SUBDEV_FORMAT_ACTIVE, .code =3D input->code, }; + const struct atomisp_format_bridge *format; struct v4l2_subdev_state *act_sd_state; + struct v4l2_area padding =3D { + .width =3D pad_w, + .height =3D pad_h, + }; int ret; =20 if (!input->sensor) return -EINVAL; + format =3D atomisp_get_format_bridge(fsize->pixel_format); + if (!format) + return -EINVAL; =20 if (input->crop_support) return atomisp_enum_framesizes_crop(isp, fsize); @@ -553,9 +561,16 @@ static int atomisp_enum_framesizes(struct file *file, = void *priv, if (ret) return ret; =20 + if (format->sh_fmt =3D=3D IA_CSS_FRAME_FORMAT_RAW) { + padding.width =3D 0; + padding.height =3D 0; + } else if (input->padding_override) { + padding =3D input->padding; + } + fsize->type =3D V4L2_FRMSIZE_TYPE_DISCRETE; - fsize->discrete.width =3D fse.max_width - pad_w; - fsize->discrete.height =3D fse.max_height - pad_h; + fsize->discrete.width =3D fse.max_width - padding.width; + fsize->discrete.height =3D fse.max_height - padding.height; =20 return 0; } @@ -629,7 +644,8 @@ static int atomisp_enum_fmt_cap(struct file *file, void= *fh, * * FIXME: fix the pipeline to allow sensor format too. */ - if (format->sh_fmt =3D=3D IA_CSS_FRAME_FORMAT_RAW) + if (format->sh_fmt =3D=3D IA_CSS_FRAME_FORMAT_RAW && + format->mbus_code !=3D code.code) continue; =20 /* Found a match. Now let's pick f->index'th one. */ diff --git a/drivers/staging/media/atomisp/pci/atomisp_v4l2.c b/drivers/sta= ging/media/atomisp/pci/atomisp_v4l2.c index 812230397409..7b4c1c6c1295 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_v4l2.c +++ b/drivers/staging/media/atomisp/pci/atomisp_v4l2.c @@ -25,6 +25,7 @@ =20 #include "atomisp_cmd.h" #include "atomisp_common.h" +#include "atomisp_csi2.h" #include "atomisp_fops.h" #include "atomisp_ioctl.h" #include "atomisp_internal.h" @@ -889,6 +890,14 @@ static void atomisp_init_sensor(struct atomisp_input_s= ubdev *input) struct v4l2_subdev_state *try_sd_state, *act_sd_state; int i, err; =20 + input->padding_override =3D + atomisp_csi2_get_sensor_padding(input->sensor->dev, + &input->padding); + if (input->padding_override) + dev_info(input->sensor->dev, + "using ISP input padding %ux%u\n", + input->padding.width, input->padding.height); + /* * FIXME: Drivers are not supposed to use __v4l2_subdev_state_alloc() * but atomisp needs this for try_fmt on its /dev/video# node since --=20 2.53.0 From nobody Sun Sep 27 00:40:21 2026 Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 858BC4D2EC2 for ; Thu, 27 Aug 2026 18:18:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787854709; cv=none; b=MHwCRHRgE6HcendGPo88WMmj++tEY/ow1er8lI4dddtuRMdRyo3vwlEAdSXCho2DWWB4mollxm20j0a1u7fGSIdhfA8o8D1Ln3ZTAred1yFAxHucA38nCQiC/r5YmP07VDcbd4y5cxVCQi1wybxjJx36a6dYOAEQMHrl59nHQeI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787854709; c=relaxed/simple; bh=LFCRKjervLVX9EGGqaNjNl+m0rlZR6NsJDlFIzG0EAI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ncWuXwFQI8DWDY1ujs/9rvQYWRT2+EJf5P8JGF1kXjTi4Cgs8ScCAxemI9x+VLWncuQfJy/26XDSD2vVibtxf/lJ7C99bqaYYtW/Qp0R2itNmAKIIbClQ7NuNYe9tgMTGUSeX/E7gnI+RdLsb4VHOa6am0ojgUZHZeID1F56e8w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Ygp69Q1j; arc=none smtp.client-ip=209.85.128.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Ygp69Q1j" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-499d1ab3f9dso91945e9.3 for ; Thu, 27 Aug 2026 11:18:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787854706; x=1788459506; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=ZPDHV0axtte8ociQQpFpf2qJ4hiAvGZjDsg76zUsBfA=; b=Ygp69Q1jtAPdMGcwgRIzFD/RC1oIY3l9fl7/je9Bfaqw9ybUaij9NvHhZoilVfH8Om k77eLGt8aOSYnjjAdoN+BRskVO1IxFxwMehFzaJjKFzqdrEKZKPnxVhoL901rYoNwtdL S5MrNytLzZUvjEcGBfV2GooN3cTCg8Pl8StzHSFFL+HfoJisEPnqzUKO+93Kr6QMQevZ K8cbxpYP54p8qQRyw8Y4TdQY3Smtbu2lmojZM3qI8ukLVt+eZ3tjT+rMGYHDpNW+twgp 9HUi88LlfvDc558nVM+yDgpuqCRCGbSSy9WKVF+s7aohCXsXTdAnlJ7LkcsfLm/6Pl4D iGgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787854706; x=1788459506; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=ZPDHV0axtte8ociQQpFpf2qJ4hiAvGZjDsg76zUsBfA=; b=JMf6PBXX6Ii3dS7wmY8pajhJuo9XW79UzT1c/MrmevbhCf3Cuo0vPu4z+TMncdXWFC hjvOl5jBSEYxxmnCh+ljP475sYYbxN4Z/4kMM5Sc5vKjCTUDEhtcU8ewlzimGdQxZpSy bjK8ZHOqQDyOL1zb9SKOaqzyqJydljgz7P2S2MV4eK0bDTkA144ZD1rBfAsnFPFAmyfX qCw/gwJd+P6qZWPApEVqC1/OtbSf8yNWLPQWqp/LkSbrnA46dDD1eXvUH1XYKkQkXX/D 5NEdPLlIPXJKpuGHkjGAKiv8GbIvHLCHC/ZfW8hMglLaAfCLKCR4R3EqRymllVxTFCbQ q5zg== X-Forwarded-Encrypted: i=1; AHgh+RoniYuVs+oyc55DiKHPzHhA6OolMnWPOXYqA53dCR/AMxmNMYow0DuD8DGGNI707jESi0PTXZk+WgB5obo=@vger.kernel.org X-Gm-Message-State: AFuF++n1V2prtX0NDEGamxqOk3b2ACKhJRCAuK51XEuaS5tnp3hEy1cu BZrqWR8Ig6oY8VtzhqVxDY4qhKKku5ZslkC/geDgnhOGjWXclhjZOu4l X-Gm-Gg: AR+sD111aOXsCzfduZGRotGRrUOZONRQ/c89Va0YS1PKJ6MkUuKCE/zMFyonlfV521Q 2hpU8Fv8vKE5lnIwuXRNMpV2OECQcP/7YT3LAW7N/WsM99X0HqP2WqMTPBiR8fPDi0lkakbyMzA L9fFmK08fCNpnOTbY5qOP/gX7DnJoc6VMTlS+kBno8ONrNsgiuQC1XVCznuoH5Dn39/+VKsReF8 r/8JsDk+SqpMc/CQLlM3vfydgkuGaCvrDjYeXBA23ky3ZvWBmgCROZeEq9knPCytnpJ1gPFhXhW bANm/dYDwqkjPyngt8FOk+/35Mam/6ckBg7c8oXtuI0dDXLfGseXnvDJWpIVV/3neO5a/NdN/wH KICLRRwpx9F+8Gk6HkMk22J+eJGTWsIvdSQsbSWf/LhspO+pQuXFMvODVzlHTHjTWM763KbIPFK iIMVw0sX1jUu4suPTKpPIVyRpFrLre5ZYy7dIAgB6lbFujmAFtn+dsC0ZjapehQ+9nWhlIL8WQu dmAPab6DO46Ub/JN1x6l9XtDm16hCsD67EgDz8uETow X-Received: by 2002:a05:600c:3155:b0:49b:910c:7703 with SMTP id 5b1f17b1804b1-49b91c3dcb4mr12368255e9.9.1787854705384; Thu, 27 Aug 2026 11:18:25 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b497fa9c5sm66270655e9.4.2026.08.27.11.18.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 11:18:24 -0700 (PDT) From: Maurizio Casciano To: linux-media@vger.kernel.org Cc: Mauro Carvalho Chehab , Sakari Ailus , Bingbu Cao , Jacopo Mondi , Nicholas Roth , Andy Shevchenko , Andy Shevchenko , Hans de Goede , Greg Kroah-Hartman , Jose Maria Martin , =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v2 11/11] media: i2c: Add WV517S lens actuator driver Date: Thu, 27 Aug 2026 20:17:56 +0200 Message-ID: <20260827181756.2430054-12-mauriziocasciano7@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260827181756.2430054-1-mauriziocasciano7@gmail.com> References: <20260826132256.3343451-1-mauriziocasciano7@gmail.com> <20260827181756.2430054-1-mauriziocasciano7@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The Lenovo Yoga Book YB1-X91 rear camera contains a WV517S voice-coil actuator. Add a V4L2 lens subdevice exposing the standard 10-bit FOCUS_ABSOLUTE control and the device ringing-control mode. Use regmap for register access and tie control updates to runtime PM so the IPU bridge sensor link keeps shared power resources active. Propagate PM acquisition failures and restore the drive mode and controls after resume. The register addresses and drive-mode value are derived from Intel's GPL-2.0 WV517 driver. Retain the Intel copyright notice and document the 2026 copyright for this V4L2/regmap implementation. Link: https://github.com/jekhor/yogabook-linux-android-kernel/blob/574bae69= 2716f1b14093497bfab8a007fe8e460b/drivers/external_drivers/camera/drivers/me= dia/i2c/wv517.c Assisted-by: Codex:gpt-5.6-sol sparse Signed-off-by: Maurizio Casciano --- MAINTAINERS | 1 + drivers/media/i2c/Kconfig | 11 ++ drivers/media/i2c/Makefile | 1 + drivers/media/i2c/wv517s.c | 204 +++++++++++++++++++++++++++++++++++++ 4 files changed, 217 insertions(+) create mode 100644 drivers/media/i2c/wv517s.c diff --git a/MAINTAINERS b/MAINTAINERS index 55b3c2d7a78a..a4380be897e9 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -28555,6 +28555,7 @@ S: Maintained F: drivers/media/i2c/ak* F: drivers/media/i2c/dw* F: drivers/media/i2c/lm* +F: drivers/media/i2c/wv517s.c =20 V4L2 CAMERA SENSOR DRIVERS M: Sakari Ailus diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig index 5c52007f9cbe..c5636e0cbecf 100644 --- a/drivers/media/i2c/Kconfig +++ b/drivers/media/i2c/Kconfig @@ -949,6 +949,17 @@ config VIDEO_DW9807_VCM capability. This is designed for linear control of voice coil motors, controlled via I2C serial interface. =20 +config VIDEO_WV517S + tristate "WV517S lens voice coil support" + select REGMAP_I2C + help + This is a driver for the WV517S camera lens voice coil. The driver + supports 10-bit focus control and exposes the actuator through the + standard V4L2 lens sub-device interface. + + To compile this driver as a module, choose M here: the module will be + called wv517s. + endif =20 menu "Flash devices" diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile index d04bd5724552..e480932a9540 100644 --- a/drivers/media/i2c/Makefile +++ b/drivers/media/i2c/Makefile @@ -173,4 +173,5 @@ obj-$(CONFIG_VIDEO_VP27SMPX) +=3D vp27smpx.o obj-$(CONFIG_VIDEO_VPX3220) +=3D vpx3220.o obj-$(CONFIG_VIDEO_WM8739) +=3D wm8739.o obj-$(CONFIG_VIDEO_WM8775) +=3D wm8775.o +obj-$(CONFIG_VIDEO_WV517S) +=3D wv517s.o obj-$(CONFIG_VIDEO_INTEL_CVS) +=3D cvs/ diff --git a/drivers/media/i2c/wv517s.c b/drivers/media/i2c/wv517s.c new file mode 100644 index 000000000000..2b45a09ce879 --- /dev/null +++ b/drivers/media/i2c/wv517s.c @@ -0,0 +1,204 @@ +// SPDX-License-Identifier: GPL-2.0-only + +/* + * WV517S voice-coil motor driver + * + * Copyright (c) 2014 Intel Corporation. + * Copyright (C) 2026 Maurizio Casciano + */ + +#include +#include +#include +#include + +#include +#include + +#define WV517S_MAX_FOCUS_POSITION 1023 +#define WV517S_DEFAULT_FOCUS_POSITION 300 + +#define WV517S_REG_FOCUS 0x41 +#define WV517S_REG_DRIVE_MODE 0x43 +#define WV517S_DRIVE_MODE_12_6_MS 0x0211 + +struct wv517s_device { + struct v4l2_ctrl_handler ctrl_handler; + struct v4l2_subdev sd; + struct regmap *regmap; + bool resuming; +}; + +static inline struct wv517s_device *to_wv517s(struct v4l2_subdev *sd) +{ + return container_of(sd, struct wv517s_device, sd); +} + +static const struct regmap_config wv517s_regmap_config =3D { + .reg_bits =3D 8, + .val_bits =3D 16, + .max_register =3D WV517S_REG_DRIVE_MODE, + .val_format_endian =3D REGMAP_ENDIAN_BIG, +}; + +static int wv517s_set_ctrl(struct v4l2_ctrl *ctrl) +{ + struct wv517s_device *wv517s =3D container_of(ctrl->handler, + struct wv517s_device, + ctrl_handler); + struct device *dev =3D wv517s->sd.dev; + int pm_ret; + int ret; + + /* Runtime resume restores controls while the PM state is RPM_RESUMING. */ + pm_ret =3D pm_runtime_get_if_active(dev); + if (!pm_ret && !wv517s->resuming) + return 0; + if (pm_ret < 0) + return pm_ret; + + if (ctrl->id =3D=3D V4L2_CID_FOCUS_ABSOLUTE) + ret =3D regmap_write(wv517s->regmap, WV517S_REG_FOCUS, + ctrl->val); + else + ret =3D -EINVAL; + + if (pm_ret > 0) + pm_runtime_put(dev); + + return ret; +} + +static const struct v4l2_ctrl_ops wv517s_ctrl_ops =3D { + .s_ctrl =3D wv517s_set_ctrl, +}; + +static int wv517s_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) +{ + return pm_runtime_resume_and_get(sd->dev); +} + +static int wv517s_close(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) +{ + pm_runtime_put(sd->dev); + + return 0; +} + +static const struct v4l2_subdev_internal_ops wv517s_internal_ops =3D { + .open =3D wv517s_open, + .close =3D wv517s_close, +}; + +static const struct v4l2_subdev_ops wv517s_subdev_ops =3D { }; + +static int wv517s_resume(struct device *dev) +{ + struct v4l2_subdev *sd =3D dev_get_drvdata(dev); + struct wv517s_device *wv517s =3D to_wv517s(sd); + int ret; + + /* Restore the vendor-recommended 12.6 ms ringing-control mode. */ + ret =3D regmap_write(wv517s->regmap, WV517S_REG_DRIVE_MODE, + WV517S_DRIVE_MODE_12_6_MS); + if (ret) + return ret; + + wv517s->resuming =3D true; + ret =3D v4l2_ctrl_handler_setup(&wv517s->ctrl_handler); + wv517s->resuming =3D false; + + return ret; +} + +static int wv517s_probe(struct i2c_client *client) +{ + struct wv517s_device *wv517s; + int ret; + + wv517s =3D devm_kzalloc(&client->dev, sizeof(*wv517s), GFP_KERNEL); + if (!wv517s) + return -ENOMEM; + + wv517s->regmap =3D devm_regmap_init_i2c(client, &wv517s_regmap_config); + if (IS_ERR(wv517s->regmap)) + return dev_err_probe(&client->dev, PTR_ERR(wv517s->regmap), + "failed to initialize regmap\n"); + + v4l2_i2c_subdev_init(&wv517s->sd, client, &wv517s_subdev_ops); + wv517s->sd.flags |=3D V4L2_SUBDEV_FL_HAS_DEVNODE; + wv517s->sd.internal_ops =3D &wv517s_internal_ops; + wv517s->sd.entity.function =3D MEDIA_ENT_F_LENS; + + v4l2_ctrl_handler_init(&wv517s->ctrl_handler, 1); + v4l2_ctrl_new_std(&wv517s->ctrl_handler, &wv517s_ctrl_ops, + V4L2_CID_FOCUS_ABSOLUTE, 0, + WV517S_MAX_FOCUS_POSITION, 1, + WV517S_DEFAULT_FOCUS_POSITION); + if (wv517s->ctrl_handler.error) { + ret =3D wv517s->ctrl_handler.error; + goto err_free_ctrl_handler; + } + wv517s->sd.ctrl_handler =3D &wv517s->ctrl_handler; + + ret =3D media_entity_pads_init(&wv517s->sd.entity, 0, NULL); + if (ret) + goto err_free_ctrl_handler; + + pm_runtime_set_active(&client->dev); + pm_runtime_enable(&client->dev); + + ret =3D wv517s_resume(&client->dev); + if (ret) + goto err_disable_pm; + + ret =3D v4l2_async_register_subdev(&wv517s->sd); + if (ret) + goto err_disable_pm; + + pm_runtime_idle(&client->dev); + + return 0; + +err_disable_pm: + pm_runtime_disable(&client->dev); + media_entity_cleanup(&wv517s->sd.entity); +err_free_ctrl_handler: + v4l2_ctrl_handler_free(&wv517s->ctrl_handler); + + return ret; +} + +static void wv517s_remove(struct i2c_client *client) +{ + struct v4l2_subdev *sd =3D i2c_get_clientdata(client); + struct wv517s_device *wv517s =3D to_wv517s(sd); + + v4l2_async_unregister_subdev(sd); + pm_runtime_disable(&client->dev); + v4l2_ctrl_handler_free(&wv517s->ctrl_handler); + media_entity_cleanup(&sd->entity); +} + +static const struct i2c_device_id wv517s_id_table[] =3D { + { "wv517s" }, + { } +}; +MODULE_DEVICE_TABLE(i2c, wv517s_id_table); + +static DEFINE_RUNTIME_DEV_PM_OPS(wv517s_pm_ops, NULL, wv517s_resume, NULL); + +static struct i2c_driver wv517s_i2c_driver =3D { + .driver =3D { + .name =3D "wv517s", + .pm =3D pm_ptr(&wv517s_pm_ops), + }, + .probe =3D wv517s_probe, + .remove =3D wv517s_remove, + .id_table =3D wv517s_id_table, +}; +module_i2c_driver(wv517s_i2c_driver); + +MODULE_AUTHOR("Maurizio Casciano "); +MODULE_DESCRIPTION("WV517S VCM driver"); +MODULE_LICENSE("GPL"); --=20 2.53.0