ARM: tegra: fix regulator_get() return value check
[linux-3.10.git] / arch / arm / mach-tegra / panel-l-720p-5.c
1 /*
2  * arch/arm/mach-tegra/panel-l-720p-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/regulator/consumer.h>
23 #include <linux/pwm_backlight.h>
24 #include <linux/mfd/max8831.h>
25 #include <linux/max8831_backlight.h>
26 #include <linux/leds.h>
27 #include <linux/ioport.h>
28 #include <linux/lm3528.h>
29 #include <linux/export.h>
30
31 #include "gpio-names.h"
32 #include "board-panel.h"
33 #include "board.h"
34
35 #define DSI_PANEL_RESET         1
36
37 #define DC_CTRL_MODE            TEGRA_DC_OUT_CONTINUOUS_MODE
38
39 static struct regulator *vdd_lcd_s_1v8;
40 static struct regulator *vdd_sys_bl_3v7;
41 static struct regulator *avdd_lcd_3v0_2v8;
42
43 static bool dsi_l_720p_5_reg_requested;
44 static bool dsi_l_720p_5_gpio_requested;
45 static bool is_bl_powered;
46
47 #ifdef CONFIG_TEGRA_DC_CMU
48 static struct tegra_dc_cmu dsi_l_720p_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                 0x10D, 0x3F3, 0x000, /* 1.05036053  -0.05066457 0.00030404 */
87                 0x000, 0x0FC, 0x003, /* -0.00012137 0.98659651  0.01352485 */
88                 0x002, 0x001, 0x0FC, /* 0.00722989  0.00559134  0.98717878 */
89         },
90         /* lut2 maps linear space to sRGB */
91         {
92                 0,    1,    2,    2,    3,    4,    5,    6,
93                 6,    7,    8,    9,    10,   10,   11,   12,
94                 13,   13,   14,   15,   15,   16,   16,   17,
95                 18,   18,   19,   19,   20,   20,   21,   21,
96                 22,   22,   23,   23,   23,   24,   24,   25,
97                 25,   25,   26,   26,   27,   27,   27,   28,
98                 28,   29,   29,   29,   30,   30,   30,   31,
99                 31,   31,   32,   32,   32,   33,   33,   33,
100                 34,   34,   34,   34,   35,   35,   35,   36,
101                 36,   36,   37,   37,   37,   37,   38,   38,
102                 38,   38,   39,   39,   39,   40,   40,   40,
103                 40,   41,   41,   41,   41,   42,   42,   42,
104                 42,   43,   43,   43,   43,   43,   44,   44,
105                 44,   44,   45,   45,   45,   45,   46,   46,
106                 46,   46,   46,   47,   47,   47,   47,   48,
107                 48,   48,   48,   48,   49,   49,   49,   49,
108                 49,   50,   50,   50,   50,   50,   51,   51,
109                 51,   51,   51,   52,   52,   52,   52,   52,
110                 53,   53,   53,   53,   53,   54,   54,   54,
111                 54,   54,   55,   55,   55,   55,   55,   55,
112                 56,   56,   56,   56,   56,   57,   57,   57,
113                 57,   57,   57,   58,   58,   58,   58,   58,
114                 58,   59,   59,   59,   59,   59,   59,   60,
115                 60,   60,   60,   60,   60,   61,   61,   61,
116                 61,   61,   61,   62,   62,   62,   62,   62,
117                 62,   63,   63,   63,   63,   63,   63,   64,
118                 64,   64,   64,   64,   64,   64,   65,   65,
119                 65,   65,   65,   65,   66,   66,   66,   66,
120                 66,   66,   66,   67,   67,   67,   67,   67,
121                 67,   67,   68,   68,   68,   68,   68,   68,
122                 68,   69,   69,   69,   69,   69,   69,   69,
123                 70,   70,   70,   70,   70,   70,   70,   71,
124                 71,   71,   71,   71,   71,   71,   72,   72,
125                 72,   72,   72,   72,   72,   72,   73,   73,
126                 73,   73,   73,   73,   73,   74,   74,   74,
127                 74,   74,   74,   74,   74,   75,   75,   75,
128                 75,   75,   75,   75,   75,   76,   76,   76,
129                 76,   76,   76,   76,   77,   77,   77,   77,
130                 77,   77,   77,   77,   78,   78,   78,   78,
131                 78,   78,   78,   78,   78,   79,   79,   79,
132                 79,   79,   79,   79,   79,   80,   80,   80,
133                 80,   80,   80,   80,   80,   81,   81,   81,
134                 81,   81,   81,   81,   81,   81,   82,   82,
135                 82,   82,   82,   82,   82,   82,   83,   83,
136                 83,   83,   83,   83,   83,   83,   83,   84,
137                 84,   84,   84,   84,   84,   84,   84,   84,
138                 85,   85,   85,   85,   85,   85,   85,   85,
139                 85,   86,   86,   86,   86,   86,   86,   86,
140                 86,   86,   87,   87,   87,   87,   87,   87,
141                 87,   87,   87,   88,   88,   88,   88,   88,
142                 88,   88,   88,   88,   88,   89,   89,   89,
143                 89,   89,   89,   89,   89,   89,   90,   90,
144                 90,   90,   90,   90,   90,   90,   90,   90,
145                 91,   91,   91,   91,   91,   91,   91,   91,
146                 91,   91,   92,   92,   92,   92,   92,   92,
147                 92,   92,   92,   92,   93,   93,   93,   93,
148                 93,   93,   93,   93,   93,   93,   94,   94,
149                 94,   94,   94,   94,   94,   94,   94,   94,
150                 95,   95,   95,   95,   95,   95,   95,   95,
151                 95,   95,   96,   96,   96,   96,   96,   96,
152                 96,   96,   96,   96,   96,   97,   97,   97,
153                 97,   97,   97,   97,   97,   97,   97,   98,
154                 98,   98,   98,   98,   98,   98,   98,   98,
155                 98,   98,   99,   99,   99,   99,   99,   99,
156                 99,   100,  101,  101,  102,  103,  103,  104,
157                 105,  105,  106,  107,  107,  108,  109,  109,
158                 110,  111,  111,  112,  113,  113,  114,  115,
159                 115,  116,  116,  117,  118,  118,  119,  119,
160                 120,  120,  121,  122,  122,  123,  123,  124,
161                 124,  125,  126,  126,  127,  127,  128,  128,
162                 129,  129,  130,  130,  131,  131,  132,  132,
163                 133,  133,  134,  134,  135,  135,  136,  136,
164                 137,  137,  138,  138,  139,  139,  140,  140,
165                 141,  141,  142,  142,  143,  143,  144,  144,
166                 145,  145,  145,  146,  146,  147,  147,  148,
167                 148,  149,  149,  150,  150,  150,  151,  151,
168                 152,  152,  153,  153,  153,  154,  154,  155,
169                 155,  156,  156,  156,  157,  157,  158,  158,
170                 158,  159,  159,  160,  160,  160,  161,  161,
171                 162,  162,  162,  163,  163,  164,  164,  164,
172                 165,  165,  166,  166,  166,  167,  167,  167,
173                 168,  168,  169,  169,  169,  170,  170,  170,
174                 171,  171,  172,  172,  172,  173,  173,  173,
175                 174,  174,  174,  175,  175,  176,  176,  176,
176                 177,  177,  177,  178,  178,  178,  179,  179,
177                 179,  180,  180,  180,  181,  181,  182,  182,
178                 182,  183,  183,  183,  184,  184,  184,  185,
179                 185,  185,  186,  186,  186,  187,  187,  187,
180                 188,  188,  188,  189,  189,  189,  189,  190,
181                 190,  190,  191,  191,  191,  192,  192,  192,
182                 193,  193,  193,  194,  194,  194,  195,  195,
183                 195,  196,  196,  196,  196,  197,  197,  197,
184                 198,  198,  198,  199,  199,  199,  200,  200,
185                 200,  200,  201,  201,  201,  202,  202,  202,
186                 202,  203,  203,  203,  204,  204,  204,  205,
187                 205,  205,  205,  206,  206,  206,  207,  207,
188                 207,  207,  208,  208,  208,  209,  209,  209,
189                 209,  210,  210,  210,  211,  211,  211,  211,
190                 212,  212,  212,  213,  213,  213,  213,  214,
191                 214,  214,  214,  215,  215,  215,  216,  216,
192                 216,  216,  217,  217,  217,  217,  218,  218,
193                 218,  219,  219,  219,  219,  220,  220,  220,
194                 220,  221,  221,  221,  221,  222,  222,  222,
195                 223,  223,  223,  223,  224,  224,  224,  224,
196                 225,  225,  225,  225,  226,  226,  226,  226,
197                 227,  227,  227,  227,  228,  228,  228,  228,
198                 229,  229,  229,  229,  230,  230,  230,  230,
199                 231,  231,  231,  231,  232,  232,  232,  232,
200                 233,  233,  233,  233,  234,  234,  234,  234,
201                 235,  235,  235,  235,  236,  236,  236,  236,
202                 237,  237,  237,  237,  238,  238,  238,  238,
203                 239,  239,  239,  239,  240,  240,  240,  240,
204                 240,  241,  241,  241,  241,  242,  242,  242,
205                 242,  243,  243,  243,  243,  244,  244,  244,
206                 244,  244,  245,  245,  245,  245,  246,  246,
207                 246,  246,  247,  247,  247,  247,  247,  248,
208                 248,  248,  248,  249,  249,  249,  249,  249,
209                 250,  250,  250,  250,  251,  251,  251,  251,
210                 251,  252,  252,  252,  252,  253,  253,  253,
211                 253,  253,  254,  254,  254,  254,  255,  255,
212         },
213 };
214 #endif
215
216 static tegra_dc_bl_output dsi_l_720p_5_max8831_bl_response_curve = {
217         0, 1, 3, 5, 7, 9, 11, 13,
218         15, 17, 19, 21, 22, 23, 25, 26,
219         28, 29, 30, 32, 33, 34, 36, 37,
220         39, 40, 42, 43, 45, 46, 48, 49,
221         50, 51, 52, 53, 54, 55, 56, 57,
222         58, 59, 60, 61, 62, 63, 64, 65,
223         66, 67, 68, 70, 71, 72, 73, 74,
224         75, 77, 78, 79, 80, 81, 82, 83,
225         84, 85, 86, 87, 88, 89, 90, 91,
226         92, 93, 94, 95, 96, 97, 98, 99,
227         100, 101, 101, 102, 102, 103, 103, 104,
228         105, 105, 106, 107, 108, 108, 109, 110,
229         111, 112, 113, 114, 115, 116, 117, 118,
230         119, 120, 121, 121, 122, 123, 124, 125,
231         126, 127, 128, 129, 130, 131, 132, 133,
232         134, 135, 135, 136, 137, 138, 139, 140,
233         141, 142, 143, 144, 145, 146, 147, 148,
234         149, 150, 151, 152, 153, 154, 155, 156,
235         156, 157, 158, 159, 160, 161, 162, 162,
236         163, 163, 164, 164, 165, 165, 166, 167,
237         167, 168, 169, 170, 171, 172, 173, 173,
238         174, 175, 176, 177, 178, 179, 180, 181,
239         182, 183, 184, 185, 186, 187, 188, 188,
240         189, 190, 191, 192, 193, 194, 194, 195,
241         196, 197, 198, 199, 200, 201, 202, 203,
242         204, 204, 205, 206, 206, 207, 207, 208,
243         209, 209, 210, 211, 212, 213, 214, 215,
244         216, 217, 218, 219, 220, 221, 222, 223,
245         223, 224, 225, 226, 227, 228, 229, 230,
246         231, 232, 233, 234, 235, 236, 237, 238,
247         239, 240, 241, 242, 243, 244, 245, 246,
248         247, 247, 248, 250, 251, 252, 253, 255
249 };
250
251 static tegra_dc_bl_output dsi_l_720p_5_lm3528_bl_response_curve = {
252         1, 33, 61, 77, 88, 97, 105, 111,
253         116, 121, 125, 129, 132, 136, 139, 141,
254         144, 146, 149, 151, 153, 155, 157, 158,
255         160, 162, 163, 165, 166, 168, 169, 170,
256         172, 173, 174, 175, 176, 177, 178, 180,
257         181, 182, 182, 183, 184, 185, 186, 187,
258         188, 189, 189, 190, 191, 192, 193, 193,
259         194, 195, 195, 196, 197, 197, 198, 199,
260         199, 200, 201, 201, 202, 202, 203, 203,
261         204, 205, 205, 206, 206, 207, 207, 208,
262         208, 209, 209, 210, 210, 211, 211, 212,
263         212, 212, 213, 213, 214, 214, 215, 215,
264         216, 216, 216, 217, 217, 218, 218, 218,
265         219, 219, 219, 220, 220, 221, 221, 221,
266         222, 222, 222, 223, 223, 223, 224, 224,
267         224, 225, 225, 225, 226, 226, 226, 227,
268         227, 227, 228, 228, 228, 229, 229, 229,
269         229, 230, 230, 230, 231, 231, 231, 231,
270         232, 232, 232, 233, 233, 233, 233, 234,
271         234, 234, 234, 235, 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, 243, 244, 244, 244, 244, 244, 245,
277         245, 245, 245, 245, 246, 246, 246, 246,
278         246, 247, 247, 247, 247, 247, 248, 248,
279         248, 248, 248, 248, 249, 249, 249, 249,
280         249, 250, 250, 250, 250, 250, 250, 251,
281         251, 251, 251, 251, 251, 252, 252, 252,
282         252, 252, 252, 253, 253, 253, 253, 253,
283         253, 254, 254, 254, 254, 254, 254, 255
284 };
285
286 static p_tegra_dc_bl_output dsi_l_720p_5_bl_response_curve;
287
288 static int __maybe_unused dsi_l_720p_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_l_720p_5_bl_response_curve[brightness];
301
302         return brightness;
303 }
304 static bool __maybe_unused dsi_l_720p_5_check_bl_power(void)
305 {
306         return is_bl_powered;
307 }
308
309 /*
310         LG uses I2C max8831 blacklight device
311 */
312 static struct led_info dsi_l_720p_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_l_720p_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_l_720p_5_bl_notify,
330         .is_powered = dsi_l_720p_5_check_bl_power,
331 };
332
333 static struct max8831_subdev_info dsi_l_720p_5_max8831_subdevs[] = {
334         {
335                 .id = MAX8831_ID_LED3,
336                 .name = "max8831_led_bl",
337                 .platform_data = &dsi_l_720p_5_max8831_leds[MAX8831_ID_LED3],
338                 .pdata_size = sizeof(
339                                 dsi_l_720p_5_max8831_leds[MAX8831_ID_LED3]),
340         }, {
341                 .id = MAX8831_ID_LED4,
342                 .name = "max8831_led_bl",
343                 .platform_data = &dsi_l_720p_5_max8831_leds[MAX8831_ID_LED4],
344                 .pdata_size = sizeof(
345                                 dsi_l_720p_5_max8831_leds[MAX8831_ID_LED4]),
346         }, {
347                 .id = MAX8831_ID_LED5,
348                 .name = "max8831_led_bl",
349                 .platform_data = &dsi_l_720p_5_max8831_leds[MAX8831_ID_LED5],
350                 .pdata_size = sizeof(
351                                 dsi_l_720p_5_max8831_leds[MAX8831_ID_LED5]),
352         }, {
353                 .id = MAX8831_BL_LEDS,
354                 .name = "max8831_display_bl",
355                 .platform_data = &dsi_l_720p_5_max8831_bl_data,
356                 .pdata_size = sizeof(dsi_l_720p_5_max8831_bl_data),
357         },
358 };
359
360 static struct max8831_platform_data dsi_l_720p_5_max8831 = {
361         .num_subdevs = ARRAY_SIZE(dsi_l_720p_5_max8831_subdevs),
362         .subdevs = dsi_l_720p_5_max8831_subdevs,
363 };
364
365 static struct i2c_board_info dsi_l_720p_5_i2c_led_info = {
366         .type           = "max8831",
367         .addr           = 0x4d,
368         .platform_data  = &dsi_l_720p_5_max8831,
369 };
370
371 static struct lm3528_platform_data lm3528_pdata = {
372         .dft_brightness = 100,
373         .is_powered = dsi_l_720p_5_check_bl_power,
374         .notify = dsi_l_720p_5_bl_notify,
375 };
376
377 static struct i2c_board_info lm3528_dsi_l_720p_5_i2c_led_info = {
378         .type           = "lm3528_display_bl",
379         .addr           = 0x36,
380         .platform_data  = &lm3528_pdata,
381 };
382
383 static unsigned int dsi_l_pluto_edp_states[] = {
384         1130, 1017, 904, 791, 678, 565, 452, 339, 226, 113, 0
385 };
386 static unsigned int dsi_l_pluto_edp_brightness[] = {
387         255, 230, 204, 179, 153, 128, 102, 77, 51, 26, 0
388 };
389 static unsigned int dsi_l_ceres_edp_states[] = {
390         720, 644, 523, 490, 442, 427, 395, 363, 330, 299, 0
391 };
392 static unsigned int dsi_l_ceres_edp_brightness[] = {
393         255, 230, 204, 170, 140, 128, 102, 77, 51, 26, 0
394 };
395 static unsigned int dsi_l_atlantis_edp_states[] = {
396         720, 644, 523, 490, 442, 427, 395, 363, 330, 299, 0
397 };
398 static unsigned int dsi_l_atlantis_edp_brightness[] = {
399         255, 230, 204, 170, 140, 128, 102, 77, 51, 26, 0
400 };
401
402 static int __init dsi_l_720p_5_register_bl_dev(void)
403 {
404         struct i2c_board_info *bl_info;
405         struct board_info board_info;
406         tegra_get_board_info(&board_info);
407
408         switch (board_info.board_id) {
409         case BOARD_E1670: /* Atlantis ERS */
410         case BOARD_E1671: /* Atlantis POP Socket */
411                 lm3528_pdata.edp_states = dsi_l_atlantis_edp_states;
412                 lm3528_pdata.edp_brightness = dsi_l_atlantis_edp_brightness;
413                 bl_info = &lm3528_dsi_l_720p_5_i2c_led_info;
414                 dsi_l_720p_5_bl_response_curve =
415                         dsi_l_720p_5_lm3528_bl_response_curve;
416                 break;
417         case BOARD_E1680: /* Ceres ERS */
418         case BOARD_E1681: /* Ceres DSC Socket */
419                 dsi_l_720p_5_max8831_bl_data.edp_states =
420                         dsi_l_ceres_edp_states;
421                 dsi_l_720p_5_max8831_bl_data.edp_brightness =
422                                 dsi_l_ceres_edp_brightness;
423                 bl_info = &dsi_l_720p_5_i2c_led_info;
424                 dsi_l_720p_5_bl_response_curve =
425                                 dsi_l_720p_5_max8831_bl_response_curve;
426                 break;
427         case BOARD_E1580: /* Pluto */
428         /* fall through */
429         default:
430                 dsi_l_720p_5_max8831_bl_data.edp_states =
431                         dsi_l_pluto_edp_states;
432                 dsi_l_720p_5_max8831_bl_data.edp_brightness =
433                                 dsi_l_pluto_edp_brightness;
434                 bl_info = &dsi_l_720p_5_i2c_led_info;
435                 dsi_l_720p_5_bl_response_curve =
436                                 dsi_l_720p_5_max8831_bl_response_curve;
437                 break;
438         }
439
440         return i2c_register_board_info(1, bl_info, 1);
441 }
442
443 struct tegra_dc_mode dsi_l_720p_5_modes[] = {
444         {
445                 .pclk = 66700000,
446                 .h_ref_to_sync = 4,
447                 .v_ref_to_sync = 1,
448                 .h_sync_width = 4,
449                 .v_sync_width = 4,
450                 .h_back_porch = 112,
451                 .v_back_porch = 7,
452                 .h_active = 720,
453                 .v_active = 1280,
454                 .h_front_porch = 12,
455                 .v_front_porch = 20,
456         },
457 };
458 static int dsi_l_720p_5_reg_get(void)
459 {
460         int err = 0;
461
462         if (dsi_l_720p_5_reg_requested)
463                 return 0;
464
465         avdd_lcd_3v0_2v8 = regulator_get(NULL, "avdd_lcd");
466
467         if (IS_ERR(avdd_lcd_3v0_2v8)) {
468                 pr_err("avdd_lcd regulator get failed\n");
469                 err = PTR_ERR(avdd_lcd_3v0_2v8);
470                 avdd_lcd_3v0_2v8 = NULL;
471                 goto fail;
472         }
473
474         vdd_lcd_s_1v8 = regulator_get(NULL, "vdd_lcd_1v8_s");
475         if (IS_ERR(vdd_lcd_s_1v8)) {
476                 pr_err("vdd_lcd_1v8_s regulator get failed\n");
477                 err = PTR_ERR(vdd_lcd_s_1v8);
478                 vdd_lcd_s_1v8 = NULL;
479                 goto fail;
480         }
481
482         vdd_sys_bl_3v7 = regulator_get(NULL, "vdd_sys_bl");
483         if (IS_ERR(vdd_sys_bl_3v7)) {
484                 pr_err("vdd_sys_bl regulator get failed\n");
485                 err = PTR_ERR(vdd_sys_bl_3v7);
486                 vdd_sys_bl_3v7 = NULL;
487                 goto fail;
488         }
489
490         dsi_l_720p_5_reg_requested = true;
491         return 0;
492 fail:
493         return err;
494 }
495
496 static struct tegra_dsi_out dsi_l_720p_5_pdata;
497 static int dsi_l_720p_5_gpio_get(void)
498 {
499         int err = 0;
500
501         if (dsi_l_720p_5_gpio_requested)
502                 return 0;
503
504         err = gpio_request(dsi_l_720p_5_pdata.dsi_panel_rst_gpio,
505                 "panel rst");
506         if (err < 0) {
507                 pr_err("panel reset gpio request failed\n");
508                 goto fail;
509         }
510
511         err = gpio_request(dsi_l_720p_5_pdata.dsi_panel_bl_en_gpio,
512                 "panel backlight");
513         if (err < 0) {
514                 pr_err("panel backlight gpio request failed\n");
515                 goto fail;
516         }
517
518         err = gpio_request(dsi_l_720p_5_pdata.dsi_panel_bl_pwm_gpio,
519                 "panel pwm");
520         if (err < 0) {
521                 pr_err("panel backlight pwm gpio request failed\n");
522                 goto fail;
523         }
524
525         dsi_l_720p_5_gpio_requested = true;
526         return 0;
527 fail:
528         return err;
529 }
530
531 static int dsi_l_720p_5_enable(struct device *dev)
532 {
533         int err = 0;
534
535         err = dsi_l_720p_5_reg_get();
536         if (err < 0) {
537                 pr_err("dsi regulator get failed\n");
538                 goto fail;
539         }
540
541         err = tegra_panel_gpio_get_dt("lg,720p-5", &panel_of);
542         if (err < 0) {
543                 /* try to request gpios from board file */
544                 err = dsi_l_720p_5_gpio_get();
545                 if (err < 0) {
546                         pr_err("dsi gpio request failed\n");
547                         goto fail;
548                 }
549         }
550
551         if (gpio_is_valid(panel_of.panel_gpio[TEGRA_GPIO_RESET]))
552                 gpio_direction_output(
553                         panel_of.panel_gpio[TEGRA_GPIO_RESET], 0);
554         else
555                 gpio_direction_output(
556                         dsi_l_720p_5_pdata.dsi_panel_rst_gpio, 0);
557
558         if (avdd_lcd_3v0_2v8) {
559                 err = regulator_enable(avdd_lcd_3v0_2v8);
560                 if (err < 0) {
561                         pr_err("avdd_lcd regulator enable failed\n");
562                         goto fail;
563                 }
564                 regulator_set_voltage(avdd_lcd_3v0_2v8, 2800000, 2800000);
565         }
566
567         usleep_range(3000, 5000);
568
569         if (vdd_lcd_s_1v8) {
570                 err = regulator_enable(vdd_lcd_s_1v8);
571                 if (err < 0) {
572                         pr_err("vdd_lcd_1v8_s regulator enable failed\n");
573                         goto fail;
574                 }
575         }
576         usleep_range(3000, 5000);
577
578         if (vdd_sys_bl_3v7) {
579                 err = regulator_enable(vdd_sys_bl_3v7);
580                 if (err < 0) {
581                         pr_err("vdd_sys_bl regulator enable failed\n");
582                         goto fail;
583                 }
584         }
585         usleep_range(3000, 5000);
586
587 #if DSI_PANEL_RESET
588         err = tegra_panel_reset(&panel_of, 20);
589         if (err < 0) {
590                 /* use platform data */
591                 gpio_set_value(dsi_l_720p_5_pdata.dsi_panel_rst_gpio, 1);
592                 usleep_range(1000, 5000);
593                 gpio_set_value(dsi_l_720p_5_pdata.dsi_panel_rst_gpio, 0);
594                 usleep_range(1000, 5000);
595                 gpio_set_value(dsi_l_720p_5_pdata.dsi_panel_rst_gpio, 1);
596                 msleep(20);
597         }
598 #endif
599         if (gpio_is_valid(panel_of.panel_gpio[TEGRA_GPIO_BL_ENABLE]))
600                 gpio_direction_output(
601                         panel_of.panel_gpio[TEGRA_GPIO_BL_ENABLE], 1);
602         else
603                 gpio_direction_output(
604                         dsi_l_720p_5_pdata.dsi_panel_bl_en_gpio, 1);
605
606         is_bl_powered = true;
607         return 0;
608 fail:
609         return err;
610 }
611
612 static u8 panel_dsi_config[] = {0xe0, 0x43, 0x0, 0x80, 0x0, 0x0};
613 static u8 panel_disp_ctrl1[] = {0xb5, 0x34, 0x20, 0x40, 0x0, 0x20};
614 static u8 panel_disp_ctrl2[] = {0xb6, 0x04, 0x74, 0x0f, 0x16, 0x13};
615 static u8 panel_internal_clk[] = {0xc0, 0x01, 0x08};
616 static u8 panel_pwr_ctrl3[] = {
617         0xc3, 0x0, 0x09, 0x10, 0x02, 0x0, 0x66, 0x20, 0x13, 0x0};
618 static u8 panel_pwr_ctrl4[] = {0xc4, 0x23, 0x24, 0x17, 0x17, 0x59};
619 static u8 panel_positive_gamma_red[] = {
620         0xd0, 0x21, 0x13, 0x67, 0x37, 0x0c, 0x06, 0x62, 0x23, 0x03};
621 static u8 panel_negetive_gamma_red[] = {
622         0xd1, 0x32, 0x13, 0x66, 0x37, 0x02, 0x06, 0x62, 0x23, 0x03};
623 static u8 panel_positive_gamma_green[] = {
624         0xd2, 0x41, 0x14, 0x56, 0x37, 0x0c, 0x06, 0x62, 0x23, 0x03};
625 static u8 panel_negetive_gamma_green[] = {
626         0xd3, 0x52, 0x14, 0x55, 0x37, 0x02, 0x06, 0x62, 0x23, 0x03};
627 static u8 panel_positive_gamma_blue[] = {
628         0xd4, 0x41, 0x14, 0x56, 0x37, 0x0c, 0x06, 0x62, 0x23, 0x03};
629 static u8 panel_negetive_gamma_blue[] = {
630         0xd5, 0x52, 0x14, 0x55, 0x37, 0x02, 0x06, 0x62, 0x23, 0x03};
631 static u8 panel_ce2[] = {0x71, 0x0, 0x0, 0x01, 0x01};
632 static u8 panel_ce3[] = {0x72, 0x01, 0x0e};
633 static u8 panel_ce4[] = {0x73, 0x34, 0x52, 0x0};
634 static u8 panel_ce5[] = {0x74, 0x05, 0x0, 0x06};
635 static u8 panel_ce6[] = {0x75, 0x03, 0x0, 0x07};
636 static u8 panel_ce7[] = {0x76, 0x07, 0x0, 0x06};
637 static u8 panel_ce8[] = {0x77, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f};
638 static u8 panel_ce9[] = {0x78, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40};
639 static u8 panel_ce10[] = {
640         0x79, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40};
641 static u8 panel_ce11[] = {0x7a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
642 static u8 panel_ce12[] = {0x7b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
643 static u8 panel_ce13[] = {0x7c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
644
645 static struct tegra_dsi_cmd dsi_l_720p_5_init_cmd[] = {
646         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_dsi_config),
647
648         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_disp_ctrl1),
649         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_disp_ctrl2),
650
651         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_internal_clk),
652
653         /*  panel power control 1 */
654         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xc1, 0x0),
655         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_pwr_ctrl3),
656         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_pwr_ctrl4),
657
658         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_positive_gamma_red),
659         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_negetive_gamma_red),
660         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_positive_gamma_green),
661         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_negetive_gamma_green),
662         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_positive_gamma_blue),
663         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_negetive_gamma_blue),
664
665         DSI_CMD_SHORT(DSI_DCS_WRITE_1_PARAM, DSI_DCS_SET_ADDR_MODE, 0x08),
666
667         /* panel OTP 2 */
668         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xf9, 0x0),
669
670         /* panel CE 1 */
671         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0x70, 0x0),
672         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce2),
673         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce3),
674         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce4),
675         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce5),
676         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce6),
677         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce7),
678         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce8),
679         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce9),
680         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce10),
681         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce11),
682         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce12),
683         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce13),
684
685         /* panel power control 2 */
686         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xc2, 0x02),
687         DSI_DLY_MS(15),
688
689         /* panel power control 2 */
690         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xc2, 0x06),
691         DSI_DLY_MS(15),
692
693         /* panel power control 2 */
694         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xc2, 0x4e),
695         DSI_DLY_MS(85),
696
697         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_EXIT_SLEEP_MODE, 0x0),
698         DSI_DLY_MS(15),
699
700         /* panel OTP 2 */
701         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xf9, 0x80),
702         DSI_DLY_MS(15),
703
704         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_SET_DISPLAY_ON, 0x0),
705 };
706
707 static struct tegra_dsi_out dsi_l_720p_5_pdata = {
708         .n_data_lanes = 4,
709
710         .refresh_rate = 60,
711         .video_data_type = TEGRA_DSI_VIDEO_TYPE_VIDEO_MODE,
712         .video_clock_mode = TEGRA_DSI_VIDEO_CLOCK_CONTINUOUS,
713         .video_burst_mode = TEGRA_DSI_VIDEO_NONE_BURST_MODE_WITH_SYNC_END,
714
715         .controller_vs = DSI_VS_1,
716         .pixel_format = TEGRA_DSI_PIXEL_FORMAT_24BIT_P,
717         .virtual_channel = TEGRA_DSI_VIRTUAL_CHANNEL_0,
718
719         .panel_reset = DSI_PANEL_RESET,
720         .power_saving_suspend = true,
721         .dsi_init_cmd = dsi_l_720p_5_init_cmd,
722         .n_init_cmd = ARRAY_SIZE(dsi_l_720p_5_init_cmd),
723 };
724
725 static int dsi_l_720p_5_disable(void)
726 {
727         if (gpio_is_valid(panel_of.panel_gpio[TEGRA_GPIO_BL_ENABLE]))
728                 gpio_direction_output(
729                         panel_of.panel_gpio[TEGRA_GPIO_BL_ENABLE], 0);
730         else
731                 gpio_direction_output(
732                         dsi_l_720p_5_pdata.dsi_panel_bl_en_gpio, 0);
733
734         is_bl_powered = false;
735
736         if (gpio_is_valid(panel_of.panel_gpio[TEGRA_GPIO_RESET]))
737                 gpio_direction_output(
738                         panel_of.panel_gpio[TEGRA_GPIO_RESET], 0);
739         else
740                 gpio_direction_output(
741                         dsi_l_720p_5_pdata.dsi_panel_rst_gpio, 0);
742
743         if (vdd_sys_bl_3v7)
744                 regulator_disable(vdd_sys_bl_3v7);
745
746         if (vdd_lcd_s_1v8)
747                 regulator_disable(vdd_lcd_s_1v8);
748
749         if (avdd_lcd_3v0_2v8)
750                 regulator_disable(avdd_lcd_3v0_2v8);
751
752         return 0;
753 }
754
755 static void dsi_l_720p_5_dc_out_init(struct tegra_dc_out *dc)
756 {
757         dc->dsi = &dsi_l_720p_5_pdata;
758         dc->parent_clk = "pll_d_out0";
759         dc->modes = dsi_l_720p_5_modes;
760         dc->n_modes = ARRAY_SIZE(dsi_l_720p_5_modes);
761         dc->enable = dsi_l_720p_5_enable;
762         dc->disable = dsi_l_720p_5_disable;
763         dc->width = 62;
764         dc->height = 110;
765         dc->flags = DC_CTRL_MODE;
766 }
767 static void dsi_l_720p_5_fb_data_init(struct tegra_fb_data *fb)
768 {
769         fb->xres = dsi_l_720p_5_modes[0].h_active;
770         fb->yres = dsi_l_720p_5_modes[0].v_active;
771 }
772
773 static void dsi_l_720p_5_sd_settings_init(struct tegra_dc_sd_settings *settings)
774 {
775         struct board_info bi;
776         tegra_get_display_board_info(&bi);
777
778         if (bi.board_id == BOARD_E1563)
779                 settings->bl_device_name = "lm3528_display_bl";
780         else
781                 settings->bl_device_name = "max8831_display_bl";
782 }
783
784 #ifdef CONFIG_TEGRA_DC_CMU
785 static void dsi_l_720p_5_cmu_init(struct tegra_dc_platform_data *pdata)
786 {
787         pdata->cmu = &dsi_l_720p_5_cmu;
788 }
789 #endif
790
791 struct tegra_panel __initdata dsi_l_720p_5 = {
792         .init_sd_settings = dsi_l_720p_5_sd_settings_init,
793         .init_dc_out = dsi_l_720p_5_dc_out_init,
794         .init_fb_data = dsi_l_720p_5_fb_data_init,
795         .register_bl_dev = dsi_l_720p_5_register_bl_dev,
796 #ifdef CONFIG_TEGRA_DC_CMU
797         .init_cmu_data = dsi_l_720p_5_cmu_init,
798 #endif
799 };
800 EXPORT_SYMBOL(dsi_l_720p_5);