From nobody Sun Sep 27 00:34:38 2026 Received: from mail-wm1-f42.google.com (mail-wm1-f42.google.com [209.85.128.42]) (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 E9CBD3DB630 for ; Thu, 27 Aug 2026 23:17:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787872661; cv=none; b=Mjsr6V3eYncy/fJmebUQtFIiQpFfkUn0LksQqWTMnuss8nJ1b8SnZmqnPoFLYhz5AbuujMYKCUD0KPaVqJVDLgtxbbO8pUroC05jk799dqF9ttgb78IsokhxG0zUfpCiQQq0wrR+3oVj5bachtXP8w6B3KQiq7VkSrOTy5GOKbU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787872661; c=relaxed/simple; bh=xhrDm+Mv7c74PMtacFvusD+88J1ycuEMG7fJpBlsDjE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HYe7I1iUWk7OqjmEgp+Xk5aFd4rnL8QntkDfQxhAKzCWe4zWWm3TlZ/K7tn6qG2GDmMMDwo2uos/6ZR5dYVE0oMEIxSENqjd1Xd4tJvhO6hST8u1dgltGeBUNfCXoLXgglmVvTzFW83gBbF/31X23dlVH0LtZowrdZrSz3H7VW8= 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=HUy6de0N; arc=none smtp.client-ip=209.85.128.42 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="HUy6de0N" Received: by mail-wm1-f42.google.com with SMTP id 5b1f17b1804b1-49b0eab380eso3212785e9.0 for ; Thu, 27 Aug 2026 16:17:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787872658; x=1788477458; 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=KZWFTR8cjCr40UFMGvLuRrF9M/oaIFX/lTih1P5E7Kk=; b=HUy6de0NYTYNoMJ+REIip3ggO9SZgg/Z6ak4cxP2HmX4xRFXELDRJLIrjZRJt6HaT4 9R8s4Vf0nMXwtqAujai8giU9mKzUPOM6hhCkhUlx4y4+cejSY942sMqUnCYvGR7SXBA/ w76dhMcWFEQAvnyAts5xiwqrS+3LgCqiAh1lMf1sFueSAVITCwL6YdmV7pqtvpbOmwot DB113Z5Qv/IxEZK0hAu+GK0mWHh8vs+7GEMnkLUqjtDhPLQybKnTUpw4x022Wfe2Jsrv jb95vWApV5xrQpgBYb0NxjY2CeddAqVqc5YtYbjGqNX5xD4C5vkmVgscFv2czQy/uJEH qFzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787872658; x=1788477458; 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=KZWFTR8cjCr40UFMGvLuRrF9M/oaIFX/lTih1P5E7Kk=; b=nqvX1tAimeppm+VMoN0NgSqw7HUWq2DhfttkcZNzgF3rkCbtSgzMt+gZd7uVT4kkcJ lsip3xKZYIFJUHy5MOMX0LpDb17lfE56Ch4eGQmioHtWLe7GlQZyIZ2M/Z9Jqhufh+ex gE177oRV29InWa1mBeW1kFQA+FIcu0VbQWlRJXPG4tiZVQfvySXyFHEyMzFisJPm1u0k PwRjVEJaG4kzpmD44kzyL4TwcMO/14tTKxaNln8A3MoJsjWTX3uPER0+ZO7Mvd1k/k9G KkyTKNMDuBJ6ncmHdwwQgQkGKQzhokuaYMLAwzj5GcjCh+wP8X/zlXYumndavsRWYygU 1Ipw== X-Forwarded-Encrypted: i=1; AHgh+Rpe2K7tfbtyw7883Ce5XwUalhLW5u8Jhbj4ZiSTg2AnSSgLkYUi4qskG/WEmHhQVneQUHGzWIi+nMQjueA=@vger.kernel.org X-Gm-Message-State: AFuF++mqTUsGDOHyoKLNym6kmSiwtvunhFoYgWkWrwuDZQXsxULbbmL2 qTpXWrPFu5n+5K3fq++ey//CYB+sFlVr00spNmpmsAfZ9dgWjZ+4FJi2 X-Gm-Gg: AR+sD11Tfh46TZlV130Md8Eeftd6GUhlDaB6toRDSTSnG+fP0hruB4ebmVdQt/lkfQL 8m0Los9oKJqLtKZZGkX+i9PqMXMsezHh2idRtnqtCoER0C/y7G5c8sufGOTH2lYSV+q9VyO6BYo XuuL807YvFC5A22E9qI0aY4G+KIBmxLFFie0sp+QBuTAW+pVq6ImG64SOUEouM/6DnBb2lkgxW9 g70F7SHHcbRCq3kAeEKsSVL//rnrtjKuR8XI6qBE3rTIx0+m2dhukxpAcTUb6hw8TozlY+0UyIt GmhuMhIss2Jijb4Ys2ppYYWwDL+gzL0elfGXgI4Meozqj6A05Ags/+q+Sb9AUbkBaF0UWIPRdbc D8kfJa1h/89ULx8rdd/fWWucIYC6VfbsPgUOfBN4HTSNW6MhWTKr9elrKQSFgjUsplIwlx4Lr+b Pp3LkJ+tFdK1XNeYLSx7IHolTahgJuOpCx28KRGfuKr/1S0JpbbwKGTPOUxvmwsRFZV1dzdFj6E +MSlUlwG0/SqhHNaFNsgCYHupqB3c7OzhkTswLR5h0+XKwSttw5Wvk= X-Received: by 2002:a05:600c:3b25:b0:493:f783:c46a with SMTP id 5b1f17b1804b1-49b91a67d36mr26027295e9.6.1787872658358; Thu, 27 Aug 2026 16:17:38 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b94dc0f57sm7157765e9.2.2026.08.27.16.17.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 16:17:37 -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 , Uwe Kleine-Koenig , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v3 01/12] media: ov8858: Extract digital gain programming Date: Fri, 28 Aug 2026 01:17:19 +0200 Message-ID: <6fa23c0b021ceb31e6137986bff139870e4769ea.1787872237.git.mauriziocasciano7@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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..d95f034de752 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_long_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_long_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:34:38 2026 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (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 59F6B3DEAC8 for ; Thu, 27 Aug 2026 23:17:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787872665; cv=none; b=GmU0pMzf1grgtcwnjgcI+e8bngGt9gNqztD1XXc/eM5G8JdHot3pHW2gaijycZ0DEB3EXexQtwYGtoIq5EfRyuioqHyfYJ39dfGKoRmB3glRRe3M8vQ7fwrG0RBHXC8wokDCy7qymxM1WO8gfiZ42CPy071bT1+vgyDy/OJ/PIY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787872665; c=relaxed/simple; bh=vQSykYWKjwyy3GpEXKnyMhG1dxWdIduVo3u0cWZYNew=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jQQ+oKNt0Ft2H26W2+nTdAavHuRaeJcOtrJ5pcMm0xSKVNIEwmKxw5xzYLqeQztpi1Vv6vTSnwAbZznFvs1VEHnkkwH0qN/TBpe1dqIIMzAlBiuv7pOoi+teX/yKm4kf8s8hqv2rXY+R7veHFdfT1e1AHhYVkOUH88MRgyQxOt8= 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=KyI7R2lU; arc=none smtp.client-ip=209.85.128.48 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="KyI7R2lU" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-49b0dd3c9a0so2173455e9.1 for ; Thu, 27 Aug 2026 16:17:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787872660; x=1788477460; 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=RUfAoBg4/XBI4pqtt0b3wPDxb0rk1uC5WDFTikKcDuc=; b=KyI7R2lUi3N+1lCJiTl3xDN5EUvfOnkt1msk5tjEJ2Nsp5mj+8TBlX6bTWca2/Ufos sHzhEXv/bLpM4CDCjU9Yn5ynARLo8BRThiTInxVgbzAMSyKBGnmjbVoBShTWrnXoBMN2 9BDh9KADvBPASPMBgkTFUhmSrMXMzNNQFEpI4pkMR2ss9GBk7Go1a9HY4jugTAvYFXPM p4oyceSYfOwiMwJOdwY1wMJbV0algBSWEP5a6z9ChS5/FAhkHe/Kw/ytiA8xDjb6O1Vp twUgxBQlPrKDmXURIW6ChM0yvo74mUYqM7WQ6lFZ8rKsJBWAZudyEu8bXc2pfyM/heiN nu3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787872660; x=1788477460; 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=RUfAoBg4/XBI4pqtt0b3wPDxb0rk1uC5WDFTikKcDuc=; b=ThlNGeGsOLFH2xe+jKM9DHpo4iWtk6QdkfAkacOysBsJFrrgTPVTY50yd4utGiJJx7 6+4b9FFPP2duC8MT9Y7K9ymUtf3mvR/+66ujUbbCHfozVhPN9CR2PBuRtT/DEnt10PLZ iRPGQLR8UWjT0tL3RslyYstXz7W8rdKqXnwH4XQyHO023LA4ZY2KvkbB167xgu5nfaS0 W6FPMLifIA0Psb/nSpJr9W0kzm8OeLiZ9tHrsU+tt5s4WuAwLnztfy4lnfsWVF0iAprC ioMVBNq+JymCpKdE1xohpXjJ7k+aDt8dyAFb72FNJ/P91iomkEquhzgOlKKYB4TMGEdV niMQ== X-Forwarded-Encrypted: i=1; AHgh+RqkNjl46fTm+pXiNlCLmCn1/Nu0wUkcp7udNqZoBnqRI+CCI1bV41PN9GTU3eokT9a7kekjlRYs93LfSTc=@vger.kernel.org X-Gm-Message-State: AFuF++mAJ4EdNRJT6fKWQDmk1hH4x++wrQlB1ycyM6c09hDkunTjIhMN nhF7ifh6zq6folE/qehuz/HNGlbRm50d8EYSscacxkSmmcwrisWVntn8 X-Gm-Gg: AR+sD11nV699zqPJ1a/p+N5NrblmaqiT2arLAw8pu8ZyivHhPgb3ZW+ITQoQZFRVbte SUe8hgiKdbeeugtKDiFNP2rY9Lmz8ktefAMtFRGu94Dx2IWoCpNWK6E5IDgCm0snuyIIckQAy3u 5n6XQekucEFymeNbiiiBJbtg8Cve3ovhJqVe9CoVv6asdMqgP9RBEO1aoxUCWbFi+AH+qGpP9Vm zcT/XcDI5pTxau20lHDDu+sEyN7sc7WS1P0pcOkdfttUKfh+C0H92SjB3Bn5gIshfyqpIIRPe3t KuINRV86P6hDPLypVN21eU7jYHghRk+giE5NC4kHZWAKBArQ3CycSsYnYqgleIVmovhbN4sI9I8 IIip45OTrC+qURjVC5snCFcmHqfujFbbUt+SHFHAUMq/N7+rf9Iitp3g+UehfjP+9DrH1kAptvD T/oo18fasqxJ6lep6k7aYdf8sLEMH+UlCtVO4rT/GWHoTPfQ5KdQ1hplUzjzMDyukA51I7h+zq3 GCdYE3hBfgFQoI1ImpzNK+ZsacHent6Tt/Faw6kZvkU X-Received: by 2002:a05:600c:a47:b0:499:be9e:49c8 with SMTP id 5b1f17b1804b1-49b91c50957mr27009775e9.13.1787872660460; Thu, 27 Aug 2026 16:17:40 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b94dc0f57sm7157765e9.2.2026.08.27.16.17.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 16:17:39 -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 , Uwe Kleine-Koenig , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v3 02/12] media: ov8858: support 19.2 MHz clock and CHT gain setup Date: Fri, 28 Aug 2026 01:17:20 +0200 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 | 133 +++++++++++++++++++++++++++++++++---- 1 file changed, 120 insertions(+), 13 deletions(-) diff --git a/drivers/media/i2c/ov8858.c b/drivers/media/i2c/ov8858.c index d95f034de752..9b3e6eaca665 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 @@ -1537,7 +1617,23 @@ static int ov8858_set_long_digital_gain(struct ov885= 8 *ov8858, u32 gain) ((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); +} + +static int ov8858_set_mwb_digital_gain(struct ov8858 *ov8858, u32 gain) +{ + int ret; + + 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) @@ -1586,7 +1682,10 @@ static int ov8858_set_ctrl(struct v4l2_ctrl *ctrl) ctrl->val, NULL); break; case V4L2_CID_DIGITAL_GAIN: - ret =3D ov8858_set_long_digital_gain(ov8858, ctrl->val); + if (ov8858->xvclk_rate =3D=3D OV8858_XVCLK_FREQ_19_2MHZ) + ret =3D ov8858_set_mwb_digital_gain(ov8858, ctrl->val); + else + ret =3D ov8858_set_long_digital_gain(ov8858, ctrl->val); break; case V4L2_CID_VBLANK: ret =3D ov8858_write(ov8858, OV8858_REG_VTS, @@ -1622,9 +1721,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 +1739,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 +1797,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 +1844,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 +1987,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:34:38 2026 Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) (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 AB7C73DA5DE for ; Thu, 27 Aug 2026 23:17:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787872667; cv=none; b=e6GbllSM1ZxY1APAwCJU/uufkouE5oHmSERTDdpnJSOORLnJqirhwxPq2HTHx9o5LwaMS7TIochRw6JCv0OUSLIWqIsecohqM3m4n2jcy3vV4AsMpRmToGD9wWJdZgs1htfVeaqZQ41vHxBFrM4ur1NMHzq1BaS+SsXQb0SKVXM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787872667; c=relaxed/simple; bh=P2vAhkjwfZLpGHwPw59L73KMSOIBIbwxnRr5PopVIrE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bfLd5IR9U+Mxac2DClX5/ptl8tz9A0cMDsmVQ+U2Z5qPc/1MXS71BWUxFBdKwjFN0kMrjmLAXXhYkS2nfOzvOlVk6GhDevbpgzwCQiVpD6XAnK9yMPZFPCUhKjSTOmxOcL43lw9yAU7V49fRZAhcdSXvm6S89G3l/RtiSyHWVnM= 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=Lon14yDa; arc=none smtp.client-ip=209.85.128.47 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="Lon14yDa" Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-49b8ce9b733so2536455e9.1 for ; Thu, 27 Aug 2026 16:17:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787872664; x=1788477464; 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=2/Z0cnaeaBdqm8px1bR7dodj1ScgQOWcRfeLIXj+wSQ=; b=Lon14yDaBsFEHIMDCUjU5zXeX90ewoo9WYVPHl91NBcwYeAGxBu8GEllrBi5rFRqaf k3G+s1XRp8CP6ffSFyfPo7fq6owzY3l07Al7alV52/Orv6ibLTYYNSYKp1oO6629mrJi innaQYHcETnj1+2cjsdlq0sTkEKjvXp5bjjtcoPucdy+JJKG7N86Z5ub3+OWCsNT4YRv T/PKfErzWsMj8vi8FJ/I8pnGmRln3LVfETwPUMJfI20h5T+bPPkQqb15rfbNF/oITTBN 0tHexGyeMDR3bvvaO8Lzr9fkQx21ntPTO71M6ZxKOHD8seT5kq475Kd2ZYRWe1NWpPLf InXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787872664; x=1788477464; 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=2/Z0cnaeaBdqm8px1bR7dodj1ScgQOWcRfeLIXj+wSQ=; b=hjtbacHspxDzjwO9mtqILsw/+gDHj430L8t6edUm5Amh0gTg9VLSUIkhlvhHdpGWta Q5saFSZsYjzsyxu1+zdI7++NMkz+SmBOXtmWAtk9nUljVP0zS5AdpLiLLXlZcg6EB5iW RCL8cW9ReOfuxTIqsFTwpf9SENzysB0wv1gaLZjuIgSLENfvWWAqT9yfpfzaKrwBO3WY Fa8eHL9IzCnHqRk1bHjih0Mcq8KVLs7in+hS5fkrHID/d2iHVvZnhdvhHyPxegH6YL+i lHxRGUMl11tX7K0sASEfGhU69slqP++wdLevuG/rZtHqJqkAmY3sgOomrCy4lhKqsjIy N6hQ== X-Forwarded-Encrypted: i=1; AHgh+RqaxJjxnQxeeBvlCCVWW1IxErnQRzHBjPYyZ3KcunBgwairaK1LnWoID6GDk0RCbnkYqE1slnc9iyHDJ3I=@vger.kernel.org X-Gm-Message-State: AFuF++mHyeBXYsF7DWFBFJcgvFz9LkllfVr3VsleVOZXo5LNLjnwZv3F /o7DbvTBoLASAitWdO/LzqB178UczB8uZAfeuvcB/800Bx7EEn7fB/9T X-Gm-Gg: AR+sD111SIcUyWYk3geDEy7N/BlxKBHbUhjEkigw7vY6t7sE0WOM9N1oPxzHtk65bU5 9wI6hkkzN1jrhS3IeHzAcWdOckKaQ25WQ05b4UOGH++yxY0M+L4kf9GLRoln2LxweL2zLJDn/nZ kXaDMUrGvXPp7H+3+qDfra3+oAAD5tHw7QgVbgMnr8bqDaUt64Bpn7yxBlivxdcI0wggPsXY5/i PRtPzHkN/Cv/cQEDCMYm8Mu4bAT4FB+ZTCmrGo/rNeP+j0LkOiLyQ+1jtH9UkScFm5lHIXb4tLJ cO1yPUmh0b+iOq2IuWYruihSd+FViodNPq38ZFsU3A6u9FlbKcZ6ydre0EkUHUUTlU+os4HlWKv 6u9nmSrju0qohTzWm0oQUuryz4R1mwgM6rM3SLLFC/VIfefiwYw7p066NSLTPmDTgvcaPpqpVKu p5dAljQPpFs04GPaXSl1a341JQZONVxe2uiKmm/4M+csNm363AwOcxEBWLKyGqYUrMzqNYSpUtK 2/fuh85JN6IUhX3+by7OIV7NcFO+8M8gNsnaRBblEeC X-Received: by 2002:a05:600c:19c8:b0:49b:c8e:a211 with SMTP id 5b1f17b1804b1-49b91c20bfamr36205905e9.5.1787872663612; Thu, 27 Aug 2026 16:17:43 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b94dc0f57sm7157765e9.2.2026.08.27.16.17.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 16:17:42 -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 , Uwe Kleine-Koenig , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v3 03/12] media: ov2740: Use C99 initializers for ACPI IDs Date: Fri, 28 Aug 2026 01:17:21 +0200 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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. Suggested-by: Andy Shevchenko Reviewed-by: Andy Shevchenko Assisted-by: Codex:gpt-5.6-sol sparse Signed-off-by: Maurizio Casciano --- 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:34:38 2026 Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) (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 E82913DD87F for ; Thu, 27 Aug 2026 23:17:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787872672; cv=none; b=c46UzqwkDXxKajp9uZTVJ+EAftqC5NDYPggLHZu6GcCcVbKWFMQzLfhwdLgsovpMxclgsNM83151nv4gTaNB9IqHK53+EGZRoHStnmySqJ0ZPf3Fzv3nl+VMNzI8qPZeN3ke6k0MYDmh60wdSX8dGvpcNaXy8N6SejCV+e3ziLQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787872672; c=relaxed/simple; bh=GY/0GwAYKkdGCB2mGjNb9iNJ3uZoj4B7s9rKLLBlD0s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=I8IAwVfIY5onLKVuCU0vmifmYNUKbyK74DNqFjCQ8Y6THQBtXkUfr77LnmJw+M9rvMjY7sY/77Y8u9loBuGIAgMx+OUIp/XmkFRHf01p00LiY1XYRg0cUTZtfDBrIFsUmEbKr0wuayOsxzGeh7hQMsofKcjGH8t7ykRW2vZ3+YE= 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=SLmqJx6K; arc=none smtp.client-ip=209.85.128.51 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="SLmqJx6K" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-4956869750eso1761565e9.2 for ; Thu, 27 Aug 2026 16:17:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787872666; x=1788477466; 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=SLmqJx6KENDlA3HWX3/B2Jlzs+1C8LXoaQmcIiKMrZTQ+n2IU6xPCl3MvsON92Qvm1 vS4dK9egs0GO1x412hC6XXZVh1YySpGpEzCUdDLQrOabfP3H8wkFPrLTeTGuhsCzNZRP x/HDZgkxIH/OGisiTdH5G7I2D7OjhdDZpL3s4eWDo83bJ/pIn9T4A3tl9oORgzxOVi2U rYI95HTDb7V02X8Qn79EcA47pqNKNKxXamqc3jQTwNf3qA0GvtwxLlQg02UYzQ5veON+ TpzbPeDmeyQWtivwkD72NzPd2E7CtVeLYOfRRgPhWFcAEOAawX0R3+gJjB0Nzb4YuxNt OQDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787872666; x=1788477466; 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=a69vwJ6naRGE0b4wTWBwJo6OURB+Ay1nAxDqIlQhiL82PqgN5Bfqax3WZEkZiBvPLZ RG+3AnM37Zcai+c0DLIlP3yCdJ5fK/sAesMrXfIm8afmQeJ1JHrDEHE7aafA2ntwXOHi Dit3BUlLLxY4AZvGjz6XP6K7TTs9Dz+UZduWwalBBMZQWmuZqXBtg9k0txgpOOPzUNCB E4qx1MsaO0/3YjNBd5OItWTNab09+jLg+iY52QvXmkCULlfZDWaOCFUN3artS7NdGvwp 128kxiP+U5uqmSKLAWrg9LFsdpCvuZTdMUqEeGiPGCHIrbiUB3g8y6GiUT7b14SbA+SB QhZw== X-Forwarded-Encrypted: i=1; AHgh+RpqdKRkghc57jSZSN4yjMYqV+5sXste8OATX6Lww2ApVgt2QZZRVb6IzB2WgHZXW3Xb2FVvlFvLtim/Hek=@vger.kernel.org X-Gm-Message-State: AFuF++l3iigyMqGdQSMH8JVUoUmIbBIjxPQHmmmg69jK2r2rbREkbzAp c9IncbbW2Hp7WfdPRepNoWwFNmKKYiXsEF4BBJBYMGN1DAWOkFaz0C/1 X-Gm-Gg: AR+sD12RM1adG2yB2EQ9LIhtyiaFIGZebpAU3JkWHyZtOe9/5PBzUfp16ARJBsJ19XG 4r5a2b4PVbNMsVdrJMz+IxehFYgnpYcWE25AH9p1qhVAPxsVv9R50iToPZw5toFmPnhL24STNCx 2+lxPPtZSQ4pP2A8YEQiaNCMy8woUwSLBcBIKuYyJgZdxAV6QEOi5wD4+LFOxbtD4HSX7sbIsyT MhmoAmaC/yDvAVtVczUtoXrnLoV1YT+SBK7EEn74qOYHJ5zLmu+OVD3D8uGM9MD1O3H8V9iRm4F bAiPYcBb2IwIc6QSiuBI8A9V/EavHdlih/ffsOwMQzdMTpgQoGqyuGq+gBuZffaoJJVrnTMHasi 29yJw77iyS8SyXGw7EtyQHlFbgKICaXaWfxBT/sykYkWzFrjhDK18TYn6JltNKwccubWXAGrW7U uCXuROapvGi7XZg7AcKOPBVevOsqExIt370HpOt3VY/WeW2mt47fwispEKqZsTrHUYUxqHfXL9L fkMxvdG8og/pSOKdOuz0I2o9AULbz77qUIQxhNW/dGYxs9E0tX5l28= X-Received: by 2002:a05:600c:3546:b0:499:bdf1:7578 with SMTP id 5b1f17b1804b1-49b91c19d68mr30266455e9.3.1787872665851; Thu, 27 Aug 2026 16:17:45 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b94dc0f57sm7157765e9.2.2026.08.27.16.17.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 16:17:45 -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 , Uwe Kleine-Koenig , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v3 04/12] media: ov2740: Add OVTI2740 ACPI ID Date: Fri, 28 Aug 2026 01:17:22 +0200 Message-ID: <49e05167a81e22557b7cb08c94131e774e524379.1787872237.git.mauriziocasciano7@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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:34:38 2026 Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) (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 149833DFC7F for ; Thu, 27 Aug 2026 23:17:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787872673; cv=none; b=J22Xwpu3dkatZSClSi5wINl0mbvWKpjBSQdqUbM5amqKRj9HuIhiEc1cfq3W+YrTrXZZYBZrDEKFNtB3MLHcoZUJ2oTFkcy0tyCzk3pIteM/XLSm2eVes1npfdy1EohzT834OWRneCJshCNiCMJmACl53hDInipxchtq5G0VEng= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787872673; c=relaxed/simple; bh=8sgBglwA/JZD3s5QLDFR6gbGeXrL/rfq/BC01OXwQ6w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QPkS/vRq/1iy2VhYkSihAo8aESgS5fg6AYkCXy8oIMuDZh6FJ/8/2QyjEKlObUyPqG3vpU6ecpO/ueQsnE8pIMj6KJR+ItmklYUlJsGOkjcwUsuqMtTPGe7Mg5mkXeKhley0EcOID7xkmRLqNRnGl4NW/RY1oGPCWt4+cfJtfH8= 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=O7X4x8TM; arc=none smtp.client-ip=209.85.128.51 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="O7X4x8TM" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-49b8ce9b733so2536925e9.1 for ; Thu, 27 Aug 2026 16:17:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787872668; x=1788477468; 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=GebuOBWxdSlma292Cd7c/kTR3183p1RfnNGHX7vtHbs=; b=O7X4x8TM6HWnb9gzHFAoPPeaxpdN0y1tdHKNVbhGDtyE78guk5fRzXR+vImY72hmou zSrX/mG4R3TSje0OAw4mzWesi645eE+KpZN96sSm3f9dluTpXdJhGVCTjZpSOYGavFK9 x3X830oPgv3/FHCquG+ecD18699CHEWReT1JQ3uKTE089cecvqWfkCqB/0zlsAjKYGzz sUAj1U35jdm5UNUdu7nU5ZNo+jKLvvjLABZvdsydas6X/j+6We/ChadxAvo0OpbpgCaC Wr4CllSzM2bAGx5S94c4Es7Vc/4Jo60uhDxJB3DJD9hW2vQyEllXEyMgJ4M3qWYbt7xg 9tig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787872668; x=1788477468; 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=GebuOBWxdSlma292Cd7c/kTR3183p1RfnNGHX7vtHbs=; b=sx2fZw8H+sGVXbMIpIF727G7ZvMrHuwqV1B8NKLx9A0CO3ltxVFzo0oSPFfYqcgrIN ihVswoQ56bKhSZRi3j8QxvtuXWwZm5/Lk5MvKefdwDui1g/GcqS3rQvADba/xzNGgqKb hOKJwqCuDRDOcrtXpqS1/XYc3LIOYsDaBSYSK2wdNJcW891bJwiRXXe7+KSgLtOMD4+V hVg+NDn2eUXfao7nP5ksW6nlZMtGPupaiS3HtL7hthBQV50iVwzcmlnwXexAHd327sXw bogZ8fDfL2Rr3LtoqYGm0r65mMxO9eMROb+ikAfjkYPb+VtIWMMwV0j+58AAlMwpPee7 4REQ== X-Forwarded-Encrypted: i=1; AHgh+Ro+uFh/AeQK6kUv2ivxC/+Glu2waSEVCW+hw8thoNiEcxdnDcW+IIONT6rQB/XuWDgvd+l3t3b1OVTgsw8=@vger.kernel.org X-Gm-Message-State: AFuF++lxRk/itNtpDalc29M4i+rGNpgzA9sq7iU/xSZBpTtFuNNnXNp5 qZDoqsafwSyrXPsfas6yNs6ynBEU/QIdK5o9wdClkVC9e4BF4PeQGzoh X-Gm-Gg: AR+sD12rFru61esfPsyU4DBxyJlbBp5Y43/ze7QsKZaDKNQ8QynpXjD5cuoiFrGCl+S KK3ddx2bYggXL0FylrECOSaIIQ9PAB5gNw8h8hJm8KtiGTmRdNG/MYW4DcndmKPWkK2NGBRZIH3 tCok8BtW5Q5gkArJbQ7N4Z9YRtiTUdGNRyns/q8fN3uf5D8kmhgD1WJy+s5eoJU1ftP9CRWJwad P+lqw4fWmlovoG6M6yk3ym2zlZBALPjF6tgpfP8AIWHzNljToxVcnWaZYvA5w9NcMs+gh0BDILr KE4JSn+M6nmdRRJYHHr7TCBCCd/m89Vs8I1UjhV0N0gGON5p1AsSWsOmTcQwFmoymppBEJ97kjL 3S3py2/lfLYpc0bC1Fq72aWLnbkNZjuob3XWdD7RQNOlXKaTlnJxBY+5FQ17TSb8ykxC0ohvNbR kdAa4SqSzlKegoS2ux74vzvqwo+IjeTXgVYwrcD+oKfmFSmfcL9DQWuuC/XeR1OSffltF4cvlXe M4g2eUeJMAiJhUDHhEjOqZsvirOkVV83YvxIquytl2K X-Received: by 2002:a05:600c:4453:b0:499:8777:ccba with SMTP id 5b1f17b1804b1-49b91c486abmr31698845e9.12.1787872668079; Thu, 27 Aug 2026 16:17:48 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b94dc0f57sm7157765e9.2.2026.08.27.16.17.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 16:17:47 -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 , Uwe Kleine-Koenig , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v3 05/12] media: ov8858: Add INT3477 ACPI ID Date: Fri, 28 Aug 2026 01:17:23 +0200 Message-ID: <10cefd9c6dde13eeebee5a1ba9109f35e2201305.1787872237.git.mauriziocasciano7@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 9b3e6eaca665..26093f887c66 100644 --- a/drivers/media/i2c/ov8858.c +++ b/drivers/media/i2c/ov8858.c @@ -6,6 +6,7 @@ * Copyright (c) 2017 Intel Corporation. */ =20 +#include #include #include #include @@ -2088,6 +2089,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 */ }, @@ -2098,6 +2105,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:34:38 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 87C593E1680 for ; Thu, 27 Aug 2026 23:17:52 +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=1787872674; cv=none; b=LXcBWdYtLHSHO3z7O76H5/TlaOFpybXYyWT0H16h7yQcrHUBnmOtrm1c53ctXRqAPzaw5KykLkpivT4I8Ov5ozXU5V77+Vc4WAER+0DVnV0PcaoloZQ3YJAb1DV9jPbQdH2h5H/aIkR3tJBj4c4SQ7T0uhfJ/YhqOdIsHt3MHYs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787872674; c=relaxed/simple; bh=s55Ii6QEsvGG1AvHe17eNCXjO9Ihg5gS51wo2byNVTg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eKmrQvXxINdH2GdT5je99OCvahn9Wptenbn7DGIMpCwA9KMJs+gV6VmN6PXdfhg0AMuoE51/th97wT8rS5Wnyi0kaRJbk8Xxbv0bZqHWhW95buo8UAoiCKRoyhtF9qEdbth/TcVdg6X+AjuZnt7rf5xMawtn7fpDlLwGaz1c4C0= 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=CeVlJvMv; 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="CeVlJvMv" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-49556f97a9dso2108165e9.1 for ; Thu, 27 Aug 2026 16:17:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787872670; x=1788477470; 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=CeVlJvMvTnQ2bjJQmPBegbv1dsB0blCe8Pr1UDNo+ML/n9E9hZxGsZGI1/W3RCTE3o wiIOlW49yyGhp+/w6rZ+ZtCRvhPl6mImaFNwTnSVucVvb4B693EVPRJg275lOJlt4f0g NF4zeSukMuyKk6Usdy2I2LbSisYfX5nqGGIyQ7x88qKR/40+xQeBwVKZRm2xm4mJ+H9T HEWgrdhaYUduy0fqxD+4Ans0/ID7nSRFHZR+iY3x9yzqEloAOeq8mEE7ISCdkXSaWVtk z23887lhfmilVWaiUHV4p1Plaik+rW1L6N83sDEAPGzHbxJyvM6ofTnZWfRr1ueJ5ysU 72Ng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787872670; x=1788477470; 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=q87MX3Oao8Yvx1/B5N/FPq+OXN0YFynjrZO2oxZPoFyquHjhOKtFvg8Q8rUIwnOaLo W/VM83IS5eN7VcJGShB0Bbwrpr3a5Ghz5orFoJT9I5OyZW1hVUHd/Ivn0cMlXVfGpF/I 1MElIWxx+jEgyUzE8/5uddJWXtRJ1JeKcSv2nVglmB2rNPHXHzV1OtUSlCCB7ZmZr0dn xebwBVUj15VqBGTrizES0nz8HTd6sLxuGE9rlOM7VhgJc0SB9ELdCNsuvXpEATdeCmQ7 zQqUkDnhMGXuCRCaIjZ44XXad3PrjwzhELnRaCWsrGOLVxweMv+6rGxbqLFxCZyPd4UF aatw== X-Forwarded-Encrypted: i=1; AHgh+Ro/8iEiMjY9t8XxJ7xQ3A/hJrJKxnQoQWmH03y7CxmbqRhVeIxD2OBNj2jVXoGxFfQf2zCBbVKp2xUtbDg=@vger.kernel.org X-Gm-Message-State: AFuF++l19LzAdwhQhYwCfZBZDoZU6WiCEJ+fTZBe+bVk7d1Cy6OSxv5N BGADc9jHChWpPbNRntoUtNaQeSQB30DGgZ33R0pWKJ9Rhf9Lg65LABfp X-Gm-Gg: AR+sD130QMLDtjcERsblKvo/hmbkgknqYxW2ekAh0H792nOMJe9puo0xgqfbrjPSgDk ECHUXy3d/Z9ekXMs1506v46bqYI5cgvAz0jwU3mpzQ2KR7lvD6VkDn1SrpNhOyimU4ap/OGnp8H ilqK1AbLhUoPNh3W8kpcfUkNxD777bUArdATyJM0wzAukkeb/4OaLUtS7uDRslorNvx7z3L35z+ oBTluKgfJhES8tN5JusMJjHtGvfvW55962HiqObgW16wsP2z8Z7ndCq5Eoq51AphLQjLg+cmfx+ sswc1EcNS9KPdf4lPp8p7nXNQWKQ8KjXX5R7lntt6LmVl9kRHZDmNrDIspZPzaSVPicSylJwn1B cNkDyRKiaI3qlb7sUChGRnKgiWEgrEM+f5btIScXQZPWgWWEB7vlG5lHBK4nVqwqAwN2VvCYrTB PKzZUOnyyKSJ+6hRvhBu5hDi5/DloOWqXLjmvfviKdzTLcGv/C5zdP/32v1ptPGTKDg8Ru6l9jC aRnZWGJ/1nvFXyVX9rmTmILkAdUN2EkCB3xIemDE3yJ X-Received: by 2002:a05:600c:6748:b0:499:b65d:124f with SMTP id 5b1f17b1804b1-49b91c57449mr33983265e9.11.1787872670200; Thu, 27 Aug 2026 16:17:50 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b94dc0f57sm7157765e9.2.2026.08.27.16.17.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 16:17:49 -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 , Uwe Kleine-Koenig , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v3 06/12] media: intel: ipu-bridge: Add Yoga Book camera sensors Date: Fri, 28 Aug 2026 01:17:24 +0200 Message-ID: <074af4590e20c3c88e372f482faad03a358c7de5.1787872237.git.mauriziocasciano7@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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:34:38 2026 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (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 C2C843E0245 for ; Thu, 27 Aug 2026 23:17:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787872677; cv=none; b=AZlZVI4FdhLfg99hTYlHBsWG0ancLddAAoXQg8K6ReRK9UbN8in88U9Gw1Und/XsXTPLzsrWPMq9Z2MxDPLS1D6RLX0HnFQp0kmPrdjz+1821hoYD2+nIaW97N/YkCUqLjFqVGB2/iAMgnjceJW1Ya6E/0FpVY8Emcc7byEycR0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787872677; c=relaxed/simple; bh=pljKBt0ZqgK/u5wnmw7D7yDX+T1Gj3r0Q4vuQLP73RQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rLV4CoJQgHrWMsrT7TNjlD9oaeJADvPlr2XSZ/DkXTeqz2Kt/cGspt191d6Sy7C7H0K+j99ewllR0L4pxpNWsk0dfg++g3P4DnzhB74opAENO49tVmyklRWVh9u05iQt6Oxt/HNA1jWSYc3dUn0XGQTpxNsn1liyRBAS+qwlyIs= 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=e02eP1kv; arc=none smtp.client-ip=209.85.128.48 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="e02eP1kv" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-49b8ce9b733so2537345e9.1 for ; Thu, 27 Aug 2026 16:17:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787872674; x=1788477474; 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=BhopT/io3eKO7wMhXLgmZimKetvp9lSHGdET2Xvt3oI=; b=e02eP1kvbjyHxDPa2snJui0VnGWfUDhp2ja5ddIkJvbFsXJJ00xuKVKWDbes7SUVul iiaTT1HxQt5VmqY7lqotm4WcreO4vVEtJ3+nobfCYYfRc/1GZ6hw9lOFMelQmpyRA9kE zGXr8PeKIEWVLUG5omDtjO3bzGq200yexN4CXrm3GxsQmBH1LIKifNJbKPMX0Di6ipmO d/7hxrw3wXG2ZpcjduXb4T+qB4aNfgNPKwrLW4qj24LQhx5wyPeS18pkNBEVTvNdohrx MPBQ0gJj1BNznU1hUMnpvxoZIONF7gb+HDOpxqmFPyBrXR0X0Y98ViXHj3uzraVHSBOV x4Iw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787872674; x=1788477474; 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=BhopT/io3eKO7wMhXLgmZimKetvp9lSHGdET2Xvt3oI=; b=E1SQeM9fMYnv+svmFfe/cXyKjjPHnUy7fBlHJOWwjzBVlTg02Y+sMIeiAF5OsPJ6rc bfgagypy7zawippU46MbPCx1LgIS9S08meq9e9ibHFz4UHxmHSCVUlQrsa8bsWYATpiM GKce/lwGcFoJYb5lrP+F+1pSdksMXgvX2bSX7D5dbG+0aoRXsgDamC3fbLKxisty9cU3 N2WnY0/tDasEx8yzTHTGG2O9ZMxrkpESQ+EOSByfsEI1U20XCbGWWh8vkYpSjsT1+Ug2 +6yVG8P4f5fzNR7J7Ec5kswUtLfoGkhYJ6GL3GlLIJ8LzIKxokWWKnUt5xMrRT2dJEP1 mjUA== X-Forwarded-Encrypted: i=1; AHgh+RqGHXfEjrcvlxNX98lDVdfPbO0IB8bWauQOsMguCPGfP7A38+Lq/+Nfd9sXWdIuakuQdEMu7VCbmr2L66s=@vger.kernel.org X-Gm-Message-State: AFuF++kQe1KD0fIUZjsbW2aruZh+ajnwUk9qPDZ0f4zm2jA2UkkV+NIV R05D/sideN2srjSCV8cJUijXb6HSkXSyXaYZQNLy08Suo1w2hfoA1Zy7 X-Gm-Gg: AR+sD13DrMVzplh7czu/Ic27xaX+Tm8LaktzsgSzuZ1E0+qzoAyfsXshK1c+MCcky7d RItXnwEk0ly0D+oGNBq4N9FuTz6VdI+iOpRlQcWMiGURlLFgC1/ARLbaiBkgqu+RDlIu21lmGL1 cH4tCJrjf4VpDtcCUwaPpHuwvaG8KbXYw9nzN6hm1WKH1FwDM1XjvxDieet1jke//INqyYJz3zp ZpzoE7TZ5fu6erDhAKh4bHPcEyNlmyA0Gg9T66zmKV6UrqQDeZFRrt81b0qjfVrDzN8uK+rIn8I vQbi8vhQ95LZWlLHzRuk7L9l36JhwPiGatfpuIQgybV+3jA0Bmu684e+dV5daUhaK55nqdMkPXW ABSnvXDYz9tT5QlFQz8489Ztd67mSh7pl/CIP3hGZFTbnjJGgiUNDYhWaWGpRnzJPYH6JaHBjpl 6OBrqJOsH5+6lVU+UhknrO9zbKOo2dIRS7+BRtmNAq0MzQj5klp5uo9slYBm253HaqwLSeulALt seEJQQveiTCIr8oO+D9CsgeREbwPpO3aIHDJGDbuDyT X-Received: by 2002:a05:600c:8b86:b0:493:f5bf:4dc6 with SMTP id 5b1f17b1804b1-49b91c2777emr36908955e9.7.1787872673685; Thu, 27 Aug 2026 16:17:53 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b94dc0f57sm7157765e9.2.2026.08.27.16.17.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 16:17:52 -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 , Uwe Kleine-Koenig , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v3 07/12] media: atomisp: Add Yoga Book camera configuration Date: Fri, 28 Aug 2026 01:17:25 +0200 Message-ID: <73d7c2b008b55c418a556f01d0e19f11e6d71414.1787872237.git.mauriziocasciano7@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) 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..22e0a48f2377 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 { @@ -359,7 +373,12 @@ 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 */ + /* OV5693 */ + ATOMISP_SENSOR_CONFIG("INT33BE", 2, false), + /* OV8858 */ + ATOMISP_SENSOR_CONFIG("INT3477", 4, true), + /* OV2740 */ + ATOMISP_SENSOR_CONFIG("OVTI2740", 2, false), {} }; =20 --=20 2.53.0 From nobody Sun Sep 27 00:34:38 2026 Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) (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 6EE343E3DA2 for ; Thu, 27 Aug 2026 23:17:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787872681; cv=none; b=U/BO9QUf0Eve5hdeg6rhwwUQx/SZjMQ+54XeVh4biF7s7yHj4Lq4tPn1DrNyJiHwGAe1xixJ11YfuUljkM5zHNurm7ZbR15SdjwMIFZCX0EIsyRaElAhUFMD3/mzfEKXd/26NSxzHP43/40pYxIMWXHDChGJbFc7/uhwxRE2h94= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787872681; c=relaxed/simple; bh=CTGsfmZDksadpnanvcfEYGXL7tLdUkg3E8xmQkn6r2Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=srd/6rg8S2c71MT8FAY2KsT4vSXdgUObDE89XUzvh4HtSfcAQNWGvuQiAddYQ9SpAluC/qEGAJkwEP/H7HPNyaSqdOp5TFnODizrT5snTaMpAxuPK4UUyDz0SAKOb7IyahiBKWwcbUJL0HuDaetBaQ7eo1W2JekYu+DUqdHYhnQ= 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=Magf16Ln; arc=none smtp.client-ip=209.85.128.49 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="Magf16Ln" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-49800c6a846so3475745e9.3 for ; Thu, 27 Aug 2026 16:17:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787872676; x=1788477476; 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=z+G454GsrR7gtM7UPZVedJNUbl2hFNr+TyTV5AKGCYw=; b=Magf16Lnod1Qb4+AoLij6TywFA4Q3PlR4OID/VKr44fP5xV8+2JzBlo3WQsa3EPkD4 cR4Mm+kPpI+qjTtMs9KpNpXjmOdFHqwRpJiINvZpgcbUWGbflB1lCUbOVA3TDxFdQ94x zPkoHWwRruMz2NWEmCIPAPjsUcMkmyDpn+PqTCnkJj7ZziQYQD1EfzL8T3VYEjIfh9AD UNmCq6n+VgookAYit1ltxYaiel0uzCo8uIlWIk4MeeSpI2iQRLYH9n7hPbrayO+aZs74 qCAbLuU9uzgPdfFVqLtnVeqi9v9rNZuY8hkUHcxsOcEH6j5f2olw2L+ParKcpavoAQcT sqEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787872676; x=1788477476; 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=z+G454GsrR7gtM7UPZVedJNUbl2hFNr+TyTV5AKGCYw=; b=nMP5G39ksPmqZ2Jq5dgQTofz+wJvfGJ9c8dcDxqkRo2uYrZlqHzedm3B2Dp2hNvrxw 7FVNZwzRc9mIuUPM+ySwxmCg2pjMM5+t9nlxSM6I5Rsbih3eKlvUSEK7GYY0SU+rsFc2 A1jKeYYLHYa18UWaMkXs0d+3XVpzsOG1XzWMWl4/HHIRRntjM9gJTpdL3zXocRvJgAL2 t112brhIoCiYeuuJb+Ped1eZeHcjljoVIubMtZHHwYH8YbKA6mOGcvn2Th9EB38zR1VR LVHwk5uGbM/MEuFrGpYdCSqXzbNoogBnpyQJPsH8HsjsuEZC1w6uh3wtSH0jqzur1OHd M16Q== X-Forwarded-Encrypted: i=1; AHgh+Rp/vVANJVuLmxkAFmADJjEyiDzq/xW8ggMmi/ThH32ypSHWHiM4zq0/QySQwoALVjen9V8e3wqN7BXNBU4=@vger.kernel.org X-Gm-Message-State: AFuF++ngM5GdfHhUuy0/KEro4zoDvlqYdc5Km9ULONB9JpfWIM6rQxS2 g/HO4ix53h20MRw87HSK/t7P6QFA46mQaSdZYnSrVpMpboVY9zEfexmH X-Gm-Gg: AR+sD11BnaOpY/ORbZ3U66mfD7nib5PmJBvMfPgNlD4nWl4ojYdVZLSN2V8TA27D388 RFmSfX3WdVfY5szrX9kJLx5+MrNOmbNkbIsUmHPq7MWwgxeGArEzI/lpCsuP/I1AxauYo5DMvwa 0rYmyhVlOSMnuQ9HZQoDGB5MCeEC+Y6zwSxJ5FkYPpamAJZ7+u3+U9pKm4qShboMcwP7lk3T1nc 2OJtgQstnpAJEFUMfH3SeCn+PCO84Qk3K25lSRptR/kjRHQICRKswvVwbW5fBigKhI0CM+YgOrL /4z79ZKL8xSXkk6C/ootFtmCh/FxhsYJlvpDU1S30CIajlGVfbCanOMo7Oa3dg7sqE48pN65YHV uw+5qB4vI1x2ilOse4b+ti1ypwmz8+8tOtVIuub+SSrKxujtUW3CYSUC0RMEVKyi+/ckRF3IehR gO7oPbOqvqOGLDPo57kW4gPpUgktURhlEu15zn8sJG4XRaoIt2ixcfCHlVRUMntNC5ees6qQ5zF 35MQ70zf8k15kWK8/rdM2klQjuBQlnft7lAugr4aZs0 X-Received: by 2002:a05:600c:1c0a:b0:499:51f0:a9b2 with SMTP id 5b1f17b1804b1-49b91c1dd3fmr35213305e9.1.1787872676531; Thu, 27 Aug 2026 16:17:56 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b94dc0f57sm7157765e9.2.2026.08.27.16.17.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 16:17:55 -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 , Uwe Kleine-Koenig , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v3 08/12] media: atomisp: support the Yoga Book OV2740 link Date: Fri, 28 Aug 2026 01:17:26 +0200 Message-ID: <34736c93669fcb3e34023137b7785d469a843254.1787872237.git.mauriziocasciano7@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 | 52 ++++++++- include/media/ipu-bridge.h | 2 + 6 files changed, 172 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 22e0a48f2377..1cdb83cde8a1 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. */ @@ -374,11 +414,11 @@ static const struct acpi_device_id atomisp_sensor_con= figs[] =3D { * an i2c-client for the VCM, so it is disabled for now. */ /* OV5693 */ - ATOMISP_SENSOR_CONFIG("INT33BE", 2, false), + ATOMISP_SENSOR_CONFIG("INT33BE", 2, false, 0), /* OV8858 */ - ATOMISP_SENSOR_CONFIG("INT3477", 4, true), + ATOMISP_SENSOR_CONFIG("INT3477", 4, true, 0), /* OV2740 */ - ATOMISP_SENSOR_CONFIG("OVTI2740", 2, false), + ATOMISP_SENSOR_CONFIG("OVTI2740", 2, false, 288 * HZ_PER_MHZ), {} }; =20 @@ -397,6 +437,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:34:38 2026 Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) (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 A4C8A386C1B for ; Thu, 27 Aug 2026 23:18:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787872682; cv=none; b=KSCcpD/lCTTGQF5wmf7ks6WWmej2Sq/lg7HrWcCx29ycPN80vOq7wdiG0xV6Qxm2OzjgyzLFvDzdlepSxLHVZkVTjNXiC0F5yqJfKTZa11oyBWwTelHuWPudkyWFGaykJ4w+deTHxDp7SQPp7BjGDU0uPNQsA8A1bIPbb+DaEGI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787872682; c=relaxed/simple; bh=A/AYxGDhE/Ex2CqZrYjDja9gLs4eklMYsN3ZXwfQQ1o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=szjvV0Ida2xlrJq80JZfBLTwydafSGTHa6JkEoCJxlYwwSURW4QxCuiELP9YuT+fXkgmla7RZ+TfdEbWtWSDiViBKMwMbyX8foJ87OrPXX6YdkpqghVcNC1RhEUZATrxIJq2G9RNm5cM5lJY7IFfAxjhceBQUsoLb7DZU9gocpM= 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=pSSAhGsq; arc=none smtp.client-ip=209.85.128.47 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="pSSAhGsq" Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-4921eed3fa2so2234395e9.0 for ; Thu, 27 Aug 2026 16:18:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787872678; x=1788477478; 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=UET8U7EbccYF8hlqBlyOGBwSEMl/AgFZY7jlxT3lfR8=; b=pSSAhGsqtKBbf5jxyAgtCUYXIeMzILonqLNhLpWAi+fQi91+cEcXW3uiOJD2VGBW+I dTyEj+8H5bie92tkP2LrHgM8IJZfLsJQpEfyS7o34bi/tadB0eZOwZ6KxUClk77r+Ep4 Y4G0jIFuLdFzEhUTqdv9R1WVK+ZafXfUo+Cxrk/o6M2f2WKiAl/d/TIStxFLOxuRDzM/ Ytv8dilVBNEjPwe3QO/Mp+vsIwykys24KvuwR86dRyZ+fqCzXnVO94IY8Tr9sWWh5Dya ZlrTb/QKdMI886ebqE1EU/dr3WC1X24EUI/SsPI8JQMcYJQV3hmWv1O8ZShPaNq0pL58 Kr3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787872678; x=1788477478; 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=UET8U7EbccYF8hlqBlyOGBwSEMl/AgFZY7jlxT3lfR8=; b=N6I2JLJ+2vx8fQ0GzAZJYyRlq+RdsdcbSmCOYp+hLuUfqdi456392p0xW/NNxjLXUq LCMxsOA4/eCEQ5+CWz8w9jrXoNln8SMD2O3L0UXWCBF8RlPJLEAuBqqTaSGFiABBEcNW UqMZiP5ybNCrD7xbCDLQxnWHAC0r829m9g0M5r+//RTgQFIpEbNDx6AZQfB37sTgHrXC 2meTWzqYjtmYUi83blrPEuTu5XpWdnjGQ+O8XgY/qvn2id8w5cf6hQhmC9p0QpQIILBM I5xeRcL78IoEe2YDy8lG+PGqvNUnH2TbgmfdWFZqj0L06msgy3oHPVSs7iA1FoMQrFia K7kg== X-Forwarded-Encrypted: i=1; AHgh+RpBWQPLfSuhQQ8xW5PvRxlKLkLAvxBs4EypZxE1pPD0RfY6a55liX4tkhDbDKuDupVDM1smt4goUrvsifI=@vger.kernel.org X-Gm-Message-State: AFuF++mtzWMozBWjeSMlja/ful/j2UUAe6sM4iQa8Qn/jztCOY3Lpssy TAg4uUt1wBsfpWvHZSasRzjBUwCtKMMct+gtCeQHkJCb2HpxraKllwHS X-Gm-Gg: AR+sD12rWri1CXW2gnhowIkzPlBJ0qceyWB8wHoFaxmHQNuXDKiF/210sKIyCS6K2V+ Ec3xQR0rtsYn9BkvM9xP7UOuc7B/1q3bYKrsy+IJKEbDEXj8ldAgG9nFL7B8ostifbFiPUJCX2d B3w2ToOyaXE4Z4BLHYzi7FOjFg2SsFSshW2GM1hT51s0e0NpTuOKYsXahmg168u9uDdR4gLlwOw FXOkXdBq03D2BHfMbeQEPaq+yWEsfYH0qBsWHXhNK2njSZZBkXt/1AlFow1vf9nhSAFyqnxsD34 c2W2MVi1ZvFJ88h6ySvbw1uGt4wQhHD5bWvDNul1gW1j0HP30D2B4IYpnaDHhyCOfptSzMhjJCw cQooXxrKbhAnR97Retq6FTnwsalQbzvty+EXk7ECRvm8xkvUF1MxB7MO2OD9AcSDiVBT5BL4h20 K4sP8K7SRiNr0A/6mxm0s0dPZ50kROMHDMcJIxxqVR0Hvx4MGNWNPyRWT8GcfGw/VFLwlxVFF+5 yzlD7wwoHw31eR13Fll0FJHmyPYKE6TPpL4Y0S374ZH X-Received: by 2002:a05:600c:5299:b0:49b:8e8f:a409 with SMTP id 5b1f17b1804b1-49b91c6481bmr28112425e9.13.1787872678554; Thu, 27 Aug 2026 16:17:58 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b94dc0f57sm7157765e9.2.2026.08.27.16.17.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 16:17:57 -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 , Uwe Kleine-Koenig , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v3 09/12] media: ov2740: add manual white balance controls Date: Fri, 28 Aug 2026 01:17:27 +0200 Message-ID: <296394867b779cfcf979c590ef873c2fc19416a0.1787872237.git.mauriziocasciano7@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 | 65 ++++++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 20 deletions(-) diff --git a/drivers/media/i2c/ov2740.c b/drivers/media/i2c/ov2740.c index 6083dd28e4ad..ae8074cb7443 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,41 @@ 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 d_gain =3D ov2740->digital_gain->val; + u32 blue_gain, red_gain; + int end_ret, launch_ret, ret; =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); + /* Balance controls use 1024 as unity relative to the digital gain. */ + red_gain =3D DIV_ROUND_CLOSEST(d_gain * ov2740->red_balance->val, + OV2740_DGTL_GAIN_DEFAULT); + red_gain =3D min(red_gain, OV2740_DGTL_GAIN_MAX); + 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); 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; + blue_gain =3D DIV_ROUND_CLOSEST(d_gain * ov2740->blue_balance->val, + OV2740_DGTL_GAIN_DEFAULT); + blue_gain =3D min(blue_gain, OV2740_DGTL_GAIN_MAX); + 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 +815,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 +858,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 +893,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:34:38 2026 Received: from mail-wr1-f47.google.com (mail-wr1-f47.google.com [209.85.221.47]) (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 AB7A93EC2E6 for ; Thu, 27 Aug 2026 23:18:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787872686; cv=none; b=jigc4x2RXjHC7uJwfYLma7NxGXspSX+UUvLV50ygzGO469znuF6ggcn+xBw/v95x2LPiCOhoaKKqnojojQM5rNCeSQY8RyZvcruhq0GaJQeCzFf9YeBmPckFhOs5WZFBo8FI87mDY4TZ5uL+Km9vyytd5C1HFmvdXRs9GkSL3WQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787872686; c=relaxed/simple; bh=/jOhce2BN6VpAXwoiqB7U1OURXwM6bRy+qBptBCallw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JXW86tyc/PMDzDc//qHEukNksUq9zajq5RurFBI8Op6H6rJc2VaBpj6R6W1xuQ0brAyjO9jEiIyHsoDL50572sFWkdnmGUZtHUxKz6/k/Y8J3fV5CD1BMAaojLrsQlkRT+JgluoJRcCxbu57AV4wW5FPBiaDMb28I7IaIV+vLXc= 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=bweb6dzp; arc=none smtp.client-ip=209.85.221.47 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="bweb6dzp" Received: by mail-wr1-f47.google.com with SMTP id ffacd0b85a97d-482e2fdf5abso78415f8f.2 for ; Thu, 27 Aug 2026 16:18:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787872682; x=1788477482; 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=gHPz8eBJKsS4HfZNihKxORDaEopiSH7AswobSRa+vUI=; b=bweb6dzpD7bxiS325bW4f+mIeSSvo0aUiEax8Cy6L1iwrFa+NNOYNmLwwmSY4XxKtl qrGwBT823I9mz/KiJU6JDykhsvzG4qBsd594zhqJBXLhCQpk6o1uQKKZrsZcwQCAKalU 0UbxMA6hBG4elkXTDq9ObSIyMos7k/nRRr+qyspB5KWmS3Xf262kCmxxgkmt4SjkUGL3 j1SEeJYiQ952c/alVWgV9g7xe0iAxl0anovy/mxhCvAHOfGXfq7mdb8TRJbMJxBCn7fw V2DhtnpEHK3AM6Yqtn04wTu0bL+rMzSE6Djo1TxuAinMsUifVcY87zCJkZV4aFJmMHSY rNOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787872682; x=1788477482; 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=gHPz8eBJKsS4HfZNihKxORDaEopiSH7AswobSRa+vUI=; b=rMV7UOJ4n0ULGfacmW1c7bIhMC8Jsh8bX5/10KfcoYlKCuXGQRib9DCGPR1GumY9L3 SxboSoacm7q6+yqLwmW8a3ePUAmHYUwdvtKkZ/QUxpz8hnsZyQaF7/SekSqSSsfdod9l TVpyoBRz+GODb1YysvUXB4SW7N9A49541HGpDu7v5TABQeRNrU/APKbJADkvLVTnD0i9 Ft7gyALmU2nrfooeqAN48e4jhY9DYomYwTChMS4VqzP3H+R4I8Bk8Lkt2XrNtlTE8qCR GT17f5KiyVSeYjVwLVAgZicpMx7xtyXbGzKH0EVLkLRBceLfaXHOYo81U9c2KCx+naqu Oggw== X-Forwarded-Encrypted: i=1; AHgh+RrjdrMPR0glaxl5WiNVrSFIB8c//o+Zt3wfRuakiOpuiTt7AuIQPYjPAy2pPSbDa/J3YZKT1ieHIgSpyo0=@vger.kernel.org X-Gm-Message-State: AFuF++kXy+qnJjvrj8AfUyWuZoAw6ajI2/5dej8t4yu4qxdgzmb/Ww8i FK2ock0jFefHDku+QG+jW7ajdPm2DHxLVCs44szJWHI/KP7MaJA4LbCf X-Gm-Gg: AR+sD10vzkBdAUgL/DZGoXAmpCAxrxBxC/pWWr5poo8CtGaWRz/Ml4cq0R0u9IFKtgv Tp+gHfc5YIiNqC1HpaI/XgeaFU4Kq+CY+rlmT/1P+PRZgkod2qNWrlMEP00YFRj+tjTsfslM+aa 5tdTHxIfsA4yyILK1rriio3dF2hk6lHN9+deFAkFtmHR5+7Z6OmxM7R7taQhmdeDWmn1V/hP2Dd IMzA16tE4rbFOFE/SZQCDxVvRH0VUQjIoOaAXdx8Nm4aNvuUF9hRtv7iqseiYhgkJOfhbm5QI+L Af82FXz4YqzGISxWw1w8I5/6Oh79a7fyPlAVehrkBc1odbexEoj41rrwh+fDyyFwhPu+rNqSjhp q2WCPoku8rF865sZlZ7FuwnJzPMij6PPyLXN+BDsost7MW9HL0qG8qMJDIS8kv9xzjdrYAfA8s9 eciK0CClKjaFidcKPslVsrKMULLCr7/JHIjMnYaYWF0/VCWNp14EfQd8WXr7KHDaZ3V0LJ+WjwL AKBCo9mWBbifD7c099398NgkkXb2EpOtLvWECz5QqCe X-Received: by 2002:a05:600c:c494:b0:499:8aff:59b6 with SMTP id 5b1f17b1804b1-49b91c486c3mr28282985e9.14.1787872681917; Thu, 27 Aug 2026 16:18:01 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b94dc0f57sm7157765e9.2.2026.08.27.16.17.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 16: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 , Uwe Kleine-Koenig , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v3 10/12] media: atomisp: Use struct v4l2_area for padding Date: Fri, 28 Aug 2026 01:17:28 +0200 Message-ID: <2202cbcaf51189b3886c2b2d92b320eb261a4e85.1787872237.git.mauriziocasciano7@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 padding helper passes width and height as four separate scalar arguments even though they form two logical dimensions. Pass the requested size and returned padding as struct v4l2_area values. This also simplifies all three callers before extending the helper with sensor-specific padding. Suggested-by: Andy Shevchenko Link: https://lore.kernel.org/linux-media/apCc_pt5dDxGJrei@ashevche-desk.lo= cal/ Signed-off-by: Maurizio Casciano --- .../staging/media/atomisp/pci/atomisp_cmd.c | 51 +++++++++++-------- .../staging/media/atomisp/pci/atomisp_cmd.h | 6 +-- .../staging/media/atomisp/pci/atomisp_ioctl.c | 14 +++-- 3 files changed, 42 insertions(+), 29 deletions(-) diff --git a/drivers/staging/media/atomisp/pci/atomisp_cmd.c b/drivers/stag= ing/media/atomisp/pci/atomisp_cmd.c index 6cd500d9fd26..51dd59d98b3b 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_cmd.c +++ b/drivers/staging/media/atomisp/pci/atomisp_cmd.c @@ -3562,9 +3562,9 @@ static void atomisp_fill_pix_format(struct v4l2_pix_f= ormat *f, f->xfer_func =3D V4L2_XFER_FUNC_709; } =20 -/* Get sensor padding values for the non padded width x height resolution = */ -void atomisp_get_padding(struct atomisp_device *isp, u32 width, u32 height, - u32 *padding_w, u32 *padding_h) +/* Get sensor padding values for the non-padded size */ +void atomisp_get_padding(struct atomisp_device *isp, struct v4l2_area size, + struct v4l2_area *pad) { struct atomisp_input_subdev *input =3D &isp->inputs[isp->asd.input_curr]; struct v4l2_rect native_rect =3D input->native_rect; @@ -3574,22 +3574,23 @@ void atomisp_get_padding(struct atomisp_device *isp= , u32 width, u32 height, struct v4l2_mbus_framefmt *sink; =20 if (!input->crop_support) { - *padding_w =3D pad_w; - *padding_h =3D pad_h; + pad->width =3D pad_w; + pad->height =3D pad_h; return; } =20 - width =3D min(width, input->active_rect.width); - height =3D min(height, input->active_rect.height); + size.width =3D min(size.width, input->active_rect.width); + size.height =3D min(size.height, input->active_rect.height); =20 - if (input->binning_support && width <=3D (input->active_rect.width / 2) && - height <=3D (input->active_rect.height / 2)) { + if (input->binning_support && + size.width <=3D (input->active_rect.width / 2) && + size.height <=3D (input->active_rect.height / 2)) { native_rect.width /=3D 2; 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); + pad->width =3D min_t(u32, (native_rect.width - size.width) & ~1, pad_w); + pad->height =3D min_t(u32, (native_rect.height - size.height) & ~1, pad_h= ); =20 /* The below minimum padding requirements are for BYT / ISP2400 only */ if (IS_ISP2401) @@ -3617,8 +3618,8 @@ void atomisp_get_padding(struct atomisp_device *isp, = u32 width, u32 height, min_pad_h +=3D 2; =20 apply_min_padding: - *padding_w =3D max_t(u32, *padding_w, min_pad_w); - *padding_h =3D max_t(u32, *padding_h, min_pad_h); + pad->width =3D max_t(u32, pad->width, min_pad_w); + pad->height =3D max_t(u32, pad->height, min_pad_h); } =20 int atomisp_s_sensor_power(struct atomisp_device *isp, unsigned int input,= bool on) @@ -3800,7 +3801,8 @@ int atomisp_try_fmt(struct atomisp_device *isp, struc= t v4l2_pix_format *f, const struct atomisp_format_bridge *fmt, *snr_fmt; struct atomisp_sub_device *asd =3D &isp->asd; struct v4l2_mbus_framefmt ffmt =3D { }; - u32 padding_w, padding_h; + struct v4l2_area padding; + struct v4l2_area size; int ret; =20 fmt =3D atomisp_get_format_bridge(f->pixelformat); @@ -3827,10 +3829,12 @@ int atomisp_try_fmt(struct atomisp_device *isp, str= uct 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); + size.width =3D f->width; + size.height =3D f->height; + atomisp_get_padding(isp, size, &padding); v4l2_fill_mbus_format(&ffmt, f, fmt->mbus_code); - ffmt.width +=3D padding_w; - ffmt.height +=3D padding_h; + ffmt.width +=3D padding.width; + ffmt.height +=3D padding.height; =20 dev_dbg(isp->dev, "try_mbus_fmt: try %ux%u\n", ffmt.width, ffmt.height); =20 @@ -3847,8 +3851,8 @@ int atomisp_try_fmt(struct atomisp_device *isp, struc= t v4l2_pix_format *f, return -EINVAL; } =20 - f->width =3D ffmt.width - padding_w; - f->height =3D ffmt.height - padding_h; + f->width =3D ffmt.width - padding.width; + f->height =3D ffmt.height - padding.height; =20 /* * If the format is jpeg or custom RAW, then the width and height will @@ -4334,6 +4338,8 @@ int atomisp_set_fmt(struct video_device *vdev, struct= v4l2_format *f) const struct atomisp_format_bridge *format_bridge; const struct atomisp_format_bridge *snr_format_bridge; struct ia_css_frame_info output_info; + struct v4l2_area padding; + struct v4l2_area size; unsigned int dvs_env_w =3D 0, dvs_env_h =3D 0; struct v4l2_mbus_framefmt isp_source_fmt =3D {0}; struct v4l2_rect isp_sink_crop; @@ -4366,8 +4372,11 @@ int atomisp_set_fmt(struct video_device *vdev, struc= t v4l2_format *f) ATOMISP_SUBDEV_PAD_SOURCE, &isp_source_fmt); =20 if (atomisp_subdev_format_conversion(asd)) { - atomisp_get_padding(isp, f->fmt.pix.width, f->fmt.pix.height, - &asd->sink_pad_padding_w, &asd->sink_pad_padding_h); + size.width =3D f->fmt.pix.width; + size.height =3D f->fmt.pix.height; + atomisp_get_padding(isp, size, &padding); + asd->sink_pad_padding_w =3D padding.width; + asd->sink_pad_padding_h =3D padding.height; } else { asd->sink_pad_padding_w =3D 0; asd->sink_pad_padding_h =3D 0; diff --git a/drivers/staging/media/atomisp/pci/atomisp_cmd.h b/drivers/stag= ing/media/atomisp/pci/atomisp_cmd.h index d3d1f2574e77..8a84e774f4d5 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_cmd.h +++ b/drivers/staging/media/atomisp/pci/atomisp_cmd.h @@ -225,9 +225,9 @@ int atomisp_makeup_css_parameters(struct atomisp_sub_de= vice *asd, int atomisp_compare_grid(struct atomisp_sub_device *asd, struct atomisp_grid_info *atomgrid); =20 -/* Get sensor padding values for the non padded width x height resolution = */ -void atomisp_get_padding(struct atomisp_device *isp, u32 width, u32 height, - u32 *padding_w, u32 *padding_h); +/* Get sensor padding values for the non-padded size */ +void atomisp_get_padding(struct atomisp_device *isp, struct v4l2_area size, + struct v4l2_area *pad); =20 /* Set sensor power (no-op if already on/off) */ int atomisp_s_sensor_power(struct atomisp_device *isp, unsigned int input,= bool on); diff --git a/drivers/staging/media/atomisp/pci/atomisp_ioctl.c b/drivers/st= aging/media/atomisp/pci/atomisp_ioctl.c index 50366bf10f32..43bca68d1e6d 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_ioctl.c +++ b/drivers/staging/media/atomisp/pci/atomisp_ioctl.c @@ -470,15 +470,19 @@ static int atomisp_enum_framesizes_crop_inner(struct = atomisp_device *isp, { 800, 600 }, { 640, 480 }, }; - u32 padding_w, padding_h; int i; =20 for (i =3D 0; i < ARRAY_SIZE(frame_sizes); i++) { - atomisp_get_padding(isp, frame_sizes[i].width, frame_sizes[i].height, - &padding_w, &padding_h); + struct v4l2_area size =3D { + .width =3D frame_sizes[i].width, + .height =3D frame_sizes[i].height, + }; + struct v4l2_area padding; =20 - if ((frame_sizes[i].width + padding_w) > native->width || - (frame_sizes[i].height + padding_h) > native->height) + atomisp_get_padding(isp, size, &padding); + + if ((frame_sizes[i].width + padding.width) > native->width || + (frame_sizes[i].height + padding.height) > native->height) continue; =20 /* --=20 2.53.0 From nobody Sun Sep 27 00:34:38 2026 Received: from mail-wm1-f42.google.com (mail-wm1-f42.google.com [209.85.128.42]) (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 6B3643E1729 for ; Thu, 27 Aug 2026 23:18:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787872688; cv=none; b=UqBTU8e/vKpONB+DggxwMxx+EQrTfhDaNjVZNvjk/GFqZXyxskYE0Ukf6s2h7zvpwhZCR/wUdZl/2nzQMmzs+eWe95CisEzs3v6Ixe16mPneKYg43PIXwijs4wzaN2dUVNZfqEbtAv8TmYL/HwHWNf80030kvC61HIYKR5QuwdA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787872688; c=relaxed/simple; bh=06BDGSeWZrjkZVq9Ybz+15BuOvmcmEElYtcKAg3fP+0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=t8iRDXpgiys5WKDbxpPJPwzLp3gmvwY8QWCLVI0YdxG9F8OWJeIz5F8kDOeCHWG4hmFx/SiGqEtnlFbm2wOU60ll3OtXS3e3mMhdlRz34ZC1Lw+1seQLoEuP9WBgfNLVsN9pPTRJ6cUEHzNP7s2Q1tDQWA8FaXxJln+aMjLDYtI= 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=ofUFleS0; arc=none smtp.client-ip=209.85.128.42 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="ofUFleS0" Received: by mail-wm1-f42.google.com with SMTP id 5b1f17b1804b1-490cf322ed0so2875385e9.1 for ; Thu, 27 Aug 2026 16:18:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787872684; x=1788477484; 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=e5EzfrebV+cnYwiBLDxybXNRHeOONSFXixxdRBnShE0=; b=ofUFleS03xU+pwOeXSxJ6voN0FJZzcDyv2OVNalrMkRTHAsyGFoql2Wv46KS0nf7To Jmx/Fn+PviPRXEFLNtBCeh2ecTh6CnPMK8wvZBoWJ502/Y1mfh4AYHp1wHKX+lnEMMx0 TVmRUf2/hGYVrXyS1IGqDmtKL+5jBRmZkz7ELHXxVH+JkR97VA7/wgDS0IiPogvt/bD2 2y0Twp8XgGsQ+aL5kl5MsGibEv2aY6MC008A31fmB3lKhgPxFvCyLqx+G17Y/acbgUIM ojq7iIo4eQhy3Igm6QXQtkkKBh8ksDYqUg1297f1GYA8D125XNXTQppDWWZ5HYQ7XVwF qTJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787872684; x=1788477484; 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=e5EzfrebV+cnYwiBLDxybXNRHeOONSFXixxdRBnShE0=; b=MOmUeBQorLuQSWnQ4dIwnnDW4bJ/HyAf0W1OwF0j840S4iOy8cxAYi36e7BKYawPf3 mc2xEwQ8LXOBlNiGi01W9yru1BAoCgAbq6zmzbg32e7uvUR7IPNn7T2iVPU+kxQKbQAD aQ7OaApO4x2Ze3+dTKD39o1AkG81+85IrUrjnx4042LtqEnfQQz2qrm8/DDE3GTtptfj j8Gra7b05wbHVKR/lo8ceGH0boaAQKcMQskYgbxstzUZZNxnw/SQ057NQ068QZXMDM4b g1VSBZezeyOmHz+4ox83gWHvBeMRpLUlHnAO/2c5RI5c/tNS2K3lFBOj1Hs8zehG+eMb bBag== X-Forwarded-Encrypted: i=1; AHgh+RoYVk29g2vHKNwvJpflZMiYNfplw90w7Y0NbzcrIlw4yje1qPK/ml0ok5aeb6ixvGF0ouTbVkogbgZZup4=@vger.kernel.org X-Gm-Message-State: AFuF++kIdw646NUHvVXoLLGnGCUUiW848k2AaH0SwrsAFRKVIiFZZeNM ZbAXd1laG8RcuFZpkfkTeJ4lMqfaXS622xcDrNPpHLAtkoIDwLrEw32L X-Gm-Gg: AR+sD11/CsR7CVBNKbdQ2jIWZLcxAPyHh8o0gzPifOIhPZI5s32BXL+EIOUqJTYHb1d bDwHoYl7SVZAf86BMCSOpIXDA+vRxeqUcO8axcWEyDdiUVoJHIwQ8Vhn+MSKP1RS5lDi3Mmk6ww eqBcjpyVSjp8sBUWcOJhqgj7s2djroVp4GXMWiv4u+GruXQL9Mc0I0L3yR4lHlTIysU6D9LU2Yf 0Akd8phZ+LDxi+fJ7rPh8+bk9bghsntq0YP722y+ChRsFctp/vB7txY2abx/9aKMe4ytx3jTHzz wfTcoQ9Ohoo31rB+ylfPn6ggHLTYD2pV/66b9up96bAyVaBaIyzGgBzScNvu7u0cDeptVCUTwL4 PpzIv2EBeEMh4ka+jwCQMWNuKX+4PjdeTBqtVY6th3TfRJif5BmNPnI91X4mGIJOnXfmrsQI7Ze VtcK0o6E/ZVRPBXVnEAyhr74wv8fKyQKzMONVuUCJB5qJXET8w3gKTLZaaiD8+1cuJDm9yrtFGq SOvUvhjZw/o1XnJANzAJGIAUFuhndGsp1+aDVGRrfjj X-Received: by 2002:a05:600c:c4ac:b0:499:a5fc:2087 with SMTP id 5b1f17b1804b1-49b91c20e36mr31843145e9.6.1787872684380; Thu, 27 Aug 2026 16:18:04 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b94dc0f57sm7157765e9.2.2026.08.27.16.18.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 16: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 , Uwe Kleine-Koenig , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v3 11/12] media: atomisp: allow raw Bayer capture Date: Fri, 28 Aug 2026 01:17:29 +0200 Message-ID: <9535d6ecaa9b12421a6b17de54a954aa336a7819.1787872237.git.mauriziocasciano7@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 | 34 ++++++++++++++----- .../media/atomisp/pci/atomisp_internal.h | 3 ++ .../staging/media/atomisp/pci/atomisp_ioctl.c | 21 ++++++++++-- .../staging/media/atomisp/pci/atomisp_v4l2.c | 9 +++++ 4 files changed, 55 insertions(+), 12 deletions(-) diff --git a/drivers/staging/media/atomisp/pci/atomisp_cmd.c b/drivers/stag= ing/media/atomisp/pci/atomisp_cmd.c index 51dd59d98b3b..501a1fb5b83a 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_cmd.c +++ b/drivers/staging/media/atomisp/pci/atomisp_cmd.c @@ -3572,10 +3572,16 @@ void atomisp_get_padding(struct atomisp_device *isp= , struct v4l2_area size, u32 min_pad_w =3D ISP2400_MIN_PAD_W; u32 min_pad_h =3D ISP2400_MIN_PAD_H; struct v4l2_mbus_framefmt *sink; + struct v4l2_area input_padding =3D { + .width =3D pad_w, + .height =3D pad_h, + }; + + if (input->padding_override) + input_padding =3D input->padding; =20 if (!input->crop_support) { - pad->width =3D pad_w; - pad->height =3D pad_h; + *pad =3D input_padding; return; } =20 @@ -3589,8 +3595,10 @@ void atomisp_get_padding(struct atomisp_device *isp,= struct v4l2_area size, native_rect.height /=3D 2; } =20 - pad->width =3D min_t(u32, (native_rect.width - size.width) & ~1, pad_w); - pad->height =3D min_t(u32, (native_rect.height - size.height) & ~1, pad_h= ); + pad->width =3D min_t(u32, (native_rect.width - size.width) & ~1, + input_padding.width); + pad->height =3D min_t(u32, (native_rect.height - size.height) & ~1, + input_padding.height); =20 /* The below minimum padding requirements are for BYT / ISP2400 only */ if (IS_ISP2401) @@ -3806,8 +3814,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); @@ -3829,9 +3836,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. */ - size.width =3D f->width; - size.height =3D f->height; - atomisp_get_padding(isp, size, &padding); + if (fmt->sh_fmt =3D=3D IA_CSS_FRAME_FORMAT_RAW) { + padding =3D (struct v4l2_area) { }; + } else { + size.width =3D f->width; + size.height =3D f->height; + atomisp_get_padding(isp, size, &padding); + } v4l2_fill_mbus_format(&ffmt, f, fmt->mbus_code); ffmt.width +=3D padding.width; ffmt.height +=3D padding.height; @@ -3850,6 +3861,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.width; f->height =3D ffmt.height - padding.height; 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 43bca68d1e6d..cd479b272469 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_ioctl.c +++ b/drivers/staging/media/atomisp/pci/atomisp_ioctl.c @@ -540,12 +540,21 @@ 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; =20 + format =3D atomisp_get_format_bridge(fsize->pixel_format); + if (!format) + return -EINVAL; + if (input->crop_support) return atomisp_enum_framesizes_crop(isp, fsize); =20 @@ -557,9 +566,14 @@ 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 =3D (struct v4l2_area) { }; + 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; } @@ -633,7 +647,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:34:38 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 4E0113EE1DB for ; Thu, 27 Aug 2026 23:18:08 +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=1787872690; cv=none; b=C3NyIjYmCLNDamvM8aHKJX3vPVOzbc/eYT3AuJqR6R6OaUs8O4+7aaLX++g0QiiEcvsvNMYXtRIa5mu9M3qE9d58Jj2Fs0emc5ddLkI102pwT40P2Vt7D4KUZOneg28sBmoCSyKiUeZ1U4MNUWqUfpk65sWfL5edd/fHA/rSpDI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787872690; c=relaxed/simple; bh=KL/KrKPv/CwkOu/hDT8WvQPP4w2GF0et/e0jlzVc5sQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PrJ8KcWJUylUkStvmJisaP2gCtuUYh1A0F65gC4cC3NU9m0JCmSHJfUZBv1eCf3CLV29ZIpeeeFDLXcDITobPv5yUt/XgiWxShg0l5Hg6I6gvUJz0RgCuEYMDW2h9yEYSnzFKDAgB7F0733aZ1sszftcUdhTBsxzNdaQPk+Nopo= 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=g51YsWWE; 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="g51YsWWE" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-499b2981a7bso3450195e9.3 for ; Thu, 27 Aug 2026 16:18:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787872686; x=1788477486; 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=G4CRs1pCaiygjhdGFap4Gmf6j66aGIB4LLnvtR7XBso=; b=g51YsWWEDxvlzy33m9HgweTyc0zbI84/NbRZOQpRU6AAt8oGcIuP8WTZqlTpTItskC 8uS5VFLElysCluWXSWr0z74lIyOEvLiSefYqG7+UeihwfUeGi+aCh1f+tdrqdXQW2mHi F9UOkRhfuehKeHZ0ht+0CPgrqqitwjnwUJPE5B2R3u0zbiYjPP/bEDM9Ig54vchYvlCl gmu7w9NOwkgfYe6YUAvuAkYQerzwlILsK0ckjaxxBOLMnNItCxCB9Xb4Ggb4p+8SiBE3 YhlgFQAuK2nZEAAsaeVZk8jtezIgZ3GgXeoB1PndrU5PnExriRwO7yM8cOBYJRC0ERS+ fIDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787872686; x=1788477486; 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=G4CRs1pCaiygjhdGFap4Gmf6j66aGIB4LLnvtR7XBso=; b=L+o48ezFTQmg5eWDACgCDfAo9lLarIlDzS643hqJzLHYNomMC3FWytQHBoQi+i+81l bNWNXYJslrBXzOIeNBHXm+kPIlrrqPlW8a8HDNy8vPDayh5rmSodYxsCt/imSkgzV262 48k7aSvpTqWwJv5biTMTsw2pMiTA70e45g6j+0Lm5ZuebSZKamaEUp4sFlwfCUtnnrO2 6HMb51kjbbPjpUTXbeRKgsrUpZZVjar5P34+B2sqbjG3xZ+piwicLPGKTGkxYtjxGWNI ARkE8EsHTLHATiNFuFxCPVrEFr6WfS3+HBSFsTAR+UD/IkQjUC+W3T1VF5wnEI4Iv4ku Pk5A== X-Forwarded-Encrypted: i=1; AHgh+Rpfesnix2S1t/CHdPSriEHRfhDuvjogflegoFcphcOWl5JW6R2dVdzIHxCi1MJZcht3l19Gx071ODYwq54=@vger.kernel.org X-Gm-Message-State: AFuF++kolJaMm6eGmIFfA6CCpy15wHpzUAKXWFoLGWYloQxRGUwWm+ag LsAxpOh2+lXMckFzy8XPpsLg6ug3veprXpFEycr6UxrlHxpSQTY/XeiX X-Gm-Gg: AR+sD138ZNRLKQXxF20BeYMfuoSBf5R3T0az76ufN7+WLsVU/+cuugyjvXbeWQODeAc 0HGs1tR78VL++WM7HfkbHC97pj7yuS0v0xqAoUGus78ulbnMoWX9h1WaZDOIqIiDC1khvK9l8x2 9EIdSQb1NCRqIjvUmC/zYG3/PpE/RAouqj680+gnY18QmBd8O/H9kX8bx+BuK1HY+lMFOO27QbH t4+KYyEF2dpaZZ/bb4ZdOs0Axck0NHQKUOqr9irfT+TdEbCzE/b7HPe8LSCIS+i0v+RRNw2WJta HFpsLQQILxfnkCLIjp211J++Bp/3XBoEIYXHmRl1R2N4Yh0mPdPYg3zNoUZu6Hq8w6ftWO1DBqw kNBG0aBfmdIneuwo+wcARbEpik+L/6iOV07DwC7u+ifYScjUN63/M1RYAG9zWe0pKbzfZ1N28IK 9LlDPpqfl8D7uCDBZ54vgqIXHyIo7yc1CbBKSf9lcfrosl18cZ/K43helPx7bqlCj0snrj2uj9Y 5QBhNoJz8hq84UXspTz2L/b/K3LtM5EPy6MCJBUAgtShj68LohA4qw= X-Received: by 2002:a05:600c:8486:b0:499:dbba:9859 with SMTP id 5b1f17b1804b1-49b91c27436mr34275055e9.5.1787872686382; Thu, 27 Aug 2026 16:18:06 -0700 (PDT) Received: from 1Z10 ([78.213.170.242]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49b94dc0f57sm7157765e9.2.2026.08.27.16.18.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 16: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 , Uwe Kleine-Koenig , linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Maurizio Casciano Subject: [PATCH v3 12/12] media: i2c: Add WV517S lens actuator driver Date: Fri, 28 Aug 2026 01:17:30 +0200 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: 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 | 206 +++++++++++++++++++++++++++++++++++++ 4 files changed, 219 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..fa6c6d7524fb --- /dev/null +++ b/drivers/media/i2c/wv517s.c @@ -0,0 +1,206 @@ +// 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 +#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; + + if (ctrl->id !=3D V4L2_CID_FOCUS_ABSOLUTE) + return -EINVAL; + + /* 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; + + ret =3D regmap_write(wv517s->regmap, WV517S_REG_FOCUS, ctrl->val); + + 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 DEFINE_RUNTIME_DEV_PM_OPS(wv517s_pm_ops, NULL, wv517s_resume, NULL); + +static int wv517s_probe(struct i2c_client *client) +{ + struct device *dev =3D &client->dev; + struct wv517s_device *wv517s; + int ret; + + wv517s =3D devm_kzalloc(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(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(dev); + pm_runtime_enable(dev); + + ret =3D wv517s_resume(dev); + if (ret) + goto err_disable_pm; + + ret =3D v4l2_async_register_subdev(&wv517s->sd); + if (ret) + goto err_disable_pm; + + pm_runtime_idle(dev); + + return 0; + +err_disable_pm: + pm_runtime_disable(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 { + { .name =3D "wv517s" }, + { } +}; +MODULE_DEVICE_TABLE(i2c, wv517s_id_table); + +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