From nobody Sat Oct 3 03:53:43 2026 Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 18241483838 for ; Wed, 5 Aug 2026 16:11:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785946320; cv=none; b=BAPqhqX0TMiiUVcVkAoeBT4TK3WOIvmTtgOUqN0ucoWX3Tqa20DxLet8WrKkjF6K3n6zy203HJz/xSKGbbGd24fhrVbs56FfO4qQtuOACKwhwXALoX+t5+oLzkSUxDIgldjl+q9hs/mDTt3cUoEeWEMRybO/7XfAKIHJeYGmIEg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785946320; c=relaxed/simple; bh=k2tmsV927fEWq+0uoPJfB+l7KPP84PEO2Drh0XIEcB4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cZjAnQNT/UG1hh4BpX9c3O+vYTmBQKo8TJQJrCiy/ju/gLSydkBbHU0DXyV98knOo2xb2ixACdM1DpWHudZ/RTfb3NgWeZy4vXHtWi0lJqzdEOtQfVybC+P3odTqAXJx1FJ0FPDD7OnfcPBsNw6rCOq9hNsGrKz8e8XeZIl0bvI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=raspberrypi.com; spf=pass smtp.mailfrom=raspberrypi.com; dkim=pass (2048-bit key) header.d=raspberrypi.com header.i=@raspberrypi.com header.b=Ue0lP9ra; arc=none smtp.client-ip=209.85.128.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=raspberrypi.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=raspberrypi.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="Ue0lP9ra" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-496b7622a83so9748175e9.2 for ; Wed, 05 Aug 2026 09:11:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1785946314; x=1786551114; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=t/hiUWokFGsvqlinNWj7i/VJuE+r3v8Euned1qXrpkk=; b=Ue0lP9ra2y1VhGTL+LdBQN+l4YE/wzScxlxjROn8LpZWGs+6I5Us8KjK7s5jSiNb20 8DcexvupRoL9pDLLeHtnzN1RjiW6BMhxjyi17Dqdly4DxE1Rhey+Te910216HwQBg2Ox dkqJJFsmCo11gpXyaGvJ5KeS96EJ1M4goQvLpzO5SUZ1JGaAl1+uoNQK17ibxi9pfBXS gA/Wbs3zM971lQjws5fxCSFW1OXQF24kX2iSS+HkgkJUssumz8wdmCs0x5caw4vFUXe5 DAgJWrWuHR7RmWLjxr3F0D/QVZ5nmOFABIpPHXEDvVdEwJjZR28LfLjxKYyxe9QItYJl lUZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785946314; x=1786551114; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=t/hiUWokFGsvqlinNWj7i/VJuE+r3v8Euned1qXrpkk=; b=rrjqknYaIvidJWp3tS+D4hPZ0sZy6zCeFw/kA9EHILM5SnS5bexR1K2D62KfGlnfmx ptCAfZVl525l8XAQLiuuuJK9fioyiVCiGD+2zvFU7cEefOP++jkPsP5NpQAO//ul2N+T jZPhwA415kO7Lvxhk09RBb+XYJHgmtM4NuAdXZaJ/KHiqpfEBKxSquY2MJl9IhSW4oey hjF8YI3JOh2rc+UgxkCr64j5i69Le+X4Ve1pP9EMFMuCk9XJervd2s5CWg7bWEm1PDHE 2cjWZCP91LsdM/y1uAibF6yEs+9HQ9+vqc85vQF/5QIZcS2FkrIOUhigMcErKcRYTEK7 wY5Q== X-Forwarded-Encrypted: i=1; AHgh+RpdzNrtiR6292irZp/K68imVH/MpSwWiUelbJ+1ay4IuX0Kb3v2ofYOB9Ra3Pz4S4I5+wOxy/UrnMtnC1M=@vger.kernel.org X-Gm-Message-State: AOJu0YxDy8ynIw+WjYc8av/nq8mwdPFtsnbk5wUAvkrbuC9rmm4zg6kd pR+nwTYrXYRwydBDseN72QfXK6mci9tb5lmY104rqxMrLkcdU1u6dCBXfoIiI1ZWeEo= X-Gm-Gg: AR+sD11Wben/tWHOAedHkHcyz4w+DLqm4lS4uLmYUUNb5eMMwo2CVgiG+C8HKoCbOxB 2WDZfg3l3xheMWmM4P2je/DUqqNRYEbBzrqsFFHEcmmhiWn9FK2Juhk0QjdsE56qS87MtP5QgED 5foFcfAcqxfJNpd/VVzYUXi4fsL8GOz+VEcx3gIlrB1VtyFjfugZjUwCOdMsakpK5eCplgNHzY+ 2JOwUATVDR/BwlfUUcAzll5PuUiQB7FGcyA1qKYz3oTCRuEc1fq3sUXyR8bMRoFQAlEvz1fSaNJ LUrRxEu96efI3gTWYQNFEWta3flhuqX71rhLcDq4rk5q7QJJBl0r7BofyCjtFx0twmSKvQ72wGO 51Kzx7h/lWyvqhwZSla5HTM0bme4YaqN8MNgxE4Vh5yi5wi/WLwVupcOHYCUsIfLhnlHoj1EGAS gztJxXOrw0c0pXhRvBLiqRyIZ7CvPbWOq4Fbn4ykHf8+J4cg8GprOg3YGFioJGZ/HQGjfb6lOHN NKIzOle0Nq70TS3eZqKJLGTBkwMR0TCrChfUSJy X-Received: by 2002:a05:600c:840f:b0:493:bacb:1341 with SMTP id 5b1f17b1804b1-4994e72605emr94806895e9.4.1785946314017; Wed, 05 Aug 2026 09:11:54 -0700 (PDT) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-47febfda0cbsm9802575f8f.6.2026.08.05.09.11.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Aug 2026 09:11:53 -0700 (PDT) From: Dave Stevenson Date: Wed, 05 Aug 2026 17:09:16 +0100 Subject: [PATCH RFC 1/4] media: i2c: imx678: Always program the sensor in window mode Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260805-media-starvis2-v1-1-91e8e4eae44f@raspberrypi.com> References: <20260805-media-starvis2-v1-0-91e8e4eae44f@raspberrypi.com> In-Reply-To: <20260805-media-starvis2-v1-0-91e8e4eae44f@raspberrypi.com> To: Sakari Ailus , Jai Luthra , Mauro Carvalho Chehab Cc: Laurent Pinchart , Alexander Shiyan , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Dave Stevenson X-Mailer: b4 0.14.1 If the requested region matched the defined active area then the driver switched to all-pixel mode. This left the possibilty that the activeare was incorrect and not reading out the area expected. Switch to always requesting window mode. Signed-off-by: Dave Stevenson Reviewed-by: Jai Luthra --- drivers/media/i2c/imx678.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/media/i2c/imx678.c b/drivers/media/i2c/imx678.c index 0efbf43d2fe6..f7b988dca2ac 100644 --- a/drivers/media/i2c/imx678.c +++ b/drivers/media/i2c/imx678.c @@ -917,9 +917,7 @@ static int imx678_program_window(struct imx678 *imx678, int ret =3D 0; =20 cci_write(imx678->cci, IMX678_REG_ADDMODE, 0x00, &ret); - cci_write(imx678->cci, IMX678_REG_WINMODE, - v4l2_rect_equal(crop, &imx678_active_area) ? 0x00 : 0x04, - &ret); + cci_write(imx678->cci, IMX678_REG_WINMODE, 0x04, &ret); cci_write(imx678->cci, IMX678_REG_PIX_HST, crop->left - imx678_active_area.left, &ret); cci_write(imx678->cci, IMX678_REG_PIX_HWIDTH, crop->width, &ret); --=20 2.34.1 From nobody Sat Oct 3 03:53:43 2026 Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.45]) (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 BDF3A483831 for ; Wed, 5 Aug 2026 16:11:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785946324; cv=none; b=eGS0G7Fj0KEZ91+v3d/4AhNKMae2cpSn3Rvsopi1vUoRd6drQph26qxxNdE6XsA+uKLE7sLPuj/ZozrFdhInOLlqIOGPDdpuvUaJ/2r0O6+TfxGKaBRLwJhtX48sdUwjeSOca8YLEQQ0WQBj+Qw9W1DHaglIrwcuA12C7qFlfhI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785946324; c=relaxed/simple; bh=mG2bDcWTi4mlRLUm9EKQVSx+fZ0rDkJ2RZNnJggcNYc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=j1JwTqKhHos1cmzz+7UVALx+fCMisqdEb1qLVqtsUpc4BPUMf6CpnFwboWQ4r2pGE5HCB7NBrRec/AyZcwM8A1pDPfyK8kCJ5/uDDzK9pHhwD4wjmlpIMWKkt4KIFD0/+PPCWspaJFhwHRDBBFsVAvXAFv4fzknPj0uzgyiFMhM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=raspberrypi.com; spf=pass smtp.mailfrom=raspberrypi.com; dkim=pass (2048-bit key) header.d=raspberrypi.com header.i=@raspberrypi.com header.b=YAdQE7jR; arc=none smtp.client-ip=209.85.221.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=raspberrypi.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=raspberrypi.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="YAdQE7jR" Received: by mail-wr1-f45.google.com with SMTP id ffacd0b85a97d-47f92e3c14bso1037821f8f.0 for ; Wed, 05 Aug 2026 09:11:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1785946315; x=1786551115; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=kolcK42TrMzxGiVKCT6CZlZE37gCSGJD0amwvaAk9p8=; b=YAdQE7jRIUBFXJk4HjuKK6/OXKqnJPZC0DAOItLemGUN/+ZzGrkdmgq6IHYnJ6j1LK WLbnI9FQtk19sBzcJjSO9UuvMFV9YcVatE50DdkFFgRg/lLP2f84Biq0pClvAc0hZefB a3mJq1LQmkORP2n/pGBD/PJL/1JTdzag3ZWPPdf9JKgUhQbLgavb8cK/uCSC1S7rPk7/ 8/8GEtGGpu3QPQv1wFs9r0NvqSlhUouB7vOTM1DPwarnx7RgZoKX/T/hXkwBVa8RSUfZ aeT8isB2Ue3BhnzYCB4K7r14VNVs+eHKgeaLV9zwYOfYp+ICH3SP1gff6bio21PReiIh ACjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785946315; x=1786551115; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=kolcK42TrMzxGiVKCT6CZlZE37gCSGJD0amwvaAk9p8=; b=l3dbTRoKOq6yXG7hquBnruCuWNiS8wss/du7CuaMWkbeXpaXsB9zJBCCdfvIttRTr5 bvaT2EpMffrjycP9rfUcf+enzFbtlB2G0lutZc5LlqFVrHqjEIDUWuXek3gP0+PkyM+q eAj8mff+b67DjKgSlPZq0N0rpuTe/zmCaWa78PGgn001ctmIXB2kMxCh5A0wsu4qdm1J QbxU/Rk1h5znYbWYmSGp2fTXKgB2psMQaFSXIPagkpKcZNjJiCDmv44YWfFa/IIOR28d XqrHerr80xHEX5wFfxLz46PBqlPt0Os4wAXBkUoTmFgPAqPJiGQzxUI9Ca30qJ2OxFWf xurw== X-Forwarded-Encrypted: i=1; AHgh+Rr8GlHtOi1sFxblo4RmjN2QDP4rCvdeokzGdydgowNgMxmTWfJzt8L7gUHp/xfAkB7siCO7r6qXpwV/o28=@vger.kernel.org X-Gm-Message-State: AOJu0Yz6y0iWWAuk1BcbPfw/PyXyVBtpMRIpv0SJ/wWqWQzLoLKKYF06 BrZZ81BEwfl2IhTOtTaScJlGfdvpjZvv6CiVXO/rTVnOh3GBRbwsqfsV1CYqJyyzHao= X-Gm-Gg: AR+sD10voQCuJv9apyNdCAUaA990hNevT0ybpoYNDQy5jYBsSwe3KWI8c0Yh26yCHoQ 6C5wZnnFe8dTvJM3PSIWiieeGvT5Q3FJUGiliDz0/Uh90gZoM3HZGIfqq3TB78qpei3zWr8k2LN 2pkZe7w2Udv5sjs7ggrUKcVtgoglZWLb6KVSsy+8AdJmKz1A3zGjfb1Tci3hXBqPxYVyEbbmitg oo5ckHZtMFbjs9MRcMfr1x6wPrOqXTexPFM51lsmkx7ZxMcUqLhpwM/DrRE9eDSl49AqhJsdTNE LAr9BQYgxpytqqAXRtUBhqvzExAAyfqn0O4KgfMcRAd9JaYSUzYwikSMPAXR8ZQftkV9Ictsvx4 cuI33QKDCr5ga3cQMF3Xx0n3FluD/jSBtUfrRMX8RvKHrEFhuRuUyCNEU4yHiFqLC/o2EkBaeQ7 8BCu9NbitgsTepDylNqoDpFBboa4OB2zwfd6siHelrs0Gmr16sfPWCG2w8ZKBm73bp/0gbyh+ZC SY5aXTsWWcPw8oeZetAyvz1JlFBhsfK7u6Ggi0M X-Received: by 2002:a05:6000:2995:20b0:47f:c648:e265 with SMTP id ffacd0b85a97d-47fec51960cmr12093963f8f.17.1785946314940; Wed, 05 Aug 2026 09:11:54 -0700 (PDT) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-47febfda0cbsm9802575f8f.6.2026.08.05.09.11.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Aug 2026 09:11:54 -0700 (PDT) From: Dave Stevenson Date: Wed, 05 Aug 2026 17:09:17 +0100 Subject: [PATCH RFC 2/4] media: i2c: imx678: Parameterise the configuration to allow for other models Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260805-media-starvis2-v1-2-91e8e4eae44f@raspberrypi.com> References: <20260805-media-starvis2-v1-0-91e8e4eae44f@raspberrypi.com> In-Reply-To: <20260805-media-starvis2-v1-0-91e8e4eae44f@raspberrypi.com> To: Sakari Ailus , Jai Luthra , Mauro Carvalho Chehab Cc: Laurent Pinchart , Alexander Shiyan , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Dave Stevenson X-Mailer: b4 0.14.1 Several of the Sony Starvis 2 sensors are identical in the majority of their programming, but differ largely only in the size of pixel array and some timing parameters. Parameterise those parameters in preparation for supporting other variants. Signed-off-by: Dave Stevenson --- drivers/media/i2c/imx678.c | 161 +++++++++++++++++++++++++++++------------= ---- 1 file changed, 106 insertions(+), 55 deletions(-) diff --git a/drivers/media/i2c/imx678.c b/drivers/media/i2c/imx678.c index f7b988dca2ac..40ba6661b366 100644 --- a/drivers/media/i2c/imx678.c +++ b/drivers/media/i2c/imx678.c @@ -148,32 +148,11 @@ /* Subdev pads */ #define IMX678_SOURCE_PAD 0 =20 -/* IMX678 native and active pixel array size. */ -static const struct v4l2_rect imx678_native_area =3D { - .top =3D 0, - .left =3D 0, - .width =3D 3857, - .height =3D 2201, -}; - -static const struct v4l2_rect imx678_active_area =3D { - .top =3D 20, - .left =3D 0, - .width =3D 3856, - .height =3D 2180, -}; - enum imx678_type { IMX678_COLOR =3D 0, IMX678_MONOCHROME =3D 1, }; =20 -struct imx678_model_info { - enum imx678_type type; - const u32 *codes; - unsigned int num_codes; -}; - enum imx678_lanemode { IMX678_LANEMODE_2L =3D 1, IMX678_LANEMODE_4L =3D 3, @@ -213,7 +192,7 @@ static const u64 link_freqs[] =3D { [IMX678_LINK_FREQ_1188MHZ] =3D 1188000000, }; =20 -static const u16 min_hmax_4lane[] =3D { +static const u16 imx678_min_hmax_4lane[] =3D { [IMX678_LINK_FREQ_297MHZ] =3D 1584, [IMX678_LINK_FREQ_360MHZ] =3D 1320, [IMX678_LINK_FREQ_445MHZ] =3D 1100, @@ -273,7 +252,7 @@ static const int imx678_tpg_val[] =3D { }; =20 /* Common configuration */ -static const struct cci_reg_sequence common_regs[] =3D { +static const struct cci_reg_sequence imx678_common_regs[] =3D { { IMX678_REG_THIN_V_EN, 0x00 }, { IMX678_REG_VCMODE, 0x01 }, { CCI_REG8(0x306b), 0x00 }, @@ -656,16 +635,72 @@ static const u32 codes_monochrome[] =3D { MEDIA_BUS_FMT_Y12_1X12, }; =20 +struct imx678_variant { + const char *name; + u32 id_reg; + u32 id_value; + struct v4l2_rect native_area; + struct v4l2_rect active_area; + u64 pixel_rate; + unsigned int pix_per_clk; + const struct cci_reg_sequence *common_regs; + unsigned int num_common_regs; + unsigned int vmax_default; + const u16 *hmax_min; +}; + +const struct imx678_variant imx678_variant_def =3D { + .name =3D "imx678", + .id_reg =3D IMX678_REG_MODULE_ID, + .id_value =3D IMX678_ID, + .native_area =3D { + .top =3D 0, + .left =3D 0, + .width =3D 3857, + .height =3D 2201, + }, + .active_area =3D { + .top =3D 20, + .left =3D 0, + .width =3D 3856, + .height =3D 2180, + }, + .pixel_rate =3D IMX678_PIXEL_RATE, + .pix_per_clk =3D IMX678_PIX_PER_CLK, + .common_regs =3D imx678_common_regs, + .num_common_regs =3D ARRAY_SIZE(imx678_common_regs), + .vmax_default =3D IMX678_VMAX_DEFAULT, + .hmax_min =3D imx678_min_hmax_4lane, +}; + +struct imx678_model_info { + enum imx678_type type; + const u32 *codes; + unsigned int num_codes; + const struct imx678_variant *variant; + + const struct imx678_model_info *auto_detect_colour; + const struct imx678_model_info *auto_detect_mono; +}; + static const struct imx678_model_info imx678_aaqr_info =3D { .type =3D IMX678_COLOR, .codes =3D codes_bayer, .num_codes =3D ARRAY_SIZE(codes_bayer), + .variant =3D &imx678_variant_def, }; =20 static const struct imx678_model_info imx678_aamr_info =3D { .type =3D IMX678_MONOCHROME, .codes =3D codes_monochrome, .num_codes =3D ARRAY_SIZE(codes_monochrome), + .variant =3D &imx678_variant_def, +}; + +static const struct imx678_model_info imx678_autodetect_info =3D { + .variant =3D &imx678_variant_def, + .auto_detect_colour =3D &imx678_aaqr_info, + .auto_detect_mono =3D &imx678_aamr_info, }; =20 static const char * const imx678_supply_name[] =3D { @@ -680,6 +715,7 @@ struct imx678 { struct regmap *cci; =20 const struct imx678_model_info *info; + const struct imx678_variant *variant; =20 struct clk *xclk; u32 xclk_freq; @@ -774,7 +810,7 @@ static int imx678_set_ctrl(struct v4l2_ctrl *ctrl) cci_write(imx678->cci, IMX678_REG_GAIN, ctrl->val, &ret); break; case V4L2_CID_HBLANK: { - u32 hmax =3D (format->width + ctrl->val) / IMX678_PIX_PER_CLK; + u32 hmax =3D (format->width + ctrl->val) / imx678->variant->pix_per_clk; =20 cci_write(imx678->cci, IMX678_REG_HMAX, hmax, &ret); break; @@ -852,18 +888,20 @@ static int imx678_get_selection(struct v4l2_subdev *s= d, struct v4l2_subdev_state *sd_state, struct v4l2_subdev_selection *sel) { + struct imx678 *imx678 =3D to_imx678(sd); + switch (sel->target) { case V4L2_SEL_TGT_CROP: sel->r =3D *v4l2_subdev_state_get_crop(sd_state, sel->pad); return 0; =20 case V4L2_SEL_TGT_NATIVE_SIZE: - sel->r =3D imx678_native_area; + sel->r =3D imx678->variant->native_area; return 0; =20 case V4L2_SEL_TGT_CROP_DEFAULT: case V4L2_SEL_TGT_CROP_BOUNDS: - sel->r =3D imx678_active_area; + sel->r =3D imx678->variant->active_area; return 0; } =20 @@ -878,12 +916,12 @@ static int imx678_init_state(struct v4l2_subdev *sd, struct v4l2_rect *crop; =20 crop =3D v4l2_subdev_state_get_crop(state, IMX678_SOURCE_PAD); - *crop =3D imx678_active_area; + *crop =3D imx678->variant->active_area; =20 format =3D v4l2_subdev_state_get_format(state, IMX678_SOURCE_PAD); format->code =3D imx678_default_mbus_code(imx678); - format->width =3D imx678_active_area.width; - format->height =3D imx678_active_area.height; + format->width =3D imx678->variant->active_area.width; + format->height =3D imx678->variant->active_area.height; format->field =3D V4L2_FIELD_NONE; format->colorspace =3D V4L2_COLORSPACE_RAW; format->ycbcr_enc =3D V4L2_YCBCR_ENC_DEFAULT; @@ -897,8 +935,8 @@ static int imx678_write_common(struct imx678 *imx678) { int ret =3D 0; =20 - cci_multi_reg_write(imx678->cci, common_regs, ARRAY_SIZE(common_regs), - &ret); + cci_multi_reg_write(imx678->cci, imx678->variant->common_regs, + imx678->variant->num_common_regs, &ret); =20 cci_write(imx678->cci, IMX678_REG_INCK_SEL, imx678->inck_sel_val, &ret); cci_write(imx678->cci, IMX678_REG_DATARATE_SEL, @@ -919,10 +957,10 @@ static int imx678_program_window(struct imx678 *imx67= 8, cci_write(imx678->cci, IMX678_REG_ADDMODE, 0x00, &ret); cci_write(imx678->cci, IMX678_REG_WINMODE, 0x04, &ret); cci_write(imx678->cci, IMX678_REG_PIX_HST, - crop->left - imx678_active_area.left, &ret); + crop->left - imx678->variant->active_area.left, &ret); cci_write(imx678->cci, IMX678_REG_PIX_HWIDTH, crop->width, &ret); cci_write(imx678->cci, IMX678_REG_PIX_VST, - crop->top - imx678_active_area.top, &ret); + crop->top - imx678->variant->active_area.top, &ret); cci_write(imx678->cci, IMX678_REG_PIX_VWIDTH, crop->height, &ret); cci_write(imx678->cci, IMX678_REG_ADBIT, 0x01, &ret); =20 @@ -1027,11 +1065,13 @@ static int imx678_power_on(struct device *dev) =20 fsleep(20); /* T4 > 20us */ =20 - ret =3D imx678_write_common(imx678); - if (ret) { - dev_err(&client->dev, "%s failed to write registers\n", - __func__); - goto clk_off; + if (imx678->variant) { + ret =3D imx678_write_common(imx678); + if (ret) { + dev_err(&client->dev, "%s failed to write registers\n", + __func__); + goto clk_off; + } } =20 return 0; @@ -1065,11 +1105,16 @@ static int imx678_identify_model(struct imx678 *imx= 678) { struct i2c_client *client =3D v4l2_get_subdevdata(&imx678->sd); const struct imx678_model_info *info; + const struct imx678_variant *variant; enum imx678_type detected; int ret =3D 0; u64 val =3D 0; =20 info =3D device_get_match_data(&client->dev); + if (!info) + return -EINVAL; + + variant =3D info->variant; =20 /* * This sensor's ID registers become accessible 80ms after coming out @@ -1078,7 +1123,7 @@ static int imx678_identify_model(struct imx678 *imx67= 8) cci_write(imx678->cci, IMX678_REG_MODE_SELECT, 0, &ret); fsleep(IMX678_MODULE_ID_DELAY); =20 - cci_read(imx678->cci, IMX678_REG_MODULE_ID, &val, &ret); + cci_read(imx678->cci, variant->id_reg, &val, &ret); =20 if (ret) { dev_err(&client->dev, @@ -1086,9 +1131,9 @@ static int imx678_identify_model(struct imx678 *imx67= 8) return ret; } =20 - if (val !=3D IMX678_ID) { - dev_err(&client->dev, - "Chip ID mismatch: %x!=3D%llx\n", IMX678_ID, val); + if (val !=3D variant->id_value) { + dev_err(&client->dev, "Chip ID mismatch: %x!=3D%llx\n", + variant->id_value, val); return -ENXIO; } =20 @@ -1103,7 +1148,7 @@ static int imx678_identify_model(struct imx678 *imx67= 8) detected =3D val & IMX678_TYPE; =20 /* Prefer to use sensor type specified in device tree */ - if (info) { + if (info->codes) { imx678->info =3D info; if (detected !=3D info->type) dev_err(&client->dev, @@ -1112,12 +1157,14 @@ static int imx678_identify_model(struct imx678 *imx= 678) info->type =3D=3D IMX678_COLOR ? "color" : "mono"); } else { imx678->info =3D detected =3D=3D IMX678_MONOCHROME ? - &imx678_aamr_info : &imx678_aaqr_info; + info->auto_detect_mono : info->auto_detect_colour; dev_info(&client->dev, "sensor type missing in DT; detected %s sensor\n", detected =3D=3D IMX678_MONOCHROME ? "mono" : "color"); } =20 + imx678->variant =3D imx678->info->variant; + return 0; } =20 @@ -1147,7 +1194,7 @@ static const struct v4l2_subdev_internal_ops imx678_i= nternal_ops =3D { static int imx678_init_controls(struct imx678 *imx678) { struct v4l2_ctrl_handler *ctrl_hdlr; - const u32 hmax_4lane =3D min_hmax_4lane[__ffs(imx678->link_freq_bitmap)]; + const u32 hmax_4lane =3D imx678->variant->hmax_min[__ffs(imx678->link_fre= q_bitmap)]; const u32 lane_scale =3D imx678->lane_mode =3D=3D IMX678_LANEMODE_2L ? 2 = : 1; struct i2c_client *client =3D v4l2_get_subdevdata(&imx678->sd); struct v4l2_fwnode_device_properties props; @@ -1165,13 +1212,14 @@ static int imx678_init_controls(struct imx678 *imx6= 78) if (ret) return ret; =20 - imx678->vmax =3D IMX678_VMAX_DEFAULT; + imx678->vmax =3D imx678->variant->vmax_default; hmax =3D hmax_4lane * lane_scale; =20 /* PIXEL_RATE is fixed and read-only */ v4l2_ctrl_new_std(ctrl_hdlr, &imx678_ctrl_ops, V4L2_CID_PIXEL_RATE, - IMX678_PIXEL_RATE, IMX678_PIXEL_RATE, 1, - IMX678_PIXEL_RATE); + imx678->variant->pixel_rate, + imx678->variant->pixel_rate, 1, + imx678->variant->pixel_rate); =20 /* LINK_FREQ is also read only */ link_freq =3D v4l2_ctrl_new_int_menu(ctrl_hdlr, &imx678_ctrl_ops, @@ -1183,15 +1231,16 @@ static int imx678_init_controls(struct imx678 *imx6= 78) if (link_freq) link_freq->flags |=3D V4L2_CTRL_FLAG_READ_ONLY; =20 - vblank =3D imx678->vmax - imx678_active_area.height; - max_vblank =3D IMX678_VMAX_MAX - imx678_active_area.height; + vblank =3D imx678->vmax - imx678->variant->active_area.height; + max_vblank =3D IMX678_VMAX_MAX - imx678->variant->active_area.height; imx678->vblank =3D v4l2_ctrl_new_std(ctrl_hdlr, &imx678_ctrl_ops, V4L2_CID_VBLANK, vblank, max_vblank, 2, vblank); =20 - hblank =3D hmax * IMX678_PIX_PER_CLK - imx678_active_area.width; - max_hblank =3D IMX678_HMAX_MAX * IMX678_PIX_PER_CLK - - imx678_active_area.width; + hblank =3D hmax * imx678->variant->pix_per_clk - + imx678->variant->active_area.width; + max_hblank =3D IMX678_HMAX_MAX * imx678->variant->pix_per_clk - + imx678->variant->active_area.width; imx678->hblank =3D v4l2_ctrl_new_std(ctrl_hdlr, &imx678_ctrl_ops, V4L2_CID_HBLANK, hblank, max_hblank, IMX678_PIX_PER_CLK, hblank); @@ -1335,11 +1384,13 @@ static int imx678_probe(struct i2c_client *client) ret =3D imx678_power_on(dev); if (ret) return ret; - ret =3D imx678_identify_model(imx678); if (ret) goto error_power_off; =20 + v4l2_i2c_subdev_set_name(&imx678->sd, client, + imx678->variant->name, NULL); + pm_runtime_set_active(dev); pm_runtime_enable(dev); =20 @@ -1420,7 +1471,7 @@ static const struct of_device_id imx678_of_match[] = =3D { { .compatible =3D "sony,imx678-aamr", .data =3D &imx678_aamr_info }, { .compatible =3D "sony,imx678-aaqr", .data =3D &imx678_aaqr_info }, /* for non-conforming DTs that rely on runtime check */ - { .compatible =3D "sony,imx678" }, + { .compatible =3D "sony,imx678", .data =3D &imx678_autodetect_info }, { /* sentinel */ } }; =20 --=20 2.34.1 From nobody Sat Oct 3 03:53:43 2026 Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C2BA2483BEE for ; Wed, 5 Aug 2026 16:11:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785946324; cv=none; b=QC2BocrsCIFA27OLnCBqr4SSK0W0ZDXMTioxBgyf97OPMyCuXa19A8gdDmvisd8yZhuVCZ98gPxLVH8da3GINQk94j3eiuGVEgA/BYFWaPf15otoMuxMQMXSSV94r2+GoRze7kntJU5OBeRvbyEDsiYfWVSWY5vPEQG45ZLhJiw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785946324; c=relaxed/simple; bh=kq6UPYxJnKt1KsMEi+elORd7jcNTRJU7IYK+5lILbYE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JJBRENDYsHi/XGOArNIVA/7jAg9MmYKtLx0YATs6JIOIiVCmXJ7Ns/gdD1mHzTY2rABO/XacQ9DAa5oJ5BMkX2zlqbgZLaDFtgmgtPFnJpbvbUmbwUoS0FR0xuXOgVPoNvF65OdDsP7H/7ZvSNKDIDir4Csp87eAGOb38aKIR7Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=raspberrypi.com; spf=pass smtp.mailfrom=raspberrypi.com; dkim=pass (2048-bit key) header.d=raspberrypi.com header.i=@raspberrypi.com header.b=n9/2uV+M; arc=none smtp.client-ip=209.85.221.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=raspberrypi.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=raspberrypi.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="n9/2uV+M" Received: by mail-wr1-f46.google.com with SMTP id ffacd0b85a97d-47f96c5b722so702107f8f.0 for ; Wed, 05 Aug 2026 09:11:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1785946316; x=1786551116; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=ems9IaHYt2ebi/BADr6sqNPXhUyM5/Ruyeb7hHdsh7w=; b=n9/2uV+MjdA7dlfl7JD2mEhmH/Mmxd5rzHkOsyL5DrbFoNj1I4el9rgYioq6YDfLaG h6IEdHRTiA7hMlQmnXZvdntYImO3furmnijBmd1mFahX10iyuaJgxPqRfEnw+zkrnjgS Yt0WM17Qom2dHI5F7jO2vOj7dxc58JN4giN1nkTQcKn4bLJgjphrVcr+4MHOC3oo6+Mn yuAqi6My2dnFZ/Tn4OImkzivrAiqpVzfu9ANyh/i9wKm3ibrIAs97GiR05EbzIj9rTyV mx1L/0bWab+nInWSUmgXnTZq4JktG+xwKL5t0PrtwBbDdsv8dxAmABV2VvJNmjZySVv7 dSCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785946316; x=1786551116; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=ems9IaHYt2ebi/BADr6sqNPXhUyM5/Ruyeb7hHdsh7w=; b=eir2jNGiF9UPgwEd3clz/LI2Xna3hFvWNzeC5wZIAg3C4dskxdi5DdnwAsbFfxZXY1 3HK0qMDw+LgzC9heZ6Wa7ggWx3HNLSCC1+bXUHHoDYSsFpDm4KEkC7dYrWMyEtXNd+Nm I+fOqSW+kD3pO4q6d07dCz+VyehiKVexTmbPlT0kjxYaSMnYt0q+SsFZH3o1KG18pczy Av2NVjv+T77kP9l9qCXRSz44OycAeA8hgcG+oHOq+2xbBg7vfCQP/Zz893sFFuPiyVTO juyJKLSbvkd1ixlNYNUp+Rr3EK3Gl6K/ugwGaDc9RMDmqAeVMCgPhzIfGQc4YZ6VhjQO ncrQ== X-Forwarded-Encrypted: i=1; AHgh+RqD/aindBHE7YSYb6TWt+SycMJZ8dW+i/RDfXB08XrC1c37aQhKHz2rox8+hAPsW62H5/ab641pc6tKNZs=@vger.kernel.org X-Gm-Message-State: AOJu0YwQmujq372OxmyQvSqRoRgD5Fney31JDGlmfpLd9sh49JyoSEoq dMRB/1tqh7HMqU/jZtEEVeclWYmV0oWdXE3prbt5KI/6Stqhz3U+C8sbpZyCMGhThnI= X-Gm-Gg: AR+sD10VlXeBX78NpyNX4yukcxw5XPRuRGs2dkvhIaSJHwTiV71bXtZn+19yvOcmR7R EXwkQVK5j9Nj6767F7nY59Eia80Y4AwbY9R+DyqTL0HFfZYGdNhWIfA4riOQFsbKEU1jHVXGHgN f4RPRSx+5QDhFyIApUjiYi1oOcwk+8MFEy8mBXubjT1zBnBqQTOpfHo2qx5LNFXPf/5eu5VdGI+ TwcwDcVlUL9H95QD9dXYsGphQUi9aiWRtVNQLXs27B+MY1c6agjTP+SHjdzcKQ87Ayw6C4EPNcs wTGZ0U6z3vKqUy11znZxY2RVLLrQdtZOqi+aZeq6fhWX+b5wS48Ymm26sRXaK/gzbu+6cDvBnCE 3O426bLxqcJ7XkH68+/C3jZgO00a9CKHhZqo8MOqX4qkPLYGUDW+Du+ed+MsUmzi+sVCTGovDgo KWyaqeC+l9WWBoCWaArOPhDuTdNxHdCZLtijiB3N1uXVzx8d6Y394Pz6/hM7WOTj0nOE+xCGWmf UBl1EHWmLD1p2ETWAka1UIRu8ejidBEO0y2b6zd X-Received: by 2002:adf:f311:0:b0:46e:7f72:b6fe with SMTP id ffacd0b85a97d-47fec523d07mr10569022f8f.19.1785946315912; Wed, 05 Aug 2026 09:11:55 -0700 (PDT) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-47febfda0cbsm9802575f8f.6.2026.08.05.09.11.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Aug 2026 09:11:55 -0700 (PDT) From: Dave Stevenson Date: Wed, 05 Aug 2026 17:09:18 +0100 Subject: [PATCH RFC 3/4] media: i2c: imx678: Add imx662 support to the driver Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260805-media-starvis2-v1-3-91e8e4eae44f@raspberrypi.com> References: <20260805-media-starvis2-v1-0-91e8e4eae44f@raspberrypi.com> In-Reply-To: <20260805-media-starvis2-v1-0-91e8e4eae44f@raspberrypi.com> To: Sakari Ailus , Jai Luthra , Mauro Carvalho Chehab Cc: Laurent Pinchart , Alexander Shiyan , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Dave Stevenson X-Mailer: b4 0.14.1 IMX662 is a 1080p Starvis 2 sensor that follows the same programming pattern as IMX678, so add it to the newly parameterised driver. FIXME: Update the common registers based on the Sony spreadsheet. Signed-off-by: Dave Stevenson --- drivers/media/i2c/imx678.c | 64 ++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 64 insertions(+) diff --git a/drivers/media/i2c/imx678.c b/drivers/media/i2c/imx678.c index 40ba6661b366..9083f2744510 100644 --- a/drivers/media/i2c/imx678.c +++ b/drivers/media/i2c/imx678.c @@ -673,6 +673,47 @@ const struct imx678_variant imx678_variant_def =3D { .hmax_min =3D imx678_min_hmax_4lane, }; =20 +static const struct cci_reg_sequence imx662_common_regs[] =3D { + { IMX678_REG_WDMODE, 0x00 }, + { IMX678_REG_MDBIT, 0x01 }, + { IMX678_REG_XXS_DRV, 0x00 }, +}; + +static const u16 imx662_min_hmax_4lane[] =3D { + [IMX678_LINK_FREQ_297MHZ] =3D 990, + [IMX678_LINK_FREQ_360MHZ] =3D 990, + [IMX678_LINK_FREQ_445MHZ] =3D 990, + [IMX678_LINK_FREQ_594MHZ] =3D 990, + [IMX678_LINK_FREQ_720MHZ] =3D 990, + [IMX678_LINK_FREQ_891MHZ] =3D 990, + [IMX678_LINK_FREQ_1039MHZ] =3D 990, + [IMX678_LINK_FREQ_1188MHZ] =3D 990, +}; + +const struct imx678_variant imx662_variant_def =3D { + .name =3D "imx662", + .id_reg =3D IMX678_REG_MODULE_ID, + .id_value =3D 0x296, + .native_area =3D { + .top =3D 0, + .left =3D 0, + .width =3D 1937, + .height =3D 1101, + }, + .active_area =3D { + .top =3D 0, + .left =3D 0, + .width =3D 1936, + .height =3D 1096, + }, + .pixel_rate =3D 222750000, + .pix_per_clk =3D 3, + .common_regs =3D imx662_common_regs, + .num_common_regs =3D ARRAY_SIZE(imx662_common_regs), + .vmax_default =3D 1096 + 40, + .hmax_min =3D imx662_min_hmax_4lane, +}; + struct imx678_model_info { enum imx678_type type; const u32 *codes; @@ -703,6 +744,26 @@ static const struct imx678_model_info imx678_autodetec= t_info =3D { .auto_detect_mono =3D &imx678_aamr_info, }; =20 +static const struct imx678_model_info imx662_aaqr_info =3D { + .type =3D IMX678_COLOR, + .codes =3D codes_bayer, + .num_codes =3D ARRAY_SIZE(codes_bayer), + .variant =3D &imx662_variant_def, +}; + +static const struct imx678_model_info imx662_aamr_info =3D { + .type =3D IMX678_MONOCHROME, + .codes =3D codes_monochrome, + .num_codes =3D ARRAY_SIZE(codes_monochrome), + .variant =3D &imx662_variant_def, +}; + +static const struct imx678_model_info imx662_autodetect_info =3D { + .variant =3D &imx662_variant_def, + .auto_detect_colour =3D &imx662_aaqr_info, + .auto_detect_mono =3D &imx662_aamr_info, +}; + static const char * const imx678_supply_name[] =3D { "avdd", /* Analog (3.3V) supply */ "dvdd", /* Digital Core (1.1V) supply */ @@ -1470,8 +1531,11 @@ static const struct dev_pm_ops imx678_pm_ops =3D { static const struct of_device_id imx678_of_match[] =3D { { .compatible =3D "sony,imx678-aamr", .data =3D &imx678_aamr_info }, { .compatible =3D "sony,imx678-aaqr", .data =3D &imx678_aaqr_info }, + { .compatible =3D "sony,imx662-aamr", .data =3D &imx662_aamr_info }, + { .compatible =3D "sony,imx662-aaqr", .data =3D &imx662_aaqr_info }, /* for non-conforming DTs that rely on runtime check */ { .compatible =3D "sony,imx678", .data =3D &imx678_autodetect_info }, + { .compatible =3D "sony,imx662", .data =3D &imx662_autodetect_info }, { /* sentinel */ } }; =20 --=20 2.34.1 From nobody Sat Oct 3 03:53:43 2026 Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.45]) (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 2002A48424D for ; Wed, 5 Aug 2026 16:12:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785946327; cv=none; b=NedI0LmcDhkoyIRYAeSe4soesUT3WV0mWra0pHov2L6RAFr8nzgIUC72IFcy35/YA4o0xjKbeqkwL2iIlsotCObquSJ5XjNXQbEA/OSw9NfXVo47tkS/RQlry9cjC/JNw6w77Pst9GgBicVTYLNh9hCI/QYtiAAtJIXUXumyBws= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785946327; c=relaxed/simple; bh=FgMNnupzl/wbCFMVKT6oUWB6/AyBhoDN7bICQL5q434=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BWY/gzQHzMrZpy3K0gkX05QUTDwkdRucPiyjzlmNrFV7bMaWVCQhNCT6XTrqbms3A/b3rChIpgpEnS/BUBB3q84xfMguMGl8M2vRFswheNE0/+E6BfD4MXigJcoUQ/GBM06Ii3tHBE3GrgIbpO5QCHNvEXp6hMpNKwETWpXO57U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=raspberrypi.com; spf=pass smtp.mailfrom=raspberrypi.com; dkim=pass (2048-bit key) header.d=raspberrypi.com header.i=@raspberrypi.com header.b=omcd2gOB; arc=none smtp.client-ip=209.85.221.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=raspberrypi.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=raspberrypi.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="omcd2gOB" Received: by mail-wr1-f45.google.com with SMTP id ffacd0b85a97d-471eeac43bfso1047660f8f.3 for ; Wed, 05 Aug 2026 09:12:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1785946317; x=1786551117; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=aD0tLJm4COdWx094gUFOmAoaj1UQAD3Pfy2ZGgr+UzY=; b=omcd2gOBEDHEnbX6batW+6KyIgAloWualiw7SfSkQn/WWz2p6xjl3ItgkVMq67J0FF 9objWsydcUiCLS3Y6opaj7lsVPLgwhb7zj5Sots+XN4Ik88/cHMjCSy6GHoHr90lH0Hv GVsXpeIIhUlTTG82tCNOB13GKMH4AXXTO1QhHRyyIBdo18MyZp9ukUV6cB/8lmy/wjbN ZCg5tAWwZQqwanqQ97T4W+r6VX6q+z/PDcdGPxedcvMiiTNNpKhsK0JAM+wPkyh2YjGX dRALeKVJurUpZ+u1mKZeW1DrKY2CCadwhgO0uKp3xB58lLmnPgIrN4RRXcvk6MJ2cvh3 80oA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785946317; x=1786551117; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=aD0tLJm4COdWx094gUFOmAoaj1UQAD3Pfy2ZGgr+UzY=; b=h/Z7PF89pdBBMjfcfFS1hs/a6DY8XGBSnzTWrO7K1CPQsbmElqN59VL/TldA6rlth+ 6tjR0W6cL8MJasxjgqfHXX5BfcCDOEiK6W++mf61/FvZWesyxg9OdtB5XisJRtGGzs7J 3/FS5PHyU48XUM2BynRYo8xiUxYXQxHQ7Ll+Vg47ej5p68UDWxS5t5zIEJbXzb78H3Qe 3kXDkqKsTxpg5JVMfB3iJaxq8yjXqMrRs26zScfGEoqhaMbl1aiTCcE9t01AcofZ6aRH p6vKYJmFrB/d8OjTOh0q8HQYqMRrOudzgFEZ07xedMZPaSn/i9aVL+TKX+wuj8PzmvAf i8/w== X-Forwarded-Encrypted: i=1; AHgh+RoWF3y+vlWRR9IjTHWEd44pUNvzsK3IgYG2UqEsNs+vUeNzZI1QBT6JFXoGMGYoiroahcFFy2F4Q253XKQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yz7FxVkfOIkyOzVTM54+ZCbsBQp2nidhvqbyqwXtpYFcghUCouN Ph2kvgXcle997COkKxz4iAi+0A+ele9cCrkI0gEP3GWsZP8bdrKr3auqGE3Vp7LsRD9sr62juR5 D1ee+ X-Gm-Gg: AR+sD12pK0O/bdyRsRJLbZ8bgeCkbT4AWlkKGERgoeWheAqkZvrGoAnPHJpFMdz1Yww Rdnc0DdYq/KPpANlqi1nv4lfhxziNkMe9ZaV4VTtUdhI57YgzFBo71Ue+8ZPa5CdrD+jHGTLblk H3f762igSChbjn7B+QL8dOSyZUUvgLxck3Ca5scRQOsZv6tBCgj/GBKOrRQsPHr3XTZ54kb6VJG ELDcs+EILmLSlX9YtxbZmaBRGu2cXfsdqHrhRjhXThwVg7NSp5LyzXXryKAURNuBNKgzLxwi5uh YnVo+/46KVhvTGKZ/tRROThtjVyBtYVTG0LE/O7z915ILp1rmRsBbbaMoEWXFIqn/0lYrow3EdX W+Ne+OLfUU9+4KQnicP8nxCwT/1UhzbAI8wosw1H3pG3h+rIKKftkxPVLX/Is7mMxjJCrImMPtr SZU5GL9E4OAI+KU2NWQ1gm/B+sPm2iGT3QDnFfi3tWY21U5M2P5Q9rtSj8rF3tP6EZOH9LGqq+9 EaHNClHd98UYXncDJcibQ2zhjMV7iqTN3RXcDUz X-Received: by 2002:a05:6000:4b02:b0:47f:70f1:a577 with SMTP id ffacd0b85a97d-47fec62d892mr14400581f8f.17.1785946316964; Wed, 05 Aug 2026 09:11:56 -0700 (PDT) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-47febfda0cbsm9802575f8f.6.2026.08.05.09.11.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Aug 2026 09:11:56 -0700 (PDT) From: Dave Stevenson Date: Wed, 05 Aug 2026 17:09:19 +0100 Subject: [PATCH RFC 4/4] media: i2c: imx678: Add imx675 support to the driver Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260805-media-starvis2-v1-4-91e8e4eae44f@raspberrypi.com> References: <20260805-media-starvis2-v1-0-91e8e4eae44f@raspberrypi.com> In-Reply-To: <20260805-media-starvis2-v1-0-91e8e4eae44f@raspberrypi.com> To: Sakari Ailus , Jai Luthra , Mauro Carvalho Chehab Cc: Laurent Pinchart , Alexander Shiyan , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Dave Stevenson X-Mailer: b4 0.14.1 The IMX675 is a 5MPix Starvis2 sensor that follows the same programming pattern as IMX678 and IMX662, so add it into the driver. FIXME: Validate common_regs against Sony documentation. Signed-off-by: Dave Stevenson --- drivers/media/i2c/imx678.c | 222 +++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 222 insertions(+) diff --git a/drivers/media/i2c/imx678.c b/drivers/media/i2c/imx678.c index 9083f2744510..4b82823c260e 100644 --- a/drivers/media/i2c/imx678.c +++ b/drivers/media/i2c/imx678.c @@ -714,6 +714,205 @@ const struct imx678_variant imx662_variant_def =3D { .hmax_min =3D imx662_min_hmax_4lane, }; =20 +static const struct cci_reg_sequence imx675_common_regs[] =3D { + { CCI_REG8(0x301B), 0x00 }, + { CCI_REG8(0x301C), 0x00 }, + { CCI_REG8(0x301E), 0x01 }, + + { CCI_REG8(0x3060), 0x95 }, + { CCI_REG8(0x3061), 0x00 }, + { CCI_REG8(0x3062), 0x00 }, + { CCI_REG8(0x3064), 0x56 }, + { CCI_REG8(0x3065), 0x00 }, + { CCI_REG8(0x3066), 0x00 }, + + { CCI_REG8(0x3072), 0x00 }, + { CCI_REG8(0x3073), 0x00 }, + { CCI_REG8(0x3074), 0x00 }, + { CCI_REG8(0x3075), 0x00 }, + { CCI_REG8(0x3081), 0x00 }, + { CCI_REG8(0x30A4), 0xAA }, + { CCI_REG8(0x30A6), 0x0F }, + { CCI_REG8(0x30CC), 0x00 }, + { CCI_REG8(0x30CD), 0x00 }, + { CCI_REG8(0x30CE), 0x02 }, + { CCI_REG8(0x3400), 0x01 }, + + { CCI_REG8(0x3400), 0x01 }, + { CCI_REG8(0x3460), 0x22 }, + { CCI_REG8(0x3492), 0x08 }, + { CCI_REG8(0x3B1D), 0x17 }, + { CCI_REG8(0x3B44), 0x3F }, + { CCI_REG8(0x3B60), 0x03 }, + { CCI_REG8(0x3C03), 0x04 }, + { CCI_REG8(0x3C04), 0x04 }, + { CCI_REG8(0x3C0A), 0x00 }, + { CCI_REG8(0x3C0B), 0x00 }, + { CCI_REG8(0x3C0C), 0x00 }, + { CCI_REG8(0x3C0D), 0x00 }, + { CCI_REG8(0x3C0E), 0x00 }, + { CCI_REG8(0x3C0F), 0x00 }, + { CCI_REG8(0x3C30), 0x73 }, + { CCI_REG8(0x3C3C), 0x20 }, + { CCI_REG8(0x3C7C), 0xB9 }, + { CCI_REG8(0x3C7D), 0x01 }, + { CCI_REG8(0x3C7E), 0xB7 }, + { CCI_REG8(0x3C7F), 0x01 }, + { CCI_REG8(0x3CB0), 0x00 }, + { CCI_REG8(0x3CB2), 0xFF }, + { CCI_REG8(0x3CB3), 0x03 }, + { CCI_REG8(0x3CB4), 0xFF }, + { CCI_REG8(0x3CB5), 0x03 }, + { CCI_REG8(0x3CBA), 0xFF }, + { CCI_REG8(0x3CBB), 0x03 }, + { CCI_REG8(0x3CC0), 0xFF }, + { CCI_REG8(0x3CC1), 0x03 }, + { CCI_REG8(0x3CC2), 0x00 }, + { CCI_REG8(0x3CC6), 0xFF }, + { CCI_REG8(0x3CC7), 0x03 }, + { CCI_REG8(0x3CC8), 0xFF }, + { CCI_REG8(0x3CC9), 0x03 }, + { CCI_REG8(0x3E00), 0x1E }, + { CCI_REG8(0x3E02), 0x04 }, + { CCI_REG8(0x3E03), 0x00 }, + { CCI_REG8(0x3E20), 0x04 }, + { CCI_REG8(0x3E21), 0x00 }, + { CCI_REG8(0x3E22), 0x1E }, + { CCI_REG8(0x3E24), 0xBA }, + { CCI_REG8(0x3E72), 0x85 }, + { CCI_REG8(0x3E76), 0x0C }, + + { CCI_REG8(0x3E77), 0x01 }, + { CCI_REG8(0x3E7A), 0x85 }, + { CCI_REG8(0x3E7E), 0x1F }, + { CCI_REG8(0x3E82), 0xA6 }, + { CCI_REG8(0x3E86), 0x2D }, + { CCI_REG8(0x3EE2), 0x33 }, + { CCI_REG8(0x3EE3), 0x03 }, + { CCI_REG8(0x4490), 0x07 }, + { CCI_REG8(0x4494), 0x19 }, + { CCI_REG8(0x4495), 0x00 }, + { CCI_REG8(0x4496), 0xBB }, + { CCI_REG8(0x4497), 0x00 }, + { CCI_REG8(0x4498), 0x55 }, + { CCI_REG8(0x449A), 0x50 }, + { CCI_REG8(0x449C), 0x50 }, + { CCI_REG8(0x449E), 0x50 }, + { CCI_REG8(0x44A0), 0x3C }, + { CCI_REG8(0x44A2), 0x19 }, + { CCI_REG8(0x44A4), 0x19 }, + { CCI_REG8(0x44A6), 0x19 }, + { CCI_REG8(0x44A8), 0x4B }, + { CCI_REG8(0x44AA), 0x4B }, + { CCI_REG8(0x44AC), 0x4B }, + { CCI_REG8(0x44AE), 0x4B }, + { CCI_REG8(0x44B0), 0x3C }, + { CCI_REG8(0x44B2), 0x19 }, + { CCI_REG8(0x44B4), 0x19 }, + { CCI_REG8(0x44B6), 0x19 }, + { CCI_REG8(0x44B8), 0x4B }, + { CCI_REG8(0x44BA), 0x4B }, + { CCI_REG8(0x44BC), 0x4B }, + { CCI_REG8(0x44BE), 0x4B }, + { CCI_REG8(0x44C0), 0x3C }, + { CCI_REG8(0x44C2), 0x19 }, + { CCI_REG8(0x44C4), 0x19 }, + { CCI_REG8(0x44C6), 0x19 }, + { CCI_REG8(0x44C8), 0xF0 }, + { CCI_REG8(0x44CA), 0xEB }, + { CCI_REG8(0x44CC), 0xEB }, + { CCI_REG8(0x44CE), 0xE6 }, + { CCI_REG8(0x44D0), 0xE6 }, + { CCI_REG8(0x44D2), 0xBB }, + + { CCI_REG8(0x44D4), 0xBB }, + { CCI_REG8(0x44D6), 0xBB }, + { CCI_REG8(0x44D8), 0xE6 }, + { CCI_REG8(0x44DA), 0xE6 }, + { CCI_REG8(0x44DC), 0xE6 }, + { CCI_REG8(0x44DE), 0xE6 }, + { CCI_REG8(0x44E0), 0xE6 }, + { CCI_REG8(0x44E2), 0xBB }, + { CCI_REG8(0x44E4), 0xBB }, + { CCI_REG8(0x44E6), 0xBB }, + { CCI_REG8(0x44E8), 0xE6 }, + { CCI_REG8(0x44EA), 0xE6 }, + { CCI_REG8(0x44EC), 0xE6 }, + { CCI_REG8(0x44EE), 0xE6 }, + { CCI_REG8(0x44F0), 0xE6 }, + { CCI_REG8(0x44F2), 0xBB }, + { CCI_REG8(0x44F4), 0xBB }, + { CCI_REG8(0x44F6), 0xBB }, + { CCI_REG8(0x4538), 0x15 }, + { CCI_REG8(0x4539), 0x15 }, + { CCI_REG8(0x453A), 0x15 }, + { CCI_REG8(0x4544), 0x15 }, + { CCI_REG8(0x4545), 0x15 }, + { CCI_REG8(0x4546), 0x15 }, + { CCI_REG8(0x4550), 0x11 }, + { CCI_REG8(0x4551), 0x11 }, + { CCI_REG8(0x4552), 0x11 }, + { CCI_REG8(0x4553), 0x11 }, + { CCI_REG8(0x4554), 0x11 }, + { CCI_REG8(0x4555), 0x11 }, + { CCI_REG8(0x4556), 0x11 }, + { CCI_REG8(0x4557), 0x11 }, + { CCI_REG8(0x4558), 0x11 }, + { CCI_REG8(0x455C), 0x11 }, + { CCI_REG8(0x455D), 0x11 }, + { CCI_REG8(0x455E), 0x11 }, + { CCI_REG8(0x455F), 0x11 }, + { CCI_REG8(0x4560), 0x11 }, + { CCI_REG8(0x4561), 0x11 }, + { CCI_REG8(0x4562), 0x11 }, + { CCI_REG8(0x4563), 0x11 }, + { CCI_REG8(0x4564), 0x11 }, + + { CCI_REG8(0x4569), 0x01 }, + { CCI_REG8(0x456A), 0x01 }, + { CCI_REG8(0x456B), 0x06 }, + { CCI_REG8(0x456C), 0x06 }, + { CCI_REG8(0x456D), 0x06 }, + { CCI_REG8(0x456E), 0x06 }, + { CCI_REG8(0x456F), 0x06 }, + { CCI_REG8(0x4570), 0x06 }, +}; + +static const u16 imx675_min_hmax_4lane[] =3D { + [IMX678_LINK_FREQ_297MHZ] =3D 1125, + [IMX678_LINK_FREQ_360MHZ] =3D 1125, + [IMX678_LINK_FREQ_445MHZ] =3D 1125, + [IMX678_LINK_FREQ_594MHZ] =3D 1125 / 2, + [IMX678_LINK_FREQ_720MHZ] =3D 1125 / 2, + [IMX678_LINK_FREQ_891MHZ] =3D 1125 / 2, + [IMX678_LINK_FREQ_1039MHZ] =3D 1125 / 2, + [IMX678_LINK_FREQ_1188MHZ] =3D 1125 / 2, +}; + +const struct imx678_variant imx675_variant_def =3D { + .name =3D "imx675", + .id_reg =3D IMX678_REG_MODULE_ID, + .id_value =3D 0x296, + .native_area =3D { + .top =3D 0, + .left =3D 0, + .width =3D 2609, + .height =3D 1984, + }, + .active_area =3D { + .top =3D 0, + .left =3D 0, + .width =3D 2608, + .height =3D 1984, + }, + .pixel_rate =3D 594000000, + .pix_per_clk =3D 8, + .common_regs =3D imx675_common_regs, + .num_common_regs =3D ARRAY_SIZE(imx675_common_regs), + .vmax_default =3D 1984 + 40, + .hmax_min =3D imx675_min_hmax_4lane, +}; + struct imx678_model_info { enum imx678_type type; const u32 *codes; @@ -764,6 +963,26 @@ static const struct imx678_model_info imx662_autodetec= t_info =3D { .auto_detect_mono =3D &imx662_aamr_info, }; =20 +static const struct imx678_model_info imx675_aaqr_info =3D { + .type =3D IMX678_COLOR, + .codes =3D codes_bayer, + .num_codes =3D ARRAY_SIZE(codes_bayer), + .variant =3D &imx675_variant_def, +}; + +static const struct imx678_model_info imx675_aamr_info =3D { + .type =3D IMX678_MONOCHROME, + .codes =3D codes_monochrome, + .num_codes =3D ARRAY_SIZE(codes_monochrome), + .variant =3D &imx675_variant_def, +}; + +static const struct imx678_model_info imx675_autodetect_info =3D { + .variant =3D &imx675_variant_def, + .auto_detect_colour =3D &imx675_aaqr_info, + .auto_detect_mono =3D &imx675_aamr_info, +}; + static const char * const imx678_supply_name[] =3D { "avdd", /* Analog (3.3V) supply */ "dvdd", /* Digital Core (1.1V) supply */ @@ -1533,9 +1752,12 @@ static const struct of_device_id imx678_of_match[] = =3D { { .compatible =3D "sony,imx678-aaqr", .data =3D &imx678_aaqr_info }, { .compatible =3D "sony,imx662-aamr", .data =3D &imx662_aamr_info }, { .compatible =3D "sony,imx662-aaqr", .data =3D &imx662_aaqr_info }, + { .compatible =3D "sony,imx675-aamr", .data =3D &imx675_aamr_info }, + { .compatible =3D "sony,imx675-aaqr", .data =3D &imx675_aaqr_info }, /* for non-conforming DTs that rely on runtime check */ { .compatible =3D "sony,imx678", .data =3D &imx678_autodetect_info }, { .compatible =3D "sony,imx662", .data =3D &imx662_autodetect_info }, + { .compatible =3D "sony,imx675", .data =3D &imx675_autodetect_info }, { /* sentinel */ } }; =20 --=20 2.34.1