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