2 * Copyright (c) 2011, Google, Inc.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 #include <linux/kernel.h>
16 #include <linux/gpio.h>
17 #include <linux/init.h>
20 #include <mach/gpio-tegra.h>
21 #include <mach/iomap.h>
22 #include <mach/irqs.h>
23 #include <mach/gpio.h>
25 #include "gpio-names.h"
27 static int tegra_wake_event_irq[] = {
28 [0] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PO5),
29 [1] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PV3),
30 [2] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PL1),
31 [3] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PB6),
32 [4] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PN7),
33 [5] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PA0),
34 [6] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PU5),
35 [7] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PU6),
36 [8] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PC7),
37 [9] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PS2),
38 [10] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PAA1),
39 [11] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PW3),
40 [12] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PW2),
41 [13] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PY6),
42 [14] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PV6),
43 [15] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PJ7),
46 [18] = INT_EXTERNAL_PMU,
47 [19] = -EINVAL, /* TEGRA_USB1_VBUS, */
48 [20] = -EINVAL, /* TEGRA_USB3_VBUS, */
49 [21] = -EINVAL, /* TEGRA_USB1_ID, */
50 [22] = -EINVAL, /* TEGRA_USB3_ID, */
51 [23] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PI5),
52 [24] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PV2),
53 [25] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PS4),
54 [26] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PS5),
55 [27] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PS0),
56 [28] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PQ6),
57 [29] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PQ7),
58 [30] = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PN2),
61 int tegra_irq_to_wake(int irq)
66 static int last_wake = -1;
68 /* Two level wake irq search for gpio based wakeups -
69 * 1. check for GPIO irq(based on tegra_wake_event_irq table)
70 * e.g. for a board, wake7 based on GPIO PU6 and irq==358 done first
71 * 2. check for gpio bank irq assuming search for GPIO irq
72 * preceded this search.
73 * e.g. in this step check for gpio bank irq GPIO6 irq==119
75 for (i = 0; i < ARRAY_SIZE(tegra_wake_event_irq); i++) {
76 /* return if step 1 matches */
77 if (tegra_wake_event_irq[i] == irq) {
78 pr_info("Wake%d for irq=%d\n", i, irq);
83 /* step 2 below uses saved last_wake from step 1
85 search_gpio = irq_to_gpio(
86 tegra_wake_event_irq[i]);
89 wake_irq = tegra_gpio_get_bank_int_nr(search_gpio);
92 if ((last_wake == i) &&
94 pr_info("gpio bank wake found: wake%d for irq=%d\n",
103 int tegra_wake_to_irq(int wake)
108 if (wake >= ARRAY_SIZE(tegra_wake_event_irq))
111 return tegra_wake_event_irq[wake];