GPIO: Add generic gpio_to_irq call.

From: Ben Dooks
Date: Thu Jul 24 2008 - 07:46:52 EST


Add gpio_to_irq() implementation allowing the
gpio_chip registration to also specify an function
to map GPIO offsets into IRQs.

Signed-off-by: Ben Dooks <ben-linux@xxxxxxxxx>

Index: linux-2.6.26-quilt3/drivers/gpio/gpiolib.c
===================================================================
--- linux-2.6.26-quilt3.orig/drivers/gpio/gpiolib.c 2008-07-18 13:50:32.000000000 +0100
+++ linux-2.6.26-quilt3/drivers/gpio/gpiolib.c 2008-07-22 15:20:26.000000000 +0100
@@ -339,6 +339,36 @@ const char *gpiochip_is_requested(struct
}
EXPORT_SYMBOL_GPL(gpiochip_is_requested);

+int __gpio_to_irq(unsigned gpio)
+{
+ struct gpio_chip *chip;
+ struct gpio_desc *desc = &gpio_desc[gpio];
+ unsigned long flags;
+ int status = -EINVAL;
+
+ spin_lock_irqsave(&gpio_lock, flags);
+
+ if (!gpio_is_valid(gpio))
+ goto fail;
+
+ chip = desc->chip;
+ if (!chip || !chip->to_irq)
+ goto fail;
+
+ gpio -= chip->base;
+ if (gpio >= chip->ngpio)
+ goto fail;
+
+ status = chip->to_irq(chip, gpio);
+
+ fail:
+ spin_unlock_irqrestore(&gpio_lock, flags);
+ if (status)
+ pr_debug("%s: gpio-%d status %d\n",
+ __func__, gpio, status);
+ return status;
+}
+EXPORT_SYMBOL_GPL(__gpio_to_irq);

/* Drivers MUST set GPIO direction before making get/set calls. In
* some cases this is done in early boot, before IRQs are enabled.
Index: linux-2.6.26-quilt3/include/asm-generic/gpio.h
===================================================================
--- linux-2.6.26-quilt3.orig/include/asm-generic/gpio.h 2008-07-18 13:50:32.000000000 +0100
+++ linux-2.6.26-quilt3/include/asm-generic/gpio.h 2008-07-22 15:21:05.000000000 +0100
@@ -40,6 +40,7 @@ struct module;
* @dbg_show: optional routine to show contents in debugfs; default code
* will be used when this is omitted, but custom code can show extra
* state (such as pullup/pulldown configuration).
+ * @to_irq: convert gpio offset to IRQ number.
* @base: identifies the first GPIO number handled by this chip; or, if
* negative during registration, requests dynamic ID allocation.
* @ngpio: the number of GPIOs handled by this controller; the last GPIO
@@ -71,6 +72,9 @@ struct gpio_chip {
unsigned offset, int value);
void (*dbg_show)(struct seq_file *s,
struct gpio_chip *chip);
+ int (*to_irq)(struct gpio_chip *chip,
+ unsigned offset);
+
int base;
u16 ngpio;
unsigned can_sleep:1;
@@ -97,6 +101,7 @@ extern int gpio_direction_output(unsigne
extern int gpio_get_value_cansleep(unsigned gpio);
extern void gpio_set_value_cansleep(unsigned gpio, int value);

+extern int __gpio_to_irq(unsigned gpio);

/* A platform's <asm/gpio.h> code may want to inline the I/O calls when
* the GPIO is constant and refers to some always-present controller,
Index: linux-2.6.26-quilt3/Documentation/gpio.txt
===================================================================
--- linux-2.6.26-quilt3.orig/Documentation/gpio.txt 2008-07-22 15:22:08.000000000 +0100
+++ linux-2.6.26-quilt3/Documentation/gpio.txt 2008-07-22 15:27:14.000000000 +0100
@@ -273,8 +273,9 @@ some GPIOs can't be used as IRQs.) It i
number that wasn't set up as an input using gpio_direction_input(), or
to use an IRQ number that didn't originally come from gpio_to_irq().

-These two mapping calls are expected to cost on the order of a single
-addition or subtraction. They're not allowed to sleep.
+These two mapping calls are expected to cost on between the order of a
+single addition or subtraction to obtaining an spinlock and using the
+to_irq method of the relevant gpio chip. They're not allowed to sleep.

Non-error values returned from gpio_to_irq() can be passed to request_irq()
or free_irq(). They will often be stored into IRQ resources for platform
@@ -400,6 +401,7 @@ They may also want to provide a custom v
Trivial implementations of those functions can directly use framework
code, which always dispatches through the gpio_chip:

+ #define gpio_to_irq __gpio_to_irq
#define gpio_get_value __gpio_get_value
#define gpio_set_value __gpio_set_value
#define gpio_cansleep __gpio_cansleep

--
Ben (ben@xxxxxxxxx, http://www.fluff.org/)

'a smiley only costs 4 bytes'
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/