From nobody Fri Oct 23 22:12:51 2026 Received: from mail-wr1-f52.google.com (mail-wr1-f52.google.com [209.85.221.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D23904FB9D4 for ; Thu, 15 Oct 2026 15:57:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079877; cv=none; b=nMJe6plUgv+7NYQJXfxmnKb4peV/RY886yCLXQOL5Bttluh0HkC5tHsQM7BA0BVlMap8bSIzz2zdmyiPJQ7ukS8zG/Lx2vV9Oicck4LeuerayHIiHiq9R/q+CShpfWY6wAJkFZBgTxu2Of/8Uwxufiq/ziaxde1AvG6t6QpCkBw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079877; c=relaxed/simple; bh=q5/nFl33gIb+9G5q0LLySt9WYEgi6UVRbmHdychN4jI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=iqLUmkZSy4bmv77xOzFCGP5jctdk4YY0B9/6thhIaLaEjqrtdq61rOTfcuV5ms90nwV9Fovb1dRUAGbMsrjDHQL4zwpHl0COtA397Yk0tLw6OJz4xfwPIpaigsUqP2fQ9n/+y6EPFMeMKCu6lgjTz810caFD3awr/fvJMv9cdzA= 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=heWGkKCx; arc=none smtp.client-ip=209.85.221.52 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="heWGkKCx" Received: by mail-wr1-f52.google.com with SMTP id ffacd0b85a97d-48dd33a7bd4so1531300f8f.3 for ; Thu, 15 Oct 2026 08:57:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1792079858; x=1792684658; 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=Ofz43bU5BaD/krhSBxiucOpWcoFRBOUIEn5p3otWsSA=; b=heWGkKCxGNyKIEOXgp/rkUc9wMekKGPBde+kydJZxRfBYPRVAoHod1T57enV18DOKY 493Or9FEZDVAP2pMA93amMdfUy6cIdI/r1xGG97Y9vcGqE0MUVGhdMBNM2U5goKM2TRd f/0qqLF6Ey37Cdpf/uxPxGaHVoldl3S4iRcTcDUbE+HksV7HXhp26JkhExhqxEv9HRUH MQFS9lsarEE4J4zhf8guxcS/IpUIiZ2+ydHFSEPayCTTgV0uEO9AwPFOiQP9TgukleeG 0aOkZHQVhzr4XtA/0ZLLif7rGfL9nvuKtJTZrIJJ59kxJov6jrLlva9etFWYT+kfvIH9 YJlA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792079858; x=1792684658; 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=Ofz43bU5BaD/krhSBxiucOpWcoFRBOUIEn5p3otWsSA=; b=2KWT/oHcYtZr57k1XrH2jjaTOx9hWavdkCRBlz2yHzMwGc/GBmjYvfv3aJVa8tShEX y0z7nriW8liHIxv1V+szAjEnvQMR+dax9Rq9aU3yALNx9S/sCQXn+5bYyRTFMUk+mJVq bFXzrxsij/RK03trr6B/6X27Ge7Sxk7KhgHuZV5pWDmn5yCxsbslyNMfVcF+STnO9daZ 6LzVfPHlNhC8FB7y8Sh/m38uaBwFX7L3YIo0pyIXdDCEVlbAmkdP1m1EXxobw64R85pP nh19Xw37W3V8aJDxIerSD/TAlMVqpeOyX1BisONYnq/cPmHImqv/ZYUVGFNdxzCGPOpT aq6A== X-Forwarded-Encrypted: i=1; AKwUvByX4PzjnHMcqZO0CpaJdozNgs4/9/LSxGlTBhJEyb19NUxfypN/NJ0v/10f7GmNgEvaujeXdy0C6OYAUyU=@vger.kernel.org X-Gm-Message-State: AFq9FYIhBQ/bO1L+Q+vj3gfwQ4pWZnLrH8Ttv1/6+E1bOrtzxE/LqPTX nb8ZljmeRwSvF5Dk9vwQ/Lbt9kFTqJdfnNpef/AE8I5eKZMUQSAzBTL0YhqUG880mlA= X-Gm-Gg: AYBFou0NrYq+BuNwqIfuO3VcPIGGV19/WLb8PZtL4OdJx26WI6NuqzGJfkKQM6QOstO H+ReMquqi3webx4I3uUrV708256fb0nCscma+xYmqPSGKF+n0wF0fvxr9jO6suZrgAV9rlUDsUW hFhqrLr3bkh1QBiW/WOn6W0cMFMchPavxzJRdXupXP5quBZ7TmYgXwZm94e7u/0/08tTIY695A5 hlbPqFnmBzxWHrE1rdTeo7UnMIWkhCIqFlkV54B31AxBh5C4gHRmuZ28vdDWOIcialvVP51N/NS AC/JlbNhk6SBsqx6UdOGTEYJUFeI1/XlsH5j/EfvpUVcQUzW7w6CxGNgKN+50ISfwBEr+kI1GPu o/rZmg03IDX+WFPd5gP85V83ziY0Mo839gm40+ZN5Q0w72pea/I3Fde2q0ivmzwhZahT7GbBxpE tk1Pv2QnQYsUDJtelRUozm3v8Nyhwp5nuOWFWICG040Uytb4p+NrQ41lTqYRrBdDRznJyqfWi5I tUxWqzEZT7R8jdxe7nfQNbGyZpa2dsmkuZxBUnEEr3/ZMirAw== X-Received: by 2002:a5d:6547:0:b0:48a:fd58:a7df with SMTP id ffacd0b85a97d-48dbace0061mr30325538f8f.47.1792079856724; Thu, 15 Oct 2026 08:57:36 -0700 (PDT) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-48de0aaaaebsm19877251f8f.14.2026.10.15.08.57.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Oct 2026 08:57:36 -0700 (PDT) From: Dave Stevenson Date: Thu, 15 Oct 2026 16:57:27 +0100 Subject: [PATCH v4 01/16] media: imx678: Rework into generic Starvis 2 sensor 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: <20261015-media-starvis2-v4-1-75fcdb4163f3@raspberrypi.com> References: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> In-Reply-To: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> To: Sakari Ailus , Jai Luthra , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Laurent Pinchart , Alexander Shiyan , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Dave Stevenson X-Mailer: b4 0.14.1 The register layout and programming model for multiple of the Sony Starvis2 sensors is identical, so prepare for supporting those by renaming all common parts of the driver to a starvis2_ prefix, and renaming the driver. Signed-off-by: Dave Stevenson --- MAINTAINERS | 14 +- drivers/media/i2c/Kconfig | 19 +- drivers/media/i2c/Makefile | 2 +- drivers/media/i2c/{imx678.c =3D> sony-starvis2.c} | 773 ++++++++++++------= ------ 4 files changed, 422 insertions(+), 386 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index 760791e3635f..bba095bc1a63 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -25640,13 +25640,6 @@ S: Maintained F: Documentation/devicetree/bindings/media/i2c/sony,imx576.yaml F: drivers/media/i2c/imx576.c =20 -SONY IMX678 SENSOR DRIVER -M: Jai Luthra -L: linux-media@vger.kernel.org -S: Maintained -F: Documentation/devicetree/bindings/media/i2c/sony,imx678.yaml -F: drivers/media/i2c/imx678.c - SONY MEMORYSTICK SUBSYSTEM M: Maxim Levitsky M: Alex Dubov @@ -25657,6 +25650,13 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/g= it/ulfh/mmc.git F: drivers/memstick/ F: include/linux/memstick.h =20 +SONY STARVIS 2 SENSOR DRIVER +M: Jai Luthra +L: linux-media@vger.kernel.org +S: Maintained +F: Documentation/devicetree/bindings/media/i2c/sony,imx678.yaml +F: drivers/media/i2c/sony-starvis2.c + SONY VAIO CONTROL DEVICE DRIVER M: Mattia Dongili L: platform-driver-x86@vger.kernel.org diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig index 7de2d095c969..8c43ae77b47e 100644 --- a/drivers/media/i2c/Kconfig +++ b/drivers/media/i2c/Kconfig @@ -324,13 +324,11 @@ config VIDEO_IMX576 config VIDEO_IMX678 tristate "Sony IMX678 sensor support" depends on GPIOLIB - select V4L2_CCI_I2C + select VIDEO_SONY_STARVIS2 help This is a Video4Linux2 sensor driver for the Sony - IMX678 camera. - - To compile this driver as a module, choose M here: the - module will be called imx678. + IMX678 camera. This sensor is now supported by the common + Sony Starvis 2 sensor driver. =20 config VIDEO_MAX9271_LIB tristate @@ -879,6 +877,17 @@ config VIDEO_S5KJN5 To compile this driver as a module, choose M here: the module will be called s5kjn5. =20 +config VIDEO_SONY_STARVIS2 + tristate "Sony Starvis 2 sensor support" + depends on GPIOLIB + select V4L2_CCI_I2C + help + This is a Video4Linux2 sensor driver for the Sony Starvis + 2 image sensors. + + To compile this driver as a module, choose M here: the + module will be called sony-starvis2. + config VIDEO_T4KA3 tristate "Toshiba T4KA3 sensor support" depends on ACPI || COMPILE_TEST diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile index 59e31af457cd..609208dabd07 100644 --- a/drivers/media/i2c/Makefile +++ b/drivers/media/i2c/Makefile @@ -64,7 +64,6 @@ obj-$(CONFIG_VIDEO_IMX412) +=3D imx412.o obj-$(CONFIG_VIDEO_IMX415) +=3D imx415.o obj-$(CONFIG_VIDEO_IMX471) +=3D imx471.o obj-$(CONFIG_VIDEO_IMX576) +=3D imx576.o -obj-$(CONFIG_VIDEO_IMX678) +=3D imx678.o obj-$(CONFIG_VIDEO_IR_I2C) +=3D ir-kbd-i2c.o obj-$(CONFIG_VIDEO_ISL7998X) +=3D isl7998x.o obj-$(CONFIG_VIDEO_IT6625) +=3D it6625.o @@ -146,6 +145,7 @@ obj-$(CONFIG_VIDEO_SAA7127) +=3D saa7127.o obj-$(CONFIG_VIDEO_SAA717X) +=3D saa717x.o obj-$(CONFIG_VIDEO_SAA7185) +=3D saa7185.o obj-$(CONFIG_VIDEO_SONY_BTF_MPX) +=3D sony-btf-mpx.o +obj-$(CONFIG_VIDEO_SONY_STARVIS2) +=3D sony-starvis2.o obj-$(CONFIG_VIDEO_ST_MIPID02) +=3D st-mipid02.o obj-$(CONFIG_VIDEO_T4KA3) +=3D t4ka3.o obj-$(CONFIG_VIDEO_TC358743) +=3D tc358743.o diff --git a/drivers/media/i2c/imx678.c b/drivers/media/i2c/sony-starvis2.c similarity index 56% rename from drivers/media/i2c/imx678.c rename to drivers/media/i2c/sony-starvis2.c index 8413fd44d657..b4733990d03a 100644 --- a/drivers/media/i2c/imx678.c +++ b/drivers/media/i2c/sony-starvis2.c @@ -1,8 +1,13 @@ // SPDX-License-Identifier: GPL-2.0 /* - * V4L2 driver for Sony IMX678 + * V4L2 driver for Sony Starvis 2 sensors * - * Diagonal 8.86 mm (Type 1/1.8) CMOS image sensor with 8.40 M effective p= ixels. + * Many of the Sony Starvis 2 sensors share a common register layout, so + * many can be supported by a common driver. + * + * Currently supported are: + * IMX678: Diagonal 8.86 mm (Type 1/1.8) CMOS image sensor with 8.40 M eff= ective + * pixels. * * Copyright (C) 2026 Ideas On Board Oy. * @@ -26,25 +31,25 @@ #include =20 /* Standby or streaming mode */ -#define IMX678_REG_MODE_SELECT CCI_REG8(0x3000) -#define IMX678_MODE_STANDBY 0x01 -#define IMX678_MODE_STREAMING 0x00 -#define IMX678_STREAM_DELAY_US 25000 -#define IMX678_STREAM_DELAY_RANGE_US 1000 +#define STARVIS2_REG_MODE_SELECT CCI_REG8(0x3000) +#define STARVIS2_MODE_STANDBY 0x01 +#define STARVIS2_MODE_STREAMING 0x00 +#define STARVIS2_STREAM_DELAY_US 25000 +#define STARVIS2_STREAM_DELAY_RANGE_US 1000 =20 /* XVS/XHS sync control */ -#define IMX678_REG_XMSTA CCI_REG8(0x3002) -#define IMX678_REG_XXS_DRV CCI_REG8(0x30a6) -#define IMX678_REG_XXS_OUTSEL CCI_REG8(0x30a4) +#define STARVIS2_REG_XMSTA CCI_REG8(0x3002) +#define STARVIS2_REG_XXS_DRV CCI_REG8(0x30a6) +#define STARVIS2_REG_XXS_OUTSEL CCI_REG8(0x30a4) =20 /* Clk selection */ -#define IMX678_REG_INCK_SEL CCI_REG8(0x3014) +#define STARVIS2_REG_INCK_SEL CCI_REG8(0x3014) =20 /* Link Speed */ -#define IMX678_REG_DATARATE_SEL CCI_REG8(0x3015) +#define STARVIS2_REG_DATARATE_SEL CCI_REG8(0x3015) =20 /* Lane Count */ -#define IMX678_REG_LANEMODE CCI_REG8(0x3040) +#define STARVIS2_REG_LANEMODE CCI_REG8(0x3040) =20 /* * The internal readout clock runs at 74.25 MHz. In one cycle the AD reads= 8 @@ -54,22 +59,22 @@ #define IMX678_PIX_PER_CLK 8 =20 /* VMAX - Frame Length in Lines */ -#define IMX678_REG_VMAX CCI_REG24_LE(0x3028) -#define IMX678_VMAX_MAX 0xfffff +#define STARVIS2_REG_VMAX CCI_REG24_LE(0x3028) +#define STARVIS2_VMAX_MAX 0xfffff #define IMX678_VMAX_DEFAULT 2250 =20 /* HMAX - Line Length in Cycles (8 Pixels) */ -#define IMX678_REG_HMAX CCI_REG16_LE(0x302c) -#define IMX678_HMAX_MAX 0xffff +#define STARVIS2_REG_HMAX CCI_REG16_LE(0x302c) +#define STARVIS2_HMAX_MAX 0xffff =20 /* SHR internal */ -#define IMX678_REG_SHR CCI_REG24_LE(0x3050) -#define IMX678_SHR_MIN 8 +#define STARVIS2_REG_SHR CCI_REG24_LE(0x3050) +#define STARVIS2_SHR_MIN 8 =20 /* Exposure control */ -#define IMX678_EXPOSURE_MIN 2 -#define IMX678_EXPOSURE_STEP 1 -#define IMX678_EXPOSURE_DEFAULT 1000 +#define STARVIS2_EXPOSURE_MIN 2 +#define STARVIS2_EXPOSURE_STEP 1 +#define STARVIS2_EXPOSURE_DEFAULT 1000 =20 /* * Analogue gain control @@ -77,63 +82,63 @@ * Values from 101 to 240 are valid but correspond to additional digital g= ain * (0.3dB - 42dB) so don't expose it to userspace */ -#define IMX678_REG_GAIN CCI_REG16_LE(0x3070) -#define IMX678_ANA_GAIN_MIN_NORMAL 0 -#define IMX678_ANA_GAIN_MAX_NORMAL 100 -#define IMX678_ANA_GAIN_STEP 1 -#define IMX678_ANA_GAIN_DEFAULT 0 +#define STARVIS2_REG_GAIN CCI_REG16_LE(0x3070) +#define STARVIS2_ANA_GAIN_MIN_NORMAL 0 +#define STARVIS2_ANA_GAIN_MAX_NORMAL 100 +#define STARVIS2_ANA_GAIN_STEP 1 +#define STARVIS2_ANA_GAIN_DEFAULT 0 =20 /* Crop */ -#define IMX678_REG_WINMODE CCI_REG8(0x3018) -#define IMX678_REG_PIX_HST CCI_REG16_LE(0x303c) -#define IMX678_REG_PIX_HWIDTH CCI_REG16_LE(0x303e) -#define IMX678_REG_PIX_VST CCI_REG16_LE(0x3044) -#define IMX678_REG_PIX_VWIDTH CCI_REG16_LE(0x3046) +#define STARVIS2_REG_WINMODE CCI_REG8(0x3018) +#define STARVIS2_REG_PIX_HST CCI_REG16_LE(0x303c) +#define STARVIS2_REG_PIX_HWIDTH CCI_REG16_LE(0x303e) +#define STARVIS2_REG_PIX_VST CCI_REG16_LE(0x3044) +#define STARVIS2_REG_PIX_VWIDTH CCI_REG16_LE(0x3046) =20 /* Flip */ -#define IMX678_REG_WINMODEH CCI_REG8(0x3020) -#define IMX678_REG_WINMODEV CCI_REG8(0x3021) +#define STARVIS2_REG_WINMODEH CCI_REG8(0x3020) +#define STARVIS2_REG_WINMODEV CCI_REG8(0x3021) =20 /* Sensor Identification */ -#define IMX678_REG_MONOCHROME CCI_REG8(0x4d18) -#define IMX678_TYPE BIT(0) +#define STARVIS2_REG_MONOCHROME CCI_REG8(0x4d18) +#define STARVIS2_TYPE BIT(0) #define IMX678_REG_MODULE_ID CCI_REG16_LE(0x4d1c) #define IMX678_ID 0x02a6 -#define IMX678_MODULE_ID_DELAY 80000 +#define STARVIS2_MODULE_ID_DELAY 80000 =20 /* Common configuration registers */ -#define IMX678_REG_WDMODE CCI_REG8(0x301a) -#define IMX678_REG_ADDMODE CCI_REG8(0x301b) -#define IMX678_REG_THIN_V_EN CCI_REG8(0x301c) -#define IMX678_REG_VCMODE CCI_REG8(0x301e) -#define IMX678_REG_ADBIT CCI_REG8(0x3022) -#define IMX678_REG_MDBIT CCI_REG8(0x3023) -#define IMX678_REG_GAIN_PGC_FIDMD CCI_REG8(0x3400) +#define STARVIS2_REG_WDMODE CCI_REG8(0x301a) +#define STARVIS2_REG_ADDMODE CCI_REG8(0x301b) +#define STARVIS2_REG_THIN_V_EN CCI_REG8(0x301c) +#define STARVIS2_REG_VCMODE CCI_REG8(0x301e) +#define STARVIS2_REG_ADBIT CCI_REG8(0x3022) +#define STARVIS2_REG_MDBIT CCI_REG8(0x3023) +#define STARVIS2_REG_GAIN_PGC_FIDMD CCI_REG8(0x3400) =20 /* Test pattern generator */ -#define IMX678_REG_TPG_EN_DUOUT CCI_REG8(0x30e0) -#define IMX678_REG_TPG_PATSEL_DUOUT CCI_REG8(0x30e2) -#define IMX678_TPG_ALL_000 0 -#define IMX678_TPG_ALL_FFF 1 -#define IMX678_TPG_ALL_555 2 -#define IMX678_TPG_ALL_AAA 3 -#define IMX678_TPG_TOG_555_AAA 4 -#define IMX678_TPG_TOG_AAA_555 5 -#define IMX678_TPG_TOG_000_555 6 -#define IMX678_TPG_TOG_555_000 7 -#define IMX678_TPG_TOG_000_FFF 8 -#define IMX678_TPG_TOG_FFF_000 9 -#define IMX678_TPG_H_COLOR_BARS 10 -#define IMX678_TPG_V_COLOR_BARS 11 -#define IMX678_REG_TPG_COLORWIDTH CCI_REG8(0x30e4) -#define IMX678_TPG_COLORWIDTH_80PIX 0 -#define IMX678_TPG_COLORWIDTH_160PIX 1 -#define IMX678_TPG_COLORWIDTH_320PIX 2 -#define IMX678_TPG_COLORWIDTH_640PIX 3 - -#define IMX678_REG_INTERFACE_SEL CCI_REG8(0x4e3c) -#define IMX678_INTERFACE_2L_4L 0x07 -#define IMX678_INTERFACE_8L_2x4L 0x7f +#define STARVIS2_REG_TPG_EN_DUOUT CCI_REG8(0x30e0) +#define STARVIS2_REG_TPG_PATSEL_DUOUT CCI_REG8(0x30e2) +#define STARVIS2_TPG_ALL_000 0 +#define STARVIS2_TPG_ALL_FFF 1 +#define STARVIS2_TPG_ALL_555 2 +#define STARVIS2_TPG_ALL_AAA 3 +#define STARVIS2_TPG_TOG_555_AAA 4 +#define STARVIS2_TPG_TOG_AAA_555 5 +#define STARVIS2_TPG_TOG_000_555 6 +#define STARVIS2_TPG_TOG_555_000 7 +#define STARVIS2_TPG_TOG_000_FFF 8 +#define STARVIS2_TPG_TOG_FFF_000 9 +#define STARVIS2_TPG_H_COLOR_BARS 10 +#define STARVIS2_TPG_V_COLOR_BARS 11 +#define STARVIS2_REG_TPG_COLORWIDTH CCI_REG8(0x30e4) +#define STARVIS2_TPG_COLORWIDTH_80PIX 0 +#define STARVIS2_TPG_COLORWIDTH_160PIX 1 +#define STARVIS2_TPG_COLORWIDTH_320PIX 2 +#define STARVIS2_TPG_COLORWIDTH_640PIX 3 + +#define STARVIS2_REG_INTERFACE_SEL CCI_REG8(0x4e3c) +#define STARVIS2_INTERFACE_2L_4L 0x07 +#define STARVIS2_INTERFACE_8L_2x4L 0x7f =20 /* Minimum output resolution */ #define IMX678_PIXEL_ARRAY_MIN_WIDTH 1040 @@ -146,7 +151,7 @@ #define IMX678_CROP_VST_ALIGN 4 =20 /* Subdev pads */ -#define IMX678_SOURCE_PAD 0 +#define STARVIS2_SOURCE_PAD 0 =20 /* IMX678 native and active pixel array size. */ static const struct v4l2_rect imx678_native_area =3D { @@ -163,73 +168,73 @@ static const struct v4l2_rect imx678_active_area =3D { .height =3D 2180, }; =20 -enum imx678_type { - IMX678_COLOR =3D 0, - IMX678_MONOCHROME =3D 1, +enum starvis2_type { + STARVIS2_COLOR =3D 0, + STARVIS2_MONOCHROME =3D 1, }; =20 -struct imx678_model_info { - enum imx678_type type; +struct starvis2_model_info { + enum starvis2_type type; const u32 *codes; unsigned int num_codes; }; =20 -enum imx678_lanemode { - IMX678_LANEMODE_2L =3D 1, - IMX678_LANEMODE_4L =3D 3, +enum starvis2_lanemode { + STARVIS2_LANEMODE_2L =3D 1, + STARVIS2_LANEMODE_4L =3D 3, }; =20 /* Link frequency setup (DDR: lane rate =3D 2 x link freq) */ enum { - IMX678_LINK_FREQ_297MHZ, - IMX678_LINK_FREQ_360MHZ, - IMX678_LINK_FREQ_445MHZ, - IMX678_LINK_FREQ_594MHZ, - IMX678_LINK_FREQ_720MHZ, - IMX678_LINK_FREQ_891MHZ, - IMX678_LINK_FREQ_1039MHZ, - IMX678_LINK_FREQ_1188MHZ, + STARVIS2_LINK_FREQ_297MHZ, + STARVIS2_LINK_FREQ_360MHZ, + STARVIS2_LINK_FREQ_445MHZ, + STARVIS2_LINK_FREQ_594MHZ, + STARVIS2_LINK_FREQ_720MHZ, + STARVIS2_LINK_FREQ_891MHZ, + STARVIS2_LINK_FREQ_1039MHZ, + STARVIS2_LINK_FREQ_1188MHZ, }; =20 static const u8 link_freqs_reg_value[] =3D { - [IMX678_LINK_FREQ_297MHZ] =3D 0x07, - [IMX678_LINK_FREQ_360MHZ] =3D 0x06, - [IMX678_LINK_FREQ_445MHZ] =3D 0x05, - [IMX678_LINK_FREQ_594MHZ] =3D 0x04, - [IMX678_LINK_FREQ_720MHZ] =3D 0x03, - [IMX678_LINK_FREQ_891MHZ] =3D 0x02, - [IMX678_LINK_FREQ_1039MHZ] =3D 0x01, - [IMX678_LINK_FREQ_1188MHZ] =3D 0x00, + [STARVIS2_LINK_FREQ_297MHZ] =3D 0x07, + [STARVIS2_LINK_FREQ_360MHZ] =3D 0x06, + [STARVIS2_LINK_FREQ_445MHZ] =3D 0x05, + [STARVIS2_LINK_FREQ_594MHZ] =3D 0x04, + [STARVIS2_LINK_FREQ_720MHZ] =3D 0x03, + [STARVIS2_LINK_FREQ_891MHZ] =3D 0x02, + [STARVIS2_LINK_FREQ_1039MHZ] =3D 0x01, + [STARVIS2_LINK_FREQ_1188MHZ] =3D 0x00, }; =20 static const u64 link_freqs[] =3D { - [IMX678_LINK_FREQ_297MHZ] =3D 297000000, - [IMX678_LINK_FREQ_360MHZ] =3D 360000000, - [IMX678_LINK_FREQ_445MHZ] =3D 445500000, - [IMX678_LINK_FREQ_594MHZ] =3D 594000000, - [IMX678_LINK_FREQ_720MHZ] =3D 720000000, - [IMX678_LINK_FREQ_891MHZ] =3D 891000000, - [IMX678_LINK_FREQ_1039MHZ] =3D 1039500000, - [IMX678_LINK_FREQ_1188MHZ] =3D 1188000000, + [STARVIS2_LINK_FREQ_297MHZ] =3D 297000000, + [STARVIS2_LINK_FREQ_360MHZ] =3D 360000000, + [STARVIS2_LINK_FREQ_445MHZ] =3D 445500000, + [STARVIS2_LINK_FREQ_594MHZ] =3D 594000000, + [STARVIS2_LINK_FREQ_720MHZ] =3D 720000000, + [STARVIS2_LINK_FREQ_891MHZ] =3D 891000000, + [STARVIS2_LINK_FREQ_1039MHZ] =3D 1039500000, + [STARVIS2_LINK_FREQ_1188MHZ] =3D 1188000000, }; =20 static const u16 min_hmax_4lane[] =3D { - [IMX678_LINK_FREQ_297MHZ] =3D 1584, - [IMX678_LINK_FREQ_360MHZ] =3D 1320, - [IMX678_LINK_FREQ_445MHZ] =3D 1100, - [IMX678_LINK_FREQ_594MHZ] =3D 792, - [IMX678_LINK_FREQ_720MHZ] =3D 660, - [IMX678_LINK_FREQ_891MHZ] =3D 550, - [IMX678_LINK_FREQ_1039MHZ] =3D 550, - [IMX678_LINK_FREQ_1188MHZ] =3D 550, + [STARVIS2_LINK_FREQ_297MHZ] =3D 1584, + [STARVIS2_LINK_FREQ_360MHZ] =3D 1320, + [STARVIS2_LINK_FREQ_445MHZ] =3D 1100, + [STARVIS2_LINK_FREQ_594MHZ] =3D 792, + [STARVIS2_LINK_FREQ_720MHZ] =3D 660, + [STARVIS2_LINK_FREQ_891MHZ] =3D 550, + [STARVIS2_LINK_FREQ_1039MHZ] =3D 550, + [STARVIS2_LINK_FREQ_1188MHZ] =3D 550, }; =20 -struct imx678_inck_cfg { +struct starvis2_inck_cfg { u32 xclk_hz; /* platform clock rate */ u8 inck_sel; /* value for reg */ }; =20 -static const struct imx678_inck_cfg imx678_inck_table[] =3D { +static const struct starvis2_inck_cfg starvis2_inck_table[] =3D { { 74250000, 0x00 }, { 37125000, 0x01 }, { 72000000, 0x02 }, @@ -240,7 +245,7 @@ static const struct imx678_inck_cfg imx678_inck_table[]= =3D { { 13500000, 0x07 }, }; =20 -static const char * const imx678_tpg_menu[] =3D { +static const char * const starvis2_tpg_menu[] =3D { "Disabled", "All 000h", "All FFFh", @@ -256,28 +261,28 @@ static const char * const imx678_tpg_menu[] =3D { "Vertical color bars", }; =20 -static const int imx678_tpg_val[] =3D { - IMX678_TPG_ALL_000, - IMX678_TPG_ALL_000, - IMX678_TPG_ALL_FFF, - IMX678_TPG_ALL_555, - IMX678_TPG_ALL_AAA, - IMX678_TPG_TOG_555_AAA, - IMX678_TPG_TOG_AAA_555, - IMX678_TPG_TOG_000_555, - IMX678_TPG_TOG_555_000, - IMX678_TPG_TOG_000_FFF, - IMX678_TPG_TOG_FFF_000, - IMX678_TPG_H_COLOR_BARS, - IMX678_TPG_V_COLOR_BARS, +static const int starvis2_tpg_val[] =3D { + STARVIS2_TPG_ALL_000, + STARVIS2_TPG_ALL_000, + STARVIS2_TPG_ALL_FFF, + STARVIS2_TPG_ALL_555, + STARVIS2_TPG_ALL_AAA, + STARVIS2_TPG_TOG_555_AAA, + STARVIS2_TPG_TOG_AAA_555, + STARVIS2_TPG_TOG_000_555, + STARVIS2_TPG_TOG_555_000, + STARVIS2_TPG_TOG_000_FFF, + STARVIS2_TPG_TOG_FFF_000, + STARVIS2_TPG_H_COLOR_BARS, + STARVIS2_TPG_V_COLOR_BARS, }; =20 /* Common configuration */ static const struct cci_reg_sequence common_regs[] =3D { - { IMX678_REG_THIN_V_EN, 0x00 }, - { IMX678_REG_VCMODE, 0x01 }, + { STARVIS2_REG_THIN_V_EN, 0x00 }, + { STARVIS2_REG_VCMODE, 0x01 }, { CCI_REG8(0x306b), 0x00 }, - { IMX678_REG_GAIN_PGC_FIDMD, 0x01 }, + { STARVIS2_REG_GAIN_PGC_FIDMD, 0x01 }, { CCI_REG8(0x3460), 0x22 }, { CCI_REG8(0x355a), 0x64 }, { CCI_REG8(0x3a02), 0x7a }, @@ -643,9 +648,9 @@ static const struct cci_reg_sequence common_regs[] =3D { { CCI_REG8(0x47c1), 0x01 }, { CCI_REG8(0x47c2), 0x3e }, { CCI_REG8(0x47c3), 0x01 }, - { IMX678_REG_WDMODE, 0x00 }, - { IMX678_REG_MDBIT, 0x01 }, - { IMX678_REG_XXS_DRV, 0x00 }, + { STARVIS2_REG_WDMODE, 0x00 }, + { STARVIS2_REG_MDBIT, 0x01 }, + { STARVIS2_REG_XXS_DRV, 0x00 }, }; =20 static const u32 codes_bayer[] =3D { @@ -656,30 +661,30 @@ static const u32 codes_monochrome[] =3D { MEDIA_BUS_FMT_Y12_1X12, }; =20 -static const struct imx678_model_info imx678_aaqr_info =3D { - .type =3D IMX678_COLOR, +static const struct starvis2_model_info imx678_aaqr_info =3D { + .type =3D STARVIS2_COLOR, .codes =3D codes_bayer, .num_codes =3D ARRAY_SIZE(codes_bayer), }; =20 -static const struct imx678_model_info imx678_aamr_info =3D { - .type =3D IMX678_MONOCHROME, +static const struct starvis2_model_info imx678_aamr_info =3D { + .type =3D STARVIS2_MONOCHROME, .codes =3D codes_monochrome, .num_codes =3D ARRAY_SIZE(codes_monochrome), }; =20 -static const char * const imx678_supply_name[] =3D { +static const char * const starvis2_supply_name[] =3D { "avdd", /* Analog (3.3V) supply */ "dvdd", /* Digital Core (1.1V) supply */ "ovdd", /* IF (1.8V) supply */ }; =20 -struct imx678 { +struct starvis2 { struct v4l2_subdev sd; struct media_pad pad; struct regmap *cci; =20 - const struct imx678_model_info *info; + const struct starvis2_model_info *info; =20 struct clk *xclk; u32 xclk_freq; @@ -688,11 +693,12 @@ struct imx678 { u8 inck_sel_val; =20 /* Link configurations */ - enum imx678_lanemode lane_mode; + enum starvis2_lanemode lane_mode; unsigned long link_freq_bitmap; =20 struct gpio_desc *reset_gpio; - struct regulator_bulk_data supplies[ARRAY_SIZE(imx678_supply_name)]; + struct regulator_bulk_data supplies[ARRAY_SIZE(starvis2_supply_name)]; + bool common_regs_written; =20 struct v4l2_ctrl_handler ctrl_handler; =20 @@ -705,49 +711,49 @@ struct imx678 { u32 vmax; }; =20 -static inline struct imx678 *to_imx678(struct v4l2_subdev *_sd) +static inline struct starvis2 *to_starvis2(struct v4l2_subdev *_sd) { - return container_of_const(_sd, struct imx678, sd); + return container_of_const(_sd, struct starvis2, sd); } =20 -static u32 imx678_default_mbus_code(struct imx678 *imx678) +static u32 starvis2_default_mbus_code(struct starvis2 *starvis2) { - return imx678->info->codes[0]; + return starvis2->info->codes[0]; } =20 -static bool imx678_mbus_code_supported(struct imx678 *imx678, u32 code) +static bool starvis2_mbus_code_supported(struct starvis2 *starvis2, u32 co= de) { - for (unsigned int i =3D 0; i < imx678->info->num_codes; i++) { - if (imx678->info->codes[i] =3D=3D code) + for (unsigned int i =3D 0; i < starvis2->info->num_codes; i++) { + if (starvis2->info->codes[i] =3D=3D code) return true; } =20 return false; } =20 -static int imx678_set_ctrl(struct v4l2_ctrl *ctrl) +static int starvis2_set_ctrl(struct v4l2_ctrl *ctrl) { - struct imx678 *imx678 =3D container_of_const(ctrl->handler, struct - imx678, ctrl_handler); - struct i2c_client *client =3D v4l2_get_subdevdata(&imx678->sd); + struct starvis2 *starvis2 =3D container_of_const(ctrl->handler, struct + starvis2, ctrl_handler); + struct i2c_client *client =3D v4l2_get_subdevdata(&starvis2->sd); const struct v4l2_mbus_framefmt *format; struct v4l2_subdev_state *state; int ret =3D 0; =20 - state =3D v4l2_subdev_get_locked_active_state(&imx678->sd); - format =3D v4l2_subdev_state_get_format(state, IMX678_SOURCE_PAD); + state =3D v4l2_subdev_get_locked_active_state(&starvis2->sd); + format =3D v4l2_subdev_state_get_format(state, STARVIS2_SOURCE_PAD); =20 if (ctrl->id =3D=3D V4L2_CID_VBLANK) { - u32 current_exposure =3D imx678->exposure->cur.val; + u32 current_exposure =3D starvis2->exposure->cur.val; =20 - imx678->vmax =3D format->height + ctrl->val; + starvis2->vmax =3D format->height + ctrl->val; =20 current_exposure =3D clamp_t(u32, current_exposure, - IMX678_EXPOSURE_MIN, - imx678->vmax - IMX678_SHR_MIN); - ret =3D __v4l2_ctrl_modify_range(imx678->exposure, - IMX678_EXPOSURE_MIN, - imx678->vmax - IMX678_SHR_MIN, + STARVIS2_EXPOSURE_MIN, + starvis2->vmax - STARVIS2_SHR_MIN); + ret =3D __v4l2_ctrl_modify_range(starvis2->exposure, + STARVIS2_EXPOSURE_MIN, + starvis2->vmax - STARVIS2_SHR_MIN, 1, current_exposure); if (ret) return ret; @@ -762,38 +768,41 @@ static int imx678_set_ctrl(struct v4l2_ctrl *ctrl) =20 switch (ctrl->id) { case V4L2_CID_VBLANK: - cci_write(imx678->cci, IMX678_REG_VMAX, imx678->vmax, &ret); + cci_write(starvis2->cci, STARVIS2_REG_VMAX, starvis2->vmax, + &ret); fallthrough; /* SHR =3D VMAX - exposure, so update it */ case V4L2_CID_EXPOSURE: { - u32 shr =3D imx678->vmax - imx678->exposure->val; + u32 shr =3D starvis2->vmax - starvis2->exposure->val; =20 - cci_write(imx678->cci, IMX678_REG_SHR, shr, &ret); + cci_write(starvis2->cci, STARVIS2_REG_SHR, shr, &ret); break; } case V4L2_CID_ANALOGUE_GAIN: - cci_write(imx678->cci, IMX678_REG_GAIN, ctrl->val, &ret); + cci_write(starvis2->cci, STARVIS2_REG_GAIN, ctrl->val, &ret); break; case V4L2_CID_HBLANK: { u32 hmax =3D (format->width + ctrl->val) / IMX678_PIX_PER_CLK; =20 - cci_write(imx678->cci, IMX678_REG_HMAX, hmax, &ret); + cci_write(starvis2->cci, STARVIS2_REG_HMAX, hmax, &ret); break; } case V4L2_CID_TEST_PATTERN: { - cci_write(imx678->cci, IMX678_REG_TPG_COLORWIDTH, - IMX678_TPG_COLORWIDTH_160PIX, &ret); - cci_write(imx678->cci, IMX678_REG_TPG_PATSEL_DUOUT, - imx678_tpg_val[ctrl->val], &ret); - cci_write(imx678->cci, IMX678_REG_TPG_EN_DUOUT, + cci_write(starvis2->cci, STARVIS2_REG_TPG_COLORWIDTH, + STARVIS2_TPG_COLORWIDTH_160PIX, &ret); + cci_write(starvis2->cci, STARVIS2_REG_TPG_PATSEL_DUOUT, + starvis2_tpg_val[ctrl->val], &ret); + cci_write(starvis2->cci, STARVIS2_REG_TPG_EN_DUOUT, (ctrl->val) ? 1 : 0, &ret); break; } case V4L2_CID_HFLIP: - cci_write(imx678->cci, IMX678_REG_WINMODEH, ctrl->val, &ret); + cci_write(starvis2->cci, STARVIS2_REG_WINMODEH, ctrl->val, + &ret); break; case V4L2_CID_VFLIP: - cci_write(imx678->cci, IMX678_REG_WINMODEV, ctrl->val, &ret); + cci_write(starvis2->cci, STARVIS2_REG_WINMODEV, ctrl->val, + &ret); break; default: dev_warn(&client->dev, @@ -807,35 +816,35 @@ static int imx678_set_ctrl(struct v4l2_ctrl *ctrl) return ret; } =20 -static const struct v4l2_ctrl_ops imx678_ctrl_ops =3D { - .s_ctrl =3D imx678_set_ctrl, +static const struct v4l2_ctrl_ops starvis2_ctrl_ops =3D { + .s_ctrl =3D starvis2_set_ctrl, }; =20 -static int imx678_enum_mbus_code(struct v4l2_subdev *sd, - struct v4l2_subdev_state *sd_state, - struct v4l2_subdev_mbus_code_enum *code) +static int starvis2_enum_mbus_code(struct v4l2_subdev *sd, + struct v4l2_subdev_state *sd_state, + struct v4l2_subdev_mbus_code_enum *code) { - struct imx678 *imx678 =3D to_imx678(sd); + struct starvis2 *starvis2 =3D to_starvis2(sd); =20 - if (code->index >=3D imx678->info->num_codes) + if (code->index >=3D starvis2->info->num_codes) return -EINVAL; =20 - code->code =3D imx678->info->codes[code->index]; + code->code =3D starvis2->info->codes[code->index]; =20 return 0; } =20 -static int imx678_enum_frame_size(struct v4l2_subdev *sd, - struct v4l2_subdev_state *sd_state, - struct v4l2_subdev_frame_size_enum *fse) +static int starvis2_enum_frame_size(struct v4l2_subdev *sd, + struct v4l2_subdev_state *sd_state, + struct v4l2_subdev_frame_size_enum *fse) { - struct imx678 *imx678 =3D to_imx678(sd); + struct starvis2 *starvis2 =3D to_starvis2(sd); const struct v4l2_rect *crop; =20 if (fse->index) return -EINVAL; =20 - if (!imx678_mbus_code_supported(imx678, fse->code)) + if (!starvis2_mbus_code_supported(starvis2, fse->code)) return -EINVAL; =20 crop =3D v4l2_subdev_state_get_crop(sd_state, fse->pad); @@ -848,10 +857,10 @@ static int imx678_enum_frame_size(struct v4l2_subdev = *sd, return 0; } =20 -static int imx678_get_selection(struct v4l2_subdev *sd, - const struct v4l2_subdev_client_info *ci, - struct v4l2_subdev_state *sd_state, - struct v4l2_subdev_selection *sel) +static int starvis2_get_selection(struct v4l2_subdev *sd, + const struct v4l2_subdev_client_info *ci, + struct v4l2_subdev_state *sd_state, + struct v4l2_subdev_selection *sel) { switch (sel->target) { case V4L2_SEL_TGT_CROP: @@ -871,18 +880,18 @@ static int imx678_get_selection(struct v4l2_subdev *s= d, return -EINVAL; } =20 -static int imx678_init_state(struct v4l2_subdev *sd, - struct v4l2_subdev_state *state) +static int starvis2_init_state(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state) { - struct imx678 *imx678 =3D to_imx678(sd); + struct starvis2 *starvis2 =3D to_starvis2(sd); struct v4l2_mbus_framefmt *format; struct v4l2_rect *crop; =20 - crop =3D v4l2_subdev_state_get_crop(state, IMX678_SOURCE_PAD); + crop =3D v4l2_subdev_state_get_crop(state, STARVIS2_SOURCE_PAD); *crop =3D imx678_active_area; =20 - format =3D v4l2_subdev_state_get_format(state, IMX678_SOURCE_PAD); - format->code =3D imx678_default_mbus_code(imx678); + format =3D v4l2_subdev_state_get_format(state, STARVIS2_SOURCE_PAD); + format->code =3D starvis2_default_mbus_code(starvis2); format->width =3D imx678_active_area.width; format->height =3D imx678_active_area.height; format->field =3D V4L2_FIELD_NONE; @@ -894,50 +903,55 @@ static int imx678_init_state(struct v4l2_subdev *sd, return 0; } =20 -static int imx678_write_common(struct imx678 *imx678) +static int starvis2_write_common(struct starvis2 *starvis2) { int ret =3D 0; =20 - cci_multi_reg_write(imx678->cci, common_regs, ARRAY_SIZE(common_regs), + cci_multi_reg_write(starvis2->cci, common_regs, ARRAY_SIZE(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, - link_freqs_reg_value[__ffs(imx678->link_freq_bitmap)], &ret); - cci_write(imx678->cci, IMX678_REG_LANEMODE, imx678->lane_mode, &ret); - - cci_write(imx678->cci, IMX678_REG_INTERFACE_SEL, IMX678_INTERFACE_2L_4L, + cci_write(starvis2->cci, STARVIS2_REG_INCK_SEL, starvis2->inck_sel_val, + &ret); + cci_write(starvis2->cci, STARVIS2_REG_DATARATE_SEL, + link_freqs_reg_value[__ffs(starvis2->link_freq_bitmap)], + &ret); + cci_write(starvis2->cci, STARVIS2_REG_LANEMODE, starvis2->lane_mode, &ret); =20 + cci_write(starvis2->cci, STARVIS2_REG_INTERFACE_SEL, + STARVIS2_INTERFACE_2L_4L, &ret); + + starvis2->common_regs_written =3D true; + return ret; } =20 -static int imx678_program_window(struct imx678 *imx678, - const struct v4l2_rect *crop) +static int starvis2_program_window(struct starvis2 *starvis2, + const struct v4l2_rect *crop) { int ret =3D 0; =20 - cci_write(imx678->cci, IMX678_REG_ADDMODE, 0x00, &ret); - cci_write(imx678->cci, IMX678_REG_WINMODE, + cci_write(starvis2->cci, STARVIS2_REG_ADDMODE, 0x00, &ret); + cci_write(starvis2->cci, STARVIS2_REG_WINMODE, v4l2_rect_equal(crop, &imx678_active_area) ? 0x00 : 0x04, &ret); - cci_write(imx678->cci, IMX678_REG_PIX_HST, + cci_write(starvis2->cci, STARVIS2_REG_PIX_HST, crop->left - imx678_active_area.left, &ret); - cci_write(imx678->cci, IMX678_REG_PIX_HWIDTH, crop->width, &ret); - cci_write(imx678->cci, IMX678_REG_PIX_VST, + cci_write(starvis2->cci, STARVIS2_REG_PIX_HWIDTH, crop->width, &ret); + cci_write(starvis2->cci, STARVIS2_REG_PIX_VST, crop->top - imx678_active_area.top, &ret); - cci_write(imx678->cci, IMX678_REG_PIX_VWIDTH, crop->height, &ret); - cci_write(imx678->cci, IMX678_REG_ADBIT, 0x01, &ret); + cci_write(starvis2->cci, STARVIS2_REG_PIX_VWIDTH, crop->height, &ret); + cci_write(starvis2->cci, STARVIS2_REG_ADBIT, 0x01, &ret); =20 return ret; } =20 -static int imx678_enable_streams(struct v4l2_subdev *sd, - struct v4l2_subdev_state *state, u32 pad, - u64 mask) +static int starvis2_enable_streams(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, u32 pad, + u64 mask) { struct i2c_client *client =3D v4l2_get_subdevdata(sd); - struct imx678 *imx678 =3D to_imx678(sd); + struct starvis2 *starvis2 =3D to_starvis2(sd); const struct v4l2_rect *crop; int ret; =20 @@ -945,25 +959,34 @@ static int imx678_enable_streams(struct v4l2_subdev *= sd, if (ret < 0) return ret; =20 + if (!starvis2->common_regs_written) { + ret =3D starvis2_write_common(starvis2); + if (ret) { + dev_err(&client->dev, "%s failed to write common registers\n", + __func__); + goto err_rpm_put; + } + } + crop =3D v4l2_subdev_state_get_crop(state, pad); - ret =3D imx678_program_window(imx678, crop); + ret =3D starvis2_program_window(starvis2, crop); if (ret) { dev_err(&client->dev, "%s failed to set mode\n", __func__); goto err_rpm_put; } =20 - ret =3D __v4l2_ctrl_handler_setup(imx678->sd.ctrl_handler); + ret =3D __v4l2_ctrl_handler_setup(starvis2->sd.ctrl_handler); if (ret) { dev_err(&client->dev, "%s failed to apply user values\n", __func__); goto err_rpm_put; } =20 - cci_write(imx678->cci, IMX678_REG_MODE_SELECT, IMX678_MODE_STREAMING, - &ret); - usleep_range(IMX678_STREAM_DELAY_US, IMX678_STREAM_DELAY_US + - IMX678_STREAM_DELAY_RANGE_US); - cci_write(imx678->cci, IMX678_REG_XMSTA, 0x00, &ret); + cci_write(starvis2->cci, STARVIS2_REG_MODE_SELECT, + STARVIS2_MODE_STREAMING, &ret); + usleep_range(STARVIS2_STREAM_DELAY_US, STARVIS2_STREAM_DELAY_US + + STARVIS2_STREAM_DELAY_RANGE_US); + cci_write(starvis2->cci, STARVIS2_REG_XMSTA, 0x00, &ret); =20 if (ret) { dev_err(&client->dev, "%s failed to start streaming\n", @@ -979,19 +1002,19 @@ static int imx678_enable_streams(struct v4l2_subdev = *sd, return ret; } =20 -static int imx678_disable_streams(struct v4l2_subdev *sd, - struct v4l2_subdev_state *state, - u32 pad, u64 mask) +static int starvis2_disable_streams(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + u32 pad, u64 mask) { struct i2c_client *client =3D v4l2_get_subdevdata(sd); - struct imx678 *imx678 =3D to_imx678(sd); + struct starvis2 *starvis2 =3D to_starvis2(sd); int ret =3D 0; =20 /* Master mode disable */ - cci_write(imx678->cci, IMX678_REG_XMSTA, 0x01, &ret); + cci_write(starvis2->cci, STARVIS2_REG_XMSTA, 0x01, &ret); /* Standby */ - cci_write(imx678->cci, IMX678_REG_MODE_SELECT, IMX678_MODE_STANDBY, - &ret); + cci_write(starvis2->cci, STARVIS2_REG_MODE_SELECT, + STARVIS2_MODE_STANDBY, &ret); if (ret) dev_err(&client->dev, "%s failed to stop stream\n", __func__); =20 @@ -1000,15 +1023,15 @@ static int imx678_disable_streams(struct v4l2_subde= v *sd, return ret; } =20 -static int imx678_power_on(struct device *dev) +static int starvis2_power_on(struct device *dev) { struct i2c_client *client =3D to_i2c_client(dev); struct v4l2_subdev *sd =3D i2c_get_clientdata(client); - struct imx678 *imx678 =3D to_imx678(sd); + struct starvis2 *starvis2 =3D to_starvis2(sd); int ret; =20 - ret =3D regulator_bulk_enable(ARRAY_SIZE(imx678_supply_name), - imx678->supplies); + ret =3D regulator_bulk_enable(ARRAY_SIZE(starvis2_supply_name), + starvis2->supplies); if (ret) { dev_err(&client->dev, "%s: failed to enable regulators\n", __func__); @@ -1017,11 +1040,11 @@ static int imx678_power_on(struct device *dev) =20 fsleep(1); /* Tlow > 500ns */ =20 - gpiod_set_value_cansleep(imx678->reset_gpio, 0); + gpiod_set_value_cansleep(starvis2->reset_gpio, 0); =20 fsleep(1); /* T3 > 1us */ =20 - ret =3D clk_prepare_enable(imx678->xclk); + ret =3D clk_prepare_enable(starvis2->xclk); if (ret) { dev_err(&client->dev, "%s: failed to enable clock\n", __func__); @@ -1030,7 +1053,7 @@ static int imx678_power_on(struct device *dev) =20 fsleep(20); /* T4 > 20us */ =20 - ret =3D imx678_write_common(imx678); + ret =3D starvis2_write_common(starvis2); if (ret) { dev_err(&client->dev, "%s failed to write registers\n", __func__); @@ -1040,35 +1063,37 @@ static int imx678_power_on(struct device *dev) return 0; =20 clk_off: - clk_disable_unprepare(imx678->xclk); + clk_disable_unprepare(starvis2->xclk); =20 reg_off: - gpiod_set_value_cansleep(imx678->reset_gpio, 1); - regulator_bulk_disable(ARRAY_SIZE(imx678_supply_name), - imx678->supplies); + gpiod_set_value_cansleep(starvis2->reset_gpio, 1); + regulator_bulk_disable(ARRAY_SIZE(starvis2_supply_name), + starvis2->supplies); =20 return ret; } =20 -static int imx678_power_off(struct device *dev) +static int starvis2_power_off(struct device *dev) { struct i2c_client *client =3D to_i2c_client(dev); struct v4l2_subdev *sd =3D i2c_get_clientdata(client); - struct imx678 *imx678 =3D to_imx678(sd); + struct starvis2 *starvis2 =3D to_starvis2(sd); + + clk_disable_unprepare(starvis2->xclk); + gpiod_set_value_cansleep(starvis2->reset_gpio, 1); + regulator_bulk_disable(ARRAY_SIZE(starvis2_supply_name), + starvis2->supplies); =20 - clk_disable_unprepare(imx678->xclk); - gpiod_set_value_cansleep(imx678->reset_gpio, 1); - regulator_bulk_disable(ARRAY_SIZE(imx678_supply_name), - imx678->supplies); + starvis2->common_regs_written =3D false; =20 return 0; } =20 -static int imx678_identify_model(struct imx678 *imx678) +static int starvis2_identify_model(struct starvis2 *starvis2) { - struct i2c_client *client =3D v4l2_get_subdevdata(&imx678->sd); - const struct imx678_model_info *info; - enum imx678_type detected; + struct i2c_client *client =3D v4l2_get_subdevdata(&starvis2->sd); + const struct starvis2_model_info *info; + enum starvis2_type detected; int ret =3D 0; u64 val =3D 0; =20 @@ -1078,10 +1103,10 @@ static int imx678_identify_model(struct imx678 *imx= 678) * This sensor's ID registers become accessible 80ms after coming out * of STANDBY mode. */ - cci_write(imx678->cci, IMX678_REG_MODE_SELECT, 0, &ret); - fsleep(IMX678_MODULE_ID_DELAY); + cci_write(starvis2->cci, STARVIS2_REG_MODE_SELECT, 0, &ret); + fsleep(STARVIS2_MODULE_ID_DELAY); =20 - cci_read(imx678->cci, IMX678_REG_MODULE_ID, &val, &ret); + cci_read(starvis2->cci, IMX678_REG_MODULE_ID, &val, &ret); =20 if (ret) { dev_err(&client->dev, @@ -1095,7 +1120,7 @@ static int imx678_identify_model(struct imx678 *imx67= 8) return -ENXIO; } =20 - cci_read(imx678->cci, IMX678_REG_MONOCHROME, &val, &ret); + cci_read(starvis2->cci, STARVIS2_REG_MONOCHROME, &val, &ret); =20 if (ret) { dev_err(&client->dev, @@ -1103,55 +1128,57 @@ static int imx678_identify_model(struct imx678 *imx= 678) return ret; } =20 - detected =3D val & IMX678_TYPE; + detected =3D val & STARVIS2_TYPE; =20 /* Prefer to use sensor type specified in device tree */ if (info) { - imx678->info =3D info; + starvis2->info =3D info; if (detected !=3D info->type) dev_err(&client->dev, "detected %s sensor, DT specifies %s; using DT value\n", - detected =3D=3D IMX678_COLOR ? "color" : "mono", - info->type =3D=3D IMX678_COLOR ? "color" : "mono"); + detected =3D=3D STARVIS2_COLOR ? "color" : "mono", + info->type =3D=3D STARVIS2_COLOR ? "color" : "mono"); } else { - imx678->info =3D detected =3D=3D IMX678_MONOCHROME ? + starvis2->info =3D detected =3D=3D STARVIS2_MONOCHROME ? &imx678_aamr_info : &imx678_aaqr_info; dev_info(&client->dev, "sensor type missing in DT; detected %s sensor\n", - detected =3D=3D IMX678_MONOCHROME ? "mono" : "color"); + detected =3D=3D STARVIS2_MONOCHROME ? "mono" : "color"); } =20 return 0; } =20 -static const struct v4l2_subdev_video_ops imx678_video_ops =3D { +static const struct v4l2_subdev_video_ops starvis2_video_ops =3D { .s_stream =3D v4l2_subdev_s_stream_helper, }; =20 -static const struct v4l2_subdev_pad_ops imx678_pad_ops =3D { - .enum_mbus_code =3D imx678_enum_mbus_code, +static const struct v4l2_subdev_pad_ops starvis2_pad_ops =3D { + .enum_mbus_code =3D starvis2_enum_mbus_code, .get_fmt =3D v4l2_subdev_get_fmt, - .get_selection =3D imx678_get_selection, - .enum_frame_size =3D imx678_enum_frame_size, - .enable_streams =3D imx678_enable_streams, - .disable_streams =3D imx678_disable_streams, + .get_selection =3D starvis2_get_selection, + .enum_frame_size =3D starvis2_enum_frame_size, + .enable_streams =3D starvis2_enable_streams, + .disable_streams =3D starvis2_disable_streams, }; =20 -static const struct v4l2_subdev_ops imx678_subdev_ops =3D { - .video =3D &imx678_video_ops, - .pad =3D &imx678_pad_ops, +static const struct v4l2_subdev_ops starvis2_subdev_ops =3D { + .video =3D &starvis2_video_ops, + .pad =3D &starvis2_pad_ops, }; =20 -static const struct v4l2_subdev_internal_ops imx678_internal_ops =3D { - .init_state =3D imx678_init_state, +static const struct v4l2_subdev_internal_ops starvis2_internal_ops =3D { + .init_state =3D starvis2_init_state, }; =20 -static int imx678_init_controls(struct imx678 *imx678) +static int starvis2_init_controls(struct starvis2 *starvis2) { struct v4l2_ctrl_handler *ctrl_hdlr; - const u32 hmax_4lane =3D min_hmax_4lane[__ffs(imx678->link_freq_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); + const u32 hmax_4lane =3D + min_hmax_4lane[__ffs(starvis2->link_freq_bitmap)]; + const u32 lane_scale =3D + starvis2->lane_mode =3D=3D STARVIS2_LANEMODE_2L ? 2 : 1; + struct i2c_client *client =3D v4l2_get_subdevdata(&starvis2->sd); struct v4l2_fwnode_device_properties props; struct v4l2_ctrl *link_freq; s32 hblank, max_hblank, vblank, max_vblank; @@ -1162,66 +1189,66 @@ static int imx678_init_controls(struct imx678 *imx6= 78) if (ret < 0) return ret; =20 - ctrl_hdlr =3D &imx678->ctrl_handler; + ctrl_hdlr =3D &starvis2->ctrl_handler; ret =3D v4l2_ctrl_handler_init(ctrl_hdlr, 11); if (ret) return ret; =20 - imx678->vmax =3D IMX678_VMAX_DEFAULT; + starvis2->vmax =3D IMX678_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, + v4l2_ctrl_new_std(ctrl_hdlr, &starvis2_ctrl_ops, V4L2_CID_PIXEL_RATE, IMX678_PIXEL_RATE, IMX678_PIXEL_RATE, 1, IMX678_PIXEL_RATE); =20 /* LINK_FREQ is also read only */ - link_freq =3D v4l2_ctrl_new_int_menu(ctrl_hdlr, &imx678_ctrl_ops, + link_freq =3D v4l2_ctrl_new_int_menu(ctrl_hdlr, &starvis2_ctrl_ops, V4L2_CID_LINK_FREQ, ARRAY_SIZE(link_freqs) - 1, - __ffs(imx678->link_freq_bitmap), + __ffs(starvis2->link_freq_bitmap), link_freqs); =20 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; - imx678->vblank =3D v4l2_ctrl_new_std(ctrl_hdlr, &imx678_ctrl_ops, - V4L2_CID_VBLANK, vblank, max_vblank, - 2, vblank); + vblank =3D starvis2->vmax - imx678_active_area.height; + max_vblank =3D STARVIS2_VMAX_MAX - imx678_active_area.height; + starvis2->vblank =3D v4l2_ctrl_new_std(ctrl_hdlr, &starvis2_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 - + max_hblank =3D STARVIS2_HMAX_MAX * IMX678_PIX_PER_CLK - imx678_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); - - imx678->exposure =3D v4l2_ctrl_new_std(ctrl_hdlr, &imx678_ctrl_ops, - V4L2_CID_EXPOSURE, - IMX678_EXPOSURE_MIN, - IMX678_VMAX_DEFAULT - - IMX678_SHR_MIN, - IMX678_EXPOSURE_STEP, - IMX678_EXPOSURE_DEFAULT); - - v4l2_ctrl_new_std(ctrl_hdlr, &imx678_ctrl_ops, V4L2_CID_ANALOGUE_GAIN, - IMX678_ANA_GAIN_MIN_NORMAL, - IMX678_ANA_GAIN_MAX_NORMAL, IMX678_ANA_GAIN_STEP, - IMX678_ANA_GAIN_DEFAULT); - - v4l2_ctrl_new_std(ctrl_hdlr, &imx678_ctrl_ops, V4L2_CID_HFLIP, + starvis2->hblank =3D v4l2_ctrl_new_std(ctrl_hdlr, &starvis2_ctrl_ops, + V4L2_CID_HBLANK, hblank, max_hblank, + IMX678_PIX_PER_CLK, hblank); + + starvis2->exposure =3D v4l2_ctrl_new_std(ctrl_hdlr, &starvis2_ctrl_ops, + V4L2_CID_EXPOSURE, + STARVIS2_EXPOSURE_MIN, + IMX678_VMAX_DEFAULT - + STARVIS2_SHR_MIN, + STARVIS2_EXPOSURE_STEP, + STARVIS2_EXPOSURE_DEFAULT); + + v4l2_ctrl_new_std(ctrl_hdlr, &starvis2_ctrl_ops, V4L2_CID_ANALOGUE_GAIN, + STARVIS2_ANA_GAIN_MIN_NORMAL, + STARVIS2_ANA_GAIN_MAX_NORMAL, STARVIS2_ANA_GAIN_STEP, + STARVIS2_ANA_GAIN_DEFAULT); + + v4l2_ctrl_new_std(ctrl_hdlr, &starvis2_ctrl_ops, V4L2_CID_HFLIP, 0, 1, 1, 0); - v4l2_ctrl_new_std(ctrl_hdlr, &imx678_ctrl_ops, V4L2_CID_VFLIP, + v4l2_ctrl_new_std(ctrl_hdlr, &starvis2_ctrl_ops, V4L2_CID_VFLIP, 0, 1, 1, 0); =20 - v4l2_ctrl_new_std_menu_items(ctrl_hdlr, &imx678_ctrl_ops, + v4l2_ctrl_new_std_menu_items(ctrl_hdlr, &starvis2_ctrl_ops, V4L2_CID_TEST_PATTERN, - ARRAY_SIZE(imx678_tpg_menu) - 1, 0, 0, - imx678_tpg_menu); + ARRAY_SIZE(starvis2_tpg_menu) - 1, 0, 0, + starvis2_tpg_menu); =20 - v4l2_ctrl_new_fwnode_properties(ctrl_hdlr, &imx678_ctrl_ops, &props); + v4l2_ctrl_new_fwnode_properties(ctrl_hdlr, &starvis2_ctrl_ops, &props); =20 if (ctrl_hdlr->error) { ret =3D ctrl_hdlr->error; @@ -1231,12 +1258,12 @@ static int imx678_init_controls(struct imx678 *imx6= 78) return ret; } =20 - imx678->sd.ctrl_handler =3D ctrl_hdlr; + starvis2->sd.ctrl_handler =3D ctrl_hdlr; =20 return 0; } =20 -static int imx678_check_hwcfg(struct device *dev, struct imx678 *imx678) +static int starvis2_check_hwcfg(struct device *dev, struct starvis2 *starv= is2) { struct fwnode_handle *endpoint; struct v4l2_fwnode_endpoint ep_cfg =3D { @@ -1257,10 +1284,10 @@ static int imx678_check_hwcfg(struct device *dev, s= truct imx678 *imx678) =20 switch (ep_cfg.bus.mipi_csi2.num_data_lanes) { case 2: - imx678->lane_mode =3D IMX678_LANEMODE_2L; + starvis2->lane_mode =3D STARVIS2_LANEMODE_2L; break; case 4: - imx678->lane_mode =3D IMX678_LANEMODE_4L; + starvis2->lane_mode =3D STARVIS2_LANEMODE_4L; break; default: dev_err(dev, @@ -1271,7 +1298,7 @@ static int imx678_check_hwcfg(struct device *dev, str= uct imx678 *imx678) ret =3D v4l2_link_freq_to_bitmap(dev, ep_cfg.link_frequencies, ep_cfg.nr_of_link_frequencies, link_freqs, ARRAY_SIZE(link_freqs), - &imx678->link_freq_bitmap); + &starvis2->link_freq_bitmap); =20 error_out: v4l2_fwnode_endpoint_free(&ep_cfg); @@ -1280,95 +1307,95 @@ static int imx678_check_hwcfg(struct device *dev, s= truct imx678 *imx678) return ret; } =20 -static int imx678_probe(struct i2c_client *client) +static int starvis2_probe(struct i2c_client *client) { struct device *dev =3D &client->dev; - struct imx678 *imx678; + struct starvis2 *starvis2; int ret, i; =20 - imx678 =3D devm_kzalloc(&client->dev, sizeof(*imx678), GFP_KERNEL); - if (!imx678) + starvis2 =3D devm_kzalloc(&client->dev, sizeof(*starvis2), GFP_KERNEL); + if (!starvis2) return -ENOMEM; =20 - v4l2_i2c_subdev_init(&imx678->sd, client, &imx678_subdev_ops); + v4l2_i2c_subdev_init(&starvis2->sd, client, &starvis2_subdev_ops); =20 - imx678->cci =3D devm_cci_regmap_init_i2c(client, 16); - if (IS_ERR(imx678->cci)) - return dev_err_probe(dev, PTR_ERR(imx678->cci), + starvis2->cci =3D devm_cci_regmap_init_i2c(client, 16); + if (IS_ERR(starvis2->cci)) + return dev_err_probe(dev, PTR_ERR(starvis2->cci), "failed to init CCI\n"); =20 - if (imx678_check_hwcfg(dev, imx678)) + if (starvis2_check_hwcfg(dev, starvis2)) return -EINVAL; =20 - imx678->xclk =3D devm_v4l2_sensor_clk_get(dev, NULL); - if (IS_ERR(imx678->xclk)) - return dev_err_probe(dev, PTR_ERR(imx678->xclk), + starvis2->xclk =3D devm_v4l2_sensor_clk_get(dev, NULL); + if (IS_ERR(starvis2->xclk)) + return dev_err_probe(dev, PTR_ERR(starvis2->xclk), "failed to get xclk\n"); =20 - imx678->xclk_freq =3D clk_get_rate(imx678->xclk); + starvis2->xclk_freq =3D clk_get_rate(starvis2->xclk); =20 - for (i =3D 0; i < ARRAY_SIZE(imx678_inck_table); ++i) { - if (imx678_inck_table[i].xclk_hz =3D=3D imx678->xclk_freq) { - imx678->inck_sel_val =3D imx678_inck_table[i].inck_sel; + for (i =3D 0; i < ARRAY_SIZE(starvis2_inck_table); ++i) { + if (starvis2_inck_table[i].xclk_hz =3D=3D starvis2->xclk_freq) { + starvis2->inck_sel_val =3D starvis2_inck_table[i].inck_sel; break; } } =20 - if (i =3D=3D ARRAY_SIZE(imx678_inck_table)) + if (i =3D=3D ARRAY_SIZE(starvis2_inck_table)) return dev_err_probe(dev, -EINVAL, "unsupported XCLK rate %u Hz\n", - imx678->xclk_freq); + starvis2->xclk_freq); =20 - for (i =3D 0; i < ARRAY_SIZE(imx678_supply_name); i++) - imx678->supplies[i].supply =3D imx678_supply_name[i]; + for (i =3D 0; i < ARRAY_SIZE(starvis2_supply_name); i++) + starvis2->supplies[i].supply =3D starvis2_supply_name[i]; =20 ret =3D devm_regulator_bulk_get(&client->dev, - ARRAY_SIZE(imx678_supply_name), - imx678->supplies); + ARRAY_SIZE(starvis2_supply_name), + starvis2->supplies); if (ret) return dev_err_probe(dev, ret, "failed to get regulators\n"); =20 - imx678->reset_gpio =3D devm_gpiod_get_optional(dev, "reset", - GPIOD_OUT_HIGH); - if (IS_ERR(imx678->reset_gpio)) - return dev_err_probe(dev, PTR_ERR(imx678->reset_gpio), + starvis2->reset_gpio =3D devm_gpiod_get_optional(dev, "reset", + GPIOD_OUT_HIGH); + if (IS_ERR(starvis2->reset_gpio)) + return dev_err_probe(dev, PTR_ERR(starvis2->reset_gpio), "failed to get reset GPIO\n"); =20 - ret =3D imx678_power_on(dev); + ret =3D starvis2_power_on(dev); if (ret) return ret; =20 - ret =3D imx678_identify_model(imx678); + ret =3D starvis2_identify_model(starvis2); if (ret) goto error_power_off; =20 pm_runtime_set_active(dev); pm_runtime_enable(dev); =20 - ret =3D imx678_init_controls(imx678); + ret =3D starvis2_init_controls(starvis2); if (ret) goto error_pm_runtime; =20 - imx678->sd.internal_ops =3D &imx678_internal_ops; - imx678->sd.flags |=3D V4L2_SUBDEV_FL_HAS_DEVNODE; - imx678->sd.entity.function =3D MEDIA_ENT_F_CAM_SENSOR; + starvis2->sd.internal_ops =3D &starvis2_internal_ops; + starvis2->sd.flags |=3D V4L2_SUBDEV_FL_HAS_DEVNODE; + starvis2->sd.entity.function =3D MEDIA_ENT_F_CAM_SENSOR; =20 - imx678->pad.flags =3D MEDIA_PAD_FL_SOURCE; + starvis2->pad.flags =3D MEDIA_PAD_FL_SOURCE; =20 - ret =3D media_entity_pads_init(&imx678->sd.entity, 1, &imx678->pad); + ret =3D media_entity_pads_init(&starvis2->sd.entity, 1, &starvis2->pad); if (ret) { dev_err_probe(dev, ret, "failed to init entity pads\n"); goto error_handler_free; } =20 - imx678->sd.state_lock =3D imx678->ctrl_handler.lock; - ret =3D v4l2_subdev_init_finalize(&imx678->sd); + starvis2->sd.state_lock =3D starvis2->ctrl_handler.lock; + ret =3D v4l2_subdev_init_finalize(&starvis2->sd); if (ret < 0) { dev_err_probe(dev, ret, "subdev init error\n"); goto error_media_entity; } =20 - ret =3D v4l2_async_register_subdev_sensor(&imx678->sd); + ret =3D v4l2_async_register_subdev_sensor(&starvis2->sd); if (ret < 0) { dev_err_probe(dev, ret, "failed to register sensor sub-device\n"); @@ -1380,45 +1407,45 @@ static int imx678_probe(struct i2c_client *client) return 0; =20 error_subdev_cleanup: - v4l2_subdev_cleanup(&imx678->sd); + v4l2_subdev_cleanup(&starvis2->sd); =20 error_media_entity: - media_entity_cleanup(&imx678->sd.entity); + media_entity_cleanup(&starvis2->sd.entity); =20 error_handler_free: - v4l2_ctrl_handler_free(imx678->sd.ctrl_handler); + v4l2_ctrl_handler_free(starvis2->sd.ctrl_handler); =20 error_pm_runtime: pm_runtime_disable(&client->dev); pm_runtime_set_suspended(&client->dev); =20 error_power_off: - imx678_power_off(&client->dev); + starvis2_power_off(&client->dev); =20 return ret; } =20 -static void imx678_remove(struct i2c_client *client) +static void starvis2_remove(struct i2c_client *client) { struct v4l2_subdev *sd =3D i2c_get_clientdata(client); - struct imx678 *imx678 =3D to_imx678(sd); + struct starvis2 *starvis2 =3D to_starvis2(sd); =20 v4l2_async_unregister_subdev(sd); v4l2_subdev_cleanup(sd); media_entity_cleanup(&sd->entity); - v4l2_ctrl_handler_free(imx678->sd.ctrl_handler); + v4l2_ctrl_handler_free(starvis2->sd.ctrl_handler); =20 pm_runtime_disable(&client->dev); if (!pm_runtime_status_suspended(&client->dev)) - imx678_power_off(&client->dev); + starvis2_power_off(&client->dev); pm_runtime_set_suspended(&client->dev); } =20 -static const struct dev_pm_ops imx678_pm_ops =3D { - SET_RUNTIME_PM_OPS(imx678_power_off, imx678_power_on, NULL) +static const struct dev_pm_ops starvis2_pm_ops =3D { + SET_RUNTIME_PM_OPS(starvis2_power_off, starvis2_power_on, NULL) }; =20 -static const struct of_device_id imx678_of_match[] =3D { +static const struct of_device_id starvis2_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 */ @@ -1426,22 +1453,22 @@ static const struct of_device_id imx678_of_match[] = =3D { { /* sentinel */ } }; =20 -MODULE_DEVICE_TABLE(of, imx678_of_match); +MODULE_DEVICE_TABLE(of, starvis2_of_match); =20 -static struct i2c_driver imx678_i2c_driver =3D { +static struct i2c_driver starvis2_i2c_driver =3D { .driver =3D { - .name =3D "imx678", - .of_match_table =3D imx678_of_match, - .pm =3D pm_ptr(&imx678_pm_ops), + .name =3D "starvis2", + .of_match_table =3D starvis2_of_match, + .pm =3D pm_ptr(&starvis2_pm_ops), }, - .probe =3D imx678_probe, - .remove =3D imx678_remove, + .probe =3D starvis2_probe, + .remove =3D starvis2_remove, }; =20 -module_i2c_driver(imx678_i2c_driver); +module_i2c_driver(starvis2_i2c_driver); =20 MODULE_AUTHOR("Will Whang "); MODULE_AUTHOR("Tetsuya NOMURA "); MODULE_AUTHOR("Jai Luthra "); -MODULE_DESCRIPTION("Sony imx678 sensor driver"); +MODULE_DESCRIPTION("Sony Starvis 2 sensor driver"); MODULE_LICENSE("GPL"); --=20 2.34.1 From nobody Fri Oct 23 22:12:51 2026 Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 85509542EEA for ; Thu, 15 Oct 2026 15:57:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079874; cv=none; b=ZnKjq8s0rtr1q1Ko1LOCylr42yf5rvLJIHn4kMy35VNPSNRjm368VH+AUPh+4B7iIlSyMRsmbRJs7rRTIuTIKWCfhc4hFhto9MxJgw7Ko2BwLxqnxv9Wax5bqVWbMR/zjNAoEigaa/rwJVsAeta+JCCzJ6iuP8RUuqVbmGpF2S0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079874; c=relaxed/simple; bh=zKSuXRI8aMna5pQ3QoL4QnTlDfII69cLtILjo3bnSvs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cu06TQ1YHAXW3UQChW3jXWdXBuYH41voHjlyROp1UDxE2wbUnFg1ZsQtZq5ZBIeIANZJE6iwIwO05CK8O6d304hMsCcMIolxfkNXx+EpUBbC5IX+dPSsJnwN3kMolp8IFH8Z8gnCUrZPIvG6r1JEFrTw/w4B6bQqe3HAk5oNDWE= 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=bdVv/nnT; arc=none smtp.client-ip=209.85.221.48 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="bdVv/nnT" Received: by mail-wr1-f48.google.com with SMTP id ffacd0b85a97d-48b0584ad71so3276748f8f.0 for ; Thu, 15 Oct 2026 08:57:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1792079858; x=1792684658; 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=w4qkq2Ot5KdEpoUe+1OGX5HpRdoidJ8DEnSvKe5Kbn0=; b=bdVv/nnT0TWRYBsu8qMDYMEMbhkUHp4+4SENDSp1jSD6BScBr4+OuOqbdwBz8eQmgp lW0Jn0vJZcFFMQQ9VhsA+Vwc9st6oFknMCDduXt+sZvs4FYSqPaGS5e5rypTdlR2cCG5 hlQtMn8cMlFGtA+LNmftZiwCzL8mk1xrAGbBIZwoF8Rg2A/ZEDnkUARfvJ5uU7wMTGoF uK5QcGIEgsccf9/VebidNitFzjNemMV/ZSYGXm/X+H1fSihMivWIoN12re9AGpOMDQcA AMLdrTybGfTWgOl7DqD9FOwumwGcFwnSZIwbKxKlzH6xzQ18nIMOBLpT915ixG8Qag6g UMpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792079858; x=1792684658; 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=w4qkq2Ot5KdEpoUe+1OGX5HpRdoidJ8DEnSvKe5Kbn0=; b=EhI/++iMwkgS2C0uNaRp7wEJ5vn1/8/CLVegBY/UufpTwNYMqPO9ctG1yUdOntO3qx z9s0cAZgLXXBu2psVMaL4FMIFtLFbN9EoUscggh5MmABAvjgLf/wuh5XM37JRo03A8q9 M3LUOFM9sR7++Qliee5+3rPKL1/umdaScox4Nisl0nRCx4uWQjzDE0MhjEGPPFTDeevZ FgW3XM1D4H8LcWNbujbrlyv7OByyxrwA/L4eicTBTxUtON6MJkJCJaH5llnUz2PeztNE PyG8caGfSn6FqPskAMpBXtoSdlqKMeEN5D8SJUuQ8oUC2QepiC9ITrJNzrb/GK1c/Sf5 meTw== X-Forwarded-Encrypted: i=1; AKwUvByGB/p3yAgE1tYl9EgONlb/eAErxmWdpsYOn1ydZXeRdv9tpDSW1bYaw8xWFquMdH7cgqyuJeSsEsMNgIs=@vger.kernel.org X-Gm-Message-State: AFq9FYKxDIl0z0lEQJUqzsyUWud53Yur1aDrXbLl0TQZxXryL0+MIEtJ REleNjq+HwYKnTkTxlw1nu5b9trb2gfhNRrlu6qgMa7F093NZaoT+L3Xef5yZ4h58GRcAJnyQjX tPGsZgMs= X-Gm-Gg: AYBFou2NGah1+Jdj4YtCfOke+PzOM0R8/EIfqILHlfTEVaPDAEOyHYdg3vjioHcLsJj DExLGytrYhoUoWvfmOG4yIGzZOfiThxPFi7Y4nZqgjl1zorHX8nlMGrGpX+H7h9c09wkYn1yOxu eVK8XrMr9/7PlS5/t3oKVyX9IUt3u7sLxv+bOc+4CLI0e5sGwco2cJsDLjf/5KoGGR91uqjWW7E YS3kM6B0d9W20JhxsIsONv+rEQwnv94mpeG1C5ZIlnCGoQj+e1BKRylp2qM08CneRKqBAZzL5Ql PSoU752yLKaZKXt39Q+CCBjVmIefGHT5qS1mJ+VBoXre1uX3wa1EDYLjhGAhGJ3aeCYPppxVgPz x4JwLh+oS8ZhvPMZOfN2vGpkmvH0QWvGZf0q8ezaipVTW8HycpeP9Z+ux+FfD3oIFSmtw40kqjV NOfjkNWpNpyuJCLrdh6rsMpdZIY8u39l9NPH4SVMSN4zAPSZWuCseWOU6dDYKbLFmPamsCm31jB x8Il4Qv7Cxr0bIiJZ7NnEjN0eHCqcgnbykKm23GmBtTFqe6kw== X-Received: by 2002:a05:600c:c113:b0:4a1:985b:83a9 with SMTP id 5b1f17b1804b1-4a1985b87f5mr234591235e9.4.1792079858432; Thu, 15 Oct 2026 08:57:38 -0700 (PDT) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-48de0aaaaebsm19877251f8f.14.2026.10.15.08.57.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Oct 2026 08:57:38 -0700 (PDT) From: Dave Stevenson Date: Thu, 15 Oct 2026 16:57:28 +0100 Subject: [PATCH v4 02/16] media: sony-starvis2: Reorder link frequencies to remove lookup 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: <20261015-media-starvis2-v4-2-75fcdb4163f3@raspberrypi.com> References: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> In-Reply-To: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> To: Sakari Ailus , Jai Luthra , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Laurent Pinchart , Alexander Shiyan , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Dave Stevenson X-Mailer: b4 0.14.1 link_freqs_reg_value is table that just reverses the order of the link frequency enum. Reverse the order of the link frequencies so that the table is redundant, and remove it. Signed-off-by: Dave Stevenson --- drivers/media/i2c/sony-starvis2.c | 31 ++++++++++--------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/drivers/media/i2c/sony-starvis2.c b/drivers/media/i2c/sony-sta= rvis2.c index b4733990d03a..3656658e18a4 100644 --- a/drivers/media/i2c/sony-starvis2.c +++ b/drivers/media/i2c/sony-starvis2.c @@ -186,25 +186,14 @@ enum starvis2_lanemode { =20 /* Link frequency setup (DDR: lane rate =3D 2 x link freq) */ enum { - STARVIS2_LINK_FREQ_297MHZ, - STARVIS2_LINK_FREQ_360MHZ, - STARVIS2_LINK_FREQ_445MHZ, - STARVIS2_LINK_FREQ_594MHZ, - STARVIS2_LINK_FREQ_720MHZ, - STARVIS2_LINK_FREQ_891MHZ, - STARVIS2_LINK_FREQ_1039MHZ, - STARVIS2_LINK_FREQ_1188MHZ, -}; - -static const u8 link_freqs_reg_value[] =3D { - [STARVIS2_LINK_FREQ_297MHZ] =3D 0x07, - [STARVIS2_LINK_FREQ_360MHZ] =3D 0x06, - [STARVIS2_LINK_FREQ_445MHZ] =3D 0x05, - [STARVIS2_LINK_FREQ_594MHZ] =3D 0x04, - [STARVIS2_LINK_FREQ_720MHZ] =3D 0x03, - [STARVIS2_LINK_FREQ_891MHZ] =3D 0x02, - [STARVIS2_LINK_FREQ_1039MHZ] =3D 0x01, - [STARVIS2_LINK_FREQ_1188MHZ] =3D 0x00, + STARVIS2_LINK_FREQ_1188MHZ =3D 0x00, + STARVIS2_LINK_FREQ_1039MHZ =3D 0x01, + STARVIS2_LINK_FREQ_891MHZ =3D 0x02, + STARVIS2_LINK_FREQ_720MHZ =3D 0x03, + STARVIS2_LINK_FREQ_594MHZ =3D 0x04, + STARVIS2_LINK_FREQ_445MHZ =3D 0x05, + STARVIS2_LINK_FREQ_360MHZ =3D 0x06, + STARVIS2_LINK_FREQ_297MHZ =3D 0x07, }; =20 static const u64 link_freqs[] =3D { @@ -913,7 +902,7 @@ static int starvis2_write_common(struct starvis2 *starv= is2) cci_write(starvis2->cci, STARVIS2_REG_INCK_SEL, starvis2->inck_sel_val, &ret); cci_write(starvis2->cci, STARVIS2_REG_DATARATE_SEL, - link_freqs_reg_value[__ffs(starvis2->link_freq_bitmap)], + __fls(starvis2->link_freq_bitmap), &ret); cci_write(starvis2->cci, STARVIS2_REG_LANEMODE, starvis2->lane_mode, &ret); @@ -1175,7 +1164,7 @@ static int starvis2_init_controls(struct starvis2 *st= arvis2) { struct v4l2_ctrl_handler *ctrl_hdlr; const u32 hmax_4lane =3D - min_hmax_4lane[__ffs(starvis2->link_freq_bitmap)]; + min_hmax_4lane[__fls(starvis2->link_freq_bitmap)]; const u32 lane_scale =3D starvis2->lane_mode =3D=3D STARVIS2_LANEMODE_2L ? 2 : 1; struct i2c_client *client =3D v4l2_get_subdevdata(&starvis2->sd); --=20 2.34.1 From nobody Fri Oct 23 22:12:51 2026 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 925623B19B3 for ; Thu, 15 Oct 2026 15:57:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079877; cv=none; b=U7NiBLO+ek5zCA6xdI1UZ6pF0E7WfUstuR4oMtIabl31IGqM5T99OwY0y+P5MlwV2U7vGzsojMOCA+HMvSo+KWWIvkfvRK5tFBTKDgiacXVlQYHQBsa244cO4ASbTRfq1+z/bB986cKiXizZPsD1wlb0tno1H4nCYdEnHZ88nF8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079877; c=relaxed/simple; bh=AbDp74FboY/m54pfNSPGHJTdkLesKVKCn+j165dfG4A=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Lq57RhG1J2wdU5WOMrStAQqM87JtVoxWM4GDNfyFM7TLxDCMbIOHb54wPKhXJBrum6mGSdZopuqjgoqEjhOoJTvh4u/uEt23Em2avEle0t3m8TJmvheSzmhYPAtbJl73bm4NVzOwoyE274E2ecq4Az+A57vlTlBWxZ5PKsg66os= 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=KUcJexIu; arc=none smtp.client-ip=209.85.128.41 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="KUcJexIu" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-4a19cba5c14so49772865e9.3 for ; Thu, 15 Oct 2026 08:57:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1792079859; x=1792684659; 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=qFRbQJjUmlnKmha/sV3VtEHUk/rjFLEESBDTOweph9M=; b=KUcJexIuP0X1spU5BTCIdLySxpGmyypeRaamvko0s2lMuCQod7lr8A3VFZ9pdUOdLu TY6hrEYMEMbOEoCQRMT+2AVVaZqxMQj3dgAIPGj0LKPGJQZtW+nhW0N/PhKAddvNN0p0 VzMjOf0gXS/WHhpkoDzi/YOQ/TbIMrXCjdE1JnbUwNt556Qjj6XTRCv1uvTRXaOFvfgr EbXytLLtLMz3ZXN1SSDBZaQIfoDpFRKZtSmDgfkjloQbupKTyETbML3lMMo8Q7ONW/qx 7MqWzbH8+xkk3Myvk+fVgh5ZqCXMKLDLaeUJD4Gc1jeKkAAMSnU+rEZsuo4LDay6tsk4 W/Ew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792079859; x=1792684659; 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=qFRbQJjUmlnKmha/sV3VtEHUk/rjFLEESBDTOweph9M=; b=l4vhKwMjf/NVdqIstwz7LkVgYbZT7LO+sLJII+02L/YCt9qAhwLQ7PPwbwKXoNrPIn MkXjt9U//DC5RkikzuOlPQoAhq0PBCOWrma9BoxDsDuQLGUD1xMsyPkfg7gyfDvxuyPp KlI2j2XFY00Ayon7QRa6LDwTP+4ecPGRLC+vimgx2UOvEeFW0V0afSz49HMecVmWPKQ9 jBMXd6gl/qYz7LuY/RXc4/308cx/N+ex2GSJZIY4wjqMZynbaNMUnIOdDp7PfmZBBsu4 wl0u8jKMIb9OcDNEYPdiYJVtQnfaPDTA5ztHKxCG4OBLrjiHEXYNAWTsf3KBHYSXGYwK S8TQ== X-Forwarded-Encrypted: i=1; AKwUvBxgqyTEGgMmAzk7LNeeltzJYNWA7GloQyGy+6dMMUA0ujX4N0qv9oTGYwpveyv91Gsq77dtTDrqseGs2wU=@vger.kernel.org X-Gm-Message-State: AFq9FYJbBmvV2gR3UEffdq2YdRCR/YJdlgV0rXih4HdnksIeBvxTdFWN E+CbA8H3xrdnZv8K6HP2FDWeMC21n2V8rsMt9lTD7LtrMbPHEHLZlBXRvLcFQSz91+w= X-Gm-Gg: AYBFou1hULBd8hZkbYaUod7LdrvdSdfwoHFuoWP6CXSdGEGNbjpc578fEMqA/HJApRU YkP8asJvNr/vLdrvkTcVYy2hBuq7VCFBX+HB4OSGiqcok5+AJw3Cm0CRgyvYU+cIqipdanFiLCZ qYEo0v0oSVe/ACmkUt8G4H3UjbJk3pZjFZ2XKCZ/STMdMCpqtI/W6AkuYdksV+XlR77q2dM2MTD X0GBzmHcFKoyTCjwpuM7a9FZ9WItReSHSMQ816Y4AeibgadD3IUUrRdBP81lgYf36I1dAUttzoF YL8SioM9GdX9J+0HQ7Hfj7kc7CyImMn7/RlGkGp02JQsR06qAHrUJ8+2CTVSf+1aXvhg8iqOeEw nbBQfor1WMWicieiWI8Y0W5YmX1NxJZAbPemrlNy+YHCHKWBiPmUivs4yF8GYrVUDcXJlqhDVU2 c0GIzvHDjAAaTtRK2OQhvtMaVsanrVHVXnIRiVhjzkmOAm+yr2SuB9/BbFI0m9yf0GOP7RCDHp7 PoTBOL7UoddcfJU834T97ApUPFbqkThPfUNavWcLbzHMr8q2w== X-Received: by 2002:a05:600c:1c21:b0:49c:cee0:f383 with SMTP id 5b1f17b1804b1-4a18e4b6241mr469180905e9.16.1792079859303; Thu, 15 Oct 2026 08:57:39 -0700 (PDT) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-48de0aaaaebsm19877251f8f.14.2026.10.15.08.57.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Oct 2026 08:57:38 -0700 (PDT) From: Dave Stevenson Date: Thu, 15 Oct 2026 16:57:29 +0100 Subject: [PATCH v4 03/16] media: sony-starvis2: 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: <20261015-media-starvis2-v4-3-75fcdb4163f3@raspberrypi.com> References: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> In-Reply-To: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> To: Sakari Ailus , Jai Luthra , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Laurent Pinchart , Alexander Shiyan , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@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 possibility that the active area was incorrect and not reading out the area expected. Switch to always requesting window mode to avoid this potential mismatch. Signed-off-by: Dave Stevenson --- drivers/media/i2c/sony-starvis2.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/media/i2c/sony-starvis2.c b/drivers/media/i2c/sony-sta= rvis2.c index 3656658e18a4..c4f590c489d9 100644 --- a/drivers/media/i2c/sony-starvis2.c +++ b/drivers/media/i2c/sony-starvis2.c @@ -921,9 +921,7 @@ static int starvis2_program_window(struct starvis2 *sta= rvis2, int ret =3D 0; =20 cci_write(starvis2->cci, STARVIS2_REG_ADDMODE, 0x00, &ret); - cci_write(starvis2->cci, STARVIS2_REG_WINMODE, - v4l2_rect_equal(crop, &imx678_active_area) ? 0x00 : 0x04, - &ret); + cci_write(starvis2->cci, STARVIS2_REG_WINMODE, 0x04, &ret); cci_write(starvis2->cci, STARVIS2_REG_PIX_HST, crop->left - imx678_active_area.left, &ret); cci_write(starvis2->cci, STARVIS2_REG_PIX_HWIDTH, crop->width, &ret); --=20 2.34.1 From nobody Fri Oct 23 22:12:51 2026 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4C2B94BD352 for ; Thu, 15 Oct 2026 15:57:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079880; cv=none; b=iydq+YQCKZkK17n/i2cB8Gww9mUzgPM8cJa1UEs7ZsYkYrB1wN3E+pf9jm4dyEOaesRw7UXGIaH3ZPxae86m+dQNIFNIOjIwjXOd4G7/zAfVsX2vHzrNN2VPwQn/9jA0iF8AceDGfFI/WuidI6OcdeXToJbiG7xeTJWbbDj5e+w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079880; c=relaxed/simple; bh=xlz1aJcQsxI1RxGKjx4OjpXjyfXcbEun6a8tB/jVeY4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kBLVWGK8rZKh0L7MRJ7HEVugEG+b17lDbRlEn9O1Qea8/LMp2nVMJqAki7ANEimjTTRCj344vatkHTbQs2ALSBe8HODVCwzA42Yy7LNk6cuJQBZfsvv3nufnKevk/KnJc1DoqysVJpabMVsO5nk8az6pSs+rAy6Wtjv1MKSB/hY= 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=dOwwdxjp; arc=none smtp.client-ip=209.85.128.44 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="dOwwdxjp" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-4a16bc2278aso39280745e9.1 for ; Thu, 15 Oct 2026 08:57:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1792079860; x=1792684660; 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=fOE2xdskRnH67zUZ+zBRnUdIyES9sMUlXt4ERLvpFy4=; b=dOwwdxjpUjeUqqu/tFdsCcRfPNKEnVGOe/s/kOGwH6OmiltfdoA2KIZZghpSx9QqEv z/rhvBjgYa5MWFIAysrdB3XubX09Fr8lNiMxk4hCcp+cA8rGOpUyubBTIxR8QrNHk3t+ AswhivxIk1GrCHfcAePYFXCZkyzGXfqkKyoQPsHvCN2cwTC7mMYpy+MnrCsa+NadN365 tH9h1S38emeg1ilFZIwHQNWD/ktKE4310s8UPyIfZAJypQbR/+D+iIvfbivgGZAppE3B BRxk+JRLAjmytxLA2+Nf2Kf6aOdSsgZioiJvYd24akU63drI94a5LKB0znfS3HMg5bdM vv/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792079860; x=1792684660; 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=fOE2xdskRnH67zUZ+zBRnUdIyES9sMUlXt4ERLvpFy4=; b=XPhA/FegLwhRH2LtnP833eW9kpEFmF+R1d/4HD/g/L4XQ07gUudNClslqMEDhDzVW/ U654nKi/xQp5KYnXUV5brrRG/9o/ZJ9wlyPvN5VPpk0SHCIOvehL/ZMONTtXtfTUZ5Jv X6vptaqyVltRbUIJJlDmzQ85zy90SZ2JmkMeD4ue0i+Ojx/DqxqdeRRQdTQ3fA5U6Cn/ xQyG1qIqdFkPwKW+4JB5nO/y2adYT0T8gnOhrtP0OntMYjYAhXDKcRylK6WpzABZ5xBM 4Ds05U82VRlGYFX7oksnbT2Q99aS2xjGjamh5arxQOd506hxzuQi/pFZ2TYo2htl6Vmr ViSQ== X-Forwarded-Encrypted: i=1; AKwUvBw8a3abFBEbD8h2stWWotTxolIbfT2up0lhCObIdzL3MMeL0QC1jxQritYRfJ791/wW5aDQyfx838BLsmE=@vger.kernel.org X-Gm-Message-State: AFq9FYLsvU8/SJnxfATm/ObOYScSUzOJdhje8tUKxtU90mn8ao9OCXqV plQSg60OOTkJc8WdAq8/7+9z01n+xVYxtEMashovQ5CB+ViR9pAYAiR6TmApffE3K0te0npyFxE gDfb4Uew= X-Gm-Gg: AYBFou0Fw5OFR2KqIbDLjto8LTBG8My3W2RDvRywVPX1x0BVYI/hMM21zCee5He/FRd uO3/k5ZuzsSFFw6F8Tg+aYk0tmjwaopmEv4kGq8BRRblS64sMGrZ7JikxgIejzg2t8pCcqL0Yi5 U0+kSzX7VjZr+ScutfyZJS2OsZJkHkfvONS7yvWqVjCC0vJXH+kKtyBniD6dppocobHowIMuy8w SH5R3a+70Hf+3L7M5tSPPGhDMwLYN6gzCKIXRuZlB5G5ldk8UB9vsxwYtgvAKt+lrFaYBCV51EX ZMvFPNpy65ypyauv3ulHiJ/3MuZlKGIgjHFfqoi6bfjK50UhyFBDyqLb7KDb/aD0NrJN2CqZ7As QIisWp8agSt9Ow9LvDNsSQ/MBgV11deXdOiNyBVA7p3ypnzR06QS5KhSIVpRFiesACDWcYnSDiE 9xurXpexUR1rM8aygkkRT44c7AKbiHf0qyhIpx7mCQLPGNE2eWgSx1pewPcHpspRl55AzrkXk6J lbkIprGYOWdLjy+rqvkRwvZvpSJTmh8I7j0618ozBbsv5mXkAQ0Dul4snfR X-Received: by 2002:a05:600c:4fc1:b0:49d:2536:402e with SMTP id 5b1f17b1804b1-4a19a9cf1e6mr285884815e9.30.1792079860138; Thu, 15 Oct 2026 08:57:40 -0700 (PDT) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-48de0aaaaebsm19877251f8f.14.2026.10.15.08.57.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Oct 2026 08:57:39 -0700 (PDT) From: Dave Stevenson Date: Thu, 15 Oct 2026 16:57:30 +0100 Subject: [PATCH v4 04/16] media: sony-starvis2: 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: <20261015-media-starvis2-v4-4-75fcdb4163f3@raspberrypi.com> References: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> In-Reply-To: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> To: Sakari Ailus , Jai Luthra , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Laurent Pinchart , Alexander Shiyan , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@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/sony-starvis2.c | 170 ++++++++++++++++++++++++----------= ---- 1 file changed, 109 insertions(+), 61 deletions(-) diff --git a/drivers/media/i2c/sony-starvis2.c b/drivers/media/i2c/sony-sta= rvis2.c index c4f590c489d9..189caac78066 100644 --- a/drivers/media/i2c/sony-starvis2.c +++ b/drivers/media/i2c/sony-starvis2.c @@ -51,17 +51,9 @@ /* Lane Count */ #define STARVIS2_REG_LANEMODE CCI_REG8(0x3040) =20 -/* - * The internal readout clock runs at 74.25 MHz. In one cycle the AD reads= 8 - * pixels, thus giving us a rate of 74.25 * 8 =3D 594 MPix/s - */ -#define IMX678_PIXEL_RATE 594000000 -#define IMX678_PIX_PER_CLK 8 - /* VMAX - Frame Length in Lines */ #define STARVIS2_REG_VMAX CCI_REG24_LE(0x3028) #define STARVIS2_VMAX_MAX 0xfffff -#define IMX678_VMAX_DEFAULT 2250 =20 /* HMAX - Line Length in Cycles (8 Pixels) */ #define STARVIS2_REG_HMAX CCI_REG16_LE(0x302c) @@ -102,8 +94,6 @@ /* Sensor Identification */ #define STARVIS2_REG_MONOCHROME CCI_REG8(0x4d18) #define STARVIS2_TYPE BIT(0) -#define IMX678_REG_MODULE_ID CCI_REG16_LE(0x4d1c) -#define IMX678_ID 0x02a6 #define STARVIS2_MODULE_ID_DELAY 80000 =20 /* Common configuration registers */ @@ -153,32 +143,11 @@ /* Subdev pads */ #define STARVIS2_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 starvis2_type { STARVIS2_COLOR =3D 0, STARVIS2_MONOCHROME =3D 1, }; =20 -struct starvis2_model_info { - enum starvis2_type type; - const u32 *codes; - unsigned int num_codes; -}; - enum starvis2_lanemode { STARVIS2_LANEMODE_2L =3D 1, STARVIS2_LANEMODE_4L =3D 3, @@ -207,7 +176,7 @@ static const u64 link_freqs[] =3D { [STARVIS2_LINK_FREQ_1188MHZ] =3D 1188000000, }; =20 -static const u16 min_hmax_4lane[] =3D { +static const u16 imx678_min_hmax_4lane[] =3D { [STARVIS2_LINK_FREQ_297MHZ] =3D 1584, [STARVIS2_LINK_FREQ_360MHZ] =3D 1320, [STARVIS2_LINK_FREQ_445MHZ] =3D 1100, @@ -267,7 +236,7 @@ static const int starvis2_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 { { STARVIS2_REG_THIN_V_EN, 0x00 }, { STARVIS2_REG_VCMODE, 0x01 }, { CCI_REG8(0x306b), 0x00 }, @@ -650,16 +619,74 @@ static const u32 codes_monochrome[] =3D { MEDIA_BUS_FMT_Y12_1X12, }; =20 +struct starvis2_variant { + const char *name; + u32 id_reg; + u32 id_mask; + 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; +}; + +static const struct starvis2_variant imx678_variant_def =3D { + .name =3D "imx678", + .id_reg =3D CCI_REG16_LE(0x4d1c), + .id_mask =3D 0x3ff, + .id_value =3D 0x2a6, + .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 594000000, + .pix_per_clk =3D 8, + .common_regs =3D imx678_common_regs, + .num_common_regs =3D ARRAY_SIZE(imx678_common_regs), + .vmax_default =3D 2250, + .hmax_min =3D imx678_min_hmax_4lane, +}; + +struct starvis2_model_info { + enum starvis2_type type; + const u32 *codes; + unsigned int num_codes; + const struct starvis2_variant *variant; + + const struct starvis2_model_info *auto_detect_colour; + const struct starvis2_model_info *auto_detect_mono; +}; + static const struct starvis2_model_info imx678_aaqr_info =3D { .type =3D STARVIS2_COLOR, .codes =3D codes_bayer, .num_codes =3D ARRAY_SIZE(codes_bayer), + .variant =3D &imx678_variant_def, }; =20 static const struct starvis2_model_info imx678_aamr_info =3D { .type =3D STARVIS2_MONOCHROME, .codes =3D codes_monochrome, .num_codes =3D ARRAY_SIZE(codes_monochrome), + .variant =3D &imx678_variant_def, +}; + +static const struct starvis2_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 starvis2_supply_name[] =3D { @@ -674,6 +701,7 @@ struct starvis2 { struct regmap *cci; =20 const struct starvis2_model_info *info; + const struct starvis2_variant *variant; =20 struct clk *xclk; u32 xclk_freq; @@ -770,7 +798,8 @@ static int starvis2_set_ctrl(struct v4l2_ctrl *ctrl) cci_write(starvis2->cci, STARVIS2_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) / + starvis2->variant->pix_per_clk; =20 cci_write(starvis2->cci, STARVIS2_REG_HMAX, hmax, &ret); break; @@ -851,18 +880,20 @@ static int starvis2_get_selection(struct v4l2_subdev = *sd, struct v4l2_subdev_state *sd_state, struct v4l2_subdev_selection *sel) { + struct starvis2 *starvis2 =3D to_starvis2(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 starvis2->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 starvis2->variant->active_area; return 0; } =20 @@ -877,12 +908,12 @@ static int starvis2_init_state(struct v4l2_subdev *sd, struct v4l2_rect *crop; =20 crop =3D v4l2_subdev_state_get_crop(state, STARVIS2_SOURCE_PAD); - *crop =3D imx678_active_area; + *crop =3D starvis2->variant->active_area; =20 format =3D v4l2_subdev_state_get_format(state, STARVIS2_SOURCE_PAD); format->code =3D starvis2_default_mbus_code(starvis2); - format->width =3D imx678_active_area.width; - format->height =3D imx678_active_area.height; + format->width =3D starvis2->variant->active_area.width; + format->height =3D starvis2->variant->active_area.height; format->field =3D V4L2_FIELD_NONE; format->colorspace =3D V4L2_COLORSPACE_RAW; format->ycbcr_enc =3D V4L2_YCBCR_ENC_DEFAULT; @@ -896,8 +927,12 @@ static int starvis2_write_common(struct starvis2 *star= vis2) { int ret =3D 0; =20 - cci_multi_reg_write(starvis2->cci, common_regs, ARRAY_SIZE(common_regs), - &ret); + if (!starvis2->variant) + /* Powered on during probe to do detection. Variant unknown. */ + return 0; + + cci_multi_reg_write(starvis2->cci, starvis2->variant->common_regs, + starvis2->variant->num_common_regs, &ret); =20 cci_write(starvis2->cci, STARVIS2_REG_INCK_SEL, starvis2->inck_sel_val, &ret); @@ -923,10 +958,10 @@ static int starvis2_program_window(struct starvis2 *s= tarvis2, cci_write(starvis2->cci, STARVIS2_REG_ADDMODE, 0x00, &ret); cci_write(starvis2->cci, STARVIS2_REG_WINMODE, 0x04, &ret); cci_write(starvis2->cci, STARVIS2_REG_PIX_HST, - crop->left - imx678_active_area.left, &ret); + crop->left - starvis2->variant->active_area.left, &ret); cci_write(starvis2->cci, STARVIS2_REG_PIX_HWIDTH, crop->width, &ret); cci_write(starvis2->cci, STARVIS2_REG_PIX_VST, - crop->top - imx678_active_area.top, &ret); + crop->top - starvis2->variant->active_area.top, &ret); cci_write(starvis2->cci, STARVIS2_REG_PIX_VWIDTH, crop->height, &ret); cci_write(starvis2->cci, STARVIS2_REG_ADBIT, 0x01, &ret); =20 @@ -1080,11 +1115,16 @@ static int starvis2_identify_model(struct starvis2 = *starvis2) { struct i2c_client *client =3D v4l2_get_subdevdata(&starvis2->sd); const struct starvis2_model_info *info; + const struct starvis2_variant *variant; enum starvis2_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 @@ -1093,7 +1133,7 @@ static int starvis2_identify_model(struct starvis2 *s= tarvis2) cci_write(starvis2->cci, STARVIS2_REG_MODE_SELECT, 0, &ret); fsleep(STARVIS2_MODULE_ID_DELAY); =20 - cci_read(starvis2->cci, IMX678_REG_MODULE_ID, &val, &ret); + cci_read(starvis2->cci, variant->id_reg, &val, &ret); =20 if (ret) { dev_err(&client->dev, @@ -1101,9 +1141,10 @@ static int starvis2_identify_model(struct starvis2 *= starvis2) return ret; } =20 - if (val !=3D IMX678_ID) { - dev_err(&client->dev, - "Chip ID mismatch: %x!=3D%llx\n", IMX678_ID, val); + val &=3D variant->id_mask; + if (val !=3D variant->id_value) { + dev_err(&client->dev, "Chip ID mismatch: %x!=3D%llx\n", + variant->id_value, val); return -ENXIO; } =20 @@ -1118,7 +1159,7 @@ static int starvis2_identify_model(struct starvis2 *s= tarvis2) detected =3D val & STARVIS2_TYPE; =20 /* Prefer to use sensor type specified in device tree */ - if (info) { + if (info->codes) { starvis2->info =3D info; if (detected !=3D info->type) dev_err(&client->dev, @@ -1127,11 +1168,12 @@ static int starvis2_identify_model(struct starvis2 = *starvis2) info->type =3D=3D STARVIS2_COLOR ? "color" : "mono"); } else { starvis2->info =3D detected =3D=3D STARVIS2_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 STARVIS2_MONOCHROME ? "mono" : "color"); } + starvis2->variant =3D starvis2->info->variant; =20 return 0; } @@ -1162,7 +1204,7 @@ static int starvis2_init_controls(struct starvis2 *st= arvis2) { struct v4l2_ctrl_handler *ctrl_hdlr; const u32 hmax_4lane =3D - min_hmax_4lane[__fls(starvis2->link_freq_bitmap)]; + starvis2->variant->hmax_min[__fls(starvis2->link_freq_bitmap)]; const u32 lane_scale =3D starvis2->lane_mode =3D=3D STARVIS2_LANEMODE_2L ? 2 : 1; struct i2c_client *client =3D v4l2_get_subdevdata(&starvis2->sd); @@ -1181,13 +1223,14 @@ static int starvis2_init_controls(struct starvis2 *= starvis2) if (ret) return ret; =20 - starvis2->vmax =3D IMX678_VMAX_DEFAULT; + starvis2->vmax =3D starvis2->variant->vmax_default; hmax =3D hmax_4lane * lane_scale; =20 /* PIXEL_RATE is fixed and read-only */ v4l2_ctrl_new_std(ctrl_hdlr, &starvis2_ctrl_ops, V4L2_CID_PIXEL_RATE, - IMX678_PIXEL_RATE, IMX678_PIXEL_RATE, 1, - IMX678_PIXEL_RATE); + starvis2->variant->pixel_rate, + starvis2->variant->pixel_rate, 1, + starvis2->variant->pixel_rate); =20 /* LINK_FREQ is also read only */ link_freq =3D v4l2_ctrl_new_int_menu(ctrl_hdlr, &starvis2_ctrl_ops, @@ -1199,23 +1242,25 @@ static int starvis2_init_controls(struct starvis2 *= starvis2) if (link_freq) link_freq->flags |=3D V4L2_CTRL_FLAG_READ_ONLY; =20 - vblank =3D starvis2->vmax - imx678_active_area.height; - max_vblank =3D STARVIS2_VMAX_MAX - imx678_active_area.height; + vblank =3D starvis2->vmax - starvis2->variant->active_area.height; + max_vblank =3D STARVIS2_VMAX_MAX - starvis2->variant->active_area.height; starvis2->vblank =3D v4l2_ctrl_new_std(ctrl_hdlr, &starvis2_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 STARVIS2_HMAX_MAX * IMX678_PIX_PER_CLK - - imx678_active_area.width; + hblank =3D hmax * starvis2->variant->pix_per_clk - + starvis2->variant->active_area.width; + max_hblank =3D STARVIS2_HMAX_MAX * starvis2->variant->pix_per_clk - + starvis2->variant->active_area.width; starvis2->hblank =3D v4l2_ctrl_new_std(ctrl_hdlr, &starvis2_ctrl_ops, V4L2_CID_HBLANK, hblank, max_hblank, - IMX678_PIX_PER_CLK, hblank); + starvis2->variant->pix_per_clk, + hblank); =20 starvis2->exposure =3D v4l2_ctrl_new_std(ctrl_hdlr, &starvis2_ctrl_ops, V4L2_CID_EXPOSURE, STARVIS2_EXPOSURE_MIN, - IMX678_VMAX_DEFAULT - + starvis2->variant->vmax_default - STARVIS2_SHR_MIN, STARVIS2_EXPOSURE_STEP, STARVIS2_EXPOSURE_DEFAULT); @@ -1356,6 +1401,9 @@ static int starvis2_probe(struct i2c_client *client) if (ret) goto error_power_off; =20 + v4l2_i2c_subdev_set_name(&starvis2->sd, client, starvis2->variant->name, + NULL); + pm_runtime_set_active(dev); pm_runtime_enable(dev); =20 @@ -1436,7 +1484,7 @@ static const struct of_device_id starvis2_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 Fri Oct 23 22:12:51 2026 Received: from mail-wr1-f50.google.com (mail-wr1-f50.google.com [209.85.221.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 28C0D3D3D09 for ; Thu, 15 Oct 2026 15:57:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079882; cv=none; b=MAPb6HiYdawppxIa5sNpe6gwlxMi4XtCO0L+3PZpCwMfcS8io1uIZYXhZkAmKfVBljoC1v6nr3E6B5/w5YoS7hbPj3Vtw23Vj1H2Yzn3e7jECLJy62tDEXIAhuK6VGqSG85QBmeWKX2iihecDOOpsTM8AsqhEkWUn4k9a7ktLrc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079882; c=relaxed/simple; bh=eoAGtS5XufptMdU0CaNJ2RLnJ3OeUveINEeLfNUGNhQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WSJ2wWfdMt/g8o2o2I0ikbA2o37F5RTHW1Z+DenOGJzn7VQDL5GQGi3xFR4KNTVMyGZlj/jmEFCUm9Y9coslBtm4F4Wr/4qqeW93GiI5JwivEfQjDmfzaIln+LrT1T4UdxS2w2IQjkBZdpFVzAGKx8NgOLkaaxvST0TfGvIgtiM= 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=oHLneqUv; arc=none smtp.client-ip=209.85.221.50 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="oHLneqUv" Received: by mail-wr1-f50.google.com with SMTP id ffacd0b85a97d-48b0d19cf7eso96353f8f.1 for ; Thu, 15 Oct 2026 08:57:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1792079861; x=1792684661; 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=GS5ZrpkB0RsyL8XlpuODb/jKxfXfcHSKNBqSqEyqBwU=; b=oHLneqUvgFcAAVJYnGOPYU+8LqW5kh4Ims4gj5H8w4dKvuPc8Attsleqg6tRsellfp 2RGqERUemPMW9Zr4FfCRcrQfe2/iztE+EiFTPeG3wkf49iR6SXTfv7UfFJ5+BRWsLuJH XA+iRFMjzXLIyANj8bmr9h5stGLMdW7Y+gAMhNOJLxqu43xGVFtJtFtAZAQhGpJvB78E pTPaiTSN8BR3M1JRpJoKZ3b0CeCZtt7WF08TkstWpv0vqpuVUyiny6pABYprQ4KlR1vp 9JdyMaypvTzdz5QpBD4h5b/IlQv9wH/qphmeLCBuLMZ3nPTTmFm34sGimPK9vR8VYRxx 7h+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792079861; x=1792684661; 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=GS5ZrpkB0RsyL8XlpuODb/jKxfXfcHSKNBqSqEyqBwU=; b=Ry2FhQnVGNa9dNofSaHL5YqynDcwEmuOa1ii1lJ3bZDmEE0Cr8jkbwJafq6AipbYlY hrnKqUxpyl3iNR5h/6DFH4y8U2gdBF5w05gfN7V/a1YAicaAeix7XCAICu/dyWiv2qW8 UJZZjFNoSOQDZyADVxrfO05e0NVWEs2usgMcaSmAV03omYPmQ4hmlSO+0YlboV+f8qtH T2A0LU98/bn8xuWoRxSp7zB+U+9VqgHX6gatoVMhjcADLBXgnn6BVhiQpduxsCbuMO/D O/mQi+xcnYhMyACdMo7qGk2Xg92Gq/7w/ArfgumOSwieJEydL0xmq/xbyAYJ+XyDsxKd 7Yhw== X-Forwarded-Encrypted: i=1; AKwUvBxtLsWe39hCAsfxA5LQVcjhHURbgtAxEe3QUXIfezaL6zTZ9tO4DEIrC8a9+AqOXLUM9yig0FRM4sG8sGo=@vger.kernel.org X-Gm-Message-State: AFq9FYLSCQ+xi2fXYuYArFCY4nh4Ndc4pSLPZ5Q41UX1pBFFa9jPvTnV qXMdr0yy+2Fut+uBUWpwRxiX2JZyGAi/JfF/n/qtOKIiws4OMja2xzA/5Cp3dYbkQIA= X-Gm-Gg: AYBFou2+q1wTGuQ9wL21XBeZtFHKSH+tFdLbpY14MqJI5Boa9cD1yz9VG3lIbFZJ5T+ VMAxwHeOkGrSjHPRpWUcsenvpt3L7bno9P5A994j++LMpTiXsi90PMDJcZHd4o32D2+u/DWwD2B ZVFDX0kwOxfbH7R2MqeoJg5DbI6Nu4qweGSzB4s4PZW903jAT/Hf1x5ChgZk0ymW80IIs47zv5S VO/VVZzGkQZDUqtQBxaJ69ImZjUhvg8U5aOYlZKiYE/0M9mkfpM7xbZfQQiu8YBuDZEn14bd/hE QetOodpVFolj4IgEJuRs8LAe8N0JR7Y0fjvWbr1G7raVt4RVfezHZTHSpy8GwlS4goRF87ppqEB 9NiP5conYMenCJuX2qND5UGae6HmdOGtgWJvrDfSYTX1aOCKpEg1LLWtWDQL/8NmOy6+MrP13ew SdasXFliPhbjBlacncJqWLqlWINSGZ1I26YIrs4GeEHVGt/3SijAhiKmnts6vtEiJ9zsfoiUDPj zK2t7W1RNOL9iJdK6RNCyjxxnS1eka//OkqJCA5OrLnma/fRg== X-Received: by 2002:a05:6000:26cc:b0:48d:fbd8:d598 with SMTP id ffacd0b85a97d-48dfbd8d5afmr390659f8f.17.1792079860981; Thu, 15 Oct 2026 08:57:40 -0700 (PDT) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-48de0aaaaebsm19877251f8f.14.2026.10.15.08.57.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Oct 2026 08:57:40 -0700 (PDT) From: Dave Stevenson Date: Thu, 15 Oct 2026 16:57:31 +0100 Subject: [PATCH v4 05/16] media: sony-starvis2: Rework 2 lane support for higher link freqs 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: <20261015-media-starvis2-v4-5-75fcdb4163f3@raspberrypi.com> References: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> In-Reply-To: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> To: Sakari Ailus , Jai Luthra , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Laurent Pinchart , Alexander Shiyan , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Dave Stevenson X-Mailer: b4 0.14.1 With some Starvis 2 sensors, the link frequency on 2 lanes is sufficient to achieve a lower line time than the 4 lane value divided by 2, as the 4 lane value hits the minimum that the pixel array can handle. That can't easily be handled with the way the values are currently stored. Storing the 2 lane hmax alongside the pixel array's minimum allows the 4 lane support to divide the value by 2, and then clip to the pixel array value as a minimum. Signed-off-by: Dave Stevenson --- drivers/media/i2c/sony-starvis2.c | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/drivers/media/i2c/sony-starvis2.c b/drivers/media/i2c/sony-sta= rvis2.c index 189caac78066..0edb0b4dd25f 100644 --- a/drivers/media/i2c/sony-starvis2.c +++ b/drivers/media/i2c/sony-starvis2.c @@ -176,15 +176,15 @@ static const u64 link_freqs[] =3D { [STARVIS2_LINK_FREQ_1188MHZ] =3D 1188000000, }; =20 -static const u16 imx678_min_hmax_4lane[] =3D { - [STARVIS2_LINK_FREQ_297MHZ] =3D 1584, - [STARVIS2_LINK_FREQ_360MHZ] =3D 1320, - [STARVIS2_LINK_FREQ_445MHZ] =3D 1100, - [STARVIS2_LINK_FREQ_594MHZ] =3D 792, - [STARVIS2_LINK_FREQ_720MHZ] =3D 660, - [STARVIS2_LINK_FREQ_891MHZ] =3D 550, - [STARVIS2_LINK_FREQ_1039MHZ] =3D 550, - [STARVIS2_LINK_FREQ_1188MHZ] =3D 550, +static const u16 imx678_min_hmax_2lane[] =3D { + [STARVIS2_LINK_FREQ_297MHZ] =3D 3168, + [STARVIS2_LINK_FREQ_360MHZ] =3D 2640, + [STARVIS2_LINK_FREQ_445MHZ] =3D 2200, + [STARVIS2_LINK_FREQ_594MHZ] =3D 1584, + [STARVIS2_LINK_FREQ_720MHZ] =3D 1320, + [STARVIS2_LINK_FREQ_891MHZ] =3D 1100, + [STARVIS2_LINK_FREQ_1039MHZ] =3D 1100, + [STARVIS2_LINK_FREQ_1188MHZ] =3D 1100, }; =20 struct starvis2_inck_cfg { @@ -631,7 +631,8 @@ struct starvis2_variant { const struct cci_reg_sequence *common_regs; unsigned int num_common_regs; unsigned int vmax_default; - const u16 *hmax_min; + const u16 *hmax_min_link_freq; + u16 hmax_min_pixel_array; }; =20 static const struct starvis2_variant imx678_variant_def =3D { @@ -656,7 +657,8 @@ static const struct starvis2_variant imx678_variant_def= =3D { .common_regs =3D imx678_common_regs, .num_common_regs =3D ARRAY_SIZE(imx678_common_regs), .vmax_default =3D 2250, - .hmax_min =3D imx678_min_hmax_4lane, + .hmax_min_link_freq =3D imx678_min_hmax_2lane, + .hmax_min_pixel_array =3D 550, }; =20 struct starvis2_model_info { @@ -1203,11 +1205,8 @@ static const struct v4l2_subdev_internal_ops starvis= 2_internal_ops =3D { static int starvis2_init_controls(struct starvis2 *starvis2) { struct v4l2_ctrl_handler *ctrl_hdlr; - const u32 hmax_4lane =3D - starvis2->variant->hmax_min[__fls(starvis2->link_freq_bitmap)]; - const u32 lane_scale =3D - starvis2->lane_mode =3D=3D STARVIS2_LANEMODE_2L ? 2 : 1; struct i2c_client *client =3D v4l2_get_subdevdata(&starvis2->sd); + const struct starvis2_variant *variant =3D starvis2->variant; struct v4l2_fwnode_device_properties props; struct v4l2_ctrl *link_freq; s32 hblank, max_hblank, vblank, max_vblank; @@ -1224,7 +1223,10 @@ static int starvis2_init_controls(struct starvis2 *s= tarvis2) return ret; =20 starvis2->vmax =3D starvis2->variant->vmax_default; - hmax =3D hmax_4lane * lane_scale; + + hmax =3D variant->hmax_min_link_freq[__fls(starvis2->link_freq_bitmap)]; + if (starvis2->lane_mode =3D=3D STARVIS2_LANEMODE_4L) + hmax =3D max(hmax >> 1, variant->hmax_min_pixel_array); =20 /* PIXEL_RATE is fixed and read-only */ v4l2_ctrl_new_std(ctrl_hdlr, &starvis2_ctrl_ops, V4L2_CID_PIXEL_RATE, --=20 2.34.1 From nobody Fri Oct 23 22:12:51 2026 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BD1B737BE7F for ; Thu, 15 Oct 2026 15:57:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079891; cv=none; b=rtQZVf6XZUma2rcJV2W6UE9X+RW4QGjXlaFPOdJhcSyIOMID9NK59WUcorWo4YMYcTbqJhJd9FtxlryNJlx+cUxMo/vLSutCoCl+38xvt3+fMXSEqXpeWA8pLlEXCZbajl4Jn87F8UrtG2Dcymxw3Uu8N+HOKmHdhsG3Y9EoC+Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079891; c=relaxed/simple; bh=4vyVMLpeAnOFH5/yuEKve2ynKiDTmbNx8gT71nEScyE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BTEGGzx6SMikIPyXl8l90x0lrBRESJ+wczH96oHoTVRxKkl5VK3U9SmWGK6nhO0PC0RTGZH3T/b9GhSu9EHvziBZYn8Z3MrA263UaJqyiyeUEgZoh9hPaeMs1cPRKl9mChHyn6qDeE3vLii/hE1Ga32jljCfcV+V+Uv1ff7Jm84= 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=kimBKrzO; arc=none smtp.client-ip=209.85.128.50 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="kimBKrzO" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-4a16af2a232so43290035e9.1 for ; Thu, 15 Oct 2026 08:57:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1792079862; x=1792684662; 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=bW6VTJYfPLvw/zFo7RnCcLbRhKbz99aJMOdQOJHcatU=; b=kimBKrzO72x6NK2U0mdFUupPrQOxQz5n3/SBzKLJ/n7SHlVzWlb1TKzakAak8DAx5a +fzCkSQM6J/P0bO0WpAsKVb8VZC2zIeHHC78y915XdQ10mFym1pD1n5AVXh00XFxrBG5 9HyAoe/gK50zgdjd/0mxFEvLcXWeN3y2nKrk51+E1lc+GudjfncXxhILiLbwRqyOOfco M9BWZjc91JxmTY1BSNfJuF8kxugtXhAmw7ZCH3CJa4jN9hL4MlvJrlZlbr/w884PFSY7 Kt+jO/GcqzXl4jr3AXBo4xKQUQoc77Vb4digIMHFY/qMSbLjUm9dSo1jrw3LN+jh5sQj fPTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792079862; x=1792684662; 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=bW6VTJYfPLvw/zFo7RnCcLbRhKbz99aJMOdQOJHcatU=; b=VF8J4Jf15aEUzicce2QuZWiO6b8UJN/SAcUIxsmZa6D/0tfK+jv2Cfzr5Is60m8prw jhwufhk32Gh0aM9ykxENqmRD0OYrhO1nvddu/uh/14hY7Ig5wHF8SkayaNp8Oj/R+ySx n4dfZErq6n91kPaa8iBWlp8pQMN6vLG5fvNiiHmQIHqRmOzzK9VuiyqTQ8jGZiWzxEjl 1TObYFUvREXqroaoiTo51g3FJJs7AnXJ1pBOO1MlM1YBbFGy2o0Cz1lPCQ/XwFDoWO74 8xm++AVDm6XCDReJ+PUonhduy/Nlv4OUs8Uiekd4BYxB/in4HVORK/Epc29X5wnbYK+l +5pQ== X-Forwarded-Encrypted: i=1; AKwUvBw08QafKWf6gF89daXkhR/MTkfEQwHFHn/JMmDNchFo1C8/NHcZH8cenpmauYXewQqiGurmg4a+LS3uTAw=@vger.kernel.org X-Gm-Message-State: AFq9FYKKcVsabJaonKN2l2D3ZIrnqKJCv4O1lQu9MXSMDF2sFxpf/+R6 T8lHsPkcFpOLNLYqZttu5qA2lwJ4GoZESerzpMNPddUeXeimx+QCZOBQjajX2S4BL2I= X-Gm-Gg: AYBFou011x4ouL2/0nETskAujaIxwpzsQEC8RwuWNM5RH7wMkspchoAME1G9VAT33Wv /awSVHIXt9m10d6UBfGOy8tQraRymeJgvUAp4Apx1iIUu1pLnBVUwmAXdP3ExGH7xLxAZdYZMIC kTnU1HkL1FomvOeJlSTdbza67Fb7GcA3bn46ZgOZIHcfu80umaAVhK3wqrEzKjnd0ouuBTgGQgG ZI1FZ4Y/hyebHcFqc1re79q9820hJoP+P420PrTUrSs8IqU920dBZP9F5KXawtwZjmJzSp9BQHq XxAIel00wAm9ZP4hfHeW0hAUfWZXVJ8qAySXriobh3RRM6REizCoDnjpIdCaEPiWfLXVM8w60wC C+hAjNwNRI664CejY68mecmTFPa8K/IWLfWEJH/Ahi89Bl9fl43c6MpqwQtmHpDLke+Afgv3lQc kmPTHlG9kL8Qn5vLqGeS18llERz4bshB3YUcgzPXua3w1QH2l6FeRWpx1++gc3z5P47QsHuIqwQ YNyrPkl+EQ8ISYC/+71Y0UNwwMRJyrhRAa99YKGzM8ws6NyaQ== X-Received: by 2002:a05:600c:83c7:b0:4a1:698d:3044 with SMTP id 5b1f17b1804b1-4a18e493020mr389328665e9.11.1792079861816; Thu, 15 Oct 2026 08:57:41 -0700 (PDT) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-48de0aaaaebsm19877251f8f.14.2026.10.15.08.57.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Oct 2026 08:57:41 -0700 (PDT) From: Dave Stevenson Date: Thu, 15 Oct 2026 16:57:32 +0100 Subject: [PATCH v4 06/16] media: sony-starvis2: Allow runtime control of link frequency 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: <20261015-media-starvis2-v4-6-75fcdb4163f3@raspberrypi.com> References: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> In-Reply-To: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> To: Sakari Ailus , Jai Luthra , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Laurent Pinchart , Alexander Shiyan , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Dave Stevenson X-Mailer: b4 0.14.1 DT allows configuration of multiple link frequencies. V4L2_CID_LINK_FREQ allows read write control. Join these up so that link frequency can be configured at run time, as long as the sensor isn't streaming. Signed-off-by: Dave Stevenson --- drivers/media/i2c/sony-starvis2.c | 75 ++++++++++++++++++++++++++++-------= ---- 1 file changed, 55 insertions(+), 20 deletions(-) diff --git a/drivers/media/i2c/sony-starvis2.c b/drivers/media/i2c/sony-sta= rvis2.c index 0edb0b4dd25f..02199336010e 100644 --- a/drivers/media/i2c/sony-starvis2.c +++ b/drivers/media/i2c/sony-starvis2.c @@ -725,6 +725,7 @@ struct starvis2 { struct v4l2_ctrl *exposure; struct v4l2_ctrl *vblank; struct v4l2_ctrl *hblank; + struct v4l2_ctrl *link_freq; =20 /* Track VMAX for exposure updates */ u32 vmax; @@ -755,6 +756,7 @@ static int starvis2_set_ctrl(struct v4l2_ctrl *ctrl) struct starvis2 *starvis2 =3D container_of_const(ctrl->handler, struct starvis2, ctrl_handler); struct i2c_client *client =3D v4l2_get_subdevdata(&starvis2->sd); + const struct starvis2_variant *variant =3D starvis2->variant; const struct v4l2_mbus_framefmt *format; struct v4l2_subdev_state *state; int ret =3D 0; @@ -778,6 +780,25 @@ static int starvis2_set_ctrl(struct v4l2_ctrl *ctrl) return ret; } =20 + if (ctrl->id =3D=3D V4L2_CID_LINK_FREQ) { + u32 hmax =3D variant->hmax_min_link_freq[ctrl->val]; + s32 hblank; + + if (starvis2->lane_mode =3D=3D STARVIS2_LANEMODE_4L) + hmax =3D max(hmax >> 1, variant->hmax_min_pixel_array); + + hblank =3D hmax * variant->pix_per_clk - + variant->active_area.width; + + ret =3D __v4l2_ctrl_modify_range(starvis2->hblank, + hblank, + starvis2->hblank->maximum, + starvis2->hblank->step, + hblank); + if (ret) + return ret; + } + /* * Only apply control values when device is powered on (RPM ACTIVE) * and streaming (usage count !=3D 0) @@ -824,6 +845,12 @@ static int starvis2_set_ctrl(struct v4l2_ctrl *ctrl) cci_write(starvis2->cci, STARVIS2_REG_WINMODEV, ctrl->val, &ret); break; + case V4L2_CID_LINK_FREQ: + /* The STARVIS2_LINK_FREQ_ enums match up with the register */ + cci_write(starvis2->cci, STARVIS2_REG_DATARATE_SEL, ctrl->val, + &ret); + break; + default: dev_warn(&client->dev, "ctrl(id:0x%x,val:0x%x) is not handled\n", @@ -938,9 +965,6 @@ static int starvis2_write_common(struct starvis2 *starv= is2) =20 cci_write(starvis2->cci, STARVIS2_REG_INCK_SEL, starvis2->inck_sel_val, &ret); - cci_write(starvis2->cci, STARVIS2_REG_DATARATE_SEL, - __fls(starvis2->link_freq_bitmap), - &ret); cci_write(starvis2->cci, STARVIS2_REG_LANEMODE, starvis2->lane_mode, &ret); =20 @@ -1018,6 +1042,7 @@ static int starvis2_enable_streams(struct v4l2_subdev= *sd, goto err_rpm_put; } =20 + __v4l2_ctrl_grab(starvis2->link_freq, true); return 0; =20 err_rpm_put: @@ -1042,6 +1067,8 @@ static int starvis2_disable_streams(struct v4l2_subde= v *sd, if (ret) dev_err(&client->dev, "%s failed to stop stream\n", __func__); =20 + __v4l2_ctrl_grab(starvis2->link_freq, false); + pm_runtime_put(&client->dev); =20 return ret; @@ -1208,7 +1235,6 @@ static int starvis2_init_controls(struct starvis2 *st= arvis2) struct i2c_client *client =3D v4l2_get_subdevdata(&starvis2->sd); const struct starvis2_variant *variant =3D starvis2->variant; struct v4l2_fwnode_device_properties props; - struct v4l2_ctrl *link_freq; s32 hblank, max_hblank, vblank, max_vblank; u32 hmax; int ret; @@ -1224,25 +1250,26 @@ static int starvis2_init_controls(struct starvis2 *= starvis2) =20 starvis2->vmax =3D starvis2->variant->vmax_default; =20 - hmax =3D variant->hmax_min_link_freq[__fls(starvis2->link_freq_bitmap)]; - if (starvis2->lane_mode =3D=3D STARVIS2_LANEMODE_4L) - hmax =3D max(hmax >> 1, variant->hmax_min_pixel_array); - /* PIXEL_RATE is fixed and read-only */ v4l2_ctrl_new_std(ctrl_hdlr, &starvis2_ctrl_ops, V4L2_CID_PIXEL_RATE, starvis2->variant->pixel_rate, starvis2->variant->pixel_rate, 1, starvis2->variant->pixel_rate); =20 - /* LINK_FREQ is also read only */ - link_freq =3D v4l2_ctrl_new_int_menu(ctrl_hdlr, &starvis2_ctrl_ops, - V4L2_CID_LINK_FREQ, - ARRAY_SIZE(link_freqs) - 1, - __ffs(starvis2->link_freq_bitmap), - link_freqs); - - if (link_freq) - link_freq->flags |=3D V4L2_CTRL_FLAG_READ_ONLY; + starvis2->link_freq =3D + v4l2_ctrl_new_int_menu(ctrl_hdlr, &starvis2_ctrl_ops, + V4L2_CID_LINK_FREQ, + __fls(starvis2->link_freq_bitmap), + __ffs(starvis2->link_freq_bitmap), + link_freqs); + if (!starvis2->link_freq) + goto err_free_handler; + + v4l2_ctrl_modify_range(starvis2->link_freq, + __ffs(starvis2->link_freq_bitmap), + __fls(starvis2->link_freq_bitmap), + ~(starvis2->link_freq_bitmap), + __ffs(starvis2->link_freq_bitmap)); =20 vblank =3D starvis2->vmax - starvis2->variant->active_area.height; max_vblank =3D STARVIS2_VMAX_MAX - starvis2->variant->active_area.height; @@ -1250,6 +1277,10 @@ static int starvis2_init_controls(struct starvis2 *s= tarvis2) V4L2_CID_VBLANK, vblank, max_vblank, 2, vblank); =20 + hmax =3D variant->hmax_min_link_freq[starvis2->link_freq->val]; + if (starvis2->lane_mode =3D=3D STARVIS2_LANEMODE_4L) + hmax =3D max(hmax >> 1, variant->hmax_min_pixel_array); + hblank =3D hmax * starvis2->variant->pix_per_clk - starvis2->variant->active_area.width; max_hblank =3D STARVIS2_HMAX_MAX * starvis2->variant->pix_per_clk - @@ -1285,16 +1316,20 @@ static int starvis2_init_controls(struct starvis2 *= starvis2) v4l2_ctrl_new_fwnode_properties(ctrl_hdlr, &starvis2_ctrl_ops, &props); =20 if (ctrl_hdlr->error) { - ret =3D ctrl_hdlr->error; dev_err(&client->dev, "%s control init failed (%d)\n", __func__, ret); - v4l2_ctrl_handler_free(ctrl_hdlr); - return ret; + goto err_free_handler; } =20 starvis2->sd.ctrl_handler =3D ctrl_hdlr; =20 return 0; + +err_free_handler: + ret =3D ctrl_hdlr->error; + v4l2_ctrl_handler_free(ctrl_hdlr); + + return ret; } =20 static int starvis2_check_hwcfg(struct device *dev, struct starvis2 *starv= is2) --=20 2.34.1 From nobody Fri Oct 23 22:12:51 2026 Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1DD224E73A9 for ; Thu, 15 Oct 2026 15:57:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079884; cv=none; b=sztaOv6xQ5t00/4lbTHYEHz35Ic0iouqOOGjdxoGvKEp9WJywma+OA6MBfYx+D8P39B+py+4rdqPp3/1uWgMULRHVwYyQypjBuwVtRkTmrsoV/eWWepY6nj7oUdcFDZFvdSYRny66gXa+qTQDOer3gUWxqaGPAXS5+1RMJozzdk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079884; c=relaxed/simple; bh=UIX4CHT9uj1+8MpaUJcFHq6eB5vI9kn09zdV0fSjOOo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XbR2OXYY982XM1tDpZo7PC75db+ch8iEIQ502d6nSsASgCtCFYd1Fz4JW/e9wWGFwvOARQu1DpI1Y8ViAixqq10kIcxe22IhaSeYLpenEpG/yskp5Pv6qagIy080qpSvggUPu4vn3awqU/aT/8EYo/OBb10l+fLWQwjOHKTrkGs= 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=bLJkTPFG; arc=none smtp.client-ip=209.85.221.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="bLJkTPFG" Received: by mail-wr1-f54.google.com with SMTP id ffacd0b85a97d-48afe75f055so602057f8f.2 for ; Thu, 15 Oct 2026 08:57:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1792079864; x=1792684664; 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=XiaI7PJTLTIOMlYMByTXCawN4zOurtnfoVaJirCKA9Y=; b=bLJkTPFGtfiQizfbch0yB6R7ewB+Q0g4p/JgI5YCH+In5TQhCgUzCn45Rn7UHz8qmi osr/DBbI8S0uKnh996fijfBodcUsoavZLAxxMrlfEAdw/JdOf2r2m5zAVfC4PPF5QVi+ V2DaUzCKys9YtrFYXbGKLCdYF8a1toVQgaTRN+i9TSX5ijob2pA+q88ADRHuC7e87Ub8 Dfj2RYKt7kDLHzjiH3G8XkQa2NwM0405AgPylgV63xBzgxFjWcJ9r4zSlRfOtLDpBKYB g//uoUxsxzYOHAGVMHvRbkB0y63GYigMoxgsDczVG83SDttEl2JPe3YyMV29xM7Za7dF 1u4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792079864; x=1792684664; 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=XiaI7PJTLTIOMlYMByTXCawN4zOurtnfoVaJirCKA9Y=; b=qceJ7ffkesIyaRYbUgjfYtZw05vdPGrYLZcQ2LypxI1HTuAPVQMt5cc9GP2Mf0kxYS Xu5Mlj6bkzFJ5ABgGwHsjOXmVLw6Nj+LAkElrohWWLRAdZhyJek3dN4u9zT9+Ajo3f3N SBaAYTlXWcUDhT4x0Q3769rESDGN7NmN4hpjEGZ/j/qa21cyyzPSR0GRKZ4gd+p+9lR5 7k6y+w6+0aOYijPWZRImvmu3zPcYj20/VI3unSgePua0GvnPCimMBnqrO39agTVKAiXA 730pkUT7FPuTOkTYTBqgw4+uzlWyuYBbbW3sG4wJaxh4T+NO9JmIKR+9UaS0MHb2yhXM /TcQ== X-Forwarded-Encrypted: i=1; AKwUvBx3pCzLk36t16OhhzlAkwER8qM4tfnoGndpHeKrDtzVHHSSMxtTebf9T+VsQjnPCrJUfewoaD5Bs52YvBI=@vger.kernel.org X-Gm-Message-State: AFq9FYLsckBnDTExveLMr9vGpeWZFxsb2e0jOSxbVRXMWDMMLdyR421x gWF8Yxf8E7Jzuu2kg08s5rxRyHZq7yRJYKYNDcZU7MnE55V6C8hP1x0JT06MnNFCek4= X-Gm-Gg: AYBFou1SSYtjf8ZFe3YFc5SNLJaMyl7SMvdv4tIO6c6iq2LZZ8eDWm63y9Tu+TawAR7 1jdYKT/M3Mx5eT6cVOUvhwYj4E78a9SOYYEisWxj5/s2NSbYsvO2KjS5EJgV46VZoELad4yqqzS +wjalh47oV86jLvqCBafnTzRJ5JAncUq1x0EXRqr60/cgC8Fn1ZRtShzHxU7NyVoxJ5JThn7Lbo vfmLB0lwfvD8knOD4PLvLjTF+f8aHgNQpXuT8RzaO0y6ogKCq5gbLA1xcpe+0LWUySbEhVV8psA kfxR9UctpmqYsjUWMS4p2c55WXUuAgZIlbCrTJsp9Lhu8PW1THI153nhguWsqR7rxsTnB6mNsI/ 95t229vKGY/utzORN+Kk4ktFGe1lEl9KyOxGXTNlfqpWy5lBGC0wbNDkDZXSA01eXi2z9tfhHUn y5ssgz9HtsirhLZWwi70zHFc48zlvKqGxPyIY4nJ/+Ey1UDRueOtoWZVS0+pB99uyWvGr/bvyoD kcOaTz+Wdbtd9vZOBIyh7u9oC02eLnKUxzbZ480O4dNkdMu0g== X-Received: by 2002:a05:6000:248a:b0:48a:f354:aefe with SMTP id ffacd0b85a97d-48dbacdef01mr41734606f8f.39.1792079864318; Thu, 15 Oct 2026 08:57:44 -0700 (PDT) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-48de0aaaaebsm19877251f8f.14.2026.10.15.08.57.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Oct 2026 08:57:42 -0700 (PDT) From: Dave Stevenson Date: Thu, 15 Oct 2026 16:57:33 +0100 Subject: [PATCH v4 07/16] media: sony-starvis2: Correct the exposure range 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: <20261015-media-starvis2-v4-7-75fcdb4163f3@raspberrypi.com> References: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> In-Reply-To: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> To: Sakari Ailus , Jai Luthra , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Laurent Pinchart , Alexander Shiyan , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Dave Stevenson X-Mailer: b4 0.14.1 The software reference for imx678 lists register SHR0 setting the shutter sweep time with a valid range of 4 to (Number of lines per frame - 1), and then gives the example of all-pixel scan mode with VMAX=3D2250 and SHR0=3D2249 giving an integration time of "1H + Toffset" (further defining Toffset as 0). The driver defining STARVIS2_EXPOSURE_MIN as 2 would therefore be contradictory, and doubles the minimum exposure achievable. The maximum exposure is derived from STARVIS2_SHR_MIN which is defined as 8, when the actual minimum for that register is 4. Correct STARVIS2_EXPOSURE_MIN and STARVIS2_SHR_MIN. Signed-off-by: Dave Stevenson --- drivers/media/i2c/sony-starvis2.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/media/i2c/sony-starvis2.c b/drivers/media/i2c/sony-sta= rvis2.c index 02199336010e..10f91c4b6db3 100644 --- a/drivers/media/i2c/sony-starvis2.c +++ b/drivers/media/i2c/sony-starvis2.c @@ -61,10 +61,10 @@ =20 /* SHR internal */ #define STARVIS2_REG_SHR CCI_REG24_LE(0x3050) -#define STARVIS2_SHR_MIN 8 +#define STARVIS2_SHR_MIN 4 =20 /* Exposure control */ -#define STARVIS2_EXPOSURE_MIN 2 +#define STARVIS2_EXPOSURE_MIN 1 #define STARVIS2_EXPOSURE_STEP 1 #define STARVIS2_EXPOSURE_DEFAULT 1000 =20 --=20 2.34.1 From nobody Fri Oct 23 22:12:51 2026 Received: from mail-wr1-f50.google.com (mail-wr1-f50.google.com [209.85.221.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4280E4DD3C9 for ; Thu, 15 Oct 2026 15:57:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079891; cv=none; b=sdsHtzrRf6Xp0/RBVk/YYb5MXcGMSCmVzQbNBrvTjtG3IEH54AzyPxyAfZyLZczWaxoSBuTyt36KBCeyeQSrg1GVE1JgMBJnz+eEEP3bZsa++pFEa0oQVTk57vM8jsQ0FEyhjs0RD4XsfKSM2XyvVqZpES0S/RPLnvEaTEJH9g8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079891; c=relaxed/simple; bh=ccbmzk1mDLjJkMCMqTVZiJIs8myJOiM9s67m0/K4pLQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DJd5nKP2uK3BP4NlKHGgp04OR+7uCvXxNIGh/HswOGCVtS0nKj2uiuG+VWpGH3sSrHrMw0/ueVLBSb/r+7ZLYNwJG0Cb1PyJo7l2NXaTTFJRjQkACS7PiBYhvdcXhCC1amS2z+LorjPyKZtWMVrcwZR0J69GdBq0YYf8sno1Gxc= 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=KC11xP51; arc=none smtp.client-ip=209.85.221.50 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="KC11xP51" Received: by mail-wr1-f50.google.com with SMTP id ffacd0b85a97d-48c4649b35bso599454f8f.3 for ; Thu, 15 Oct 2026 08:57:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1792079865; x=1792684665; 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=R6xE9wzYHAMIeHjvm7ZwNBfCozBSihzOwHk4H3NMT9w=; b=KC11xP513BQi1GEkAlcKnH8ImfL5SR7z/WOJJK4S6tJCKTLlkS79/1VXKDrci/tWFg 7eUcwYdGROL3PqBthAwUxhmghxtjq4MUgdiwataxXQLrICBxL1+Ig+TWGCpIpw7+yZfP ypOrJVXxdvt+lDYR6VJRFsuOSA2S7N2E7F5m9gVsofgamT/Cj+gp/C+SSZeowllRJvxR m91S/YZY8VzRC4q2kH5TpxCzSWBPCzTA3IBkgxJEcRjB4V9krFXZeEDl4bssrm24uzV6 Q3xYYqERCPYRcC7R0Fm5iVVnwCjk21Egv9OolLw93euIloiLt8OEp0BHQytwcRcLxsk9 pUJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792079865; x=1792684665; 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=R6xE9wzYHAMIeHjvm7ZwNBfCozBSihzOwHk4H3NMT9w=; b=U8nzlTK5g4sFrZrhcYtALZ+eUGF0kdj2BGq6DCWlqzpZDFpuI4NXL4n5XagnguEgG2 GvM9zFj47Jq90s3I/M2JVzRBOTJ2TWKagsVYWRlrQOLY8Rb5+TnGnn4uQmEZ7KTm3hyr N393I19L1w+F+hPvSV6QbgRiD2opNeazI3gQwVdbV5W0MvLLXGOeZU33Pc3KYzPenp6i 4MgopSBR6XRSy8iyORxkIJynATOd+SlDEitBIdj1/xlSXVJPt6Xsq52BzBTzOw3Y+dS3 KRmW+X0PSH0wDHrSpCILkU72tlDbNPHPDOTaGbcOYX/aEz71xFLtHz/r4kfweQ5cWaRh 1oaQ== X-Forwarded-Encrypted: i=1; AKwUvBzNjYEDiKu+nBWgrXD2QyTWGqkE1LJ5HMbG2c0cPAbGkKp3FTcp8YROTF6XnNJ3prcI0uC7/cmU6KB2vA4=@vger.kernel.org X-Gm-Message-State: AFq9FYKUCm1DmEzq8m1k5J4QB5DHUUJj+usP9npdCLbqh7HstpNsG+Sx fjdtrEuV2sFmlPc7ADe3/hcx1Ij3b4y5FYkuuFSHrr5asVY0QIZeuQawcliA5CtSLsM= X-Gm-Gg: AYBFou183nM6ptOS8s/0/X/2T8wKocpjhuIKTtKsASxpiL6GTHQnt4q1KeNZ/UyYx+B cz6kAIzjAauASiihXYNc1wUlKf7X7NHH0KkDhwlcZedTDG39KjoZqD5bdtYJ2l8TEUSIV5ddbqg 84cmAWKrlqKEAL7vQv0QZgPLhFrdBechTbvv4TGd3Ic4nA8TNBqYrLUIwRZf1qzgvv/SU0ccSO3 ZFhuHHMIZD4QtvFEucZBsENz281IWuOOaPVK/c/Viwus2A0gGIGiy/nh9RlzopEhp0c6hrna8aZ t02V3nek8MkyuC17n8q9+nB5l10zzL40mSYBttj8b9gF2aAf4LHNsfIPvH/vKGlCt+QhKOdqU0K RbxZ4loyqj1T0falux2bqmcamLV7eOzHjR6r/F01zAK+y2B79N8WKIT2nCcd2M1YrWgnvmQefoX AUD4HhST6zztEiGSGdkwbBRJnVt2NgXflMgeRZGkWvjmdxjad5ina9NGOU9NJ5znLKEhDWW3i8J k/ed2EGeXpGJQBQe4Ev17/LGanZ7jalX5qGEkKe7QRsYqPKNQ== X-Received: by 2002:a05:600c:4e41:b0:49f:c1a1:5222 with SMTP id 5b1f17b1804b1-4a18e4d80bdmr387159205e9.33.1792079865401; Thu, 15 Oct 2026 08:57:45 -0700 (PDT) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-48de0aaaaebsm19877251f8f.14.2026.10.15.08.57.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Oct 2026 08:57:44 -0700 (PDT) From: Dave Stevenson Date: Thu, 15 Oct 2026 16:57:34 +0100 Subject: [PATCH v4 08/16] media: sony-starvis2: Put module into standby after identify 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: <20261015-media-starvis2-v4-8-75fcdb4163f3@raspberrypi.com> References: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> In-Reply-To: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> To: Sakari Ailus , Jai Luthra , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Laurent Pinchart , Alexander Shiyan , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Dave Stevenson X-Mailer: b4 0.14.1 The module has to be brought out of standby in order to read some of the identification registers. Whilst it would be powered down via pm_runtime, should that be disabled it would be left in streaming mode. Restore standby mode after identify. Signed-off-by: Dave Stevenson --- drivers/media/i2c/sony-starvis2.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/drivers/media/i2c/sony-starvis2.c b/drivers/media/i2c/sony-sta= rvis2.c index 10f91c4b6db3..49dcbda9ecdd 100644 --- a/drivers/media/i2c/sony-starvis2.c +++ b/drivers/media/i2c/sony-starvis2.c @@ -1159,7 +1159,8 @@ static int starvis2_identify_model(struct starvis2 *s= tarvis2) * This sensor's ID registers become accessible 80ms after coming out * of STANDBY mode. */ - cci_write(starvis2->cci, STARVIS2_REG_MODE_SELECT, 0, &ret); + cci_write(starvis2->cci, STARVIS2_REG_MODE_SELECT, + STARVIS2_MODE_STREAMING, &ret); fsleep(STARVIS2_MODULE_ID_DELAY); =20 cci_read(starvis2->cci, variant->id_reg, &val, &ret); @@ -1167,14 +1168,15 @@ static int starvis2_identify_model(struct starvis2 = *starvis2) if (ret) { dev_err(&client->dev, "I2C transaction failed ret =3D %d\n", ret); - return ret; + goto err_standby; } =20 val &=3D variant->id_mask; if (val !=3D variant->id_value) { dev_err(&client->dev, "Chip ID mismatch: %x!=3D%llx\n", variant->id_value, val); - return -ENXIO; + ret =3D -ENXIO; + goto err_standby; } =20 cci_read(starvis2->cci, STARVIS2_REG_MONOCHROME, &val, &ret); @@ -1182,7 +1184,7 @@ static int starvis2_identify_model(struct starvis2 *s= tarvis2) if (ret) { dev_err(&client->dev, "I2C transaction failed ret =3D %d\n", ret); - return ret; + goto err_standby; } =20 detected =3D val & STARVIS2_TYPE; @@ -1204,7 +1206,10 @@ static int starvis2_identify_model(struct starvis2 *= starvis2) } starvis2->variant =3D starvis2->info->variant; =20 - return 0; +err_standby: + cci_write(starvis2->cci, STARVIS2_REG_MODE_SELECT, + STARVIS2_MODE_STANDBY, NULL); + return ret; } =20 static const struct v4l2_subdev_video_ops starvis2_video_ops =3D { --=20 2.34.1 From nobody Fri Oct 23 22:12:51 2026 Received: from mail-wr1-f47.google.com (mail-wr1-f47.google.com [209.85.221.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7A41A541478 for ; Thu, 15 Oct 2026 15:57:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079892; cv=none; b=UeIRZAtxb6J38+QyJvcLoEkl331GkVs115WzN/Us6z26UvPeUyHiZ0rlOdiM/08jFy7uDzsX1dBWIEMqr6L4kNLh/cqWwkEP47+w37xBxJ00pKiW329baWVjKul4IKhr9W6yuhyFmX5E8CyT1SoEzOsJFi2hBC4Rul0x49P5il0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079892; c=relaxed/simple; bh=WzSHl5a/H3/js9LTMTbl8ld/1JpeiIURXE0YgudYnNo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KC05ZvGA73lNXuanIx0xW3sGEFi0wTwhBxgbVfhzEBiPoy/ZmPhEDbWcdfLgRXtO+LmMHp6wA45fNo/se2oameBJNKk22Raokn0Gum/3/aimsEHa+FHSRSW8Y0UWkZbTSY4ZJGahbra85vwLvY8xMPJVWMDRdCP7B8BGkm0f6Eo= 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=VaQxSVfC; arc=none smtp.client-ip=209.85.221.47 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="VaQxSVfC" Received: by mail-wr1-f47.google.com with SMTP id ffacd0b85a97d-48c4d870d54so3515827f8f.2 for ; Thu, 15 Oct 2026 08:57:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1792079866; x=1792684666; 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=RO/skbJbno3lgmcwBPXIqDfSZdYNz13tL9r2MUMGxaE=; b=VaQxSVfC+jeB28fPXmVh9hg35errO3WnOqdKN8MejbqmlPGohBikitpINRHnI6oTVG yOJui5wzENkF3E5Y+qvjcF4lMhPAJFZ8tJ89Q54t0CvbdnG/BRryUJDTxac4gvcaoXcy UwoQmNEX8x6rO1xYduXu4BHExyffAJwcrUwsIHYoQgNOWVPFJS7j03iOfDEKP3nD8Kga DEVBE1W4Tr5lqK64QCzBDt5VmDfUuquqqQgtvi94du8mZwe9LMc3BlysnAoybELPhWPd p9yanZTq15M4sd2WU1PLLTOr6EOWoPbEI9ijxxvQ+CtyeBIj63Jf9WdfyinmGh7SimQ8 IlKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792079866; x=1792684666; 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=RO/skbJbno3lgmcwBPXIqDfSZdYNz13tL9r2MUMGxaE=; b=w+DS9i80O++RaSpzAH6aXMtY7oofpkCR+UaLR+rHzVwERZJHZ0WvQe8yiKXmUsDBgG D+6aTUOr0LM5lkL1V7ALa3qzBsXHE9c9hGaQRJRzrusOZoT+tXsRUEtaOwNp4/mvwngL +4UJdvjJYpdc8JmuOs42bzqWUIFQIPrtwqAExH/1DrRMK/OSaH5g1ExHRlNhgDIozwTf P6FZ6Fr5lN2lIxd5em73Kd4EhNiBWA3wVi/cMd2e6WB84TprGEEAgKwV8o9SGLM0r3hg zCIGynyEfegYBeaw+2DhnQC9ngHLjLBMnhxxgbGkWKVXCW/yPsDdVEcVEc0/BRPGvAZK o0bw== X-Forwarded-Encrypted: i=1; AKwUvBxg15shm8sUGE83oPGVlLGWpAy7/32bMrnEi5uQMtVSDeeLYkhqMqHFPp9n3vodICgfNtwilBkdpo4E6B4=@vger.kernel.org X-Gm-Message-State: AFq9FYJ0dza8kWMl9wepUXSLv3LuFB5i27wycRFJbm/vgx5O3AX3/MDk hvlXgxSqZJUpitlcA4CdG+QCh7n7frvFWiKHe1vMNDQpupg8nAkdRglk5OxqcBRoEd8= X-Gm-Gg: AYBFou3e5jpKYwaxrdg6Hwoyy2vUO+CXKOCsleFlXg7FAQLf1fPhjpdPSUn1/yCoZGs oF6hAEbvoXgBn83RB9sdJPBhfYJ9YtvVTWbTOs46nU3v/YdOcvbtvur107qIk1uKkV83PAlrVWk s8PFBJt9lbis7haKmHFWBtbJ6bE+jkj6CGf97EK4UG5eZKJ2joqnuQEX5bvsRco0SN59zleUumT tl6g/NwnPzShk15LRt7CKg3ffHcn1cpDWY2UFPSosRINakT9L8JZKFvHpGRnbZ/IfelH8A/qXrJ raidx6BY6G42cXBssMvGTZQZs0ZmfjZEnTUcLo1SHGqvXU0dRUpp8lmQWf4sMP33tOuHrTcfYEr 3wfPUHp9Dwxlr/5PjKLAFsy9xrdNAOLVDe/VMJ6afPm6fTleyAW4qwPKDAXIElP6xGZVAo52z+r LE9jSB8GzATdDBBnfFe0edOX/GYzHBXlEUtLMMpT5A4n5E3Tl3s3xQ0SciKxeJ58eUb8Snz/wCw t3CwXUAKC0qdgHE5lGks4jdWm326wz9A83RxRXy0TP8T4ZkLQ== X-Received: by 2002:a05:6000:2610:b0:48b:60a:760c with SMTP id ffacd0b85a97d-48dbacdbca4mr39528635f8f.31.1792079866485; Thu, 15 Oct 2026 08:57:46 -0700 (PDT) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-48de0aaaaebsm19877251f8f.14.2026.10.15.08.57.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Oct 2026 08:57:45 -0700 (PDT) From: Dave Stevenson Date: Thu, 15 Oct 2026 16:57:35 +0100 Subject: [PATCH v4 09/16] media: sony-starvis2: Use pm_runtime_autosuspend 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: <20261015-media-starvis2-v4-9-75fcdb4163f3@raspberrypi.com> References: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> In-Reply-To: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> To: Sakari Ailus , Jai Luthra , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Laurent Pinchart , Alexander Shiyan , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Dave Stevenson X-Mailer: b4 0.14.1 In order to reduce the time in stopping and restarting streaming, use pm_runtime_autosuspend so the sensor isn't powered down. Signed-off-by: Dave Stevenson --- drivers/media/i2c/sony-starvis2.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/media/i2c/sony-starvis2.c b/drivers/media/i2c/sony-sta= rvis2.c index 49dcbda9ecdd..dce150304dc6 100644 --- a/drivers/media/i2c/sony-starvis2.c +++ b/drivers/media/i2c/sony-starvis2.c @@ -858,7 +858,7 @@ static int starvis2_set_ctrl(struct v4l2_ctrl *ctrl) break; } =20 - pm_runtime_put(&client->dev); + pm_runtime_put_autosuspend(&client->dev); =20 return ret; } @@ -1046,7 +1046,7 @@ static int starvis2_enable_streams(struct v4l2_subdev= *sd, return 0; =20 err_rpm_put: - pm_runtime_put(&client->dev); + pm_runtime_put_autosuspend(&client->dev); =20 return ret; } @@ -1069,7 +1069,7 @@ static int starvis2_disable_streams(struct v4l2_subde= v *sd, =20 __v4l2_ctrl_grab(starvis2->link_freq, false); =20 - pm_runtime_put(&client->dev); + pm_runtime_put_autosuspend(&client->dev); =20 return ret; } @@ -1448,6 +1448,8 @@ static int starvis2_probe(struct i2c_client *client) =20 pm_runtime_set_active(dev); pm_runtime_enable(dev); + pm_runtime_set_autosuspend_delay(dev, 1000); + pm_runtime_use_autosuspend(dev); =20 ret =3D starvis2_init_controls(starvis2); if (ret) @@ -1495,6 +1497,7 @@ static int starvis2_probe(struct i2c_client *client) error_pm_runtime: pm_runtime_disable(&client->dev); pm_runtime_set_suspended(&client->dev); + pm_runtime_dont_use_autosuspend(&client->dev); =20 error_power_off: starvis2_power_off(&client->dev); @@ -1516,6 +1519,7 @@ static void starvis2_remove(struct i2c_client *client) if (!pm_runtime_status_suspended(&client->dev)) starvis2_power_off(&client->dev); pm_runtime_set_suspended(&client->dev); + pm_runtime_dont_use_autosuspend(&client->dev); } =20 static const struct dev_pm_ops starvis2_pm_ops =3D { --=20 2.34.1 From nobody Fri Oct 23 22:12:51 2026 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6A5093A5438 for ; Thu, 15 Oct 2026 15:57:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079894; cv=none; b=WQQfPwvKODG5/FdtZHQdb4ErLFYY4CrZUl71J/NzEawZWHENJwbh4qKdFmcTSP+v1icrcMbU2Eh6CGIVI039Ku4uzfsfBUpfjXEPLdDJHVlRgNiaeGI3QBB0wZz8zZAWPgD6F+KSsTNrksXxBVuwEmYiDzSQqauFGMZhJdZu5bo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079894; c=relaxed/simple; bh=LjEmyleO79NM8uWuMzakkcA0rXksukeE3zemrxG3uqk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Smkj6KHF6JMAhtpQICE0QIkpafrZh1vq2SWhll8R/BkPu9iMCLSQ5vxk9ZsEiZM5Pei48qfX38LjUzycQVcCyl69os6kp45O4ULYAiYXmZm/skCQGUKvB/2xJi/MU4G4ixEFhsp7v6MXqfQBn9HPImJdZIoAmimZvq4pT4lWuWU= 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=pkcVtDC+; arc=none smtp.client-ip=209.85.128.41 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="pkcVtDC+" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-4a1b07c3c5fso20447735e9.1 for ; Thu, 15 Oct 2026 08:57:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1792079867; x=1792684667; 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=P+bUFEmLPS4/TdrbxhIqdaZX2ZeBKuPS+ZYgOUoKgys=; b=pkcVtDC+zlLyKLFDN+7oZFTje66OTLEEbp4Jz6x0rGlBkq9JNwot1YV5bDpC9brdrR axKDRLaWG52IUTgf5ykcibxm5RplT8Gjb07iC57RFeQjjbitp1+VWovu/M076Xq89Gmm IQHtRiExi9/1LuyxXzN+UuXh3QdYRbumlvsoW6HqDa0WG0QMgMiQ04oV8vC4bFn2gWVr AAq5RIflIZXG9d3ZT7FbE+3yeErphhfFoYCZ+Vr2gvIQV1aK1tP552VcHLtJ5n4O46UJ 6OiIitlJ7zxnV0Nie0GDOMD8qk1yYGtr+wO93NNjPeBHKzoWap+CpOF20FgQThDwtC7z wO3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792079867; x=1792684667; 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=P+bUFEmLPS4/TdrbxhIqdaZX2ZeBKuPS+ZYgOUoKgys=; b=lU0UY5lfFfQTAT6PVjyd4YIWC3EoE2vNqElnwpMy450G7lpQbcbWXrqBL4N20KeDjY DpdyEN5MSyI7ZfRaELg85DFYP+kW6g5vtFtKI5htDhgnX/Fs4mFWvPNg5PVbWE/cplZy GOsgh7Uptb85NtqJE2dP0+xkqS6a9NqEp/5JlBKFwYNYtWF8BNCShPvK9wMCO1ssni7U XBjq53/UAAh2pgAF+dhqWfy0KseB2roGcOK28mwM1kpHuS1WGP4AdF1fGkZyws8UAD1T tCktVcGNDmu8631N8oZzJQsqgnwonsGTPj4KgYMmLVy3+gM5zfo9uwfTu73MQ01sRBaG Wlsw== X-Forwarded-Encrypted: i=1; AKwUvByyU8riQm0Nzjj0dQyGksGpwVibT1JPlsuVlH8Yejk5ldMVQjUDn1f4rr03A9UQnEsZHmUfseGU5E2pK9I=@vger.kernel.org X-Gm-Message-State: AFq9FYLicDVI7x16Dx+ClGPHG84iydDgRv2wdcjQV3AMuyVhsGlDmwXr Falsv0qdZhSrdwi4WikP4ZYDd5TCJRvrMxuTLZdydW93WrsHxzkTzCrJTWYwBpIOiws= X-Gm-Gg: AYBFou06ht//3LGX+LizWgyu95KdW/SuLvkZI/ci6dj0aKDDiy12t54KdoW7D7GRZjS aeX4JJmTbWSYasQYdM65cWbZ7FQDOsUH8sDm+EHNfvqwSHQqkde6SMCzeUWrqt3uMuxy6ZZMZPv WFtTNnsx8oJKpCGKJleBRLYfB+icZW/HBzVfmiOjUeCMF92zqfnW9BoDeL6Sw6KaerElkJDo9D1 aTwrDW68DgeZOG74wnigp0fk7HtYYFn7Zi3XzEJ0fbaBoC39k+4l+YDAQWZJDIpg5sy6z3vU0P7 Z+XFAV0e7qXRSE87kaxpIBSCEDMh5Ua+TnI5cG/C9LJKcZT6yU0FSQWp+SXoqA6IatUJjO/xImh mkiva+t4qY2y5/HrdB35JG9HF7mdqHJbEXlv+3+zDEJ7bqTTZA6nSO216rFd87DrCqlN/pFb6P5 nT1JWOhEc0sy+9ek1FuOWHGR4W20dyhkr9OLMWg4fYqzu5q2audOT/hiJrqWBwd552jw6iW13sq DHhnop+y8QQQf0XUGaf3Pz2oGAsGnkyWElkJi3+N6QwqqU31w== X-Received: by 2002:a05:600c:8b09:b0:4a1:6f78:842f with SMTP id 5b1f17b1804b1-4a18e4987b8mr414276165e9.11.1792079867328; Thu, 15 Oct 2026 08:57:47 -0700 (PDT) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-48de0aaaaebsm19877251f8f.14.2026.10.15.08.57.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Oct 2026 08:57:46 -0700 (PDT) From: Dave Stevenson Date: Thu, 15 Oct 2026 16:57:36 +0100 Subject: [PATCH v4 10/16] media: dt-bindings: sony,imx678: Add other Starvis 2 family members 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: <20261015-media-starvis2-v4-10-75fcdb4163f3@raspberrypi.com> References: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> In-Reply-To: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> To: Sakari Ailus , Jai Luthra , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Laurent Pinchart , Alexander Shiyan , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Dave Stevenson , Krzysztof Kozlowski X-Mailer: b4 0.14.1 There are multiple members of the Sony Starvis 2 image sensor family that have the same hardware requirements as imx678. Add them as options to the imx678 binding, rather than duplicating it. Signed-off-by: Dave Stevenson Reviewed-by: Krzysztof Kozlowski --- .../devicetree/bindings/media/i2c/sony,imx678.yaml | 38 ++++++++++++++++++= ---- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/Documentation/devicetree/bindings/media/i2c/sony,imx678.yaml b= /Documentation/devicetree/bindings/media/i2c/sony,imx678.yaml index 098f72544216..027872a134f2 100644 --- a/Documentation/devicetree/bindings/media/i2c/sony,imx678.yaml +++ b/Documentation/devicetree/bindings/media/i2c/sony,imx678.yaml @@ -5,7 +5,7 @@ $id: http://devicetree.org/schemas/media/i2c/sony,imx678.yaml# $schema: http://devicetree.org/meta-schemas/core.yaml# =20 -title: Sony IMX678 Sensor +title: Sony IMX678 and Starvis 2 Sensors =20 maintainers: - Jai Luthra @@ -13,21 +13,47 @@ maintainers: description: Sony IMX678 diagonal 8.86 mm (Type 1/1.8) CMOS active pixel type solid-s= tate image sensor with a square pixel array and 8.40M (3856x2180) effective p= ixels. + It is part of the Starvis 2 family of sensors. + Other members of the Starvis 2 have the same hardware requirements, and + therefore share this binding. =20 allOf: - $ref: /schemas/media/video-interface-devices.yaml# =20 properties: compatible: - items: - - enum: - - sony,imx678-aamr - - sony,imx678-aaqr - - const: sony,imx678 + oneOf: + - items: + - enum: + - sony,imx585-aamj + - sony,imx585-aaqj + - const: sony,imx585 + - items: + - enum: + - sony,imx662-aamr + - sony,imx662-aaqr + - const: sony,imx662 + - items: + - enum: + - sony,imx675-aamr + - sony,imx675-aaqr + - const: sony,imx675 + - items: + - enum: + - sony,imx678-aamr + - sony,imx678-aaqr + - const: sony,imx678 + - items: + - enum: + - sony,imx832-amr + - sony,imx832-aqr + - const: sony,imx832 + description: The IMX678 sensor exists in a colour variant (IMX678-AAQR) and a mono variant (IMX678-AAMR). The variant-specific compatible describes the exact sensor variant, with the generic IMX678 compatible as a fallba= ck. + The same applies for the other sensors in the family. =20 reg: maxItems: 1 --=20 2.34.1 From nobody Fri Oct 23 22:12:51 2026 Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F0331524B14 for ; Thu, 15 Oct 2026 15:57:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079892; cv=none; b=JULlqFN7J8uavLdw0tME0hR7bFkQv4FmeiryCNWr1VQiiHs/MerIb9fMqDyklL08NB9XD8o0svOEyOoGWyZhi/yJH8qiLZwICF0qhVuBhjDS0m1ZkMgrMKn7T6VWdJWVzEBUJn6Hd0yp+g5AqIYmTvwyUgMynfAIPt/wvV/bobA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079892; c=relaxed/simple; bh=yUgE5Hb1Y40Z0ueWq51DnPKKmsPDqDf36Bvinlhnd64=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hThskRdh9LEKbGfmDD6UJmUQh+wRYnHAZj4DcVtJrhwgjGdYn66sNqaVNXQ9uc9yflCfjQEr9KkH0vo23KcOup0ExMvdzqVleDrXVPGDYOV/pHQxOSJmG+jdP4p3MiR/aNlyc/dBCZ4fjdaxUfw1uDUWSjqFiv5lnCcAaWMHysw= 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=q61CLQC8; arc=none smtp.client-ip=209.85.221.44 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="q61CLQC8" Received: by mail-wr1-f44.google.com with SMTP id ffacd0b85a97d-48c6f764f82so816392f8f.0 for ; Thu, 15 Oct 2026 08:57:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1792079868; x=1792684668; 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=sHoFZ1i0WjX0t3uOtKZbpZede/LtCPkHLckxHmiivaM=; b=q61CLQC8jn/xAXA11+EiDGXd9qB22zVuwZZxpLuAl5giJyyzW9ep8L/L7fWCMV15z2 04D4htx7wHF7vRX9scy+l4I1JKI0R6sJPFJ93WTCpasP2q4mjaTONgFNwmfdi+LMoVRY cUDI9c/87W9It4HS4B17L3WWFMUUBmPUv+Rl1109DQTM4dfTvKzbsrK05Lqs1AjnZnFW n75EeaOfrJ2Benqe19lL/alUH593FPDU/kq5Aw8XMLHr6pZDtCaRNaSJILOtPUEfUWw0 9Ru0UZxy7e3HMUardr69xd22qA0PgwLofZ1sUZ1mrCiLwdBmLzx8fgiLTMIQFZSV8LbN 4deA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792079868; x=1792684668; 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=sHoFZ1i0WjX0t3uOtKZbpZede/LtCPkHLckxHmiivaM=; b=xPzfd1f1c8qgel4ZX2C301WZeQx/BJm1z0Sk+fn4PykNTdInLO4PeX05/Wg7OwZ9ZR IRyxiU19P9oE0LEy5kBTHEC2otDND8kY/q7qGE5lNOZJXTmE/Ze30PBb7scR8tfZ2yTO CFxHTSlbs3bMAFim1k4jitnqjY/hC4ht4KlHKtR/SSXnBMJHUietDy64+DbJeoZTsKpr wzdt17yNFtxyLCDQBnjG8tgMNq1hfPSSgsz3p4tCEpm4tc9DhVXtISU5nWwecvx/yw6W oSEWTaAqgfD2r9lQl6F8mc5Eajb3yB23JCnCjmqkSBEnkCCytvLFpr1K+QTOKRy7STkA dvXw== X-Forwarded-Encrypted: i=1; AKwUvBy7x/MnWpozJK3kdw0mtSdNdfyYnyPKwms64Yj44Cm6y6TcPKSYAs+sWQLnSGkvrigiyJBUo98D2gdkRvU=@vger.kernel.org X-Gm-Message-State: AFq9FYK88zICRZh2hpEWTWeS2rIScSPJFq2tpbcdknEyQUn5aZMF7wt1 xfwxdUBH5/OUF3o+Ghbl6RAo6NLVDh4XvDjNzI1miryEzyOb9m5FJGHUa746X05RMVd12hLsaQ3 MmlYiLxw= X-Gm-Gg: AYBFou0ir//mPAboOxzVl5Jz22+LGakgkMweUKpSXtxNTamCTKegjjG1Xe20ebez/pl kNUYE5HvDZBthwyPSJkKcnbPKf9qF0ZqMfCNJkrZvRKJMklrfSpx3AiuIUdIB6Jno3FkCgtGjtl gWac1Icjd4t/w/Y0PlZprXg7ueS7dK8036P5TACYdcsmcRbMudEN+liDqCiEO5/N1KElLj1XltK wtIcrkvP2VrKGtve1cfGQ+bkhS86oEWsPoWk0DS3f6NrLiMeuyHZARrnRogEXUmxAs8AzIEh3YH LhVtKY/2WXa727PRdWvPU5To2/5iTt6S6upCiUbHuMRGX1WQcSSPVL14B5vjjwV0tiMalvilWUN faYmKWxf6XKrO06GVIpVsn6IglwEYh7bRm/18qaUQoHLw5NUhEWKBYkz7dSkxlw3caxLPd8qVtC hQjpiGI0yDK5XnZR/hsr608VY8yb+bfh6CLJblfyBs6T2YvhJ5GwvxN/lz6k40C6pEq13xtDY7E iTp9hUxKeiNWKMw5ztncOhUIUnqdp3l/62fmjYxYElTPNlpiw== X-Received: by 2002:a05:6000:4b0b:b0:48a:fdde:5241 with SMTP id ffacd0b85a97d-48dbaaef91emr39129887f8f.31.1792079868156; Thu, 15 Oct 2026 08:57:48 -0700 (PDT) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-48de0aaaaebsm19877251f8f.14.2026.10.15.08.57.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Oct 2026 08:57:47 -0700 (PDT) From: Dave Stevenson Date: Thu, 15 Oct 2026 16:57:37 +0100 Subject: [PATCH v4 11/16] media: sony-starvis2: Add support for IMX662 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: <20261015-media-starvis2-v4-11-75fcdb4163f3@raspberrypi.com> References: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> In-Reply-To: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> To: Sakari Ailus , Jai Luthra , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Laurent Pinchart , Alexander Shiyan , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@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 common driver. Signed-off-by: Dave Stevenson --- drivers/media/i2c/sony-starvis2.c | 155 ++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 155 insertions(+) diff --git a/drivers/media/i2c/sony-starvis2.c b/drivers/media/i2c/sony-sta= rvis2.c index dce150304dc6..56e657748252 100644 --- a/drivers/media/i2c/sony-starvis2.c +++ b/drivers/media/i2c/sony-starvis2.c @@ -8,6 +8,8 @@ * Currently supported are: * IMX678: Diagonal 8.86 mm (Type 1/1.8) CMOS image sensor with 8.40 M eff= ective * pixels. + * IMX662: Diagonal 6.45mm (Type 1/2.8) CMOS image sensor with 2.12 M effe= ctive + * pixels. * * Copyright (C) 2026 Ideas On Board Oy. * @@ -661,6 +663,136 @@ static const struct starvis2_variant imx678_variant_d= ef =3D { .hmax_min_pixel_array =3D 550, }; =20 +static const struct cci_reg_sequence imx662_common_regs[] =3D { + { CCI_REG8(0x3444), 0xac }, + { CCI_REG8(0x3492), 0x08 }, + { CCI_REG8(0x3b00), 0x39 }, + { CCI_REG8(0x3b23), 0x2d }, + { CCI_REG8(0x3b45), 0x04 }, + { CCI_REG8(0x3c0a), 0x1f }, + { CCI_REG8(0x3c0b), 0x1e }, + { CCI_REG8(0x3c38), 0x21 }, + { CCI_REG8(0x3c44), 0x00 }, + { CCI_REG8(0x3cb6), 0xd8 }, + { CCI_REG8(0x3cc4), 0xda }, + { CCI_REG8(0x3e24), 0x79 }, + { CCI_REG8(0x3e2c), 0x15 }, + { CCI_REG8(0x3edc), 0x2d }, + { CCI_REG8(0x4498), 0x05 }, + { CCI_REG8(0x449c), 0x19 }, + { CCI_REG8(0x449d), 0x00 }, + { CCI_REG8(0x449e), 0x32 }, + { CCI_REG8(0x449f), 0x01 }, + { CCI_REG8(0x44a0), 0x92 }, + { CCI_REG8(0x44a2), 0x91 }, + { CCI_REG8(0x44a4), 0x8c }, + { CCI_REG8(0x44a6), 0x87 }, + { CCI_REG8(0x44a8), 0x82 }, + { CCI_REG8(0x44aa), 0x78 }, + { CCI_REG8(0x44ac), 0x6e }, + { CCI_REG8(0x44ae), 0x69 }, + { CCI_REG8(0x44b0), 0x92 }, + { CCI_REG8(0x44b2), 0x91 }, + { CCI_REG8(0x44b4), 0x8c }, + { CCI_REG8(0x44b6), 0x87 }, + { CCI_REG8(0x44b8), 0x82 }, + { CCI_REG8(0x44ba), 0x78 }, + { CCI_REG8(0x44bc), 0x6e }, + { CCI_REG8(0x44be), 0x69 }, + { CCI_REG8(0x44c0), 0x7f }, + { CCI_REG8(0x44c1), 0x01 }, + { CCI_REG8(0x44c2), 0x7f }, + { CCI_REG8(0x44c3), 0x01 }, + { CCI_REG8(0x44c4), 0x7a }, + { CCI_REG8(0x44c5), 0x01 }, + { CCI_REG8(0x44c6), 0x7a }, + { CCI_REG8(0x44c7), 0x01 }, + { CCI_REG8(0x44c8), 0x70 }, + { CCI_REG8(0x44c9), 0x01 }, + { CCI_REG8(0x44ca), 0x6b }, + { CCI_REG8(0x44cb), 0x01 }, + { CCI_REG8(0x44cc), 0x6b }, + { CCI_REG8(0x44cd), 0x01 }, + { CCI_REG8(0x44ce), 0x5c }, + { CCI_REG8(0x44cf), 0x01 }, + { CCI_REG8(0x44d0), 0x7f }, + { CCI_REG8(0x44d1), 0x01 }, + { CCI_REG8(0x44d2), 0x7f }, + { CCI_REG8(0x44d3), 0x01 }, + { CCI_REG8(0x44d4), 0x7a }, + { CCI_REG8(0x44d5), 0x01 }, + { CCI_REG8(0x44d6), 0x7a }, + { CCI_REG8(0x44d7), 0x01 }, + { CCI_REG8(0x44d8), 0x70 }, + { CCI_REG8(0x44d9), 0x01 }, + { CCI_REG8(0x44da), 0x6b }, + { CCI_REG8(0x44db), 0x01 }, + { CCI_REG8(0x44dc), 0x6b }, + { CCI_REG8(0x44dd), 0x01 }, + { CCI_REG8(0x44de), 0x5c }, + { CCI_REG8(0x44df), 0x01 }, + { CCI_REG8(0x4534), 0x1c }, + { CCI_REG8(0x4535), 0x03 }, + { CCI_REG8(0x4538), 0x1c }, + { CCI_REG8(0x4539), 0x1c }, + { CCI_REG8(0x453a), 0x1c }, + { CCI_REG8(0x453b), 0x1c }, + { CCI_REG8(0x453c), 0x1c }, + { CCI_REG8(0x453d), 0x1c }, + { CCI_REG8(0x453e), 0x1c }, + { CCI_REG8(0x453f), 0x1c }, + { CCI_REG8(0x4540), 0x1c }, + { CCI_REG8(0x4541), 0x03 }, + { CCI_REG8(0x4542), 0x03 }, + { CCI_REG8(0x4543), 0x03 }, + { CCI_REG8(0x4544), 0x03 }, + { CCI_REG8(0x4545), 0x03 }, + { CCI_REG8(0x4546), 0x03 }, + { CCI_REG8(0x4547), 0x03 }, + { CCI_REG8(0x4548), 0x03 }, + { CCI_REG8(0x4549), 0x03 }, + { STARVIS2_REG_WDMODE, 0x00 }, + { STARVIS2_REG_MDBIT, 0x01 }, + { STARVIS2_REG_XXS_DRV, 0x00 }, +}; + +static const u16 imx662_min_hmax_2lane[] =3D { + [STARVIS2_LINK_FREQ_297MHZ] =3D 1980, + [STARVIS2_LINK_FREQ_360MHZ] =3D 1980, + [STARVIS2_LINK_FREQ_445MHZ] =3D 1188, + [STARVIS2_LINK_FREQ_594MHZ] =3D 990, + [STARVIS2_LINK_FREQ_720MHZ] =3D 990, + [STARVIS2_LINK_FREQ_891MHZ] =3D 990, + [STARVIS2_LINK_FREQ_1039MHZ] =3D 990, + [STARVIS2_LINK_FREQ_1188MHZ] =3D 990, +}; + +static const struct starvis2_variant imx662_variant_def =3D { + .name =3D "imx662", + .id_reg =3D CCI_REG16_LE(0x4d1c), + .id_mask =3D 0x3ff, + .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 1136, + .hmax_min_link_freq =3D imx662_min_hmax_2lane, + .hmax_min_pixel_array =3D 990, +}; + struct starvis2_model_info { enum starvis2_type type; const u32 *codes; @@ -691,6 +823,26 @@ static const struct starvis2_model_info imx678_autodet= ect_info =3D { .auto_detect_mono =3D &imx678_aamr_info, }; =20 +static const struct starvis2_model_info imx662_aaqr_info =3D { + .type =3D STARVIS2_COLOR, + .codes =3D codes_bayer, + .num_codes =3D ARRAY_SIZE(codes_bayer), + .variant =3D &imx662_variant_def, +}; + +static const struct starvis2_model_info imx662_aamr_info =3D { + .type =3D STARVIS2_MONOCHROME, + .codes =3D codes_monochrome, + .num_codes =3D ARRAY_SIZE(codes_monochrome), + .variant =3D &imx662_variant_def, +}; + +static const struct starvis2_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 starvis2_supply_name[] =3D { "avdd", /* Analog (3.3V) supply */ "dvdd", /* Digital Core (1.1V) supply */ @@ -1527,9 +1679,12 @@ static const struct dev_pm_ops starvis2_pm_ops =3D { }; =20 static const struct of_device_id starvis2_of_match[] =3D { + { .compatible =3D "sony,imx662-aamr", .data =3D &imx662_aamr_info }, + { .compatible =3D "sony,imx662-aaqr", .data =3D &imx662_aaqr_info }, { .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,imx662", .data =3D &imx662_autodetect_info }, { .compatible =3D "sony,imx678", .data =3D &imx678_autodetect_info }, { /* sentinel */ } }; --=20 2.34.1 From nobody Fri Oct 23 22:12:51 2026 Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EA073541E57 for ; Thu, 15 Oct 2026 15:57:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079892; cv=none; b=Cqylw61qVGziLd/veQHOsNysDvJwKqGsbJ7B+cjTeDZNBIWUaKeTI9gEbI8fZfkwGhGTyBLn7a6zzDc+oCg18d+J9IJ0qza/048Dqva0TUz/voJN8tTjNVPfJEdkvXDoueu0VaoXzJhQIxoMIhi0GV+6qVF5H2BbNeuOqGRBgBU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079892; c=relaxed/simple; bh=iEKrSG5ZS6Ztha7Ufb7EQPh7Js7jjseDcw7gdXubNk8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZArjtClvolM7H1XL/N12F2Jws4tJ6qWALn/wdbdk3SJOBnalO0l56fK1XXseBRAAubAv88QbvpedT996ysN5kctMfqfw8r/8AFSQ0FHj67xdwKqT4k6XYULgNyGM+Gxd/afPXX/2brTPtaml1cJCShRdHUq3uv0lymvRaBQc9vY= 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=jQJt0OiW; arc=none smtp.client-ip=209.85.221.44 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="jQJt0OiW" Received: by mail-wr1-f44.google.com with SMTP id ffacd0b85a97d-48c45111bebso3505666f8f.0 for ; Thu, 15 Oct 2026 08:57:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1792079869; x=1792684669; 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=DSkVLmo2zMnVW3BpolUkwIGWC2D4epkgGWldFd6+S98=; b=jQJt0OiWmXnB4CPlSRDjhWVEmGYcQgUSGVp5keb0Bxtska96NW+z2Xxv1Np+8TAGUC S63XR5q29sFyU/09gjotGZvMZY5Wl6ycsHt667cTp+lqg2eBaDAdZLnGyazJay533C9A zvUbKo4WLuV+sxPV/kDq3bjtYJGbW/EG1Jss0aA10Qp5OV9eEcrdzUAP3Sa2BReRJ9VP 9ErhbTnzT+JPqdn2ix/w0KmtnRgr9PghdMsvY9ELx2BnPU9qGBSePx1SX9Pmf2DSSkon mqOEU8AztaNX7NupmlbGKx/A/Ey903edJFj1Fm/fu31SlSNKXQx+dnM+C3qPRZe6dKIs RVNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792079869; x=1792684669; 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=DSkVLmo2zMnVW3BpolUkwIGWC2D4epkgGWldFd6+S98=; b=CA5RiZpHBbz694P7gyYMc/0Pv9PjCN/sWeVSkP2wa8QKerP/khJZyidmg78klxm8jj S26uHMVfQEfoC7movdOWsqCaLxe/cylUMBIVryo6l9wyFKaEr2u+XomnFzKw7kNa3vox jbUFvRZjep8c6QNNB0JtT/Mw9ur2DiIjxbHcDmABOHfktF7KGcBoZVvQRi/iYGcA7hpL GX+EiyZwL80Ik7qb0by1V62NNaewDVT0T4CjCvoRLQyTEwQg13R64A7TM0DWLopLU0B7 d/NEbJqI/vmezGDrpjHMSH+sRNddnPpOkCkfETtTED0UeKGETgYLttXHS2WzKbLhPet1 bMLQ== X-Forwarded-Encrypted: i=1; AKwUvBxKPwZqjG6BmF51Shb5cbMyQse5SU+vaInjtlYnLaz+1SN+CT9ENLA+7hdrVzzS2vRlJmw3k5s9nm4WPug=@vger.kernel.org X-Gm-Message-State: AFq9FYLFzi9T2hjlvoTBHcd0/0hsO6PDIJeKXrPLbSx4OmqtszJWD+IP BV1HF3mdOaqWGVMsfTCunezZGPX/jup2XRyBq+acMKYi56EGz4EojRywB15bzd7Lu2A= X-Gm-Gg: AYBFou1V+topFQSf7BKW2O2Ptfx/hKReHQ8LjGJfzLMFp357+Y0G254q9GPCtGf897Q yeXs6K3KjT4lbfKHXAUZ0bVoqUuA0rNwOgZFx6WdrjWPOqWD5RAOwa+l3LVZlwfLU5+j523nCVf LznGYgGb8vHnwgmAYVMIzC92mh7MpNk3ZNN6T/zD60r/zfrWWeziKI9pW7NQXTcN55lOmLVjMPy DOSn9of0JgK0yjIRlXn8G9alFL404c7oBMB8BgjNqKn3Bq/pCWIWgngAVXTmyM0a1XTDI1rHMvZ c5aaxcRFv5mTv2n29WuWZTTSHDdvdlpv4uskdxBPIgERAog5KHEIdSYQ4oEnjEp0EsBMdq7NJhC sWG5MealTDQevXv14/LetDrtFq1+rv+lDF683peDbT+PFvWHRWYxccHOOwEmE6w1yR58vdRJHvD yMk4+45Ypt21aMAfgxmn6B4aHtiYbUbj+6560iB3JfvVoXl8401Aj8UQ5Po5XXXjQ1COaClndhh 2TDw2z8ruu2142s1A0Cvxd4zHWhkt/w1pnWAgH55DS0lUUZtg== X-Received: by 2002:a05:6000:4a14:b0:487:15a3:1cab with SMTP id ffacd0b85a97d-48dbaadb081mr37956659f8f.18.1792079869038; Thu, 15 Oct 2026 08:57:49 -0700 (PDT) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-48de0aaaaebsm19877251f8f.14.2026.10.15.08.57.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Oct 2026 08:57:48 -0700 (PDT) From: Dave Stevenson Date: Thu, 15 Oct 2026 16:57:38 +0100 Subject: [PATCH v4 12/16] media: sony-starvis2: Add support for IMX675 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: <20261015-media-starvis2-v4-12-75fcdb4163f3@raspberrypi.com> References: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> In-Reply-To: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> To: Sakari Ailus , Jai Luthra , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Laurent Pinchart , Alexander Shiyan , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@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. Signed-off-by: Dave Stevenson --- drivers/media/i2c/sony-starvis2.c | 212 ++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 212 insertions(+) diff --git a/drivers/media/i2c/sony-starvis2.c b/drivers/media/i2c/sony-sta= rvis2.c index 56e657748252..b7d3f65b21b4 100644 --- a/drivers/media/i2c/sony-starvis2.c +++ b/drivers/media/i2c/sony-starvis2.c @@ -10,6 +10,8 @@ * pixels. * IMX662: Diagonal 6.45mm (Type 1/2.8) CMOS image sensor with 2.12 M effe= ctive * pixels. + * IMX675: Diagonal 6.53mm (Type 1/2.8) CMOS image sensor with 5.12 M effe= ctive + * pixels. * * Copyright (C) 2026 Ideas On Board Oy. * @@ -793,6 +795,193 @@ static const struct starvis2_variant imx662_variant_d= ef =3D { .hmax_min_pixel_array =3D 990, }; =20 +static const struct cci_reg_sequence imx675_common_regs[] =3D { + { STARVIS2_REG_THIN_V_EN, 0x00 }, + { STARVIS2_REG_VCMODE, 0x01 }, + + { CCI_REG8(0x3081), 0x00 }, + { STARVIS2_REG_XXS_OUTSEL, 0xaa }, + { STARVIS2_REG_XXS_DRV, 0x0f }, + { CCI_REG8(0x30cc), 0x00 }, + { CCI_REG8(0x30cd), 0x00 }, + { CCI_REG8(0x30ce), 0x02 }, + { CCI_REG8(0x3400), 0x01 }, + + { CCI_REG8(0x3460), 0x22 }, + { CCI_REG8(0x347b), 0x02 }, + { 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), 0x1f }, + { CCI_REG8(0x3c0b), 0x1f }, + { CCI_REG8(0x3c0c), 0x1f }, + { CCI_REG8(0x3c0d), 0x1f }, + { CCI_REG8(0x3c0e), 0x1f }, + { CCI_REG8(0x3c0f), 0x1f }, + { CCI_REG8(0x3c30), 0x73 }, + { CCI_REG8(0x3c3c), 0x20 }, + { CCI_REG8(0x3c44), 0x06 }, + { 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), 0x10 }, + { CCI_REG8(0x4551), 0x10 }, + { CCI_REG8(0x4552), 0x10 }, + { CCI_REG8(0x4553), 0x10 }, + { CCI_REG8(0x4554), 0x10 }, + { CCI_REG8(0x4555), 0x10 }, + { CCI_REG8(0x4556), 0x10 }, + { CCI_REG8(0x4557), 0x10 }, + { CCI_REG8(0x4558), 0x10 }, + { CCI_REG8(0x455c), 0x10 }, + { CCI_REG8(0x455d), 0x10 }, + { CCI_REG8(0x455e), 0x10 }, + { CCI_REG8(0x455f), 0x10 }, + { CCI_REG8(0x4560), 0x10 }, + { CCI_REG8(0x4561), 0x10 }, + { CCI_REG8(0x4562), 0x10 }, + { CCI_REG8(0x4563), 0x10 }, + { CCI_REG8(0x4564), 0x10 }, + { 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_2lane[] =3D { + [STARVIS2_LINK_FREQ_297MHZ] =3D 2044, + [STARVIS2_LINK_FREQ_360MHZ] =3D 1692, + [STARVIS2_LINK_FREQ_445MHZ] =3D 1376, + [STARVIS2_LINK_FREQ_594MHZ] =3D 1064, + [STARVIS2_LINK_FREQ_720MHZ] =3D 840, + [STARVIS2_LINK_FREQ_891MHZ] =3D 684, + [STARVIS2_LINK_FREQ_1039MHZ] =3D 592, + [STARVIS2_LINK_FREQ_1188MHZ] =3D 528, +}; + +static const struct starvis2_variant imx675_variant_def =3D { + .name =3D "imx675", + .id_reg =3D CCI_REG16_LE(0x4d12), + .id_mask =3D 0xfff, + .id_value =3D 0x576, + .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 2024, + .hmax_min_link_freq =3D imx675_min_hmax_2lane, + .hmax_min_pixel_array =3D 528, +}; + struct starvis2_model_info { enum starvis2_type type; const u32 *codes; @@ -843,6 +1032,26 @@ static const struct starvis2_model_info imx662_autode= tect_info =3D { .auto_detect_mono =3D &imx662_aamr_info, }; =20 +static const struct starvis2_model_info imx675_aaqr_info =3D { + .type =3D STARVIS2_COLOR, + .codes =3D codes_bayer, + .num_codes =3D ARRAY_SIZE(codes_bayer), + .variant =3D &imx675_variant_def, +}; + +static const struct starvis2_model_info imx675_aamr_info =3D { + .type =3D STARVIS2_MONOCHROME, + .codes =3D codes_monochrome, + .num_codes =3D ARRAY_SIZE(codes_monochrome), + .variant =3D &imx675_variant_def, +}; + +static const struct starvis2_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 starvis2_supply_name[] =3D { "avdd", /* Analog (3.3V) supply */ "dvdd", /* Digital Core (1.1V) supply */ @@ -1681,10 +1890,13 @@ static const struct dev_pm_ops starvis2_pm_ops =3D { static const struct of_device_id starvis2_of_match[] =3D { { .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 }, { .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,imx662", .data =3D &imx662_autodetect_info }, + { .compatible =3D "sony,imx675", .data =3D &imx675_autodetect_info }, { .compatible =3D "sony,imx678", .data =3D &imx678_autodetect_info }, { /* sentinel */ } }; --=20 2.34.1 From nobody Fri Oct 23 22:12:51 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 F14463C8708 for ; Thu, 15 Oct 2026 15:57:51 +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=1792079894; cv=none; b=M5xCoZ6+2NNRu6q7GJB03UBVP2A9yxtdBxjIojmfeS/KdNg+K9NZ2RBnF2a0DJzVjjiM9ZHgAkYAE9AyZIeHm13FCtfaF+WRD4wyBvTRb56mA5hSB0s85qY8VdDDEfo9TFNg6X1W7iSuY62JIuIEHvrbR92U2BzZuXXcOcsrmKw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079894; c=relaxed/simple; bh=iyo9x/kmCuk6lc8CL0nMWLIN36voL9AbCvvGVsObDIo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=M8N677CzEI1gqLZlaAwyZ8/AMGcjALDbEhSRVDGc3nZ70s/MvqupT0ogbiB5dsgNiu3hzG7uXlQEGpvK4eL5fiY6w8t5iL0Q0EQofk0VyyCVng5LQgWq43TKyiTzmR6a5euXygZQWF+k9bcEdLIagZHv3FS4uVQIjS3Dx1l3TVs= 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=SUnqV+0A; 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="SUnqV+0A" Received: by mail-wr1-f46.google.com with SMTP id ffacd0b85a97d-48b0d19cf7eso96474f8f.1 for ; Thu, 15 Oct 2026 08:57:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1792079870; x=1792684670; 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=x1PFJj6q2rtXD6fNbfcI1UBAWa/6XwrxyRgSbFRe+d8=; b=SUnqV+0Avl6fEDuI9T48tUFQP0THPq4pomW1cjT3WZMwQQCrc73XNV4x+yiO7I2b/M 2VCGPficz35DUBrBz6V/9gFbbLEOE2Pgd3amNfTKDf7m6JfYD821PuriXFtLsDwBsuP0 Ewy+oal6nQi3e50Eb9H0rng+fg9ruxBtRglyOu5tJII6CX2co4N9d7rgwG79Gm/BZ7IX 9XQd5cwDIgK3kwuPhmIM0RBkcj58dzlJQGbnCkYsEYoPPIs9x9N/xs3/bT8SNq92EZhx V/jKsYn5uP4o+Im13MiEEoyYOFOFhzi02DJYWo0z5PuyIo3asIT7ACqOep6yALKaoAWo vd6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792079870; x=1792684670; 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=x1PFJj6q2rtXD6fNbfcI1UBAWa/6XwrxyRgSbFRe+d8=; b=bmJLHr9w4OB7GtFVkj17w09XyN2eirFzMZTgJQlKFFpC2kO+GPjl16m9qoHDRHpYc3 IDOYYYBXWGEHRsDFOq7bO0eDKOigLCJuHIcnTd4k9EQeGiC/rtfYFley524J2aLV+CUa 0gKOrrg1iLfhP/QDVtbyEjoEXZyKdjFYWPyjWJ1wC71acdo8rGZk3Tk3j9JCKM9KiJwK gA6LbmAmNwpUSY5aNgkNCp63+XgIxoGkPHJY4bEEVydfb33gUVg8HSGcPboofwB/vsYh BY7qdFQOxgJ6M2MvNhDae9/YJMj6E9c2pn7BcMXQ8WjlgYxf4bGFMrkMvNDgP0v65ZHv 4w8w== X-Forwarded-Encrypted: i=1; AKwUvBxCmwemjZAt+HC203tuq08lNDJ76b5oFz0AKR00YlDQjUBlu5dWjaLmxHaMK6XCR0h5rDMnSx76LQvqDno=@vger.kernel.org X-Gm-Message-State: AFq9FYLTvi3Db6mFr7RO99zSNmNN/j8tg5jJqGTQH0bnmPA2LZU/DaC7 MGjwh1spiNORXjIxTaJMWtSOtxR43BBAGbY5i0gsia5ylfdk0ay4ZpwpoKYnu6X4eZQ= X-Gm-Gg: AYBFou0nre0C7ow68k3KfJIkrv7Q8m5AomKfbfZWfFz7ndCYTgkrrdS97gGp7dm0bMr Y3RiKoFgtYq05vIwhI9mcc++umS9+wyGnTfjuBlhkP3Z5N2u3jsfQ5qOvcWPtfZl1iETwOv5RAJ rP/BZAnFzFninMch/cHPncZqcbJt0vCbSz19ifoT9+14l4sdKSWgJ9k4emrH5aLD5EejAjtqwGb IAipfZ6leE0TbW3jcBztIlAjNEIEB4dm6vk81KBXkH0KM8atoJJ5XZQNM0O3ZA6FXf9fMkwUSMK PfpfdiHkvtKQe7/MNi5uYiWvaxgbaEY2lzxdRj8M1g1ryCM2Jd2hyEdDDuZXv02FVZzhml7MDu9 rhWzX4SHn4fMRRJAgY5t05L305xMSkrIbW5fqwby4jZE7pn1h1k+TTsu4xHi8dYs+1GMloBxpGm gW94eymCH+jKmjK0IKo9WTgz9lKZjn6JeJRGDcxKMosSz5eNLC4qjpJBvOhIJq9F7QCDqso28CP 1mwvanXwQ4rrQ5AAi5+fZHoAaOCwHW55Bmz98hjcSXGSXzKWQ== X-Received: by 2002:a05:6000:46c2:b0:48d:ed0e:6bb6 with SMTP id ffacd0b85a97d-48dfadf3364mr814078f8f.1.1792079869978; Thu, 15 Oct 2026 08:57:49 -0700 (PDT) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-48de0aaaaebsm19877251f8f.14.2026.10.15.08.57.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Oct 2026 08:57:49 -0700 (PDT) From: Dave Stevenson Date: Thu, 15 Oct 2026 16:57:39 +0100 Subject: [PATCH v4 13/16] media: sony-starvis2: Add support for IMX832 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: <20261015-media-starvis2-v4-13-75fcdb4163f3@raspberrypi.com> References: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> In-Reply-To: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> To: Sakari Ailus , Jai Luthra , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Laurent Pinchart , Alexander Shiyan , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Dave Stevenson X-Mailer: b4 0.14.1 IMX832 is replacing IMX662, and it follows the same pattern as all the Starvis2 sensors. Add the sensor specific configuration for it. Signed-off-by: Dave Stevenson --- drivers/media/i2c/sony-starvis2.c | 118 ++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 118 insertions(+) diff --git a/drivers/media/i2c/sony-starvis2.c b/drivers/media/i2c/sony-sta= rvis2.c index b7d3f65b21b4..1dec5d923077 100644 --- a/drivers/media/i2c/sony-starvis2.c +++ b/drivers/media/i2c/sony-starvis2.c @@ -12,6 +12,8 @@ * pixels. * IMX675: Diagonal 6.53mm (Type 1/2.8) CMOS image sensor with 5.12 M effe= ctive * pixels. + * IMX832: Diagonal 6.45mm (Type 1/2.8) CMOS image sensor with 2.12 M effe= ctive + * pixels. * * Copyright (C) 2026 Ideas On Board Oy. * @@ -982,6 +984,99 @@ static const struct starvis2_variant imx675_variant_de= f =3D { .hmax_min_pixel_array =3D 528, }; =20 +static const struct cci_reg_sequence imx832_common_regs[] =3D { + { CCI_REG8(0x3460), 0x21 }, + { CCI_REG8(0x3a94), 0x75 }, + { CCI_REG8(0x3a96), 0x69 }, + { CCI_REG8(0x3a98), 0x1e }, + { CCI_REG8(0x3a9a), 0x1e }, + { CCI_REG8(0x3b58), 0xeb }, + { CCI_REG8(0x3b5c), 0xeb }, + { CCI_REG8(0x3b88), 0xeb }, + { CCI_REG8(0x3b8c), 0xeb }, + { CCI_REG8(0x3c40), 0x06 }, + { CCI_REG8(0x3cae), 0x79 }, + { CCI_REG8(0x3cbc), 0x7b }, + { CCI_REG8(0x4508), 0x00 }, + { CCI_REG8(0x4509), 0x02 }, + { CCI_REG8(0x450a), 0x41 }, + { CCI_REG8(0x450b), 0x03 }, + { CCI_REG8(0x4660), 0x12 }, + { CCI_REG8(0x4661), 0x00 }, + { CCI_REG8(0x4662), 0x29 }, + { CCI_REG8(0x4664), 0x12 }, + { CCI_REG8(0x4665), 0x00 }, + { CCI_REG8(0x4666), 0x25 }, + { CCI_REG8(0x4667), 0x03 }, + { CCI_REG8(0x46c0), 0x13 }, + { CCI_REG8(0x46c1), 0x00 }, + { CCI_REG8(0x46c2), 0x28 }, + { CCI_REG8(0x46c4), 0x13 }, + { CCI_REG8(0x46c5), 0x00 }, + { CCI_REG8(0x46c6), 0x24 }, + { CCI_REG8(0x46c7), 0x03 }, + { CCI_REG8(0x4720), 0x07 }, + { CCI_REG8(0x4721), 0x00 }, + { CCI_REG8(0x4722), 0x23 }, + { CCI_REG8(0x4723), 0x03 }, + { CCI_REG8(0x4724), 0x14 }, + { CCI_REG8(0x4725), 0x00 }, + { CCI_REG8(0x4726), 0x2a }, + { CCI_REG8(0x4750), 0x1e }, + { CCI_REG8(0x4752), 0x22 }, + { CCI_REG8(0x4753), 0x03 }, + { CCI_REG8(0x4754), 0x25 }, + { CCI_REG8(0x4755), 0x00 }, + { CCI_REG8(0x4756), 0x29 }, + { CCI_REG8(0x4780), 0x08 }, + { CCI_REG8(0x4781), 0x00 }, + { CCI_REG8(0x4782), 0x1d }, + { CCI_REG8(0x4783), 0x03 }, + { CCI_REG8(0x4784), 0x15 }, + { CCI_REG8(0x4785), 0x00 }, + { CCI_REG8(0x4786), 0x24 }, + { STARVIS2_REG_WDMODE, 0x00 }, + { STARVIS2_REG_MDBIT, 0x01 }, + { STARVIS2_REG_XXS_DRV, 0x00 }, +}; + +static const u16 imx832_min_hmax_2lane[] =3D { + [STARVIS2_LINK_FREQ_297MHZ] =3D 1980, + [STARVIS2_LINK_FREQ_360MHZ] =3D 1980, + [STARVIS2_LINK_FREQ_445MHZ] =3D 1188, + [STARVIS2_LINK_FREQ_594MHZ] =3D 990, + [STARVIS2_LINK_FREQ_720MHZ] =3D 990, + [STARVIS2_LINK_FREQ_891MHZ] =3D 990, + [STARVIS2_LINK_FREQ_1039MHZ] =3D 990, + [STARVIS2_LINK_FREQ_1188MHZ] =3D 990, +}; + +static const struct starvis2_variant imx832_variant_def =3D { + .name =3D "imx832", + .id_reg =3D CCI_REG16_LE(0x4d1c), + .id_mask =3D 0x3ff, + .id_value =3D 0x340, + .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 imx832_common_regs, + .num_common_regs =3D ARRAY_SIZE(imx832_common_regs), + .vmax_default =3D 1136, + .hmax_min_link_freq =3D imx832_min_hmax_2lane, + .hmax_min_pixel_array =3D 990, +}; + struct starvis2_model_info { enum starvis2_type type; const u32 *codes; @@ -1052,6 +1147,26 @@ static const struct starvis2_model_info imx675_autod= etect_info =3D { .auto_detect_mono =3D &imx675_aamr_info, }; =20 +static const struct starvis2_model_info imx832_aqr_info =3D { + .type =3D STARVIS2_COLOR, + .codes =3D codes_bayer, + .num_codes =3D ARRAY_SIZE(codes_bayer), + .variant =3D &imx832_variant_def, +}; + +static const struct starvis2_model_info imx832_amr_info =3D { + .type =3D STARVIS2_MONOCHROME, + .codes =3D codes_monochrome, + .num_codes =3D ARRAY_SIZE(codes_monochrome), + .variant =3D &imx832_variant_def, +}; + +static const struct starvis2_model_info imx832_autodetect_info =3D { + .variant =3D &imx832_variant_def, + .auto_detect_colour =3D &imx832_aqr_info, + .auto_detect_mono =3D &imx832_amr_info, +}; + static const char * const starvis2_supply_name[] =3D { "avdd", /* Analog (3.3V) supply */ "dvdd", /* Digital Core (1.1V) supply */ @@ -1894,10 +2009,13 @@ static const struct of_device_id starvis2_of_match[= ] =3D { { .compatible =3D "sony,imx675-aaqr", .data =3D &imx675_aaqr_info }, { .compatible =3D "sony,imx678-aamr", .data =3D &imx678_aamr_info }, { .compatible =3D "sony,imx678-aaqr", .data =3D &imx678_aaqr_info }, + { .compatible =3D "sony,imx832-amr", .data =3D &imx832_amr_info }, + { .compatible =3D "sony,imx832-aqr", .data =3D &imx832_aqr_info }, /* for non-conforming DTs that rely on runtime check */ { .compatible =3D "sony,imx662", .data =3D &imx662_autodetect_info }, { .compatible =3D "sony,imx675", .data =3D &imx675_autodetect_info }, { .compatible =3D "sony,imx678", .data =3D &imx678_autodetect_info }, + { .compatible =3D "sony,imx832", .data =3D &imx832_autodetect_info }, { /* sentinel */ } }; =20 --=20 2.34.1 From nobody Fri Oct 23 22:12:51 2026 Received: from mail-wr1-f42.google.com (mail-wr1-f42.google.com [209.85.221.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CB0F652758B for ; Thu, 15 Oct 2026 15:57:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079900; cv=none; b=jpFUWqVh30nzJ/o3m3y1ga9uzq4vt1zeKnT996RESkojWBKY0eGkRbdUBxszJQpTek7OSZIDWDRPvXiDuf7+SpTtGnJtS1vmSI2WgyOpICL/SeqSYRMz9+pCplT1ZtY8Zf4e+4RIokKjgYOEuDSa3drVzwohyH8OLedSNF5nXFQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079900; c=relaxed/simple; bh=sLWl2JQyqeVAhWGermIWldFQTk+p5V7tPme605FCGQ0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=I4oR2pI8WA0wC9OW3Z1/vRrB07Kjsyz5AuoQWiS0X7EpRnmsFxVEp8bv09P6F0JyUBoFsBSob/1qgvyunjP2o3dEaTYsIoLoA8EehtPwc3lfIaj3DNGHZc2ZESq1fo9Vq8PAodgmWdbQ8TF2AW2x8ZDazgUdnUEsWN8FQSdBwjM= 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=DytEZA3Q; arc=none smtp.client-ip=209.85.221.42 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="DytEZA3Q" Received: by mail-wr1-f42.google.com with SMTP id ffacd0b85a97d-48c4649b35bso599549f8f.3 for ; Thu, 15 Oct 2026 08:57:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1792079871; x=1792684671; 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=fPi1pScmOBdXgs8foC5HPXZ0T/2VagZrymR7BUhJAbs=; b=DytEZA3QcNhJ5Smqn6mkSHuHblk3pgOFPEBPKAmL1+Gs8k4O8miWjjc63HXeNM8xvE eaFyAYfeZ0V52FeopEph6UvEskE59AgtvoFJ4shhfB3vXpKky8Qija1yJMScyd5dv53+ vbuHyxgKi+9NlXpr87IKaL8BV7LpP5YDQLvEu5e7q+HaaLWdD+AoN754IF4tu9vtnXb8 Yh9eyVclAuBA8mjy2aePvY6+2BOqj+RwQuuU80mpLmMzzWgA0F7GhxtshDCSDdGDUy2t mod6KW7PWW1XRIE8SMn/C1eeAxaeg/r3OqAWDi3lgNK4Wd3BD57zLdVOwbd/IYQW/wXI yTfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792079871; x=1792684671; 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=fPi1pScmOBdXgs8foC5HPXZ0T/2VagZrymR7BUhJAbs=; b=V5wR3XMD2I70Gb3e8J5vcSYEMav6UzHTOoGD/Av59DLVp/mmA9ynRpUuQqldhAuqFo mFrIRDMsn9Io79luhNRW+LWEAGOc/TEIjJjJTvkn6BdgvBAUF9UHzlKHdYKkRyghIwJ+ woCmikELdkrZZRHk/eYtqRPG9VWK+BrWVdk0Iw66mqjqOkXbB5U5w6rZ7GxgUqeMorYJ BKv2eFtUCpsew7+XJe0MNneBUryhdVGqUYyt4HUOJ+Pde+D5mOJczvILHB/dm0SW+RrI ESLlWoyvkhO6e6sa/q2qP86/kv1J+Tlcpd4U0FHXeCiIV6+COJ7FByCA56gAsyaHmWdj mSgQ== X-Forwarded-Encrypted: i=1; AKwUvBwg8yC+7Fx/UXL6V9IBu6LBeWVdcsyWUO26ghd/R74nHrqhmBSMGZQNDYN7yv6M3qPFcpd5uIrlcjlIbxg=@vger.kernel.org X-Gm-Message-State: AFq9FYJFp7S1h77VMHt3gYKXF5+pWgnGckC4HaZFeO4hnKx678jjudsA mKprW18cKqfU2nwgwLogWA5IUGDt+fxG+xYQv5tk3xF/s90IKRpEMp4C2UAqOPY1xP0= X-Gm-Gg: AYBFou0M1qkId+jQcnmmqnWW61tAGoUS9T6pKQiFFSm7nA+iAQrGRT72NFBz/gtH33d VO9CcS2grvA6Bjca4h0va7LjIUw4BPH5/0W9Ku2EBsZpF9g05imoOQHYjtayGXXAfefLnJmDfEh dysm9D0YfOMeQFT+/jhrs53drbRqrNBNKYmkhyMLVhNqZzJhkkLVmF/dpmCEuRyCF+vIsFLcPqK op9BLdl+BPpiNScG5Lbt7rjCApbLqGfMNh3SwHKtpcXz15w37pFJeA2z2I2mppmH8Nq0KbZSNp0 UbQpjEwquZyRBupZeV6bMxZ8XCmvdLfGw3KlJW87E06mZRrVpuAReuVMJk5u8qRWbYju23HPsNM 2q1lfvnMn9ZyCSK5PqcTSqRy7jRQR+/Zh52UyH4Kdjo1TOJtHYzuy+UYp7BbA8FxHF8A4Id4LZI zG0yEawmHNbMx/c6spW7a6BL3SMStw5KOJDJ5QliLlEz8g20ZGbHVi+/g+YNMo0lldfrLSrdyu6 DljtlelXwMQzQp1hMHoHvxODLsbFAECIAfqBCfoDEhYYhOKWA== X-Received: by 2002:a05:6000:298f:20b0:489:bc38:9438 with SMTP id ffacd0b85a97d-48dbaae70a1mr31060964f8f.29.1792079870916; Thu, 15 Oct 2026 08:57:50 -0700 (PDT) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-48de0aaaaebsm19877251f8f.14.2026.10.15.08.57.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Oct 2026 08:57:50 -0700 (PDT) From: Dave Stevenson Date: Thu, 15 Oct 2026 16:57:40 +0100 Subject: [PATCH v4 14/16] media: sony-starvis2: Only update bits for 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: <20261015-media-starvis2-v4-14-75fcdb4163f3@raspberrypi.com> References: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> In-Reply-To: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> To: Sakari Ailus , Jai Luthra , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Laurent Pinchart , Alexander Shiyan , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Dave Stevenson X-Mailer: b4 0.14.1 IMX585 requires bit 4 of the WINMODE register (0x3018) to be set, whilst the bottom nibble selects between all-pixel and window mode. Switch to using cci_update_bits so that only the bottom nibble is updated, thereby working on all supported Starvis2 sensors. Signed-off-by: Dave Stevenson --- drivers/media/i2c/sony-starvis2.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/media/i2c/sony-starvis2.c b/drivers/media/i2c/sony-sta= rvis2.c index 1dec5d923077..8585f5c93dc2 100644 --- a/drivers/media/i2c/sony-starvis2.c +++ b/drivers/media/i2c/sony-starvis2.c @@ -88,6 +88,7 @@ =20 /* Crop */ #define STARVIS2_REG_WINMODE CCI_REG8(0x3018) +#define STARVIS2_REG_WINMODE_MASK 0x0f #define STARVIS2_REG_PIX_HST CCI_REG16_LE(0x303c) #define STARVIS2_REG_PIX_HWIDTH CCI_REG16_LE(0x303e) #define STARVIS2_REG_PIX_VST CCI_REG16_LE(0x3044) @@ -1458,7 +1459,8 @@ static int starvis2_program_window(struct starvis2 *s= tarvis2, int ret =3D 0; =20 cci_write(starvis2->cci, STARVIS2_REG_ADDMODE, 0x00, &ret); - cci_write(starvis2->cci, STARVIS2_REG_WINMODE, 0x04, &ret); + cci_update_bits(starvis2->cci, STARVIS2_REG_WINMODE, + STARVIS2_REG_WINMODE_MASK, 0x04, &ret); cci_write(starvis2->cci, STARVIS2_REG_PIX_HST, crop->left - starvis2->variant->active_area.left, &ret); cci_write(starvis2->cci, STARVIS2_REG_PIX_HWIDTH, crop->width, &ret); --=20 2.34.1 From nobody Fri Oct 23 22:12:51 2026 Received: from mail-wr1-f52.google.com (mail-wr1-f52.google.com [209.85.221.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A23A153C3DB for ; Thu, 15 Oct 2026 15:57:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079900; cv=none; b=PCd4Y6LvmqvekLamvcXd1/YLptgzQX7V7D2G8xKoSFgioMbvsyfLZMFmZ7OW3gZIf063kX8gGeReeRddFurYjBXOJrifok2mwOehBfEmxmwOOfN9jh/Q4uOFKpTiXwbPSLudn4V2xtEfcGO10b3D7DLwQZag1keMz7U+IStwSUs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079900; c=relaxed/simple; bh=WFwaN6l1InwHpWmro44GXUpQlmOi9SBBR9O6QCn2b80=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cI6aIEm9aMMymQ+S5rtddl3R4Dm7H+sSS9434Q8IllumAXEy9BFzaXmXuuDxetTIg4WWdfBN2WCXxHQDUsq0FkcOPGFRfCHLUXsC6yy91U1x196GZmUYRIQ3vTMFJ3cGpgQgeyf6tLO9OsodbfzEA6cZEhJYLIqZfiTesYri/qY= 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=oO1X54ql; arc=none smtp.client-ip=209.85.221.52 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="oO1X54ql" Received: by mail-wr1-f52.google.com with SMTP id ffacd0b85a97d-48c4649b35bso599565f8f.3 for ; Thu, 15 Oct 2026 08:57:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1792079872; x=1792684672; 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=3In2oOWO8+3UsZU5x8EvcHjp1PcydHDNy8dPtqhayIc=; b=oO1X54qlBQAugab6birvpc0WKJW3ShbgET9LTlM/MMM+d2UooQcVkzUbsmM67Ri2Aw Gq/zSt/EPdX1rUoQGWCK0xWYJ1oGY4fksbfzAq4z76BYkGKmRI5nc1J+gRKOlSLFLyzV 2CqklgOR/JR9+cYu7aGBTxvB351yP3OKhpQybtc06VK3/8+aEydgWLfzldvr5sH9cV6I oCM4Utbv/HSuM6c/60QC03tRJDTT33YcQ2d9MX+XcOS8Gu5JNCujhXoIdmzUpq6DjOLw DMUC6Zd5x818uGYVSw7MrsxCVNiKXqi00hGPdU1SRgAHXvigVwpQY0vadKa6/DTsKG95 xYdQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792079872; x=1792684672; 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=3In2oOWO8+3UsZU5x8EvcHjp1PcydHDNy8dPtqhayIc=; b=iToHIdjNcoWbrllK+403k7XBSdtpjeYpwtI3aFiZR3kCH5rvLBYKSy0EoCvcEFz/xS MY7fjymgBvQ4h0sufm/Wv+W1m4X5oEoU3HDoQm+Ad6IrvJBuowITaR3ftWRNMfhBKKEt 5epK5pJzaKW2FUEMAFujO5BpStd3yPvK0HS33WkIInGtcM2brPCwtOhXqNqE24OhKFAB KSmm7YOqbAjJOeUDATfUhtwySZcHQ36xTk6WEJQP3/d0JiWntR8/fashWXUWF2UkrOu0 QJ6IKfb9/b4ENeJzoqAAgBihwd7rkaaqKx6vD+t8PcYKTDOkmsU5hobV5TzN4WxWmfjR mu/w== X-Forwarded-Encrypted: i=1; AKwUvBy3M2+SiV8RYI7JkPmClHLcmW3TmkRjGoJYg/EfPAYSrkYtRNL/DBGvm+e1Q2dDIsLjFzA/KyVSoL2Rg9M=@vger.kernel.org X-Gm-Message-State: AFq9FYJY+djw9VqSG84vKQ4t/+XWqWou7UNeJPyDfCy3IXqJMGJJY3Xt BdLIgzUELKR0oLOkNpcZZT0HMmTDi2g/+/a4UVqAivMIOUokAWDGdGXApntGrqHZU7IagPuioE7 44uqFlq4= X-Gm-Gg: AYBFou1URDASOiE9DYL8yfFZEttjDJoNTyy2SGEZDnRrFPkWtSLa2ovZIOZLTGGNPmC VZ5fEZNQ1nv/q4IFLZhp9wJtiS0hUTcvsaB2xzndYxstOwWfeGMLOApXEpFZs+FaSR82kLnleBm V2IczFpOjQl2l03hdWmzITimRgASvicZfPe+4gurMYTotAI4eGmLwVK9PcScQJw5UDp3q7o637t zcVBraxJh7DDxm2PMjPGsZUE8WeQl0ad52n42YIbNfVuubmn/+DGO2xxU5N2CvEkHX7FTUOx0ft vJv6AK2LZ374znd4izjfy0QTcANkKFhdTXKUpvcfUcvp7sB/MKyo1unle3zydbS59zgzgGwjCBQ y6dTArkUCKm2mKnInW57it7zE1rI0EolZGFFyR1t1vF2tgbbIDr46cs6yLh1007KRAojQXZlZ2w 28O5fGNBlhx0RD6WuePWzfG6pHDrAuPBp3VtHu9cY8aY8my1vP8VzAjihixfEAB0ZnNybPz7Avs dmhOdkbCc2eU0jyRYE8seBYj3yHvPlubel+rgG3kxKRB3AS3Q== X-Received: by 2002:adf:e183:0:b0:487:490:8391 with SMTP id ffacd0b85a97d-48dbaadd94cmr38049648f8f.16.1792079871811; Thu, 15 Oct 2026 08:57:51 -0700 (PDT) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-48de0aaaaebsm19877251f8f.14.2026.10.15.08.57.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Oct 2026 08:57:51 -0700 (PDT) From: Dave Stevenson Date: Thu, 15 Oct 2026 16:57:41 +0100 Subject: [PATCH v4 15/16] media: sony-starvis2: Parameterise exposure min and step 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: <20261015-media-starvis2-v4-15-75fcdb4163f3@raspberrypi.com> References: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> In-Reply-To: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> To: Sakari Ailus , Jai Luthra , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Laurent Pinchart , Alexander Shiyan , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Dave Stevenson X-Mailer: b4 0.14.1 All the Starvis2 sensors supported to this point have specified the range for the SHR (exposure) register as being 4 to (number of line per frame -1). Newer sensors are deviating from that, so parameterise these into the sensor variant, replacing STARVIS2_EXPOSURE_MIN, STARVIS2_EXPOSURE_STEP, and STARVIS2_SHR_MIN. Signed-off-by: Dave Stevenson --- drivers/media/i2c/sony-starvis2.c | 37 ++++++++++++++++++++++++++---------= -- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/drivers/media/i2c/sony-starvis2.c b/drivers/media/i2c/sony-sta= rvis2.c index 8585f5c93dc2..5f360f557671 100644 --- a/drivers/media/i2c/sony-starvis2.c +++ b/drivers/media/i2c/sony-starvis2.c @@ -67,11 +67,8 @@ =20 /* SHR internal */ #define STARVIS2_REG_SHR CCI_REG24_LE(0x3050) -#define STARVIS2_SHR_MIN 4 =20 /* Exposure control */ -#define STARVIS2_EXPOSURE_MIN 1 -#define STARVIS2_EXPOSURE_STEP 1 #define STARVIS2_EXPOSURE_DEFAULT 1000 =20 /* @@ -640,6 +637,9 @@ struct starvis2_variant { unsigned int vmax_default; const u16 *hmax_min_link_freq; u16 hmax_min_pixel_array; + unsigned int exposure_min; + unsigned int exposure_step; + unsigned int shr_min; }; =20 static const struct starvis2_variant imx678_variant_def =3D { @@ -666,6 +666,9 @@ static const struct starvis2_variant imx678_variant_def= =3D { .vmax_default =3D 2250, .hmax_min_link_freq =3D imx678_min_hmax_2lane, .hmax_min_pixel_array =3D 550, + .exposure_min =3D 1, + .exposure_step =3D 1, + .shr_min =3D 4, }; =20 static const struct cci_reg_sequence imx662_common_regs[] =3D { @@ -796,6 +799,9 @@ static const struct starvis2_variant imx662_variant_def= =3D { .vmax_default =3D 1136, .hmax_min_link_freq =3D imx662_min_hmax_2lane, .hmax_min_pixel_array =3D 990, + .exposure_min =3D 1, + .exposure_step =3D 1, + .shr_min =3D 4, }; =20 static const struct cci_reg_sequence imx675_common_regs[] =3D { @@ -983,6 +989,9 @@ static const struct starvis2_variant imx675_variant_def= =3D { .vmax_default =3D 2024, .hmax_min_link_freq =3D imx675_min_hmax_2lane, .hmax_min_pixel_array =3D 528, + .exposure_min =3D 1, + .exposure_step =3D 1, + .shr_min =3D 4, }; =20 static const struct cci_reg_sequence imx832_common_regs[] =3D { @@ -1076,6 +1085,9 @@ static const struct starvis2_variant imx832_variant_d= ef =3D { .vmax_default =3D 1136, .hmax_min_link_freq =3D imx832_min_hmax_2lane, .hmax_min_pixel_array =3D 990, + .exposure_min =3D 1, + .exposure_step =3D 1, + .shr_min =3D 4, }; =20 struct starvis2_model_info { @@ -1247,12 +1259,15 @@ static int starvis2_set_ctrl(struct v4l2_ctrl *ctrl) starvis2->vmax =3D format->height + ctrl->val; =20 current_exposure =3D clamp_t(u32, current_exposure, - STARVIS2_EXPOSURE_MIN, - starvis2->vmax - STARVIS2_SHR_MIN); + starvis2->variant->exposure_min, + starvis2->vmax - + starvis2->variant->shr_min); ret =3D __v4l2_ctrl_modify_range(starvis2->exposure, - STARVIS2_EXPOSURE_MIN, - starvis2->vmax - STARVIS2_SHR_MIN, - 1, current_exposure); + starvis2->variant->exposure_min, + starvis2->vmax - + starvis2->variant->shr_min, + starvis2->variant->exposure_step, + current_exposure); if (ret) return ret; } @@ -1775,10 +1790,10 @@ static int starvis2_init_controls(struct starvis2 *= starvis2) =20 starvis2->exposure =3D v4l2_ctrl_new_std(ctrl_hdlr, &starvis2_ctrl_ops, V4L2_CID_EXPOSURE, - STARVIS2_EXPOSURE_MIN, + starvis2->variant->exposure_min, starvis2->variant->vmax_default - - STARVIS2_SHR_MIN, - STARVIS2_EXPOSURE_STEP, + starvis2->variant->shr_min, + starvis2->variant->exposure_step, STARVIS2_EXPOSURE_DEFAULT); =20 v4l2_ctrl_new_std(ctrl_hdlr, &starvis2_ctrl_ops, V4L2_CID_ANALOGUE_GAIN, --=20 2.34.1 From nobody Fri Oct 23 22:12:51 2026 Received: from mail-wr1-f53.google.com (mail-wr1-f53.google.com [209.85.221.53]) (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 9931B54936B for ; Thu, 15 Oct 2026 15:57:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079900; cv=none; b=S02ZM94fuocvRukH9yLjfOfvOIaUcbFdwX2B3op0+xHOb0quE06kI6em8TVFp8JsLzD4S51nBmpszQn6prohFUx4sHLRU2WPD/Vu2c1Tr6PkdqxiJr9TSY3GvAhcdXQB7TTzcFFqurvMGXKk1J49V/6B1aS28p+EJaAJ1eJTCqQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1792079900; c=relaxed/simple; bh=i+PyeaCfNlQmifwl+IGWUcKlBfq4aTA+ujf8KClYU2Q=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oIbSFFQU5DxHJQAXyif6TfXblxJkdRW6w4Kx4QhPZ4R0isUPDVQtllOSh06F2OMjFr9686n/3fAIaFmHnoHTcDpUmHVnZq6CednTlm3QsqlEer7HCfEGgNZ2Bnkgt6fwnWUKaD3YBZrtA6S//cYQW1vVBGIni7XndiJTsmnjHPE= 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=GNrgLs43; arc=none smtp.client-ip=209.85.221.53 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="GNrgLs43" Received: by mail-wr1-f53.google.com with SMTP id ffacd0b85a97d-48df4f540ebso565185f8f.3 for ; Thu, 15 Oct 2026 08:57:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1792079873; x=1792684673; 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=PTG/b4KwlwwTr/s6RiiEZBeEHGX8c9PSv2PfAqR7u8w=; b=GNrgLs43tXQidFZY1elFgLSLMz686D1RWvioVEKe9pwkpAXl1tZbTSHDs2SkQuc9JF 06cVXqb6E5fg8CcoZri2AUsBqPKJ8HwsIeCCrUCFTi4rDzncbWiNkFQCvgVtkT4GiOjZ us1e1uMXwJXD6VZu6q+73lyCqhEG0Le8mpKgy3KFuRDhRqjpv3ww7M0T9qe5AVFWAaf0 3uz0ITPf/lqF/035P3FFubJHS47cL9t3WRnv9m/gTPrvWgW1Kf8xTCsKRJPMgg+jeaKW ZHVDjCG5CD3rRfic16xyqfTEyDUF0D6NuYDHVz5qBCdhUEkcQ6IaQS+jSJD6kVSX0Im9 QoqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792079873; x=1792684673; 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=PTG/b4KwlwwTr/s6RiiEZBeEHGX8c9PSv2PfAqR7u8w=; b=MfGlcqaASSg4pMkRSM3U7obE3l7Zdoa5KbBg/oXTVUF/ywZWde9gc0LHHLgipStBfn uBObGFD7yRjwttkGBvC/x2M+UReVm8sXIWvQcLINT6/2CFdtwEKSZZbv+uGRNn8ZAmpT utNJW/9ObQPbJvikF1Y5Y1oYsx6rImy9a8kTYfLT9QYM642wIZ2x/OadkpCB3fmvoQEn xLQkgqsBP1QUEy1S2WtbC5ZsOroWTgNn8ggRZVhIkKUAPQ5eQ2MZln/3X/CXZMvb35Oa hKBd+fogPLAcIZldJOPvzTrDIpt/0sm8wcCPPGsAYW2IhqMrzdVWEwZsJk7oN+m56D68 mM9A== X-Forwarded-Encrypted: i=1; AKwUvBwrDfRwOnxf6OqBZ0dBl/RA5wXn8qdHWKMgtXlVV9By7iGo7SN2ElYXQ0Ez1naEr1pZd2/ok6kAgMgaDlo=@vger.kernel.org X-Gm-Message-State: AFq9FYKmqK5faa/YWkL4wZVRkHd6Fq6uWlMo1zG1iEJy9c7gyGWBjAIu uS2hcycTfhujQbAHMw2Ar0zzXOBbF96eOOBr7B/tufUuFzK+m9dBPZFcN+5IBCmTLDY= X-Gm-Gg: AYBFou0i7Tcx2JO3VW654rvqSFsn5h7ABfb/jic1nKvOuc9DK84TAUKsFXBei5SCylo gAcPHhmlLY73WZi/d5wuBXNOH/lDkAXsDE4UPc6wtNWkaib0r5c/hGGvyqz9Ete4aN3P5IXYMI2 YNCl7/5Tl6STRXOOfmQfzi5HN7mECTPrtnOYxnrjmRXBn4Mxxo7qACTXJ6rAE868PZSn/WHZTpX A7BwdNnZnO5xC1DP2vB+Y+RHNo8nNTia4oYDvOmBgnvVQOISP6niJymxYdCkaRJLAKq1V0szU7g k/yCbEb5jz1XyplqTqpDac6UsQFVOxZZLxt40/8+t/co5nFjntnQ76cquR0/k413JumDMSXSbgG hIaScZnSwftUZNTmv3BPgSzV0UDLjGrq7peXalu0EiH0byKgdjDUljoQ8bRjY5bnQgEsCQlmz48 FZcD6mfOH1pRPdpD1zmwga7aKqzejbEec9qjSyBhA6Ioph4bIJW+VY+dPg8ypdk+kCIFVjvjf+X FODrWuOW3AHw/IzyIXIYP9sF46Wl9q/l67sqvbvYLe+pNu+CQ== X-Received: by 2002:a05:6000:188a:b0:48b:e54:84a1 with SMTP id ffacd0b85a97d-48dbad092e5mr41439630f8f.55.1792079873498; Thu, 15 Oct 2026 08:57:53 -0700 (PDT) Received: from [127.0.1.1] ([2a00:1098:3142:e::8]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-48de0aaaaebsm19877251f8f.14.2026.10.15.08.57.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Oct 2026 08:57:52 -0700 (PDT) From: Dave Stevenson Date: Thu, 15 Oct 2026 16:57:42 +0100 Subject: [PATCH v4 16/16] media: sony-starvis2: Add support for IMX585 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: <20261015-media-starvis2-v4-16-75fcdb4163f3@raspberrypi.com> References: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> In-Reply-To: <20261015-media-starvis2-v4-0-75fcdb4163f3@raspberrypi.com> To: Sakari Ailus , Jai Luthra , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Laurent Pinchart , Alexander Shiyan , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Dave Stevenson X-Mailer: b4 0.14.1 IMX585 is an 8MPix Starvis 2 sensor, so add support for it. Signed-off-by: Dave Stevenson --- drivers/media/i2c/sony-starvis2.c | 305 ++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 305 insertions(+) diff --git a/drivers/media/i2c/sony-starvis2.c b/drivers/media/i2c/sony-sta= rvis2.c index 5f360f557671..c6a6a44d401e 100644 --- a/drivers/media/i2c/sony-starvis2.c +++ b/drivers/media/i2c/sony-starvis2.c @@ -14,6 +14,8 @@ * pixels. * IMX832: Diagonal 6.45mm (Type 1/2.8) CMOS image sensor with 2.12 M effe= ctive * pixels. + * IMX585: Diagonal 12.84 mm (Type 1/1.2) CMOS image sensor with 8.40 M ef= fective + * pixels. * * Copyright (C) 2026 Ideas On Board Oy. * @@ -1090,6 +1092,286 @@ static const struct starvis2_variant imx832_variant= _def =3D { .shr_min =3D 4, }; =20 +static const struct cci_reg_sequence imx585_common_regs[] =3D { + { STARVIS2_REG_THIN_V_EN, 0x00 }, + { STARVIS2_REG_VCMODE, 0x01 }, + { CCI_REG8(0x306b), 0x00 }, + { STARVIS2_REG_GAIN_PGC_FIDMD, 0x01 }, + + { CCI_REG8(0x3460), 0x21 }, + { CCI_REG8(0x3478), 0xa1 }, + { CCI_REG8(0x347c), 0x01 }, + { CCI_REG8(0x3480), 0x01 }, + { CCI_REG8(0x3930), 0x0c }, + { CCI_REG8(0x3931), 0x01 }, + { CCI_REG8(0x3a4c), 0x39 }, + { CCI_REG8(0x3a4d), 0x01 }, + { CCI_REG8(0x3a4e), 0x14 }, + { CCI_REG8(0x3a50), 0x48 }, + { CCI_REG8(0x3a51), 0x01 }, + { CCI_REG8(0x3a52), 0x14 }, + { CCI_REG8(0x3a56), 0x00 }, + { CCI_REG8(0x3a5a), 0x00 }, + { CCI_REG8(0x3a5e), 0x00 }, + { CCI_REG8(0x3a62), 0x00 }, + { CCI_REG8(0x3a6a), 0x20 }, + { CCI_REG8(0x3a6c), 0x42 }, + { CCI_REG8(0x3a6e), 0xa0 }, + { CCI_REG8(0x3b2c), 0x0c }, + { CCI_REG8(0x3b30), 0x1c }, + { CCI_REG8(0x3b34), 0x0c }, + { CCI_REG8(0x3b38), 0x1c }, + { CCI_REG8(0x3ba0), 0x0c }, + { CCI_REG8(0x3ba4), 0x1c }, + { CCI_REG8(0x3ba8), 0x0c }, + { CCI_REG8(0x3bac), 0x1c }, + { CCI_REG8(0x3d3c), 0x11 }, + { CCI_REG8(0x3d46), 0x0b }, + { CCI_REG8(0x3de0), 0x3f }, + { CCI_REG8(0x3de1), 0x08 }, + { CCI_REG8(0x3e10), 0x10 }, + { CCI_REG8(0x3e14), 0x87 }, + { CCI_REG8(0x3e16), 0x91 }, + { CCI_REG8(0x3e18), 0x91 }, + { CCI_REG8(0x3e1a), 0x87 }, + { CCI_REG8(0x3e1c), 0x78 }, + { CCI_REG8(0x3e1e), 0x50 }, + { CCI_REG8(0x3e20), 0x50 }, + { CCI_REG8(0x3e22), 0x50 }, + { CCI_REG8(0x3e24), 0x87 }, + { CCI_REG8(0x3e26), 0x91 }, + { CCI_REG8(0x3e28), 0x91 }, + { CCI_REG8(0x3e2a), 0x87 }, + { CCI_REG8(0x3e2c), 0x78 }, + { CCI_REG8(0x3e2e), 0x50 }, + { CCI_REG8(0x3e30), 0x50 }, + { CCI_REG8(0x3e32), 0x50 }, + { CCI_REG8(0x3e34), 0x87 }, + { CCI_REG8(0x3e36), 0x91 }, + { CCI_REG8(0x3e38), 0x91 }, + { CCI_REG8(0x3e3a), 0x87 }, + { CCI_REG8(0x3e3c), 0x78 }, + { CCI_REG8(0x3e3e), 0x50 }, + { CCI_REG8(0x3e40), 0x50 }, + { CCI_REG8(0x3e42), 0x50 }, + { CCI_REG8(0x4054), 0x64 }, + { CCI_REG8(0x4148), 0xfe }, + { CCI_REG8(0x4149), 0x05 }, + { CCI_REG8(0x414a), 0xff }, + { CCI_REG8(0x414b), 0x05 }, + { CCI_REG8(0x420a), 0x03 }, + { CCI_REG8(0x4231), 0x08 }, + { CCI_REG8(0x423d), 0x9c }, + { CCI_REG8(0x4242), 0xb4 }, + { CCI_REG8(0x4246), 0xb4 }, + { CCI_REG8(0x424e), 0xb4 }, + { CCI_REG8(0x425c), 0xb4 }, + { CCI_REG8(0x425e), 0xb6 }, + { CCI_REG8(0x426c), 0xb4 }, + { CCI_REG8(0x426e), 0xb6 }, + { CCI_REG8(0x428c), 0xb4 }, + { CCI_REG8(0x428e), 0xb6 }, + { CCI_REG8(0x4708), 0x00 }, + { CCI_REG8(0x4709), 0x00 }, + { CCI_REG8(0x470a), 0xff }, + { CCI_REG8(0x470b), 0x03 }, + { CCI_REG8(0x470c), 0x00 }, + { CCI_REG8(0x470d), 0x00 }, + { CCI_REG8(0x470e), 0xff }, + { CCI_REG8(0x470f), 0x03 }, + { CCI_REG8(0x47eb), 0x1c }, + { CCI_REG8(0x47f0), 0xa6 }, + { CCI_REG8(0x47f2), 0xa6 }, + { CCI_REG8(0x47f4), 0xa0 }, + { CCI_REG8(0x47f6), 0x96 }, + { CCI_REG8(0x4808), 0xa6 }, + { CCI_REG8(0x480a), 0xa6 }, + { CCI_REG8(0x480c), 0xa0 }, + { CCI_REG8(0x480e), 0x96 }, + { CCI_REG8(0x492c), 0xb2 }, + { CCI_REG8(0x4930), 0x03 }, + { CCI_REG8(0x4932), 0x03 }, + { CCI_REG8(0x4936), 0x5b }, + { CCI_REG8(0x4938), 0x82 }, + { CCI_REG8(0x493c), 0x23 }, + { CCI_REG8(0x493e), 0x23 }, + { CCI_REG8(0x4940), 0x23 }, + { CCI_REG8(0x4ba8), 0x1c }, + { CCI_REG8(0x4ba9), 0x03 }, + { CCI_REG8(0x4bac), 0x1c }, + { CCI_REG8(0x4bad), 0x1c }, + { CCI_REG8(0x4bae), 0x1c }, + { CCI_REG8(0x4baf), 0x1c }, + { CCI_REG8(0x4bb0), 0x1c }, + { CCI_REG8(0x4bb1), 0x1c }, + { CCI_REG8(0x4bb2), 0x1c }, + { CCI_REG8(0x4bb3), 0x1c }, + { CCI_REG8(0x4bb4), 0x1c }, + { CCI_REG8(0x4bb8), 0x03 }, + { CCI_REG8(0x4bb9), 0x03 }, + { CCI_REG8(0x4bba), 0x03 }, + { CCI_REG8(0x4bbb), 0x03 }, + { CCI_REG8(0x4bbc), 0x03 }, + { CCI_REG8(0x4bbd), 0x03 }, + { CCI_REG8(0x4bbe), 0x03 }, + { CCI_REG8(0x4bbf), 0x03 }, + { CCI_REG8(0x4bc0), 0x03 }, + { CCI_REG8(0x4c14), 0x87 }, + { CCI_REG8(0x4c16), 0x91 }, + { CCI_REG8(0x4c18), 0x91 }, + { CCI_REG8(0x4c1a), 0x87 }, + { CCI_REG8(0x4c1c), 0x78 }, + { CCI_REG8(0x4c1e), 0x50 }, + { CCI_REG8(0x4c20), 0x50 }, + { CCI_REG8(0x4c22), 0x50 }, + { CCI_REG8(0x4c24), 0x87 }, + { CCI_REG8(0x4c26), 0x91 }, + { CCI_REG8(0x4c28), 0x91 }, + { CCI_REG8(0x4c2a), 0x87 }, + { CCI_REG8(0x4c2c), 0x78 }, + { CCI_REG8(0x4c2e), 0x50 }, + { CCI_REG8(0x4c30), 0x50 }, + { CCI_REG8(0x4c32), 0x50 }, + { CCI_REG8(0x4c34), 0x87 }, + { CCI_REG8(0x4c36), 0x91 }, + { CCI_REG8(0x4c38), 0x91 }, + { CCI_REG8(0x4c3a), 0x87 }, + { CCI_REG8(0x4c3c), 0x78 }, + { CCI_REG8(0x4c3e), 0x50 }, + { CCI_REG8(0x4c40), 0x50 }, + { CCI_REG8(0x4c42), 0x50 }, + { CCI_REG8(0x4d12), 0x1f }, + { CCI_REG8(0x4d13), 0x1e }, + { CCI_REG8(0x4d26), 0x33 }, + { CCI_REG8(0x4e0e), 0x59 }, + { CCI_REG8(0x4e14), 0x55 }, + { CCI_REG8(0x4e16), 0x59 }, + { CCI_REG8(0x4e1e), 0x3b }, + { CCI_REG8(0x4e20), 0x47 }, + { CCI_REG8(0x4e22), 0x54 }, + { CCI_REG8(0x4e26), 0x81 }, + { CCI_REG8(0x4e2c), 0x7d }, + { CCI_REG8(0x4e2e), 0x81 }, + { CCI_REG8(0x4e36), 0x63 }, + { CCI_REG8(0x4e38), 0x6f }, + { CCI_REG8(0x4e3a), 0x7c }, + { CCI_REG8(0x4f3a), 0x3c }, + { CCI_REG8(0x4f3c), 0x46 }, + { CCI_REG8(0x4f3e), 0x59 }, + { CCI_REG8(0x4f42), 0x64 }, + { CCI_REG8(0x4f44), 0x6e }, + { CCI_REG8(0x4f46), 0x81 }, + { CCI_REG8(0x4f4a), 0x82 }, + { CCI_REG8(0x4f5a), 0x81 }, + { CCI_REG8(0x4f62), 0xaa }, + { CCI_REG8(0x4f72), 0xa9 }, + { CCI_REG8(0x4f78), 0x36 }, + { CCI_REG8(0x4f7a), 0x41 }, + { CCI_REG8(0x4f7c), 0x61 }, + { CCI_REG8(0x4f7d), 0x01 }, + { CCI_REG8(0x4f7e), 0x7c }, + { CCI_REG8(0x4f7f), 0x01 }, + { CCI_REG8(0x4f80), 0x77 }, + { CCI_REG8(0x4f82), 0x7b }, + { CCI_REG8(0x4f88), 0x37 }, + { CCI_REG8(0x4f8a), 0x40 }, + { CCI_REG8(0x4f8c), 0x62 }, + { CCI_REG8(0x4f8d), 0x01 }, + { CCI_REG8(0x4f8e), 0x76 }, + { CCI_REG8(0x4f8f), 0x01 }, + { CCI_REG8(0x4f90), 0x5e }, + { CCI_REG8(0x4f91), 0x02 }, + { CCI_REG8(0x4f92), 0x69 }, + { CCI_REG8(0x4f93), 0x02 }, + { CCI_REG8(0x4f94), 0x89 }, + { CCI_REG8(0x4f95), 0x02 }, + { CCI_REG8(0x4f96), 0xa4 }, + { CCI_REG8(0x4f97), 0x02 }, + { CCI_REG8(0x4f98), 0x9f }, + { CCI_REG8(0x4f99), 0x02 }, + { CCI_REG8(0x4f9a), 0xa3 }, + { CCI_REG8(0x4f9b), 0x02 }, + { CCI_REG8(0x4fa0), 0x5f }, + { CCI_REG8(0x4fa1), 0x02 }, + { CCI_REG8(0x4fa2), 0x68 }, + { CCI_REG8(0x4fa3), 0x02 }, + { CCI_REG8(0x4fa4), 0x8a }, + { CCI_REG8(0x4fa5), 0x02 }, + { CCI_REG8(0x4fa6), 0x9e }, + { CCI_REG8(0x4fa7), 0x02 }, + { CCI_REG8(0x519e), 0x79 }, + { CCI_REG8(0x51a6), 0xa1 }, + { CCI_REG8(0x51f0), 0xac }, + { CCI_REG8(0x51f2), 0xaa }, + { CCI_REG8(0x51f4), 0xa5 }, + { CCI_REG8(0x51f6), 0xa0 }, + { CCI_REG8(0x5200), 0x9b }, + { CCI_REG8(0x5202), 0x91 }, + { CCI_REG8(0x5204), 0x87 }, + { CCI_REG8(0x5206), 0x82 }, + { CCI_REG8(0x5208), 0xac }, + { CCI_REG8(0x520a), 0xaa }, + { CCI_REG8(0x520c), 0xa5 }, + { CCI_REG8(0x520e), 0xa0 }, + { CCI_REG8(0x5210), 0x9b }, + { CCI_REG8(0x5212), 0x91 }, + { CCI_REG8(0x5214), 0x87 }, + { CCI_REG8(0x5216), 0x82 }, + { CCI_REG8(0x5218), 0xac }, + { CCI_REG8(0x521a), 0xaa }, + { CCI_REG8(0x521c), 0xa5 }, + { CCI_REG8(0x521e), 0xa0 }, + { CCI_REG8(0x5220), 0x9b }, + { CCI_REG8(0x5222), 0x91 }, + { CCI_REG8(0x5224), 0x87 }, + { CCI_REG8(0x5226), 0x82 }, + { CCI_REG8(0x5b3c), 0x07 }, + + { STARVIS2_REG_WDMODE, 0x00 }, + { STARVIS2_REG_MDBIT, 0x01 }, + { STARVIS2_REG_XXS_DRV, 0x00 }, +}; + +static const u16 imx585_min_hmax_2lane[] =3D { + [STARVIS2_LINK_FREQ_297MHZ] =3D 2984, + [STARVIS2_LINK_FREQ_360MHZ] =3D 2464, + [STARVIS2_LINK_FREQ_445MHZ] =3D 2004, + [STARVIS2_LINK_FREQ_594MHZ] =3D 1512, + [STARVIS2_LINK_FREQ_720MHZ] =3D 1260, + [STARVIS2_LINK_FREQ_891MHZ] =3D 996, + [STARVIS2_LINK_FREQ_1039MHZ] =3D 856, + [STARVIS2_LINK_FREQ_1188MHZ] =3D 856, +}; + +static const struct starvis2_variant imx585_variant_def =3D { + .name =3D "imx585", + .id_reg =3D CCI_REG16_LE(0x5a1d), + .id_mask =3D 0x3ff, + .id_value =3D 0x259, + .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 594000000, + .pix_per_clk =3D 8, + .common_regs =3D imx585_common_regs, + .num_common_regs =3D ARRAY_SIZE(imx585_common_regs), + .vmax_default =3D 2250, + .hmax_min_link_freq =3D imx585_min_hmax_2lane, + .hmax_min_pixel_array =3D 550, + .exposure_min =3D 2, + .exposure_step =3D 2, + .shr_min =3D 8, +}; + struct starvis2_model_info { enum starvis2_type type; const u32 *codes; @@ -1180,6 +1462,26 @@ static const struct starvis2_model_info imx832_autod= etect_info =3D { .auto_detect_mono =3D &imx832_amr_info, }; =20 +static const struct starvis2_model_info imx585_aaqj_info =3D { + .type =3D STARVIS2_COLOR, + .codes =3D codes_bayer, + .num_codes =3D ARRAY_SIZE(codes_bayer), + .variant =3D &imx585_variant_def, +}; + +static const struct starvis2_model_info imx585_aamj_info =3D { + .type =3D STARVIS2_MONOCHROME, + .codes =3D codes_monochrome, + .num_codes =3D ARRAY_SIZE(codes_monochrome), + .variant =3D &imx585_variant_def, +}; + +static const struct starvis2_model_info imx585_autodetect_info =3D { + .variant =3D &imx585_variant_def, + .auto_detect_colour =3D &imx585_aaqj_info, + .auto_detect_mono =3D &imx585_aamj_info, +}; + static const char * const starvis2_supply_name[] =3D { "avdd", /* Analog (3.3V) supply */ "dvdd", /* Digital Core (1.1V) supply */ @@ -2020,6 +2322,8 @@ static const struct dev_pm_ops starvis2_pm_ops =3D { }; =20 static const struct of_device_id starvis2_of_match[] =3D { + { .compatible =3D "sony,imx585-aamj", .data =3D &imx585_aamj_info }, + { .compatible =3D "sony,imx585-aaqj", .data =3D &imx585_aaqj_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 }, @@ -2029,6 +2333,7 @@ static const struct of_device_id starvis2_of_match[] = =3D { { .compatible =3D "sony,imx832-amr", .data =3D &imx832_amr_info }, { .compatible =3D "sony,imx832-aqr", .data =3D &imx832_aqr_info }, /* for non-conforming DTs that rely on runtime check */ + { .compatible =3D "sony,imx585", .data =3D &imx585_autodetect_info }, { .compatible =3D "sony,imx662", .data =3D &imx662_autodetect_info }, { .compatible =3D "sony,imx675", .data =3D &imx675_autodetect_info }, { .compatible =3D "sony,imx678", .data =3D &imx678_autodetect_info }, --=20 2.34.1