From nobody Fri Dec 19 22:05:20 2025 Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on2082.outbound.protection.outlook.com [40.107.22.82]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E2B7D1D6DB7; Tue, 26 Nov 2024 15:53:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.22.82 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732636413; cv=fail; b=ZddDBXjqxJz8XeI93/jTYGBKeanQzYJEqL3/TTbp8Owb4WlfpyVbdm4apk9RJav4jkRUGVIdAl2UUexPL4aoZSEeHRWiEpna7rrwtsap2fBzSDMfqhVM1EkSXraJUvijUppgkSJAvTmuMSstHsSblZxXgOCZV86edNhb9iV0GL0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732636413; c=relaxed/simple; bh=nDtH3wJkil7pqw2eF/jktrpFzrZP+BWZ0FZMkp0qx24=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=pdBYDnnwQ8k23S2ZArzdiuDKuzGi/WA0uiOgotP96+/Qd9k6EDYdaUi9ZAEshYoh14Zqr3+2wJWmD102z0NwwU+5xE8r6dosTKDlnBPF/s+lPLaFQhL+bSSUNekfusRK9hWY+IWkUYO5aUugaKvivV4sp+zRgNhViTy5h9GfeNk= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=SEgDo65w; arc=fail smtp.client-ip=40.107.22.82 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="SEgDo65w" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=NnA630qMGcyUJhT7TqOl2Sk7JsRtfrYyqkakzXnG9xiB3JXk3J6UuwviVndZoz9KPnCJ7xekIZ3LaiIanRR358cbmbQMzvLUPelpU9Ma9HhYQK8L/sLhmKaVVE3rR9Eb5ACmBzlJzva7yobsZbSv1S4R1Dx7Ndlpj3fbfrPQ5z7gumQECjJrSVzMm8uEfiuqjbMNxLpu11bZncMfhuA1qFdF87UK113CJ2LyYVdjKPOwOEYuaYazo+2TkqrwJoffAHmSETITAaB87JMXwC+Ood7XYkNcY9UlcGbmXgEZTKgBgZE+PcpjSHasVsV9CN1KiPXStozxz8ZsEVASI89RhA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=txcd5ouVj7OGsShiXNyQqY0tYckpfbnoL9ZmE5ogAc8=; b=viFSomlaKsKk8nJMxAa68+JF/EZP6V60RKtsnryLYG89aQnBEKUOa3CQdg3KhZR++SojTHsKA544ovVcXAeqDBpFa3VXP+K+cf4Hyi6svCsJHLSx6cWXaF/zTmTlfEYga6APfG2GA+OFrdd/CWZANXpXouZg7in3Olgy/wzV5EfN8KI53X18W2IZXajdObJtb2yuig3SuHltLHhrPDsCBniYdpuw37ZBo9sWu8LtmFoIpH2LA0BFbO4wdcy1NVCiu86XCyqx7akwjGbLxYi7Z2T/y55tHNBpX0uh6GEvxiWLkdUUQyBHZ5X8hgLWdO/TRCUfQJv6La6jO5QvprAByg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=txcd5ouVj7OGsShiXNyQqY0tYckpfbnoL9ZmE5ogAc8=; b=SEgDo65wymeTOjDI/L/Gowpq3xrvKH9qqu7NT7DyO6JICB/55qZGsXAf7xYlvDuAqTIdT1tdnYalDB0vyTWjl/8OrulLVYCVJcMP+oiNdb1e0gV4p7jV5N840hQq1auKiQpZkNGRRsLeGlszcKTWpvpfYIIF58Tr86Af//d16QN0Ls9j9u6VgEl2/MoMoMkEHEc8K2VULNF0vZLg3G4nJlLDvbMa29ivbBeIkdJmyiIu2bCjKyRIlHAshJG58iGzU1JoKkjimCtA5F8PgIqyIaRqSW+tqpdrnVH+vv8uG2irNncy6cJAj+g+iK+Ndf1384h5o8V+/e0HTRoiravplg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AS4PR04MB9244.eurprd04.prod.outlook.com (2603:10a6:20b:4e3::9) by AM9PR04MB8485.eurprd04.prod.outlook.com (2603:10a6:20b:418::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8182.21; Tue, 26 Nov 2024 15:53:25 +0000 Received: from AS4PR04MB9244.eurprd04.prod.outlook.com ([fe80::7303:2cc8:d109:d7c1]) by AS4PR04MB9244.eurprd04.prod.outlook.com ([fe80::7303:2cc8:d109:d7c1%6]) with mapi id 15.20.8182.019; Tue, 26 Nov 2024 15:53:25 +0000 From: Mirela Rabulea To: mchehab@kernel.org, sakari.ailus@linux.intel.com, hverkuil-cisco@xs4all.nl, laurent.pinchart+renesas@ideasonboard.com, robh@kernel.org, krzk+dt@kernel.org, bryan.odonoghue@linaro.org, laurentiu.palcu@nxp.com, robert.chiras@nxp.com Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, LnxRevLi@nxp.com, kieran.bingham@ideasonboard.com, hdegoede@redhat.com, dave.stevenson@raspberrypi.com, mike.rudenko@gmail.com, alain.volmat@foss.st.com, devicetree@vger.kernel.org, conor+dt@kernel.org, alexander.stein@ew.tq-group.com, umang.jain@ideasonboard.com, zhi.mao@mediatek.com, festevam@denx.de, julien.vuillaumier@nxp.com, alice.yuan@nxp.com Subject: [PATCH v2 1/4] dt-bindings: media: i2c: Add OX05B1S sensor Date: Tue, 26 Nov 2024 17:50:57 +0200 Message-Id: <20241126155100.1263946-2-mirela.rabulea@nxp.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20241126155100.1263946-1-mirela.rabulea@nxp.com> References: <20241126155100.1263946-1-mirela.rabulea@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: VI1P190CA0023.EURP190.PROD.OUTLOOK.COM (2603:10a6:802:2b::36) To AS4PR04MB9244.eurprd04.prod.outlook.com (2603:10a6:20b:4e3::9) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS4PR04MB9244:EE_|AM9PR04MB8485:EE_ X-MS-Office365-Filtering-Correlation-Id: 9b66bd46-292e-454c-2e28-08dd0e327649 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|1800799024|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?euY7dhXWrNvDy2qKRclKAhcilStpiGazNsNocAWUs4O6JOoXprEmFxtffjYp?= =?us-ascii?Q?lw+rCUFI6xoDnkgN2pcpMT52Ggn4GZ1bFArmQdI+WcFcC/FQYBLhrJX5O4bg?= =?us-ascii?Q?MQ+EFKGz2qumbs/jmqT+Ojfs3QRkncEo2AtRjBJZsr6ghBUO/gBz88MreNGc?= =?us-ascii?Q?MqpkEZ9inZ0OS9FeYZ181TYzxdLN7qnAR3KJDgR4vmN9dckeYLkpIa1Zi0uY?= =?us-ascii?Q?vOPreqMQSzuiStJJ0kU1cUBR9iKPh06Iqb7fZWUSQYcrx4LxujWteE+zfgJB?= =?us-ascii?Q?DmaZnG4LW1KAKLRSvz72JNI9aAHoFmLnrhJoeLRLVXanMMikpSxAN4wPq3RX?= =?us-ascii?Q?UpclDhp3A5S5RdbaOQnMaQ3G48OY96/uYrGxKQRYy2G5p4kPij/dBUZJ465/?= =?us-ascii?Q?mUo1aGwVASeG75/uSnOYUZzfvBLyDxg7O50JFnSa3lEDkHO9IWGBuNzcNxR7?= =?us-ascii?Q?GoXEGDKf5k8or4GaRCP88PnHWF/jam5N1mSFXNhfZcbqBrwiKE2yuArpRw20?= =?us-ascii?Q?OcWWZzTXLEXL32g34bTGZnTaXRDlixk7B4NHKpzWl7RKzIWkK4E9h40vbwVP?= =?us-ascii?Q?LDnjQPHb8azQ7hakR6aqBafh/Tdyw8tKoGV5nT7JFZxNhqiGi5Rk6/csd3r4?= =?us-ascii?Q?1xs35MhbFWSI2rWgKiI4B/dSQ+MD5iiqJ+wGCIVB70BJhk8FB6kK06yW/IoM?= =?us-ascii?Q?oOd6gMinNdMcGkF+dS5zDDKrjTjxvukA6/DlNQb7SuGUF3wzGaywMtxT8wv9?= =?us-ascii?Q?mQp6EZb0ewXJmbCWhE+OHZ8IVrdOIOYOa7+vNQLjNlbWQwKk9zi8++FLpbxV?= =?us-ascii?Q?szXEW+3WFgmZDOvhMpqJqqgI5VDeG5cZph3SFrZRyIEgB4qs1HZWNymqSZT/?= =?us-ascii?Q?WgVrMrxVNeMZsvJpzFbb211jgvqwrb0FV7ASy8Zd8N26Qdtc/+uPgiX89+PH?= =?us-ascii?Q?GssKkR0vTo7DNp8kqIJpkk/ZzCkL9YObDJ/yEPAqXWWGUpKm4yM7MND8yWH/?= =?us-ascii?Q?O7ktZdMA5bd5WisOqdRsGdfy4af+ht9Kd+gLvB2qxbGWyoXhm7YNtsXvYFKQ?= =?us-ascii?Q?aFpSmwjuDt4ZysmI5ZDCzkK6GYw6aBfjixAGADmx9l7n1IlJZndgrKnyUqc2?= =?us-ascii?Q?p7aYVV8Zd4/+5tCa7jp8Ehm8qUl/Iub2mXZtBUOyWqDnQ4il8JD0dBCCjmZp?= =?us-ascii?Q?2iOU932/N3W5UuQiQse1bFFi5Q4S8wO96QxaCY9qw7D3dp8Ndw/M0pnSVOEj?= =?us-ascii?Q?3GRKn/3YyEpQDqJjiddBOuE4vPXRBZbVyGiNtis6UcnBpNdwaNfZuNMkkS0d?= =?us-ascii?Q?hO0X0/d3VsUR9c6LxmiDuahvyEybvHuSleOc+1mwmiEg8E+CVvwJwxxPMBEM?= =?us-ascii?Q?tw3/O90=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS4PR04MB9244.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(1800799024)(366016)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?yqk71o46twGqMlm45q244LQAVV+hKbue3YKeKpcHJVChnXQxXkqkxtnTlsWg?= =?us-ascii?Q?KpqlDAf2A7/DxVvUT4qaqSthpnfiG25BMxNdT5iQF6yBfpklW8BIYfNSdqPA?= =?us-ascii?Q?IPwAfwKNRRyjHmMv8Ok3tKnewMLMosY4qJ5IQdH7EL7AiuNk/Iw2VG000JIJ?= =?us-ascii?Q?qbK+BaGPVV0lgzPsV/Sg4Yshpsclm2mNoBbPIej/SXyQVJfUKmPJ8b5HHCG1?= =?us-ascii?Q?sDMiAGnu0A6ICqSOkVmdj08/fkAtQNozQV6vDJk6WrYw4QsUQ7GerAqxHTwD?= =?us-ascii?Q?kJ/0t1rkuHWsDiydP8sXPpQjIDG1KTN8RJes4k/9p07NBpboNZWZu8qBE6sH?= =?us-ascii?Q?hSuFyaIEjDPEL5us69I37zJp0XjZQRvO8ka/zuqShAouDVvMVeZoosrpUzSz?= =?us-ascii?Q?FHgu7fo5sSTjEPDOhaoeaxpRSJ9NJAeFfx3ns+jnnr9Nh+MvVu+I3HGyWbid?= =?us-ascii?Q?80Ya4SSgh9z4vxE2Cj2/unxWxOCAaP8BcoY0VwCy3Q9VUvCu+OswfiNNrPwG?= =?us-ascii?Q?Qp8iFD8hMRBXON+J8YzKNK/BoPK9hqnhQwpmgDAWcTpJvtLVpToSE8Yzs+/I?= =?us-ascii?Q?Ykq0XlnB4ujsYtTz1tAcSJvpdw5PAdN7+E9e//ChRpuJ02SRzGVRxMgEHzBg?= =?us-ascii?Q?QXafU+0XaFjsSRayW9noxZV2BiRS6yT9jN9R30T++ghL2QM1egOcx05OF1qx?= =?us-ascii?Q?Q1q3LIZ8ZleB3u9lgSYlFgUS4A+btXHLRro0q/o9CgAvZAicWr1Uu8CmVg8+?= =?us-ascii?Q?03fGzIkM9vz9Wg63ZV3I9u+sgC5+35Ne8oMg2okj7e6mKHJTRtYJLQzjVbG0?= =?us-ascii?Q?MVN28m6qhVLM8UkV0RXWSwRPP0E/5j80b5Jq/UvAQikynBsm6QcgZY/6hjQx?= =?us-ascii?Q?z2qQOFFIeLW7qhvYfOVlNvKLxMorsWmk+lF1UuOYE0CEI9/LQEQtkDmMpMoi?= =?us-ascii?Q?SGWQjAMIdqnoPwWNyqzrwX016FaPR4kVgg4a3ilTrtPrMGnb9WGqlpo/+BRb?= =?us-ascii?Q?R2zC8cNfzh0S5vokpeaFBUubxkKRSE+8KjbSOEkABVI9kHVbPHU3UaZ+LJiX?= =?us-ascii?Q?UrQvPQIpCYQ6YCvZYxlY3Fn+kWyegi96WdzeggtEenD2w+hwO5QJxCIRYFvQ?= =?us-ascii?Q?F4te2pTAgtVCj8AmVTrfeGz8r2OwLJyAscUZkS6E/5fU4lJOsMHYfXrSrkzv?= =?us-ascii?Q?SHc8yy1ngicgRL2h0vVt1MlnUk/sFvJtcdt0camKGLRvBkkh3pCD8YIsiR3A?= =?us-ascii?Q?gH8z3rnctPqPYZ7dUUrxt9QUuH6rPGIXUSnE1a/k4j6C0KHIJYBwV3R8FpFg?= =?us-ascii?Q?bzv9RwgIBhV+u8gqreskN2vc6mCMmI0BotC+Ov4/sq7cc/lPe8vlsGzpH44M?= =?us-ascii?Q?W/+NSK5mnlDiYVu7XjYTbSyOomU/S2a/SiCfQIkPHUi2J0bKIVl5ubLa2Gli?= =?us-ascii?Q?9Wqu5QlU1u+Pcy+9wg2d4xJNweYKtUJmSDtz1LLN5Cp7nAzQSVYiTbNisalp?= =?us-ascii?Q?171Ek16MGnncPvy80WDZcQ7h7KxK0MEJwpun1XTBvLQrJeOAULNcXcPGfu3A?= =?us-ascii?Q?EncC9M+E0tI1Cip2QxhLbSaFTEAK2rOWaotUiiFi2JSpisxEPXotQFJ12t1a?= =?us-ascii?Q?Ng=3D=3D?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9b66bd46-292e-454c-2e28-08dd0e327649 X-MS-Exchange-CrossTenant-AuthSource: AS4PR04MB9244.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Nov 2024 15:53:25.4472 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: LlQHxHHhNF28+RjI3uUKl4VgFimPjXJG+2BlftvfrfmwSSoPr6s9Urv1sLCX5hhDu6LNNxFJy9FmJlbr+n2UGQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM9PR04MB8485 Content-Type: text/plain; charset="utf-8" Add bindings for Omnivision OX05B1S sensor. Also add compatible for Omnivision OS08A20 sensor. Signed-off-by: Mirela Rabulea --- Changes in v2: Small updates on description Update subject, drop "bindings" and "driver" Just one binding patch (squash os08a20 bindings) Re-flow to 80 columns. Drop clock name (not needed in case of single clock) Make the clock required property, strictly from sensor module point of vie= w, it is mandatory (will use a fixed clock for nxp board) Add regulators: avdd, dvdd, dovdd Add $ref: /schemas/media/video-interface-devices.yaml Drop assigned-clock* properties (defined in clocks.yaml) Keep "additionalProperties : false" and orientation/rotation (unevaluatedP= roperties: false was suggested, but only orientation/rotation are needed fr= om video-interface-devices.yaml) Include assigned-clock* in the example, for completeness sake (although it= was also suggested to omit them) .../bindings/media/i2c/ovti,ox05b1s.yaml | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 Documentation/devicetree/bindings/media/i2c/ovti,ox05b1= s.yaml diff --git a/Documentation/devicetree/bindings/media/i2c/ovti,ox05b1s.yaml = b/Documentation/devicetree/bindings/media/i2c/ovti,ox05b1s.yaml new file mode 100644 index 000000000000..c0000025866d --- /dev/null +++ b/Documentation/devicetree/bindings/media/i2c/ovti,ox05b1s.yaml @@ -0,0 +1,121 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +# Copyright (C) 2024 NXP +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/media/i2c/ovti,ox05b1s.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Omnivision OX05B1S Image Sensor + +maintainers: + - Mirela Rabulea + +description: + The Omnivision OX05B1S is a 1/2.5-Inch CMOS image sensor with an active + array size of 2592 x 1944. It is programmable through I2C interface. + Image data is available via MIPI CSI-2 serial data output. + +allOf: + - $ref: /schemas/media/video-interface-devices.yaml# + +properties: + compatible: + items: + - enum: + - ovti,ox05b1s + - ovti,os08a20 + + reg: + maxItems: 1 + + clocks: + description: Input clock (24 MHz) + maxItems: 1 + + reset-gpios: + description: Reference to the GPIO connected to XSHUTDOWN pin. Active = low. + maxItems: 1 + + avdd-supply: + description: Power for analog circuit (2.8V) + + dovdd-supply: + description: Power for I/O circuit (1.8V) + + dvdd-supply: + description: Power for digital circuit (1.2V) + + orientation: true + + rotation: true + + port: + $ref: /schemas/graph.yaml#/$defs/port-base + additionalProperties: false + description: MIPI CSI-2 transmitter port + + properties: + endpoint: + $ref: /schemas/media/video-interfaces.yaml# + unevaluatedProperties: false + + properties: + data-lanes: + anyOf: + - items: + - const: 1 + - const: 2 + - items: + - const: 1 + - const: 2 + - const: 3 + - const: 4 + required: + - data-lanes + + required: + - endpoint + +required: + - compatible + - reg + - clocks + - port + +additionalProperties: false + +examples: + - | + #include + + i2c { + #address-cells =3D <1>; + #size-cells =3D <0>; + + ox05b1s@36 { + compatible =3D "ovti,ox05b1s"; + reg =3D <0x36>; + clocks =3D <&ox05b1s_clk>; + + assigned-clocks =3D <&ox05b1s_clk>; + assigned-clock-parents =3D <&ox05b1s_clk_parent>; + assigned-clock-rates =3D <24000000>; + + reset-gpios =3D <&gpio1 6 GPIO_ACTIVE_LOW>; + + avdd-supply =3D <&camera_avdd_2v8>; + dovdd-supply =3D <&camera_dovdd_1v8>; + dvdd-supply =3D <&camera_dvdd_1v2>; + + orientation =3D <2>; + rotation =3D <0>; + + port { + ox05b1s_mipi_0_ep: endpoint { + remote-endpoint =3D <&mipi_csi0_ep>; + data-lanes =3D <1 2 3 4>; + }; + }; + }; + }; +... --=20 2.25.1 From nobody Fri Dec 19 22:05:20 2025 Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05on2079.outbound.protection.outlook.com [40.107.20.79]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 99CF71D90BD; Tue, 26 Nov 2024 15:53:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.20.79 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732636415; cv=fail; b=GEDRCZEXW16lJ0o0Ks8XIzrifWV+SEvx9VJdry2TY02ToHLaS+p2QgQlQeYZPrwHXogor/6Sidm4TYRPOAoiXnK3Qb5m9R2EdSKRvoHNEXvhZj6QoouRTjUxuAOg6FLSDSQnQSAFe/SdAmAhT5HxQlE1x+KWcjJBinC+ziUYZ3w= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732636415; c=relaxed/simple; bh=dOzDfRdQzo/qRIf0Y31dYrQr9W/tj8JbEuvMfOh25EQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=LOLKYCgOpLkVswtZp2dvssCS+296RF86Yz7eLr6pCLmJunL1cg1WhGlRn+26zKf1HmpGEvNp0X9JtBy36ihHDEnpZ3MvpWn2gZ6QPgCJqULNxGJkTqtuJNgnH8SgxZ83gSUzUmeecUGDaVAlAky5nhH/K20lxE6Xs/tjdIUjxNs= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=Woq3TRX8; arc=fail smtp.client-ip=40.107.20.79 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="Woq3TRX8" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=tixXCDcmwbO60croyA7hVz+Yh1sbwLxpkg00OKHpeIfJlAlFd5PmTl6iQUGEj16jArFZhCX3BwcXPmqBM8DOmImH3THJsMQ1pDd4y5ErhjeqQWSz5cMq5j1jVhjlKbAENXogBB9d9MWLlbbmGFN4qVVnD25KAgClDy8U2kvRszLWD1M/k2Ay20dfX6nbUczf4LAFxO6y/sHZTnI3o+/AKHAUEU9cFza2MHbDzYEzUE7LQ90pW/OU7/BRKtc/FdQrU/l+3COGmkn8q9BZdTCgPHKPEY+iqaFSn4VredmFSbFSCYKoYA+b8Ycce2DcIAvq8+VCUxtKwQ91TCgWisqAxg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=uomJ1hk89ODMg1kPV+xJLfBYExVKbTL/fsuHrboB1YM=; b=bwRRkGdWO/6PIk35By6PlfvwPj9vCHESA9n0FktHFpvKWhKKJ7XP9w9oyVbhit45srFM2+jPV55CrOZlYzumIuN1CjRiy+rsJlyDqlM7XaOG7uplBVD943fntKKw4J7wTei6Z8MQQcu05IUv6QUXnFhr3gz7H6+DAftU23usiXX6qWGEe1LPRVw0MjkycwIJ/VxWXqq2b2i4TfMpBN9IJGukBrZjrsFS53oqdBLYipfOTVuFLrS6aeJuqqcOsvdOWpkVyNpe0cIxFczDoqn1T5m21UaLNTSpCnAKNBkLUc8GUhFShPc20BLtmNtK5HMZBZ3Ao7UMwp+dzRNok8lIyw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=uomJ1hk89ODMg1kPV+xJLfBYExVKbTL/fsuHrboB1YM=; b=Woq3TRX8omAPvLzhsEfviG22wUV0xmW5SjU0LbXtP8MM6fbsbddlhnW4r1nUAklDbdcz+OsRB88hBVi5TH7hBsA/aOoer2unpwyIM9/byA2NfpemouSrTFcvmHMYdtHmPlR2Yf/sBmt0J/ZQc808sllZppK2MERcm4J0d2WKb9WJla32ExpNaE43bqZUiNw9UjC/R+IXACxtHhCL1k5VF9jioBODfVJ5Z+xShaYfwc2kyqCV0DOiOA8fsOSlueQP2GAJmbbvZTYI+eu4mMGN3T0AM55BHjLB0rnbUmedqd+sk6ASpit0m6XisVaTAyACNO/fN2dnKJvczbl2FyLmDw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AS4PR04MB9244.eurprd04.prod.outlook.com (2603:10a6:20b:4e3::9) by AS8PR04MB7653.eurprd04.prod.outlook.com (2603:10a6:20b:299::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8182.21; Tue, 26 Nov 2024 15:53:27 +0000 Received: from AS4PR04MB9244.eurprd04.prod.outlook.com ([fe80::7303:2cc8:d109:d7c1]) by AS4PR04MB9244.eurprd04.prod.outlook.com ([fe80::7303:2cc8:d109:d7c1%6]) with mapi id 15.20.8182.019; Tue, 26 Nov 2024 15:53:27 +0000 From: Mirela Rabulea To: mchehab@kernel.org, sakari.ailus@linux.intel.com, hverkuil-cisco@xs4all.nl, laurent.pinchart+renesas@ideasonboard.com, robh@kernel.org, krzk+dt@kernel.org, bryan.odonoghue@linaro.org, laurentiu.palcu@nxp.com, robert.chiras@nxp.com Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, LnxRevLi@nxp.com, kieran.bingham@ideasonboard.com, hdegoede@redhat.com, dave.stevenson@raspberrypi.com, mike.rudenko@gmail.com, alain.volmat@foss.st.com, devicetree@vger.kernel.org, conor+dt@kernel.org, alexander.stein@ew.tq-group.com, umang.jain@ideasonboard.com, zhi.mao@mediatek.com, festevam@denx.de, julien.vuillaumier@nxp.com, alice.yuan@nxp.com Subject: [PATCH v2 2/4] media: ox05b1s: Add omnivision OX05B1S raw sensor driver Date: Tue, 26 Nov 2024 17:50:58 +0200 Message-Id: <20241126155100.1263946-3-mirela.rabulea@nxp.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20241126155100.1263946-1-mirela.rabulea@nxp.com> References: <20241126155100.1263946-1-mirela.rabulea@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: VI1P190CA0023.EURP190.PROD.OUTLOOK.COM (2603:10a6:802:2b::36) To AS4PR04MB9244.eurprd04.prod.outlook.com (2603:10a6:20b:4e3::9) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS4PR04MB9244:EE_|AS8PR04MB7653:EE_ X-MS-Office365-Filtering-Correlation-Id: f2d70eec-9d52-4e4d-8e70-08dd0e32774c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|52116014|376014|7416014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?QeJR1HHA0sTNGVGtzuqmJBgW3u8qp2x6Zs69cxmGq6qLYW/4LgeY/4UrQN7C?= =?us-ascii?Q?jH3HJND5BJk4UuN0nGH547FURXtaNcL36/h7Fze7VuHxgHoMwVaFwQDdZTy7?= =?us-ascii?Q?wUKaRFXi1/UKENoa1pM8+Afnjt/5qBbInHBtuCl2zUIDR4TX/PqPYakKe+GF?= =?us-ascii?Q?At7znKrL/mxnYcNzb6St4nzZzOhL7UduLuTzq+0hbUxkjvCu/6NDMsZWYp41?= =?us-ascii?Q?7r+bRZIxpRS4Cg3U1JxRaPoUTOyMejyqO39m1EYRpq1AVsgWs+jgDoMYI5j4?= =?us-ascii?Q?JpL/p+cnh6FSqmbIxLYoTe5H7nLbfZIOAdt0/cRqxMFmGlbG5DfgaMJ2xGGD?= =?us-ascii?Q?puvfbkNfURqxdOfmgJ8xpD9ecOS15ULpDrqwcTfuTaYcmdAqgzxLSx/WL8BZ?= =?us-ascii?Q?0ZgucO83HeT2N5L1cI3Sm76Xn9so43GovhCa39I/3KZngoHCx/Yqa+FpxUZs?= =?us-ascii?Q?BrWllhiBwAc/eBg6M89zFicPm5j26+6QBRj52a/guLH3ml8dP6cu+emgJQp7?= =?us-ascii?Q?G12KNR2X2bswAdNtRIkOPbsxVxNX2nWeHzo4JxkC32oBwYf46PLaXypyirrt?= =?us-ascii?Q?7do96vOUp4AepMjEgp3Y8msZW4i3O7+oo+w3tY/pnit0/zXK/QZ9wnwk2Fry?= =?us-ascii?Q?qh4tjtPCsKPeuDyC/AkoUBJ0CIP15gn1xCmB9P/QMLhXfVbXhTZ38xHD/jGu?= =?us-ascii?Q?8/3PRTpp3wYP1qB2HVCu/xTydeFq314LgIBhpikM1D+wU9ntQjsJEzrtX+Gd?= =?us-ascii?Q?THaKG6HuIcWzi+Oham5Yl1pE/UEnkj5NimIdO5yQtJwQCP9N2hqrHmbifLNO?= =?us-ascii?Q?xpRrsWyRIXsSnumB+otBkCxHygHSWpoRiLKaMNO3oXkHivyp1dP21j6FsnRF?= =?us-ascii?Q?MEm0AHmwY/ATtZSqpZjxHIBrTnTw8wpXRCBuFvh4gs8KWT/t8Z9gULWJohjj?= =?us-ascii?Q?wJ+2K4GDnxPvDrrcKKmduJ2c81IPr/FH0NS2Pqkqki16HI7dgyE2AJCuUzVx?= =?us-ascii?Q?m9qqVDxEsDk3rEf8tTmWUumfIiF89ycvpL+17Vp8ZzZp7t1KaKhpii/1qY4Y?= =?us-ascii?Q?+EAQePTSpcW2m51B4tirPrEt6c8Xdpc1H0PK6x8Uw6gcAQBDZDh+NIRWb16m?= =?us-ascii?Q?uHd0kjRJk3feMF2JveCP8dXUChrYc3jBjveLqdU0skwTuZrm65o0CljUrQ7t?= =?us-ascii?Q?L0sPmFbquVKYz1dnwZ4iOoU0d0lXqaPIM24DYdZmwGWEu8DOXXTx1YzhsTZp?= =?us-ascii?Q?Lf99aCvc03sUzhEJTvlGEtdbf01Do+XEF+dLzPBk2NPDex6KfjjNG+39pjPw?= =?us-ascii?Q?DPRoZDf8275evXk7KNdyvixGxvYWGEHhK7oPtZBGmzNOrnisS+38koY4Fk4e?= =?us-ascii?Q?OMDY9SHXf6sG/96GJhnpKoK1onL6USSPAMRmnFRPNLWFqP7C7g=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS4PR04MB9244.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(52116014)(376014)(7416014)(1800799024)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?eM2T3f+2vDGQvu3QiKRjPNjfDAYczERI6Uy/voCr92bKoB9Ei9kipkptz1b5?= =?us-ascii?Q?LxWu6rP9s/UloT4wfY8+7obB3vdI9OawHSJcQw1LPekpXwYO7y7LdetIEe9k?= =?us-ascii?Q?/596hICUsLyYNHs6uwGA/EKRD3pRJZbtEvQKQesu+iA1qma3o4dHOViBhMlO?= =?us-ascii?Q?d+EPolmlr5+HVKdeyTiNMGED9u9FD3ETWRG/vr1avnR8Ku7b/KHeDXnc5bri?= =?us-ascii?Q?iB9vrwrzWYnPRDBPvEJGXMzUkuYRX7onCc3fWFUW7w5SwY4vEnyedO7ezJMI?= =?us-ascii?Q?RDOAfCvwaTzdJyeR8Kz/B1yHJwL7+SOhWW4Ewq4XyA5LwHa2DBEMSROIzmki?= =?us-ascii?Q?gXtNp9vJWTG00+f9xe4SW/N+kUSnNtSuF5BasjCmdnsLaOqfDDx+1fESpWp/?= =?us-ascii?Q?Zh3ylez7c3vpC9Ubi/sDgPVRGk9Ywut3Fr+IxaBVDKMPttnto3ImzcKCjKr0?= =?us-ascii?Q?JapUmiOCHD3p6OTaTSSnY1bhqA3QDsJPb1Lms6D0hKGZaMQ+SrqfifKf25VH?= =?us-ascii?Q?jvrTyPdbE1ZX5ESxRNZUdIekzNvboypWJbO/7WtNxxZdTUOCXt9J8i4gkqBU?= =?us-ascii?Q?z8aIuSk2LDhtbDzdxOu3ANrY7nlaahzgGkugLuhToZ+J6450+TFNCrNMciAI?= =?us-ascii?Q?NOLiW0lYgNz/NDqNEuWLik6iZiODBqHEMBNv6U8tK4cpKhTg6nXIxqQtEnZX?= =?us-ascii?Q?Hv71y2OrZq0vqXYCI0nLgFm1JTFZjHke7Cnw0OWDON8NhBpCEBDZtBGavnE0?= =?us-ascii?Q?+KVUpIxb+r67kMrs1UnPy3zdQEtZ/D5YeYxm78v7eOeQeAhVP7cfXy6Oi4/L?= =?us-ascii?Q?eH8LuzdA7sfG3TzyhOpyT9dExLcFt5wR6cZJ/+UF2o4ijk6/TMlgOUy3hVCY?= =?us-ascii?Q?G1tH4q6fU4lz7gbZNnZ0D+6D1DjKypw0pzARmVw9pdw7iyPLAtFRQSr5GzyL?= =?us-ascii?Q?TEIcIiB6iNM1LVwEqtOdg9hPJ+cD3NRx6PZgo1vZKrn+5V6Nt4MvAkgLWgAK?= =?us-ascii?Q?XsOXMZj0KW1TP7G6RxvNUMrH2KHgbpqw0wgkwNbGvTWUb1W2R9357sn5X6C8?= =?us-ascii?Q?ops7cOVeCgf6p3zwEK3dgOChM572L+H52rvIGX8X/RRSmhP0/KvqS9scb3fJ?= =?us-ascii?Q?S5ePXK+YFTup60HKfZh+anLgnXrNy5x5jHp1LwycMAtby5yV+E1ksIj9M4DV?= =?us-ascii?Q?nUA3movWSiFF8NskelKPZjEReyGZCKmHXPYidf2LuzO5IVGd6YmG0pR/szmb?= =?us-ascii?Q?yKjLKxrMbfkWyrU48nPzP2NIj9eIW8+jjrmnO2LkTcVAS+D5HnuvaAQ1TvjD?= =?us-ascii?Q?EWlxnXQchWaKo305Nh9uR/V1kGGXGaG+OSRba3sv844ucnMuAXkebBDh66E5?= =?us-ascii?Q?ztscVEQC7PXqnxUnr94CRNPEe56pcyVZGIO2b+VktXzw01FK5LMa7far3NB5?= =?us-ascii?Q?WcJi3RUvd+Pj5dSzKudrRBDbJjVQHb9znvJs80lxyo5TXRrd/Yr2ILROxSEc?= =?us-ascii?Q?6GOUoX8K4BfFFi5WF/jG+9x9YZmyVXIylTJESKF5fzB7/Hs0EpoqE3iaeg0D?= =?us-ascii?Q?TORCKaAttJFYw/tIfolAluL9cB9fi4d/+VT9YznwVB8cnpyMlkdEricUWWeL?= =?us-ascii?Q?TA=3D=3D?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: f2d70eec-9d52-4e4d-8e70-08dd0e32774c X-MS-Exchange-CrossTenant-AuthSource: AS4PR04MB9244.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Nov 2024 15:53:27.2890 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 5cHesvg+menO8RqslvFAKrAqCRCgTgFKN+GYGSSHGGFp0/gLLy1BjdaGRri+lVDySC30d0HsSs6jPME/9wEhBQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB7653 Content-Type: text/plain; charset="utf-8" Add a v4l2 subdevice driver for the Omnivision OX05B1S RGB-IR sensor. The Omnivision OX05B1S is a 1/2.5-Inch CMOS image sensor with an active array size of 2592 x 1944. The following features are supported for OX05B1S: - Manual exposure an gain control support - vblank/hblank control support - Supported resolution: 2592 x 1944 @ 30fps (SGRBG10) Signed-off-by: Mirela Rabulea --- Changes in v2: Use dev_err_probe for missing clock, since it is now required property, an= d use NULL for devm_clk_get (no name for single clock), remove check for no= n NULL sensor->sensor_clk Remove dev_err message for devm_regmap_init_i2c allocation error Added spaces inside brackets, wrap lines to 80 Remove some redundant initializations Add regulators Make "sizes" a pointer Use struct v4l2_area instead of u32[2] array Remove the count for supported_modes[] and supported_codes[], instead use= sentinel element at the end Consequently, update ox05b1s_enum_mbus_code, ox05b1s_enum_frame_size, ox0= 5b1s_nearest_size, ox05b1s_find_code, to not use the count Remove .h files for modes, however did not move this code in the driver fi= le but added a separate c file for all supported modes Refactor register lists to allow multiple register arrays per mode Use GPL-2.0-only instead of GPL-2.0 drivers/media/i2c/Kconfig | 1 + drivers/media/i2c/Makefile | 1 + drivers/media/i2c/ox05b1s/Kconfig | 10 + drivers/media/i2c/ox05b1s/Makefile | 2 + drivers/media/i2c/ox05b1s/ox05b1s.h | 22 + drivers/media/i2c/ox05b1s/ox05b1s_mipi.c | 1001 ++++++++++++++++++ drivers/media/i2c/ox05b1s/ox05b1s_modes.c | 1171 +++++++++++++++++++++ 7 files changed, 2208 insertions(+) create mode 100644 drivers/media/i2c/ox05b1s/Kconfig create mode 100644 drivers/media/i2c/ox05b1s/Makefile create mode 100644 drivers/media/i2c/ox05b1s/ox05b1s.h create mode 100644 drivers/media/i2c/ox05b1s/ox05b1s_mipi.c create mode 100644 drivers/media/i2c/ox05b1s/ox05b1s_modes.c diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig index 8ba096b8ebca..5cda062c0463 100644 --- a/drivers/media/i2c/Kconfig +++ b/drivers/media/i2c/Kconfig @@ -700,6 +700,7 @@ config VIDEO_VGXY61 =20 source "drivers/media/i2c/ccs/Kconfig" source "drivers/media/i2c/et8ek8/Kconfig" +source "drivers/media/i2c/ox05b1s/Kconfig" =20 endif =20 diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile index fbb988bd067a..028eb08e648c 100644 --- a/drivers/media/i2c/Makefile +++ b/drivers/media/i2c/Makefile @@ -114,6 +114,7 @@ obj-$(CONFIG_VIDEO_OV9282) +=3D ov9282.o obj-$(CONFIG_VIDEO_OV9640) +=3D ov9640.o obj-$(CONFIG_VIDEO_OV9650) +=3D ov9650.o obj-$(CONFIG_VIDEO_OV9734) +=3D ov9734.o +obj-$(CONFIG_VIDEO_OX05B1S) +=3D ox05b1s/ obj-$(CONFIG_VIDEO_RDACM20) +=3D rdacm20.o obj-$(CONFIG_VIDEO_RDACM21) +=3D rdacm21.o obj-$(CONFIG_VIDEO_RJ54N1) +=3D rj54n1cb0c.o diff --git a/drivers/media/i2c/ox05b1s/Kconfig b/drivers/media/i2c/ox05b1s/= Kconfig new file mode 100644 index 000000000000..48fcd04b20d5 --- /dev/null +++ b/drivers/media/i2c/ox05b1s/Kconfig @@ -0,0 +1,10 @@ +config VIDEO_OX05B1S + tristate "OmniVision raw sensor support OX05B1S" + depends on OF + depends on GPIOLIB + select REGMAP_I2C + help + This is a Video4Linux2 sensor driver for the Omnivision OX05B1S RGB-IR = sensor. + This is a 1/2.5-Inch CMOS image sensor with an active array size of 259= 2 x 1944. + It is programmable through I2C interface. + The output is on MIPI CSI-2 interface. diff --git a/drivers/media/i2c/ox05b1s/Makefile b/drivers/media/i2c/ox05b1s= /Makefile new file mode 100644 index 000000000000..0b38dbf98bcd --- /dev/null +++ b/drivers/media/i2c/ox05b1s/Makefile @@ -0,0 +1,2 @@ +ox05b1s-objs :=3D ox05b1s_modes.o ox05b1s_mipi.o +obj-$(CONFIG_VIDEO_OX05B1S) +=3D ox05b1s.o diff --git a/drivers/media/i2c/ox05b1s/ox05b1s.h b/drivers/media/i2c/ox05b1= s/ox05b1s.h new file mode 100644 index 000000000000..a893c65894f3 --- /dev/null +++ b/drivers/media/i2c/ox05b1s/ox05b1s.h @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (C) 2024, NXP + */ + +#ifndef OX05B1S_H +#define OX05B1S_H + +#include + +struct ox05b1s_reg { + u32 addr; + u32 data; +}; + +struct ox05b1s_reglist { + struct ox05b1s_reg *regs; +}; + +extern struct ox05b1s_reglist ox05b1s_reglist_2592x1944[]; + +#endif /* OX05B1S_H */ diff --git a/drivers/media/i2c/ox05b1s/ox05b1s_mipi.c b/drivers/media/i2c/o= x05b1s/ox05b1s_mipi.c new file mode 100644 index 000000000000..0f5e2a946e4f --- /dev/null +++ b/drivers/media/i2c/ox05b1s/ox05b1s_mipi.c @@ -0,0 +1,1001 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * A V4L2 driver for Omnivision OX05B1S RGB-IR camera. + * Copyright (C) 2024, NXP + * + * Inspired from Sony imx219, imx290, imx214 and imx334 camera drivers + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ox05b1s.h" + +#define OX05B1S_SENS_PAD_SOURCE 0 +#define OX05B1S_SENS_PADS_NUM 1 + +#define OX05B1S_REG_SW_STB 0x0100 +#define OX05B1S_REG_SW_RST 0x0103 +#define OX05B1S_REG_CHIP_ID_23_16 0x300a +#define OX05B1S_REG_CHIP_ID_15_8 0x300b +#define OX05B1S_REG_CHIP_ID_7_0 0x300c +#define OX05B1S_REG_TIMING_HTS_H 0x380c +#define OX05B1S_REG_TIMING_HTS_L 0x380d +#define OX05B1S_REG_TIMING_VTS_H 0x380e +#define OX05B1S_REG_TIMING_VTS_L 0x380f +#define OX05B1S_REG_EXPOSURE_H 0x3501 +#define OX05B1S_REG_EXPOSURE_L 0x3502 +#define OX05B1S_REG_GAIN_H 0x3508 +#define OX05B1S_REG_GAIN_L 0x3509 + +#define client_to_ox05b1s(client)\ + container_of(i2c_get_clientdata(client), struct ox05b1s, subdev) + +struct ox05b1s_sizes { + u32 code; + const struct v4l2_area *sizes; +}; + +struct ox05b1s_plat_data { + char name[20]; + u32 chip_id; + u32 native_width; + u32 native_height; + u32 active_top; + u32 active_left; + u32 active_width; + u32 active_height; + const struct ox05b1s_mode *supported_modes; + u32 default_mode_index; + const struct ox05b1s_sizes *supported_codes; +}; + +struct ox05b1s_ctrls { + struct v4l2_ctrl_handler handler; + struct v4l2_ctrl *link_freq; + struct v4l2_ctrl *pixel_rate; + struct v4l2_ctrl *hblank; + struct v4l2_ctrl *vblank; + struct v4l2_ctrl *gain; + struct v4l2_ctrl *exposure; +}; + +struct ox05b1s_mode { + u32 index; + u32 width; + u32 height; + u32 code; + u32 bpp; + u32 vts; /* default VTS */ + u32 hts; /* default HTS */ + u32 exp; /* max exposure */ + bool h_bin; /* horizontal binning */ + u32 fps; + struct ox05b1s_reglist *reg_data; +}; + +/* regulator supplies */ +static const char * const ox05b1s_supply_name[] =3D { + "AVDD", /* Analog voltage supply, 2.8 volts */ + "DVDD", /* Digital I/O voltage supply, 1.8 volts */ + "DOVDD", /* Digital voltage supply, 1.2 volts */ +}; + +#define OX05B1S_NUM_SUPPLIES ARRAY_SIZE(ox05b1s_supply_name) + +struct ox05b1s { + struct i2c_client *i2c_client; + struct regmap *regmap; + struct gpio_desc *rst_gpio; + struct regulator_bulk_data supplies[OX05B1S_NUM_SUPPLIES]; + struct clk *sensor_clk; + const struct ox05b1s_plat_data *model; + struct v4l2_subdev subdev; + struct media_pad pads[OX05B1S_SENS_PADS_NUM]; + const struct ox05b1s_mode *mode; + struct mutex lock; /* sensor lock */ + u32 stream_status; + struct ox05b1s_ctrls ctrls; +}; + +static struct ox05b1s_mode ox05b1s_supported_modes[] =3D { + { + .index =3D 0, + .width =3D 2592, + .height =3D 1944, + .code =3D MEDIA_BUS_FMT_SGRBG10_1X10, + .bpp =3D 10, + .vts =3D 0x850, + .hts =3D 0x2f0, + .exp =3D 0x850 - 8, + .h_bin =3D false, + .fps =3D 30, + .reg_data =3D ox05b1s_reglist_2592x1944, + }, { + /* sentinel */ + } +}; + +/* keep in sync with ox05b1s_supported_modes*/ +static const struct v4l2_area ox05b1s_sgrbg10_sizes[] =3D { + { + .width =3D 2592, + .height =3D 1944, + }, { + /* sentinel */ + } +}; + +static const struct ox05b1s_sizes ox05b1s_supported_codes[] =3D { + { + .code =3D MEDIA_BUS_FMT_SGRBG10_1X10, + .sizes =3D ox05b1s_sgrbg10_sizes, + }, { + /* sentinel */ + } +}; + +static const struct regmap_config ox05b1s_regmap_config =3D { + .reg_bits =3D 16, + .val_bits =3D 8, + .cache_type =3D REGCACHE_RBTREE, +}; + +static int ox05b1s_power_on(struct ox05b1s *sensor) +{ + struct device *dev =3D &sensor->i2c_client->dev; + int ret =3D 0; + + ret =3D regulator_bulk_enable(OX05B1S_NUM_SUPPLIES, sensor->supplies); + if (ret) { + dev_err(dev, "Failed to enable regulators\n"); + return ret; + } + + /* get out of powerdown and reset */ + gpiod_set_value_cansleep(sensor->rst_gpio, 0); + + ret =3D clk_prepare_enable(sensor->sensor_clk); + if (ret < 0) { + dev_err(dev, "Enable sensor clk fail ret=3D%d\n", ret); + goto reg_off; + } + + /* with XVCLK@24MHz, t2 =3D 6ms required delay for ox05b1s before first S= CCB transaction */ + fsleep(6000); + + return ret; + +reg_off: + regulator_bulk_disable(OX05B1S_NUM_SUPPLIES, sensor->supplies); + + return ret; +} + +static int ox05b1s_power_off(struct ox05b1s *sensor) +{ + gpiod_set_value_cansleep(sensor->rst_gpio, 1); + + /* XVCLK must be active for 512 cycles (0.34 ms at 24MHz) after last SCCB= transaction */ + fsleep(350); + clk_disable_unprepare(sensor->sensor_clk); + + regulator_bulk_disable(OX05B1S_NUM_SUPPLIES, sensor->supplies); + + return 0; +} + +static int ox05b1s_runtime_suspend(struct device *dev) +{ + struct v4l2_subdev *sd =3D dev_get_drvdata(dev); + struct i2c_client *client =3D v4l2_get_subdevdata(sd); + struct ox05b1s *sensor =3D client_to_ox05b1s(client); + + return ox05b1s_power_off(sensor); +} + +static int ox05b1s_runtime_resume(struct device *dev) +{ + struct v4l2_subdev *sd =3D dev_get_drvdata(dev); + struct i2c_client *client =3D v4l2_get_subdevdata(sd); + struct ox05b1s *sensor =3D client_to_ox05b1s(client); + + return ox05b1s_power_on(sensor); +} + +static int ox05b1s_write_reg(struct ox05b1s *sensor, u16 reg, u8 val) +{ + struct device *dev =3D &sensor->i2c_client->dev; + int ret; + + ret =3D regmap_write(sensor->regmap, reg, val); + if (ret < 0) + dev_err(dev, "Failed to write reg addr 0x%04x with 0x%02x\n", reg, val); + + return ret; +} + +static int ox05b1s_read_reg(struct ox05b1s *sensor, u16 reg, u8 *val) +{ + struct device *dev =3D &sensor->i2c_client->dev; + int ret; + + ret =3D regmap_raw_read(sensor->regmap, reg, val, 1); + if (ret) + dev_err(dev, "Read reg error: reg=3D%x, val=3D%x\n", reg, *val); + + return ret; +} + +#define OX05B1S_MAX_REG_BULK 16 +static int ox05b1s_write_reg_array(struct ox05b1s *sensor, + struct ox05b1s_reg *reg_array) +{ + struct device *dev =3D &sensor->i2c_client->dev; + struct ox05b1s_reg *table =3D reg_array; + u8 vals[OX05B1S_MAX_REG_BULK]; + int i; + int ret; + + while (table->addr) { + for (i =3D 0; i < OX05B1S_MAX_REG_BULK; i++) { + if (table[i].addr !=3D (table[0].addr + i)) + break; + vals[i] =3D table[i].data; + } + ret =3D regmap_bulk_write(sensor->regmap, table->addr, vals, i); + if (ret) { + dev_err(dev, "Failed to write reg addr=3D%x, count %d\n", table->addr, = i); + return ret; + } + table +=3D i; + } + + return 0; +} + +static int ox05b1s_set_hts(struct ox05b1s *sensor, u32 hts) +{ + u8 values[2] =3D { (u8)(hts >> 8) & 0xff, (u8)(hts & 0xff) }; + + return regmap_bulk_write(sensor->regmap, OX05B1S_REG_TIMING_HTS_H, values= , 2); +} + +static int ox05b1s_set_vts(struct ox05b1s *sensor, u32 vts) +{ + u8 values[2] =3D { (u8)(vts >> 8) & 0xff, (u8)(vts & 0xff) }; + + return regmap_bulk_write(sensor->regmap, OX05B1S_REG_TIMING_VTS_H, values= , 2); +} + +static int ox05b1s_set_exp(struct ox05b1s *sensor, u32 exp) +{ + u8 values[2] =3D { (u8)(exp >> 8) & 0xff, (u8)(exp & 0xff) }; + + return regmap_bulk_write(sensor->regmap, OX05B1S_REG_EXPOSURE_H, values, = 2); +} + +static int ox05b1s_set_analog_gain(struct ox05b1s *sensor, u32 again) +{ + u8 values[2] =3D { (u8)(again >> 8) & 0xff, (u8)(again & 0xff) }; + + /* real gain */ + return regmap_bulk_write(sensor->regmap, OX05B1S_REG_GAIN_H, values, 2); +} + +static inline struct v4l2_subdev *ctrl_to_sd(struct v4l2_ctrl *ctrl) +{ + return &container_of(ctrl->handler, struct ox05b1s, + ctrls.handler)->subdev; +} + +static int ox05b1s_s_ctrl(struct v4l2_ctrl *ctrl) +{ + struct v4l2_subdev *sd =3D ctrl_to_sd(ctrl); + struct i2c_client *client =3D v4l2_get_subdevdata(sd); + struct ox05b1s *sensor =3D client_to_ox05b1s(client); + u32 w =3D sensor->mode->width; + u32 h =3D sensor->mode->height; + int ret =3D 0; + + /* apply V4L2 controls values only if power is already up */ + if (!pm_runtime_get_if_in_use(&client->dev)) + return 0; + + /* s_ctrl holds sensor lock */ + switch (ctrl->id) { + case V4L2_CID_VBLANK: + ret =3D ox05b1s_set_vts(sensor, h + ctrl->val); + break; + case V4L2_CID_HBLANK: + if (sensor->mode->h_bin) + ret =3D ox05b1s_set_hts(sensor, w + ctrl->val); + else + ret =3D ox05b1s_set_hts(sensor, (w + ctrl->val) / 2); + break; + case V4L2_CID_PIXEL_RATE: + /* Read-only, but we adjust it based on mode. */ + break; + case V4L2_CID_ANALOGUE_GAIN: + ret =3D ox05b1s_set_analog_gain(sensor, ctrl->val); + break; + case V4L2_CID_EXPOSURE: + ret =3D ox05b1s_set_exp(sensor, ctrl->val); + break; + default: + ret =3D -EINVAL; + break; + } + + pm_runtime_put(&client->dev); + + return ret; +} + +static const struct v4l2_ctrl_ops ox05b1s_ctrl_ops =3D { + .s_ctrl =3D ox05b1s_s_ctrl, +}; + +/* + * MIPI CSI-2 link frequencies. + * link_freq =3D (pixel_rate * bpp) / (2 * data_lanes) + */ +static const s64 ox05b1s_csi2_link_freqs[] =3D { + 200000000, +}; + +/* Link freq for default mode: 1080p RAW10, 4 data lanes 800 Mbps/lane. */ +#define OX05B1S_DEFAULT_LINK_FREQ 0 + +static int ox05b1s_init_controls(struct ox05b1s *sensor) +{ + const struct v4l2_ctrl_ops *ops =3D &ox05b1s_ctrl_ops; + struct ox05b1s_ctrls *ctrls =3D &sensor->ctrls; + struct v4l2_ctrl_handler *hdl =3D &ctrls->handler; + struct device *dev =3D &sensor->i2c_client->dev; + struct v4l2_fwnode_device_properties props; + int ret; + + v4l2_ctrl_handler_init(hdl, 7); + + /* we can use our own mutex for the ctrl lock */ + hdl->lock =3D &sensor->lock; + + /* Clock related controls */ + ctrls->link_freq =3D v4l2_ctrl_new_int_menu(hdl, ops, + V4L2_CID_LINK_FREQ, + ARRAY_SIZE(ox05b1s_csi2_link_freqs) - 1, + OX05B1S_DEFAULT_LINK_FREQ, + ox05b1s_csi2_link_freqs); + + /* mode dependent, actual range set in ox05b1s_update_controls */ + ctrls->pixel_rate =3D v4l2_ctrl_new_std(hdl, ops, V4L2_CID_PIXEL_RATE, + 0, 0, 1, 0); + + ctrls->hblank =3D v4l2_ctrl_new_std(hdl, ops, V4L2_CID_HBLANK, + 0, 0, 1, 0); + + ctrls->vblank =3D v4l2_ctrl_new_std(hdl, ops, V4L2_CID_VBLANK, + 0, 0, 1, 0); + + ctrls->exposure =3D v4l2_ctrl_new_std(hdl, ops, V4L2_CID_EXPOSURE, + 0, 0, 1, 0); + + ctrls->gain =3D v4l2_ctrl_new_std(hdl, ops, V4L2_CID_ANALOGUE_GAIN, + 0, 0xFFFF, 1, 0x80); + + if (hdl->error) { + ret =3D hdl->error; + goto free_ctrls; + } + + ctrls->link_freq->flags |=3D V4L2_CTRL_FLAG_READ_ONLY; + ctrls->pixel_rate->flags |=3D V4L2_CTRL_FLAG_READ_ONLY; + + ret =3D v4l2_fwnode_device_parse(dev, &props); + if (ret) + goto free_ctrls; + + ret =3D v4l2_ctrl_new_fwnode_properties(hdl, ops, &props); + if (ret) + goto free_ctrls; + + sensor->subdev.ctrl_handler =3D hdl; + return 0; + +free_ctrls: + dev_err(dev, "Failed to init controls\n"); + v4l2_ctrl_handler_free(hdl); + return ret; +} + +static int ox05b1s_apply_current_mode(struct ox05b1s *sensor); + +static int ox05b1s_s_stream(struct v4l2_subdev *sd, int enable) +{ + struct i2c_client *client =3D v4l2_get_subdevdata(sd); + struct ox05b1s *sensor =3D client_to_ox05b1s(client); + int ret =3D 0; + + if (enable) { + ret =3D pm_runtime_resume_and_get(&client->dev); + if (ret < 0) + return ret; + ret =3D ox05b1s_apply_current_mode(sensor); + if (!ret) + ret =3D ox05b1s_write_reg(sensor, OX05B1S_REG_SW_STB, 0x01); + } else { + ret =3D ox05b1s_write_reg(sensor, OX05B1S_REG_SW_STB, 0x00); + } + + sensor->stream_status =3D enable; + + if (!enable || ret) { + pm_runtime_mark_last_busy(&sensor->i2c_client->dev); + pm_runtime_put_autosuspend(&client->dev); + } + + return 0; +} + +static void ox05b1s_update_pad_format(struct ox05b1s *sensor, + const struct ox05b1s_mode *mode, + struct v4l2_mbus_framefmt *fmt) +{ + fmt->code =3D mode->code; + fmt->width =3D mode->width; + fmt->height =3D mode->height; + fmt->field =3D V4L2_FIELD_NONE; + fmt->colorspace =3D V4L2_COLORSPACE_RAW; + fmt->quantization =3D V4L2_QUANTIZATION_FULL_RANGE; + fmt->xfer_func =3D V4L2_XFER_FUNC_NONE; +} + +static int ox05b1s_init_state(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state) +{ + struct i2c_client *client =3D v4l2_get_subdevdata(sd); + struct ox05b1s *sensor =3D client_to_ox05b1s(client); + struct v4l2_mbus_framefmt *format; + + /* Initialize the format. */ + format =3D v4l2_subdev_state_get_format(state, 0); + ox05b1s_update_pad_format(sensor, &sensor->model->supported_modes[0], for= mat); + + return 0; +} + +static int ox05b1s_enum_mbus_code(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + struct v4l2_subdev_mbus_code_enum *code) +{ + struct i2c_client *client =3D v4l2_get_subdevdata(sd); + struct ox05b1s *sensor =3D client_to_ox05b1s(client); + const struct ox05b1s_sizes *supported_codes =3D sensor->model->supported_= codes; + int i =3D 0; + + while (i++ < code->index && supported_codes->code) + supported_codes++; + if (!supported_codes->code) /* code->index outside supported_codes[] */ + return -EINVAL; + + code->code =3D supported_codes->code; + + return 0; +} + +static int ox05b1s_enum_frame_size(struct v4l2_subdev *sd, + struct v4l2_subdev_state *sd_state, + struct v4l2_subdev_frame_size_enum *fse) +{ + struct i2c_client *client =3D v4l2_get_subdevdata(sd); + struct ox05b1s *sensor =3D client_to_ox05b1s(client); + const struct ox05b1s_sizes *supported_codes =3D sensor->model->supported_= codes; + const struct v4l2_area *sizes; + int i =3D 0; + + if (fse->pad !=3D 0) + return -EINVAL; + + while (supported_codes->code) { + if (supported_codes->code =3D=3D fse->code) + break; + supported_codes++; + } + + if (!supported_codes->code) /* fse->code not in supported_codes[] */ + return -EINVAL; + + sizes =3D supported_codes->sizes; + while (i++ < fse->index && sizes->width) + sizes++; + if (!sizes->width) /* fse->index outside sizes[] */ + return -EINVAL; + + fse->min_width =3D sizes->width; + fse->max_width =3D fse->min_width; + fse->min_height =3D sizes->height; + fse->max_height =3D fse->min_height; + + return 0; +} + +/* Update control ranges based on current streaming mode, needs sensor loc= k */ +static int ox05b1s_update_controls(struct ox05b1s *sensor) +{ + int ret; + struct device *dev =3D &sensor->i2c_client->dev; + u32 hts =3D sensor->mode->hts; + u32 hblank; + u32 vts =3D sensor->mode->vts; + u32 vblank =3D vts - sensor->mode->height; + u32 fps =3D sensor->mode->fps; + u64 pixel_rate =3D (sensor->mode->h_bin) ? hts * vts * fps : 2 * hts * vt= s * fps; + u32 min_exp =3D 8; + u32 max_exp =3D vts - 8; + + ret =3D __v4l2_ctrl_modify_range(sensor->ctrls.pixel_rate, pixel_rate, + pixel_rate, 1, pixel_rate); + if (ret) { + dev_err(dev, "Modify range for ctrl: pixel_rate %llu-%llu failed\n", + pixel_rate, pixel_rate); + goto out; + } + + if (sensor->mode->h_bin) + hblank =3D hts - sensor->mode->width; + else + hblank =3D 2 * hts - sensor->mode->width; + + ret =3D __v4l2_ctrl_modify_range(sensor->ctrls.hblank, hblank, hblank, + 1, hblank); + if (ret) { + dev_err(dev, "Modify range for ctrl: hblank %u-%u failed\n", + hblank, hblank); + goto out; + } + __v4l2_ctrl_s_ctrl(sensor->ctrls.hblank, sensor->ctrls.hblank->default_va= lue); + + ret =3D __v4l2_ctrl_modify_range(sensor->ctrls.vblank, 0, vblank * 4, + 1, vblank); + if (ret) { + dev_err(dev, "Modify range for ctrl: vblank %u-%u failed\n", + vblank, vblank); + goto out; + } + __v4l2_ctrl_s_ctrl(sensor->ctrls.vblank, sensor->ctrls.vblank->default_va= lue); + + ret =3D __v4l2_ctrl_modify_range(sensor->ctrls.exposure, min_exp, max_exp, + 1, max_exp / 2); + if (ret) { + dev_err(dev, "Modify range for ctrl: exposure %u-%u failed\n", + min_exp, max_exp); + goto out; + } + __v4l2_ctrl_s_ctrl(sensor->ctrls.exposure, sensor->ctrls.exposure->defaul= t_value); + +out: + return ret; +} + +/* needs sensor lock and power on */ +static int ox05b1s_apply_current_mode(struct ox05b1s *sensor) +{ + struct device *dev =3D &sensor->i2c_client->dev; + struct ox05b1s_reglist *reg_data =3D sensor->mode->reg_data; + int ret =3D 0; + + ox05b1s_write_reg(sensor, OX05B1S_REG_SW_RST, 0x01); + + while (reg_data->regs) { + ret =3D ox05b1s_write_reg_array(sensor, reg_data->regs); + if (ret) + goto out; + reg_data++; + } + + /* setup handler will write actual controls into sensor registers */ + ret =3D __v4l2_ctrl_handler_setup(&sensor->ctrls.handler); + +out: + if (ret < 0) + dev_err(dev, "Failed to apply mode %dx%d,bpp=3D%d\n", sensor->mode->widt= h, + sensor->mode->height, sensor->mode->bpp); + + return ret; +} + +/* similar with v4l2_find_nearest_size but filter for mbus code, needs sen= sor lock */ +static const struct ox05b1s_mode *ox05b1s_nearest_size(const struct ox05b1= s_mode *supported_modes, + struct v4l2_subdev_format *fmt) +{ + u32 error, min_error =3D U32_MAX; + const struct ox05b1s_mode *best =3D NULL; + + if (!supported_modes) + return NULL; + + while (supported_modes->width) { + const u32 w =3D supported_modes->width; + const u32 h =3D supported_modes->height; + + if (supported_modes->code !=3D fmt->format.code) + continue; + + error =3D abs(w - fmt->format.width) + abs(h - fmt->format.height); + if (error > min_error) + continue; + + min_error =3D error; + best =3D supported_modes; + if (!error) + break; + + supported_modes++; + } + + return best; +} + +/* get a valid mbus code for the model, either the requested one or the de= fault one */ +static u32 ox05b1s_find_code(const struct ox05b1s_plat_data *model, u32 co= de) +{ + u32 found_code =3D 0; + const struct ox05b1s_sizes *supported_codes =3D model->supported_codes; + + while (supported_codes->code) { + if (supported_codes->code =3D=3D code) { + found_code =3D code; + break; + } + supported_codes++; + } + + if (!supported_codes->code) /* code not in supported_codes[] */ + found_code =3D model->supported_codes[model->default_mode_index].code; + + return found_code; +} + +static int ox05b1s_set_fmt(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + struct v4l2_subdev_format *fmt) +{ + struct i2c_client *client =3D v4l2_get_subdevdata(sd); + struct ox05b1s *sensor =3D client_to_ox05b1s(client); + struct device *dev =3D &sensor->i2c_client->dev; + struct v4l2_mbus_framefmt *format; + const struct ox05b1s_mode *mode; + + /* if no matching mbus code is found, use the one from the default mode */ + fmt->format.code =3D ox05b1s_find_code(sensor->model, fmt->format.code); + mode =3D ox05b1s_nearest_size(sensor->model->supported_modes, fmt); + + fmt->format.width =3D mode->width; + fmt->format.height =3D mode->height; + fmt->format.field =3D V4L2_FIELD_NONE; + + if (fmt->which =3D=3D V4L2_SUBDEV_FORMAT_TRY) { + format =3D v4l2_subdev_state_get_format(state, 0); + *format =3D fmt->format; + return 0; + } + + sensor->mode =3D mode; + + /* update controls that depend on current mode */ + ox05b1s_update_controls(sensor); + + dev_dbg(dev, "Set mode index=3D%d, %d x %d, code=3D0x%x\n", sensor->mode-= >index, + fmt->format.width, fmt->format.height, fmt->format.code); + + return 0; +} + +static u8 ox05b1s_code2dt(const u32 code) +{ + switch (code) { + case MEDIA_BUS_FMT_SGRBG10_1X10: + return MIPI_CSI2_DT_RAW10; + default: + return MIPI_CSI2_DT_RAW10; + } +} + +static int ox05b1s_get_frame_desc(struct v4l2_subdev *sd, unsigned int pad, + struct v4l2_mbus_frame_desc *fd) +{ + struct i2c_client *client =3D v4l2_get_subdevdata(sd); + struct ox05b1s *sensor =3D client_to_ox05b1s(client); + + fd->type =3D V4L2_MBUS_FRAME_DESC_TYPE_CSI2; + fd->num_entries =3D 1; + + /* get sensor current code*/ + mutex_lock(&sensor->lock); + fd->entry[0].pixelcode =3D sensor->mode->code; + mutex_unlock(&sensor->lock); + + fd->entry[0].bus.csi2.vc =3D 0; + fd->entry[0].bus.csi2.dt =3D ox05b1s_code2dt(fd->entry[0].pixelcode); + + return 0; +} + +static int ox05b1s_get_selection(struct v4l2_subdev *sd, + struct v4l2_subdev_state *sd_state, + struct v4l2_subdev_selection *sel) +{ + struct i2c_client *client =3D v4l2_get_subdevdata(sd); + struct ox05b1s *sensor =3D client_to_ox05b1s(client); + + switch (sel->target) { + case V4L2_SEL_TGT_NATIVE_SIZE: + case V4L2_SEL_TGT_CROP_BOUNDS: + sel->r.top =3D 0; + sel->r.left =3D 0; + sel->r.width =3D sensor->model->native_width; + sel->r.height =3D sensor->model->native_height; + return 0; + case V4L2_SEL_TGT_CROP: + case V4L2_SEL_TGT_CROP_DEFAULT: + sel->r.top =3D sensor->model->active_top; + sel->r.left =3D sensor->model->active_left; + sel->r.width =3D sensor->model->active_width; + sel->r.height =3D sensor->model->active_height; + return 0; + } + + return -EINVAL; +} + +static const struct v4l2_subdev_video_ops ox05b1s_subdev_video_ops =3D { + .s_stream =3D ox05b1s_s_stream, +}; + +static const struct v4l2_subdev_pad_ops ox05b1s_subdev_pad_ops =3D { + .set_fmt =3D ox05b1s_set_fmt, + .get_fmt =3D v4l2_subdev_get_fmt, + .get_frame_desc =3D ox05b1s_get_frame_desc, + .enum_mbus_code =3D ox05b1s_enum_mbus_code, + .enum_frame_size =3D ox05b1s_enum_frame_size, + .get_selection =3D ox05b1s_get_selection, +}; + +static const struct v4l2_subdev_ops ox05b1s_subdev_ops =3D { + .video =3D &ox05b1s_subdev_video_ops, + .pad =3D &ox05b1s_subdev_pad_ops, +}; + +static const struct v4l2_subdev_internal_ops ox05b1s_internal_ops =3D { + .init_state =3D ox05b1s_init_state, +}; + +static void ox05b1s_get_gpios(struct ox05b1s *sensor) +{ + struct device *dev =3D &sensor->i2c_client->dev; + + sensor->rst_gpio =3D devm_gpiod_get_optional(dev, "reset", + GPIOD_OUT_HIGH); + if (IS_ERR(sensor->rst_gpio)) + dev_warn(dev, "No sensor reset pin available"); +} + +static int ox05b1s_get_regulators(struct ox05b1s *sensor) +{ + struct device *dev =3D &sensor->i2c_client->dev; + unsigned int i; + + for (i =3D 0; i < OX05B1S_NUM_SUPPLIES; i++) + sensor->supplies[i].supply =3D ox05b1s_supply_name[i]; + + return devm_regulator_bulk_get(dev, OX05B1S_NUM_SUPPLIES, sensor->supplie= s); +} + +static int ox05b1s_read_chip_id(struct ox05b1s *sensor) +{ + struct device *dev =3D &sensor->i2c_client->dev; + u32 chip_id =3D 0; + u8 reg_val =3D 0; + char *camera_name; + int ret =3D 0; + + ret =3D ox05b1s_read_reg(sensor, OX05B1S_REG_CHIP_ID_23_16, ®_val); + chip_id |=3D reg_val << 16; + ret |=3D ox05b1s_read_reg(sensor, OX05B1S_REG_CHIP_ID_15_8, ®_val); + chip_id |=3D reg_val << 8; + ret |=3D ox05b1s_read_reg(sensor, OX05B1S_REG_CHIP_ID_7_0, ®_val); + chip_id |=3D reg_val; + if (ret) { + dev_err(dev, "Camera chip_id read error\n"); + return -ENODEV; + } + + switch (chip_id) { + case 0x580542: + camera_name =3D "ox05b1s"; + break; + default: + camera_name =3D "unknown"; + break; + } + + if (chip_id =3D=3D sensor->model->chip_id) { + dev_info(dev, "Camera %s detected, chip_id=3D%x\n", camera_name, chip_id= ); + } else { + dev_err(dev, "Detected %s camera (chip_id=3D%x), but expected %s (chip_i= d=3D%x)\n", + camera_name, chip_id, sensor->model->name, sensor->model->chip_id); + ret =3D -ENODEV; + } + + return ret; +} + +static int ox05b1s_probe(struct i2c_client *client) +{ + int retval; + struct device *dev =3D &client->dev; + struct v4l2_subdev *sd; + struct ox05b1s *sensor; + + sensor =3D devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL); + if (!sensor) + return -ENOMEM; + + sensor->regmap =3D devm_regmap_init_i2c(client, &ox05b1s_regmap_config); + if (IS_ERR(sensor->regmap)) + return PTR_ERR(sensor->regmap); + + sensor->i2c_client =3D client; + + sensor->model =3D of_device_get_match_data(dev); + + ox05b1s_get_gpios(sensor); + + /* Get system clock, xvclk */ + sensor->sensor_clk =3D devm_clk_get(dev, NULL); + if (IS_ERR(sensor->sensor_clk)) { + return dev_err_probe(dev, PTR_ERR(sensor->sensor_clk), + "Failed to get xvclk\n"); + } + + retval =3D ox05b1s_get_regulators(sensor); + if (retval) + return dev_err_probe(dev, retval, "Failed to get regulators\n"); + + sd =3D &sensor->subdev; + v4l2_i2c_subdev_init(sd, client, &ox05b1s_subdev_ops); + sd->internal_ops =3D &ox05b1s_internal_ops; + sd->flags |=3D V4L2_SUBDEV_FL_HAS_DEVNODE; + sd->dev =3D &client->dev; + sd->entity.function =3D MEDIA_ENT_F_CAM_SENSOR; + sensor->pads[OX05B1S_SENS_PAD_SOURCE].flags =3D MEDIA_PAD_FL_SOURCE; + retval =3D media_entity_pads_init(&sd->entity, OX05B1S_SENS_PADS_NUM, + sensor->pads); + if (retval) + goto probe_out; + + mutex_init(&sensor->lock); + + retval =3D ox05b1s_init_controls(sensor); + if (retval) + goto probe_err_entity_cleanup; + + /* power on manually */ + retval =3D ox05b1s_power_on(sensor); + if (retval) { + dev_err(dev, "Failed to power on\n"); + goto probe_err_free_ctrls; + } + + pm_runtime_set_active(dev); + pm_runtime_get_noresume(dev); + pm_runtime_enable(dev); + + retval =3D ox05b1s_read_chip_id(sensor); + if (retval) + goto probe_err_pm_runtime; + + v4l2_i2c_subdev_set_name(sd, client, sensor->model->name, NULL); + + /* Centrally managed subdev active state */ + sd->state_lock =3D &sensor->lock; + retval =3D v4l2_subdev_init_finalize(sd); + if (retval < 0) { + dev_err(dev, "Subdev init error: %d\n", retval); + goto probe_err_pm_runtime; + } + + retval =3D v4l2_async_register_subdev_sensor(sd); + if (retval < 0) { + dev_err(&client->dev, "Async register failed, ret=3D%d\n", retval); + goto probe_err_subdev_cleanup; + } + + sensor->mode =3D &sensor->model->supported_modes[0]; + ox05b1s_update_controls(sensor); + + pm_runtime_set_autosuspend_delay(dev, 1000); + pm_runtime_use_autosuspend(dev); + pm_runtime_put_autosuspend(dev); + + return 0; + +probe_err_subdev_cleanup: + v4l2_subdev_cleanup(sd); +probe_err_pm_runtime: + pm_runtime_put_noidle(dev); + pm_runtime_disable(dev); + ox05b1s_runtime_suspend(dev); +probe_err_free_ctrls: + v4l2_ctrl_handler_free(&sensor->ctrls.handler); +probe_err_entity_cleanup: + media_entity_cleanup(&sd->entity); +probe_out: + return retval; +} + +static void ox05b1s_remove(struct i2c_client *client) +{ + struct v4l2_subdev *sd =3D i2c_get_clientdata(client); + struct ox05b1s *sensor =3D client_to_ox05b1s(client); + struct device *dev =3D &client->dev; + + pm_runtime_disable(dev); + if (!pm_runtime_status_suspended(dev)) + ox05b1s_runtime_suspend(dev); + pm_runtime_set_suspended(dev); + v4l2_async_unregister_subdev(sd); + v4l2_subdev_cleanup(sd); + media_entity_cleanup(&sd->entity); + v4l2_ctrl_handler_free(&sensor->ctrls.handler); + mutex_destroy(&sensor->lock); +} + +static DEFINE_RUNTIME_DEV_PM_OPS(ox05b1s_pm_ops, ox05b1s_runtime_suspend, + ox05b1s_runtime_resume, NULL); + +static const struct ox05b1s_plat_data ox05b1s_data =3D { + .name =3D "ox05b1s", + .chip_id =3D 0x580542, + .native_width =3D 2608, /* 8 dummy + 2592 active pixels + 8 dummy */ + .native_height =3D 1960, /* 8 dummy + 1944 active lines + 8 dummy */ + .active_top =3D 8, + .active_left =3D 8, + .active_width =3D 2592, + .active_height =3D 1944, + .supported_modes =3D ox05b1s_supported_modes, + .default_mode_index =3D 0, + .supported_codes =3D ox05b1s_supported_codes, +}; + +static const struct of_device_id ox05b1s_of_match[] =3D { + { + .compatible =3D "ovti,ox05b1s", + .data =3D &ox05b1s_data, + }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, ox05b1s_of_match); + +static struct i2c_driver ox05b1s_i2c_driver =3D { + .driver =3D { + .name =3D "ox05b1s", + .pm =3D pm_ptr(&ox05b1s_pm_ops), + .of_match_table =3D ox05b1s_of_match, + }, + .probe =3D ox05b1s_probe, + .remove =3D ox05b1s_remove, +}; + +module_i2c_driver(ox05b1s_i2c_driver); +MODULE_DESCRIPTION("Omnivision OX05B1S MIPI Camera Subdev Driver"); +MODULE_AUTHOR("Mirela Rabulea "); +MODULE_LICENSE("GPL"); diff --git a/drivers/media/i2c/ox05b1s/ox05b1s_modes.c b/drivers/media/i2c/= ox05b1s/ox05b1s_modes.c new file mode 100644 index 000000000000..1830e9a9cc35 --- /dev/null +++ b/drivers/media/i2c/ox05b1s/ox05b1s_modes.c @@ -0,0 +1,1171 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Register configurations for all sensor supported modes + * Copyright (C) 2024, NXP + * Copyright (C) 2024, Omnivision + * Copyright (C) 2024, Verisilicon + * + */ + +#include "ox05b1s.h" + +/* + * Register configuration for Omnivision OX05B1S raw camera + * 2592X1944_30FPS_FULL_RGBIr 2592 1944 + */ +struct ox05b1s_reg ovx5b_init_setting_2592x1944[] =3D { + {0x0100, 0x00}, + {0x0107, 0x01}, /* reserved */ + {0x0104, 0x00}, + {0x0301, 0x1a}, + {0x0304, 0x01}, + {0x0305, 0xe0}, + {0x0306, 0x04}, + {0x0307, 0x02}, /* reset 0x01 */ + {0x0321, 0x03}, + {0x0324, 0x01}, + {0x0325, 0x80}, + {0x0341, 0x03}, + {0x0344, 0x01}, + {0x0345, 0xb0}, + {0x0347, 0x07}, + {0x034a, 0x05}, /* reset 0x03 */ + {0x034b, 0x06}, + {0x0360, 0x80}, /* PLL_CTRL_REG60 bit7 mipi_enable */ + {0x0400, 0xe8}, + {0x0401, 0x00}, + {0x0402, 0x2b}, + {0x0403, 0x32}, + {0x0404, 0x3a}, + {0x0405, 0x00}, + {0x0406, 0x0c}, + {0x0407, 0xe8}, + {0x0408, 0x00}, + {0x0409, 0x2b}, + {0x040a, 0x32}, + {0x040b, 0x5c}, /* reset 0x30 */ + {0x040c, 0xcd}, /* reset 0x00 */ + {0x040d, 0x0c}, + {0x040e, 0xe7}, + {0x040f, 0xff}, + {0x0410, 0x2b}, + {0x0411, 0x32}, + {0x0412, 0x33}, + {0x0413, 0x8f}, + {0x0414, 0x0c}, + {0x2000, 0x04}, + {0x2805, 0xff}, + {0x2806, 0x0f}, + {0x3000, 0x00}, + {0x3001, 0x00}, + {0x3002, 0x10}, + {0x3004, 0x00}, + {0x3009, 0x2e}, + {0x3010, 0x41}, /* SC_CMMN_REG10 mipi_lane_num =3D 4, phy_mode =3D 1 */ + {0x3015, 0xf0}, + {0x3016, 0xf0}, + {0x3017, 0xf0}, + {0x3018, 0xf0}, /* SC_CMMN_REG18 */ + {0x301a, 0x78}, + {0x301b, 0xb4}, + {0x301f, 0xe9}, + {0x3024, 0x80}, + {0x3039, 0x00}, + {0x3044, 0x70}, + {0x3101, 0x32}, + {0x3182, 0x10}, + {0x3187, 0xff}, + {0x320a, 0x00}, + {0x320b, 0x00}, + {0x320c, 0x00}, + {0x320d, 0x00}, + {0x320e, 0x00}, + {0x320f, 0x00}, + {0x3211, 0x61}, + {0x3212, 0x00}, + {0x3215, 0xcc}, + {0x3218, 0x06}, + {0x3219, 0x08}, + {0x3251, 0x00}, + {0x3252, 0xe4}, + {0x3253, 0x00}, + {0x3304, 0x11}, + {0x3305, 0x00}, + {0x3306, 0x01}, + {0x3307, 0x00}, + {0x3308, 0x02}, + {0x3309, 0x00}, + {0x330a, 0x02}, + {0x330b, 0x00}, + {0x330c, 0x02}, + {0x330d, 0x00}, + {0x330e, 0x02}, + {0x330f, 0x00}, + {0x3310, 0x02}, + {0x3311, 0x00}, + {0x3312, 0x02}, + {0x3313, 0x00}, + {0x3314, 0x02}, + {0x3315, 0x00}, + {0x3316, 0x02}, + {0x3317, 0x11}, + {0x3400, 0x0c}, + {0x3421, 0x00}, + {0x3422, 0x00}, + {0x3423, 0x00}, + {0x3424, 0x00}, + {0x3425, 0x00}, + {0x3426, 0x00}, + {0x3427, 0x00}, + {0x3428, 0x00}, + {0x3429, 0x40}, + {0x342a, 0x55}, + {0x342b, 0x05}, + {0x342c, 0x00}, + {0x342d, 0x00}, + {0x342e, 0x00}, + {0x3500, 0x00}, + {0x3501, 0x00}, + {0x3502, 0x08}, + {0x3503, 0xa8}, + {0x3504, 0x08}, + {0x3505, 0x00}, + {0x3506, 0x00}, + {0x3507, 0x00}, + {0x3508, 0x01}, + {0x3509, 0x00}, + {0x350a, 0x01}, + {0x350b, 0x00}, + {0x350c, 0x00}, + {0x3541, 0x00}, + {0x3542, 0x08}, + {0x3603, 0x65}, + {0x3604, 0x24}, + {0x3608, 0x08}, + {0x3610, 0x00}, + {0x3612, 0x00}, + {0x3619, 0x09}, + {0x361a, 0x27}, + {0x3620, 0x40}, + {0x3622, 0x15}, + {0x3623, 0x0e}, + {0x3624, 0x1f}, + {0x3625, 0x1f}, + {0x362a, 0x01}, /* ANA_REG2A mipi_pk_0 */ + {0x362b, 0x00}, /* ANA_REG2B mipi_pk_1 */ + {0x3633, 0x88}, + {0x3634, 0x86}, + {0x3636, 0x80}, + {0x3638, 0x3b}, + {0x363a, 0x00}, + {0x363b, 0x22}, + {0x363c, 0x07}, + {0x363d, 0x11}, + {0x363e, 0x21}, + {0x363f, 0x24}, + {0x3640, 0xd3}, + {0x3641, 0x00}, + {0x3650, 0xe4}, + {0x3651, 0x80}, + {0x3652, 0xff}, + {0x3653, 0x00}, + {0x3654, 0x05}, + {0x3655, 0xf8}, + {0x3656, 0x00}, + {0x3660, 0x00}, + {0x3664, 0x00}, + {0x366a, 0x80}, + {0x366b, 0x00}, + {0x3670, 0x00}, + {0x3674, 0x00}, + {0x367b, 0x50}, + {0x3684, 0x6d}, + {0x3685, 0x6d}, + {0x3686, 0x6d}, + {0x3687, 0x6d}, + {0x368c, 0x07}, + {0x368d, 0x07}, + {0x368e, 0x07}, + {0x368f, 0x00}, + {0x3690, 0x04}, + {0x3691, 0x04}, + {0x3692, 0x04}, + {0x3693, 0x04}, + {0x3698, 0x00}, + {0x369e, 0x1f}, + {0x369f, 0x19}, + {0x36a0, 0x05}, + {0x36a2, 0x16}, + {0x36a3, 0x03}, + {0x36a4, 0x07}, + {0x36a5, 0x24}, + {0x36a6, 0x00}, + {0x36a7, 0x80}, + {0x36e3, 0x09}, + {0x3700, 0x07}, + {0x3701, 0x1b}, + {0x3702, 0x0a}, + {0x3703, 0x21}, + {0x3704, 0x19}, + {0x3705, 0x07}, + {0x3706, 0x36}, + {0x370a, 0x1c}, + {0x370b, 0x02}, + {0x370c, 0x00}, + {0x370d, 0x6e}, + {0x370f, 0x80}, + {0x3710, 0x10}, + {0x3712, 0x09}, + {0x3714, 0x42}, + {0x3715, 0x00}, + {0x3716, 0x02}, + {0x3717, 0xa2}, + {0x3718, 0x41}, + {0x371a, 0x80}, + {0x371b, 0x0a}, + {0x371c, 0x0a}, + {0x371d, 0x08}, + {0x371e, 0x01}, + {0x371f, 0x20}, + {0x3720, 0x0e}, + {0x3721, 0x22}, + {0x3722, 0x0c}, + {0x3727, 0x84}, + {0x3728, 0x03}, + {0x3729, 0x64}, + {0x372a, 0x0c}, + {0x372b, 0x14}, + {0x372d, 0x50}, + {0x372e, 0x14}, + {0x3731, 0x11}, + {0x3732, 0x24}, + {0x3733, 0x00}, + {0x3734, 0x00}, + {0x3735, 0x12}, + {0x3736, 0x00}, + {0x373b, 0x0b}, + {0x373c, 0x14}, + {0x373f, 0x3e}, + {0x3740, 0x12}, + {0x3741, 0x12}, + {0x3753, 0x80}, + {0x3754, 0x01}, + {0x3756, 0x11}, + {0x375c, 0x0f}, + {0x375d, 0x35}, + {0x375e, 0x0f}, + {0x375f, 0x37}, + {0x3760, 0x0f}, + {0x3761, 0x27}, + {0x3762, 0x3f}, + {0x3763, 0x5d}, + {0x3764, 0x01}, + {0x3765, 0x17}, + {0x3766, 0x02}, + {0x3768, 0x52}, + {0x376a, 0x30}, + {0x376b, 0x02}, + {0x376c, 0x08}, + {0x376d, 0x2a}, + {0x376e, 0x00}, + {0x376f, 0x18}, + {0x3770, 0x2c}, + {0x3771, 0x0c}, + {0x3772, 0x71}, + {0x3776, 0xc0}, + {0x3778, 0x00}, + {0x3779, 0x80}, + {0x377a, 0x00}, + {0x377d, 0x14}, + {0x377e, 0x0c}, + {0x379c, 0x25}, + {0x379f, 0x00}, + {0x37a3, 0x40}, + {0x37a4, 0x03}, + {0x37a5, 0x10}, + {0x37a6, 0x02}, + {0x37a7, 0x0e}, + {0x37a9, 0x00}, + {0x37aa, 0x08}, + {0x37ab, 0x08}, + {0x37ac, 0x36}, + {0x37ad, 0x40}, + {0x37b0, 0x48}, + {0x37d0, 0x00}, + {0x37d1, 0x0b}, + {0x37d2, 0x0c}, + {0x37d3, 0x10}, + {0x37d4, 0x10}, + {0x37d5, 0x10}, + {0x37d8, 0x0e}, + {0x37d9, 0x0e}, + {0x37da, 0x3c}, + {0x37db, 0x52}, + {0x37dc, 0x50}, + {0x37dd, 0x00}, + {0x37de, 0x55}, + {0x37df, 0x7d}, + {0x37e5, 0x88}, + {0x37e7, 0x68}, + {0x37e8, 0x07}, + {0x37f0, 0x00}, + {0x37f1, 0x0e}, + {0x37f2, 0x35}, + {0x37f3, 0x14}, + {0x37f4, 0x0c}, + {0x37f5, 0x14}, + {0x37f6, 0x0c}, + {0x37f7, 0x35}, + {0x37f8, 0x35}, + {0x37f9, 0x37}, + {0x37fa, 0x37}, + {0x37fb, 0x37}, + {0x3800, 0x00}, + {0x3801, 0x00}, + {0x3802, 0x00}, + {0x3803, 0x00}, + {0x3804, 0x0a}, + {0x3805, 0x2f}, + {0x3806, 0x07}, + {0x3807, 0xa7}, + {0x3808, 0x0a}, /* width 2592 =3D 0xa20 */ + {0x3809, 0x20}, /* width */ + {0x380a, 0x07}, /* height 1944 =3D 0x798 */ + {0x380b, 0x98}, /* height */ + {0x380c, 0x02}, + {0x380d, 0xf0}, + {0x380e, 0x08}, + {0x380f, 0x50}, + {0x3810, 0x00}, + {0x3811, 0x08}, + {0x3812, 0x00}, + {0x3813, 0x08}, + {0x3814, 0x11}, + {0x3815, 0x11}, + {0x3820, 0x40}, + {0x3821, 0x04}, /* TIMING_CTRL_REG21 bit[2] =3D mirror */ + {0x3822, 0x10}, + {0x3823, 0x00}, + {0x3826, 0x00}, + {0x3827, 0x00}, + {0x382b, 0x03}, + {0x382c, 0x0c}, + {0x382d, 0x15}, + {0x382e, 0x01}, + {0x3830, 0x00}, + {0x3838, 0x00}, + {0x383b, 0x00}, + {0x3840, 0x00}, + {0x384a, 0xa2}, + {0x3858, 0x00}, + {0x3859, 0x00}, + {0x3860, 0x00}, + {0x3861, 0x00}, + {0x3866, 0x10}, + {0x3867, 0x07}, + {0x3868, 0x01}, + {0x3869, 0x01}, + {0x386a, 0x01}, + {0x386b, 0x01}, + {0x386c, 0x46}, + {0x386d, 0x08}, + {0x386e, 0x7b}, + {0x3871, 0x01}, + {0x3872, 0x01}, + {0x3873, 0x01}, + {0x3874, 0x01}, + {0x3880, 0x00}, + {0x3881, 0x00}, + {0x3882, 0x00}, + {0x3883, 0x00}, + {0x3884, 0x00}, + {0x3885, 0x00}, + {0x3886, 0x00}, + {0x3887, 0x00}, + {0x3888, 0x00}, + {0x3889, 0x00}, + {0x3900, 0x13}, + {0x3901, 0x19}, + {0x3902, 0x05}, + {0x3903, 0x00}, + {0x3904, 0x00}, + {0x3908, 0x00}, + {0x3909, 0x18}, + {0x390a, 0x00}, + {0x390b, 0x11}, + {0x390c, 0x15}, + {0x390d, 0x84}, + {0x390f, 0x88}, + {0x3910, 0x00}, + {0x3911, 0x00}, + {0x3912, 0x03}, + {0x3913, 0x62}, + {0x3914, 0x00}, + {0x3915, 0x06}, + {0x3916, 0x0c}, + {0x3917, 0x81}, + {0x3918, 0xc8}, + {0x3919, 0x94}, + {0x391a, 0x17}, + {0x391b, 0x05}, + {0x391c, 0x81}, + {0x391d, 0x05}, + {0x391e, 0x81}, + {0x391f, 0x05}, + {0x3920, 0x81}, + {0x3921, 0x14}, + {0x3922, 0x0b}, + {0x3929, 0x00}, + {0x392a, 0x00}, + {0x392b, 0xc8}, + {0x392c, 0x81}, + {0x392f, 0x00}, + {0x3930, 0x00}, + {0x3931, 0x00}, + {0x3932, 0x00}, + {0x3933, 0x00}, + {0x3934, 0x1b}, + {0x3935, 0xc0}, + {0x3936, 0x1c}, + {0x3937, 0x21}, + {0x3938, 0x0d}, + {0x3939, 0x92}, + {0x393a, 0x85}, + {0x393b, 0x8a}, + {0x393c, 0x06}, + {0x393d, 0x8b}, + {0x393e, 0x0f}, + {0x393f, 0x14}, + {0x3940, 0x0f}, + {0x3941, 0x14}, + {0x3945, 0xc0}, + {0x3946, 0x05}, + {0x3947, 0xc0}, + {0x3948, 0x01}, + {0x3949, 0x00}, + {0x394a, 0x00}, + {0x394b, 0x0b}, + {0x394c, 0x0c}, + {0x394d, 0x0b}, + {0x394e, 0x09}, + {0x3951, 0xc7}, + {0x3952, 0x0f}, + {0x3953, 0x0f}, + {0x3954, 0x0f}, + {0x3955, 0x00}, + {0x3956, 0x27}, + {0x3957, 0x27}, + {0x3958, 0x27}, + {0x3959, 0x01}, + {0x395a, 0x02}, + {0x395b, 0x14}, + {0x395c, 0x36}, + {0x395e, 0xc0}, + {0x3964, 0x55}, + {0x3965, 0x55}, + {0x3966, 0x88}, + {0x3967, 0x88}, + {0x3968, 0x66}, + {0x3969, 0x66}, + {0x396d, 0x80}, + {0x396e, 0xff}, + {0x396f, 0x10}, + {0x3970, 0x80}, + {0x3971, 0x80}, + {0x3972, 0x00}, + {0x397a, 0x55}, + {0x397b, 0x10}, + {0x397c, 0x10}, + {0x397d, 0x10}, + {0x397e, 0x10}, + {0x3980, 0xfc}, + {0x3981, 0xfc}, + {0x3982, 0x66}, + {0x3983, 0xfc}, + {0x3984, 0xfc}, + {0x3985, 0x66}, + {0x3986, 0x00}, + {0x3987, 0x00}, + {0x3988, 0x00}, + {0x3989, 0x00}, + {0x398a, 0x00}, + {0x398b, 0x00}, + {0x398c, 0x00}, + {0x398d, 0x00}, + {0x398e, 0x00}, + {0x398f, 0x00}, + {0x3990, 0x00}, + {0x3991, 0x00}, + {0x3992, 0x00}, + {0x3993, 0x00}, + {0x3994, 0x00}, + {0x3995, 0x00}, + {0x3996, 0x00}, + {0x3997, 0x0f}, + {0x3998, 0x0c}, + {0x3999, 0x0c}, + {0x399a, 0x0c}, + {0x399b, 0xf0}, + {0x399c, 0x14}, + {0x399d, 0x0d}, + {0x399e, 0x00}, + {0x399f, 0x0c}, + {0x39a0, 0x0c}, + {0x39a1, 0x0c}, + {0x39a2, 0x00}, + {0x39a3, 0x0f}, + {0x39a4, 0x0c}, + {0x39a5, 0x0c}, + {0x39a6, 0x0c}, + {0x39a7, 0x0c}, + {0x39a8, 0x0f}, + {0x39a9, 0xff}, + {0x39aa, 0xbf}, + {0x39ab, 0x3f}, + {0x39ac, 0x7e}, + {0x39ad, 0xff}, + {0x39ae, 0x00}, + {0x39af, 0x00}, + {0x39b0, 0x00}, + {0x39b1, 0x00}, + {0x39b2, 0x00}, + {0x39b3, 0x00}, + {0x39b4, 0x00}, + {0x39b5, 0x00}, + {0x39b6, 0x00}, + {0x39b7, 0x00}, + {0x39b8, 0x00}, + {0x39b9, 0x00}, + {0x39ba, 0x00}, + {0x39bb, 0x00}, + {0x39bc, 0x00}, + {0x39c2, 0x00}, + {0x39c3, 0x00}, + {0x39c4, 0x00}, + {0x39c5, 0x00}, + {0x39c7, 0x00}, + {0x39c8, 0x00}, + {0x39c9, 0x00}, + {0x39ca, 0x01}, + {0x39cb, 0x00}, + {0x39cc, 0x85}, + {0x39cd, 0x09}, + {0x39cf, 0x04}, + {0x39d0, 0x85}, + {0x39d1, 0x09}, + {0x39d2, 0x04}, + {0x39d4, 0x02}, + {0x39d5, 0x0e}, + {0x39db, 0x00}, + {0x39dc, 0x01}, + {0x39dd, 0x0c}, + {0x39e5, 0xff}, + {0x39e6, 0xff}, + {0x39fa, 0x38}, + {0x39fb, 0x07}, + {0x39ff, 0x00}, + {0x3a05, 0x00}, + {0x3a06, 0x07}, + {0x3a07, 0x0d}, + {0x3a08, 0x08}, + {0x3a09, 0xb2}, + {0x3a0a, 0x0a}, + {0x3a0b, 0x3c}, + {0x3a0c, 0x0b}, + {0x3a0d, 0xe1}, + {0x3a0e, 0x03}, + {0x3a0f, 0x85}, + {0x3a10, 0x0b}, + {0x3a11, 0xff}, + {0x3a12, 0x00}, + {0x3a13, 0x01}, + {0x3a14, 0x0c}, + {0x3a15, 0x04}, + {0x3a17, 0x09}, + {0x3a18, 0x20}, + {0x3a19, 0x09}, + {0x3a1a, 0x9d}, + {0x3a1b, 0x09}, + {0x3a1e, 0x34}, + {0x3a1f, 0x09}, + {0x3a20, 0x89}, + {0x3a21, 0x09}, + {0x3a48, 0xbe}, + {0x3a52, 0x00}, + {0x3a53, 0x01}, + {0x3a54, 0x0c}, + {0x3a55, 0x04}, + {0x3a58, 0x0c}, + {0x3a59, 0x04}, + {0x3a5a, 0x01}, + {0x3a5b, 0x00}, + {0x3a5c, 0x01}, + {0x3a5d, 0xe8}, + {0x3a62, 0x03}, + {0x3a63, 0x86}, + {0x3a64, 0x0b}, + {0x3a65, 0xbe}, + {0x3a6a, 0xdc}, + {0x3a6b, 0x0b}, + {0x3a6c, 0x1a}, + {0x3a6d, 0x06}, + {0x3a6e, 0x01}, + {0x3a6f, 0x04}, + {0x3a70, 0xdc}, + {0x3a71, 0x0b}, + {0x3a83, 0x10}, + {0x3a84, 0x00}, + {0x3a85, 0x08}, + {0x3a87, 0x00}, + {0x3a88, 0x6b}, + {0x3a89, 0x01}, + {0x3a8a, 0x53}, + {0x3a8f, 0x00}, + {0x3a90, 0x00}, + {0x3a91, 0x00}, + {0x3a92, 0x00}, + {0x3a93, 0x60}, + {0x3a94, 0xea}, + {0x3a98, 0x00}, + {0x3a99, 0x31}, + {0x3a9a, 0x01}, + {0x3a9b, 0x04}, + {0x3a9c, 0xdc}, + {0x3a9d, 0x0b}, + {0x3aa4, 0x0f}, + {0x3aad, 0x00}, + {0x3aae, 0x3e}, + {0x3aaf, 0x02}, + {0x3ab0, 0x77}, + {0x3ab2, 0x00}, + {0x3ab3, 0x08}, + {0x3ab6, 0x0b}, + {0x3ab7, 0xff}, + {0x3aba, 0x0b}, + {0x3abb, 0xfa}, + {0x3abd, 0x05}, + {0x3abe, 0x09}, + {0x3abf, 0x1e}, + {0x3ac0, 0x00}, + {0x3ac1, 0x63}, + {0x3ac2, 0x01}, + {0x3ac3, 0x55}, + {0x3ac8, 0x00}, + {0x3ac9, 0x2a}, + {0x3aca, 0x01}, + {0x3acb, 0x36}, + {0x3acc, 0x00}, + {0x3acd, 0x6f}, + {0x3ad0, 0x00}, + {0x3ad1, 0x79}, + {0x3ad2, 0x02}, + {0x3ad3, 0x59}, + {0x3ad4, 0x06}, + {0x3ad5, 0x5a}, + {0x3ad6, 0x08}, + {0x3ad7, 0x3a}, + {0x3ad8, 0x00}, + {0x3ad9, 0x79}, + {0x3ada, 0x02}, + {0x3adb, 0x59}, + {0x3adc, 0x09}, + {0x3add, 0x89}, + {0x3ade, 0x0b}, + {0x3adf, 0x69}, + {0x3ae0, 0x03}, + {0x3ae1, 0xc1}, + {0x3ae2, 0x0b}, + {0x3ae3, 0xaf}, + {0x3ae4, 0x00}, + {0x3ae5, 0x3e}, + {0x3ae6, 0x02}, + {0x3ae7, 0x77}, + {0x3ae8, 0x00}, + {0x3aea, 0x0b}, + {0x3aeb, 0xbe}, + {0x3aee, 0x08}, + {0x3aef, 0x80}, + {0x3af0, 0x09}, + {0x3af1, 0x70}, + {0x3af2, 0x08}, + {0x3af3, 0x94}, + {0x3af4, 0x09}, + {0x3af5, 0x5c}, + {0x3af6, 0x03}, + {0x3af7, 0x85}, + {0x3af8, 0x08}, + {0x3af9, 0x80}, + {0x3afa, 0x0b}, + {0x3afb, 0xaf}, + {0x3afc, 0x01}, + {0x3afd, 0x5a}, + {0x3b1e, 0x00}, + {0x3b20, 0xa5}, + {0x3b21, 0x00}, + {0x3b22, 0x00}, + {0x3b23, 0x00}, + {0x3b24, 0x05}, + {0x3b25, 0x00}, + {0x3b26, 0x00}, + {0x3b27, 0x00}, + {0x3b28, 0x1a}, + {0x3b2f, 0x40}, + {0x3b40, 0x08}, + {0x3b41, 0x70}, + {0x3b42, 0x05}, + {0x3b43, 0xf0}, + {0x3b44, 0x01}, + {0x3b45, 0x54}, + {0x3b46, 0x01}, + {0x3b47, 0x54}, + {0x3b56, 0x08}, + {0x3b80, 0x00}, + {0x3b81, 0x00}, + {0x3b82, 0x64}, + {0x3b83, 0x00}, + {0x3b84, 0x00}, + {0x3b85, 0x64}, + {0x3b9d, 0x61}, + {0x3ba8, 0x38}, + {0x3c11, 0x33}, + {0x3c12, 0x3d}, + {0x3c13, 0x00}, + {0x3c14, 0xbe}, + {0x3c15, 0x0b}, + {0x3c16, 0xa8}, + {0x3c17, 0x03}, + {0x3c18, 0x9c}, + {0x3c19, 0x0b}, + {0x3c1a, 0x0f}, + {0x3c1b, 0x97}, + {0x3c1c, 0x00}, + {0x3c1d, 0x3c}, + {0x3c1e, 0x02}, + {0x3c1f, 0x78}, + {0x3c20, 0x06}, + {0x3c21, 0x80}, + {0x3c22, 0x08}, + {0x3c23, 0x0f}, + {0x3c24, 0x97}, + {0x3c25, 0x00}, + {0x3c26, 0x3c}, + {0x3c27, 0x02}, + {0x3c28, 0xa7}, + {0x3c29, 0x09}, + {0x3c2a, 0xaf}, + {0x3c2b, 0x0b}, + {0x3c2c, 0x38}, + {0x3c2d, 0xf9}, + {0x3c2e, 0x0b}, + {0x3c2f, 0xfd}, + {0x3c30, 0x05}, + {0x3c35, 0x8c}, + {0x3c3e, 0xc3}, + {0x3c43, 0xcb}, + {0x3c44, 0x00}, + {0x3c45, 0xff}, + {0x3c46, 0x0b}, + {0x3c48, 0x3b}, + {0x3c49, 0x40}, + {0x3c4a, 0x00}, + {0x3c4b, 0x5b}, + {0x3c4c, 0x02}, + {0x3c4d, 0x02}, + {0x3c4e, 0x00}, + {0x3c4f, 0x04}, + {0x3c50, 0x0c}, + {0x3c51, 0x00}, + {0x3c52, 0x3b}, + {0x3c53, 0x3a}, + {0x3c54, 0x07}, + {0x3c55, 0x9e}, + {0x3c56, 0x07}, + {0x3c57, 0x9e}, + {0x3c58, 0x07}, + {0x3c59, 0xe8}, + {0x3c5a, 0x03}, + {0x3c5b, 0x33}, + {0x3c5c, 0xa8}, + {0x3c5d, 0x07}, + {0x3c5e, 0xd0}, + {0x3c5f, 0x07}, + {0x3c60, 0x32}, + {0x3c61, 0x00}, + {0x3c62, 0xd0}, + {0x3c63, 0x07}, + {0x3c64, 0x80}, + {0x3c65, 0x80}, + {0x3c66, 0x3f}, + {0x3c67, 0x01}, + {0x3c68, 0x00}, + {0x3c69, 0xd0}, + {0x3c6a, 0x07}, + {0x3c6b, 0x01}, + {0x3c6c, 0x00}, + {0x3c6d, 0xcd}, + {0x3c6e, 0x07}, + {0x3c6f, 0xd1}, + {0x3c70, 0x07}, + {0x3c71, 0x01}, + {0x3c72, 0x00}, + {0x3c73, 0xc3}, + {0x3c74, 0x01}, + {0x3c75, 0x00}, + {0x3c76, 0xcd}, + {0x3c77, 0x07}, + {0x3c78, 0xea}, + {0x3c79, 0x03}, + {0x3c7a, 0xcd}, + {0x3c7b, 0x07}, + {0x3c7c, 0x08}, + {0x3c7d, 0x06}, + {0x3c7e, 0x03}, + {0x3c85, 0x3a}, + {0x3c86, 0x08}, + {0x3c87, 0x69}, + {0x3c88, 0x0b}, + {0x3c8f, 0xb2}, + {0x3c90, 0x08}, + {0x3c91, 0xe1}, + {0x3c92, 0x0b}, + {0x3c93, 0x06}, + {0x3c94, 0x03}, + {0x3c9b, 0x35}, + {0x3c9c, 0x08}, + {0x3c9d, 0x64}, + {0x3c9e, 0x0b}, + {0x3ca5, 0xb7}, + {0x3ca6, 0x08}, + {0x3ca7, 0xe6}, + {0x3ca8, 0x0b}, + {0x3ca9, 0x83}, + {0x3caa, 0x3c}, + {0x3cab, 0x01}, + {0x3cac, 0x00}, + {0x3cad, 0x9e}, + {0x3cae, 0x07}, + {0x3caf, 0x85}, + {0x3cb0, 0x03}, + {0x3cb1, 0xbc}, + {0x3cb2, 0x0b}, + {0x3cb7, 0x3c}, + {0x3cb8, 0x01}, + {0x3cb9, 0x00}, + {0x3cba, 0xbc}, + {0x3cbb, 0x07}, + {0x3cbc, 0xa3}, + {0x3cbd, 0x03}, + {0x3cbe, 0x9e}, + {0x3cbf, 0x0b}, + {0x3cc4, 0x66}, + {0x3cc5, 0xe6}, + {0x3cc6, 0x99}, + {0x3cc7, 0xe9}, + {0x3cc8, 0x33}, + {0x3cc9, 0x03}, + {0x3cca, 0x33}, + {0x3ccb, 0x03}, + {0x3cce, 0x66}, + {0x3ccf, 0x66}, + {0x3cd0, 0x00}, + {0x3cd1, 0x04}, + {0x3cd2, 0xf4}, + {0x3cd3, 0xb7}, + {0x3cd4, 0x03}, + {0x3cd5, 0x10}, + {0x3cd6, 0x06}, + {0x3cd7, 0x30}, + {0x3cd8, 0x08}, + {0x3cd9, 0x5f}, + {0x3cda, 0x0b}, + {0x3cdd, 0x88}, + {0x3cde, 0x88}, + {0x3cdf, 0x08}, + {0x3ce0, 0x00}, + {0x3ce1, 0x00}, + {0x3ce3, 0x00}, + {0x3ce4, 0x00}, + {0x3ce5, 0x00}, + {0x3ce6, 0x00}, + {0x3ce7, 0x00}, + {0x3ce8, 0x00}, + {0x3ce9, 0x00}, + {0x3cea, 0x00}, + {0x3ceb, 0x00}, + {0x3cec, 0x00}, + {0x3ced, 0x00}, + {0x3cee, 0x00}, + {0x3cef, 0x85}, + {0x3cf0, 0x03}, + {0x3cf1, 0xaf}, + {0x3cf2, 0x0b}, + {0x3cf3, 0x03}, + {0x3cf4, 0x2c}, + {0x3cf5, 0x00}, + {0x3cf6, 0x42}, + {0x3cf7, 0x00}, + {0x3cf8, 0x03}, + {0x3cf9, 0x2c}, + {0x3cfa, 0x00}, + {0x3cfb, 0x42}, + {0x3cfc, 0x00}, + {0x3cfd, 0x03}, + {0x3cfe, 0x01}, + {0x3d81, 0x00}, + {0x3e94, 0x0f}, + {0x3e95, 0x5f}, + {0x3e96, 0x02}, + {0x3e97, 0x3c}, + {0x3e98, 0x00}, + {0x3e9f, 0x00}, + {0x3f00, 0x00}, + {0x3f05, 0x03}, + {0x3f07, 0x01}, + {0x3f08, 0x55}, + {0x3f09, 0x25}, + {0x3f0a, 0x35}, + {0x3f0b, 0x20}, + {0x3f11, 0x05}, + {0x3f12, 0x05}, + {0x3f40, 0x00}, + {0x3f41, 0x03}, + {0x3f43, 0x10}, + {0x3f44, 0x02}, + {0x3f45, 0xe6}, + {0x4000, 0xf9}, + {0x4001, 0x2b}, + {0x4008, 0x04}, + {0x4009, 0x1b}, + {0x400a, 0x03}, + {0x400e, 0x10}, + {0x4010, 0x04}, + {0x4011, 0xf7}, + {0x4032, 0x3e}, + {0x4033, 0x02}, + {0x4050, 0x02}, + {0x4051, 0x0d}, + {0x40b0, 0x0f}, + {0x40f9, 0x00}, + {0x4200, 0x00}, + {0x4204, 0x00}, + {0x4205, 0x00}, + {0x4206, 0x00}, + {0x4207, 0x00}, + {0x4208, 0x00}, + {0x4244, 0x00}, + {0x4300, 0x00}, + {0x4301, 0xff}, + {0x4302, 0xf0}, + {0x4303, 0x00}, + {0x4304, 0xff}, + {0x4305, 0xf0}, + {0x4306, 0x00}, + {0x4307, 0x06}, + {0x4308, 0x00}, + {0x430a, 0x90}, /* reset 0x10 emb_dt */ + {0x430b, 0x11}, + {0x4310, 0x00}, + {0x4316, 0x00}, + {0x431c, 0x00}, + {0x431e, 0x00}, + {0x431f, 0x0a}, + {0x4320, 0x20}, + {0x4410, 0x08}, + {0x4433, 0x08}, + {0x4434, 0xf8}, + {0x4508, 0x80}, + {0x4509, 0x10}, + {0x450b, 0x83}, + {0x4511, 0x00}, + {0x4580, 0x09}, + {0x4587, 0x00}, + {0x458c, 0x00}, + {0x4640, 0x00}, + {0x4641, 0xc1}, + {0x4642, 0x00}, + {0x4643, 0x00}, + {0x4649, 0x00}, + {0x4681, 0x04}, + {0x4682, 0x10}, + {0x4683, 0xa0}, + {0x4698, 0x07}, + {0x4699, 0xf0}, + {0x4700, 0xe0}, + {0x4710, 0x00}, + {0x4718, 0x04}, + {0x4802, 0x00}, /* MIPI_CORE_REG00 */ + {0x481b, 0x3c}, /* MIPI_CORE_REG1B */ + {0x4837, 0x19}, /* MIPI_CORE_REG37 pclk_period[7:0] */ + {0x4860, 0x00}, + {0x4883, 0x00}, + {0x4884, 0x09}, + {0x4885, 0x80}, + {0x4886, 0x00}, + {0x4888, 0x10}, + {0x488b, 0x00}, + {0x488c, 0x10}, + {0x4980, 0x03}, + {0x4981, 0x06}, + {0x4984, 0x00}, + {0x4985, 0x00}, + {0x4a14, 0x04}, + {0x4b01, 0x44}, + {0x4b03, 0x80}, + {0x4d06, 0xc8}, + {0x4d09, 0xdf}, + {0x4d12, 0x80}, + {0x4d15, 0x7d}, + {0x4d34, 0x7d}, + {0x4d3c, 0x7d}, + {0x4d5a, 0x14}, + {0x4e03, 0x06}, + {0x4e04, 0xb9}, + {0x4e05, 0x08}, + {0x4e06, 0x36}, + {0x4e07, 0x04}, + {0x4e08, 0x52}, + {0x4e09, 0x05}, + {0x4e0a, 0x47}, + {0x4e0b, 0x02}, + {0x4e0c, 0xe2}, + {0x4e0d, 0x03}, + {0x4e0e, 0x85}, + {0x4e18, 0xf3}, + {0x4e19, 0x0f}, + {0x4e1b, 0x08}, + {0x4e1c, 0x04}, + {0x4f00, 0x7f}, + {0x4f01, 0xff}, + {0x4f03, 0x00}, + {0x4f04, 0x18}, + {0x4f05, 0x13}, + {0x5000, 0x6e}, + {0x5001, 0x00}, + {0x500a, 0x00}, + {0x5080, 0x00}, + {0x5081, 0x00}, + {0x5082, 0x00}, + {0x5083, 0x00}, + {0x5100, 0x00}, + {0x5103, 0x00}, + {0x5180, 0x70}, + {0x5181, 0x70}, + {0x5182, 0x73}, + {0x5183, 0xff}, + {0x5240, 0x73}, + {0x5249, 0x06}, + {0x524a, 0x44}, + {0x524b, 0x44}, + {0x524c, 0x44}, + {0x524e, 0x66}, + {0x524f, 0x06}, + {0x5250, 0x00}, + {0x5281, 0x18}, + {0x5282, 0x08}, + {0x5283, 0x08}, + {0x5284, 0x18}, + {0x5285, 0x18}, + {0x5286, 0x08}, + {0x5287, 0x08}, + {0x5288, 0x18}, + {0x5289, 0x2d}, + {0x6000, 0x40}, + {0x6001, 0x40}, + {0x6002, 0x00}, + {0x6003, 0x00}, + {0x6004, 0x00}, + {0x6005, 0x00}, + {0x6006, 0x00}, + {0x6007, 0x00}, + {0x6008, 0x00}, + {0x6009, 0x00}, + {0x600a, 0x00}, + {0x600b, 0x00}, + {0x600c, 0x02}, + {0x600d, 0x00}, + {0x600e, 0x04}, + {0x600f, 0x00}, + {0x6010, 0x06}, + {0x6011, 0x00}, + {0x6012, 0x00}, + {0x6013, 0x00}, + {0x6014, 0x02}, + {0x6015, 0x00}, + {0x6016, 0x04}, + {0x6017, 0x00}, + {0x6018, 0x06}, + {0x6019, 0x00}, + {0x601a, 0x01}, + {0x601b, 0x00}, + {0x601c, 0x01}, + {0x601d, 0x00}, + {0x601e, 0x01}, + {0x601f, 0x00}, + {0x6020, 0x01}, + {0x6021, 0x00}, + {0x6022, 0x01}, + {0x6023, 0x00}, + {0x6024, 0x01}, + {0x6025, 0x00}, + {0x6026, 0x01}, + {0x6027, 0x00}, + {0x6028, 0x01}, + {0x6029, 0x00}, + + {0x3501, 0x08}, + {0x3502, 0x32}, + + /* PLL 6G */ + {0x0307, 0x01}, /* pll1_divm */ + {0x304a, 0x03}, + {0x4837, 0x10}, /* MIPI_CORE_REG37 pclk_period[7:0] */ + + /* Ficosa specific */ + {0x3503, 0xa8}, /* AEC enable */ + {0x3501, 0x00}, /* AEC expusure time 0x3501, 0x3502 */ + {0x3502, 0x40}, + {0x3508, 0x01}, /* AEC gain 0x3508, 0x3509 */ + {0x3509, 0x00}, + {0x3002, 0x6f}, /* I/O */ /* SC_CMMN_REG02 io_pad_oen[7:0] */ + {0x3005, 0x6a}, /* SC_CMMN_REG05 io_pad_out[7:0] */ + {0x3008, 0x6a}, /* SC_CMMN_REG08 io_pad_sel[7:0] */ + {0x3b20, 0xff}, /* Strobe */ /* STOBE_REG20 stobe_pattern[7:0] */ + {0x3a9f, 0x08}, /* GLOBAL_SHUTTER_REG9F */ + {0x3aa0, 0x00}, /* GLOBAL_SHUTTER_REGA0 */ + {0x3aa1, 0x00}, /* GLOBAL_SHUTTER_REGA1 */ + {0x3b21, 0x00}, + {0x3b22, 0x00}, + {0x3b23, 0x00}, + {0x3b24, 0x00}, + {0x3b25, 0x00}, + {0x3b26, 0x00}, + {0x3b27, 0x00}, + {0x3b28, 0x10}, + {0x3b2f, 0x4a}, + {0x3b2d, 0x01}, + {0x3b2e, 0x78}, + {0x3b1e, 0x01}, + {0x3b1f, 0x05}, + + {0x4e04, 0x06}, + {0x4e04, 0xee}, + {0x4e05, 0x08}, + {0x4e06, 0x88}, + {0x4e07, 0x04}, + {0x4e08, 0x0d}, + {0x4e09, 0x09}, + {0x4e0a, 0xae}, + {0x4e0b, 0x02}, + {0x4e0c, 0x44}, + {0x4e0d, 0x03}, + {0x4e0e, 0x55}, + { /* sentinel*/ }, +}; + +struct ox05b1s_reglist ox05b1s_reglist_2592x1944[] =3D { + { + .regs =3D ovx5b_init_setting_2592x1944 + }, { + /* sentinel */ + } +}; --=20 2.25.1 From nobody Fri Dec 19 22:05:20 2025 Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05on2079.outbound.protection.outlook.com [40.107.20.79]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 309411D88BF; Tue, 26 Nov 2024 15:53:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.20.79 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732636418; cv=fail; b=pPzMAWZsiGMh+R9R2VpBqxA3TLzGwDbSidjhE36Nf6n4NQAm4GhmjErDCIAZ0taJpZ5Y387OOwoY6klRxC3bbqelE04fHxpvh7m96KOzuVOa8W4mpmWnvRyKaho2A20XsDM77w6O/y73HO/I2KIJ7Axpi9+xTAuGJTwHBTX10eY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732636418; c=relaxed/simple; bh=34RPr5NQTrFdHiwYk7+t2jPCO4VmcE+w56LcAAJJHt8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=Npurk6MyPFB7gUIIYujB6+uHoNPFnmGc4oiimBHBNE0JmAEPJGiGi/X7+FP0W3/b+qylI5Y22MpBEAhJFWllgA+JpzcVUk5RHSQ1gLC5fq6/9TNdDmHyaRahTvHM7XeW8ZQf5ad3314svfrXn9PZyuS1e3oAnNzgHeiZUw0XIfE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=d1h+cbct; arc=fail smtp.client-ip=40.107.20.79 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="d1h+cbct" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=C/I7n1kabLMMg02PjqlDAyi1hgjOBjRhMKJeawx+xen1LMmAupakIfgsRuRomYKaxmgP+dPEV+0CSWKRJ1epOq2waqMjmptUZGMxQMjlIY8kaE3DC0i0ptMkoEz3NJQHmP4GE1aT6ibnNwkjNl2Qvk+vND9+1nVM5fyqa9iYl9DbpTXZ7GLk5BSbnax9EDTaMmYEY+TK7BqPoPP20bC1z2fP3vqrDsPgC9e37/OE1sVvRKH/bq1Vv0f3iU8czPM6YVCVkzso6mHM0GIW+f4Llu0Dr5ebtXXhjcsckVWta2ZjIZpCCoBOR3M/CgZH6ONV4EA8vqlNn87ll9G1TSSOBw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=udamiqqN2d9qNnXsK+VuR9xHGH8Lp50BbSe0XjOHOf8=; b=BDvLfHJlfso0uiPC0f9Wu9SABXmsOBwmAYtD6CotG2wjpa6fHMr7LSxY53xPQEud27InBqp+j4IYiGPUSX2qUUk8YxnDi/MIFVfZ2DlOFQ0WAg/DzMtDExsYPAUC5uEipfGkLR3X3vP5jJbYbfa7zg8L/nYw0nD3tiyBmGxm58WVZ+ORxUgzyNujB8BCIICfaV27djqbmbPfc41aiMCz2JAKGiCCiOQTTt90ZffygCCu17BoV+KQAOVuulWgLCphDzYkJnMOhqJnto5jcI6rCB9M194hiDJeezdcn807ooe6tvbzrwblkSq5gYNWlDIK+83PkELBxDiJcImDKaBY2Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=udamiqqN2d9qNnXsK+VuR9xHGH8Lp50BbSe0XjOHOf8=; b=d1h+cbctFGfpdlvQNpsNBsC20eE9b9SPn2c8ZfSLhl/582jtjxRTANGnjeJgj44CQALhTfmdHa9bOBTrFIiZOBWr7/d6NbTH11eimxGqnw+O51PUYrvigvuuTdy2wfpu4/6HKTWrG5j+Qdv+Q6BEy+Ra5c0dm3lkwDTudLUCHC1iU0Qoil6pYSa/A03szSHxiIqLHpD9zAmI6eKKzmtF8ZF4BcLR03PBD8h9tiYjjRSAWf43Je6sfPMAFcGTfPsqeniBdgWajqatgpBa4s/OTofuhH+ZL4ajpRKOTA97LfnTHs3iuTzgDB/Mzoiz1pRILq8YtRnj5yhipe4PA7ekRg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AS4PR04MB9244.eurprd04.prod.outlook.com (2603:10a6:20b:4e3::9) by AS8PR04MB7653.eurprd04.prod.outlook.com (2603:10a6:20b:299::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8182.21; Tue, 26 Nov 2024 15:53:29 +0000 Received: from AS4PR04MB9244.eurprd04.prod.outlook.com ([fe80::7303:2cc8:d109:d7c1]) by AS4PR04MB9244.eurprd04.prod.outlook.com ([fe80::7303:2cc8:d109:d7c1%6]) with mapi id 15.20.8182.019; Tue, 26 Nov 2024 15:53:29 +0000 From: Mirela Rabulea To: mchehab@kernel.org, sakari.ailus@linux.intel.com, hverkuil-cisco@xs4all.nl, laurent.pinchart+renesas@ideasonboard.com, robh@kernel.org, krzk+dt@kernel.org, bryan.odonoghue@linaro.org, laurentiu.palcu@nxp.com, robert.chiras@nxp.com Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, LnxRevLi@nxp.com, kieran.bingham@ideasonboard.com, hdegoede@redhat.com, dave.stevenson@raspberrypi.com, mike.rudenko@gmail.com, alain.volmat@foss.st.com, devicetree@vger.kernel.org, conor+dt@kernel.org, alexander.stein@ew.tq-group.com, umang.jain@ideasonboard.com, zhi.mao@mediatek.com, festevam@denx.de, julien.vuillaumier@nxp.com, alice.yuan@nxp.com Subject: [PATCH v2 3/4] MAINTAINERS: Add entry for OX05B1S sensor driver Date: Tue, 26 Nov 2024 17:50:59 +0200 Message-Id: <20241126155100.1263946-4-mirela.rabulea@nxp.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20241126155100.1263946-1-mirela.rabulea@nxp.com> References: <20241126155100.1263946-1-mirela.rabulea@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: VI1P190CA0023.EURP190.PROD.OUTLOOK.COM (2603:10a6:802:2b::36) To AS4PR04MB9244.eurprd04.prod.outlook.com (2603:10a6:20b:4e3::9) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS4PR04MB9244:EE_|AS8PR04MB7653:EE_ X-MS-Office365-Filtering-Correlation-Id: 9d4a73ae-2d81-4d5b-a7f0-08dd0e327865 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|52116014|376014|7416014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?BDnX14itbADedSjOdEZS7Ccy52cmtqM1Xpt3MOeQDhnh5hzhTPyhAh2xlHT0?= =?us-ascii?Q?iDiVhANHTFyKQemEA3qTigbctvSYluODjFhcOZoADxnr7DRDhXn4cy+3Iq9P?= =?us-ascii?Q?W5ym1oeYINQ+9ZRj/ePj7WKy16DMK/7HNX91/mFCctOMMByta0K+DCOJzT2j?= =?us-ascii?Q?vPjVmltfnK4m6L3z4Zi9bvs1hQ3XVe57bu5tgGHIYBobMwqjyN9oQX3kIqWn?= =?us-ascii?Q?j69rNOyieH8npNB8ilfr8sb4B5ipC8X8PjpNAekHOpGVn4WEw4CvvpGFEGzq?= =?us-ascii?Q?vWnOWqQWVAmxWprFhNqzD0NFA9P7ZXRlz9K/3aRd/x8a4dkt56cTnv+xkHwH?= =?us-ascii?Q?1laWcrBUNFi938i1StewwwGHd7ZUdqpRPqI/9CAMzj7fz8KOBBtzFa06+jQ7?= =?us-ascii?Q?ehgEBdgh5Lwc5rg7+kY+hXt9RCaHTD29gr4YBvCGfKS50odjM0OsGHmdf6wd?= =?us-ascii?Q?s5tVlPq/N1VkvB6AnkYEoCq1ihjsfqY0TMbxqlYkCyVwJp19HHHsDYWH3IQ6?= =?us-ascii?Q?9s2f/Uame6IHNZUQpntnpKLIOSuJM/nQkll3ygGS97ZJncGYBlGrH9txrbOH?= =?us-ascii?Q?OW+V+mBj6DbBp2tC0/D/hfy7MNEedA+htNwBZ4lYwQU/0t8Daah0mpFOcPMq?= =?us-ascii?Q?YmyHCkA8Zy1pX82bBUBSntElsy8b8SSrt7EDQXjON1TdV1gGwkVYAz72iO/u?= =?us-ascii?Q?6isv7qgIWFOdcUBHy4AkwSqVfA4p0NFOy1b3oZNtvELBzGwxqRM/ivo/ruJX?= =?us-ascii?Q?UWllkR1fwwhkCjlrOGqQz9LPsBRBbed5XV4cLOY8Zf5OPgr6KBTc3vtkGeA3?= =?us-ascii?Q?LuKgYUCNGVRfgxAvI5JGPBeYriSDpGnig9yDNHXqNIIekTy96QMuFqzuoJ7I?= =?us-ascii?Q?FUcJliVKMZ3pYxXu2420J+GVcYhppZVFkueybgQmTwzcurywm0XKvT7SuXwC?= =?us-ascii?Q?IM407JDsQSkFUlYg3F8qbNqJvXr0X+fltLSU9iwYg7yYjwrFDVdykFxKtxWx?= =?us-ascii?Q?/FdD6KFVtRquZUlU81mEgITHyPk88cU5O+/IXUp5UWXK+kgFWd1nFYJzEf9X?= =?us-ascii?Q?muIEnA0tSe+Z2WjymDgiQ5guMoUAdX1tzjnE2240marzUpI6WaDB+mpqSPta?= =?us-ascii?Q?us0W3XMYLkp4HHapi434wpbGJgRT/OCdoPAxP7tyJ2TLKNE83ULAYPFoNidJ?= =?us-ascii?Q?O03YX+/pdR6vLF2/PdWtko56fWzjKiWd+D8O5A6G2BZWNU0p10XwB1t8goAK?= =?us-ascii?Q?oMFpkepKs9dml8aUxRXfVTFCZCMV08t9ibaHntVJVr+KO6KObmblgggjdPac?= =?us-ascii?Q?jzC5ERN20noY31vdCrvw7D6EU3l7UqlQuNEkwvrMwb79zwvTWrOrKNi400Nb?= =?us-ascii?Q?TWPAcQmG9Md/qy8YbbZUJEJZ2fzW8xcgOLavF0XEEYiqmPEQxQ=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS4PR04MB9244.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(52116014)(376014)(7416014)(1800799024)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?P0jB5o15Ntz/GUtKZQTlyW0fXxkB3LJziT3BIQmCKb3E6LTVXiDtSOqe3Omr?= =?us-ascii?Q?CFPJjy/1s2eJHlIM/1DfPE3OzGwWxAarV8jUd4Xl5j0VkCYe9F+rSHOkBVmw?= =?us-ascii?Q?QuzDf9Ixp0y++5gxdMO/Lr3dVo1DwTBMsjqS74zKBFCRpuUv8A9hnQfx6A5j?= =?us-ascii?Q?+rpIi4Who9eLqbwhdAQ/bi/bKYP/wVdVYoBQnS5r175hGaBPdw3cERzgWvQQ?= =?us-ascii?Q?R7VKWzvYzr1TTG0wqXpVs9J3skInJN9nnj+ft3nmamqc0C8UhD5ltql6Csp4?= =?us-ascii?Q?++/Wx7ESpNa7pftK9S+ckyw2TBkesBH2OWUdK0+6ud/p4b5h3dAE0m4PywO8?= =?us-ascii?Q?trZTvvymZrmezuaRrEIrbwn5E9GjdgxV1HAAixAvkOSd3GRe+B6OE/fIsLQ0?= =?us-ascii?Q?15r0RvustB4aq1J2UXHOnaA8qB2qaqKv73bv4FSgl99UcXYPibSJ7iDSrd7R?= =?us-ascii?Q?X2f/nRRgHttjVp9xghbRCl9KZzO5JuEAUGfpRtI+4wSsSCgZLwKUb+B9c/l6?= =?us-ascii?Q?IhWHNB/nnRoTS3NLmFpI1+2ccr/eq3+a04uz6M1jFzRGVJKr9QlX9JxnfrhW?= =?us-ascii?Q?SKWvx4ED9d+PcsF6KL5OvRUGXf2ajdv98BvR56CNM71Sh4f0BjRp9koffQvp?= =?us-ascii?Q?Aq/qaw0Gkuew0SK2Qh0MF5zcv9GEgHZyyVsx/MM/KY7X83L3WbdW/Xbu3kJ1?= =?us-ascii?Q?arQ5c5Ok/41h9wEKCHd1Gw/TsJ+zo3w9BfhHFELGUI5NLVRBVSuuAOTmCCZX?= =?us-ascii?Q?wIKUWoQzd90G6UFakfbDNSw6yYkA6FxP3ZlwyNnje0CxwcTdTFjAyFxSADhF?= =?us-ascii?Q?eqNihm1kVtBupbApSqyPyNwnYmvjajZl0augMRTxyQCwLb27B06VJNqhnZj/?= =?us-ascii?Q?F2MZ84rLtW2jL6iYBwkz7NvgM9wYU5h5SrOYxI4zcEzlzb9X8iKZzcmLM6si?= =?us-ascii?Q?/Ti80YIiswUMNNPOAmPSL2NooYVsoG64lgIs01DH9FYXQjl432XK7w3mtECm?= =?us-ascii?Q?liTpuMnYYJgvz5Szr4m25uEaH08NQm7vgjoqNH/omwE+lEI+reaF8I8l4qPs?= =?us-ascii?Q?pbx5T2X5HajBKGnS1spf/HmamlqfcaNxKj2O3jg5F36pOS80jnQ1ydVuCVqB?= =?us-ascii?Q?ROGWRPl4I58U7QV9LBK5wQrIVK4ppHVqgqSho9m3bhTtPSLcZ7kP6XVI7bQ6?= =?us-ascii?Q?gxTGR4lwQUTqBIES9NMkPvY5KIBhpaL2x+bnAkFx1Incpz62lhn4+noj9wjF?= =?us-ascii?Q?74uX0wnEQIvuAiBOHNMBv7DoWLvhUF2mQLuQypq2qxpsFNNwdP9FsXFky4mj?= =?us-ascii?Q?DTq4lt6BXl7UK/g4PobUpZd5JNIFe6Ty3qXvrkTxKsc19MXd4hQHnb7as4Jw?= =?us-ascii?Q?AavkU4G5CWZJVmoAvhkVYYcILKz6tg3yVa/N68r6nhWg7wcBPkIHWM+Wyf/B?= =?us-ascii?Q?fNqRX9QQqg3dGuioAV/eNn9RAzvb5l3T8afGL8ouJu8pYZXyTGig7af4RoAZ?= =?us-ascii?Q?tBJ9jjqOLlRrR4zi9QRFKkoVBq1bH9EDIKLPFAKgNhn4IDIeBQJcBWMyCsFY?= =?us-ascii?Q?dw+D9ZjRuGx6UpF2usa/J/rAwltHoq2rCpMSLTmQOoMfminbZm/Zgmx6+1UE?= =?us-ascii?Q?6g=3D=3D?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9d4a73ae-2d81-4d5b-a7f0-08dd0e327865 X-MS-Exchange-CrossTenant-AuthSource: AS4PR04MB9244.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Nov 2024 15:53:28.9898 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: I0Gc3qIHGrm09IIn6iqCUQD5E8hK88H4CCyE1Cd5qdw6mDeETzQUXF6FVArWm2iBfdnnf0LP5WpWJRACSleO2w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB7653 Content-Type: text/plain; charset="utf-8" Add maintainer for Omnivision OX05B1S sensor driver. Signed-off-by: Mirela Rabulea --- Changes in v2: None MAINTAINERS | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index a77770cd96b8..8372ab4999da 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -17259,6 +17259,16 @@ S: Maintained T: git git://linuxtv.org/media_tree.git F: drivers/media/i2c/ov9734.c =20 +OMNIVISION OX05B1S SENSOR DRIVER +M: Mirela Rabulea +R: Laurentiu Palcu +R: Robert Chiras +L: linux-media@vger.kernel.org +S: Maintained +T: git git://linuxtv.org/media_tree.git +F: Documentation/devicetree/bindings/media/i2c/ovti,ox05b1s.yaml +F: drivers/media/i2c/ox05b1s/* + ONBOARD USB HUB DRIVER M: Matthias Kaehlcke L: linux-usb@vger.kernel.org --=20 2.25.1 From nobody Fri Dec 19 22:05:20 2025 Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05on2079.outbound.protection.outlook.com [40.107.20.79]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4E3A91DB350; Tue, 26 Nov 2024 15:53:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.20.79 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732636421; cv=fail; b=iCdov8cAf78enR3p/O10RfDdKqyJpcfVO89GN6+I329xnNbwtYTTNcanUzH0kPX8SIZw+BQZOd0AMAtxRQYzCcDr6HV/KVU2yK/aFBCl2oD6VwGUspDskS1ub2uoao5lJonylBvLWfv2kz00BWAR0lMhSiUhm8XahVW8QkTZ01M= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732636421; c=relaxed/simple; bh=kNgjrhziBgI7ik57L11x1VCtxurS8zNXc9v9GrJdGt8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=XRWYy8Ao6t8lGGwYXDCIhcJVfA5ZRM2UiPbweuw2xIjcu4ExBj/Vju2e0SwS/vSQqhQSrm/3XXYJj0bfxCfibpSCYq5f/VmqIDtk36iU5Dqlgaw+mxZ53NjlmXEggYOTYn3kdoZERN8cE3OZM21d+u8/ofq6Jn8/W8xkZpvMGec= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=eQmvZ8Y2; arc=fail smtp.client-ip=40.107.20.79 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="eQmvZ8Y2" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=BT58n+1LuBUXac1g74fcjAeNF3LQHcpMjdBNnxlgEdTePrIbFl/crXAg8jItSu9I8WgfloLk7qpc377Vb4XwGvc/c4T8NZlqPWlRR+fFzal5eKv/g6pMRwZOJniRBr3iVmTXfgpdhGzpMMnl8+LrU4QXs96UTfvSmiOxBjrikhynJ+XH1sSQYNB6+3mtsu7Jqy7vkBU6TTHV6B2k3M/DlQ8DkWffKmpMgMjyhVOpxrLnUqTafHHTA52+KZ0ORHLKNs1a1esVuxxuKHfad16ArsZQrCRJPdB0ASxQAegbLsS6r3tCO4M07ZaWQFRUrwM4UAqNdAwskFRV15C3JBwxuw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=d9YUEfM73TibN1rrjYSZTVPnxSn/bcD4rMCGh8+spiU=; b=L4q3yG8h6pliLg/C61PWkaNdXv2t0mE6ueKSOpJLrviAxl0PG+hRHQTC6eyjeIoivrHnXiyBEpBhl/f7fJvLgMUR4DqPkfBy9zxpKDAdTSzofc3fnZNB8Pq/2aOODQbq8Khz8Mm2aRbJfup9/s1KRpFaluzbQmfZ/pFqNO9M5/LVsQYuTeGAUUb8NQJS9O3Xnz355og4T3pMkWw/W4KhHu04MMynHqNnCFLXZGU0Npa6ncXuCPLDaSzQPwpbXqzeDr9zZ5jgShlxgGj+2sWod9yrSg+80OJnRETNNd/Qk5c4ZjOnX6Gp66eQUE208CpK66zk6s0cmx2JInvwkhRkBA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=d9YUEfM73TibN1rrjYSZTVPnxSn/bcD4rMCGh8+spiU=; b=eQmvZ8Y2FdBQxFX5tskqVjPwuV7XwF33zfOH/lsUTX5UxLh9IZmq+ZlZY+ml0O6c8s31Fj0vLK6/UJDa97KVt8ZA4+3o3eCxdzHOWPzFc+UFlzkvyNLvevPk44QBu7K5xtTkuKWt+/nwCcEtkRlYM8/5HTvc0wxTiubYm6DH/v/2Zsi3G70JjYxByvpstRCsMyiKoJdOak21Z+0pZbw1n6San2okkmtJ7JpYETTjgqzcWC+DrtolHo5Je9QOkHS+KOUdgTU93ir0nJ7a+/s9rXH9cAfM1uHJdIgHAKJ3xiKAjwpTvTLv1ns5FyzqHlLwA7/M0bJ/+CwByzF3fTlc5Q== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AS4PR04MB9244.eurprd04.prod.outlook.com (2603:10a6:20b:4e3::9) by AS8PR04MB7653.eurprd04.prod.outlook.com (2603:10a6:20b:299::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8182.21; Tue, 26 Nov 2024 15:53:30 +0000 Received: from AS4PR04MB9244.eurprd04.prod.outlook.com ([fe80::7303:2cc8:d109:d7c1]) by AS4PR04MB9244.eurprd04.prod.outlook.com ([fe80::7303:2cc8:d109:d7c1%6]) with mapi id 15.20.8182.019; Tue, 26 Nov 2024 15:53:30 +0000 From: Mirela Rabulea To: mchehab@kernel.org, sakari.ailus@linux.intel.com, hverkuil-cisco@xs4all.nl, laurent.pinchart+renesas@ideasonboard.com, robh@kernel.org, krzk+dt@kernel.org, bryan.odonoghue@linaro.org, laurentiu.palcu@nxp.com, robert.chiras@nxp.com Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, LnxRevLi@nxp.com, kieran.bingham@ideasonboard.com, hdegoede@redhat.com, dave.stevenson@raspberrypi.com, mike.rudenko@gmail.com, alain.volmat@foss.st.com, devicetree@vger.kernel.org, conor+dt@kernel.org, alexander.stein@ew.tq-group.com, umang.jain@ideasonboard.com, zhi.mao@mediatek.com, festevam@denx.de, julien.vuillaumier@nxp.com, alice.yuan@nxp.com Subject: [PATCH v2 4/4] media: ox05b1s: Add support for Omnivision OS08A20 raw sensor Date: Tue, 26 Nov 2024 17:51:00 +0200 Message-Id: <20241126155100.1263946-5-mirela.rabulea@nxp.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20241126155100.1263946-1-mirela.rabulea@nxp.com> References: <20241126155100.1263946-1-mirela.rabulea@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: VI1P190CA0023.EURP190.PROD.OUTLOOK.COM (2603:10a6:802:2b::36) To AS4PR04MB9244.eurprd04.prod.outlook.com (2603:10a6:20b:4e3::9) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS4PR04MB9244:EE_|AS8PR04MB7653:EE_ X-MS-Office365-Filtering-Correlation-Id: 25d61183-9045-4cb6-7502-08dd0e32796d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|52116014|376014|7416014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?c1b7dw4Qjl6aCsaNrGU3RzKq3u8KG1DlKP6CJ85l6T+9ZyOpubzvh35jaWU4?= =?us-ascii?Q?bJbDIW3LZRAywf2VPjNSCVdlR0QDwfNp8Im0gpHSyfH018tyowgzhluF1O3k?= =?us-ascii?Q?f6fE0OtV8nlJR6L7VUafkcS7OLI40nLG9zGa2NzE49H2ZmySF7WgnIvZXk5g?= =?us-ascii?Q?wWk0hKDwV0IQ/X0de9+nSJgYk17vG8jr+dsnlmHrhR5FWfRj4ZEesp4HOBA7?= =?us-ascii?Q?C6TmHGiRZBxnf3uZwStv8IYmQVNszPNjTT6TlSKTf6OlCNu/wMc20eP8BMFD?= =?us-ascii?Q?v/EkT2Bu4wOxL5CIG6xp4UxBtvZCBNRnKN0TfxgVs1e+hQnJdWjTbWTBA6HJ?= =?us-ascii?Q?c7Y8IvIQ3FXtLMcu6UWrmTayNiMQizbQK7/RgGT1whphXWOiO8GJ6LIlG1iW?= =?us-ascii?Q?PPad/cbKGgdPS2PEy1LyeYtwJSJJ+FJK4sPTUs3erT/mrcAQpXgJ6B41acad?= =?us-ascii?Q?JbC2CouNizF2sPLD3lgrJZm3v6ib5Jh079rpPhbV7LQSx/RA9nFzmpUgZEwG?= =?us-ascii?Q?eocrshNa7Pb3hpQJIFVixlhBAbNPg0neEN/KoxztYytf+0h94GNPATemEnDG?= =?us-ascii?Q?g5ocj2s6XqkFu2J5U1T7aPUYbWvi0mUp9q9T08F0gZrj5hthI4pQgsG2xNFy?= =?us-ascii?Q?siXoWVind6XNJq0CO9LDAE9xPOScXhBq6wLcGXtfxz77y+qjAFPQDX+MVtup?= =?us-ascii?Q?hJyjOWA3Crq9RxA3vy8n8CIdTYeVe8e0sNW1Cf++h1CJNrYFTV+Wt87Naj4U?= =?us-ascii?Q?Rmfh2G9pctWDbmcIcLN55tK3jEwXlZ9f90WvAUv8qZIbCafBpwiGU7gFGAio?= =?us-ascii?Q?3NTZ5s9Kb6Dk9UZaG8FlMNHLcm4JN4EpxkG0BxVVGnAc6Txf0njEWoE8Luiv?= =?us-ascii?Q?NXX6Zy+OJ97LCxuiY8cm+f1vztde4HqJBJwYM9YWKF6Mln4XQ5cV38AJWYtr?= =?us-ascii?Q?xLJ66d9pxvZhS3uGDl6OMOI8A67kUKkqDiDbdlSSlUfS0PqeSgHGdAiZ/Cm9?= =?us-ascii?Q?2hPagO1l+vg5ROLwVoc2pzyb2R0/3fwXD0rNJ2YVcl72PI4fHvj6D4d6fHg3?= =?us-ascii?Q?8kVxWexrMFf4R2iDutEAdYB5P0pno/Fma7t7ExiONMCerBdXcwa/52vBPzqF?= =?us-ascii?Q?wrxwXqj9wkZeutCzIWNpjFy45BpM8VXry+Fhe5/KKEqVxa7q6XOSSOfg269H?= =?us-ascii?Q?i4XDoVvAV6+1i2cSSaUcxedvjaSaOceorgVfH/02/Xp/c7MMUFu+A/WCtyg3?= =?us-ascii?Q?RpMTJABvTFG+ikpLNAYV6wGWBQpIpz5Myw2oh8h1o4UuIBi5QDZH2lsAyNDd?= =?us-ascii?Q?MDEiLOVcEC9X0u0Prw409H0QeiWIyUVu12THv0iXZbQ5GkPyIvDKME6q7zx6?= =?us-ascii?Q?9XvntSkNt4rcu3vftzv9uGv7x++NsIK9wvoWxhqix9WxtfTGCw=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS4PR04MB9244.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(52116014)(376014)(7416014)(1800799024)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?oskLVllu6VM4UC2LluJPyg6DCfdl6Pzqwbd6eEsAfRTdEF5jNQpJSbexz5+q?= =?us-ascii?Q?qpo9UPfgaBdgJQkOzIypfl7PWP6hxlcJVjMNu1zq99xKf/vMpa72PDATwDrD?= =?us-ascii?Q?dTbddqF8v1kAuPNp+/bvcdYCbdXbnMM0YweJy+9xB42h3Sv+TZgkQr4ebi38?= =?us-ascii?Q?g03gmnw3rkCG2OhzWAuKi0HJhUGQpUJ18CEKTeY264ukuMPAcW4j6OJ0uOok?= =?us-ascii?Q?+p70qKV18dqhufjUe51/TQt/JyzzjdS6c7VG1jYHw39UQgPIikLy+25eheNW?= =?us-ascii?Q?/G9Va+tVY0GYV7BWrV+F3jSMYp6T5QPnwERpYjzKrVdZWnbPNr7YqOgUSOik?= =?us-ascii?Q?TDQDwkx/VlcC6e0Kj0u4F45qZL4sWA61Yz689aIwR+ozMYg7k5IR4PEi0c/m?= =?us-ascii?Q?iC9szjuxECfXfmuqMZSpg9oNsqJBx3FimfxlFe23qnURr5p9zSGnLAgDMPCc?= =?us-ascii?Q?/oZdhOzzG4kuEhIcKcKq+L+X/ZGSy8SRCK7yeUsMYGAxp2C1Ir/m/mHlzGKl?= =?us-ascii?Q?IhPsRQui22mVgtcNnYArjVDQweBv64P2UKa9PFPDY7LiB9ShgtHhurX0QbwS?= =?us-ascii?Q?mIC1pNF5huI58ZTSXUDDX+Zl4P3og/rv6z/Pc4bXZRAK8r5kNH0i+vLEGITS?= =?us-ascii?Q?fP7a7ujOs+/TI9GV0Ygtq6UZhJMpUMmYMh0S677i7ulhIexs8/fsyFZjjktW?= =?us-ascii?Q?cf0NtDpjuBr8hWCp4resY4cS2JDqlQQ7OGAo67A/pJelcGwVe0fJXp6GpxLA?= =?us-ascii?Q?5Nz8ViPkN3yQGha1A2b6XTP42/87VAjL1mRifaF96CV8OrtptPhqUxXweDDS?= =?us-ascii?Q?LWUVevIVZAisijXr5oyrE0oG3ji5ULP3C3j2rYJKVNfA2Nkl8M/PQAYAOh5w?= =?us-ascii?Q?Bcm0JTx4K36GuqDq+lyCfrA7FCdIQpxS0F9Q1Ew75lRigdt99pj0qVV8GDcQ?= =?us-ascii?Q?omldPzlD++jXs22IdBCCnUVEJMyVhBHqsLlPvjEGYHCWyURKEX4Xd28OemMI?= =?us-ascii?Q?QZ0xDvcNQNCCNW3JpoFD8KnEtVbQU7p8kJ8lmq87qo4/iZIAY3CJZUShoiU1?= =?us-ascii?Q?6Opsqk0U5vCuLryINDAKVvxYLCmnzqGgefrtMvjnrnEmbVqSszA+p9eWit4A?= =?us-ascii?Q?PxV4QY/sQnnVQoOzRqu48pH7L1vRuy6Ne/H/lS+TwAok2uUJv21NzjhXoA+Q?= =?us-ascii?Q?pY0ikkJaj9d2hUtoi6fLGPmScnxlMR3FOj6IFRsomxyXJF3HP197iVovC51I?= =?us-ascii?Q?vY33IV6UkZRpwi9IzLJ2EczewPHo9tAoeNJuWpDvnIIeJ1T+QjQTbrrzs3P7?= =?us-ascii?Q?PI7SKPuCa/pJMqnco6VWDBdc59gS0VN94KplaempoTHlbXLI1HafgXEmOF1k?= =?us-ascii?Q?UeWYd28pviNHWfhk6oUKnZ/DTLR3m95f3Q5Sbikw+iQlYcV3bUG4PlDbTXJa?= =?us-ascii?Q?ewq1f4Ue6eA3awZCL5SKsOoaagsnB6mwa9g5WvnD91TLKEIAfLVuCBotiDwO?= =?us-ascii?Q?RsHkskjdAqG2lBpTbbIYmgIjR6wmjByysSpTNcfK+YvH0FMjc8wZROQ9sDzS?= =?us-ascii?Q?2Knmbj13R4kBggsQSEd70y2odFzUT5OEpStMlrsuWFVDnsGa3B16Zty70YoU?= =?us-ascii?Q?ZQ=3D=3D?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 25d61183-9045-4cb6-7502-08dd0e32796d X-MS-Exchange-CrossTenant-AuthSource: AS4PR04MB9244.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Nov 2024 15:53:30.7589 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: h07IoSzgDPaQEoP5YhmmXiPeef2D6T6sl5xRMNAfcDo6v5FnTZxV5ugs77Jh/45ifkki+iMczG1snp03zDgyEg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB7653 Content-Type: text/plain; charset="utf-8" This is an 8 megapixel raw10/raw12 sensor with HDR capabilities. HDR mode control is supported, with one hdr mode: staggered HDR with 2 exposures on separate virtual channels. Supported resolutions: - 1920 x 1080 @ 60fps (SBGGR10, no HDR) - 1920 x 1080 @ 30fps (SBGGR10, HDR) - 3840 x 2160 @ 30fps (SBGGR12, no HDR) - 3840 x 2160 @ 15fps (SBGGR10, HDR) - 3840 x 2160 @ 15fps (SBGGR12, HDR) - 3840 x 2160 @ 30fps (SBGGR12, no HDR) - 3840 x 2160 @ 30fps (SBGGR10, no HDR) Signed-off-by: Mirela Rabulea --- Changes in v2: Add spaces inside brackets, wrap lines to 80 Remove some redundant initialization Use a loop in os08a20_enable_staggered_hdr/os08a20_disable_staggered_hdr, = for that, add a register settings array for HDR enabling/disabling Make "sizes" a pointer Remove mode headers, add supported modes in the dedicated c file, ox05b1s_= modes.c=20 Refactor register lists, for os08a20 use a common list for all modes, and = also specific lists per mode drivers/media/i2c/ox05b1s/ox05b1s.h | 4 + drivers/media/i2c/ox05b1s/ox05b1s_mipi.c | 196 +++++++++++++ drivers/media/i2c/ox05b1s/ox05b1s_modes.c | 326 ++++++++++++++++++++++ 3 files changed, 526 insertions(+) diff --git a/drivers/media/i2c/ox05b1s/ox05b1s.h b/drivers/media/i2c/ox05b1= s/ox05b1s.h index a893c65894f3..38cd3438eb05 100644 --- a/drivers/media/i2c/ox05b1s/ox05b1s.h +++ b/drivers/media/i2c/ox05b1s/ox05b1s.h @@ -17,6 +17,10 @@ struct ox05b1s_reglist { struct ox05b1s_reg *regs; }; =20 +extern struct ox05b1s_reglist os08a20_reglist_4k_hdr[]; +extern struct ox05b1s_reglist os08a20_reglist_4k[]; +extern struct ox05b1s_reglist os08a20_reglist_1080p[]; + extern struct ox05b1s_reglist ox05b1s_reglist_2592x1944[]; =20 #endif /* OX05B1S_H */ diff --git a/drivers/media/i2c/ox05b1s/ox05b1s_mipi.c b/drivers/media/i2c/o= x05b1s/ox05b1s_mipi.c index 0f5e2a946e4f..9ae0243f1c09 100644 --- a/drivers/media/i2c/ox05b1s/ox05b1s_mipi.c +++ b/drivers/media/i2c/ox05b1s/ox05b1s_mipi.c @@ -43,6 +43,7 @@ struct ox05b1s_sizes { const struct v4l2_area *sizes; }; =20 +struct ox05b1s; struct ox05b1s_plat_data { char name[20]; u32 chip_id; @@ -55,6 +56,9 @@ struct ox05b1s_plat_data { const struct ox05b1s_mode *supported_modes; u32 default_mode_index; const struct ox05b1s_sizes *supported_codes; + const char * const *hdr_modes; + u32 hdr_modes_count; + int (*set_hdr_mode)(struct ox05b1s *sensor, u32 hdr_mode); }; =20 struct ox05b1s_ctrls { @@ -65,6 +69,7 @@ struct ox05b1s_ctrls { struct v4l2_ctrl *vblank; struct v4l2_ctrl *gain; struct v4l2_ctrl *exposure; + struct v4l2_ctrl *hdr_mode; }; =20 struct ox05b1s_mode { @@ -105,6 +110,85 @@ struct ox05b1s { struct ox05b1s_ctrls ctrls; }; =20 +static struct ox05b1s_mode os08a20_supported_modes[] =3D { + { + /* 1080p BGGR10, no hdr, 60fps */ + .index =3D 0, + .width =3D 1920, + .height =3D 1080, + .code =3D MEDIA_BUS_FMT_SBGGR10_1X10, + .bpp =3D 10, + .vts =3D 0x4a4, + .hts =3D 0x790, + .exp =3D 0x4a4 - 8, + .h_bin =3D true, + .fps =3D 60, + .reg_data =3D os08a20_reglist_1080p, + }, { + /* 4k BGGR10, staggered hdr VC0/VC1, 15fps */ + .index =3D 1, + .width =3D 3840, + .height =3D 2160, + .code =3D MEDIA_BUS_FMT_SBGGR10_1X10, + .bpp =3D 10, + .vts =3D 0x90a, + .hts =3D 0x818, + .exp =3D 0x90a - 8, + .h_bin =3D false, + .fps =3D 15, + .reg_data =3D os08a20_reglist_4k_hdr, + }, { + /* 4k BGGR12, no hdr, 30fps */ + .index =3D 2, + .width =3D 3840, + .height =3D 2160, + .code =3D MEDIA_BUS_FMT_SBGGR12_1X12, + .bpp =3D 12, + .vts =3D 0x8f0, + .hts =3D 0x814, + .exp =3D 0x8f0 - 8, + .h_bin =3D false, + .fps =3D 30, + .reg_data =3D os08a20_reglist_4k, + }, { + /* sentinel */ + } +}; + +/* keep in sync with os08a20_supported_modes*/ +static const struct v4l2_area os08a20_sbggr10_sizes[] =3D { + { + .width =3D 1920, + .height =3D 1080, + }, { + .width =3D 3840, + .height =3D 2160, + }, { + /* sentinel */ + } +}; + +static const struct v4l2_area os08a20_sbggr12_sizes[] =3D { + { + .width =3D 3840, + .height =3D 2160, + }, { + /* sentinel */ + } +}; + +static const struct ox05b1s_sizes os08a20_supported_codes[] =3D { + { + .code =3D MEDIA_BUS_FMT_SBGGR10_1X10, + .sizes =3D os08a20_sbggr10_sizes, + }, { + .code =3D MEDIA_BUS_FMT_SBGGR12_1X12, + .sizes =3D os08a20_sbggr12_sizes, + }, { + /* sentinel */ + } +}; + static struct ox05b1s_mode ox05b1s_supported_modes[] =3D { { .index =3D 0, @@ -234,6 +318,18 @@ static int ox05b1s_read_reg(struct ox05b1s *sensor, u1= 6 reg, u8 *val) return ret; } =20 +static int ox05b1s_update_bits(struct ox05b1s *sensor, u16 reg, unsigned i= nt mask, u8 val) +{ + struct device *dev =3D &sensor->i2c_client->dev; + int ret =3D 0; + + ret =3D regmap_update_bits(sensor->regmap, reg, mask, val); + if (ret < 0) + dev_err(dev, "Failed to update reg addr 0x%04x with 0x%02x\n", reg, val); + + return ret; +} + #define OX05B1S_MAX_REG_BULK 16 static int ox05b1s_write_reg_array(struct ox05b1s *sensor, struct ox05b1s_reg *reg_array) @@ -261,6 +357,62 @@ static int ox05b1s_write_reg_array(struct ox05b1s *sen= sor, return 0; } =20 +static const char * const os08a20_hdr_modes[] =3D { + "NO HDR", /* No HDR, single exposure */ + "HDR Staggered", /* Staggered HDR mode, 2 exposures on separate virtual c= hannels */ +}; + +static struct ox05b1s_reg os08a20_init_setting_hdr_en[] =3D { + { 0x3661, BIT(0) }, /* CORE1[0] STG_HDR_ALIGN_EN */ + { 0x3821, BIT(5) }, /* FORMAT2[5] STG_HDR_EN */ + { 0x4813, BIT(3) }, /* MIPI_CTRL_13[3] */ + { 0x486e, BIT(2) }, /* MIPI_CTRL_6E[2] MIPI_VC_ENABLE */ +}; + +static int os08a20_enable_staggered_hdr(struct ox05b1s *sensor) +{ + int ret; + + for (int i =3D 0; i < ARRAY_SIZE(os08a20_init_setting_hdr_en); i++) { + ret =3D ox05b1s_update_bits(sensor, + os08a20_init_setting_hdr_en[i].addr, + os08a20_init_setting_hdr_en[i].data, + os08a20_init_setting_hdr_en[i].data); + if (ret) + return ret; + } + + return 0; +} + +static int os08a20_disable_staggered_hdr(struct ox05b1s *sensor) +{ + int ret; + + for (int i =3D 0; i < ARRAY_SIZE(os08a20_init_setting_hdr_en); i++) { + ret =3D ox05b1s_update_bits(sensor, + os08a20_init_setting_hdr_en[i].addr, + os08a20_init_setting_hdr_en[i].data, + 0); + if (ret) + return ret; + } + + return 0; +} + +static int os08a20_set_hdr_mode(struct ox05b1s *sensor, u32 hdr_mode) +{ + switch (hdr_mode) { + case 0: + return os08a20_disable_staggered_hdr(sensor); + case 1: + return os08a20_enable_staggered_hdr(sensor); + default: + return -EINVAL; + } +} + static int ox05b1s_set_hts(struct ox05b1s *sensor, u32 hts) { u8 values[2] =3D { (u8)(hts >> 8) & 0xff, (u8)(hts & 0xff) }; @@ -329,6 +481,12 @@ static int ox05b1s_s_ctrl(struct v4l2_ctrl *ctrl) case V4L2_CID_EXPOSURE: ret =3D ox05b1s_set_exp(sensor, ctrl->val); break; + case V4L2_CID_HDR_SENSOR_MODE: + if (sensor->model->set_hdr_mode) + ret =3D sensor->model->set_hdr_mode(sensor, ctrl->val); + else + ret =3D -EINVAL; + break; default: ret =3D -EINVAL; break; @@ -391,6 +549,13 @@ static int ox05b1s_init_controls(struct ox05b1s *senso= r) ctrls->gain =3D v4l2_ctrl_new_std(hdl, ops, V4L2_CID_ANALOGUE_GAIN, 0, 0xFFFF, 1, 0x80); =20 + if (sensor->model->hdr_modes) + ctrls->hdr_mode =3D v4l2_ctrl_new_std_menu_items(hdl, ops, V4L2_CID_HDR_= SENSOR_MODE, + sensor->model->hdr_modes_count - 1, + 0, 0, sensor->model->hdr_modes); + else + ctrls->hdr_mode =3D NULL; + if (hdl->error) { ret =3D hdl->error; goto free_ctrls; @@ -703,7 +868,10 @@ static u8 ox05b1s_code2dt(const u32 code) { switch (code) { case MEDIA_BUS_FMT_SGRBG10_1X10: + case MEDIA_BUS_FMT_SBGGR10_1X10: return MIPI_CSI2_DT_RAW10; + case MEDIA_BUS_FMT_SBGGR12_1X12: + return MIPI_CSI2_DT_RAW12; default: return MIPI_CSI2_DT_RAW10; } @@ -819,6 +987,9 @@ static int ox05b1s_read_chip_id(struct ox05b1s *sensor) } =20 switch (chip_id) { + case 0x530841: + camera_name =3D "os08a20"; + break; case 0x580542: camera_name =3D "ox05b1s"; break; @@ -962,6 +1133,24 @@ static void ox05b1s_remove(struct i2c_client *client) static DEFINE_RUNTIME_DEV_PM_OPS(ox05b1s_pm_ops, ox05b1s_runtime_suspend, ox05b1s_runtime_resume, NULL); =20 +static const struct ox05b1s_plat_data os08a20_data =3D { + .name =3D "os08a20", + .chip_id =3D 0x530841, + .native_width =3D 3872, /* 16 dummy + 3840 active pixels + 16 dummy */ + .native_height =3D 2192, /* 16 dummy + 2160 active lines + 16 dummy */ + .active_top =3D 16, + .active_left =3D 16, + .active_width =3D 3840, + .active_height =3D 2160, + .supported_modes =3D os08a20_supported_modes, + .default_mode_index =3D 0, + .supported_codes =3D os08a20_supported_codes, + .hdr_modes =3D os08a20_hdr_modes, + .hdr_modes_count =3D ARRAY_SIZE(os08a20_hdr_modes), + .set_hdr_mode =3D os08a20_set_hdr_mode, + +}; + static const struct ox05b1s_plat_data ox05b1s_data =3D { .name =3D "ox05b1s", .chip_id =3D 0x580542, @@ -974,9 +1163,16 @@ static const struct ox05b1s_plat_data ox05b1s_data = =3D { .supported_modes =3D ox05b1s_supported_modes, .default_mode_index =3D 0, .supported_codes =3D ox05b1s_supported_codes, + .hdr_modes =3D NULL, + .hdr_modes_count =3D 0, + .set_hdr_mode =3D NULL, }; =20 static const struct of_device_id ox05b1s_of_match[] =3D { + { + .compatible =3D "ovti,os08a20", + .data =3D &os08a20_data, + }, { .compatible =3D "ovti,ox05b1s", .data =3D &ox05b1s_data, diff --git a/drivers/media/i2c/ox05b1s/ox05b1s_modes.c b/drivers/media/i2c/= ox05b1s/ox05b1s_modes.c index 1830e9a9cc35..8aa76c03c582 100644 --- a/drivers/media/i2c/ox05b1s/ox05b1s_modes.c +++ b/drivers/media/i2c/ox05b1s/ox05b1s_modes.c @@ -9,6 +9,332 @@ =20 #include "ox05b1s.h" =20 +/* Common register configuration for Omnivision OS08A20 raw camera */ +struct ox05b1s_reg os08a20_init_setting_common[] =3D { + { 0x0100, 0x00 }, + { 0x0103, 0x01 }, + { 0x0303, 0x01 }, + { 0x0306, 0x00 }, + { 0x0308, 0x03 }, + { 0x0309, 0x04 }, + { 0x300f, 0x11 }, + { 0x3010, 0x01 }, + { 0x3011, 0x04 }, + { 0x3012, 0x41 }, + { 0x3016, 0xf0 }, + { 0x301e, 0x98 }, + { 0x3031, 0xa9 }, + { 0x3103, 0x92 }, + { 0x3104, 0x01 }, + { 0x3106, 0x10 }, + { 0x340c, 0xff }, + { 0x340d, 0xff }, + { 0x3505, 0x83 }, + { 0x3508, 0x00 }, /* Long gain */ + { 0x3509, 0x80 }, /* Long gain */ + { 0x350a, 0x04 }, + { 0x350b, 0x00 }, + { 0x350c, 0x00 }, + { 0x350d, 0x80 }, + { 0x350e, 0x04 }, + { 0x350f, 0x00 }, + { 0x3603, 0x2c }, + { 0x3605, 0x50 }, + { 0x3610, 0x39 }, + { 0x360c, 0x01 }, + { 0x3628, 0xa4 }, + { 0x362d, 0x10 }, + { 0x3662, 0x00 }, + { 0x3663, 0x28 }, + { 0x3664, 0x0d }, + { 0x366a, 0x38 }, + { 0x366b, 0xa0 }, + { 0x366d, 0x00 }, + { 0x366e, 0x00 }, + { 0x3680, 0x00 }, + { 0x36c0, 0x00 }, + { 0x3701, 0x02 }, /* Sensor timing control registers 0x3700-0x37ff */ + { 0x373b, 0x02 }, + { 0x373c, 0x02 }, + { 0x3736, 0x02 }, + { 0x3737, 0x02 }, + { 0x3705, 0x00 }, + { 0x371c, 0x00 }, + { 0x371d, 0x08 }, + { 0x3740, 0x1b }, + { 0x3741, 0x04 }, + { 0x375e, 0x0b }, + { 0x3760, 0x10 }, + { 0x3776, 0x10 }, + { 0x3781, 0x02 }, + { 0x3782, 0x04 }, + { 0x3783, 0x02 }, + { 0x3784, 0x08 }, + { 0x3785, 0x08 }, + { 0x3788, 0x01 }, + { 0x3789, 0x01 }, + { 0x3797, 0x04 }, + { 0x3800, 0x00 }, + { 0x3801, 0x00 }, + { 0x3802, 0x00 }, + { 0x3803, 0x0c }, + { 0x3804, 0x0e }, + { 0x3805, 0xff }, + { 0x3806, 0x08 }, + { 0x3807, 0x6f }, + { 0x3823, 0x08 }, + { 0x3826, 0x00 }, + { 0x3827, 0x08 }, + { 0x382d, 0x08 }, + { 0x3832, 0x02 }, + { 0x3833, 0x00 }, /* REG33 (bit[0]=3Dr_stg_hdr_grp_wr_opt, bit[2]=3Dr_stg= _grphold_nomask) */ + { 0x383c, 0x48 }, + { 0x383d, 0xff }, + { 0x3d85, 0x0b }, + { 0x3d84, 0x40 }, + { 0x3d8c, 0x63 }, + { 0x3d8d, 0xd7 }, + { 0x4000, 0xf8 }, + { 0x4001, 0x2b }, + { 0x4004, 0x00 }, + { 0x4005, 0x40 }, + { 0x400a, 0x01 }, + { 0x400f, 0xa0 }, + { 0x4010, 0x12 }, + { 0x4018, 0x00 }, + { 0x4008, 0x02 }, + { 0x401a, 0x58 }, + { 0x4050, 0x00 }, + { 0x4051, 0x01 }, + { 0x4028, 0x2f }, + { 0x4052, 0x00 }, + { 0x4053, 0x80 }, + { 0x4054, 0x00 }, + { 0x4055, 0x80 }, + { 0x4056, 0x00 }, + { 0x4057, 0x80 }, + { 0x4058, 0x00 }, + { 0x4059, 0x80 }, + { 0x430b, 0xff }, + { 0x430c, 0xff }, + { 0x430d, 0x00 }, + { 0x430e, 0x00 }, + { 0x4501, 0x18 }, /* R1 (default 0x18) bit[4:2]=3Dnot used */ + { 0x4502, 0x00 }, + { 0x4643, 0x00 }, + { 0x4640, 0x01 }, + { 0x4641, 0x04 }, + { 0x4800, 0x64 }, + { 0x4809, 0x2b }, + { 0x4813, 0x90 }, /* MIPI CTRL 13 (bit[5:4]=3DVC1=3D1, bit[7:6]=3DVC2=3D2= ) */ + { 0x4817, 0x04 }, + { 0x4833, 0x18 }, + { 0x483b, 0x00 }, + { 0x484b, 0x03 }, + { 0x4850, 0x7c }, + { 0x4852, 0x06 }, + { 0x4856, 0x58 }, + { 0x4857, 0xaa }, + { 0x4862, 0x0a }, + { 0x4869, 0x18 }, + { 0x486a, 0xaa }, + { 0x486e, 0x03 }, /* MIPI CTRL 6E (default 0x03) */ + { 0x486f, 0x55 }, + { 0x4875, 0xf0 }, + { 0x5000, 0x89 }, + { 0x5001, 0x42 }, + { 0x5004, 0x40 }, + { 0x5005, 0x00 }, + { 0x5180, 0x00 }, + { 0x5181, 0x10 }, + { 0x580b, 0x03 }, + { 0x4d00, 0x03 }, + { 0x4d01, 0xc9 }, + { 0x4d02, 0xbc }, + { 0x4d03, 0xc6 }, + { 0x4d04, 0x4a }, + { 0x4d05, 0x25 }, + { 0x4700, 0x2b }, + { 0x4e00, 0x2b }, + { /* sentinel*/ }, +}; + +/* Mode specific register configurations for Omnivision OS08A20 raw camera= */ + +/* OS08A20 3840 x 2160 @30fps BGGR10 HDR */ +struct ox05b1s_reg os08a20_init_setting_4k_hdr[] =3D { + { 0x0305, 0x3c }, /* PLL_CTRL_05 (default 0x3c) */ + { 0x032a, 0x00 }, /* PLL_CTRL_2a (default 0x00) */ + { 0x031e, 0x09 }, + { 0x3501, 0x08 }, /* Long exposure */ + { 0x3502, 0xe5 }, /* Long exposure */ + { 0x3600, 0x00 }, /* CORE0 bit[0]=3Dstg_hdr_align_en, bit[3]=3Dnew_stgr_h= dr_en */ + { 0x3609, 0xb5 }, + { 0x3660, 0x42 }, /* CORE0 bit[0]=3Drip_sof_vifo_en, bit[1]=3Dstg_hdr_lon= g_en debug mode */ + { 0x3661, 0x07 }, /* CORE1 (default 0x06) bit[0]=3Dstg_hdr_align_en */ + { 0x3706, 0x39 }, + { 0x370a, 0x00 }, + { 0x370b, 0x98 }, + { 0x3709, 0x49 }, + { 0x3714, 0x21 }, /* Sensor timing control registers 0x3700-0x37ff */ + { 0x3762, 0x11 }, /* Sensor timing control registers 0x3700-0x37ff */ + { 0x3808, 0x0f }, /* X output size (default 0x07) */ + { 0x3809, 0x00 }, /* X output size (default 0x80) */ + { 0x380a, 0x08 }, /* Y output size (default 0x04) */ + { 0x380b, 0x70 }, /* Y output size (default 0x38) */ + { 0x380c, 0x08 }, /* HTS[15:8], total horizontal timing size */ + { 0x380d, 0x18 }, /* HTS[7:0], total horizontal timing size */ + { 0x380e, 0x09 }, /* VTS[15:8], total vertical timing (default 0x04) */ + { 0x380f, 0x0a }, /* VTS[7:0], total vertical timing (default 0xA0) */ + { 0x3813, 0x10 }, /* ISP_Y_WIN ISP vertical windowing offset */ + { 0x3814, 0x01 }, /* X INC ODD (default 0x01) */ + { 0x3815, 0x01 }, /* X INC EVEN (default 0x01) */ + { 0x3816, 0x01 }, /* Y INC ODD (default 0x01) */ + { 0x3817, 0x01 }, /* Y INC EVEN (default 0x01) */ + { 0x381c, 0x08 }, /* BLC_NUM_OPTION (default 0x0e) */ + { 0x3820, 0x00 }, /* FORMAT1 (default 0x80) bit[0]=3Dvertical bining */ + { 0x3821, 0x24 }, /* FORMAT2 bit[5]=3Dstagger hdr en, bit[2]=3Dmirror */ + { 0x3833, 0x01 }, /* REG33 (bit[0]=3Dr_stg_hdr_grp_wr_opt, bit[2]=3Dr_stg= _grphold_nomask) */ + { 0x4009, 0x0d }, /* BLC CTRL09 (default 0x0f) bl_end */ + { 0x4813, 0x98 }, /* MIPI CTRL 13 (bit[5:4]=3DVC1=3D1, bit[7:6]=3DVC2=3D2= ) */ + { 0x4837, 0x10 }, /* PCLK PERIOD (default 0x08) */ + { 0x486e, 0x07 }, /* MIPI CTRL 6E (default 0x03) */ + { 0x3501, 0x08 }, /* Long exposure */ + { 0x3502, 0xe1 }, /* Long exposure */ + { 0x3511, 0x00 }, /* Short exposure */ + { 0x3512, 0x20 }, /* Short exposure */ + { /* sentinel*/ }, +}; + +/* OS08A20 3840 x 2160 @30fps BGGR12 */ +struct ox05b1s_reg os08a20_init_setting_4k[] =3D { + { 0x0305, 0x3c }, /* PLL_CTRL_05 (default 0x3c) */ + { 0x0325, 0x47 }, /* PLL_CTRL_25 (default 0x3c) */ + { 0x032a, 0x00 }, /* PLL_CTRL_2a (default 0x00) */ + { 0x3400, 0x04 }, /* PSV CTRL (default 0x00) bit[2]=3Dr_psv_mode_en */ + { 0x3025, 0x03 }, /* PSV MODE OPT (default 0x02) not used */ + { 0x3425, 0x01 }, /* R ASP PD SEL bit[1:0]=3Dstream blanking */ + { 0x3428, 0x01 }, /* R ASP PD SEL bit[1:0]=3Dbpg1 N-pump1 bypass to AGND = */ + { 0x3408, 0x03 }, /* CTRL08 (default 0x01) bit[3:0]=3Dr_clk_winp_off */ + { 0x031e, 0x0a }, + { 0x3501, 0x08 }, /* Long exposure */ + { 0x3502, 0xe5 }, /* Long exposure */ + { 0x3600, 0x00 }, /* CORE0 bit[0]=3Dstg_hdr_align_en, bit[3]=3Dnew_stgr_h= dr_en */ + { 0x3609, 0xdb }, + { 0x3660, 0xd3 }, /* CORE0 bit[0]=3Drip_sof_vifo_en, bit[1]=3Dstg_hdr_lon= g_en debug mode */ + { 0x3706, 0x72 }, + { 0x370a, 0x01 }, + { 0x370b, 0x30 }, + { 0x3709, 0x48 }, + { 0x3714, 0x21 }, /* Sensor timing control registers 0x3700-0x37ff */ + { 0x3762, 0x11 }, /* Sensor timing control registers 0x3700-0x37ff */ + { 0x3808, 0x0f }, /* X output size (default 0x07) */ + { 0x3809, 0x00 }, /* X output size (default 0x80) */ + { 0x380a, 0x08 }, /* Y output size (default 0x04) */ + { 0x380b, 0x70 }, /* Y output size (default 0x38) */ + { 0x380c, 0x08 }, /* HTS[15:8], total horizontal timing size */ + { 0x380d, 0x14 }, /* HTS[7:0], total horizontal timing size */ + { 0x380e, 0x08 }, /* VTS[15:8], total vertical timing (default 0x04) */ + { 0x380f, 0xf0 }, /* VTS[7:0], total vertical timing (default 0xA0) */ + { 0x3813, 0x10 }, /* ISP_Y_WIN ISP vertical windowing offset */ + { 0x3814, 0x01 }, /* X INC ODD (default 0x01) */ + { 0x3815, 0x01 }, /* X INC EVEN (default 0x01) */ + { 0x3816, 0x01 }, /* Y INC ODD (default 0x01) */ + { 0x3817, 0x01 }, /* Y INC EVEN (default 0x01) */ + { 0x381c, 0x00 }, /* BLC_NUM_OPTION (default 0x0e) */ + { 0x3820, 0x00 }, /* FORMAT1 (default 0x80) bit[0]=3Dvertical bining */ + { 0x3821, 0x04 }, /* FORMAT2 bit[2]=3Dmirror, bit[0]=3Dhorizontal bining = */ + { 0x4009, 0x0d }, /* BLC CTRL09 (default 0x0f) bl_end */ + { 0x4600, 0x00 }, + { 0x4601, 0x20 }, + { 0x4603, 0x01 }, + { 0x4837, 0x10 }, /* PCLK PERIOD (default 0x08) */ + { 0x3501, 0x09 }, /* Long exposure */ + { 0x3502, 0x01 }, /* Long exposure */ + { 0x4028, 0x4f }, + { 0x4029, 0x1f }, + { 0x402a, 0x7f }, + { 0x402b, 0x01 }, + { /* sentinel*/ }, +}; + +/* OS08A20 1920 x 1080 @60fps BGGR10 */ +struct ox05b1s_reg os08a20_init_setting_1080p[] =3D { + { 0x0304, 0x00 }, /* PLL_CTRL_04 (default 0x00) */ + { 0x0305, 0x2d }, /* PLL_CTRL_05 (default 0x3c) */ + { 0x0325, 0x45 }, /* PLL_CTRL_25 (default 0x3c) */ + { 0x0327, 0x05 }, /* PLL_CTRL_27 (default 0x07) */ + { 0x0328, 0x02 }, /* PLL_CTRL_28 (default 0x07) */ + { 0x032a, 0x02 }, /* PLL_CTRL_2a (default 0x00) */ + { 0x3400, 0x04 }, /* PSV CTRL (default 0x00) bit[2]=3Dr_psv_mode_en */ + { 0x3025, 0x03 }, /* PSV MODE OPT (default 0x02) not used */ + { 0x3425, 0x01 }, /* R ASP PD SEL bit[1:0]=3Dstream blanking */ + { 0x3428, 0x01 }, /* R ASP PD SEL bit[1:0]=3Dbpg1 N-pump1 bypass to AGND = */ + { 0x3408, 0x03 }, /* CTRL08 (default 0x01) bit[3:0]=3Dr_clk_winp_off */ + { 0x031e, 0x09 }, + { 0x3501, 0x04 }, /* Long exposure */ + { 0x3502, 0x62 }, /* Long exposure */ + { 0x3600, 0x09 }, /* CORE0 bit[0]=3Dstg_hdr_align_en, bit[3]=3Dnew_stgr_h= dr_en */ + { 0x3609, 0xb5 }, + { 0x3660, 0x43 }, /* CORE0 bit[0]=3Drip_sof_vifo_en, bit[1]=3Dstg_hdr_lon= g_en debug mode */ + { 0x3706, 0x39 }, + { 0x370a, 0x00 }, + { 0x370b, 0x98 }, + { 0x3709, 0x49 }, + { 0x3714, 0x22 }, /* Sensor timing control registers 0x3700-0x37ff */ + { 0x3762, 0x11 }, /* Sensor timing control registers 0x3700-0x37ff */ + { 0x3808, 0x07 }, /* X output size (default 0x07) */ + { 0x3809, 0x80 }, /* X output size (default 0x80) */ + { 0x380a, 0x04 }, /* Y output size (default 0x04) */ + { 0x380b, 0x38 }, /* Y output size (default 0x38) */ + { 0x380c, 0x07 }, /* HTS[15:8], total horizontal timing size */ + { 0x380d, 0x90 }, /* HTS[7:0], total horizontal timing size */ + { 0x380e, 0x04 }, /* VTS[15:8], total vertical timing (default 0x04) */ + { 0x380f, 0xa4 }, /* VTS[7:0], total vertical timing (default 0xA0) */ + { 0x3813, 0x08 }, /* ISP_Y_WIN ISP vertical windowing offset */ + { 0x3814, 0x03 }, /* X INC ODD (default 0x01) */ + { 0x3815, 0x01 }, /* X INC EVEN (default 0x01) */ + { 0x3816, 0x03 }, /* Y INC ODD (default 0x01) */ + { 0x3817, 0x01 }, /* Y INC EVEN (default 0x01) */ + { 0x381c, 0x00 }, /* BLC_NUM_OPTION (default 0x0e) */ + { 0x3820, 0x01 }, /* FORMAT1 (default 0x80) bit[0]=3Dvertical bining */ + { 0x3821, 0x05 }, /* FORMAT2 bit[2]=3Dmirror, bit[0]=3Dhorizontal bining = */ + { 0x4009, 0x05 }, /* BLC CTRL09 (default 0x0f) bl_end */ + { 0x4501, 0x98 }, /* R1 (default 0x18) bit[4:2]=3Dnot used */ + { 0x4837, 0x16 }, /* PCLK PERIOD (default 0x08) */ + { /* sentinel*/ }, +}; + +struct ox05b1s_reglist os08a20_reglist_4k_hdr[] =3D { + { + .regs =3D os08a20_init_setting_common + }, { + .regs =3D os08a20_init_setting_4k_hdr + }, { + /* sentinel */ + } +}; + +struct ox05b1s_reglist os08a20_reglist_4k[] =3D { + { + .regs =3D os08a20_init_setting_common + }, { + .regs =3D os08a20_init_setting_4k + }, { + /* sentinel */ + } +}; + +struct ox05b1s_reglist os08a20_reglist_1080p[] =3D { + { + .regs =3D os08a20_init_setting_common + }, { + .regs =3D os08a20_init_setting_1080p + }, { + /* sentinel */ + } +}; + /* * Register configuration for Omnivision OX05B1S raw camera * 2592X1944_30FPS_FULL_RGBIr 2592 1944 --=20 2.25.1