Skip to content

Commit 7fb3287

Browse files
author
Bartosz Golaszewski
committed
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>
1 parent 15cbd66 commit 7fb3287

2 files changed

Lines changed: 29 additions & 21 deletions

File tree

drivers/gpio/Kconfig

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2062,7 +2062,6 @@ config GPIO_SIM
20622062
tristate "GPIO Simulator Module"
20632063
select IRQ_SIM
20642064
select CONFIGFS_FS
2065-
select DEV_SYNC_PROBE
20662065
help
20672066
This enables the GPIO simulator - a configfs-based GPIO testing
20682067
driver.

drivers/gpio/gpio-sim.c

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,6 @@
3636
#include <linux/sysfs.h>
3737
#include <linux/types.h>
3838

39-
#include "dev-sync-probe.h"
40-
4139
#define GPIO_SIM_NGPIO_MAX 1024
4240
#define GPIO_SIM_PROP_MAX 5 /* Max 4 properties + sentinel. */
4341
#define GPIO_SIM_HOG_PROP_MAX 5
@@ -546,7 +544,7 @@ static struct platform_driver gpio_sim_driver = {
546544
};
547545

548546
struct gpio_sim_device {
549-
struct dev_sync_probe_data probe_data;
547+
struct platform_device *pdev;
550548
struct config_group group;
551549

552550
int id;
@@ -673,7 +671,7 @@ static bool gpio_sim_device_is_live(struct gpio_sim_device *dev)
673671
{
674672
lockdep_assert_held(&dev->lock);
675673

676-
return !!dev->probe_data.pdev;
674+
return !!dev->pdev;
677675
}
678676

679677
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,
695693

696694
guard(mutex)(&dev->lock);
697695

698-
pdev = dev->probe_data.pdev;
696+
pdev = dev->pdev;
699697
if (pdev)
700698
return sprintf(page, "%s\n", dev_name(&pdev->dev));
701699

@@ -900,6 +898,7 @@ static bool gpio_sim_bank_labels_non_unique(struct gpio_sim_device *dev)
900898
static int gpio_sim_device_activate(struct gpio_sim_device *dev)
901899
{
902900
struct platform_device_info pdevinfo;
901+
struct platform_device *pdev;
903902
struct fwnode_handle *swnode;
904903
struct gpio_sim_bank *bank;
905904
int ret;
@@ -927,28 +926,39 @@ static int gpio_sim_device_activate(struct gpio_sim_device *dev)
927926
bank->swnode = gpio_sim_make_bank_swnode(bank, swnode);
928927
if (IS_ERR(bank->swnode)) {
929928
ret = PTR_ERR(bank->swnode);
930-
gpio_sim_remove_swnode_recursive(swnode);
931-
return ret;
929+
goto err_remove_swnode;
932930
}
933931

934932
ret = gpio_sim_bank_add_hogs(bank);
935-
if (ret) {
936-
gpio_sim_remove_swnode_recursive(swnode);
937-
return ret;
938-
}
933+
if (ret)
934+
goto err_remove_swnode;
939935
}
940936

941937
pdevinfo.name = "gpio-sim";
942938
pdevinfo.fwnode = swnode;
943939
pdevinfo.id = dev->id;
944940

945-
ret = dev_sync_probe_register(&dev->probe_data, &pdevinfo);
946-
if (ret) {
947-
gpio_sim_remove_swnode_recursive(swnode);
948-
return ret;
941+
pdev = platform_device_register_full(&pdevinfo);
942+
if (IS_ERR(pdev)) {
943+
ret = PTR_ERR(pdev);
944+
goto err_remove_swnode;
945+
}
946+
947+
wait_for_device_probe();
948+
if (!device_is_bound(&pdev->dev)) {
949+
ret = -ENXIO;
950+
goto err_unregister_pdev;
949951
}
950952

953+
dev->pdev = pdev;
951954
return 0;
955+
956+
err_unregister_pdev:
957+
platform_device_unregister(pdev);
958+
err_remove_swnode:
959+
gpio_sim_remove_swnode_recursive(swnode);
960+
961+
return ret;
952962
}
953963

954964
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)
957967

958968
lockdep_assert_held(&dev->lock);
959969

960-
swnode = dev_fwnode(&dev->probe_data.pdev->dev);
961-
dev_sync_probe_unregister(&dev->probe_data);
970+
swnode = dev_fwnode(&dev->pdev->dev);
971+
platform_device_unregister(dev->pdev);
972+
dev->pdev = NULL;
962973
gpio_sim_remove_swnode_recursive(swnode);
963974
}
964975

@@ -1060,7 +1071,7 @@ static ssize_t gpio_sim_bank_config_chip_name_show(struct config_item *item,
10601071
guard(mutex)(&dev->lock);
10611072

10621073
if (gpio_sim_device_is_live(dev))
1063-
return device_for_each_child(&dev->probe_data.pdev->dev, &ctx,
1074+
return device_for_each_child(&dev->pdev->dev, &ctx,
10641075
gpio_sim_emit_chip_name);
10651076

10661077
return sprintf(page, "none\n");
@@ -1571,8 +1582,6 @@ gpio_sim_config_make_device_group(struct config_group *group, const char *name)
15711582
mutex_init(&dev->lock);
15721583
INIT_LIST_HEAD(&dev->bank_list);
15731584

1574-
dev_sync_probe_init(&dev->probe_data);
1575-
15761585
return &no_free_ptr(dev)->group;
15771586
}
15781587

0 commit comments

Comments
 (0)