From patchwork Wed Feb 5 17:18:11 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Frank Li X-Patchwork-Id: 13961599 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id AFA85C02192 for ; Wed, 5 Feb 2025 17:23:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:MIME-Version:Cc:To: In-Reply-To:References:Message-Id:Content-Transfer-Encoding:Content-Type: Subject:Date:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=zrNl7NG9xgnd9fOO6wDjU0zmVk5wr+zQtKatUgDJiFk=; b=cyQFgKgMF+nnDgsDcVTJ/RoABv 68EO3nn/Kko1zD1drM++GDD25ztkzG9isvKSOEgTaTuq27Zt3aVTa5ZT1Mr8gzIWTlNRz1LtnNOXH orSI0f//hjxqah7JF085fDkaxfNSk3Fbt964wzKeZITM159VDhvxZMEmU0Yz2/T3ESctCrZfzdNgt TTOS57W3udR+7en1rOSw3HOp92hEDEZc4q7jzU/KW1UZqv6L6wLxseW/buKzgVdhPxRS56mT6Dd6t innn5QBaKASAoV66+FYmWu3me/4ZoJklyfN6uZ/Rn4bW1FtfcYhc52GqFbjVC9qix2J+J0KEJupN3 y7UmLb/w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tfj7A-000000045Hx-2xBz; Wed, 05 Feb 2025 17:23:04 +0000 Received: from mail-francecentralazlp170130007.outbound.protection.outlook.com ([2a01:111:f403:c20a::7] helo=PA4PR04CU001.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tfj3G-000000044P0-240O; Wed, 05 Feb 2025 17:19:03 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ouqWX13nrIGtwf1oPX672lg1ctGpY8Zluz+sao68H4e1Y8OxsK4h80XTh/YXckJhRC6DofabilBt7VI9jjET9AkCYxstN/IvQ+QiFxwKDmhYtVEP1cQGMNGURdVexPfFwaLdTLf752qH9IqyEosnuGHq/lRBhxQcm16Gh0WpECCPW7tJvo4CHqA1PE4sSYp1mWIMz5OfRE/Uj5qLqGbN+V07CwCuFAzIKoqbcrZ4XL4Jug9zS7Zjd4bqWqj1CjpwCiypOXq1OZ1/7eDwoax40OjKk2+VNnw9YJpl+XQCx3q2g3L8jodA1vySiGUaZjNlTwHqnkxGUnbRHeUMB03yfg== 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=zrNl7NG9xgnd9fOO6wDjU0zmVk5wr+zQtKatUgDJiFk=; b=A2LgFj4UTcJq7uJH8YeYBJy3yYYg0OHl/9T1jUDDy6tIKQVtNq/iVBAdxmCp94UVDZHB7G+DRwmP/3kjqN7mm4R1SDu6BBOK0cp3lMyPD/JeSH/9fuJ5fFnmqsl+p946rrXhrG/0ND68HttCOqprU1F2XaEsZLOvOJiV9cxLiF5EGIZ/zgIg+JTXxhGZYYUD9Xx3eg7818oYgktXIDB6Jq+aEx6N6I2+kS80BtIa4BFV+3ZH/MKUWxjLD1SpJPWR5u/fAYSnzz/HLvVEtaDlAKfAImbqq7TKir3hqaJe/TwUigwLWkBRcqqU1LKiRDpId1mYrxeknd9LOCvr63PPAw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=zrNl7NG9xgnd9fOO6wDjU0zmVk5wr+zQtKatUgDJiFk=; b=ZYf3tJPEhFzbXqKyxRBP+D9flGMsLKZf9lk+o077yrHlzHdgTHHbRr2dJSC18YWpdr5ONCJp9YYtrxB2fmSL6y0rVnBhCpjcW5dmtqddlGH4ikPEfByZ+y31KqYA9agfJAbnDslCNxcJ68NckTRAv/YcmJQknc6EdrDcX5XAUs3RTpPvM/DiM8iWHw6GhhDAVgjfRC10NL7SZky5FbIxfohNs7o/sAAyN8+plRX+4cF8xrmT+D5246cn1lbDyF1EEOacySCVO89sKC4iPrKx9dWBHfgevbqm5JWPZyNXUyBEm0g9Jjfs1UXr2pTZshsW3pSQe/OgaUglJaZCR0F2YQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from PAXPR04MB9642.eurprd04.prod.outlook.com (2603:10a6:102:240::14) by VI2PR04MB10546.eurprd04.prod.outlook.com (2603:10a6:800:274::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8398.24; Wed, 5 Feb 2025 17:18:58 +0000 Received: from PAXPR04MB9642.eurprd04.prod.outlook.com ([fe80::9126:a61e:341d:4b06]) by PAXPR04MB9642.eurprd04.prod.outlook.com ([fe80::9126:a61e:341d:4b06%6]) with mapi id 15.20.8398.021; Wed, 5 Feb 2025 17:18:58 +0000 From: Frank Li Date: Wed, 05 Feb 2025 12:18:11 -0500 Subject: [PATCH v2 02/14] phy: freescale: Add MIPI CSI PHY driver for i.MX8Q Message-Id: <20250205-8qxp_camera-v2-2-731a3edf2744@nxp.com> References: <20250205-8qxp_camera-v2-0-731a3edf2744@nxp.com> In-Reply-To: <20250205-8qxp_camera-v2-0-731a3edf2744@nxp.com> To: Vinod Koul , Kishon Vijay Abraham I , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Philipp Zabel , Laurent Pinchart , Mauro Carvalho Chehab , Rui Miguel Silva , Martin Kepplinger , Purism Kernel Team Cc: linux-phy@lists.infradead.org, devicetree@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, "Guoniu.zhou" , Robby Cai , Robert Chiras , Frank Li X-Mailer: b4 0.13-dev-e586c X-Developer-Signature: v=1; a=ed25519-sha256; t=1738775920; l=7684; i=Frank.Li@nxp.com; s=20240130; h=from:subject:message-id; bh=rWhaCHE6R/z6MsGEbw/8fr0AhfVz/TD+W3KlZjzV0JM=; b=QM1qP748O76Ha43e3+ITFbrNpaqnUAcuGtoKT5YHR0t+qnmtePBqDqeQiNfcEJ4lG2BGPcVrN /dvfytoMn1OCUJWl/YJh+t5v22TH6M9EGBh19H8+lxR7TFQO+T1SFBw X-Developer-Key: i=Frank.Li@nxp.com; a=ed25519; pk=I0L1sDUfPxpAkRvPKy7MdauTuSENRq+DnA+G4qcS94Q= X-ClientProxiedBy: SJ0PR13CA0001.namprd13.prod.outlook.com (2603:10b6:a03:2c0::6) To PAXPR04MB9642.eurprd04.prod.outlook.com (2603:10a6:102:240::14) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PAXPR04MB9642:EE_|VI2PR04MB10546:EE_ X-MS-Office365-Filtering-Correlation-Id: 02e669b4-6b7b-45f4-8515-08dd46092d1a X-LD-Processed: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635,ExtAddr X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|52116014|7416014|376014|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?q?pM6rjJ+F/NGy2BzeXIi9925WiP4MEN8?= =?utf-8?q?ImBeEoI5mfCKp1v3+e9M7p+NaS8hxBW333yYv7lsRpwugsxGykgEztsSYditDCF6N?= =?utf-8?q?EvOrLm8HVUvQ58+ysylqHHBJ9pToufRRH9k3qAEGbId30MFpZ9sKethn2fnvIUw1a?= =?utf-8?q?FUc+CxIkRx1fY8mLSRGvv3cV5LKTLf4+j8720s/03GChJHxCl7p+4K492dmJ+Nuz9?= =?utf-8?q?Mt5Mq4YKFMvj+s/iY135cpVhIj4XGlW3tXjUx6HhVD/aGHPc7Wek4InwgRak6CdIi?= =?utf-8?q?5y9tImQKm0vygu7uVyxsxYNXhc0p7r9H8EbD0k/dkf0VyeAtUJaFeElH8BLWxKcqf?= =?utf-8?q?VjJnyZEVp0+lQ+nZRz6Ky1uMKFjSiD6137qH3cqF0tU95nE/2ONDI4/dxhsul8ic/?= =?utf-8?q?07mgV0RDpKtD97GCN+I7XpQo9+t++Dovn0iWj0xsYQgXUyPzAEhs0FR7kHC2H0hBS?= =?utf-8?q?9Jc3qbrPH3iBPPDfL6fY2lbSXZ328pUIzLamCHRKaZ3FJs4Ygkin8flH3uDVC6PhH?= =?utf-8?q?0Wjt0KPemoztqiCePFrKr4wi3sQ7UseZ+KrjBBFm7+aiFkMDw++8nM2sCmK6No6xp?= =?utf-8?q?yPRFIJtniNwEKNgfVnRTVsn62Py9VZc8RLGGEz0jmIDVhk8uP04UGZK1duBbL9jiL?= =?utf-8?q?DgP2y1jSFAAW0gogoCCRwidM+9/pFZ/SWIwMslPUDF2+dG9ZANJxj/avYqOoGmQs1?= =?utf-8?q?v+NRwfm0xYO6KYswQ8BWd1I6kWIgP90yv4/qbo3tLEYNYc0bnt782UtdXOXbjEsFS?= =?utf-8?q?Rcbg9jN7iwqrBbdI4CwZvZTo4+EhlrMkFWayzpjucFRc9r7SUIXT32Ig8lSOs1+o4?= =?utf-8?q?3+pKWG6ViYuycgbEHj7GtHUPvCVmOO2YwP6Vp/MJ64p5QCmT2kFlaVsIIB05FVFRx?= =?utf-8?q?7bI1n7xqQyh+VlxCNT/E5eErf0jWWE8sFmostARhNL6I3fHSSYwos2940BJc82piY?= =?utf-8?q?bul9KVLFcQHEmhF28E85TX9CBMCoDH8KGvj/O7POTarMy1pCCG+D2dbMn/kVef0rl?= =?utf-8?q?JqiyBpvw7SwGRx0G3ORU79AmSwcBOeFcXFC5P9zeS123I3yg9X/v3h+nPQC988+7n?= =?utf-8?q?dQPzSezFg1oe1dxMPrZRTeZa+KtIgGzwHbXlVehZdxl6J4djmKVtLoWZeAr/6hyv7?= =?utf-8?q?KBLzmHvUXrHKo1UVR1rpjGrBntH2JdxH/4g6QLiml+JN33Ga/BQlFcEvVrN22JyVu?= =?utf-8?q?iqzHdLjeV+zFLxdhsjN6Qu0SZalnvsFNvu/BjRbJJHUweHeSKAlr+tAHW1NRGNaPg?= =?utf-8?q?lCLoV9b9Cbz7a9WQQWv4rncJswa07mogfdoPlDKICKmAL94yELwgjGhW0kL0IEaLT?= =?utf-8?q?mn/+JRlp5tz3mbghnXuoCWSXLrvCLNF+A6LUqc0sDGhnXCWRxojdkArzd8Uj4FwW/?= =?utf-8?q?FGy9UHTR2CI8Lk4vkqedpU7mvzMIH+fjQ=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PAXPR04MB9642.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(52116014)(7416014)(376014)(38350700014)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?zX8qtv84vuNaLGPed82xbNqMNUey?= =?utf-8?q?EgudeM+yD/om671wVN91gvhqvmXK0RYQ2zZwFFUVX3U7QQZB5VL9ZpZHArSgk45Bw?= =?utf-8?q?F/9/RUSHqRtQ0tdHCpTucGVmPDf6Exy7TAHoilPvx4Qrdi1V2jt7IIbt8Pqc9N//X?= =?utf-8?q?wQR2czLYws5FDZcBoFpwI77nSYcld0Dn/s1jiVZY9jZj2p79gdYBOmKkGti4tof8p?= =?utf-8?q?k3CxWA24TcFsX7WsfwwowINKKBxcuDezXyA7G64o09aB13tW5/CIVb8GnfHKH017R?= =?utf-8?q?uOwwowqRbXoX5W5xD4aGBGao2fPEP3qYE+nySw1itc6rPRIGvpZ58LcrwWZdQmthf?= =?utf-8?q?k9naZ/0KwRUddM0/2AUUBG2Yo8nzOJJmGzzDIy75CTlUnqIJeFOkHGZv8bQDlxUOE?= =?utf-8?q?/xlJ2VjVvqZx1omZz4tYIUBgr7ar8vWHJc4/3k0+dG/R3kW2ZjjTjjFTS6bbCyInM?= =?utf-8?q?8UejoCZSXTWoY/5HOVnAhEMo2HdISPw5mc8SRRFCHjGq+xBLayTDpOLjT07gAf/oZ?= =?utf-8?q?0fQLfGLPBtMqoNzwkC3Fp1jcme+8rRrPmPwDHXkR1xGhXpKD+XdEV+0fpNTf8pJiQ?= =?utf-8?q?OLwdOqbjuGqNg2MO/E3+5ApUYhvSEZr5VIirb2v7WaLg9twY87veLp7eC9yry4yzn?= =?utf-8?q?bKnBIXXrnfWbUjc9E3Lgokg8ssuRokz26BDzoMpGdX3g3yFWpfAIfFGvIrgo+bt8R?= =?utf-8?q?Ft038IgFG0+jqVmU00NOTXdxtXplAyA4njutSupOw+0BRG/wyzXMoPQ7zqrLxA3cb?= =?utf-8?q?kDlOXvPSHhVjrzpfFqNBeqsmyfX2ycSixPtLUrahKOv8KFD+OxSxpVsdCBosEfDaH?= =?utf-8?q?GyIKvYin6xQhKvzjAb+sMGrfr+RtudDSdcvcn1lfsY8ZPXUWCIs/0gluVPIS3fEoc?= =?utf-8?q?IdFlsrzuHrS4VGmsB1PiirtedxNVJ1/+uE3/g68sjEAMB5VtU7Q7M+zBG4waDfPte?= =?utf-8?q?kjlcLy6ndAC3Ug/Il/C4w9JoJQdexoSki8cWjVhLWfJ3NT5icxOdtpn9xr4izjAAZ?= =?utf-8?q?Q02mhtwk0zVhAxAKOd+Z/SrSr05Un9SlN/DAxNLutvLHUfjbtfnlDDOt1u1qeHLrL?= =?utf-8?q?0zHBmO4Y/OWQ4NFzp/uLh9SbY1/LZVmGPHodTytHy7CGRRT7omxXPBMC4z7JBeBt9?= =?utf-8?q?QS4zj4qc+7bG+rgVoqPmdI2AQGrdMsuKRwt+q3xKvssY6zFS+H46DABxzxLdomTVh?= =?utf-8?q?ZNZWgKISJplUuOlKyb9ZKq4E+uklz4vsjTQxnrXFcZu8gIRpr7mihmXDH4Vm0T5v+?= =?utf-8?q?5T8whv6gY0SP16cyEp9w497+Rted8LYz6qGdWqIM+2HmZFOHHA2/zthpykxcNu4Cb?= =?utf-8?q?Sfz1YnFVyjuwGwaQ1hsLU5MHRk7YxDBi/O5aUhasYLisJJSDTLVPdG7fo2kg9R6KU?= =?utf-8?q?rvPOPENZXKE3tpAidT5xlSOrj1kU9AvGHbWNyU6Zb06icAFjxMVEVOrQSLquJwCXh?= =?utf-8?q?h0ggy8MIeibm7Ml5XeGmE3PmEaC8cRxzJXyunhelZXfHyNk/+tWX53SzQbxWefo8K?= =?utf-8?q?EpUdPL97S5bn?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 02e669b4-6b7b-45f4-8515-08dd46092d1a X-MS-Exchange-CrossTenant-AuthSource: PAXPR04MB9642.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Feb 2025 17:18:58.2862 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: IPoaqFahOfbJ7ldVLhFJ4mXos3CYJkKTHwxYH/ahUt9+zctNpqGJODbYB6Vb9yr+uwqcWQjcq4WNK864d8Q0uQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI2PR04MB10546 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250205_091902_700892_FAAB4E47 X-CRM114-Status: GOOD ( 15.07 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Add MIPI CSI PHY driver for i.MX8QM, i.MX8QXP. Signed-off-by: Frank Li --- Change from v1 to v2 - remove un-test code for 8ulp. - remove unused regiser define --- drivers/phy/freescale/Kconfig | 9 ++ drivers/phy/freescale/Makefile | 1 + drivers/phy/freescale/phy-fsl-imx8q-mipi-cphy.c | 185 ++++++++++++++++++++++++ 3 files changed, 195 insertions(+) diff --git a/drivers/phy/freescale/Kconfig b/drivers/phy/freescale/Kconfig index dcd9acff6d01a..f412fa405b9b6 100644 --- a/drivers/phy/freescale/Kconfig +++ b/drivers/phy/freescale/Kconfig @@ -35,6 +35,15 @@ config PHY_FSL_IMX8M_PCIE Enable this to add support for the PCIE PHY as found on i.MX8M family of SOCs. +config PHY_FSL_IMX8Q_MIPI_CPHY + tristate "Freescale MIPI CSI PHY support" + depends on OF && HAS_IOMEM + select GENERIC_PHY + select REGMAP_MMIO + help + Enable this to add support for the MIPI CSI PHY as found + on NXP's i.MX8 family of SOCs. + config PHY_FSL_IMX8QM_HSIO tristate "Freescale i.MX8QM HSIO PHY" depends on OF && HAS_IOMEM diff --git a/drivers/phy/freescale/Makefile b/drivers/phy/freescale/Makefile index 658eac7d0a622..8ff72dfdcf654 100644 --- a/drivers/phy/freescale/Makefile +++ b/drivers/phy/freescale/Makefile @@ -3,6 +3,7 @@ obj-$(CONFIG_PHY_FSL_IMX8MQ_USB) += phy-fsl-imx8mq-usb.o obj-$(CONFIG_PHY_MIXEL_LVDS_PHY) += phy-fsl-imx8qm-lvds-phy.o obj-$(CONFIG_PHY_MIXEL_MIPI_DPHY) += phy-fsl-imx8-mipi-dphy.o obj-$(CONFIG_PHY_FSL_IMX8M_PCIE) += phy-fsl-imx8m-pcie.o +obj-$(CONFIG_PHY_FSL_IMX8Q_MIPI_CPHY) += phy-fsl-imx8q-mipi-cphy.o obj-$(CONFIG_PHY_FSL_IMX8QM_HSIO) += phy-fsl-imx8qm-hsio.o obj-$(CONFIG_PHY_FSL_LYNX_28G) += phy-fsl-lynx-28g.o obj-$(CONFIG_PHY_FSL_SAMSUNG_HDMI_PHY) += phy-fsl-samsung-hdmi.o diff --git a/drivers/phy/freescale/phy-fsl-imx8q-mipi-cphy.c b/drivers/phy/freescale/phy-fsl-imx8q-mipi-cphy.c new file mode 100644 index 0000000000000..3137c89eab057 --- /dev/null +++ b/drivers/phy/freescale/phy-fsl-imx8q-mipi-cphy.c @@ -0,0 +1,185 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright 2025 NXP + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct imx8_mipi_phy { + struct phy *phy; + struct device *dev; + struct regmap *phy_gpr; + int speed; + const struct imx8_mipi_drvdata *drvdata; +}; + +#define CSI2SS_PL_CLK_INTERVAL_US 10000 +#define CSI2SS_PL_CLK_TIMEOUT_US 100000 + +#define CSI2SS_PLM_CTRL 0x0 +#define CSI2SS_PLM_CTRL_PL_CLK_RUN BIT(31) +#define CSI2SS_PLM_CTRL_VSYNC_OVERRIDE BIT(9) +#define CSI2SS_PLM_CTRL_HSYNC_OVERRIDE BIT(10) +#define CSI2SS_PLM_CTRL_VALID_OVERRIDE BIT(11) +#define CSI2SS_PLM_CTRL_POLARITY_MASK BIT(12) +#define CSI2SS_PLM_CTRL_ENABLE_PL BIT(0) + +#define CSI2SS_PHY_CTRL 0x4 +#define CSI2SS_PHY_CTRL_PD BIT(22) +#define CSI2SS_PHY_CTRL_RTERM_SEL BIT(21) +#define CSI2SS_PLM_CTRL_POLARITY BIT(12) +#define CSI2SS_PHY_CTRL_RX_HS_SETTLE_MASK GENMASK(9, 4) +#define CSI2SS_PHY_CTRL_CONT_CLK_MODE BIT(3) +#define CSI2SS_PHY_CTRL_DDRCLK_EN BIT(2) +#define CSI2SS_PHY_CTRL_AUTO_PD_EN BIT(1) +#define CSI2SS_PHY_CTRL_RX_ENABLE BIT(0) + +#define CSI2SS_DATA_TYPE 0x38 +#define CSI2SS_DATA_TYPE_MASK GENMASK(23, 0) + +#define CSI2SS_CTRL_CLK_RESET 0x44 +#define CSI2SS_CTRL_CLK_RESET_EN BIT(0) + +static int imx8_mipi_phy_power_on(struct phy *phy) +{ + struct imx8_mipi_phy *imx8_phy = phy_get_drvdata(phy); + int ret; + u32 val; + + /* clear format */ + regmap_clear_bits(imx8_phy->phy_gpr, CSI2SS_DATA_TYPE, CSI2SS_DATA_TYPE_MASK); + + /* clear polarity */ + regmap_clear_bits(imx8_phy->phy_gpr, CSI2SS_PLM_CTRL, + CSI2SS_PLM_CTRL_VSYNC_OVERRIDE | + CSI2SS_PLM_CTRL_HSYNC_OVERRIDE | + CSI2SS_PLM_CTRL_VALID_OVERRIDE | + CSI2SS_PLM_CTRL_POLARITY_MASK); + + regmap_update_bits(imx8_phy->phy_gpr, CSI2SS_PHY_CTRL, CSI2SS_PHY_CTRL_RX_HS_SETTLE_MASK, + FIELD_PREP(CSI2SS_PHY_CTRL_RX_HS_SETTLE_MASK, imx8_phy->speed)); + + regmap_set_bits(imx8_phy->phy_gpr, CSI2SS_PHY_CTRL, + CSI2SS_PHY_CTRL_RX_ENABLE | CSI2SS_PHY_CTRL_DDRCLK_EN | + CSI2SS_PHY_CTRL_CONT_CLK_MODE | CSI2SS_PHY_CTRL_PD | + CSI2SS_PHY_CTRL_RTERM_SEL | CSI2SS_PHY_CTRL_AUTO_PD_EN); + + ret = regmap_read_poll_timeout(imx8_phy->phy_gpr, CSI2SS_PLM_CTRL, + val, !(val & CSI2SS_PLM_CTRL_PL_CLK_RUN), + CSI2SS_PL_CLK_INTERVAL_US, + CSI2SS_PL_CLK_TIMEOUT_US); + + if (ret) { + dev_err(imx8_phy->dev, "Timeout waiting for Pixel-Link clock"); + return ret; + } + + /* Enable Pixel link Master*/ + regmap_set_bits(imx8_phy->phy_gpr, CSI2SS_PLM_CTRL, + CSI2SS_PLM_CTRL_ENABLE_PL | CSI2SS_PLM_CTRL_VALID_OVERRIDE); + + /* PHY Enable */ + regmap_clear_bits(imx8_phy->phy_gpr, CSI2SS_PHY_CTRL, + CSI2SS_PHY_CTRL_PD | CSI2SS_PLM_CTRL_POLARITY); + + /* Release Reset */ + regmap_set_bits(imx8_phy->phy_gpr, CSI2SS_CTRL_CLK_RESET, CSI2SS_CTRL_CLK_RESET_EN); + + return ret; +} + +static int imx8_mipi_phy_power_off(struct phy *phy) +{ + struct imx8_mipi_phy *imx8_phy = phy_get_drvdata(phy); + + /* Disable Pixel Link */ + regmap_write(imx8_phy->phy_gpr, CSI2SS_PLM_CTRL, 0x0); + + /* Disable PHY */ + regmap_write(imx8_phy->phy_gpr, CSI2SS_PHY_CTRL, 0x0); + + return 0; +}; + +static int imx8_mipi_phy_set_speed(struct phy *phy, int speed) +{ + struct imx8_mipi_phy *imx8_phy = phy_get_drvdata(phy); + + imx8_phy->speed = speed; + + return 0; +} + +static const struct phy_ops imx8_mipi_phy_ops = { + .power_on = imx8_mipi_phy_power_on, + .power_off = imx8_mipi_phy_power_off, + .set_speed = imx8_mipi_phy_set_speed, + .owner = THIS_MODULE, +}; + +static const struct of_device_id imx8_mipi_phy_of_match[] = { + { .compatible = "fsl,imx8qxp-mipi-cphy" }, + {}, +}; +MODULE_DEVICE_TABLE(of, imx8_mipi_phy_of_match); + +static const struct regmap_config regmap_config = { + .reg_bits = 32, + .val_bits = 32, + .reg_stride = 4, +}; + +static int imx8_mipi_phy_probe(struct platform_device *pdev) +{ + struct phy_provider *phy_provider; + struct device *dev = &pdev->dev; + struct imx8_mipi_phy *imx8_phy; + void __iomem *base; + + imx8_phy = devm_kzalloc(dev, sizeof(*imx8_phy), GFP_KERNEL); + if (!imx8_phy) + return -ENOMEM; + + imx8_phy->dev = dev; + imx8_phy->drvdata = of_device_get_match_data(dev); + + base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(base)) + return dev_err_probe(dev, IS_ERR(base), "missed phy base register\n"); + + imx8_phy->phy_gpr = devm_regmap_init_mmio(dev, base, ®map_config); + if (IS_ERR(imx8_phy->phy_gpr)) + return dev_err_probe(dev, PTR_ERR(imx8_phy->phy_gpr), + "unable to find iomuxc registers\n"); + + imx8_phy->phy = devm_phy_create(dev, NULL, &imx8_mipi_phy_ops); + if (IS_ERR(imx8_phy->phy)) + return PTR_ERR(imx8_phy->phy); + + phy_set_drvdata(imx8_phy->phy, imx8_phy); + + phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); + + return PTR_ERR_OR_ZERO(phy_provider); +} + +static struct platform_driver imx8_mipi_phy_driver = { + .probe = imx8_mipi_phy_probe, + .driver = { + .name = "imx8-mipi-cphy", + .of_match_table = imx8_mipi_phy_of_match, + } +}; +module_platform_driver(imx8_mipi_phy_driver); + +MODULE_DESCRIPTION("FSL IMX8 MIPI CSI PHY driver"); +MODULE_LICENSE("GPL");