Commit d8e0ac08 authored by Alexandre Courbot's avatar Alexandre Courbot Committed by Linus Walleij

gpiolib: factorize gpiod_get/set functions

gpiod_get/set functions share common code between their regular and
cansleep variants. The exporting of the gpiod interface will make
the situation worse. This patch factorizes the common code to avoid code
redundancy.
Signed-off-by: default avatarAlexandre Courbot <acourbot@nvidia.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent b5927854
...@@ -1869,6 +1869,19 @@ EXPORT_SYMBOL_GPL(gpio_set_debounce); ...@@ -1869,6 +1869,19 @@ EXPORT_SYMBOL_GPL(gpio_set_debounce);
* that the GPIO was actually requested. * that the GPIO was actually requested.
*/ */
static int _gpiod_get_value(const struct gpio_desc *desc)
{
struct gpio_chip *chip;
int value;
int offset;
chip = desc->chip;
offset = gpio_chip_hwgpio(desc);
value = chip->get ? chip->get(chip, offset) : 0;
trace_gpio_value(desc_to_gpio(desc), 1, value);
return value;
}
/** /**
* __gpio_get_value() - return a gpio's value * __gpio_get_value() - return a gpio's value
* @gpio: gpio whose value will be returned * @gpio: gpio whose value will be returned
...@@ -1880,19 +1893,11 @@ EXPORT_SYMBOL_GPL(gpio_set_debounce); ...@@ -1880,19 +1893,11 @@ EXPORT_SYMBOL_GPL(gpio_set_debounce);
*/ */
static int gpiod_get_value(const struct gpio_desc *desc) static int gpiod_get_value(const struct gpio_desc *desc)
{ {
struct gpio_chip *chip;
int value;
int offset;
if (!desc) if (!desc)
return 0; return 0;
chip = desc->chip;
offset = gpio_chip_hwgpio(desc);
/* Should be using gpio_get_value_cansleep() */ /* Should be using gpio_get_value_cansleep() */
WARN_ON(chip->can_sleep); WARN_ON(desc->chip->can_sleep);
value = chip->get ? chip->get(chip, offset) : 0; return _gpiod_get_value(desc);
trace_gpio_value(desc_to_gpio(desc), 1, value);
return value;
} }
int __gpio_get_value(unsigned gpio) int __gpio_get_value(unsigned gpio)
...@@ -1957,6 +1962,20 @@ static void _gpio_set_open_source_value(struct gpio_desc *desc, int value) ...@@ -1957,6 +1962,20 @@ static void _gpio_set_open_source_value(struct gpio_desc *desc, int value)
__func__, err); __func__, err);
} }
static void _gpiod_set_value(struct gpio_desc *desc, int value)
{
struct gpio_chip *chip;
chip = desc->chip;
trace_gpio_value(desc_to_gpio(desc), 0, value);
if (test_bit(FLAG_OPEN_DRAIN, &desc->flags))
_gpio_set_open_drain_value(desc, value);
else if (test_bit(FLAG_OPEN_SOURCE, &desc->flags))
_gpio_set_open_source_value(desc, value);
else
chip->set(chip, gpio_chip_hwgpio(desc), value);
}
/** /**
* __gpio_set_value() - assign a gpio's value * __gpio_set_value() - assign a gpio's value
* @gpio: gpio whose value will be assigned * @gpio: gpio whose value will be assigned
...@@ -1968,20 +1987,12 @@ static void _gpio_set_open_source_value(struct gpio_desc *desc, int value) ...@@ -1968,20 +1987,12 @@ static void _gpio_set_open_source_value(struct gpio_desc *desc, int value)
*/ */
static void gpiod_set_value(struct gpio_desc *desc, int value) static void gpiod_set_value(struct gpio_desc *desc, int value)
{ {
struct gpio_chip *chip;
if (!desc) if (!desc)
return; return;
chip = desc->chip;
/* Should be using gpio_set_value_cansleep() */ /* Should be using gpio_set_value_cansleep() */
WARN_ON(chip->can_sleep); WARN_ON(desc->chip->can_sleep);
trace_gpio_value(desc_to_gpio(desc), 0, value); _gpiod_set_value(desc, value);
if (test_bit(FLAG_OPEN_DRAIN, &desc->flags))
_gpio_set_open_drain_value(desc, value);
else if (test_bit(FLAG_OPEN_SOURCE, &desc->flags))
_gpio_set_open_source_value(desc, value);
else
chip->set(chip, gpio_chip_hwgpio(desc), value);
} }
void __gpio_set_value(unsigned gpio, int value) void __gpio_set_value(unsigned gpio, int value)
...@@ -2046,18 +2057,10 @@ EXPORT_SYMBOL_GPL(__gpio_to_irq); ...@@ -2046,18 +2057,10 @@ EXPORT_SYMBOL_GPL(__gpio_to_irq);
static int gpiod_get_value_cansleep(const struct gpio_desc *desc) static int gpiod_get_value_cansleep(const struct gpio_desc *desc)
{ {
struct gpio_chip *chip;
int value;
int offset;
might_sleep_if(extra_checks); might_sleep_if(extra_checks);
if (!desc) if (!desc)
return 0; return 0;
chip = desc->chip; return _gpiod_get_value(desc);
offset = gpio_chip_hwgpio(desc);
value = chip->get ? chip->get(chip, offset) : 0;
trace_gpio_value(desc_to_gpio(desc), 1, value);
return value;
} }
int gpio_get_value_cansleep(unsigned gpio) int gpio_get_value_cansleep(unsigned gpio)
...@@ -2068,19 +2071,10 @@ EXPORT_SYMBOL_GPL(gpio_get_value_cansleep); ...@@ -2068,19 +2071,10 @@ EXPORT_SYMBOL_GPL(gpio_get_value_cansleep);
static void gpiod_set_value_cansleep(struct gpio_desc *desc, int value) static void gpiod_set_value_cansleep(struct gpio_desc *desc, int value)
{ {
struct gpio_chip *chip;
might_sleep_if(extra_checks); might_sleep_if(extra_checks);
if (!desc) if (!desc)
return; return;
chip = desc->chip; _gpiod_set_value(desc, value);
trace_gpio_value(desc_to_gpio(desc), 0, value);
if (test_bit(FLAG_OPEN_DRAIN, &desc->flags))
_gpio_set_open_drain_value(desc, value);
else if (test_bit(FLAG_OPEN_SOURCE, &desc->flags))
_gpio_set_open_source_value(desc, value);
else
chip->set(chip, gpio_chip_hwgpio(desc), value);
} }
void gpio_set_value_cansleep(unsigned gpio, int value) void gpio_set_value_cansleep(unsigned gpio, int value)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment