965dcfbe43e4541ac7fba831c9c0e36b878ea798
[linux-3.10.git] / arch / arm / mach-tegra / board-tn8-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 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, 1020 };
32 static unsigned int modem_states[] = { 0, 4100 };
33 static unsigned int pwm_backlight_states[] = {
34         0, 125, 250, 375, 500, 625, 750, 875, 1000, 1125, 1250
35 };
36
37 /* (optional) 10" panel */
38 static unsigned int pwm_backlight_10_states[] = {
39         0, 425, 851, 1276, 1702, 2127, 2553, 2978, 3404, 3829, 4255
40 };
41 static unsigned int as364x_states[] = {
42         0, 350, 700, 1050, 1400, 1750, 2100, 2450, 2800, 3150, 3500
43 };
44
45 static struct sysedp_consumer_data tn8_sysedp_consumer_data[] = {
46         SYSEDP_CONSUMER_DATA("ov5693", ov5693_states),
47         SYSEDP_CONSUMER_DATA("mt9m114", mt9m114_states),
48         SYSEDP_CONSUMER_DATA("speaker", speaker_states),
49         SYSEDP_CONSUMER_DATA("wifi", wifi_states),
50         SYSEDP_CONSUMER_DATA("pwm-backlight", pwm_backlight_states),
51         SYSEDP_CONSUMER_DATA("sdhci-tegra.2", sdhci_states),
52         SYSEDP_CONSUMER_DATA("sdhci-tegra.3", sdhci_states),
53         SYSEDP_CONSUMER_DATA("as364x", as364x_states),
54         SYSEDP_CONSUMER_DATA("modem", modem_states),
55 };
56
57 static struct sysedp_platform_data tn8_sysedp_platform_data = {
58         .consumer_data = tn8_sysedp_consumer_data,
59         .consumer_data_size = ARRAY_SIZE(tn8_sysedp_consumer_data),
60         .margin = 0,
61 };
62
63 static struct platform_device tn8_sysedp_device = {
64         .name = "sysedp",
65         .id = -1,
66         .dev = { .platform_data = &tn8_sysedp_platform_data }
67 };
68
69 void __init tn8_new_sysedp_init(void)
70 {
71         int r;
72         struct board_info board;
73
74         tegra_get_display_board_info(&board);
75
76         /* Some TN8 boards use non-default display */
77         if (board.board_id != BOARD_E1549)
78                 memcpy(pwm_backlight_states, pwm_backlight_10_states,
79                        sizeof(pwm_backlight_states));
80
81         r = platform_device_register(&tn8_sysedp_device);
82         WARN_ON(r);
83 }
84
85 /* --- Battery monitor data --- */
86 static struct sysedp_batmon_ibat_lut tn8_ibat_lut[] = {
87         {  60, 6150 }, /* TODO until battery temp is fixed*/
88         {  40, 6150 },
89         {   0, 6150 },
90         { -30,    0 }
91 };
92
93 static struct sysedp_batmon_rbat_lut tn8_rbat_lut[] = {
94         { 100,  70000 },
95         {  88,  70000 },
96         {  75,  70000 },
97         {  63,  70000 },
98         {  50,  70000 },
99         {  38,  70000 },
100         {  25,  70000 },
101         {  13,  70000 },
102         {   0,  90000 }
103 };
104
105 static struct sysedp_batmon_calc_platform_data tn8_batmon_pdata = {
106         .power_supply = "battery",
107         .r_const = 60000,
108         .vsys_min = 2900000,
109         .ibat_lut = tn8_ibat_lut,
110         .rbat_lut = tn8_rbat_lut,
111 };
112
113 static struct platform_device tn8_batmon_device = {
114         .name = "sysedp_batmon_calc",
115         .id = -1,
116         .dev = { .platform_data = &tn8_batmon_pdata }
117 };
118
119 void __init tn8_sysedp_batmon_init(void)
120 {
121         int r;
122
123         if (get_power_supply_type() != POWER_SUPPLY_TYPE_BATTERY) {
124                 /* modify platform data on-the-fly to enable virtual battery */
125                 tn8_batmon_pdata.power_supply = "test_battery";
126                 tn8_batmon_pdata.update_interval = 2000;
127         }
128
129         r = platform_device_register(&tn8_batmon_device);
130         WARN_ON(r);
131 }
132
133 /* --- sysedp capping device data --- */
134 static struct tegra_sysedp_corecap tn8_sysedp_corecap[] = {
135         { 5000,  {2000,  108000, 924000 }, {2000, 108000, 924000 } },
136         { 6000,  {3000,  108000, 924000 }, {2000, 180000, 924000 } },
137         { 7000,  {4000,  108000, 924000 }, {2000, 252000, 924000 } },
138         { 8000,  {5000,  180000, 924000 }, {2000, 396000, 924000 } },
139         { 9000,  {6000,  180000, 924000 }, {2000, 396000, 924000 } },
140         { 10000, {7000,  108000, 924000 }, {4000, 396000, 924000 } },
141         { 11000, {7000,  252000, 924000 }, {4000, 468000, 924000 } },
142         { 12000, {8000,  180000, 924000 }, {3000, 540000, 924000 } },
143         { 13000, {9000,  108000, 924000 }, {5000, 540000, 924000 } },
144         { 14000, {10000, 108000, 924000 }, {3000, 648000, 924000 } },
145         { 15000, {11000, 108000, 924000 }, {4000, 648000, 924000 } },
146         { 16000, {11000, 180000, 924000 }, {3000, 708000, 924000 } },
147         { 17000, {12000, 180000, 924000 }, {5000, 708000, 924000 } },
148         { 18000, {13000, 108000, 924000 }, {3000, 756000, 924000 } },
149         { 19000, {14000, 108000, 924000 }, {5000, 756000, 924000 } },
150         { 20000, {14000, 180000, 924000 }, {3000, 804000, 924000 } },
151         { 21000, {14000, 252000, 924000 }, {4000, 804000, 924000 } },
152         { 22000, {16000, 108000, 924000 }, {5000, 804000, 924000 } },
153         { 23000, {16000, 180000, 924000 }, {6000, 804000, 924000 } },
154 };
155 static struct tegra_sysedp_platform_data tn8_sysedp_dynamic_capping_platdata = {
156         .corecap = tn8_sysedp_corecap,
157         .corecap_size = ARRAY_SIZE(tn8_sysedp_corecap),
158         .core_gain = 100,
159         .init_req_watts = 20000,
160 };
161
162 static struct platform_device tn8_sysedp_dynamic_capping = {
163         .name = "sysedp_dynamic_capping",
164         .id = -1,
165         .dev = { .platform_data = &tn8_sysedp_dynamic_capping_platdata }
166 };
167
168 void __init tn8_sysedp_dynamic_capping_init(void)
169 {
170         int r;
171
172         tn8_sysedp_dynamic_capping_platdata.cpufreq_lim = tegra_get_system_edp_entries(
173                 &tn8_sysedp_dynamic_capping_platdata.cpufreq_lim_size);
174         if (!tn8_sysedp_dynamic_capping_platdata.cpufreq_lim) {
175                 WARN_ON(1);
176                 return;
177         }
178
179         r = platform_device_register(&tn8_sysedp_dynamic_capping);
180         WARN_ON(r);
181 }