From nobody Sun Feb 8 04:34:44 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 DE23618DB01; Fri, 26 Dec 2025 03:53:56 +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=1766721239; cv=fail; b=MIMyO0ohTCK4r6Q2DRaceBWOExdNxSaQiJ27pwYP+egP+w5GncuAbtfEKPXG0mQ6E+6MNpG9iUPaVNaJXoVyxNDp8neIH5ZY6hS2bjy+i7S9ox7vtJdd5J2d9X9JCclKx94v9FvBZvulmKoAqGhwBZXgwWVlsstFRtB3hG7Jo+U= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766721239; c=relaxed/simple; bh=jYTMlzD5Ubko8zIcFvloZNNFFiYYAA7VjSCu9In6jD0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=F2SHtysBDthgF1xTC6KfUvbZgVlLiYD2ad105/H3GvXbRBYTgpPnTQaSaMNAgT5jdAh+ccRv6bqgDQWqCQrJN/VPuCVPo8vIBakK8p2Xyig3Zxz0Z5e7jL7p3tSGDaDlW+zUVqid38YHtBKNaDCoCnDnOxzIjzxCJfXF7YrmNGU= 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=Ke7vSVzm; 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="Ke7vSVzm" Received: from pps.filterd (m0250810.ppops.net [127.0.0.1]) by mx0a-0064b401.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5BQ2Ze9X2131558; Thu, 25 Dec 2025 19:13:56 -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=TMZa7Rz3bjphTr0LCEWFv5eK3f0KbFffiQfQISjRd/k=; b= Ke7vSVzm6l8nMUFhqq7ePHa9WU3h7YHNn7IW3YSYEH9qr5nBCs91+1GkR8a2IcKm vsrYuCIRWKd4v9QGxRXqQTGhzo+cugnT0F1W1CnHQSZ9je6TtViMBUe/ccu5MTQS qrjB6FsIbyrCaCF2ONiWTy4OmOlN44v19YMbksywWBdxe+vl2xdUnyowBwRiFoqQ aCFDdomlnnDUgXwkwvEtCbaLwz8et9J+gDVC2dUd9IBc+3uBrk4uPx399OtfLhz9 49aH2H1nOExIgRIyNqdT8HCMKoy8BQIYDgvcjU+FhB0sYnus0frVURANnaiw2LJF XFRT1LOp76DSXQmEjW01vA== Received: from sa9pr02cu001.outbound.protection.outlook.com (mail-southcentralusazon11013051.outbound.protection.outlook.com [40.93.196.51]) by mx0a-0064b401.pphosted.com (PPS) with ESMTPS id 4b5qy4wab4-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Thu, 25 Dec 2025 19:13:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=wyhTfukrVWbWD6vfd0FGsCIB/CP75yJVAEhjs02fchHuKADzx6yUzC+o1/G2mBwGNM9RhnJxKEp0s2okrz8llsDCIYvcnbPAs++BAItGP57mt7xGcmBdazbvugxit8vP8kL00p36qS1Ak4LGyTmuoAn85iy2X6hxTDAjIcIzZE+5PA3X7PWz9f01zD0SAdZo9JHntOwP4vxvEgksq7nekg3gt9hv/oCSGTtjQwSN1zpljZWsoY1mUtCPh6C/fK96aCSGzpA3sjSLybiwGlj3bpUX6TqkqqWGg7WBm88/PCn0OQepttXXV1u/2V/FKO2keSZccA8vwgKQv/6lkeazLQ== 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=TMZa7Rz3bjphTr0LCEWFv5eK3f0KbFffiQfQISjRd/k=; b=eLQ5CJdj1IX7ILn49Kc2hDUolp7IY/manh+3JjiZqSZYX4AA0if6kctJZZlw89rqas3i9f371dzyBXiPNdHznBpmcjoh/HxTh23wVHuViDUqHzOUef1kZOC7yKK/Bl/RqdFos+P0wOwHVZgxUXw+3BEIn99OC1uxOm9CC+88ugvOzk6CRvjx0rwrTdHGfxTEbXs59PbGTZTbJMZh9+wspptJQpNrZCHlmMBZscJ0+lSfCF7WXCAXr9rnLmv83x0+7chY0Dpop02gxZ3pOOykyFO2xeZhltbi6pJF5+lLDTJPVI/GaYCEID5mX5I8bI28WAD4w7UqrveE/IWo64Zi6w== 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 DM6PR11MB4660.namprd11.prod.outlook.com (2603:10b6:5:2ad::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9456.11; Fri, 26 Dec 2025 03:13:54 +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.008; Fri, 26 Dec 2025 03:13:54 +0000 From: Xiaolei Wang To: sakari.ailus@linux.intel.com, dave.stevenson@raspberrypi.com, jacopo@jmondi.org, mchehab@kernel.org, prabhakar.mahadev-lad.rj@bp.renesas.com, laurent.pinchart@ideasonboard.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 1/2] media: i2c: ov5647: Convert to CCI register access helpers Date: Fri, 26 Dec 2025 11:13:10 +0800 Message-ID: <20251226031311.2068414-2-xiaolei.wang@windriver.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251226031311.2068414-1-xiaolei.wang@windriver.com> References: <20251226031311.2068414-1-xiaolei.wang@windriver.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SI1PR02CA0027.apcprd02.prod.outlook.com (2603:1096:4:1f4::18) 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_|DM6PR11MB4660:EE_ X-MS-Office365-Filtering-Correlation-Id: 6f543fd5-a16b-4420-0f48-08de442cccd6 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|366016|52116014|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?ZnjBTTU/nLK25cB+k45u6632vW3QPg61gZSR0tppnLVFIartJ1lMvzrosAIe?= =?us-ascii?Q?Qa8EG+65yRFTcd54SS2Sdk5YASpcLnFc4LihxwO+e55284v8Gt50X0vx4vkk?= =?us-ascii?Q?IjFuU95dlQXHH5cRQQltD4Tkw/zLLZiX/lkfYbHx4zXnTEdlXvV9tT/U9btV?= =?us-ascii?Q?6kPZ/tZ/r76/c4zspN3xW+loxm4RoefkC7UgXakJ6eKZTeoIDdKIdAu+4YCE?= =?us-ascii?Q?/mwsBIagfPgYWPBGROVbu0WHSJF6dJs7fDD6jgtbXbDVuVIeGZHp+tAi6WCk?= =?us-ascii?Q?T4+qenSc9T82cYVOP/IGMrOokWEgIuqA/fbo8GMHwM0mRpcs5ZV641RQq8tU?= =?us-ascii?Q?VBjpTyupi0olq3YOrkOtxJaG9jmZFA1WLxuW/eV5kw7Dh1Bx0PFcAt+FO7jt?= =?us-ascii?Q?DLOLUilYc/r/XixDCwRI464zcOOrr6RviWqkUOHxtRHOd7ShtTXqDAW7qBPP?= =?us-ascii?Q?SGDlEpeRUWuDTv9lfSfAPv+T67WQKyjRxdS1vpTVpOgpg5UY1dTOscvoY52v?= =?us-ascii?Q?mv+PGeC/9WQhPDLniMKc3uSx6OlW/L1CwrwmSuZ5ySFLg7KCCXUONzCvVXB7?= =?us-ascii?Q?BYe1jJx+okHolcmZIrzwZiuP/7OWxsmNzVGkUrSJ3oBF5Ggde+4StSwzEdgs?= =?us-ascii?Q?p2OzxHy2OWCLrHe7W3lWzSSpXkPuTFq/scgjyUSZYAA6naolbxmXleg4wVDr?= =?us-ascii?Q?hVOLKiVmOpk4bajsuDrWJcZEE6LckFn6YnCpzzJqoU7lHjc73cC5Cd+E1C56?= =?us-ascii?Q?6w9anbo6NR+29W6fiUnytZfk66XKoe5fsyIijxtiy1lz3yrlKucvR/DxGCwe?= =?us-ascii?Q?qKGeQJrX2EPqPdgCVHjomnAs9zblOubEbiv8DkE8CnUnzlK56gqCwTZqDXZK?= =?us-ascii?Q?y6ciMzct2p+wxOuCgTZGd3q6laUZbFQQsVqWuyGNHCclGouz+abt8Q224ipc?= =?us-ascii?Q?O9jzWq9Hfi/llegQpwygGOvNY74IMK7yBHnoWQxZUSRXryu+FEePzdd/UCiC?= =?us-ascii?Q?oIE2iChPJLsOOFd2cf34ZTOT9SGIISSMjir2rL8J8fs8yTHcU+Cq43F1slHL?= =?us-ascii?Q?Asn2FYRCa5jmORF529PI5Wu9NIqMRhtsB73CegfVTp95eiksIfp9JKDhZZ5Y?= =?us-ascii?Q?16dA9VTuIQNA1Z/+n/cZIffKRVZsNqn6j7ZJtnmMzrLnWL7MTU2fjuXV0E3z?= =?us-ascii?Q?pkqdE9wV5120pDUW3YPAGBouPfvs8+a4x8Yz4wYKdgnvYoNSc9kLfXaDLI+a?= =?us-ascii?Q?6v8p0YiLSKUxDt6srNt67sLeACvsGaTMlOHXZmGIn0nFDxXeCedyHXKrqypn?= =?us-ascii?Q?j3rIjQ1YMfOYC834uSc3df3bFYSdXJJfWr45CzXKKQ0XYfnnPrUxilllL0nh?= =?us-ascii?Q?3LCTlDpr4ZdwHkaHoABTjpRYQ+SbXWrGTD6ZVyIRj3kKzokJg7x9RFM7xcwS?= =?us-ascii?Q?ltzHwMl1onwdNAVGhF1OdFspy221NxKGNb/Ru543EudPB4zRvtu64nkMvc1G?= =?us-ascii?Q?SNmaCNX/3vAiETxb+s/w5uwxESGWK9o73HyhPPp4X7loXJqhHTUGjlLZxw?= =?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)(1800799024)(376014)(7416014)(366016)(52116014)(38350700014)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?LWrqeC/XmduOUMvQ8qU2Xct+CUPrfgitJlq3vAg0/KZv23xolnkgS68g9X+c?= =?us-ascii?Q?6Go7hSH+byWB5uKPPIdKmrcqkUlapmKH/TiyI1DRp5yaMcvyPXCwuvNd5gqG?= =?us-ascii?Q?1fxSOwdOWiq5LUxzsvdWrlQGhuq4EjwEFaUQ2l7gRZhMz/0y5e32JsSB9euj?= =?us-ascii?Q?hP82caeXAEgzB8SfJ1StVl45vP74zqGtiNi42NWYIa0bzE07jaLRwg+CA7jP?= =?us-ascii?Q?v2dD/BdOrH5OKk+kX32tIpXl1Coj3on2b0//YdatdbMHsWGo2K8nKtEBld+x?= =?us-ascii?Q?yhYaoCACSOSLUnEO3QfxXNrWwEp236FdRi6y96HlPsLedtglXfQGMz0VbTkd?= =?us-ascii?Q?HOJDoelUdzfRC+xxajgqESFCC0q7XMIjaUPXvP8KCZUKyE2IVC0jcQr0wS+X?= =?us-ascii?Q?+qWUXtzINIdCdR4i18l52N/GdHxIEvKuRE54AEublVIaiKSsN51sCKL+VFbI?= =?us-ascii?Q?gvaDiPbwYg81lhl9+iMiBYF7Y66IioqGjZYl9Rw8qlt7FTiHzrmdIye326Nq?= =?us-ascii?Q?SpTYZgFBTgSUsQANQqh83+lKWspcC2Y4PoUVv/eEmiCiiG8iZn5p+xPkOWaX?= =?us-ascii?Q?BF9ZnelGCaIoKoUWzjjLuJELpEK/TY2QLL8Qq0dgdQSHsKc8mps2ec0V+AcE?= =?us-ascii?Q?ot36VT2Z8P2I6EMzcbtH5QTkLy4qxslQK1TfLPJ0a+YuMGwkd9DSIKAbMHxm?= =?us-ascii?Q?bguPqZWFBT56SwtS+r48ARwLn6TAHpR2ergUbeHPZoccOYzaT2tYfamFstL1?= =?us-ascii?Q?gPtZKZcEFkIZdhiLnObzuKrDqMwyKc2dE3PWpBLaDMZCFpgVGpvQ95B/E+6E?= =?us-ascii?Q?+iwSeBCT1uXZFEfnC4uJ4yc8wktlegB09wnxvIt1FXDMWyQyGmyj/K4tKRTN?= =?us-ascii?Q?asbh2CL3VlxDQ7nvDeUqZBm4+7Yrr9bEEq7Q6PIyK/In35/2b0asztiYXFKj?= =?us-ascii?Q?xXXKaIDScALbW3+c9sTmLFv8aflTDNAzCibYNLzjjz2D4y3trNvfHKnwBsy6?= =?us-ascii?Q?5O3R3z+PF9qi9JtRf3frbCS4skr0SWJ2GsnKiYCy7uLsWb9pZFyKB4a6HqoL?= =?us-ascii?Q?SolcDi9RFWjIDX3EPnQOgKCLbDSiDv0ttktaVeOTcsz2MzwngzlD1iRgpKpo?= =?us-ascii?Q?QTtCmZKiwfOebDuD+iI9KU/TQ+AWvhVeHc/coO/P8VPLUxI/8JzyJmiV7GQk?= =?us-ascii?Q?Zz0v50kaFA9K2+533DOZlqcHwGtXrwUXgXgXA2JdUDsE8+Qmer3IdqSm0usi?= =?us-ascii?Q?63AWaegM0t+30rhlWJmFmbC2ysAbe8tk3sm9Qv2rUfGua0jmswh6BjI3+c+c?= =?us-ascii?Q?YiD3X3yEuX1gDI2x9FdGn6AVf85Xof0qEO0/XNgQkibglnZBv51KoEp+y/I/?= =?us-ascii?Q?APqxbdETXwb0lHnYpW8TaZxbirp+yGKQv3/GOLm8Wl37ba02M8OY/9Lp6+Ih?= =?us-ascii?Q?cr0+jzgpzf7lgMmJnkJcxDU3ixh9FOhhesfJeHgCRmcRe30K3r+8un4T1dFZ?= =?us-ascii?Q?txjM/dS+dl+KQHnHbLM2f229VTYRuW8DC8lHCZZZZ2Wtin25Ji7ksmZzBLfH?= =?us-ascii?Q?/u1sI7y3CBWMoMoeGRiFcuZFUrumwpUBptzprHJ168/zwJubkR/vm1oTb126?= =?us-ascii?Q?uN3JPpuUKu8m8zG84mkjmrVaWZOViaD/FdSqfWHGJGaNtF6lTcftwmpoLjls?= =?us-ascii?Q?wgJSEBgtSTWciZM4Bb8P8VSjke7csrsXCPKpYehmcaSEpU4OzzfSiJJsKzig?= =?us-ascii?Q?CbeYycUKm38FJngFWVX5vD2b6gjwJ5E=3D?= X-OriginatorOrg: windriver.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6f543fd5-a16b-4420-0f48-08de442cccd6 X-MS-Exchange-CrossTenant-AuthSource: DS4PPFD667CEBB6.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Dec 2025 03:13:54.3097 (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: N5E/9lyEiZk5ti4O8sZLIfNO3c6nV62sZMP3Cq+MiLBEkfrhVN9c5Ph4BuNr5n5eH8n2jLnqWhz9XQY9Oy5kkTYFmav8Pb6u+2fxh2L7wZw= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR11MB4660 X-Proofpoint-GUID: Y_-6yp1YGGPxu4W0f2PgRQK94M-EqDaP X-Authority-Analysis: v=2.4 cv=Q+vfIo2a c=1 sm=1 tr=0 ts=694dfd74 cx=c_pps a=021mb8W6rIxzgUEI7A/+3A==: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=3PcNrPFzKfrMQnDGG3cA:9 a=FdTzh2GWekK77mhwV6Dw:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjI2MDAyOSBTYWx0ZWRfX0gdED2L0GHW2 Qe4DPr4fn0ZovMDiFBAZ+/DWYF8lK594dChcNuB2jgkgrjkWi5w1TrYIn7HITBr8NWJfPpdTVXl dmWRG6y3lLp2jm2QRzyQJxkXlDtBCOlhOIEhmlIeySAJIa+DGJkhFIpd1T1t68nz/jjI4ZKaFob NloAJj6dpidZPws5wvd9xbaxHiW+c8jZYuxUSsqnVLaKSaNe1wUoIlgfh73uO7xLjXt81ttk2Na NkrckziLroFxqvlqnsMMUma/flgR/u3Nhrb7J2SCwmXVJ1aEBCvE+KQRj06UtoaStBTY6GKM8vR wNqWL5I/PKun6rul1WoSuX67uhIakfPdizESwIiIV32upYKWIcypri0hainWCQEmOePgalvOOu3 iNkZEhN/xleSteIRARi9Hq/m/qdZDyXA5mA7pKNb135+eRBJcKSvEahyC5f1z2YdvtGrwu+44f6 3JYigZVpf9HenQVbUiw== X-Proofpoint-ORIG-GUID: Y_-6yp1YGGPxu4W0f2PgRQK94M-EqDaP 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-26_01,2025-12-26_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 bulkscore=0 malwarescore=0 adultscore=0 impostorscore=0 suspectscore=0 phishscore=0 spamscore=0 priorityscore=1501 clxscore=1011 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2512260029 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 | 964 +++++++++++++++++-------------------- 2 files changed, 454 insertions(+), 511 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..1f8e173417b8 100644 --- a/drivers/media/i2c/ov5647.c +++ b/drivers/media/i2c/ov5647.c @@ -28,6 +28,7 @@ #include #include #include +#include =20 /* * From the datasheet, "20ms after PWDN goes low or 20ms after RESETB goes @@ -41,24 +42,24 @@ #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_SW_STANDBY CCI_REG8(0x0100) +#define OV5647_SW_RESET CCI_REG8(0x0103) +#define OV5647_REG_CHIPID_H CCI_REG8(0x300a) +#define OV5647_REG_CHIPID_L CCI_REG8(0x300b) +#define OV5640_REG_PAD_OUT CCI_REG8(0x300d) +#define OV5647_REG_EXP_HI CCI_REG8(0x3500) +#define OV5647_REG_EXP_MID CCI_REG8(0x3501) +#define OV5647_REG_EXP_LO CCI_REG8(0x3502) +#define OV5647_REG_AEC_AGC CCI_REG8(0x3503) +#define OV5647_REG_GAIN_HI CCI_REG8(0x350a) +#define OV5647_REG_GAIN_LO CCI_REG8(0x350b) +#define OV5647_REG_VTS_HI CCI_REG16(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_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 +82,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 +127,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 +591,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 +629,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; } @@ -742,32 +665,33 @@ 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); + ret =3D cci_write(sensor->regmap, OV5647_REG_MIPI_CTRL00, val, NULL); if (ret < 0) return ret; =20 - ret =3D ov5647_write(sd, OV5647_REG_FRAME_OFF_NUMBER, 0x00); + ret =3D cci_write(sensor->regmap, OV5647_REG_FRAME_OFF_NUMBER, 0x00, NULL= ); if (ret < 0) return ret; =20 - return ov5647_write(sd, OV5640_REG_PAD_OUT, 0x00); + return cci_write(sensor->regmap, OV5640_REG_PAD_OUT, 0x00, NULL); } =20 static int ov5647_stream_off(struct v4l2_subdev *sd) { + struct ov5647 *sensor =3D to_sensor(sd); int ret; =20 - ret =3D ov5647_write(sd, OV5647_REG_MIPI_CTRL00, + ret =3D cci_write(sensor->regmap, OV5647_REG_MIPI_CTRL00, MIPI_CTRL00_CLOCK_LANE_GATE | MIPI_CTRL00_BUS_IDLE | - MIPI_CTRL00_CLOCK_LANE_DISABLE); + MIPI_CTRL00_CLOCK_LANE_DISABLE, NULL); if (ret < 0) return ret; =20 - ret =3D ov5647_write(sd, OV5647_REG_FRAME_OFF_NUMBER, 0x0f); + ret =3D cci_write(sensor->regmap, OV5647_REG_FRAME_OFF_NUMBER, 0x0f, NULL= ); if (ret < 0) return ret; =20 - return ov5647_write(sd, OV5640_REG_PAD_OUT, 0x01); + return cci_write(sensor->regmap, OV5640_REG_PAD_OUT, 0x01, NULL); } =20 static int ov5647_power_on(struct device *dev) @@ -788,8 +712,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 +739,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 +769,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 +786,10 @@ static int ov5647_sensor_get_register(struct v4l2_subd= ev *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); + int ret; + + return cci_write(sensor->regmap, reg->reg & 0xff, reg->val & 0xff, NULL); } #endif =20 @@ -1089,33 +1017,34 @@ 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); + ret =3D cci_read(sensor->regmap, OV5647_REG_CHIPID_H, &read, NULL); if (ret < 0) return ret; =20 if (read !=3D 0x56) { - dev_err(&client->dev, "ID High expected 0x56 got %x", read); + dev_err(&client->dev, "ID High expected 0x56 got %llx", read); return -ENODEV; } =20 - ret =3D ov5647_read(sd, OV5647_REG_CHIPID_L, &read); + ret =3D cci_read(sensor->regmap, OV5647_REG_CHIPID_L, &read, NULL); if (ret < 0) return ret; =20 if (read !=3D 0x47) { - dev_err(&client->dev, "ID Low expected 0x47 got %x", read); + dev_err(&client->dev, "ID Low expected 0x47 got %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 +1069,76 @@ 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) { + struct ov5647 *sensor =3D to_sensor(sd); int ret; =20 /* 10 bits of gain, 2 in the high register. */ - ret =3D ov5647_write(sd, OV5647_REG_GAIN_HI, (val >> 8) & 3); + ret =3D cci_write(sensor->regmap, OV5647_REG_GAIN_HI, (val >> 8) & 3, NUL= L); if (ret) return ret; =20 - return ov5647_write(sd, OV5647_REG_GAIN_LO, val & 0xff); + return cci_write(sensor->regmap, OV5647_REG_GAIN_LO, val & 0xff, NULL); } =20 static int ov5647_s_exposure(struct v4l2_subdev *sd, u32 val) { + struct ov5647 *sensor =3D to_sensor(sd); int ret; =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); + ret =3D cci_write(sensor->regmap, OV5647_REG_EXP_HI, (val >> 12) & 0xf, N= ULL); if (ret) return ret; =20 - ret =3D ov5647_write(sd, OV5647_REG_EXP_MID, (val >> 4) & 0xff); + ret =3D cci_write(sensor->regmap, OV5647_REG_EXP_MID, (val >> 4) & 0xff, = NULL); if (ret) return ret; =20 - return ov5647_write(sd, OV5647_REG_EXP_LO, (val & 0xf) << 4); + return cci_write(sensor->regmap, OV5647_REG_EXP_LO, (val & 0xf) << 4, NUL= L); } =20 static int ov5647_s_ctrl(struct v4l2_ctrl *ctrl) @@ -1254,12 +1189,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_HI, + 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 +1370,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 04:34:44 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 F0585B665; Fri, 26 Dec 2025 03:43:55 +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=1766720638; cv=fail; b=mWjRbt2I5ga8Px3RS7V2cKyKdOrJnm0h/V7m6dD2nJxDX/aYKWzEXyDdiiAak7VOwHOg3YxF2AkLMaEnP3PrROTXiJKeEbFLqLaMXUpMrtdkQGezZV8QGTJ9tpas9h/LDycLME2dbnDkvk6yRA15haHGF8Ms59ybdAALKWPz++M= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766720638; c=relaxed/simple; bh=IcmXdG4G/eHctR5c1qXWoDomauV9Y1p56N7ZXL/6SBg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=WZ+qJoi3TwzGzb1A1Yatn4Fj2MjtBOa2HbhgzZlhq/n2xugNN61uHB5G/bK5gDmVvTaMD0HsOLgVUQ8VgJtqHxWmTbyl+fZ2aVKOtL+469gQbco05ckz1/my3OeSSWFkgbhO46Nh+lGaIO3SrYozPAlKvwm/TVh6CrBwGyedbNc= 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=eQz/QBmP; 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="eQz/QBmP" Received: from pps.filterd (m0250810.ppops.net [127.0.0.1]) by mx0a-0064b401.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5BQ2mxJb2152822; Thu, 25 Dec 2025 19:14:01 -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=2qtjmGj5b4nZ37ZSKkvhaN9xBCLaY3Crm2fg8NRtQYU=; b= eQz/QBmP6yvgh2oAco7lXpKs7Dxj2W0/B3x2m8OB13pF6o2StYqWfIfbAgmcBt7K FUISYhonjCcTciMPwN+FsVN7SVQAPCp/E3wnoHhTnVI1kfSCC6XwZkIEp61vbdux lKP9K/Jsh11se2SeostWe5dd7gGaQfYawWUQuaNJxkgPVjOrOtk6QIWunTAksWR4 frP16juTS68bdhxRKAYYUT+ZT4SH74xWfM8s5lInMM8ug6u0caU8lF3rdA0IjyIt R+xyHFO+K1joF3iHwTz1+jO+AM1KFU+ov3hBqqJJuZsqPET1NqeXLbsEmkGkvntU uuvOgpc/lSRuwyAhqXi3Xg== Received: from ph0pr06cu001.outbound.protection.outlook.com (mail-westus3azon11011043.outbound.protection.outlook.com [40.107.208.43]) by mx0a-0064b401.pphosted.com (PPS) with ESMTPS id 4b5qy4wab5-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Thu, 25 Dec 2025 19:14:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=SOWQt3LeGPKSYbOklNn/9nQ3c2SYDfQF5Ygo7udPoeCUplHx5Skw2nIlz0v25OvINouILiXv8KJZQnx2rX/bRoMEsZsHGf86r7NMyMTZXUBLX1EaYK+an4Y0F2D6VelCjZANhMh8Gjjv8bnfe8FEsNm8J/JjtcMftOjWPrNY5AKpBX5AgU/tW47P3/WS5FrOV8t0WDfe7z3xKY+uEoujHEUVlpbK9Axbndbo14i9GyCEg3hZPnHkbWSNbftdNGK+FN+dFxQ5KyFnWGY7N3WEehWdUYF4qlxFsmmDTDIaN6jbzcstGdDLlim1qFbjt4GIsw8FqRS97uIT7kiampEihg== 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=2qtjmGj5b4nZ37ZSKkvhaN9xBCLaY3Crm2fg8NRtQYU=; b=HS1BcKA820xyyEwNJZKt9LzQrIclRzTFVLTX6MSt1x/Al2mI7Q0chAgiPl1yg0ayUVCMu9nkfWyEhpkvURg7RnqPz5gpZctR2TkgtaBZbEq4CA1vavm47qizDXQ2newGlB/5ssTH/VpONWsdtyUhyyDj6yyMyrJpBASqhGOE3GOOUJKGegSg2oj8e58mB6XHvVcdS/ZFUq+YMjSqXMkCYy9cgBzcOtVMqAkRnFmoe1ZV4tt6+P0G+030VNFwcyFW+zP1zGQ/NciBSPSXfUeDwqFfp5wVKCmvl+RxspfiJY29pXLEKPpl7NT5wnJpJ/QYTnmLodaZBL2IifNKccoUgQ== 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 DM6PR11MB4660.namprd11.prod.outlook.com (2603:10b6:5:2ad::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9456.11; Fri, 26 Dec 2025 03:13:59 +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.008; Fri, 26 Dec 2025 03:13:59 +0000 From: Xiaolei Wang To: sakari.ailus@linux.intel.com, dave.stevenson@raspberrypi.com, jacopo@jmondi.org, mchehab@kernel.org, prabhakar.mahadev-lad.rj@bp.renesas.com, laurent.pinchart@ideasonboard.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 2/2] media: i2c: ov5647: Switch to using the sub-device state lock Date: Fri, 26 Dec 2025 11:13:11 +0800 Message-ID: <20251226031311.2068414-3-xiaolei.wang@windriver.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251226031311.2068414-1-xiaolei.wang@windriver.com> References: <20251226031311.2068414-1-xiaolei.wang@windriver.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SI1PR02CA0027.apcprd02.prod.outlook.com (2603:1096:4:1f4::18) 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_|DM6PR11MB4660:EE_ X-MS-Office365-Filtering-Correlation-Id: 45237120-9607-4393-6632-08de442ccfd5 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|366016|52116014|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?DOikvhkd8+rMO7XhziCofJQKthTDHkBRKoU+dov0m2Z4ffG+XAsNYmAu0gKh?= =?us-ascii?Q?zQxq054uK6DszfsmxXlBQ7aAbTGAOPrBe8vUS7Zd4sB1pQXeHthWFMmstN1S?= =?us-ascii?Q?DMXUqX2f0CWFWhO1ddzFhAh5WeWXy2bf1oAIL4XqJTQuYJIqbw9Mqc7d6vQY?= =?us-ascii?Q?jARWBmhZA7eZeTGeiOboO+BBHes99ZPRbDeHoCcKjQfujE3rJCryAH7GgzwB?= =?us-ascii?Q?NCuXsS7MndNkXfAOZGhpG2ErYJ6HscGyJLKe4a0B0LlEUouV8yRxgG4ptPn+?= =?us-ascii?Q?5CESMJJAtsT/16f6z3vENVyFyLLBMdFpDVzPO06M4/TEMI0aewzyda1cXhAX?= =?us-ascii?Q?yLtB1BcOoz+4wpM1vXCASdNOksOVQazaQyDB1ZvyjgH/kZLIoe7OXT2sXVcU?= =?us-ascii?Q?L+8L/VwYpsjgVGy9fG5sxurX9Pf4+fDsjmgmB7HsEoc/fQtwGsnR+c2b/3le?= =?us-ascii?Q?w19hI4PcAQg1T1VO9W7i3zpWr9McA8tNSpeq7IPg8ecNOCLKxT42BuBO+BKW?= =?us-ascii?Q?vYDYAiKYWGKZjt7FLmmEukW68TeQgAG8mA1idS7WaeOLDgXK9SZJBMliwr45?= =?us-ascii?Q?Ev3cgveomvz5ylETtJTDiyzYdeggKslkzKeXu+HMCjVPZa5ULZfdUIUImpsw?= =?us-ascii?Q?HhbBba72TolMH38SW51vVfvzK4nOMtk+VE6alPhazsvMIxFAGbWQFmKXeUEn?= =?us-ascii?Q?3CBjKJ3H9TqQLYcvIt5EjMx/tEou5ubfWHwZFfm0wBecoOmhPYkc4WdHBzZs?= =?us-ascii?Q?8DbnQwGSTB+wq8XhgWV0JSt56mJpRwG7lrJf+UGWJefmnm18yzqXMEdxMPSi?= =?us-ascii?Q?8K9YeRAn5QMRq+A9ZaiSuHNVYBDcZ3ZO1mNRAzGLCGXdM+GEY3rugYVddVfj?= =?us-ascii?Q?oNy+xsrmoFPqeuWIEBJ69vRtjxgYQu/yPIJmrUYVWINuaIAtiM0Ah9oIeEqD?= =?us-ascii?Q?fcfimxI32Gdejxtd2wdxnvQWLBEjDLGSKAL+BVmuoJT4YP48akT3eGAjCYlC?= =?us-ascii?Q?L/Yw9Y9Tcc4rUQpIrYcshwXZfmaLUuOcorzLss6u+mzPYGowbC+3dQg04f5w?= =?us-ascii?Q?DXmniJan09Yq5O19gTAliM1jlsRXlWZ7qmQEJcE9upiDrELUi/dq/MZo/PER?= =?us-ascii?Q?MWVkevVHy3JsXsW8fG3nOQnuF5ChMckmF0AgucYLdKyXbdw4ij/S1bChj5Ac?= =?us-ascii?Q?j52CdeznI4Sya9iWVFt+Ykv5HItlsGN8Yx5cTg+I76nue3ozc1vCW4Fk5nTH?= =?us-ascii?Q?UadblbJNp91HJvS3YfJwvM1Sjr9X2o5DgIvO0RG86bXW8i4LHnClqmSMEQe4?= =?us-ascii?Q?EjkxKtpiruL5WwffpLoAZjhzwuDk0isPiDM0tde9mlMFSWkZYfwzKoXO2meM?= =?us-ascii?Q?P6brRjoovM2mOrbT+yF7numHieyhqx+rzrs6LoYEI+lzY8XaFF2uaxi1WtpM?= =?us-ascii?Q?w9brRw4gfSLScGzL25xPr9RM7HnsEpNLbXP7YxtJuO6IPxsOr8Fcv+h43cCT?= =?us-ascii?Q?q5zBwK87BJmDUkpPDeq+u0E6PL7lPeLzgth8F3kCCcf9Xy0d6mw6Hh64pg?= =?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)(1800799024)(376014)(7416014)(366016)(52116014)(38350700014)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?ikDA2F8rAcNGEx30gLKuxDxCpmsGSeZhX5ioIQIZvx9VTzP318njijB4gGFX?= =?us-ascii?Q?MN4+bvZ3C16Ynpek8Y5S0y0UhWX1NDONR+2U/8Ep+cdKjxEhhwIDMDgWv1dJ?= =?us-ascii?Q?e2HkbpsyxXMthd4Xibx+UKLSsbK53aMriXp0UraIZ6gXujrE3FJkvsZizswD?= =?us-ascii?Q?qu1aX9dIZOiVazSEbeMjAbORxBg2l2fRQzp73Uiw764UiAbKKp7RbtdcEKJH?= =?us-ascii?Q?I50V8bm17fbRHuvk+11spjBSXGT+19P6Qd2QhyHV956g8QgpzePih/pdOgko?= =?us-ascii?Q?BqySQkhRirqoMBFRffYmKWFl5sowRmemLIeZO9R/mLsAlUo9VDAzQhYbbRH4?= =?us-ascii?Q?5z273f4rSuJabW0+99d4P7ys8E0hPh9R554TE198XOxWr/15XdgR3hg6rQgB?= =?us-ascii?Q?JAE4WZpc5YGyoDEuEfOhGCSLrSdaZLM3pSE8TkeYpPNFzwRoxw6eog9M8nYM?= =?us-ascii?Q?nFR445JiBQaMKAgfwLAb21BXf/s31G0oZj0nq6Ug96IlJKTrs4qc28RUBVGd?= =?us-ascii?Q?hExf6/JFnlUZXHxBtn61AxuBm3UCjFFH+OAdbD8WSZilNVib2kTJPq8Eu9kx?= =?us-ascii?Q?knENHr3V5yUQKLJSSOfsVShDNcHWNOuzlKqPIsMxfSqRLt04MFfk9AGqrxv3?= =?us-ascii?Q?xqQn8hb3twy87k4fOGE6EfBs6wtSzoix5FPwLuK4eZKFb5qKB0xXLAu5Nusu?= =?us-ascii?Q?B2+s3AcXMS0sSO5hDP4jFq5TwpijJ0h96J8nq5BRNJZqPr7aE4/r/+L5fIDI?= =?us-ascii?Q?u59QMucVlG+UQldsMKSY+C17ziYhsjLSaWh1/UoLrWONslEQJBkp8Ov1kXL5?= =?us-ascii?Q?vUEV9W8vQf+R1JJRlMfo6d0/s5nTkdnSdKxk0U5QlSMqym7dNicdWxaystLi?= =?us-ascii?Q?UC9r3tSceBpi+aH/29+xGTVpvTZt9VVamgBVVN7QSriL8x5H91+4Sc4ic07V?= =?us-ascii?Q?rRGOShm1UsiMhiTyesunFQbWrOdZcnAT7bgs1m0PaLczrw9IEly6NnBcPOf0?= =?us-ascii?Q?MojgRndfi3oUr0oenOsF0JHsxjImZYCtsUte6NG4vRaAKGDZoKiVmC0BKfsV?= =?us-ascii?Q?OkgwKBiILx7E1lLiToCgxSUcjm36LA2FaocMxy7bN4oGE5wrGsB/QwoO5w45?= =?us-ascii?Q?0Puy/kbFpANAuWx5/rMhibS5+uAACcwBKEZ9myrlRs72mSwiVKhJcx8HADL5?= =?us-ascii?Q?VZc9Wsx482SRy3FLFfo2Bjn0dMq5KB2t7Y6MAtfDnj0s4tu1f5BBJUULOtzg?= =?us-ascii?Q?TPI656uUYdRD1vxBRBjpfH8fBkSg79aPXdGxvL034Wf9O09e3Vr1DnotjiiF?= =?us-ascii?Q?+x8O1oFhIkUDQwZPFLD8LWVxe3R2Lq2uDplNX3lHsRVg9aCq0bGc257eUX24?= =?us-ascii?Q?K6M/9cOvk5m/yYDubpBk3LkYvwFzbOdUEwgJLtDP6iFeAPEHtiEd+iF2Gewb?= =?us-ascii?Q?yV5j8NJpvPjQGcX8ByOx2MmRaAKS83GPn9qLiUUsN7gM/ltERO+maJNIZjWC?= =?us-ascii?Q?SEm5WNyaOv7pZJszCdvjMZMUCzYRtXKDyxiz/VoOy0F/7TogyExTvDb6Gq1q?= =?us-ascii?Q?wN0w2ofk3MjYYCNmHqwcTs+jIWQVCgaHCsPehSyzCNC4sJynRpBYD6Pk75Ya?= =?us-ascii?Q?e0dZl5x62xDvcslacPV4eXzWa/Hp0ZsI+UhmYKEKzd5oPGks+LRgdrVq89jp?= =?us-ascii?Q?qiX85zV2RV4rKhjOVzIMMQPlG934zyaAjc/LXWPDteGA7mm5nhXLxCQuPMCj?= =?us-ascii?Q?P+OEEcEefj/lhPvibvLotcH9jclqBcg=3D?= X-OriginatorOrg: windriver.com X-MS-Exchange-CrossTenant-Network-Message-Id: 45237120-9607-4393-6632-08de442ccfd5 X-MS-Exchange-CrossTenant-AuthSource: DS4PPFD667CEBB6.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Dec 2025 03:13:59.0952 (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: je6zOA+bD2bMn9hexywUmUDCk5NRetEQbBkCogm6Jt1LbJ7BerUjkbsVC2MlijqH10G+BgJ+iQMJZjXjnpMH2oDR+8qj1nBSkHnn6zY+0LA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR11MB4660 X-Proofpoint-GUID: TImIRxv3IVhEBa8CfqE4cP-ojs-QdwD1 X-Authority-Analysis: v=2.4 cv=Q+vfIo2a c=1 sm=1 tr=0 ts=694dfd79 cx=c_pps a=dlt6EHtatQYmFek7NWVDaw==: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=Q8O0FyF9z40g30L6lpcA:9 a=FdTzh2GWekK77mhwV6Dw:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjI2MDAyOSBTYWx0ZWRfX4bLerRsxEiWC eRWTZ45c/D3054t2LBBIWym1e3JxDswUovkCwzxrxRBOWdCMSvKt2VU0KGYAMVel3HoyWlV3S26 mLa8E+Ccbo2GFGetmx3wFf2dMPHZRADCOx5AeribRS2ywSJlan1mDsJfbnpg3f2uBofcjuDBCoi zUhVP0xtCDrW+J7LiLW4TchOyhNYZgFipufPNWzeyhfy2yRS/9pEMnWFtu3JMxE0y9Xl0rkYgq5 oGr4GYWoIkCJmkcuOd/tpX8Z5Tx2T7WkUF9j4mcCPrLIjq3yL6DcprceG3/+zUCQmtZVMCW9fnt YmPUtFg5FOnkdja5A6ANM+h/A/kq5oqtnxezf3mpmKU5fCTIQDfU2Vl0eHFZP8LVyFWmHSPiMdi e5Ms1enM6ciDFh/kPQEVh9tvKvOjxVQ12kxtT15r6e8MGT5fgMe2VZ3PpC1yYok/cb9MNq3T2LC MET2MMIdj4Vy/cNtt+g== X-Proofpoint-ORIG-GUID: TImIRxv3IVhEBa8CfqE4cP-ojs-QdwD1 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-26_01,2025-12-26_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 bulkscore=0 malwarescore=0 adultscore=0 impostorscore=0 suspectscore=0 phishscore=0 spamscore=0 priorityscore=1501 clxscore=1011 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2512260029 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 1f8e173417b8..2619971353fd 100644 --- a/drivers/media/i2c/ov5647.c +++ b/drivers/media/i2c/ov5647.c @@ -96,7 +96,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; @@ -657,7 +656,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 @@ -821,15 +820,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) { @@ -845,14 +841,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; } @@ -900,7 +892,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, @@ -912,7 +903,6 @@ static int ov5647_get_pad_fmt(struct v4l2_subdev *sd, } =20 *fmt =3D *sensor_format; - mutex_unlock(&sensor->lock); =20 return 0; } @@ -930,7 +920,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 { @@ -959,7 +948,6 @@ static int ov5647_set_pad_fmt(struct v4l2_subdev *sd, exposure_def); } *fmt =3D mode->format; - mutex_unlock(&sensor->lock); =20 return 0; } @@ -972,10 +960,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; } @@ -1149,9 +1135,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 @@ -1351,13 +1334,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); @@ -1385,9 +1366,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); @@ -1398,14 +1386,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; } @@ -1416,11 +1404,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