Message ID | 20231213092850.1706042-2-sherry.sun@nxp.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | PCI: imx6: Add pci host wakeup support | expand |
Drop period at the end of subject line. It only adds the possibility of unnecessary line wrapping in git log. On Wed, Dec 13, 2023 at 05:28:47PM +0800, Sherry Sun wrote: > Add pci host wakeup feature for imx platforms. s/pci/PCI/ s/imx/i.MX/ (based on how nxp.com web pages refer to it) > Example of configuring the corresponding dts property under the PCI > node: > wake-gpios = <&gpio5 21 GPIO_ACTIVE_LOW>; Add newline between paragraphs or wrap into a single paragraph. > + /* host wakeup support */ > + imx6_pcie->host_wake_irq = -1; AFAIK, 0 is an invalid IRQ value. So why not drop this assignment since imx6_pcie->host_wake_irq is 0 by default since it was allocated with devm_kzalloc(), and test like this elsewhere: if (imx6_pcie->host_wake_irq) { enable_irq_wake(imx6_pcie->host_wake_irq) > + host_wake_gpio = devm_gpiod_get_optional(dev, "wake", GPIOD_IN); > + if (IS_ERR(host_wake_gpio)) > + return PTR_ERR(host_wake_gpio); > + > + if (host_wake_gpio != NULL) { if (host_wake_gpio) Bjorn
Hi Sherry, kernel test robot noticed the following build warnings: [auto build test WARNING on pci/next] [also build test WARNING on pci/for-linus shawnguo/for-next robh/for-next linus/master v6.7-rc5 next-20231213] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Sherry-Sun/PCI-imx6-Add-pci-host-wakeup-support-on-imx-platforms/20231213-173031 base: https://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git next patch link: https://lore.kernel.org/r/20231213092850.1706042-2-sherry.sun%40nxp.com patch subject: [PATCH V2 1/4] PCI: imx6: Add pci host wakeup support on imx platforms. config: arm64-defconfig (https://download.01.org/0day-ci/archive/20231214/202312140402.hZsD0IVQ-lkp@intel.com/config) compiler: aarch64-linux-gcc (GCC) 13.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231214/202312140402.hZsD0IVQ-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202312140402.hZsD0IVQ-lkp@intel.com/ All warnings (new ones prefixed by >>): >> drivers/pci/controller/dwc/pci-imx6.c:1267:13: warning: no previous prototype for 'host_wake_irq_handler' [-Wmissing-prototypes] 1267 | irqreturn_t host_wake_irq_handler(int irq, void *priv) | ^~~~~~~~~~~~~~~~~~~~~ vim +/host_wake_irq_handler +1267 drivers/pci/controller/dwc/pci-imx6.c 1266 > 1267 irqreturn_t host_wake_irq_handler(int irq, void *priv) 1268 { 1269 struct imx6_pcie *imx6_pcie = priv; 1270 struct device *dev = imx6_pcie->pci->dev; 1271 1272 /* Notify PM core we are wakeup source */ 1273 pm_wakeup_event(dev, 0); 1274 pm_system_wakeup(); 1275 1276 return IRQ_HANDLED; 1277 } 1278
> -----Original Message----- > From: Bjorn Helgaas <helgaas@kernel.org> > Sent: 2023年12月14日 3:58 > To: Sherry Sun <sherry.sun@nxp.com> > Cc: Hongxing Zhu <hongxing.zhu@nxp.com>; l.stach@pengutronix.de; > lpieralisi@kernel.org; kw@linux.com; robh@kernel.org; > bhelgaas@google.com; krzysztof.kozlowski+dt@linaro.org; > conor+dt@kernel.org; shawnguo@kernel.org; s.hauer@pengutronix.de; > kernel@pengutronix.de; festevam@gmail.com; dl-linux-imx <linux- > imx@nxp.com>; linux-pci@vger.kernel.org; linux-arm- > kernel@lists.infradead.org; devicetree@vger.kernel.org; linux- > kernel@vger.kernel.org > Subject: Re: [PATCH V2 1/4] PCI: imx6: Add pci host wakeup support on imx > platforms. > > Drop period at the end of subject line. It only adds the possibility of > unnecessary line wrapping in git log. Hi Bjorn, thanks for the comments, will do in V3. > > On Wed, Dec 13, 2023 at 05:28:47PM +0800, Sherry Sun wrote: > > Add pci host wakeup feature for imx platforms. > > s/pci/PCI/ > s/imx/i.MX/ (based on how nxp.com web pages refer to it) > Will do. > > Example of configuring the corresponding dts property under the PCI > > node: > > wake-gpios = <&gpio5 21 GPIO_ACTIVE_LOW>; > > Add newline between paragraphs or wrap into a single paragraph. Will do. > > > + /* host wakeup support */ > > + imx6_pcie->host_wake_irq = -1; > > AFAIK, 0 is an invalid IRQ value. So why not drop this assignment since > imx6_pcie->host_wake_irq is 0 by default since it was allocated with > devm_kzalloc(), and test like this elsewhere: > > if (imx6_pcie->host_wake_irq) { > enable_irq_wake(imx6_pcie->host_wake_irq) I plan to change the host_wake_irq to unsigned int type, and add following codes, then "if (imx6_pcie->host_wake_irq)" condition seems more reasonable, let me know if you have any further suggestions. thanks! - imx6_pcie->host_wake_irq = gpiod_to_irq(host_wake_gpio); + ret = gpiod_to_irq(host_wake_gpio); + if (ret < 0) + return dev_err_probe(dev, ret, "Failed to get IRQ for WAKE gpio\n"); + + imx6_pcie->host_wake_irq = (unsigned int)ret; > > > + host_wake_gpio = devm_gpiod_get_optional(dev, "wake", > GPIOD_IN); > > + if (IS_ERR(host_wake_gpio)) > > + return PTR_ERR(host_wake_gpio); > > + > > + if (host_wake_gpio != NULL) { > > if (host_wake_gpio) Will do. Best Regards Sherry
Hi Sherry, kernel test robot noticed the following build warnings: [auto build test WARNING on pci/next] [also build test WARNING on pci/for-linus shawnguo/for-next robh/for-next linus/master v6.7-rc5 next-20231214] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Sherry-Sun/PCI-imx6-Add-pci-host-wakeup-support-on-imx-platforms/20231213-173031 base: https://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git next patch link: https://lore.kernel.org/r/20231213092850.1706042-2-sherry.sun%40nxp.com patch subject: [PATCH V2 1/4] PCI: imx6: Add pci host wakeup support on imx platforms. config: alpha-randconfig-r112-20231214 (https://download.01.org/0day-ci/archive/20231214/202312141719.j5GCLQry-lkp@intel.com/config) compiler: alpha-linux-gcc (GCC) 13.2.0 reproduce: (https://download.01.org/0day-ci/archive/20231214/202312141719.j5GCLQry-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202312141719.j5GCLQry-lkp@intel.com/ sparse warnings: (new ones prefixed by >>) >> drivers/pci/controller/dwc/pci-imx6.c:1267:13: sparse: sparse: symbol 'host_wake_irq_handler' was not declared. Should it be static? drivers/pci/controller/dwc/pci-imx6.c: note: in included file (through include/linux/mmzone.h, include/linux/gfp.h, include/linux/umh.h, include/linux/kmod.h, ...): include/linux/page-flags.h:242:46: sparse: sparse: self-comparison always evaluates to false vim +/host_wake_irq_handler +1267 drivers/pci/controller/dwc/pci-imx6.c 1266 > 1267 irqreturn_t host_wake_irq_handler(int irq, void *priv) 1268 { 1269 struct imx6_pcie *imx6_pcie = priv; 1270 struct device *dev = imx6_pcie->pci->dev; 1271 1272 /* Notify PM core we are wakeup source */ 1273 pm_wakeup_event(dev, 0); 1274 pm_system_wakeup(); 1275 1276 return IRQ_HANDLED; 1277 } 1278
Hi Sherry, kernel test robot noticed the following build warnings: [auto build test WARNING on pci/next] [also build test WARNING on pci/for-linus shawnguo/for-next robh/for-next linus/master v6.7-rc5 next-20231214] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Sherry-Sun/PCI-imx6-Add-pci-host-wakeup-support-on-imx-platforms/20231213-173031 base: https://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git next patch link: https://lore.kernel.org/r/20231213092850.1706042-2-sherry.sun%40nxp.com patch subject: [PATCH V2 1/4] PCI: imx6: Add pci host wakeup support on imx platforms. config: arm-randconfig-004-20231213 (https://download.01.org/0day-ci/archive/20231214/202312141726.nPrR7WDt-lkp@intel.com/config) compiler: clang version 17.0.0 (https://github.com/llvm/llvm-project.git 4a5ac14ee968ff0ad5d2cc1ffa0299048db4c88a) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231214/202312141726.nPrR7WDt-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202312141726.nPrR7WDt-lkp@intel.com/ All warnings (new ones prefixed by >>): >> drivers/pci/controller/dwc/pci-imx6.c:1267:13: warning: no previous prototype for function 'host_wake_irq_handler' [-Wmissing-prototypes] 1267 | irqreturn_t host_wake_irq_handler(int irq, void *priv) | ^ drivers/pci/controller/dwc/pci-imx6.c:1267:1: note: declare 'static' if the function is not intended to be used outside of this translation unit 1267 | irqreturn_t host_wake_irq_handler(int irq, void *priv) | ^ | static 1 warning generated. vim +/host_wake_irq_handler +1267 drivers/pci/controller/dwc/pci-imx6.c 1266 > 1267 irqreturn_t host_wake_irq_handler(int irq, void *priv) 1268 { 1269 struct imx6_pcie *imx6_pcie = priv; 1270 struct device *dev = imx6_pcie->pci->dev; 1271 1272 /* Notify PM core we are wakeup source */ 1273 pm_wakeup_event(dev, 0); 1274 pm_system_wakeup(); 1275 1276 return IRQ_HANDLED; 1277 } 1278
diff --git a/drivers/pci/controller/dwc/pci-imx6.c b/drivers/pci/controller/dwc/pci-imx6.c index 74703362aeec..0cf7f21adff8 100644 --- a/drivers/pci/controller/dwc/pci-imx6.c +++ b/drivers/pci/controller/dwc/pci-imx6.c @@ -72,6 +72,7 @@ struct imx6_pcie_drvdata { struct imx6_pcie { struct dw_pcie *pci; int reset_gpio; + int host_wake_irq; bool gpio_active_high; bool link_is_up; struct clk *pcie_bus; @@ -1237,11 +1238,44 @@ static int imx6_pcie_resume_noirq(struct device *dev) return 0; } +static int imx6_pcie_suspend(struct device *dev) +{ + struct imx6_pcie *imx6_pcie = dev_get_drvdata(dev); + + if (imx6_pcie->host_wake_irq >= 0) + enable_irq_wake(imx6_pcie->host_wake_irq); + + return 0; +} + +static int imx6_pcie_resume(struct device *dev) +{ + struct imx6_pcie *imx6_pcie = dev_get_drvdata(dev); + + if (imx6_pcie->host_wake_irq >= 0) + disable_irq_wake(imx6_pcie->host_wake_irq); + + return 0; +} + static const struct dev_pm_ops imx6_pcie_pm_ops = { NOIRQ_SYSTEM_SLEEP_PM_OPS(imx6_pcie_suspend_noirq, imx6_pcie_resume_noirq) + SYSTEM_SLEEP_PM_OPS(imx6_pcie_suspend, imx6_pcie_resume) }; +irqreturn_t host_wake_irq_handler(int irq, void *priv) +{ + struct imx6_pcie *imx6_pcie = priv; + struct device *dev = imx6_pcie->pci->dev; + + /* Notify PM core we are wakeup source */ + pm_wakeup_event(dev, 0); + pm_system_wakeup(); + + return IRQ_HANDLED; +} + static int imx6_pcie_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; @@ -1250,6 +1284,7 @@ static int imx6_pcie_probe(struct platform_device *pdev) struct device_node *np; struct resource *dbi_base; struct device_node *node = dev->of_node; + struct gpio_desc *host_wake_gpio; int ret; u16 val; @@ -1457,6 +1492,26 @@ static int imx6_pcie_probe(struct platform_device *pdev) val |= PCI_MSI_FLAGS_ENABLE; dw_pcie_writew_dbi(pci, offset + PCI_MSI_FLAGS, val); } + + /* host wakeup support */ + imx6_pcie->host_wake_irq = -1; + host_wake_gpio = devm_gpiod_get_optional(dev, "wake", GPIOD_IN); + if (IS_ERR(host_wake_gpio)) + return PTR_ERR(host_wake_gpio); + + if (host_wake_gpio != NULL) { + imx6_pcie->host_wake_irq = gpiod_to_irq(host_wake_gpio); + ret = devm_request_threaded_irq(dev, imx6_pcie->host_wake_irq, NULL, + host_wake_irq_handler, + IRQF_ONESHOT | IRQF_TRIGGER_FALLING, + "host_wake", imx6_pcie); + if (ret) + return dev_err_probe(dev, ret, "Failed to request host_wake_irq\n"); + + ret = device_init_wakeup(dev, true); + if (ret) + return dev_err_probe(dev, ret, "Failed to init host_wake_irq\n"); + } } return 0; @@ -1466,6 +1521,11 @@ static void imx6_pcie_shutdown(struct platform_device *pdev) { struct imx6_pcie *imx6_pcie = platform_get_drvdata(pdev); + if (imx6_pcie->host_wake_irq >= 0) { + device_init_wakeup(&pdev->dev, false); + disable_irq(imx6_pcie->host_wake_irq); + } + /* bring down link, so bootloader gets clean state in case of reboot */ imx6_pcie_assert_core_reset(imx6_pcie); }