pinctrl/abx500: align GPIO cluster boundaries
authorLee Jones <lee.jones@linaro.org>
Thu, 31 Jan 2013 09:45:17 +0000 (09:45 +0000)
committerLinus Walleij <linus.walleij@linaro.org>
Wed, 6 Feb 2013 21:38:40 +0000 (22:38 +0100)
Not quite sure how this ever worked. In ab8500_gpio_to_irq() the
GPIO for conversion is passed through as the second argument. If
GPIO13, which is a valid GPIO for IRQ functionality, was received;
it would be rejected by the following guard:

    GPIO_IRQ_CLUSTER(5, 12, 0); /* GPIO numbers start from 1 */

    if (offset >= cluster->start && offset <= cluster->end)
        /* Valid GPIO for IRQ use */

Signed-off-by: Lee Jones <lee.jones@linaro.org>
[Augmented to account for off-by-one problem]
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/pinctrl-ab8500.c
drivers/pinctrl/pinctrl-ab8505.c
drivers/pinctrl/pinctrl-ab8540.c
drivers/pinctrl/pinctrl-ab9540.c
drivers/pinctrl/pinctrl-abx500.c

index 2cd424e630e46e29e6341b3ba9fb080014139ae2..67dc9428bab274a5eeae867e1f23a5f660cdf17d 100644 (file)
@@ -456,9 +456,9 @@ struct alternate_functions ab8500_alternate_functions[AB8500_GPIO_MAX_NUMBER + 1
  *     GPIO36 to GPIO41
  */
 struct abx500_gpio_irq_cluster ab8500_gpio_irq_cluster[] = {
-       GPIO_IRQ_CLUSTER(5, 12, 0), /* GPIO numbers start from 1 */
-       GPIO_IRQ_CLUSTER(23, 24, 0),
-       GPIO_IRQ_CLUSTER(35, 40, 0),
+       GPIO_IRQ_CLUSTER(6, 13, 0),
+       GPIO_IRQ_CLUSTER(24, 25, 0),
+       GPIO_IRQ_CLUSTER(36, 41, 0),
 };
 
 static struct abx500_pinctrl_soc_data ab8500_soc = {
index 40dc3e107daf70682fa6c3b25ac91735b997c2a5..825710afb2e120a7ab2d34b7874ed154f5d62c58 100644 (file)
@@ -349,11 +349,11 @@ struct alternate_functions ab8505_alternate_functions[AB8505_GPIO_MAX_NUMBER + 1
  *     GPIO52 to GPIO53
  */
 struct abx500_gpio_irq_cluster ab8505_gpio_irq_cluster[] = {
-       GPIO_IRQ_CLUSTER(9, 10, 0), /* GPIO numbers start from 1 */
-       GPIO_IRQ_CLUSTER(12, 12, 0),
-       GPIO_IRQ_CLUSTER(39, 40, 0),
-       GPIO_IRQ_CLUSTER(49, 49, 0),
-       GPIO_IRQ_CLUSTER(51, 52, 0),
+       GPIO_IRQ_CLUSTER(10, 11, 0),
+       GPIO_IRQ_CLUSTER(13, 13, 0),
+       GPIO_IRQ_CLUSTER(40, 41, 0),
+       GPIO_IRQ_CLUSTER(50, 50, 0),
+       GPIO_IRQ_CLUSTER(52, 53, 0),
 };
 
 static struct abx500_pinctrl_soc_data ab8505_soc = {
index e75310de70670f15596a71d24c5e0397f2f54d45..0fcd9431607c75e0a4e1e14830deaa6ea3874cd7 100644 (file)
@@ -377,8 +377,8 @@ static struct pullud ab8540_pullud = {
  *     GPIO51 to GPIO54
  */
 struct abx500_gpio_irq_cluster ab8540_gpio_irq_cluster[] = {
-       GPIO_IRQ_CLUSTER(42, 43, 2), /* GPIO numbers start from 1 */
-       GPIO_IRQ_CLUSTER(50, 53, 0),
+       GPIO_IRQ_CLUSTER(43, 44, 2),
+       GPIO_IRQ_CLUSTER(51, 54, 0),
 };
 
 static struct abx500_pinctrl_soc_data ab8540_soc = {
index 31fec3e5dd52990585aac17c4877b9ce7ed3264d..28dfb2ee55310858b673721ed00e618f8fbd0088 100644 (file)
@@ -455,10 +455,10 @@ struct alternate_functions ab9540alternate_functions[AB9540_GPIO_MAX_NUMBER + 1]
 };
 
 struct abx500_gpio_irq_cluster ab9540_gpio_irq_cluster[] = {
-       GPIO_IRQ_CLUSTER(9, 12, 0), /* GPIO numbers start from 1 */
-       GPIO_IRQ_CLUSTER(23, 24, 0),
-       GPIO_IRQ_CLUSTER(39, 40, 0),
-       GPIO_IRQ_CLUSTER(49, 53, 0),
+       GPIO_IRQ_CLUSTER(10, 13, 0),
+       GPIO_IRQ_CLUSTER(24, 25, 0),
+       GPIO_IRQ_CLUSTER(40, 41, 0),
+       GPIO_IRQ_CLUSTER(50, 54, 0),
 };
 
 static struct abx500_pinctrl_soc_data ab9540_soc = {
index 9bdfcb97ef57b8925becf34f58411268c0574e43..a9e720ffabfbb9de8fde2f10b57fd80071c70c7b 100644 (file)
@@ -272,6 +272,8 @@ static int abx500_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
 static int abx500_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
 {
        struct abx500_pinctrl *pct = to_abx500_pinctrl(chip);
+       /* The AB8500 GPIO numbers are off by one */
+       int gpio = offset + 1;
        int base = pct->irq_base;
        int i;
 
@@ -279,8 +281,8 @@ static int abx500_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
                struct abx500_gpio_irq_cluster *cluster =
                        &pct->irq_cluster[i];
 
-               if (offset >= cluster->start && offset <= cluster->end)
-                       return base + offset - cluster->start;
+               if (gpio >= cluster->start && gpio <= cluster->end)
+                       return base + gpio - cluster->start;
 
                /* Advance by the number of gpios in this cluster */
                base += cluster->end + cluster->offset - cluster->start + 1;