ARM: tegra: fix regulator_get() return value check
[linux-3.10.git] / arch / arm / mach-tegra / panel-l-720p-5-loki.c
1 /*
2  * arch/arm/mach-tegra/panel-l-720p-5-loki.c
3  *
4  * Copyright (c) 2011-2013, NVIDIA Corporation. All rights reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
14  * more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with this program; if not, write to the Free Software Foundation, Inc.,
18  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19  */
20 #include <linux/ioport.h>
21 #include <linux/delay.h>
22 #include <linux/gpio.h>
23 #include <linux/tegra_pwm_bl.h>
24 #include <linux/regulator/consumer.h>
25 #include <linux/pwm_backlight.h>
26
27 #include <mach/dc.h>
28 #include <asm/mach-types.h>
29
30 #include "devices.h"
31 #include "board-panel.h"
32
33 #define DSI_PANEL_RESET         1
34
35 #define DSI_PANEL_CE            0
36
37 #define DC_CTRL_MODE    TEGRA_DC_OUT_CONTINUOUS_MODE
38
39 static bool reg_requested;
40 static bool gpio_requested;
41 static struct platform_device *disp_device;
42
43 static struct regulator *vdd_lcd_s_1v8;
44 static struct regulator *vdd_lcd_bl;
45 static struct regulator *vdd_lcd_bl_en;
46 static struct regulator *avdd_lcd_3v0_2v8;
47
48 #ifdef CONFIG_TEGRA_DC_CMU
49 static struct tegra_dc_cmu dsi_l_720p_5_loki_cmu = {
50         /* lut1 maps sRGB to linear space. */
51         {
52                 0,    1,    2,    4,    5,    6,    7,    9,
53                 10,   11,   12,   14,   15,   16,   18,   20,
54                 21,   23,   25,   27,   29,   31,   33,   35,
55                 37,   40,   42,   45,   48,   50,   53,   56,
56                 59,   62,   66,   69,   72,   76,   79,   83,
57                 87,   91,   95,   99,   103,  107,  112,  116,
58                 121,  126,  131,  136,  141,  146,  151,  156,
59                 162,  168,  173,  179,  185,  191,  197,  204,
60                 210,  216,  223,  230,  237,  244,  251,  258,
61                 265,  273,  280,  288,  296,  304,  312,  320,
62                 329,  337,  346,  354,  363,  372,  381,  390,
63                 400,  409,  419,  428,  438,  448,  458,  469,
64                 479,  490,  500,  511,  522,  533,  544,  555,
65                 567,  578,  590,  602,  614,  626,  639,  651,
66                 664,  676,  689,  702,  715,  728,  742,  755,
67                 769,  783,  797,  811,  825,  840,  854,  869,
68                 884,  899,  914,  929,  945,  960,  976,  992,
69                 1008, 1024, 1041, 1057, 1074, 1091, 1108, 1125,
70                 1142, 1159, 1177, 1195, 1213, 1231, 1249, 1267,
71                 1286, 1304, 1323, 1342, 1361, 1381, 1400, 1420,
72                 1440, 1459, 1480, 1500, 1520, 1541, 1562, 1582,
73                 1603, 1625, 1646, 1668, 1689, 1711, 1733, 1755,
74                 1778, 1800, 1823, 1846, 1869, 1892, 1916, 1939,
75                 1963, 1987, 2011, 2035, 2059, 2084, 2109, 2133,
76                 2159, 2184, 2209, 2235, 2260, 2286, 2312, 2339,
77                 2365, 2392, 2419, 2446, 2473, 2500, 2527, 2555,
78                 2583, 2611, 2639, 2668, 2696, 2725, 2754, 2783,
79                 2812, 2841, 2871, 2901, 2931, 2961, 2991, 3022,
80                 3052, 3083, 3114, 3146, 3177, 3209, 3240, 3272,
81                 3304, 3337, 3369, 3402, 3435, 3468, 3501, 3535,
82                 3568, 3602, 3636, 3670, 3705, 3739, 3774, 3809,
83                 3844, 3879, 3915, 3950, 3986, 4022, 4059, 4095,
84         },
85         /* csc */
86         {
87                 0x100, 0x0,   0x0,
88                 0x0,   0x100, 0x0,
89                 0x0,   0x0,   0x100,
90         },
91         /* lut2 maps linear space to sRGB*/
92         {
93                 0, 0, 1, 2, 3, 3, 4, 5,
94                 6, 6, 7, 8, 8, 9, 10, 10,
95                 11, 12, 12, 13, 13, 14, 14, 15,
96                 16, 16, 17, 17, 18, 18, 19, 19,
97                 19, 20, 20, 21, 21, 22, 22, 22,
98                 23, 23, 24, 24, 24, 25, 25, 25,
99                 26, 26, 27, 27, 27, 28, 28, 28,
100                 28, 29, 29, 29, 30, 30, 30, 31,
101                 31, 31, 31, 32, 32, 32, 33, 33,
102                 33, 33, 34, 34, 34, 35, 35, 35,
103                 35, 36, 36, 36, 36, 37, 37, 37,
104                 38, 38, 38, 38, 39, 39, 39, 39,
105                 40, 40, 40, 40, 40, 41, 41, 41,
106                 41, 42, 42, 42, 42, 43, 43, 43,
107                 43, 43, 44, 44, 44, 44, 45, 45,
108                 45, 45, 45, 46, 46, 46, 46, 46,
109                 47, 47, 47, 47, 47, 48, 48, 48,
110                 48, 48, 49, 49, 49, 49, 49, 49,
111                 50, 50, 50, 50, 50, 50, 51, 51,
112                 51, 51, 51, 51, 52, 52, 52, 52,
113                 52, 52, 53, 53, 53, 53, 53, 53,
114                 54, 54, 54, 54, 54, 54, 54, 55,
115                 55, 55, 55, 55, 55, 55, 55, 56,
116                 56, 56, 56, 56, 56, 56, 57, 57,
117                 57, 57, 57, 57, 57, 57, 58, 58,
118                 58, 58, 58, 58, 58, 58, 58, 59,
119                 59, 59, 59, 59, 59, 59, 59, 59,
120                 60, 60, 60, 60, 60, 60, 60, 60,
121                 60, 61, 61, 61, 61, 61, 61, 61,
122                 61, 61, 61, 62, 62, 62, 62, 62,
123                 62, 62, 62, 62, 62, 63, 63, 63,
124                 63, 63, 63, 63, 63, 63, 63, 63,
125                 64, 64, 64, 64, 64, 64, 64, 64,
126                 64, 64, 64, 65, 65, 65, 65, 65,
127                 65, 65, 65, 65, 65, 65, 66, 66,
128                 66, 66, 66, 66, 66, 66, 66, 66,
129                 66, 66, 67, 67, 67, 67, 67, 67,
130                 67, 67, 67, 67, 67, 67, 68, 68,
131                 68, 68, 68, 68, 68, 68, 68, 68,
132                 68, 68, 69, 69, 69, 69, 69, 69,
133                 69, 69, 69, 69, 69, 69, 70, 70,
134                 70, 70, 70, 70, 70, 70, 70, 70,
135                 70, 70, 70, 71, 71, 71, 71, 71,
136                 71, 71, 71, 71, 71, 71, 71, 71,
137                 72, 72, 72, 72, 72, 72, 72, 72,
138                 72, 72, 72, 72, 72, 73, 73, 73,
139                 73, 73, 73, 73, 73, 73, 73, 73,
140                 73, 73, 73, 74, 74, 74, 74, 74,
141                 74, 74, 74, 74, 74, 74, 74, 74,
142                 75, 75, 75, 75, 75, 75, 75, 75,
143                 75, 75, 75, 75, 75, 75, 76, 76,
144                 76, 76, 76, 76, 76, 76, 76, 76,
145                 76, 76, 76, 76, 77, 77, 77, 77,
146                 77, 77, 77, 77, 77, 77, 77, 77,
147                 77, 77, 78, 78, 78, 78, 78, 78,
148                 78, 78, 78, 78, 78, 78, 78, 78,
149                 79, 79, 79, 79, 79, 79, 79, 79,
150                 79, 79, 79, 79, 79, 79, 80, 80,
151                 80, 80, 80, 80, 80, 80, 80, 80,
152                 80, 80, 80, 80, 81, 81, 81, 81,
153                 81, 81, 81, 81, 81, 81, 81, 81,
154                 81, 81, 82, 82, 82, 82, 82, 82,
155                 82, 82, 82, 82, 82, 82, 82, 82,
156                 83, 83, 83, 83, 83, 83, 83, 83,
157                 84, 84, 85, 85, 86, 86, 87, 88,
158                 88, 89, 89, 90, 90, 91, 92, 92,
159                 93, 93, 94, 94, 95, 95, 96, 96,
160                 97, 97, 98, 98, 99, 99, 100, 100,
161                 101, 101, 102, 102, 103, 103, 104, 104,
162                 105, 105, 106, 106, 107, 107, 107, 108,
163                 108, 109, 109, 110, 110, 111, 111, 111,
164                 112, 112, 113, 113, 114, 114, 114, 115,
165                 115, 116, 116, 117, 117, 117, 118, 118,
166                 119, 119, 119, 120, 120, 121, 121, 121,
167                 122, 122, 123, 123, 123, 124, 124, 125,
168                 125, 126, 126, 126, 127, 127, 128, 128,
169                 128, 129, 129, 129, 130, 130, 131, 131,
170                 131, 132, 132, 133, 133, 133, 134, 134,
171                 135, 135, 135, 136, 136, 137, 137, 137,
172                 138, 138, 138, 139, 139, 140, 140, 140,
173                 141, 141, 142, 142, 142, 143, 143, 143,
174                 144, 144, 145, 145, 145, 146, 146, 146,
175                 147, 147, 147, 148, 148, 149, 149, 149,
176                 150, 150, 150, 151, 151, 151, 152, 152,
177                 153, 153, 153, 154, 154, 154, 155, 155,
178                 156, 156, 156, 157, 157, 157, 158, 158,
179                 159, 159, 159, 160, 160, 160, 161, 161,
180                 162, 162, 162, 163, 163, 164, 164, 164,
181                 165, 165, 166, 166, 166, 167, 167, 168,
182                 168, 168, 169, 169, 170, 170, 170, 171,
183                 171, 172, 172, 172, 173, 173, 173, 174,
184                 174, 175, 175, 175, 176, 176, 176, 177,
185                 177, 177, 178, 178, 178, 179, 179, 179,
186                 180, 180, 180, 180, 181, 181, 181, 182,
187                 182, 182, 182, 183, 183, 183, 184, 184,
188                 184, 184, 185, 185, 185, 185, 186, 186,
189                 186, 186, 187, 187, 187, 187, 188, 188,
190                 188, 188, 189, 189, 189, 190, 190, 190,
191                 190, 191, 191, 191, 191, 192, 192, 192,
192                 193, 193, 193, 193, 194, 194, 194, 195,
193                 195, 195, 195, 196, 196, 196, 197, 197,
194                 197, 198, 198, 198, 198, 199, 199, 199,
195                 200, 200, 200, 201, 201, 201, 202, 202,
196                 202, 203, 203, 204, 204, 204, 205, 205,
197                 205, 206, 206, 206, 207, 207, 208, 208,
198                 208, 209, 209, 209, 210, 210, 211, 211,
199                 211, 212, 212, 213, 213, 213, 214, 214,
200                 215, 215, 215, 216, 216, 217, 217, 217,
201                 218, 218, 218, 219, 219, 220, 220, 220,
202                 221, 221, 221, 222, 222, 222, 223, 223,
203                 223, 224, 224, 224, 225, 225, 225, 225,
204                 226, 226, 226, 226, 227, 227, 227, 227,
205                 228, 228, 228, 228, 229, 229, 229, 229,
206                 229, 230, 230, 230, 230, 231, 231, 231,
207                 231, 232, 232, 232, 233, 233, 233, 233,
208                 234, 234, 234, 235, 235, 235, 236, 236,
209                 236, 237, 237, 238, 238, 239, 239, 239,
210                 240, 240, 241, 241, 242, 242, 243, 244,
211                 244, 245, 245, 246, 247, 247, 248, 249,
212                 250, 250, 251, 252, 253, 254, 254, 255,
213         },
214 };
215 #endif
216
217 static u8 panel_dsi_config[] = {0xe0, 0x43, 0x0, 0x80, 0x0, 0x0};
218 static u8 panel_disp_ctrl1[] = {0xb5, 0x34, 0x20, 0x40, 0x0, 0x20};
219 static u8 panel_disp_ctrl2[] = {0xb6, 0x04, 0x74, 0x0f, 0x16, 0x13};
220 static u8 panel_internal_clk[] = {0xc0, 0x01, 0x08};
221 static u8 panel_pwr_ctrl3[] = {
222         0xc3, 0x0, 0x09, 0x10, 0x02, 0x0, 0x66, 0x00, 0x13, 0x0};
223 static u8 panel_pwr_ctrl4[] = {0xc4, 0x23, 0x24, 0x12, 0x12, 0x60};
224 static u8 panel_positive_gamma_red[] = {
225         0xd0, 0x21, 0x25, 0x67, 0x36, 0x0a, 0x06, 0x61, 0x23, 0x03};
226 static u8 panel_negetive_gamma_red[] = {
227         0xd1, 0x31, 0x25, 0x66, 0x36, 0x05, 0x06, 0x61, 0x23, 0x03};
228 static u8 panel_positive_gamma_green[] = {
229         0xd2, 0x41, 0x26, 0x56, 0x36, 0x0a, 0x06, 0x61, 0x23, 0x03};
230 static u8 panel_negetive_gamma_green[] = {
231         0xd3, 0x51, 0x26, 0x55, 0x36, 0x05, 0x06, 0x61, 0x23, 0x03};
232 static u8 panel_positive_gamma_blue[] = {
233         0xd4, 0x41, 0x26, 0x56, 0x36, 0x0a, 0x06, 0x61, 0x23, 0x03};
234 static u8 panel_negetive_gamma_blue[] = {
235         0xd5, 0x51, 0x26, 0x55, 0x36, 0x05, 0x06, 0x61, 0x23, 0x03};
236
237 #if DSI_PANEL_CE
238 static u8 panel_ce2[] = {0x71, 0x0, 0x0, 0x01, 0x01};
239 static u8 panel_ce3[] = {0x72, 0x01, 0x0e};
240 static u8 panel_ce4[] = {0x73, 0x34, 0x52, 0x0};
241 static u8 panel_ce5[] = {0x74, 0x05, 0x0, 0x06};
242 static u8 panel_ce6[] = {0x75, 0x03, 0x0, 0x07};
243 static u8 panel_ce7[] = {0x76, 0x07, 0x0, 0x06};
244 static u8 panel_ce8[] = {0x77, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f};
245 static u8 panel_ce9[] = {0x78, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40};
246 static u8 panel_ce10[] = {
247         0x79, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40};
248 static u8 panel_ce11[] = {0x7a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
249 static u8 panel_ce12[] = {0x7b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
250 static u8 panel_ce13[] = {0x7c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
251 #endif
252
253 static struct tegra_dsi_cmd dsi_init_cmd[] = {
254         DSI_DLY_MS(20),
255         DSI_GPIO_SET(0, 1), /* use dummy gpio */
256
257         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_dsi_config),
258
259         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_disp_ctrl1),
260         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_disp_ctrl2),
261
262         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_internal_clk),
263
264         /*  panel power control 1 */
265         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xc1, 0x0),
266         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_pwr_ctrl3),
267         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_pwr_ctrl4),
268
269         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_positive_gamma_red),
270         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_negetive_gamma_red),
271         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_positive_gamma_green),
272         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_negetive_gamma_green),
273         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_positive_gamma_blue),
274         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_negetive_gamma_blue),
275
276         DSI_CMD_SHORT(DSI_DCS_WRITE_1_PARAM, DSI_DCS_SET_ADDR_MODE, 0x0B),
277
278         /* panel OTP 2 */
279         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xf9, 0x0),
280
281 #if DSI_PANEL_CE
282         /* panel CE 1 */
283         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0x70, 0x0),
284         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce2),
285         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce3),
286         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce4),
287         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce5),
288         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce6),
289         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce7),
290         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce8),
291         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce9),
292         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce10),
293         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce11),
294         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce12),
295         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_ce13),
296 #endif
297         /* panel power control 2 */
298         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xc2, 0x02),
299         DSI_DLY_MS(20),
300
301         /* panel power control 2 */
302         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xc2, 0x06),
303         DSI_DLY_MS(20),
304
305         /* panel power control 2 */
306         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xc2, 0x4e),
307         DSI_DLY_MS(100),
308
309         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_EXIT_SLEEP_MODE, 0x0),
310         DSI_DLY_MS(140),
311
312         /* panel OTP 2 */
313         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xf9, 0x80),
314         DSI_DLY_MS(20),
315
316         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_SET_DISPLAY_ON, 0x0),
317 };
318
319 static u8 panel_suspend_pwr_ctrl4[] = {0xc4, 0x0, 0x0, 0x0, 0x0, 0x0};
320
321 static struct tegra_dsi_cmd dsi_suspend_cmd[] = {
322         DSI_DLY_MS(40),
323
324         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_SET_DISPLAY_OFF, 0x0),
325         DSI_DLY_MS(20),
326
327         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_ENTER_SLEEP_MODE, 0x0),
328
329         /* panel power control 2 */
330         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xc2, 0x0),
331
332         /* panel power control 4 */
333         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, panel_suspend_pwr_ctrl4),
334
335         /* panel power control 1 */
336         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xc1, 0x2),
337         DSI_DLY_MS(20),
338
339         /* panel power control 1 */
340         DSI_CMD_SHORT(DSI_GENERIC_SHORT_WRITE_2_PARAMS, 0xc1, 0x3),
341         DSI_DLY_MS(20),
342 };
343
344 static struct tegra_dsi_out dsi_l_720p_5_loki_pdata = {
345         .n_data_lanes = 4,
346         .controller_vs = DSI_VS_1,
347         .pixel_format = TEGRA_DSI_PIXEL_FORMAT_24BIT_P,
348         .refresh_rate = 60,
349         .virtual_channel = TEGRA_DSI_VIRTUAL_CHANNEL_0,
350
351         .panel_reset = DSI_PANEL_RESET,
352         .power_saving_suspend = true,
353         .video_data_type = TEGRA_DSI_VIDEO_TYPE_VIDEO_MODE,
354         .video_clock_mode = TEGRA_DSI_VIDEO_CLOCK_CONTINUOUS,
355         .video_burst_mode = TEGRA_DSI_VIDEO_NONE_BURST_MODE_WITH_SYNC_END,
356         .dsi_init_cmd = dsi_init_cmd,
357         .n_init_cmd = ARRAY_SIZE(dsi_init_cmd),
358         .dsi_suspend_cmd = dsi_suspend_cmd,
359         .n_suspend_cmd = ARRAY_SIZE(dsi_suspend_cmd),
360 };
361
362 static int dsi_l_720p_5_loki_regulator_get(struct device *dev)
363 {
364         int err = 0;
365
366         if (reg_requested)
367                 return 0;
368
369         avdd_lcd_3v0_2v8 = regulator_get(dev, "avdd_lcd");
370         if (IS_ERR(avdd_lcd_3v0_2v8)) {
371                 pr_err("avdd_lcd regulator get failed\n");
372                 err = PTR_ERR(avdd_lcd_3v0_2v8);
373                 avdd_lcd_3v0_2v8 = NULL;
374                 goto fail;
375         }
376         vdd_lcd_s_1v8 = regulator_get(dev, "dvdd_lcd");
377         if (IS_ERR(vdd_lcd_s_1v8)) {
378                 pr_err("vdd_lcd_1v8_s regulator get failed\n");
379                 err = PTR_ERR(vdd_lcd_s_1v8);
380                 vdd_lcd_s_1v8 = NULL;
381                 goto fail;
382         }
383
384         if (machine_is_dalmore()) {
385                 vdd_lcd_bl = regulator_get(dev, "vdd_lcd_bl");
386                 if (IS_ERR(vdd_lcd_bl)) {
387                         pr_err("vdd_lcd_bl regulator get failed\n");
388                         err = PTR_ERR(vdd_lcd_bl);
389                         vdd_lcd_bl = NULL;
390                         goto fail;
391                 }
392         }
393
394         vdd_lcd_bl_en = regulator_get(dev, "vdd_lcd_bl_en");
395         if (IS_ERR(vdd_lcd_bl_en)) {
396                 pr_err("vdd_lcd_bl_en regulator get failed\n");
397                 err = PTR_ERR(vdd_lcd_bl_en);
398                 vdd_lcd_bl_en = NULL;
399                 goto fail;
400         }
401         reg_requested = true;
402         return 0;
403 fail:
404         return err;
405 }
406
407 static int dsi_l_720p_5_loki_gpio_get(void)
408 {
409         int err = 0;
410
411         if (gpio_requested)
412                 return 0;
413
414         err = gpio_request(dsi_l_720p_5_loki_pdata.dsi_panel_rst_gpio,
415                 "panel rst");
416         if (err < 0) {
417                 pr_err("panel reset gpio request failed\n");
418                 goto fail;
419         }
420
421         gpio_requested = true;
422         return 0;
423 fail:
424         return err;
425 }
426
427 static struct tegra_dc_out *loki_disp1_out;
428
429 static int dsi_l_720p_5_loki_enable(struct device *dev)
430 {
431         int err = 0;
432
433         err = dsi_l_720p_5_loki_regulator_get(dev);
434         if (err < 0) {
435                 pr_err("dsi regulator get failed\n");
436                 goto fail;
437         }
438         err = dsi_l_720p_5_loki_gpio_get();
439         if (err < 0) {
440                 pr_err("dsi gpio request failed\n");
441                 goto fail;
442         }
443
444         /* Skip panel programming if in initialized mode */
445         if (!(loki_disp1_out->flags & TEGRA_DC_OUT_INITIALIZED_MODE)) {
446                 dsi_l_720p_5_loki_pdata.dsi_init_cmd = dsi_init_cmd;
447                 gpio_set_value(dsi_l_720p_5_loki_pdata.dsi_panel_rst_gpio, 0);
448         } else {
449                 dsi_l_720p_5_loki_pdata.dsi_init_cmd = dsi_init_cmd + 2;
450         }
451
452         if (vdd_lcd_s_1v8) {
453                 err = regulator_enable(vdd_lcd_s_1v8);
454                 if (err < 0) {
455                         pr_err("vdd_lcd_1v8_s regulator enable failed\n");
456                         goto fail;
457                 }
458         }
459         usleep_range(3000, 5000);
460
461         if (avdd_lcd_3v0_2v8) {
462                 err = regulator_enable(avdd_lcd_3v0_2v8);
463                 if (err < 0) {
464                         pr_err("avdd_lcd_3v0_2v8 regulator enable failed\n");
465                         goto fail;
466                 }
467                 regulator_set_voltage(avdd_lcd_3v0_2v8, 2800000, 2800000);
468         }
469         usleep_range(3000, 5000);
470
471         if (vdd_lcd_bl) {
472                 err = regulator_enable(vdd_lcd_bl);
473                 if (err < 0) {
474                         pr_err("vdd_lcd_bl regulator enable failed\n");
475                         goto fail;
476                 }
477         }
478
479         if (vdd_lcd_bl_en) {
480                 err = regulator_enable(vdd_lcd_bl_en);
481                 if (err < 0) {
482                         pr_err("vdd_lcd_bl_en regulator enable failed\n");
483                         goto fail;
484                 }
485         }
486
487         return 0;
488 fail:
489         return err;
490 }
491
492 static int dsi_l_720p_5_loki_disable(void)
493 {
494         if (vdd_lcd_bl)
495                 regulator_disable(vdd_lcd_bl);
496
497         if (vdd_lcd_bl_en)
498                 regulator_disable(vdd_lcd_bl_en);
499
500         gpio_set_value(dsi_l_720p_5_loki_pdata.dsi_panel_rst_gpio, 0);
501         mdelay(20);
502
503         if (vdd_lcd_s_1v8)
504                 regulator_disable(vdd_lcd_s_1v8);
505
506         if (avdd_lcd_3v0_2v8)
507                 regulator_disable(avdd_lcd_3v0_2v8);
508
509         return 0;
510 }
511
512 static int dsi_l_720p_5_loki_postsuspend(void)
513 {
514         /* TODO */
515         return 0;
516 }
517
518 static struct tegra_dc_mode dsi_l_720p_5_loki_modes[] = {
519         {
520                 .pclk = 66700000,
521                 .h_ref_to_sync = 4,
522                 .v_ref_to_sync = 1,
523                 .h_sync_width = 4,
524                 .v_sync_width = 4,
525                 .h_back_porch = 112,
526                 .v_back_porch = 12,
527                 .h_active = 720,
528                 .v_active = 1280,
529                 .h_front_porch = 12,
530                 .v_front_porch = 8,
531         },
532 };
533
534 static int dsi_l_720p_5_loki_bl_notify(struct device *unused, int brightness)
535 {
536         int cur_sd_brightness = atomic_read(&sd_brightness);
537
538         /* SD brightness is a percentage */
539         brightness = (brightness * cur_sd_brightness) / 255;
540
541         /* Apply any backlight response curve */
542         if (brightness > 255)
543                 pr_info("Error: Brightness > 255!\n");
544
545         return brightness;
546 }
547
548 static int dsi_l_720p_5_loki_check_fb(struct device *dev, struct fb_info *info)
549 {
550         return info->device == &disp_device->dev;
551 }
552
553 static struct platform_pwm_backlight_data dsi_l_720p_5_loki_bl_data = {
554         .pwm_id         = 1,
555         .max_brightness = 255,
556         .dft_brightness = 77,
557         .pwm_period_ns  = 40000,
558         .notify         = dsi_l_720p_5_loki_bl_notify,
559         /* Only toggle backlight on fb blank notifications for disp1 */
560         .check_fb       = dsi_l_720p_5_loki_check_fb,
561 };
562
563 static struct platform_device __maybe_unused
564                 dsi_l_720p_5_loki_bl_device = {
565         .name   = "pwm-backlight",
566         .id     = -1,
567         .dev    = {
568                 .platform_data = &dsi_l_720p_5_loki_bl_data,
569         },
570 };
571
572 static struct platform_device __maybe_unused
573                         *loki_bl_device[] __initdata = {
574         &tegra_pwfm_device,
575         &dsi_l_720p_5_loki_bl_device,
576 };
577
578 static int dsi_l_720p_5_loki_register_bl_dev(void)
579 {
580         int err = 0;
581
582         err = platform_device_register(&tegra_pwfm_device);
583         if (err) {
584                 pr_err("disp1 pwm device registration failed");
585                 return err;
586         }
587
588         err = platform_device_register(&dsi_l_720p_5_loki_bl_device);
589         if (err) {
590                 pr_err("disp1 bl device registration failed");
591                 return err;
592         }
593
594         err = gpio_request(dsi_l_720p_5_loki_pdata.dsi_panel_bl_pwm_gpio,
595                 "panel pwm");
596         if (err) {
597                 pr_err("panel backlight pwm gpio request failed\n");
598                 return err;
599         }
600         gpio_free(dsi_l_720p_5_loki_pdata.dsi_panel_bl_pwm_gpio);
601
602         return err;
603 }
604
605 static void dsi_l_720p_5_loki_set_disp_device
606         (struct platform_device *display_device)
607 {
608         disp_device = display_device;
609 }
610
611 static void dsi_l_720p_5_loki_dc_out_init(struct tegra_dc_out *dc)
612 {
613         dc->dsi = &dsi_l_720p_5_loki_pdata;
614         dc->modes = dsi_l_720p_5_loki_modes;
615         dc->n_modes = ARRAY_SIZE(dsi_l_720p_5_loki_modes);
616         dc->enable = dsi_l_720p_5_loki_enable;
617         dc->disable = dsi_l_720p_5_loki_disable;
618         dc->postsuspend = dsi_l_720p_5_loki_postsuspend;
619         dc->width = 62;
620         dc->height = 110;
621         dc->rotation = 90;
622         /*
623          * only thor panel supports initialized mode
624          */
625         dc->flags = DC_CTRL_MODE | TEGRA_DC_OUT_INITIALIZED_MODE;
626
627         loki_disp1_out = dc;
628 }
629
630 static void dsi_l_720p_5_loki_fb_data_init(struct tegra_fb_data *fb)
631 {
632         fb->xres = dsi_l_720p_5_loki_modes[0].h_active;
633         fb->yres = dsi_l_720p_5_loki_modes[0].v_active;
634 }
635
636 static void dsi_l_720p_5_loki_sd_settings_init
637         (struct tegra_dc_sd_settings *settings)
638 {
639         settings->bl_device_name = "pwm-backlight";
640 }
641
642 #ifdef CONFIG_TEGRA_DC_CMU
643 static void dsi_l_720p_5_loki_cmu_init(struct tegra_dc_platform_data *pdata)
644 {
645         pdata->cmu = &dsi_l_720p_5_loki_cmu;
646 }
647 #endif
648
649 struct tegra_panel __initdata dsi_l_720p_5_loki = {
650         .init_sd_settings = dsi_l_720p_5_loki_sd_settings_init,
651         .init_dc_out = dsi_l_720p_5_loki_dc_out_init,
652         .init_fb_data = dsi_l_720p_5_loki_fb_data_init,
653         .set_disp_device = dsi_l_720p_5_loki_set_disp_device,
654         .register_bl_dev = dsi_l_720p_5_loki_register_bl_dev,
655 #ifdef CONFIG_TEGRA_DC_CMU
656         .init_cmu_data = dsi_l_720p_5_loki_cmu_init,
657 #endif
658 };
659 EXPORT_SYMBOL(dsi_l_720p_5_loki);