From nobody Sat Sep 26 20:27:54 2026 Received: from mail-pf1-f182.google.com (mail-pf1-f182.google.com [209.85.210.182]) (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 540DD3A2E0A for ; Sun, 30 Aug 2026 16:02:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788105767; cv=none; b=MlKcV1PNLmk6KZouMwkUyxjWSC3/JcnnLoPq0wDA7GkpsbvFWpE/lGmmCrq1wDQQBoqfs/2BLJC+Wis0FgC2NT/fml+hJmtN00T/SqDUDeBDO3MzhO5PGybRrbRKYqNCxblo1DcWiyT98uFqbBmOd84GNDK0kQWwjKNo4w2BPYg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788105767; c=relaxed/simple; bh=izFkUJVrZGWtWRP+0Tn/5mmA4bhWogEsegWu0OodXqM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fqnj1nO/3R8fka6r7mHuiXmiPWQ/BS+YrKicwvxSJwbWJ3FZwlTvFFix9IPHCNfrTe4PtHbdK8ZYLJ3p18Hk7CDYH7+D9lh3BCjM9UO4oZ59swCUlCpvid5jlmWiVf1BIZ7Nvcq/4htwagMhsJZLm5PFBkyfgUK2JRdMq8bWBU4= 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=U34CmqsL; arc=none smtp.client-ip=209.85.210.182 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="U34CmqsL" Received: by mail-pf1-f182.google.com with SMTP id d2e1a72fcca58-8558c0b26a8so1857294b3a.3 for ; Sun, 30 Aug 2026 09:02:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788105765; x=1788710565; 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=Q4Gd3Zu6V237u3MJ1sYGZ7SxZwjOc/OROhTL4anxICY=; b=U34CmqsLxyMtCcvAj69YvARsucH9vsfcFfQ+QtHYgO5dncuyv9kbFO40P0J+FefEsg qEMCQb8PQKAL/mfCyAbKZHCfr0j06yMZKMRiXsTXyQOXt2oa9uGeluMAHTVxmXVpHcGH 06k73OO6XsQuzyIngkhsGDUAYXJq7dPKDqPTwQB/n6OqBkV6OibmNFDjya+YfGjDqhEM rDxXb50wSoLtGMWQzJMcObSMP0sHGArok9Ni7V2yS1W0EuBO4mHESCJgFOKQF3wtsKzr UAchMdL0mq9Xi+94SEGfMZjQsoqGDcBuMPONwwT6A+olhn9NhU8Pu3XxZdUla5QBkJV+ 8NUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788105765; x=1788710565; 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=Q4Gd3Zu6V237u3MJ1sYGZ7SxZwjOc/OROhTL4anxICY=; b=MKGAEZZ9lUOvD3IW7veVXXVLX9S6adjkyK96jdU4DiLKeTLA9yxV4VN/c7VG3L+ohA Zmb0+BLTdMR+1D+X3igBjhZpcSekxmhXUFObL3HcMnKqjXcppSRKehrs7KPP9aqAXnNf yQxk1lf16ys1qivfYAe3dn0Vrr/kZwLD3pJhrXQNWixBxyzLVOmeFpq8GV2A+UyVKXul GofN9PIm7mnZDnuizOhV7pQ0PahxWo4DiI7EsBHfmsLvzGrN7czCkB2dMxddGKb+/5Az +r+ebP2W/3HDnzLvPimfd9sUx3ujFgZ2Mk4tOzYQzVBRk8jAkYwtdvhl8yD/ecC634Ll h9Gw== X-Forwarded-Encrypted: i=1; AHgh+RqkOr28jJpnkjYn06bDfayBrOKumxpbHsZCYvUVehbNqBBMRux0J3nNdubjMAwakz/8zRui4S1kw67Me70=@vger.kernel.org X-Gm-Message-State: AFuF++kkMtoiKLtLsYog24i1ku3jvZ47NLkZCzG7A5lz+Ksr/ge5IKET tm3g5zR+/PeDmvp79ej1/O/Y4W4GrNCTiUQEU1tSngWglJGxl43b1DGR/8E8FsaO X-Gm-Gg: AR+sD11hP93I6iqpnnYzYGDCepC1NBzntm1YUgW8cpIlURWbhmxE8uu4w10ZkY+m6lp VzBPfmNuhGkrbN2jYA63tCzO6re9BjxSXoI3J+xnrBbGJWursUt47eKRnWNb6cbyVvdpS81dfaQ Tg4fZwqgrAqRUhdyRJ91P2FJxoYwq5cmjRV0uIpGqC8h49GbZy4p1FbpwEkjlE/kxMpzkjorh/b mw6cAvr6/2IlJjc4LwIm5ScDXEUaFX55qrRmPjY9/4HJnMrmrbgTVQ74s15PbOxIDAH8/41neKw sIW85bzxNZJPAzQwafi9kMxIHE3D9x1qi0DaaXXjWXbVP2kGj/Wc5p001MyPNP6UPcF49pf9PVa cBJiHtdndiESrfHwkpfgQcD2HTPqKlqBpcoF8MAqgP/UKzHLDSbFxeNo7e3aCLLtizUqBPA1Ni0 7GsJ1KCyU/w8ES7fgZGnCqXWidT2l2bMfC5BV7RjnO6Go6Fsdyze9c89tKb/zuvuBC/1c6FAZYt Jtlr0WgoZhVZLQO90ElDBHGMeYdSxJgvJPLKFTRnndaJWEZR2RZ X-Received: by 2002:a05:6a20:4322:b0:3d3:af85:eb98 with SMTP id adf61e73a8af0-3d3af85fc5bmr16153694637.26.1788105764564; Sun, 30 Aug 2026 09:02:44 -0700 (PDT) Received: from nuvole (2.248.212.35.bc.googleusercontent.com. [35.212.248.2]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-cc1f3312270sm2839584a12.11.2026.08.30.09.02.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 30 Aug 2026 09:02:44 -0700 (PDT) From: Pengyu Luo To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Frank Li , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Sakari Ailus , Martin Kepplinger-Novakovic , Mauro Carvalho Chehab , Sebastian Krzyszkowiak Cc: devicetree@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, Pengyu Luo Subject: [PATCH v6 1/5] media: hi846: Fix hi846_write_reg_16 handling Date: Mon, 31 Aug 2026 00:00:21 +0800 Message-ID: <20260830160025.211384-2-mitltlatltl@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260830160025.211384-1-mitltlatltl@gmail.com> References: <20260830160025.211384-1-mitltlatltl@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" hi846_write_reg_16() does not clear a positive *err value on success. pm_runtime_get_if_in_use() returns a positive value when the device is already in use. When hi846_set_ctrl() passes &ret holding this positive value) to hi846_write_reg_16(), the function returns with ret as is, the positive value propagates back as a return code, which callers interpret as an error. Fix this by resetting *err to 0 only when it is positive. Fixes: 04fc06f6dc15 ("media: hi846: fix usage of pm_runtime_get_if_in_use()= ") Signed-off-by: Pengyu Luo --- drivers/media/i2c/hi846.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/media/i2c/hi846.c b/drivers/media/i2c/hi846.c index a3f77b8434ca..7f069aca0fce 100644 --- a/drivers/media/i2c/hi846.c +++ b/drivers/media/i2c/hi846.c @@ -1271,6 +1271,8 @@ static void hi846_write_reg_16(struct hi846 *hi846, u= 16 reg, u16 val, int *err) if (*err < 0) return; =20 + *err =3D 0; + put_unaligned_be16(reg, buf); put_unaligned_be16(val, buf + 2); ret =3D i2c_master_send(client, buf, sizeof(buf)); --=20 2.55.0 From nobody Sat Sep 26 20:27:54 2026 Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) (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 6B05A2D0602 for ; Sun, 30 Aug 2026 16:02:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788105778; cv=none; b=OrlNiayFt5Sj2A0Edyr5XO30l0oNji3AQSUgmKsTbrZr0mrICGAE8BAWjNLtz67/FXmgIlyyOedOhpsDECtp5jfo3/oOV7mvXB9wV2BE4XH5bWQyGa41TXnb0rnkHcCVPGVcTQlmld390Ci3RArT9Ohul+fiXzZ64Gbj2sW6KUI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788105778; c=relaxed/simple; bh=RHIFxs9YrEaoTa6ZvV6LQUL3AldolGdxoyL81l2Y4vA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NJlZNzLgsCJbptlLBM6l/zL1Ezynk/AlStqZbua/AYQds7Rk0N4nSFHqneWZXy7UbsVZci9oXkqvVcf9wga04ooGxEo+DT6BlzDoyJGiQpmYGD8lwIIged4CXLj/WfpDr2a/6cSE4pZUugFAk/nvR5lKZFX3z0s6ldmV4/AZ8Qg= 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=Ey47t9wb; arc=none smtp.client-ip=209.85.210.175 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="Ey47t9wb" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-852c481415fso2950724b3a.3 for ; Sun, 30 Aug 2026 09:02:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788105776; x=1788710576; 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=HROlraX6vGLZgnawqAwSnbTcyoz5nQUPKuJqXPgTnHE=; b=Ey47t9wbO6UPuZNqIfwVlrfy3QaQ6DagsFw60iN7UjZLfcqj/Bnxxa4nkyzbvbrv+u wxxqV040zKrUmd3Gv50IAiagkpBL5qiMGt4J9++sFue2j7KIOmlFjhGoYdleDV0mcxBA SqKQullQb5CNzZ157OqteNOos17NANy1MQ/cXi8gFizb2FFMsFcrNbiF3vHNNVpQhxkm Yk8CDPMekX0Cpyj9aua+dbkNTMMgzEKlzm/4QHuZXJJFEdv2yL3kn7Ac4kdfgCTucTgD cjk/+DsA9yXnYQjaKFAZPcX9y8cdHKXEpRS5pBeC9F3rlneBhE1yDk1zgWXTaT8BuJlr 0wrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788105776; x=1788710576; 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=HROlraX6vGLZgnawqAwSnbTcyoz5nQUPKuJqXPgTnHE=; b=JmYztzOIZ4MSKsE8qcjTX3VzGMmLGrME4rZDQsuRb4qw0iWOnsXvNgeILwo0iIPKje o82rW2szFCJojCqUY+Ypf/QZD9GeF9X/YV7gzLhz0N5n2UrbEJ37F8LNilxuFt5PsVU9 6Hm6NabIomxShpayJuN151tKIZWwlsYuBm+6XmlWF/DiV7Jz7V+MDw2ish84hwfTBZz0 RxhBwKFCLYcuvGAfnykDAB4JB9Gr0UdkjojJQp4UDLBjhEBs/H789FB7qvSV0HUhWM9V +0gc5E9JCbqsxUQrRl04DLM1mTFnBRa3QMsqst0qVRWCnGrk01opfj44YnPFHqRKoXNr Z14g== X-Forwarded-Encrypted: i=1; AHgh+RqcYkQDakxjbhZkujtng/VwaAUx3LtiXtXH1IfPJ3DufUEFoXYO+X9qaECpANg66eADdZbynhqKIR4jknA=@vger.kernel.org X-Gm-Message-State: AFuF++kAoDVP4DysSmFdtpXD6+0waYFlSj4hi/5sSojxHL7Q5wGe5NXd U4mM8H8/GZqvxwzt/JT6h/jEbp/isOMxe1NrAJ6eOvIXa57XxJO9Ryse X-Gm-Gg: AR+sD102erFZi/nLRZi2FaSke8l3bmt+JiaZNmn9xZFkYDzpHQdIfmU3IC9NXbe4BXa eS8PLBocjLVkuTQWLozcz3WMZbEgWMdqE82YG24DcIOpLLk1OJDJm2rt13/5CRSmEhNcuhehlQZ 4G1j+5VY6182I8JebAcqGF6YwlgjiYte7Zv9vb9ve873IGUwfszXUlqUZ3qDst5c0bCoypNzn3d aW8JSi7vXnh9Ux2OAd3x100KhHmjsSQ77J53s3IQ/aVycJlDntrWteWrE3XBbEWfAhUBOK/WvdX MMNxgGz6+lcS2N9TUsNTSo0bRECys7HkAaLbpAhQzWNi87N/kWnhKpGHTkXgCUtciSANoFXJx4N AYto2kPuVKtL+wc5YIG/fMVvCfyurErgnr1AP6sBX3NvG3KNzYuORAysGLIvfNc3OrcjMLDzrPU inTFLmuuhtMVhNW7nfRAJhDy115XEd7WJCUhDzMH5cYuakGHzv8A/2IfrMuUWUvERgsFcV00da4 YPehHOAFkHViralKBBr0kwLlJNh8jUg4GxQjmHjI/N3fXPu11m3 X-Received: by 2002:a05:6a21:3944:b0:3d3:ae40:ab0f with SMTP id adf61e73a8af0-3d3ae40b247mr22013318637.26.1788105775652; Sun, 30 Aug 2026 09:02:55 -0700 (PDT) Received: from nuvole (2.248.212.35.bc.googleusercontent.com. [35.212.248.2]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-cc1f3312270sm2839584a12.11.2026.08.30.09.02.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 30 Aug 2026 09:02:55 -0700 (PDT) From: Pengyu Luo To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Frank Li , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Sakari Ailus , Martin Kepplinger-Novakovic , Mauro Carvalho Chehab , Sebastian Krzyszkowiak Cc: devicetree@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, Pengyu Luo Subject: [PATCH v6 2/5] media: hi846: Fix link frequency handling Date: Mon, 31 Aug 2026 00:00:22 +0800 Message-ID: <20260830160025.211384-3-mitltlatltl@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260830160025.211384-1-mitltlatltl@gmail.com> References: <20260830160025.211384-1-mitltlatltl@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Link frequency is tied to PLL configuration, lane count, and external and configurable clock, so use runtime here instead of hardcoding for specific configuration. To implement this, we do 1. Drop fixed link freqs, we calculate the driver supported values and use v4l2_link_freq_to_bitmap() to get the intersection with the DT supported values. 2. Attach mipi_clk_div_{2,4}lane to current mode, and use the div with mclk clock, lane count to calculate link frequency. 3. Drop mclk clock rate check. Fixes: e8c0882685f9 ("media: i2c: add driver for the SK Hynix Hi-846 8M pix= el camera") Signed-off-by: Pengyu Luo --- v6: - Add link freq ctrl back (Sakari) - Use v4l2_link_freq_to_bitmap() to get matched link freqs (Sakari) - Move clk_get() before than hi846_parse_dt(), since we use clock in hi846_= parse_dt() v5: - Use separated fields instead of raw register values for PLL cfg (Sakari) - Use mul_u64_u32_div() to avoid loss of pricision and u64/u32 issues (Saka= ri) - Drop line break (Sakari) --- drivers/media/i2c/hi846.c | 151 ++++++++++++++++++++++++-------------- 1 file changed, 94 insertions(+), 57 deletions(-) diff --git a/drivers/media/i2c/hi846.c b/drivers/media/i2c/hi846.c index 7f069aca0fce..2f8624f9bdf3 100644 --- a/drivers/media/i2c/hi846.c +++ b/drivers/media/i2c/hi846.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 // Copyright (c) 2021 Purism SPC =20 -#include +#include #include #include #include @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -219,8 +220,8 @@ struct hi846_mode { /* Horizontal timing size */ u32 llp; =20 - /* Link frequency needed for this resolution */ - u8 link_freq_index; + u8 mipi_clk_div_2lane; + u8 mipi_clk_div_4lane; =20 u16 fps; =20 @@ -1040,13 +1041,6 @@ static const char * const hi846_test_pattern_menu[] = =3D { "Resolution Pattern", }; =20 -#define FREQ_INDEX_640 0 -#define FREQ_INDEX_1280 1 -static const s64 hi846_link_freqs[] =3D { - [FREQ_INDEX_640] =3D 80000000, - [FREQ_INDEX_1280] =3D 200000000, -}; - static const struct hi846_reg_list hi846_init_regs_list_2lane =3D { .num_of_regs =3D ARRAY_SIZE(hi846_init_2lane), .regs =3D hi846_init_2lane, @@ -1061,7 +1055,13 @@ static const struct hi846_mode supported_modes[] =3D= { { .width =3D 640, .height =3D 480, - .link_freq_index =3D FREQ_INDEX_640, + .mipi_clk_div_2lane =3D 4, + /* + * Dummy but necessary if we set this mode default, otherwise + * hi846_calc_pixel_rate() will be broken in + * hi846_init_controls() + */ + .mipi_clk_div_4lane =3D 8, .fps =3D 120, .frame_len =3D 631, .llp =3D HI846_LINE_LENGTH, @@ -1086,7 +1086,8 @@ static const struct hi846_mode supported_modes[] =3D { { .width =3D 1280, .height =3D 720, - .link_freq_index =3D FREQ_INDEX_1280, + .mipi_clk_div_2lane =3D 2, + .mipi_clk_div_4lane =3D 4, .fps =3D 90, .frame_len =3D 842, .llp =3D HI846_LINE_LENGTH, @@ -1112,7 +1113,8 @@ static const struct hi846_mode supported_modes[] =3D { { .width =3D 1632, .height =3D 1224, - .link_freq_index =3D FREQ_INDEX_1280, + .mipi_clk_div_2lane =3D 2, + .mipi_clk_div_4lane =3D 4, .fps =3D 30, .frame_len =3D 2526, .llp =3D HI846_LINE_LENGTH, @@ -1167,6 +1169,9 @@ struct hi846 { struct v4l2_ctrl *hblank; struct v4l2_ctrl *exposure; =20 + s64 link_freqs[ARRAY_SIZE(supported_modes)]; + int num_link_freqs; + struct mutex mutex; /* protect cur_mode, streaming and chip access */ const struct hi846_mode *cur_mode; bool streaming; @@ -1192,21 +1197,41 @@ static const struct hi846_datafmt *hi846_find_dataf= mt(u32 code) return NULL; } =20 -static inline u8 hi846_get_link_freq_index(struct hi846 *hi846) +static u64 +hi846_get_link_freq(const struct hi846 *hi846, const struct hi846_mode *mo= de) { - return hi846->cur_mode->link_freq_index; + u64 mclk =3D clk_get_rate(hi846->clock); + u8 mipi_clk_div; + + if (hi846->nr_lanes =3D=3D 2) + mipi_clk_div =3D mode->mipi_clk_div_2lane; + else + mipi_clk_div =3D mode->mipi_clk_div_4lane; + + /* + * HI846_REG_PLL_CFG_MIPI1_H =3D 0x025a, it is fixed in listed modes + * [11:8]: 0x02 =3D> pre_div =3D 3 + * [7:0]: 0x5a =3D> multiplier =3D 90 + */ + return mul_u64_u32_div(mclk, 90, 3 * mipi_clk_div); } =20 -static u64 hi846_get_link_freq(struct hi846 *hi846) +static int hi846_get_link_freq_index(const struct hi846 *hi846, + const struct hi846_mode *mode) { - u8 index =3D hi846_get_link_freq_index(hi846); + u64 link_freq =3D hi846_get_link_freq(hi846, mode); + int i; + + for (i =3D 0; i < hi846->num_link_freqs; i++) + if (hi846->link_freqs[i] =3D=3D link_freq) + return i; =20 - return hi846_link_freqs[index]; + return -EINVAL; } =20 static u64 hi846_calc_pixel_rate(struct hi846 *hi846) { - u64 link_freq =3D hi846_get_link_freq(hi846); + u64 link_freq =3D hi846_get_link_freq(hi846, hi846->cur_mode); u64 pixel_rate =3D link_freq * 2 * hi846->nr_lanes; =20 do_div(pixel_rate, HI846_RGB_DEPTH); @@ -1429,8 +1454,8 @@ static int hi846_init_controls(struct hi846 *hi846) hi846->link_freq =3D v4l2_ctrl_new_int_menu(ctrl_hdlr, &hi846_ctrl_ops, V4L2_CID_LINK_FREQ, - ARRAY_SIZE(hi846_link_freqs) - 1, - 0, hi846_link_freqs); + hi846->num_link_freqs - 1, + 0, hi846->link_freqs); if (hi846->link_freq) hi846->link_freq->flags |=3D V4L2_CTRL_FLAG_READ_ONLY; =20 @@ -1503,10 +1528,9 @@ static int hi846_set_video_mode(struct hi846 *hi846,= int fps) u64 frame_length; int ret =3D 0; int dummy_lines; - u64 link_freq =3D hi846_get_link_freq(hi846); + u64 link_freq =3D hi846_get_link_freq(hi846, hi846->cur_mode); =20 - dev_dbg(&client->dev, "%s: link freq: %llu\n", __func__, - hi846_get_link_freq(hi846)); + dev_dbg(&client->dev, "%s: link freq: %llu\n", __func__, link_freq); =20 do_div(link_freq, fps); frame_length =3D link_freq; @@ -1699,6 +1723,7 @@ static int hi846_set_format(struct v4l2_subdev *sd, const struct hi846_datafmt *fmt =3D hi846_find_datafmt(mf->code); u32 tgt_fps; s32 vblank_def, h_blank; + int idx; =20 if (!fmt) { mf->code =3D hi846_colour_fmts[0].code; @@ -1749,7 +1774,14 @@ static int hi846_set_format(struct v4l2_subdev *sd, mf->code =3D HI846_MEDIA_BUS_FORMAT; mf->field =3D V4L2_FIELD_NONE; =20 - __v4l2_ctrl_s_ctrl(hi846->link_freq, hi846_get_link_freq_index(hi846)); + idx =3D hi846_get_link_freq_index(hi846, hi846->cur_mode); + if (idx < 0) { + dev_err(&client->dev, + "failed to get link freq index: %d\n", idx); + return -EINVAL; + } + + __v4l2_ctrl_s_ctrl(hi846->link_freq, idx); __v4l2_ctrl_s_ctrl_int64(hi846->pixel_rate, hi846_calc_pixel_rate(hi846)); =20 @@ -1947,20 +1979,33 @@ static int hi846_identify_module(struct hi846 *hi84= 6) return 0; } =20 -static s64 hi846_check_link_freqs(struct hi846 *hi846, - struct v4l2_fwnode_endpoint *ep) +static int hi846_add_link_freqs(struct hi846 *hi846, struct device *dev, + struct v4l2_fwnode_endpoint *ep) { - const s64 *freqs =3D hi846_link_freqs; - int freqs_count =3D ARRAY_SIZE(hi846_link_freqs); - int i, j; - - for (i =3D 0; i < freqs_count; i++) { - for (j =3D 0; j < ep->nr_of_link_frequencies; j++) - if (freqs[i] =3D=3D ep->link_frequencies[j]) - break; - if (j =3D=3D ep->nr_of_link_frequencies) - return freqs[i]; - } + s64 hi846_link_freqs[ARRAY_SIZE(supported_modes)]; + unsigned long freq_bitmap; + int ret, i; + + /* + * Since the MCLK freq varies between platforms, calculating driver + * supported link freqs here. + */ + for (i =3D 0; i < ARRAY_SIZE(supported_modes); i++) + hi846_link_freqs[i] =3D hi846_get_link_freq(hi846, &supported_modes[i]); + + ret =3D v4l2_link_freq_to_bitmap(dev, ep->link_frequencies, + ep->nr_of_link_frequencies, + hi846_link_freqs, + ARRAY_SIZE(hi846_link_freqs), + &freq_bitmap); + if (ret || !freq_bitmap) + return ret; + + for (i =3D 0; i < ARRAY_SIZE(hi846_link_freqs); i++) + if (BIT(i) & freq_bitmap) { + hi846->link_freqs[hi846->num_link_freqs++] =3D hi846_link_freqs[i]; + dev_dbg(dev, "Add supported link frequency %lld\n", hi846_link_freqs[i]= ); + } =20 return 0; } @@ -1973,7 +2018,6 @@ static int hi846_parse_dt(struct hi846 *hi846, struct= device *dev) .bus_type =3D V4L2_MBUS_CSI2_DPHY }; int ret; - s64 fq; =20 ep =3D fwnode_graph_get_next_endpoint(fwnode, NULL); if (!ep) { @@ -2004,11 +2048,10 @@ static int hi846_parse_dt(struct hi846 *hi846, stru= ct device *dev) goto check_hwcfg_error; } =20 - /* Check that link frequences for all the modes are in device tree */ - fq =3D hi846_check_link_freqs(hi846, &bus_cfg); - if (fq) { - dev_err(dev, "Link frequency of %lld is not supported\n", fq); - ret =3D -EINVAL; + /* Add link frequencies which are supported by both DT and the driver */ + ret =3D hi846_add_link_freqs(hi846, dev, &bus_cfg); + if (ret) { + dev_err(dev, "failed to add link frequency %d\n", ret); goto check_hwcfg_error; } =20 @@ -2041,30 +2084,24 @@ static int hi846_probe(struct i2c_client *client) struct hi846 *hi846; int ret; int i; - u32 mclk_freq; =20 hi846 =3D devm_kzalloc(&client->dev, sizeof(*hi846), GFP_KERNEL); if (!hi846) return -ENOMEM; =20 - ret =3D hi846_parse_dt(hi846, &client->dev); - if (ret) { - dev_err(&client->dev, "failed to check HW configuration: %d", - ret); - return ret; - } - + /* Get the MCLK first, since we need it to calculate link freqs */ hi846->clock =3D devm_v4l2_sensor_clk_get(&client->dev, NULL); if (IS_ERR(hi846->clock)) return dev_err_probe(&client->dev, PTR_ERR(hi846->clock), "failed to get clock: %pe\n", hi846->clock); =20 - mclk_freq =3D clk_get_rate(hi846->clock); - if (mclk_freq !=3D 25000000) - dev_warn(&client->dev, - "External clock freq should be 25000000, not %u.\n", - mclk_freq); + ret =3D hi846_parse_dt(hi846, &client->dev); + if (ret) { + dev_err(&client->dev, "failed to check HW configuration: %d", + ret); + return ret; + } =20 for (i =3D 0; i < HI846_NUM_SUPPLIES; i++) hi846->supplies[i].supply =3D hi846_supply_names[i]; --=20 2.55.0 From nobody Sat Sep 26 20:27:54 2026 Received: from mail-pf1-f179.google.com (mail-pf1-f179.google.com [209.85.210.179]) (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 12A243B47C3 for ; Sun, 30 Aug 2026 16:03:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788105786; cv=none; b=eNFsaOJh0kjTRAJlwuSq8u8IgxKijIoPMVV6UchbWhk7lkuBJ0FpaTXkNteqaiuAeZC4uKOByIbDda9dBIhIuF2eKOGa2hpVpB0AP0lqiSB61bmY8d97feM5bYGbJuVRRunxCGczzapm8lGTeJtYzMtbcNiiZDazDmAY5cjVzpI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788105786; c=relaxed/simple; bh=xmKKzjCAtL6wSzbj7b1CUTRGlabduq+pCSy4GjqEQz4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Puu11J0jaosAJ3rtdSE79EAGIKNe/MWRTkxqYWDSNsHtBtZCNyfKuKCQPWTjagc2zJ03I6MEApIyHGLZhqqfwAgwttoXvQ4aLIbt/LJXhVislBBp47Q+o8jx6Z0WMU6bisD5MS+9bVsQfDrnvQCtHWrF5GY05zOAjMnUOZwt63s= 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=E6deg9t3; arc=none smtp.client-ip=209.85.210.179 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="E6deg9t3" Received: by mail-pf1-f179.google.com with SMTP id d2e1a72fcca58-855d2bfae95so2769642b3a.1 for ; Sun, 30 Aug 2026 09:03:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788105784; x=1788710584; 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=pG5hjYJsgEQzoTLm/xPUh1x5QPpaw7ZAGE9j4vcwlU8=; b=E6deg9t3nq0b8elhkqFUgQqsdAYKMjsi2ac4uSme5aaHySKFHaZHLxdKUNYUDINDks qQDOn93KYsDHVw0ePan/lAbVea1oiZI2FkQhRIJo9uRtp4AXR6QQqIGrB+wRpWPvzqF8 8uX+heUm0FwhdxYKe1mpxqvkv222qoim+6c370MXuT5u5TgRSX6ysrAQu9z9pBoSiyTU fjurU0W6X7L8WGmZuOQw9disMgH0fh6JUm32mqNh4FM4z2ZrXEyi9ROVnab6osVO0zfM OKnE7t2trGZW3kxgWE4oz9pOkS0YirrU69X8tgCknJlI20CfFJrEE4HMYjziGXQLNdN4 H83g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788105784; x=1788710584; 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=pG5hjYJsgEQzoTLm/xPUh1x5QPpaw7ZAGE9j4vcwlU8=; b=deyd82I5Eb8iCXO9mmwa7gk1foF8T1zmIO5ptJ9AUjpwR7vy99LcpkVNVUIkd7cwn3 pSZ61evW+gZxuolJnQ5ObMq7HeVSBpydesIn1krhCAkCJ6IzXvr4WzGJ1XXpLv612hFP exYPLwlrxvc9tH02CJ42Qux10IvnnHz2JRumgLOChe/FKxp0puT2juTnaLNJiyOI1kvE YdiF6MI2RzUrk+yh0kmpL3tGDDYpTq0cZO5Z+RK8/hVFPp7S2ODejHw2TIYo26X85MxE x2aFeqB19bn46pOYUJxoA9HR4rZLwrKqRsTdDUEunTw1vvcC1JH0pZk5xkbLQ6HLQ1Zn toMA== X-Forwarded-Encrypted: i=1; AHgh+Rox+k1M6nQLHThKn4IDrZPU8EmsR+xNUmp03718bZEEEespQSiQ1I188PO4B1tlj0pcyb2kfcwm/CMXfHA=@vger.kernel.org X-Gm-Message-State: AFuF++ke8uMQ/niCtas2Fm0zKfGvIEpFO28HZcaKjlQfxEhDTB10/ezD iWZfHc+f/bE68Phx5pmVir0xUl8EcQn6HnXdqQMoXzwXHYno782DTb0a X-Gm-Gg: AR+sD12Nb0u+CurTsDhaDzzK4xdCODRtmbJDGK8ApPAAISQKVogeCXbBc//9XMLXwpH RKoPlxX/KWd0xJlwbUGleZUDV0GiP4Y8cfF5FnwCfgud7mwCuloHk2TzF1r8bQL+RDOKSBDpP6s 3olmNqUj/w6yWnE3ahVFMSeh303MPvwGeagf7ge4N8i9YQIkvRyLGra+LSQIjGkMgkXu3Y0hqie AVvj/HJVSz2XbKE2yDXDcJDFFsy3EEyjpixuzGJcB1paG+nxAJByv0Jg3BXluMDBum2vztjKl0F qHN8B9VD78SzcJ01GZ0y1dEV6hFNeSXal3wxU7D1/ucWUOqJP2p0t7iIvAProDlezMKEuDiFeZr FcZSpjZz46U3BiBQUB0gy8lkRrRMLvNpXFIryA8oKBlBMqG7+WRTMorxQX8ugTH6b3yazIJ85tG mmu+mqQVxC8bUA/4G5JiOkK6ZQ8X6winvftaCXlYZD4IO+1iqi7l4FYiEeqBmfB2hR5JPoNmbN3 sYbXJ3TlG7O2lEp4EjiQn+3nPQdWy+KDFQG3aAAFOY+mWg93hmm X-Received: by 2002:a05:6a00:464e:b0:84a:2b96:5986 with SMTP id d2e1a72fcca58-85994f5cfb6mr2189880b3a.8.1788105784320; Sun, 30 Aug 2026 09:03:04 -0700 (PDT) Received: from nuvole (2.248.212.35.bc.googleusercontent.com. [35.212.248.2]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-cc1f3312270sm2839584a12.11.2026.08.30.09.02.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 30 Aug 2026 09:03:04 -0700 (PDT) From: Pengyu Luo To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Frank Li , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Sakari Ailus , Martin Kepplinger-Novakovic , Mauro Carvalho Chehab , Sebastian Krzyszkowiak Cc: devicetree@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, Pengyu Luo Subject: [PATCH v6 3/5] media: hi846: Fix modes handling for different lane cases Date: Mon, 31 Aug 2026 00:00:23 +0800 Message-ID: <20260830160025.211384-4-mitltlatltl@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260830160025.211384-1-mitltlatltl@gmail.com> References: <20260830160025.211384-1-mitltlatltl@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When using 4-lane, v4l2_find_nearest_size may return an unsupported mode, 640x480 mode, use v4l2_find_nearest_size_conditional() to filter out it. Reported-by: Sebastian Krzyszkowiak Closes: https://lore.kernel.org/linux-media/OmTXoHZJTSGePymL9I-1Cw@puri.sm Fixes: e8c0882685f9 ("media: i2c: add driver for the SK Hynix Hi-846 8M pix= el camera") Link: https://lore.kernel.org/linux-media/OmTXoHZJTSGePymL9I-1Cw@puri.sm Signed-off-by: Pengyu Luo --- v6: - Add link freq check in filter. v5: - Use v4l2_find_nearest_size_conditional() to filter for different lane cas= es. (Sakari) --- drivers/media/i2c/hi846.c | 63 ++++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/drivers/media/i2c/hi846.c b/drivers/media/i2c/hi846.c index 2f8624f9bdf3..648192521344 100644 --- a/drivers/media/i2c/hi846.c +++ b/drivers/media/i2c/hi846.c @@ -1713,6 +1713,21 @@ static int __maybe_unused hi846_resume(struct device= *dev) return hi846_power_on(hi846); } =20 +static bool filter_modes(const void *array, size_t index, const void *cont= ext) +{ + const struct hi846_mode *mode =3D array; + const struct hi846 *hi846 =3D context; + bool valid_link_freq; + int freq_idx; + + freq_idx =3D hi846_get_link_freq_index(hi846, mode); + valid_link_freq =3D freq_idx < 0 ? false : true; + + return ((hi846->nr_lanes =3D=3D 2 && mode->reg_list_2lane.num_of_regs) || + (hi846->nr_lanes =3D=3D 4 && mode->reg_list_4lane.num_of_regs)) && + valid_link_freq; +} + static int hi846_set_format(struct v4l2_subdev *sd, struct v4l2_subdev_state *sd_state, struct v4l2_subdev_format *format) @@ -1736,20 +1751,6 @@ static int hi846_set_format(struct v4l2_subdev *sd, return 0; } =20 - if (hi846->nr_lanes =3D=3D 2) { - if (!hi846->cur_mode->reg_list_2lane.num_of_regs) { - dev_err(&client->dev, - "this mode is not supported for 2 lanes\n"); - return -EINVAL; - } - } else { - if (!hi846->cur_mode->reg_list_4lane.num_of_regs) { - dev_err(&client->dev, - "this mode is not supported for 4 lanes\n"); - return -EINVAL; - } - } - mutex_lock(&hi846->mutex); =20 if (hi846->streaming) { @@ -1760,9 +1761,12 @@ static int hi846_set_format(struct v4l2_subdev *sd, hi846->fmt =3D fmt; =20 hi846->cur_mode =3D - v4l2_find_nearest_size(supported_modes, - ARRAY_SIZE(supported_modes), - width, height, mf->width, mf->height); + v4l2_find_nearest_size_conditional(supported_modes, + ARRAY_SIZE(supported_modes), + width, height, + mf->width, mf->height, + filter_modes, hi846); + dev_dbg(&client->dev, "%s: found mode: %dx%d\n", __func__, hi846->cur_mode->width, hi846->cur_mode->height); =20 @@ -1853,6 +1857,8 @@ static int hi846_enum_frame_size(struct v4l2_subdev *= sd, struct v4l2_subdev_frame_size_enum *fse) { struct i2c_client *client =3D v4l2_get_subdevdata(sd); + struct hi846 *hi846 =3D to_hi846(sd); + int i, count; =20 if (fse->pad || fse->index >=3D ARRAY_SIZE(supported_modes)) return -EINVAL; @@ -1862,15 +1868,24 @@ static int hi846_enum_frame_size(struct v4l2_subdev= *sd, return -EINVAL; } =20 - fse->min_width =3D supported_modes[fse->index].width; - fse->max_width =3D supported_modes[fse->index].width; - fse->min_height =3D supported_modes[fse->index].height; - fse->max_height =3D supported_modes[fse->index].height; + for (count =3D i =3D 0; i < ARRAY_SIZE(supported_modes); i++) { + if (!filter_modes(&supported_modes[i], i, hi846)) + continue; + + if (count =3D=3D fse->index) { + fse->min_width =3D supported_modes[i].width; + fse->max_width =3D fse->min_width; + fse->min_height =3D supported_modes[i].height; + fse->max_height =3D fse->min_height; + dev_dbg(&client->dev, "%s: max width: %d max height: %d\n", __func__, + fse->max_width, fse->max_height); + return 0; + } =20 - dev_dbg(&client->dev, "%s: max width: %d max height: %d\n", __func__, - fse->max_width, fse->max_height); + count++; + } =20 - return 0; + return -EINVAL; } =20 static int hi846_get_selection(struct v4l2_subdev *sd, --=20 2.55.0 From nobody Sat Sep 26 20:27:54 2026 Received: from mail-pg1-f175.google.com (mail-pg1-f175.google.com [209.85.215.175]) (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 D59FA3B47C3 for ; Sun, 30 Aug 2026 16:03:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788105795; cv=none; b=Pc7qsawHPxcKSX0OJdN4Pduix7uQSolt6ycP73szavj0Soj2DSyFUXkM1UlwiccyvTSFoKGFqI7lQwdw3DxzcTS+vdHu7CgY1J9D9Ifnkqbyq1mp63bvFyoMhOnURyybst4P63ICTE1eXCj9N3Y32LszOimPWdy/AxmwM8InpBk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788105795; c=relaxed/simple; bh=rEJ4KTmox+ccwWAw89Nn+ghoNGNMAhzu089oc+TQ3vs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mduHBRqgdytC7klcLOnEFMMPEUYwinMISsaCkThm7Sk52LvDqBTbG8nnHD05NqBgzYKuKfoW5OSRWDOyVzWUraBabN+d7SAoZ4XNTArwafaPKznan6XV7ipjsfJYYGrjSowDyyDF+i6WX341XTYL5NfWZ9p3PednnPQ60qECt6Q= 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=ON/YEe73; arc=none smtp.client-ip=209.85.215.175 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="ON/YEe73" Received: by mail-pg1-f175.google.com with SMTP id 41be03b00d2f7-ca80d708489so1787782a12.1 for ; Sun, 30 Aug 2026 09:03:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788105793; x=1788710593; 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=jvNTfLw6tGTRj6Jb6QoSk5fmPXA5ASCBLAMOlppetrE=; b=ON/YEe732A7av6dkBWGiNtD3ARIkRWgHbbc1l1PbtNr8UMg7Dw/HKFqVbjD3a/AJax ZWWCZ9NjsdWpwNa402hISMGTO3bDlkQHB4O82hwyPYFTH+1o3COCdsJo9mlLtRyhrplU FUXtCOHOdkm12Qd4pkUcNmWkFwTMLVhf4yXCKLK1/W87Gp/3N5/XsrzBxzzFJbiYsXpQ +xftHihQLQz/EBUt7HvBEZK4WQThTadPnqAbpkspQSIdCr1w6qij+KxTURJ0pWa8Hi/G LKmTRxq+kGuj5cCokngsYmh50dAwetrx8pn74CSO1BlyBQr66gk8Oz0h4BBxbEEHoNl3 qZ/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788105793; x=1788710593; 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=jvNTfLw6tGTRj6Jb6QoSk5fmPXA5ASCBLAMOlppetrE=; b=W6074GF9tdEuks09mTKyBr5lyu63J6WEmTqocskweYo9bamOlqHF+hHwmBqR4/y0O5 n439Y7ACJIfmxEdN4Huv5XjxEy3Ejo8tynYB0n+63xRTwPU1AeA84YyOLPv+PGkgVlJb P+ClVrrGCOxcTHTdyIk2ibLfV2CNr5FtDW2k9ssQUOmoDYtRnpjZvVh75AIXiQsitAJA bCn9bXwBnKedBePvzlIZ9j6dYgL2A9GOwwZlf/06jb0mwGBcCeuum9dwrUCLTpD62QHZ MPwJnVJiUqlqR6joY4cVY0lpKlOT8xHKIKd30KqkU0jJeqbeQJtFrpb/k8evtwkAr8JB QJFA== X-Forwarded-Encrypted: i=1; AHgh+RoscWxTRNzqU0xQKvP4IBELpXD2lhTiv8VISWkg1+zY715a90ykl760XIZLmF4zocPdwcTxGabT8SPMs5Y=@vger.kernel.org X-Gm-Message-State: AFuF++mpycrGr9ZgZPYLd6oecS3ACozM6HAyerK5VlumCXrsXjJ+G8s8 etc1nhFKhx3X7uQskU2j4V7qZKeYWQbgWQDLSx3uzzISE4s21cMcFOKYVcU7R3yS X-Gm-Gg: AR+sD10EpQuFer1/We9Llbess0s+E94cdshhLwfdnepMlBTHURrpyo+gq8oMShdnXFn 1QVzJfebZaGFUzgMgxsJm70hTgXlbbEm650IusU3ZYMPxjLiYSE/FIO/KoAG8oWXVyOiAnmBp82 S2lnIK2nlXY7E5rG+885AmrL9TneNodFNhABQ8+JzXz/rQU4NIeJheZaZsUsAmQW1mpoY79JrpF F2QqayaYnnvEC5+0Lb9QEByFvA5ujsfsI/Pt3DyWqzq1iKFp+S8eliGyyzkPJcATtFVPfjAUEtM Do4YR/3IBeuAb3ATr8ETxZ/dgqID2nv9nxrb6sH2P9XBeknFXWUFmxUtSGJyVf4PMvqNKm1oOfr Gygicye0jr036131/Epma6sosGbrVkooXzJ4faBmZjooCdXtpLw7/IguBwsDCS6/hCooB0QkLv0 FRUb2ynvqTNObGqhpQZ/9UVjvu6fIww4NAFXLDytl6PUngvmE3AhZyMuyI1AAMm9S82k/j1h+pF 59K7wbS1X+x/8Lzf4khEnB1Ix96/hIKItkm+bC9U/qgxWyrwl5c X-Received: by 2002:a05:6a20:7343:b0:3d3:aed2:6f21 with SMTP id adf61e73a8af0-3d5d988fde2mr2031204637.21.1788105793018; Sun, 30 Aug 2026 09:03:13 -0700 (PDT) Received: from nuvole (2.248.212.35.bc.googleusercontent.com. [35.212.248.2]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-cc1f3312270sm2839584a12.11.2026.08.30.09.03.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 30 Aug 2026 09:03:12 -0700 (PDT) From: Pengyu Luo To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Frank Li , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Sakari Ailus , Martin Kepplinger-Novakovic , Mauro Carvalho Chehab , Sebastian Krzyszkowiak Cc: devicetree@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, Pengyu Luo Subject: [PATCH v6 4/5] media: hi846: Add 6MP and 8MP modes support Date: Mon, 31 Aug 2026 00:00:24 +0800 Message-ID: <20260830160025.211384-5-mitltlatltl@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260830160025.211384-1-mitltlatltl@gmail.com> References: <20260830160025.211384-1-mitltlatltl@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Hi846 is an 8MP sensor, but the upstream driver has only supported 2MP mode for years. This patch adds 6MP and 8MP modes to maximize sensor utilization. Note that these modes require 4-lane MIPI CSI-2, as the downstream driver only exposes 2MP, 6MP, and 8MP configurations in 4-lane operation on the target device. The register sequences are extracted from the downstream Windows driver. Signed-off-by: Pengyu Luo --- v5: - Use separated fields instead of raw register values for PLL cfg (Sakari) --- drivers/media/i2c/hi846.c | 154 +++++++++++++++++++++++++++++++++++++- 1 file changed, 153 insertions(+), 1 deletion(-) diff --git a/drivers/media/i2c/hi846.c b/drivers/media/i2c/hi846.c index 648192521344..719598938638 100644 --- a/drivers/media/i2c/hi846.c +++ b/drivers/media/i2c/hi846.c @@ -1028,6 +1028,106 @@ static const struct hi846_reg mode_1632x1224_mipi_4= lane[] =3D { {HI846_REG_TG_ENABLE, 0x0100}, }; =20 +static const struct hi846_reg mode_3264x1836_config[] =3D { + {HI846_REG_MODE_SELECT, 0x0000}, + {HI846_REG_Y_ODD_INC_FOBP, 0x1111}, + {HI846_REG_Y_ODD_INC_VACT, 0x1111}, + {HI846_REG_Y_ADDR_START_VACT_H, 0x0172}, + {HI846_REG_Y_ADDR_END_VACT_H, 0x089d}, + {HI846_REG_UNKNOWN_005C, 0x2101}, + {HI846_REG_FLL, 0x09de}, + {HI846_REG_LLP, 0x0ed8}, + {HI846_REG_BINNING_MODE, 0x0022}, + {HI846_REG_HBIN_MODE, 0x0000}, + {HI846_REG_UNKNOWN_0A24, 0x0000}, + {HI846_REG_X_START_H, 0x0000}, + {HI846_REG_X_OUTPUT_SIZE_H, 0x0cc0}, + {HI846_REG_Y_OUTPUT_SIZE_H, 0x072c}, + {HI846_REG_EXPOSURE, 0x09d8}, + + /* For OTP */ + {HI846_REG_UNKNOWN_021C, 0x0001}, + {HI846_REG_UNKNOWN_021E, 0x0235}, + + {HI846_REG_ISP_EN_H, 0x014a}, + {HI846_REG_UNKNOWN_0418, 0x023e}, + {HI846_REG_UNKNOWN_0B02, 0xe04d}, + {HI846_REG_UNKNOWN_0B10, 0x6821}, + {HI846_REG_UNKNOWN_0B12, 0x0120}, + {HI846_REG_UNKNOWN_0B14, 0x0001}, + {HI846_REG_UNKNOWN_2008, 0x38fd}, + {HI846_REG_UNKNOWN_326E, 0x0000}, +}; + +static const struct hi846_reg mode_3264x1836_mipi_4lane[] =3D { + {HI846_REG_UNKNOWN_0900, 0x0300}, + {HI846_REG_MIPI_TX_OP_MODE, 0xc319}, + {HI846_REG_UNKNOWN_0914, 0xc109}, + {HI846_REG_TCLK_PREPARE, 0x061a}, + {HI846_REG_UNKNOWN_0918, 0x0407}, + {HI846_REG_THS_ZERO, 0x0a0b}, + {HI846_REG_TCLK_POST, 0x0e08}, + {HI846_REG_UNKNOWN_091E, 0x0a00}, + {HI846_REG_UNKNOWN_090C, 0x0427}, + {HI846_REG_UNKNOWN_090E, 0x0059}, + {HI846_REG_UNKNOWN_0954, 0x0089}, + {HI846_REG_UNKNOWN_0956, 0x0000}, + {HI846_REG_UNKNOWN_0958, 0xca80}, + {HI846_REG_UNKNOWN_095A, 0x9240}, + {HI846_REG_PLL_CFG_MIPI2_H, 0x4124}, + {HI846_REG_TG_ENABLE, 0x0100}, +}; + +static const struct hi846_reg mode_3264x2448_config[] =3D { + {HI846_REG_MODE_SELECT, 0x0000}, + {HI846_REG_Y_ODD_INC_FOBP, 0x1111}, + {HI846_REG_Y_ODD_INC_VACT, 0x1111}, + {HI846_REG_Y_ADDR_START_VACT_H, 0x0040}, + {HI846_REG_Y_ADDR_END_VACT_H, 0x09cf}, + {HI846_REG_UNKNOWN_005C, 0x2101}, + {HI846_REG_FLL, 0x09de}, + {HI846_REG_LLP, 0x0ed8}, + {HI846_REG_BINNING_MODE, 0x0022}, + {HI846_REG_HBIN_MODE, 0x0000}, + {HI846_REG_UNKNOWN_0A24, 0x0000}, + {HI846_REG_X_START_H, 0x0000}, + {HI846_REG_X_OUTPUT_SIZE_H, 0x0cc0}, + {HI846_REG_Y_OUTPUT_SIZE_H, 0x0990}, + {HI846_REG_EXPOSURE, 0x09d8}, + + /* For OTP */ + {HI846_REG_UNKNOWN_021C, 0x0001}, + {HI846_REG_UNKNOWN_021E, 0x0235}, + + {HI846_REG_ISP_EN_H, 0x014a}, + {HI846_REG_UNKNOWN_0418, 0x0000}, + {HI846_REG_UNKNOWN_0B02, 0xe04d}, + {HI846_REG_UNKNOWN_0B10, 0x6821}, + {HI846_REG_UNKNOWN_0B12, 0x0120}, + {HI846_REG_UNKNOWN_0B14, 0x0001}, + {HI846_REG_UNKNOWN_2008, 0x38fd}, + {HI846_REG_UNKNOWN_326E, 0x0000}, +}; + +static const struct hi846_reg mode_3264x2448_mipi_4lane[] =3D { + {HI846_REG_UNKNOWN_0900, 0x0300}, + {HI846_REG_MIPI_TX_OP_MODE, 0xc319}, + {HI846_REG_UNKNOWN_0914, 0xc109}, + {HI846_REG_TCLK_PREPARE, 0x061a}, + {HI846_REG_UNKNOWN_0918, 0x0407}, + {HI846_REG_THS_ZERO, 0x0a0b}, + {HI846_REG_TCLK_POST, 0x0e08}, + {HI846_REG_UNKNOWN_091E, 0x0a00}, + {HI846_REG_UNKNOWN_090C, 0x0427}, + {HI846_REG_UNKNOWN_090E, 0x0059}, + {HI846_REG_UNKNOWN_0954, 0x0089}, + {HI846_REG_UNKNOWN_0956, 0x0000}, + {HI846_REG_UNKNOWN_0958, 0xca80}, + {HI846_REG_UNKNOWN_095A, 0x9240}, + {HI846_REG_PLL_CFG_MIPI2_H, 0x4124}, + {HI846_REG_TG_ENABLE, 0x0100}, +}; + static const char * const hi846_test_pattern_menu[] =3D { "Disabled", "Solid Colour", @@ -1136,7 +1236,59 @@ static const struct hi846_mode supported_modes[] =3D= { .width =3D 1632 * 2, .height =3D 1224 * 2, }, - } + }, + { + .width =3D 3264, + .height =3D 1836, + .mipi_clk_div_2lane =3D 1, /* dummy */ + .mipi_clk_div_4lane =3D 2, + .fps =3D 30, + .frame_len =3D 2526, + .llp =3D HI846_LINE_LENGTH, + .reg_list_config =3D { + .num_of_regs =3D ARRAY_SIZE(mode_3264x1836_config), + .regs =3D mode_3264x1836_config, + }, + .reg_list_2lane =3D { + .num_of_regs =3D 0, + }, + .reg_list_4lane =3D { + .num_of_regs =3D ARRAY_SIZE(mode_3264x1836_mipi_4lane), + .regs =3D mode_3264x1836_mipi_4lane, + }, + .crop =3D { + .left =3D 0x46, + .top =3D 0x172, + .width =3D 3264, + .height =3D 1836, + }, + }, + { + .width =3D 3264, + .height =3D 2448, + .mipi_clk_div_2lane =3D 1, /* dummy */ + .mipi_clk_div_4lane =3D 2, + .fps =3D 30, + .frame_len =3D 2526, + .llp =3D HI846_LINE_LENGTH, + .reg_list_config =3D { + .num_of_regs =3D ARRAY_SIZE(mode_3264x2448_config), + .regs =3D mode_3264x2448_config, + }, + .reg_list_2lane =3D { + .num_of_regs =3D 0, + }, + .reg_list_4lane =3D { + .num_of_regs =3D ARRAY_SIZE(mode_3264x2448_mipi_4lane), + .regs =3D mode_3264x2448_mipi_4lane, + }, + .crop =3D { + .left =3D 0x46, + .top =3D 0x40, + .width =3D 3264, + .height =3D 2448, + }, + }, }; =20 struct hi846_datafmt { --=20 2.55.0 From nobody Sat Sep 26 20:27:54 2026 Received: from mail-pg1-f173.google.com (mail-pg1-f173.google.com [209.85.215.173]) (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 E3FF73BC687 for ; Sun, 30 Aug 2026 16:03:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788105804; cv=none; b=GCnWC3AFSWLDBOgC+wMCVGnwYBhcTetfo/8HQJt8q1kxByAazFVhMB7VxPgZL3IeUhZpYUKPy27DcswRw01Munqw2NDYzu/cdOB5WCRv8fgYyBatQH/d+jIknhEswNH90H3YGIwK3VQ8h5YJdN2EFn6XleOeAiDtT+blL8wRQec= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788105804; c=relaxed/simple; bh=oiC51w1NPaioikE1Hg9uEJxGeYzaTROkH+16a9WiVbw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SJ9PFuiaUz5KBeK/dCPjQs91RZWAJwv680X+dbhwu5w0YgfkJxV77W4vwZXp0I8jON2TDE5LYoxnLM4wHtR5/y7NzCW27qnrXlf7hUMpRjaZsWeq1gahg7Wd8lnM1wy6q1/EqYu7JGn6Wnw44cMKhtPyIsw+ehNHp2zOsoBzFvQ= 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=KQg3q7jG; arc=none smtp.client-ip=209.85.215.173 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="KQg3q7jG" Received: by mail-pg1-f173.google.com with SMTP id 41be03b00d2f7-cb5b8572b70so2732926a12.2 for ; Sun, 30 Aug 2026 09:03:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788105802; x=1788710602; 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=Y55JaARfg3EV2mur3cWs7k4GhU5c80X4HvQLCTJYTYs=; b=KQg3q7jGb6UFORf0io0LV15mwS62/21ABDqJ/PJu1NzsDvZ7Hnmqis+PtErW7saHqU HacYZyeD/zKaqTfRLrb0vWHfsYwUqCT8K0u4QDYI7pwEzYCf0mJ/eCUtJT34WCu0tSk8 I31Tz6Fo9JyNwuvXEpp+BLt1P/OFfVI3ejCn+8LcThlKlDrwjztSMVwVvwJT/o8IvPKO eLAijPZdd50ueC1d+lEfzlFoZ4t/vVa4ZntHctEnqMtNM7Mf+Q+Ahq/vXXNYhzIz2Y6S KJ2+V/zw1aZ5Wn0vPeSSQmxMToVgftG3aH6EwM/v2CwH14/++B3kBkdNaQpFIRK0fyRn cEsw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788105802; x=1788710602; 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=Y55JaARfg3EV2mur3cWs7k4GhU5c80X4HvQLCTJYTYs=; b=M6R827C+IUJAVb+UJmw4aBBOilK7yDuBoc3keIqC/pkvOG5c8FrVPWlKE2oAYJe3gU tMXck5ET5wL7utp/v+AVwSJgkJhc7kEkYQRwjPUVXEr3/SQZ8/nt5qegiOO8aIKE9A+4 FqKlpc53HAywVUzRFJDh/Lhhjhr3L2QYmebtg+bK7qO1dLibdrcXpYz8ExsCAmp/gjd3 WqgmRKAHVVHMMOnrhMZ9yws09XD2hxgk2ZOaPJ4PLM5rE5JL7hVRk9rFBeLtKVEBS1km v7znbBCwfbYJYN/izQt9Wz0INA+K3gvwYs+mXKs1UOwgdjY9ptYGznILrKDGToN4iP0e 9FRg== X-Forwarded-Encrypted: i=1; AHgh+RoOlN8phIOww4sYMS0tYhEtodRBWpjn51T5wWn4QwboywFGpnmn6xGxs8LJbw+MeOOUnRh1Xb/dFpTBcdo=@vger.kernel.org X-Gm-Message-State: AFuF++nuobH3eCeUmUdOELRl64SdfffHqb72z0XevMPLjCS7K9cvre0g yd/QZZ04wcNNjL+GPGuwdQJbg+SE9O2WPrGunqAj4Y4uN6ByikIGuUdI X-Gm-Gg: AR+sD12K/dxhzI0WtCT2UyKA1DSOyr2hj8GEl65YAkPulRimC3KCx3n4XYg4JcqTcfi bqqCMi73RcXrUn/G3Qzi/71vzbL5kYUaxXzn4vjXdhvZdtfEbSEBTb0tPyHEwWMWIp0xWmtlX8m 7Ttsfu4BQZShGARBEJqyAyWA+t6vkwUlnhxV7aZyJ/Wh251bTlHpGRKvG0naxTchyq8OzZuqIqM Mnskr0GWOCo9/xwCC6IlFjiNLKFZIlwJ2egvQGveBW/tzvKNrmJAmxYonUb5Hb3uvb3NLaMhIBS Qp+jO8sbD6ZlIAkZcO/8Pm9FPL8CPFU4VaCXpJJtUjYxYcPOvQ102hBIQaKlzaZgNf608VIlMzA tAWM53DF02R0Kdq4ciunTK3vxZ94BkSftM4zXYdg3WdGS36vMN8wkSro5phY0oiSNLk9WG7Nzg1 Gw8GbzoAhYZNXP2v4nv8jkIpOu50XIH40k6YobVh4DzWOty6M+ZXSZ322btyAgwHDe2tHRRaCui xUIz+c95cLDVqblHKfPlon4+BuXHojLHmcn2HAff5fsoQdwpe3a X-Received: by 2002:a05:6a20:a124:b0:3bf:5b7a:fc8b with SMTP id adf61e73a8af0-3d2633a1e56mr31289054637.0.1788105802212; Sun, 30 Aug 2026 09:03:22 -0700 (PDT) Received: from nuvole (2.248.212.35.bc.googleusercontent.com. [35.212.248.2]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-cc1f3312270sm2839584a12.11.2026.08.30.09.03.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 30 Aug 2026 09:03:21 -0700 (PDT) From: Pengyu Luo To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Frank Li , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Sakari Ailus , Martin Kepplinger-Novakovic , Mauro Carvalho Chehab , Sebastian Krzyszkowiak Cc: devicetree@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, Pengyu Luo Subject: [PATCH v6 5/5] arm64: dts: imx8mq-librem5: Correct link frequency list Date: Mon, 31 Aug 2026 00:00:25 +0800 Message-ID: <20260830160025.211384-6-mitltlatltl@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260830160025.211384-1-mitltlatltl@gmail.com> References: <20260830160025.211384-1-mitltlatltl@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" According to the hi846 datasheet and the register lists, they are mclk / prediv * multiplier / mipi_clk_div1 / mipi_clk_div2 =3D 25Mhz / 3 * 90 / 2 / {1,2} =3D 187.5Mhz, 375Mhz Signed-off-by: Pengyu Luo --- v5: - Rename post_div to mipi_clk_div - Correct div1 number from 1 to 2 --- arch/arm64/boot/dts/freescale/imx8mq-librem5.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/freescale/imx8mq-librem5.dtsi b/arch/arm64= /boot/dts/freescale/imx8mq-librem5.dtsi index f5d529c5baf3..cc5604172192 100644 --- a/arch/arm64/boot/dts/freescale/imx8mq-librem5.dtsi +++ b/arch/arm64/boot/dts/freescale/imx8mq-librem5.dtsi @@ -1122,7 +1122,7 @@ port { camera1_ep: endpoint { data-lanes =3D <1 2>; link-frequencies =3D /bits/ 64 - <80000000 200000000 300000000>; + <187500000 375000000>; remote-endpoint =3D <&mipi1_sensor_ep>; }; }; --=20 2.55.0