* [PATCH v2 0/4] Add eMMC PHY support for Axiado AX3000 SoC
@ 2026-02-06 8:22 Tzu-Hao Wei
2026-02-06 8:22 ` [PATCH v2 1/4] dt-bindings: phy: axiado,ax3000-emmc-phy: add Axiado eMMC PHY Tzu-Hao Wei
` (3 more replies)
0 siblings, 4 replies; 8+ messages in thread
From: Tzu-Hao Wei @ 2026-02-06 8:22 UTC (permalink / raw)
To: SriNavmani A, Prasad Bolisetty, Vinod Koul, Neil Armstrong,
Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-phy, devicetree, linux-arm-kernel, linux-kernel, openbmc,
Tzu-Hao Wei
Axiado AX3000 SoC contains Arasan PHY which provides the interface to the
HS200 eMMC controller.
This series includes:
1. Add bindings for Axiado AX3000 eMMC PHY
2. Add Axiado AX3000 eMMC phy driver
3. Update MAINTAINERS for the new driver
4. Update Axiado AX3000 device tree
Changes in v2:
- Fix dt-binding format
- Fix compilation error in m68k
- Use readl_poll_timeout instead of read_poll_timeout
- Link to v1: https://lore.kernel.org/r/20260109-axiado-ax3000-add-emmc-phy-driver-support-v1-0-dd43459dbfea@axiado.com
Changes: (The previous version was mixed with Host driver, so I separate
the PHY driver as a new thread)
- Fix property order in required section to match properties section
- Fixed example to use lowercase hex and proper node naming
- Removed wrapper functions, use readl/writel directly
- Replaced manual polling loops with read_poll_timeout macro
- Used devm_platform_ioremap_resource instead of separate calls
- Removed unnecessary of_match_node check
- Used dev_err_probe for error reporting
- Added proper Kconfig dependencies (ARCH_AXIADO || COMPILE_TEST)
- Fixed various coding style issues
- Link to previous patches: https://lore.kernel.org/all/20251222-axiado-ax3000-add-emmc-host-driver-support-v1-0-5457d0ebcdb4@axiado.com/
Signed-off-by: Tzu-Hao Wei <twei@axiado.com>
---
SriNavmani A (3):
dt-bindings: phy: axiado,ax3000-emmc-phy: add Axiado eMMC PHY
phy: axiado: add Axiado eMMC PHY driver
arm64: dts: axiado: Add eMMC PHY node
Tzu-Hao Wei (1):
MAINTAINERS: Add Axiado AX3000 eMMC PHY driver
.../bindings/phy/axiado,ax3000-emmc-phy.yaml | 37 ++++
MAINTAINERS | 10 +
arch/arm64/boot/dts/axiado/ax3000.dtsi | 7 +
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 | 221 +++++++++++++++++++++
8 files changed, 289 insertions(+)
---
base-commit: 63804fed149a6750ffd28610c5c1c98cce6bd377
change-id: 20260108-axiado-ax3000-add-emmc-phy-driver-support-d61aead8f622
Best regards,
--
Tzu-Hao Wei <twei@axiado.com>
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH v2 1/4] dt-bindings: phy: axiado,ax3000-emmc-phy: add Axiado eMMC PHY 2026-02-06 8:22 [PATCH v2 0/4] Add eMMC PHY support for Axiado AX3000 SoC Tzu-Hao Wei @ 2026-02-06 8:22 ` Tzu-Hao Wei 2026-02-10 1:30 ` Rob Herring (Arm) 2026-02-06 8:22 ` [PATCH v2 2/4] phy: axiado: add Axiado eMMC PHY driver Tzu-Hao Wei ` (2 subsequent siblings) 3 siblings, 1 reply; 8+ messages in thread From: Tzu-Hao Wei @ 2026-02-06 8:22 UTC (permalink / raw) To: SriNavmani A, Prasad Bolisetty, Vinod Koul, Neil Armstrong, Rob Herring, Krzysztof Kozlowski, Conor Dooley Cc: linux-phy, devicetree, linux-arm-kernel, linux-kernel, openbmc, Tzu-Hao Wei From: SriNavmani A <srinavmani@axiado.com> Axiado AX3000 SoC contains Arasan PHY which provides the interface to the HS200 eMMC host controller. Signed-off-by: SriNavmani A <srinavmani@axiado.com> Signed-off-by: Tzu-Hao Wei <twei@axiado.com> --- .../bindings/phy/axiado,ax3000-emmc-phy.yaml | 37 ++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/Documentation/devicetree/bindings/phy/axiado,ax3000-emmc-phy.yaml b/Documentation/devicetree/bindings/phy/axiado,ax3000-emmc-phy.yaml new file mode 100644 index 0000000000000000000000000000000000000000..61700b80e93f7185e16ca9eab0922fe6bb29fe86 --- /dev/null +++ b/Documentation/devicetree/bindings/phy/axiado,ax3000-emmc-phy.yaml @@ -0,0 +1,37 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/phy/axiado,ax3000-emmc-phy.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Axiado AX3000 Arasan eMMC PHY + +maintainers: + - SriNavmani A <srinavmani@axiado.com> + - Tzu-Hao Wei <twei@axiado.com> + - Prasad Bolisetty <pbolisetty@axiado.com> + +properties: + compatible: + const: axiado,ax3000-emmc-phy + + reg: + maxItems: 1 + + "#phy-cells": + const: 0 + +required: + - compatible + - reg + - "#phy-cells" + +additionalProperties: false + +examples: + - | + phy@80801c00 { + compatible = "axiado,ax3000-emmc-phy"; + reg = <0x80801c00 0x1000>; + #phy-cells = <0>; + }; -- 2.34.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/4] dt-bindings: phy: axiado,ax3000-emmc-phy: add Axiado eMMC PHY 2026-02-06 8:22 ` [PATCH v2 1/4] dt-bindings: phy: axiado,ax3000-emmc-phy: add Axiado eMMC PHY Tzu-Hao Wei @ 2026-02-10 1:30 ` Rob Herring (Arm) 0 siblings, 0 replies; 8+ messages in thread From: Rob Herring (Arm) @ 2026-02-10 1:30 UTC (permalink / raw) To: Tzu-Hao Wei Cc: openbmc, Conor Dooley, linux-arm-kernel, linux-kernel, Vinod Koul, Neil Armstrong, SriNavmani A, Prasad Bolisetty, linux-phy, devicetree, Krzysztof Kozlowski On Fri, 06 Feb 2026 16:22:08 +0800, Tzu-Hao Wei wrote: > From: SriNavmani A <srinavmani@axiado.com> > > Axiado AX3000 SoC contains Arasan PHY which provides the interface to the > HS200 eMMC host controller. > > Signed-off-by: SriNavmani A <srinavmani@axiado.com> > Signed-off-by: Tzu-Hao Wei <twei@axiado.com> > --- > .../bindings/phy/axiado,ax3000-emmc-phy.yaml | 37 ++++++++++++++++++++++ > 1 file changed, 37 insertions(+) > Reviewed-by: Rob Herring (Arm) <robh@kernel.org> ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 2/4] phy: axiado: add Axiado eMMC PHY driver 2026-02-06 8:22 [PATCH v2 0/4] Add eMMC PHY support for Axiado AX3000 SoC Tzu-Hao Wei 2026-02-06 8:22 ` [PATCH v2 1/4] dt-bindings: phy: axiado,ax3000-emmc-phy: add Axiado eMMC PHY Tzu-Hao Wei @ 2026-02-06 8:22 ` Tzu-Hao Wei 2026-02-27 14:53 ` Vinod Koul 2026-02-06 8:22 ` [PATCH v2 3/4] MAINTAINERS: Add Axiado AX3000 " Tzu-Hao Wei 2026-02-06 8:22 ` [PATCH v2 4/4] arm64: dts: axiado: Add eMMC PHY node Tzu-Hao Wei 3 siblings, 1 reply; 8+ messages in thread From: Tzu-Hao Wei @ 2026-02-06 8:22 UTC (permalink / raw) To: SriNavmani A, Prasad Bolisetty, Vinod Koul, Neil Armstrong, Rob Herring, Krzysztof Kozlowski, Conor Dooley Cc: linux-phy, devicetree, linux-arm-kernel, linux-kernel, openbmc, Tzu-Hao Wei From: SriNavmani A <srinavmani@axiado.com> It provides the required configurations for Axiado eMMC PHY driver for HS200 mode. Signed-off-by: SriNavmani A <srinavmani@axiado.com> Co-developed-by: Prasad Bolisetty <pbolisetty@axiado.com> Signed-off-by: Prasad Bolisetty <pbolisetty@axiado.com> Signed-off-by: Tzu-Hao Wei <twei@axiado.com> --- 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 | 221 +++++++++++++++++++++++++++++++++++ 5 files changed, 235 insertions(+) diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig index 678dd0452f0aa0597773433f04d2a9ba77474d2a..b802274ea45a84bd36d7c0b7fb90e368a5c018b4 100644 --- a/drivers/phy/Kconfig +++ b/drivers/phy/Kconfig @@ -103,6 +103,7 @@ config PHY_NXP_PTN3222 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..f1b9e4a8673bcde3fdc0fdc06a3deddb5785ced1 100644 --- a/drivers/phy/Makefile +++ b/drivers/phy/Makefile @@ -15,6 +15,7 @@ obj-$(CONFIG_PHY_AIROHA_PCIE) += phy-airoha-pcie.o obj-$(CONFIG_PHY_NXP_PTN3222) += phy-nxp-ptn3222.o obj-y += allwinner/ \ amlogic/ \ + axiado/ \ broadcom/ \ cadence/ \ freescale/ \ diff --git a/drivers/phy/axiado/Kconfig b/drivers/phy/axiado/Kconfig new file mode 100644 index 0000000000000000000000000000000000000000..d159e0345345987c7f48dcd12d3237997735d2b5 --- /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..1e2b1ba016092eaffdbd7acbd9cdc8577d79b35c --- /dev/null +++ b/drivers/phy/axiado/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_PHY_AX3000_EMMC) += 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..28d2a30c3b35ee7dba917487959e226941e8ea4b --- /dev/null +++ b/drivers/phy/axiado/phy-axiado-emmc.c @@ -0,0 +1,221 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Axiado eMMC PHY driver + * + * Copyright (C) 2017 Arasan Chip Systems Inc. + * Copyright (C) 2022-2025 Axiado Corporation (or its affiliates). + * + * Based on Arasan Driver (sdhci-pci-arasan.c) + * sdhci-pci-arasan.c - Driver for Arasan PCI Controller with integrated phy. + */ +#include <linux/bitfield.h> +#include <linux/delay.h> +#include <linux/io.h> +#include <linux/iopoll.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/phy/phy.h> +#include <linux/platform_device.h> + +/* Arasan eMMC 5.1 - PHY configuration registers */ +#define CAP_REG_IN_S1_LSB 0x00 +#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 BIT(12) +#define REN_DAT0 BIT(13) +#define REN_DAT1 BIT(14) +#define REN_DAT2 BIT(15) +#define REN_DAT3 BIT(16) +#define REN_DAT4 BIT(17) +#define REN_DAT5 BIT(18) +#define REN_DAT6 BIT(19) +#define REN_DAT7 BIT(20) +#define REN_CMD_EN (REN_CMD | REN_DAT0 | REN_DAT1 | REN_DAT2 | \ + REN_DAT3 | REN_DAT4 | REN_DAT5 | REN_DAT6 | REN_DAT7) + +/* Pull-UP Enable on CMD Line */ +#define PU_CMD BIT(3) +#define PU_DAT0 BIT(4) +#define PU_DAT1 BIT(5) +#define PU_DAT2 BIT(6) +#define PU_DAT3 BIT(7) +#define PU_DAT4 BIT(8) +#define PU_DAT5 BIT(9) +#define PU_DAT6 BIT(10) +#define PU_DAT7 BIT(11) +#define PU_CMD_EN (PU_CMD | PU_DAT0 | PU_DAT1 | PU_DAT2 | PU_DAT3 | \ + PU_DAT4 | PU_DAT5 | PU_DAT6 | PU_DAT7) + +/* 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 = phy_get_drvdata(phy); + struct device *dev = ax_phy->dev; + u32 val; + int ret; + + val = readl(ax_phy->reg_base + PHY_CTRL_1); + writel(val | RETB_ENBL | RTRIM_EN, ax_phy->reg_base + PHY_CTRL_1); + + val = readl(ax_phy->reg_base + PHY_CTRL_3); + writel(val | PDB_ENBL, ax_phy->reg_base + PHY_CTRL_3); + + ret = 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 = readl(ax_phy->reg_base + PHY_CTRL_1); + writel(val | REN_CMD_EN | PU_CMD_EN, ax_phy->reg_base + PHY_CTRL_1); + + val = readl(ax_phy->reg_base + PHY_CTRL_2); + writel(val | REN_STRB, ax_phy->reg_base + PHY_CTRL_2); + + val = 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 = 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 = phy_get_drvdata(phy); + struct device *dev = ax_phy->dev; + u32 val; + int ret; + + val = readl(ax_phy->reg_base + PHY_CTRL_1); + writel(val | RETB_ENBL, ax_phy->reg_base + PHY_CTRL_1); + + val = readl(ax_phy->reg_base + PHY_CTRL_3); + writel(val | PDB_ENBL, ax_phy->reg_base + PHY_CTRL_3); + + val = readl(ax_phy->reg_base + PHY_CTRL_2); + writel(val | OTAP_SEL(OTAP_DLY), ax_phy->reg_base + PHY_CTRL_2); + + val = readl(ax_phy->reg_base + PHY_CTRL_1); + writel(val | DLL_TRM(DLL_TRM_ICP), ax_phy->reg_base + PHY_CTRL_1); + + val = readl(ax_phy->reg_base + PHY_CTRL_3); + writel(val | DLL_FRQSEL(FRQ_SEL), ax_phy->reg_base + PHY_CTRL_3); + + ret = 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 const struct phy_ops axiado_emmc_phy_ops = { + .init = axiado_emmc_phy_init, + .power_on = axiado_emmc_phy_power_on, + .owner = THIS_MODULE, +}; + +static const struct of_device_id axiado_emmc_phy_of_match[] = { + { .compatible = "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 = &pdev->dev; + struct phy *generic_phy; + + if (!dev->of_node) + return -ENODEV; + + ax_phy = devm_kzalloc(dev, sizeof(*ax_phy), GFP_KERNEL); + if (!ax_phy) + return -ENOMEM; + + ax_phy->reg_base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(ax_phy->reg_base)) + return PTR_ERR(ax_phy->reg_base); + + ax_phy->dev = dev; + + generic_phy = 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 = 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 = { + .probe = axiado_emmc_phy_probe, + .driver = { + .name = "axiado-emmc-phy", + .of_match_table = 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"); -- 2.34.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v2 2/4] phy: axiado: add Axiado eMMC PHY driver 2026-02-06 8:22 ` [PATCH v2 2/4] phy: axiado: add Axiado eMMC PHY driver Tzu-Hao Wei @ 2026-02-27 14:53 ` Vinod Koul 2026-03-02 18:02 ` Tzu-Hao Wei 0 siblings, 1 reply; 8+ messages in thread From: Vinod Koul @ 2026-02-27 14:53 UTC (permalink / raw) To: Tzu-Hao Wei Cc: SriNavmani A, Prasad Bolisetty, Neil Armstrong, Rob Herring, Krzysztof Kozlowski, Conor Dooley, linux-phy, devicetree, linux-arm-kernel, linux-kernel, openbmc On 06-02-26, 16:22, Tzu-Hao Wei wrote: > From: SriNavmani A <srinavmani@axiado.com> > > It provides the required configurations for Axiado eMMC PHY driver for > HS200 mode. > > Signed-off-by: SriNavmani A <srinavmani@axiado.com> > Co-developed-by: Prasad Bolisetty <pbolisetty@axiado.com> > Signed-off-by: Prasad Bolisetty <pbolisetty@axiado.com> > Signed-off-by: Tzu-Hao Wei <twei@axiado.com> > --- > 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 | 221 +++++++++++++++++++++++++++++++++++ > 5 files changed, 235 insertions(+) > > diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig > index 678dd0452f0aa0597773433f04d2a9ba77474d2a..b802274ea45a84bd36d7c0b7fb90e368a5c018b4 100644 > --- a/drivers/phy/Kconfig > +++ b/drivers/phy/Kconfig > @@ -103,6 +103,7 @@ config PHY_NXP_PTN3222 > > 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..f1b9e4a8673bcde3fdc0fdc06a3deddb5785ced1 100644 > --- a/drivers/phy/Makefile > +++ b/drivers/phy/Makefile > @@ -15,6 +15,7 @@ obj-$(CONFIG_PHY_AIROHA_PCIE) += phy-airoha-pcie.o > obj-$(CONFIG_PHY_NXP_PTN3222) += phy-nxp-ptn3222.o > obj-y += allwinner/ \ > amlogic/ \ > + axiado/ \ > broadcom/ \ > cadence/ \ > freescale/ \ > diff --git a/drivers/phy/axiado/Kconfig b/drivers/phy/axiado/Kconfig > new file mode 100644 > index 0000000000000000000000000000000000000000..d159e0345345987c7f48dcd12d3237997735d2b5 > --- /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..1e2b1ba016092eaffdbd7acbd9cdc8577d79b35c > --- /dev/null > +++ b/drivers/phy/axiado/Makefile > @@ -0,0 +1 @@ > +obj-$(CONFIG_PHY_AX3000_EMMC) += 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..28d2a30c3b35ee7dba917487959e226941e8ea4b > --- /dev/null > +++ b/drivers/phy/axiado/phy-axiado-emmc.c > @@ -0,0 +1,221 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > +/* > + * Axiado eMMC PHY driver > + * > + * Copyright (C) 2017 Arasan Chip Systems Inc. > + * Copyright (C) 2022-2025 Axiado Corporation (or its affiliates). 2026 > + * > + * Based on Arasan Driver (sdhci-pci-arasan.c) > + * sdhci-pci-arasan.c - Driver for Arasan PCI Controller with integrated phy. > + */ > +#include <linux/bitfield.h> > +#include <linux/delay.h> > +#include <linux/io.h> > +#include <linux/iopoll.h> > +#include <linux/module.h> > +#include <linux/of.h> > +#include <linux/phy/phy.h> > +#include <linux/platform_device.h> > + > +/* Arasan eMMC 5.1 - PHY configuration registers */ > +#define CAP_REG_IN_S1_LSB 0x00 > +#define CAP_REG_IN_S1_MSB 0x04 > +#define PHY_CTRL_1 0x38 > +#define PHY_CTRL_2 0x3C smaller hex case please, here and other places > +#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 BIT(12) > +#define REN_DAT0 BIT(13) > +#define REN_DAT1 BIT(14) > +#define REN_DAT2 BIT(15) > +#define REN_DAT3 BIT(16) > +#define REN_DAT4 BIT(17) > +#define REN_DAT5 BIT(18) > +#define REN_DAT6 BIT(19) > +#define REN_DAT7 BIT(20) > +#define REN_CMD_EN (REN_CMD | REN_DAT0 | REN_DAT1 | REN_DAT2 | \ > + REN_DAT3 | REN_DAT4 | REN_DAT5 | REN_DAT6 | REN_DAT7) > + > +/* Pull-UP Enable on CMD Line */ > +#define PU_CMD BIT(3) > +#define PU_DAT0 BIT(4) > +#define PU_DAT1 BIT(5) > +#define PU_DAT2 BIT(6) > +#define PU_DAT3 BIT(7) > +#define PU_DAT4 BIT(8) > +#define PU_DAT5 BIT(9) > +#define PU_DAT6 BIT(10) > +#define PU_DAT7 BIT(11) > +#define PU_CMD_EN (PU_CMD | PU_DAT0 | PU_DAT1 | PU_DAT2 | PU_DAT3 | \ > + PU_DAT4 | PU_DAT5 | PU_DAT6 | PU_DAT7) The bit define are used only once, why not define the cmd with respective bits here > + > +/* 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 = phy_get_drvdata(phy); > + struct device *dev = ax_phy->dev; > + u32 val; > + int ret; > + > + val = readl(ax_phy->reg_base + PHY_CTRL_1); > + writel(val | RETB_ENBL | RTRIM_EN, ax_phy->reg_base + PHY_CTRL_1); > + > + val = readl(ax_phy->reg_base + PHY_CTRL_3); > + writel(val | PDB_ENBL, ax_phy->reg_base + PHY_CTRL_3); > + > + ret = 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 = readl(ax_phy->reg_base + PHY_CTRL_1); > + writel(val | REN_CMD_EN | PU_CMD_EN, ax_phy->reg_base + PHY_CTRL_1); > + > + val = readl(ax_phy->reg_base + PHY_CTRL_2); > + writel(val | REN_STRB, ax_phy->reg_base + PHY_CTRL_2); > + > + val = 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 = 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 = phy_get_drvdata(phy); > + struct device *dev = ax_phy->dev; > + u32 val; > + int ret; > + > + val = readl(ax_phy->reg_base + PHY_CTRL_1); > + writel(val | RETB_ENBL, ax_phy->reg_base + PHY_CTRL_1); > + > + val = readl(ax_phy->reg_base + PHY_CTRL_3); > + writel(val | PDB_ENBL, ax_phy->reg_base + PHY_CTRL_3); > + > + val = readl(ax_phy->reg_base + PHY_CTRL_2); > + writel(val | OTAP_SEL(OTAP_DLY), ax_phy->reg_base + PHY_CTRL_2); > + > + val = readl(ax_phy->reg_base + PHY_CTRL_1); > + writel(val | DLL_TRM(DLL_TRM_ICP), ax_phy->reg_base + PHY_CTRL_1); > + > + val = readl(ax_phy->reg_base + PHY_CTRL_3); > + writel(val | DLL_FRQSEL(FRQ_SEL), ax_phy->reg_base + PHY_CTRL_3); > + > + ret = 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 const struct phy_ops axiado_emmc_phy_ops = { > + .init = axiado_emmc_phy_init, > + .power_on = axiado_emmc_phy_power_on, no power_off? -- ~Vinod ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 2/4] phy: axiado: add Axiado eMMC PHY driver 2026-02-27 14:53 ` Vinod Koul @ 2026-03-02 18:02 ` Tzu-Hao Wei 0 siblings, 0 replies; 8+ messages in thread From: Tzu-Hao Wei @ 2026-03-02 18:02 UTC (permalink / raw) To: Vinod Koul Cc: SriNavmani A, Prasad Bolisetty, Neil Armstrong, Rob Herring, Krzysztof Kozlowski, Conor Dooley, linux-phy, devicetree, linux-arm-kernel, linux-kernel, openbmc On 2/27/2026 6:53 AM, Vinod Koul wrote: >> --- /dev/null >> +++ b/drivers/phy/axiado/phy-axiado-emmc.c >> @@ -0,0 +1,221 @@ >> +// SPDX-License-Identifier: GPL-2.0-or-later >> +/* >> + * Axiado eMMC PHY driver >> + * >> + * Copyright (C) 2017 Arasan Chip Systems Inc. >> + * Copyright (C) 2022-2025 Axiado Corporation (or its affiliates). > > 2026 > Thanks. Will fix in the next version. >> + * >> + * Based on Arasan Driver (sdhci-pci-arasan.c) >> + * sdhci-pci-arasan.c - Driver for Arasan PCI Controller with integrated phy. >> + */ >> +#include <linux/bitfield.h> >> +#include <linux/delay.h> >> +#include <linux/io.h> >> +#include <linux/iopoll.h> >> +#include <linux/module.h> >> +#include <linux/of.h> >> +#include <linux/phy/phy.h> >> +#include <linux/platform_device.h> >> + >> +/* Arasan eMMC 5.1 - PHY configuration registers */ >> +#define CAP_REG_IN_S1_LSB 0x00 >> +#define CAP_REG_IN_S1_MSB 0x04 >> +#define PHY_CTRL_1 0x38 >> +#define PHY_CTRL_2 0x3C > > smaller hex case please, here and other places > Thanks. Will fix in the next version. >> +#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 BIT(12) >> +#define REN_DAT0 BIT(13) >> +#define REN_DAT1 BIT(14) >> +#define REN_DAT2 BIT(15) >> +#define REN_DAT3 BIT(16) >> +#define REN_DAT4 BIT(17) >> +#define REN_DAT5 BIT(18) >> +#define REN_DAT6 BIT(19) >> +#define REN_DAT7 BIT(20) >> +#define REN_CMD_EN (REN_CMD | REN_DAT0 | REN_DAT1 | REN_DAT2 | \ >> + REN_DAT3 | REN_DAT4 | REN_DAT5 | REN_DAT6 | REN_DAT7) >> + >> +/* Pull-UP Enable on CMD Line */ >> +#define PU_CMD BIT(3) >> +#define PU_DAT0 BIT(4) >> +#define PU_DAT1 BIT(5) >> +#define PU_DAT2 BIT(6) >> +#define PU_DAT3 BIT(7) >> +#define PU_DAT4 BIT(8) >> +#define PU_DAT5 BIT(9) >> +#define PU_DAT6 BIT(10) >> +#define PU_DAT7 BIT(11) >> +#define PU_CMD_EN (PU_CMD | PU_DAT0 | PU_DAT1 | PU_DAT2 | PU_DAT3 | \ >> + PU_DAT4 | PU_DAT5 | PU_DAT6 | PU_DAT7) > > The bit define are used only once, why not define the cmd with > respective bits here > Will replace it by #define PU_CMD_EN GENMASK(11, 3) >> +static const struct phy_ops axiado_emmc_phy_ops = { >> + .init = axiado_emmc_phy_init, >> + .power_on = axiado_emmc_phy_power_on, > > no power_off? > Thanks for reminding, will add power_off. > -- > ~Vinod ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 3/4] MAINTAINERS: Add Axiado AX3000 eMMC PHY driver 2026-02-06 8:22 [PATCH v2 0/4] Add eMMC PHY support for Axiado AX3000 SoC Tzu-Hao Wei 2026-02-06 8:22 ` [PATCH v2 1/4] dt-bindings: phy: axiado,ax3000-emmc-phy: add Axiado eMMC PHY Tzu-Hao Wei 2026-02-06 8:22 ` [PATCH v2 2/4] phy: axiado: add Axiado eMMC PHY driver Tzu-Hao Wei @ 2026-02-06 8:22 ` Tzu-Hao Wei 2026-02-06 8:22 ` [PATCH v2 4/4] arm64: dts: axiado: Add eMMC PHY node Tzu-Hao Wei 3 siblings, 0 replies; 8+ messages in thread From: Tzu-Hao Wei @ 2026-02-06 8:22 UTC (permalink / raw) To: SriNavmani A, Prasad Bolisetty, Vinod Koul, Neil Armstrong, Rob Herring, Krzysztof Kozlowski, Conor Dooley Cc: linux-phy, devicetree, linux-arm-kernel, linux-kernel, openbmc, Tzu-Hao Wei Add SriNavmani, Prasad and me as maintainers for Axiado AX3000 eMMC PHY driver Acked-by: Prasad Bolisetty <pbolisetty@axiado.com> Signed-off-by: Tzu-Hao Wei <twei@axiado.com> --- MAINTAINERS | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 67db88b04537b431c927b73624993233eef43e3f..c33b0aa94de81c89b674e44d4813c4e3b95b7b2d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -4254,6 +4254,16 @@ W: https://ez.analog.com/linux-software-drivers F: Documentation/devicetree/bindings/hwmon/adi,axi-fan-control.yaml F: drivers/hwmon/axi-fan-control.c +AXIADO EMMC PHY DRIVER +M: SriNavmani A <srinavmani@axiado.com> +M: Tzu-Hao Wei <twei@axiado.com> +M: Prasad Bolisetty <pbolisetty@axiado.com> +L: linux-phy@lists.infradead.org (moderated for non-subscribers) +S: Maintained +F: Documentation/devicetree/bindings/phy/axiado,ax3000-emmc-phy.yaml +F: drivers/phy/axiado/Kconfig +F: drivers/phy/axiado/phy-axiado-emmc.c + AXI SPI ENGINE M: Michael Hennerich <michael.hennerich@analog.com> M: Nuno Sá <nuno.sa@analog.com> -- 2.34.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v2 4/4] arm64: dts: axiado: Add eMMC PHY node 2026-02-06 8:22 [PATCH v2 0/4] Add eMMC PHY support for Axiado AX3000 SoC Tzu-Hao Wei ` (2 preceding siblings ...) 2026-02-06 8:22 ` [PATCH v2 3/4] MAINTAINERS: Add Axiado AX3000 " Tzu-Hao Wei @ 2026-02-06 8:22 ` Tzu-Hao Wei 3 siblings, 0 replies; 8+ messages in thread From: Tzu-Hao Wei @ 2026-02-06 8:22 UTC (permalink / raw) To: SriNavmani A, Prasad Bolisetty, Vinod Koul, Neil Armstrong, Rob Herring, Krzysztof Kozlowski, Conor Dooley Cc: linux-phy, devicetree, linux-arm-kernel, linux-kernel, openbmc, Tzu-Hao Wei From: SriNavmani A <srinavmani@axiado.com> Add the eMMC PHY device tree node to the AX3000 SoC DTSI. AX3000 has one eMMC PHY interface. Signed-off-by: SriNavmani A <srinavmani@axiado.com> Signed-off-by: Tzu-Hao Wei <twei@axiado.com> --- arch/arm64/boot/dts/axiado/ax3000.dtsi | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/arch/arm64/boot/dts/axiado/ax3000.dtsi b/arch/arm64/boot/dts/axiado/ax3000.dtsi index 792f52e0c7dd42cbc54b0eb47e25b0fbf1a706b8..ccc8088bd8258cfb666268b14a3b0716a9ca69f4 100644 --- a/arch/arm64/boot/dts/axiado/ax3000.dtsi +++ b/arch/arm64/boot/dts/axiado/ax3000.dtsi @@ -507,6 +507,13 @@ uart3: serial@80520800 { clocks = <&refclk &refclk>; status = "disabled"; }; + + emmc_phy: phy@80801c00 { + compatible = "axiado,ax3000-emmc-phy"; + reg = <0x0 0x80801c00 0x0 0x1000>; + #phy-cells = <0>; + status = "disabled"; + }; }; timer { -- 2.34.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2026-03-02 18:02 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-02-06 8:22 [PATCH v2 0/4] Add eMMC PHY support for Axiado AX3000 SoC Tzu-Hao Wei 2026-02-06 8:22 ` [PATCH v2 1/4] dt-bindings: phy: axiado,ax3000-emmc-phy: add Axiado eMMC PHY Tzu-Hao Wei 2026-02-10 1:30 ` Rob Herring (Arm) 2026-02-06 8:22 ` [PATCH v2 2/4] phy: axiado: add Axiado eMMC PHY driver Tzu-Hao Wei 2026-02-27 14:53 ` Vinod Koul 2026-03-02 18:02 ` Tzu-Hao Wei 2026-02-06 8:22 ` [PATCH v2 3/4] MAINTAINERS: Add Axiado AX3000 " Tzu-Hao Wei 2026-02-06 8:22 ` [PATCH v2 4/4] arm64: dts: axiado: Add eMMC PHY node Tzu-Hao Wei
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox