aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl
diff options
context:
space:
mode:
authorLee Jones <lee.jones@linaro.org>2013-01-31 04:45:17 -0500
committerLinus Walleij <linus.walleij@linaro.org>2013-02-06 16:38:40 -0500
commitb9fab6e45d2d41de5495f7d40808e9e131652f92 (patch)
treed832b21acfd75e63982c6031e5b20998febf760a /drivers/pinctrl
parentfa1ec996ac1a42e46ec7dca089252f124c81d7bd (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.c6
-rw-r--r--drivers/pinctrl/pinctrl-ab8505.c10
-rw-r--r--drivers/pinctrl/pinctrl-ab8540.c4
-rw-r--r--drivers/pinctrl/pinctrl-ab9540.c8
-rw-r--r--drivers/pinctrl/pinctrl-abx500.c6
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 */
458struct abx500_gpio_irq_cluster ab8500_gpio_irq_cluster[] = { 458struct 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
464static struct abx500_pinctrl_soc_data ab8500_soc = { 464static 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 */
351struct abx500_gpio_irq_cluster ab8505_gpio_irq_cluster[] = { 351struct 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
359static struct abx500_pinctrl_soc_data ab8505_soc = { 359static 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 */
379struct abx500_gpio_irq_cluster ab8540_gpio_irq_cluster[] = { 379struct 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
384static struct abx500_pinctrl_soc_data ab8540_soc = { 384static 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
457struct abx500_gpio_irq_cluster ab9540_gpio_irq_cluster[] = { 457struct 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
464static struct abx500_pinctrl_soc_data ab9540_soc = { 464static 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)
272static int abx500_gpio_to_irq(struct gpio_chip *chip, unsigned offset) 272static 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;