[ARM/tegra] Add Tegra3 support
[linux-2.6.git] / arch / arm / mach-tegra / wakeups-t3.c
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
23 #include "gpio-names.h"
24
25 #define NUM_WAKE_EVENTS 39
26
27 static int tegra_wake_event_irq[NUM_WAKE_EVENTS] = {
28         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PO5),      /* wake0 */
29         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PV1),      /* wake1 */
30         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PL1),      /* wake2 */
31         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PB6),      /* wake3 */
32         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PN7),      /* wake4 */
33         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PBB6),     /* wake5 */
34         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PU5),      /* wake6 */
35         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PU6),      /* wake7 */
36         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PC7),      /* wake8 */
37         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PS2),      /* wake9 */
38         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PAA1),     /* wake10 */
39         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PW3),      /* wake11 */
40         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PW2),      /* wake12 */
41         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PY6),      /* wake13 */
42         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PDD3),     /* wake14 */
43         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PJ2),      /* wake15 */
44         INT_RTC,                                /* wake16 */
45         INT_KBC,                                /* wake17 */
46         INT_EXTERNAL_PMU,                       /* wake18 */
47         -EINVAL, /* TEGRA_USB1_VBUS, */         /* wake19 */
48         -EINVAL, /* TEGRA_USB2_VBUS, */         /* wake20 */
49         -EINVAL, /* TEGRA_USB1_ID, */           /* wake21 */
50         -EINVAL, /* TEGRA_USB2_ID, */           /* wake22 */
51         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PI5),      /* wake23 */
52         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PV0),      /* wake24 */
53         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PS4),      /* wake25 */
54         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PS5),      /* wake26 */
55         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PS0),      /* wake27 */
56         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PS6),      /* wake28 */
57         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PS7),      /* wake29 */
58         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PN2),      /* wake30 */
59         -EINVAL, /* not used */                 /* wake31 */
60         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PO4),      /* wake32 */
61         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PJ0),      /* wake33 */
62         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PK2),      /* wake34 */
63         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PI6),      /* wake35 */
64         TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_PBB1),     /* wake36 */
65         -EINVAL, /* TEGRA_USB3_VBUS, */         /* wake37 */
66         -EINVAL, /* TEGRA_USB3_ID, */           /* wake38 */
67 };
68
69 int tegra_irq_to_wake(int irq)
70 {
71         int i;
72         for (i = 0; i < ARRAY_SIZE(tegra_wake_event_irq); i++)
73                 if (tegra_wake_event_irq[i] == irq)
74                         return i;
75
76         return -EINVAL;
77 }
78
79 int tegra_wake_to_irq(int wake)
80 {
81         if (wake < 0)
82                 return -EINVAL;
83
84         if (wake >= NUM_WAKE_EVENTS)
85                 return -EINVAL;
86
87         return tegra_wake_event_irq[wake];
88 }