aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorLee Jones <lee.jones@linaro.org>2013-01-31 04:57:52 -0500
committerLinus Walleij <linus.walleij@linaro.org>2013-02-10 09:44:33 -0500
commita6a16d274e734afa769a9651dfaf8315d404c116 (patch)
tree123e91e276d7b6b77f362cc1b59fb0fe78447bb5 /drivers
parentac652d7941f84c24cb27378aefbb4015f4c1da67 (diff)
pinctrl/abx500: replace IRQ offsets with table read-in values
The ABx500 GPIO controller used to provide a set of virtual contiguous IRQs for use by sub-devices, but they have been removed after a request from Mainline Maintainers. Now the AB8500 core driver deals with almost all IRQ related issues instead. The ABx500 GPIO driver is now only used to convert between GPIO and IRQ numbers which is actually quite difficult, as the ABx500 GPIO's associated IRQs are clustered together throughout the interrupt number space at irregular intervals. To solve this quandary, we have placed the read-in values into the existing cluster information table to use during conversion. Signed-off-by: Lee Jones <lee.jones@linaro.org> [Moved irq_base removal into this patch] Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/pinctrl/pinctrl-ab8500.c6
-rw-r--r--drivers/pinctrl/pinctrl-ab8505.c10
-rw-r--r--drivers/pinctrl/pinctrl-ab8540.c5
-rw-r--r--drivers/pinctrl/pinctrl-ab9540.c8
-rw-r--r--drivers/pinctrl/pinctrl-abx500.c18
-rw-r--r--drivers/pinctrl/pinctrl-abx500.h10
6 files changed, 32 insertions, 25 deletions
diff --git a/drivers/pinctrl/pinctrl-ab8500.c b/drivers/pinctrl/pinctrl-ab8500.c
index 67dc9428bab2..42675ee3de1d 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(6, 13, 0), 459 GPIO_IRQ_CLUSTER(6, 13, 34),
460 GPIO_IRQ_CLUSTER(24, 25, 0), 460 GPIO_IRQ_CLUSTER(24, 25, 24),
461 GPIO_IRQ_CLUSTER(36, 41, 0), 461 GPIO_IRQ_CLUSTER(36, 41, 14),
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 825710afb2e1..f8075c6c24f7 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(10, 11, 0), 352 GPIO_IRQ_CLUSTER(10, 11, 34),
353 GPIO_IRQ_CLUSTER(13, 13, 0), 353 GPIO_IRQ_CLUSTER(13, 13, 34),
354 GPIO_IRQ_CLUSTER(40, 41, 0), 354 GPIO_IRQ_CLUSTER(40, 41, 14),
355 GPIO_IRQ_CLUSTER(50, 50, 0), 355 GPIO_IRQ_CLUSTER(50, 50, 63),
356 GPIO_IRQ_CLUSTER(52, 53, 0), 356 GPIO_IRQ_CLUSTER(52, 53, 63),
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 0fcd9431607c..ac2e1352a5a2 100644
--- a/drivers/pinctrl/pinctrl-ab8540.c
+++ b/drivers/pinctrl/pinctrl-ab8540.c
@@ -377,8 +377,9 @@ 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(43, 44, 2), 380 GPIO_IRQ_CLUSTER(43, 43, 126),
381 GPIO_IRQ_CLUSTER(51, 54, 0), 381 GPIO_IRQ_CLUSTER(44, 44, 127),
382 GPIO_IRQ_CLUSTER(51, 54, 63),
382}; 383};
383 384
384static struct abx500_pinctrl_soc_data ab8540_soc = { 385static struct abx500_pinctrl_soc_data ab8540_soc = {
diff --git a/drivers/pinctrl/pinctrl-ab9540.c b/drivers/pinctrl/pinctrl-ab9540.c
index 28dfb2ee5531..a169e5bea172 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(10, 13, 0), 458 GPIO_IRQ_CLUSTER(10, 13, 34),
459 GPIO_IRQ_CLUSTER(24, 25, 0), 459 GPIO_IRQ_CLUSTER(24, 25, 24),
460 GPIO_IRQ_CLUSTER(40, 41, 0), 460 GPIO_IRQ_CLUSTER(40, 41, 14),
461 GPIO_IRQ_CLUSTER(50, 54, 0), 461 GPIO_IRQ_CLUSTER(50, 54, 63),
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 b8f6c7597d53..720e77998e64 100644
--- a/drivers/pinctrl/pinctrl-abx500.c
+++ b/drivers/pinctrl/pinctrl-abx500.c
@@ -100,7 +100,6 @@ struct abx500_pinctrl {
100 struct gpio_chip chip; 100 struct gpio_chip chip;
101 struct ab8500 *parent; 101 struct ab8500 *parent;
102 struct mutex lock; 102 struct mutex lock;
103 u32 irq_base;
104 struct abx500_gpio_irq_cluster *irq_cluster; 103 struct abx500_gpio_irq_cluster *irq_cluster;
105 int irq_cluster_size; 104 int irq_cluster_size;
106}; 105};
@@ -262,18 +261,24 @@ static int abx500_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
262 struct abx500_pinctrl *pct = to_abx500_pinctrl(chip); 261 struct abx500_pinctrl *pct = to_abx500_pinctrl(chip);
263 /* The AB8500 GPIO numbers are off by one */ 262 /* The AB8500 GPIO numbers are off by one */
264 int gpio = offset + 1; 263 int gpio = offset + 1;
265 int base = pct->irq_base; 264 int hwirq;
266 int i; 265 int i;
267 266
268 for (i = 0; i < pct->irq_cluster_size; i++) { 267 for (i = 0; i < pct->irq_cluster_size; i++) {
269 struct abx500_gpio_irq_cluster *cluster = 268 struct abx500_gpio_irq_cluster *cluster =
270 &pct->irq_cluster[i]; 269 &pct->irq_cluster[i];
271 270
272 if (gpio >= cluster->start && gpio <= cluster->end) 271 if (gpio >= cluster->start && gpio <= cluster->end) {
273 return base + gpio - cluster->start; 272 /*
273 * The ABx500 GPIO's associated IRQs are clustered together
274 * throughout the interrupt numbers at irregular intervals.
275 * To solve this quandry, we have placed the read-in values
276 * into the cluster information table.
277 */
278 hwirq = gpio + cluster->to_irq;
274 279
275 /* Advance by the number of gpios in this cluster */ 280 return irq_create_mapping(pct->parent->domain, hwirq);
276 base += cluster->end + cluster->offset - cluster->start + 1; 281 }
277 } 282 }
278 283
279 return -EINVAL; 284 return -EINVAL;
@@ -876,7 +881,6 @@ static int abx500_gpio_probe(struct platform_device *pdev)
876 pct->chip = abx500gpio_chip; 881 pct->chip = abx500gpio_chip;
877 pct->chip.dev = &pdev->dev; 882 pct->chip.dev = &pdev->dev;
878 pct->chip.base = pdata->gpio_base; 883 pct->chip.base = pdata->gpio_base;
879 pct->irq_base = pdata->irq_base;
880 pct->chip.base = (np) ? -1 : pdata->gpio_base; 884 pct->chip.base = (np) ? -1 : pdata->gpio_base;
881 885
882 /* initialize the lock */ 886 /* initialize the lock */
diff --git a/drivers/pinctrl/pinctrl-abx500.h b/drivers/pinctrl/pinctrl-abx500.h
index df8e0ff0c5d5..eeca8f973999 100644
--- a/drivers/pinctrl/pinctrl-abx500.h
+++ b/drivers/pinctrl/pinctrl-abx500.h
@@ -98,7 +98,7 @@ struct pullud {
98{ \ 98{ \
99 .start = a, \ 99 .start = a, \
100 .end = b, \ 100 .end = b, \
101 .offset = c, \ 101 .to_irq = c, \
102} 102}
103 103
104/** 104/**
@@ -106,14 +106,16 @@ struct pullud {
106 * capable 106 * capable
107 * @start: The pin number of the first pin interrupt capable 107 * @start: The pin number of the first pin interrupt capable
108 * @end: The pin number of the last pin interrupt capable 108 * @end: The pin number of the last pin interrupt capable
109 * @offset: offset used to compute specific setting strategy of 109 * @to_irq: The ABx500 GPIO's associated IRQs are clustered
110 * the interrupt line 110 * together throughout the interrupt numbers at irregular
111 * intervals. To solve this quandary, we will place the
112 * read-in values into the cluster information table
111 */ 113 */
112 114
113struct abx500_gpio_irq_cluster { 115struct abx500_gpio_irq_cluster {
114 int start; 116 int start;
115 int end; 117 int end;
116 int offset; 118 int to_irq;
117}; 119};
118 120
119/** 121/**