From patchwork Mon Dec 22 08:32:06 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Cross X-Patchwork-Id: 423298 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id EEBD8140119 for ; Mon, 22 Dec 2014 19:32:52 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754104AbaLVIcu (ORCPT ); Mon, 22 Dec 2014 03:32:50 -0500 Received: from mail1.g1.pair.com ([66.39.3.162]:47241 "EHLO mail1.g1.pair.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754095AbaLVIcs (ORCPT ); Mon, 22 Dec 2014 03:32:48 -0500 Received: from localhost.localdomain (unknown [210.23.18.169]) by mail1.g1.pair.com (Postfix) with ESMTPSA id 29E353C6FE; Mon, 22 Dec 2014 03:32:28 -0500 (EST) From: Sean Cross To: Rob Herring , Pawel Moll , Mark Rutland , Ian Campbell , Kumar Gala , Lucas Stach , Shawn Guo , Bjorn Helgaas , devicetree@vger.kernel.org, Richard Zhu , Grant Likely , linux-pci@vger.kernel.org Cc: bunnie@kosagi.com, Sean Cross Subject: [PATCH v2 3/4] PCI: imx6: Add power-supply support Date: Mon, 22 Dec 2014 16:32:06 +0800 Message-Id: <1419237127-21763-4-git-send-email-xobs@kosagi.com> X-Mailer: git-send-email 2.1.3 In-Reply-To: <1419237127-21763-1-git-send-email-xobs@kosagi.com> References: <1419237127-21763-1-git-send-email-xobs@kosagi.com> Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org Some PCIe ports gate power to the slot. In order to prevent system lockup, these boards must enable power to the slot before attempting communication over the PCI bus. Signed-off-by: Sean Cross Reviewed-by: Lucas Stach --- .../devicetree/bindings/pci/fsl,imx6q-pcie.txt | 3 +++ drivers/pci/host/pci-imx6.c | 27 ++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt b/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt index 6fbba53..a806b68 100644 --- a/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt +++ b/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt @@ -13,6 +13,9 @@ Required properties: - clock-names: Must include the following additional entries: - "pcie_phy" +Optional properties: +- bus-supply: A regulator that controls power to the entire bus + Example: pcie@0x01000000 { diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c index 69202d1..8e4f957 100644 --- a/drivers/pci/host/pci-imx6.c +++ b/drivers/pci/host/pci-imx6.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -39,6 +40,7 @@ struct imx6_pcie { struct pcie_port pp; struct regmap *iomuxc_gpr; void __iomem *mem_base; + struct regulator *bus_supply; }; /* PCIe Root Complex registers (memory-mapped) */ @@ -523,6 +525,7 @@ static struct pcie_host_ops imx6_pcie_host_ops = { static int __init imx6_add_pcie_port(struct pcie_port *pp, struct platform_device *pdev) { + struct imx6_pcie *imx6_pcie = to_imx6_pcie(pp); int ret; if (IS_ENABLED(CONFIG_PCI_MSI)) { @@ -544,9 +547,22 @@ static int __init imx6_add_pcie_port(struct pcie_port *pp, pp->root_bus_nr = -1; pp->ops = &imx6_pcie_host_ops; + if (imx6_pcie->bus_supply) { + ret = regulator_enable(imx6_pcie->bus_supply); + if (ret) { + dev_err(pp->dev, + "unable to enable bus supply: %d\n", ret); + return ret; + } + } + ret = dw_pcie_host_init(pp); if (ret) { dev_err(&pdev->dev, "failed to initialize host\n"); + + if (imx6_pcie->bus_supply) + regulator_disable(imx6_pcie->bus_supply); + return ret; } @@ -588,6 +604,17 @@ static int __init imx6_pcie_probe(struct platform_device *pdev) } } + /* Fetch bus supply */ + imx6_pcie->bus_supply = devm_regulator_get_optional(&pdev->dev, "bus"); + if (IS_ERR(imx6_pcie->bus_supply)) { + ret = PTR_ERR(imx6_pcie->bus_supply); + if (ret == -EPROBE_DEFER) + return ret; + + dev_err(&pdev->dev, "unable to get bus-supply\n"); + return ret; + } + /* Fetch clocks */ imx6_pcie->pcie_phy = devm_clk_get(&pdev->dev, "pcie_phy"); if (IS_ERR(imx6_pcie->pcie_phy)) {