diff options
| author | Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com> | 2026-03-27 13:31:11 +0300 |
|---|---|---|
| committer | Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com> | 2026-04-07 13:32:27 +0300 |
| commit | 7fb3287946f937a32adad35c9bec4bbc71e25bb8 (patch) | |
| tree | 0c15718dd7b9a810cbe9b1218a91cc2342497f4a | |
| parent | 15cbd66b69a9ecdc5c3638aa400ca9b872b84509 (diff) | |
| download | linux-7fb3287946f937a32adad35c9bec4bbc71e25bb8.tar.xz | |
gpio: sim: stop using dev-sync-probe
dev-err-probe is an overengineered solution to a simple problem. Use a
combination of wait_for_probe() and device_is_bound() to synchronously
wait for the platform device to probe.
Reviewed-by: Linus Walleij <linusw@kernel.org>
Link: https://patch.msgid.link/20260327-gpio-kill-dev-sync-probe-v1-1-efac254f1a1d@oss.qualcomm.com
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
| -rw-r--r-- | drivers/gpio/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/gpio/gpio-sim.c | 49 |
2 files changed, 29 insertions, 21 deletions
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index 5c62a0063351..0a16aa7a3a96 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -2062,7 +2062,6 @@ config GPIO_SIM tristate "GPIO Simulator Module" select IRQ_SIM select CONFIGFS_FS - select DEV_SYNC_PROBE help This enables the GPIO simulator - a configfs-based GPIO testing driver. diff --git a/drivers/gpio/gpio-sim.c b/drivers/gpio/gpio-sim.c index f32674230237..e19701c2ed67 100644 --- a/drivers/gpio/gpio-sim.c +++ b/drivers/gpio/gpio-sim.c @@ -36,8 +36,6 @@ #include <linux/sysfs.h> #include <linux/types.h> -#include "dev-sync-probe.h" - #define GPIO_SIM_NGPIO_MAX 1024 #define GPIO_SIM_PROP_MAX 5 /* Max 4 properties + sentinel. */ #define GPIO_SIM_HOG_PROP_MAX 5 @@ -546,7 +544,7 @@ static struct platform_driver gpio_sim_driver = { }; struct gpio_sim_device { - struct dev_sync_probe_data probe_data; + struct platform_device *pdev; struct config_group group; int id; @@ -673,7 +671,7 @@ static bool gpio_sim_device_is_live(struct gpio_sim_device *dev) { lockdep_assert_held(&dev->lock); - return !!dev->probe_data.pdev; + return !!dev->pdev; } static char *gpio_sim_strdup_trimmed(const char *str, size_t count) @@ -695,7 +693,7 @@ static ssize_t gpio_sim_device_config_dev_name_show(struct config_item *item, guard(mutex)(&dev->lock); - pdev = dev->probe_data.pdev; + pdev = dev->pdev; if (pdev) return sprintf(page, "%s\n", dev_name(&pdev->dev)); @@ -900,6 +898,7 @@ static bool gpio_sim_bank_labels_non_unique(struct gpio_sim_device *dev) static int gpio_sim_device_activate(struct gpio_sim_device *dev) { struct platform_device_info pdevinfo; + struct platform_device *pdev; struct fwnode_handle *swnode; struct gpio_sim_bank *bank; int ret; @@ -927,28 +926,39 @@ static int gpio_sim_device_activate(struct gpio_sim_device *dev) bank->swnode = gpio_sim_make_bank_swnode(bank, swnode); if (IS_ERR(bank->swnode)) { ret = PTR_ERR(bank->swnode); - gpio_sim_remove_swnode_recursive(swnode); - return ret; + goto err_remove_swnode; } ret = gpio_sim_bank_add_hogs(bank); - if (ret) { - gpio_sim_remove_swnode_recursive(swnode); - return ret; - } + if (ret) + goto err_remove_swnode; } pdevinfo.name = "gpio-sim"; pdevinfo.fwnode = swnode; pdevinfo.id = dev->id; - ret = dev_sync_probe_register(&dev->probe_data, &pdevinfo); - if (ret) { - gpio_sim_remove_swnode_recursive(swnode); - return ret; + pdev = platform_device_register_full(&pdevinfo); + if (IS_ERR(pdev)) { + ret = PTR_ERR(pdev); + goto err_remove_swnode; + } + + wait_for_device_probe(); + if (!device_is_bound(&pdev->dev)) { + ret = -ENXIO; + goto err_unregister_pdev; } + dev->pdev = pdev; return 0; + +err_unregister_pdev: + platform_device_unregister(pdev); +err_remove_swnode: + gpio_sim_remove_swnode_recursive(swnode); + + return ret; } static void gpio_sim_device_deactivate(struct gpio_sim_device *dev) @@ -957,8 +967,9 @@ static void gpio_sim_device_deactivate(struct gpio_sim_device *dev) lockdep_assert_held(&dev->lock); - swnode = dev_fwnode(&dev->probe_data.pdev->dev); - dev_sync_probe_unregister(&dev->probe_data); + swnode = dev_fwnode(&dev->pdev->dev); + platform_device_unregister(dev->pdev); + dev->pdev = NULL; gpio_sim_remove_swnode_recursive(swnode); } @@ -1060,7 +1071,7 @@ static ssize_t gpio_sim_bank_config_chip_name_show(struct config_item *item, guard(mutex)(&dev->lock); if (gpio_sim_device_is_live(dev)) - return device_for_each_child(&dev->probe_data.pdev->dev, &ctx, + return device_for_each_child(&dev->pdev->dev, &ctx, gpio_sim_emit_chip_name); return sprintf(page, "none\n"); @@ -1571,8 +1582,6 @@ gpio_sim_config_make_device_group(struct config_group *group, const char *name) mutex_init(&dev->lock); INIT_LIST_HEAD(&dev->bank_list); - dev_sync_probe_init(&dev->probe_data); - return &no_free_ptr(dev)->group; } |
