From nobody Sun Feb 8 06:22:43 2026 Received: from mx0a-0064b401.pphosted.com (mx0a-0064b401.pphosted.com [205.220.166.238]) (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 61CEF2A1BA; Mon, 29 Dec 2025 02:31:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.166.238 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766975497; cv=fail; b=TR7NBQV2hBcXwJfWUkRgKoXi2UgP5y/UlrYE4hanbG65ryIol5VFVmDwJeD9KLJ1BaMH9I0hTWK3tyHplbHp6qXzbbWlfcd7VFIAbfRTIEj5nfZ7HwPhFd5T5K9yLuegk3z9AfATOsjgxh7bG73meLMS4WboitzBOJccaxdiNME= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766975497; c=relaxed/simple; bh=AURpsAu5ZUFDvZdkMl05vAVKVwPtZoaM4jb3swikH0s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=hG2rnf1KIUpyVmVwxhAIl+3lN2lgLTVXJfULfbGF6zaxmJdsXdDhpFeeiHcqLUvdyzGattO5o8eP5CldAf29Z07a71KTdZwfGT2AprdYxWIKD7W6McVDJhjwCrlJ2xFIOYJUIcfZ+4sqPy4/Ebf1QGmcoyEH2ep6oV0JspWB/ig= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=windriver.com; spf=pass smtp.mailfrom=windriver.com; dkim=pass (2048-bit key) header.d=windriver.com header.i=@windriver.com header.b=mwdE9UNv; arc=fail smtp.client-ip=205.220.166.238 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=windriver.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=windriver.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=windriver.com header.i=@windriver.com header.b="mwdE9UNv" Received: from pps.filterd (m0250809.ppops.net [127.0.0.1]) by mx0a-0064b401.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5BT1t1fK151482; Sun, 28 Dec 2025 18:31:07 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=windriver.com; h=cc:content-transfer-encoding:content-type:date:from :in-reply-to:message-id:mime-version:references:subject:to; s= PPS06212021; bh=YG/9+gjuSjPZI/RXH1VPATPgbSSHXIbmkcxhcZa5tZQ=; b= mwdE9UNvI3a5gjjaX7Bg7sD1qGdigSeGe4xOi9nW/swQ+5Tuw1Rtfn08nIMTlVqb tpLgS6krnRLz+j4z0LMLy+VMJdb0l56tb68P6PUK7TElGKor6r5UYBkH4Wepw2op YlfPvfZJ6LqpMqd4JIJMpKqtiT3r7ZopkkLj0cbNA6bbpFBM1KUMoxZdCT7OiWtY q6Js2WEnyOtIp/9PN68gko0SnHuq4VYSPohKm/J8JGVfx5UA6GLfSN19d5Seu2uz yAnYwvT2o90Q1ztVUZ5QnEuhyhQvJalJm3wH4giLUFwp0c1Z5cjrTUQjiGBcIsCT H+L4ajUqLwPxCpq0NyyCWw== Received: from co1pr03cu002.outbound.protection.outlook.com (mail-westus2azon11010032.outbound.protection.outlook.com [52.101.46.32]) by mx0a-0064b401.pphosted.com (PPS) with ESMTPS id 4bafuk901u-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Sun, 28 Dec 2025 18:31:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=K5BWmeAQQC2V0s6Xr2Z0DgH276A4khRjwCmqlNvzNeP4iKGe491yDRwsGniNslXXl3LKI92VsTLKQsXwRPwBFwNyUfWVy/sfCdapW6Mzy0r2V0Ln18KHUb/42006zZxn/s9j6ChbVneJ9XeDKz4CC4xLZh5H6yAHwnV8yN7TWKUCOXCjkyb9ZmhShfZ15Hru15aSP0fTll4VAsEpv2Sebq+A+MpiUzCEFSgBYSD00z0T9lQF/AqU1DWxaUyY7U98fdTHtSYgaon0IjEVXb5/TcgYEEVkOHNuiDGEkRiAULZLvdSWTsnMe2QxpmoCts0KWiHjKduzXXCfuEoMJGsjXQ== 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=YG/9+gjuSjPZI/RXH1VPATPgbSSHXIbmkcxhcZa5tZQ=; b=hidNcA+Sk92JvR2X8DZw2ewEGFsJeLv4YpVKvO664k2OaiblpWv5ulcmoSKSWr2Ozhn8ucvAtksCjaPJQEns7CMDFy8jri/3jOwUJMxTrXWOZE18TiQJPRL6I7uQSBJQm5ZnMTGrsE8kk3q6ByqdB22lvaaRNvm9uQCjDgJAB5QtoQl5KbH+o9aSysBYPmhaydgi60LyA3Rwwhs+Kp3jhGEp29S0yuw7mGqZ/J6pKr0Gp03ebPZLlOk7gmfDrNZuMa4d/agWe2YHUiSPnBQGgsUxglxQ2i8QKhl/Its2qmuTp5rfxN+J6ANt4PXBzEztBNwOnNPr/NoPkXHpKPy7Mw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=windriver.com; dmarc=pass action=none header.from=windriver.com; dkim=pass header.d=windriver.com; arc=none Received: from DS4PPFD667CEBB6.namprd11.prod.outlook.com (2603:10b6:f:fc02::53) by MW4PR11MB7103.namprd11.prod.outlook.com (2603:10b6:303:225::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9456.14; Mon, 29 Dec 2025 02:31:05 +0000 Received: from DS4PPFD667CEBB6.namprd11.prod.outlook.com ([fe80::56cb:3868:6b6c:193d]) by DS4PPFD667CEBB6.namprd11.prod.outlook.com ([fe80::56cb:3868:6b6c:193d%6]) with mapi id 15.20.9456.013; Mon, 29 Dec 2025 02:31:05 +0000 From: Xiaolei Wang To: laurent.pinchart@ideasonboard.com, sakari.ailus@linux.intel.com, dave.stevenson@raspberrypi.com, jacopo@jmondi.org, mchehab@kernel.org, prabhakar.mahadev-lad.rj@bp.renesas.com, hverkuil+cisco@kernel.org, johannes.goede@oss.qualcomm.com, hverkuil-cisco@xs4all.nl, jai.luthra@ideasonboard.com, xiaolei.wang@windriver.com Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 1/3] media: i2c: ov5647: Convert to CCI register access helpers Date: Mon, 29 Dec 2025 10:30:16 +0800 Message-ID: <20251229023018.2933405-2-xiaolei.wang@windriver.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251229023018.2933405-1-xiaolei.wang@windriver.com> References: <20251229023018.2933405-1-xiaolei.wang@windriver.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SI1PR02CA0031.apcprd02.prod.outlook.com (2603:1096:4:1f6::11) To DS4PPFD667CEBB6.namprd11.prod.outlook.com (2603:10b6:f:fc02::53) 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: DS4PPFD667CEBB6:EE_|MW4PR11MB7103:EE_ X-MS-Office365-Filtering-Correlation-Id: 71012416-3178-4d66-6888-08de4682511f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|7416014|376014|366016|1800799024|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?8kqKxk0sfu5IN61WCVX+BXCNvftWJOxvhegPgmdYQ9Zu3xOpmGDzNXYkhl6a?= =?us-ascii?Q?bEVelggI31D1Hz9LS1ZVsW3hanpWTfesEbDdFJaUXYdK/LjiVghGJUJzl702?= =?us-ascii?Q?oV27rx6U+K5hNhJLkMyiosrvVfq+VmVzzeKDbhDk58/BNYVzaEZxRgkgMyHp?= =?us-ascii?Q?uEL/LncLeVIam2adPRIY40pIG+yAlq+Qym4ICRCs4fmJ4uF/lxj5t6v3yqAU?= =?us-ascii?Q?Daa+n8T0H5diVtchl96IJc0qrRax5Y1P1x6EfV0sDbw6TJllqw7XcSJr41g3?= =?us-ascii?Q?jdbxaucnCAyq2UvrGoVD/oo3WLblsohTPO0255ieMbXTSiM7YMa8qgn409Bj?= =?us-ascii?Q?7XVlxqim0BYRghXc9n2AeB+8DhVNI5zCCrkKqUowLuktW57FkD/nLfvVNHIL?= =?us-ascii?Q?Er7OdfMDAFhuCsdA+z8/nMPzWHrjNpD5M4tHXED4ZVDNlAV8/KS8kuW/jg+v?= =?us-ascii?Q?MzpA5e1bVQibtJZ6/N90tsJ9k8F7dJqHzKj22EdFGxte8IxZoNn5DEia1jdx?= =?us-ascii?Q?PxEJC0AJ+ero2baAhEL+nv1ojO5Zb0XcAi3hzWCSVRtQtV4rchUYds6cUcio?= =?us-ascii?Q?ej3HwBpwuF3SFZfdYr75WFg3Ug+IahrmZKETXnaOgsR29AEpK6vDH+7IixAJ?= =?us-ascii?Q?RS1vZuKBxxOhJY9+HKGce8Ucb32ozdxR+q/dpoDEqWJW/IklwFWmpvG2ii27?= =?us-ascii?Q?0GGqoja2k+hZeVjHtBoTFZGNbQgRQqPvU1aREJWmSpcci/kcZ3YXDxt49W4s?= =?us-ascii?Q?C0HeP8Zwi9ZhO+ZDMsJdoCfasxIqop2cJEjv/yWwGulbyfpunt5PLf02tJuu?= =?us-ascii?Q?J38UHGXx+Q/rfBTbPzy0Py9pqK0PGmWGPxxzeJcQXcobsTeIO0RkhlzqMaSx?= =?us-ascii?Q?0mH4vswcgKri6Z+x/QoHkZkyBXXYuxmfbXU9/667DIKsuXlEJUF8+NsR720N?= =?us-ascii?Q?UrUjtSpzraHUbVyDKviI7Z/aYlXSemKnZW+PJC4oQWSZthbOrM2cFVFlg77U?= =?us-ascii?Q?r2p5DBJJpd78sguuH6K6CZ3FU6r49dQ8yzIa7J0t49+WunIB2O1BMcOSXirP?= =?us-ascii?Q?dB+C0ybYzLlLfzc8I1hQ4PeBz3FOdyjQbZSmHugBZX9cVCYiSKOefLDVnSf/?= =?us-ascii?Q?Mbdz1PiJZhUuJadnCg0qHB4SrVT/iS3lJ91W2s/T9F2A9Q1SW35D05lrdIsy?= =?us-ascii?Q?/+gTlEHwQjQTWutJNKb5mQxy4YQXYuWnp95JyrGTpx//gDTVdCM27cpw71O+?= =?us-ascii?Q?cRZq0abhmwCioyaIouJN9TLTRlaEbrCm2R3DTZYWjRFBpb9Jqhevh5YNQyEF?= =?us-ascii?Q?PXEaHJEQHWlzrpfnwGXVR4ifz22ullGORmUIV8ypumPRS11CWLNMgK274B7b?= =?us-ascii?Q?iJc6dhtvJ65H4yhuM9h7bPCnqM4Sw4qMgtDPx+p8SnHL4CelufL6vL49Gqub?= =?us-ascii?Q?4c5p7tcIDIJGmmo8injakOTNnYIUm8HoHuzLhYDv2PCwE01iksXTyn2We4cv?= =?us-ascii?Q?F09Yrd3DXPk4n8TERrFL4HpfZ7NKcauTdbvj5imQWRT1AepsquLqRGWnRQ?= =?us-ascii?Q?=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS4PPFD667CEBB6.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(7416014)(376014)(366016)(1800799024)(38350700014)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?fEGt59qNqjhs/SoHhIkVbxlqoKG59+4gtk5JL/218akbv3lvDBrte7Eel0j0?= =?us-ascii?Q?6QLlzUfLWbA1zsa3rXn3y9pzMPgGZoeXi9BbTmp7tN5KNvtZMrExZN9an8/Q?= =?us-ascii?Q?132bccPCP+IAddbYPHb6+bRa1C6Ep+Oy+/6ZZTCkhKRkclprtQJFSmULzlEY?= =?us-ascii?Q?PuSKYQKDk5IHHZB9VXZmRiSr+mipQq08v/K9/92aaJGlD0hjtILbtxlEO4eQ?= =?us-ascii?Q?NfxGgckq2qVp6otpu4+y8EM1mU2h8ogmOAoIwwQvbQkVnvP/M18c0aJmUiy7?= =?us-ascii?Q?Bx7T8V3OtHkERcw8V8JC3NFMbxnwo5ytYrkiGX1Y5rKI9SgWIH/KEqwJDe9j?= =?us-ascii?Q?zGPuc9fUUUQ/CK4w5o1mi0RSw0tojvTzKCPFcoYuwxZBuW5H4ZuRgxcOqNXo?= =?us-ascii?Q?JpkPpnXFT/4CwxOLbAv41Bv7jOKelNCqt+pXce4AX9TNsTKQeOBvKnsEd387?= =?us-ascii?Q?jE7Bwkbue5Qg6BvuCKwhZUTwNxfGROc6MfXxHJm1Y6pVSFpWQHkLAT0j80Os?= =?us-ascii?Q?Piang8QMfvficAD8WSmMHQJxPns6X/n8YwdbQ8wCXEyQGZ5CAdfjAjeerd03?= =?us-ascii?Q?LZDGEfC3Y3J5WqwkKoF7xu0v6y84lL/GOEBPtzs29eZttLpI4tddcxBL0VUf?= =?us-ascii?Q?MMTVz0nNGiEHaK+hfaKq3dAtL51YXEKBqwQIZEd6HyIFPm+KSNFcKtMASdgc?= =?us-ascii?Q?TtG+Tcf+fFj6Fqd7xHbLjyqSTto4vjJqoNfhKOKWzjZiR7tsJPyibeSdNTpk?= =?us-ascii?Q?aJVyO1/iy4boPTmrzix4jzCoMGq3QGwGfDTQTpR+YTA8Oe5U1ob++3dGLGU0?= =?us-ascii?Q?0BUYso04V2VSxoJt+OI3TIbTDslBHKQc2RR4U7lED+HBW4/QIlYx9GGwYcWM?= =?us-ascii?Q?LB3noeaNuvBbo3PzjpGdQgK7xw9aSRbb2CEQVIv8i++8fSErwR2i9kZv3gCJ?= =?us-ascii?Q?4xr3Sp3Mg6ZvMa3S+m9zylimwcyMGpcI6qhBB7byC+N8C4eEgfXDWBQkZDv6?= =?us-ascii?Q?B2uJ+zfzgPYvGvxdB4781pRBZSFmb034KFDtg4O0zsJxrQsNoOPUnCrf5R10?= =?us-ascii?Q?HlYCj5LXddQV0Ui3hez6ZwkSmLKzZnxIqmRZimRemavERndGLaNiMle5BGY5?= =?us-ascii?Q?jkWJTROO6/zo1V7WufntjDeo2qrApCgsw/Xrx45gDA79YXJ0hwYJ3eAHYRUH?= =?us-ascii?Q?6pUc6Ii0VN6cqjmInAoKRDUZTY4+dSc+eUm8WdC2IeX+IX4pGazp9eEVkiwm?= =?us-ascii?Q?JDFIPZIzdXvqdRQ+AZ0FR2O/u5ZTRWvrrDj9J8XAceiesw6gRjsFl0nfz4ng?= =?us-ascii?Q?9Y5nElN29cxe4y9w10+hRCPTGcxc2wnqanOrvQQchBo2yo7eFSQ9Ve35hwZQ?= =?us-ascii?Q?Nnk12LXXPNTqWQ9Q4dTw1v1d5PnJorva8wtyk128ZSRgGsA25wIgdGjlqzFF?= =?us-ascii?Q?VqVuTc2O2Hbzow/lhun6grz6hnL9wGqtO7L3X/U2BZbrXkllIJbSm0Ru8epU?= =?us-ascii?Q?9Nf95emH6Z4I0XNtYJPa5Q+GRQS3WJTfKjplEFJyCfO57SF6f9SoayCTqklK?= =?us-ascii?Q?qjZ4OdxU9f9EEo/EqYMi+FvKVxdMUt1gbbfOOn/1fiDYqhR+tZXdejVSzhsG?= =?us-ascii?Q?ipPEKeugp8fcEkvazv8mezUGDb1NjBuS35di2dWaFMctcSdJY3LF5MWACDaU?= =?us-ascii?Q?hqOJ+FCdljPJjwEWyLNs5UvwtlX/v0TwOe1TBZnSJPNN77MJCpu0uLEpkSJ6?= =?us-ascii?Q?6sL8pFIlZsSM8vMNyKTPPLWRRjokgFM=3D?= X-OriginatorOrg: windriver.com X-MS-Exchange-CrossTenant-Network-Message-Id: 71012416-3178-4d66-6888-08de4682511f X-MS-Exchange-CrossTenant-AuthSource: DS4PPFD667CEBB6.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Dec 2025 02:31:05.8424 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 8ddb2873-a1ad-4a18-ae4e-4644631433be X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: o5ZLcI72JNaM6ALZyIriHF6qbkMw1qGV2lWLNzvg4XlaGGEvt68i/9aykrfkqTAVtTcax0uu2DjRz2RPX6U5HR6voaAvZGlhauC0JK7GC+c= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR11MB7103 X-Authority-Analysis: v=2.4 cv=ccjfb3DM c=1 sm=1 tr=0 ts=6951e7eb cx=c_pps a=aSTqfDprWv2neSIyXEkWYQ==:117 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=wP3pNCr1ah4A:10 a=VkNPw1HP01LnGYTKEx00:22 a=t7CeM3EgAAAA:8 a=gnH3C2b3y4YtfwlRM4wA:9 a=FdTzh2GWekK77mhwV6Dw:22 X-Proofpoint-GUID: iMzBA-VPqjqzcM7UFzVwd9s-7t9o0H7X X-Proofpoint-ORIG-GUID: iMzBA-VPqjqzcM7UFzVwd9s-7t9o0H7X X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjI5MDAyMSBTYWx0ZWRfX4vJJPnbU/lgE SSm87pHSjCv/NHw51/eAZK25ZqEVTQ4AyGh7rBRvTlSfePkWHUl6F+5IhI2lPyXrxt/bOy/sB2Y GWNup+3DZqQxCK9M9h6tR0PiALNBA6Cxi6y/GhVmkrndVh+1Jh+YVq1MkV22Yo+0iNvfbXM/ufu vCMeUttxyapm8HoN+Mh97J677pjmJ73FB+t4DJA8DlO1jhsCglCaGEPdV0wMiEOyoo7IIlW1xdP f0YZ8sYKiUfs9VaIP++11pDbIfFOLt7o2xov2ixjTFp5jqx9ZO3lLbEWDaW1EXfsQHgQnqngrNx /mpK9UJQV9J/N+VITqc0t4h7MWSt3AZ8ylROAAvRVr+BEZh1HLatmmkouHxO6tB44T7KMe84ToW Kq+S7wVpVYeg8Y9tDEkY8+8h4ME7fxqCU0eYK2FShgkVSZpBFXcbSoPpE1+pf+kLyxrJ85iOpGW Arf0TXoKpDQvqOhg1vQ== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-28_08,2025-12-26_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 spamscore=0 lowpriorityscore=0 adultscore=0 impostorscore=0 phishscore=0 bulkscore=0 clxscore=1015 malwarescore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2512290021 Content-Type: text/plain; charset="utf-8" Use the new common CCI register access helpers to replace the private register access helpers in the ov5647 driver. This simplifies the driver by reducing the amount of code. Signed-off-by: Xiaolei Wang --- drivers/media/i2c/Kconfig | 1 + drivers/media/i2c/ov5647.c | 997 +++++++++++++++++-------------------- 2 files changed, 453 insertions(+), 545 deletions(-) diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig index 4b4db8c4f496..cce63349e71e 100644 --- a/drivers/media/i2c/Kconfig +++ b/drivers/media/i2c/Kconfig @@ -529,6 +529,7 @@ config VIDEO_OV5645 =20 config VIDEO_OV5647 tristate "OmniVision OV5647 sensor support" + select V4L2_CCI_I2C help This is a Video4Linux2 sensor driver for the OmniVision OV5647 camera. diff --git a/drivers/media/i2c/ov5647.c b/drivers/media/i2c/ov5647.c index e193fef4fced..fd69f1616794 100644 --- a/drivers/media/i2c/ov5647.c +++ b/drivers/media/i2c/ov5647.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -41,24 +42,19 @@ #define MIPI_CTRL00_BUS_IDLE BIT(2) #define MIPI_CTRL00_CLOCK_LANE_DISABLE BIT(0) =20 -#define OV5647_SW_STANDBY 0x0100 -#define OV5647_SW_RESET 0x0103 -#define OV5647_REG_CHIPID_H 0x300a -#define OV5647_REG_CHIPID_L 0x300b -#define OV5640_REG_PAD_OUT 0x300d -#define OV5647_REG_EXP_HI 0x3500 -#define OV5647_REG_EXP_MID 0x3501 -#define OV5647_REG_EXP_LO 0x3502 -#define OV5647_REG_AEC_AGC 0x3503 -#define OV5647_REG_GAIN_HI 0x350a -#define OV5647_REG_GAIN_LO 0x350b -#define OV5647_REG_VTS_HI 0x380e -#define OV5647_REG_VTS_LO 0x380f -#define OV5647_REG_FRAME_OFF_NUMBER 0x4202 -#define OV5647_REG_MIPI_CTRL00 0x4800 -#define OV5647_REG_MIPI_CTRL14 0x4814 -#define OV5647_REG_AWB 0x5001 -#define OV5647_REG_ISPCTRL3D 0x503d +#define OV5647_SW_STANDBY CCI_REG8(0x0100) +#define OV5647_SW_RESET CCI_REG8(0x0103) +#define OV5647_REG_CHIPID CCI_REG16(0x300a) +#define OV5640_REG_PAD_OUT CCI_REG8(0x300d) +#define OV5647_REG_EXPOSURE CCI_REG24(0x3500) +#define OV5647_REG_AEC_AGC CCI_REG8(0x3503) +#define OV5647_REG_GAIN CCI_REG16(0x350b) +#define OV5647_REG_VTS CCI_REG16(0x380e) +#define OV5647_REG_FRAME_OFF_NUMBER CCI_REG8(0x4202) +#define OV5647_REG_MIPI_CTRL00 CCI_REG8(0x4800) +#define OV5647_REG_MIPI_CTRL14 CCI_REG8(0x4814) +#define OV5647_REG_AWB CCI_REG8(0x5001) +#define OV5647_REG_ISPCTRL3D CCI_REG8(0x503d) =20 #define REG_TERM 0xfffe #define VAL_TERM 0xfe @@ -81,23 +77,19 @@ #define OV5647_EXPOSURE_DEFAULT 1000 #define OV5647_EXPOSURE_MAX 65535 =20 -struct regval_list { - u16 addr; - u8 data; -}; - struct ov5647_mode { struct v4l2_mbus_framefmt format; struct v4l2_rect crop; u64 pixel_rate; int hts; int vts; - const struct regval_list *reg_list; + const struct cci_reg_sequence *reg_list; unsigned int num_regs; }; =20 struct ov5647 { struct v4l2_subdev sd; + struct regmap *regmap; struct media_pad pad; struct mutex lock; struct clk *xclk; @@ -130,377 +122,377 @@ static const u8 ov5647_test_pattern_val[] =3D { 0x81, /* Random Data */ }; =20 -static const struct regval_list sensor_oe_disable_regs[] =3D { - {0x3000, 0x00}, - {0x3001, 0x00}, - {0x3002, 0x00}, +static const struct cci_reg_sequence sensor_oe_disable_regs[] =3D { + { CCI_REG8(0x3000), 0x00 }, + { CCI_REG8(0x3001), 0x00 }, + { CCI_REG8(0x3002), 0x00 }, }; =20 -static const struct regval_list sensor_oe_enable_regs[] =3D { - {0x3000, 0x0f}, - {0x3001, 0xff}, - {0x3002, 0xe4}, +static const struct cci_reg_sequence sensor_oe_enable_regs[] =3D { + { CCI_REG8(0x3000), 0x0f }, + { CCI_REG8(0x3001), 0xff }, + { CCI_REG8(0x3002), 0xe4 }, }; =20 -static struct regval_list ov5647_2592x1944_10bpp[] =3D { - {0x0100, 0x00}, - {0x0103, 0x01}, - {0x3034, 0x1a}, - {0x3035, 0x21}, - {0x3036, 0x69}, - {0x303c, 0x11}, - {0x3106, 0xf5}, - {0x3821, 0x06}, - {0x3820, 0x00}, - {0x3827, 0xec}, - {0x370c, 0x03}, - {0x3612, 0x5b}, - {0x3618, 0x04}, - {0x5000, 0x06}, - {0x5002, 0x41}, - {0x5003, 0x08}, - {0x5a00, 0x08}, - {0x3000, 0x00}, - {0x3001, 0x00}, - {0x3002, 0x00}, - {0x3016, 0x08}, - {0x3017, 0xe0}, - {0x3018, 0x44}, - {0x301c, 0xf8}, - {0x301d, 0xf0}, - {0x3a18, 0x00}, - {0x3a19, 0xf8}, - {0x3c01, 0x80}, - {0x3b07, 0x0c}, - {0x380c, 0x0b}, - {0x380d, 0x1c}, - {0x3814, 0x11}, - {0x3815, 0x11}, - {0x3708, 0x64}, - {0x3709, 0x12}, - {0x3808, 0x0a}, - {0x3809, 0x20}, - {0x380a, 0x07}, - {0x380b, 0x98}, - {0x3800, 0x00}, - {0x3801, 0x00}, - {0x3802, 0x00}, - {0x3803, 0x00}, - {0x3804, 0x0a}, - {0x3805, 0x3f}, - {0x3806, 0x07}, - {0x3807, 0xa3}, - {0x3811, 0x10}, - {0x3813, 0x06}, - {0x3630, 0x2e}, - {0x3632, 0xe2}, - {0x3633, 0x23}, - {0x3634, 0x44}, - {0x3636, 0x06}, - {0x3620, 0x64}, - {0x3621, 0xe0}, - {0x3600, 0x37}, - {0x3704, 0xa0}, - {0x3703, 0x5a}, - {0x3715, 0x78}, - {0x3717, 0x01}, - {0x3731, 0x02}, - {0x370b, 0x60}, - {0x3705, 0x1a}, - {0x3f05, 0x02}, - {0x3f06, 0x10}, - {0x3f01, 0x0a}, - {0x3a08, 0x01}, - {0x3a09, 0x28}, - {0x3a0a, 0x00}, - {0x3a0b, 0xf6}, - {0x3a0d, 0x08}, - {0x3a0e, 0x06}, - {0x3a0f, 0x58}, - {0x3a10, 0x50}, - {0x3a1b, 0x58}, - {0x3a1e, 0x50}, - {0x3a11, 0x60}, - {0x3a1f, 0x28}, - {0x4001, 0x02}, - {0x4004, 0x04}, - {0x4000, 0x09}, - {0x4837, 0x19}, - {0x4800, 0x24}, - {0x3503, 0x03}, - {0x0100, 0x01}, +static const struct cci_reg_sequence ov5647_2592x1944_10bpp[] =3D { + { CCI_REG8(0x0100), 0x00 }, + { CCI_REG8(0x0103), 0x01 }, + { CCI_REG8(0x3034), 0x1a }, + { CCI_REG8(0x3035), 0x21 }, + { CCI_REG8(0x3036), 0x69 }, + { CCI_REG8(0x303c), 0x11 }, + { CCI_REG8(0x3106), 0xf5 }, + { CCI_REG8(0x3821), 0x06 }, + { CCI_REG8(0x3820), 0x00 }, + { CCI_REG8(0x3827), 0xec }, + { CCI_REG8(0x370c), 0x03 }, + { CCI_REG8(0x3612), 0x5b }, + { CCI_REG8(0x3618), 0x04 }, + { CCI_REG8(0x5000), 0x06 }, + { CCI_REG8(0x5002), 0x41 }, + { CCI_REG8(0x5003), 0x08 }, + { CCI_REG8(0x5a00), 0x08 }, + { CCI_REG8(0x3000), 0x00 }, + { CCI_REG8(0x3001), 0x00 }, + { CCI_REG8(0x3002), 0x00 }, + { CCI_REG8(0x3016), 0x08 }, + { CCI_REG8(0x3017), 0xe0 }, + { CCI_REG8(0x3018), 0x44 }, + { CCI_REG8(0x301c), 0xf8 }, + { CCI_REG8(0x301d), 0xf0 }, + { CCI_REG8(0x3a18), 0x00 }, + { CCI_REG8(0x3a19), 0xf8 }, + { CCI_REG8(0x3c01), 0x80 }, + { CCI_REG8(0x3b07), 0x0c }, + { CCI_REG8(0x380c), 0x0b }, + { CCI_REG8(0x380d), 0x1c }, + { CCI_REG8(0x3814), 0x11 }, + { CCI_REG8(0x3815), 0x11 }, + { CCI_REG8(0x3708), 0x64 }, + { CCI_REG8(0x3709), 0x12 }, + { CCI_REG8(0x3808), 0x0a }, + { CCI_REG8(0x3809), 0x20 }, + { CCI_REG8(0x380a), 0x07 }, + { CCI_REG8(0x380b), 0x98 }, + { CCI_REG8(0x3800), 0x00 }, + { CCI_REG8(0x3801), 0x00 }, + { CCI_REG8(0x3802), 0x00 }, + { CCI_REG8(0x3803), 0x00 }, + { CCI_REG8(0x3804), 0x0a }, + { CCI_REG8(0x3805), 0x3f }, + { CCI_REG8(0x3806), 0x07 }, + { CCI_REG8(0x3807), 0xa3 }, + { CCI_REG8(0x3811), 0x10 }, + { CCI_REG8(0x3813), 0x06 }, + { CCI_REG8(0x3630), 0x2e }, + { CCI_REG8(0x3632), 0xe2 }, + { CCI_REG8(0x3633), 0x23 }, + { CCI_REG8(0x3634), 0x44 }, + { CCI_REG8(0x3636), 0x06 }, + { CCI_REG8(0x3620), 0x64 }, + { CCI_REG8(0x3621), 0xe0 }, + { CCI_REG8(0x3600), 0x37 }, + { CCI_REG8(0x3704), 0xa0 }, + { CCI_REG8(0x3703), 0x5a }, + { CCI_REG8(0x3715), 0x78 }, + { CCI_REG8(0x3717), 0x01 }, + { CCI_REG8(0x3731), 0x02 }, + { CCI_REG8(0x370b), 0x60 }, + { CCI_REG8(0x3705), 0x1a }, + { CCI_REG8(0x3f05), 0x02 }, + { CCI_REG8(0x3f06), 0x10 }, + { CCI_REG8(0x3f01), 0x0a }, + { CCI_REG8(0x3a08), 0x01 }, + { CCI_REG8(0x3a09), 0x28 }, + { CCI_REG8(0x3a0a), 0x00 }, + { CCI_REG8(0x3a0b), 0xf6 }, + { CCI_REG8(0x3a0d), 0x08 }, + { CCI_REG8(0x3a0e), 0x06 }, + { CCI_REG8(0x3a0f), 0x58 }, + { CCI_REG8(0x3a10), 0x50 }, + { CCI_REG8(0x3a1b), 0x58 }, + { CCI_REG8(0x3a1e), 0x50 }, + { CCI_REG8(0x3a11), 0x60 }, + { CCI_REG8(0x3a1f), 0x28 }, + { CCI_REG8(0x4001), 0x02 }, + { CCI_REG8(0x4004), 0x04 }, + { CCI_REG8(0x4000), 0x09 }, + { CCI_REG8(0x4837), 0x19 }, + { CCI_REG8(0x4800), 0x24 }, + { CCI_REG8(0x3503), 0x03 }, + { CCI_REG8(0x0100), 0x01 }, }; =20 -static struct regval_list ov5647_1080p30_10bpp[] =3D { - {0x0100, 0x00}, - {0x0103, 0x01}, - {0x3034, 0x1a}, - {0x3035, 0x21}, - {0x3036, 0x62}, - {0x303c, 0x11}, - {0x3106, 0xf5}, - {0x3821, 0x06}, - {0x3820, 0x00}, - {0x3827, 0xec}, - {0x370c, 0x03}, - {0x3612, 0x5b}, - {0x3618, 0x04}, - {0x5000, 0x06}, - {0x5002, 0x41}, - {0x5003, 0x08}, - {0x5a00, 0x08}, - {0x3000, 0x00}, - {0x3001, 0x00}, - {0x3002, 0x00}, - {0x3016, 0x08}, - {0x3017, 0xe0}, - {0x3018, 0x44}, - {0x301c, 0xf8}, - {0x301d, 0xf0}, - {0x3a18, 0x00}, - {0x3a19, 0xf8}, - {0x3c01, 0x80}, - {0x3b07, 0x0c}, - {0x380c, 0x09}, - {0x380d, 0x70}, - {0x3814, 0x11}, - {0x3815, 0x11}, - {0x3708, 0x64}, - {0x3709, 0x12}, - {0x3808, 0x07}, - {0x3809, 0x80}, - {0x380a, 0x04}, - {0x380b, 0x38}, - {0x3800, 0x01}, - {0x3801, 0x5c}, - {0x3802, 0x01}, - {0x3803, 0xb2}, - {0x3804, 0x08}, - {0x3805, 0xe3}, - {0x3806, 0x05}, - {0x3807, 0xf1}, - {0x3811, 0x04}, - {0x3813, 0x02}, - {0x3630, 0x2e}, - {0x3632, 0xe2}, - {0x3633, 0x23}, - {0x3634, 0x44}, - {0x3636, 0x06}, - {0x3620, 0x64}, - {0x3621, 0xe0}, - {0x3600, 0x37}, - {0x3704, 0xa0}, - {0x3703, 0x5a}, - {0x3715, 0x78}, - {0x3717, 0x01}, - {0x3731, 0x02}, - {0x370b, 0x60}, - {0x3705, 0x1a}, - {0x3f05, 0x02}, - {0x3f06, 0x10}, - {0x3f01, 0x0a}, - {0x3a08, 0x01}, - {0x3a09, 0x4b}, - {0x3a0a, 0x01}, - {0x3a0b, 0x13}, - {0x3a0d, 0x04}, - {0x3a0e, 0x03}, - {0x3a0f, 0x58}, - {0x3a10, 0x50}, - {0x3a1b, 0x58}, - {0x3a1e, 0x50}, - {0x3a11, 0x60}, - {0x3a1f, 0x28}, - {0x4001, 0x02}, - {0x4004, 0x04}, - {0x4000, 0x09}, - {0x4837, 0x19}, - {0x4800, 0x34}, - {0x3503, 0x03}, - {0x0100, 0x01}, +static const struct cci_reg_sequence ov5647_1080p30_10bpp[] =3D { + { CCI_REG8(0x0100), 0x00 }, + { CCI_REG8(0x0103), 0x01 }, + { CCI_REG8(0x3034), 0x1a }, + { CCI_REG8(0x3035), 0x21 }, + { CCI_REG8(0x3036), 0x62 }, + { CCI_REG8(0x303c), 0x11 }, + { CCI_REG8(0x3106), 0xf5 }, + { CCI_REG8(0x3821), 0x06 }, + { CCI_REG8(0x3820), 0x00 }, + { CCI_REG8(0x3827), 0xec }, + { CCI_REG8(0x370c), 0x03 }, + { CCI_REG8(0x3612), 0x5b }, + { CCI_REG8(0x3618), 0x04 }, + { CCI_REG8(0x5000), 0x06 }, + { CCI_REG8(0x5002), 0x41 }, + { CCI_REG8(0x5003), 0x08 }, + { CCI_REG8(0x5a00), 0x08 }, + { CCI_REG8(0x3000), 0x00 }, + { CCI_REG8(0x3001), 0x00 }, + { CCI_REG8(0x3002), 0x00 }, + { CCI_REG8(0x3016), 0x08 }, + { CCI_REG8(0x3017), 0xe0 }, + { CCI_REG8(0x3018), 0x44 }, + { CCI_REG8(0x301c), 0xf8 }, + { CCI_REG8(0x301d), 0xf0 }, + { CCI_REG8(0x3a18), 0x00 }, + { CCI_REG8(0x3a19), 0xf8 }, + { CCI_REG8(0x3c01), 0x80 }, + { CCI_REG8(0x3b07), 0x0c }, + { CCI_REG8(0x380c), 0x09 }, + { CCI_REG8(0x380d), 0x70 }, + { CCI_REG8(0x3814), 0x11 }, + { CCI_REG8(0x3815), 0x11 }, + { CCI_REG8(0x3708), 0x64 }, + { CCI_REG8(0x3709), 0x12 }, + { CCI_REG8(0x3808), 0x07 }, + { CCI_REG8(0x3809), 0x80 }, + { CCI_REG8(0x380a), 0x04 }, + { CCI_REG8(0x380b), 0x38 }, + { CCI_REG8(0x3800), 0x01 }, + { CCI_REG8(0x3801), 0x5c }, + { CCI_REG8(0x3802), 0x01 }, + { CCI_REG8(0x3803), 0xb2 }, + { CCI_REG8(0x3804), 0x08 }, + { CCI_REG8(0x3805), 0xe3 }, + { CCI_REG8(0x3806), 0x05 }, + { CCI_REG8(0x3807), 0xf1 }, + { CCI_REG8(0x3811), 0x04 }, + { CCI_REG8(0x3813), 0x02 }, + { CCI_REG8(0x3630), 0x2e }, + { CCI_REG8(0x3632), 0xe2 }, + { CCI_REG8(0x3633), 0x23 }, + { CCI_REG8(0x3634), 0x44 }, + { CCI_REG8(0x3636), 0x06 }, + { CCI_REG8(0x3620), 0x64 }, + { CCI_REG8(0x3621), 0xe0 }, + { CCI_REG8(0x3600), 0x37 }, + { CCI_REG8(0x3704), 0xa0 }, + { CCI_REG8(0x3703), 0x5a }, + { CCI_REG8(0x3715), 0x78 }, + { CCI_REG8(0x3717), 0x01 }, + { CCI_REG8(0x3731), 0x02 }, + { CCI_REG8(0x370b), 0x60 }, + { CCI_REG8(0x3705), 0x1a }, + { CCI_REG8(0x3f05), 0x02 }, + { CCI_REG8(0x3f06), 0x10 }, + { CCI_REG8(0x3f01), 0x0a }, + { CCI_REG8(0x3a08), 0x01 }, + { CCI_REG8(0x3a09), 0x4b }, + { CCI_REG8(0x3a0a), 0x01 }, + { CCI_REG8(0x3a0b), 0x13 }, + { CCI_REG8(0x3a0d), 0x04 }, + { CCI_REG8(0x3a0e), 0x03 }, + { CCI_REG8(0x3a0f), 0x58 }, + { CCI_REG8(0x3a10), 0x50 }, + { CCI_REG8(0x3a1b), 0x58 }, + { CCI_REG8(0x3a1e), 0x50 }, + { CCI_REG8(0x3a11), 0x60 }, + { CCI_REG8(0x3a1f), 0x28 }, + { CCI_REG8(0x4001), 0x02 }, + { CCI_REG8(0x4004), 0x04 }, + { CCI_REG8(0x4000), 0x09 }, + { CCI_REG8(0x4837), 0x19 }, + { CCI_REG8(0x4800), 0x34 }, + { CCI_REG8(0x3503), 0x03 }, + { CCI_REG8(0x0100), 0x01 }, }; =20 -static struct regval_list ov5647_2x2binned_10bpp[] =3D { - {0x0100, 0x00}, - {0x0103, 0x01}, - {0x3034, 0x1a}, - {0x3035, 0x21}, - {0x3036, 0x62}, - {0x303c, 0x11}, - {0x3106, 0xf5}, - {0x3827, 0xec}, - {0x370c, 0x03}, - {0x3612, 0x59}, - {0x3618, 0x00}, - {0x5000, 0x06}, - {0x5002, 0x41}, - {0x5003, 0x08}, - {0x5a00, 0x08}, - {0x3000, 0x00}, - {0x3001, 0x00}, - {0x3002, 0x00}, - {0x3016, 0x08}, - {0x3017, 0xe0}, - {0x3018, 0x44}, - {0x301c, 0xf8}, - {0x301d, 0xf0}, - {0x3a18, 0x00}, - {0x3a19, 0xf8}, - {0x3c01, 0x80}, - {0x3b07, 0x0c}, - {0x3800, 0x00}, - {0x3801, 0x00}, - {0x3802, 0x00}, - {0x3803, 0x00}, - {0x3804, 0x0a}, - {0x3805, 0x3f}, - {0x3806, 0x07}, - {0x3807, 0xa3}, - {0x3808, 0x05}, - {0x3809, 0x10}, - {0x380a, 0x03}, - {0x380b, 0xcc}, - {0x380c, 0x07}, - {0x380d, 0x68}, - {0x3811, 0x0c}, - {0x3813, 0x06}, - {0x3814, 0x31}, - {0x3815, 0x31}, - {0x3630, 0x2e}, - {0x3632, 0xe2}, - {0x3633, 0x23}, - {0x3634, 0x44}, - {0x3636, 0x06}, - {0x3620, 0x64}, - {0x3621, 0xe0}, - {0x3600, 0x37}, - {0x3704, 0xa0}, - {0x3703, 0x5a}, - {0x3715, 0x78}, - {0x3717, 0x01}, - {0x3731, 0x02}, - {0x370b, 0x60}, - {0x3705, 0x1a}, - {0x3f05, 0x02}, - {0x3f06, 0x10}, - {0x3f01, 0x0a}, - {0x3a08, 0x01}, - {0x3a09, 0x28}, - {0x3a0a, 0x00}, - {0x3a0b, 0xf6}, - {0x3a0d, 0x08}, - {0x3a0e, 0x06}, - {0x3a0f, 0x58}, - {0x3a10, 0x50}, - {0x3a1b, 0x58}, - {0x3a1e, 0x50}, - {0x3a11, 0x60}, - {0x3a1f, 0x28}, - {0x4001, 0x02}, - {0x4004, 0x04}, - {0x4000, 0x09}, - {0x4837, 0x16}, - {0x4800, 0x24}, - {0x3503, 0x03}, - {0x3820, 0x41}, - {0x3821, 0x07}, - {0x350a, 0x00}, - {0x350b, 0x10}, - {0x3500, 0x00}, - {0x3501, 0x1a}, - {0x3502, 0xf0}, - {0x3212, 0xa0}, - {0x0100, 0x01}, +static const struct cci_reg_sequence ov5647_2x2binned_10bpp[] =3D { + { CCI_REG8(0x0100), 0x00 }, + { CCI_REG8(0x0103), 0x01 }, + { CCI_REG8(0x3034), 0x1a }, + { CCI_REG8(0x3035), 0x21 }, + { CCI_REG8(0x3036), 0x62 }, + { CCI_REG8(0x303c), 0x11 }, + { CCI_REG8(0x3106), 0xf5 }, + { CCI_REG8(0x3827), 0xec }, + { CCI_REG8(0x370c), 0x03 }, + { CCI_REG8(0x3612), 0x59 }, + { CCI_REG8(0x3618), 0x00 }, + { CCI_REG8(0x5000), 0x06 }, + { CCI_REG8(0x5002), 0x41 }, + { CCI_REG8(0x5003), 0x08 }, + { CCI_REG8(0x5a00), 0x08 }, + { CCI_REG8(0x3000), 0x00 }, + { CCI_REG8(0x3001), 0x00 }, + { CCI_REG8(0x3002), 0x00 }, + { CCI_REG8(0x3016), 0x08 }, + { CCI_REG8(0x3017), 0xe0 }, + { CCI_REG8(0x3018), 0x44 }, + { CCI_REG8(0x301c), 0xf8 }, + { CCI_REG8(0x301d), 0xf0 }, + { CCI_REG8(0x3a18), 0x00 }, + { CCI_REG8(0x3a19), 0xf8 }, + { CCI_REG8(0x3c01), 0x80 }, + { CCI_REG8(0x3b07), 0x0c }, + { CCI_REG8(0x3800), 0x00 }, + { CCI_REG8(0x3801), 0x00 }, + { CCI_REG8(0x3802), 0x00 }, + { CCI_REG8(0x3803), 0x00 }, + { CCI_REG8(0x3804), 0x0a }, + { CCI_REG8(0x3805), 0x3f }, + { CCI_REG8(0x3806), 0x07 }, + { CCI_REG8(0x3807), 0xa3 }, + { CCI_REG8(0x3808), 0x05 }, + { CCI_REG8(0x3809), 0x10 }, + { CCI_REG8(0x380a), 0x03 }, + { CCI_REG8(0x380b), 0xcc }, + { CCI_REG8(0x380c), 0x07 }, + { CCI_REG8(0x380d), 0x68 }, + { CCI_REG8(0x3811), 0x0c }, + { CCI_REG8(0x3813), 0x06 }, + { CCI_REG8(0x3814), 0x31 }, + { CCI_REG8(0x3815), 0x31 }, + { CCI_REG8(0x3630), 0x2e }, + { CCI_REG8(0x3632), 0xe2 }, + { CCI_REG8(0x3633), 0x23 }, + { CCI_REG8(0x3634), 0x44 }, + { CCI_REG8(0x3636), 0x06 }, + { CCI_REG8(0x3620), 0x64 }, + { CCI_REG8(0x3621), 0xe0 }, + { CCI_REG8(0x3600), 0x37 }, + { CCI_REG8(0x3704), 0xa0 }, + { CCI_REG8(0x3703), 0x5a }, + { CCI_REG8(0x3715), 0x78 }, + { CCI_REG8(0x3717), 0x01 }, + { CCI_REG8(0x3731), 0x02 }, + { CCI_REG8(0x370b), 0x60 }, + { CCI_REG8(0x3705), 0x1a }, + { CCI_REG8(0x3f05), 0x02 }, + { CCI_REG8(0x3f06), 0x10 }, + { CCI_REG8(0x3f01), 0x0a }, + { CCI_REG8(0x3a08), 0x01 }, + { CCI_REG8(0x3a09), 0x28 }, + { CCI_REG8(0x3a0a), 0x00 }, + { CCI_REG8(0x3a0b), 0xf6 }, + { CCI_REG8(0x3a0d), 0x08 }, + { CCI_REG8(0x3a0e), 0x06 }, + { CCI_REG8(0x3a0f), 0x58 }, + { CCI_REG8(0x3a10), 0x50 }, + { CCI_REG8(0x3a1b), 0x58 }, + { CCI_REG8(0x3a1e), 0x50 }, + { CCI_REG8(0x3a11), 0x60 }, + { CCI_REG8(0x3a1f), 0x28 }, + { CCI_REG8(0x4001), 0x02 }, + { CCI_REG8(0x4004), 0x04 }, + { CCI_REG8(0x4000), 0x09 }, + { CCI_REG8(0x4837), 0x16 }, + { CCI_REG8(0x4800), 0x24 }, + { CCI_REG8(0x3503), 0x03 }, + { CCI_REG8(0x3820), 0x41 }, + { CCI_REG8(0x3821), 0x07 }, + { CCI_REG8(0x350a), 0x00 }, + { CCI_REG8(0x350b), 0x10 }, + { CCI_REG8(0x3500), 0x00 }, + { CCI_REG8(0x3501), 0x1a }, + { CCI_REG8(0x3502), 0xf0 }, + { CCI_REG8(0x3212), 0xa0 }, + { CCI_REG8(0x0100), 0x01 }, }; =20 -static struct regval_list ov5647_640x480_10bpp[] =3D { - {0x0100, 0x00}, - {0x0103, 0x01}, - {0x3035, 0x11}, - {0x3036, 0x46}, - {0x303c, 0x11}, - {0x3821, 0x07}, - {0x3820, 0x41}, - {0x370c, 0x03}, - {0x3612, 0x59}, - {0x3618, 0x00}, - {0x5000, 0x06}, - {0x5003, 0x08}, - {0x5a00, 0x08}, - {0x3000, 0xff}, - {0x3001, 0xff}, - {0x3002, 0xff}, - {0x301d, 0xf0}, - {0x3a18, 0x00}, - {0x3a19, 0xf8}, - {0x3c01, 0x80}, - {0x3b07, 0x0c}, - {0x380c, 0x07}, - {0x380d, 0x3c}, - {0x3814, 0x35}, - {0x3815, 0x35}, - {0x3708, 0x64}, - {0x3709, 0x52}, - {0x3808, 0x02}, - {0x3809, 0x80}, - {0x380a, 0x01}, - {0x380b, 0xe0}, - {0x3800, 0x00}, - {0x3801, 0x10}, - {0x3802, 0x00}, - {0x3803, 0x00}, - {0x3804, 0x0a}, - {0x3805, 0x2f}, - {0x3806, 0x07}, - {0x3807, 0x9f}, - {0x3630, 0x2e}, - {0x3632, 0xe2}, - {0x3633, 0x23}, - {0x3634, 0x44}, - {0x3620, 0x64}, - {0x3621, 0xe0}, - {0x3600, 0x37}, - {0x3704, 0xa0}, - {0x3703, 0x5a}, - {0x3715, 0x78}, - {0x3717, 0x01}, - {0x3731, 0x02}, - {0x370b, 0x60}, - {0x3705, 0x1a}, - {0x3f05, 0x02}, - {0x3f06, 0x10}, - {0x3f01, 0x0a}, - {0x3a08, 0x01}, - {0x3a09, 0x2e}, - {0x3a0a, 0x00}, - {0x3a0b, 0xfb}, - {0x3a0d, 0x02}, - {0x3a0e, 0x01}, - {0x3a0f, 0x58}, - {0x3a10, 0x50}, - {0x3a1b, 0x58}, - {0x3a1e, 0x50}, - {0x3a11, 0x60}, - {0x3a1f, 0x28}, - {0x4001, 0x02}, - {0x4004, 0x02}, - {0x4000, 0x09}, - {0x3000, 0x00}, - {0x3001, 0x00}, - {0x3002, 0x00}, - {0x3017, 0xe0}, - {0x301c, 0xfc}, - {0x3636, 0x06}, - {0x3016, 0x08}, - {0x3827, 0xec}, - {0x3018, 0x44}, - {0x3035, 0x21}, - {0x3106, 0xf5}, - {0x3034, 0x1a}, - {0x301c, 0xf8}, - {0x4800, 0x34}, - {0x3503, 0x03}, - {0x0100, 0x01}, +static const struct cci_reg_sequence ov5647_640x480_10bpp[] =3D { + { CCI_REG8(0x0100), 0x00 }, + { CCI_REG8(0x0103), 0x01 }, + { CCI_REG8(0x3035), 0x11 }, + { CCI_REG8(0x3036), 0x46 }, + { CCI_REG8(0x303c), 0x11 }, + { CCI_REG8(0x3821), 0x07 }, + { CCI_REG8(0x3820), 0x41 }, + { CCI_REG8(0x370c), 0x03 }, + { CCI_REG8(0x3612), 0x59 }, + { CCI_REG8(0x3618), 0x00 }, + { CCI_REG8(0x5000), 0x06 }, + { CCI_REG8(0x5003), 0x08 }, + { CCI_REG8(0x5a00), 0x08 }, + { CCI_REG8(0x3000), 0xff }, + { CCI_REG8(0x3001), 0xff }, + { CCI_REG8(0x3002), 0xff }, + { CCI_REG8(0x301d), 0xf0 }, + { CCI_REG8(0x3a18), 0x00 }, + { CCI_REG8(0x3a19), 0xf8 }, + { CCI_REG8(0x3c01), 0x80 }, + { CCI_REG8(0x3b07), 0x0c }, + { CCI_REG8(0x380c), 0x07 }, + { CCI_REG8(0x380d), 0x3c }, + { CCI_REG8(0x3814), 0x35 }, + { CCI_REG8(0x3815), 0x35 }, + { CCI_REG8(0x3708), 0x64 }, + { CCI_REG8(0x3709), 0x52 }, + { CCI_REG8(0x3808), 0x02 }, + { CCI_REG8(0x3809), 0x80 }, + { CCI_REG8(0x380a), 0x01 }, + { CCI_REG8(0x380b), 0xe0 }, + { CCI_REG8(0x3800), 0x00 }, + { CCI_REG8(0x3801), 0x10 }, + { CCI_REG8(0x3802), 0x00 }, + { CCI_REG8(0x3803), 0x00 }, + { CCI_REG8(0x3804), 0x0a }, + { CCI_REG8(0x3805), 0x2f }, + { CCI_REG8(0x3806), 0x07 }, + { CCI_REG8(0x3807), 0x9f }, + { CCI_REG8(0x3630), 0x2e }, + { CCI_REG8(0x3632), 0xe2 }, + { CCI_REG8(0x3633), 0x23 }, + { CCI_REG8(0x3634), 0x44 }, + { CCI_REG8(0x3620), 0x64 }, + { CCI_REG8(0x3621), 0xe0 }, + { CCI_REG8(0x3600), 0x37 }, + { CCI_REG8(0x3704), 0xa0 }, + { CCI_REG8(0x3703), 0x5a }, + { CCI_REG8(0x3715), 0x78 }, + { CCI_REG8(0x3717), 0x01 }, + { CCI_REG8(0x3731), 0x02 }, + { CCI_REG8(0x370b), 0x60 }, + { CCI_REG8(0x3705), 0x1a }, + { CCI_REG8(0x3f05), 0x02 }, + { CCI_REG8(0x3f06), 0x10 }, + { CCI_REG8(0x3f01), 0x0a }, + { CCI_REG8(0x3a08), 0x01 }, + { CCI_REG8(0x3a09), 0x2e }, + { CCI_REG8(0x3a0a), 0x00 }, + { CCI_REG8(0x3a0b), 0xfb }, + { CCI_REG8(0x3a0d), 0x02 }, + { CCI_REG8(0x3a0e), 0x01 }, + { CCI_REG8(0x3a0f), 0x58 }, + { CCI_REG8(0x3a10), 0x50 }, + { CCI_REG8(0x3a1b), 0x58 }, + { CCI_REG8(0x3a1e), 0x50 }, + { CCI_REG8(0x3a11), 0x60 }, + { CCI_REG8(0x3a1f), 0x28 }, + { CCI_REG8(0x4001), 0x02 }, + { CCI_REG8(0x4004), 0x02 }, + { CCI_REG8(0x4000), 0x09 }, + { CCI_REG8(0x3000), 0x00 }, + { CCI_REG8(0x3001), 0x00 }, + { CCI_REG8(0x3002), 0x00 }, + { CCI_REG8(0x3017), 0xe0 }, + { CCI_REG8(0x301c), 0xfc }, + { CCI_REG8(0x3636), 0x06 }, + { CCI_REG8(0x3016), 0x08 }, + { CCI_REG8(0x3827), 0xec }, + { CCI_REG8(0x3018), 0x44 }, + { CCI_REG8(0x3035), 0x21 }, + { CCI_REG8(0x3106), 0xf5 }, + { CCI_REG8(0x3034), 0x1a }, + { CCI_REG8(0x301c), 0xf8 }, + { CCI_REG8(0x4800), 0x34 }, + { CCI_REG8(0x3503), 0x03 }, + { CCI_REG8(0x0100), 0x01 }, }; =20 static const struct ov5647_mode ov5647_modes[] =3D { @@ -594,109 +586,35 @@ static const struct ov5647_mode ov5647_modes[] =3D { #define OV5647_DEFAULT_MODE (&ov5647_modes[3]) #define OV5647_DEFAULT_FORMAT (ov5647_modes[3].format) =20 -static int ov5647_write16(struct v4l2_subdev *sd, u16 reg, u16 val) -{ - unsigned char data[4] =3D { reg >> 8, reg & 0xff, val >> 8, val & 0xff}; - struct i2c_client *client =3D v4l2_get_subdevdata(sd); - int ret; - - ret =3D i2c_master_send(client, data, 4); - if (ret < 0) { - dev_dbg(&client->dev, "%s: i2c write error, reg: %x\n", - __func__, reg); - return ret; - } - - return 0; -} - -static int ov5647_write(struct v4l2_subdev *sd, u16 reg, u8 val) -{ - unsigned char data[3] =3D { reg >> 8, reg & 0xff, val}; - struct i2c_client *client =3D v4l2_get_subdevdata(sd); - int ret; - - ret =3D i2c_master_send(client, data, 3); - if (ret < 0) { - dev_dbg(&client->dev, "%s: i2c write error, reg: %x\n", - __func__, reg); - return ret; - } - - return 0; -} - -static int ov5647_read(struct v4l2_subdev *sd, u16 reg, u8 *val) -{ - struct i2c_client *client =3D v4l2_get_subdevdata(sd); - u8 buf[2] =3D { reg >> 8, reg & 0xff }; - struct i2c_msg msg[2]; - int ret; - - msg[0].addr =3D client->addr; - msg[0].flags =3D client->flags; - msg[0].buf =3D buf; - msg[0].len =3D sizeof(buf); - - msg[1].addr =3D client->addr; - msg[1].flags =3D client->flags | I2C_M_RD; - msg[1].buf =3D buf; - msg[1].len =3D 1; - - ret =3D i2c_transfer(client->adapter, msg, 2); - if (ret !=3D 2) { - dev_err(&client->dev, "%s: i2c read error, reg: %x =3D %d\n", - __func__, reg, ret); - return ret >=3D 0 ? -EINVAL : ret; - } - - *val =3D buf[0]; - - return 0; -} - -static int ov5647_write_array(struct v4l2_subdev *sd, - const struct regval_list *regs, int array_size) -{ - int i, ret; - - for (i =3D 0; i < array_size; i++) { - ret =3D ov5647_write(sd, regs[i].addr, regs[i].data); - if (ret < 0) - return ret; - } - - return 0; -} - static int ov5647_set_virtual_channel(struct v4l2_subdev *sd, int channel) { - u8 channel_id; + struct ov5647 *sensor =3D to_sensor(sd); + u64 channel_id; int ret; =20 - ret =3D ov5647_read(sd, OV5647_REG_MIPI_CTRL14, &channel_id); + ret =3D cci_read(sensor->regmap, OV5647_REG_MIPI_CTRL14, &channel_id, NUL= L); if (ret < 0) return ret; =20 channel_id &=3D ~(3 << 6); =20 - return ov5647_write(sd, OV5647_REG_MIPI_CTRL14, - channel_id | (channel << 6)); + return cci_write(sensor->regmap, OV5647_REG_MIPI_CTRL14, + channel_id | (channel << 6), NULL); } =20 static int ov5647_set_mode(struct v4l2_subdev *sd) { struct i2c_client *client =3D v4l2_get_subdevdata(sd); struct ov5647 *sensor =3D to_sensor(sd); - u8 resetval, rdval; + u64 resetval, rdval; int ret; =20 - ret =3D ov5647_read(sd, OV5647_SW_STANDBY, &rdval); + ret =3D cci_read(sensor->regmap, OV5647_SW_STANDBY, &rdval, NULL); if (ret < 0) return ret; =20 - ret =3D ov5647_write_array(sd, sensor->mode->reg_list, - sensor->mode->num_regs); + ret =3D cci_multi_reg_write(sensor->regmap, sensor->mode->reg_list, + sensor->mode->num_regs, NULL); if (ret < 0) { dev_err(&client->dev, "write sensor default regs error\n"); return ret; @@ -706,13 +624,13 @@ static int ov5647_set_mode(struct v4l2_subdev *sd) if (ret < 0) return ret; =20 - ret =3D ov5647_read(sd, OV5647_SW_STANDBY, &resetval); + ret =3D cci_read(sensor->regmap, OV5647_SW_STANDBY, &resetval, NULL); if (ret < 0) return ret; =20 if (!(resetval & 0x01)) { dev_err(&client->dev, "Device was in SW standby"); - ret =3D ov5647_write(sd, OV5647_SW_STANDBY, 0x01); + ret =3D cci_write(sensor->regmap, OV5647_SW_STANDBY, 0x01, NULL); if (ret < 0) return ret; } @@ -725,7 +643,7 @@ static int ov5647_stream_on(struct v4l2_subdev *sd) struct i2c_client *client =3D v4l2_get_subdevdata(sd); struct ov5647 *sensor =3D to_sensor(sd); u8 val =3D MIPI_CTRL00_BUS_IDLE; - int ret; + int ret =3D 0; =20 ret =3D ov5647_set_mode(sd); if (ret) { @@ -742,32 +660,25 @@ static int ov5647_stream_on(struct v4l2_subdev *sd) val |=3D MIPI_CTRL00_CLOCK_LANE_GATE | MIPI_CTRL00_LINE_SYNC_ENABLE; =20 - ret =3D ov5647_write(sd, OV5647_REG_MIPI_CTRL00, val); - if (ret < 0) - return ret; - - ret =3D ov5647_write(sd, OV5647_REG_FRAME_OFF_NUMBER, 0x00); - if (ret < 0) - return ret; + cci_write(sensor->regmap, OV5647_REG_MIPI_CTRL00, val, &ret); + cci_write(sensor->regmap, OV5647_REG_FRAME_OFF_NUMBER, 0x00, &ret); + cci_write(sensor->regmap, OV5640_REG_PAD_OUT, 0x00, &ret); =20 - return ov5647_write(sd, OV5640_REG_PAD_OUT, 0x00); + return ret; } =20 static int ov5647_stream_off(struct v4l2_subdev *sd) { - int ret; + struct ov5647 *sensor =3D to_sensor(sd); + int ret =3D 0; =20 - ret =3D ov5647_write(sd, OV5647_REG_MIPI_CTRL00, - MIPI_CTRL00_CLOCK_LANE_GATE | MIPI_CTRL00_BUS_IDLE | - MIPI_CTRL00_CLOCK_LANE_DISABLE); - if (ret < 0) - return ret; + cci_write(sensor->regmap, OV5647_REG_MIPI_CTRL00, + MIPI_CTRL00_CLOCK_LANE_GATE | MIPI_CTRL00_BUS_IDLE | + MIPI_CTRL00_CLOCK_LANE_DISABLE, &ret); + cci_write(sensor->regmap, OV5647_REG_FRAME_OFF_NUMBER, 0x0f, &ret); + cci_write(sensor->regmap, OV5640_REG_PAD_OUT, 0x01, &ret); =20 - ret =3D ov5647_write(sd, OV5647_REG_FRAME_OFF_NUMBER, 0x0f); - if (ret < 0) - return ret; - - return ov5647_write(sd, OV5640_REG_PAD_OUT, 0x01); + return ret; } =20 static int ov5647_power_on(struct device *dev) @@ -788,8 +699,8 @@ static int ov5647_power_on(struct device *dev) goto error_pwdn; } =20 - ret =3D ov5647_write_array(&sensor->sd, sensor_oe_enable_regs, - ARRAY_SIZE(sensor_oe_enable_regs)); + ret =3D cci_multi_reg_write(sensor->regmap, sensor_oe_enable_regs, + ARRAY_SIZE(sensor_oe_enable_regs), NULL); if (ret < 0) { dev_err(dev, "write sensor_oe_enable_regs error\n"); goto error_clk_disable; @@ -815,23 +726,23 @@ static int ov5647_power_on(struct device *dev) static int ov5647_power_off(struct device *dev) { struct ov5647 *sensor =3D dev_get_drvdata(dev); - u8 rdval; + u64 rdval; int ret; =20 dev_dbg(dev, "OV5647 power off\n"); =20 - ret =3D ov5647_write_array(&sensor->sd, sensor_oe_disable_regs, - ARRAY_SIZE(sensor_oe_disable_regs)); + ret =3D cci_multi_reg_write(sensor->regmap, sensor_oe_disable_regs, + ARRAY_SIZE(sensor_oe_disable_regs), NULL); if (ret < 0) dev_dbg(dev, "disable oe failed\n"); =20 /* Enter software standby */ - ret =3D ov5647_read(&sensor->sd, OV5647_SW_STANDBY, &rdval); + ret =3D cci_read(sensor->regmap, OV5647_SW_STANDBY, &rdval, NULL); if (ret < 0) dev_dbg(dev, "software standby failed\n"); =20 rdval &=3D ~0x01; - ret =3D ov5647_write(&sensor->sd, OV5647_SW_STANDBY, rdval); + ret =3D cci_write(sensor->regmap, OV5647_SW_STANDBY, rdval, NULL); if (ret < 0) dev_dbg(dev, "software standby failed\n"); =20 @@ -845,10 +756,11 @@ static int ov5647_power_off(struct device *dev) static int ov5647_sensor_get_register(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg) { + struct ov5647 *sensor =3D to_sensor(sd); int ret; - u8 val; + u64 val; =20 - ret =3D ov5647_read(sd, reg->reg & 0xff, &val); + ret =3D cci_read(sensor->regmap, reg->reg & 0xff, &val, NULL); if (ret < 0) return ret; =20 @@ -861,7 +773,9 @@ static int ov5647_sensor_get_register(struct v4l2_subde= v *sd, static int ov5647_sensor_set_register(struct v4l2_subdev *sd, const struct v4l2_dbg_register *reg) { - return ov5647_write(sd, reg->reg & 0xff, reg->val & 0xff); + struct ov5647 *sensor =3D to_sensor(sd); + + return cci_write(sensor->regmap, reg->reg & 0xff, reg->val & 0xff, NULL); } #endif =20 @@ -1089,33 +1003,27 @@ static const struct v4l2_subdev_ops ov5647_subdev_o= ps =3D { =20 static int ov5647_detect(struct v4l2_subdev *sd) { + struct ov5647 *sensor =3D to_sensor(sd); struct i2c_client *client =3D v4l2_get_subdevdata(sd); - u8 read; + u64 read; int ret; =20 - ret =3D ov5647_write(sd, OV5647_SW_RESET, 0x01); + ret =3D cci_write(sensor->regmap, OV5647_SW_RESET, 0x01, NULL); if (ret < 0) return ret; =20 - ret =3D ov5647_read(sd, OV5647_REG_CHIPID_H, &read); - if (ret < 0) - return ret; - - if (read !=3D 0x56) { - dev_err(&client->dev, "ID High expected 0x56 got %x", read); - return -ENODEV; - } - - ret =3D ov5647_read(sd, OV5647_REG_CHIPID_L, &read); + ret =3D cci_read(sensor->regmap, OV5647_REG_CHIPID, &read, NULL); if (ret < 0) - return ret; + return dev_err_probe(&client->dev, ret, + "failed to read chip id %x\n", + OV5647_REG_CHIPID); =20 - if (read !=3D 0x47) { - dev_err(&client->dev, "ID Low expected 0x47 got %x", read); + if (read !=3D 0x5647) { + dev_err(&client->dev, "Chip ID expected 0x5647 got 0x%llx", read); return -ENODEV; } =20 - return ov5647_write(sd, OV5647_SW_RESET, 0x00); + return cci_write(sensor->regmap, OV5647_SW_RESET, 0x00, NULL); } =20 static int ov5647_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) @@ -1140,70 +1048,62 @@ static const struct v4l2_subdev_internal_ops ov5647= _subdev_internal_ops =3D { =20 static int ov5647_s_auto_white_balance(struct v4l2_subdev *sd, u32 val) { - return ov5647_write(sd, OV5647_REG_AWB, val ? 1 : 0); + struct ov5647 *sensor =3D to_sensor(sd); + + return cci_write(sensor->regmap, OV5647_REG_AWB, val ? 1 : 0, NULL); } =20 static int ov5647_s_autogain(struct v4l2_subdev *sd, u32 val) { + struct ov5647 *sensor =3D to_sensor(sd); int ret; - u8 reg; + u64 reg; =20 /* Non-zero turns on AGC by clearing bit 1.*/ - ret =3D ov5647_read(sd, OV5647_REG_AEC_AGC, ®); + ret =3D cci_read(sensor->regmap, OV5647_REG_AEC_AGC, ®, NULL); if (ret) return ret; =20 - return ov5647_write(sd, OV5647_REG_AEC_AGC, val ? reg & ~BIT(1) - : reg | BIT(1)); + return cci_write(sensor->regmap, OV5647_REG_AEC_AGC, val ? reg & ~BIT(1) + : reg | BIT(1), NULL); } =20 static int ov5647_s_exposure_auto(struct v4l2_subdev *sd, u32 val) { + struct ov5647 *sensor =3D to_sensor(sd); int ret; - u8 reg; + u64 reg; =20 /* * Everything except V4L2_EXPOSURE_MANUAL turns on AEC by * clearing bit 0. */ - ret =3D ov5647_read(sd, OV5647_REG_AEC_AGC, ®); + ret =3D cci_read(sensor->regmap, OV5647_REG_AEC_AGC, ®, NULL); if (ret) return ret; =20 - return ov5647_write(sd, OV5647_REG_AEC_AGC, + return cci_write(sensor->regmap, OV5647_REG_AEC_AGC, val =3D=3D V4L2_EXPOSURE_MANUAL ? reg | BIT(0) - : reg & ~BIT(0)); + : reg & ~BIT(0), NULL); } =20 static int ov5647_s_analogue_gain(struct v4l2_subdev *sd, u32 val) { - int ret; + struct ov5647 *sensor =3D to_sensor(sd); =20 /* 10 bits of gain, 2 in the high register. */ - ret =3D ov5647_write(sd, OV5647_REG_GAIN_HI, (val >> 8) & 3); - if (ret) - return ret; - - return ov5647_write(sd, OV5647_REG_GAIN_LO, val & 0xff); + return cci_write(sensor->regmap, OV5647_REG_GAIN, val & 0x3ff, NULL); } =20 static int ov5647_s_exposure(struct v4l2_subdev *sd, u32 val) { - int ret; + struct ov5647 *sensor =3D to_sensor(sd); =20 /* * Sensor has 20 bits, but the bottom 4 bits are fractions of a line * which we leave as zero (and don't receive in "val"). */ - ret =3D ov5647_write(sd, OV5647_REG_EXP_HI, (val >> 12) & 0xf); - if (ret) - return ret; - - ret =3D ov5647_write(sd, OV5647_REG_EXP_MID, (val >> 4) & 0xff); - if (ret) - return ret; - - return ov5647_write(sd, OV5647_REG_EXP_LO, (val & 0xf) << 4); + return cci_write(sensor->regmap, OV5647_REG_EXPOSURE, val << 4, NULL); } =20 static int ov5647_s_ctrl(struct v4l2_ctrl *ctrl) @@ -1254,12 +1154,12 @@ static int ov5647_s_ctrl(struct v4l2_ctrl *ctrl) ret =3D ov5647_s_exposure(sd, ctrl->val); break; case V4L2_CID_VBLANK: - ret =3D ov5647_write16(sd, OV5647_REG_VTS_HI, - sensor->mode->format.height + ctrl->val); + ret =3D cci_write(sensor->regmap, OV5647_REG_VTS, + sensor->mode->format.height + ctrl->val, NULL); break; case V4L2_CID_TEST_PATTERN: - ret =3D ov5647_write(sd, OV5647_REG_ISPCTRL3D, - ov5647_test_pattern_val[ctrl->val]); + ret =3D cci_write(sensor->regmap, OV5647_REG_ISPCTRL3D, + ov5647_test_pattern_val[ctrl->val], NULL); break; =20 /* Read-only, but we adjust it based on mode. */ @@ -1435,6 +1335,13 @@ static int ov5647_probe(struct i2c_client *client) if (ret < 0) goto ctrl_handler_free; =20 + sensor->regmap =3D devm_cci_regmap_init_i2c(client, 16); + if (IS_ERR(sensor->regmap)) { + ret =3D PTR_ERR(sensor->regmap); + dev_err(dev, "failed to initialize CCI: %d\n", ret); + goto entity_cleanup; + } + ret =3D ov5647_power_on(dev); if (ret) goto entity_cleanup; --=20 2.43.0 From nobody Sun Feb 8 06:22:43 2026 Received: from mx0a-0064b401.pphosted.com (mx0a-0064b401.pphosted.com [205.220.166.238]) (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 81A893A1E66; Mon, 29 Dec 2025 02:31:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.166.238 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766975495; cv=fail; b=ak9P4BlhYKrHMLxYn38zMZTk9ZK2uUNwU3NOorVn8qqk5jAWEECaIgCXIU+3eNv1fOl/QQwYoG2Nno91S43z2lZl7AsPWbi8PWceedKX2nedRujBpKIyg51u1qsKonMYConCT5NSgDPyFgUlyfDOcdCMXWHOvInVntrKzJJPk4E= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766975495; c=relaxed/simple; bh=H1/JmXTVTWLbavEZr/rm4Mi4BspPkK0Kbi6PiljHewI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=AWO3blVB34NL8eNIdqI2OS79CYE/5p8h1yqmboYawIs9s2v/1sJaE5H1IoFGEND37a/bKNeREDCXYDnkcCz025aEOFB9bJBdDlF4cxp1W05zTGPH2fVBN2I/2HFtytLyN2bTy5szg0Ilg0kHNDAY8hEpPrzsTlGt3c348QJDrag= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=windriver.com; spf=pass smtp.mailfrom=windriver.com; dkim=pass (2048-bit key) header.d=windriver.com header.i=@windriver.com header.b=mMxiR1+a; arc=fail smtp.client-ip=205.220.166.238 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=windriver.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=windriver.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=windriver.com header.i=@windriver.com header.b="mMxiR1+a" Received: from pps.filterd (m0250809.ppops.net [127.0.0.1]) by mx0a-0064b401.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5BT1t1fL151482; Sun, 28 Dec 2025 18:31:12 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=windriver.com; h=cc:content-transfer-encoding:content-type:date:from :in-reply-to:message-id:mime-version:references:subject:to; s= PPS06212021; bh=YpdQfu9aunAyCccxatGyS3NEA0bSSx+fdUDjhr+oK38=; b= mMxiR1+a/xwckbx1WSV5rHcbUy4wC09+lugyx/c8ebnd1J1IOjeCslgqxGVKV2b9 Y9fYrlgZ/jdPO3IC7TD1QRLtTGoTKfyBauHG1P9dLfB/n75sxCQR8XElhuCjZ3Dh szDeb1NPMVbfYGgvVWdDP5Nw9SHYtlnJko3iV+qKSFStbQLX9Q/8Q0VfRjhnDw7R l05mkeE9uyudXQf85cffqd7WyQv7umLePHhF4Kilz50NVIhLCjyBjydu+8ir56iF oYh1QakfmZLvHFe1/V12+Bxc65AvCwcyxMW4EF2T03ZouClbAnrvzybDI+s1fW4R pifn7lxynnv/MbEE4Cr61w== Received: from co1pr03cu002.outbound.protection.outlook.com (mail-westus2azon11010026.outbound.protection.outlook.com [52.101.46.26]) by mx0a-0064b401.pphosted.com (PPS) with ESMTPS id 4bafuk901w-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Sun, 28 Dec 2025 18:31:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=sACj2AfcBhHHi+LoaxvFCP0iDwybAcOsdoCDsKWdfg0Sf+rzfz7ti8eitS2poJRqCZpYHdxBoCTRktk8Mm1JXVsWh5VIwHmGgi6Hx4c2bXBcpDmp7//CHL2IEvhDvuyK87Y9pbxpUGt2OtaiA8SZ8CofHM3NAvN8jGYuANoHA2js1p6YnPD4bb/48ojf2sj/Gjo4M1ljwsHoVoIhvA8XZnRQfTi0PPEpUJ3I4RNqFD/UBsi1HjQfhkAVXptWAFKpcPDKZJlFV32umSBdsNOpTE2xuTYrwAJhBADS3x3TpHEy1dDBF1BROymM7foJWrFMOCJ0AZvcGHr12gr5y4LFzw== 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=YpdQfu9aunAyCccxatGyS3NEA0bSSx+fdUDjhr+oK38=; b=HbKADlIShIkAZ82rAV2cI2e3ePAHE3GovMBeojL7FKrho5fGThc4ECB/PfICJ53txRVuWLwoacj3VgViOLtZBzTCrNOGd6vaRzExFnzITAuerL6Qw12dFSMQfmukkG158jTF+VAdLtzfWEjt7VwD0k7V6yzmAae0JiNMAaKRr/S1z/YeksagBfAqrDTJZxxGxtnQIutm7p+xCBOUq5DJdkr3mLFxkjmpYnFuGoQcVEWFwIZ1Htb1snATMvpEExbIKnDAZhVvSFXDI2O31LzM6r+wv1JDpyNOxLLT6ysI631/VXK8vC8lyMeg/qJiGrCwjd3KlzVxF0S9AXZE9z+3+Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=windriver.com; dmarc=pass action=none header.from=windriver.com; dkim=pass header.d=windriver.com; arc=none Received: from DS4PPFD667CEBB6.namprd11.prod.outlook.com (2603:10b6:f:fc02::53) by MW4PR11MB7103.namprd11.prod.outlook.com (2603:10b6:303:225::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9456.14; Mon, 29 Dec 2025 02:31:11 +0000 Received: from DS4PPFD667CEBB6.namprd11.prod.outlook.com ([fe80::56cb:3868:6b6c:193d]) by DS4PPFD667CEBB6.namprd11.prod.outlook.com ([fe80::56cb:3868:6b6c:193d%6]) with mapi id 15.20.9456.013; Mon, 29 Dec 2025 02:31:10 +0000 From: Xiaolei Wang To: laurent.pinchart@ideasonboard.com, sakari.ailus@linux.intel.com, dave.stevenson@raspberrypi.com, jacopo@jmondi.org, mchehab@kernel.org, prabhakar.mahadev-lad.rj@bp.renesas.com, hverkuil+cisco@kernel.org, johannes.goede@oss.qualcomm.com, hverkuil-cisco@xs4all.nl, jai.luthra@ideasonboard.com, xiaolei.wang@windriver.com Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 2/3] media: i2c: ov5647: Switch to using the sub-device state lock Date: Mon, 29 Dec 2025 10:30:17 +0800 Message-ID: <20251229023018.2933405-3-xiaolei.wang@windriver.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251229023018.2933405-1-xiaolei.wang@windriver.com> References: <20251229023018.2933405-1-xiaolei.wang@windriver.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SI1PR02CA0031.apcprd02.prod.outlook.com (2603:1096:4:1f6::11) To DS4PPFD667CEBB6.namprd11.prod.outlook.com (2603:10b6:f:fc02::53) 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: DS4PPFD667CEBB6:EE_|MW4PR11MB7103:EE_ X-MS-Office365-Filtering-Correlation-Id: 9801229a-8983-4e8c-fca5-08de4682542e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|7416014|376014|366016|1800799024|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?G0fAmD7QL/MmiO+TxzfVi3toYS6KP5T7C8Zkbo2xVLKLw7A35l55AgTe9nc/?= =?us-ascii?Q?636QDrIj1o4dxsLZLnTUVw05dPTTXYK1zfqPjx6gUAEW3Opd6yviKVdjXAgM?= =?us-ascii?Q?OZzIwnw1Qu0vDX2aT1pQz7mtUQMfH9sR7c57AiEuYB+Re6P1TjCuWj5LtDrP?= =?us-ascii?Q?6xU8bNNZ4hVOyRNxNJMfEjEYnPDq3poHpXBoWkXQOFYkG2nuwlEIzyCk/QLf?= =?us-ascii?Q?1ef8ZCQwPubkAnXQORra0SD3BD08BEowI1xqZfeVgTYJEBaS5DbpIeVWiGnR?= =?us-ascii?Q?9JM7PyNBVudTswrZIVZbe+4Mhff7sEqNl4084sKbBdRKa8P5d3ubKUXqHNbH?= =?us-ascii?Q?w+nir88RKPoZMxbSOGz2vCAnGZF8vNFV5hjHRU8/Bd37hJq4pjL/hMxCRVRP?= =?us-ascii?Q?weKhKBKTwOD8G47umnU+OU2/8Y1aw5RO7cqwuLDZzmDTgj5jnBAoyZ1/pEFd?= =?us-ascii?Q?+hC1o007GNRZUd66N1p9460lwUw2CCHplcfftGEfsbBB/xnDi5xcSXm7F933?= =?us-ascii?Q?IXqqK7DlWq9xAuXoltm/1UmDXahDW6XTi6q+18nW0QOcFFZ6AFBqCXrof7B5?= =?us-ascii?Q?YfpHUAvnGOYSpKB3LNq/RK8yflMgPVEG5w4HgJIynTAXTc8YFm74heau1T/S?= =?us-ascii?Q?FFSiH4IT9302fKJZMl0nkay5ewo6aSIzjIe3ZPtzDJFZMH0d7aDtodIcIeaD?= =?us-ascii?Q?VoCSngFvchAeSIoHkSEDfPqDxJk/JrMH+umaWB0T27a8VbkTjJNHhsPA+s1X?= =?us-ascii?Q?pzAVMHkEXBLv1csyj8MPs+SJS8ZllAoDtbNEyG9p0xXbMUAni4wtLVzyiEGL?= =?us-ascii?Q?fOksh9FTTcZrOdkLbMP/3E9BbwtzwqjwqN+fqaWVSdZKOWlFG39+1756+XcX?= =?us-ascii?Q?2yXr/PPFdvgU2f0RnwefCrGl82q6wtwt5JQZORf4q6XLTO0xdVy0zxPZq2i/?= =?us-ascii?Q?1LrtjsjgLeom8FmOpSc1TqBAbPRtQ3noGSX9rzYVKArSLPqzHWjYyWCZYsSI?= =?us-ascii?Q?W36uRQ36JL3VmOupkq8P9aln0C1KZi+MRfn8RIlcKV6p2N+cuT17zQ7lSvZe?= =?us-ascii?Q?VcYkpLJJy2wFCc0My+qMPrm2pomB8293Sefei4/VWcoKIRUu222MB2hcBdjZ?= =?us-ascii?Q?ERsxBrUVMbgDz0ctC5cs3CtLsviiYI1TgP0UpukO6ZVkcMcgUZCWjHCWdODU?= =?us-ascii?Q?eimslejunLLkMAhuCt5rYO2WE7aNqQJebPOEiWD931guSWRovaD0oxIsTvW9?= =?us-ascii?Q?g3scp4N6mdgLwv4T8qFsP4tBMMYxh5Pyad1Zoux8RpPW4Q0Mb6EkRV6JGuJn?= =?us-ascii?Q?hFyJxA7wBNRMXOPvpik7TNC9shMNL+49l9HqGJBRT1BAjRrhVQnvJI9YGH5K?= =?us-ascii?Q?xhsB9LMxkJLd4m2+XOF87AIqYU5kyeCy/TOIYoAige/W0SpNB1dWzHRxus1N?= =?us-ascii?Q?hn4VQnc+sI/xy3jBTdYr+CIY4rd/QsfytUMhXuDQ8f+lCGI0Y49WHWqHXprt?= =?us-ascii?Q?BWZBPM9mUaQOKes4imqKOp4SHZkjL4ZLeeFnxKepKYNS+vR1LeJ5DHnGig?= =?us-ascii?Q?=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS4PPFD667CEBB6.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(7416014)(376014)(366016)(1800799024)(38350700014)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?7tVb7Eet45/gGKw1L6gJTXY1g3yAfLsg7A85XHe2baurOZlYbggCDy4ysv8t?= =?us-ascii?Q?v/hKLaAbl07Y2o3VVOt3/Z8RqVheVFX8NwaijuFJwmvUBdL7JcCQhIgLT4U/?= =?us-ascii?Q?WVW/otSrMSXBFUserELq7YNzyyGVjFp0vK75zQZEfw+klcG7piscPC2Txb4g?= =?us-ascii?Q?KI2y3k1qyEHPdI/gM+ZSBOdRJQrZu7HZyGw3+ZoOZb2be8C4YYluM8oULDnn?= =?us-ascii?Q?+76lfQ7By652YuQAt8n43u3SYX6N361plvH0N7DYHhzzw5YBcyhHM1pWRl82?= =?us-ascii?Q?P5nilAubAhjlzoYoEt/o18QqhbGVjLjT1NxUQllNqqr1fHYhQGyv3MBDRFgE?= =?us-ascii?Q?6Ci+9+m+4bDYDtsV9FeGDFtud1y8rRjS3fGP71slDYX8X5CbiuXSGaDbUtzn?= =?us-ascii?Q?y7X1XPnQuFrqOfoQqiHdE6GW3gVjz4lQCmz3Hx3G5VK1Ld6zbJByEfQtgjTO?= =?us-ascii?Q?a+gxSgx9KpTxR7DM4ZNBMBwzh1Vb6yARtCEddv9A4zoIrkO+618FTq9ULvzz?= =?us-ascii?Q?xVtg4+e9TVJt48Xd6hMqhdYGGw9w+3uqS05ohwkrv044iHmIfSD2qeBEDlbt?= =?us-ascii?Q?j1qAWK1Dq8DiVl5LvOqPsewuq51TEN02gMZFBP/tMaIJHrNAKThJeFqzswSo?= =?us-ascii?Q?2pOszo0V1cCGGiEejpmGZ4s1prRRn0T1QL9j6ayPksYLjZviIXuX1rFDIAYA?= =?us-ascii?Q?xrmmaH36yhBjTckHLe4hCkw++CHN/55ClAINoRkNh57u2LvrKJvEa2KWSWSF?= =?us-ascii?Q?ubuO5aUvj4ZLz4Xvm8TTRW4RJI5D2pwAKw0jedhU07jtfl9A1kSAvkh4HSoM?= =?us-ascii?Q?O2TqzyMz9jPuIN5gvmJ3t6wi/5eej/2PDkknIs2RXIdmcbzXhIqad0V+ZF61?= =?us-ascii?Q?NBShzTMlThs5vEE13wITXOlA9MH/PbghK9BZEzF2w/9sjDsm2ltTTefX/RUe?= =?us-ascii?Q?wEhkX3zDKnnRZF9fmTFrSchuUSBIMGOBNr+MSDVktKRQjC7RwEqsAkkyZLen?= =?us-ascii?Q?h2iHFGUGPD3ZU7L8yihPPMwf3Gdx+LzeNTjDafQfmyyQNQFfXv6RL1yn8sai?= =?us-ascii?Q?gb8eFPpcZ14TbSkYGFGs+/YjkXuVxdiMXATgmwbLrU7fG450LSwKbrbFRBLk?= =?us-ascii?Q?CqYzBBpTJUm93p9QQvRMROF5JndIWJUmoxlTP782Lh9G1cmUrdVxUqwGS2zJ?= =?us-ascii?Q?aCrh2WMOavBLCzPA5yLbXWXpMs3cf005HLRP/zY4K1RKR0UEvvCZoyhZb6Kt?= =?us-ascii?Q?HuBzQuN33wAJofTv8nX0jjCpixnpnnD65IuKJiaVFPdCN3DJ9v9HNGCrw+Rt?= =?us-ascii?Q?Mnzv1UpwOiNc/crz1/nGVCS9VnrWj8UJH/Z7og++Vl12XoINkBA1MUyf1OOa?= =?us-ascii?Q?WA0ITlE32rvzNy2Bt7HQwu4vTq0muq6CN6Z7MFOg3fXpjDqQ1Or3SVlJqw66?= =?us-ascii?Q?WKRDYDjtBaqClqUyShk1xQ5OpUJBG5hOyL/7He6EkoIRY5CtivAsr6KM84eg?= =?us-ascii?Q?B7heArpM0PBT8yclKgNElwoIxkf2Wh5Xdpwl1UEIK7KSdVoXeGf6qIhZcYtv?= =?us-ascii?Q?4kh2IWks5OHzeojWOEyoiy0cFhTM/KL1s5KOYmWPN5fh6WeNu35aZyTcLlTc?= =?us-ascii?Q?SQfl35BbUiJKhEPZ0RXPtmJJ6h1eBgUfCAXjniFd7T1oIAGPMnQ50vkRDox/?= =?us-ascii?Q?Yi++v9syhebVwY3qWeru5VQrwYfApw+twMCconE/k6t3EeL3n+z12xZ4l1f5?= =?us-ascii?Q?ESY/wLtpIAGft7tn93SBZH/TqKkj6eM=3D?= X-OriginatorOrg: windriver.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9801229a-8983-4e8c-fca5-08de4682542e X-MS-Exchange-CrossTenant-AuthSource: DS4PPFD667CEBB6.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Dec 2025 02:31:10.7298 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 8ddb2873-a1ad-4a18-ae4e-4644631433be X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: pSISnP/m7gIH8piqij698dYwsBJbRwHbSuLehAMsJQi0Y0sXnywphGdbyVo9N1Lls4jsBBIl7F2w3l5A84paeBct8FHkuiAS7IWin+JyWuc= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR11MB7103 X-Authority-Analysis: v=2.4 cv=ccjfb3DM c=1 sm=1 tr=0 ts=6951e7f0 cx=c_pps a=oJ9tI0XfeScUaspqi3eqJg==:117 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=wP3pNCr1ah4A:10 a=VkNPw1HP01LnGYTKEx00:22 a=t7CeM3EgAAAA:8 a=Lc8NSlXapXXr_nlJwJIA:9 a=FdTzh2GWekK77mhwV6Dw:22 X-Proofpoint-GUID: gJN3sX1-yyRnhdaUg4AOShu5YSj8kMcN X-Proofpoint-ORIG-GUID: gJN3sX1-yyRnhdaUg4AOShu5YSj8kMcN X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjI5MDAyMSBTYWx0ZWRfX84rLHrwztBMm X8wqofeVGgDKBU1EQPzclb9aaC3DtL8ZkDJJfxGP2Leuxw8DybU9FiJgmoeWGgQ2U0KAOFjKUJd 7kP4YGgTRIcOzkL+zr/okAWnccqoa+6WDgMUS17JPD2adjTHykUfUKhVEO+GMDQuagjOTk38rWP mRnQJcAd4LiXg4LebR+MEfhNeXAAvyKyFa3ZFCBOXEeY8LQrPbq10QQe/e9DyQJ834NapfZBQzP epcR/jow+2VcK7vofY8Qw726FvKt9Wctjst/mXbXCD22SZP6Ghy9joxLiZ8h65RYpf25l1+LH/3 ZE9jJ2JkPK9B6bNMieOmPlgbIrZGLHnT/By1n7Feb2FDIDAUieL1mHEy4M1a0+TVSQOueIjH++T Rlr6DlELVSDLFx2tI5FbRfQ9Lyh1fmCJ6sKge/uoh/fXNVLnFgXhV8LhOSmQPzZSc2sEX4YO293 JdCiUiuitFH37TpdVYw== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-28_08,2025-12-26_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 spamscore=0 lowpriorityscore=0 adultscore=0 impostorscore=0 phishscore=0 bulkscore=0 clxscore=1015 malwarescore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2512290021 Content-Type: text/plain; charset="utf-8" Switch to using the sub-device state lock and properly call v4l2_subdev_init_finalize() / v4l2_subdev_cleanup() on probe() / remove(). Signed-off-by: Xiaolei Wang --- drivers/media/i2c/ov5647.c | 40 +++++++++++++------------------------- 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/drivers/media/i2c/ov5647.c b/drivers/media/i2c/ov5647.c index fd69f1616794..f0ca8cc14794 100644 --- a/drivers/media/i2c/ov5647.c +++ b/drivers/media/i2c/ov5647.c @@ -91,7 +91,6 @@ struct ov5647 { struct v4l2_subdev sd; struct regmap *regmap; struct media_pad pad; - struct mutex lock; struct clk *xclk; struct gpio_desc *pwdn; bool clock_ncont; @@ -652,7 +651,7 @@ static int ov5647_stream_on(struct v4l2_subdev *sd) } =20 /* Apply customized values from user when stream starts. */ - ret =3D __v4l2_ctrl_handler_setup(sd->ctrl_handler); + ret =3D v4l2_ctrl_handler_setup(sd->ctrl_handler); if (ret) return ret; =20 @@ -807,15 +806,12 @@ __ov5647_get_pad_crop(struct ov5647 *ov5647, static int ov5647_s_stream(struct v4l2_subdev *sd, int enable) { struct i2c_client *client =3D v4l2_get_subdevdata(sd); - struct ov5647 *sensor =3D to_sensor(sd); int ret; =20 - mutex_lock(&sensor->lock); - if (enable) { ret =3D pm_runtime_resume_and_get(&client->dev); if (ret < 0) - goto error_unlock; + return ret; =20 ret =3D ov5647_stream_on(sd); if (ret < 0) { @@ -831,14 +827,10 @@ static int ov5647_s_stream(struct v4l2_subdev *sd, in= t enable) pm_runtime_put(&client->dev); } =20 - mutex_unlock(&sensor->lock); - return 0; =20 error_pm: pm_runtime_put(&client->dev); -error_unlock: - mutex_unlock(&sensor->lock); =20 return ret; } @@ -886,7 +878,6 @@ static int ov5647_get_pad_fmt(struct v4l2_subdev *sd, const struct v4l2_mbus_framefmt *sensor_format; struct ov5647 *sensor =3D to_sensor(sd); =20 - mutex_lock(&sensor->lock); switch (format->which) { case V4L2_SUBDEV_FORMAT_TRY: sensor_format =3D v4l2_subdev_state_get_format(sd_state, @@ -898,7 +889,6 @@ static int ov5647_get_pad_fmt(struct v4l2_subdev *sd, } =20 *fmt =3D *sensor_format; - mutex_unlock(&sensor->lock); =20 return 0; } @@ -916,7 +906,6 @@ static int ov5647_set_pad_fmt(struct v4l2_subdev *sd, fmt->width, fmt->height); =20 /* Update the sensor mode and apply at it at streamon time. */ - mutex_lock(&sensor->lock); if (format->which =3D=3D V4L2_SUBDEV_FORMAT_TRY) { *v4l2_subdev_state_get_format(sd_state, format->pad) =3D mode->format; } else { @@ -945,7 +934,6 @@ static int ov5647_set_pad_fmt(struct v4l2_subdev *sd, exposure_def); } *fmt =3D mode->format; - mutex_unlock(&sensor->lock); =20 return 0; } @@ -958,10 +946,8 @@ static int ov5647_get_selection(struct v4l2_subdev *sd, case V4L2_SEL_TGT_CROP: { struct ov5647 *sensor =3D to_sensor(sd); =20 - mutex_lock(&sensor->lock); sel->r =3D *__ov5647_get_pad_crop(sensor, sd_state, sel->pad, sel->which); - mutex_unlock(&sensor->lock); =20 return 0; } @@ -1114,9 +1100,6 @@ static int ov5647_s_ctrl(struct v4l2_ctrl *ctrl) struct i2c_client *client =3D v4l2_get_subdevdata(sd); int ret =3D 0; =20 - - /* v4l2_ctrl_lock() locks our own mutex */ - if (ctrl->id =3D=3D V4L2_CID_VBLANK) { int exposure_max, exposure_def; =20 @@ -1316,13 +1299,11 @@ static int ov5647_probe(struct i2c_client *client) return -EINVAL; } =20 - mutex_init(&sensor->lock); - sensor->mode =3D OV5647_DEFAULT_MODE; =20 ret =3D ov5647_init_controls(sensor); if (ret) - goto mutex_destroy; + return ret; =20 sd =3D &sensor->sd; v4l2_i2c_subdev_init(sd, client, &ov5647_subdev_ops); @@ -1350,9 +1331,16 @@ static int ov5647_probe(struct i2c_client *client) if (ret < 0) goto power_off; =20 + sd->state_lock =3D sensor->ctrls.lock; + ret =3D v4l2_subdev_init_finalize(sd); + if (ret < 0) { + dev_err(&client->dev, "failed to init subdev: %d", ret); + goto power_off; + } + ret =3D v4l2_async_register_subdev(sd); if (ret < 0) - goto power_off; + goto v4l2_subdev_cleanup; =20 /* Enable runtime PM and turn off the device */ pm_runtime_set_active(dev); @@ -1363,14 +1351,14 @@ static int ov5647_probe(struct i2c_client *client) =20 return 0; =20 +v4l2_subdev_cleanup: + v4l2_subdev_cleanup(sd); power_off: ov5647_power_off(dev); entity_cleanup: media_entity_cleanup(&sd->entity); ctrl_handler_free: v4l2_ctrl_handler_free(&sensor->ctrls); -mutex_destroy: - mutex_destroy(&sensor->lock); =20 return ret; } @@ -1381,11 +1369,11 @@ static void ov5647_remove(struct i2c_client *client) struct ov5647 *sensor =3D to_sensor(sd); =20 v4l2_async_unregister_subdev(&sensor->sd); + v4l2_subdev_cleanup(sd); media_entity_cleanup(&sensor->sd.entity); v4l2_ctrl_handler_free(&sensor->ctrls); v4l2_device_unregister_subdev(sd); pm_runtime_disable(&client->dev); - mutex_destroy(&sensor->lock); } =20 static const struct dev_pm_ops ov5647_pm_ops =3D { --=20 2.43.0 From nobody Sun Feb 8 06:22:43 2026 Received: from mx0a-0064b401.pphosted.com (mx0a-0064b401.pphosted.com [205.220.166.238]) (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 848882135D7; Mon, 29 Dec 2025 02:31:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.166.238 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766975497; cv=fail; b=VaxiZ9DZT/Kfcrkme1oQbwOdoNSZ15sbD4Oy4GmealSxE4fqVTxwDtqK1Ca7u83CBJXwXACsVi+TSHTiYYVhp/gzh4fFQz2gLFmPyzl50TwnLEIZ/6/gtllFQut85atg9r9m4OSe2l8Lj6WJy9DYDS1JzJwtgRVL3zItn3bbJfQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766975497; c=relaxed/simple; bh=bHaYB0gTyPBfM8TmrhZ7Ui1FNEwC8/aHpyrPiJyTZAk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=eyX25bw4tSVBNLeTz05fvrnEVVo/5kizv83xQxUWzIuL8p2WZfMaika2HQRaNdvDP2aBCt/IbhNRsbjW+hG56kxB5todDSCCND7DFHI07ZYR+MyThhbYDFFMUy9HK/v7OQff6IZFU8m0t+AOWjEZ3gKUaIYhuUJoIy4isrNSKU8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=windriver.com; spf=pass smtp.mailfrom=windriver.com; dkim=pass (2048-bit key) header.d=windriver.com header.i=@windriver.com header.b=UY3hjIQ3; arc=fail smtp.client-ip=205.220.166.238 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=windriver.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=windriver.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=windriver.com header.i=@windriver.com header.b="UY3hjIQ3" Received: from pps.filterd (m0250809.ppops.net [127.0.0.1]) by mx0a-0064b401.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5BT1t1fM151482; Sun, 28 Dec 2025 18:31:17 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=windriver.com; h=cc:content-transfer-encoding:content-type:date:from :in-reply-to:message-id:mime-version:references:subject:to; s= PPS06212021; bh=7HN5FZ7CcrAqKoHzQU5uEQ52A5OoiQPK8L7CAiBRDO0=; b= UY3hjIQ30uadAKrGUxYy6A/+wi4FN0FuRA1pAyPiBKv+Bx4kr1NlF7S0Hv9m66Gh KztjEyrPiQttPOJj1PkHpR/1veYbPw0tpV7u0ROckzD9sqKflwpLL50kXUv+CvEm PnWq2Nfq4QXYzhdg4OOvqiT/QaQSirC/01zP0secQ4pu8ZeLmrQ3wlPUp1VwUAs7 rkzj9daU/8BAtXrLSTwRPFpK85a5mZT2xOmmP/5njj0L3gKMcjqsj7V5zayvQVCv PO5xtNtfSygSNi8+rWu/mh2H+sbvOezk5WQQNhQueVOmOFR4DxZAxb47S5f0bU1q lS2n9FOz0z20FxNNNlnJYA== Received: from co1pr03cu002.outbound.protection.outlook.com (mail-westus2azon11010049.outbound.protection.outlook.com [52.101.46.49]) by mx0a-0064b401.pphosted.com (PPS) with ESMTPS id 4bafuk9020-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Sun, 28 Dec 2025 18:31:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Rw+u72Dxjb2VRtFddzmtU8kW9hmc/2w+EOKSH02eWJfsyD/7lxw1oD8zMKV7uNCevulFb2lID1OhGH3aoerAUeKgUofHpL+RiRbetONlWVKkOu6pjMOzdgUZVsTrIgju55BQwiUWnbF41r4BVnBKkkivUfrZ797dZ3CSu9t+aRzKiHQmBQSA+P3dYSt3qvNIGbeBN0xV/mCOt3uQ+wAyu3CR1neEfLtWSBD/2ERuZtu2FNpGGs+6j2DuhBoZCGd2TvL/Vc4dS0CQ3mNG97CfigLO9Q3Cr0b67kmCvcn9fjoJWs/NZeVZhm9My0OWSxcV2VN5nBu7/GLf5/iusxjzcA== 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=7HN5FZ7CcrAqKoHzQU5uEQ52A5OoiQPK8L7CAiBRDO0=; b=OuCYUmZVN4FqC8Ss03uNuikvhWtW27CozhgM0rjWGcBxxZRmlNWHO9f4VC348mtw0ZTOT+nq09CwplbOSUBFqRgwlhManioyafm6aIs55VkeXQ4s/ymPs/OQ+dEIfFm+BAaMpMN6I96qPxLjFc6UP4ZpiSWyy6IuVrnJjT7tgRtwGqqxS29y52n792x6OoyOweiZtHRMEYfuFPYFC4WGvPInFW9a1EV9vtx0NwO+IMwphG2VhWUYQFeA5becPQUhYki8lWczICE7bhVLcTr82enyYygeZcJ973Z6WMIKKwchHPRxY00/1pt7DOLrYl5WpsJs/+51Lfpcnmxxr7agRA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=windriver.com; dmarc=pass action=none header.from=windriver.com; dkim=pass header.d=windriver.com; arc=none Received: from DS4PPFD667CEBB6.namprd11.prod.outlook.com (2603:10b6:f:fc02::53) by MW4PR11MB7103.namprd11.prod.outlook.com (2603:10b6:303:225::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9456.14; Mon, 29 Dec 2025 02:31:15 +0000 Received: from DS4PPFD667CEBB6.namprd11.prod.outlook.com ([fe80::56cb:3868:6b6c:193d]) by DS4PPFD667CEBB6.namprd11.prod.outlook.com ([fe80::56cb:3868:6b6c:193d%6]) with mapi id 15.20.9456.013; Mon, 29 Dec 2025 02:31:15 +0000 From: Xiaolei Wang To: laurent.pinchart@ideasonboard.com, sakari.ailus@linux.intel.com, dave.stevenson@raspberrypi.com, jacopo@jmondi.org, mchehab@kernel.org, prabhakar.mahadev-lad.rj@bp.renesas.com, hverkuil+cisco@kernel.org, johannes.goede@oss.qualcomm.com, hverkuil-cisco@xs4all.nl, jai.luthra@ideasonboard.com, xiaolei.wang@windriver.com Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 3/3] media: i2c: ov5647: switch to {enable,disable}_streams Date: Mon, 29 Dec 2025 10:30:18 +0800 Message-ID: <20251229023018.2933405-4-xiaolei.wang@windriver.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251229023018.2933405-1-xiaolei.wang@windriver.com> References: <20251229023018.2933405-1-xiaolei.wang@windriver.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SI1PR02CA0031.apcprd02.prod.outlook.com (2603:1096:4:1f6::11) To DS4PPFD667CEBB6.namprd11.prod.outlook.com (2603:10b6:f:fc02::53) 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: DS4PPFD667CEBB6:EE_|MW4PR11MB7103:EE_ X-MS-Office365-Filtering-Correlation-Id: 42a12eb9-7376-4375-a272-08de468256fd X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|7416014|376014|366016|1800799024|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?PlDEWfu/kMc809T3roUCH/r/dAajS/NnanFmIT8/Cv8eEWxP+fOby9nUNPmq?= =?us-ascii?Q?jCYjkrSEXP9zWMXkC16fx7V8/K+bAGYzhFs8/3/+xkUrdkfX1G+SAZW0167W?= =?us-ascii?Q?1w/u6VdN9tMwALESS4P83OM/nGGwAasmqQd7QBI/ozhow0ckb5DLedd047FL?= =?us-ascii?Q?mtYKilcnT/LrJNrhaUa5WMx0S2ESKVobE/cPcXAjLlSe1rMx8o5tMBdM4UM5?= =?us-ascii?Q?9kweFpDcCG/gzESnY6PkgJqvkRCuGb0MvjbKR/4y9ApZ9s439ZepDc5NrgXd?= =?us-ascii?Q?mbmD16dryLOavt3oSUucX5axPE7H7kch1qJ101IsWaDnpGoQ6ADCfwAvdBpp?= =?us-ascii?Q?ny5SYtvYg4yVbaV8yoGkMsBgzUtWW0Q74RlxGInTNSH8JspDHL4zZpCW0l25?= =?us-ascii?Q?fPu4EUMbqjWRbkRp9x2RJTPLjh5Lk0+8HHjQKGJv7HRiWmhdkro7DdfkXGP3?= =?us-ascii?Q?p295ioiYSJFsCv9DCMg7UB9vhbLPN4QebcyT90PdW/1JRZ20BSvzoVD1V/g6?= =?us-ascii?Q?MdZLdLWXJUtMCHzYhmasm1oA1FsEIsEMU/Ipx6rHB0el7UmrTJ8at1OybuEo?= =?us-ascii?Q?4zLbvDFbDGJrfEOOW3Kmr2hTh+QQ5V0RqC+xrCUEsGfGJJ1P4Xw1ik/ut/Xu?= =?us-ascii?Q?v8AkGFKTcdmezzls+HD6PTYnGTshBrRivGpDEaL+mDaO44jQ4AMALsFTLkJZ?= =?us-ascii?Q?MYbKxE2lPuqaizC2P0jahikWxKgSgr7GGrSHp2sw4QDC+SQ3Wmgk2GCrgxoO?= =?us-ascii?Q?9wZDqcIL4NE4UAO1ODOcJPGXmnyvIIJqrJD5Db/EP1N/X0Uskfn6PJuEC4bM?= =?us-ascii?Q?67rWMiRhfTiSsRqU3O7o10fOGFYvphfIWRjWzG2Pe4drFXqR3Lz7MFKb6I9Z?= =?us-ascii?Q?lvcRlcIHIb3MJmX1Tgn1MlsH9/7S4FieJkGr4NRFXfAIQvf1tf0lPk+xxa8G?= =?us-ascii?Q?5QLVv49ZCah93TU1G3w2+WQg7uTQZqEildJj9UiduL4vD+t6TcAMc8EA/Jc/?= =?us-ascii?Q?AEYoVAj5Ss3xSse3Ew5fuEnLBAOOe7P/HUxlNppBZw7uU8bTIs6uIlNo7uS3?= =?us-ascii?Q?afVLRLKj0TOm65OuwOkUboh+tSmYHD8Vcq1fCtPEPI4aTeLeqq3E/hMEPQ26?= =?us-ascii?Q?leZ/XeBIzMRxPYxEh8sP0vjMNWeeLCuBkZrNC0+H57o6paxZX6JLEpP8/D0z?= =?us-ascii?Q?/kDteQySfotABVNiWULKG5j1a6RJAIMHOO1lYC9qlqloOeDAunRAjSkoeIj0?= =?us-ascii?Q?Qr/Ur5+aoI3u0u82Yu6p2IcOgDWe8eEkVgbbffL870v/2Da1Az9DPyrON1jG?= =?us-ascii?Q?az9le1ESz+ME2T0GpIc4y6TpvQtIT/iSLVcIO19xHoDVpMFEHHLW2sUlkS17?= =?us-ascii?Q?ZPcLjeUHnnCqsKUCctNaNLYWzTRsgLC3+rV8nECF+6F7AzIiBPIZ4BqY1uA8?= =?us-ascii?Q?iR1w1SCjYdBIsH+PdKKgIS05tcueJZxpzuUycMU4jrAwtl1hEF8bgV22zZDu?= =?us-ascii?Q?GqBvjCH7GGMZdw9YKqUcqhL/SA+dOybTlVKZLHa1BBmlmJFfaTK5vHgurg?= =?us-ascii?Q?=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS4PPFD667CEBB6.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(7416014)(376014)(366016)(1800799024)(38350700014)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?UR3rW/okekRt+NlIHniW1s6U+bLLZCCAAa1MfuQHTHDlBKVXhpyAdb9T4mpe?= =?us-ascii?Q?o57tuQHwEmz9A22ORXPfJoRzL/lESo68DMjbswtL0K1AMh5nUGNRSueP/IUe?= =?us-ascii?Q?0bXSkoS4b8rgQQ3E5LlcplBxCVt7cBYrkr4A8XNNdsL+SF8cg7F2wjDZQbES?= =?us-ascii?Q?KhKVnvvqEzn0/86AAEsBnwoM4ZSYR2HvnUj3Nc342Mx52+QfXRKA5Oex2VDs?= =?us-ascii?Q?rnF+NcZXIw/IDddJ5BKCaVEjazTpgkFk5lg/UmeOSVvFZfmjeLjNfgpL7K1u?= =?us-ascii?Q?PMC4ITMHyD1/KDyF6dTWaM78xX3LM6TgX94fJcF31QMGxwOpwHsRvGTT9bt8?= =?us-ascii?Q?dDUuTHPgMYk9YA60PiYw7gJFhSmiQ7wRAW63M5wl1eGh4AhyE9iHygpjBByk?= =?us-ascii?Q?rIqvzSHLdxv2qJw5f7UXPvO8f1qCvohLIkmBotm7EPfjnUdWIp1ObwmMJrCa?= =?us-ascii?Q?nHMY4r/3EGuemLDvbiVerqnaUzfIvV7jJzZU1yD6iTHeC2V0HWLvFld3bt5H?= =?us-ascii?Q?RR/V2zQ85esWc811NP5H3dibHt4tD0+sYMXJ5eBL6I7F9UBpuIDPs3WT+uE9?= =?us-ascii?Q?sJI9uROZ7zp9n6Rp9fqDSl/wCR+5dvpthuNyTb0oFPHH5oPH4N4EkNZaCbzQ?= =?us-ascii?Q?Aq2dUGByeO3Nnq3XUSv//YhBhKYFwxJSx0uvKtKOol95iafj+msbX9wGPnqx?= =?us-ascii?Q?WTNQlk6xBGeg15OgPcf1erU2hJiWr9hxv0Ybkp8ZqSCYPHKhv3+52d6eEh9B?= =?us-ascii?Q?CFXVv/XPQvgfKfbhBQJr2l3IkPWldsqnRQoY1fF/m9b62nEvF3q94FNN2f0E?= =?us-ascii?Q?zmjNuUAJol6L1/EDxAcgXCaVTgP2t1wiaeftUJPRmRkUjPj9TTnc9gr3TqCw?= =?us-ascii?Q?h2aUSWLTKVF7wcj392fUopIeNXeqPvP7zKIC9hdT6nmoEIK/g6VnrLZ/f/df?= =?us-ascii?Q?iGoek0Q5nROFU+XnKsp0PrDivhcEv80SzHPDaXK866qxAcfqqeW8ojI/X0je?= =?us-ascii?Q?mPW5FELXQ5TIHKaEUFm0Ona77JO3u3GUA4vPOtaOupY/e6n1qoZog625w26X?= =?us-ascii?Q?WvNMatsJh7LNvTC0FazRag7j6bothzBJTmqRAsn1+wX9Fzidvou4sa5ecBjx?= =?us-ascii?Q?YmqTQF/7HmsFjDTnqSrnwYxvlwysOq+SOl7WyxQ/kwf7C0fvUKcB0djsZHHC?= =?us-ascii?Q?BlanmtWHn9puIjsgd1jk4eAL1/QTyBwFClSKmu67c33YfZbovts8RM//iilo?= =?us-ascii?Q?R2UrvbilGeCpYz/9ppn7OXrQyhQlBOalHjrrm/GE2e6t7rJyvokQ9N/zkNad?= =?us-ascii?Q?teMW1Dx9Ikzr+KQElMcGHSSyJeDDacMeHMh2CGBP+1hkZIqJVu9+u17XkRaV?= =?us-ascii?Q?bLtts+VSHPzk8JVDp1CFVyut9I4JU2MVncQnM5IANH9djQLNHlBNaC4Yc6bq?= =?us-ascii?Q?w3rwimCH0zC4K1OeNTTal3c4GynHxhW9PKd89vyT6ErL5FPQYZPA1ONNlWh+?= =?us-ascii?Q?g/8krxzVhTo0+7ctKvOT8Li3WSj1tjUxobHuE7Co+irh8JXIW1WEZMU3Oaux?= =?us-ascii?Q?LUzDgZJnaAsSps476PL9UFwo4UDj9bVMaJrcpgAMhcjfD4Sv42QNSSfw7lSI?= =?us-ascii?Q?MYswZoNmgdXP5hxiJgACf19Qh6eYXOnMrED/HQ6Ai27IevjQRvr7snw1cvtm?= =?us-ascii?Q?GYBRFaabIHQ4z42fzZoycHRdVaiWIaBtyniR3cdVb1qC+Ladd+ds43ai8s26?= =?us-ascii?Q?/YYheD3RkLcWGA/IPa2v3T+c8Zuor/4=3D?= X-OriginatorOrg: windriver.com X-MS-Exchange-CrossTenant-Network-Message-Id: 42a12eb9-7376-4375-a272-08de468256fd X-MS-Exchange-CrossTenant-AuthSource: DS4PPFD667CEBB6.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Dec 2025 02:31:15.4253 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 8ddb2873-a1ad-4a18-ae4e-4644631433be X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: HBODPz50bH7zERSrUA3BOja9lI514SENO1ecfLFv5osBge/hi8ies+hnObV930wFs9hKmFmbqjIPOOVT3XrtEC2akMwTzSUI6GG91lbquNE= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR11MB7103 X-Authority-Analysis: v=2.4 cv=ccjfb3DM c=1 sm=1 tr=0 ts=6951e7f5 cx=c_pps a=+5nsKerQHvRPAoQt0ERV+A==:117 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=wP3pNCr1ah4A:10 a=VkNPw1HP01LnGYTKEx00:22 a=t7CeM3EgAAAA:8 a=pG3TpReAhpfUgZjo6d8A:9 a=FdTzh2GWekK77mhwV6Dw:22 X-Proofpoint-GUID: -W3XJNbYKc3L4oF7YFqY4OOc4GBVpXct X-Proofpoint-ORIG-GUID: -W3XJNbYKc3L4oF7YFqY4OOc4GBVpXct X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjI5MDAyMSBTYWx0ZWRfX7/ZbqR46+kFB 6jcPpgr1pViteHBTOzBEv0Pio/W8BjkAhrU3YjItzNxFgtTvXZ2iigTJbG3ChBHoPVysAOBim7j f5bDXfqsLSFfeoM6WGJ0LHUfKk6iZqlvfMM6IknNqUgY8IApDVEXjcBLZ8vLS5K9Vs7/AcKIGHR 6PRhVUGzjWplYC0rYwA9/pM02BCPxv40Vt+ISfadzqbIps6BmerdbAsKCYpiXD6EKEoEtODkJ8D F0JLZwCQDuuJ8o0Um2qvXFVmlWJN3lnDBNdXmr6G5WZKopgNC1zZ/y4JG0CFaUusqcVC2SprOLI 2ccvJ4Ci93fndTFBFwUnWIr7pRHosW5ZXMkaH9LzFSWE1c1KykrKzyYeH+mUB3Wv8eFbWnTjDTr Z4IEoLFkeC/e+ZCPR6xiS1tEgbvgJvQKUPkvUrtkDfLBm7z7899OL1Fued90o/oHkf6xQSFAie7 Wt6UIzbKdR682MjPKWg== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-28_08,2025-12-26_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 spamscore=0 lowpriorityscore=0 adultscore=0 impostorscore=0 phishscore=0 bulkscore=0 clxscore=1015 malwarescore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2512290021 Content-Type: text/plain; charset="utf-8" Switch from s_stream to enable_streams and disable_streams callbacks. Signed-off-by: Xiaolei Wang Reviewed-by: Laurent Pinchart --- drivers/media/i2c/ov5647.c | 69 ++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 40 deletions(-) diff --git a/drivers/media/i2c/ov5647.c b/drivers/media/i2c/ov5647.c index f0ca8cc14794..7f4541f46335 100644 --- a/drivers/media/i2c/ov5647.c +++ b/drivers/media/i2c/ov5647.c @@ -637,23 +637,29 @@ static int ov5647_set_mode(struct v4l2_subdev *sd) return 0; } =20 -static int ov5647_stream_on(struct v4l2_subdev *sd) +static int ov5647_enable_streams(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, u32 pad, + u64 streams_mask) { struct i2c_client *client =3D v4l2_get_subdevdata(sd); struct ov5647 *sensor =3D to_sensor(sd); u8 val =3D MIPI_CTRL00_BUS_IDLE; int ret =3D 0; =20 + ret =3D pm_runtime_resume_and_get(&client->dev); + if (ret < 0) + return ret; + ret =3D ov5647_set_mode(sd); if (ret) { dev_err(&client->dev, "Failed to program sensor mode: %d\n", ret); - return ret; + goto err_rpm_put; } =20 /* Apply customized values from user when stream starts. */ - ret =3D v4l2_ctrl_handler_setup(sd->ctrl_handler); + ret =3D __v4l2_ctrl_handler_setup(sd->ctrl_handler); if (ret) - return ret; + goto err_rpm_put; =20 if (sensor->clock_ncont) val |=3D MIPI_CTRL00_CLOCK_LANE_GATE | @@ -663,11 +669,18 @@ static int ov5647_stream_on(struct v4l2_subdev *sd) cci_write(sensor->regmap, OV5647_REG_FRAME_OFF_NUMBER, 0x00, &ret); cci_write(sensor->regmap, OV5640_REG_PAD_OUT, 0x00, &ret); =20 +err_rpm_put: + if (ret) + pm_runtime_put(&client->dev); + return ret; } =20 -static int ov5647_stream_off(struct v4l2_subdev *sd) +static int ov5647_disable_streams(struct v4l2_subdev *sd, + struct v4l2_subdev_state *state, u32 pad, + u64 streams_mask) { + struct i2c_client *client =3D v4l2_get_subdevdata(sd); struct ov5647 *sensor =3D to_sensor(sd); int ret =3D 0; =20 @@ -677,13 +690,15 @@ static int ov5647_stream_off(struct v4l2_subdev *sd) cci_write(sensor->regmap, OV5647_REG_FRAME_OFF_NUMBER, 0x0f, &ret); cci_write(sensor->regmap, OV5640_REG_PAD_OUT, 0x01, &ret); =20 + pm_runtime_put(&client->dev); + return ret; } =20 static int ov5647_power_on(struct device *dev) { struct ov5647 *sensor =3D dev_get_drvdata(dev); - int ret; + int ret =3D 0; =20 dev_dbg(dev, "OV5647 power on\n"); =20 @@ -706,7 +721,11 @@ static int ov5647_power_on(struct device *dev) } =20 /* Stream off to coax lanes into LP-11 state. */ - ret =3D ov5647_stream_off(&sensor->sd); + cci_write(sensor->regmap, OV5647_REG_MIPI_CTRL00, + MIPI_CTRL00_CLOCK_LANE_GATE | MIPI_CTRL00_BUS_IDLE | + MIPI_CTRL00_CLOCK_LANE_DISABLE, &ret); + cci_write(sensor->regmap, OV5647_REG_FRAME_OFF_NUMBER, 0x0f, &ret); + cci_write(sensor->regmap, OV5640_REG_PAD_OUT, 0x01, &ret); if (ret < 0) { dev_err(dev, "camera not available, check power\n"); goto error_clk_disable; @@ -803,40 +822,8 @@ __ov5647_get_pad_crop(struct ov5647 *ov5647, return NULL; } =20 -static int ov5647_s_stream(struct v4l2_subdev *sd, int enable) -{ - struct i2c_client *client =3D v4l2_get_subdevdata(sd); - int ret; - - if (enable) { - ret =3D pm_runtime_resume_and_get(&client->dev); - if (ret < 0) - return ret; - - ret =3D ov5647_stream_on(sd); - if (ret < 0) { - dev_err(&client->dev, "stream start failed: %d\n", ret); - goto error_pm; - } - } else { - ret =3D ov5647_stream_off(sd); - if (ret < 0) { - dev_err(&client->dev, "stream stop failed: %d\n", ret); - goto error_pm; - } - pm_runtime_put(&client->dev); - } - - return 0; - -error_pm: - pm_runtime_put(&client->dev); - - return ret; -} - static const struct v4l2_subdev_video_ops ov5647_subdev_video_ops =3D { - .s_stream =3D ov5647_s_stream, + .s_stream =3D v4l2_subdev_s_stream_helper, }; =20 static int ov5647_enum_mbus_code(struct v4l2_subdev *sd, @@ -979,6 +966,8 @@ static const struct v4l2_subdev_pad_ops ov5647_subdev_p= ad_ops =3D { .set_fmt =3D ov5647_set_pad_fmt, .get_fmt =3D ov5647_get_pad_fmt, .get_selection =3D ov5647_get_selection, + .enable_streams =3D ov5647_enable_streams, + .disable_streams =3D ov5647_disable_streams, }; =20 static const struct v4l2_subdev_ops ov5647_subdev_ops =3D { --=20 2.43.0