Ventana: KBC: Removing the KBC usage on ventana
[linux-2.6.git] / arch / arm / mach-tegra / wakeups-t2.c
1 /*
2  * Copyright (c) 2011, Google, Inc.
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
23 #include "gpio-names.h"
24
25 #define NUM_WAKE_EVENTS 31
26
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),
44         [16] = INT_RTC,
45         [17] = INT_KBC,
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),
59         [31] = -EINVAL,
60         /*
61          * The gpio bank irqs aren't actually wake sources, but they don't
62          * prevent lp0 because the gpio chained irq is requested directly
63          */
64         [32] = INT_GPIO1,
65         [33] = INT_GPIO2,
66         [34] = INT_GPIO3,
67         [35] = INT_GPIO4,
68         [36] = INT_GPIO5,
69         [37] = INT_GPIO6,
70         [38] = INT_GPIO7,
71 };
72
73 int tegra_irq_to_wake(int irq)
74 {
75         int i;
76         for (i = 0; i < ARRAY_SIZE(tegra_wake_event_irq); i++)
77                 if (tegra_wake_event_irq[i] == irq)
78                         break;
79
80         if (i == ARRAY_SIZE(tegra_wake_event_irq))
81                 return -ENOTSUPP;
82
83         if (i > NUM_WAKE_EVENTS)
84                 return -EALREADY;
85
86         return i;
87 }
88
89 int tegra_wake_to_irq(int wake)
90 {
91         if (wake < 0)
92                 return -EINVAL;
93
94         if (wake >= NUM_WAKE_EVENTS)
95                 return -EINVAL;
96
97         return tegra_wake_event_irq[wake];
98 }