Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp1484607imm; Wed, 20 Jun 2018 19:56:18 -0700 (PDT) X-Google-Smtp-Source: ADUXVKIDHg6iB6oGD8jutjsJjm/5NeYfUNetj5dhw33BDIwDmHUGt1DuyF9BppO8X551V1JSEZNP X-Received: by 2002:a62:249b:: with SMTP id k27-v6mr25686328pfk.143.1529549778086; Wed, 20 Jun 2018 19:56:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1529549778; cv=none; d=google.com; s=arc-20160816; b=jbHOWx81w4Lq3+DHO9wOM55FsjN1Z0vaj9Lpc6gQzlQvFy5hEiZXi+lHTldmknm4LT UsbcterMoqDSL5StHrYhXqHh++AOVJQSaATu5mw7shXZR9BEJkMUwJmucqF0IDbysiDW Uw8Ky+9/EAdj6UP5dPWnyInFfamjK63jWSAsaYlUsb9FwIPyvDEiKlpy07hHgiyDWgF/ SWp+diqPX7L1pJH+VNDJ3ruX/R+xOIgutgyXRcTqX8fvcwNTF7yq5fwgVSF4+lckw+6s Xlq5QCV7rWrYSVum+iAWv1jv6IvS0jgxKCoqdRugf1hthpZ+rLIcbhFgwSIEFY9rTcJ9 RQ2g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:date:subject:cc :to:from:arc-authentication-results; bh=zgo3I9yMFYiYkK2yVMVDIMir2sQ7E5ZKEh3Cp5gBjKc=; b=oCvufVzh7oU/B3obibQNTuSLYAlI/XVzeT4sNqU8NFgCYuEsvhB7GvOJbKI2PWFpU7 52WVAB6E8r5FMCcY7P3mXto1m+I1AGVqRsevyyQ0uDNjEXNgyQc44EHCJZH7shTxV+M9 hKykrO/fgBPqLVYym0a2C/HXlBrilmCuP0lLYhEkoLQd3SErcyrbEOJJcguLX2g3/br2 nVv8JvwFVRwybkFssspOc6jPLYkwLzU04pa9J49pbnza1yKQo9u0IF1Pykal4hO5+qZ3 2U6RodMPku53yfxXoHjg58sSuVzY763LfIK3GBIftv0SrcQ2a3mT8S504VcT8egGZuGb UToA== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c17-v6si3675067plo.259.2018.06.20.19.56.04; Wed, 20 Jun 2018 19:56:18 -0700 (PDT) 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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754645AbeFUCzM (ORCPT + 99 others); Wed, 20 Jun 2018 22:55:12 -0400 Received: from mailgw02.mediatek.com ([210.61.82.184]:46554 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1754304AbeFUCzK (ORCPT ); Wed, 20 Jun 2018 22:55:10 -0400 X-UUID: d9283f3d7202416eb31e50de1758e411-20180621 Received: from mtkcas08.mediatek.inc [(172.21.101.126)] by mailgw02.mediatek.com (envelope-from ) (mhqrelay.mediatek.com ESMTP with TLS) with ESMTP id 994990804; Thu, 21 Jun 2018 10:55:05 +0800 Received: from MTKCAS06.mediatek.inc (172.21.101.30) by mtkmbs01n1.mediatek.inc (172.21.101.68) with Microsoft SMTP Server (TLS) id 15.0.1210.3; Thu, 21 Jun 2018 10:55:02 +0800 Received: from localhost.localdomain (10.17.3.153) by MTKCAS06.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1210.3 via Frontend Transport; Thu, 21 Jun 2018 10:55:02 +0800 From: To: , , , , , , , , , , , CC: , , , , , Subject: [PATCH v4] PCI: mediatek: Add system pm support for MT2712 Date: Thu, 21 Jun 2018 10:55:00 +0800 Message-ID: <1529549700-18742-1-git-send-email-honghui.zhang@mediatek.com> X-Mailer: git-send-email 2.6.4 MIME-Version: 1.0 Content-Type: text/plain X-MTK: N Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Honghui Zhang The MTCMOS of PCIe Host for MT2712 will be off when system suspend, and all the internal control register will be reset after system resume. The PCIe link should be re-established and the related control register values should be re-set after system resume. Signed-off-by: Honghui Zhang CC: Ryder Lee --- drivers/pci/controller/pcie-mediatek.c | 60 ++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) Change since v3: - rebase to v4.18-rc1. diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c index 0baabe3..1ed2ef0 100644 --- a/drivers/pci/controller/pcie-mediatek.c +++ b/drivers/pci/controller/pcie-mediatek.c @@ -134,12 +134,14 @@ struct mtk_pcie_port; /** * struct mtk_pcie_soc - differentiate between host generations * @need_fix_class_id: whether this host's class ID needed to be fixed or not + * @pm_support: whether the host's MTCMOS will be off when suspend * @ops: pointer to configuration access functions * @startup: pointer to controller setting functions * @setup_irq: pointer to initialize IRQ functions */ struct mtk_pcie_soc { bool need_fix_class_id; + bool pm_support; struct pci_ops *ops; int (*startup)(struct mtk_pcie_port *port); int (*setup_irq)(struct mtk_pcie_port *port, struct device_node *node); @@ -1181,12 +1183,69 @@ static int mtk_pcie_probe(struct platform_device *pdev) return err; } +#ifdef CONFIG_PM_SLEEP +static int mtk_pcie_suspend_noirq(struct device *dev) +{ + struct mtk_pcie *pcie = dev_get_drvdata(dev); + const struct mtk_pcie_soc *soc = pcie->soc; + struct mtk_pcie_port *port; + + if (!soc->pm_support) + return 0; + + list_for_each_entry(port, &pcie->ports, list) { + clk_disable_unprepare(port->ahb_ck); + clk_disable_unprepare(port->sys_ck); + phy_power_off(port->phy); + } + + return 0; +} + +static int mtk_pcie_resume_noirq(struct device *dev) +{ + struct mtk_pcie *pcie = dev_get_drvdata(dev); + const struct mtk_pcie_soc *soc = pcie->soc; + struct mtk_pcie_port *port; + int ret; + + if (!soc->pm_support) + return 0; + + list_for_each_entry(port, &pcie->ports, list) { + phy_power_on(port->phy); + clk_prepare_enable(port->sys_ck); + clk_prepare_enable(port->ahb_ck); + + ret = soc->startup(port); + if (ret) { + dev_err(dev, "Port%d link down\n", port->slot); + phy_power_off(port->phy); + clk_disable_unprepare(port->sys_ck); + clk_disable_unprepare(port->ahb_ck); + return ret; + } + + if (IS_ENABLED(CONFIG_PCI_MSI)) + mtk_pcie_enable_msi(port); + } + + return 0; +} +#endif + +static const struct dev_pm_ops mtk_pcie_pm_ops = { + SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(mtk_pcie_suspend_noirq, + mtk_pcie_resume_noirq) +}; + static const struct mtk_pcie_soc mtk_pcie_soc_v1 = { .ops = &mtk_pcie_ops, .startup = mtk_pcie_startup_port, }; static const struct mtk_pcie_soc mtk_pcie_soc_mt2712 = { + .pm_support = true, .ops = &mtk_pcie_ops_v2, .startup = mtk_pcie_startup_port_v2, .setup_irq = mtk_pcie_setup_irq, @@ -1213,6 +1272,7 @@ static struct platform_driver mtk_pcie_driver = { .name = "mtk-pcie", .of_match_table = mtk_pcie_ids, .suppress_bind_attrs = true, + .pm = &mtk_pcie_pm_ops, }, }; builtin_platform_driver(mtk_pcie_driver); -- 2.6.4