ARM: tegra12: set CPU rate to 2.2GHz for sku 0x87
[linux-3.10.git] / arch / arm / mach-tegra / panel-p-wuxga-10-1.c
1 /*
2  * arch/arm/mach-tegra/panel-p-wuxga-10-1.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 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   0
39
40 #define DSI_PANEL_RESET         1
41
42 #define DC_CTRL_MODE    TEGRA_DC_OUT_CONTINUOUS_MODE
43
44 #define en_vdd_bl       TEGRA_GPIO_PG0
45 #define lvds_en         TEGRA_GPIO_PG3
46
47 static bool reg_requested;
48 static bool gpio_requested;
49 static struct platform_device *disp_device;
50 static struct regulator *avdd_lcd_3v3;
51 static struct regulator *vdd_lcd_bl;
52 static struct regulator *vdd_lcd_bl_en;
53 static struct regulator *dvdd_lcd_1v8;
54 static struct regulator *vdd_ds_1v8;
55
56 #define en_vdd_bl       TEGRA_GPIO_PG0
57 #define lvds_en         TEGRA_GPIO_PG3
58
59 static struct tegra_dc_sd_settings dsi_p_wuxga_10_1_sd_settings = {
60         .enable = 1, /* enabled by default. */
61         .use_auto_pwm = false,
62         .hw_update_delay = 0,
63         .bin_width = -1,
64         .aggressiveness = 5,
65         .use_vid_luma = false,
66         .phase_in_adjustments = 0,
67         .k_limit_enable = true,
68         .k_limit = 200,
69         .sd_window_enable = false,
70         .soft_clipping_enable = true,
71         /* Low soft clipping threshold to compensate for aggressive k_limit */
72         .soft_clipping_threshold = 128,
73         .smooth_k_enable = true,
74         .smooth_k_incr = 4,
75         /* Default video coefficients */
76         .coeff = {5, 9, 2},
77         .fc = {0, 0},
78         /* Immediate backlight changes */
79         .blp = {1024, 255},
80         /* Gammas: R: 2.2 G: 2.2 B: 2.2 */
81         /* Default BL TF */
82         .bltf = {
83                         {
84                                 {57, 65, 73, 82},
85                                 {92, 103, 114, 125},
86                                 {138, 150, 164, 178},
87                                 {193, 208, 224, 241},
88                         },
89                 },
90         /* Default LUT */
91         .lut = {
92                         {
93                                 {255, 255, 255},
94                                 {199, 199, 199},
95                                 {153, 153, 153},
96                                 {116, 116, 116},
97                                 {85, 85, 85},
98                                 {59, 59, 59},
99                                 {36, 36, 36},
100                                 {17, 17, 17},
101                                 {0, 0, 0},
102                         },
103                 },
104         .sd_brightness = &sd_brightness,
105         .use_vpulse2 = true,
106 };
107
108 static tegra_dc_bl_output dsi_p_wuxga_10_1_bl_output_measured = {
109         0, 0, 1, 2, 3, 4, 5, 6,
110         7, 8, 9, 9, 10, 11, 12, 13,
111         13, 14, 15, 16, 17, 17, 18, 19,
112         20, 21, 22, 22, 23, 24, 25, 26,
113         27, 27, 28, 29, 30, 31, 32, 32,
114         33, 34, 35, 36, 37, 37, 38, 39,
115         40, 41, 42, 42, 43, 44, 45, 46,
116         47, 48, 48, 49, 50, 51, 52, 53,
117         54, 55, 56, 57, 57, 58, 59, 60,
118         61, 62, 63, 64, 65, 66, 67, 68,
119         69, 70, 71, 71, 72, 73, 74, 75,
120         76, 77, 77, 78, 79, 80, 81, 82,
121         83, 84, 85, 87, 88, 89, 90, 91,
122         92, 93, 94, 95, 96, 97, 98, 99,
123         100, 101, 102, 103, 104, 105, 106, 107,
124         108, 109, 110, 111, 112, 113, 115, 116,
125         117, 118, 119, 120, 121, 122, 123, 124,
126         125, 126, 127, 128, 129, 130, 131, 132,
127         133, 134, 135, 136, 137, 138, 139, 141,
128         142, 143, 144, 146, 147, 148, 149, 151,
129         152, 153, 154, 155, 156, 157, 158, 158,
130         159, 160, 161, 162, 163, 165, 166, 167,
131         168, 169, 170, 171, 172, 173, 174, 176,
132         177, 178, 179, 180, 182, 183, 184, 185,
133         186, 187, 188, 189, 190, 191, 192, 194,
134         195, 196, 197, 198, 199, 200, 201, 202,
135         203, 204, 205, 206, 207, 208, 209, 210,
136         211, 212, 213, 214, 215, 216, 217, 219,
137         220, 221, 222, 224, 225, 226, 227, 229,
138         230, 231, 232, 233, 234, 235, 236, 238,
139         239, 240, 241, 242, 243, 244, 245, 246,
140         247, 248, 249, 250, 251, 252, 253, 255
141 };
142
143 static struct tegra_dsi_cmd dsi_p_wuxga_10_1_init_cmd[] = {
144         /* no init command required */
145 };
146
147 const u32 __maybe_unused panasonic_1920_1200_vnb_syne[NUMOF_PKT_SEQ] = {
148         PKT_ID0(CMD_VS) | PKT_LEN0(0) | PKT_ID1(CMD_BLNK) | PKT_LEN1(1) |
149         PKT_ID2(CMD_HE) | PKT_LEN2(0) | PKT_LP,
150         0,
151         PKT_ID0(CMD_VE) | PKT_LEN0(0) | PKT_ID1(CMD_BLNK) | PKT_LEN1(1) |
152         PKT_ID2(CMD_HE) | PKT_LEN2(0) | PKT_LP,
153         0,
154         PKT_ID0(CMD_HS) | PKT_LEN0(0) | PKT_ID1(CMD_BLNK) | PKT_LEN1(1) |
155         PKT_ID2(CMD_HE) | PKT_LEN2(0) | PKT_LP,
156         0,
157         PKT_ID0(CMD_HS) | PKT_LEN0(0) | PKT_ID1(CMD_BLNK) | PKT_LEN1(1) |
158         PKT_ID2(CMD_HE) | PKT_LEN2(0),
159         PKT_ID3(CMD_BLNK) | PKT_LEN3(2) | PKT_ID4(CMD_RGB_24BPP) | PKT_LEN4(3) |
160         PKT_ID5(CMD_BLNK) | PKT_LEN5(4),
161         PKT_ID0(CMD_HS) | PKT_LEN0(0) | PKT_ID1(CMD_BLNK) | PKT_LEN1(1) |
162         PKT_ID2(CMD_HE) | PKT_LEN2(0) | PKT_LP,
163         0,
164         PKT_ID0(CMD_HS) | PKT_LEN0(0) | PKT_ID1(CMD_BLNK) | PKT_LEN1(1) |
165         PKT_ID2(CMD_HE) | PKT_LEN2(0),
166         PKT_ID3(CMD_BLNK) | PKT_LEN3(2) | PKT_ID4(CMD_RGB_24BPP) | PKT_LEN4(3) |
167         PKT_ID5(CMD_BLNK) | PKT_LEN5(4),
168 };
169
170
171 static struct tegra_dsi_out dsi_p_wuxga_10_1_pdata = {
172 #ifdef CONFIG_ARCH_TEGRA_3x_SOC
173         .n_data_lanes = 2,
174         .controller_vs = DSI_VS_0,
175 #else
176         .controller_vs = DSI_VS_1,
177 #endif
178
179         .n_data_lanes = 4,
180         .video_burst_mode = TEGRA_DSI_VIDEO_NONE_BURST_MODE_WITH_SYNC_END,
181
182         .pixel_format = TEGRA_DSI_PIXEL_FORMAT_24BIT_P,
183         .refresh_rate = 60,
184         .virtual_channel = TEGRA_DSI_VIRTUAL_CHANNEL_0,
185
186         .panel_reset = DSI_PANEL_RESET,
187         .power_saving_suspend = true,
188         .video_data_type = TEGRA_DSI_VIDEO_TYPE_VIDEO_MODE,
189         .video_clock_mode = TEGRA_DSI_VIDEO_CLOCK_TX_ONLY,
190         .dsi_init_cmd = dsi_p_wuxga_10_1_init_cmd,
191         .n_init_cmd = ARRAY_SIZE(dsi_p_wuxga_10_1_init_cmd),
192         .pkt_seq = panasonic_1920_1200_vnb_syne,
193 };
194
195 static int dalmore_dsi_regulator_get(struct device *dev)
196 {
197         int err = 0;
198
199         if (reg_requested)
200                 return 0;
201         avdd_lcd_3v3 = regulator_get(dev, "avdd_lcd");
202         if (IS_ERR(avdd_lcd_3v3)) {
203                 pr_err("avdd_lcd regulator get failed\n");
204                 err = PTR_ERR(avdd_lcd_3v3);
205                 avdd_lcd_3v3 = NULL;
206                 goto fail;
207         }
208
209         dvdd_lcd_1v8 = regulator_get(dev, "dvdd_lcd");
210         if (IS_ERR(dvdd_lcd_1v8)) {
211                 pr_err("dvdd_lcd_1v8 regulator get failed\n");
212                 err = PTR_ERR(dvdd_lcd_1v8);
213                 dvdd_lcd_1v8 = NULL;
214                 goto fail;
215         }
216
217         vdd_lcd_bl = regulator_get(dev, "vdd_lcd_bl");
218         if (IS_ERR(vdd_lcd_bl)) {
219                 pr_err("vdd_lcd_bl regulator get failed\n");
220                 err = PTR_ERR(vdd_lcd_bl);
221                 vdd_lcd_bl = NULL;
222                 goto fail;
223         }
224
225         vdd_lcd_bl_en = regulator_get(dev, "vdd_lcd_bl_en");
226         if (IS_ERR(vdd_lcd_bl_en)) {
227                 pr_err("vdd_lcd_bl_en regulator get failed\n");
228                 err = PTR_ERR(vdd_lcd_bl_en);
229                 vdd_lcd_bl_en = NULL;
230                 goto fail;
231         }
232         reg_requested = true;
233         return 0;
234 fail:
235         return err;
236 }
237
238 static int dalmore_dsi_gpio_get(void)
239 {
240         int err = 0;
241
242         if (gpio_requested)
243                 return 0;
244
245         err = gpio_request(dsi_p_wuxga_10_1_pdata.dsi_panel_rst_gpio,
246                 "panel rst");
247         if (err < 0) {
248                 pr_err("panel reset gpio request failed\n");
249                 goto fail;
250         }
251
252         /* free pwm GPIO */
253         err = gpio_request(dsi_p_wuxga_10_1_pdata.dsi_panel_bl_pwm_gpio,
254                 "panel pwm");
255         if (err < 0) {
256                 pr_err("panel pwm gpio request failed\n");
257                 goto fail;
258         }
259         gpio_free(dsi_p_wuxga_10_1_pdata.dsi_panel_bl_pwm_gpio);
260         gpio_requested = true;
261         return 0;
262 fail:
263         return err;
264 }
265
266 static int macallan_dsi_regulator_get(struct device *dev)
267 {
268         int err = 0;
269
270         if (reg_requested)
271                 return 0;
272         avdd_lcd_3v3 = regulator_get(dev, "avdd_lcd");
273         if (IS_ERR(avdd_lcd_3v3)) {
274                 pr_err("avdd_lcd regulator get failed\n");
275                 err = PTR_ERR(avdd_lcd_3v3);
276                 avdd_lcd_3v3 = NULL;
277                 goto fail;
278         }
279
280         vdd_lcd_bl_en = regulator_get(dev, "vdd_lcd_bl_en");
281         if (IS_ERR(vdd_lcd_bl_en)) {
282                 pr_err("vdd_lcd_bl_en regulator get failed\n");
283                 err = PTR_ERR(vdd_lcd_bl_en);
284                 vdd_lcd_bl_en = NULL;
285                 goto fail;
286         }
287         reg_requested = true;
288         return 0;
289 fail:
290         return err;
291 }
292
293 static int macallan_dsi_gpio_get(void)
294 {
295         int err = 0;
296
297         if (gpio_requested)
298                 return 0;
299
300         err = gpio_request(dsi_p_wuxga_10_1_pdata.dsi_panel_rst_gpio,
301                 "panel rst");
302         if (err < 0) {
303                 pr_err("panel reset gpio request failed\n");
304                 goto fail;
305         }
306
307         /* free pwm GPIO */
308         err = gpio_request(dsi_p_wuxga_10_1_pdata.dsi_panel_bl_pwm_gpio,
309                 "panel pwm");
310         if (err < 0) {
311                 pr_err("panel pwm gpio request failed\n");
312                 goto fail;
313         }
314         gpio_free(dsi_p_wuxga_10_1_pdata.dsi_panel_bl_pwm_gpio);
315         gpio_requested = true;
316         return 0;
317 fail:
318         return err;
319 }
320
321 static int dsi_p_wuxga_10_1_enable(struct device *dev)
322 {
323         int err = 0;
324
325         if (machine_is_macallan())
326                 err = macallan_dsi_regulator_get(dev);
327         else
328                 err = dalmore_dsi_regulator_get(dev);
329         if (err < 0) {
330                 pr_err("dsi regulator get failed\n");
331                 goto fail;
332         }
333
334         err = tegra_panel_gpio_get_dt("p,wuxga-10-1", &panel_of);
335         if (err < 0) {
336                 /* try to request gpios from board file */
337                 if (machine_is_macallan())
338                         err = macallan_dsi_gpio_get();
339                 else
340                         err = dalmore_dsi_gpio_get();
341                 if (err < 0) {
342                         pr_err("dsi gpio request failed\n");
343                         goto fail;
344                 }
345         }
346
347         if (vdd_ds_1v8) {
348                 err = regulator_enable(vdd_ds_1v8);
349                 if (err < 0) {
350                         pr_err("vdd_ds_1v8 regulator enable failed\n");
351                         goto fail;
352                 }
353         }
354
355         if (dvdd_lcd_1v8) {
356                 err = regulator_enable(dvdd_lcd_1v8);
357                 if (err < 0) {
358                         pr_err("dvdd_lcd regulator enable failed\n");
359                         goto fail;
360                 }
361         }
362
363         if (avdd_lcd_3v3) {
364                 err = regulator_enable(avdd_lcd_3v3);
365                 if (err < 0) {
366                         pr_err("avdd_lcd regulator enable failed\n");
367                         goto fail;
368                 }
369         }
370
371         if (vdd_lcd_bl) {
372                 err = regulator_enable(vdd_lcd_bl);
373                 if (err < 0) {
374                         pr_err("vdd_lcd_bl regulator enable failed\n");
375                         goto fail;
376                 }
377         }
378
379         if (vdd_lcd_bl_en) {
380                 err = regulator_enable(vdd_lcd_bl_en);
381                 if (err < 0) {
382                         pr_err("vdd_lcd_bl_en regulator enable failed\n");
383                         goto fail;
384                 }
385         }
386
387         msleep(100);
388 #if DSI_PANEL_RESET
389         err = tegra_panel_reset(&panel_of, 20);
390         if (err < 0) {
391                 /* use platform data */
392                 gpio_direction_output(
393                 dsi_p_wuxga_10_1_pdata.dsi_panel_rst_gpio, 1);
394                 usleep_range(1000, 5000);
395                 gpio_set_value(dsi_p_wuxga_10_1_pdata.dsi_panel_rst_gpio, 0);
396                 msleep(150);
397                 gpio_set_value(dsi_p_wuxga_10_1_pdata.dsi_panel_rst_gpio, 1);
398                 msleep(20);
399         }
400 #endif
401
402         return 0;
403 fail:
404         return err;
405 }
406
407 static int dsi_p_wuxga_10_1_disable(void)
408 {
409         if (gpio_is_valid(dsi_p_wuxga_10_1_pdata.dsi_panel_rst_gpio))
410                 gpio_set_value(dsi_p_wuxga_10_1_pdata.dsi_panel_rst_gpio, 0);
411
412         if (vdd_lcd_bl)
413                 regulator_disable(vdd_lcd_bl);
414
415         if (vdd_lcd_bl_en)
416                 regulator_disable(vdd_lcd_bl_en);
417
418         if (avdd_lcd_3v3)
419                 regulator_disable(avdd_lcd_3v3);
420
421         if (dvdd_lcd_1v8)
422                 regulator_disable(dvdd_lcd_1v8);
423
424         if (vdd_ds_1v8)
425                 regulator_disable(vdd_ds_1v8);
426
427         return 0;
428 }
429
430 static int dsi_p_wuxga_10_1_postsuspend(void)
431 {
432         return 0;
433 }
434
435 static struct tegra_dc_mode dsi_p_wuxga_10_1_modes[] = {
436         {
437                 .pclk = 154700000,
438                 .h_ref_to_sync = 4,
439                 .v_ref_to_sync = 1,
440                 .h_sync_width = 16,
441                 .v_sync_width = 2,
442                 .h_back_porch = 32,
443                 .v_back_porch = 16,
444                 .h_active = 1920,
445                 .v_active = 1200,
446                 .h_front_porch = 120,
447                 .v_front_porch = 17,
448         },
449 };
450
451 #ifdef CONFIG_TEGRA_DC_CMU
452 static struct tegra_dc_cmu dsi_p_wuxga_10_1_cmu = {
453         /* lut1 maps sRGB to linear space. */
454         {
455         0,    1,    2,    4,    5,    6,    7,    9,
456         10,   11,   12,   14,   15,   16,   18,   20,
457         21,   23,   25,   27,   29,   31,   33,   35,
458         37,   40,   42,   45,   48,   50,   53,   56,
459         59,   62,   66,   69,   72,   76,   79,   83,
460         87,   91,   95,   99,   103,  107,  112,  116,
461         121,  126,  131,  136,  141,  146,  151,  156,
462         162,  168,  173,  179,  185,  191,  197,  204,
463         210,  216,  223,  230,  237,  244,  251,  258,
464         265,  273,  280,  288,  296,  304,  312,  320,
465         329,  337,  346,  354,  363,  372,  381,  390,
466         400,  409,  419,  428,  438,  448,  458,  469,
467         479,  490,  500,  511,  522,  533,  544,  555,
468         567,  578,  590,  602,  614,  626,  639,  651,
469         664,  676,  689,  702,  715,  728,  742,  755,
470         769,  783,  797,  811,  825,  840,  854,  869,
471         884,  899,  914,  929,  945,  960,  976,  992,
472         1008, 1024, 1041, 1057, 1074, 1091, 1108, 1125,
473         1142, 1159, 1177, 1195, 1213, 1231, 1249, 1267,
474         1286, 1304, 1323, 1342, 1361, 1381, 1400, 1420,
475         1440, 1459, 1480, 1500, 1520, 1541, 1562, 1582,
476         1603, 1625, 1646, 1668, 1689, 1711, 1733, 1755,
477         1778, 1800, 1823, 1846, 1869, 1892, 1916, 1939,
478         1963, 1987, 2011, 2035, 2059, 2084, 2109, 2133,
479         2159, 2184, 2209, 2235, 2260, 2286, 2312, 2339,
480         2365, 2392, 2419, 2446, 2473, 2500, 2527, 2555,
481         2583, 2611, 2639, 2668, 2696, 2725, 2754, 2783,
482         2812, 2841, 2871, 2901, 2931, 2961, 2991, 3022,
483         3052, 3083, 3114, 3146, 3177, 3209, 3240, 3272,
484         3304, 3337, 3369, 3402, 3435, 3468, 3501, 3535,
485         3568, 3602, 3636, 3670, 3705, 3739, 3774, 3809,
486         3844, 3879, 3915, 3950, 3986, 4022, 4059, 4095,
487         },
488         /* csc */
489         {
490                 0x138, 0x3Ba, 0x00D, /* 1.220 -0.270 0.050 */
491                 0x3F5, 0x120, 0x3E6, /* 0.038 1.124 0.100 */
492                 0x3FE, 0x3F8, 0x0E9, /* -0.002 -0.026 0.913 */
493         },
494         /* lut2 maps linear space to sRGB */
495         {
496                 0, 1, 2, 3, 4, 5, 6, 6,
497                 7, 8, 9, 10, 11, 11, 12, 13,
498                 13, 14, 15, 15, 16, 17, 17, 18,
499                 18, 19, 19, 20, 20, 21, 21, 22,
500                 22, 23, 23, 23, 24, 24, 24, 25,
501                 25, 25, 26, 26, 26, 27, 27, 27,
502                 28, 28, 28, 28, 29, 29, 29, 29,
503                 30, 30, 30, 30, 31, 31, 31, 31,
504                 32, 32, 32, 32, 33, 33, 33, 33,
505                 34, 34, 34, 35, 35, 35, 35, 36,
506                 36, 36, 37, 37, 37, 37, 38, 38,
507                 38, 39, 39, 39, 39, 40, 40, 40,
508                 41, 41, 41, 41, 42, 42, 42, 43,
509                 43, 43, 43, 44, 44, 44, 45, 45,
510                 45, 45, 46, 46, 46, 46, 47, 47,
511                 47, 47, 48, 48, 48, 48, 49, 49,
512                 49, 49, 50, 50, 50, 50, 50, 51,
513                 51, 51, 51, 52, 52, 52, 52, 52,
514                 53, 53, 53, 53, 53, 53, 54, 54,
515                 54, 54, 54, 55, 55, 55, 55, 55,
516                 55, 56, 56, 56, 56, 56, 56, 57,
517                 57, 57, 57, 57, 57, 57, 58, 58,
518                 58, 58, 58, 58, 59, 59, 59, 59,
519                 59, 59, 59, 60, 60, 60, 60, 60,
520                 60, 60, 61, 61, 61, 61, 61, 61,
521                 61, 62, 62, 62, 62, 62, 62, 62,
522                 63, 63, 63, 63, 63, 63, 63, 64,
523                 64, 64, 64, 64, 64, 64, 65, 65,
524                 65, 65, 65, 65, 66, 66, 66, 66,
525                 66, 66, 66, 67, 67, 67, 67, 67,
526                 67, 68, 68, 68, 68, 68, 68, 69,
527                 69, 69, 69, 69, 69, 70, 70, 70,
528                 70, 70, 70, 71, 71, 71, 71, 71,
529                 71, 72, 72, 72, 72, 72, 72, 73,
530                 73, 73, 73, 73, 73, 74, 74, 74,
531                 74, 74, 74, 74, 75, 75, 75, 75,
532                 75, 75, 76, 76, 76, 76, 76, 76,
533                 77, 77, 77, 77, 77, 77, 77, 78,
534                 78, 78, 78, 78, 78, 79, 79, 79,
535                 79, 79, 79, 79, 80, 80, 80, 80,
536                 80, 80, 80, 80, 81, 81, 81, 81,
537                 81, 81, 81, 82, 82, 82, 82, 82,
538                 82, 82, 82, 83, 83, 83, 83, 83,
539                 83, 83, 83, 83, 84, 84, 84, 84,
540                 84, 84, 84, 84, 85, 85, 85, 85,
541                 85, 85, 85, 85, 85, 85, 86, 86,
542                 86, 86, 86, 86, 86, 86, 86, 86,
543                 87, 87, 87, 87, 87, 87, 87, 87,
544                 87, 87, 88, 88, 88, 88, 88, 88,
545                 88, 88, 88, 88, 88, 88, 89, 89,
546                 89, 89, 89, 89, 89, 89, 89, 89,
547                 89, 89, 90, 90, 90, 90, 90, 90,
548                 90, 90, 90, 90, 90, 90, 91, 91,
549                 91, 91, 91, 91, 91, 91, 91, 91,
550                 91, 91, 91, 92, 92, 92, 92, 92,
551                 92, 92, 92, 92, 92, 92, 92, 92,
552                 93, 93, 93, 93, 93, 93, 93, 93,
553                 93, 93, 93, 93, 93, 93, 94, 94,
554                 94, 94, 94, 94, 94, 94, 94, 94,
555                 94, 94, 94, 94, 95, 95, 95, 95,
556                 95, 95, 95, 95, 95, 95, 95, 95,
557                 95, 96, 96, 96, 96, 96, 96, 96,
558                 96, 96, 96, 96, 96, 96, 97, 97,
559                 97, 97, 97, 97, 97, 97, 97, 97,
560                 98, 99, 99, 100, 101, 101, 102, 103,
561                 103, 104, 105, 105, 106, 107, 107, 108,
562                 109, 110, 110, 111, 112, 112, 113, 114,
563                 114, 115, 115, 116, 117, 117, 118, 119,
564                 119, 120, 120, 121, 121, 122, 123, 123,
565                 124, 124, 125, 125, 126, 126, 127, 128,
566                 128, 129, 129, 130, 130, 131, 131, 132,
567                 132, 133, 133, 134, 134, 135, 135, 136,
568                 136, 137, 138, 138, 139, 139, 140, 140,
569                 141, 141, 142, 142, 143, 143, 144, 144,
570                 144, 145, 145, 146, 146, 147, 147, 148,
571                 148, 149, 149, 150, 150, 151, 151, 152,
572                 152, 153, 153, 153, 154, 154, 155, 155,
573                 156, 156, 157, 157, 157, 158, 158, 159,
574                 159, 160, 160, 160, 161, 161, 162, 162,
575                 162, 163, 163, 164, 164, 164, 165, 165,
576                 165, 166, 166, 167, 167, 167, 168, 168,
577                 168, 169, 169, 169, 170, 170, 171, 171,
578                 171, 172, 172, 172, 173, 173, 173, 174,
579                 174, 174, 175, 175, 175, 176, 176, 176,
580                 177, 177, 177, 178, 178, 178, 179, 179,
581                 179, 180, 180, 180, 181, 181, 181, 182,
582                 182, 182, 183, 183, 183, 184, 184, 184,
583                 185, 185, 185, 185, 186, 186, 186, 187,
584                 187, 187, 188, 188, 188, 189, 189, 189,
585                 190, 190, 190, 191, 191, 191, 191, 192,
586                 192, 192, 193, 193, 193, 194, 194, 194,
587                 195, 195, 195, 195, 196, 196, 196, 197,
588                 197, 197, 198, 198, 198, 199, 199, 199,
589                 199, 200, 200, 200, 201, 201, 201, 202,
590                 202, 202, 203, 203, 203, 203, 204, 204,
591                 204, 205, 205, 205, 206, 206, 206, 207,
592                 207, 207, 208, 208, 208, 208, 209, 209,
593                 209, 210, 210, 210, 211, 211, 211, 212,
594                 212, 212, 213, 213, 213, 214, 214, 214,
595                 215, 215, 215, 215, 216, 216, 216, 217,
596                 217, 217, 218, 218, 218, 219, 219, 219,
597                 220, 220, 220, 220, 221, 221, 221, 222,
598                 222, 222, 222, 223, 223, 223, 224, 224,
599                 224, 224, 225, 225, 225, 226, 226, 226,
600                 226, 227, 227, 227, 227, 228, 228, 228,
601                 229, 229, 229, 229, 230, 230, 230, 230,
602                 230, 231, 231, 231, 231, 232, 232, 232,
603                 232, 233, 233, 233, 233, 234, 234, 234,
604                 234, 234, 235, 235, 235, 235, 236, 236,
605                 236, 236, 236, 237, 237, 237, 237, 238,
606                 238, 238, 238, 238, 239, 239, 239, 239,
607                 239, 240, 240, 240, 240, 240, 241, 241,
608                 241, 241, 241, 242, 242, 242, 242, 243,
609                 243, 243, 243, 243, 244, 244, 244, 244,
610                 244, 245, 245, 245, 245, 245, 246, 246,
611                 246, 246, 246, 247, 247, 247, 247, 248,
612                 248, 248, 248, 248, 249, 249, 249, 249,
613                 250, 250, 250, 250, 251, 251, 251, 251,
614                 251, 252, 252, 252, 253, 253, 253, 253,
615                 254, 254, 254, 254, 255, 255, 255, 255,
616         },
617 };
618 #endif
619
620 static int dsi_p_wuxga_10_1_bl_notify(struct device *unused, int brightness)
621 {
622         int cur_sd_brightness = atomic_read(&sd_brightness);
623
624         /* SD brightness is a percentage */
625         brightness = (brightness * cur_sd_brightness) / 255;
626
627         /* Apply any backlight response curve */
628         if (brightness > 255)
629                 pr_info("Error: Brightness > 255!\n");
630         else
631                 brightness = dsi_p_wuxga_10_1_bl_output_measured[brightness];
632
633         return brightness;
634 }
635
636 static int dsi_p_wuxga_10_1_check_fb(struct device *dev, struct fb_info *info)
637 {
638         return info->device == &disp_device->dev;
639 }
640
641 static struct platform_pwm_backlight_data dsi_p_wuxga_10_1_bl_data = {
642         .pwm_id         = 1,
643         .max_brightness = 255,
644         .dft_brightness = 224,
645         .pwm_period_ns  = 1000000,
646         .pwm_gpio       = TEGRA_GPIO_INVALID,
647         .notify         = dsi_p_wuxga_10_1_bl_notify,
648         /* Only toggle backlight on fb blank notifications for disp1 */
649         .check_fb       = dsi_p_wuxga_10_1_check_fb,
650 };
651
652 static struct platform_device __maybe_unused
653                 dsi_p_wuxga_10_1_bl_device = {
654         .name   = "pwm-backlight",
655         .id     = -1,
656         .dev    = {
657                 .platform_data = &dsi_p_wuxga_10_1_bl_data,
658         },
659 };
660
661 static struct platform_device __maybe_unused
662                         *dsi_p_wuxga_10_1_bl_devices[] __initdata = {
663         &tegra_pwfm_device,
664         &dsi_p_wuxga_10_1_bl_device,
665 };
666
667 static int  __init dsi_p_wuxga_10_1_register_bl_dev(void)
668 {
669         int err = 0;
670
671         err = platform_add_devices(dsi_p_wuxga_10_1_bl_devices,
672                                 ARRAY_SIZE(dsi_p_wuxga_10_1_bl_devices));
673         if (err) {
674                 pr_err("disp1 bl device registration failed");
675                 return err;
676         }
677         return err;
678 }
679
680 static void dsi_p_wuxga_10_1_set_disp_device(
681         struct platform_device *display_device)
682 {
683         disp_device = display_device;
684 }
685
686 static void dsi_p_wuxga_10_1_dc_out_init(struct tegra_dc_out *dc)
687 {
688         dc->dsi = &dsi_p_wuxga_10_1_pdata;
689         dc->parent_clk = "pll_d_out0";
690         dc->modes = dsi_p_wuxga_10_1_modes;
691         dc->n_modes = ARRAY_SIZE(dsi_p_wuxga_10_1_modes);
692         dc->enable = dsi_p_wuxga_10_1_enable;
693         dc->disable = dsi_p_wuxga_10_1_disable;
694         dc->postsuspend = dsi_p_wuxga_10_1_postsuspend,
695         dc->width = 217;
696         dc->height = 135;
697         dc->flags = DC_CTRL_MODE;
698 }
699
700 static void dsi_p_wuxga_10_1_fb_data_init(struct tegra_fb_data *fb)
701 {
702         fb->xres = dsi_p_wuxga_10_1_modes[0].h_active;
703         fb->yres = dsi_p_wuxga_10_1_modes[0].v_active;
704 }
705
706 static void
707 dsi_p_wuxga_10_1_sd_settings_init(struct tegra_dc_sd_settings *settings)
708 {
709         *settings = dsi_p_wuxga_10_1_sd_settings;
710         settings->bl_device_name = "pwm-backlight";
711 }
712
713 static void dsi_p_wuxga_10_1_cmu_init(struct tegra_dc_platform_data *pdata)
714 {
715         pdata->cmu = &dsi_p_wuxga_10_1_cmu;
716 }
717
718 struct tegra_panel_ops dsi_p_wuxga_10_1_ops = {
719         .enable = dsi_p_wuxga_10_1_enable,
720         .disable = dsi_p_wuxga_10_1_disable,
721         .postsuspend = dsi_p_wuxga_10_1_postsuspend,
722 };
723
724 struct tegra_panel __initdata dsi_p_wuxga_10_1 = {
725         .init_sd_settings = dsi_p_wuxga_10_1_sd_settings_init,
726         .init_dc_out = dsi_p_wuxga_10_1_dc_out_init,
727         .init_fb_data = dsi_p_wuxga_10_1_fb_data_init,
728         .register_bl_dev = dsi_p_wuxga_10_1_register_bl_dev,
729         .init_cmu_data = dsi_p_wuxga_10_1_cmu_init,
730         .set_disp_device = dsi_p_wuxga_10_1_set_disp_device,
731 };
732 EXPORT_SYMBOL(dsi_p_wuxga_10_1);
733