diff options
| author | Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com> | 2026-03-27 13:31:13 +0300 |
|---|---|---|
| committer | Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com> | 2026-04-07 13:32:28 +0300 |
| commit | c3e2a8aef28c48a94c0cf0525ca96aa308bcf961 (patch) | |
| tree | e950c61bec7f514c0f3d3d3b916cf03034e74b5b | |
| parent | 3a27f40b457053e6112a63d14590e4a3ff553b44 (diff) | |
| download | linux-c3e2a8aef28c48a94c0cf0525ca96aa308bcf961.tar.xz | |
gpio: virtuser: 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-3-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-virtuser.c | 30 |
2 files changed, 20 insertions, 11 deletions
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index ab7ac3d62ea9..6dd2e08b9be6 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -2098,7 +2098,6 @@ config GPIO_VIRTUSER select DEBUG_FS select CONFIGFS_FS select IRQ_WORK - select DEV_SYNC_PROBE help Say Y here to enable the configurable, configfs-based virtual GPIO consumer testing driver. diff --git a/drivers/gpio/gpio-virtuser.c b/drivers/gpio/gpio-virtuser.c index 955b5efc283e..fe0eac920ced 100644 --- a/drivers/gpio/gpio-virtuser.c +++ b/drivers/gpio/gpio-virtuser.c @@ -36,8 +36,6 @@ #include <linux/string_helpers.h> #include <linux/types.h> -#include "dev-sync-probe.h" - #define GPIO_VIRTUSER_NAME_BUF_LEN 32 static DEFINE_IDA(gpio_virtuser_ida); @@ -978,7 +976,7 @@ static struct platform_driver gpio_virtuser_driver = { }; struct gpio_virtuser_device { - struct dev_sync_probe_data probe_data; + struct platform_device *pdev; struct config_group group; int id; @@ -1002,7 +1000,7 @@ gpio_virtuser_device_is_live(struct gpio_virtuser_device *dev) { lockdep_assert_held(&dev->lock); - return !!dev->probe_data.pdev; + return !!dev->pdev; } struct gpio_virtuser_lookup { @@ -1342,7 +1340,7 @@ gpio_virtuser_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)); @@ -1450,6 +1448,7 @@ static int gpio_virtuser_device_activate(struct gpio_virtuser_device *dev) { struct platform_device_info pdevinfo; + struct platform_device *pdev; struct fwnode_handle *swnode; int ret; @@ -1471,12 +1470,23 @@ gpio_virtuser_device_activate(struct gpio_virtuser_device *dev) if (ret) goto err_remove_swnode; - ret = dev_sync_probe_register(&dev->probe_data, &pdevinfo); - if (ret) + pdev = platform_device_register_full(&pdevinfo); + if (IS_ERR(pdev)) { + ret = PTR_ERR(pdev); goto err_remove_lookup_table; + } + + 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_lookup_table: gpio_virtuser_remove_lookup_table(dev); err_remove_swnode: @@ -1492,8 +1502,9 @@ gpio_virtuser_device_deactivate(struct gpio_virtuser_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_virtuser_remove_lookup_table(dev); fwnode_remove_software_node(swnode); } @@ -1723,7 +1734,6 @@ gpio_virtuser_config_make_device_group(struct config_group *group, &gpio_virtuser_device_config_group_type); mutex_init(&dev->lock); INIT_LIST_HEAD(&dev->lookup_list); - dev_sync_probe_init(&dev->probe_data); return &no_free_ptr(dev)->group; } |
