ARM: tegra12: set CPU rate to 2.2GHz for sku 0x87
[linux-3.10.git] / arch / arm / mach-tegra / panel-j-720p-5.c
1 /*
2  * arch/arm/mach-tegra/panel-j-720p-5.c
3  *
4  * Copyright (c) 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 #include "gpio-names.h"
34 #define DSI_PANEL_EN_GPIO       TEGRA_GPIO_PQ2
35
36 #define DSI_PANEL_RESET         1
37
38 #define DC_CTRL_MODE    TEGRA_DC_OUT_CONTINUOUS_MODE
39
40 static struct tegra_dsi_out dsi_j_720p_5_pdata;
41
42 static bool reg_requested;
43 static bool gpio_requested;
44 static struct platform_device *disp_device;
45
46 static struct regulator *vdd_lcd_s_1v8;
47 static struct regulator *vdd_lcd_bl;
48 static struct regulator *vdd_lcd_bl_en;
49 static struct regulator *avdd_lcd_3v0_2v8;
50
51 static struct tegra_dc_sd_settings dsi_j_720p_5_sd_settings = {
52         .enable = 0, /* disabled by default. */
53         .use_auto_pwm = false,
54         .hw_update_delay = 0,
55         .bin_width = -1,
56         .aggressiveness = 1,
57         .use_vid_luma = false,
58         .phase_in_adjustments = 0,
59         .k_limit_enable = true,
60         .k_limit = 180,
61         .sd_window_enable = false,
62         .soft_clipping_enable = true,
63         /* Low soft clipping threshold to compensate for aggressive k_limit */
64         .soft_clipping_threshold = 128,
65         .smooth_k_enable = true,
66         .smooth_k_incr = 128,
67         /* Default video coefficients */
68         .coeff = {5, 9, 2},
69         .fc = {0, 0},
70         /* Immediate backlight changes */
71         .blp = {1024, 255},
72         /* Gammas: R: 2.2 G: 2.2 B: 2.2 */
73         /* Default BL TF */
74         .bltf = {
75                         {
76                                 {57, 65, 73, 82},
77                                 {92, 103, 114, 125},
78                                 {138, 150, 164, 178},
79                                 {193, 208, 224, 241},
80                         },
81                 },
82         /* Default LUT */
83         .lut = {
84                         {
85                                 {255, 255, 255},
86                                 {199, 199, 199},
87                                 {153, 153, 153},
88                                 {116, 116, 116},
89                                 {85, 85, 85},
90                                 {59, 59, 59},
91                                 {36, 36, 36},
92                                 {17, 17, 17},
93                                 {0, 0, 0},
94                         },
95                 },
96         .sd_brightness = &sd_brightness,
97 };
98
99 #ifdef CONFIG_TEGRA_DC_CMU
100 static struct tegra_dc_cmu dsi_j_720p_5_cmu = {
101         /* lut1 maps sRGB to linear space. */
102         {
103                 0,    1,    2,    4,    5,    6,    7,    9,
104                 10,   11,   12,   14,   15,   16,   18,   20,
105                 21,   23,   25,   27,   29,   31,   33,   35,
106                 37,   40,   42,   45,   48,   50,   53,   56,
107                 59,   62,   66,   69,   72,   76,   79,   83,
108                 87,   91,   95,   99,   103,  107,  112,  116,
109                 121,  126,  131,  136,  141,  146,  151,  156,
110                 162,  168,  173,  179,  185,  191,  197,  204,
111                 210,  216,  223,  230,  237,  244,  251,  258,
112                 265,  273,  280,  288,  296,  304,  312,  320,
113                 329,  337,  346,  354,  363,  372,  381,  390,
114                 400,  409,  419,  428,  438,  448,  458,  469,
115                 479,  490,  500,  511,  522,  533,  544,  555,
116                 567,  578,  590,  602,  614,  626,  639,  651,
117                 664,  676,  689,  702,  715,  728,  742,  755,
118                 769,  783,  797,  811,  825,  840,  854,  869,
119                 884,  899,  914,  929,  945,  960,  976,  992,
120                 1008, 1024, 1041, 1057, 1074, 1091, 1108, 1125,
121                 1142, 1159, 1177, 1195, 1213, 1231, 1249, 1267,
122                 1286, 1304, 1323, 1342, 1361, 1381, 1400, 1420,
123                 1440, 1459, 1480, 1500, 1520, 1541, 1562, 1582,
124                 1603, 1625, 1646, 1668, 1689, 1711, 1733, 1755,
125                 1778, 1800, 1823, 1846, 1869, 1892, 1916, 1939,
126                 1963, 1987, 2011, 2035, 2059, 2084, 2109, 2133,
127                 2159, 2184, 2209, 2235, 2260, 2286, 2312, 2339,
128                 2365, 2392, 2419, 2446, 2473, 2500, 2527, 2555,
129                 2583, 2611, 2639, 2668, 2696, 2725, 2754, 2783,
130                 2812, 2841, 2871, 2901, 2931, 2961, 2991, 3022,
131                 3052, 3083, 3114, 3146, 3177, 3209, 3240, 3272,
132                 3304, 3337, 3369, 3402, 3435, 3468, 3501, 3535,
133                 3568, 3602, 3636, 3670, 3705, 3739, 3774, 3809,
134                 3844, 3879, 3915, 3950, 3986, 4022, 4059, 4095,
135         },
136         /* csc */
137         {
138                 0x100, 0x0,   0x0,
139                 0x0,   0x100, 0x0,
140                 0x0,   0x0,   0x100,
141         },
142         /* lut2 maps linear space to sRGB*/
143         {
144                 0, 0, 1, 2, 3, 3, 4, 5,
145                 6, 6, 7, 8, 8, 9, 10, 10,
146                 11, 12, 12, 13, 13, 14, 14, 15,
147                 16, 16, 17, 17, 18, 18, 19, 19,
148                 19, 20, 20, 21, 21, 22, 22, 22,
149                 23, 23, 24, 24, 24, 25, 25, 25,
150                 26, 26, 27, 27, 27, 28, 28, 28,
151                 28, 29, 29, 29, 30, 30, 30, 31,
152                 31, 31, 31, 32, 32, 32, 33, 33,
153                 33, 33, 34, 34, 34, 35, 35, 35,
154                 35, 36, 36, 36, 36, 37, 37, 37,
155                 38, 38, 38, 38, 39, 39, 39, 39,
156                 40, 40, 40, 40, 40, 41, 41, 41,
157                 41, 42, 42, 42, 42, 43, 43, 43,
158                 43, 43, 44, 44, 44, 44, 45, 45,
159                 45, 45, 45, 46, 46, 46, 46, 46,
160                 47, 47, 47, 47, 47, 48, 48, 48,
161                 48, 48, 49, 49, 49, 49, 49, 49,
162                 50, 50, 50, 50, 50, 50, 51, 51,
163                 51, 51, 51, 51, 52, 52, 52, 52,
164                 52, 52, 53, 53, 53, 53, 53, 53,
165                 54, 54, 54, 54, 54, 54, 54, 55,
166                 55, 55, 55, 55, 55, 55, 55, 56,
167                 56, 56, 56, 56, 56, 56, 57, 57,
168                 57, 57, 57, 57, 57, 57, 58, 58,
169                 58, 58, 58, 58, 58, 58, 58, 59,
170                 59, 59, 59, 59, 59, 59, 59, 59,
171                 60, 60, 60, 60, 60, 60, 60, 60,
172                 60, 61, 61, 61, 61, 61, 61, 61,
173                 61, 61, 61, 62, 62, 62, 62, 62,
174                 62, 62, 62, 62, 62, 63, 63, 63,
175                 63, 63, 63, 63, 63, 63, 63, 63,
176                 64, 64, 64, 64, 64, 64, 64, 64,
177                 64, 64, 64, 65, 65, 65, 65, 65,
178                 65, 65, 65, 65, 65, 65, 66, 66,
179                 66, 66, 66, 66, 66, 66, 66, 66,
180                 66, 66, 67, 67, 67, 67, 67, 67,
181                 67, 67, 67, 67, 67, 67, 68, 68,
182                 68, 68, 68, 68, 68, 68, 68, 68,
183                 68, 68, 69, 69, 69, 69, 69, 69,
184                 69, 69, 69, 69, 69, 69, 70, 70,
185                 70, 70, 70, 70, 70, 70, 70, 70,
186                 70, 70, 70, 71, 71, 71, 71, 71,
187                 71, 71, 71, 71, 71, 71, 71, 71,
188                 72, 72, 72, 72, 72, 72, 72, 72,
189                 72, 72, 72, 72, 72, 73, 73, 73,
190                 73, 73, 73, 73, 73, 73, 73, 73,
191                 73, 73, 73, 74, 74, 74, 74, 74,
192                 74, 74, 74, 74, 74, 74, 74, 74,
193                 75, 75, 75, 75, 75, 75, 75, 75,
194                 75, 75, 75, 75, 75, 75, 76, 76,
195                 76, 76, 76, 76, 76, 76, 76, 76,
196                 76, 76, 76, 76, 77, 77, 77, 77,
197                 77, 77, 77, 77, 77, 77, 77, 77,
198                 77, 77, 78, 78, 78, 78, 78, 78,
199                 78, 78, 78, 78, 78, 78, 78, 78,
200                 79, 79, 79, 79, 79, 79, 79, 79,
201                 79, 79, 79, 79, 79, 79, 80, 80,
202                 80, 80, 80, 80, 80, 80, 80, 80,
203                 80, 80, 80, 80, 81, 81, 81, 81,
204                 81, 81, 81, 81, 81, 81, 81, 81,
205                 81, 81, 82, 82, 82, 82, 82, 82,
206                 82, 82, 82, 82, 82, 82, 82, 82,
207                 83, 83, 83, 83, 83, 83, 83, 83,
208                 84, 84, 85, 85, 86, 86, 87, 88,
209                 88, 89, 89, 90, 90, 91, 92, 92,
210                 93, 93, 94, 94, 95, 95, 96, 96,
211                 97, 97, 98, 98, 99, 99, 100, 100,
212                 101, 101, 102, 102, 103, 103, 104, 104,
213                 105, 105, 106, 106, 107, 107, 107, 108,
214                 108, 109, 109, 110, 110, 111, 111, 111,
215                 112, 112, 113, 113, 114, 114, 114, 115,
216                 115, 116, 116, 117, 117, 117, 118, 118,
217                 119, 119, 119, 120, 120, 121, 121, 121,
218                 122, 122, 123, 123, 123, 124, 124, 125,
219                 125, 126, 126, 126, 127, 127, 128, 128,
220                 128, 129, 129, 129, 130, 130, 131, 131,
221                 131, 132, 132, 133, 133, 133, 134, 134,
222                 135, 135, 135, 136, 136, 137, 137, 137,
223                 138, 138, 138, 139, 139, 140, 140, 140,
224                 141, 141, 142, 142, 142, 143, 143, 143,
225                 144, 144, 145, 145, 145, 146, 146, 146,
226                 147, 147, 147, 148, 148, 149, 149, 149,
227                 150, 150, 150, 151, 151, 151, 152, 152,
228                 153, 153, 153, 154, 154, 154, 155, 155,
229                 156, 156, 156, 157, 157, 157, 158, 158,
230                 159, 159, 159, 160, 160, 160, 161, 161,
231                 162, 162, 162, 163, 163, 164, 164, 164,
232                 165, 165, 166, 166, 166, 167, 167, 168,
233                 168, 168, 169, 169, 170, 170, 170, 171,
234                 171, 172, 172, 172, 173, 173, 173, 174,
235                 174, 175, 175, 175, 176, 176, 176, 177,
236                 177, 177, 178, 178, 178, 179, 179, 179,
237                 180, 180, 180, 180, 181, 181, 181, 182,
238                 182, 182, 182, 183, 183, 183, 184, 184,
239                 184, 184, 185, 185, 185, 185, 186, 186,
240                 186, 186, 187, 187, 187, 187, 188, 188,
241                 188, 188, 189, 189, 189, 190, 190, 190,
242                 190, 191, 191, 191, 191, 192, 192, 192,
243                 193, 193, 193, 193, 194, 194, 194, 195,
244                 195, 195, 195, 196, 196, 196, 197, 197,
245                 197, 198, 198, 198, 198, 199, 199, 199,
246                 200, 200, 200, 201, 201, 201, 202, 202,
247                 202, 203, 203, 204, 204, 204, 205, 205,
248                 205, 206, 206, 206, 207, 207, 208, 208,
249                 208, 209, 209, 209, 210, 210, 211, 211,
250                 211, 212, 212, 213, 213, 213, 214, 214,
251                 215, 215, 215, 216, 216, 217, 217, 217,
252                 218, 218, 218, 219, 219, 220, 220, 220,
253                 221, 221, 221, 222, 222, 222, 223, 223,
254                 223, 224, 224, 224, 225, 225, 225, 225,
255                 226, 226, 226, 226, 227, 227, 227, 227,
256                 228, 228, 228, 228, 229, 229, 229, 229,
257                 229, 230, 230, 230, 230, 231, 231, 231,
258                 231, 232, 232, 232, 233, 233, 233, 233,
259                 234, 234, 234, 235, 235, 235, 236, 236,
260                 236, 237, 237, 238, 238, 239, 239, 239,
261                 240, 240, 241, 241, 242, 242, 243, 244,
262                 244, 245, 245, 246, 247, 247, 248, 249,
263                 250, 250, 251, 252, 253, 254, 254, 255,
264         },
265 };
266 #endif
267
268 static int dsi_j_720p_5_bl_notify(struct device *unused, int brightness)
269 {
270         int cur_sd_brightness = atomic_read(&sd_brightness);
271
272         /* SD brightness is a percentage */
273         brightness = (brightness * cur_sd_brightness) / 255;
274
275         /* Apply any backlight response curve */
276         if (brightness > 255)
277                 pr_info("Error: Brightness > 255!\n");
278
279         return brightness;
280 }
281
282 static int dsi_j_720p_5_check_fb(struct device *dev, struct fb_info *info)
283 {
284         return info->device == &disp_device->dev;
285 }
286
287 static struct platform_pwm_backlight_data dsi_j_720p_5_bl_data = {
288         .pwm_id         = 1,
289         .max_brightness = 255,
290         .dft_brightness = 77,
291         .pwm_period_ns  = 40000,
292         .notify         = dsi_j_720p_5_bl_notify,
293         /* Only toggle backlight on fb blank notifications for disp1 */
294         .check_fb       = dsi_j_720p_5_check_fb,
295 };
296
297 static struct platform_device __maybe_unused dsi_j_720p_5_bl_device = {
298         .name   = "pwm-backlight",
299         .id     = -1,
300         .dev    = {
301                 .platform_data = &dsi_j_720p_5_bl_data,
302         },
303 };
304
305 static struct platform_device __maybe_unused *dsi_j_720p_5_bl_devices[] = {
306         &tegra_pwfm_device,
307         &dsi_j_720p_5_bl_device,
308 };
309
310 static struct tegra_dc_mode dsi_j_720p_5_modes[] = {
311         {
312                 .pclk = 69946560,
313                 .h_ref_to_sync = 1,
314                 .v_ref_to_sync = 1,
315                 .h_sync_width = 32,
316                 .v_sync_width = 2,
317                 .h_back_porch = 30,
318                 .v_back_porch = 11,
319                 .h_active = 720,
320                 .v_active = 1280,
321                 .h_front_porch = 112,
322                 .v_front_porch = 11,
323         },
324 };
325
326 static int dsi_j_720p_5_reg_get(struct device *dev)
327 {
328         int err = 0;
329
330         if (reg_requested)
331                 return 0;
332
333         avdd_lcd_3v0_2v8 = regulator_get(dev, "avdd_lcd");
334         if (IS_ERR(avdd_lcd_3v0_2v8)) {
335                 pr_err("avdd_lcd regulator get failed\n");
336                 err = PTR_ERR(avdd_lcd_3v0_2v8);
337                 avdd_lcd_3v0_2v8 = NULL;
338                 goto fail;
339         }
340         vdd_lcd_s_1v8 = regulator_get(dev, "dvdd_lcd");
341         if (IS_ERR(vdd_lcd_s_1v8)) {
342                 pr_err("vdd_lcd_1v8_s regulator get failed\n");
343                 err = PTR_ERR(vdd_lcd_s_1v8);
344                 vdd_lcd_s_1v8 = NULL;
345                 goto fail;
346         }
347
348         if (machine_is_dalmore()) {
349                 vdd_lcd_bl = regulator_get(dev, "vdd_lcd_bl");
350                 if (IS_ERR(vdd_lcd_bl)) {
351                         pr_err("vdd_lcd_bl regulator get failed\n");
352                         err = PTR_ERR(vdd_lcd_bl);
353                         vdd_lcd_bl = NULL;
354                         goto fail;
355                 }
356         }
357
358         vdd_lcd_bl_en = regulator_get(dev, "vdd_lcd_bl_en");
359         if (IS_ERR(vdd_lcd_bl_en)) {
360                 pr_err("vdd_lcd_bl_en regulator get failed\n");
361                 err = PTR_ERR(vdd_lcd_bl_en);
362                 vdd_lcd_bl_en = NULL;
363                 goto fail;
364         }
365         reg_requested = true;
366         return 0;
367 fail:
368         return err;
369 }
370
371 static int dsi_j_720p_5_gpio_get(void)
372 {
373         int err = 0;
374
375         if (gpio_requested)
376                 return 0;
377
378         err = gpio_request(dsi_j_720p_5_pdata.dsi_panel_rst_gpio,
379                 "panel rst");
380         if (err < 0) {
381                 pr_err("panel reset gpio request failed\n");
382                 goto fail;
383         }
384
385         err = gpio_request(DSI_PANEL_EN_GPIO, "panel en");
386         if (err < 0) {
387                 pr_err("panel en gpio request failed\n");
388                 goto fail;
389         }
390
391         gpio_requested = true;
392         return 0;
393 fail:
394         return err;
395 }
396
397 static struct tegra_dsi_cmd dsi_j_720p_5_init_cmd[] = {
398         /* panel exit_sleep_mode sequence */
399         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_EXIT_SLEEP_MODE, 0x0),
400         DSI_SEND_FRAME(5),
401         DSI_DLY_MS(20),
402
403         /* panel set_display_on sequence */
404         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_SET_DISPLAY_ON, 0x0),
405         DSI_DLY_MS(20),
406 };
407
408 static struct tegra_dsi_cmd dsi_j_720p_5_suspend_cmd[] = {
409         /* panel set_display_off sequence */
410         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_SET_DISPLAY_OFF, 0x0),
411
412         /* panel enter_sleep_mode sequence*/
413         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_ENTER_SLEEP_MODE, 0x0),
414         DSI_DLY_MS(60),
415 };
416
417 static int dsi_j_720p_5_enable(struct device *dev)
418 {
419         return 0;
420 }
421
422 static int dsi_j_720p_5_postpoweron(struct device *dev)
423 {
424         int err = 0;
425
426         err = dsi_j_720p_5_reg_get(dev);
427         if (err < 0) {
428                 pr_err("dsi regulator get failed\n");
429                 goto fail;
430         }
431         err = dsi_j_720p_5_gpio_get();
432         if (err < 0) {
433                 pr_err("dsi gpio request failed\n");
434                 goto fail;
435         }
436         gpio_direction_output(dsi_j_720p_5_pdata.dsi_panel_rst_gpio, 0);
437         gpio_direction_output(DSI_PANEL_EN_GPIO, 0);
438
439         if (vdd_lcd_s_1v8) {
440                 err = regulator_enable(vdd_lcd_s_1v8);
441                 if (err < 0) {
442                         pr_err("vdd_lcd_1v8_s regulator enable failed\n");
443                         goto fail;
444                 }
445         }
446         usleep_range(3000, 5000);
447
448         if (avdd_lcd_3v0_2v8) {
449                 err = regulator_enable(avdd_lcd_3v0_2v8);
450                 if (err < 0) {
451                         pr_err("avdd_lcd_3v0_2v8 regulator enable failed\n");
452                         goto fail;
453                 }
454                 regulator_set_voltage(avdd_lcd_3v0_2v8, 3000000, 3000000);
455         }
456         usleep_range(3000, 5000);
457
458         if (vdd_lcd_bl) {
459                 err = regulator_enable(vdd_lcd_bl);
460                 if (err < 0) {
461                         pr_err("vdd_lcd_bl regulator enable failed\n");
462                         goto fail;
463                 }
464         }
465
466         if (vdd_lcd_bl_en) {
467                 err = regulator_enable(vdd_lcd_bl_en);
468                 if (err < 0) {
469                         pr_err("vdd_lcd_bl_en regulator enable failed\n");
470                         goto fail;
471                 }
472         }
473         usleep_range(3000, 5000);
474
475         gpio_set_value(dsi_j_720p_5_pdata.dsi_panel_rst_gpio, 1);
476         msleep(20);
477         gpio_set_value(DSI_PANEL_EN_GPIO, 1);
478         msleep(20);
479
480         return 0;
481 fail:
482         return err;
483 }
484
485 static struct tegra_dsi_out dsi_j_720p_5_pdata = {
486         .n_data_lanes = 4,
487         .controller_vs = DSI_VS_1,
488         .pixel_format = TEGRA_DSI_PIXEL_FORMAT_24BIT_P,
489         .refresh_rate = 60,
490         .virtual_channel = TEGRA_DSI_VIRTUAL_CHANNEL_0,
491
492         .panel_reset = DSI_PANEL_RESET,
493         .power_saving_suspend = true,
494         .video_data_type = TEGRA_DSI_VIDEO_TYPE_VIDEO_MODE,
495         .video_clock_mode = TEGRA_DSI_VIDEO_CLOCK_CONTINUOUS,
496         .video_burst_mode = TEGRA_DSI_VIDEO_NONE_BURST_MODE_WITH_SYNC_END,
497         .dsi_init_cmd = dsi_j_720p_5_init_cmd,
498         .n_init_cmd = ARRAY_SIZE(dsi_j_720p_5_init_cmd),
499         .dsi_suspend_cmd = dsi_j_720p_5_suspend_cmd,
500         .n_suspend_cmd = ARRAY_SIZE(dsi_j_720p_5_suspend_cmd),
501 };
502
503 static int dsi_j_720p_5_disable(void)
504 {
505         if (vdd_lcd_bl)
506                 regulator_disable(vdd_lcd_bl);
507
508         if (vdd_lcd_bl_en)
509                 regulator_disable(vdd_lcd_bl_en);
510
511         if (vdd_lcd_s_1v8)
512                 regulator_disable(vdd_lcd_s_1v8);
513
514         if (avdd_lcd_3v0_2v8)
515                 regulator_disable(avdd_lcd_3v0_2v8);
516
517         return 0;
518 }
519
520 static int dsi_j_720p_5_postsuspend(void)
521 {
522         /* TODO */
523         return 0;
524 }
525
526 static int dsi_j_720p_5_register_bl_dev(void)
527 {
528         int err = 0;
529
530         err = platform_add_devices(dsi_j_720p_5_bl_devices,
531                                 ARRAY_SIZE(dsi_j_720p_5_bl_devices));
532         if (err) {
533                 pr_err("disp1 bl device registration failed");
534                 return err;
535         }
536
537         err = gpio_request(dsi_j_720p_5_pdata.dsi_panel_bl_pwm_gpio,
538                 "panel pwm");
539         if (err < 0) {
540                 pr_err("panel backlight pwm gpio request failed\n");
541                 return err;
542         }
543         gpio_free(dsi_j_720p_5_pdata.dsi_panel_bl_pwm_gpio);
544         return err;
545 }
546
547 static void dsi_j_720p_5_set_disp_device
548         (struct platform_device *loki_display_device)
549 {
550         disp_device = loki_display_device;
551 }
552
553 static void dsi_j_720p_5_dc_out_init(struct tegra_dc_out *dc)
554 {
555         dc->dsi = &dsi_j_720p_5_pdata;
556         dc->modes = dsi_j_720p_5_modes;
557         dc->n_modes = ARRAY_SIZE(dsi_j_720p_5_modes);
558         dc->enable = dsi_j_720p_5_enable;
559         dc->disable = dsi_j_720p_5_disable;
560         dc->postsuspend = dsi_j_720p_5_postsuspend;
561         dc->postpoweron = dsi_j_720p_5_postpoweron;
562         dc->width = 130;
563         dc->height = 74;
564         dc->flags = DC_CTRL_MODE;
565         dc->rotation = 270;
566 }
567
568 static void dsi_j_720p_5_fb_data_init(struct tegra_fb_data *fb)
569 {
570         fb->xres = dsi_j_720p_5_modes[0].h_active;
571         fb->yres = dsi_j_720p_5_modes[0].v_active;
572 }
573
574 static void dsi_j_720p_5_sd_settings_init
575         (struct tegra_dc_sd_settings *settings)
576 {
577         *settings = dsi_j_720p_5_sd_settings;
578         settings->bl_device_name = "pwm-backlight";
579 }
580
581 #ifdef CONFIG_TEGRA_DC_CMU
582 static void dsi_j_720p_5_cmu_init(struct tegra_dc_platform_data *pdata)
583 {
584         pdata->cmu = &dsi_j_720p_5_cmu;
585 }
586 #endif
587
588 struct tegra_panel __initdata dsi_j_720p_5 = {
589         .init_sd_settings = dsi_j_720p_5_sd_settings_init,
590         .init_dc_out = dsi_j_720p_5_dc_out_init,
591         .init_fb_data = dsi_j_720p_5_fb_data_init,
592         .set_disp_device = dsi_j_720p_5_set_disp_device,
593         .register_bl_dev = dsi_j_720p_5_register_bl_dev,
594 #ifdef CONFIG_TEGRA_DC_CMU
595         .init_cmu_data = dsi_j_720p_5_cmu_init,
596 #endif
597 };
598 EXPORT_SYMBOL(dsi_j_720p_5);