ARM: tegra12: set CPU rate to 2.2GHz for sku 0x87
[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 static struct tegra_dc_sd_settings dsi_l_720p_5_sd_settings = {
48         .enable = 1, /* enabled by default */
49         .use_auto_pwm = false,
50         .hw_update_delay = 0,
51         .bin_width = -1,
52         .aggressiveness = 5,
53         .use_vid_luma = false,
54         .phase_in_adjustments = 0,
55         .k_limit_enable = true,
56         .k_limit = 180,
57         .sd_window_enable = false,
58         .soft_clipping_enable = true,
59         /* Low soft clipping threshold to compensate for aggressive k_limit */
60         .soft_clipping_threshold = 128,
61         .smooth_k_enable = true,
62         .smooth_k_incr = 4,
63         /* Default video coefficients */
64         .coeff = {5, 9, 2},
65         .fc = {0, 0},
66         /* Immediate backlight changes */
67         .blp = {1024, 255},
68         /* Gammas: R: 2.2 G: 2.2 B: 2.2 */
69         /* Default BL TF */
70         .bltf = {
71                         {
72                                 {57, 65, 73, 82},
73                                 {92, 103, 114, 125},
74                                 {138, 150, 164, 178},
75                                 {193, 208, 224, 241},
76                         },
77                 },
78         /* Default LUT */
79         .lut = {
80                         {
81                                 {255, 255, 255},
82                                 {199, 199, 199},
83                                 {153, 153, 153},
84                                 {116, 116, 116},
85                                 {85, 85, 85},
86                                 {59, 59, 59},
87                                 {36, 36, 36},
88                                 {17, 17, 17},
89                                 {0, 0, 0},
90                         },
91                 },
92         .sd_brightness = &sd_brightness,
93         .use_vpulse2 = true,
94 };
95
96 #ifdef CONFIG_TEGRA_DC_CMU
97 static struct tegra_dc_cmu dsi_l_720p_5_cmu = {
98         /* lut1 maps sRGB to linear space. */
99         {
100                 0,    1,    2,    4,    5,    6,    7,    9,
101                 10,   11,   12,   14,   15,   16,   18,   20,
102                 21,   23,   25,   27,   29,   31,   33,   35,
103                 37,   40,   42,   45,   48,   50,   53,   56,
104                 59,   62,   66,   69,   72,   76,   79,   83,
105                 87,   91,   95,   99,   103,  107,  112,  116,
106                 121,  126,  131,  136,  141,  146,  151,  156,
107                 162,  168,  173,  179,  185,  191,  197,  204,
108                 210,  216,  223,  230,  237,  244,  251,  258,
109                 265,  273,  280,  288,  296,  304,  312,  320,
110                 329,  337,  346,  354,  363,  372,  381,  390,
111                 400,  409,  419,  428,  438,  448,  458,  469,
112                 479,  490,  500,  511,  522,  533,  544,  555,
113                 567,  578,  590,  602,  614,  626,  639,  651,
114                 664,  676,  689,  702,  715,  728,  742,  755,
115                 769,  783,  797,  811,  825,  840,  854,  869,
116                 884,  899,  914,  929,  945,  960,  976,  992,
117                 1008, 1024, 1041, 1057, 1074, 1091, 1108, 1125,
118                 1142, 1159, 1177, 1195, 1213, 1231, 1249, 1267,
119                 1286, 1304, 1323, 1342, 1361, 1381, 1400, 1420,
120                 1440, 1459, 1480, 1500, 1520, 1541, 1562, 1582,
121                 1603, 1625, 1646, 1668, 1689, 1711, 1733, 1755,
122                 1778, 1800, 1823, 1846, 1869, 1892, 1916, 1939,
123                 1963, 1987, 2011, 2035, 2059, 2084, 2109, 2133,
124                 2159, 2184, 2209, 2235, 2260, 2286, 2312, 2339,
125                 2365, 2392, 2419, 2446, 2473, 2500, 2527, 2555,
126                 2583, 2611, 2639, 2668, 2696, 2725, 2754, 2783,
127                 2812, 2841, 2871, 2901, 2931, 2961, 2991, 3022,
128                 3052, 3083, 3114, 3146, 3177, 3209, 3240, 3272,
129                 3304, 3337, 3369, 3402, 3435, 3468, 3501, 3535,
130                 3568, 3602, 3636, 3670, 3705, 3739, 3774, 3809,
131                 3844, 3879, 3915, 3950, 3986, 4022, 4059, 4095,
132         },
133         /* csc */
134         {
135                 0x10D, 0x3F3, 0x000, /* 1.05036053  -0.05066457 0.00030404 */
136                 0x000, 0x0FC, 0x003, /* -0.00012137 0.98659651  0.01352485 */
137                 0x002, 0x001, 0x0FC, /* 0.00722989  0.00559134  0.98717878 */
138         },
139         /* lut2 maps linear space to sRGB */
140         {
141                 0,    1,    2,    2,    3,    4,    5,    6,
142                 6,    7,    8,    9,    10,   10,   11,   12,
143                 13,   13,   14,   15,   15,   16,   16,   17,
144                 18,   18,   19,   19,   20,   20,   21,   21,
145                 22,   22,   23,   23,   23,   24,   24,   25,
146                 25,   25,   26,   26,   27,   27,   27,   28,
147                 28,   29,   29,   29,   30,   30,   30,   31,
148                 31,   31,   32,   32,   32,   33,   33,   33,
149                 34,   34,   34,   34,   35,   35,   35,   36,
150                 36,   36,   37,   37,   37,   37,   38,   38,
151                 38,   38,   39,   39,   39,   40,   40,   40,
152                 40,   41,   41,   41,   41,   42,   42,   42,
153                 42,   43,   43,   43,   43,   43,   44,   44,
154                 44,   44,   45,   45,   45,   45,   46,   46,
155                 46,   46,   46,   47,   47,   47,   47,   48,
156                 48,   48,   48,   48,   49,   49,   49,   49,
157                 49,   50,   50,   50,   50,   50,   51,   51,
158                 51,   51,   51,   52,   52,   52,   52,   52,
159                 53,   53,   53,   53,   53,   54,   54,   54,
160                 54,   54,   55,   55,   55,   55,   55,   55,
161                 56,   56,   56,   56,   56,   57,   57,   57,
162                 57,   57,   57,   58,   58,   58,   58,   58,
163                 58,   59,   59,   59,   59,   59,   59,   60,
164                 60,   60,   60,   60,   60,   61,   61,   61,
165                 61,   61,   61,   62,   62,   62,   62,   62,
166                 62,   63,   63,   63,   63,   63,   63,   64,
167                 64,   64,   64,   64,   64,   64,   65,   65,
168                 65,   65,   65,   65,   66,   66,   66,   66,
169                 66,   66,   66,   67,   67,   67,   67,   67,
170                 67,   67,   68,   68,   68,   68,   68,   68,
171                 68,   69,   69,   69,   69,   69,   69,   69,
172                 70,   70,   70,   70,   70,   70,   70,   71,
173                 71,   71,   71,   71,   71,   71,   72,   72,
174                 72,   72,   72,   72,   72,   72,   73,   73,
175                 73,   73,   73,   73,   73,   74,   74,   74,
176                 74,   74,   74,   74,   74,   75,   75,   75,
177                 75,   75,   75,   75,   75,   76,   76,   76,
178                 76,   76,   76,   76,   77,   77,   77,   77,
179                 77,   77,   77,   77,   78,   78,   78,   78,
180                 78,   78,   78,   78,   78,   79,   79,   79,
181                 79,   79,   79,   79,   79,   80,   80,   80,
182                 80,   80,   80,   80,   80,   81,   81,   81,
183                 81,   81,   81,   81,   81,   81,   82,   82,
184                 82,   82,   82,   82,   82,   82,   83,   83,
185                 83,   83,   83,   83,   83,   83,   83,   84,
186                 84,   84,   84,   84,   84,   84,   84,   84,
187                 85,   85,   85,   85,   85,   85,   85,   85,
188                 85,   86,   86,   86,   86,   86,   86,   86,
189                 86,   86,   87,   87,   87,   87,   87,   87,
190                 87,   87,   87,   88,   88,   88,   88,   88,
191                 88,   88,   88,   88,   88,   89,   89,   89,
192                 89,   89,   89,   89,   89,   89,   90,   90,
193                 90,   90,   90,   90,   90,   90,   90,   90,
194                 91,   91,   91,   91,   91,   91,   91,   91,
195                 91,   91,   92,   92,   92,   92,   92,   92,
196                 92,   92,   92,   92,   93,   93,   93,   93,
197                 93,   93,   93,   93,   93,   93,   94,   94,
198                 94,   94,   94,   94,   94,   94,   94,   94,
199                 95,   95,   95,   95,   95,   95,   95,   95,
200                 95,   95,   96,   96,   96,   96,   96,   96,
201                 96,   96,   96,   96,   96,   97,   97,   97,
202                 97,   97,   97,   97,   97,   97,   97,   98,
203                 98,   98,   98,   98,   98,   98,   98,   98,
204                 98,   98,   99,   99,   99,   99,   99,   99,
205                 99,   100,  101,  101,  102,  103,  103,  104,
206                 105,  105,  106,  107,  107,  108,  109,  109,
207                 110,  111,  111,  112,  113,  113,  114,  115,
208                 115,  116,  116,  117,  118,  118,  119,  119,
209                 120,  120,  121,  122,  122,  123,  123,  124,
210                 124,  125,  126,  126,  127,  127,  128,  128,
211                 129,  129,  130,  130,  131,  131,  132,  132,
212                 133,  133,  134,  134,  135,  135,  136,  136,
213                 137,  137,  138,  138,  139,  139,  140,  140,
214                 141,  141,  142,  142,  143,  143,  144,  144,
215                 145,  145,  145,  146,  146,  147,  147,  148,
216                 148,  149,  149,  150,  150,  150,  151,  151,
217                 152,  152,  153,  153,  153,  154,  154,  155,
218                 155,  156,  156,  156,  157,  157,  158,  158,
219                 158,  159,  159,  160,  160,  160,  161,  161,
220                 162,  162,  162,  163,  163,  164,  164,  164,
221                 165,  165,  166,  166,  166,  167,  167,  167,
222                 168,  168,  169,  169,  169,  170,  170,  170,
223                 171,  171,  172,  172,  172,  173,  173,  173,
224                 174,  174,  174,  175,  175,  176,  176,  176,
225                 177,  177,  177,  178,  178,  178,  179,  179,
226                 179,  180,  180,  180,  181,  181,  182,  182,
227                 182,  183,  183,  183,  184,  184,  184,  185,
228                 185,  185,  186,  186,  186,  187,  187,  187,
229                 188,  188,  188,  189,  189,  189,  189,  190,
230                 190,  190,  191,  191,  191,  192,  192,  192,
231                 193,  193,  193,  194,  194,  194,  195,  195,
232                 195,  196,  196,  196,  196,  197,  197,  197,
233                 198,  198,  198,  199,  199,  199,  200,  200,
234                 200,  200,  201,  201,  201,  202,  202,  202,
235                 202,  203,  203,  203,  204,  204,  204,  205,
236                 205,  205,  205,  206,  206,  206,  207,  207,
237                 207,  207,  208,  208,  208,  209,  209,  209,
238                 209,  210,  210,  210,  211,  211,  211,  211,
239                 212,  212,  212,  213,  213,  213,  213,  214,
240                 214,  214,  214,  215,  215,  215,  216,  216,
241                 216,  216,  217,  217,  217,  217,  218,  218,
242                 218,  219,  219,  219,  219,  220,  220,  220,
243                 220,  221,  221,  221,  221,  222,  222,  222,
244                 223,  223,  223,  223,  224,  224,  224,  224,
245                 225,  225,  225,  225,  226,  226,  226,  226,
246                 227,  227,  227,  227,  228,  228,  228,  228,
247                 229,  229,  229,  229,  230,  230,  230,  230,
248                 231,  231,  231,  231,  232,  232,  232,  232,
249                 233,  233,  233,  233,  234,  234,  234,  234,
250                 235,  235,  235,  235,  236,  236,  236,  236,
251                 237,  237,  237,  237,  238,  238,  238,  238,
252                 239,  239,  239,  239,  240,  240,  240,  240,
253                 240,  241,  241,  241,  241,  242,  242,  242,
254                 242,  243,  243,  243,  243,  244,  244,  244,
255                 244,  244,  245,  245,  245,  245,  246,  246,
256                 246,  246,  247,  247,  247,  247,  247,  248,
257                 248,  248,  248,  249,  249,  249,  249,  249,
258                 250,  250,  250,  250,  251,  251,  251,  251,
259                 251,  252,  252,  252,  252,  253,  253,  253,
260                 253,  253,  254,  254,  254,  254,  255,  255,
261         },
262 };
263 #endif
264
265 static tegra_dc_bl_output dsi_l_720p_5_max8831_bl_response_curve = {
266         0, 1, 3, 5, 7, 9, 11, 13,
267         15, 17, 19, 21, 22, 23, 25, 26,
268         28, 29, 30, 32, 33, 34, 36, 37,
269         39, 40, 42, 43, 45, 46, 48, 49,
270         50, 51, 52, 53, 54, 55, 56, 57,
271         58, 59, 60, 61, 62, 63, 64, 65,
272         66, 67, 68, 70, 71, 72, 73, 74,
273         75, 77, 78, 79, 80, 81, 82, 83,
274         84, 85, 86, 87, 88, 89, 90, 91,
275         92, 93, 94, 95, 96, 97, 98, 99,
276         100, 101, 101, 102, 102, 103, 103, 104,
277         105, 105, 106, 107, 108, 108, 109, 110,
278         111, 112, 113, 114, 115, 116, 117, 118,
279         119, 120, 121, 121, 122, 123, 124, 125,
280         126, 127, 128, 129, 130, 131, 132, 133,
281         134, 135, 135, 136, 137, 138, 139, 140,
282         141, 142, 143, 144, 145, 146, 147, 148,
283         149, 150, 151, 152, 153, 154, 155, 156,
284         156, 157, 158, 159, 160, 161, 162, 162,
285         163, 163, 164, 164, 165, 165, 166, 167,
286         167, 168, 169, 170, 171, 172, 173, 173,
287         174, 175, 176, 177, 178, 179, 180, 181,
288         182, 183, 184, 185, 186, 187, 188, 188,
289         189, 190, 191, 192, 193, 194, 194, 195,
290         196, 197, 198, 199, 200, 201, 202, 203,
291         204, 204, 205, 206, 206, 207, 207, 208,
292         209, 209, 210, 211, 212, 213, 214, 215,
293         216, 217, 218, 219, 220, 221, 222, 223,
294         223, 224, 225, 226, 227, 228, 229, 230,
295         231, 232, 233, 234, 235, 236, 237, 238,
296         239, 240, 241, 242, 243, 244, 245, 246,
297         247, 247, 248, 250, 251, 252, 253, 255
298 };
299
300 static tegra_dc_bl_output dsi_l_720p_5_lm3528_bl_response_curve = {
301         1, 33, 61, 77, 88, 97, 105, 111,
302         116, 121, 125, 129, 132, 136, 139, 141,
303         144, 146, 149, 151, 153, 155, 157, 158,
304         160, 162, 163, 165, 166, 168, 169, 170,
305         172, 173, 174, 175, 176, 177, 178, 180,
306         181, 182, 182, 183, 184, 185, 186, 187,
307         188, 189, 189, 190, 191, 192, 193, 193,
308         194, 195, 195, 196, 197, 197, 198, 199,
309         199, 200, 201, 201, 202, 202, 203, 203,
310         204, 205, 205, 206, 206, 207, 207, 208,
311         208, 209, 209, 210, 210, 211, 211, 212,
312         212, 212, 213, 213, 214, 214, 215, 215,
313         216, 216, 216, 217, 217, 218, 218, 218,
314         219, 219, 219, 220, 220, 221, 221, 221,
315         222, 222, 222, 223, 223, 223, 224, 224,
316         224, 225, 225, 225, 226, 226, 226, 227,
317         227, 227, 228, 228, 228, 229, 229, 229,
318         229, 230, 230, 230, 231, 231, 231, 231,
319         232, 232, 232, 233, 233, 233, 233, 234,
320         234, 234, 234, 235, 235, 235, 235, 236,
321         236, 236, 236, 237, 237, 237, 237, 238,
322         238, 238, 238, 239, 239, 239, 239, 240,
323         240, 240, 240, 240, 241, 241, 241, 241,
324         242, 242, 242, 242, 242, 243, 243, 243,
325         243, 243, 244, 244, 244, 244, 244, 245,
326         245, 245, 245, 245, 246, 246, 246, 246,
327         246, 247, 247, 247, 247, 247, 248, 248,
328         248, 248, 248, 248, 249, 249, 249, 249,
329         249, 250, 250, 250, 250, 250, 250, 251,
330         251, 251, 251, 251, 251, 252, 252, 252,
331         252, 252, 252, 253, 253, 253, 253, 253,
332         253, 254, 254, 254, 254, 254, 254, 255
333 };
334
335 static p_tegra_dc_bl_output dsi_l_720p_5_bl_response_curve;
336
337 static int __maybe_unused dsi_l_720p_5_bl_notify(struct device *unused,
338                                                         int brightness)
339 {
340         int cur_sd_brightness = atomic_read(&sd_brightness);
341
342         /* SD brightness is a percentage */
343         brightness = (brightness * cur_sd_brightness) / 255;
344
345         /* Apply any backlight response curve */
346         if (brightness > 255)
347                 pr_info("Error: Brightness > 255!\n");
348         else
349                 brightness = dsi_l_720p_5_bl_response_curve[brightness];
350
351         return brightness;
352 }
353 static bool __maybe_unused dsi_l_720p_5_check_bl_power(void)
354 {
355         return is_bl_powered;
356 }
357
358 /*
359         LG uses I2C max8831 blacklight device
360 */
361 static struct led_info dsi_l_720p_5_max8831_leds[] = {
362         [MAX8831_ID_LED3] = {
363                 .name = "max8831:red:pluto",
364         },
365         [MAX8831_ID_LED4] = {
366                 .name = "max8831:green:pluto",
367         },
368         [MAX8831_ID_LED5] = {
369                 .name = "max8831:blue:pluto",
370         },
371 };
372
373 static struct platform_max8831_backlight_data dsi_l_720p_5_max8831_bl_data = {
374         .id     = -1,
375         .name   = "pluto_display_bl",
376         .max_brightness = MAX8831_BL_LEDS_MAX_CURR,
377         .dft_brightness = 100,
378         .notify = dsi_l_720p_5_bl_notify,
379         .is_powered = dsi_l_720p_5_check_bl_power,
380 };
381
382 static struct max8831_subdev_info dsi_l_720p_5_max8831_subdevs[] = {
383         {
384                 .id = MAX8831_ID_LED3,
385                 .name = "max8831_led_bl",
386                 .platform_data = &dsi_l_720p_5_max8831_leds[MAX8831_ID_LED3],
387                 .pdata_size = sizeof(
388                                 dsi_l_720p_5_max8831_leds[MAX8831_ID_LED3]),
389         }, {
390                 .id = MAX8831_ID_LED4,
391                 .name = "max8831_led_bl",
392                 .platform_data = &dsi_l_720p_5_max8831_leds[MAX8831_ID_LED4],
393                 .pdata_size = sizeof(
394                                 dsi_l_720p_5_max8831_leds[MAX8831_ID_LED4]),
395         }, {
396                 .id = MAX8831_ID_LED5,
397                 .name = "max8831_led_bl",
398                 .platform_data = &dsi_l_720p_5_max8831_leds[MAX8831_ID_LED5],
399                 .pdata_size = sizeof(
400                                 dsi_l_720p_5_max8831_leds[MAX8831_ID_LED5]),
401         }, {
402                 .id = MAX8831_BL_LEDS,
403                 .name = "max8831_display_bl",
404                 .platform_data = &dsi_l_720p_5_max8831_bl_data,
405                 .pdata_size = sizeof(dsi_l_720p_5_max8831_bl_data),
406         },
407 };
408
409 static struct max8831_platform_data dsi_l_720p_5_max8831 = {
410         .num_subdevs = ARRAY_SIZE(dsi_l_720p_5_max8831_subdevs),
411         .subdevs = dsi_l_720p_5_max8831_subdevs,
412 };
413
414 static struct i2c_board_info dsi_l_720p_5_i2c_led_info = {
415         .type           = "max8831",
416         .addr           = 0x4d,
417         .platform_data  = &dsi_l_720p_5_max8831,
418 };
419
420 static struct lm3528_platform_data lm3528_pdata = {
421         .dft_brightness = 100,
422         .is_powered = dsi_l_720p_5_check_bl_power,
423         .notify = dsi_l_720p_5_bl_notify,
424 };
425
426 static struct i2c_board_info lm3528_dsi_l_720p_5_i2c_led_info = {
427         .type           = "lm3528_display_bl",
428         .addr           = 0x36,
429         .platform_data  = &lm3528_pdata,
430 };
431
432 static int __init dsi_l_720p_5_register_bl_dev(void)
433 {
434         struct i2c_board_info *bl_info;
435         struct board_info board_info;
436         tegra_get_board_info(&board_info);
437
438         switch (board_info.board_id) {
439         case BOARD_E1670: /* Atlantis ERS */
440         case BOARD_E1671: /* Atlantis POP Socket */
441                 bl_info = &lm3528_dsi_l_720p_5_i2c_led_info;
442                 dsi_l_720p_5_bl_response_curve =
443                         dsi_l_720p_5_lm3528_bl_response_curve;
444                 break;
445         case BOARD_E1680: /* Ceres ERS */
446         case BOARD_E1681: /* Ceres DSC Socket */
447                 bl_info = &dsi_l_720p_5_i2c_led_info;
448                 dsi_l_720p_5_bl_response_curve =
449                                 dsi_l_720p_5_max8831_bl_response_curve;
450                 break;
451         case BOARD_E1580: /* Pluto */
452         /* fall through */
453         default:
454                 bl_info = &dsi_l_720p_5_i2c_led_info;
455                 dsi_l_720p_5_bl_response_curve =
456                                 dsi_l_720p_5_max8831_bl_response_curve;
457                 break;
458         }
459
460         return i2c_register_board_info(1, bl_info, 1);
461 }
462
463 struct tegra_dc_mode dsi_l_720p_5_modes[] = {
464         {
465                 .pclk = 66700000,
466                 .h_ref_to_sync = 4,
467                 .v_ref_to_sync = 1,
468                 .h_sync_width = 4,
469                 .v_sync_width = 4,
470                 .h_back_porch = 112,
471                 .v_back_porch = 7,
472                 .h_active = 720,
473                 .v_active = 1280,
474                 .h_front_porch = 12,
475                 .v_front_porch = 20,
476         },
477 };
478 static int dsi_l_720p_5_reg_get(void)
479 {
480         int err = 0;
481
482         if (dsi_l_720p_5_reg_requested)
483                 return 0;
484
485         avdd_lcd_3v0_2v8 = regulator_get(NULL, "avdd_lcd");
486
487         if (IS_ERR(avdd_lcd_3v0_2v8)) {
488                 pr_err("avdd_lcd regulator get failed\n");
489                 err = PTR_ERR(avdd_lcd_3v0_2v8);
490                 avdd_lcd_3v0_2v8 = NULL;
491                 goto fail;
492         }
493
494         vdd_lcd_s_1v8 = regulator_get(NULL, "vdd_lcd_1v8_s");
495         if (IS_ERR(vdd_lcd_s_1v8)) {
496                 pr_err("vdd_lcd_1v8_s regulator get failed\n");
497                 err = PTR_ERR(vdd_lcd_s_1v8);
498                 vdd_lcd_s_1v8 = NULL;
499                 goto fail;
500         }
501
502         vdd_sys_bl_3v7 = regulator_get(NULL, "vdd_sys_bl");
503         if (IS_ERR(vdd_sys_bl_3v7)) {
504                 pr_err("vdd_sys_bl regulator get failed\n");
505                 err = PTR_ERR(vdd_sys_bl_3v7);
506                 vdd_sys_bl_3v7 = NULL;
507                 goto fail;
508         }
509
510         dsi_l_720p_5_reg_requested = true;
511         return 0;
512 fail:
513         return err;
514 }
515
516 static struct tegra_dsi_out dsi_l_720p_5_pdata;
517 static int dsi_l_720p_5_gpio_get(void)
518 {
519         int err = 0;
520
521         if (dsi_l_720p_5_gpio_requested)
522                 return 0;
523
524         err = gpio_request(dsi_l_720p_5_pdata.dsi_panel_rst_gpio,
525                 "panel rst");
526         if (err < 0) {
527                 pr_err("panel reset gpio request failed\n");
528                 goto fail;
529         }
530
531         err = gpio_request(dsi_l_720p_5_pdata.dsi_panel_bl_en_gpio,
532                 "panel backlight");
533         if (err < 0) {
534                 pr_err("panel backlight gpio request failed\n");
535                 goto fail;
536         }
537
538         err = gpio_request(dsi_l_720p_5_pdata.dsi_panel_bl_pwm_gpio,
539                 "panel pwm");
540         if (err < 0) {
541                 pr_err("panel backlight pwm gpio request failed\n");
542                 goto fail;
543         }
544
545         dsi_l_720p_5_gpio_requested = true;
546         return 0;
547 fail:
548         return err;
549 }
550
551 static int dsi_l_720p_5_enable(struct device *dev)
552 {
553         int err = 0;
554
555         err = dsi_l_720p_5_reg_get();
556         if (err < 0) {
557                 pr_err("dsi regulator get failed\n");
558                 goto fail;
559         }
560
561         err = tegra_panel_gpio_get_dt("lg,720p-5", &panel_of);
562         if (err < 0) {
563                 /* try to request gpios from board file */
564                 err = dsi_l_720p_5_gpio_get();
565                 if (err < 0) {
566                         pr_err("dsi gpio request failed\n");
567                         goto fail;
568                 }
569         }
570
571         if (gpio_is_valid(panel_of.panel_gpio[TEGRA_GPIO_RESET]))
572                 gpio_direction_output(
573                         panel_of.panel_gpio[TEGRA_GPIO_RESET], 0);
574         else
575                 gpio_direction_output(
576                         dsi_l_720p_5_pdata.dsi_panel_rst_gpio, 0);
577
578         if (avdd_lcd_3v0_2v8) {
579                 err = regulator_enable(avdd_lcd_3v0_2v8);
580                 if (err < 0) {
581                         pr_err("avdd_lcd regulator enable failed\n");
582                         goto fail;
583                 }
584                 regulator_set_voltage(avdd_lcd_3v0_2v8, 2800000, 2800000);
585         }
586
587         usleep_range(3000, 5000);
588
589         if (vdd_lcd_s_1v8) {
590                 err = regulator_enable(vdd_lcd_s_1v8);
591                 if (err < 0) {
592                         pr_err("vdd_lcd_1v8_s regulator enable failed\n");
593                         goto fail;
594                 }
595         }
596         usleep_range(3000, 5000);
597
598         if (vdd_sys_bl_3v7) {
599                 err = regulator_enable(vdd_sys_bl_3v7);
600                 if (err < 0) {
601                         pr_err("vdd_sys_bl regulator enable failed\n");
602                         goto fail;
603                 }
604         }
605         usleep_range(3000, 5000);
606
607 #if DSI_PANEL_RESET
608         err = tegra_panel_reset(&panel_of, 20);
609         if (err < 0) {
610                 /* use platform data */
611                 gpio_set_value(dsi_l_720p_5_pdata.dsi_panel_rst_gpio, 1);
612                 usleep_range(1000, 5000);
613                 gpio_set_value(dsi_l_720p_5_pdata.dsi_panel_rst_gpio, 0);
614                 usleep_range(1000, 5000);
615                 gpio_set_value(dsi_l_720p_5_pdata.dsi_panel_rst_gpio, 1);
616                 msleep(20);
617         }
618 #endif
619         if (gpio_is_valid(panel_of.panel_gpio[TEGRA_GPIO_BL_ENABLE]))
620                 gpio_direction_output(
621                         panel_of.panel_gpio[TEGRA_GPIO_BL_ENABLE], 1);
622         else
623                 gpio_direction_output(
624                         dsi_l_720p_5_pdata.dsi_panel_bl_en_gpio, 1);
625
626         is_bl_powered = true;
627         return 0;
628 fail:
629         return err;
630 }
631
632 static u8 panel_dsi_config[] = {0xe0, 0x43, 0x0, 0x80, 0x0, 0x0};
633 static u8 panel_disp_ctrl1[] = {0xb5, 0x34, 0x20, 0x40, 0x0, 0x20};
634 static u8 panel_disp_ctrl2[] = {0xb6, 0x04, 0x74, 0x0f, 0x16, 0x13};
635 static u8 panel_internal_clk[] = {0xc0, 0x01, 0x08};
636 static u8 panel_pwr_ctrl3[] = {
637         0xc3, 0x0, 0x09, 0x10, 0x02, 0x0, 0x66, 0x20, 0x13, 0x0};
638 static u8 panel_pwr_ctrl4[] = {0xc4, 0x23, 0x24, 0x17, 0x17, 0x59};
639 static u8 panel_positive_gamma_red[] = {
640         0xd0, 0x21, 0x13, 0x67, 0x37, 0x0c, 0x06, 0x62, 0x23, 0x03};
641 static u8 panel_negetive_gamma_red[] = {
642         0xd1, 0x32, 0x13, 0x66, 0x37, 0x02, 0x06, 0x62, 0x23, 0x03};
643 static u8 panel_positive_gamma_green[] = {
644         0xd2, 0x41, 0x14, 0x56, 0x37, 0x0c, 0x06, 0x62, 0x23, 0x03};
645 static u8 panel_negetive_gamma_green[] = {
646         0xd3, 0x52, 0x14, 0x55, 0x37, 0x02, 0x06, 0x62, 0x23, 0x03};
647 static u8 panel_positive_gamma_blue[] = {
648         0xd4, 0x41, 0x14, 0x56, 0x37, 0x0c, 0x06, 0x62, 0x23, 0x03};
649 static u8 panel_negetive_gamma_blue[] = {
650         0xd5, 0x52, 0x14, 0x55, 0x37, 0x02, 0x06, 0x62, 0x23, 0x03};
651 static u8 panel_ce2[] = {0x71, 0x0, 0x0, 0x01, 0x01};
652 static u8 panel_ce3[] = {0x72, 0x01, 0x0e};
653 static u8 panel_ce4[] = {0x73, 0x34, 0x52, 0x0};
654 static u8 panel_ce5[] = {0x74, 0x05, 0x0, 0x06};
655 static u8 panel_ce6[] = {0x75, 0x03, 0x0, 0x07};
656 static u8 panel_ce7[] = {0x76, 0x07, 0x0, 0x06};
657 static u8 panel_ce8[] = {0x77, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f};
658 static u8 panel_ce9[] = {0x78, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40};
659 static u8 panel_ce10[] = {
660         0x79, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40};
661 static u8 panel_ce11[] = {0x7a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
662 static u8 panel_ce12[] = {0x7b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
663 static u8 panel_ce13[] = {0x7c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
664
665 static struct tegra_dsi_cmd dsi_l_720p_5_init_cmd[] = {
666         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_dsi_config),
667
668         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_disp_ctrl1),
669         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_disp_ctrl2),
670
671         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_internal_clk),
672
673         /*  panel power control 1 */
674         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xc1, 0x0),
675         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_pwr_ctrl3),
676         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_pwr_ctrl4),
677
678         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_positive_gamma_red),
679         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_negetive_gamma_red),
680         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_positive_gamma_green),
681         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_negetive_gamma_green),
682         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_positive_gamma_blue),
683         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_negetive_gamma_blue),
684
685         DSI_CMD_SHORT(DSI_DCS_WRITE_1_PARAM, DSI_DCS_SET_ADDR_MODE, 0x08),
686
687         /* panel OTP 2 */
688         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xf9, 0x0),
689
690         /* panel CE 1 */
691         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0x70, 0x0),
692         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce2),
693         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce3),
694         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce4),
695         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce5),
696         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce6),
697         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce7),
698         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce8),
699         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce9),
700         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce10),
701         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce11),
702         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce12),
703         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce13),
704
705         /* panel power control 2 */
706         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xc2, 0x02),
707         DSI_DLY_MS(15),
708
709         /* panel power control 2 */
710         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xc2, 0x06),
711         DSI_DLY_MS(15),
712
713         /* panel power control 2 */
714         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xc2, 0x4e),
715         DSI_DLY_MS(85),
716
717         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_EXIT_SLEEP_MODE, 0x0),
718         DSI_DLY_MS(15),
719
720         /* panel OTP 2 */
721         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xf9, 0x80),
722         DSI_DLY_MS(15),
723
724         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_SET_DISPLAY_ON, 0x0),
725 };
726
727 static struct tegra_dsi_out dsi_l_720p_5_pdata = {
728         .n_data_lanes = 4,
729
730         .refresh_rate = 60,
731         .video_data_type = TEGRA_DSI_VIDEO_TYPE_VIDEO_MODE,
732         .video_clock_mode = TEGRA_DSI_VIDEO_CLOCK_CONTINUOUS,
733         .video_burst_mode = TEGRA_DSI_VIDEO_NONE_BURST_MODE_WITH_SYNC_END,
734
735         .controller_vs = DSI_VS_1,
736         .pixel_format = TEGRA_DSI_PIXEL_FORMAT_24BIT_P,
737         .virtual_channel = TEGRA_DSI_VIRTUAL_CHANNEL_0,
738
739         .panel_reset = DSI_PANEL_RESET,
740         .power_saving_suspend = true,
741         .dsi_init_cmd = dsi_l_720p_5_init_cmd,
742         .n_init_cmd = ARRAY_SIZE(dsi_l_720p_5_init_cmd),
743 };
744
745 static int dsi_l_720p_5_disable(void)
746 {
747         if (gpio_is_valid(panel_of.panel_gpio[TEGRA_GPIO_BL_ENABLE]))
748                 gpio_direction_output(
749                         panel_of.panel_gpio[TEGRA_GPIO_BL_ENABLE], 0);
750         else
751                 gpio_direction_output(
752                         dsi_l_720p_5_pdata.dsi_panel_bl_en_gpio, 0);
753
754         is_bl_powered = false;
755
756         if (gpio_is_valid(panel_of.panel_gpio[TEGRA_GPIO_RESET]))
757                 gpio_direction_output(
758                         panel_of.panel_gpio[TEGRA_GPIO_RESET], 0);
759         else
760                 gpio_direction_output(
761                         dsi_l_720p_5_pdata.dsi_panel_rst_gpio, 0);
762
763         if (vdd_sys_bl_3v7)
764                 regulator_disable(vdd_sys_bl_3v7);
765
766         if (vdd_lcd_s_1v8)
767                 regulator_disable(vdd_lcd_s_1v8);
768
769         if (avdd_lcd_3v0_2v8)
770                 regulator_disable(avdd_lcd_3v0_2v8);
771
772         return 0;
773 }
774
775 static void dsi_l_720p_5_dc_out_init(struct tegra_dc_out *dc)
776 {
777         dc->dsi = &dsi_l_720p_5_pdata;
778         dc->parent_clk = "pll_d_out0";
779         dc->modes = dsi_l_720p_5_modes;
780         dc->n_modes = ARRAY_SIZE(dsi_l_720p_5_modes);
781         dc->enable = dsi_l_720p_5_enable;
782         dc->disable = dsi_l_720p_5_disable;
783         dc->width = 62;
784         dc->height = 110;
785         dc->flags = DC_CTRL_MODE;
786 }
787 static void dsi_l_720p_5_fb_data_init(struct tegra_fb_data *fb)
788 {
789         fb->xres = dsi_l_720p_5_modes[0].h_active;
790         fb->yres = dsi_l_720p_5_modes[0].v_active;
791 }
792
793 static void dsi_l_720p_5_sd_settings_init(struct tegra_dc_sd_settings *settings)
794 {
795         struct board_info bi;
796         tegra_get_display_board_info(&bi);
797
798         *settings = dsi_l_720p_5_sd_settings;
799
800         if (bi.board_id == BOARD_E1563)
801                 settings->bl_device_name = "lm3528_display_bl";
802         else
803                 settings->bl_device_name = "max8831_display_bl";
804 }
805
806 #ifdef CONFIG_TEGRA_DC_CMU
807 static void dsi_l_720p_5_cmu_init(struct tegra_dc_platform_data *pdata)
808 {
809         pdata->cmu = &dsi_l_720p_5_cmu;
810 }
811 #endif
812
813 struct tegra_panel __initdata dsi_l_720p_5 = {
814         .init_sd_settings = dsi_l_720p_5_sd_settings_init,
815         .init_dc_out = dsi_l_720p_5_dc_out_init,
816         .init_fb_data = dsi_l_720p_5_fb_data_init,
817         .register_bl_dev = dsi_l_720p_5_register_bl_dev,
818 #ifdef CONFIG_TEGRA_DC_CMU
819         .init_cmu_data = dsi_l_720p_5_cmu_init,
820 #endif
821 };
822 EXPORT_SYMBOL(dsi_l_720p_5);