gpio: make gpio_chip_guard accept const gpio_desc
PATCH 1/1 gpio: make gpio_chip_guard accept const gpio_desc
Make gpio_chip_guard accept a const struct gpio_desc pointer, allowing gpiod_get_raw_value_commit() and gpiod_to_irq() to use the helper instead of open-coding SRCU-protected chip lookups.
This removes duplicated code and eliminates the FIXME comments about gpio_chip_guard being unusable with const descriptors.
--- drivers/gpio/gpiolib.c | 28 ++++++++-------------------- drivers/gpio/gpiolib.h | 2 +- 2 files changed, 9 insertions(+), 21 deletions(-)
drivers/gpio/gpiolib.c +8 -20
@@ -3406,20 +3406,13 @@ static int gpio_chip_get_value(struct gpio_chip *gc, const struct gpio_desc *desstatic int gpiod_get_raw_value_commit (const struct gpio_desc *desc) { -struct gpio_device *gdev; -struct gpio_chip *gc;int value; -/* FIXME Unable to use gpio_chip_guard due to const desc. */ - gdev = desc->gdev; - -guard (srcu)(&gdev->srcu); - - gc =srcu_dereference (gdev->chip, &gdev->srcu); -if (!gc) +CLASS (gpio_chip_guard, guard)(desc); +if (!guard.gc)return -ENODEV ; - value =gpio_chip_get_value (gc, desc); + value =gpio_chip_get_value (guard.gc, desc); value = value <0 ? value : !!value;trace_gpio_value (desc_to_gpio (desc),1 , value);return value;
@@ -4126,8 +4119,6 @@ EXPORT_SYMBOL_GPL(gpiod_is_shared);*/ int gpiod_to_irq (const struct gpio_desc *desc) { -struct gpio_device *gdev; -struct gpio_chip *gc;int offset;int ret;
@@ -4135,16 +4126,13 @@ int gpiod_to_irq(const struct gpio_desc *desc)if (ret <=0 )return -EINVAL ; - gdev = desc->gdev; -/* FIXME Cannot use gpio_chip_guard due to const desc. */ -guard (srcu)(&gdev->srcu); - gc =srcu_dereference (gdev->chip, &gdev->srcu); -if (!gc) +CLASS (gpio_chip_guard, guard)(desc); +if (!guard.gc)return -ENODEV ; offset =gpiod_hwgpio (desc); -if (gc->to_irq) { - ret = gc->to_irq (gc, offset); +if (guard.gc->to_irq) { + ret = guard.gc->to_irq (guard.gc, offset);if (ret)return ret;
@@ -4152,7 +4140,7 @@ int gpiod_to_irq(const struct gpio_desc *desc)return -ENXIO ; }#ifdef CONFIG_GPIOLIB_IRQCHIP -if (gc->irq.chip) { +if (guard.gc->irq.chip) {/* * Avoid race condition with other code, which tries to lookup * an IRQ before the irqchip has been properly registered,
drivers/gpio/gpiolib.h +1 -1
@@ -244,7 +244,7 @@ DEFINE_CLASS(gpio_chip_guard, _guard; }), - struct gpio_desc *desc) + const struct gpio_desc *desc)int gpiod_request (struct gpio_desc *desc,const char *label);int gpiod_request_commit (struct gpio_desc *desc,const char *label);
Signature · 1 line
2.34.1
Bartosz Golaszewski
maintainerQuoted 9 lines · Archit More
Make
gpio_chip_guardaccept a const structgpio_descpointer, allowinggpiod_get_raw_value_commit()andgpiod_to_irq()to use the helper instead of open-coding SRCU-protected chip lookups.This removes duplicated code and eliminates the FIXME comments about
gpio_chip_guardbeing unusable with const descriptors.Signed-off-by Archit More <[email protected]>---
This was already done in commit aa7e8b7ef031 ("gpio: core: fix const-correctness of gpio_chip_guard"). Please always base your work on top of current linux-next.
Bart