mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
Merge branch 'unify-platform-suspend-resume-routines-for-pci-dwmac-glue'
Yao Zi says:
====================
Unify platform suspend/resume routines for PCI DWMAC glue
There are currently three PCI-based DWMAC glue drivers in tree,
stmmac_pci.c, dwmac-intel.c, and dwmac-loongson.c. Both stmmac_pci.c and
dwmac-intel.c implements the same and duplicated platform suspend/resume
routines.
This series introduces a new PCI helper library, stmmac_libpci.c,
providing a pair of helpers, stmmac_pci_plat_{suspend,resume}, and
replaces the driver-specific implementation with the helpers to reduce
code duplication. The helper will also simplify the Motorcomm DWMAC glue
driver which I'm working on.
The glue driver for Intel controllers isn't covered by the series, since
its suspend routine doesn't call pci_disable_device() and thus is a
little different from the new generic helpers.
I only have Loongson hardware on hand, thus the series is only tested on
Loongson 3A5000 machine. I could confirm the controller works after
resume, and WoL works as expected. This shouldn't break stmmac_pci.c,
either, since the new helpers have the exactly same code as the old
driver-specific suspend/resume hooks.
====================
Link: https://patch.msgid.link/20251124160417.51514-1-ziyao@disroot.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -349,6 +349,11 @@ config DWMAC_VISCONTI
|
||||
|
||||
endif
|
||||
|
||||
config STMMAC_LIBPCI
|
||||
tristate
|
||||
help
|
||||
This option enables the PCI bus helpers for the stmmac driver.
|
||||
|
||||
config DWMAC_INTEL
|
||||
tristate "Intel GMAC support"
|
||||
default X86
|
||||
@@ -362,16 +367,18 @@ config DWMAC_INTEL
|
||||
config DWMAC_LOONGSON
|
||||
tristate "Loongson PCI DWMAC support"
|
||||
default MACH_LOONGSON64
|
||||
depends on (MACH_LOONGSON64 || COMPILE_TEST) && STMMAC_ETH && PCI
|
||||
depends on (MACH_LOONGSON64 || COMPILE_TEST) && PCI
|
||||
depends on COMMON_CLK
|
||||
select STMMAC_LIBPCI
|
||||
help
|
||||
This selects the LOONGSON PCI bus support for the stmmac driver,
|
||||
Support for ethernet controller on Loongson-2K1000 SoC and LS7A1000 bridge.
|
||||
|
||||
config STMMAC_PCI
|
||||
tristate "STMMAC PCI bus support"
|
||||
depends on STMMAC_ETH && PCI
|
||||
depends on PCI
|
||||
depends on COMMON_CLK
|
||||
select STMMAC_LIBPCI
|
||||
help
|
||||
This selects the platform specific bus support for the stmmac driver.
|
||||
This driver was tested on XLINX XC2V3000 FF1152AMT0221
|
||||
|
||||
@@ -44,6 +44,7 @@ obj-$(CONFIG_DWMAC_VISCONTI) += dwmac-visconti.o
|
||||
stmmac-platform-objs:= stmmac_platform.o
|
||||
dwmac-altr-socfpga-objs := dwmac-socfpga.o
|
||||
|
||||
obj-$(CONFIG_STMMAC_LIBPCI) += stmmac_libpci.o
|
||||
obj-$(CONFIG_STMMAC_PCI) += stmmac-pci.o
|
||||
obj-$(CONFIG_DWMAC_INTEL) += dwmac-intel.o
|
||||
obj-$(CONFIG_DWMAC_LOONGSON) += dwmac-loongson.o
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <linux/device.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include "stmmac.h"
|
||||
#include "stmmac_libpci.h"
|
||||
#include "dwmac_dma.h"
|
||||
#include "dwmac1000.h"
|
||||
|
||||
@@ -502,37 +503,6 @@ static int loongson_dwmac_fix_reset(struct stmmac_priv *priv, void __iomem *ioad
|
||||
10000, 2000000);
|
||||
}
|
||||
|
||||
static int loongson_dwmac_suspend(struct device *dev, void *bsp_priv)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
int ret;
|
||||
|
||||
ret = pci_save_state(pdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
pci_disable_device(pdev);
|
||||
pci_wake_from_d3(pdev, true);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int loongson_dwmac_resume(struct device *dev, void *bsp_priv)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
int ret;
|
||||
|
||||
pci_restore_state(pdev);
|
||||
pci_set_power_state(pdev, PCI_D0);
|
||||
|
||||
ret = pci_enable_device(pdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
pci_set_master(pdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int loongson_dwmac_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
{
|
||||
struct plat_stmmacenet_data *plat;
|
||||
@@ -577,8 +547,8 @@ static int loongson_dwmac_probe(struct pci_dev *pdev, const struct pci_device_id
|
||||
plat->bsp_priv = ld;
|
||||
plat->mac_setup = loongson_dwmac_setup;
|
||||
plat->fix_soc_reset = loongson_dwmac_fix_reset;
|
||||
plat->suspend = loongson_dwmac_suspend;
|
||||
plat->resume = loongson_dwmac_resume;
|
||||
plat->suspend = stmmac_pci_plat_suspend;
|
||||
plat->resume = stmmac_pci_plat_resume;
|
||||
ld->dev = &pdev->dev;
|
||||
ld->loongson_id = readl(res.addr + GMAC_VERSION) & 0xff;
|
||||
|
||||
|
||||
48
drivers/net/ethernet/stmicro/stmmac/stmmac_libpci.c
Normal file
48
drivers/net/ethernet/stmicro/stmmac/stmmac_libpci.c
Normal file
@@ -0,0 +1,48 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* PCI bus helpers for STMMAC driver
|
||||
* Copyright (C) 2025 Yao Zi <ziyao@disroot.org>
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#include "stmmac_libpci.h"
|
||||
|
||||
int stmmac_pci_plat_suspend(struct device *dev, void *bsp_priv)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
int ret;
|
||||
|
||||
ret = pci_save_state(pdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
pci_disable_device(pdev);
|
||||
pci_wake_from_d3(pdev, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(stmmac_pci_plat_suspend);
|
||||
|
||||
int stmmac_pci_plat_resume(struct device *dev, void *bsp_priv)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
int ret;
|
||||
|
||||
pci_restore_state(pdev);
|
||||
pci_set_power_state(pdev, PCI_D0);
|
||||
|
||||
ret = pci_enable_device(pdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
pci_set_master(pdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(stmmac_pci_plat_resume);
|
||||
|
||||
MODULE_DESCRIPTION("STMMAC PCI helper library");
|
||||
MODULE_AUTHOR("Yao Zi <ziyao@disroot.org>");
|
||||
MODULE_LICENSE("GPL");
|
||||
12
drivers/net/ethernet/stmicro/stmmac/stmmac_libpci.h
Normal file
12
drivers/net/ethernet/stmicro/stmmac/stmmac_libpci.h
Normal file
@@ -0,0 +1,12 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (C) 2025 Yao Zi <ziyao@disroot.org>
|
||||
*/
|
||||
|
||||
#ifndef __STMMAC_LIBPCI_H__
|
||||
#define __STMMAC_LIBPCI_H__
|
||||
|
||||
int stmmac_pci_plat_suspend(struct device *dev, void *bsp_priv);
|
||||
int stmmac_pci_plat_resume(struct device *dev, void *bsp_priv);
|
||||
|
||||
#endif /* __STMMAC_LIBPCI_H__ */
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <linux/dmi.h>
|
||||
|
||||
#include "stmmac.h"
|
||||
#include "stmmac_libpci.h"
|
||||
|
||||
struct stmmac_pci_info {
|
||||
int (*setup)(struct pci_dev *pdev, struct plat_stmmacenet_data *plat);
|
||||
@@ -102,37 +103,6 @@ static const struct stmmac_pci_info snps_gmac5_pci_info = {
|
||||
.setup = snps_gmac5_default_data,
|
||||
};
|
||||
|
||||
static int stmmac_pci_suspend(struct device *dev, void *bsp_priv)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
int ret;
|
||||
|
||||
ret = pci_save_state(pdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
pci_disable_device(pdev);
|
||||
pci_wake_from_d3(pdev, true);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int stmmac_pci_resume(struct device *dev, void *bsp_priv)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
int ret;
|
||||
|
||||
pci_restore_state(pdev);
|
||||
pci_set_power_state(pdev, PCI_D0);
|
||||
|
||||
ret = pci_enable_device(pdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
pci_set_master(pdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* stmmac_pci_probe
|
||||
*
|
||||
@@ -212,8 +182,8 @@ static int stmmac_pci_probe(struct pci_dev *pdev,
|
||||
plat->safety_feat_cfg->prtyen = 1;
|
||||
plat->safety_feat_cfg->tmouten = 1;
|
||||
|
||||
plat->suspend = stmmac_pci_suspend;
|
||||
plat->resume = stmmac_pci_resume;
|
||||
plat->suspend = stmmac_pci_plat_suspend;
|
||||
plat->resume = stmmac_pci_plat_resume;
|
||||
|
||||
return stmmac_dvr_probe(&pdev->dev, plat, &res);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user