ARM: tegra: Module for dynamic voltage limits
[linux-3.10.git] / arch / arm / mach-tegra / board-common.c
1 /*
2  * board-common.c: Implement function which is common across
3  * different boards.
4  *
5  * Copyright (c) 2011-2013, NVIDIA CORPORATION.  All rights reserved.
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
15  * more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20  */
21
22 #include <linux/clk.h>
23 #include <linux/serial_8250.h>
24 #include <linux/clk/tegra.h>
25
26 #include <mach/edp.h>
27
28 #include "board.h"
29 #include "board-common.h"
30 #include "devices.h"
31 #include "clock.h"
32 #include "dvfs.h"
33 #include "cpu-tegra.h"
34
35 extern unsigned long  debug_uart_port_base;
36 extern struct clk *debug_uart_clk;
37
38 struct platform_device *uart_console_debug_device = NULL;
39
40 struct platform_device vibrator_device = {
41         .name = "tegra-vibrator",
42         .id = -1,
43 };
44
45 int tegra_vibrator_init(void)
46 {
47         return platform_device_register(&vibrator_device);
48 }
49
50 int uart_console_debug_init(int default_debug_port)
51 {
52         int debug_port_id;
53
54         debug_port_id = get_tegra_uart_debug_port_id();
55         if (debug_port_id < 0)
56                 debug_port_id = default_debug_port;
57
58         if (debug_port_id < 0) {
59                 pr_warn("No debug console channel\n");
60                 return -EINVAL;
61         }
62
63         switch (debug_port_id) {
64         case 0:
65                 /* UARTA is the debug port. */
66                 pr_info("Selecting UARTA as the debug console\n");
67                 debug_uart_clk = clk_get_sys("serial8250.0", "uarta");
68                 debug_uart_port_base = ((struct plat_serial8250_port *)(
69                         debug_uarta_device.dev.platform_data))->mapbase;
70                 uart_console_debug_device = &debug_uarta_device;
71                 break;
72
73         case 1:
74                 /* UARTB is the debug port. */
75                 pr_info("Selecting UARTB as the debug console\n");
76                 debug_uart_clk =  clk_get_sys("serial8250.1", "uartb");
77                 debug_uart_port_base = ((struct plat_serial8250_port *)(
78                         debug_uartb_device.dev.platform_data))->mapbase;
79                 uart_console_debug_device = &debug_uartb_device;
80                 break;
81
82         case 2:
83                 /* UARTC is the debug port. */
84                 pr_info("Selecting UARTC as the debug console\n");
85                 debug_uart_clk =  clk_get_sys("serial8250.2", "uartc");
86                 debug_uart_port_base = ((struct plat_serial8250_port *)(
87                         debug_uartc_device.dev.platform_data))->mapbase;
88                 uart_console_debug_device = &debug_uartc_device;
89                 break;
90
91         case 3:
92                 /* UARTD is the debug port. */
93                 pr_info("Selecting UARTD as the debug console\n");
94                 debug_uart_clk =  clk_get_sys("serial8250.3", "uartd");
95                 debug_uart_port_base = ((struct plat_serial8250_port *)(
96                         debug_uartd_device.dev.platform_data))->mapbase;
97                 uart_console_debug_device = &debug_uartd_device;
98                 break;
99
100 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
101         case 4:
102                 /* UARTE is the debug port. */
103                 pr_info("Selecting UARTE as the debug console\n");
104                 debug_uart_clk =  clk_get_sys("serial8250.4", "uarte");
105                 debug_uart_port_base = ((struct plat_serial8250_port *)(
106                         debug_uarte_device.dev.platform_data))->mapbase;
107                 uart_console_debug_device = &debug_uarte_device;
108                 break;
109 #endif
110
111         default:
112                 pr_info("The debug console id %d is invalid, Assuming UARTA", debug_port_id);
113                 debug_uart_clk = clk_get_sys("serial8250.0", "uarta");
114                 debug_uart_port_base = ((struct plat_serial8250_port *)(
115                         debug_uarta_device.dev.platform_data))->mapbase;
116                 uart_console_debug_device = &debug_uarta_device;
117                 break;
118         }
119
120         if (!IS_ERR_OR_NULL(debug_uart_clk)) {
121                 struct clk *c;
122 #ifndef CONFIG_COMMON_CLK
123                 pr_info("The debug console clock name is %s\n",
124                                                 debug_uart_clk->name);
125 #endif
126                 c = tegra_get_clock_by_name("pll_p");
127                 if (IS_ERR_OR_NULL(c))
128                         pr_err("Not getting the parent clock pll_p\n");
129                 else
130                         clk_set_parent(debug_uart_clk, c);
131
132                 tegra_clk_prepare_enable(debug_uart_clk);
133                 clk_set_rate(debug_uart_clk, clk_get_rate(c));
134         } else {
135                 pr_err("Not getting the clock for debug consolei %d\n",
136                         debug_port_id);
137         }
138         return debug_port_id;
139 }
140
141 static void tegra_add_trip_points(struct thermal_trip_info *trips,
142                                 int *num_trips,
143                                 struct tegra_cooling_device *cdev_data)
144 {
145         int i;
146         struct thermal_trip_info *trip_state;
147
148         if (!trips || !num_trips || !cdev_data)
149                 return;
150
151         if (*num_trips + cdev_data->trip_temperatures_num > THERMAL_MAX_TRIPS) {
152                 WARN(1, "%s: cooling device %s has too many trips\n",
153                      __func__, cdev_data->cdev_type);
154                 return;
155         }
156
157         for (i = 0; i < cdev_data->trip_temperatures_num; i++) {
158                 trip_state = &trips[*num_trips];
159
160                 trip_state->cdev_type = cdev_data->cdev_type;
161                 trip_state->trip_temp = cdev_data->trip_temperatures[i] * 1000;
162                 trip_state->trip_type = THERMAL_TRIP_ACTIVE;
163                 trip_state->upper = trip_state->lower = i + 1;
164                 trip_state->hysteresis = 1000;
165
166                 (*num_trips)++;
167         }
168 }
169
170 void tegra_add_cdev_trips(struct thermal_trip_info *trips, int *num_trips)
171 {
172         tegra_add_trip_points(trips, num_trips, tegra_dvfs_get_cpu_vmin_cdev());
173         tegra_add_trip_points(trips, num_trips,
174                               tegra_dvfs_get_core_vmin_cdev());
175         tegra_add_trip_points(trips, num_trips, tegra_dvfs_get_gpu_vmin_cdev());
176 }
177
178 void tegra_add_tj_trips(struct thermal_trip_info *trips, int *num_trips)
179 {
180         tegra_add_trip_points(trips, num_trips, tegra_dvfs_get_cpu_vmax_cdev());
181         tegra_add_trip_points(trips, num_trips, tegra_core_edp_get_cdev());
182 }
183
184 void tegra_add_tgpu_trips(struct thermal_trip_info *trips, int *num_trips)
185 {
186         tegra_add_trip_points(trips, num_trips, tegra_dvfs_get_gpu_vts_cdev());
187 }
188
189 void tegra_add_vc_trips(struct thermal_trip_info *trips, int *num_trips)
190 {
191         tegra_add_trip_points(trips, num_trips, tegra_vc_get_cdev());
192 }