summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHector Palacios <hector.palacios@digi.com>2009-07-23 10:50:00 +0200
committerHector Palacios <hector.palacios@digi.com>2009-07-27 09:44:14 +0200
commit1d70fd89675f41bb1ae3e8531156ea6a2a7fe08a (patch)
tree01c534d8a41b5e4aac9002770ab753f2c943a437
parent27ddbabc5a9c2831d608fdeae79a757ab8af5c87 (diff)
gpiolib: Added support for pull up/down resistor
Added support for pull up/down resistor in gpiolib and in s3c2443 gpio driver. A new function entry is now available in gpiolib to manage the pull up/down resistors from user space. Signed-off-by: Hector Palacios <hector.palacios@digi.com>
-rw-r--r--arch/arm/mach-s3c2410/include/mach/gpio.h1
-rw-r--r--arch/arm/mach-s3c2443/gpio.c6
-rw-r--r--drivers/gpio/gpiolib.c17
-rw-r--r--include/asm-generic/gpio.h4
4 files changed, 26 insertions, 2 deletions
diff --git a/arch/arm/mach-s3c2410/include/mach/gpio.h b/arch/arm/mach-s3c2410/include/mach/gpio.h
index f5886dc3fd00..77d345e1ff2b 100644
--- a/arch/arm/mach-s3c2410/include/mach/gpio.h
+++ b/arch/arm/mach-s3c2410/include/mach/gpio.h
@@ -15,6 +15,7 @@
#define gpio_set_value __gpio_set_value
#define gpio_cansleep __gpio_cansleep
#define gpio_to_irq __gpio_to_irq
+#define gpio_set_pullupdown __gpio_set_pullupdown
#include <asm-generic/gpio.h>
#include <mach/regs-gpio.h>
diff --git a/arch/arm/mach-s3c2443/gpio.c b/arch/arm/mach-s3c2443/gpio.c
index bf19b1d9e333..3dd170b28716 100644
--- a/arch/arm/mach-s3c2443/gpio.c
+++ b/arch/arm/mach-s3c2443/gpio.c
@@ -282,6 +282,11 @@ static int s3c2443_gpio_wakeup_conf(struct gpio_chip *chip, unsigned gpio, int e
return ret;
}
+static void s3c2443_set_pullupdown(struct gpio_chip *chip, unsigned gpio, int value)
+{
+ s3c2443_gpio_set_udp( s3c2410_gpio_num(chip, gpio), value);
+}
+
#define S3C2443_GPIO_PORT(name,num,start,obase, \
inmsk,outmsk,wakemsk) \
{ \
@@ -293,6 +298,7 @@ static int s3c2443_gpio_wakeup_conf(struct gpio_chip *chip, unsigned gpio, int e
.set = s3c2443_gpio_set, \
.to_irq = s3c2443_gpio_to_irq, \
.wakeup_configure = s3c2443_gpio_wakeup_conf, \
+ .pullupdown = s3c2443_set_pullupdown, \
.base = start, \
.ngpio = num, \
}, \
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 4e1b55ca3483..4ec50128aa50 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -50,7 +50,7 @@ struct gpio_desc {
#define FLAG_EXPORT 3 /* protected by sysfs_lock */
#define FLAG_SYSFS 4 /* exported via /sys/class/gpio/control */
#define FLAG_IS_WAKEUP 5
-
+
#ifdef CONFIG_DEBUG_FS
const char *label;
#endif
@@ -1153,7 +1153,6 @@ EXPORT_SYMBOL_GPL(__gpio_get_value);
void __gpio_set_value(unsigned gpio, int value)
{
struct gpio_chip *chip;
-
chip = gpio_to_chip(gpio);
WARN_ON(extra_checks && chip->can_sleep);
chip->set(chip, gpio - chip->base, value);
@@ -1197,7 +1196,21 @@ int __gpio_to_irq(unsigned gpio)
}
EXPORT_SYMBOL_GPL(__gpio_to_irq);
+/**
+ * __gpio_set_pullupdown() - set pull up/down resistor
+ * Context: any
+ *
+ * This is used, where available, to set the internal
+ * GPIO pull up/down resistor.
+ */
+void __gpio_set_pullupdown(unsigned gpio, int value)
+{
+ struct gpio_chip *chip;
+ chip = gpio_to_chip(gpio);
+ chip->pullupdown(chip, gpio - chip->base, value);
+}
+EXPORT_SYMBOL_GPL(__gpio_set_pullupdown);
/* There's no value in making it easy to inline GPIO calls that may sleep.
* Common examples include ones connected to I2C or SPI chips.
diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h
index ce95b44a93ca..ec42422c6036 100644
--- a/include/asm-generic/gpio.h
+++ b/include/asm-generic/gpio.h
@@ -88,6 +88,9 @@ struct gpio_chip {
int (*to_irq)(struct gpio_chip *chip,
unsigned offset);
+ void (*pullupdown)(struct gpio_chip *chip,
+ unsigned offset, int value);
+
int (*wakeup_configure)(struct gpio_chip *chip,
unsigned offset, int value);
@@ -132,6 +135,7 @@ extern void __gpio_set_value(unsigned gpio, int value);
extern int __gpio_cansleep(unsigned gpio);
extern int __gpio_to_irq(unsigned gpio);
+extern void __gpio_set_pullupdown(unsigned gpio, int value);
#ifdef CONFIG_GPIO_SYSFS