]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: stmmac: platform: provide devm_stmmac_probe_config_dt()
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Fri, 23 Jun 2023 10:04:14 +0000 (12:04 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 Jan 2025 12:29:59 +0000 (13:29 +0100)
[ Upstream commit d74065427374da6659a2d7fad4ec55c8926d43c4 ]

Provide a devres variant of stmmac_probe_config_dt() that allows users to
skip calling stmmac_remove_config_dt() at driver detach.

Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Link: https://lore.kernel.org/r/20230623100417.93592-9-brgl@bgdev.pl
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Stable-dep-of: 2b6ffcd7873b ("net: stmmac: restructure the error path of stmmac_probe_config_dt()")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h

index 0046a4ee6e641f790808be475ea4079f8e61ba4d..5b4517b0ca0861f960e94f6e17352c0077ff9f79 100644 (file)
@@ -8,6 +8,7 @@
   Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
 *******************************************************************************/
 
+#include <linux/device.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/module.h>
@@ -628,6 +629,39 @@ error_pclk_get:
        return ret;
 }
 
+static void devm_stmmac_remove_config_dt(void *data)
+{
+       struct plat_stmmacenet_data *plat = data;
+
+       /* Platform data argument is unused */
+       stmmac_remove_config_dt(NULL, plat);
+}
+
+/**
+ * devm_stmmac_probe_config_dt
+ * @pdev: platform_device structure
+ * @mac: MAC address to use
+ * Description: Devres variant of stmmac_probe_config_dt(). Does not require
+ * the user to call stmmac_remove_config_dt() at driver detach.
+ */
+struct plat_stmmacenet_data *
+devm_stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)
+{
+       struct plat_stmmacenet_data *plat;
+       int ret;
+
+       plat = stmmac_probe_config_dt(pdev, mac);
+       if (IS_ERR(plat))
+               return plat;
+
+       ret = devm_add_action_or_reset(&pdev->dev,
+                                      devm_stmmac_remove_config_dt, plat);
+       if (ret)
+               return ERR_PTR(ret);
+
+       return plat;
+}
+
 /**
  * stmmac_remove_config_dt - undo the effects of stmmac_probe_config_dt()
  * @pdev: platform_device structure
@@ -650,12 +684,19 @@ stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)
        return ERR_PTR(-EINVAL);
 }
 
+struct plat_stmmacenet_data *
+devm_stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)
+{
+       return ERR_PTR(-EINVAL);
+}
+
 void stmmac_remove_config_dt(struct platform_device *pdev,
                             struct plat_stmmacenet_data *plat)
 {
 }
 #endif /* CONFIG_OF */
 EXPORT_SYMBOL_GPL(stmmac_probe_config_dt);
+EXPORT_SYMBOL_GPL(devm_stmmac_probe_config_dt);
 EXPORT_SYMBOL_GPL(stmmac_remove_config_dt);
 
 int stmmac_get_platform_resources(struct platform_device *pdev,
index 3fff3f59d73d8961aa5162280ed8751a2ea6eeb1..2102c6d41464c9e1770ae294756df09929edff96 100644 (file)
@@ -13,6 +13,8 @@
 
 struct plat_stmmacenet_data *
 stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac);
+struct plat_stmmacenet_data *
+devm_stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac);
 void stmmac_remove_config_dt(struct platform_device *pdev,
                             struct plat_stmmacenet_data *plat);