ARM: tegra12: set CPU rate to 2.2GHz for sku 0x87
[linux-3.10.git] / arch / arm / mach-tegra / board-ardbeg-sysedp.c
1 /*
2  * Copyright (c) 2013 NVIDIA Corporation. All rights reserved.
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 version 2 as
6  * published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License along
14  * with this program; if not, write to the Free Software Foundation, Inc.,
15  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
16  */
17
18 #include <linux/sysedp.h>
19 #include <linux/platform_device.h>
20 #include <linux/platform_data/tegra_edp.h>
21 #include <linux/power_supply.h>
22 #include <mach/edp.h>
23 #include "board.h"
24 #include "board-panel.h"
25
26 /* --- EDP consumers data --- */
27 /* TODO static unsigned int ov5693_states[] = { 0, 300 };*/
28 static unsigned int mt9m114_states[] = { 0, 150 };
29 static unsigned int sdhci_states[] = { 0, 966 };
30 static unsigned int speaker_states[] = { 0, 1080 };
31 static unsigned int wifi_states[] = { 0, 3070 };
32 static unsigned int modem_states[] = { 0, 4100 };
33
34 /* 10 inch panel */
35 static unsigned int pwm_backlight_states[] = {
36         0, 425, 851, 1276, 1702, 2127, 2553, 2978, 3404, 3829, 4255
37 };
38 /* TODO
39 static unsigned int as364x_states[] = {
40         0, 350, 700, 1050, 1400, 1750, 2100, 2450, 2800, 3150, 3500
41 };
42 */
43
44 static struct sysedp_consumer_data shield_sysedp_consumer_data[] = {
45         /* TODO SYSEDP_CONSUMER_DATA("ov5693", ov5693_states),*/
46         SYSEDP_CONSUMER_DATA("mt9m114", mt9m114_states),
47         SYSEDP_CONSUMER_DATA("speaker", speaker_states),
48         SYSEDP_CONSUMER_DATA("wifi", wifi_states),
49         SYSEDP_CONSUMER_DATA("pwm-backlight", pwm_backlight_states),
50         SYSEDP_CONSUMER_DATA("sdhci-tegra.2", sdhci_states),
51         SYSEDP_CONSUMER_DATA("sdhci-tegra.3", sdhci_states),
52         /* TODO SYSEDP_CONSUMER_DATA("as364x", as364x_states), */
53         SYSEDP_CONSUMER_DATA("modem", modem_states),
54 };
55
56 static struct sysedp_platform_data shield_sysedp_platform_data = {
57         .consumer_data = shield_sysedp_consumer_data,
58         .consumer_data_size = ARRAY_SIZE(shield_sysedp_consumer_data),
59         .margin = 0,
60 };
61
62 static struct platform_device shield_sysedp_device = {
63         .name = "sysedp",
64         .id = -1,
65         .dev = { .platform_data = &shield_sysedp_platform_data }
66 };
67
68 void __init shield_new_sysedp_init(void)
69 {
70         int r;
71
72         r = platform_device_register(&shield_sysedp_device);
73         WARN_ON(r);
74 }
75
76 /* --- Battery monitor data --- */
77 static struct sysedp_batmon_ibat_lut shield_ibat_lut[] = {
78 /*-- temp in deci-C, current in milli ampere --*/
79         {  600, 9750 },
80         { -300, 9750 }
81 };
82
83 /* Values for Leyden HY-LDN-N-TD battery */
84 /*                           45C      23C     10C      5C      0C    -20 */
85 static int rbat_data[] = {  100000, 120000, 140000, 170000, 190000,  210000, /* 100% */
86                             100000, 120000, 150000, 170000, 190000,  210000, /*  55% */
87                             100000, 130000, 150000, 170000, 200000,  210000, /*  50% */
88                             110000, 130000, 160000, 170000, 200000,  210000, /*  10% */
89                             120000, 140000, 170000, 180000, 210000,  220000, /*   0% */
90 };
91 static int rbat_temp_axis[] = { 45, 23, 10, 5, 0, -20 };
92 static int rbat_capacity_axis[] = { 100, 55, 50, 10, 0 };
93
94 struct sysedp_batmon_rbat_lut shield_rbat_lut = {
95         .temp_axis = rbat_temp_axis,
96         .temp_size = ARRAY_SIZE(rbat_temp_axis),
97         .capacity_axis = rbat_capacity_axis,
98         .capacity_size = ARRAY_SIZE(rbat_capacity_axis),
99         .data = rbat_data,
100         .data_size = ARRAY_SIZE(rbat_data),
101 };
102
103 /* Fuel Gauge is BQ20z45 (SBS battery) */
104 static struct sysedp_batmon_ocv_lut shield_ocv_lut[] = {
105         /*SOC, OCV in micro volt */
106         {100,  8372010 },
107         {95 ,  8163880 },
108         {90 ,  8069280 },
109         {85 ,  7970700 },
110         {80 ,  7894100 },
111         {75 ,  7820860 },
112         {70 ,  7751890 },
113         {65 ,  7691770 },
114         {60 ,  7641110 },
115         {55 ,  7598990 },
116         {50 ,  7564200 },
117         {45 ,  7534290 },
118         {40 ,  7511410 },
119         {35 ,  7491870 },
120         {30 ,  7468380 },
121         {25 ,  7435720 },
122         {20 ,  7388720 },
123         {15 ,  7338370 },
124         {10 ,  7219650 },
125         {0  ,  5999850 },
126 };
127
128 static struct sysedp_batmon_calc_platform_data shield_batmon_pdata = {
129         .power_supply = "sbs-battery",
130         .r_const = 70000,    /* in micro ohm */
131         .vsys_min = 5880000, /* in micro volt*/
132         .ibat_lut = shield_ibat_lut,
133         .rbat_lut = &shield_rbat_lut,
134         .ocv_lut = shield_ocv_lut,
135 };
136
137 static struct platform_device shield_batmon_device = {
138         .name = "sysedp_batmon_calc",
139         .id = -1,
140         .dev = { .platform_data = &shield_batmon_pdata }
141 };
142
143 void __init shield_sysedp_batmon_init(void)
144 {
145         int r;
146
147         if (get_power_supply_type() != POWER_SUPPLY_TYPE_BATTERY) {
148                 /* modify platform data on-the-fly to enable virtual battery */
149                 shield_batmon_pdata.power_supply = "test_battery";
150                 shield_batmon_pdata.update_interval = 2000;
151         }
152
153         r = platform_device_register(&shield_batmon_device);
154         WARN_ON(r);
155 }
156
157 static struct tegra_sysedp_platform_data shield_sysedp_dynamic_capping_platdata = {
158         .corecap = td580d_sysedp_corecap,
159         .corecap_size = td580d_sysedp_corecap_sz,
160         .core_gain = 100,
161         .init_req_watts = 20000,
162 };
163
164 static struct platform_device shield_sysedp_dynamic_capping = {
165         .name = "sysedp_dynamic_capping",
166         .id = -1,
167         .dev = { .platform_data = &shield_sysedp_dynamic_capping_platdata }
168 };
169
170 void __init shield_sysedp_dynamic_capping_init(void)
171 {
172         int r;
173
174         shield_sysedp_dynamic_capping_platdata.cpufreq_lim = tegra_get_system_edp_entries(
175                 &shield_sysedp_dynamic_capping_platdata.cpufreq_lim_size);
176         if (!shield_sysedp_dynamic_capping_platdata.cpufreq_lim) {
177                 WARN_ON(1);
178                 return;
179         }
180
181         r = platform_device_register(&shield_sysedp_dynamic_capping);
182         WARN_ON(r);
183 }