[PATCH v2 09/10] gpio: aggregator: cancel deferred probe for devices created via configfs

From: Koichiro Den
Date: Sun Feb 02 2025 - 22:14:34 EST


For aggregators initialized via configfs, write 1 to 'live' waits for
probe completion and returns an error if the probe fails, unlike the
legacy sysfs interface, which is asynchronous.

Since users control the liveness of the aggregator device and might be
editting configurations while 'live' is 0, deferred probing is both
unnatural and unsafe.

Cancel deferred probe for purely configfs-based aggregators when probe
fails.

Signed-off-by: Koichiro Den <koichiro.den@xxxxxxxxxxxxx>
---
drivers/gpio/gpio-aggregator.c | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c
index e101b78ad524..174078e02287 100644
--- a/drivers/gpio/gpio-aggregator.c
+++ b/drivers/gpio/gpio-aggregator.c
@@ -1313,7 +1313,6 @@ static struct attribute *gpio_aggregator_attrs[] = {
};
ATTRIBUTE_GROUPS(gpio_aggregator);

-
/*
* GPIO Aggregator platform device
*/
@@ -1342,8 +1341,22 @@ static int gpio_aggregator_probe(struct platform_device *pdev)

for (i = 0; i < n; i++) {
descs[i] = devm_gpiod_get_index(dev, NULL, i, GPIOD_ASIS);
- if (IS_ERR(descs[i]))
+ if (IS_ERR(descs[i])) {
+ /*
+ * Deferred probing is not suitable when the aggregator
+ * is created by userspace. They should just retry later
+ * whenever they like. For device creation via sysfs,
+ * error is propagated without overriding for backward
+ * compatibility. .prevent_deferred_probe is kept unset
+ * for other cases.
+ */
+ if (!init_via_sysfs && !dev_of_node(dev) &&
+ descs[i] == ERR_PTR(-EPROBE_DEFER)) {
+ pr_warn("Deferred probe canceled for creation by userspace.\n");
+ return -ENODEV;
+ }
return PTR_ERR(descs[i]);
+ }
}

features = (uintptr_t)device_get_match_data(dev);
--
2.45.2