mirror of
https://github.com/torvalds/linux.git
synced 2024-12-04 18:13:04 +00:00
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>
This commit is contained in:
parent
fa1ec996ac
commit
b9fab6e45d
@ -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 = {
|
||||
|
@ -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 = {
|
||||
|
@ -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 = {
|
||||
|
@ -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 = {
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user