All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alek Du <alek.du@intel.com>
To: Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: [PATCH] gpiolib: Add gpio_detect, gpio_debounce and gpio_alt_func features to GPIOLIB
Date: Mon, 15 Jun 2009 17:15:02 +0800	[thread overview]
Message-ID: <20090615171502.2a981bf5@dxy.sh.intel.com> (raw)

>From 7a76916ccea4a376a260ea67fbc79ac4d958757f Mon Sep 17 00:00:00 2001
From: Alek Du <alek.du@intel.com>
Date: Fri, 8 May 2009 09:46:49 +0800
Subject: [PATCH] gpiolib: Add gpio_detect, gpio_debounce and gpio_alt_func features to GPIOLIB

Add some more functions to GPIOLIB, they are:
* gpio_detect is to set GPIO interrupt triggering method (edge, level, high,
  low, etc.)
* gpio_debounce is to set GPIO trigger HW debounce value if GPIO hw supports.
* gpio_alt_func is to set pin as alternative function or GPIO.

We will submit GPIO drivers that leverage this new interface later.

Signed-off-by: Alek Du <alek.du@intel.com>
---
 drivers/gpio/gpiolib.c     |   33 +++++++++++++++++++++++++++++++++
 include/asm-generic/gpio.h |   25 ++++++++++++++++++++++++-
 include/linux/gpio.h       |   15 +++++++++++++++
 3 files changed, 72 insertions(+), 1 deletions(-)

diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 51a8d41..087efce 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -1066,6 +1066,39 @@ void __gpio_set_value(unsigned gpio, int value)
 }
 EXPORT_SYMBOL_GPL(__gpio_set_value);
 
+void gpio_detect(unsigned gpio, enum gpio_trigger_t value)
+{
+	struct gpio_chip	*chip;
+
+	chip = gpio_to_chip(gpio);
+	WARN_ON(extra_checks && chip->can_sleep);
+	if (chip->detect)
+		chip->detect(chip, gpio - chip->base, value);
+}
+EXPORT_SYMBOL_GPL(gpio_detect);
+
+void gpio_debounce(unsigned gpio, int value)
+{
+	struct gpio_chip	*chip;
+
+	chip = gpio_to_chip(gpio);
+	WARN_ON(extra_checks && chip->can_sleep);
+	if (chip->debounce)
+		chip->debounce(chip, gpio - chip->base, value);
+}
+EXPORT_SYMBOL_GPL(gpio_debounce);
+
+void gpio_alt_func(unsigned gpio, int value)
+{
+	struct gpio_chip	*chip;
+
+	chip = gpio_to_chip(gpio);
+	WARN_ON(extra_checks && chip->can_sleep);
+	if (chip->alt_func)
+		chip->alt_func(chip, gpio - chip->base, value);
+}
+EXPORT_SYMBOL_GPL(gpio_alt_func);
+
 /**
  * __gpio_cansleep() - report whether gpio value access will sleep
  * @gpio: gpio in question
diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h
index d6c379d..de9aaf9 100644
--- a/include/asm-generic/gpio.h
+++ b/include/asm-generic/gpio.h
@@ -30,6 +30,15 @@ static inline int gpio_is_valid(int number)
 struct seq_file;
 struct module;
 
+enum gpio_trigger_t {
+	DETECT_LEVEL_LOW = -2,
+	DETECT_EDGE_FALLING = -1,
+	DETECT_DISABLE = 0,
+	DETECT_EDGE_RISING = 1,
+	DETECT_LEVEL_HIGH = 2,
+	DETECT_EDGE_BOTH = 3,
+};
+
 /**
  * struct gpio_chip - abstract a GPIO controller
  * @label: for diagnostics
@@ -44,6 +53,9 @@ struct module;
  *	returns either the value actually sensed, or zero
  * @direction_output: configures signal "offset" as output, or returns error
  * @set: assigns output value for signal "offset"
+ * @detect: configures signal interrupt detection method, see gpio_trigger_t
+ * @debounce: configures signal interrupt detection debounce
+ * @alt_func: configure signal as GPIO or alternative function
  * @to_irq: optional hook supporting non-static gpio_to_irq() mappings;
  *	implementation may not sleep
  * @dbg_show: optional routine to show contents in debugfs; default code
@@ -89,6 +101,15 @@ struct gpio_chip {
 	void			(*set)(struct gpio_chip *chip,
 						unsigned offset, int value);
 
+	void			(*detect)(struct gpio_chip *chip,
+						unsigned offset,
+						enum gpio_trigger_t value);
+	void			(*debounce)(struct gpio_chip *chip,
+						unsigned offset,
+						int value);
+	void			(*alt_func)(struct gpio_chip *chip,
+						unsigned offset, int value);
+
 	int			(*to_irq)(struct gpio_chip *chip,
 						unsigned offset);
 
@@ -118,7 +139,9 @@ extern void gpio_free(unsigned gpio);
 
 extern int gpio_direction_input(unsigned gpio);
 extern int gpio_direction_output(unsigned gpio, int value);
-
+extern void gpio_detect(unsigned gpio, enum gpio_trigger_t value);
+extern void gpio_debounce(unsigned gpio, int value);
+extern void gpio_alt_func(unsigned gpio, int value);
 extern int gpio_get_value_cansleep(unsigned gpio);
 extern void gpio_set_value_cansleep(unsigned gpio, int value);
 
diff --git a/include/linux/gpio.h b/include/linux/gpio.h
index e10c49a..76dd5f9 100644
--- a/include/linux/gpio.h
+++ b/include/linux/gpio.h
@@ -82,6 +82,21 @@ static inline void gpio_set_value_cansleep(unsigned gpio, int value)
 	WARN_ON(1);
 }
 
+static inline void gpio_detect(unsigned gpio, int value)
+{
+	WARN_ON(1);
+}
+
+static inline void gpio_debounce(unsigned gpio, int value)
+{
+	WARN_ON(1);
+}
+
+static inline void gpio_alt_func(unsigned gpio, int value)
+{
+	WARN_ON(1);
+}
+
 static inline int gpio_export(unsigned gpio, bool direction_may_change)
 {
 	/* GPIO can never have been requested or set as {in,out}put */
-- 
1.6.0.4

             reply	other threads:[~2009-06-15  9:20 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-15  9:15 Alek Du [this message]
2009-06-15  9:50 ` [PATCH] gpiolib: Add gpio_detect, gpio_debounce and gpio_alt_func features to GPIOLIB Ben Dooks
2009-06-15 10:02   ` Mark Brown
2009-06-15 11:19     ` Alek Du
2009-06-15 12:56       ` Florian Fainelli
2009-06-15 12:50     ` Ben Dooks
2009-06-15 13:07       ` Mark Brown
2009-06-15 11:29   ` Alek Du
2009-06-15 12:51 ` Ben Dooks
2009-06-15 13:04   ` Florian Fainelli
2009-06-15 13:09     ` Ben Dooks
2009-06-16  1:28       ` Alek Du
2009-06-16  8:39         ` Ben Dooks
2009-06-17  6:59           ` [PATCH v2] gpiolib: Add " Alek Du
2009-06-17  9:36             ` Ben Nizette
2009-06-16  1:21     ` [PATCH] gpiolib: Add gpio_detect, " Alek Du
2009-06-16  8:45       ` Ben Dooks
2009-06-16  8:51         ` Alek Du
2009-06-16  9:02           ` Ben Dooks

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=20090615171502.2a981bf5@dxy.sh.intel.com \
    --to=alek.du@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.