aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-tegra/wakeups-t3.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-tegra/wakeups-t3.c')
-rw-r--r--arch/arm/mach-tegra/wakeups-t3.c122
1 files changed, 122 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/wakeups-t3.c b/arch/arm/mach-tegra/wakeups-t3.c
new file mode 100644
index 00000000000..82373620436
--- /dev/null
+++ b/arch/arm/mach-tegra/wakeups-t3.c
@@ -0,0 +1,122 @@
1/*
2 * Copyright (c) 2011, NVIDIA Corporation.
3 *
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.
8 *
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
12 * more details.
13 */
14
15#include <linux/kernel.h>
16#include <linux/gpio.h>
17#include <linux/init.h>
18#include <linux/io.h>
19
20#include <mach/iomap.h>
21#include <mach/irqs.h>
22#include <mach/gpio.h>
23
24#include "gpio-names.h"
25
26static int tegra_wake_event_irq[] = {
27 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PO5), /* wake0 */
28 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PV1), /* wake1 */
29 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PL1), /* wake2 */
30 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PB6), /* wake3 */
31 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PN7), /* wake4 */
32 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PBB6), /* wake5 */
33 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PU5), /* wake6 */
34 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PU6), /* wake7 */
35 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PC7), /* wake8 */
36 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PS2), /* wake9 */
37 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PAA1), /* wake10 */
38 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PW3), /* wake11 */
39 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PW2), /* wake12 */
40 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PY6), /* wake13 */
41 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PDD3), /* wake14 */
42 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PJ2), /* wake15 */
43 INT_RTC, /* wake16 */
44 INT_KBC, /* wake17 */
45 INT_EXTERNAL_PMU, /* wake18 */
46 -EINVAL, /* TEGRA_USB1_VBUS, */ /* wake19 */
47 -EINVAL, /* TEGRA_USB2_VBUS, */ /* wake20 */
48 -EINVAL, /* TEGRA_USB1_ID, */ /* wake21 */
49 -EINVAL, /* TEGRA_USB2_ID, */ /* wake22 */
50 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PI5), /* wake23 */
51 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PV0), /* wake24 */
52 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PS4), /* wake25 */
53 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PS5), /* wake26 */
54 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PS0), /* wake27 */
55 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PS6), /* wake28 */
56 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PS7), /* wake29 */
57 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PN2), /* wake30 */
58 -EINVAL, /* not used */ /* wake31 */
59 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PO4), /* wake32 */
60 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PJ0), /* wake33 */
61 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PK2), /* wake34 */
62 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PI6), /* wake35 */
63 TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PBB1), /* wake36 */
64 -EINVAL, /* TEGRA_USB3_VBUS, */ /* wake37 */
65 -EINVAL, /* TEGRA_USB3_ID, */ /* wake38 */
66 INT_USB, /* TEGRA_USB1_UTMIP, */ /* wake39 */
67 INT_USB2, /* TEGRA_USB2_UTMIP, */ /* wake40 */
68 INT_USB3, /* TEGRA_USB3_UTMIP, */ /* wake41 */
69};
70
71int tegra_irq_to_wake(int irq)
72{
73 int i;
74 int wake_irq;
75 int search_gpio;
76 static int last_wake = -1;
77
78 /* Two level wake irq search for gpio based wakeups -
79 * 1. check for GPIO irq(based on tegra_wake_event_irq table)
80 * e.g. for a board, wake7 based on GPIO PU6 and irq==390 done first
81 * 2. check for gpio bank irq assuming search for GPIO irq
82 * preceded this search.
83 * e.g. in this step check for gpio bank irq GPIO6 irq==119
84 */
85 for (i = 0; i < ARRAY_SIZE(tegra_wake_event_irq); i++) {
86 /* return if step 1 matches */
87 if (tegra_wake_event_irq[i] == irq) {
88 pr_info("Wake%d for irq=%d\n", i, irq);
89 last_wake = i;
90 return i;
91 }
92
93 /* step 2 below uses saved last_wake from step 1
94 * in previous call */
95 search_gpio = irq_to_gpio(
96 tegra_wake_event_irq[i]);
97 if (search_gpio < 0)
98 continue;
99 wake_irq = tegra_gpio_get_bank_int_nr(search_gpio);
100 if (wake_irq < 0)
101 continue;
102 if ((last_wake == i) &&
103 (wake_irq == irq)) {
104 pr_info("gpio bank wake found: wake%d for irq=%d\n",
105 i, irq);
106 return i;
107 }
108 }
109
110 return -EINVAL;
111}
112
113int tegra_wake_to_irq(int wake)
114{
115 if (wake < 0)
116 return -EINVAL;
117
118 if (wake >= ARRAY_SIZE(tegra_wake_event_irq))
119 return -EINVAL;
120
121 return tegra_wake_event_irq[wake];
122}