* [PATCH 0/6] gpiolib: unify gpio-hog code
@ 2026-03-05 9:51 Bartosz Golaszewski
2026-03-05 9:51 ` [PATCH 1/6] gpio: of: clear OF_POPULATED on hog nodes in remove path Bartosz Golaszewski
` (6 more replies)
0 siblings, 7 replies; 18+ messages in thread
From: Bartosz Golaszewski @ 2026-03-05 9:51 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Geert Uytterhoeven,
Frank Rowand, Mika Westerberg, Andy Shevchenko, Aaro Koskinen,
Janusz Krzysztofik, Tony Lindgren, Russell King, Jonathan Corbet,
Shuah Khan
Cc: linux-gpio, linux-kernel, linux-acpi, linux-arm-kernel,
linux-omap, linux-doc, brgl, Bartosz Golaszewski, stable
GPIO hogs are handled separately in three places: for OF, ACPI and
machine lookup. In addition hogs cannot be set up using software nodes.
A lot of that code is actually redundant and - except for some special
handling of OF nodes - can be unified in one place.
This series moves hogging into GPIO core and bases it on fwnode API
(with a single helper from OF to translate devicetree properties into
lookup flags), converts the two remaining users of machine hogs to using
software node approach and removes machine hog support entirely. In
addition, there's a patch extending the configurability of gpio-sim now
that it uses software nodes for hogs.
For merging: I think this should go through the GPIO tree with an Ack
from OMAP1 maintainers.
Even with the new feature for gpio-sim, this series still removes twice
the number of lines, it adds.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
Bartosz Golaszewski (6):
gpio: of: clear OF_POPULATED on hog nodes in remove path
gpio: move hogs into GPIO core
gpio: sim: use fwnode-based GPIO hogs
ARM: omap1: ams-delta: convert GPIO hogs to using firmware nodes
gpio: remove machine hogs
gpio: sim: allow to define the active-low setting of a simulated hog
Documentation/driver-api/gpio/board.rst | 16 ---
arch/arm/mach-omap1/board-ams-delta.c | 32 ++++-
drivers/gpio/gpio-sim.c | 200 +++++++++++++++-----------------
drivers/gpio/gpiolib-acpi-core.c | 70 -----------
drivers/gpio/gpiolib-of.c | 148 +++--------------------
drivers/gpio/gpiolib-of.h | 9 ++
drivers/gpio/gpiolib.c | 139 +++++++++++++---------
drivers/gpio/gpiolib.h | 3 +
include/linux/gpio/machine.h | 33 ------
9 files changed, 233 insertions(+), 417 deletions(-)
---
base-commit: c025f6cf4209e1542ec2afebe49f42bbaf1a5c7b
change-id: 20260224-gpio-hog-fwnode-b46a53196253
Best regards,
--
Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH 1/6] gpio: of: clear OF_POPULATED on hog nodes in remove path
2026-03-05 9:51 [PATCH 0/6] gpiolib: unify gpio-hog code Bartosz Golaszewski
@ 2026-03-05 9:51 ` Bartosz Golaszewski
2026-03-05 12:58 ` Linus Walleij
2026-03-05 9:51 ` [PATCH 2/6] gpio: move hogs into GPIO core Bartosz Golaszewski
` (5 subsequent siblings)
6 siblings, 1 reply; 18+ messages in thread
From: Bartosz Golaszewski @ 2026-03-05 9:51 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Geert Uytterhoeven,
Frank Rowand, Mika Westerberg, Andy Shevchenko, Aaro Koskinen,
Janusz Krzysztofik, Tony Lindgren, Russell King, Jonathan Corbet,
Shuah Khan
Cc: linux-gpio, linux-kernel, linux-acpi, linux-arm-kernel,
linux-omap, linux-doc, brgl, Bartosz Golaszewski, stable
The previously set OF_POPULATED flag should be cleared on the hog nodes
when removing the chip.
Cc: stable@vger.kernel.org
Fixes: 63636d956c455 ("gpio: of: Add DT overlay support for GPIO hogs")
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
drivers/gpio/gpiolib-of.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
index ef1ac68b94b78f09e768cc740e893632b8817505..08b7b662512b825086cd70440be98b59befc3ffe 100644
--- a/drivers/gpio/gpiolib-of.c
+++ b/drivers/gpio/gpiolib-of.c
@@ -1210,7 +1210,14 @@ int of_gpiochip_add(struct gpio_chip *chip)
void of_gpiochip_remove(struct gpio_chip *chip)
{
- of_node_put(dev_of_node(&chip->gpiodev->dev));
+ struct device_node *np = dev_of_node(&chip->gpiodev->dev);
+
+ for_each_child_of_node_scoped(np, child) {
+ if (of_property_present(child, "gpio-hog"))
+ of_node_clear_flag(child, OF_POPULATED);
+ }
+
+ of_node_put(np);
}
bool of_gpiochip_instance_match(struct gpio_chip *gc, unsigned int index)
--
2.47.3
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 2/6] gpio: move hogs into GPIO core
2026-03-05 9:51 [PATCH 0/6] gpiolib: unify gpio-hog code Bartosz Golaszewski
2026-03-05 9:51 ` [PATCH 1/6] gpio: of: clear OF_POPULATED on hog nodes in remove path Bartosz Golaszewski
@ 2026-03-05 9:51 ` Bartosz Golaszewski
2026-03-05 12:59 ` Linus Walleij
` (3 more replies)
2026-03-05 9:51 ` [PATCH 3/6] gpio: sim: use fwnode-based GPIO hogs Bartosz Golaszewski
` (4 subsequent siblings)
6 siblings, 4 replies; 18+ messages in thread
From: Bartosz Golaszewski @ 2026-03-05 9:51 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Geert Uytterhoeven,
Frank Rowand, Mika Westerberg, Andy Shevchenko, Aaro Koskinen,
Janusz Krzysztofik, Tony Lindgren, Russell King, Jonathan Corbet,
Shuah Khan
Cc: linux-gpio, linux-kernel, linux-acpi, linux-arm-kernel,
linux-omap, linux-doc, brgl, Bartosz Golaszewski
Refactor line hogging code by moving the parts duplicated in
gpiolib-acpi-core.c and gpiolib-of.c into gpiolib.c, leaving just the
OF-specific bits in the latter.
This makes fwnode the primary API for setting up hogs and allows to use
software nodes in addition to ACPI and OF nodes.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
drivers/gpio/gpiolib-acpi-core.c | 70 --------------------
drivers/gpio/gpiolib-of.c | 139 +++------------------------------------
drivers/gpio/gpiolib-of.h | 9 +++
drivers/gpio/gpiolib.c | 100 +++++++++++++++++++++++++++-
drivers/gpio/gpiolib.h | 3 +
5 files changed, 120 insertions(+), 201 deletions(-)
diff --git a/drivers/gpio/gpiolib-acpi-core.c b/drivers/gpio/gpiolib-acpi-core.c
index ced6375d1badf9e113e708ce4bc9f83071f9acca..09f860200a059b1d17c652b9aa66a49abea3cb4f 100644
--- a/drivers/gpio/gpiolib-acpi-core.c
+++ b/drivers/gpio/gpiolib-acpi-core.c
@@ -1220,75 +1220,6 @@ static void acpi_gpiochip_free_regions(struct acpi_gpio_chip *achip)
}
}
-static struct gpio_desc *
-acpi_gpiochip_parse_own_gpio(struct acpi_gpio_chip *achip,
- struct fwnode_handle *fwnode,
- const char **name,
- unsigned long *lflags,
- enum gpiod_flags *dflags)
-{
- struct gpio_chip *chip = achip->chip;
- struct gpio_desc *desc;
- u32 gpios[2];
- int ret;
-
- *lflags = GPIO_LOOKUP_FLAGS_DEFAULT;
- *dflags = GPIOD_ASIS;
- *name = NULL;
-
- ret = fwnode_property_read_u32_array(fwnode, "gpios", gpios,
- ARRAY_SIZE(gpios));
- if (ret < 0)
- return ERR_PTR(ret);
-
- desc = gpiochip_get_desc(chip, gpios[0]);
- if (IS_ERR(desc))
- return desc;
-
- if (gpios[1])
- *lflags |= GPIO_ACTIVE_LOW;
-
- if (fwnode_property_present(fwnode, "input"))
- *dflags |= GPIOD_IN;
- else if (fwnode_property_present(fwnode, "output-low"))
- *dflags |= GPIOD_OUT_LOW;
- else if (fwnode_property_present(fwnode, "output-high"))
- *dflags |= GPIOD_OUT_HIGH;
- else
- return ERR_PTR(-EINVAL);
-
- fwnode_property_read_string(fwnode, "line-name", name);
-
- return desc;
-}
-
-static void acpi_gpiochip_scan_gpios(struct acpi_gpio_chip *achip)
-{
- struct gpio_chip *chip = achip->chip;
-
- device_for_each_child_node_scoped(chip->parent, fwnode) {
- unsigned long lflags;
- enum gpiod_flags dflags;
- struct gpio_desc *desc;
- const char *name;
- int ret;
-
- if (!fwnode_property_present(fwnode, "gpio-hog"))
- continue;
-
- desc = acpi_gpiochip_parse_own_gpio(achip, fwnode, &name,
- &lflags, &dflags);
- if (IS_ERR(desc))
- continue;
-
- ret = gpiod_hog(desc, name, lflags, dflags);
- if (ret) {
- dev_err(chip->parent, "Failed to hog GPIO\n");
- return;
- }
- }
-}
-
void acpi_gpiochip_add(struct gpio_chip *chip)
{
struct acpi_gpio_chip *acpi_gpio;
@@ -1321,7 +1252,6 @@ void acpi_gpiochip_add(struct gpio_chip *chip)
}
acpi_gpiochip_request_regions(acpi_gpio);
- acpi_gpiochip_scan_gpios(acpi_gpio);
acpi_dev_clear_dependencies(adev);
}
diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
index 08b7b662512b825086cd70440be98b59befc3ffe..4554d915d57d95aadae0e4d9ea30c3d9c2782984 100644
--- a/drivers/gpio/gpiolib-of.c
+++ b/drivers/gpio/gpiolib-of.c
@@ -735,139 +735,19 @@ struct gpio_desc *of_find_gpio(struct device_node *np, const char *con_id,
return desc;
}
-/**
- * of_parse_own_gpio() - Get a GPIO hog descriptor, names and flags for GPIO API
- * @np: device node to get GPIO from
- * @chip: GPIO chip whose hog is parsed
- * @idx: Index of the GPIO to parse
- * @name: GPIO line name
- * @lflags: bitmask of gpio_lookup_flags GPIO_* values - returned from
- * of_find_gpio() or of_parse_own_gpio()
- * @dflags: gpiod_flags - optional GPIO initialization flags
- *
- * Returns:
- * GPIO descriptor to use with Linux GPIO API, or one of the errno
- * value on the error condition.
- */
-static struct gpio_desc *of_parse_own_gpio(struct device_node *np,
- struct gpio_chip *chip,
- unsigned int idx, const char **name,
- unsigned long *lflags,
- enum gpiod_flags *dflags)
+int of_gpiochip_get_lflags(struct gpio_chip *chip,
+ struct of_phandle_args *gpiospec,
+ unsigned long *lflags)
{
- struct device_node *chip_np;
enum of_gpio_flags xlate_flags;
- struct of_phandle_args gpiospec;
struct gpio_desc *desc;
- unsigned int i;
- u32 tmp;
- int ret;
-
- chip_np = dev_of_node(&chip->gpiodev->dev);
- if (!chip_np)
- return ERR_PTR(-EINVAL);
-
- xlate_flags = 0;
- *lflags = GPIO_LOOKUP_FLAGS_DEFAULT;
- *dflags = GPIOD_ASIS;
-
- ret = of_property_read_u32(chip_np, "#gpio-cells", &tmp);
- if (ret)
- return ERR_PTR(ret);
-
- gpiospec.np = chip_np;
- gpiospec.args_count = tmp;
- for (i = 0; i < tmp; i++) {
- ret = of_property_read_u32_index(np, "gpios", idx * tmp + i,
- &gpiospec.args[i]);
- if (ret)
- return ERR_PTR(ret);
- }
-
- desc = of_xlate_and_get_gpiod_flags(chip, &gpiospec, &xlate_flags);
+ desc = of_xlate_and_get_gpiod_flags(chip, gpiospec, &xlate_flags);
if (IS_ERR(desc))
- return desc;
+ return PTR_ERR(desc);
*lflags = of_convert_gpio_flags(xlate_flags);
- if (of_property_read_bool(np, "input"))
- *dflags |= GPIOD_IN;
- else if (of_property_read_bool(np, "output-low"))
- *dflags |= GPIOD_OUT_LOW;
- else if (of_property_read_bool(np, "output-high"))
- *dflags |= GPIOD_OUT_HIGH;
- else {
- pr_warn("GPIO line %d (%pOFn): no hogging state specified, bailing out\n",
- desc_to_gpio(desc), np);
- return ERR_PTR(-EINVAL);
- }
-
- if (name && of_property_read_string(np, "line-name", name))
- *name = np->name;
-
- return desc;
-}
-
-/**
- * of_gpiochip_add_hog - Add all hogs in a hog device node
- * @chip: gpio chip to act on
- * @hog: device node describing the hogs
- *
- * Returns:
- * 0 on success, or negative errno on failure.
- */
-static int of_gpiochip_add_hog(struct gpio_chip *chip, struct device_node *hog)
-{
- enum gpiod_flags dflags;
- struct gpio_desc *desc;
- unsigned long lflags;
- const char *name;
- unsigned int i;
- int ret;
-
- for (i = 0;; i++) {
- desc = of_parse_own_gpio(hog, chip, i, &name, &lflags, &dflags);
- if (IS_ERR(desc))
- break;
-
- ret = gpiod_hog(desc, name, lflags, dflags);
- if (ret < 0)
- return ret;
-
-#ifdef CONFIG_OF_DYNAMIC
- WRITE_ONCE(desc->hog, hog);
-#endif
- }
-
- return 0;
-}
-
-/**
- * of_gpiochip_scan_gpios - Scan gpio-controller for gpio definitions
- * @chip: gpio chip to act on
- *
- * This is only used by of_gpiochip_add to request/set GPIO initial
- * configuration.
- *
- * Returns:
- * 0 on success, or negative errno on failure.
- */
-static int of_gpiochip_scan_gpios(struct gpio_chip *chip)
-{
- int ret;
-
- for_each_available_child_of_node_scoped(dev_of_node(&chip->gpiodev->dev), np) {
- if (!of_property_read_bool(np, "gpio-hog"))
- continue;
-
- ret = of_gpiochip_add_hog(chip, np);
- if (ret < 0)
- return ret;
-
- of_node_set_flag(np, OF_POPULATED);
- }
-
return 0;
}
@@ -922,7 +802,7 @@ static int of_gpio_notify(struct notifier_block *nb, unsigned long action,
if (!gdev)
return NOTIFY_DONE; /* not for us */
- ret = of_gpiochip_add_hog(gpio_device_get_chip(gdev), rd->dn);
+ ret = gpiochip_add_hog(gpio_device_get_chip(gdev), of_fwnode_handle(rd->dn));
if (ret < 0) {
pr_err("%s: failed to add hogs for %pOF\n", __func__,
rd->dn);
@@ -1201,9 +1081,10 @@ int of_gpiochip_add(struct gpio_chip *chip)
of_node_get(np);
- ret = of_gpiochip_scan_gpios(chip);
- if (ret)
- of_node_put(np);
+ for_each_available_child_of_node_scoped(np, child) {
+ if (of_property_read_bool(child, "gpio-hog"))
+ of_node_set_flag(child, OF_POPULATED);
+ }
return ret;
}
diff --git a/drivers/gpio/gpiolib-of.h b/drivers/gpio/gpiolib-of.h
index 2257f7a498a10d69980f0c8afd48d5b661632d87..f864597baaede1e601fc999514c129750c2a8317 100644
--- a/drivers/gpio/gpiolib-of.h
+++ b/drivers/gpio/gpiolib-of.h
@@ -24,6 +24,9 @@ int of_gpiochip_add(struct gpio_chip *gc);
void of_gpiochip_remove(struct gpio_chip *gc);
bool of_gpiochip_instance_match(struct gpio_chip *gc, unsigned int index);
int of_gpio_count(const struct fwnode_handle *fwnode, const char *con_id);
+int of_gpiochip_get_lflags(struct gpio_chip *chip,
+ struct of_phandle_args *gpiospec,
+ unsigned long *lflags);
#else
static inline struct gpio_desc *of_find_gpio(struct device_node *np,
const char *con_id,
@@ -44,6 +47,12 @@ static inline int of_gpio_count(const struct fwnode_handle *fwnode,
{
return 0;
}
+static inline int of_gpiochip_get_lflags(struct gpio_chip *chip,
+ struct of_phandle_args *gpiospec,
+ unsigned long *lflags)
+{
+ return -ENOENT;
+}
#endif /* CONFIG_OF_GPIO */
extern struct notifier_block gpio_of_notifier;
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 581d00c128b608c30f45c12e968c15628e205870..be2e6ed0e744c23939491717a060d3a8456c842b 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -948,7 +948,7 @@ static void gpiochip_machine_hog(struct gpio_chip *gc, struct gpiod_hog *hog)
__func__, gc->label, hog->chip_hwnum, rv);
}
-static void machine_gpiochip_add(struct gpio_chip *gc)
+static void gpiochip_machine_hog_lines(struct gpio_chip *gc)
{
struct gpiod_hog *hog;
@@ -960,6 +960,100 @@ static void machine_gpiochip_add(struct gpio_chip *gc)
}
}
+int gpiochip_add_hog(struct gpio_chip *gc, struct fwnode_handle *fwnode)
+{
+ struct fwnode_handle *gc_node = dev_fwnode(&gc->gpiodev->dev);
+ struct of_phandle_args gpiospec;
+ enum gpiod_flags dflags;
+ struct gpio_desc *desc;
+ unsigned long lflags;
+ const char *name;
+ int ret, argc;
+ u32 gpios[3]; /* We support up to three-cell bindings. */
+ u32 cells;
+
+ lflags = GPIO_LOOKUP_FLAGS_DEFAULT;
+ dflags = GPIOD_ASIS;
+ name = NULL;
+
+ argc = fwnode_property_count_u32(fwnode, "gpios");
+ if (argc < 0)
+ return ret;
+ if (argc > 3)
+ return -EINVAL;
+
+ ret = fwnode_property_read_u32_array(fwnode, "gpios", gpios, argc);
+ if (ret < 0)
+ return ret;
+
+ if (is_of_node(fwnode)) {
+ /*
+ * OF-nodes need some additional special handling for
+ * translating of devicetree flags.
+ */
+ ret = fwnode_property_read_u32(gc_node, "#gpio-cells", &cells);
+ if (ret)
+ return ret;
+ if (cells && argc != cells)
+ return -EINVAL;
+
+ memset(&gpiospec, 0, sizeof(gpiospec));
+ gpiospec.np = to_of_node(fwnode);
+ gpiospec.args_count = argc;
+ memcpy(&gpiospec.args, gpios, argc * sizeof(u32));
+
+ ret = of_gpiochip_get_lflags(gc, &gpiospec, &lflags);
+ if (ret)
+ return ret;
+ } else {
+ /*
+ * GPIO_ACTIVE_LOW is currently the only lookup flag
+ * supported for non-OF firmware nodes.
+ */
+ if (gpios[1])
+ lflags |= GPIO_ACTIVE_LOW;
+ }
+
+ if (fwnode_property_present(fwnode, "input"))
+ dflags |= GPIOD_IN;
+ else if (fwnode_property_present(fwnode, "output-low"))
+ dflags |= GPIOD_OUT_LOW;
+ else if (fwnode_property_present(fwnode, "output-high"))
+ dflags |= GPIOD_OUT_HIGH;
+ else
+ return -EINVAL;
+
+ fwnode_property_read_string(fwnode, "line-name", &name);
+
+ desc = gpiochip_get_desc(gc, gpios[0]);
+ if (IS_ERR(desc))
+ return PTR_ERR(desc);
+
+ ret = gpiod_hog(desc, name, lflags, dflags);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
+static int gpiochip_hog_lines(struct gpio_chip *gc)
+{
+ int ret;
+
+ device_for_each_child_node_scoped(&gc->gpiodev->dev, fwnode) {
+ if (!fwnode_property_present(fwnode, "gpio-hog"))
+ continue;
+
+ ret = gpiochip_add_hog(gc, fwnode);
+ if (ret)
+ return ret;
+ }
+
+ gpiochip_machine_hog_lines(gc);
+
+ return 0;
+}
+
static void gpiochip_setup_devs(void)
{
struct gpio_device *gdev;
@@ -1209,7 +1303,9 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data,
acpi_gpiochip_add(gc);
- machine_gpiochip_add(gc);
+ ret = gpiochip_hog_lines(gc);
+ if (ret)
+ goto err_remove_of_chip;
ret = gpiochip_irqchip_init_valid_mask(gc);
if (ret)
diff --git a/drivers/gpio/gpiolib.h b/drivers/gpio/gpiolib.h
index 8d1a762f9d11bfc29c9102be02d7b640aa7daad3..dc4cb61a93187659d943f4ce3622bc1755e9fd42 100644
--- a/drivers/gpio/gpiolib.h
+++ b/drivers/gpio/gpiolib.h
@@ -23,6 +23,8 @@
#define GPIOCHIP_NAME "gpiochip"
+struct fwnode_handle;
+
/**
* struct gpio_device - internal state container for GPIO devices
* @dev: the GPIO device struct
@@ -274,6 +276,7 @@ int gpiod_configure_flags(struct gpio_desc *desc, const char *con_id,
int gpio_set_debounce_timeout(struct gpio_desc *desc, unsigned int debounce);
int gpiod_hog(struct gpio_desc *desc, const char *name,
unsigned long lflags, enum gpiod_flags dflags);
+int gpiochip_add_hog(struct gpio_chip *gc, struct fwnode_handle *fwnode);
int gpiochip_get_ngpios(struct gpio_chip *gc, struct device *dev);
struct gpio_desc *gpiochip_get_desc(struct gpio_chip *gc, unsigned int hwnum);
const char *gpiod_get_label(struct gpio_desc *desc);
--
2.47.3
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 3/6] gpio: sim: use fwnode-based GPIO hogs
2026-03-05 9:51 [PATCH 0/6] gpiolib: unify gpio-hog code Bartosz Golaszewski
2026-03-05 9:51 ` [PATCH 1/6] gpio: of: clear OF_POPULATED on hog nodes in remove path Bartosz Golaszewski
2026-03-05 9:51 ` [PATCH 2/6] gpio: move hogs into GPIO core Bartosz Golaszewski
@ 2026-03-05 9:51 ` Bartosz Golaszewski
2026-03-05 12:59 ` Linus Walleij
2026-03-05 9:51 ` [PATCH 4/6] ARM: omap1: ams-delta: convert GPIO hogs to using firmware nodes Bartosz Golaszewski
` (3 subsequent siblings)
6 siblings, 1 reply; 18+ messages in thread
From: Bartosz Golaszewski @ 2026-03-05 9:51 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Geert Uytterhoeven,
Frank Rowand, Mika Westerberg, Andy Shevchenko, Aaro Koskinen,
Janusz Krzysztofik, Tony Lindgren, Russell King, Jonathan Corbet,
Shuah Khan
Cc: linux-gpio, linux-kernel, linux-acpi, linux-arm-kernel,
linux-omap, linux-doc, brgl, Bartosz Golaszewski
Convert gpio-sim to using software nodes for setting up simulated hogs
instead of legacy machine hogs.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
drivers/gpio/gpio-sim.c | 162 +++++++++++++++++-------------------------------
1 file changed, 56 insertions(+), 106 deletions(-)
diff --git a/drivers/gpio/gpio-sim.c b/drivers/gpio/gpio-sim.c
index 13b87c8e6d0caf62ce311dad409a9b4d3f091caa..51bcbdd91b4b027b7a340971a11cce5280ca1295 100644
--- a/drivers/gpio/gpio-sim.c
+++ b/drivers/gpio/gpio-sim.c
@@ -40,6 +40,7 @@
#define GPIO_SIM_NGPIO_MAX 1024
#define GPIO_SIM_PROP_MAX 5 /* Max 4 properties + sentinel. */
+#define GPIO_SIM_HOG_PROP_MAX 5
#define GPIO_SIM_NUM_ATTRS 3 /* value, pull and sentinel */
static DEFINE_IDA(gpio_sim_ida);
@@ -561,8 +562,6 @@ struct gpio_sim_device {
*/
struct mutex lock;
- struct gpiod_hog *hogs;
-
struct list_head bank_list;
};
@@ -774,102 +773,6 @@ static void gpio_sim_set_reserved_ranges(struct gpio_sim_bank *bank,
}
}
-static void gpio_sim_remove_hogs(struct gpio_sim_device *dev)
-{
- struct gpiod_hog *hog;
-
- if (!dev->hogs)
- return;
-
- gpiod_remove_hogs(dev->hogs);
-
- for (hog = dev->hogs; hog->chip_label; hog++) {
- kfree(hog->chip_label);
- kfree(hog->line_name);
- }
-
- kfree(dev->hogs);
- dev->hogs = NULL;
-}
-
-static int gpio_sim_add_hogs(struct gpio_sim_device *dev)
-{
- unsigned int num_hogs = 0, idx = 0;
- struct gpio_sim_bank *bank;
- struct gpio_sim_line *line;
- struct gpiod_hog *hog;
-
- list_for_each_entry(bank, &dev->bank_list, siblings) {
- list_for_each_entry(line, &bank->line_list, siblings) {
- if (line->offset >= bank->num_lines)
- continue;
-
- if (line->hog)
- num_hogs++;
- }
- }
-
- if (!num_hogs)
- return 0;
-
- /* Allocate one more for the sentinel. */
- dev->hogs = kzalloc_objs(*dev->hogs, num_hogs + 1);
- if (!dev->hogs)
- return -ENOMEM;
-
- list_for_each_entry(bank, &dev->bank_list, siblings) {
- list_for_each_entry(line, &bank->line_list, siblings) {
- if (line->offset >= bank->num_lines)
- continue;
-
- if (!line->hog)
- continue;
-
- hog = &dev->hogs[idx++];
-
- /*
- * We need to make this string manually because at this
- * point the device doesn't exist yet and so dev_name()
- * is not available.
- */
- if (gpio_sim_bank_has_label(bank))
- hog->chip_label = kstrdup(bank->label,
- GFP_KERNEL);
- else
- hog->chip_label = kasprintf(GFP_KERNEL,
- "gpio-sim.%u:%pfwP",
- dev->id,
- bank->swnode);
- if (!hog->chip_label) {
- gpio_sim_remove_hogs(dev);
- return -ENOMEM;
- }
-
- /*
- * We need to duplicate this because the hog config
- * item can be removed at any time (and we can't block
- * it) and gpiolib doesn't make a deep copy of the hog
- * data.
- */
- if (line->hog->name) {
- hog->line_name = kstrdup(line->hog->name,
- GFP_KERNEL);
- if (!hog->line_name) {
- gpio_sim_remove_hogs(dev);
- return -ENOMEM;
- }
- }
-
- hog->chip_hwnum = line->offset;
- hog->dflags = line->hog->dir;
- }
- }
-
- gpiod_add_hogs(dev->hogs);
-
- return 0;
-}
-
static struct fwnode_handle *
gpio_sim_make_bank_swnode(struct gpio_sim_bank *bank,
struct fwnode_handle *parent)
@@ -917,12 +820,61 @@ gpio_sim_make_bank_swnode(struct gpio_sim_bank *bank,
return fwnode_create_software_node(properties, parent);
}
+static int gpio_sim_bank_add_hogs(struct gpio_sim_bank *bank)
+{
+ struct property_entry properties[GPIO_SIM_HOG_PROP_MAX];
+ struct fwnode_handle *swnode;
+ struct gpio_sim_line *line;
+ struct gpio_sim_hog *hog;
+ unsigned int idx;
+ u32 gpios[2];
+
+ list_for_each_entry(line, &bank->line_list, siblings) {
+ if (!line->hog)
+ continue;
+
+ hog = line->hog;
+
+ gpios[0] = line->offset;
+ gpios[1] = 0;
+
+ memset(properties, 0, sizeof(properties));
+
+ idx = 0;
+ properties[idx++] = PROPERTY_ENTRY_BOOL("gpio-hog");
+ properties[idx++] = PROPERTY_ENTRY_U32_ARRAY("gpios", gpios);
+ properties[idx++] = PROPERTY_ENTRY_STRING("line-name", hog->name);
+
+ switch (hog->dir) {
+ case GPIOD_IN:
+ properties[idx++] = PROPERTY_ENTRY_BOOL("input");
+ break;
+ case GPIOD_OUT_HIGH:
+ properties[idx++] = PROPERTY_ENTRY_BOOL("output-high");
+ break;
+ case GPIOD_OUT_LOW:
+ properties[idx++] = PROPERTY_ENTRY_BOOL("output-low");
+ break;
+ default:
+ /* Would have been validated at configfs store. */
+ WARN(1, "Unexpected hog direction value: %d", hog->dir);
+ return -EINVAL;
+ }
+
+ swnode = fwnode_create_software_node(properties, bank->swnode);
+ if (IS_ERR(swnode))
+ return PTR_ERR(swnode);
+ }
+
+ return 0;
+}
+
static void gpio_sim_remove_swnode_recursive(struct fwnode_handle *swnode)
{
struct fwnode_handle *child;
fwnode_for_each_child_node(swnode, child)
- fwnode_remove_software_node(child);
+ gpio_sim_remove_swnode_recursive(child);
fwnode_remove_software_node(swnode);
}
@@ -977,12 +929,12 @@ static int gpio_sim_device_activate(struct gpio_sim_device *dev)
gpio_sim_remove_swnode_recursive(swnode);
return ret;
}
- }
- ret = gpio_sim_add_hogs(dev);
- if (ret) {
- gpio_sim_remove_swnode_recursive(swnode);
- return ret;
+ ret = gpio_sim_bank_add_hogs(bank);
+ if (ret) {
+ gpio_sim_remove_swnode_recursive(swnode);
+ return ret;
+ }
}
pdevinfo.name = "gpio-sim";
@@ -991,7 +943,6 @@ static int gpio_sim_device_activate(struct gpio_sim_device *dev)
ret = dev_sync_probe_register(&dev->probe_data, &pdevinfo);
if (ret) {
- gpio_sim_remove_hogs(dev);
gpio_sim_remove_swnode_recursive(swnode);
return ret;
}
@@ -1007,7 +958,6 @@ static void gpio_sim_device_deactivate(struct gpio_sim_device *dev)
swnode = dev_fwnode(&dev->probe_data.pdev->dev);
dev_sync_probe_unregister(&dev->probe_data);
- gpio_sim_remove_hogs(dev);
gpio_sim_remove_swnode_recursive(swnode);
}
--
2.47.3
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 4/6] ARM: omap1: ams-delta: convert GPIO hogs to using firmware nodes
2026-03-05 9:51 [PATCH 0/6] gpiolib: unify gpio-hog code Bartosz Golaszewski
` (2 preceding siblings ...)
2026-03-05 9:51 ` [PATCH 3/6] gpio: sim: use fwnode-based GPIO hogs Bartosz Golaszewski
@ 2026-03-05 9:51 ` Bartosz Golaszewski
2026-03-05 12:59 ` Linus Walleij
2026-03-06 0:44 ` Kevin Hilman
2026-03-05 9:51 ` [PATCH 5/6] gpio: remove machine hogs Bartosz Golaszewski
` (2 subsequent siblings)
6 siblings, 2 replies; 18+ messages in thread
From: Bartosz Golaszewski @ 2026-03-05 9:51 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Geert Uytterhoeven,
Frank Rowand, Mika Westerberg, Andy Shevchenko, Aaro Koskinen,
Janusz Krzysztofik, Tony Lindgren, Russell King, Jonathan Corbet,
Shuah Khan
Cc: linux-gpio, linux-kernel, linux-acpi, linux-arm-kernel,
linux-omap, linux-doc, brgl, Bartosz Golaszewski
Setup a software node hierarchy for the latch2 GPIO controller defining
the required hog and stop using legacy machine hog API.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
arch/arm/mach-omap1/board-ams-delta.c | 32 +++++++++++++++++++++++++++-----
1 file changed, 27 insertions(+), 5 deletions(-)
diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c
index 16392720296cd224732450c85419c35bbab506f6..1bec4fa0bd5e8bfc58103d1f24b22176707fd26f 100644
--- a/arch/arm/mach-omap1/board-ams-delta.c
+++ b/arch/arm/mach-omap1/board-ams-delta.c
@@ -556,10 +556,30 @@ static struct gpiod_lookup_table *ams_delta_gpio_tables[] __initdata = {
&ams_delta_nand_gpio_table,
};
-static struct gpiod_hog ams_delta_gpio_hogs[] = {
- GPIO_HOG(LATCH2_LABEL, LATCH2_PIN_KEYBRD_DATAOUT, "keybrd_dataout",
- GPIO_ACTIVE_HIGH, GPIOD_OUT_LOW),
- {},
+static const struct software_node latch2_gpio_swnode = {
+ .name = LATCH2_LABEL,
+};
+
+static const u32 latch2_hog_gpios[] = { LATCH2_PIN_KEYBRD_DATAOUT, 0 };
+
+static const struct property_entry latch2_gpio_hog_props[] = {
+ PROPERTY_ENTRY_BOOL("gpio-hog"),
+ PROPERTY_ENTRY_U32_ARRAY("gpios", latch2_hog_gpios),
+ PROPERTY_ENTRY_STRING("line-name", "keybrd_dataout"),
+ PROPERTY_ENTRY_BOOL("output-low"),
+ { }
+};
+
+static const struct software_node latch2_gpio_hog_swnode = {
+ .parent = &latch2_gpio_swnode,
+ .name = "latch2-hog",
+ .properties = latch2_gpio_hog_props,
+};
+
+static const struct software_node *const latch2_gpio_swnodes[] = {
+ &latch2_gpio_swnode,
+ &latch2_gpio_hog_swnode,
+ NULL
};
static struct plat_serial8250_port ams_delta_modem_ports[];
@@ -684,7 +704,6 @@ static void __init ams_delta_init(void)
omap_gpio_deps_init();
ams_delta_latch2_init();
- gpiod_add_hogs(ams_delta_gpio_hogs);
omap_serial_init();
omap_register_i2c_bus(1, 100, NULL, 0);
@@ -693,6 +712,9 @@ static void __init ams_delta_init(void)
platform_add_devices(ams_delta_devices, ARRAY_SIZE(ams_delta_devices));
platform_device_register_full(&latch1_gpio_devinfo);
+
+ software_node_register_node_group(latch2_gpio_swnodes);
+ latch2_gpio_devinfo.fwnode = software_node_fwnode(&latch2_gpio_swnode);
platform_device_register_full(&latch2_gpio_devinfo);
/*
--
2.47.3
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 5/6] gpio: remove machine hogs
2026-03-05 9:51 [PATCH 0/6] gpiolib: unify gpio-hog code Bartosz Golaszewski
` (3 preceding siblings ...)
2026-03-05 9:51 ` [PATCH 4/6] ARM: omap1: ams-delta: convert GPIO hogs to using firmware nodes Bartosz Golaszewski
@ 2026-03-05 9:51 ` Bartosz Golaszewski
2026-03-05 13:00 ` Linus Walleij
2026-03-05 9:51 ` [PATCH 6/6] gpio: sim: allow to define the active-low setting of a simulated hog Bartosz Golaszewski
2026-03-06 11:58 ` [PATCH 0/6] gpiolib: unify gpio-hog code Andy Shevchenko
6 siblings, 1 reply; 18+ messages in thread
From: Bartosz Golaszewski @ 2026-03-05 9:51 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Geert Uytterhoeven,
Frank Rowand, Mika Westerberg, Andy Shevchenko, Aaro Koskinen,
Janusz Krzysztofik, Tony Lindgren, Russell King, Jonathan Corbet,
Shuah Khan
Cc: linux-gpio, linux-kernel, linux-acpi, linux-arm-kernel,
linux-omap, linux-doc, brgl, Bartosz Golaszewski
With no more users, remove legacy machine hog API from the kernel.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
Documentation/driver-api/gpio/board.rst | 16 --------
drivers/gpio/gpiolib.c | 71 ---------------------------------
include/linux/gpio/machine.h | 33 ---------------
3 files changed, 120 deletions(-)
diff --git a/Documentation/driver-api/gpio/board.rst b/Documentation/driver-api/gpio/board.rst
index 069b54d8591bdeb975a6c650d643db4f7eb98ab7..0993cac891fb5e4887a1aee6deae273197c6aae1 100644
--- a/Documentation/driver-api/gpio/board.rst
+++ b/Documentation/driver-api/gpio/board.rst
@@ -239,22 +239,6 @@ mapping and is thus transparent to GPIO consumers.
A set of functions such as gpiod_set_value() is available to work with
the new descriptor-oriented interface.
-Boards using platform data can also hog GPIO lines by defining GPIO hog tables.
-
-.. code-block:: c
-
- struct gpiod_hog gpio_hog_table[] = {
- GPIO_HOG("gpio.0", 10, "foo", GPIO_ACTIVE_LOW, GPIOD_OUT_HIGH),
- { }
- };
-
-And the table can be added to the board code as follows::
-
- gpiod_add_hogs(gpio_hog_table);
-
-The line will be hogged as soon as the gpiochip is created or - in case the
-chip was created earlier - when the hog table is registered.
-
Arrays of pins
--------------
In addition to requesting pins belonging to a function one by one, a device may
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index be2e6ed0e744c23939491717a060d3a8456c842b..e732427e2a975585ec873a5240ab92e3a4cf187f 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -103,9 +103,6 @@ static DEFINE_MUTEX(gpio_devices_lock);
/* Ensures coherence during read-only accesses to the list of GPIO devices. */
DEFINE_STATIC_SRCU(gpio_devices_srcu);
-static DEFINE_MUTEX(gpio_machine_hogs_mutex);
-static LIST_HEAD(gpio_machine_hogs);
-
const char *const gpio_suffixes[] = { "gpios", "gpio", NULL };
static void gpiochip_free_hogs(struct gpio_chip *gc);
@@ -930,36 +927,6 @@ static int gpiochip_setup_dev(struct gpio_chip *gc)
return ret;
}
-static void gpiochip_machine_hog(struct gpio_chip *gc, struct gpiod_hog *hog)
-{
- struct gpio_desc *desc;
- int rv;
-
- desc = gpiochip_get_desc(gc, hog->chip_hwnum);
- if (IS_ERR(desc)) {
- gpiochip_err(gc, "%s: unable to get GPIO desc: %ld\n",
- __func__, PTR_ERR(desc));
- return;
- }
-
- rv = gpiod_hog(desc, hog->line_name, hog->lflags, hog->dflags);
- if (rv)
- gpiod_err(desc, "%s: unable to hog GPIO line (%s:%u): %d\n",
- __func__, gc->label, hog->chip_hwnum, rv);
-}
-
-static void gpiochip_machine_hog_lines(struct gpio_chip *gc)
-{
- struct gpiod_hog *hog;
-
- guard(mutex)(&gpio_machine_hogs_mutex);
-
- list_for_each_entry(hog, &gpio_machine_hogs, list) {
- if (!strcmp(gc->label, hog->chip_label))
- gpiochip_machine_hog(gc, hog);
- }
-}
-
int gpiochip_add_hog(struct gpio_chip *gc, struct fwnode_handle *fwnode)
{
struct fwnode_handle *gc_node = dev_fwnode(&gc->gpiodev->dev);
@@ -1049,8 +1016,6 @@ static int gpiochip_hog_lines(struct gpio_chip *gc)
return ret;
}
- gpiochip_machine_hog_lines(gc);
-
return 0;
}
@@ -4584,42 +4549,6 @@ void gpiod_remove_lookup_table(struct gpiod_lookup_table *table)
}
EXPORT_SYMBOL_GPL(gpiod_remove_lookup_table);
-/**
- * gpiod_add_hogs() - register a set of GPIO hogs from machine code
- * @hogs: table of gpio hog entries with a zeroed sentinel at the end
- */
-void gpiod_add_hogs(struct gpiod_hog *hogs)
-{
- struct gpiod_hog *hog;
-
- guard(mutex)(&gpio_machine_hogs_mutex);
-
- for (hog = &hogs[0]; hog->chip_label; hog++) {
- list_add_tail(&hog->list, &gpio_machine_hogs);
-
- /*
- * The chip may have been registered earlier, so check if it
- * exists and, if so, try to hog the line now.
- */
- struct gpio_device *gdev __free(gpio_device_put) =
- gpio_device_find_by_label(hog->chip_label);
- if (gdev)
- gpiochip_machine_hog(gpio_device_get_chip(gdev), hog);
- }
-}
-EXPORT_SYMBOL_GPL(gpiod_add_hogs);
-
-void gpiod_remove_hogs(struct gpiod_hog *hogs)
-{
- struct gpiod_hog *hog;
-
- guard(mutex)(&gpio_machine_hogs_mutex);
-
- for (hog = &hogs[0]; hog->chip_label; hog++)
- list_del(&hog->list);
-}
-EXPORT_SYMBOL_GPL(gpiod_remove_hogs);
-
static bool gpiod_match_lookup_table(struct device *dev,
const struct gpiod_lookup_table *table)
{
diff --git a/include/linux/gpio/machine.h b/include/linux/gpio/machine.h
index 44e5f162973eb6f6e85188f56ec34e1e3e2beab6..5eb88f5d0630f83b6a3a0e6727103c319e139b27 100644
--- a/include/linux/gpio/machine.h
+++ b/include/linux/gpio/machine.h
@@ -46,23 +46,6 @@ struct gpiod_lookup_table {
struct gpiod_lookup table[];
};
-/**
- * struct gpiod_hog - GPIO line hog table
- * @chip_label: name of the chip the GPIO belongs to
- * @chip_hwnum: hardware number (i.e. relative to the chip) of the GPIO
- * @line_name: consumer name for the hogged line
- * @lflags: bitmask of gpio_lookup_flags GPIO_* values
- * @dflags: GPIO flags used to specify the direction and value
- */
-struct gpiod_hog {
- struct list_head list;
- const char *chip_label;
- u16 chip_hwnum;
- const char *line_name;
- unsigned long lflags;
- int dflags;
-};
-
/*
* Helper for lookup tables with just one single lookup for a device.
*/
@@ -95,24 +78,10 @@ static struct gpiod_lookup_table _name = { \
.flags = _flags, \
}
-/*
- * Simple definition of a single GPIO hog in an array.
- */
-#define GPIO_HOG(_chip_label, _chip_hwnum, _line_name, _lflags, _dflags) \
-(struct gpiod_hog) { \
- .chip_label = _chip_label, \
- .chip_hwnum = _chip_hwnum, \
- .line_name = _line_name, \
- .lflags = _lflags, \
- .dflags = _dflags, \
-}
-
#ifdef CONFIG_GPIOLIB
void gpiod_add_lookup_table(struct gpiod_lookup_table *table);
void gpiod_add_lookup_tables(struct gpiod_lookup_table **tables, size_t n);
void gpiod_remove_lookup_table(struct gpiod_lookup_table *table);
-void gpiod_add_hogs(struct gpiod_hog *hogs);
-void gpiod_remove_hogs(struct gpiod_hog *hogs);
#else /* ! CONFIG_GPIOLIB */
static inline
void gpiod_add_lookup_table(struct gpiod_lookup_table *table) {}
@@ -120,8 +89,6 @@ static inline
void gpiod_add_lookup_tables(struct gpiod_lookup_table **tables, size_t n) {}
static inline
void gpiod_remove_lookup_table(struct gpiod_lookup_table *table) {}
-static inline void gpiod_add_hogs(struct gpiod_hog *hogs) {}
-static inline void gpiod_remove_hogs(struct gpiod_hog *hogs) {}
#endif /* CONFIG_GPIOLIB */
#endif /* __LINUX_GPIO_MACHINE_H */
--
2.47.3
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 6/6] gpio: sim: allow to define the active-low setting of a simulated hog
2026-03-05 9:51 [PATCH 0/6] gpiolib: unify gpio-hog code Bartosz Golaszewski
` (4 preceding siblings ...)
2026-03-05 9:51 ` [PATCH 5/6] gpio: remove machine hogs Bartosz Golaszewski
@ 2026-03-05 9:51 ` Bartosz Golaszewski
2026-03-05 13:01 ` Linus Walleij
2026-03-06 11:58 ` [PATCH 0/6] gpiolib: unify gpio-hog code Andy Shevchenko
6 siblings, 1 reply; 18+ messages in thread
From: Bartosz Golaszewski @ 2026-03-05 9:51 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Geert Uytterhoeven,
Frank Rowand, Mika Westerberg, Andy Shevchenko, Aaro Koskinen,
Janusz Krzysztofik, Tony Lindgren, Russell King, Jonathan Corbet,
Shuah Khan
Cc: linux-gpio, linux-kernel, linux-acpi, linux-arm-kernel,
linux-omap, linux-doc, brgl, Bartosz Golaszewski
Add a new configfs attribute to the hog group allowing to configure the
active-low lookup flag for hogged lines.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
drivers/gpio/gpio-sim.c | 40 +++++++++++++++++++++++++++++++++++++++-
1 file changed, 39 insertions(+), 1 deletion(-)
diff --git a/drivers/gpio/gpio-sim.c b/drivers/gpio/gpio-sim.c
index 51bcbdd91b4b027b7a340971a11cce5280ca1295..f32674230237eb08bbf8dd1337a79b5d0aa13259 100644
--- a/drivers/gpio/gpio-sim.c
+++ b/drivers/gpio/gpio-sim.c
@@ -654,6 +654,7 @@ struct gpio_sim_hog {
char *name;
int dir;
+ bool active_low;
};
static struct gpio_sim_hog *to_gpio_sim_hog(struct config_item *item)
@@ -836,7 +837,7 @@ static int gpio_sim_bank_add_hogs(struct gpio_sim_bank *bank)
hog = line->hog;
gpios[0] = line->offset;
- gpios[1] = 0;
+ gpios[1] = hog->active_low ? 1 : 0;
memset(properties, 0, sizeof(properties));
@@ -1315,9 +1316,46 @@ gpio_sim_hog_config_direction_store(struct config_item *item,
CONFIGFS_ATTR(gpio_sim_hog_config_, direction);
+static ssize_t gpio_sim_hog_config_active_low_show(struct config_item *item,
+ char *page)
+{
+ struct gpio_sim_hog *hog = to_gpio_sim_hog(item);
+ struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog);
+
+ guard(mutex)(&dev->lock);
+
+ return sprintf(page, "%c\n", hog->active_low ? '1' : '0');
+}
+
+static ssize_t
+gpio_sim_hog_config_active_low_store(struct config_item *item,
+ const char *page, size_t count)
+{
+ struct gpio_sim_hog *hog = to_gpio_sim_hog(item);
+ struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog);
+ bool active_low;
+ int ret;
+
+ guard(mutex)(&dev->lock);
+
+ if (gpio_sim_device_is_live(dev))
+ return -EBUSY;
+
+ ret = kstrtobool(page, &active_low);
+ if (ret)
+ return ret;
+
+ hog->active_low = active_low;
+
+ return count;
+}
+
+CONFIGFS_ATTR(gpio_sim_hog_config_, active_low);
+
static struct configfs_attribute *gpio_sim_hog_config_attrs[] = {
&gpio_sim_hog_config_attr_name,
&gpio_sim_hog_config_attr_direction,
+ &gpio_sim_hog_config_attr_active_low,
NULL
};
--
2.47.3
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 1/6] gpio: of: clear OF_POPULATED on hog nodes in remove path
2026-03-05 9:51 ` [PATCH 1/6] gpio: of: clear OF_POPULATED on hog nodes in remove path Bartosz Golaszewski
@ 2026-03-05 12:58 ` Linus Walleij
0 siblings, 0 replies; 18+ messages in thread
From: Linus Walleij @ 2026-03-05 12:58 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Bartosz Golaszewski, Geert Uytterhoeven, Frank Rowand,
Mika Westerberg, Andy Shevchenko, Aaro Koskinen,
Janusz Krzysztofik, Tony Lindgren, Russell King, Jonathan Corbet,
Shuah Khan, linux-gpio, linux-kernel, linux-acpi,
linux-arm-kernel, linux-omap, linux-doc, stable
On Thu, Mar 5, 2026 at 10:51 AM Bartosz Golaszewski
<bartosz.golaszewski@oss.qualcomm.com> wrote:
> The previously set OF_POPULATED flag should be cleared on the hog nodes
> when removing the chip.
>
> Cc: stable@vger.kernel.org
> Fixes: 63636d956c455 ("gpio: of: Add DT overlay support for GPIO hogs")
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
I have no idea how OF_POPULATED is supposed to be used
so I just trust you on this one:
Acked-by: Linus Walleij <linusw@kernel.org>
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 2/6] gpio: move hogs into GPIO core
2026-03-05 9:51 ` [PATCH 2/6] gpio: move hogs into GPIO core Bartosz Golaszewski
@ 2026-03-05 12:59 ` Linus Walleij
2026-03-05 14:25 ` Mika Westerberg
` (2 subsequent siblings)
3 siblings, 0 replies; 18+ messages in thread
From: Linus Walleij @ 2026-03-05 12:59 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Bartosz Golaszewski, Geert Uytterhoeven, Frank Rowand,
Mika Westerberg, Andy Shevchenko, Aaro Koskinen,
Janusz Krzysztofik, Tony Lindgren, Russell King, Jonathan Corbet,
Shuah Khan, linux-gpio, linux-kernel, linux-acpi,
linux-arm-kernel, linux-omap, linux-doc
On Thu, Mar 5, 2026 at 10:51 AM Bartosz Golaszewski
<bartosz.golaszewski@oss.qualcomm.com> wrote:
> Refactor line hogging code by moving the parts duplicated in
> gpiolib-acpi-core.c and gpiolib-of.c into gpiolib.c, leaving just the
> OF-specific bits in the latter.
>
> This makes fwnode the primary API for setting up hogs and allows to use
> software nodes in addition to ACPI and OF nodes.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
It's a work of art.
Reviewed-by: Linus Walleij <linusw@kernel.org>
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 3/6] gpio: sim: use fwnode-based GPIO hogs
2026-03-05 9:51 ` [PATCH 3/6] gpio: sim: use fwnode-based GPIO hogs Bartosz Golaszewski
@ 2026-03-05 12:59 ` Linus Walleij
0 siblings, 0 replies; 18+ messages in thread
From: Linus Walleij @ 2026-03-05 12:59 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Bartosz Golaszewski, Geert Uytterhoeven, Frank Rowand,
Mika Westerberg, Andy Shevchenko, Aaro Koskinen,
Janusz Krzysztofik, Tony Lindgren, Russell King, Jonathan Corbet,
Shuah Khan, linux-gpio, linux-kernel, linux-acpi,
linux-arm-kernel, linux-omap, linux-doc
On Thu, Mar 5, 2026 at 10:51 AM Bartosz Golaszewski
<bartosz.golaszewski@oss.qualcomm.com> wrote:
> Convert gpio-sim to using software nodes for setting up simulated hogs
> instead of legacy machine hogs.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Reviewed-by: Linus Walleij <linusw@kernel.org>
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 4/6] ARM: omap1: ams-delta: convert GPIO hogs to using firmware nodes
2026-03-05 9:51 ` [PATCH 4/6] ARM: omap1: ams-delta: convert GPIO hogs to using firmware nodes Bartosz Golaszewski
@ 2026-03-05 12:59 ` Linus Walleij
2026-03-06 0:44 ` Kevin Hilman
1 sibling, 0 replies; 18+ messages in thread
From: Linus Walleij @ 2026-03-05 12:59 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Bartosz Golaszewski, Geert Uytterhoeven, Frank Rowand,
Mika Westerberg, Andy Shevchenko, Aaro Koskinen,
Janusz Krzysztofik, Tony Lindgren, Russell King, Jonathan Corbet,
Shuah Khan, linux-gpio, linux-kernel, linux-acpi,
linux-arm-kernel, linux-omap, linux-doc
On Thu, Mar 5, 2026 at 10:51 AM Bartosz Golaszewski
<bartosz.golaszewski@oss.qualcomm.com> wrote:
> Setup a software node hierarchy for the latch2 GPIO controller defining
> the required hog and stop using legacy machine hog API.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Reviewed-by: Linus Walleij <linusw@kernel.org>
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 5/6] gpio: remove machine hogs
2026-03-05 9:51 ` [PATCH 5/6] gpio: remove machine hogs Bartosz Golaszewski
@ 2026-03-05 13:00 ` Linus Walleij
0 siblings, 0 replies; 18+ messages in thread
From: Linus Walleij @ 2026-03-05 13:00 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Bartosz Golaszewski, Geert Uytterhoeven, Frank Rowand,
Mika Westerberg, Andy Shevchenko, Aaro Koskinen,
Janusz Krzysztofik, Tony Lindgren, Russell King, Jonathan Corbet,
Shuah Khan, linux-gpio, linux-kernel, linux-acpi,
linux-arm-kernel, linux-omap, linux-doc
On Thu, Mar 5, 2026 at 10:52 AM Bartosz Golaszewski
<bartosz.golaszewski@oss.qualcomm.com> wrote:
> With no more users, remove legacy machine hog API from the kernel.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Sweet, less and clearer abstractions using strings instead, I like it.
Reviewed-by: Linus Walleij <linusw@kernel.org>
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 6/6] gpio: sim: allow to define the active-low setting of a simulated hog
2026-03-05 9:51 ` [PATCH 6/6] gpio: sim: allow to define the active-low setting of a simulated hog Bartosz Golaszewski
@ 2026-03-05 13:01 ` Linus Walleij
0 siblings, 0 replies; 18+ messages in thread
From: Linus Walleij @ 2026-03-05 13:01 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Bartosz Golaszewski, Geert Uytterhoeven, Frank Rowand,
Mika Westerberg, Andy Shevchenko, Aaro Koskinen,
Janusz Krzysztofik, Tony Lindgren, Russell King, Jonathan Corbet,
Shuah Khan, linux-gpio, linux-kernel, linux-acpi,
linux-arm-kernel, linux-omap, linux-doc
On Thu, Mar 5, 2026 at 10:52 AM Bartosz Golaszewski
<bartosz.golaszewski@oss.qualcomm.com> wrote:
> Add a new configfs attribute to the hog group allowing to configure the
> active-low lookup flag for hogged lines.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
If you add an explanation to why this is needed (I can think
of a few) then:
Reviewed-by: Linus Walleij <linusw@kernel.org>
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 2/6] gpio: move hogs into GPIO core
2026-03-05 9:51 ` [PATCH 2/6] gpio: move hogs into GPIO core Bartosz Golaszewski
2026-03-05 12:59 ` Linus Walleij
@ 2026-03-05 14:25 ` Mika Westerberg
2026-03-06 1:06 ` kernel test robot
2026-03-06 11:53 ` Andy Shevchenko
3 siblings, 0 replies; 18+ messages in thread
From: Mika Westerberg @ 2026-03-05 14:25 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Linus Walleij, Bartosz Golaszewski, Geert Uytterhoeven,
Frank Rowand, Mika Westerberg, Andy Shevchenko, Aaro Koskinen,
Janusz Krzysztofik, Tony Lindgren, Russell King, Jonathan Corbet,
Shuah Khan, linux-gpio, linux-kernel, linux-acpi,
linux-arm-kernel, linux-omap, linux-doc
On Thu, Mar 05, 2026 at 10:51:27AM +0100, Bartosz Golaszewski wrote:
> Refactor line hogging code by moving the parts duplicated in
> gpiolib-acpi-core.c and gpiolib-of.c into gpiolib.c, leaving just the
> OF-specific bits in the latter.
>
> This makes fwnode the primary API for setting up hogs and allows to use
> software nodes in addition to ACPI and OF nodes.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 4/6] ARM: omap1: ams-delta: convert GPIO hogs to using firmware nodes
2026-03-05 9:51 ` [PATCH 4/6] ARM: omap1: ams-delta: convert GPIO hogs to using firmware nodes Bartosz Golaszewski
2026-03-05 12:59 ` Linus Walleij
@ 2026-03-06 0:44 ` Kevin Hilman
1 sibling, 0 replies; 18+ messages in thread
From: Kevin Hilman @ 2026-03-06 0:44 UTC (permalink / raw)
To: Bartosz Golaszewski, Linus Walleij, Bartosz Golaszewski,
Geert Uytterhoeven, Frank Rowand, Mika Westerberg,
Andy Shevchenko, Aaro Koskinen, Janusz Krzysztofik, Tony Lindgren,
Russell King, Jonathan Corbet, Shuah Khan
Cc: linux-gpio, linux-kernel, linux-acpi, linux-arm-kernel,
linux-omap, linux-doc, brgl, Bartosz Golaszewski
Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com> writes:
> Setup a software node hierarchy for the latch2 GPIO controller defining
> the required hog and stop using legacy machine hog API.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Acked-by: Kevin Hilman <khilman@baylibre.com>
> ---
> arch/arm/mach-omap1/board-ams-delta.c | 32 +++++++++++++++++++++++++++-----
> 1 file changed, 27 insertions(+), 5 deletions(-)
>
> diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c
> index 16392720296cd224732450c85419c35bbab506f6..1bec4fa0bd5e8bfc58103d1f24b22176707fd26f 100644
> --- a/arch/arm/mach-omap1/board-ams-delta.c
> +++ b/arch/arm/mach-omap1/board-ams-delta.c
> @@ -556,10 +556,30 @@ static struct gpiod_lookup_table *ams_delta_gpio_tables[] __initdata = {
> &ams_delta_nand_gpio_table,
> };
>
> -static struct gpiod_hog ams_delta_gpio_hogs[] = {
> - GPIO_HOG(LATCH2_LABEL, LATCH2_PIN_KEYBRD_DATAOUT, "keybrd_dataout",
> - GPIO_ACTIVE_HIGH, GPIOD_OUT_LOW),
> - {},
> +static const struct software_node latch2_gpio_swnode = {
> + .name = LATCH2_LABEL,
> +};
> +
> +static const u32 latch2_hog_gpios[] = { LATCH2_PIN_KEYBRD_DATAOUT, 0 };
> +
> +static const struct property_entry latch2_gpio_hog_props[] = {
> + PROPERTY_ENTRY_BOOL("gpio-hog"),
> + PROPERTY_ENTRY_U32_ARRAY("gpios", latch2_hog_gpios),
> + PROPERTY_ENTRY_STRING("line-name", "keybrd_dataout"),
> + PROPERTY_ENTRY_BOOL("output-low"),
> + { }
> +};
> +
> +static const struct software_node latch2_gpio_hog_swnode = {
> + .parent = &latch2_gpio_swnode,
> + .name = "latch2-hog",
> + .properties = latch2_gpio_hog_props,
> +};
> +
> +static const struct software_node *const latch2_gpio_swnodes[] = {
> + &latch2_gpio_swnode,
> + &latch2_gpio_hog_swnode,
> + NULL
> };
>
> static struct plat_serial8250_port ams_delta_modem_ports[];
> @@ -684,7 +704,6 @@ static void __init ams_delta_init(void)
>
> omap_gpio_deps_init();
> ams_delta_latch2_init();
> - gpiod_add_hogs(ams_delta_gpio_hogs);
>
> omap_serial_init();
> omap_register_i2c_bus(1, 100, NULL, 0);
> @@ -693,6 +712,9 @@ static void __init ams_delta_init(void)
> platform_add_devices(ams_delta_devices, ARRAY_SIZE(ams_delta_devices));
>
> platform_device_register_full(&latch1_gpio_devinfo);
> +
> + software_node_register_node_group(latch2_gpio_swnodes);
> + latch2_gpio_devinfo.fwnode = software_node_fwnode(&latch2_gpio_swnode);
> platform_device_register_full(&latch2_gpio_devinfo);
>
> /*
>
> --
> 2.47.3
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 2/6] gpio: move hogs into GPIO core
2026-03-05 9:51 ` [PATCH 2/6] gpio: move hogs into GPIO core Bartosz Golaszewski
2026-03-05 12:59 ` Linus Walleij
2026-03-05 14:25 ` Mika Westerberg
@ 2026-03-06 1:06 ` kernel test robot
2026-03-06 11:53 ` Andy Shevchenko
3 siblings, 0 replies; 18+ messages in thread
From: kernel test robot @ 2026-03-06 1:06 UTC (permalink / raw)
To: Bartosz Golaszewski, Linus Walleij, Bartosz Golaszewski,
Geert Uytterhoeven, Frank Rowand, Mika Westerberg,
Andy Shevchenko, Aaro Koskinen, Janusz Krzysztofik, Tony Lindgren,
Russell King, Jonathan Corbet, Shuah Khan
Cc: llvm, oe-kbuild-all, linux-gpio, linux-kernel, linux-acpi,
linux-arm-kernel, linux-omap, linux-doc
Hi Bartosz,
kernel test robot noticed the following build warnings:
[auto build test WARNING on c025f6cf4209e1542ec2afebe49f42bbaf1a5c7b]
url: https://github.com/intel-lab-lkp/linux/commits/Bartosz-Golaszewski/gpio-of-clear-OF_POPULATED-on-hog-nodes-in-remove-path/20260305-175735
base: c025f6cf4209e1542ec2afebe49f42bbaf1a5c7b
patch link: https://lore.kernel.org/r/20260305-gpio-hog-fwnode-v1-2-97d7df6bbd17%40oss.qualcomm.com
patch subject: [PATCH 2/6] gpio: move hogs into GPIO core
config: loongarch-allnoconfig (https://download.01.org/0day-ci/archive/20260306/202603060850.dUlmPBav-lkp@intel.com/config)
compiler: clang version 23.0.0git (https://github.com/llvm/llvm-project c32caeec8158d634bb71ab8911a6031248b9fc47)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260306/202603060850.dUlmPBav-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202603060850.dUlmPBav-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/gpio/gpiolib.c:981:10: warning: variable 'ret' is uninitialized when used here [-Wuninitialized]
981 | return ret;
| ^~~
drivers/gpio/gpiolib.c:971:9: note: initialize the variable 'ret' to silence this warning
971 | int ret, argc;
| ^
| = 0
1 warning generated.
vim +/ret +981 drivers/gpio/gpiolib.c
962
963 int gpiochip_add_hog(struct gpio_chip *gc, struct fwnode_handle *fwnode)
964 {
965 struct fwnode_handle *gc_node = dev_fwnode(&gc->gpiodev->dev);
966 struct of_phandle_args gpiospec;
967 enum gpiod_flags dflags;
968 struct gpio_desc *desc;
969 unsigned long lflags;
970 const char *name;
971 int ret, argc;
972 u32 gpios[3]; /* We support up to three-cell bindings. */
973 u32 cells;
974
975 lflags = GPIO_LOOKUP_FLAGS_DEFAULT;
976 dflags = GPIOD_ASIS;
977 name = NULL;
978
979 argc = fwnode_property_count_u32(fwnode, "gpios");
980 if (argc < 0)
> 981 return ret;
982 if (argc > 3)
983 return -EINVAL;
984
985 ret = fwnode_property_read_u32_array(fwnode, "gpios", gpios, argc);
986 if (ret < 0)
987 return ret;
988
989 if (is_of_node(fwnode)) {
990 /*
991 * OF-nodes need some additional special handling for
992 * translating of devicetree flags.
993 */
994 ret = fwnode_property_read_u32(gc_node, "#gpio-cells", &cells);
995 if (ret)
996 return ret;
997 if (cells && argc != cells)
998 return -EINVAL;
999
1000 memset(&gpiospec, 0, sizeof(gpiospec));
1001 gpiospec.np = to_of_node(fwnode);
1002 gpiospec.args_count = argc;
1003 memcpy(&gpiospec.args, gpios, argc * sizeof(u32));
1004
1005 ret = of_gpiochip_get_lflags(gc, &gpiospec, &lflags);
1006 if (ret)
1007 return ret;
1008 } else {
1009 /*
1010 * GPIO_ACTIVE_LOW is currently the only lookup flag
1011 * supported for non-OF firmware nodes.
1012 */
1013 if (gpios[1])
1014 lflags |= GPIO_ACTIVE_LOW;
1015 }
1016
1017 if (fwnode_property_present(fwnode, "input"))
1018 dflags |= GPIOD_IN;
1019 else if (fwnode_property_present(fwnode, "output-low"))
1020 dflags |= GPIOD_OUT_LOW;
1021 else if (fwnode_property_present(fwnode, "output-high"))
1022 dflags |= GPIOD_OUT_HIGH;
1023 else
1024 return -EINVAL;
1025
1026 fwnode_property_read_string(fwnode, "line-name", &name);
1027
1028 desc = gpiochip_get_desc(gc, gpios[0]);
1029 if (IS_ERR(desc))
1030 return PTR_ERR(desc);
1031
1032 ret = gpiod_hog(desc, name, lflags, dflags);
1033 if (ret)
1034 return ret;
1035
1036 return 0;
1037 }
1038
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 2/6] gpio: move hogs into GPIO core
2026-03-05 9:51 ` [PATCH 2/6] gpio: move hogs into GPIO core Bartosz Golaszewski
` (2 preceding siblings ...)
2026-03-06 1:06 ` kernel test robot
@ 2026-03-06 11:53 ` Andy Shevchenko
3 siblings, 0 replies; 18+ messages in thread
From: Andy Shevchenko @ 2026-03-06 11:53 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Linus Walleij, Bartosz Golaszewski, Geert Uytterhoeven,
Frank Rowand, Mika Westerberg, Aaro Koskinen, Janusz Krzysztofik,
Tony Lindgren, Russell King, Jonathan Corbet, Shuah Khan,
linux-gpio, linux-kernel, linux-acpi, linux-arm-kernel,
linux-omap, linux-doc
On Thu, Mar 05, 2026 at 10:51:27AM +0100, Bartosz Golaszewski wrote:
> Refactor line hogging code by moving the parts duplicated in
> gpiolib-acpi-core.c and gpiolib-of.c into gpiolib.c, leaving just the
> OF-specific bits in the latter.
>
> This makes fwnode the primary API for setting up hogs and allows to use
> software nodes in addition to ACPI and OF nodes.
...
> +int gpiochip_add_hog(struct gpio_chip *gc, struct fwnode_handle *fwnode)
> +{
> + struct fwnode_handle *gc_node = dev_fwnode(&gc->gpiodev->dev);
> + struct of_phandle_args gpiospec;
> + enum gpiod_flags dflags;
> + struct gpio_desc *desc;
> + unsigned long lflags;
> + const char *name;
> + int ret, argc;
> + u32 gpios[3]; /* We support up to three-cell bindings. */
> + u32 cells;
> +
> + lflags = GPIO_LOOKUP_FLAGS_DEFAULT;
> + dflags = GPIOD_ASIS;
> + name = NULL;
> +
> + argc = fwnode_property_count_u32(fwnode, "gpios");
> + if (argc < 0)
> + return ret;
As LKP noticed this perhaps needs to be changed to
return argc;
> + if (argc > 3)
> + return -EINVAL;
> +
> + ret = fwnode_property_read_u32_array(fwnode, "gpios", gpios, argc);
> + if (ret < 0)
> + return ret;
> +
> + if (is_of_node(fwnode)) {
> + /*
> + * OF-nodes need some additional special handling for
> + * translating of devicetree flags.
> + */
> + ret = fwnode_property_read_u32(gc_node, "#gpio-cells", &cells);
> + if (ret)
> + return ret;
> + if (cells && argc != cells)
> + return -EINVAL;
Hmm... So, when cells is 0 we don't care about argc not being 0?
> + memset(&gpiospec, 0, sizeof(gpiospec));
> + gpiospec.np = to_of_node(fwnode);
> + gpiospec.args_count = argc;
> + memcpy(&gpiospec.args, gpios, argc * sizeof(u32));
> +
> + ret = of_gpiochip_get_lflags(gc, &gpiospec, &lflags);
I prefer to see less OF things here, id est we may use struct
fwnode_reference_args.
> + if (ret)
> + return ret;
> + } else {
> + /*
> + * GPIO_ACTIVE_LOW is currently the only lookup flag
> + * supported for non-OF firmware nodes.
> + */
> + if (gpios[1])
> + lflags |= GPIO_ACTIVE_LOW;
> + }
> +
> + if (fwnode_property_present(fwnode, "input"))
> + dflags |= GPIOD_IN;
> + else if (fwnode_property_present(fwnode, "output-low"))
> + dflags |= GPIOD_OUT_LOW;
> + else if (fwnode_property_present(fwnode, "output-high"))
> + dflags |= GPIOD_OUT_HIGH;
> + else
> + return -EINVAL;
> +
> + fwnode_property_read_string(fwnode, "line-name", &name);
> +
> + desc = gpiochip_get_desc(gc, gpios[0]);
> + if (IS_ERR(desc))
> + return PTR_ERR(desc);
> + ret = gpiod_hog(desc, name, lflags, dflags);
> + if (ret)
> + return ret;
> +
> + return 0;
Can be
return gpiod_hog(desc, name, lflags, dflags);
> +}
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 0/6] gpiolib: unify gpio-hog code
2026-03-05 9:51 [PATCH 0/6] gpiolib: unify gpio-hog code Bartosz Golaszewski
` (5 preceding siblings ...)
2026-03-05 9:51 ` [PATCH 6/6] gpio: sim: allow to define the active-low setting of a simulated hog Bartosz Golaszewski
@ 2026-03-06 11:58 ` Andy Shevchenko
6 siblings, 0 replies; 18+ messages in thread
From: Andy Shevchenko @ 2026-03-06 11:58 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Linus Walleij, Bartosz Golaszewski, Geert Uytterhoeven,
Frank Rowand, Mika Westerberg, Aaro Koskinen, Janusz Krzysztofik,
Tony Lindgren, Russell King, Jonathan Corbet, Shuah Khan,
linux-gpio, linux-kernel, linux-acpi, linux-arm-kernel,
linux-omap, linux-doc, stable
On Thu, Mar 05, 2026 at 10:51:25AM +0100, Bartosz Golaszewski wrote:
> GPIO hogs are handled separately in three places: for OF, ACPI and
> machine lookup. In addition hogs cannot be set up using software nodes.
> A lot of that code is actually redundant and - except for some special
> handling of OF nodes - can be unified in one place.
>
> This series moves hogging into GPIO core and bases it on fwnode API
> (with a single helper from OF to translate devicetree properties into
> lookup flags), converts the two remaining users of machine hogs to using
> software node approach and removes machine hog support entirely. In
> addition, there's a patch extending the configurability of gpio-sim now
> that it uses software nodes for hogs.
>
> For merging: I think this should go through the GPIO tree with an Ack
> from OMAP1 maintainers.
>
> Even with the new feature for gpio-sim, this series still removes twice
> the number of lines, it adds.
Lovely! This was in my TODO list somewhere deep, but I never started it for
real (had some very very initial patches)
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
(Maybe I will have time to test it later on, I need to check if there is a use
of them on Intel Galileo Gen1 platform).
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2026-03-06 11:58 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-05 9:51 [PATCH 0/6] gpiolib: unify gpio-hog code Bartosz Golaszewski
2026-03-05 9:51 ` [PATCH 1/6] gpio: of: clear OF_POPULATED on hog nodes in remove path Bartosz Golaszewski
2026-03-05 12:58 ` Linus Walleij
2026-03-05 9:51 ` [PATCH 2/6] gpio: move hogs into GPIO core Bartosz Golaszewski
2026-03-05 12:59 ` Linus Walleij
2026-03-05 14:25 ` Mika Westerberg
2026-03-06 1:06 ` kernel test robot
2026-03-06 11:53 ` Andy Shevchenko
2026-03-05 9:51 ` [PATCH 3/6] gpio: sim: use fwnode-based GPIO hogs Bartosz Golaszewski
2026-03-05 12:59 ` Linus Walleij
2026-03-05 9:51 ` [PATCH 4/6] ARM: omap1: ams-delta: convert GPIO hogs to using firmware nodes Bartosz Golaszewski
2026-03-05 12:59 ` Linus Walleij
2026-03-06 0:44 ` Kevin Hilman
2026-03-05 9:51 ` [PATCH 5/6] gpio: remove machine hogs Bartosz Golaszewski
2026-03-05 13:00 ` Linus Walleij
2026-03-05 9:51 ` [PATCH 6/6] gpio: sim: allow to define the active-low setting of a simulated hog Bartosz Golaszewski
2026-03-05 13:01 ` Linus Walleij
2026-03-06 11:58 ` [PATCH 0/6] gpiolib: unify gpio-hog code Andy Shevchenko
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox