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