summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/spc300-device-gpio.c13
-rw-r--r--cleopatre/linux-2.6.25.10-spc300/drivers/gpio/spc300_gpio.c38
-rw-r--r--cleopatre/linux-2.6.25.10-spc300/include/linux/gpio.h12
-rw-r--r--common/include/asm/arch/gpio.h2
4 files changed, 65 insertions, 0 deletions
diff --git a/cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/spc300-device-gpio.c b/cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/spc300-device-gpio.c
index a6b6c0f539..b416561219 100644
--- a/cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/spc300-device-gpio.c
+++ b/cleopatre/linux-2.6.25.10-spc300/arch/arm/mach-spc300/spc300-device-gpio.c
@@ -182,6 +182,19 @@ spc300_gpio_get_interrupt_polarity (void)
return GPIO_INT_POLARITY_VA;
}
+/** Configure debounce GPIO option.
+ * \param num gpio number
+ * \param val enable(1) or disable(0) debounce
+ */
+void
+spc300_gpio_set_debounce (int num, int debounce)
+{
+ if (debounce) /* enable debouncer */
+ GPIO_DEBOUNCE_VA |= (1 << num);
+ else /* disable debouncer */
+ GPIO_DEBOUNCE_VA &= ~(1 << num);
+}
+
/**
* Configure and activate a GPIO interrupt:
* - set level
diff --git a/cleopatre/linux-2.6.25.10-spc300/drivers/gpio/spc300_gpio.c b/cleopatre/linux-2.6.25.10-spc300/drivers/gpio/spc300_gpio.c
index 09daa626aa..c62ce485e2 100644
--- a/cleopatre/linux-2.6.25.10-spc300/drivers/gpio/spc300_gpio.c
+++ b/cleopatre/linux-2.6.25.10-spc300/drivers/gpio/spc300_gpio.c
@@ -147,6 +147,33 @@ ioctl_set_direction (struct spc300_gpio *gpio, struct gpio_direction *gd)
}
/**
+ * Enable/disable debounce gpio from ioctl.
+ *
+ * \param gpio spc300_gpio structure.
+ * \param gv gpio_value structure.
+ * \return error code.
+ */
+static int
+ioctl_set_debounce (struct spc300_gpio *gpio, struct gpio_debounce *gv)
+{
+ struct device *dev = &(gpio->pdev)->dev;
+
+ /* Check if gpio number is initialized */
+ if ((gpio->is_init >> gv->num) & 1)
+ {
+ /* Set gpio number value */
+ spc300_gpio_set_debounce (gv->num, gv->val);
+ return 0;
+ }
+ else
+ {
+ /* Gpio direction is not set */
+ dev_dbg (dev, "Set GPIO %d direction before\n", gv->num);
+ return -EFAULT;
+ }
+}
+
+/**
* Set gpio value from ioctl.
*
* \param gpio spc300_gpio structure.
@@ -512,6 +539,17 @@ spc300_gpio_ioctl (struct inode *inode, struct file *file, unsigned int cmd, uns
return 0;
+ case GPIOIOC_SETDEBOUNCE:
+ /* Get gpio number and it direction given by user */
+ if (copy_from_user (&info, argp, sizeof (info)))
+ return -EFAULT;
+
+ /* Set gpio number direction */
+ if (ioctl_set_debounce (gpio, &info.debounce))
+ return -EFAULT;
+
+ return 0;
+
case GPIOIOC_SETIT:
if (NULL == file)
return -EFAULT;
diff --git a/cleopatre/linux-2.6.25.10-spc300/include/linux/gpio.h b/cleopatre/linux-2.6.25.10-spc300/include/linux/gpio.h
index 48555054d3..d643f5f49a 100644
--- a/cleopatre/linux-2.6.25.10-spc300/include/linux/gpio.h
+++ b/cleopatre/linux-2.6.25.10-spc300/include/linux/gpio.h
@@ -20,17 +20,23 @@ struct gpio_interrupt
__u32 mask; /* interrupt mask */
__u8 enable; /* enable or disable interrupt */
};
+struct gpio_debounce {
+ __u8 num; /* gpio number */
+ __u8 val; /* debounce value */
+};
union gpio_info {
struct gpio_value gpioval;
struct gpio_direction gpiodir;
struct gpio_interrupt gpioit;
+ struct gpio_debounce debounce;
};
#define GPIOIOC_GETVALUE _IOR(GPIO_IOCTL_BASE, 0, struct gpio_value)
#define GPIOIOC_SETVALUE _IOWR(GPIO_IOCTL_BASE, 1, struct gpio_value)
#define GPIOIOC_SETDIRECTION _IOWR(GPIO_IOCTL_BASE, 2, struct gpio_direction)
#define GPIOIOC_SETIT _IOWR (GPIO_IOCTL_BASE, 3, struct gpio_interrupt)
+#define GPIOIOC_SETDEBOUNCE _IOWR(GPIO_IOCTL_BASE, 4, struct gpio_debounce)
@@ -89,6 +95,12 @@ static inline void gpio_set_value(unsigned gpio, int value)
WARN_ON(1);
}
+static inline void gpio_set_debounce(unsigned gpio, int value)
+{
+ /* GPIO can never have been requested or set as output */
+ WARN_ON(1);
+}
+
static inline int gpio_cansleep(unsigned gpio)
{
/* GPIO can never have been requested or set as {in,out}put */
diff --git a/common/include/asm/arch/gpio.h b/common/include/asm/arch/gpio.h
index 465dd41f0b..0dbf493fe2 100644
--- a/common/include/asm/arch/gpio.h
+++ b/common/include/asm/arch/gpio.h
@@ -52,6 +52,8 @@ extern int spc300_gpio_direction_input(struct gpio_chip *chip, unsigned offset);
extern int spc300_gpio_direction_output(struct gpio_chip *chip, unsigned offset, int value);
extern int spc300_gpio_get_value(struct gpio_chip *chip, unsigned offset);
extern void spc300_gpio_set_value(struct gpio_chip *chip, unsigned offset, int value);
+extern void
+spc300_gpio_set_debounce(int num, int val);
extern uint32_t
spc300_gpio_get_interrupt_enable (void);
extern void