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