Message ID | 1530503384-1218-4-git-send-email-honghui.zhang@mediatek.com (mailing list archive) |
---|---|
State | New, archived |
Delegated to: | Bjorn Helgaas |
Headers | show |
Hi Honghui, Thank you for the patch! Yet something to improve: [auto build test ERROR on pci/next] [also build test ERROR on v4.18-rc3 next-20180629] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/honghui-zhang-mediatek-com/PCI-mediatek-fixup-find_port-enable_msi-and-add-pm-module-support/20180702-115447 base: https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git next config: x86_64-allyesconfig (attached as .config) compiler: gcc-7 (Debian 7.3.0-16) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=x86_64 All error/warnings (new ones prefixed by >>): drivers/pci/controller/pcie-mediatek.c: In function 'mtk_pcie_resume_noirq': >> drivers/pci/controller/pcie-mediatek.c:1249:51: error: macro "list_for_each_entry_safe" requires 4 arguments, but only 3 given list_for_each_entry_safe(port, &pcie->ports, list) ^ >> drivers/pci/controller/pcie-mediatek.c:1249:2: error: unknown type name 'list_for_each_entry_safe' list_for_each_entry_safe(port, &pcie->ports, list) ^~~~~~~~~~~~~~~~~~~~~~~~ >> drivers/pci/controller/pcie-mediatek.c:1250:3: warning: parameter names (without types) in function declaration mtk_pcie_enable_port(port); ^~~~~~~~~~~~~~~~~~~~ >> drivers/pci/controller/pcie-mediatek.c:1250:3: error: conflicting types for 'mtk_pcie_enable_port' drivers/pci/controller/pcie-mediatek.c:794:13: note: previous definition of 'mtk_pcie_enable_port' was here static void mtk_pcie_enable_port(struct mtk_pcie_port *port) ^~~~~~~~~~~~~~~~~~~~ >> drivers/pci/controller/pcie-mediatek.c:1249:2: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] list_for_each_entry_safe(port, &pcie->ports, list) ^~~~~~~~~~~~~~~~~~~~~~~~ drivers/pci/controller/pcie-mediatek.c:1234:24: warning: unused variable 'port' [-Wunused-variable] struct mtk_pcie_port *port; ^~~~ vim +/list_for_each_entry_safe +1249 drivers/pci/controller/pcie-mediatek.c 1229 1230 static int __maybe_unused mtk_pcie_resume_noirq(struct device *dev) 1231 { 1232 struct mtk_pcie *pcie = dev_get_drvdata(dev); 1233 const struct mtk_pcie_soc *soc = pcie->soc; 1234 struct mtk_pcie_port *port; 1235 1236 if (!soc->pm_support) 1237 return 0; 1238 1239 if (list_empty(&pcie->ports)) 1240 return 0; 1241 1242 if (dev->pm_domain) { 1243 pm_runtime_enable(dev); 1244 pm_runtime_get_sync(dev); 1245 } 1246 1247 clk_prepare_enable(pcie->free_ck); 1248 > 1249 list_for_each_entry_safe(port, &pcie->ports, list) > 1250 mtk_pcie_enable_port(port); 1251 1252 /* In case of EP was removed while system suspend. */ 1253 if (list_empty(&pcie->ports)) 1254 mtk_pcie_subsys_powerdown(pcie); 1255 1256 return 0; 1257 } 1258 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c index 86918d4..c530539 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); @@ -1197,12 +1199,75 @@ static int mtk_pcie_probe(struct platform_device *pdev) return err; } +static int __maybe_unused 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; + + if (list_empty(&pcie->ports)) + return 0; + + list_for_each_entry(port, &pcie->ports, list) { + clk_disable_unprepare(port->pipe_ck); + clk_disable_unprepare(port->obff_ck); + clk_disable_unprepare(port->axi_ck); + clk_disable_unprepare(port->aux_ck); + clk_disable_unprepare(port->ahb_ck); + clk_disable_unprepare(port->sys_ck); + phy_power_off(port->phy); + phy_exit(port->phy); + } + + mtk_pcie_subsys_powerdown(pcie); + + return 0; +} + +static int __maybe_unused 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; + + if (!soc->pm_support) + return 0; + + if (list_empty(&pcie->ports)) + return 0; + + if (dev->pm_domain) { + pm_runtime_enable(dev); + pm_runtime_get_sync(dev); + } + + clk_prepare_enable(pcie->free_ck); + + list_for_each_entry_safe(port, &pcie->ports, list) + mtk_pcie_enable_port(port); + + /* In case of EP was removed while system suspend. */ + if (list_empty(&pcie->ports)) + mtk_pcie_subsys_powerdown(pcie); + + return 0; +} + +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, @@ -1210,6 +1275,7 @@ static const struct mtk_pcie_soc mtk_pcie_soc_mt2712 = { static const struct mtk_pcie_soc mtk_pcie_soc_mt7622 = { .need_fix_class_id = true, + .pm_support = true, .ops = &mtk_pcie_ops_v2, .startup = mtk_pcie_startup_port_v2, .setup_irq = mtk_pcie_setup_irq, @@ -1229,6 +1295,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);