From nobody Sun May 24 23:32:30 2026 Received: from PNZPR01CU001.outbound.protection.outlook.com (mail-centralindiaazon11021086.outbound.protection.outlook.com [40.107.51.86]) (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 E3C8F3DA5A7; Wed, 20 May 2026 11:57:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.51.86 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779278235; cv=fail; b=ctn1EkIkwYgutswORdnROFy6736kP6ADT2Hdf5+d/QeURarlw2tyHfr9kdBpRPmzVoIT19M2Ljav8DjOhUfyVtQDYWorhHWugqQzWgZ9HBbP/4l36+P4q/W1ZVNS+t7RJsgaX/XtHr2byMEjizVbnndtyId02sH5/YAsqtjSers= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779278235; c=relaxed/simple; bh=TGQgi0dP3In+Av1mVkB0VbIR/6QAOJJwLUR7oqucZQk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=JwBo0bg1Q6A+xdhcG7jPFeCd3fXBawLj8z3Mx808IF0CW0VoVA/0LQPtsP/ZuSKuOowuSgDMhk+9LVL7b5EwJV/BRiaSmzJnPz3qmL7Mem5F/3WjXhFnwop0C8iAPwyAwf3Nvg3+B481sKAYq/IzQGcg2R5fW1YQX0y7l6fJcKs= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=siliconsignals.io; spf=pass smtp.mailfrom=siliconsignals.io; dkim=pass (2048-bit key) header.d=siliconsignals.io header.i=@siliconsignals.io header.b=Ese5H0Jf; arc=fail smtp.client-ip=40.107.51.86 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=siliconsignals.io Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=siliconsignals.io Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=siliconsignals.io header.i=@siliconsignals.io header.b="Ese5H0Jf" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=m8YHFnqMcBpKlzzuLja0PKuBWRinaXN5i7Cn7KzvLDzHgwl1hP6i/voBvn5cDCINwM5DM01rBUQU7qPTb3/OiLZsp+VeQ+gJ7QgJvYhDtBE0uyU+Pg2R2hWZp3viHpAj9sdEFBABcq/Y+SgA1DuQGp/MF9TjyMdIXRnr11rB++JTYaO8uFl3SRfIi/F34So/R5z6MUa7wLYtSTe0zvs6pfub7gcvGFk4csDwF71iVIcIDahiEo78mAWCksnYKj7pHr1x1Vgq4bNdeSJ7j8STVagScsiHpoWyyMUi7tRJSL6qjb8tjCbJOTABnZ+BatUzOZiBj2gjAlt4pcQyVKjEDw== 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=UQIgCPXRn+hibMSZbrWU2/N/yRMqbseGXd0OX8BKfZg=; b=oXpAjrHO7c7tx9AtSAuM/rj4KTmZP3SwZdNmy3v3wJmNWXRTXlLFwaGIOCIle5DlskK8szFJUsF33o1C5bAQqyuuAndcgeO6BKyKgti57APeLWtbgFXGANdsqMJTMCyKjBlsLISz14CKr84FjzRQ3lJRV+H0p1jPbaxowYKQUCnjpclkkUSvdUriBuou/n3K1t1q32yyckVhSInukgM3H/nSk/xuDJ+bgBJ5oP923N40oAySBBU0Y961a9TMKxoP290okUbqyUi5vMFerv2l8oy3yarPRarYqsohFjYtUTysnbx0Fr0FXJm4G5Poz7+JETInANIQuCu1l4ivleb0kA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=siliconsignals.io; dmarc=pass action=none header.from=siliconsignals.io; dkim=pass header.d=siliconsignals.io; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=siliconsignals.io; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=UQIgCPXRn+hibMSZbrWU2/N/yRMqbseGXd0OX8BKfZg=; b=Ese5H0JfEVU/wIIHfNErFYeUCB5OZo2dbqMu4jh32xGOuZ9bFJ29AHbC2eAyrHnpVfEw5TbhDLfKpruTFSPZc+Z7JP/H0TO/GqEc0I7tshp6lwBFAXqgJO4LXUiZsAuFU9rUMyqgQ/DdGg4OxqFhX0I04cUUCz8xaWhHXBaviycmiQVBE+KyUHESozFJ6jaelhim8DRkNXpUPFjpOG51BXPayh5lMjxEpfKGKEk1btDnnvofrFqMYAOPFYXmvd3G1ieVKAURB9cnGdqlijmblggeH4HFrUALeVRAlWiyt0w7NkLe7VyTxNFnY/W6GHvwuXaPXb/Dske4H1TR3ixNxA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=siliconsignals.io; Received: from PN0P287MB2019.INDP287.PROD.OUTLOOK.COM (2603:1096:c01:1b8::9) by MAUP287MB5499.INDP287.PROD.OUTLOOK.COM (2603:1096:a01:218::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.48.14; Wed, 20 May 2026 11:57:11 +0000 Received: from PN0P287MB2019.INDP287.PROD.OUTLOOK.COM ([fe80::ebd8:538d:c705:8432]) by PN0P287MB2019.INDP287.PROD.OUTLOOK.COM ([fe80::ebd8:538d:c705:8432%6]) with mapi id 15.21.0048.013; Wed, 20 May 2026 11:57:11 +0000 From: Himanshu Bhavani To: sakari.ailus@linux.intel.com Cc: Hardevsinh Palaniya , Himanshu Bhavani , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Bjorn Andersson , Konrad Dybcio , Hans Verkuil , Hans de Goede , Vladimir Zapolskiy , Elgin Perumbilly , Laurent Pinchart , Xiaolei Wang , Walter Werner Schneider , Kate Hsuan , Svyatoslav Ryhel , linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org Subject: [PATCH 1/3] dt-bindings: media: i2c: Add imx576 sensor Date: Wed, 20 May 2026 17:26:33 +0530 Message-Id: <20260520115641.11729-2-himanshu.bhavani@siliconsignals.io> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260520115641.11729-1-himanshu.bhavani@siliconsignals.io> References: <20260520115641.11729-1-himanshu.bhavani@siliconsignals.io> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PN5P287CA0046.INDP287.PROD.OUTLOOK.COM (2603:1096:c01:25f::12) To PN0P287MB2019.INDP287.PROD.OUTLOOK.COM (2603:1096:c01:1b8::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: PN0P287MB2019:EE_|MAUP287MB5499:EE_ X-MS-Office365-Filtering-Correlation-Id: ee00e837-5cca-427c-d194-08deb666ecc5 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|52116014|7416014|1800799024|366016|38350700014|3023799007|56012099003|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: p3zMZN/5Mo84GG2xiiANjllY/y9jO2Xg9eo6rlGMavv8vjOEftJ9vMjvhr6ewf8GmR2YvvRqBB/DFGnvd0eATnfHp/7fQEItzIjSRKyKRYcUvPQGYBs3kwJu41tjz+OuDykAspmHSpNWwfMvgDFRGJzNa9hJPSetC1uRn+63ktTOkmavdM+2wep+N9GJkVx4Kb1j2z5v5ipHpbFDPx7A5/TVD+RxZedyDSrgIQpyZM6MtxFn21gByHj+WZkyIdHQHPiN/Uvnxe0YY7BfZSWmqivW1I6EYVlh1X3okLFRDYr/f3yTJBV8G0WNKuWBIdydXBy8K1aMBXavtqKJCh64tONr2YzFVSN/c21KXalH90qjagqFc2SCI39jKQBW3SE/MgWS+fc3KTsmRlSaBgba+HB4nGi+ccQOI4e6eFduIa2V177qMAnUNkw7366JbVCKyQnmQM7tGHyrP7b3Xn8K/5xt9BSSxtgVwlO6Lgx43XpQ72IJtVcinpkWASE1lrGB5mBYxU5nhY8X9QKBFnfnKnm3YkHRwzuj0RE4jOQ9wS4KWFRsUq2jY4ifs+uy2JIzCCMlsyVacn0jgatD+8DgerYIzBBjW/lSHeX9xlGwMHgQsTxdSBT9yTCRoOkojhFFz6oltAZF0eupiVnJwuRiAHJ4sK+lSZRPkOxp1ptVZSnZI5LmxiI2KywU5LilPkYP X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PN0P287MB2019.INDP287.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(52116014)(7416014)(1800799024)(366016)(38350700014)(3023799007)(56012099003)(18002099003)(22082099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?OUo3UGVyYnl4SkhMM0E2UWMvTldjQnExY2pkdUFFbHBpOWhLOHJQOFF2VmxI?= =?utf-8?B?Y2RySGZtVWtIdjYweGxydVpKTFJsbGZ4ZStjemdBcHBGRG9EaVU2MlpaSUk2?= =?utf-8?B?ZS9YelR2dWVVNzJ6ZFVzMHZmb2ljaUVtQ2lmaWNaR0xweWM3WXdkdEd4UDJr?= =?utf-8?B?RmgvWVY3NzNISVIyTVNSRjNRc2JlZXhZOHdibExsTzJFY0NPL1F3MllsUGNK?= =?utf-8?B?VSsvR3FqMlp6cTdIYXFuVEJpQVRCWjlRT1YxZjkrRkpjVUJBTkRGVkU5Mnh3?= =?utf-8?B?dVNmUytJS3oyU2hORWhUWXgxTktFZkhuMlcydDNhS1hnSSs0aHBrWWJ0amlx?= =?utf-8?B?WERidzFsZ2xaRml0dk5VUEZUQnhzRGNFNEdjblJzZTR2NGZqMGwxVTZBWkNB?= =?utf-8?B?d21OcFYzS29OeTVwdjQyaW5vZHBobmNiek1BaFhVc1ZYNWdqazhENUZ2Ui9n?= =?utf-8?B?Y0xtazBnOTQ1YW0xM3Jtc1Q2ZHNpY1gwNlQrbTFIK3RGRURHSFdDVXM5NXh3?= =?utf-8?B?anBwMzF4S1pTQUJtdUJMdTBHTHJKZ296RlArQnZSSXN1UnB3YWpmbi9rTGtR?= =?utf-8?B?TDBrOXltWXZQYXB0NGNjQ3lWVzljVjluWXE2cGxrMTQyNkdHR1MwNjVoY2oz?= =?utf-8?B?YnBlVFJXZXFuY05JMmZ2cmNHd1FyMVBVNUxKZUgyNHp5bzZ5Q3Fob1Q3bU5z?= =?utf-8?B?cTg4SHFJMEFpS09KRGk3MlMrZHVlV1paWnZBMzJBZU1BNzNseWRXblZpZ2lF?= =?utf-8?B?Z0VpVmQ1NlVKSHk5bTJuZUFvQ0JsOXFuWFVCMEdMdk9mVDRCMmpkVldBVVRW?= =?utf-8?B?c1MxdHk0ZWNkK3V3cHYvVk0xbFVQaE91Z0dNNXpuUkZrSmxJVzU4RFpUYWsw?= =?utf-8?B?WkY0S3hzVnI5Y0poNTQ2aGhpY1RKVGluMk1qeFcvbWVldHBVVmtVK0ZmcXNJ?= =?utf-8?B?UERMOS9OaUZQR29pUUpSckpwd1JXdVlhVHlOeStMRU4zWERyOWd2WFdoSk5U?= =?utf-8?B?WkNRMXlnRXhDMXc4MmRnbjNlUExwSXhSQWU0cDFLbmlYMjduLyt5VG51bVc3?= =?utf-8?B?cE5WSUFJb0l5VjR2L1NiTis1NnRjaEdYNzFidDRIaGd6aEhDdHl5eVR3TTVJ?= =?utf-8?B?WUNTb0RnT3Q3ODc3bzdHNGNKdWg2elgwZlRGTFlrOVBDUWJWSUhISHpGbVV2?= =?utf-8?B?VXpEVDdYZWU5aTJ3bUNob0FXcTBZZ1Q1QUZ2ZXdvejJwVUVHTUt5WFpqQW5P?= =?utf-8?B?Ny9URjdpUTB3SW56VHFYRUNCakNzaG5jYkZLY3NFMkpEWWlDaHhxYXhhc1N2?= =?utf-8?B?eWZOQXNNM1g4Ymx3OWQ0b3o2NEIwZ05wOXJaK0tWclA4L2VPQ1dsUHF2SEY4?= =?utf-8?B?VnBSK1IwWWxrclJhd1NXR2RCdC9PMk95cDRacy9yUjNWck1qOExOTWhJdGl1?= =?utf-8?B?ZkJsL3AwcUpiKzlRNnNqSXlPZG1pVHdDcklFMVVkbmxVQmxjNEJjQVhBaGxI?= =?utf-8?B?WmdtSVBWT2QwdWlreFFhM29VV1FqeGdvTkdpYXhhdTdqWE83akdyb3NtZ0Zh?= =?utf-8?B?QzA0TzJEWGhBaytmb0hyUURvRFVJdlFacUpDRjFoR1BCdzdXM0EvM2ltRm9r?= =?utf-8?B?RWI5YTRrbHlFdVN1bFlPRlVNcVNuUlJuZTdKSkNka2VxVHN5MVh4d2Z6UURG?= =?utf-8?B?d0hQY3pNdFdzZWZwcXFYVUhKMTZxb3JEdCs2anlhWFVGSS82TVFrT055aklU?= =?utf-8?B?Ui9jckxvRjhKdlhzV0pRNUVpK3F1OCs5MzJwVmdYejhKbDBXWVhmSlZQb2pi?= =?utf-8?B?Zk9JMzBsY3dJVFYwZFRFM2ZEUEVPMG5WK2F4Tm15bFBqbU9SZEw0ek1oa3NS?= =?utf-8?B?YXRPQmVwSTdqTkQ4amVOeUx4UzQ0UmNhaGdwL2Z2NnJkbUhUUFprMEp1anhU?= =?utf-8?B?akNMWUcvMXNUeGRrclpNZ0hHTEtvSmpQeDB6VWloR1I2WHBGK1NIWTBqUlIw?= =?utf-8?B?MTdENTEwb2RuZ1dlcS9DNElxek84MzlJMHh0a3lHUTNYUUVaOFg0Kzd1UHJJ?= =?utf-8?B?VU1jNHc1eEM3SGh0L0FxcVF3VG96MmlDaXRGemYyV3g4WUFrOFY3SzdsdHh5?= =?utf-8?B?MjRmVEt0ZGp5a09LSHlsQ294cjlBNkttWXhqdGtiaWxIUHVrbXJiY1k0ME9p?= =?utf-8?B?aW1hNDVITVZpbHlnZUtQYW9aT0NESExMT25vQWozWEpKQ3JoMkdjK1lYeUxq?= =?utf-8?B?NStUSnB0YlhkZUd3VmJlVXlaZy9RZmhMZ2xIL3B0QktzckRRVFk3SGZVKzl3?= =?utf-8?B?SlJOZXNQUk9hZ2NiSVlkRUJnZnFVNEl2TCtHVHh5VEs4YzBWOVAyYkRKb3hu?= =?utf-8?Q?pcf8pgNNXH0UOun/gK92eVtc9f8gu3/uBwhJn?= X-OriginatorOrg: siliconsignals.io X-MS-Exchange-CrossTenant-Network-Message-Id: ee00e837-5cca-427c-d194-08deb666ecc5 X-MS-Exchange-CrossTenant-AuthSource: PN0P287MB2019.INDP287.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 May 2026 11:57:10.9245 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7ec5089e-a433-4bd1-a638-82ee62e21d37 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 3WTz12KxwOtzloyvL1p8+fCtchYlvUm/LMa2LB3FTnNpUmDbNYtWUinjzzYplq+FSjKAfPkWmuuyZ2MlahjCL2q7Xy/ILgnTvG/MBY+xTHY0k3bkOh6+EPZ5MPWBEvHW X-MS-Exchange-Transport-CrossTenantHeadersStamped: MAUP287MB5499 From: Hardevsinh Palaniya Add bindings for Sony IMX576 sensor Signed-off-by: Hardevsinh Palaniya --- .../bindings/media/i2c/sony,imx576.yaml | 111 ++++++++++++++++++ MAINTAINERS | 7 ++ 2 files changed, 118 insertions(+) create mode 100644 Documentation/devicetree/bindings/media/i2c/sony,imx576= .yaml diff --git a/Documentation/devicetree/bindings/media/i2c/sony,imx576.yaml b= /Documentation/devicetree/bindings/media/i2c/sony,imx576.yaml new file mode 100644 index 000000000000..b74253004fae --- /dev/null +++ b/Documentation/devicetree/bindings/media/i2c/sony,imx576.yaml @@ -0,0 +1,111 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/media/i2c/sony,imx576.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Sony IMX576 Image Sensor + +maintainers: + - Hardevsinh Palaniya + +description: + IMX576 sensor is a Sony CMOS active pixel digital image sensor with an a= ctive + array size of 5760(H) =C3=97 4312(V). It is programmable through an I2C = interface. + Image data is transmitted through MIPI CSI-2. It supports RAW10/RAW8, CO= MP8 + output formats. + +allOf: + - $ref: /schemas/media/video-interface-devices.yaml# + +properties: + compatible: + const: sony,imx576 + + reg: + maxItems: 1 + + clocks: + items: + - description: INCLK clock + + avdd-supply: + description: Analog Domain Power Supply (2.8v) + + dovdd-supply: + description: I/O Domain Power Supply (1.05v) + + dvdd-supply: + description: Digital Domain Power Supply (1.8v) + + reset-gpios: + maxItems: 1 + description: Reset Pin GPIO Control (active low) + + port: + description: MIPI CSI-2 transmitter port + $ref: /schemas/graph.yaml#/$defs/port-base + additionalProperties: false + + properties: + endpoint: + $ref: /schemas/media/video-interfaces.yaml# + unevaluatedProperties: false + + properties: + data-lanes: + oneOf: + - items: + - const: 1 + - const: 2 + - const: 3 + - const: 4 + - items: + - const: 1 + - const: 2 + required: + - data-lanes + - link-frequencies + +required: + - compatible + - reg + - clocks + - avdd-supply + - dovdd-supply + - dvdd-supply + - port + +unevaluatedProperties: false + +examples: + - | + #include + #include + + i2c { + #address-cells =3D <1>; + #size-cells =3D <0>; + + camera-sensor@10 { + compatible =3D "sony,imx576"; + reg =3D <0x10>; + clocks =3D <&imx576_clk>; + reset-gpios =3D <&tlmm 35 GPIO_ACTIVE_LOW>; + + avdd-supply =3D <&vreg_l3p>; + dovdd-supply =3D <&vreg_l6p>; + dvdd-supply =3D <&vreg_32m_cam_dvdd_1p05>; + + orientation =3D <0>; + rotation =3D <90>; + + port { + cam_out: endpoint { + remote-endpoint =3D <&csiphy3_ep>; + data-lanes =3D <1 2 3 4>; + link-frequencies =3D /bits/ 64 <600000000>; + }; + }; + }; + }; diff --git a/MAINTAINERS b/MAINTAINERS index ff935e197c21..1b15fa355e8b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -24856,6 +24856,13 @@ T: git git://linuxtv.org/media.git F: Documentation/devicetree/bindings/media/i2c/sony,imx415.yaml F: drivers/media/i2c/imx415.c +SONY IMX576 SENSOR DRIVER +M: Himanshu Bhavani +M: Hardevsinh Palaniya +L: linux-media@vger.kernel.org +S: Maintained +F: Documentation/devicetree/bindings/media/i2c/sony,imx576.yaml + SONY MEMORYSTICK SUBSYSTEM M: Maxim Levitsky M: Alex Dubov -- 2.34.1 From nobody Sun May 24 23:32:30 2026 Received: from PNYPR01CU001.outbound.protection.outlook.com (mail-centralindiaazon11020073.outbound.protection.outlook.com [52.101.225.73]) (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 CC0293D3481; Wed, 20 May 2026 11:57:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.225.73 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779278245; cv=fail; b=JvDa8C7LPQte6YFmHC2iuHKH50l2+OXEJ63XY+XsCyG/UME/k/Q+mn6YieUkOH4a6yGmx74RQRCZQEdTOJe3JosRkb+2TCHeBWvXUj8/vSsnwdkTYTRmDpiEb7hP8MqHZEjP0/akSmFZca3qUSI81lbO5qUJ6f4d6hWnMB1B7yQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779278245; c=relaxed/simple; bh=VpOVcDm+6utZM1YHBjIrwly+xmhSVewUDiBdwqnsC7o=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=k2G4xZWrl0thOLfp1lQkLIBgkgM1gdzQMzdCAdxQux3BTBpSLyQ+KNwYoBjQc0Fhb6vuNrRhAyZHDeLZDtyl1D669WlZHNlUdY5FoySduHLWvRKWrnb8HE/7fF1OPQ8R1UHT7ZBmAhBCSBuujLL4OWWQdKqI9+bh66FtX0qAibs= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=siliconsignals.io; spf=pass smtp.mailfrom=siliconsignals.io; dkim=pass (2048-bit key) header.d=siliconsignals.io header.i=@siliconsignals.io header.b=kwmm/rE8; arc=fail smtp.client-ip=52.101.225.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=siliconsignals.io Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=siliconsignals.io Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=siliconsignals.io header.i=@siliconsignals.io header.b="kwmm/rE8" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=JGsi+dl0S4FhKxPYMmBEPrwuVq9dazE31f6qiqWoo8icQwrIJILlq9ZQSCQZYrJuexeXrF4dvgwu+4pqLjYLHM2NRXLFSZtjYijBboa//JR3cOIvby96uEiypThh1a2y+Sn9pUlLdEhLPevy5maFuURTJuW98XczG0s5NiDtBLI49SDJCf+S73t5oeDp9/X1ohimklTs2gk5NRWN4ps60HdKP/Ew0xiwuP/rHhY0F96Xo5VZH8+Lj0lmFeICU8hWOhp6Ld5+DlhfFDxZGsIFE2I/4fp7HceAy5FVAD+8l19fTWhtZ7+DjHV89tZmvOOE1bq5V1hUQfLd0KjlY+r07A== 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=hO/4yVtILz2ykfxagKHX1wISBEZm7774npk0wAagSbs=; b=J5KcY0NNaSJ43dBm+ciwYtTt5UKn5DMtLffDLuLo2v4XUn++rE2dk5QI/gFHPFml6rFT6EOWFlu5uoWQvSRoVyeliKjd34N5v7o0CHuRV89i5JeNby84PPqbAbmxwpqmHZrKwyM7ikgwwfrYEa/ISz0tJJZVCPKfsHc2EwmcUDfM2TKs1eivICbSWzPqxVMQfdShiv15vd9hie7vSBHwQLmyaMXCAmo6IKbrnGTkSBJt6TLtc4E2aqCODld/3fX8EQ0D664JPfepLvOW3GLPi7nWlUONGKaVl2PBCawz/E96Z9K+8czLlWGBZvGYtJW95YsxDnh8OzsDElw8TXRh9w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=siliconsignals.io; dmarc=pass action=none header.from=siliconsignals.io; dkim=pass header.d=siliconsignals.io; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=siliconsignals.io; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=hO/4yVtILz2ykfxagKHX1wISBEZm7774npk0wAagSbs=; b=kwmm/rE8ZiRjTqWHfZOIislbs7QdQsBWAOHb8JGmHzZGEqQo7K4Mv84Kc2HTrPpAhJUSWDa7a0mbRbNX+lDajwX1lWYUrf8LZ9Fkh697TTZmk0cPXfc823Lp4+Fi9Nsjv3oWbBGemfBdSWRT3znYFHXRrIaXCKOVFXpiBR74baJFjb4Tvl1MFctoizVEwE8+ZxC1Vq8VeeI7E7NTJurHGow0e8ixPJ5cOBA8W8eqclVX+gEwYaFgPqJ6mnllQgTGL4SO2/gmtIuSDQtHW8KrpKC79KYzUvpZEVM/H/VLqgb5LfamPzQwZatmGvVOMSCUGs23Jf6Xr/wWefc7f5t0uw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=siliconsignals.io; Received: from PN0P287MB2019.INDP287.PROD.OUTLOOK.COM (2603:1096:c01:1b8::9) by MAUP287MB5499.INDP287.PROD.OUTLOOK.COM (2603:1096:a01:218::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.48.14; Wed, 20 May 2026 11:57:20 +0000 Received: from PN0P287MB2019.INDP287.PROD.OUTLOOK.COM ([fe80::ebd8:538d:c705:8432]) by PN0P287MB2019.INDP287.PROD.OUTLOOK.COM ([fe80::ebd8:538d:c705:8432%6]) with mapi id 15.21.0048.013; Wed, 20 May 2026 11:57:20 +0000 From: Himanshu Bhavani To: sakari.ailus@linux.intel.com Cc: Himanshu Bhavani , Hardevsinh Palaniya , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Bjorn Andersson , Konrad Dybcio , Hans Verkuil , Hans de Goede , Vladimir Zapolskiy , Mehdi Djait , Elgin Perumbilly , Xiaolei Wang , Laurent Pinchart , Walter Werner Schneider , Kate Hsuan , Svyatoslav Ryhel , linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org Subject: [PATCH 2/3] media: i2c: add imx576 image sensor driver Date: Wed, 20 May 2026 17:26:34 +0530 Message-Id: <20260520115641.11729-3-himanshu.bhavani@siliconsignals.io> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260520115641.11729-1-himanshu.bhavani@siliconsignals.io> References: <20260520115641.11729-1-himanshu.bhavani@siliconsignals.io> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PN5P287CA0046.INDP287.PROD.OUTLOOK.COM (2603:1096:c01:25f::12) To PN0P287MB2019.INDP287.PROD.OUTLOOK.COM (2603:1096:c01:1b8::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: PN0P287MB2019:EE_|MAUP287MB5499:EE_ X-MS-Office365-Filtering-Correlation-Id: 3b607b60-d313-4d8b-80eb-08deb666f21c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|52116014|7416014|1800799024|366016|38350700014|56012099003|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: PzpT0nmmmFlidDVJqsQMo20lyOx2Q9RyRrmaVTaTv+17yLLO0B+D35hweQN7W+R1iwqRLZZNDHol0h69EDB+iah5FVT1PKWzbWG6YQqqubTLYH46lvR/Dy9hJzRyRSXRekDL/lPfggpBzYrQnUdbCZ9f11Mz1F6R3bxaqULlIz6H0fUrlQ4m8Emst3cWGt49ro/JxT5U/BTVdu7GenwN+uOW/mgTpZeuRj7OqDsNRZ+n+x+r/iV0S1AZQ08f/UcYJE8B25Bm1NKhGCwVbgTyzqWMlxGfQKJ7rI1KnSpwfnenBN+73D/6YuqyC1loMoNvGGn2m+/JzvXOMm+wdzR+VG3N4QmutUSVLfKvaaPh6J5KRrGisVUuztz5vLx4yeUds5VqyWzf0xMvpGPf8fMzJvHVTHDduMzeP6y2wNCqb5murjhQiCcrJQqa0mKaYN8wjthoO6uShRBLaooXRHOFYuqnMEgtsbDdedNjHKnW6oB2v8b9b0RmQhDZQ30esyjgbLy0L1CJ8iH3GBDovHnL0xNjRzf2H/0ysA1yxsbx5F5yfrKZZwM2goukWIDGq4y3mLXxCkh2GmvoV/9/9qxiWfCReiaQLR3CTkev4rvqIjcot9ZguLte0ZMHOt0DCkZ+NflmgFyhS0oC2J529MhgeCYFJSUh14DGjb8Je6d70GeErTHNQiDvKDUBxTuCn3VPDFHdoOOKTftUGQz2B+axSCVtsWLqtYkNDgG9ugGHQzDvyxhPUIiPejrln4r5jSOb X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PN0P287MB2019.INDP287.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(52116014)(7416014)(1800799024)(366016)(38350700014)(56012099003)(18002099003)(22082099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?GEqg18JLmMZHHXjk5FCeF8M18peNp86R14IhGBZ8jPuErw29/O7doz/nh0+X?= =?us-ascii?Q?/g3q8fmzDxjLkEIlXZ/U6lm8UhFP+cLGaJj3jHRdUzm/bWMpiWuM5Tz4GKJv?= =?us-ascii?Q?qTQ6/qx9i6+jKX6lUITeKxIQrmo93lDC7Nn/SrRNKY6m8m2OrqT7oCTJnHTA?= =?us-ascii?Q?00nHF31gP38UceZu1Mf4yg02SC5tzwMbyr5cwpdS5Mc+nvtEaMCmfoYf12x/?= =?us-ascii?Q?Pim62iPJkGshRoVgFGhI7RcDmhSJBFQ8xyVNLhskht/kH/IVqnO/i5dd738l?= =?us-ascii?Q?I1RmAZA+bjUo0e85x5BwPyXhlEQ5yNr4jvZzA2iTU+Oni4idJggkABlSsEr4?= =?us-ascii?Q?R53wzjED8XeUrXPBQHe/An5m7/zA6C6dD7iaGUB7WXk0ov+9rd3Xre95QojA?= =?us-ascii?Q?Y7aI8DZOULtKpCR309/z3fWG0fd6DVO8Um0GV7/Et9wjL0Q3hu5OcVz8S2ly?= =?us-ascii?Q?Iv9g2qT4FP+urgE63ZxV7fSrsq0TGYTUWR9xVIjciYI4yuDMKTqN8DP/Dm0I?= =?us-ascii?Q?O/WPfhCrrWSA3NtGPxh6RTmPfyAPL5D/dzeaqg0gG9ryPLe7dMkcg+c5hzd5?= =?us-ascii?Q?r2WSRpcJukki9YJEHWKbyq/DQ3SBWJVQnTStozw7AP9L0C7MsMJUh31bIsG3?= =?us-ascii?Q?4Ms2OFIZ/L6XDc6Gudea3D52m92Equ0CrnS/Q6AiipHAhN2HV79FqlmtgMNI?= =?us-ascii?Q?AmL2i/vI7y7STR9z2LkfgyGaAK52F1ARjl91JKlQOUvxD0Pd09OF+gqLCk5X?= =?us-ascii?Q?qS7scOBKEIGA81GBc4amrp99yiCDTfcOM/VWyPVq1ZPKBO0WfKumwR9Ktata?= =?us-ascii?Q?Ra1NEneUNaKP8XKJPl2Ja1kgsWCb47dSM9ztT6LvfAgt9Gyuy7j3K7MxqSGE?= =?us-ascii?Q?vBCQXZIGnn4BM5PLEDUiEEb7Wq/yOUAMB4z003zgcQp9OuUhmWipsWmahQhy?= =?us-ascii?Q?fDI14pB3w7o5Kxgmt+mIFjf7309AbiOnTjGoJQFHsWtTxDSd+N1PiJxyVijf?= =?us-ascii?Q?QBZcALA9CG2L9AXjlYm5NjRYbkWQzOGCwGyupGFV5nXchV+oIqnGTQTNQDkm?= =?us-ascii?Q?j8LIrKT/t0tU6p/jeQ2TvnudVMSxwDyMcACh/462V/bHukgumbj88AzgFC9E?= =?us-ascii?Q?puCXsTeH5OZwNusCEah999G9IxVJfKy1xtdCUA3oIT2gKmukLP3ZhVUMwnwK?= =?us-ascii?Q?0NF1zLQUGMvq0BiM1wAOEetaQHM785yxH8hLTo7t3+4e9AO7BTj3AcOCMOlo?= =?us-ascii?Q?x2Jf2Q/cF7UwoITyYkn0ffbtdRP8oXO8Mjf06ieIPmmF0xTij79EhnJaeWws?= =?us-ascii?Q?3/rA00GUW3TwuWVzdBXktatd3E6eHazOYSJm8MvHohRZY7gIr9ZzBqR1wRBf?= =?us-ascii?Q?mwPWHbsrb3hBY9zDjz4xaG+LZpZPaz4eVQxmfd5iocIBWQn7oK7WT+uerp7/?= =?us-ascii?Q?FGmzETSPc6R92EPvDM6EEBI69h0yWFeFS7Waka7ersNdpQGhrLoiPefKHOYQ?= =?us-ascii?Q?BPgAIEGhV/wmAQLmOmfMzhh5F0ENvehadWFsXGUe5JYO/VmawkTwu3rEiNSW?= =?us-ascii?Q?UgER1PU8iZUgaRuDFk9HMeJlt+6e8p3q3FZmw1jlGzXZCVkY6wcbBdNU7shL?= =?us-ascii?Q?OlN/rjtRRGXJwNjcvQbuUQ1EcdKnuPQi3VoPci1n5hUh5cK4NG7FajqdkKmM?= =?us-ascii?Q?JFx5gB/e+9IGa3Od0OMBe8McQadaouiv6vBXmj4P2PJiV23ZuHx7itoVK193?= =?us-ascii?Q?PuqPKQ0PZFIo0g+FUE5pyYBziwOSoa+R8OZWjhQJDabgpo3EGbPW?= X-OriginatorOrg: siliconsignals.io X-MS-Exchange-CrossTenant-Network-Message-Id: 3b607b60-d313-4d8b-80eb-08deb666f21c X-MS-Exchange-CrossTenant-AuthSource: PN0P287MB2019.INDP287.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 May 2026 11:57:19.9353 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7ec5089e-a433-4bd1-a638-82ee62e21d37 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: i5wh4q8FeV1URhC09l4rpYy+Lmy5Pe8dmYjXaC0U4r9Z3wIyHYxIabbbHw24nnxT2vtNn7mDX0wVphtsAFPHV8XaCNEyHVcaGTUKpcGolVmP/ne7IvArhiDZp1wKi1JZ X-MS-Exchange-Transport-CrossTenantHeadersStamped: MAUP287MB5499 Content-Type: text/plain; charset="utf-8" Add a v4l2 subdevice driver for the Sony imx576 sensor. The Sony IMX576 image sensor with an active array size of 5760 x 4312 The following features are supported: - Manual exposure an gain control support - vblank/hblank control support - Supported resolution: 2880 x 2156 30fps (SRGGB10) Signed-off-by: Himanshu Bhavani --- MAINTAINERS | 1 + drivers/media/i2c/Kconfig | 10 + drivers/media/i2c/Makefile | 1 + drivers/media/i2c/imx576.c | 1029 ++++++++++++++++++++++++++++++++++++ 4 files changed, 1041 insertions(+) create mode 100644 drivers/media/i2c/imx576.c diff --git a/MAINTAINERS b/MAINTAINERS index 1b15fa355e8b..768a1eb3627a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -24862,6 +24862,7 @@ M: Hardevsinh Palaniya L: linux-media@vger.kernel.org S: Maintained F: Documentation/devicetree/bindings/media/i2c/sony,imx576.yaml +F: drivers/media/i2c/imx576.c SONY MEMORYSTICK SUBSYSTEM M: Maxim Levitsky diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig index fc2954098eaf..05d1e69c2f33 100644 --- a/drivers/media/i2c/Kconfig +++ b/drivers/media/i2c/Kconfig @@ -288,6 +288,16 @@ config VIDEO_IMX415 To compile this driver as a module, choose M here: the module will be called imx415. +config VIDEO_IMX576 + tristate "Sony IMX576 sensor support" + select V4L2_CCI_I2C + help + This is a Video4Linux2 sensor driver for the Sony + IMX576 camera. + + To compile this driver as a module, choose M here: the + module will be called imx576. + config VIDEO_MAX9271_LIB tristate diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile index 90b276a7417a..e96c083e03d9 100644 --- a/drivers/media/i2c/Makefile +++ b/drivers/media/i2c/Makefile @@ -61,6 +61,7 @@ obj-$(CONFIG_VIDEO_IMX335) +=3D imx335.o obj-$(CONFIG_VIDEO_IMX355) +=3D imx355.o obj-$(CONFIG_VIDEO_IMX412) +=3D imx412.o obj-$(CONFIG_VIDEO_IMX415) +=3D imx415.o +obj-$(CONFIG_VIDEO_IMX576) +=3D imx576.o obj-$(CONFIG_VIDEO_IR_I2C) +=3D ir-kbd-i2c.o obj-$(CONFIG_VIDEO_ISL7998X) +=3D isl7998x.o obj-$(CONFIG_VIDEO_KS0127) +=3D ks0127.o diff --git a/drivers/media/i2c/imx576.c b/drivers/media/i2c/imx576.c new file mode 100644 index 000000000000..910cbcfb6031 --- /dev/null +++ b/drivers/media/i2c/imx576.c @@ -0,0 +1,1029 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * V4L2 Support for the IMX576 + * + * Copyright (C) 2026 Silicon Signals Pvt. Ltd. + * + * Copyright (C) 2024 Luca Weiss + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#define IMX576_INCLK_RATE (24 * HZ_PER_MHZ) + +#define IMX576_REG_CHIP_ID CCI_REG16(0x0016) +#define IMX576_CHIP_ID 0x0576 + +#define IMX576_REG_MODE_SELECT CCI_REG8(0x0100) +#define IMX576_MODE_STANDBY 0x00 +#define IMX576_MODE_STREAMING 0x01 + +#define IMX576_REG_HOLD CCI_REG8(0x0104) + +#define IMX576_REG_EXPOSURE CCI_REG16(0x0202) +#define IMX576_EXPOSURE_MIN 8 +#define IMX576_EXPOSURE_OFFSET 22 +#define IMX576_EXPOSURE_STEP 1 +#define IMX576_EXPOSURE_DEFAULT 0x0648 + +#define IMX576_REG_ANALOG_GAIN CCI_REG16(0x0204) +#define IMX576_ANA_GAIN_MIN 0 +#define IMX576_ANA_GAIN_MAX 978 +#define IMX576_ANA_GAIN_STEP 1 +#define IMX576_ANA_GAIN_DEFAULT 0 + +#define IMX576_REG_VTS CCI_REG16(0x0340) +#define IMX576_REG_HTS CCI_REG16(0x0342) + +/* FIXME: Exact VBLANK limit unknown (no datasheet). */ +#define IMX576_VBLANK_MAX 32420 + +#define IMX576_LINK_FREQ_600MHZ (600 * HZ_PER_MHZ) +#define IMX576_NUM_DATA_LANES 4 + +/* IMX576 native and active pixel array size */ +static const struct v4l2_rect imx576_native_area =3D { + .top =3D 0, + .left =3D 0, + .width =3D 5792, + .height =3D 4464, +}; + +static const struct v4l2_rect imx576_active_area =3D { + .top =3D 136, + .left =3D 16, + .width =3D 5760, + .height =3D 4312, +}; + +static const char * const imx576_supply_names[] =3D { + "avdd", /* Analog power */ + "dovdd", /* Digital I/O power */ + "dvdd", /* Digital core power */ +}; + +static const struct cci_reg_sequence imx576_common_regs[] =3D { + { CCI_REG8(0x0136), 0x18 }, + { CCI_REG8(0x0137), 0x00 }, + { CCI_REG8(0x3c7e), 0x05 }, + { CCI_REG8(0x3c7f), 0x07 }, + { CCI_REG8(0x380d), 0x80 }, + { CCI_REG8(0x3c00), 0x1a }, + { CCI_REG8(0x3c01), 0x1a }, + { CCI_REG8(0x3c02), 0x1a }, + { CCI_REG8(0x3c03), 0x1a }, + { CCI_REG8(0x3c04), 0x1a }, + { CCI_REG8(0x3c05), 0x01 }, + { CCI_REG8(0x3c08), 0xff }, + { CCI_REG8(0x3c09), 0xff }, + { CCI_REG8(0x3c0a), 0x01 }, + { CCI_REG8(0x3c0d), 0xff }, + { CCI_REG8(0x3c0e), 0xff }, + { CCI_REG8(0x3c0f), 0x20 }, + { CCI_REG8(0x3f89), 0x01 }, + { CCI_REG8(0x4b8e), 0x18 }, + { CCI_REG8(0x4b8f), 0x10 }, + { CCI_REG8(0x4ba8), 0x08 }, + { CCI_REG8(0x4baa), 0x08 }, + { CCI_REG8(0x4bab), 0x08 }, + { CCI_REG8(0x4bc9), 0x10 }, + { CCI_REG8(0x5511), 0x01 }, + { CCI_REG8(0x560b), 0x5b }, + { CCI_REG8(0x56a7), 0x60 }, + { CCI_REG8(0x5b3b), 0x60 }, + { CCI_REG8(0x5ba7), 0x60 }, + { CCI_REG8(0x6002), 0x00 }, + { CCI_REG8(0x6014), 0x01 }, + { CCI_REG8(0x6118), 0x0a }, + { CCI_REG8(0x6122), 0x0a }, + { CCI_REG8(0x6128), 0x0a }, + { CCI_REG8(0x6132), 0x0a }, + { CCI_REG8(0x6138), 0x0a }, + { CCI_REG8(0x6142), 0x0a }, + { CCI_REG8(0x6148), 0x0a }, + { CCI_REG8(0x6152), 0x0a }, + { CCI_REG8(0x617b), 0x04 }, + { CCI_REG8(0x617e), 0x04 }, + { CCI_REG8(0x6187), 0x04 }, + { CCI_REG8(0x618a), 0x04 }, + { CCI_REG8(0x6193), 0x04 }, + { CCI_REG8(0x6196), 0x04 }, + { CCI_REG8(0x619f), 0x04 }, + { CCI_REG8(0x61a2), 0x04 }, + { CCI_REG8(0x61ab), 0x04 }, + { CCI_REG8(0x61ae), 0x04 }, + { CCI_REG8(0x61b7), 0x04 }, + { CCI_REG8(0x61ba), 0x04 }, + { CCI_REG8(0x61c3), 0x04 }, + { CCI_REG8(0x61c6), 0x04 }, + { CCI_REG8(0x61cf), 0x04 }, + { CCI_REG8(0x61d2), 0x04 }, + { CCI_REG8(0x61db), 0x04 }, + { CCI_REG8(0x61de), 0x04 }, + { CCI_REG8(0x61e7), 0x04 }, + { CCI_REG8(0x61ea), 0x04 }, + { CCI_REG8(0x61f3), 0x04 }, + { CCI_REG8(0x61f6), 0x04 }, + { CCI_REG8(0x61ff), 0x04 }, + { CCI_REG8(0x6202), 0x04 }, + { CCI_REG8(0x620b), 0x04 }, + { CCI_REG8(0x620e), 0x04 }, + { CCI_REG8(0x6217), 0x04 }, + { CCI_REG8(0x621a), 0x04 }, + { CCI_REG8(0x6223), 0x04 }, + { CCI_REG8(0x6226), 0x04 }, + { CCI_REG8(0x6b0b), 0x02 }, + { CCI_REG8(0x6b0c), 0x01 }, + { CCI_REG8(0x6b0d), 0x05 }, + { CCI_REG8(0x6b0f), 0x04 }, + { CCI_REG8(0x6b10), 0x02 }, + { CCI_REG8(0x6b11), 0x06 }, + { CCI_REG8(0x6b12), 0x03 }, + { CCI_REG8(0x6b13), 0x07 }, + { CCI_REG8(0x6b14), 0x0d }, + { CCI_REG8(0x6b15), 0x09 }, + { CCI_REG8(0x6b16), 0x0c }, + { CCI_REG8(0x6b17), 0x08 }, + { CCI_REG8(0x6b18), 0x0e }, + { CCI_REG8(0x6b19), 0x0a }, + { CCI_REG8(0x6b1a), 0x0f }, + { CCI_REG8(0x6b1b), 0x0b }, + { CCI_REG8(0x6b1c), 0x01 }, + { CCI_REG8(0x6b1d), 0x05 }, + { CCI_REG8(0x6b1f), 0x04 }, + { CCI_REG8(0x6b20), 0x02 }, + { CCI_REG8(0x6b21), 0x06 }, + { CCI_REG8(0x6b22), 0x03 }, + { CCI_REG8(0x6b23), 0x07 }, + { CCI_REG8(0x6b24), 0x0d }, + { CCI_REG8(0x6b25), 0x09 }, + { CCI_REG8(0x6b26), 0x0c }, + { CCI_REG8(0x6b27), 0x08 }, + { CCI_REG8(0x6b28), 0x0e }, + { CCI_REG8(0x6b29), 0x0a }, + { CCI_REG8(0x6b2a), 0x0f }, + { CCI_REG8(0x6b2b), 0x0b }, + { CCI_REG8(0x7948), 0x01 }, + { CCI_REG8(0x7949), 0x06 }, + { CCI_REG8(0x794b), 0x04 }, + { CCI_REG8(0x794c), 0x04 }, + { CCI_REG8(0x794d), 0x3a }, + { CCI_REG8(0x7951), 0x00 }, + { CCI_REG8(0x7952), 0x01 }, + { CCI_REG8(0x7955), 0x00 }, + { CCI_REG8(0x9004), 0x10 }, + { CCI_REG8(0x9200), 0xa0 }, + { CCI_REG8(0x9201), 0xa7 }, + { CCI_REG8(0x9202), 0xa0 }, + { CCI_REG8(0x9203), 0xaa }, + { CCI_REG8(0x9204), 0xa0 }, + { CCI_REG8(0x9205), 0xad }, + { CCI_REG8(0x9206), 0xa0 }, + { CCI_REG8(0x9207), 0xb0 }, + { CCI_REG8(0x9208), 0xa0 }, + { CCI_REG8(0x9209), 0xb3 }, + { CCI_REG8(0x920a), 0xb7 }, + { CCI_REG8(0x920b), 0x34 }, + { CCI_REG8(0x920c), 0xb7 }, + { CCI_REG8(0x920d), 0x36 }, + { CCI_REG8(0x920e), 0xb7 }, + { CCI_REG8(0x920f), 0x37 }, + { CCI_REG8(0x9210), 0xb7 }, + { CCI_REG8(0x9211), 0x38 }, + { CCI_REG8(0x9212), 0xb7 }, + { CCI_REG8(0x9213), 0x39 }, + { CCI_REG8(0x9214), 0xb7 }, + { CCI_REG8(0x9215), 0x3a }, + { CCI_REG8(0x9216), 0xb7 }, + { CCI_REG8(0x9217), 0x3c }, + { CCI_REG8(0x9218), 0xb7 }, + { CCI_REG8(0x9219), 0x3d }, + { CCI_REG8(0x921a), 0xb7 }, + { CCI_REG8(0x921b), 0x3e }, + { CCI_REG8(0x921c), 0xb7 }, + { CCI_REG8(0x921d), 0x3f }, + { CCI_REG8(0x921e), 0x7f }, + { CCI_REG8(0x921f), 0x77 }, + { CCI_REG8(0x99af), 0x0f }, + { CCI_REG8(0x99b0), 0x0f }, + { CCI_REG8(0x99b1), 0x0f }, + { CCI_REG8(0x99b2), 0x0f }, + { CCI_REG8(0x99b3), 0x0f }, + { CCI_REG8(0x99e1), 0x0f }, + { CCI_REG8(0x99e2), 0x0f }, + { CCI_REG8(0x99e3), 0x0f }, + { CCI_REG8(0x99e4), 0x0f }, + { CCI_REG8(0x99e5), 0x0f }, + { CCI_REG8(0x99e6), 0x0f }, + { CCI_REG8(0x99e7), 0x0f }, + { CCI_REG8(0x99e8), 0x0f }, + { CCI_REG8(0x99e9), 0x0f }, + { CCI_REG8(0x99ea), 0x0f }, + { CCI_REG8(0xe286), 0x31 }, + { CCI_REG8(0xe2a6), 0x32 }, + { CCI_REG8(0xe2c6), 0x33 }, + { CCI_REG8(0x4038), 0x00 }, + { CCI_REG8(0x9856), 0xa0 }, + { CCI_REG8(0x9857), 0x78 }, + { CCI_REG8(0x9858), 0x64 }, + { CCI_REG8(0x986e), 0x64 }, + { CCI_REG8(0x9870), 0x3c }, + { CCI_REG8(0x993a), 0x0e }, + { CCI_REG8(0x993b), 0x0e }, + { CCI_REG8(0x9953), 0x08 }, + { CCI_REG8(0x9954), 0x08 }, + { CCI_REG8(0x996b), 0x0f }, + { CCI_REG8(0x996d), 0x0f }, + { CCI_REG8(0x996f), 0x0f }, + { CCI_REG8(0x998e), 0x0f }, + { CCI_REG8(0xa101), 0x01 }, + { CCI_REG8(0xa103), 0x01 }, + { CCI_REG8(0xa105), 0x01 }, + { CCI_REG8(0xa107), 0x01 }, + { CCI_REG8(0xa109), 0x01 }, + { CCI_REG8(0xa10b), 0x01 }, + { CCI_REG8(0xa10d), 0x01 }, + { CCI_REG8(0xa10f), 0x01 }, + { CCI_REG8(0xa111), 0x01 }, + { CCI_REG8(0xa113), 0x01 }, + { CCI_REG8(0xa115), 0x01 }, + { CCI_REG8(0xa117), 0x01 }, + { CCI_REG8(0xa119), 0x01 }, + { CCI_REG8(0xa11b), 0x01 }, + { CCI_REG8(0xa11d), 0x01 }, + { CCI_REG8(0xaa58), 0x00 }, + { CCI_REG8(0xaa59), 0x01 }, + { CCI_REG8(0xab03), 0x10 }, + { CCI_REG8(0xab04), 0x10 }, + { CCI_REG8(0xab05), 0x10 }, + { CCI_REG8(0xad6a), 0x03 }, + { CCI_REG8(0xad6b), 0xff }, + { CCI_REG8(0xad77), 0x00 }, + { CCI_REG8(0xad82), 0x03 }, + { CCI_REG8(0xad83), 0xff }, + { CCI_REG8(0xae06), 0x04 }, + { CCI_REG8(0xae07), 0x16 }, + { CCI_REG8(0xae08), 0xff }, + { CCI_REG8(0xae09), 0x04 }, + { CCI_REG8(0xae0a), 0x16 }, + { CCI_REG8(0xae0b), 0xff }, + { CCI_REG8(0xaf01), 0x04 }, + { CCI_REG8(0xaf03), 0x0a }, + { CCI_REG8(0xaf05), 0x18 }, + { CCI_REG8(0xb048), 0x0a }, +}; + +static const struct cci_reg_sequence mode_2880x2156_regs[] =3D { + { CCI_REG8(0x0112), 0x0a }, + { CCI_REG8(0x0113), 0x0a }, + { CCI_REG8(0x0114), 0x03 }, + { CCI_REG8(0x0342), 0x0c }, + { CCI_REG8(0x0343), 0x5d }, + { CCI_REG8(0x0344), 0x00 }, + { CCI_REG8(0x0345), 0x00 }, + { CCI_REG8(0x0346), 0x00 }, + { CCI_REG8(0x0347), 0x00 }, + { CCI_REG8(0x0348), 0x16 }, + { CCI_REG8(0x0349), 0x7f }, + { CCI_REG8(0x034a), 0x10 }, + { CCI_REG8(0x034b), 0xd7 }, + { CCI_REG8(0x0220), 0x62 }, + { CCI_REG8(0x0900), 0x01 }, + { CCI_REG8(0x0901), 0x22 }, + { CCI_REG8(0x0902), 0x08 }, + { CCI_REG8(0x3140), 0x00 }, + { CCI_REG8(0x3246), 0x81 }, + { CCI_REG8(0x3247), 0x81 }, + { CCI_REG8(0x0401), 0x00 }, + { CCI_REG8(0x0404), 0x00 }, + { CCI_REG8(0x0405), 0x10 }, + { CCI_REG8(0x0408), 0x00 }, + { CCI_REG8(0x0409), 0x00 }, + { CCI_REG8(0x040a), 0x00 }, + { CCI_REG8(0x040b), 0x00 }, + { CCI_REG8(0x040c), 0x0b }, + { CCI_REG8(0x040d), 0x40 }, + { CCI_REG8(0x040e), 0x08 }, + { CCI_REG8(0x040f), 0x6c }, + { CCI_REG8(0x034c), 0x0b }, + { CCI_REG8(0x034d), 0x40 }, + { CCI_REG8(0x034e), 0x08 }, + { CCI_REG8(0x034f), 0x6c }, + { CCI_REG8(0x0301), 0x05 }, + { CCI_REG8(0x0303), 0x04 }, + { CCI_REG8(0x0305), 0x04 }, + { CCI_REG8(0x0306), 0x00 }, + { CCI_REG8(0x0307), 0xaf }, + { CCI_REG8(0x030b), 0x02 }, + { CCI_REG8(0x030d), 0x04 }, + { CCI_REG8(0x030e), 0x00 }, + { CCI_REG8(0x030f), 0xd1 }, + { CCI_REG8(0x0310), 0x01 }, + { CCI_REG8(0x0b06), 0x01 }, + { CCI_REG8(0x3620), 0x00 }, + { CCI_REG8(0x3f0c), 0x00 }, + { CCI_REG8(0x3f14), 0x01 }, + { CCI_REG8(0x3f80), 0x03 }, + { CCI_REG8(0x3f81), 0xe8 }, + { CCI_REG8(0x3ffc), 0x00 }, + { CCI_REG8(0x3ffd), 0x26 }, + { CCI_REG8(0x0202), 0x07 }, + { CCI_REG8(0x0203), 0xd0 }, + { CCI_REG8(0x0224), 0x01 }, + { CCI_REG8(0x0225), 0xf4 }, + { CCI_REG8(0x3fe0), 0x03 }, + { CCI_REG8(0x3fe1), 0xe8 }, + { CCI_REG8(0x0204), 0x00 }, + { CCI_REG8(0x0205), 0x00 }, + { CCI_REG8(0x0216), 0x00 }, + { CCI_REG8(0x0217), 0x00 }, + { CCI_REG8(0x0218), 0x01 }, + { CCI_REG8(0x0219), 0x00 }, + { CCI_REG8(0x020e), 0x01 }, + { CCI_REG8(0x020f), 0x00 }, + { CCI_REG8(0x3fe2), 0x00 }, + { CCI_REG8(0x3fe3), 0x00 }, + { CCI_REG8(0x3fe4), 0x01 }, + { CCI_REG8(0x3fe5), 0x00 }, +}; + +struct imx576 { + struct device *dev; + struct regmap *regmap; + struct v4l2_subdev sd; + struct media_pad pad; + struct gpio_desc *reset_gpio; + struct clk *inclk; + struct regulator_bulk_data supplies[ARRAY_SIZE(imx576_supply_names)]; + + /* V4L2 Controls */ + struct v4l2_ctrl_handler handler; + struct v4l2_ctrl *link_freq; + struct v4l2_ctrl *hblank; + struct v4l2_ctrl *vblank; + struct v4l2_ctrl *exposure; + struct v4l2_ctrl *gain; + + u32 link_freq_index; +}; + +struct imx576_reg_list { + u32 num_of_regs; + const struct cci_reg_sequence *regs; +}; + +struct imx576_mode { + u32 width; + u32 height; + u32 hts; + u32 vts; + struct imx576_reg_list reg_list; +}; + +static const struct imx576_mode supported_modes_10bit[] =3D { + { + .width =3D 2880, + .height =3D 2156, + .hts =3D 3165, + .vts =3D 2172, + .reg_list =3D { + .num_of_regs =3D ARRAY_SIZE(mode_2880x2156_regs), + .regs =3D mode_2880x2156_regs, + }, + }, +}; + +static const s64 link_freq[] =3D { + IMX576_LINK_FREQ_600MHZ, +}; + +static const u32 imx576_mbus_codes[] =3D { + MEDIA_BUS_FMT_SRGGB10_1X10, +}; + +static inline struct imx576 *to_imx576(struct v4l2_subdev *sd) +{ + return container_of_const(sd, struct imx576, sd); +} + +static int imx576_set_ctrl(struct v4l2_ctrl *ctrl) +{ + struct imx576 *imx576 =3D container_of_const(ctrl->handler, + struct imx576, handler); + struct v4l2_subdev_state *state; + struct v4l2_mbus_framefmt *fmt; + int ret =3D 0; + + state =3D v4l2_subdev_get_locked_active_state(&imx576->sd); + fmt =3D v4l2_subdev_state_get_format(state, 0); + + if (ctrl->id =3D=3D V4L2_CID_VBLANK) { + /* Honour the VBLANK limits when setting exposure */ + ret =3D __v4l2_ctrl_modify_range(imx576->exposure, + IMX576_EXPOSURE_MIN, + fmt->height + ctrl->val - + IMX576_EXPOSURE_OFFSET, + 1, IMX576_EXPOSURE_DEFAULT); + if (ret) + return ret; + } + + if (pm_runtime_get_if_active(imx576->dev) =3D=3D 0) + return 0; + + cci_write(imx576->regmap, IMX576_REG_HOLD, 1, &ret); + + switch (ctrl->id) { + case V4L2_CID_VBLANK: { + u64 vmax =3D fmt->height + ctrl->val; + + ret =3D cci_write(imx576->regmap, IMX576_REG_VTS, vmax, &ret); + break; + } + case V4L2_CID_EXPOSURE: + ret =3D cci_write(imx576->regmap, IMX576_REG_EXPOSURE, ctrl->val, &ret); + break; + case V4L2_CID_ANALOGUE_GAIN: + ret =3D cci_write(imx576->regmap, IMX576_REG_ANALOG_GAIN, + ctrl->val, &ret); + break; + default: + dev_err(imx576->dev, "Invalid control %d\n", ctrl->id); + ret =3D -EINVAL; + break; + } + + cci_write(imx576->regmap, IMX576_REG_HOLD, 0, &ret); + + pm_runtime_put(imx576->dev); + + return ret; +} + +static int imx576_enum_mbus_code(struct v4l2_subdev *sd, + struct v4l2_subdev_state *sd_state, + struct v4l2_subdev_mbus_code_enum *code) +{ + if (code->index >=3D ARRAY_SIZE(imx576_mbus_codes)) + return -EINVAL; + + code->code =3D imx576_mbus_codes[code->index]; + + return 0; +} + +static int imx576_set_pad_format(struct v4l2_subdev *sd, + struct v4l2_subdev_state *sd_state, + struct v4l2_subdev_format *fmt) +{ + const struct imx576_mode *mode =3D &supported_modes_10bit[0]; + struct imx576 *imx576 =3D to_imx576(sd); + struct v4l2_mbus_framefmt *format; + int ret; + + fmt->format.width =3D mode->width; + fmt->format.height =3D mode->height; + fmt->format.code =3D imx576_mbus_codes[0]; + fmt->format.field =3D V4L2_FIELD_NONE; + fmt->format.colorspace =3D V4L2_COLORSPACE_RAW; + fmt->format.ycbcr_enc =3D V4L2_YCBCR_ENC_DEFAULT; + fmt->format.quantization =3D V4L2_QUANTIZATION_DEFAULT; + fmt->format.xfer_func =3D V4L2_XFER_FUNC_NONE; + + format =3D v4l2_subdev_state_get_format(sd_state, 0); + + *format =3D fmt->format; + + if (fmt->which =3D=3D V4L2_SUBDEV_FORMAT_ACTIVE) { + u32 vblank_def =3D mode->vts - mode->height; + + ret =3D __v4l2_ctrl_modify_range(imx576->vblank, vblank_def, + IMX576_VBLANK_MAX, 1, vblank_def); + if (ret) + return ret; + } + + return 0; +} + +static int imx576_get_selection(struct v4l2_subdev *sd, + struct v4l2_subdev_state *sd_state, + struct v4l2_subdev_selection *sel) +{ + switch (sel->target) { + case V4L2_SEL_TGT_NATIVE_SIZE: + case V4L2_SEL_TGT_CROP_BOUNDS: + sel->r =3D imx576_native_area; + return 0; + case V4L2_SEL_TGT_CROP: + case V4L2_SEL_TGT_CROP_DEFAULT: + sel->r =3D imx576_active_area; + return 0; + default: + return -EINVAL; + } +} + +static int imx576_enum_frame_size(struct v4l2_subdev *sd, + struct v4l2_subdev_state *sd_state, + struct v4l2_subdev_frame_size_enum *fsize) +{ + if (fsize->index >=3D ARRAY_SIZE(supported_modes_10bit)) + return -EINVAL; + + if (fsize->code !=3D imx576_mbus_codes[0]) + return -EINVAL; + + fsize->min_width =3D supported_modes_10bit[fsize->index].width; + fsize->max_width =3D fsize->min_width; + fsize->min_height =3D supported_modes_10bit[fsize->index].height; + fsize->max_height =3D fsize->min_height; + + return 0; +} + +static int imx576_enable_streams(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + u32 pad, u64 streams_mask) +{ + const struct imx576_reg_list *reg_list; + struct imx576 *imx576 =3D to_imx576(sd); + const struct v4l2_mbus_framefmt *fmt; + const struct imx576_mode *mode; + int ret; + + fmt =3D v4l2_subdev_state_get_format(state, 0); + mode =3D v4l2_find_nearest_size(supported_modes_10bit, + ARRAY_SIZE(supported_modes_10bit), width, + height, fmt->width, fmt->height); + + ret =3D pm_runtime_resume_and_get(imx576->dev); + if (ret < 0) + return ret; + + /* Write common registers */ + ret =3D cci_multi_reg_write(imx576->regmap, imx576_common_regs, + ARRAY_SIZE(imx576_common_regs), NULL); + if (ret) { + dev_err(imx576->dev, "failed to write common registers\n"); + goto err_rpm_put; + } + + /* Write sensor mode registers */ + reg_list =3D &mode->reg_list; + ret =3D cci_multi_reg_write(imx576->regmap, reg_list->regs, + reg_list->num_of_regs, NULL); + if (ret) { + dev_err(imx576->dev, "fail to write initial registers\n"); + goto err_rpm_put; + } + + /* Apply customized user controls */ + ret =3D __v4l2_ctrl_handler_setup(imx576->sd.ctrl_handler); + if (ret) { + dev_err(imx576->dev, "fail to setup handler\n"); + goto err_rpm_put; + } + + /* T7: delay before sending stream command */ + usleep_range(8000, 9000); + + /* Start streaming */ + cci_write(imx576->regmap, IMX576_REG_MODE_SELECT, IMX576_MODE_STREAMING, = &ret); + if (ret) { + dev_err(imx576->dev, "fail to start streaming\n"); + goto err_rpm_put; + } + + return 0; + +err_rpm_put: + pm_runtime_put(imx576->dev); + + return ret; +} + +static int imx576_disable_streams(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, + u32 pad, u64 streams_mask) +{ + struct imx576 *imx576 =3D to_imx576(sd); + int ret; + + ret =3D cci_write(imx576->regmap, IMX576_REG_MODE_SELECT, + IMX576_MODE_STANDBY, NULL); + if (ret) + dev_err(imx576->dev, "failed to set stream off\n"); + + pm_runtime_put(imx576->dev); + + return 0; +} + +static int imx576_init_state(struct v4l2_subdev *sd, + struct v4l2_subdev_state *sd_state) +{ + struct v4l2_subdev_format fmt =3D { + .which =3D V4L2_SUBDEV_FORMAT_TRY, + .pad =3D 0, + .format =3D { + .code =3D imx576_mbus_codes[0], + .width =3D supported_modes_10bit[0].width, + .height =3D supported_modes_10bit[0].height, + }, + }; + + imx576_set_pad_format(sd, sd_state, &fmt); + + return 0; +} + +static const struct v4l2_subdev_video_ops imx576_video_ops =3D { + .s_stream =3D v4l2_subdev_s_stream_helper, +}; + +static const struct v4l2_subdev_pad_ops imx576_pad_ops =3D { + .enum_mbus_code =3D imx576_enum_mbus_code, + .enum_frame_size =3D imx576_enum_frame_size, + .get_fmt =3D v4l2_subdev_get_fmt, + .set_fmt =3D imx576_set_pad_format, + .get_selection =3D imx576_get_selection, + .enable_streams =3D imx576_enable_streams, + .disable_streams =3D imx576_disable_streams, +}; + +static const struct v4l2_subdev_internal_ops imx576_internal_ops =3D { + .init_state =3D imx576_init_state, +}; + +static const struct v4l2_subdev_ops imx576_subdev_ops =3D { + .video =3D &imx576_video_ops, + .pad =3D &imx576_pad_ops, +}; + +static const struct v4l2_ctrl_ops imx576_ctrl_ops =3D { + .s_ctrl =3D imx576_set_ctrl, +}; + +static int imx576_detect(struct imx576 *imx576) +{ + int ret; + u64 val; + + ret =3D cci_read(imx576->regmap, IMX576_REG_CHIP_ID, &val, NULL); + if (ret) + return dev_err_probe(imx576->dev, ret, + "failed to read chip id %x\n", + IMX576_CHIP_ID); + + if (val !=3D IMX576_CHIP_ID) + return dev_err_probe(imx576->dev, -EIO, + "chip id mismatch: %x!=3D%llx\n", + IMX576_CHIP_ID, val); + + return 0; +} + +static int imx576_power_on(struct device *dev) +{ + struct v4l2_subdev *sd =3D dev_get_drvdata(dev); + struct imx576 *imx576 =3D to_imx576(sd); + int ret; + + ret =3D regulator_bulk_enable(ARRAY_SIZE(imx576_supply_names), + imx576->supplies); + if (ret < 0) { + dev_err(dev, "failed to enable regulators\n"); + return ret; + } + + ret =3D clk_prepare_enable(imx576->inclk); + if (ret) { + dev_err(imx576->dev, "fail to enable inclk\n"); + goto err_regulator_off; + } + + gpiod_set_value_cansleep(imx576->reset_gpio, 0); + + /* T6: Wait for internal init before CCI access */ + usleep_range(1000, 1200); + + return 0; + +err_regulator_off: + regulator_bulk_disable(ARRAY_SIZE(imx576_supply_names), + imx576->supplies); + + return ret; +} + +static int imx576_power_off(struct device *dev) +{ + struct v4l2_subdev *sd =3D dev_get_drvdata(dev); + struct imx576 *imx576 =3D to_imx576(sd); + + clk_disable_unprepare(imx576->inclk); + + gpiod_set_value_cansleep(imx576->reset_gpio, 1); + + regulator_bulk_disable(ARRAY_SIZE(imx576_supply_names), + imx576->supplies); + + return 0; +} + +static int imx576_parse_endpoint(struct imx576 *imx576) +{ + struct v4l2_fwnode_endpoint bus_cfg =3D { + .bus_type =3D V4L2_MBUS_CSI2_DPHY, + }; + unsigned long link_freq_bitmap; + struct fwnode_handle *ep; + int ret; + + ep =3D fwnode_graph_get_endpoint_by_id(dev_fwnode(imx576->dev), 0, 0, 0); + if (!ep) + return dev_err_probe(imx576->dev, -ENXIO, + "Failed to get next endpoint\n"); + + ret =3D v4l2_fwnode_endpoint_alloc_parse(ep, &bus_cfg); + fwnode_handle_put(ep); + if (ret) + return ret; + + if (bus_cfg.bus.mipi_csi2.num_data_lanes !=3D IMX576_NUM_DATA_LANES) { + ret =3D dev_err_probe(imx576->dev, -EINVAL, + "only 4 data lanes are supported\n"); + goto error_out; + } + + ret =3D v4l2_link_freq_to_bitmap(imx576->dev, bus_cfg.link_frequencies, + bus_cfg.nr_of_link_frequencies, + link_freq, ARRAY_SIZE(link_freq), + &link_freq_bitmap); + if (ret) { + ret =3D dev_err_probe(imx576->dev, -EINVAL, + "only 600MHz frequency is available\n"); + goto error_out; + } + +error_out: + v4l2_fwnode_endpoint_free(&bus_cfg); + + return ret; +} + +static int imx576_init_controls(struct imx576 *imx576) +{ + const struct imx576_mode *mode =3D &supported_modes_10bit[0]; + struct v4l2_fwnode_device_properties props; + u64 vblank_def, hblank_def, pixel_rate; + struct v4l2_ctrl_handler *ctrl_hdlr; + u32 lpfr; + int ret; + + ctrl_hdlr =3D &imx576->handler; + v4l2_ctrl_handler_init(ctrl_hdlr, 8); + + /* Initialize exposure and gain */ + vblank_def =3D mode->vts - mode->height; + lpfr =3D vblank_def + mode->height; + imx576->exposure =3D v4l2_ctrl_new_std(ctrl_hdlr, + &imx576_ctrl_ops, + V4L2_CID_EXPOSURE, + IMX576_EXPOSURE_MIN, + lpfr - IMX576_EXPOSURE_OFFSET, + IMX576_EXPOSURE_STEP, + IMX576_EXPOSURE_DEFAULT); + + imx576->gain =3D v4l2_ctrl_new_std(ctrl_hdlr, &imx576_ctrl_ops, + V4L2_CID_ANALOGUE_GAIN, + IMX576_ANA_GAIN_MIN, + IMX576_ANA_GAIN_MAX, + IMX576_ANA_GAIN_STEP, + IMX576_ANA_GAIN_DEFAULT); + + imx576->vblank =3D v4l2_ctrl_new_std(ctrl_hdlr, &imx576_ctrl_ops, + V4L2_CID_VBLANK, vblank_def, + IMX576_VBLANK_MAX, 1, + vblank_def); + + /* pixel_rate =3D link_frequency * 2 * nr_of_lanes / bits_per_sample */ + pixel_rate =3D div_u64(IMX576_LINK_FREQ_600MHZ * 2 * IMX576_NUM_DATA_LANE= S, 10); + v4l2_ctrl_new_std(ctrl_hdlr, &imx576_ctrl_ops, V4L2_CID_PIXEL_RATE, + pixel_rate, pixel_rate, 1, pixel_rate); + + imx576->link_freq =3D v4l2_ctrl_new_int_menu(ctrl_hdlr, &imx576_ctrl_ops, + V4L2_CID_LINK_FREQ, + ARRAY_SIZE(link_freq) - 1, + imx576->link_freq_index, + link_freq); + if (imx576->link_freq) + imx576->link_freq->flags |=3D V4L2_CTRL_FLAG_READ_ONLY; + + hblank_def =3D mode->hts - mode->width; + imx576->hblank =3D v4l2_ctrl_new_std(ctrl_hdlr, + &imx576_ctrl_ops, + V4L2_CID_HBLANK, + hblank_def, + hblank_def, + 1, hblank_def); + if (imx576->hblank) + imx576->hblank->flags |=3D V4L2_CTRL_FLAG_READ_ONLY; + + ret =3D v4l2_fwnode_device_parse(imx576->dev, &props); + if (ret) + goto err_handler_free; + + ret =3D v4l2_ctrl_new_fwnode_properties(ctrl_hdlr, &imx576_ctrl_ops, &pro= ps); + if (ret) + goto err_handler_free; + + imx576->sd.ctrl_handler =3D ctrl_hdlr; + + return 0; + +err_handler_free: + v4l2_ctrl_handler_free(ctrl_hdlr); + + return ret; +} + +static int imx576_probe(struct i2c_client *client) +{ + struct imx576 *imx576; + unsigned int inclk_freq; + int ret; + + imx576 =3D devm_kzalloc(&client->dev, sizeof(*imx576), GFP_KERNEL); + if (!imx576) + return -ENOMEM; + + imx576->dev =3D &client->dev; + + /* Initialize subdev */ + v4l2_i2c_subdev_init(&imx576->sd, client, &imx576_subdev_ops); + imx576->sd.internal_ops =3D &imx576_internal_ops; + + imx576->regmap =3D devm_cci_regmap_init_i2c(client, 16); + if (IS_ERR(imx576->regmap)) + return dev_err_probe(imx576->dev, PTR_ERR(imx576->regmap), + "failed to initialize CCI\n"); + + ret =3D imx576_parse_endpoint(imx576); + if (ret) + return dev_err_probe(imx576->dev, ret, + "failed to parse endpoint configuration\n"); + + /* Get sensor input clock */ + imx576->inclk =3D devm_v4l2_sensor_clk_get(imx576->dev, NULL); + if (IS_ERR(imx576->inclk)) + return dev_err_probe(imx576->dev, PTR_ERR(imx576->inclk), + "failed to get inclk\n"); + + inclk_freq =3D clk_get_rate(imx576->inclk); + if (inclk_freq !=3D IMX576_INCLK_RATE) + return dev_err_probe(imx576->dev, -EINVAL, + "inclk frequency not supported: %u Hz\n", + inclk_freq); + + for (unsigned int i =3D 0; i < ARRAY_SIZE(imx576_supply_names); i++) + imx576->supplies[i].supply =3D imx576_supply_names[i]; + + ret =3D devm_regulator_bulk_get(imx576->dev, + ARRAY_SIZE(imx576_supply_names), + imx576->supplies); + if (ret) + return dev_err_probe(imx576->dev, ret, + "failed to get regulators\n"); + + imx576->reset_gpio =3D devm_gpiod_get_optional(imx576->dev, "reset", + GPIOD_OUT_HIGH); + if (IS_ERR(imx576->reset_gpio)) + return dev_err_probe(imx576->dev, PTR_ERR(imx576->reset_gpio), + "failed to get reset GPIO\n"); + + ret =3D imx576_power_on(imx576->dev); + if (ret) + return ret; + + ret =3D imx576_detect(imx576); + if (ret) + goto error_power_off; + + ret =3D imx576_init_controls(imx576); + if (ret) { + dev_err(imx576->dev, "failed to init controls: %d\n", ret); + goto error_power_off; + } + + /* Initialize subdev */ + imx576->sd.flags |=3D V4L2_SUBDEV_FL_HAS_DEVNODE; + imx576->sd.entity.function =3D MEDIA_ENT_F_CAM_SENSOR; + imx576->pad.flags =3D MEDIA_PAD_FL_SOURCE; + + ret =3D media_entity_pads_init(&imx576->sd.entity, 1, &imx576->pad); + if (ret) { + dev_err(imx576->dev, "failed to init entity pads: %d\n", ret); + goto error_handler_free; + } + + imx576->sd.state_lock =3D imx576->handler.lock; + ret =3D v4l2_subdev_init_finalize(&imx576->sd); + if (ret < 0) { + dev_err_probe(imx576->dev, ret, "subdev init error\n"); + goto error_media_entity; + } + + pm_runtime_set_active(imx576->dev); + pm_runtime_enable(imx576->dev); + + ret =3D v4l2_async_register_subdev_sensor(&imx576->sd); + if (ret < 0) { + dev_err_probe(imx576->dev, ret, + "failed to register imx576 sub-device\n"); + goto error_subdev_cleanup; + } + + pm_runtime_idle(imx576->dev); + + return 0; + +error_subdev_cleanup: + v4l2_subdev_cleanup(&imx576->sd); + pm_runtime_disable(imx576->dev); + pm_runtime_set_suspended(imx576->dev); + +error_media_entity: + media_entity_cleanup(&imx576->sd.entity); + +error_handler_free: + v4l2_ctrl_handler_free(imx576->sd.ctrl_handler); + +error_power_off: + imx576_power_off(imx576->dev); + + return ret; +} + +static void imx576_remove(struct i2c_client *client) +{ + struct v4l2_subdev *sd =3D i2c_get_clientdata(client); + struct imx576 *imx576 =3D to_imx576(sd); + + v4l2_async_unregister_subdev(sd); + v4l2_subdev_cleanup(&imx576->sd); + media_entity_cleanup(&sd->entity); + v4l2_ctrl_handler_free(imx576->sd.ctrl_handler); + + pm_runtime_disable(&client->dev); + if (!pm_runtime_status_suspended(&client->dev)) { + imx576_power_off(&client->dev); + pm_runtime_set_suspended(&client->dev); + } +} + +static DEFINE_RUNTIME_DEV_PM_OPS(imx576_pm_ops, + imx576_power_off, imx576_power_on, NULL); + +static const struct of_device_id imx576_of_match[] =3D { + { .compatible =3D "sony,imx576" }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, imx576_of_match); + +static struct i2c_driver imx576_driver =3D { + .driver =3D { + .name =3D "imx576", + .pm =3D &imx576_pm_ops, + .of_match_table =3D imx576_of_match, + }, + .probe =3D imx576_probe, + .remove =3D imx576_remove, +}; +module_i2c_driver(imx576_driver); + +MODULE_DESCRIPTION("IMX576 Camera Sensor Driver"); +MODULE_AUTHOR("Himanshu Bhavani "); +MODULE_AUTHOR("Hardevsinh Palaniya = "); +MODULE_LICENSE("GPL"); -- 2.34.1 From nobody Sun May 24 23:32:30 2026 Received: from MA0PR01CU009.outbound.protection.outlook.com (mail-southindiaazon11020135.outbound.protection.outlook.com [52.101.227.135]) (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 8EA4F3DA7D3; Wed, 20 May 2026 11:57:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.227.135 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779278253; cv=fail; b=gI76niXO0JgyCPjiCGPprZjhzSy69hKIjaEf0mJnudH1kMgteUW+FpQJRTU3YJvevA0LidHMRT0Sb4bwsbepEwzjhpzB/NeggN7/Af6J4njnPmCcQRnlkvn0fvIwHxZEzsHGp349zhGKst27E/lwfmJ1Vep/pq0L3H2+QxeY6+o= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779278253; c=relaxed/simple; bh=cSqCMwqNV2PRsAVjYJqoTXK5IcP3OcRhaLhVQFMP7Fg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=T9UsVhCT1k/JvLF6AUa2rujC47OFX85jAUO3KF5vVpkZ+keh533cmQA6BNx/qFnCB8gGXzaIcCoSkax75xgc5XqaB6NbEk6AQ/KxuJWkwBwA2BAYaxhJwTrVxf1LwJAYvcppD5y5EayMkUfQJkHyZ4deShv74XBdtS1qNDjIWbs= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=siliconsignals.io; spf=pass smtp.mailfrom=siliconsignals.io; dkim=pass (2048-bit key) header.d=siliconsignals.io header.i=@siliconsignals.io header.b=QL/A6syN; arc=fail smtp.client-ip=52.101.227.135 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=siliconsignals.io Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=siliconsignals.io Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=siliconsignals.io header.i=@siliconsignals.io header.b="QL/A6syN" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=nkUmMNHcTnW3SPEzb+rUMDMsHylG0O0K3JpnPdGonM+Ir4OgbEfBvB0MIev1N2ghlNN62i8BdvZa71Sb/UZBRZ66qMTuOyJJMkryj/AauelRRxxBowiSSVxhOjBDzmAIXxbWiVqtMaT9YiQkbFgRcDrhOX9PxGs0N3cg+vaHWkCahnVqvdQJtsC2jP+5ZxQnyQLwqLeARrGMvJcj4j108pGDn+UtX4NRxy1YIzZZlQzbQCHXx61b7yGSjqO1+LcWZ782GJDsU4KzAsnxAZSalvPB+D9t1MuozUvuAv+9aQibf83Iv5vqY+rJm9RoGPvx1XZL0nOZrSwvXfKiTAGYVg== 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=2GH79O5Rsb/KP0DHRRROTVQx0/ccWGT5MO09XY1z1SE=; b=nKIRzNStJ0rK4b7AUTNf6p01oi1KZkTQU1OASZxDM97ZHkjyO2xqEGyrCs/lGtVZgM2cpIXOju+o/uSa48U73GbgxDB0nHlG+YepoOJnuIzFFVoOWj6ScNRTb5VsYfHETZO8rghkuuRJjn3p+i0cTNV3E9LTZg+e09R0VHDAzWvp7g5PUQ0OJ59sfelYev8ysZRvsFLDQHrntceykGV6VjfqFMs6+9GO7STJ8zSiJpVwJ4W3YVIcqiczYSj/mj/HslLlIqEvo/HtfDWcfRGSXFCeiqkqZhJv89XiXWbp2i58wda9baHilXCBMXW5Oed/TabFGCxnbhBbo8DshmIO0w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=siliconsignals.io; dmarc=pass action=none header.from=siliconsignals.io; dkim=pass header.d=siliconsignals.io; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=siliconsignals.io; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=2GH79O5Rsb/KP0DHRRROTVQx0/ccWGT5MO09XY1z1SE=; b=QL/A6syNanv3VP1XTqZFYBvtcyiNdiBvvs5/BT2OhYbw/rN38H1sjy5HfRycbiIpnFBi6oRc6mXvTT6949F4lXzzdyCKuI4wPjla70glaHYAdmUXnN+mx0K420eQ1uIiS9oRx/U6Queo+LLaThvxejNxxgYyyJ/eKHd/C+WuKK6s31fekMt4Bp3xnR7+zTUWIgpRMF9dhgb7ChV0mjAVgxRj80m+7YrD+BJIIxGCHf9luNwyrzezR1NRCv7wRX6MV0auCor18GAE78eCrbQsWr1d+9Fc3X1GyHM5MFxndWZoCcwtcWU0Akop5QG4FUNhqBgCO/beX+ptENcyv0sxmg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=siliconsignals.io; Received: from PN0P287MB2019.INDP287.PROD.OUTLOOK.COM (2603:1096:c01:1b8::9) by MAUP287MB5499.INDP287.PROD.OUTLOOK.COM (2603:1096:a01:218::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.48.14; Wed, 20 May 2026 11:57:28 +0000 Received: from PN0P287MB2019.INDP287.PROD.OUTLOOK.COM ([fe80::ebd8:538d:c705:8432]) by PN0P287MB2019.INDP287.PROD.OUTLOOK.COM ([fe80::ebd8:538d:c705:8432%6]) with mapi id 15.21.0048.013; Wed, 20 May 2026 11:57:28 +0000 From: Himanshu Bhavani To: sakari.ailus@linux.intel.com Cc: Hardevsinh Palaniya , Himanshu Bhavani , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Bjorn Andersson , Konrad Dybcio , Hans Verkuil , Hans de Goede , Vladimir Zapolskiy , Elgin Perumbilly , Laurent Pinchart , Walter Werner Schneider , Kate Hsuan , Svyatoslav Ryhel , linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org Subject: [PATCH 3/3] arm64: dts: qcom: sm7225-fairphone-fp4: Add Sony IMX576 front camera support Date: Wed, 20 May 2026 17:26:35 +0530 Message-Id: <20260520115641.11729-4-himanshu.bhavani@siliconsignals.io> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260520115641.11729-1-himanshu.bhavani@siliconsignals.io> References: <20260520115641.11729-1-himanshu.bhavani@siliconsignals.io> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PN5P287CA0046.INDP287.PROD.OUTLOOK.COM (2603:1096:c01:25f::12) To PN0P287MB2019.INDP287.PROD.OUTLOOK.COM (2603:1096:c01:1b8::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: PN0P287MB2019:EE_|MAUP287MB5499:EE_ X-MS-Office365-Filtering-Correlation-Id: efb8d593-5a21-48a3-e993-08deb666f72f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|52116014|7416014|1800799024|366016|38350700014|56012099003|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: EVGbCiax6I0MxFxCzxgmiRU5Ha8oHfwbbJbQ3/y5ktxK8wsqCLk+k5/EG3mOt6otlEGudppR59Kn5Lx50RVG7Wz5Z2k3eBta1x1p8Xj04Jl9KLhFdWrYuPk8K7HJ3/oYZH1pn4sYr79HxxMNUR86+NYfwlnIwn2rWVT65KTO/wjyze7h/LqJ1xDjOY7GbHxradwrIPkvleu96K66udK4atyKMJ30qCZea/psGu7tUSYrzlSVy0pEpFE8hhM2KJxeSiol4brxWl1GCQKz0Ox8WkfY7d7CIrg7k3Gv/nC15a+hYr+1+5AOwT2GjmRil1QIxY0WhOJPcKGfDH0Q3yr5gLRpZzRkFjkuCgg6EXXHket20hq/gO7HqvohAtnkZB3bx/+D4FWSKBS3Wy/JlKc7/SUNcUN3AUv/z0QTqC/f+QAzfgNOtSMfVPK4BjCtZliOtKjo+E0oQLFFMTSa9mVnWlOZBIG5g0b3byaDXGeJ7qtlwTt8tE/jomU8DHCfCVmw6NLPAAkxtjqt38Cn3dE96C8Su1lK05AMIv51230ctk/QyHQVhZsZclHZGuNCREp5tPSzvyEDUFU+201Nn0Ydfu6WqZ6B3oMYG8DTf/ugQnUkm+7lmlxNx6FfCOvQ6FXfXZN0P3MBGXa1IRKoJrXF6hZR00KxnFQvPZPh9i3AS8/wdsnh+B/Ont+vS+C+nHT81WPA/qfyfMGBVyfpsAZA0yBMYH5UVkSEm1yl/86Um0+rIdYrGF70ZgIfJWQrT2iT X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PN0P287MB2019.INDP287.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(52116014)(7416014)(1800799024)(366016)(38350700014)(56012099003)(18002099003)(22082099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Dx7AZRlM3B4OtWw0ou+ndf5AdKeMKVmdToGa876XtfwdJKGWnuGkIMfo9/iu?= =?us-ascii?Q?QrReCHdMtYaTUsg9ljyZlrCDWX5R8F8vYt1F8FbdEhFlSC+fQG1Ftraw5VW6?= =?us-ascii?Q?uUMwaRUFnA+xVPbS+jN7cAcIpI1rfcVKCtQ8yhLC+aQCtXpfZGfjCqHvlFjL?= =?us-ascii?Q?XxdtkN8s7pTe4/pNnJoubGdU/fDchGcejKP7OK79kDJDxRKjT3KMcyA6Eu+7?= =?us-ascii?Q?gzD10Z8cvJ6DfXp1PF24OQ5E57cjXXy5w1IlfJ6V28Ka8ioufAOrxHASljhv?= =?us-ascii?Q?0LdNnFD20fbkkqwhG63+Rj7Kd7L/bTgxaq9/7kmTUZheAxnTutJnNVwKfoWr?= =?us-ascii?Q?SFzKz5OaIPrBETHtN7hdYwGPRRsc8nPRSm2d7KFCLD6xZggY/7HzF7yS61ko?= =?us-ascii?Q?fRuxJaFVNKGj9Q46QlHqFqTy+ml9a1TgeTLQBHj2lUrfMcRRlb7AaB6F5iaJ?= =?us-ascii?Q?kUu3bOs9jACctxVnJUw/nckTW20SZ4147Q/cq9UqBrT2GIyZ75MmgUMPrbNj?= =?us-ascii?Q?y3a+LNmz+761+nfz7MgfgY507mrOWxMTtTmbD/cpJ1J6fDYg7EaIBtpueaPZ?= =?us-ascii?Q?iBeq2hvmt1Z9MkotbSkke4cr53K3JR6BcvMGmDJccwNESFNPvoviUDteQnkl?= =?us-ascii?Q?J5gnmgYi8zvYW1keHpcGhTnPua1PcdafD0CJOwcQYnRjWbrbbr7w9vAEwNBU?= =?us-ascii?Q?t6SGXSDtMO2RouziqcJTMZSPvxD0bK0/bxjGmuhBnxqcHwds3IiFIo9q2Jgo?= =?us-ascii?Q?yKwVT+a4y53Wr0A/IiTI3hJvvcZX7ASVexIRlK1MZRRnD9UGk4aq4ty4X8Dz?= =?us-ascii?Q?U3dTK9XB8RvVjFtgtJQfGRuiJYHPbB/I8uVjKjfg2xyoT34p49xhwyefO6Zy?= =?us-ascii?Q?ua8su0VcOhKoIvPsGEcRIPuGSH3f/Ai058Hd2ecMPf9z4N5DGX21pZpRG4x1?= =?us-ascii?Q?O5wjieS2yFb/YIF4IDXyaF2M+CKZGKd8XExm+PKoG2KJJAQRKwGWDK9s4aVe?= =?us-ascii?Q?5Pi3FDnqHqgAAADqHA/ndvGUJn8HaIo4PdT1CfgBTtL99cTlNWiWCmTnkJIs?= =?us-ascii?Q?VCoi8z3NWvzHEFz9GM9xFscpAjeYDu+4qrqwPm6vkiJJrYZPkZDLbAhH8cG0?= =?us-ascii?Q?PshXpwdwDA5pA6E8PD1Nkwk9cPPbozUkzHl+dlqB6050/Nnzqqlt834xEraG?= =?us-ascii?Q?ZTZqGcVWY6QYOJ0SSGweN09k0Kxft2kIP9Aqx4hNKQnnS6MsYvToYbg435th?= =?us-ascii?Q?PElctpkguNxFg7VDTsLiYmMGdFwNP1N93shLrm3cdhUeagvfWeoHiGqx06l6?= =?us-ascii?Q?0aujpU0I6XloQQjObfWQwKOem4uJBocuwn3JAnfClr/aOM2UkylvgPE1GLfQ?= =?us-ascii?Q?7efQ0isB7/IYfOOrVrrlAL5+5+/C1AF/My1V64Bz2NWZM23AkZxpcXyPKW4q?= =?us-ascii?Q?stUmobEqQrKpJxmOZImWlNxEAhI9H+Fxksnk2IiGs/1J90vA7io/nU9EtVS9?= =?us-ascii?Q?VYVCVYxwB7xz4MgcBE59WvZa8Lubf4cyobsduw/iSu08NVRL9tXapByQxQAN?= =?us-ascii?Q?761GPXsqKWWXnhL0Llr+2UXG1Zoq2Zzn3YbDhwApGb00T/5TFFlsGM77vEtD?= =?us-ascii?Q?rCFV4My0exjYGoZqPTqiq6VPWdxHtf70zXnMINkqWZ1MdRwTxtXyw3qxj7zr?= =?us-ascii?Q?ySJNWHtWSHQATq+33vYkGle5G/kplmfNm5ghwJifbhUeEgG7F+IeckiNHyhK?= =?us-ascii?Q?jtI+CkgylN31fDh9vVMIhI6onGmUAHFpCTAke2XkRyzEn0k/I+2v?= X-OriginatorOrg: siliconsignals.io X-MS-Exchange-CrossTenant-Network-Message-Id: efb8d593-5a21-48a3-e993-08deb666f72f X-MS-Exchange-CrossTenant-AuthSource: PN0P287MB2019.INDP287.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 May 2026 11:57:28.3902 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7ec5089e-a433-4bd1-a638-82ee62e21d37 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: UO6Y1evuP6RHiodt0FB1T/joBTcg3gLJ/D40Xy48MjGHQGKzU7jCstHODDXyYz6b4rM96DZCGcOcUGXCQ+6zBcAFPJG6+s/6v6GQ7Y34HagfL5NZk880vdQxGa9WfSqx X-MS-Exchange-Transport-CrossTenantHeadersStamped: MAUP287MB5499 Content-Type: text/plain; charset="utf-8" From: Hardevsinh Palaniya Add device tree support for the Sony IMX576 front camera sensor and connect it to CAMSS via CSIPHY3. Signed-off-by: Hardevsinh Palaniya --- .../boot/dts/qcom/sm7225-fairphone-fp4.dts | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/arch/arm64/boot/dts/qcom/sm7225-fairphone-fp4.dts b/arch/arm64= /boot/dts/qcom/sm7225-fairphone-fp4.dts index 3964aae47fd4..5fb0f3eddf66 100644 --- a/arch/arm64/boot/dts/qcom/sm7225-fairphone-fp4.dts +++ b/arch/arm64/boot/dts/qcom/sm7225-fairphone-fp4.dts @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -547,6 +548,24 @@ vreg_bob: bob { }; }; +&camss { + + vdd-csiphy3-0p9-supply =3D <&vreg_l18a>; + vdd-csiphy3-1p25-supply =3D <&vreg_l22a>; + + status =3D "okay"; + + ports { + port@3 { + csiphy3_ep: endpoint { + data-lanes =3D <0 1 2 3>; + bus-type =3D ; + remote-endpoint =3D <&camera_imx576_ep>; + }; + }; + }; +}; + &cci0 { status =3D "okay"; }; @@ -582,6 +601,34 @@ &cci1 { &cci1_i2c0 { /* Front cam (Sony IMX576) @ 0x10 */ + camera@10 { + compatible =3D "sony,imx576"; + reg =3D <0x10>; + + avdd-supply =3D <&vreg_l3p>; + dovdd-supply =3D <&vreg_32m_cam_dvdd_1p05>; + dvdd-supply =3D <&vreg_l6p>; + + clocks =3D <&camcc CAMCC_MCLK1_CLK>; + assigned-clocks =3D <&camcc CAMCC_MCLK1_CLK>; + assigned-clock-rates =3D <24000000>; + + reset-gpios =3D <&tlmm 35 GPIO_ACTIVE_LOW>; + pinctrl-0 =3D <&cam_mclk1_default>; + pinctrl-names =3D "default"; + + orientation =3D <0>; + rotation =3D <90>; + + port { + camera_imx576_ep: endpoint { + data-lanes =3D <1 2 3 4>; + bus-type =3D ; + link-frequencies =3D /bits/ 64 <600000000>; + remote-endpoint =3D <&csiphy3_ep>; + }; + }; + }; eeprom@50 { compatible =3D "giantec,gt24p64a", "atmel,24c64"; @@ -1115,6 +1162,13 @@ platform { &tlmm { gpio-reserved-ranges =3D <13 4>, <56 2>; + cam_mclk1_default: cam-mclk1-default-state { + pins =3D "gpio30"; + function =3D "cam_mclk1"; + drive-strength =3D <2>; + bias-disable; + }; + qup_uart1_sleep_cts: qup-uart1-sleep-cts-state { pins =3D "gpio61"; function =3D "gpio"; -- 2.34.1