ARM: tegra: fix regulator_get() return value check
[linux-3.10.git] / arch / arm / mach-tegra / panel-s-1080p-5.c
1 /*
2  * arch/arm/mach-tegra/panel-s-1080p-5.c
3  *
4  * Copyright (c) 2012-2013, NVIDIA CORPORATION.  All rights reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #include <mach/dc.h>
20 #include <linux/delay.h>
21 #include <linux/gpio.h>
22 #include <linux/tegra_pwm_bl.h>
23 #include <linux/regulator/consumer.h>
24 #include <linux/pwm_backlight.h>
25 #include <linux/mfd/max8831.h>
26 #include <linux/max8831_backlight.h>
27 #include <linux/leds.h>
28 #include <linux/ioport.h>
29 #include <linux/lm3528.h>
30 #include <linux/export.h>
31
32 #include "gpio-names.h"
33 #include "board-panel.h"
34 #include "board.h"
35
36 #define DSI_PANEL_RESET         1
37
38 #define DC_CTRL_MODE            TEGRA_DC_OUT_CONTINUOUS_MODE
39
40 static struct regulator *vdd_lcd_s_1v8;
41 static struct regulator *vdd_sys_bl_3v7;
42
43 static bool dsi_s_1080p_5_reg_requested;
44 static bool dsi_s_1080p_5_gpio_requested;
45 static bool is_bl_powered;
46
47 #ifdef CONFIG_TEGRA_DC_CMU
48 static struct tegra_dc_cmu dsi_s_1080p_5_cmu = {
49         /* lut1 maps sRGB to linear space. */
50         {
51                 0,    1,    2,    4,    5,    6,    7,    9,
52                 10,   11,   12,   14,   15,   16,   18,   20,
53                 21,   23,   25,   27,   29,   31,   33,   35,
54                 37,   40,   42,   45,   48,   50,   53,   56,
55                 59,   62,   66,   69,   72,   76,   79,   83,
56                 87,   91,   95,   99,   103,  107,  112,  116,
57                 121,  126,  131,  136,  141,  146,  151,  156,
58                 162,  168,  173,  179,  185,  191,  197,  204,
59                 210,  216,  223,  230,  237,  244,  251,  258,
60                 265,  273,  280,  288,  296,  304,  312,  320,
61                 329,  337,  346,  354,  363,  372,  381,  390,
62                 400,  409,  419,  428,  438,  448,  458,  469,
63                 479,  490,  500,  511,  522,  533,  544,  555,
64                 567,  578,  590,  602,  614,  626,  639,  651,
65                 664,  676,  689,  702,  715,  728,  742,  755,
66                 769,  783,  797,  811,  825,  840,  854,  869,
67                 884,  899,  914,  929,  945,  960,  976,  992,
68                 1008, 1024, 1041, 1057, 1074, 1091, 1108, 1125,
69                 1142, 1159, 1177, 1195, 1213, 1231, 1249, 1267,
70                 1286, 1304, 1323, 1342, 1361, 1381, 1400, 1420,
71                 1440, 1459, 1480, 1500, 1520, 1541, 1562, 1582,
72                 1603, 1625, 1646, 1668, 1689, 1711, 1733, 1755,
73                 1778, 1800, 1823, 1846, 1869, 1892, 1916, 1939,
74                 1963, 1987, 2011, 2035, 2059, 2084, 2109, 2133,
75                 2159, 2184, 2209, 2235, 2260, 2286, 2312, 2339,
76                 2365, 2392, 2419, 2446, 2473, 2500, 2527, 2555,
77                 2583, 2611, 2639, 2668, 2696, 2725, 2754, 2783,
78                 2812, 2841, 2871, 2901, 2931, 2961, 2991, 3022,
79                 3052, 3083, 3114, 3146, 3177, 3209, 3240, 3272,
80                 3304, 3337, 3369, 3402, 3435, 3468, 3501, 3535,
81                 3568, 3602, 3636, 3670, 3705, 3739, 3774, 3809,
82                 3844, 3879, 3915, 3950, 3986, 4022, 4059, 4095,
83         },
84         /* csc */
85         {
86                 0x0FE, 0x001, 0x3FF,
87                 0x3FF, 0x0E3, 0x004,
88                 0x000, 0x003, 0x0D9,
89         },
90         /* lut2 maps linear space to sRGB */
91         {
92                 0, 3, 6, 8, 11, 13, 15, 17,
93                 19, 21, 22, 24, 25, 26, 27, 28,
94                 29, 29, 30, 30, 31, 31, 31, 32,
95                 32, 32, 32, 32, 32, 32, 32, 32,
96                 32, 32, 31, 31, 32, 32, 32, 32,
97                 32, 32, 32, 33, 33, 33, 33, 34,
98                 34, 34, 35, 35, 36, 36, 36, 37,
99                 37, 38, 38, 39, 39, 40, 40, 41,
100                 41, 42, 42, 43, 43, 44, 45, 45,
101                 46, 46, 47, 47, 47, 48, 48, 49,
102                 49, 50, 50, 51, 51, 51, 52, 52,
103                 52, 53, 53, 53, 54, 54, 54, 55,
104                 55, 55, 55, 56, 56, 56, 56, 57,
105                 57, 57, 57, 58, 58, 58, 58, 58,
106                 59, 59, 59, 59, 59, 60, 60, 60,
107                 60, 60, 60, 61, 61, 61, 61, 61,
108                 61, 62, 62, 62, 62, 62, 62, 63,
109                 63, 63, 63, 63, 63, 64, 64, 64,
110                 64, 64, 65, 65, 65, 65, 65, 66,
111                 66, 66, 66, 66, 67, 67, 67, 67,
112                 68, 68, 68, 68, 68, 69, 69, 69,
113                 69, 70, 70, 70, 70, 71, 71, 71,
114                 71, 72, 72, 72, 72, 72, 73, 73,
115                 73, 73, 74, 74, 74, 74, 75, 75,
116                 75, 75, 76, 76, 76, 76, 77, 77,
117                 77, 77, 78, 78, 78, 78, 78, 79,
118                 79, 79, 79, 79, 80, 80, 80, 80,
119                 81, 81, 81, 81, 81, 82, 82, 82,
120                 82, 82, 82, 83, 83, 83, 83, 83,
121                 83, 84, 84, 84, 84, 84, 84, 85,
122                 85, 85, 85, 85, 85, 85, 86, 86,
123                 86, 86, 86, 86, 86, 87, 87, 87,
124                 87, 87, 87, 87, 87, 88, 88, 88,
125                 88, 88, 88, 88, 88, 88, 89, 89,
126                 89, 89, 89, 89, 89, 89, 89, 90,
127                 90, 90, 90, 90, 90, 90, 90, 90,
128                 90, 90, 90, 91, 91, 91, 91, 91,
129                 91, 91, 91, 91, 91, 91, 91, 92,
130                 92, 92, 92, 92, 92, 92, 92, 92,
131                 92, 92, 92, 92, 92, 93, 93, 93,
132                 93, 93, 93, 93, 93, 93, 93, 93,
133                 93, 93, 93, 93, 93, 94, 94, 94,
134                 94, 94, 94, 94, 94, 94, 94, 94,
135                 94, 94, 94, 94, 94, 94, 95, 95,
136                 95, 95, 95, 95, 95, 95, 95, 95,
137                 95, 95, 95, 95, 95, 96, 96, 96,
138                 96, 96, 96, 96, 96, 96, 96, 96,
139                 96, 96, 96, 96, 97, 97, 97, 97,
140                 97, 97, 97, 97, 97, 97, 97, 97,
141                 97, 98, 98, 98, 98, 98, 98, 98,
142                 98, 98, 98, 98, 98, 98, 99, 99,
143                 99, 99, 99, 99, 99, 99, 99, 99,
144                 99, 100, 100, 100, 100, 100, 100, 100,
145                 100, 100, 100, 100, 100, 101, 101, 101,
146                 101, 101, 101, 101, 101, 101, 101, 101,
147                 102, 102, 102, 102, 102, 102, 102, 102,
148                 102, 102, 102, 103, 103, 103, 103, 103,
149                 103, 103, 103, 103, 103, 104, 104, 104,
150                 104, 104, 104, 104, 104, 104, 104, 104,
151                 105, 105, 105, 105, 105, 105, 105, 105,
152                 105, 105, 105, 106, 106, 106, 106, 106,
153                 106, 106, 106, 106, 106, 107, 107, 107,
154                 107, 107, 107, 107, 107, 107, 107, 107,
155                 108, 108, 108, 108, 108, 108, 108, 108,
156                 109, 110, 110, 111, 112, 113, 113, 114,
157                 114, 115, 116, 116, 117, 117, 118, 119,
158                 119, 120, 120, 121, 121, 122, 122, 123,
159                 123, 123, 124, 124, 125, 125, 126, 126,
160                 127, 127, 128, 128, 129, 129, 130, 130,
161                 131, 131, 132, 132, 133, 133, 134, 134,
162                 135, 135, 136, 137, 137, 138, 138, 139,
163                 139, 140, 140, 141, 141, 142, 142, 143,
164                 143, 143, 144, 144, 145, 145, 146, 146,
165                 146, 147, 147, 148, 148, 148, 149, 149,
166                 150, 150, 150, 151, 151, 151, 152, 152,
167                 152, 153, 153, 153, 154, 154, 155, 155,
168                 155, 156, 156, 156, 157, 157, 158, 158,
169                 158, 159, 159, 160, 160, 160, 161, 161,
170                 162, 162, 163, 163, 164, 164, 164, 165,
171                 165, 166, 166, 167, 167, 168, 168, 169,
172                 169, 170, 170, 171, 171, 172, 172, 173,
173                 173, 174, 174, 175, 175, 176, 176, 176,
174                 177, 177, 178, 178, 179, 179, 180, 180,
175                 180, 181, 181, 182, 182, 182, 183, 183,
176                 184, 184, 184, 185, 185, 185, 186, 186,
177                 187, 187, 187, 188, 188, 188, 189, 189,
178                 189, 190, 190, 190, 190, 191, 191, 191,
179                 192, 192, 192, 193, 193, 193, 193, 194,
180                 194, 194, 195, 195, 195, 195, 196, 196,
181                 196, 196, 197, 197, 197, 197, 198, 198,
182                 198, 198, 199, 199, 199, 199, 199, 200,
183                 200, 200, 200, 201, 201, 201, 201, 202,
184                 202, 202, 202, 202, 203, 203, 203, 203,
185                 204, 204, 204, 204, 204, 205, 205, 205,
186                 205, 205, 206, 206, 206, 206, 207, 207,
187                 207, 207, 208, 208, 208, 208, 208, 209,
188                 209, 209, 209, 210, 210, 210, 210, 211,
189                 211, 211, 211, 212, 212, 212, 212, 213,
190                 213, 213, 213, 214, 214, 214, 214, 215,
191                 215, 215, 215, 216, 216, 216, 216, 217,
192                 217, 217, 218, 218, 218, 218, 219, 219,
193                 219, 219, 220, 220, 220, 220, 221, 221,
194                 221, 221, 222, 222, 222, 223, 223, 223,
195                 223, 224, 224, 224, 224, 225, 225, 225,
196                 225, 226, 226, 226, 227, 227, 227, 227,
197                 228, 228, 228, 228, 229, 229, 229, 229,
198                 230, 230, 230, 230, 231, 231, 231, 231,
199                 232, 232, 232, 232, 233, 233, 233, 233,
200                 234, 234, 234, 234, 235, 235, 235, 235,
201                 236, 236, 236, 236, 237, 237, 237, 237,
202                 238, 238, 238, 238, 239, 239, 239, 239,
203                 240, 240, 240, 240, 241, 241, 241, 241,
204                 241, 242, 242, 242, 242, 243, 243, 243,
205                 243, 244, 244, 244, 244, 245, 245, 245,
206                 245, 245, 246, 246, 246, 246, 247, 247,
207                 247, 247, 248, 248, 248, 248, 248, 249,
208                 249, 249, 249, 250, 250, 250, 250, 250,
209                 251, 251, 251, 251, 252, 252, 252, 252,
210                 252, 253, 253, 253, 253, 253, 254, 254,
211                 254, 254, 254, 255, 255, 255, 255, 255,
212         },
213 };
214 #endif
215
216 static tegra_dc_bl_output dsi_s_1080p_5_max8831_bl_response_curve = {
217         0, 2, 5, 7, 10, 13, 15, 18,
218         20, 23, 26, 27, 29, 30, 31, 33,
219         34, 36, 37, 39, 40, 41, 42, 44,
220         45, 46, 47, 48, 50, 51, 52, 53,
221         54, 55, 56, 57, 58, 59, 60, 61,
222         62, 63, 64, 65, 66, 67, 68, 69,
223         70, 71, 73, 74, 75, 76, 78, 79,
224         80, 82, 83, 84, 86, 86, 87, 88,
225         89, 89, 90, 91, 92, 92, 93, 94,
226         95, 96, 97, 98, 99, 100, 101, 102,
227         103, 104, 105, 106, 107, 107, 108, 109,
228         110, 111, 112, 112, 113, 114, 114, 115,
229         115, 116, 117, 117, 118, 119, 120, 121,
230         121, 122, 123, 124, 125, 126, 127, 128,
231         129, 130, 131, 132, 133, 134, 135, 136,
232         136, 138, 139, 140, 141, 142, 143, 144,
233         145, 146, 147, 148, 149, 150, 151, 152,
234         153, 154, 155, 155, 156, 157, 158, 159,
235         161, 162, 163, 164, 165, 166, 167, 167,
236         167, 167, 168, 168, 168, 168, 168, 169,
237         169, 170, 171, 172, 172, 173, 174, 175,
238         176, 177, 178, 179, 180, 181, 182, 183,
239         184, 184, 185, 186, 187, 188, 189, 190,
240         191, 192, 193, 194, 195, 195, 196, 197,
241         198, 199, 200, 201, 202, 203, 204, 205,
242         206, 206, 207, 207, 208, 208, 209, 209,
243         210, 211, 211, 212, 213, 213, 214, 215,
244         216, 216, 217, 218, 219, 220, 221, 222,
245         223, 224, 225, 226, 227, 228, 229, 230,
246         231, 232, 233, 235, 236, 237, 238, 239,
247         240, 241, 242, 243, 244, 245, 246, 247,
248         248, 249, 250, 251, 252, 253, 254, 255
249 };
250
251 static tegra_dc_bl_output dsi_s_1080p_5_lm3528_bl_response_curve = {
252         0, 26, 55, 72, 83, 93, 100, 107,
253         112, 117, 121, 125, 129, 132, 135, 138,
254         141, 143, 146, 148, 150, 152, 154, 156,
255         157, 159, 161, 162, 164, 165, 167, 168,
256         169, 171, 172, 173, 174, 175, 176, 177,
257         179, 180, 181, 182, 182, 183, 184, 185,
258         186, 187, 188, 189, 189, 190, 191, 192,
259         192, 193, 194, 195, 195, 196, 197, 197,
260         198, 199, 199, 200, 200, 201, 202, 202,
261         203, 203, 204, 205, 205, 206, 206, 207,
262         207, 208, 208, 209, 209, 210, 210, 211,
263         211, 212, 212, 212, 213, 213, 214, 214,
264         215, 215, 216, 216, 216, 217, 217, 218,
265         218, 218, 219, 219, 220, 220, 220, 221,
266         221, 221, 222, 222, 223, 223, 223, 224,
267         224, 224, 225, 225, 225, 226, 226, 226,
268         227, 227, 227, 228, 228, 228, 228, 229,
269         229, 229, 230, 230, 230, 231, 231, 231,
270         231, 232, 232, 232, 233, 233, 233, 233,
271         234, 234, 234, 234, 235, 235, 235, 236,
272         236, 236, 236, 237, 237, 237, 237, 238,
273         238, 238, 238, 239, 239, 239, 239, 240,
274         240, 240, 240, 240, 241, 241, 241, 241,
275         242, 242, 242, 242, 242, 243, 243, 243,
276         243, 244, 244, 244, 244, 244, 245, 245,
277         245, 245, 245, 246, 246, 246, 246, 246,
278         247, 247, 247, 247, 247, 248, 248, 248,
279         248, 248, 249, 249, 249, 249, 249, 250,
280         250, 250, 250, 250, 250, 251, 251, 251,
281         251, 251, 252, 252, 252, 252, 252, 252,
282         253, 253, 253, 253, 253, 253, 254, 254,
283         254, 254, 254, 254, 255, 255, 255, 255
284 };
285
286 static p_tegra_dc_bl_output dsi_s_1080p_5_bl_response_curve;
287
288 static int __maybe_unused dsi_s_1080p_5_bl_notify(struct device *unused,
289                                                         int brightness)
290 {
291         int cur_sd_brightness = atomic_read(&sd_brightness);
292
293         /* SD brightness is a percentage */
294         brightness = (brightness * cur_sd_brightness) / 255;
295
296         /* Apply any backlight response curve */
297         if (brightness > 255)
298                 pr_info("Error: Brightness > 255!\n");
299         else
300                 brightness = dsi_s_1080p_5_bl_response_curve[brightness];
301
302         return brightness;
303 }
304 static bool __maybe_unused dsi_s_1080p_5_check_bl_power(void)
305 {
306         return is_bl_powered;
307 }
308
309 /*
310         Sharp uses I2C max8831 blacklight device
311 */
312 static struct led_info dsi_s_1080p_5_max8831_leds[] = {
313         [MAX8831_ID_LED3] = {
314                 .name = "max8831:red:pluto",
315         },
316         [MAX8831_ID_LED4] = {
317                 .name = "max8831:green:pluto",
318         },
319         [MAX8831_ID_LED5] = {
320                 .name = "max8831:blue:pluto",
321         },
322 };
323
324 static struct platform_max8831_backlight_data dsi_s_1080p_5_max8831_bl_data = {
325         .id     = -1,
326         .name   = "pluto_display_bl",
327         .max_brightness = MAX8831_BL_LEDS_MAX_CURR,
328         .dft_brightness = 100,
329         .notify = dsi_s_1080p_5_bl_notify,
330         .is_powered = dsi_s_1080p_5_check_bl_power,
331 };
332
333 static struct max8831_subdev_info dsi_s_1080p_5_max8831_subdevs[] = {
334         {
335                 .id = MAX8831_ID_LED3,
336                 .name = "max8831_led_bl",
337                 .platform_data = &dsi_s_1080p_5_max8831_leds[MAX8831_ID_LED3],
338                 .pdata_size = sizeof(
339                                 dsi_s_1080p_5_max8831_leds[MAX8831_ID_LED3]),
340         }, {
341                 .id = MAX8831_ID_LED4,
342                 .name = "max8831_led_bl",
343                 .platform_data = &dsi_s_1080p_5_max8831_leds[MAX8831_ID_LED4],
344                 .pdata_size = sizeof(
345                                 dsi_s_1080p_5_max8831_leds[MAX8831_ID_LED4]),
346         }, {
347                 .id = MAX8831_ID_LED5,
348                 .name = "max8831_led_bl",
349                 .platform_data = &dsi_s_1080p_5_max8831_leds[MAX8831_ID_LED5],
350                 .pdata_size = sizeof(
351                                 dsi_s_1080p_5_max8831_leds[MAX8831_ID_LED5]),
352         }, {
353                 .id = MAX8831_BL_LEDS,
354                 .name = "max8831_display_bl",
355                 .platform_data = &dsi_s_1080p_5_max8831_bl_data,
356                 .pdata_size = sizeof(dsi_s_1080p_5_max8831_bl_data),
357         },
358 };
359
360 static struct max8831_platform_data dsi_s_1080p_5_max8831 = {
361         .num_subdevs = ARRAY_SIZE(dsi_s_1080p_5_max8831_subdevs),
362         .subdevs = dsi_s_1080p_5_max8831_subdevs,
363 };
364
365 static __maybe_unused struct i2c_board_info dsi_s_1080p_5_i2c_led_info = {
366         .type           = "max8831",
367         .addr           = 0x4d,
368         .platform_data  = &dsi_s_1080p_5_max8831,
369 };
370
371 static struct lm3528_platform_data lm3528_pdata = {
372         .dft_brightness = 200,
373         .is_powered = dsi_s_1080p_5_check_bl_power,
374         .notify = dsi_s_1080p_5_bl_notify,
375 };
376
377 static __maybe_unused struct i2c_board_info
378         lm3528_dsi_s_1080p_5_i2c_led_info = {
379         .type           = "lm3528_display_bl",
380         .addr           = 0x36,
381         .platform_data  = &lm3528_pdata,
382 };
383
384 static unsigned int dsi_s_pluto_edp_states[] = {
385         1130, 1017, 904, 791, 678, 565, 452, 339, 226, 113, 0
386 };
387 static unsigned int dsi_s_pluto_edp_brightness[] = {
388         255, 230, 204, 179, 153, 128, 102, 77, 51, 10, 0
389 };
390 static unsigned int dsi_s_ceres_edp_states[] = {
391         720, 644, 523, 490, 442, 427, 395, 363, 330, 299, 0
392 };
393 static unsigned int dsi_s_ceres_edp_brightness[] = {
394         255, 230, 204, 170, 140, 128, 102, 77, 51, 10, 0
395 };
396 static unsigned int dsi_s_atlantis_edp_states[] = {
397         720, 644, 523, 490, 442, 427, 395, 363, 330, 299, 0
398 };
399 static unsigned int dsi_s_atlantis_edp_brightness[] = {
400         255, 230, 204, 170, 140, 128, 102, 77, 51, 10, 0
401 };
402
403 static int __init dsi_s_1080p_5_register_bl_dev(void)
404 {
405         struct i2c_board_info *bl_info;
406         struct board_info board_info;
407         tegra_get_board_info(&board_info);
408
409         switch (board_info.board_id) {
410         case BOARD_E1670: /* Atlantis ERS */
411         case BOARD_E1671: /* Atlantis POP Socket */
412         case BOARD_E1740: /* Atlantis FFD */
413                 lm3528_pdata.edp_states = dsi_s_atlantis_edp_states;
414                 lm3528_pdata.edp_brightness = dsi_s_atlantis_edp_brightness;
415                 bl_info = &lm3528_dsi_s_1080p_5_i2c_led_info;
416                 dsi_s_1080p_5_bl_response_curve =
417                                 dsi_s_1080p_5_lm3528_bl_response_curve;
418                 break;
419         case BOARD_E1680: /* Ceres ERS */
420         case BOARD_E1681: /* Ceres DSC Socket */
421         case BOARD_E1690: /* Ceres FFD */
422                 dsi_s_1080p_5_max8831_bl_data.edp_states =
423                         dsi_s_ceres_edp_states;
424                 dsi_s_1080p_5_max8831_bl_data.edp_brightness =
425                                 dsi_s_ceres_edp_brightness;
426                 bl_info = &dsi_s_1080p_5_i2c_led_info;
427                 dsi_s_1080p_5_bl_response_curve =
428                                 dsi_s_1080p_5_max8831_bl_response_curve;
429                 break;
430         case BOARD_E1580: /* Pluto */
431         /* fall through */
432         default:
433                 dsi_s_1080p_5_max8831_bl_data.edp_states =
434                         dsi_s_pluto_edp_states;
435                 dsi_s_1080p_5_max8831_bl_data.edp_brightness =
436                                 dsi_s_pluto_edp_brightness;
437                 bl_info = &dsi_s_1080p_5_i2c_led_info;
438                 dsi_s_1080p_5_bl_response_curve =
439                                 dsi_s_1080p_5_max8831_bl_response_curve;
440                 break;
441         }
442
443         return i2c_register_board_info(1, bl_info, 1);
444 }
445
446 struct tegra_dc_mode dsi_s_1080p_5_modes[] = {
447         /* 1080x1920@60Hz */
448         {
449                 .pclk = 143700000,
450                 .h_ref_to_sync = 4,
451                 .v_ref_to_sync = 1,
452                 .h_sync_width = 10,
453                 .v_sync_width = 2,
454                 .h_back_porch = 50,
455                 .v_back_porch = 4,
456                 .h_active = 1080,
457                 .v_active = 1920,
458                 .h_front_porch = 100,
459                 .v_front_porch = 4,
460         },
461 };
462 static int dsi_s_1080p_5_reg_get(void)
463 {
464         int err = 0;
465
466         if (dsi_s_1080p_5_reg_requested)
467                 return 0;
468
469         vdd_lcd_s_1v8 = regulator_get(NULL, "vdd_lcd_1v8_s");
470         if (IS_ERR(vdd_lcd_s_1v8)) {
471                 pr_err("vdd_lcd_1v8_s regulator get failed\n");
472                 err = PTR_ERR(vdd_lcd_s_1v8);
473                 vdd_lcd_s_1v8 = NULL;
474                 goto fail;
475         }
476
477         vdd_sys_bl_3v7 = regulator_get(NULL, "vdd_sys_bl");
478         if (IS_ERR(vdd_sys_bl_3v7)) {
479                 pr_err("vdd_sys_bl regulator get failed\n");
480                 err = PTR_ERR(vdd_sys_bl_3v7);
481                 vdd_sys_bl_3v7 = NULL;
482                 goto fail;
483         }
484
485         dsi_s_1080p_5_reg_requested = true;
486         return 0;
487 fail:
488         return err;
489 }
490
491 static struct tegra_dsi_out dsi_s_1080p_5_pdata;
492 static int dsi_s_1080p_5_gpio_get(void)
493 {
494         int err = 0;
495
496         if (dsi_s_1080p_5_gpio_requested)
497                 return 0;
498
499         err = gpio_request(dsi_s_1080p_5_pdata.dsi_panel_rst_gpio, "panel rst");
500         if (err < 0) {
501                 pr_err("panel reset gpio request failed\n");
502                 goto fail;
503         }
504
505         err = gpio_request(dsi_s_1080p_5_pdata.dsi_panel_bl_en_gpio,
506                 "panel backlight");
507         if (err < 0) {
508                 pr_err("panel backlight gpio request failed\n");
509                 goto fail;
510         }
511
512
513
514         dsi_s_1080p_5_gpio_requested = true;
515         return 0;
516 fail:
517         return err;
518 }
519
520 static int dsi_s_1080p_5_enable(struct device *dev)
521 {
522         int err = 0;
523         err = dsi_s_1080p_5_reg_get();
524         if (err < 0) {
525                 pr_err("dsi regulator get failed\n");
526                 goto fail;
527         }
528
529         err = dsi_s_1080p_5_gpio_get();
530         if (err < 0) {
531                 pr_err("dsi gpio request failed\n");
532                 goto fail;
533         }
534         gpio_direction_output(dsi_s_1080p_5_pdata.dsi_panel_rst_gpio, 0);
535
536         if (vdd_lcd_s_1v8) {
537                 err = regulator_enable(vdd_lcd_s_1v8);
538                 if (err < 0) {
539                         pr_err("vdd_lcd_1v8_s regulator enable failed\n");
540                         goto fail;
541                 }
542         }
543         usleep_range(3000, 5000);
544
545         if (vdd_sys_bl_3v7) {
546                 err = regulator_enable(vdd_sys_bl_3v7);
547                 if (err < 0) {
548                         pr_err("vdd_sys_bl regulator enable failed\n");
549                         goto fail;
550                 }
551         }
552         gpio_direction_output(dsi_s_1080p_5_pdata.dsi_panel_bl_en_gpio, 1);
553         mdelay(50);
554
555 #if DSI_PANEL_RESET
556         gpio_set_value(dsi_s_1080p_5_pdata.dsi_panel_rst_gpio, 1);
557         msleep(20);
558 #endif
559         is_bl_powered = true;
560
561         return 0;
562 fail:
563         return err;
564 }
565
566 static u8 panel_internal[] = {0x51, 0x0f, 0xff};
567
568 static struct tegra_dsi_cmd dsi_s_1080p_5_init_cmd[] = {
569
570         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xb0, 0x04),
571         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_NO_OP, 0x0),
572         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_NO_OP, 0x0),
573         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xd6, 0x01),
574         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_internal),
575         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0x53, 0x04),
576         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_SET_DISPLAY_ON, 0x0),
577         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_EXIT_SLEEP_MODE, 0x0),
578 };
579
580 static struct tegra_dsi_cmd dsi_s_1080p_5_suspend_cmd[] = {
581         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_SET_DISPLAY_OFF, 0x0),
582         DSI_DLY_MS(50),
583         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_ENTER_SLEEP_MODE, 0x0),
584 };
585
586 static struct tegra_dsi_out dsi_s_1080p_5_pdata = {
587         .n_data_lanes = 4,
588
589         .refresh_rate = 60,
590         .video_data_type = TEGRA_DSI_VIDEO_TYPE_VIDEO_MODE,
591         .video_clock_mode = TEGRA_DSI_VIDEO_CLOCK_CONTINUOUS,
592         .video_burst_mode = TEGRA_DSI_VIDEO_NONE_BURST_MODE_WITH_SYNC_END,
593         .controller_vs = DSI_VS_1,
594         .pixel_format = TEGRA_DSI_PIXEL_FORMAT_24BIT_P,
595         .virtual_channel = TEGRA_DSI_VIRTUAL_CHANNEL_0,
596
597         .panel_reset = DSI_PANEL_RESET,
598         .power_saving_suspend = true,
599
600         .dsi_init_cmd = dsi_s_1080p_5_init_cmd,
601         .n_init_cmd = ARRAY_SIZE(dsi_s_1080p_5_init_cmd),
602
603         .dsi_suspend_cmd = dsi_s_1080p_5_suspend_cmd,
604         .n_suspend_cmd = ARRAY_SIZE(dsi_s_1080p_5_suspend_cmd),
605 };
606
607 static int dsi_s_1080p_5_disable(void)
608 {
609         /* delay between sleep in and reset low */
610         msleep(100);
611
612         gpio_set_value(dsi_s_1080p_5_pdata.dsi_panel_rst_gpio, 0);
613         usleep_range(3000, 5000);
614
615         gpio_set_value(dsi_s_1080p_5_pdata.dsi_panel_bl_en_gpio, 0);
616         if (vdd_sys_bl_3v7)
617                 regulator_disable(vdd_sys_bl_3v7);
618         is_bl_powered = false;
619         usleep_range(3000, 5000);
620
621         if (vdd_lcd_s_1v8)
622                 regulator_disable(vdd_lcd_s_1v8);
623
624         return 0;
625 }
626
627 static void dsi_s_1080p_5_dc_out_init(struct tegra_dc_out *dc)
628 {
629         dc->dsi = &dsi_s_1080p_5_pdata;
630         dc->parent_clk = "pll_d_out0";
631         dc->modes = dsi_s_1080p_5_modes;
632         dc->n_modes = ARRAY_SIZE(dsi_s_1080p_5_modes);
633         dc->enable = dsi_s_1080p_5_enable;
634         dc->disable = dsi_s_1080p_5_disable;
635         dc->width = 62;
636         dc->height = 110;
637         dc->flags = DC_CTRL_MODE;
638 }
639 static void dsi_s_1080p_5_fb_data_init(struct tegra_fb_data *fb)
640 {
641         fb->xres = dsi_s_1080p_5_modes[0].h_active;
642         fb->yres = dsi_s_1080p_5_modes[0].v_active;
643 }
644
645 static void dsi_s_1080p_5_sd_settings_init
646 (struct tegra_dc_sd_settings *settings)
647 {
648         struct board_info bi;
649         struct board_info board_info;
650         tegra_get_display_board_info(&bi);
651         tegra_get_board_info(&board_info);
652
653         if ((bi.board_id == BOARD_E1563) || (board_info.board_id == BOARD_E1740))
654                 settings->bl_device_name = "lm3528_display_bl";
655         else
656                 settings->bl_device_name = "max8831_display_bl";
657 }
658
659 static void dsi_s_1080p_5_cmu_init(struct tegra_dc_platform_data *pdata)
660 {
661         pdata->cmu = &dsi_s_1080p_5_cmu;
662 }
663
664 struct tegra_panel __initdata dsi_s_1080p_5 = {
665         .init_sd_settings = dsi_s_1080p_5_sd_settings_init,
666         .init_dc_out = dsi_s_1080p_5_dc_out_init,
667         .init_fb_data = dsi_s_1080p_5_fb_data_init,
668         .register_bl_dev = dsi_s_1080p_5_register_bl_dev,
669         .init_cmu_data = dsi_s_1080p_5_cmu_init,
670 };
671 EXPORT_SYMBOL(dsi_s_1080p_5);