Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757067AbYGXLwB (ORCPT ); Thu, 24 Jul 2008 07:52:01 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1756672AbYGXLvl (ORCPT ); Thu, 24 Jul 2008 07:51:41 -0400 Received: from aeryn.fluff.org.uk ([87.194.8.8]:64655 "EHLO kira.home.fluff.org" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1756736AbYGXLvk (ORCPT ); Thu, 24 Jul 2008 07:51:40 -0400 Date: Thu, 24 Jul 2008 12:51:39 +0100 From: Ben Dooks To: Ben Dooks Cc: linux-kernel@vger.kernel.org, david-b@pacbell.net Subject: Re: GPIO: Add generic gpio_to_irq call. Message-ID: <20080724115139.GC8301@fluff.org.uk> References: <20080724114627.574586848@fluff.org.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080724114627.574586848@fluff.org.uk> X-Disclaimer: These are my own opinions, so there! User-Agent: Mutt/1.5.18 (2008-05-17) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5108 Lines: 126 On Thu, Jul 24, 2008 at 12:46:27PM +0100, Ben Dooks wrote: > 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 > > 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); hmm, this should have a check for chip->to_irq being non-null before it. > + > + 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 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@fluff.org, 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@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ -- Ben (ben@fluff.org, 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@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/