Received: by 2002:a25:c205:0:0:0:0:0 with SMTP id s5csp4386082ybf; Wed, 4 Mar 2020 02:58:32 -0800 (PST) X-Google-Smtp-Source: ADFU+vvldlbHHpqdgNhpt/ZT7ss2EcZVApQrHOJrV7sgURXOj0HenraAwUAd9UlTXYzQoNBWlfC8 X-Received: by 2002:a05:6830:114:: with SMTP id i20mr1829651otp.320.1583319512045; Wed, 04 Mar 2020 02:58:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1583319512; cv=none; d=google.com; s=arc-20160816; b=DA7Yw3a3PuZ8JmutUMBw/sIVB8ElpEZEL1QjxbRlGg/MxCrFOaMJoSj6IUJ9obR8H4 5oqFJk0FaZErDl4jh+t2SPRtf5YKc+z4DXfbkf18hoDwTPfAyt+8CDRRdKn2UIoPcSMK kuZ+YiG5arAOsnnq1eTu8rk4tsVIYZtrvGvSTAsYSB96xLFNKNKM4DJGBAnwp6Ty/zsL x3fzr7/slUEOn1BG08RsVxchlue7Wp5VJiVw66MLRzkYcIekd3hotVwgK3ZZx4jSzjXs V4K4egDN+fC1A8A+7mDDX3MdBQplad5xQs9Nfv7AK+ioSOgoaeetQ6KnND+0KN1tt3gQ I3bA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dkim-signature; bh=l63DDIs8VVk2Lfq1t466kWNcanLP/rNBPoLGxXNl37k=; b=Pol/2jyKsXnaJlHbL2Bttzfz1+WVF1PZY1c1qU3puYRlkOZsr5mZIxs5NYoYtgfK+p 7PzUjCBUcBGD4fBolgIWh005gNedUfMDjOKinNBV9oRVBCRBFQt7aTcJMXG5mRYylkNY py76NjGB3dpcEjEkDZD+cFxMGZ4YoyPINXYyW03NjU2Fot3F65N+QR8u5+uzmJAzKDJF i5hD8uYmPAAqpaMUK98ipHEmGulOESgITFL+sse3UXZHUNFAABeMwvtPfsqcq/vWpu+e vxgRcSz1kLBdjzVdn33Y0m9YOnGq3EZuRU6/a6RJSlMiOTn+k9P0KY0QYZMrbsTCSW1I fRMw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b=StsEyURw; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a8si911321oie.36.2020.03.04.02.58.19; Wed, 04 Mar 2020 02:58:32 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b=StsEyURw; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387792AbgCDK5N (ORCPT + 99 others); Wed, 4 Mar 2020 05:57:13 -0500 Received: from fllv0015.ext.ti.com ([198.47.19.141]:38588 "EHLO fllv0015.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728953AbgCDK5M (ORCPT ); Wed, 4 Mar 2020 05:57:12 -0500 Received: from fllv0035.itg.ti.com ([10.64.41.0]) by fllv0015.ext.ti.com (8.15.2/8.15.2) with ESMTP id 024AurYt044782; Wed, 4 Mar 2020 04:56:53 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1583319413; bh=l63DDIs8VVk2Lfq1t466kWNcanLP/rNBPoLGxXNl37k=; h=Subject:To:CC:References:From:Date:In-Reply-To; b=StsEyURw2s4JTT1ZprfUcgojmabOm+SrC+RyK4yv+r7Oa/YRmsuO8jhtIy1TmNG5u xWjz6QFyXswPB2nNBjPSL7avctZLsKxXT371rdczrrxAkcrwaMdvtxcWrRi9kF/lyu ZGWUEo8SEA5rA/gf/Jo/noxlEXyhdI5V31Can5GA= Received: from DLEE109.ent.ti.com (dlee109.ent.ti.com [157.170.170.41]) by fllv0035.itg.ti.com (8.15.2/8.15.2) with ESMTP id 024Aur8i128156; Wed, 4 Mar 2020 04:56:53 -0600 Received: from DLEE105.ent.ti.com (157.170.170.35) by DLEE109.ent.ti.com (157.170.170.41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1847.3; Wed, 4 Mar 2020 04:56:53 -0600 Received: from fllv0040.itg.ti.com (10.64.41.20) by DLEE105.ent.ti.com (157.170.170.35) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1847.3 via Frontend Transport; Wed, 4 Mar 2020 04:56:53 -0600 Received: from [10.24.69.159] (ileax41-snat.itg.ti.com [10.172.224.153]) by fllv0040.itg.ti.com (8.15.2/8.15.2) with ESMTP id 024Aun3i016814; Wed, 4 Mar 2020 04:56:49 -0600 Subject: Re: [PATCH v6 6/7] phy: amlogic: Add Amlogic AXG PCIE PHY Driver To: Remi Pommarel , Yue Wang , Kevin Hilman , Lorenzo Pieralisi , Bjorn Helgaas , Neil Armstrong , Martin Blumenstingl , Rob Herring CC: Jerome Brunet , , , , References: <20200123232943.10229-1-repk@triplefau.lt> <20200123232943.10229-7-repk@triplefau.lt> From: Kishon Vijay Abraham I Message-ID: <14627e42-4894-6674-4911-3205ea8f5e55@ti.com> Date: Wed, 4 Mar 2020 16:31:24 +0530 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.5.0 MIME-Version: 1.0 In-Reply-To: <20200123232943.10229-7-repk@triplefau.lt> Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: 7bit X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 24/01/20 4:59 am, Remi Pommarel wrote: > This adds support for the PCI PHY found in the Amlogic AXG SoC Family. > This will allow to mutualize code in pci-meson.c between AXG and G12A > SoC. > > This PHY also uses and chains an analog PHY, which on AXG platform > is needed to have reliable PCIe communication. Is the analog PHY an independent block and can be used with other PHYs? For the patch itself Acked-by: Kishon Vijay Abraham I Thanks Kishon > > Signed-off-by: Remi Pommarel > --- > drivers/phy/amlogic/Kconfig | 11 ++ > drivers/phy/amlogic/Makefile | 1 + > drivers/phy/amlogic/phy-meson-axg-pcie.c | 192 +++++++++++++++++++++++ > 3 files changed, 204 insertions(+) > create mode 100644 drivers/phy/amlogic/phy-meson-axg-pcie.c > > diff --git a/drivers/phy/amlogic/Kconfig b/drivers/phy/amlogic/Kconfig > index 8c9cf2403591..71801e30d601 100644 > --- a/drivers/phy/amlogic/Kconfig > +++ b/drivers/phy/amlogic/Kconfig > @@ -60,6 +60,17 @@ config PHY_MESON_G12A_USB3_PCIE > in Meson G12A SoCs. > If unsure, say N. > > +config PHY_MESON_AXG_PCIE > + tristate "Meson AXG PCIE PHY driver" > + default ARCH_MESON > + depends on OF && (ARCH_MESON || COMPILE_TEST) > + select GENERIC_PHY > + select REGMAP_MMIO > + help > + Enable this to support the Meson MIPI + PCIE PHY found > + in Meson AXG SoCs. > + If unsure, say N. > + > config PHY_MESON_AXG_MIPI_PCIE_ANALOG > tristate "Meson AXG MIPI + PCIE analog PHY driver" > default ARCH_MESON > diff --git a/drivers/phy/amlogic/Makefile b/drivers/phy/amlogic/Makefile > index 0aecf92d796a..e2baa133f7af 100644 > --- a/drivers/phy/amlogic/Makefile > +++ b/drivers/phy/amlogic/Makefile > @@ -4,4 +4,5 @@ obj-$(CONFIG_PHY_MESON_GXL_USB2) += phy-meson-gxl-usb2.o > obj-$(CONFIG_PHY_MESON_G12A_USB2) += phy-meson-g12a-usb2.o > obj-$(CONFIG_PHY_MESON_GXL_USB3) += phy-meson-gxl-usb3.o > obj-$(CONFIG_PHY_MESON_G12A_USB3_PCIE) += phy-meson-g12a-usb3-pcie.o > +obj-$(CONFIG_PHY_MESON_AXG_PCIE) += phy-meson-axg-pcie.o > obj-$(CONFIG_PHY_MESON_AXG_MIPI_PCIE_ANALOG) += phy-meson-axg-mipi-pcie-analog.o > diff --git a/drivers/phy/amlogic/phy-meson-axg-pcie.c b/drivers/phy/amlogic/phy-meson-axg-pcie.c > new file mode 100644 > index 000000000000..377ed0dcd0d9 > --- /dev/null > +++ b/drivers/phy/amlogic/phy-meson-axg-pcie.c > @@ -0,0 +1,192 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Amlogic AXG PCIE PHY driver > + * > + * Copyright (C) 2020 Remi Pommarel > + */ > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#define MESON_PCIE_REG0 0x00 > +#define MESON_PCIE_COMMON_CLK BIT(4) > +#define MESON_PCIE_PORT_SEL GENMASK(3, 2) > +#define MESON_PCIE_CLK BIT(1) > +#define MESON_PCIE_POWERDOWN BIT(0) > + > +#define MESON_PCIE_TWO_X1 FIELD_PREP(MESON_PCIE_PORT_SEL, 0x3) > +#define MESON_PCIE_COMMON_REF_CLK FIELD_PREP(MESON_PCIE_COMMON_CLK, 0x1) > +#define MESON_PCIE_PHY_INIT (MESON_PCIE_TWO_X1 | \ > + MESON_PCIE_COMMON_REF_CLK) > +#define MESON_PCIE_RESET_DELAY 500 > + > +struct phy_axg_pcie_priv { > + struct phy *phy; > + struct phy *analog; > + struct regmap *regmap; > + struct reset_control *reset; > +}; > + > +static const struct regmap_config phy_axg_pcie_regmap_conf = { > + .reg_bits = 8, > + .val_bits = 32, > + .reg_stride = 4, > + .max_register = MESON_PCIE_REG0, > +}; > + > +static int phy_axg_pcie_power_on(struct phy *phy) > +{ > + struct phy_axg_pcie_priv *priv = phy_get_drvdata(phy); > + int ret; > + > + ret = phy_power_on(priv->analog); > + if (ret != 0) > + return ret; > + > + regmap_update_bits(priv->regmap, MESON_PCIE_REG0, > + MESON_PCIE_POWERDOWN, 0); > + return 0; > +} > + > +static int phy_axg_pcie_power_off(struct phy *phy) > +{ > + struct phy_axg_pcie_priv *priv = phy_get_drvdata(phy); > + int ret; > + > + ret = phy_power_off(priv->analog); > + if (ret != 0) > + return ret; > + > + regmap_update_bits(priv->regmap, MESON_PCIE_REG0, > + MESON_PCIE_POWERDOWN, 1); > + return 0; > +} > + > +static int phy_axg_pcie_init(struct phy *phy) > +{ > + struct phy_axg_pcie_priv *priv = phy_get_drvdata(phy); > + int ret; > + > + ret = phy_init(priv->analog); > + if (ret != 0) > + return ret; > + > + regmap_write(priv->regmap, MESON_PCIE_REG0, MESON_PCIE_PHY_INIT); > + return reset_control_reset(priv->reset); > +} > + > +static int phy_axg_pcie_exit(struct phy *phy) > +{ > + struct phy_axg_pcie_priv *priv = phy_get_drvdata(phy); > + int ret; > + > + ret = phy_exit(priv->analog); > + if (ret != 0) > + return ret; > + > + return reset_control_reset(priv->reset); > +} > + > +static int phy_axg_pcie_reset(struct phy *phy) > +{ > + struct phy_axg_pcie_priv *priv = phy_get_drvdata(phy); > + int ret = 0; > + > + ret = phy_reset(priv->analog); > + if (ret != 0) > + goto out; > + > + ret = reset_control_assert(priv->reset); > + if (ret != 0) > + goto out; > + udelay(MESON_PCIE_RESET_DELAY); > + > + ret = reset_control_deassert(priv->reset); > + if (ret != 0) > + goto out; > + udelay(MESON_PCIE_RESET_DELAY); > + > +out: > + return ret; > +} > + > +static const struct phy_ops phy_axg_pcie_ops = { > + .init = phy_axg_pcie_init, > + .exit = phy_axg_pcie_exit, > + .power_on = phy_axg_pcie_power_on, > + .power_off = phy_axg_pcie_power_off, > + .reset = phy_axg_pcie_reset, > + .owner = THIS_MODULE, > +}; > + > +static int phy_axg_pcie_probe(struct platform_device *pdev) > +{ > + struct phy_provider *pphy; > + struct device *dev = &pdev->dev; > + struct phy_axg_pcie_priv *priv; > + struct device_node *np = dev->of_node; > + struct resource *res; > + void __iomem *base; > + int ret; > + > + priv = devm_kmalloc(dev, sizeof(*priv), GFP_KERNEL); > + if (!priv) > + return -ENOMEM; > + > + priv->phy = devm_phy_create(dev, np, &phy_axg_pcie_ops); > + if (IS_ERR(priv->phy)) { > + ret = PTR_ERR(priv->phy); > + if (ret != -EPROBE_DEFER) > + dev_err(dev, "failed to create PHY\n"); > + return ret; > + } > + > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + base = devm_ioremap_resource(dev, res); > + if (IS_ERR(base)) > + return PTR_ERR(base); > + > + priv->regmap = devm_regmap_init_mmio(dev, base, > + &phy_axg_pcie_regmap_conf); > + if (IS_ERR(priv->regmap)) > + return PTR_ERR(priv->regmap); > + > + priv->reset = devm_reset_control_array_get(dev, false, false); > + if (IS_ERR(priv->reset)) > + return PTR_ERR(priv->reset); > + > + priv->analog = devm_phy_get(dev, "analog"); > + if (IS_ERR(priv->analog)) > + return PTR_ERR(priv->analog); > + > + phy_set_drvdata(priv->phy, priv); > + dev_set_drvdata(dev, priv); > + pphy = devm_of_phy_provider_register(dev, of_phy_simple_xlate); > + > + return PTR_ERR_OR_ZERO(pphy); > +} > + > +static const struct of_device_id phy_axg_pcie_of_match[] = { > + { > + .compatible = "amlogic,axg-pcie-phy", > + }, > + { }, > +}; > +MODULE_DEVICE_TABLE(of, phy_axg_pcie_of_match); > + > +static struct platform_driver phy_axg_pcie_driver = { > + .probe = phy_axg_pcie_probe, > + .driver = { > + .name = "phy-axg-pcie", > + .of_match_table = phy_axg_pcie_of_match, > + }, > +}; > +module_platform_driver(phy_axg_pcie_driver); > + > +MODULE_AUTHOR("Remi Pommarel "); > +MODULE_DESCRIPTION("Amlogic AXG PCIE PHY driver"); > +MODULE_LICENSE("GPL v2"); >