From nobody Thu Apr 2 06:33:13 2026 Received: from SJ2PR03CU001.outbound.protection.outlook.com (mail-westusazon11022090.outbound.protection.outlook.com [52.101.43.90]) (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 6E5753321C1; Tue, 17 Mar 2026 19:52:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.43.90 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773777138; cv=fail; b=mgA6kSIF0OdB6jsQLngJHUcxD7Fam/KiQinnjfZf7nDzCCe9yr/YxlvAJVBudiH8bspY471pTE5h4kpo/qaFQkD/tOg0qZ5wcVbgzXefWG4k6bL9K6owfazvWZxLBGCA5jzb9b0xzOrAx+s0HZT9tVF+lzcY+tip1yk7lx8LqkQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773777138; c=relaxed/simple; bh=6ucJcCFeod8tYjdHcEDHv3tGepa1WY4yxfMfYg1hpEs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=C7YfUjBpRi9Xlv/Cdb/uHWpS1f6VAotcOsui3MEkc6zpaBkHSxancHodMWkzw8m2t6KOjZCoYYthjmay//bd45KihcEVQ7yQg8mHco7n6NCJkkr8mFt1RWXYLEVnrTgnMrM6jguqJ1ydx7DoKGEzKDkU7HB/vdO5h04kyRr6ezU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=axiado.com; spf=pass smtp.mailfrom=axiado.com; dkim=pass (2048-bit key) header.d=axiado.com header.i=@axiado.com header.b=pmiR/xx3; arc=fail smtp.client-ip=52.101.43.90 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=axiado.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=axiado.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=axiado.com header.i=@axiado.com header.b="pmiR/xx3" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=CIde6rD2Kgo7ZalgnqA74ed14gMtMdO9e5XTL21D4rsKaNWO4Sf1z04IhLqs9uoK6zLyg08k0wLXpog9YsOSjF7rEonRtf13g1mZuxM3BA5DNVk3Ocmb99RmeTuBAuv4PEOMXUzoza+h9oVBLa1rdm+swhchZwCq7FAdnzqwHGMXKv+dBOlZ29zc++RdZdfocMaX7hIU8tXBrFqfZuCCaH1VB7j30C8iK91JT90l9ziGiOh5C1Q3pbw0u23E4WSNMCZ+ptAft8UfOBmJJy2wPi1Bqq+dGm0lxqynhtH8WXgIKXrUOZED/I34xHGt3r/2JEP4yRMIyM/rdPfBWMF5Rw== 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=ON9zurSJSI4QQT1BMl1VRtFngSU5U/rUteO/tCC7Fn0=; b=L8/mWx8Kw8g5y9Mf+kom6guvwAURmSJPLs/3mC690SBXDxZmvnWGskkz0VkF5g1kWjMNDreHdyoQP5OupGATqOkuygGPgRo9IyNspt3q/bcFcww6u22kNAadapPznSun576hn+LVXc3qnYY2BCy7IIRj7e9zEdvyyLpl+v7dL1WRjUmQqpA9Aba7W7jfldMpVN/K7yk9dUGVhMVmozMtwuH5EqQOdizkLPQV4oBivQ9HdmoouuSI5skKKoq+bCCYZ60J0H+p5hpI8Uatxupxu6zWMPFZMgm1BJ59PMBxSj49U7LHihhFf0ECTAfrqEgEcc8sVW/w2SOZ7IPkyLhFkQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=fail (sender ip is 50.233.182.194) smtp.rcpttodomain=axiado.com smtp.mailfrom=axiado.com; dmarc=none action=none header.from=axiado.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=axiado.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ON9zurSJSI4QQT1BMl1VRtFngSU5U/rUteO/tCC7Fn0=; b=pmiR/xx3z4M7UcC6wU/Z0ztgz076hZyE/haGJh26jI1EnAfYQgpgD+4FynCa7lG/fWs8Z382WAPj1Ah5If9jPE3jHn9VwYl0WtOIACi9kvVHtxQ10LxNvGDupYP8l9WfRNEner1BttNfmDmbDiNW3IZJpszYh8tC1Mq9nm13YBz0sZmRRbx4KZKYNrbO7nOmethQOLB+fqjVWxkMpDostZe5ocdQgLkEhh6o50R2kMforcoQA4lEf0Io1WPaBTZZzKpwxpNyKrVVpW9zs26jjR1Xg0mQpj51RigHlQRrRwf5ntaqoGHX8+lhQ+g1yAGmS4V1em2z33eZzVCoV0/qHA== Received: from BN9PR03CA0056.namprd03.prod.outlook.com (2603:10b6:408:fb::31) by IA3PR18MB6310.namprd18.prod.outlook.com (2603:10b6:208:529::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9700.22; Tue, 17 Mar 2026 19:52:12 +0000 Received: from BN2PEPF000055DC.namprd21.prod.outlook.com (2603:10b6:408:fb:cafe::db) by BN9PR03CA0056.outlook.office365.com (2603:10b6:408:fb::31) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9700.25 via Frontend Transport; Tue, 17 Mar 2026 19:51:53 +0000 X-MS-Exchange-Authentication-Results: spf=fail (sender IP is 50.233.182.194) smtp.mailfrom=axiado.com; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=axiado.com; Received-SPF: Fail (protection.outlook.com: domain of axiado.com does not designate 50.233.182.194 as permitted sender) receiver=protection.outlook.com; client-ip=50.233.182.194; helo=smtp.corp.axiado.com; Received: from smtp.corp.axiado.com (50.233.182.194) by BN2PEPF000055DC.mail.protection.outlook.com (10.167.245.6) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9745.0 via Frontend Transport; Tue, 17 Mar 2026 19:52:12 +0000 Received: from axz-uw1-build-vm02.corp.axiado.com (unknown [10.14.1.22]) by smtp.corp.axiado.com (Postfix) with ESMTPS id 762454186B5A; Tue, 17 Mar 2026 12:52:10 -0700 (PDT) From: Tzu-Hao Wei Date: Tue, 17 Mar 2026 12:52:09 -0700 Subject: [PATCH v3 2/4] phy: axiado: add Axiado eMMC PHY driver Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260317-axiado-ax3000-add-emmc-phy-driver-support-v3-2-fbf790f3f711@axiado.com> References: <20260317-axiado-ax3000-add-emmc-phy-driver-support-v3-0-fbf790f3f711@axiado.com> In-Reply-To: <20260317-axiado-ax3000-add-emmc-phy-driver-support-v3-0-fbf790f3f711@axiado.com> To: SriNavmani A , Prasad Bolisetty , Vinod Koul , Neil Armstrong , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: linux-phy@lists.infradead.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, openbmc@lists.ozlabs.org, Tzu-Hao Wei X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=9023; i=twei@axiado.com; h=from:subject:message-id; bh=YBprfDKFNQn6DMWhRJHAypcI9/qyZHy+Jg3oeuFZQSY=; b=owEB7QES/pANAwAKAXgQMF3EWvHXAcsmYgBpubDqfUZdlxF3buCvOd8JJZGUngOI2iqQXEO03 9mIEQOiFs2JAbMEAAEKAB0WIQSZyWINOowtFmDvdYF4EDBdxFrx1wUCabmw6gAKCRB4EDBdxFrx 16SPDACcZxXbTanOGISDFQq8ybC1A4PVm8+uNyOYj+yhCIatypGzvxrnLvajOPe8XEUFzZEeXVd 29QBT1VhSiL4GkUG8WfXgGmrFLfc4FJtOKb21oQfWYczR5Ih1Ck9F7vlhNgopHdR1iIm0WZsHFS rTWlUf4wS43md8Bera/aVamxATKAE9uIRkU6XsD9j4iAQEBt2Z4Tb7YL8076a2xt6zXAe/J4cJI 55mvPTbVjXEPSIqwMFiOa6TuFQ7NtPQL3MDgwd6bjSpQ4B0nmMcomfVPYbgXTNOaHpiNq8a2cuC URvxNevXsn2P1ufk7X16YeIdbz1yhPOsFbK8tMJSCsbhIX6952oyIi/ugFQ+7cBYAQLw7CCkbzN AP1DcFlkop8KZnScFD9hY6ueWFnh4ZHiDzGqqTT8XxxWcHxiYqtauQq+a5Y4xY/V01rDXfXkDch G0qH+VF1WD2zIyPzC13NrChUl711SguH2GGv2ID0LzqhWy3oJ5jfMbgWSIvO1M7YSAH+4= X-Developer-Key: i=twei@axiado.com; a=openpgp; fpr=99C9620D3A8C2D1660EF75817810305DC45AF1D7 X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN2PEPF000055DC:EE_|IA3PR18MB6310:EE_ X-MS-Office365-Filtering-Correlation-Id: 66f70436-86b3-4239-f0c8-08de845eae95 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|42112799006|7416014|376014|82310400026|36860700016|22082099003|18002099003|56012099003; X-Microsoft-Antispam-Message-Info: 0e10hXMsPd4+shsKyWSIp7vs7BHrgFV8C+BwKclm69oVk0kzdKiHQuNDEt/7RaaEIIgyoqMbX9GpwNSEnvhZcv5Gp7e0Kw72e63/hrY2rCgoAyUZGGDZ8o/kwOKhur1YOEqMHzOYHBhQPMC3eIOL0MNc6dTj53whm8yFr93RmROVljduayBM2BzYFNENPiVrMaZCNaSaLre6IQImLQgLm/qJZ9CyniIYbWxeQACIFMvGKtHqU2qTyBsUY8Q2RSg3x0UOSAXYPqobSU4JfM5Gg1FW7iTXnph9yJephitUl4nixBzcihCc/DGTPbhyQaO84p7I93qM+iZ1b7O6DPbe8lkS+s5JyCJso3AkMMFuATmMOTxzYdbX/fQT2kpHLxhvt3Khl69mJuPBjpEYwy3Z7p7ZPJdlj+Cy8jhs1VmlYbTNnHj5MNZgV5z+B3AyeIno/FZP4x+9/CBjE7OE2P3BXPW2oF2AwvKebFPodl4sIOPhUeFPOJ8/XnNr74WQBVphuFBsfIzycM9/kBbr47qiZ8O8fDtIh2LM5GW/kunk7GmsHzFNHj4cTfK60D+aX6o/mWR0Z06di4BXNVvOyAz+5N0tC20pMTliR+W5qtjiJtm44Qki4eF2mzcb1rbn5HqprWoC16sR2Hlcs2d2D8OCWZZ7h+4zGbDIzsSq0E81jSwI2nGz5y6h6CdP69//9mdP0V3Gs78mGi34CA1w66VSLNinL/pcC48gFam/d8nDnXMCWYh7aOeMzgKFr72zwbWv09qbjI7+umE9/ephBpIWLw== X-Forefront-Antispam-Report: CIP:50.233.182.194;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:smtp.corp.axiado.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(1800799024)(42112799006)(7416014)(376014)(82310400026)(36860700016)(22082099003)(18002099003)(56012099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: H52RrLJej0qSrpMPOsNYw2aIfd9d9E79Hw8pXdXwN9Lk+XkmcBwEhVOzCnTAZaaS7HQQFZCgoss085G1BF39bTRae4VHaicb+A4vCDG5D1bP3Jpbf9o/2G9AgCzvKXSYWbrfi6hfXcDkU4XxkuMMa5jWP7pYchj4JAFIgALlTevIP2ELK0WUyYb3vciJyyNdn70No8y4IwGPIK1Jyt9r5y4AVDuEhAZI/6ldvPQ4ya9y8UCR4Ll4AWCJ7BwUEkaeouGS1xbjOHGFg44EgHb6yOCQD4nv+xluh80Pzy7uYwrhAZy1exIcpMGFLxZT6l/Uv7TpatKyziF/zSVwIw88rpb0Oi81m2IZYcc569EPKdqK9T65H0w2t3Wml0n6k0qMMp8aaeoX+EQHcCsNUwKWsdFhxmxAsKHjYMJRbfrUkL23IkYFt2LsWu3fbusOant6 X-OriginatorOrg: axiado.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Mar 2026 19:52:12.2326 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 66f70436-86b3-4239-f0c8-08de845eae95 X-MS-Exchange-CrossTenant-Id: ff2db17c-4338-408e-9036-2dee8e3e17d7 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=ff2db17c-4338-408e-9036-2dee8e3e17d7;Ip=[50.233.182.194];Helo=[smtp.corp.axiado.com] X-MS-Exchange-CrossTenant-AuthSource: BN2PEPF000055DC.namprd21.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA3PR18MB6310 From: SriNavmani A It provides the required configurations for Axiado eMMC PHY driver for HS200 mode. Signed-off-by: SriNavmani A Co-developed-by: Prasad Bolisetty Signed-off-by: Prasad Bolisetty Signed-off-by: Tzu-Hao Wei --- drivers/phy/Kconfig | 1 + drivers/phy/Makefile | 1 + drivers/phy/axiado/Kconfig | 11 ++ drivers/phy/axiado/Makefile | 1 + drivers/phy/axiado/phy-axiado-emmc.c | 217 +++++++++++++++++++++++++++++++= ++++ 5 files changed, 231 insertions(+) diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig index 678dd0452f0aa0597773433f04d2a9ba77474d2a..b802274ea45a84bd36d7c0b7fb9= 0e368a5c018b4 100644 --- a/drivers/phy/Kconfig +++ b/drivers/phy/Kconfig @@ -103,6 +103,7 @@ config PHY_NXP_PTN3222 =20 source "drivers/phy/allwinner/Kconfig" source "drivers/phy/amlogic/Kconfig" +source "drivers/phy/axiado/Kconfig" source "drivers/phy/broadcom/Kconfig" source "drivers/phy/cadence/Kconfig" source "drivers/phy/freescale/Kconfig" diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile index bfb27fb5a494283d7fd05dd670ebd1b12df8b1a1..f1b9e4a8673bcde3fdc0fdc06a3= deddb5785ced1 100644 --- a/drivers/phy/Makefile +++ b/drivers/phy/Makefile @@ -15,6 +15,7 @@ obj-$(CONFIG_PHY_AIROHA_PCIE) +=3D phy-airoha-pcie.o obj-$(CONFIG_PHY_NXP_PTN3222) +=3D phy-nxp-ptn3222.o obj-y +=3D allwinner/ \ amlogic/ \ + axiado/ \ broadcom/ \ cadence/ \ freescale/ \ diff --git a/drivers/phy/axiado/Kconfig b/drivers/phy/axiado/Kconfig new file mode 100644 index 0000000000000000000000000000000000000000..d159e0345345987c7f48dcd12d3= 237997735d2b5 --- /dev/null +++ b/drivers/phy/axiado/Kconfig @@ -0,0 +1,11 @@ +# +# PHY drivers for Axiado platforms +# + +config PHY_AX3000_EMMC + tristate "Axiado eMMC PHY driver" + depends on OF && (ARCH_AXIADO || COMPILE_TEST) + select GENERIC_PHY + help + Enables this to support for the AX3000 EMMC PHY driver. + If unsure, say N. diff --git a/drivers/phy/axiado/Makefile b/drivers/phy/axiado/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..1e2b1ba016092eaffdbd7acbd9c= dc8577d79b35c --- /dev/null +++ b/drivers/phy/axiado/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_PHY_AX3000_EMMC) +=3D phy-axiado-emmc.o diff --git a/drivers/phy/axiado/phy-axiado-emmc.c b/drivers/phy/axiado/phy-= axiado-emmc.c new file mode 100644 index 0000000000000000000000000000000000000000..e0e2174776ad027df0a10a8c474= 1b1b4ef9ef40e --- /dev/null +++ b/drivers/phy/axiado/phy-axiado-emmc.c @@ -0,0 +1,217 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Axiado eMMC PHY driver + * + * Copyright (C) 2017 Arasan Chip Systems Inc. + * Copyright (C) 2022-2026 Axiado Corporation (or its affiliates). + * + * Based on Arasan Driver (sdhci-pci-arasan.c) + * sdhci-pci-arasan.c - Driver for Arasan PCI Controller with integrated p= hy. + */ +#include +#include +#include +#include +#include +#include +#include +#include + +/* Arasan eMMC 5.1 - PHY configuration registers */ +#define CAP_REG_IN_S1_MSB 0x04 +#define PHY_CTRL_1 0x38 +#define PHY_CTRL_2 0x3c +#define PHY_CTRL_3 0x40 +#define STATUS 0x50 + +#define DLL_ENBL BIT(26) +#define RTRIM_EN BIT(21) +#define PDB_ENBL BIT(23) +#define RETB_ENBL BIT(1) + +#define REN_STRB BIT(27) +#define REN_CMD_EN GENMASK(20, 12) + +/* Pull-UP Enable on CMD Line */ +#define PU_CMD_EN GENMASK(11, 3) + +/* Selection value for the optimum delay from 1-32 output tap lines */ +#define OTAP_DLY 0x02 +/* DLL charge pump current trim default [1000] */ +#define DLL_TRM_ICP 0x08 +/* Select the frequency range of DLL Operation */ +#define FRQ_SEL 0x01 + +#define OTAP_SEL_MASK GENMASK(10, 7) +#define DLL_TRM_MASK GENMASK(25, 22) +#define DLL_FRQSEL_MASK GENMASK(27, 25) + +#define OTAP_SEL(x) (FIELD_PREP(OTAP_SEL_MASK, x) | OTAPDLY_EN) +#define DLL_TRM(x) (FIELD_PREP(DLL_TRM_MASK, x) | DLL_ENBL) +#define DLL_FRQSEL(x) FIELD_PREP(DLL_FRQSEL_MASK, x) + +#define OTAPDLY_EN BIT(11) + +#define SEL_DLY_RXCLK BIT(18) +#define SEL_DLY_TXCLK BIT(19) + +#define CALDONE_MASK 0x40 +#define DLL_RDY_MASK 0x1 +#define MAX_CLK_BUF0 BIT(20) +#define MAX_CLK_BUF1 BIT(21) +#define MAX_CLK_BUF2 BIT(22) + +#define CLK_MULTIPLIER 0xc008e +#define POLL_TIMEOUT_MS 3000 +#define POLL_DELAY_US 100 + +struct axiado_emmc_phy { + void __iomem *reg_base; + struct device *dev; +}; + +static int axiado_emmc_phy_init(struct phy *phy) +{ + struct axiado_emmc_phy *ax_phy =3D phy_get_drvdata(phy); + struct device *dev =3D ax_phy->dev; + u32 val; + int ret; + + val =3D readl(ax_phy->reg_base + PHY_CTRL_1); + writel(val | RETB_ENBL | RTRIM_EN, ax_phy->reg_base + PHY_CTRL_1); + + val =3D readl(ax_phy->reg_base + PHY_CTRL_3); + writel(val | PDB_ENBL, ax_phy->reg_base + PHY_CTRL_3); + + ret =3D readl_poll_timeout(ax_phy->reg_base + STATUS, val, + val & CALDONE_MASK, POLL_DELAY_US, + POLL_TIMEOUT_MS * 1000); + if (ret) { + dev_err(dev, "PHY calibration timeout\n"); + return ret; + } + + val =3D readl(ax_phy->reg_base + PHY_CTRL_1); + writel(val | REN_CMD_EN | PU_CMD_EN, ax_phy->reg_base + PHY_CTRL_1); + + val =3D readl(ax_phy->reg_base + PHY_CTRL_2); + writel(val | REN_STRB, ax_phy->reg_base + PHY_CTRL_2); + + val =3D readl(ax_phy->reg_base + PHY_CTRL_3); + writel(val | MAX_CLK_BUF0 | MAX_CLK_BUF1 | MAX_CLK_BUF2, + ax_phy->reg_base + PHY_CTRL_3); + + writel(CLK_MULTIPLIER, ax_phy->reg_base + CAP_REG_IN_S1_MSB); + + val =3D readl(ax_phy->reg_base + PHY_CTRL_3); + writel(val | SEL_DLY_RXCLK | SEL_DLY_TXCLK, + ax_phy->reg_base + PHY_CTRL_3); + + return 0; +} + +static int axiado_emmc_phy_power_on(struct phy *phy) +{ + struct axiado_emmc_phy *ax_phy =3D phy_get_drvdata(phy); + struct device *dev =3D ax_phy->dev; + u32 val; + int ret; + + val =3D readl(ax_phy->reg_base + PHY_CTRL_1); + writel(val | RETB_ENBL, ax_phy->reg_base + PHY_CTRL_1); + + val =3D readl(ax_phy->reg_base + PHY_CTRL_3); + writel(val | PDB_ENBL, ax_phy->reg_base + PHY_CTRL_3); + + val =3D readl(ax_phy->reg_base + PHY_CTRL_2); + writel(val | OTAP_SEL(OTAP_DLY), ax_phy->reg_base + PHY_CTRL_2); + + val =3D readl(ax_phy->reg_base + PHY_CTRL_1); + writel(val | DLL_TRM(DLL_TRM_ICP), ax_phy->reg_base + PHY_CTRL_1); + + val =3D readl(ax_phy->reg_base + PHY_CTRL_3); + writel(val | DLL_FRQSEL(FRQ_SEL), ax_phy->reg_base + PHY_CTRL_3); + + ret =3D read_poll_timeout(readl, val, val & DLL_RDY_MASK, POLL_DELAY_US, + POLL_TIMEOUT_MS * 1000, false, + ax_phy->reg_base + STATUS); + if (ret) { + dev_err(dev, "DLL ready timeout\n"); + return ret; + } + + return 0; +} + +static int axiado_emmc_phy_power_off(struct phy *phy) +{ + struct axiado_emmc_phy *ax_phy =3D phy_get_drvdata(phy); + u32 val; + + val =3D readl(ax_phy->reg_base + PHY_CTRL_1); + val &=3D ~(DLL_TRM_MASK | DLL_ENBL); + writel(val, ax_phy->reg_base + PHY_CTRL_1); + + val =3D readl(ax_phy->reg_base + PHY_CTRL_3); + val &=3D ~(DLL_FRQSEL_MASK | PDB_ENBL); + writel(val, ax_phy->reg_base + PHY_CTRL_3); + + return 0; +} + +static const struct phy_ops axiado_emmc_phy_ops =3D { + .init =3D axiado_emmc_phy_init, + .power_on =3D axiado_emmc_phy_power_on, + .power_off =3D axiado_emmc_phy_power_off, + .owner =3D THIS_MODULE, +}; + +static const struct of_device_id axiado_emmc_phy_of_match[] =3D { + { .compatible =3D "axiado,ax3000-emmc-phy" }, + { /* sentinel */ }, +}; +MODULE_DEVICE_TABLE(of, axiado_emmc_phy_of_match); + +static int axiado_emmc_phy_probe(struct platform_device *pdev) +{ + struct axiado_emmc_phy *ax_phy; + struct phy_provider *phy_provider; + struct device *dev =3D &pdev->dev; + struct phy *generic_phy; + + if (!dev->of_node) + return -ENODEV; + + ax_phy =3D devm_kzalloc(dev, sizeof(*ax_phy), GFP_KERNEL); + if (!ax_phy) + return -ENOMEM; + + ax_phy->reg_base =3D devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(ax_phy->reg_base)) + return PTR_ERR(ax_phy->reg_base); + + ax_phy->dev =3D dev; + + generic_phy =3D devm_phy_create(dev, dev->of_node, &axiado_emmc_phy_ops); + if (IS_ERR(generic_phy)) + return dev_err_probe(dev, PTR_ERR(generic_phy), + "failed to create PHY\n"); + + phy_set_drvdata(generic_phy, ax_phy); + phy_provider =3D devm_of_phy_provider_register(dev, of_phy_simple_xlate); + + return PTR_ERR_OR_ZERO(phy_provider); +} + +static struct platform_driver axiado_emmc_phy_driver =3D { + .probe =3D axiado_emmc_phy_probe, + .driver =3D { + .name =3D "axiado-emmc-phy", + .of_match_table =3D axiado_emmc_phy_of_match, + }, +}; +module_platform_driver(axiado_emmc_phy_driver); + +MODULE_DESCRIPTION("AX3000 eMMC PHY Driver"); +MODULE_AUTHOR("Axiado Corporation"); +MODULE_LICENSE("GPL"); --=20 2.34.1