* [PATCH net-next 0/3] net: stmmac: pass struct device to init/exit
@ 2025-11-19 10:02 Russell King (Oracle)
2025-11-19 10:03 ` [PATCH net-next 1/3] net: stmmac: pass struct device to init()/exit() methods Russell King (Oracle)
` (3 more replies)
0 siblings, 4 replies; 8+ messages in thread
From: Russell King (Oracle) @ 2025-11-19 10:02 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, Chen-Yu Tsai, David S. Miller,
Drew Fustini, Eric Dumazet, Fu Wei, Guo Ren, Heiko Stuebner,
Jakub Kicinski, Jan Petrous, Jernej Skrabec, Keguang Zhang,
Lad Prabhakar, linux-arm-kernel, linux-mips, linux-renesas-soc,
linux-riscv, linux-rockchip, linux-stm32, linux-sunxi,
Maxime Chevallier, Maxime Coquelin, netdev, Paolo Abeni, s32,
Samuel Holland
Rather than passing the platform device to the ->init() and ->exit()
methods, make these methods useful for other devices by passing the
struct device instead. Update the implementations appropriately for
this change.
Move the calls for these methods into the core driver's probe and
remove methods from the stmmac_platform layer.
Convert dwmac-rk to use ->init() and ->exit().
.../net/ethernet/stmicro/stmmac/dwmac-anarion.c | 4 +-
.../net/ethernet/stmicro/stmmac/dwmac-eic7700.c | 4 +-
.../net/ethernet/stmicro/stmmac/dwmac-loongson1.c | 12 +++---
.../ethernet/stmicro/stmmac/dwmac-renesas-gbeth.c | 4 +-
drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | 47 +++++++++-------------
drivers/net/ethernet/stmicro/stmmac/dwmac-s32.c | 14 +++----
.../net/ethernet/stmicro/stmmac/dwmac-socfpga.c | 2 +-
drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c | 4 +-
drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 10 ++---
drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c | 4 +-
drivers/net/ethernet/stmicro/stmmac/dwmac-thead.c | 2 +-
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 47 ++++++++++++++++------
.../net/ethernet/stmicro/stmmac/stmmac_platform.c | 35 +++++-----------
include/linux/stmmac.h | 4 +-
14 files changed, 94 insertions(+), 99 deletions(-)
--
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH net-next 1/3] net: stmmac: pass struct device to init()/exit() methods
2025-11-19 10:02 [PATCH net-next 0/3] net: stmmac: pass struct device to init/exit Russell King (Oracle)
@ 2025-11-19 10:03 ` Russell King (Oracle)
2025-11-19 14:43 ` Chen-Yu Tsai
2025-11-19 15:03 ` Maxime Chevallier
2025-11-19 10:03 ` [PATCH net-next 2/3] net: stmmac: move probe/remove calling of init/exit Russell King (Oracle)
` (2 subsequent siblings)
3 siblings, 2 replies; 8+ messages in thread
From: Russell King (Oracle) @ 2025-11-19 10:03 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, Chen-Yu Tsai, David S. Miller,
Drew Fustini, Eric Dumazet, Fu Wei, Guo Ren, Heiko Stuebner,
Jakub Kicinski, Jan Petrous, Jernej Skrabec, Keguang Zhang,
Lad Prabhakar, linux-arm-kernel, linux-mips, linux-renesas-soc,
linux-riscv, linux-rockchip, linux-stm32, linux-sunxi,
Maxime Chevallier, Maxime Coquelin, netdev, Paolo Abeni, s32,
Samuel Holland
As struct plat_stmmacenet_data is not platform_device specific, pass
a struct device into the init() and exit() methods to allow them to
become independent of the underlying device.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
.../ethernet/stmicro/stmmac/dwmac-anarion.c | 4 +--
.../ethernet/stmicro/stmmac/dwmac-eic7700.c | 4 +--
.../ethernet/stmicro/stmmac/dwmac-loongson1.c | 12 ++++----
.../stmicro/stmmac/dwmac-renesas-gbeth.c | 4 +--
.../net/ethernet/stmicro/stmmac/dwmac-s32.c | 14 +++++-----
.../ethernet/stmicro/stmmac/dwmac-socfpga.c | 2 +-
.../net/ethernet/stmicro/stmmac/dwmac-sti.c | 4 +--
.../net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 10 +++----
.../net/ethernet/stmicro/stmmac/dwmac-sunxi.c | 4 +--
.../net/ethernet/stmicro/stmmac/dwmac-thead.c | 2 +-
.../ethernet/stmicro/stmmac/stmmac_platform.c | 28 ++++++++++---------
include/linux/stmmac.h | 4 +--
12 files changed, 47 insertions(+), 45 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-anarion.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-anarion.c
index 84072c8ed741..5e0fc31762d9 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-anarion.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-anarion.c
@@ -34,7 +34,7 @@ static void gmac_write_reg(struct anarion_gmac *gmac, uint8_t reg, uint32_t val)
writel(val, gmac->ctl_block + reg);
}
-static int anarion_gmac_init(struct platform_device *pdev, void *priv)
+static int anarion_gmac_init(struct device *dev, void *priv)
{
uint32_t sw_config;
struct anarion_gmac *gmac = priv;
@@ -52,7 +52,7 @@ static int anarion_gmac_init(struct platform_device *pdev, void *priv)
return 0;
}
-static void anarion_gmac_exit(struct platform_device *pdev, void *priv)
+static void anarion_gmac_exit(struct device *dev, void *priv)
{
struct anarion_gmac *gmac = priv;
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-eic7700.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-eic7700.c
index 1dcf2037001e..bcb8e000e720 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-eic7700.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-eic7700.c
@@ -58,14 +58,14 @@ static int eic7700_clks_config(void *priv, bool enabled)
return ret;
}
-static int eic7700_dwmac_init(struct platform_device *pdev, void *priv)
+static int eic7700_dwmac_init(struct device *dev, void *priv)
{
struct eic7700_qos_priv *dwc = priv;
return eic7700_clks_config(dwc, true);
}
-static void eic7700_dwmac_exit(struct platform_device *pdev, void *priv)
+static void eic7700_dwmac_exit(struct device *dev, void *priv)
{
struct eic7700_qos_priv *dwc = priv;
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c
index 894ee66f5c9b..de9aba756aac 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c
@@ -48,7 +48,7 @@ struct ls1x_dwmac {
struct ls1x_data {
int (*setup)(struct platform_device *pdev,
struct plat_stmmacenet_data *plat_dat);
- int (*init)(struct platform_device *pdev, void *bsp_priv);
+ int (*init)(struct device *dev, void *bsp_priv);
};
static int ls1b_dwmac_setup(struct platform_device *pdev,
@@ -79,7 +79,7 @@ static int ls1b_dwmac_setup(struct platform_device *pdev,
return 0;
}
-static int ls1b_dwmac_syscon_init(struct platform_device *pdev, void *priv)
+static int ls1b_dwmac_syscon_init(struct device *dev, void *priv)
{
struct ls1x_dwmac *dwmac = priv;
struct plat_stmmacenet_data *plat = dwmac->plat_dat;
@@ -98,7 +98,7 @@ static int ls1b_dwmac_syscon_init(struct platform_device *pdev, void *priv)
GMAC0_USE_TXCLK | GMAC0_USE_PWM01);
break;
default:
- dev_err(&pdev->dev, "Unsupported PHY mode %u\n",
+ dev_err(dev, "Unsupported PHY mode %u\n",
plat->phy_interface);
return -EOPNOTSUPP;
}
@@ -122,7 +122,7 @@ static int ls1b_dwmac_syscon_init(struct platform_device *pdev, void *priv)
GMAC1_USE_TXCLK | GMAC1_USE_PWM23);
break;
default:
- dev_err(&pdev->dev, "Unsupported PHY mode %u\n",
+ dev_err(dev, "Unsupported PHY mode %u\n",
plat->phy_interface);
return -EOPNOTSUPP;
}
@@ -133,7 +133,7 @@ static int ls1b_dwmac_syscon_init(struct platform_device *pdev, void *priv)
return 0;
}
-static int ls1c_dwmac_syscon_init(struct platform_device *pdev, void *priv)
+static int ls1c_dwmac_syscon_init(struct device *dev, void *priv)
{
struct ls1x_dwmac *dwmac = priv;
struct plat_stmmacenet_data *plat = dwmac->plat_dat;
@@ -143,7 +143,7 @@ static int ls1c_dwmac_syscon_init(struct platform_device *pdev, void *priv)
phy_intf_sel = stmmac_get_phy_intf_sel(plat->phy_interface);
if (phy_intf_sel != PHY_INTF_SEL_GMII_MII &&
phy_intf_sel != PHY_INTF_SEL_RMII) {
- dev_err(&pdev->dev, "Unsupported PHY-mode %u\n",
+ dev_err(dev, "Unsupported PHY-mode %u\n",
plat->phy_interface);
return -EOPNOTSUPP;
}
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-renesas-gbeth.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-renesas-gbeth.c
index bc7bb975803c..be7f5eb2cdcf 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-renesas-gbeth.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-renesas-gbeth.c
@@ -91,7 +91,7 @@ static struct phylink_pcs *renesas_gmac_select_pcs(struct stmmac_priv *priv,
return priv->hw->phylink_pcs;
}
-static int renesas_gbeth_init(struct platform_device *pdev, void *priv)
+static int renesas_gbeth_init(struct device *dev, void *priv)
{
struct plat_stmmacenet_data *plat_dat;
struct renesas_gbeth *gbeth = priv;
@@ -113,7 +113,7 @@ static int renesas_gbeth_init(struct platform_device *pdev, void *priv)
return ret;
}
-static void renesas_gbeth_exit(struct platform_device *pdev, void *priv)
+static void renesas_gbeth_exit(struct device *dev, void *priv)
{
struct plat_stmmacenet_data *plat_dat;
struct renesas_gbeth *gbeth = priv;
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-s32.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-s32.c
index 2b7ad64bfdf7..5a485ee98fa7 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-s32.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-s32.c
@@ -47,7 +47,7 @@ static int s32_gmac_write_phy_intf_select(struct s32_priv_data *gmac)
return 0;
}
-static int s32_gmac_init(struct platform_device *pdev, void *priv)
+static int s32_gmac_init(struct device *dev, void *priv)
{
struct s32_priv_data *gmac = priv;
int ret;
@@ -55,31 +55,31 @@ static int s32_gmac_init(struct platform_device *pdev, void *priv)
/* Set initial TX interface clock */
ret = clk_prepare_enable(gmac->tx_clk);
if (ret) {
- dev_err(&pdev->dev, "Can't enable tx clock\n");
+ dev_err(dev, "Can't enable tx clock\n");
return ret;
}
ret = clk_set_rate(gmac->tx_clk, GMAC_INTF_RATE_125M);
if (ret) {
- dev_err(&pdev->dev, "Can't set tx clock\n");
+ dev_err(dev, "Can't set tx clock\n");
goto err_tx_disable;
}
/* Set initial RX interface clock */
ret = clk_prepare_enable(gmac->rx_clk);
if (ret) {
- dev_err(&pdev->dev, "Can't enable rx clock\n");
+ dev_err(dev, "Can't enable rx clock\n");
goto err_tx_disable;
}
ret = clk_set_rate(gmac->rx_clk, GMAC_INTF_RATE_125M);
if (ret) {
- dev_err(&pdev->dev, "Can't set rx clock\n");
+ dev_err(dev, "Can't set rx clock\n");
goto err_txrx_disable;
}
/* Set interface mode */
ret = s32_gmac_write_phy_intf_select(gmac);
if (ret) {
- dev_err(&pdev->dev, "Can't set PHY interface mode\n");
+ dev_err(dev, "Can't set PHY interface mode\n");
goto err_txrx_disable;
}
@@ -92,7 +92,7 @@ static int s32_gmac_init(struct platform_device *pdev, void *priv)
return ret;
}
-static void s32_gmac_exit(struct platform_device *pdev, void *priv)
+static void s32_gmac_exit(struct device *dev, void *priv)
{
struct s32_priv_data *gmac = priv;
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
index 49d651948e2b..a2b52d2c4eb6 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
@@ -551,7 +551,7 @@ static struct phylink_pcs *socfpga_dwmac_select_pcs(struct stmmac_priv *priv,
return priv->hw->phylink_pcs;
}
-static int socfpga_dwmac_init(struct platform_device *pdev, void *bsp_priv)
+static int socfpga_dwmac_init(struct device *dev, void *bsp_priv)
{
struct socfpga_dwmac *dwmac = bsp_priv;
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c
index b0509ab6b31c..f50547b67fbc 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c
@@ -229,14 +229,14 @@ static int sti_dwmac_parse_data(struct sti_dwmac *dwmac,
return 0;
}
-static int sti_dwmac_init(struct platform_device *pdev, void *bsp_priv)
+static int sti_dwmac_init(struct device *dev, void *bsp_priv)
{
struct sti_dwmac *dwmac = bsp_priv;
return clk_prepare_enable(dwmac->clk);
}
-static void sti_dwmac_exit(struct platform_device *pdev, void *bsp_priv)
+static void sti_dwmac_exit(struct device *dev, void *bsp_priv)
{
struct sti_dwmac *dwmac = bsp_priv;
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
index 7434d4bbb526..8aa496ac85cc 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
@@ -571,16 +571,16 @@ static const struct stmmac_dma_ops sun8i_dwmac_dma_ops = {
static int sun8i_dwmac_power_internal_phy(struct stmmac_priv *priv);
-static int sun8i_dwmac_init(struct platform_device *pdev, void *priv)
+static int sun8i_dwmac_init(struct device *dev, void *priv)
{
- struct net_device *ndev = platform_get_drvdata(pdev);
+ struct net_device *ndev = dev_get_drvdata(dev);
struct sunxi_priv_data *gmac = priv;
int ret;
if (gmac->regulator) {
ret = regulator_enable(gmac->regulator);
if (ret) {
- dev_err(&pdev->dev, "Fail to enable regulator\n");
+ dev_err(dev, "Fail to enable regulator\n");
return ret;
}
}
@@ -1005,7 +1005,7 @@ static void sun8i_dwmac_unset_syscon(struct sunxi_priv_data *gmac)
(H3_EPHY_SHUTDOWN | H3_EPHY_SELECT));
}
-static void sun8i_dwmac_exit(struct platform_device *pdev, void *priv)
+static void sun8i_dwmac_exit(struct device *dev, void *priv)
{
struct sunxi_priv_data *gmac = priv;
@@ -1265,7 +1265,7 @@ static void sun8i_dwmac_shutdown(struct platform_device *pdev)
struct stmmac_priv *priv = netdev_priv(ndev);
struct sunxi_priv_data *gmac = priv->plat->bsp_priv;
- sun8i_dwmac_exit(pdev, gmac);
+ sun8i_dwmac_exit(&pdev->dev, gmac);
}
static const struct of_device_id sun8i_dwmac_match[] = {
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
index 7f560d78209d..52593ba3a3a3 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
@@ -27,7 +27,7 @@ struct sunxi_priv_data {
#define SUN7I_GMAC_GMII_RGMII_RATE 125000000
#define SUN7I_GMAC_MII_RATE 25000000
-static int sun7i_gmac_init(struct platform_device *pdev, void *priv)
+static int sun7i_gmac_init(struct device *dev, void *priv)
{
struct sunxi_priv_data *gmac = priv;
int ret = 0;
@@ -58,7 +58,7 @@ static int sun7i_gmac_init(struct platform_device *pdev, void *priv)
return ret;
}
-static void sun7i_gmac_exit(struct platform_device *pdev, void *priv)
+static void sun7i_gmac_exit(struct device *dev, void *priv)
{
struct sunxi_priv_data *gmac = priv;
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-thead.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-thead.c
index a3378046b061..e291028ba56e 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-thead.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-thead.c
@@ -186,7 +186,7 @@ static int thead_dwmac_enable_clk(struct plat_stmmacenet_data *plat)
return 0;
}
-static int thead_dwmac_init(struct platform_device *pdev, void *priv)
+static int thead_dwmac_init(struct device *dev, void *priv)
{
struct thead_dwmac *dwmac = priv;
unsigned int reg;
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
index 1fefa6c55db1..feccb8a3e7e8 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
@@ -747,40 +747,40 @@ EXPORT_SYMBOL_GPL(stmmac_get_platform_resources);
/**
* stmmac_pltfr_init
- * @pdev: pointer to the platform device
+ * @dev: pointer to the device structure
* @plat: driver data platform structure
* Description: Call the platform's init callback (if any) and propagate
* the return value.
*/
-static int stmmac_pltfr_init(struct platform_device *pdev,
+static int stmmac_pltfr_init(struct device *dev,
struct plat_stmmacenet_data *plat)
{
int ret = 0;
if (plat->init)
- ret = plat->init(pdev, plat->bsp_priv);
+ ret = plat->init(dev, plat->bsp_priv);
return ret;
}
/**
* stmmac_pltfr_exit
- * @pdev: pointer to the platform device
+ * @dev: pointer to the device structure
* @plat: driver data platform structure
* Description: Call the platform's exit callback (if any).
*/
-static void stmmac_pltfr_exit(struct platform_device *pdev,
+static void stmmac_pltfr_exit(struct device *dev,
struct plat_stmmacenet_data *plat)
{
if (plat->exit)
- plat->exit(pdev, plat->bsp_priv);
+ plat->exit(dev, plat->bsp_priv);
}
static int stmmac_plat_suspend(struct device *dev, void *bsp_priv)
{
struct stmmac_priv *priv = netdev_priv(dev_get_drvdata(dev));
- stmmac_pltfr_exit(to_platform_device(dev), priv->plat);
+ stmmac_pltfr_exit(dev, priv->plat);
return 0;
}
@@ -789,7 +789,7 @@ static int stmmac_plat_resume(struct device *dev, void *bsp_priv)
{
struct stmmac_priv *priv = netdev_priv(dev_get_drvdata(dev));
- return stmmac_pltfr_init(to_platform_device(dev), priv->plat);
+ return stmmac_pltfr_init(dev, priv->plat);
}
/**
@@ -804,6 +804,7 @@ int stmmac_pltfr_probe(struct platform_device *pdev,
struct plat_stmmacenet_data *plat,
struct stmmac_resources *res)
{
+ struct device *dev = &pdev->dev;
int ret;
if (!plat->suspend && plat->exit)
@@ -811,13 +812,13 @@ int stmmac_pltfr_probe(struct platform_device *pdev,
if (!plat->resume && plat->init)
plat->resume = stmmac_plat_resume;
- ret = stmmac_pltfr_init(pdev, plat);
+ ret = stmmac_pltfr_init(dev, plat);
if (ret)
return ret;
- ret = stmmac_dvr_probe(&pdev->dev, plat, res);
+ ret = stmmac_dvr_probe(dev, plat, res);
if (ret) {
- stmmac_pltfr_exit(pdev, plat);
+ stmmac_pltfr_exit(dev, plat);
return ret;
}
@@ -866,9 +867,10 @@ void stmmac_pltfr_remove(struct platform_device *pdev)
struct net_device *ndev = platform_get_drvdata(pdev);
struct stmmac_priv *priv = netdev_priv(ndev);
struct plat_stmmacenet_data *plat = priv->plat;
+ struct device *dev = &pdev->dev;
- stmmac_dvr_remove(&pdev->dev);
- stmmac_pltfr_exit(pdev, plat);
+ stmmac_dvr_remove(dev);
+ stmmac_pltfr_exit(dev, plat);
}
EXPORT_SYMBOL_GPL(stmmac_pltfr_remove);
diff --git a/include/linux/stmmac.h b/include/linux/stmmac.h
index 4f70a6551e68..673b068fdadf 100644
--- a/include/linux/stmmac.h
+++ b/include/linux/stmmac.h
@@ -264,8 +264,8 @@ struct plat_stmmacenet_data {
unsigned int mode,
phy_interface_t interface);
void (*ptp_clk_freq_config)(struct stmmac_priv *priv);
- int (*init)(struct platform_device *pdev, void *priv);
- void (*exit)(struct platform_device *pdev, void *priv);
+ int (*init)(struct device *dev, void *priv);
+ void (*exit)(struct device *dev, void *priv);
int (*suspend)(struct device *dev, void *priv);
int (*resume)(struct device *dev, void *priv);
int (*mac_setup)(void *priv, struct mac_device_info *mac);
--
2.47.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH net-next 2/3] net: stmmac: move probe/remove calling of init/exit
2025-11-19 10:02 [PATCH net-next 0/3] net: stmmac: pass struct device to init/exit Russell King (Oracle)
2025-11-19 10:03 ` [PATCH net-next 1/3] net: stmmac: pass struct device to init()/exit() methods Russell King (Oracle)
@ 2025-11-19 10:03 ` Russell King (Oracle)
2025-11-19 15:04 ` Maxime Chevallier
2025-11-19 10:04 ` [PATCH net-next 3/3] net: stmmac: rk: convert to init()/exit() methods Russell King (Oracle)
2025-11-21 2:00 ` [PATCH net-next 0/3] net: stmmac: pass struct device to init/exit patchwork-bot+netdevbpf
3 siblings, 1 reply; 8+ messages in thread
From: Russell King (Oracle) @ 2025-11-19 10:03 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, Chen-Yu Tsai, David S. Miller,
Drew Fustini, Eric Dumazet, Fu Wei, Guo Ren, Heiko Stuebner,
Jakub Kicinski, Jan Petrous, Jernej Skrabec, Keguang Zhang,
Lad Prabhakar, linux-arm-kernel, linux-mips, linux-renesas-soc,
linux-riscv, linux-rockchip, linux-stm32, linux-sunxi,
Maxime Chevallier, Maxime Coquelin, netdev, Paolo Abeni, s32,
Samuel Holland
Move the probe/remove time calling of the init()/exit() methods in
the platform data to the main driver probe/remove functions. This
allows them to be used by non-platform_device based drivers.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
.../net/ethernet/stmicro/stmmac/stmmac_main.c | 47 ++++++++++++++-----
.../ethernet/stmicro/stmmac/stmmac_platform.c | 23 +--------
2 files changed, 36 insertions(+), 34 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index 644dccb29f75..aac8188248ff 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -7593,19 +7593,9 @@ struct plat_stmmacenet_data *stmmac_plat_dat_alloc(struct device *dev)
}
EXPORT_SYMBOL_GPL(stmmac_plat_dat_alloc);
-/**
- * stmmac_dvr_probe
- * @device: device pointer
- * @plat_dat: platform data pointer
- * @res: stmmac resource pointer
- * Description: this is the main probe function used to
- * call the alloc_etherdev, allocate the priv structure.
- * Return:
- * returns 0 on success, otherwise errno.
- */
-int stmmac_dvr_probe(struct device *device,
- struct plat_stmmacenet_data *plat_dat,
- struct stmmac_resources *res)
+static int __stmmac_dvr_probe(struct device *device,
+ struct plat_stmmacenet_data *plat_dat,
+ struct stmmac_resources *res)
{
struct net_device *ndev = NULL;
struct stmmac_priv *priv;
@@ -7912,6 +7902,34 @@ int stmmac_dvr_probe(struct device *device,
return ret;
}
+
+/**
+ * stmmac_dvr_probe
+ * @dev: device pointer
+ * @plat_dat: platform data pointer
+ * @res: stmmac resource pointer
+ * Description: this is the main probe function used to
+ * call the alloc_etherdev, allocate the priv structure.
+ * Return:
+ * returns 0 on success, otherwise errno.
+ */
+int stmmac_dvr_probe(struct device *dev, struct plat_stmmacenet_data *plat_dat,
+ struct stmmac_resources *res)
+{
+ int ret;
+
+ if (plat_dat->init) {
+ ret = plat_dat->init(dev, plat_dat->bsp_priv);
+ if (ret)
+ return ret;
+ }
+
+ ret = __stmmac_dvr_probe(dev, plat_dat, res);
+ if (ret && plat_dat->exit)
+ plat_dat->exit(dev, plat_dat->bsp_priv);
+
+ return ret;
+}
EXPORT_SYMBOL_GPL(stmmac_dvr_probe);
/**
@@ -7950,6 +7968,9 @@ void stmmac_dvr_remove(struct device *dev)
pm_runtime_disable(dev);
pm_runtime_put_noidle(dev);
+
+ if (priv->plat->exit)
+ priv->plat->exit(dev, priv->plat->bsp_priv);
}
EXPORT_SYMBOL_GPL(stmmac_dvr_remove);
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
index feccb8a3e7e8..9015b7f80d1b 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
@@ -804,25 +804,12 @@ int stmmac_pltfr_probe(struct platform_device *pdev,
struct plat_stmmacenet_data *plat,
struct stmmac_resources *res)
{
- struct device *dev = &pdev->dev;
- int ret;
-
if (!plat->suspend && plat->exit)
plat->suspend = stmmac_plat_suspend;
if (!plat->resume && plat->init)
plat->resume = stmmac_plat_resume;
- ret = stmmac_pltfr_init(dev, plat);
- if (ret)
- return ret;
-
- ret = stmmac_dvr_probe(dev, plat, res);
- if (ret) {
- stmmac_pltfr_exit(dev, plat);
- return ret;
- }
-
- return ret;
+ return stmmac_dvr_probe(&pdev->dev, plat, res);
}
EXPORT_SYMBOL_GPL(stmmac_pltfr_probe);
@@ -864,13 +851,7 @@ EXPORT_SYMBOL_GPL(devm_stmmac_pltfr_probe);
*/
void stmmac_pltfr_remove(struct platform_device *pdev)
{
- struct net_device *ndev = platform_get_drvdata(pdev);
- struct stmmac_priv *priv = netdev_priv(ndev);
- struct plat_stmmacenet_data *plat = priv->plat;
- struct device *dev = &pdev->dev;
-
- stmmac_dvr_remove(dev);
- stmmac_pltfr_exit(dev, plat);
+ stmmac_dvr_remove(&pdev->dev);
}
EXPORT_SYMBOL_GPL(stmmac_pltfr_remove);
--
2.47.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH net-next 3/3] net: stmmac: rk: convert to init()/exit() methods
2025-11-19 10:02 [PATCH net-next 0/3] net: stmmac: pass struct device to init/exit Russell King (Oracle)
2025-11-19 10:03 ` [PATCH net-next 1/3] net: stmmac: pass struct device to init()/exit() methods Russell King (Oracle)
2025-11-19 10:03 ` [PATCH net-next 2/3] net: stmmac: move probe/remove calling of init/exit Russell King (Oracle)
@ 2025-11-19 10:04 ` Russell King (Oracle)
2025-11-21 2:00 ` [PATCH net-next 0/3] net: stmmac: pass struct device to init/exit patchwork-bot+netdevbpf
3 siblings, 0 replies; 8+ messages in thread
From: Russell King (Oracle) @ 2025-11-19 10:04 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, Chen-Yu Tsai, David S. Miller,
Drew Fustini, Eric Dumazet, Fu Wei, Guo Ren, Heiko Stuebner,
Jakub Kicinski, Jan Petrous, Jernej Skrabec, Keguang Zhang,
Lad Prabhakar, linux-arm-kernel, linux-mips, linux-renesas-soc,
linux-riscv, linux-rockchip, linux-stm32, linux-sunxi,
Maxime Chevallier, Maxime Coquelin, netdev, Paolo Abeni, s32,
Samuel Holland
Convert rk to use the init() and exit() methods for powering up and
down the device. This allows us to use the pltfr versions of probe()
and remove().
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
.../net/ethernet/stmicro/stmmac/dwmac-rk.c | 47 ++++++++-----------
1 file changed, 19 insertions(+), 28 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index 6e75da577af5..6bfe82d7001a 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -1763,6 +1763,22 @@ static int rk_gmac_resume(struct device *dev, void *bsp_priv_)
return 0;
}
+static int rk_gmac_init(struct device *dev, void *bsp_priv)
+{
+ return rk_gmac_powerup(bsp_priv);
+}
+
+static void rk_gmac_exit(struct device *dev, void *bsp_priv_)
+{
+ struct stmmac_priv *priv = netdev_priv(dev_get_drvdata(dev));
+ struct rk_priv_data *bsp_priv = bsp_priv_;
+
+ rk_gmac_powerdown(bsp_priv);
+
+ if (priv->plat->phy_node && bsp_priv->integrated_phy)
+ clk_put(bsp_priv->clk_phy);
+}
+
static int rk_gmac_probe(struct platform_device *pdev)
{
struct plat_stmmacenet_data *plat_dat;
@@ -1795,6 +1811,8 @@ static int rk_gmac_probe(struct platform_device *pdev)
plat_dat->get_interfaces = rk_get_interfaces;
plat_dat->set_clk_tx_rate = rk_set_clk_tx_rate;
+ plat_dat->init = rk_gmac_init;
+ plat_dat->exit = rk_gmac_exit;
plat_dat->suspend = rk_gmac_suspend;
plat_dat->resume = rk_gmac_resume;
@@ -1806,33 +1824,7 @@ static int rk_gmac_probe(struct platform_device *pdev)
if (ret)
return ret;
- ret = rk_gmac_powerup(plat_dat->bsp_priv);
- if (ret)
- return ret;
-
- ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
- if (ret)
- goto err_gmac_powerdown;
-
- return 0;
-
-err_gmac_powerdown:
- rk_gmac_powerdown(plat_dat->bsp_priv);
-
- return ret;
-}
-
-static void rk_gmac_remove(struct platform_device *pdev)
-{
- struct stmmac_priv *priv = netdev_priv(platform_get_drvdata(pdev));
- struct rk_priv_data *bsp_priv = priv->plat->bsp_priv;
-
- stmmac_dvr_remove(&pdev->dev);
-
- rk_gmac_powerdown(bsp_priv);
-
- if (priv->plat->phy_node && bsp_priv->integrated_phy)
- clk_put(bsp_priv->clk_phy);
+ return devm_stmmac_pltfr_probe(pdev, plat_dat, &stmmac_res);
}
static const struct of_device_id rk_gmac_dwmac_match[] = {
@@ -1858,7 +1850,6 @@ MODULE_DEVICE_TABLE(of, rk_gmac_dwmac_match);
static struct platform_driver rk_gmac_dwmac_driver = {
.probe = rk_gmac_probe,
- .remove = rk_gmac_remove,
.driver = {
.name = "rk_gmac-dwmac",
.pm = &stmmac_simple_pm_ops,
--
2.47.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH net-next 1/3] net: stmmac: pass struct device to init()/exit() methods
2025-11-19 10:03 ` [PATCH net-next 1/3] net: stmmac: pass struct device to init()/exit() methods Russell King (Oracle)
@ 2025-11-19 14:43 ` Chen-Yu Tsai
2025-11-19 15:03 ` Maxime Chevallier
1 sibling, 0 replies; 8+ messages in thread
From: Chen-Yu Tsai @ 2025-11-19 14:43 UTC (permalink / raw)
To: Russell King (Oracle)
Cc: Andrew Lunn, Heiner Kallweit, Alexandre Torgue, Andrew Lunn,
David S. Miller, Drew Fustini, Eric Dumazet, Fu Wei, Guo Ren,
Heiko Stuebner, Jakub Kicinski, Jan Petrous, Jernej Skrabec,
Keguang Zhang, Lad Prabhakar, linux-arm-kernel, linux-mips,
linux-renesas-soc, linux-riscv, linux-rockchip, linux-stm32,
linux-sunxi, Maxime Chevallier, Maxime Coquelin, netdev,
Paolo Abeni, s32, Samuel Holland
On Wed, Nov 19, 2025 at 6:04 PM Russell King (Oracle)
<rmk+kernel@armlinux.org.uk> wrote:
>
> As struct plat_stmmacenet_data is not platform_device specific, pass
> a struct device into the init() and exit() methods to allow them to
> become independent of the underlying device.
>
> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
> ---
> .../ethernet/stmicro/stmmac/dwmac-anarion.c | 4 +--
> .../ethernet/stmicro/stmmac/dwmac-eic7700.c | 4 +--
> .../ethernet/stmicro/stmmac/dwmac-loongson1.c | 12 ++++----
> .../stmicro/stmmac/dwmac-renesas-gbeth.c | 4 +--
> .../net/ethernet/stmicro/stmmac/dwmac-s32.c | 14 +++++-----
> .../ethernet/stmicro/stmmac/dwmac-socfpga.c | 2 +-
> .../net/ethernet/stmicro/stmmac/dwmac-sti.c | 4 +--
> .../net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 10 +++----
> .../net/ethernet/stmicro/stmmac/dwmac-sunxi.c | 4 +--
For sun8i / sunxi,
Acked-by: Chen-Yu Tsai <wens@kernel.org>
> .../net/ethernet/stmicro/stmmac/dwmac-thead.c | 2 +-
> .../ethernet/stmicro/stmmac/stmmac_platform.c | 28 ++++++++++---------
> include/linux/stmmac.h | 4 +--
> 12 files changed, 47 insertions(+), 45 deletions(-)
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH net-next 1/3] net: stmmac: pass struct device to init()/exit() methods
2025-11-19 10:03 ` [PATCH net-next 1/3] net: stmmac: pass struct device to init()/exit() methods Russell King (Oracle)
2025-11-19 14:43 ` Chen-Yu Tsai
@ 2025-11-19 15:03 ` Maxime Chevallier
1 sibling, 0 replies; 8+ messages in thread
From: Maxime Chevallier @ 2025-11-19 15:03 UTC (permalink / raw)
To: Russell King (Oracle), Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, Chen-Yu Tsai, David S. Miller,
Drew Fustini, Eric Dumazet, Fu Wei, Guo Ren, Heiko Stuebner,
Jakub Kicinski, Jan Petrous, Jernej Skrabec, Keguang Zhang,
Lad Prabhakar, linux-arm-kernel, linux-mips, linux-renesas-soc,
linux-riscv, linux-rockchip, linux-stm32, linux-sunxi,
Maxime Coquelin, netdev, Paolo Abeni, s32, Samuel Holland
On 19/11/2025 11:03, Russell King (Oracle) wrote:
> As struct plat_stmmacenet_data is not platform_device specific, pass
> a struct device into the init() and exit() methods to allow them to
> become independent of the underlying device.
>
> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Maxime
> ---
> .../ethernet/stmicro/stmmac/dwmac-anarion.c | 4 +--
> .../ethernet/stmicro/stmmac/dwmac-eic7700.c | 4 +--
> .../ethernet/stmicro/stmmac/dwmac-loongson1.c | 12 ++++----
> .../stmicro/stmmac/dwmac-renesas-gbeth.c | 4 +--
> .../net/ethernet/stmicro/stmmac/dwmac-s32.c | 14 +++++-----
> .../ethernet/stmicro/stmmac/dwmac-socfpga.c | 2 +-
> .../net/ethernet/stmicro/stmmac/dwmac-sti.c | 4 +--
> .../net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 10 +++----
> .../net/ethernet/stmicro/stmmac/dwmac-sunxi.c | 4 +--
> .../net/ethernet/stmicro/stmmac/dwmac-thead.c | 2 +-
> .../ethernet/stmicro/stmmac/stmmac_platform.c | 28 ++++++++++---------
> include/linux/stmmac.h | 4 +--
> 12 files changed, 47 insertions(+), 45 deletions(-)
>
> diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-anarion.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-anarion.c
> index 84072c8ed741..5e0fc31762d9 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-anarion.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-anarion.c
> @@ -34,7 +34,7 @@ static void gmac_write_reg(struct anarion_gmac *gmac, uint8_t reg, uint32_t val)
> writel(val, gmac->ctl_block + reg);
> }
>
> -static int anarion_gmac_init(struct platform_device *pdev, void *priv)
> +static int anarion_gmac_init(struct device *dev, void *priv)
> {
> uint32_t sw_config;
> struct anarion_gmac *gmac = priv;
> @@ -52,7 +52,7 @@ static int anarion_gmac_init(struct platform_device *pdev, void *priv)
> return 0;
> }
>
> -static void anarion_gmac_exit(struct platform_device *pdev, void *priv)
> +static void anarion_gmac_exit(struct device *dev, void *priv)
> {
> struct anarion_gmac *gmac = priv;
>
> diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-eic7700.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-eic7700.c
> index 1dcf2037001e..bcb8e000e720 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-eic7700.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-eic7700.c
> @@ -58,14 +58,14 @@ static int eic7700_clks_config(void *priv, bool enabled)
> return ret;
> }
>
> -static int eic7700_dwmac_init(struct platform_device *pdev, void *priv)
> +static int eic7700_dwmac_init(struct device *dev, void *priv)
> {
> struct eic7700_qos_priv *dwc = priv;
>
> return eic7700_clks_config(dwc, true);
> }
>
> -static void eic7700_dwmac_exit(struct platform_device *pdev, void *priv)
> +static void eic7700_dwmac_exit(struct device *dev, void *priv)
> {
> struct eic7700_qos_priv *dwc = priv;
>
> diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c
> index 894ee66f5c9b..de9aba756aac 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c
> @@ -48,7 +48,7 @@ struct ls1x_dwmac {
> struct ls1x_data {
> int (*setup)(struct platform_device *pdev,
> struct plat_stmmacenet_data *plat_dat);
> - int (*init)(struct platform_device *pdev, void *bsp_priv);
> + int (*init)(struct device *dev, void *bsp_priv);
> };
>
> static int ls1b_dwmac_setup(struct platform_device *pdev,
> @@ -79,7 +79,7 @@ static int ls1b_dwmac_setup(struct platform_device *pdev,
> return 0;
> }
>
> -static int ls1b_dwmac_syscon_init(struct platform_device *pdev, void *priv)
> +static int ls1b_dwmac_syscon_init(struct device *dev, void *priv)
> {
> struct ls1x_dwmac *dwmac = priv;
> struct plat_stmmacenet_data *plat = dwmac->plat_dat;
> @@ -98,7 +98,7 @@ static int ls1b_dwmac_syscon_init(struct platform_device *pdev, void *priv)
> GMAC0_USE_TXCLK | GMAC0_USE_PWM01);
> break;
> default:
> - dev_err(&pdev->dev, "Unsupported PHY mode %u\n",
> + dev_err(dev, "Unsupported PHY mode %u\n",
> plat->phy_interface);
> return -EOPNOTSUPP;
> }
> @@ -122,7 +122,7 @@ static int ls1b_dwmac_syscon_init(struct platform_device *pdev, void *priv)
> GMAC1_USE_TXCLK | GMAC1_USE_PWM23);
> break;
> default:
> - dev_err(&pdev->dev, "Unsupported PHY mode %u\n",
> + dev_err(dev, "Unsupported PHY mode %u\n",
> plat->phy_interface);
> return -EOPNOTSUPP;
> }
> @@ -133,7 +133,7 @@ static int ls1b_dwmac_syscon_init(struct platform_device *pdev, void *priv)
> return 0;
> }
>
> -static int ls1c_dwmac_syscon_init(struct platform_device *pdev, void *priv)
> +static int ls1c_dwmac_syscon_init(struct device *dev, void *priv)
> {
> struct ls1x_dwmac *dwmac = priv;
> struct plat_stmmacenet_data *plat = dwmac->plat_dat;
> @@ -143,7 +143,7 @@ static int ls1c_dwmac_syscon_init(struct platform_device *pdev, void *priv)
> phy_intf_sel = stmmac_get_phy_intf_sel(plat->phy_interface);
> if (phy_intf_sel != PHY_INTF_SEL_GMII_MII &&
> phy_intf_sel != PHY_INTF_SEL_RMII) {
> - dev_err(&pdev->dev, "Unsupported PHY-mode %u\n",
> + dev_err(dev, "Unsupported PHY-mode %u\n",
> plat->phy_interface);
> return -EOPNOTSUPP;
> }
> diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-renesas-gbeth.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-renesas-gbeth.c
> index bc7bb975803c..be7f5eb2cdcf 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-renesas-gbeth.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-renesas-gbeth.c
> @@ -91,7 +91,7 @@ static struct phylink_pcs *renesas_gmac_select_pcs(struct stmmac_priv *priv,
> return priv->hw->phylink_pcs;
> }
>
> -static int renesas_gbeth_init(struct platform_device *pdev, void *priv)
> +static int renesas_gbeth_init(struct device *dev, void *priv)
> {
> struct plat_stmmacenet_data *plat_dat;
> struct renesas_gbeth *gbeth = priv;
> @@ -113,7 +113,7 @@ static int renesas_gbeth_init(struct platform_device *pdev, void *priv)
> return ret;
> }
>
> -static void renesas_gbeth_exit(struct platform_device *pdev, void *priv)
> +static void renesas_gbeth_exit(struct device *dev, void *priv)
> {
> struct plat_stmmacenet_data *plat_dat;
> struct renesas_gbeth *gbeth = priv;
> diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-s32.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-s32.c
> index 2b7ad64bfdf7..5a485ee98fa7 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-s32.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-s32.c
> @@ -47,7 +47,7 @@ static int s32_gmac_write_phy_intf_select(struct s32_priv_data *gmac)
> return 0;
> }
>
> -static int s32_gmac_init(struct platform_device *pdev, void *priv)
> +static int s32_gmac_init(struct device *dev, void *priv)
> {
> struct s32_priv_data *gmac = priv;
> int ret;
> @@ -55,31 +55,31 @@ static int s32_gmac_init(struct platform_device *pdev, void *priv)
> /* Set initial TX interface clock */
> ret = clk_prepare_enable(gmac->tx_clk);
> if (ret) {
> - dev_err(&pdev->dev, "Can't enable tx clock\n");
> + dev_err(dev, "Can't enable tx clock\n");
> return ret;
> }
> ret = clk_set_rate(gmac->tx_clk, GMAC_INTF_RATE_125M);
> if (ret) {
> - dev_err(&pdev->dev, "Can't set tx clock\n");
> + dev_err(dev, "Can't set tx clock\n");
> goto err_tx_disable;
> }
>
> /* Set initial RX interface clock */
> ret = clk_prepare_enable(gmac->rx_clk);
> if (ret) {
> - dev_err(&pdev->dev, "Can't enable rx clock\n");
> + dev_err(dev, "Can't enable rx clock\n");
> goto err_tx_disable;
> }
> ret = clk_set_rate(gmac->rx_clk, GMAC_INTF_RATE_125M);
> if (ret) {
> - dev_err(&pdev->dev, "Can't set rx clock\n");
> + dev_err(dev, "Can't set rx clock\n");
> goto err_txrx_disable;
> }
>
> /* Set interface mode */
> ret = s32_gmac_write_phy_intf_select(gmac);
> if (ret) {
> - dev_err(&pdev->dev, "Can't set PHY interface mode\n");
> + dev_err(dev, "Can't set PHY interface mode\n");
> goto err_txrx_disable;
> }
>
> @@ -92,7 +92,7 @@ static int s32_gmac_init(struct platform_device *pdev, void *priv)
> return ret;
> }
>
> -static void s32_gmac_exit(struct platform_device *pdev, void *priv)
> +static void s32_gmac_exit(struct device *dev, void *priv)
> {
> struct s32_priv_data *gmac = priv;
>
> diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
> index 49d651948e2b..a2b52d2c4eb6 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
> @@ -551,7 +551,7 @@ static struct phylink_pcs *socfpga_dwmac_select_pcs(struct stmmac_priv *priv,
> return priv->hw->phylink_pcs;
> }
>
> -static int socfpga_dwmac_init(struct platform_device *pdev, void *bsp_priv)
> +static int socfpga_dwmac_init(struct device *dev, void *bsp_priv)
> {
> struct socfpga_dwmac *dwmac = bsp_priv;
>
> diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c
> index b0509ab6b31c..f50547b67fbc 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c
> @@ -229,14 +229,14 @@ static int sti_dwmac_parse_data(struct sti_dwmac *dwmac,
> return 0;
> }
>
> -static int sti_dwmac_init(struct platform_device *pdev, void *bsp_priv)
> +static int sti_dwmac_init(struct device *dev, void *bsp_priv)
> {
> struct sti_dwmac *dwmac = bsp_priv;
>
> return clk_prepare_enable(dwmac->clk);
> }
>
> -static void sti_dwmac_exit(struct platform_device *pdev, void *bsp_priv)
> +static void sti_dwmac_exit(struct device *dev, void *bsp_priv)
> {
> struct sti_dwmac *dwmac = bsp_priv;
>
> diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
> index 7434d4bbb526..8aa496ac85cc 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
> @@ -571,16 +571,16 @@ static const struct stmmac_dma_ops sun8i_dwmac_dma_ops = {
>
> static int sun8i_dwmac_power_internal_phy(struct stmmac_priv *priv);
>
> -static int sun8i_dwmac_init(struct platform_device *pdev, void *priv)
> +static int sun8i_dwmac_init(struct device *dev, void *priv)
> {
> - struct net_device *ndev = platform_get_drvdata(pdev);
> + struct net_device *ndev = dev_get_drvdata(dev);
> struct sunxi_priv_data *gmac = priv;
> int ret;
>
> if (gmac->regulator) {
> ret = regulator_enable(gmac->regulator);
> if (ret) {
> - dev_err(&pdev->dev, "Fail to enable regulator\n");
> + dev_err(dev, "Fail to enable regulator\n");
> return ret;
> }
> }
> @@ -1005,7 +1005,7 @@ static void sun8i_dwmac_unset_syscon(struct sunxi_priv_data *gmac)
> (H3_EPHY_SHUTDOWN | H3_EPHY_SELECT));
> }
>
> -static void sun8i_dwmac_exit(struct platform_device *pdev, void *priv)
> +static void sun8i_dwmac_exit(struct device *dev, void *priv)
> {
> struct sunxi_priv_data *gmac = priv;
>
> @@ -1265,7 +1265,7 @@ static void sun8i_dwmac_shutdown(struct platform_device *pdev)
> struct stmmac_priv *priv = netdev_priv(ndev);
> struct sunxi_priv_data *gmac = priv->plat->bsp_priv;
>
> - sun8i_dwmac_exit(pdev, gmac);
> + sun8i_dwmac_exit(&pdev->dev, gmac);
> }
>
> static const struct of_device_id sun8i_dwmac_match[] = {
> diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
> index 7f560d78209d..52593ba3a3a3 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
> @@ -27,7 +27,7 @@ struct sunxi_priv_data {
> #define SUN7I_GMAC_GMII_RGMII_RATE 125000000
> #define SUN7I_GMAC_MII_RATE 25000000
>
> -static int sun7i_gmac_init(struct platform_device *pdev, void *priv)
> +static int sun7i_gmac_init(struct device *dev, void *priv)
> {
> struct sunxi_priv_data *gmac = priv;
> int ret = 0;
> @@ -58,7 +58,7 @@ static int sun7i_gmac_init(struct platform_device *pdev, void *priv)
> return ret;
> }
>
> -static void sun7i_gmac_exit(struct platform_device *pdev, void *priv)
> +static void sun7i_gmac_exit(struct device *dev, void *priv)
> {
> struct sunxi_priv_data *gmac = priv;
>
> diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-thead.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-thead.c
> index a3378046b061..e291028ba56e 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-thead.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-thead.c
> @@ -186,7 +186,7 @@ static int thead_dwmac_enable_clk(struct plat_stmmacenet_data *plat)
> return 0;
> }
>
> -static int thead_dwmac_init(struct platform_device *pdev, void *priv)
> +static int thead_dwmac_init(struct device *dev, void *priv)
> {
> struct thead_dwmac *dwmac = priv;
> unsigned int reg;
> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
> index 1fefa6c55db1..feccb8a3e7e8 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
> @@ -747,40 +747,40 @@ EXPORT_SYMBOL_GPL(stmmac_get_platform_resources);
>
> /**
> * stmmac_pltfr_init
> - * @pdev: pointer to the platform device
> + * @dev: pointer to the device structure
> * @plat: driver data platform structure
> * Description: Call the platform's init callback (if any) and propagate
> * the return value.
> */
> -static int stmmac_pltfr_init(struct platform_device *pdev,
> +static int stmmac_pltfr_init(struct device *dev,
> struct plat_stmmacenet_data *plat)
> {
> int ret = 0;
>
> if (plat->init)
> - ret = plat->init(pdev, plat->bsp_priv);
> + ret = plat->init(dev, plat->bsp_priv);
>
> return ret;
> }
>
> /**
> * stmmac_pltfr_exit
> - * @pdev: pointer to the platform device
> + * @dev: pointer to the device structure
> * @plat: driver data platform structure
> * Description: Call the platform's exit callback (if any).
> */
> -static void stmmac_pltfr_exit(struct platform_device *pdev,
> +static void stmmac_pltfr_exit(struct device *dev,
> struct plat_stmmacenet_data *plat)
> {
> if (plat->exit)
> - plat->exit(pdev, plat->bsp_priv);
> + plat->exit(dev, plat->bsp_priv);
> }
>
> static int stmmac_plat_suspend(struct device *dev, void *bsp_priv)
> {
> struct stmmac_priv *priv = netdev_priv(dev_get_drvdata(dev));
>
> - stmmac_pltfr_exit(to_platform_device(dev), priv->plat);
> + stmmac_pltfr_exit(dev, priv->plat);
>
> return 0;
> }
> @@ -789,7 +789,7 @@ static int stmmac_plat_resume(struct device *dev, void *bsp_priv)
> {
> struct stmmac_priv *priv = netdev_priv(dev_get_drvdata(dev));
>
> - return stmmac_pltfr_init(to_platform_device(dev), priv->plat);
> + return stmmac_pltfr_init(dev, priv->plat);
> }
>
> /**
> @@ -804,6 +804,7 @@ int stmmac_pltfr_probe(struct platform_device *pdev,
> struct plat_stmmacenet_data *plat,
> struct stmmac_resources *res)
> {
> + struct device *dev = &pdev->dev;
> int ret;
>
> if (!plat->suspend && plat->exit)
> @@ -811,13 +812,13 @@ int stmmac_pltfr_probe(struct platform_device *pdev,
> if (!plat->resume && plat->init)
> plat->resume = stmmac_plat_resume;
>
> - ret = stmmac_pltfr_init(pdev, plat);
> + ret = stmmac_pltfr_init(dev, plat);
> if (ret)
> return ret;
>
> - ret = stmmac_dvr_probe(&pdev->dev, plat, res);
> + ret = stmmac_dvr_probe(dev, plat, res);
> if (ret) {
> - stmmac_pltfr_exit(pdev, plat);
> + stmmac_pltfr_exit(dev, plat);
> return ret;
> }
>
> @@ -866,9 +867,10 @@ void stmmac_pltfr_remove(struct platform_device *pdev)
> struct net_device *ndev = platform_get_drvdata(pdev);
> struct stmmac_priv *priv = netdev_priv(ndev);
> struct plat_stmmacenet_data *plat = priv->plat;
> + struct device *dev = &pdev->dev;
>
> - stmmac_dvr_remove(&pdev->dev);
> - stmmac_pltfr_exit(pdev, plat);
> + stmmac_dvr_remove(dev);
> + stmmac_pltfr_exit(dev, plat);
> }
> EXPORT_SYMBOL_GPL(stmmac_pltfr_remove);
>
> diff --git a/include/linux/stmmac.h b/include/linux/stmmac.h
> index 4f70a6551e68..673b068fdadf 100644
> --- a/include/linux/stmmac.h
> +++ b/include/linux/stmmac.h
> @@ -264,8 +264,8 @@ struct plat_stmmacenet_data {
> unsigned int mode,
> phy_interface_t interface);
> void (*ptp_clk_freq_config)(struct stmmac_priv *priv);
> - int (*init)(struct platform_device *pdev, void *priv);
> - void (*exit)(struct platform_device *pdev, void *priv);
> + int (*init)(struct device *dev, void *priv);
> + void (*exit)(struct device *dev, void *priv);
> int (*suspend)(struct device *dev, void *priv);
> int (*resume)(struct device *dev, void *priv);
> int (*mac_setup)(void *priv, struct mac_device_info *mac);
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH net-next 2/3] net: stmmac: move probe/remove calling of init/exit
2025-11-19 10:03 ` [PATCH net-next 2/3] net: stmmac: move probe/remove calling of init/exit Russell King (Oracle)
@ 2025-11-19 15:04 ` Maxime Chevallier
0 siblings, 0 replies; 8+ messages in thread
From: Maxime Chevallier @ 2025-11-19 15:04 UTC (permalink / raw)
To: Russell King (Oracle), Andrew Lunn, Heiner Kallweit
Cc: Alexandre Torgue, Andrew Lunn, Chen-Yu Tsai, David S. Miller,
Drew Fustini, Eric Dumazet, Fu Wei, Guo Ren, Heiko Stuebner,
Jakub Kicinski, Jan Petrous, Jernej Skrabec, Keguang Zhang,
Lad Prabhakar, linux-arm-kernel, linux-mips, linux-renesas-soc,
linux-riscv, linux-rockchip, linux-stm32, linux-sunxi,
Maxime Coquelin, netdev, Paolo Abeni, s32, Samuel Holland
On 19/11/2025 11:03, Russell King (Oracle) wrote:
> Move the probe/remove time calling of the init()/exit() methods in
> the platform data to the main driver probe/remove functions. This
> allows them to be used by non-platform_device based drivers.
>
> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Maxime
> ---
> .../net/ethernet/stmicro/stmmac/stmmac_main.c | 47 ++++++++++++++-----
> .../ethernet/stmicro/stmmac/stmmac_platform.c | 23 +--------
> 2 files changed, 36 insertions(+), 34 deletions(-)
>
> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
> index 644dccb29f75..aac8188248ff 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
> @@ -7593,19 +7593,9 @@ struct plat_stmmacenet_data *stmmac_plat_dat_alloc(struct device *dev)
> }
> EXPORT_SYMBOL_GPL(stmmac_plat_dat_alloc);
>
> -/**
> - * stmmac_dvr_probe
> - * @device: device pointer
> - * @plat_dat: platform data pointer
> - * @res: stmmac resource pointer
> - * Description: this is the main probe function used to
> - * call the alloc_etherdev, allocate the priv structure.
> - * Return:
> - * returns 0 on success, otherwise errno.
> - */
> -int stmmac_dvr_probe(struct device *device,
> - struct plat_stmmacenet_data *plat_dat,
> - struct stmmac_resources *res)
> +static int __stmmac_dvr_probe(struct device *device,
> + struct plat_stmmacenet_data *plat_dat,
> + struct stmmac_resources *res)
> {
> struct net_device *ndev = NULL;
> struct stmmac_priv *priv;
> @@ -7912,6 +7902,34 @@ int stmmac_dvr_probe(struct device *device,
>
> return ret;
> }
> +
> +/**
> + * stmmac_dvr_probe
> + * @dev: device pointer
> + * @plat_dat: platform data pointer
> + * @res: stmmac resource pointer
> + * Description: this is the main probe function used to
> + * call the alloc_etherdev, allocate the priv structure.
> + * Return:
> + * returns 0 on success, otherwise errno.
> + */
> +int stmmac_dvr_probe(struct device *dev, struct plat_stmmacenet_data *plat_dat,
> + struct stmmac_resources *res)
> +{
> + int ret;
> +
> + if (plat_dat->init) {
> + ret = plat_dat->init(dev, plat_dat->bsp_priv);
> + if (ret)
> + return ret;
> + }
> +
> + ret = __stmmac_dvr_probe(dev, plat_dat, res);
> + if (ret && plat_dat->exit)
> + plat_dat->exit(dev, plat_dat->bsp_priv);
> +
> + return ret;
> +}
> EXPORT_SYMBOL_GPL(stmmac_dvr_probe);
>
> /**
> @@ -7950,6 +7968,9 @@ void stmmac_dvr_remove(struct device *dev)
>
> pm_runtime_disable(dev);
> pm_runtime_put_noidle(dev);
> +
> + if (priv->plat->exit)
> + priv->plat->exit(dev, priv->plat->bsp_priv);
> }
> EXPORT_SYMBOL_GPL(stmmac_dvr_remove);
>
> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
> index feccb8a3e7e8..9015b7f80d1b 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
> @@ -804,25 +804,12 @@ int stmmac_pltfr_probe(struct platform_device *pdev,
> struct plat_stmmacenet_data *plat,
> struct stmmac_resources *res)
> {
> - struct device *dev = &pdev->dev;
> - int ret;
> -
> if (!plat->suspend && plat->exit)
> plat->suspend = stmmac_plat_suspend;
> if (!plat->resume && plat->init)
> plat->resume = stmmac_plat_resume;
>
> - ret = stmmac_pltfr_init(dev, plat);
> - if (ret)
> - return ret;
> -
> - ret = stmmac_dvr_probe(dev, plat, res);
> - if (ret) {
> - stmmac_pltfr_exit(dev, plat);
> - return ret;
> - }
> -
> - return ret;
> + return stmmac_dvr_probe(&pdev->dev, plat, res);
> }
> EXPORT_SYMBOL_GPL(stmmac_pltfr_probe);
>
> @@ -864,13 +851,7 @@ EXPORT_SYMBOL_GPL(devm_stmmac_pltfr_probe);
> */
> void stmmac_pltfr_remove(struct platform_device *pdev)
> {
> - struct net_device *ndev = platform_get_drvdata(pdev);
> - struct stmmac_priv *priv = netdev_priv(ndev);
> - struct plat_stmmacenet_data *plat = priv->plat;
> - struct device *dev = &pdev->dev;
> -
> - stmmac_dvr_remove(dev);
> - stmmac_pltfr_exit(dev, plat);
> + stmmac_dvr_remove(&pdev->dev);
> }
> EXPORT_SYMBOL_GPL(stmmac_pltfr_remove);
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH net-next 0/3] net: stmmac: pass struct device to init/exit
2025-11-19 10:02 [PATCH net-next 0/3] net: stmmac: pass struct device to init/exit Russell King (Oracle)
` (2 preceding siblings ...)
2025-11-19 10:04 ` [PATCH net-next 3/3] net: stmmac: rk: convert to init()/exit() methods Russell King (Oracle)
@ 2025-11-21 2:00 ` patchwork-bot+netdevbpf
3 siblings, 0 replies; 8+ messages in thread
From: patchwork-bot+netdevbpf @ 2025-11-21 2:00 UTC (permalink / raw)
To: Russell King
Cc: andrew, hkallweit1, alexandre.torgue, andrew+netdev, wens, davem,
fustini, edumazet, wefu, guoren, heiko, kuba, jan.petrous,
jernej.skrabec, keguang.zhang, prabhakar.mahadev-lad.rj,
linux-arm-kernel, linux-mips, linux-renesas-soc, linux-riscv,
linux-rockchip, linux-stm32, linux-sunxi, maxime.chevallier,
mcoquelin.stm32, netdev, pabeni, s32, samuel
Hello:
This series was applied to netdev/net-next.git (main)
by Jakub Kicinski <kuba@kernel.org>:
On Wed, 19 Nov 2025 10:02:56 +0000 you wrote:
> Rather than passing the platform device to the ->init() and ->exit()
> methods, make these methods useful for other devices by passing the
> struct device instead. Update the implementations appropriately for
> this change.
>
> Move the calls for these methods into the core driver's probe and
> remove methods from the stmmac_platform layer.
>
> [...]
Here is the summary with links:
- [net-next,1/3] net: stmmac: pass struct device to init()/exit() methods
https://git.kernel.org/netdev/net-next/c/85081acc6b11
- [net-next,2/3] net: stmmac: move probe/remove calling of init/exit
https://git.kernel.org/netdev/net-next/c/32da89a840e8
- [net-next,3/3] net: stmmac: rk: convert to init()/exit() methods
https://git.kernel.org/netdev/net-next/c/1a62894e040d
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2025-11-21 2:00 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-19 10:02 [PATCH net-next 0/3] net: stmmac: pass struct device to init/exit Russell King (Oracle)
2025-11-19 10:03 ` [PATCH net-next 1/3] net: stmmac: pass struct device to init()/exit() methods Russell King (Oracle)
2025-11-19 14:43 ` Chen-Yu Tsai
2025-11-19 15:03 ` Maxime Chevallier
2025-11-19 10:03 ` [PATCH net-next 2/3] net: stmmac: move probe/remove calling of init/exit Russell King (Oracle)
2025-11-19 15:04 ` Maxime Chevallier
2025-11-19 10:04 ` [PATCH net-next 3/3] net: stmmac: rk: convert to init()/exit() methods Russell King (Oracle)
2025-11-21 2:00 ` [PATCH net-next 0/3] net: stmmac: pass struct device to init/exit patchwork-bot+netdevbpf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).