diff options
author | Lee Jones <lee.jones@linaro.org> | 2013-01-31 04:45:17 -0500 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2013-02-06 16:38:40 -0500 |
commit | b9fab6e45d2d41de5495f7d40808e9e131652f92 (patch) | |
tree | d832b21acfd75e63982c6031e5b20998febf760a /drivers/pinctrl | |
parent | fa1ec996ac1a42e46ec7dca089252f124c81d7bd (diff) |
pinctrl/abx500: align GPIO cluster boundaries
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>
Diffstat (limited to 'drivers/pinctrl')
-rw-r--r-- | drivers/pinctrl/pinctrl-ab8500.c | 6 | ||||
-rw-r--r-- | drivers/pinctrl/pinctrl-ab8505.c | 10 | ||||
-rw-r--r-- | drivers/pinctrl/pinctrl-ab8540.c | 4 | ||||
-rw-r--r-- | drivers/pinctrl/pinctrl-ab9540.c | 8 | ||||
-rw-r--r-- | drivers/pinctrl/pinctrl-abx500.c | 6 |
5 files changed, 18 insertions, 16 deletions
diff --git a/drivers/pinctrl/pinctrl-ab8500.c b/drivers/pinctrl/pinctrl-ab8500.c index 2cd424e630e4..67dc9428bab2 100644 --- a/drivers/pinctrl/pinctrl-ab8500.c +++ b/drivers/pinctrl/pinctrl-ab8500.c | |||
@@ -456,9 +456,9 @@ struct alternate_functions ab8500_alternate_functions[AB8500_GPIO_MAX_NUMBER + 1 | |||
456 | * GPIO36 to GPIO41 | 456 | * GPIO36 to GPIO41 |
457 | */ | 457 | */ |
458 | struct abx500_gpio_irq_cluster ab8500_gpio_irq_cluster[] = { | 458 | struct abx500_gpio_irq_cluster ab8500_gpio_irq_cluster[] = { |
459 | GPIO_IRQ_CLUSTER(5, 12, 0), /* GPIO numbers start from 1 */ | 459 | GPIO_IRQ_CLUSTER(6, 13, 0), |
460 | GPIO_IRQ_CLUSTER(23, 24, 0), | 460 | GPIO_IRQ_CLUSTER(24, 25, 0), |
461 | GPIO_IRQ_CLUSTER(35, 40, 0), | 461 | GPIO_IRQ_CLUSTER(36, 41, 0), |
462 | }; | 462 | }; |
463 | 463 | ||
464 | static struct abx500_pinctrl_soc_data ab8500_soc = { | 464 | static struct abx500_pinctrl_soc_data ab8500_soc = { |
diff --git a/drivers/pinctrl/pinctrl-ab8505.c b/drivers/pinctrl/pinctrl-ab8505.c index 40dc3e107daf..825710afb2e1 100644 --- a/drivers/pinctrl/pinctrl-ab8505.c +++ b/drivers/pinctrl/pinctrl-ab8505.c | |||
@@ -349,11 +349,11 @@ struct alternate_functions ab8505_alternate_functions[AB8505_GPIO_MAX_NUMBER + 1 | |||
349 | * GPIO52 to GPIO53 | 349 | * GPIO52 to GPIO53 |
350 | */ | 350 | */ |
351 | struct abx500_gpio_irq_cluster ab8505_gpio_irq_cluster[] = { | 351 | struct abx500_gpio_irq_cluster ab8505_gpio_irq_cluster[] = { |
352 | GPIO_IRQ_CLUSTER(9, 10, 0), /* GPIO numbers start from 1 */ | 352 | GPIO_IRQ_CLUSTER(10, 11, 0), |
353 | GPIO_IRQ_CLUSTER(12, 12, 0), | 353 | GPIO_IRQ_CLUSTER(13, 13, 0), |
354 | GPIO_IRQ_CLUSTER(39, 40, 0), | 354 | GPIO_IRQ_CLUSTER(40, 41, 0), |
355 | GPIO_IRQ_CLUSTER(49, 49, 0), | 355 | GPIO_IRQ_CLUSTER(50, 50, 0), |
356 | GPIO_IRQ_CLUSTER(51, 52, 0), | 356 | GPIO_IRQ_CLUSTER(52, 53, 0), |
357 | }; | 357 | }; |
358 | 358 | ||
359 | static struct abx500_pinctrl_soc_data ab8505_soc = { | 359 | static struct abx500_pinctrl_soc_data ab8505_soc = { |
diff --git a/drivers/pinctrl/pinctrl-ab8540.c b/drivers/pinctrl/pinctrl-ab8540.c index e75310de7067..0fcd9431607c 100644 --- a/drivers/pinctrl/pinctrl-ab8540.c +++ b/drivers/pinctrl/pinctrl-ab8540.c | |||
@@ -377,8 +377,8 @@ static struct pullud ab8540_pullud = { | |||
377 | * GPIO51 to GPIO54 | 377 | * GPIO51 to GPIO54 |
378 | */ | 378 | */ |
379 | struct abx500_gpio_irq_cluster ab8540_gpio_irq_cluster[] = { | 379 | struct abx500_gpio_irq_cluster ab8540_gpio_irq_cluster[] = { |
380 | GPIO_IRQ_CLUSTER(42, 43, 2), /* GPIO numbers start from 1 */ | 380 | GPIO_IRQ_CLUSTER(43, 44, 2), |
381 | GPIO_IRQ_CLUSTER(50, 53, 0), | 381 | GPIO_IRQ_CLUSTER(51, 54, 0), |
382 | }; | 382 | }; |
383 | 383 | ||
384 | static struct abx500_pinctrl_soc_data ab8540_soc = { | 384 | static struct abx500_pinctrl_soc_data ab8540_soc = { |
diff --git a/drivers/pinctrl/pinctrl-ab9540.c b/drivers/pinctrl/pinctrl-ab9540.c index 31fec3e5dd52..28dfb2ee5531 100644 --- a/drivers/pinctrl/pinctrl-ab9540.c +++ b/drivers/pinctrl/pinctrl-ab9540.c | |||
@@ -455,10 +455,10 @@ struct alternate_functions ab9540alternate_functions[AB9540_GPIO_MAX_NUMBER + 1] | |||
455 | }; | 455 | }; |
456 | 456 | ||
457 | struct abx500_gpio_irq_cluster ab9540_gpio_irq_cluster[] = { | 457 | struct abx500_gpio_irq_cluster ab9540_gpio_irq_cluster[] = { |
458 | GPIO_IRQ_CLUSTER(9, 12, 0), /* GPIO numbers start from 1 */ | 458 | GPIO_IRQ_CLUSTER(10, 13, 0), |
459 | GPIO_IRQ_CLUSTER(23, 24, 0), | 459 | GPIO_IRQ_CLUSTER(24, 25, 0), |
460 | GPIO_IRQ_CLUSTER(39, 40, 0), | 460 | GPIO_IRQ_CLUSTER(40, 41, 0), |
461 | GPIO_IRQ_CLUSTER(49, 53, 0), | 461 | GPIO_IRQ_CLUSTER(50, 54, 0), |
462 | }; | 462 | }; |
463 | 463 | ||
464 | static struct abx500_pinctrl_soc_data ab9540_soc = { | 464 | static struct abx500_pinctrl_soc_data ab9540_soc = { |
diff --git a/drivers/pinctrl/pinctrl-abx500.c b/drivers/pinctrl/pinctrl-abx500.c index 9bdfcb97ef57..a9e720ffabfb 100644 --- a/drivers/pinctrl/pinctrl-abx500.c +++ b/drivers/pinctrl/pinctrl-abx500.c | |||
@@ -272,6 +272,8 @@ static int abx500_gpio_direction_input(struct gpio_chip *chip, unsigned offset) | |||
272 | static int abx500_gpio_to_irq(struct gpio_chip *chip, unsigned offset) | 272 | static int abx500_gpio_to_irq(struct gpio_chip *chip, unsigned offset) |
273 | { | 273 | { |
274 | struct abx500_pinctrl *pct = to_abx500_pinctrl(chip); | 274 | struct abx500_pinctrl *pct = to_abx500_pinctrl(chip); |
275 | /* The AB8500 GPIO numbers are off by one */ | ||
276 | int gpio = offset + 1; | ||
275 | int base = pct->irq_base; | 277 | int base = pct->irq_base; |
276 | int i; | 278 | int i; |
277 | 279 | ||
@@ -279,8 +281,8 @@ static int abx500_gpio_to_irq(struct gpio_chip *chip, unsigned offset) | |||
279 | struct abx500_gpio_irq_cluster *cluster = | 281 | struct abx500_gpio_irq_cluster *cluster = |
280 | &pct->irq_cluster[i]; | 282 | &pct->irq_cluster[i]; |
281 | 283 | ||
282 | if (offset >= cluster->start && offset <= cluster->end) | 284 | if (gpio >= cluster->start && gpio <= cluster->end) |
283 | return base + offset - cluster->start; | 285 | return base + gpio - cluster->start; |
284 | 286 | ||
285 | /* Advance by the number of gpios in this cluster */ | 287 | /* Advance by the number of gpios in this cluster */ |
286 | base += cluster->end + cluster->offset - cluster->start + 1; | 288 | base += cluster->end + cluster->offset - cluster->start + 1; |