From: Alexandre Courbot <acourbot@nvidia.com>
To: Linus Walleij <linus.walleij@linaro.org>,
Arnd Bergmann <arnd@arndb.de>,
Grant Likely <grant.likely@linaro.org>,
Thierry Reding <thierry.reding@gmail.com>,
Stephen Warren <swarren@wwwdotorg.org>
Cc: gnurou@gmail.com, linux-gpio@vger.kernel.org,
linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-arch@vger.kernel.org, devicetree@vger.kernel.org,
Alexandre Courbot <acourbot@nvidia.com>
Subject: [RFC 1/5] gpiolib: factorize gpiod_get/set functions
Date: Wed, 4 Sep 2013 20:29:25 +0900 [thread overview]
Message-ID: <1378294169-22661-2-git-send-email-acourbot@nvidia.com> (raw)
In-Reply-To: <1378294169-22661-1-git-send-email-acourbot@nvidia.com>
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: Alexandre Courbot <acourbot@nvidia.com>
---
drivers/gpio/gpiolib.c | 72 +++++++++++++++++++++++---------------------------
1 file changed, 33 insertions(+), 39 deletions(-)
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index ff0fd65..6608bb8 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -1826,6 +1826,19 @@ EXPORT_SYMBOL_GPL(gpio_set_debounce);
* 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: gpio whose value will be returned
@@ -1837,19 +1850,11 @@ EXPORT_SYMBOL_GPL(gpio_set_debounce);
*/
static int gpiod_get_value(const struct gpio_desc *desc)
{
- struct gpio_chip *chip;
- int value;
- int offset;
-
if (!desc)
return 0;
- chip = desc->chip;
- offset = gpio_chip_hwgpio(desc);
/* Should be using gpio_get_value_cansleep() */
- WARN_ON(chip->can_sleep);
- value = chip->get ? chip->get(chip, offset) : 0;
- trace_gpio_value(desc_to_gpio(desc), 1, value);
- return value;
+ WARN_ON(desc->chip->can_sleep);
+ return _gpiod_get_value(desc);
}
int __gpio_get_value(unsigned gpio)
@@ -1912,6 +1917,20 @@ static void _gpio_set_open_source_value(struct gpio_desc *desc, int value)
__func__, desc_to_gpio(desc), 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: gpio whose value will be assigned
@@ -1923,20 +1942,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)
{
- struct gpio_chip *chip;
if (!desc)
return;
- chip = desc->chip;
/* Should be using gpio_set_value_cansleep() */
- WARN_ON(chip->can_sleep);
- 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);
+ WARN_ON(desc->chip->can_sleep);
+ _gpiod_set_value(desc, value);
}
void __gpio_set_value(unsigned gpio, int value)
@@ -2001,18 +2012,10 @@ EXPORT_SYMBOL_GPL(__gpio_to_irq);
static int gpiod_get_value_cansleep(const struct gpio_desc *desc)
{
- struct gpio_chip *chip;
- int value;
- int offset;
-
might_sleep_if(extra_checks);
if (!desc)
return 0;
- 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;
+ return _gpiod_get_value(desc);
}
int gpio_get_value_cansleep(unsigned gpio)
@@ -2023,19 +2026,10 @@ EXPORT_SYMBOL_GPL(gpio_get_value_cansleep);
static void gpiod_set_value_cansleep(struct gpio_desc *desc, int value)
{
- struct gpio_chip *chip;
-
might_sleep_if(extra_checks);
if (!desc)
return;
- 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);
+ _gpiod_set_value(desc, value);
}
void gpio_set_value_cansleep(unsigned gpio, int value)
--
1.8.4
next prev parent reply other threads:[~2013-09-04 11:29 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-04 11:29 [RFC 0/5] New descriptor-based GPIO interface Alexandre Courbot
2013-09-04 11:29 ` Alexandre Courbot [this message]
2013-09-04 11:29 ` [RFC 1/5] gpiolib: factorize gpiod_get/set functions Alexandre Courbot
2013-09-20 8:36 ` Linus Walleij
2013-09-21 12:39 ` Alexandre Courbot
2013-09-21 12:39 ` Alexandre Courbot
2013-09-04 11:29 ` [RFC 2/5] gpiolib: export descriptor-based GPIO interface Alexandre Courbot
2013-09-04 11:29 ` Alexandre Courbot
2013-09-04 19:58 ` Stephen Warren
2013-09-04 19:58 ` Stephen Warren
2013-09-05 3:45 ` Alexandre Courbot
2013-09-04 11:29 ` [RFC 3/5] gpiolib: port of_ functions to use gpiod Alexandre Courbot
2013-09-04 11:29 ` Alexandre Courbot
2013-09-04 11:29 ` [RFC 4/5] gpiolib: add gpiod_get() and gpiod_put() functions Alexandre Courbot
2013-09-04 11:29 ` Alexandre Courbot
2013-09-04 19:56 ` Stephen Warren
2013-09-04 19:56 ` Stephen Warren
2013-09-05 3:44 ` Alexandre Courbot
2013-09-05 3:44 ` Alexandre Courbot
2013-09-11 13:57 ` Thierry Reding
[not found] ` <52279082.5010105-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2013-09-20 18:40 ` Linus Walleij
2013-09-20 18:40 ` Linus Walleij
[not found] ` <CACRpkdY70r8mL8PSDmexr+_0Ddi-Y8x0RaDF-WWucZM9V8n=yw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-09-23 9:31 ` Mika Westerberg
2013-09-23 9:31 ` Mika Westerberg
2013-09-04 11:29 ` [RFC 5/5] gpiolib: update documentation Alexandre Courbot
2013-09-04 11:29 ` Alexandre Courbot
2013-09-20 17:59 ` Linus Walleij
2013-09-20 17:59 ` Linus Walleij
2013-09-20 8:28 ` [RFC 0/5] New descriptor-based GPIO interface Linus Walleij
2013-09-20 8:28 ` Linus Walleij
2013-09-20 18:06 ` Linus Walleij
2013-09-20 18:06 ` Linus Walleij
2013-09-20 19:32 ` Thierry Reding
2013-09-20 19:32 ` Thierry Reding
2013-09-20 21:23 ` Linus Walleij
[not found] ` <CACRpkdbFhORYnAUf+BMXtL1LezL7gPJ6gKQnqwvKZjqqCt3A4Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-09-21 12:32 ` Alexandre Courbot
2013-09-21 12:32 ` Alexandre Courbot
[not found] ` <CACRpkdYjkDf7c9VxfDTHtFx_upWWRAK8vpXTkrkrRsMjErq1dQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-09-23 10:21 ` Mika Westerberg
2013-09-23 10:21 ` Mika Westerberg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1378294169-22661-2-git-send-email-acourbot@nvidia.com \
--to=acourbot@nvidia.com \
--cc=arnd@arndb.de \
--cc=devicetree@vger.kernel.org \
--cc=gnurou@gmail.com \
--cc=grant.likely@linaro.org \
--cc=linus.walleij@linaro.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=swarren@wwwdotorg.org \
--cc=thierry.reding@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).