summary refs log tree commit diff
path: root/drivers
diff options
context:
space:
mode:
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
  *	GPIO36 to GPIO41
  */
 struct abx500_gpio_irq_cluster ab8500_gpio_irq_cluster[] = {
-	GPIO_IRQ_CLUSTER(6, 13, 0),
-	GPIO_IRQ_CLUSTER(24, 25, 0),
-	GPIO_IRQ_CLUSTER(36, 41, 0),
+	GPIO_IRQ_CLUSTER(6,  13, 34),
+	GPIO_IRQ_CLUSTER(24, 25, 24),
+	GPIO_IRQ_CLUSTER(36, 41, 14),
 };
 
 static 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
  *	GPIO52 to GPIO53
  */
 struct abx500_gpio_irq_cluster ab8505_gpio_irq_cluster[] = {
-	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),
+	GPIO_IRQ_CLUSTER(10, 11, 34),
+	GPIO_IRQ_CLUSTER(13, 13, 34),
+	GPIO_IRQ_CLUSTER(40, 41, 14),
+	GPIO_IRQ_CLUSTER(50, 50, 63),
+	GPIO_IRQ_CLUSTER(52, 53, 63),
 };
 
 static 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 = {
  *	GPIO51 to GPIO54
  */
 struct abx500_gpio_irq_cluster ab8540_gpio_irq_cluster[] = {
-	GPIO_IRQ_CLUSTER(43, 44, 2),
-	GPIO_IRQ_CLUSTER(51, 54, 0),
+	GPIO_IRQ_CLUSTER(43, 43, 126),
+	GPIO_IRQ_CLUSTER(44, 44, 127),
+	GPIO_IRQ_CLUSTER(51, 54, 63),
 };
 
 static 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]
 };
 
 struct abx500_gpio_irq_cluster ab9540_gpio_irq_cluster[] = {
-	GPIO_IRQ_CLUSTER(10, 13, 0),
-	GPIO_IRQ_CLUSTER(24, 25, 0),
-	GPIO_IRQ_CLUSTER(40, 41, 0),
-	GPIO_IRQ_CLUSTER(50, 54, 0),
+	GPIO_IRQ_CLUSTER(10, 13, 34),
+	GPIO_IRQ_CLUSTER(24, 25, 24),
+	GPIO_IRQ_CLUSTER(40, 41, 14),
+	GPIO_IRQ_CLUSTER(50, 54, 63),
 };
 
 static 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 {
 	struct gpio_chip chip;
 	struct ab8500 *parent;
 	struct mutex lock;
-	u32 irq_base;
 	struct abx500_gpio_irq_cluster *irq_cluster;
 	int irq_cluster_size;
 };
@@ -262,18 +261,24 @@ 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 hwirq;
 	int i;
 
 	for (i = 0; i < pct->irq_cluster_size; i++) {
 		struct abx500_gpio_irq_cluster *cluster =
 			&pct->irq_cluster[i];
 
-		if (gpio >= cluster->start && gpio <= cluster->end)
-			return base + gpio - cluster->start;
+		if (gpio >= cluster->start && gpio <= cluster->end) {
+			/*
+			 * The ABx500 GPIO's associated IRQs are clustered together
+			 * throughout the interrupt numbers at irregular intervals.
+			 * To solve this quandry, we have placed the read-in values
+			 * into the cluster information table.
+			 */
+			hwirq = gpio + cluster->to_irq;
 
-		/* Advance by the number of gpios in this cluster */
-		base += cluster->end + cluster->offset - cluster->start + 1;
+			return irq_create_mapping(pct->parent->domain, hwirq);
+		}
 	}
 
 	return -EINVAL;
@@ -876,7 +881,6 @@ static int abx500_gpio_probe(struct platform_device *pdev)
 	pct->chip = abx500gpio_chip;
 	pct->chip.dev = &pdev->dev;
 	pct->chip.base = pdata->gpio_base;
-	pct->irq_base = pdata->irq_base;
 	pct->chip.base = (np) ? -1 : pdata->gpio_base;
 
 	/* 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 {
 {					\
 	.start = a,			\
 	.end = b,			\
-	.offset = c,			\
+	.to_irq = c,			\
 }
 
 /**
@@ -106,14 +106,16 @@ struct pullud {
  *			capable
  * @start:		The pin number of the first pin interrupt capable
  * @end:		The pin number of the last pin interrupt capable
- * @offset:		offset used to compute specific setting strategy of
- *			the interrupt line
+ * @to_irq:		The ABx500 GPIO's associated IRQs are clustered
+ *                      together throughout the interrupt numbers at irregular
+ *                      intervals. To solve this quandary, we will place the
+ *                      read-in values into the cluster information table
  */
 
 struct abx500_gpio_irq_cluster {
 	int start;
 	int end;
-	int offset;
+	int to_irq;
 };
 
 /**