ARM: tegra: pcie: Remove dock detect variable
[linux-3.10.git] / arch / arm / mach-tegra / panel-s-wqxga-10-1.c
1 /*
2  * arch/arm/mach-tegra/panel-s-wqxga-10-1.c
3  *
4  * Copyright (c) 2012-2013, NVIDIA CORPORATION. All rights reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #include <mach/dc.h>
20 #include <linux/delay.h>
21 #include <linux/gpio.h>
22 #include <linux/tegra_pwm_bl.h>
23 #include <linux/regulator/consumer.h>
24 #include <linux/pwm_backlight.h>
25 #include <linux/max8831_backlight.h>
26 #include <linux/leds.h>
27 #include <linux/ioport.h>
28 #include <linux/export.h>
29
30 #include <generated/mach-types.h>
31
32 #include "board.h"
33 #include "board-panel.h"
34 #include "devices.h"
35 #include "gpio-names.h"
36 #include "tegra11_host1x_devices.h"
37
38 #define TEGRA_DSI_GANGED_MODE   1
39
40 #define DSI_PANEL_RESET         1
41
42 #ifdef CONFIG_ARCH_TEGRA_12x_SOC
43 #define DC_CTRL_MODE    (TEGRA_DC_OUT_ONE_SHOT_MODE |\
44                         TEGRA_DC_OUT_ONE_SHOT_LP_MODE)
45 #else
46 #define DC_CTRL_MODE    TEGRA_DC_OUT_CONTINUOUS_MODE
47 #endif
48
49 #define en_vdd_bl       TEGRA_GPIO_PG0
50 #define lvds_en         TEGRA_GPIO_PG3
51
52 static bool reg_requested;
53 static bool gpio_requested;
54 static struct platform_device *disp_device;
55 static struct regulator *avdd_lcd_3v3;
56 static struct regulator *vdd_lcd_bl;
57 static struct regulator *vdd_lcd_bl_en;
58 static struct regulator *dvdd_lcd_1v8;
59 static struct regulator *vdd_ds_1v8;
60
61 #define en_vdd_bl       TEGRA_GPIO_PG0
62 #define lvds_en         TEGRA_GPIO_PG3
63
64 static struct tegra_dc_sd_settings dsi_s_wqxga_10_1_sd_settings = {
65         .enable = 1, /* enabled by default. */
66         .use_auto_pwm = false,
67         .hw_update_delay = 0,
68         .bin_width = -1,
69         .aggressiveness = 5,
70         .use_vid_luma = false,
71         .phase_in_adjustments = 0,
72         .k_limit_enable = true,
73         .k_limit = 200,
74         .sd_window_enable = false,
75         .soft_clipping_enable = true,
76         /* Low soft clipping threshold to compensate for aggressive k_limit */
77         .soft_clipping_threshold = 128,
78         .smooth_k_enable = true,
79         .smooth_k_incr = 4,
80         /* Default video coefficients */
81         .coeff = {5, 9, 2},
82         .fc = {0, 0},
83         /* Immediate backlight changes */
84         .blp = {1024, 255},
85         /* Gammas: R: 2.2 G: 2.2 B: 2.2 */
86         /* Default BL TF */
87         .bltf = {
88                         {
89                                 {57, 65, 73, 82},
90                                 {92, 103, 114, 125},
91                                 {138, 150, 164, 178},
92                                 {193, 208, 224, 241},
93                         },
94                 },
95         /* Default LUT */
96         .lut = {
97                         {
98                                 {255, 255, 255},
99                                 {199, 199, 199},
100                                 {153, 153, 153},
101                                 {116, 116, 116},
102                                 {85, 85, 85},
103                                 {59, 59, 59},
104                                 {36, 36, 36},
105                                 {17, 17, 17},
106                                 {0, 0, 0},
107                         },
108                 },
109         .sd_brightness = &sd_brightness,
110         .use_vpulse2 = true,
111 };
112
113 static tegra_dc_bl_output dsi_s_wqxga_10_1_bl_output_measured = {
114         0, 1, 2, 3, 4, 5, 6, 7,
115         8, 9, 11, 11, 12, 13, 14, 15,
116         16, 17, 18, 19, 20, 21, 21, 22,
117         23, 24, 25, 26, 27, 28, 29, 30,
118         31, 32, 32, 33, 34, 35, 36, 37,
119         38, 39, 40, 41, 42, 43, 43, 44,
120         45, 46, 47, 48, 49, 50, 51, 52,
121         53, 54, 54, 55, 56, 57, 58, 59,
122         60, 61, 62, 63, 63, 64, 65, 66,
123         67, 68, 69, 70, 71, 72, 73, 74,
124         75, 76, 77, 78, 79, 80, 80, 81,
125         82, 83, 84, 85, 86, 87, 88, 89,
126         90, 91, 92, 93, 94, 95, 96, 97,
127         98, 99, 100, 101, 102, 103, 104, 105,
128         106, 107, 108, 109, 110, 111, 112, 113,
129         114, 115, 116, 117, 118, 119, 120, 121,
130         122, 123, 124, 125, 126, 127, 128, 129,
131         130, 131, 132, 133, 134, 135, 136, 137,
132         138, 140, 141, 142, 143, 144, 145, 146,
133         147, 148, 149, 150, 151, 152, 153, 154,
134         155, 156, 157, 158, 159, 160, 161, 162,
135         163, 164, 165, 166, 167, 168, 169, 170,
136         171, 172, 173, 174, 175, 177, 178, 179,
137         180, 181, 182, 183, 184, 185, 186, 187,
138         188, 189, 190, 191, 192, 193, 194, 195,
139         196, 197, 198, 200, 201, 202, 203, 204,
140         205, 206, 207, 208, 209, 210, 211, 212,
141         213, 214, 215, 217, 218, 219, 220, 221,
142         222, 223, 224, 225, 226, 227, 228, 229,
143         230, 231, 232, 234, 235, 236, 237, 238,
144         239, 240, 241, 242, 243, 244, 245, 246,
145         248, 249, 250, 251, 252, 253, 254, 255,
146 };
147
148 #if DC_CTRL_MODE & TEGRA_DC_OUT_ONE_SHOT_MODE
149 static u8 fbuf_mode_sel[] = {0x10, 0x00, 0x2A}; /* left-right */
150 #else
151 static u8 fbuf_mode_sel[] = {0x10, 0x00, 0x17}; /* odd-even, DRAM through */
152 #endif
153
154 static u8 __maybe_unused mipi_if_sel[] = {0x10, 0x01, 0x01}; /* cmd mode */
155 static u8 __maybe_unused smode[] = {0x10, 0x07, 0x07}; /* vsync mode */
156
157 static struct tegra_dsi_cmd dsi_s_wqxga_10_1_init_cmd[] = {
158         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, fbuf_mode_sel),
159         DSI_DLY_MS(20),
160         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_NO_OP, 0x0),
161         DSI_DLY_MS(20),
162
163 #if DC_CTRL_MODE & TEGRA_DC_OUT_ONE_SHOT_MODE
164         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, mipi_if_sel),
165         DSI_DLY_MS(20),
166         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_NO_OP, 0x0),
167         DSI_DLY_MS(20),
168 #endif
169
170 #if !(DC_CTRL_MODE & TEGRA_DC_OUT_ONE_SHOT_MODE)
171         DSI_CMD_LONG(DSI_GENERIC_LONG_WRITE, smode),
172         DSI_DLY_MS(20),
173         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_NO_OP, 0x0),
174         DSI_DLY_MS(20),
175 #endif
176
177 #if DC_CTRL_MODE & TEGRA_DC_OUT_ONE_SHOT_MODE
178         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM,
179                         DSI_DCS_SET_TEARING_EFFECT_ON, 0x0),
180         DSI_DLY_MS(20),
181 #endif
182         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_EXIT_SLEEP_MODE, 0x0),
183         DSI_DLY_MS(120),
184         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_SET_DISPLAY_ON, 0x0),
185         DSI_DLY_MS(20),
186         DSI_SEND_FRAME(1),
187         DSI_DLY_MS(120),
188 };
189
190 static struct tegra_dsi_cmd dsi_s_wqxga_10_1_suspend_cmd[] = {
191         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_SET_DISPLAY_OFF, 0x0),
192         DSI_DLY_MS(50),
193         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_ENTER_SLEEP_MODE, 0x0),
194         DSI_DLY_MS(200),
195 #if DC_CTRL_MODE & TEGRA_DC_OUT_ONE_SHOT_MODE
196         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM,
197                         DSI_DCS_SET_TEARING_EFFECT_OFF, 0x0),
198         DSI_DLY_MS(20),
199 #endif
200 };
201
202 static struct tegra_dsi_out dsi_s_wqxga_10_1_pdata = {
203         .controller_vs = DSI_VS_1,
204
205         .n_data_lanes = 8,
206
207 #if DC_CTRL_MODE & TEGRA_DC_OUT_ONE_SHOT_MODE
208         .video_data_type = TEGRA_DSI_VIDEO_TYPE_COMMAND_MODE,
209         .ganged_type = TEGRA_DSI_GANGED_SYMMETRIC_LEFT_RIGHT,
210         .suspend_aggr = DSI_HOST_SUSPEND_LV2,
211         .refresh_rate = 61,
212         .rated_refresh_rate = 60,
213         .te_polarity_low = true,
214 #else
215         .ganged_type = TEGRA_DSI_GANGED_SYMMETRIC_EVEN_ODD,
216         .video_data_type = TEGRA_DSI_VIDEO_TYPE_VIDEO_MODE,
217         .video_burst_mode = TEGRA_DSI_VIDEO_NONE_BURST_MODE,
218         .refresh_rate = 60,
219 #endif
220
221         .pixel_format = TEGRA_DSI_PIXEL_FORMAT_24BIT_P,
222         .virtual_channel = TEGRA_DSI_VIRTUAL_CHANNEL_0,
223
224         .panel_reset = DSI_PANEL_RESET,
225         .power_saving_suspend = true,
226         .video_clock_mode = TEGRA_DSI_VIDEO_CLOCK_TX_ONLY,
227         .dsi_init_cmd = dsi_s_wqxga_10_1_init_cmd,
228         .n_init_cmd = ARRAY_SIZE(dsi_s_wqxga_10_1_init_cmd),
229         .dsi_suspend_cmd = dsi_s_wqxga_10_1_suspend_cmd,
230         .n_suspend_cmd = ARRAY_SIZE(dsi_s_wqxga_10_1_suspend_cmd),
231         .bl_name = "pwm-backlight",
232         .lp00_pre_panel_wakeup = true,
233         .ulpm_not_supported = true,
234 };
235
236 static int dalmore_dsi_regulator_get(struct device *dev)
237 {
238         int err = 0;
239
240         if (reg_requested)
241                 return 0;
242         dvdd_lcd_1v8 = regulator_get(dev, "dvdd_lcd");
243         if (IS_ERR(dvdd_lcd_1v8)) {
244                 pr_err("dvdd_lcd regulator get failed\n");
245                 err = PTR_ERR(dvdd_lcd_1v8);
246                 dvdd_lcd_1v8 = NULL;
247                 goto fail;
248         }
249         avdd_lcd_3v3 = regulator_get(dev, "avdd_lcd");
250         if (IS_ERR(avdd_lcd_3v3)) {
251                 pr_err("avdd_lcd regulator get failed\n");
252                 err = PTR_ERR(avdd_lcd_3v3);
253                 avdd_lcd_3v3 = NULL;
254                 goto fail;
255         }
256
257         vdd_lcd_bl = regulator_get(dev, "vdd_lcd_bl");
258         if (IS_ERR(vdd_lcd_bl)) {
259                 pr_err("vdd_lcd_bl regulator get failed\n");
260                 err = PTR_ERR(vdd_lcd_bl);
261                 vdd_lcd_bl = NULL;
262                 goto fail;
263         }
264
265         vdd_lcd_bl_en = regulator_get(dev, "vdd_lcd_bl_en");
266         if (IS_ERR(vdd_lcd_bl_en)) {
267                 pr_err("vdd_lcd_bl_en regulator get failed\n");
268                 err = PTR_ERR(vdd_lcd_bl_en);
269                 vdd_lcd_bl_en = NULL;
270                 goto fail;
271         }
272         reg_requested = true;
273         return 0;
274 fail:
275         return err;
276 }
277
278 static int dalmore_dsi_gpio_get(void)
279 {
280         int err = 0;
281
282         if (gpio_requested)
283                 return 0;
284
285         err = gpio_request(dsi_s_wqxga_10_1_pdata.dsi_panel_rst_gpio,
286                 "panel rst");
287         if (err < 0) {
288                 pr_err("panel reset gpio request failed\n");
289                 goto fail;
290         }
291
292         /* free pwm GPIO */
293         err = gpio_request(dsi_s_wqxga_10_1_pdata.dsi_panel_bl_pwm_gpio,
294                 "panel pwm");
295         if (err < 0) {
296                 pr_err("panel pwm gpio request failed\n");
297                 goto fail;
298         }
299         gpio_free(dsi_s_wqxga_10_1_pdata.dsi_panel_bl_pwm_gpio);
300         gpio_requested = true;
301         return 0;
302 fail:
303         return err;
304 }
305
306 static int macallan_dsi_regulator_get(struct device *dev)
307 {
308         int err = 0;
309
310         if (reg_requested)
311                 return 0;
312
313         avdd_lcd_3v3 = regulator_get(dev, "avdd_lcd");
314         if (IS_ERR(avdd_lcd_3v3)) {
315                 pr_err("avdd_lcd regulator get failed\n");
316                 err = PTR_ERR(avdd_lcd_3v3);
317                 avdd_lcd_3v3 = NULL;
318                 goto fail;
319         }
320
321         vdd_lcd_bl_en = regulator_get(dev, "vdd_lcd_bl_en");
322         if (IS_ERR(vdd_lcd_bl_en)) {
323                 pr_err("vdd_lcd_bl_en regulator get failed\n");
324                 err = PTR_ERR(vdd_lcd_bl_en);
325                 vdd_lcd_bl_en = NULL;
326                 goto fail;
327         }
328         reg_requested = true;
329         return 0;
330 fail:
331         return err;
332 }
333
334 static int macallan_dsi_gpio_get(void)
335 {
336         int err = 0;
337
338         if (gpio_requested)
339                 return 0;
340
341         err = gpio_request(dsi_s_wqxga_10_1_pdata.dsi_panel_rst_gpio,
342         "panel rst");
343         if (err < 0) {
344                 pr_err("panel reset gpio request failed\n");
345                 goto fail;
346         }
347
348         /* free pwm GPIO */
349         err = gpio_request(dsi_s_wqxga_10_1_pdata.dsi_panel_bl_pwm_gpio,
350         "panel pwm");
351         if (err < 0) {
352                 pr_err("panel pwm gpio request failed\n");
353                 goto fail;
354         }
355         gpio_free(dsi_s_wqxga_10_1_pdata.dsi_panel_bl_pwm_gpio);
356         gpio_requested = true;
357         return 0;
358 fail:
359         return err;
360 }
361
362 static int dsi_s_wqxga_10_1_postpoweron(struct device *dev)
363 {
364         int err = 0;
365
366         if (machine_is_macallan())
367                 err = macallan_dsi_regulator_get(dev);
368         else
369                 err = dalmore_dsi_regulator_get(dev);
370         if (err < 0) {
371                 pr_err("dsi regulator get failed\n");
372                 goto fail;
373         }
374
375         if (machine_is_macallan())
376                 err = macallan_dsi_gpio_get();
377         else
378                 err = dalmore_dsi_gpio_get();
379         if (err < 0) {
380                 pr_err("dsi gpio request failed\n");
381                 goto fail;
382         }
383
384         if (vdd_ds_1v8) {
385                 err = regulator_enable(vdd_ds_1v8);
386                 if (err < 0) {
387                         pr_err("vdd_ds_1v8 regulator enable failed\n");
388                         goto fail;
389                 }
390         }
391
392         if (dvdd_lcd_1v8) {
393                 err = regulator_enable(dvdd_lcd_1v8);
394                 if (err < 0) {
395                         pr_err("dvdd_lcd regulator enable failed\n");
396                         goto fail;
397                 }
398         }
399
400         if (avdd_lcd_3v3) {
401                 err = regulator_enable(avdd_lcd_3v3);
402                 if (err < 0) {
403                         pr_err("avdd_lcd regulator enable failed\n");
404                         goto fail;
405                 }
406         }
407
408         /* panel ic requirement after vcc enable */
409         msleep(260);
410
411         if (vdd_lcd_bl) {
412                 err = regulator_enable(vdd_lcd_bl);
413                 if (err < 0) {
414                         pr_err("vdd_lcd_bl regulator enable failed\n");
415                         goto fail;
416                 }
417         }
418
419         if (vdd_lcd_bl_en) {
420                 err = regulator_enable(vdd_lcd_bl_en);
421                 if (err < 0) {
422                         pr_err("vdd_lcd_bl_en regulator enable failed\n");
423                         goto fail;
424                 }
425         }
426
427         msleep(20);
428 #if DSI_PANEL_RESET
429         gpio_direction_output(dsi_s_wqxga_10_1_pdata.dsi_panel_rst_gpio, 1);
430         usleep_range(1000, 5000);
431         gpio_set_value(dsi_s_wqxga_10_1_pdata.dsi_panel_rst_gpio, 0);
432         usleep_range(1000, 5000);
433         gpio_set_value(dsi_s_wqxga_10_1_pdata.dsi_panel_rst_gpio, 1);
434         msleep(20);
435 #endif
436
437         return 0;
438 fail:
439         return err;
440 }
441
442 static int dsi_s_wqxga_10_1_enable(struct device *dev)
443 {
444         return 0;
445 }
446
447 static int dsi_s_wqxga_10_1_disable(void)
448 {
449         if (vdd_lcd_bl)
450                 regulator_disable(vdd_lcd_bl);
451
452         if (vdd_lcd_bl_en)
453                 regulator_disable(vdd_lcd_bl_en);
454
455         if (avdd_lcd_3v3)
456                 regulator_disable(avdd_lcd_3v3);
457
458         if (dvdd_lcd_1v8)
459                 regulator_disable(dvdd_lcd_1v8);
460
461         if (vdd_ds_1v8)
462                 regulator_disable(vdd_ds_1v8);
463
464         return 0;
465 }
466
467 static int dsi_s_wqxga_10_1_postsuspend(void)
468 {
469         return 0;
470 }
471
472 static struct tegra_dc_mode dsi_s_wqxga_10_1_modes[] = {
473         {
474 #if DC_CTRL_MODE & TEGRA_DC_OUT_ONE_SHOT_MODE
475                 .pclk = 294264000, /* @61Hz */
476                 .h_ref_to_sync = 0,
477
478                 /* dc constraint, min 1 */
479                 .v_ref_to_sync = 1,
480
481                 .h_sync_width = 32,
482
483                 /* dc constraint, min 1 */
484                 .v_sync_width = 1,
485
486                 .h_back_porch = 80,
487
488                 /* panel constraint, send frame after TE deassert */
489                 .v_back_porch = 5,
490
491                 .h_active = 2560,
492                 .v_active = 1600,
493                 .h_front_porch = 328,
494
495                 /* dc constraint, min v_ref_to_sync + 1 */
496                 .v_front_porch = 2,
497 #else
498                 .pclk = 268627200, /* @60Hz */
499                 .h_ref_to_sync = 4,
500                 .v_ref_to_sync = 1,
501                 .h_sync_width = 32,
502                 .v_sync_width = 6,
503                 .h_back_porch = 80,
504                 .v_back_porch = 37,
505                 .h_active = 2560,
506                 .v_active = 1600,
507                 .h_front_porch = 48,
508                 .v_front_porch = 3,
509 #endif
510         },
511 };
512
513 #ifdef CONFIG_TEGRA_DC_CMU
514 static struct tegra_dc_cmu dsi_s_wqxga_10_1_cmu = {
515         /* lut1 maps sRGB to linear space. */
516         {
517         0,    1,    2,    4,    5,    6,    7,    9,
518         10,   11,   12,   14,   15,   16,   18,   20,
519         21,   23,   25,   27,   29,   31,   33,   35,
520         37,   40,   42,   45,   48,   50,   53,   56,
521         59,   62,   66,   69,   72,   76,   79,   83,
522         87,   91,   95,   99,   103,  107,  112,  116,
523         121,  126,  131,  136,  141,  146,  151,  156,
524         162,  168,  173,  179,  185,  191,  197,  204,
525         210,  216,  223,  230,  237,  244,  251,  258,
526         265,  273,  280,  288,  296,  304,  312,  320,
527         329,  337,  346,  354,  363,  372,  381,  390,
528         400,  409,  419,  428,  438,  448,  458,  469,
529         479,  490,  500,  511,  522,  533,  544,  555,
530         567,  578,  590,  602,  614,  626,  639,  651,
531         664,  676,  689,  702,  715,  728,  742,  755,
532         769,  783,  797,  811,  825,  840,  854,  869,
533         884,  899,  914,  929,  945,  960,  976,  992,
534         1008, 1024, 1041, 1057, 1074, 1091, 1108, 1125,
535         1142, 1159, 1177, 1195, 1213, 1231, 1249, 1267,
536         1286, 1304, 1323, 1342, 1361, 1381, 1400, 1420,
537         1440, 1459, 1480, 1500, 1520, 1541, 1562, 1582,
538         1603, 1625, 1646, 1668, 1689, 1711, 1733, 1755,
539         1778, 1800, 1823, 1846, 1869, 1892, 1916, 1939,
540         1963, 1987, 2011, 2035, 2059, 2084, 2109, 2133,
541         2159, 2184, 2209, 2235, 2260, 2286, 2312, 2339,
542         2365, 2392, 2419, 2446, 2473, 2500, 2527, 2555,
543         2583, 2611, 2639, 2668, 2696, 2725, 2754, 2783,
544         2812, 2841, 2871, 2901, 2931, 2961, 2991, 3022,
545         3052, 3083, 3114, 3146, 3177, 3209, 3240, 3272,
546         3304, 3337, 3369, 3402, 3435, 3468, 3501, 3535,
547         3568, 3602, 3636, 3670, 3705, 3739, 3774, 3809,
548         3844, 3879, 3915, 3950, 3986, 4022, 4059, 4095,
549         },
550         /* csc */
551         {
552                 0x105, 0x3D5, 0x024, /* 1.021 -0.164 0.143 */
553                 0x3EA, 0x121, 0x3C1, /* -0.082 1.128 -0.245 */
554                 0x002, 0x00A, 0x0F4, /* 0.007 0.038 0.955 */
555         },
556         /* lut2 maps linear space to sRGB */
557         {
558                 0,    1,    2,    2,    3,    4,    5,    6,
559                 6,    7,    8,    9,    10,   10,   11,   12,
560                 13,   13,   14,   15,   15,   16,   16,   17,
561                 18,   18,   19,   19,   20,   20,   21,   21,
562                 22,   22,   23,   23,   23,   24,   24,   25,
563                 25,   25,   26,   26,   27,   27,   27,   28,
564                 28,   29,   29,   29,   30,   30,   30,   31,
565                 31,   31,   32,   32,   32,   33,   33,   33,
566                 34,   34,   34,   34,   35,   35,   35,   36,
567                 36,   36,   37,   37,   37,   37,   38,   38,
568                 38,   38,   39,   39,   39,   40,   40,   40,
569                 40,   41,   41,   41,   41,   42,   42,   42,
570                 42,   43,   43,   43,   43,   43,   44,   44,
571                 44,   44,   45,   45,   45,   45,   46,   46,
572                 46,   46,   46,   47,   47,   47,   47,   48,
573                 48,   48,   48,   48,   49,   49,   49,   49,
574                 49,   50,   50,   50,   50,   50,   51,   51,
575                 51,   51,   51,   52,   52,   52,   52,   52,
576                 53,   53,   53,   53,   53,   54,   54,   54,
577                 54,   54,   55,   55,   55,   55,   55,   55,
578                 56,   56,   56,   56,   56,   57,   57,   57,
579                 57,   57,   57,   58,   58,   58,   58,   58,
580                 58,   59,   59,   59,   59,   59,   59,   60,
581                 60,   60,   60,   60,   60,   61,   61,   61,
582                 61,   61,   61,   62,   62,   62,   62,   62,
583                 62,   63,   63,   63,   63,   63,   63,   64,
584                 64,   64,   64,   64,   64,   64,   65,   65,
585                 65,   65,   65,   65,   66,   66,   66,   66,
586                 66,   66,   66,   67,   67,   67,   67,   67,
587                 67,   67,   68,   68,   68,   68,   68,   68,
588                 68,   69,   69,   69,   69,   69,   69,   69,
589                 70,   70,   70,   70,   70,   70,   70,   71,
590                 71,   71,   71,   71,   71,   71,   72,   72,
591                 72,   72,   72,   72,   72,   72,   73,   73,
592                 73,   73,   73,   73,   73,   74,   74,   74,
593                 74,   74,   74,   74,   74,   75,   75,   75,
594                 75,   75,   75,   75,   75,   76,   76,   76,
595                 76,   76,   76,   76,   77,   77,   77,   77,
596                 77,   77,   77,   77,   78,   78,   78,   78,
597                 78,   78,   78,   78,   78,   79,   79,   79,
598                 79,   79,   79,   79,   79,   80,   80,   80,
599                 80,   80,   80,   80,   80,   81,   81,   81,
600                 81,   81,   81,   81,   81,   81,   82,   82,
601                 82,   82,   82,   82,   82,   82,   83,   83,
602                 83,   83,   83,   83,   83,   83,   83,   84,
603                 84,   84,   84,   84,   84,   84,   84,   84,
604                 85,   85,   85,   85,   85,   85,   85,   85,
605                 85,   86,   86,   86,   86,   86,   86,   86,
606                 86,   86,   87,   87,   87,   87,   87,   87,
607                 87,   87,   87,   88,   88,   88,   88,   88,
608                 88,   88,   88,   88,   88,   89,   89,   89,
609                 89,   89,   89,   89,   89,   89,   90,   90,
610                 90,   90,   90,   90,   90,   90,   90,   90,
611                 91,   91,   91,   91,   91,   91,   91,   91,
612                 91,   91,   92,   92,   92,   92,   92,   92,
613                 92,   92,   92,   92,   93,   93,   93,   93,
614                 93,   93,   93,   93,   93,   93,   94,   94,
615                 94,   94,   94,   94,   94,   94,   94,   94,
616                 95,   95,   95,   95,   95,   95,   95,   95,
617                 95,   95,   96,   96,   96,   96,   96,   96,
618                 96,   96,   96,   96,   96,   97,   97,   97,
619                 97,   97,   97,   97,   97,   97,   97,   98,
620                 98,   98,   98,   98,   98,   98,   98,   98,
621                 98,   98,   99,   99,   99,   99,   99,   99,
622                 99,   100,  101,  101,  102,  103,  103,  104,
623                 105,  105,  106,  107,  107,  108,  109,  109,
624                 110,  111,  111,  112,  113,  113,  114,  115,
625                 115,  116,  116,  117,  118,  118,  119,  119,
626                 120,  120,  121,  122,  122,  123,  123,  124,
627                 124,  125,  126,  126,  127,  127,  128,  128,
628                 129,  129,  130,  130,  131,  131,  132,  132,
629                 133,  133,  134,  134,  135,  135,  136,  136,
630                 137,  137,  138,  138,  139,  139,  140,  140,
631                 141,  141,  142,  142,  143,  143,  144,  144,
632                 145,  145,  145,  146,  146,  147,  147,  148,
633                 148,  149,  149,  150,  150,  150,  151,  151,
634                 152,  152,  153,  153,  153,  154,  154,  155,
635                 155,  156,  156,  156,  157,  157,  158,  158,
636                 158,  159,  159,  160,  160,  160,  161,  161,
637                 162,  162,  162,  163,  163,  164,  164,  164,
638                 165,  165,  166,  166,  166,  167,  167,  167,
639                 168,  168,  169,  169,  169,  170,  170,  170,
640                 171,  171,  172,  172,  172,  173,  173,  173,
641                 174,  174,  174,  175,  175,  176,  176,  176,
642                 177,  177,  177,  178,  178,  178,  179,  179,
643                 179,  180,  180,  180,  181,  181,  182,  182,
644                 182,  183,  183,  183,  184,  184,  184,  185,
645                 185,  185,  186,  186,  186,  187,  187,  187,
646                 188,  188,  188,  189,  189,  189,  189,  190,
647                 190,  190,  191,  191,  191,  192,  192,  192,
648                 193,  193,  193,  194,  194,  194,  195,  195,
649                 195,  196,  196,  196,  196,  197,  197,  197,
650                 198,  198,  198,  199,  199,  199,  200,  200,
651                 200,  200,  201,  201,  201,  202,  202,  202,
652                 202,  203,  203,  203,  204,  204,  204,  205,
653                 205,  205,  205,  206,  206,  206,  207,  207,
654                 207,  207,  208,  208,  208,  209,  209,  209,
655                 209,  210,  210,  210,  211,  211,  211,  211,
656                 212,  212,  212,  213,  213,  213,  213,  214,
657                 214,  214,  214,  215,  215,  215,  216,  216,
658                 216,  216,  217,  217,  217,  217,  218,  218,
659                 218,  219,  219,  219,  219,  220,  220,  220,
660                 220,  221,  221,  221,  221,  222,  222,  222,
661                 223,  223,  223,  223,  224,  224,  224,  224,
662                 225,  225,  225,  225,  226,  226,  226,  226,
663                 227,  227,  227,  227,  228,  228,  228,  228,
664                 229,  229,  229,  229,  230,  230,  230,  230,
665                 231,  231,  231,  231,  232,  232,  232,  232,
666                 233,  233,  233,  233,  234,  234,  234,  234,
667                 235,  235,  235,  235,  236,  236,  236,  236,
668                 237,  237,  237,  237,  238,  238,  238,  238,
669                 239,  239,  239,  239,  240,  240,  240,  240,
670                 240,  241,  241,  241,  241,  242,  242,  242,
671                 242,  243,  243,  243,  243,  244,  244,  244,
672                 244,  244,  245,  245,  245,  245,  246,  246,
673                 246,  246,  247,  247,  247,  247,  247,  248,
674                 248,  248,  248,  249,  249,  249,  249,  249,
675                 250,  250,  250,  250,  251,  251,  251,  251,
676                 251,  252,  252,  252,  252,  253,  253,  253,
677                 253,  253,  254,  254,  254,  254,  255,  255,
678         },
679 };
680 #endif
681
682 static int dsi_s_wqxga_10_1_bl_notify(struct device *unused, int brightness)
683 {
684         int cur_sd_brightness = atomic_read(&sd_brightness);
685
686         /* SD brightness is a percentage */
687         brightness = (brightness * cur_sd_brightness) / 255;
688
689         /* Apply any backlight response curve */
690         if (brightness > 255)
691                 pr_info("Error: Brightness > 255!\n");
692         else
693                 brightness = dsi_s_wqxga_10_1_bl_output_measured[brightness];
694
695         return brightness;
696 }
697
698 static int dsi_s_wqxga_10_1_check_fb(struct device *dev, struct fb_info *info)
699 {
700         return info->device == &disp_device->dev;
701 }
702
703 static struct platform_pwm_backlight_data dsi_s_wqxga_10_1_bl_data = {
704         .pwm_id         = 1,
705         .max_brightness = 255,
706         .dft_brightness = 224,
707         .pwm_period_ns  = 1000000,
708         .pwm_gpio       = TEGRA_GPIO_INVALID,
709         .notify         = dsi_s_wqxga_10_1_bl_notify,
710         /* Only toggle backlight on fb blank notifications for disp1 */
711         .check_fb       = dsi_s_wqxga_10_1_check_fb,
712 };
713
714 static struct platform_device __maybe_unused
715                 dsi_s_wqxga_10_1_bl_device = {
716         .name   = "pwm-backlight",
717         .id     = -1,
718         .dev    = {
719                 .platform_data = &dsi_s_wqxga_10_1_bl_data,
720         },
721 };
722
723 static struct platform_device __maybe_unused
724                         *dsi_s_wqxga_10_1_bl_devices[] __initdata = {
725         &tegra_pwfm_device,
726         &dsi_s_wqxga_10_1_bl_device,
727 };
728
729 static unsigned int dsi_s_shield_edp_states[] = {
730         909, 809, 709, 609, 509, 410, 310, 210, 110, 0
731 };
732 static unsigned int dsi_s_shield_edp_brightness[] = {
733         255, 227, 199, 171, 143, 115, 87, 59, 31, 0
734 };
735 static unsigned int dsi_s_tn8_edp_states[] = {
736         909, 809, 709, 609, 509, 410, 310, 210, 110, 0
737 };
738 static unsigned int dsi_s_tn8_edp_brightness[] = {
739         255, 227, 199, 171, 143, 115, 87, 59, 31, 0
740 };
741
742 static int __init dsi_s_wqxga_10_1_register_bl_dev(void)
743 {
744         int err = 0;
745         struct board_info board_info;
746         tegra_get_board_info(&board_info);
747
748         if (board_info.board_id == BOARD_E1780) {
749                 if (board_info.sku == 1000) {
750                         dsi_s_wqxga_10_1_bl_data.edp_states =
751                                 dsi_s_shield_edp_states;
752                         dsi_s_wqxga_10_1_bl_data.edp_brightness =
753                                 dsi_s_shield_edp_brightness;
754                 } else if (board_info.sku == 1100) {
755                         dsi_s_wqxga_10_1_bl_data.edp_states =
756                                 dsi_s_tn8_edp_states;
757                         dsi_s_wqxga_10_1_bl_data.edp_brightness =
758                                 dsi_s_tn8_edp_brightness;
759                 }
760         }
761
762         err = platform_add_devices(dsi_s_wqxga_10_1_bl_devices,
763                                 ARRAY_SIZE(dsi_s_wqxga_10_1_bl_devices));
764         if (err) {
765                 pr_err("disp1 bl device registration failed");
766                 return err;
767         }
768         return err;
769 }
770
771 static void dsi_s_wqxga_10_1_set_disp_device(
772         struct platform_device *dalmore_display_device)
773 {
774         disp_device = dalmore_display_device;
775 }
776
777 static void dsi_s_wqxga_10_1_dc_out_init(struct tegra_dc_out *dc)
778 {
779         dc->dsi = &dsi_s_wqxga_10_1_pdata;
780         dc->parent_clk = "pll_d_out0";
781         dc->modes = dsi_s_wqxga_10_1_modes;
782         dc->n_modes = ARRAY_SIZE(dsi_s_wqxga_10_1_modes);
783         dc->enable = dsi_s_wqxga_10_1_enable;
784         dc->postpoweron = dsi_s_wqxga_10_1_postpoweron;
785         dc->disable = dsi_s_wqxga_10_1_disable;
786         dc->postsuspend = dsi_s_wqxga_10_1_postsuspend,
787         dc->width = 216;
788         dc->height = 135;
789         dc->flags = DC_CTRL_MODE;
790 }
791
792 static void dsi_s_wqxga_10_1_fb_data_init(struct tegra_fb_data *fb)
793 {
794         fb->xres = dsi_s_wqxga_10_1_modes[0].h_active;
795         fb->yres = dsi_s_wqxga_10_1_modes[0].v_active;
796 }
797
798 static void
799 dsi_s_wqxga_10_1_sd_settings_init(struct tegra_dc_sd_settings *settings)
800 {
801         *settings = dsi_s_wqxga_10_1_sd_settings;
802         settings->bl_device_name = "pwm-backlight";
803 }
804
805 static void dsi_s_wqxga_10_1_cmu_init(struct tegra_dc_platform_data *pdata)
806 {
807         pdata->cmu = &dsi_s_wqxga_10_1_cmu;
808 }
809
810 struct tegra_panel __initdata dsi_s_wqxga_10_1 = {
811         .init_sd_settings = dsi_s_wqxga_10_1_sd_settings_init,
812         .init_dc_out = dsi_s_wqxga_10_1_dc_out_init,
813         .init_fb_data = dsi_s_wqxga_10_1_fb_data_init,
814         .register_bl_dev = dsi_s_wqxga_10_1_register_bl_dev,
815         .init_cmu_data = dsi_s_wqxga_10_1_cmu_init,
816         .set_disp_device = dsi_s_wqxga_10_1_set_disp_device,
817 };
818 EXPORT_SYMBOL(dsi_s_wqxga_10_1);
819