ARM: tegra: fix regulator_get() return value check
[linux-3.10.git] / arch / arm / mach-tegra / panel-j-720p-4-7.c
1 /*
2  * arch/arm/mach-tegra/panel-j-720p-4-7.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 "gpio-names.h"
31 #include "board-panel.h"
32 #include "devices.h"
33
34 #define DSI_PANEL_RESET         0
35
36 #define DC_CTRL_MODE            (TEGRA_DC_OUT_ONE_SHOT_MODE | \
37                          TEGRA_DC_OUT_ONE_SHOT_LP_MODE)
38
39 static struct regulator *vdd_lcd_s_1v8;
40 static struct regulator *vdd_sys_bl_3v7;
41 static struct regulator *avdd_lcd_3v0_2v8;
42
43
44 static bool dsi_j_720p_4_7_reg_requested;
45 static bool dsi_j_720p_4_7_gpio_requested;
46 static bool is_bl_powered;
47 static struct platform_device *disp_device;
48
49 static tegra_dc_bl_output dsi_j_720p_4_7_bl_response_curve = {
50         0, 1, 2, 3, 4, 5, 6, 7,
51         8, 9, 10, 11, 12, 13, 14, 15,
52         16, 18, 19, 20, 21, 22, 23, 25,
53         26, 27, 28, 30, 31, 32, 33, 35,
54         36, 38, 39, 41, 42, 43, 45, 46,
55         48, 49, 51, 52, 54, 55, 57, 58,
56         60, 61, 63, 64, 66, 67, 68, 70,
57         71, 72, 74, 75, 77, 78, 79, 80,
58         81, 82, 83, 85, 86, 87, 88, 89,
59         90, 90, 91, 92, 93, 93, 94, 95,
60         96, 96, 96, 97, 97, 97, 97, 98,
61         98, 98, 98, 99, 100, 101, 101, 102,
62         103, 104, 104, 105, 106, 107, 108, 109,
63         110, 112, 113, 114, 115, 116, 117, 119,
64         120, 121, 122, 123, 125, 126, 127, 128,
65         129, 131, 132, 133, 134, 135, 136, 137,
66         138, 140, 141, 142, 142, 143, 144, 145,
67         146, 147, 148, 149, 149, 150, 151, 152,
68         153, 154, 154, 155, 156, 157, 158, 159,
69         160, 162, 163, 164, 165, 167, 168, 169,
70         170, 171, 172, 173, 173, 174, 175, 176,
71         176, 177, 178, 179, 179, 180, 181, 182,
72         182, 183, 184, 184, 185, 186, 186, 187,
73         188, 188, 189, 189, 190, 190, 191, 192,
74         193, 194, 195, 195, 196, 197, 198, 199,
75         200, 201, 202, 203, 203, 204, 205, 206,
76         207, 208, 209, 210, 211, 212, 213, 213,
77         214, 215, 216, 217, 218, 219, 220, 221,
78         222, 224, 225, 226, 227, 228, 229, 230,
79         231, 232, 233, 234, 235, 236, 237, 238,
80         239, 240, 241, 242, 243, 244, 246, 247,
81         248, 249, 250, 251, 252, 253, 254, 255
82 };
83
84 static int __maybe_unused dsi_j_720p_4_7_bl_notify(struct device *unused,
85                                                         int brightness)
86 {
87         int cur_sd_brightness = atomic_read(&sd_brightness);
88
89         /* SD brightness is a percentage */
90         brightness = (brightness * cur_sd_brightness) / 255;
91
92         /* Apply any backlight response curve */
93         if (brightness > 255)
94                 pr_info("Error: Brightness > 255!\n");
95         else
96                 brightness = dsi_j_720p_4_7_bl_response_curve[brightness];
97
98         return brightness;
99 }
100
101 static int __maybe_unused dsi_j_720p_4_7_check_fb(struct device *dev,
102                                              struct fb_info *info)
103 {
104         return info->device == &disp_device->dev;
105 }
106
107 /*
108         JDI uses Platform blacklight device
109 */
110
111 static struct platform_pwm_backlight_data dsi_j_720p_4_7_bl_data = {
112 #ifdef CONFIG_ARCH_TEGRA_11x_SOC
113         .pwm_id         = 1,
114 #else
115         .pwm_id         = 0,
116 #endif
117         .max_brightness = 255,
118         .dft_brightness = 77,
119         .pwm_period_ns  = 40000,
120         .pwm_gpio       = TEGRA_GPIO_INVALID,
121         .notify         = dsi_j_720p_4_7_bl_notify,
122         .check_fb       = dsi_j_720p_4_7_check_fb,
123 };
124
125 static struct platform_device dsi_j_720p_4_7_bl_device = {
126         .name   = "pwm-backlight",
127         .id     = -1,
128         .dev    = {
129                 .platform_data = &dsi_j_720p_4_7_bl_data,
130         },
131 };
132
133 static struct tegra_dsi_out dsi_j_720p_4_7_pdata;
134
135 static int dsi_j_720p_4_7_register_bl_dev(void)
136 {
137         int err = 0;
138         err = platform_device_register(&tegra_pwfm_device);
139         if (err) {
140                 pr_err("disp1 pwm device registration failed");
141                 return err;
142         }
143
144         err = platform_device_register(&dsi_j_720p_4_7_bl_device);
145         if (err) {
146                 pr_err("disp1 bl device registration failed");
147                 return err;
148         }
149
150         err = gpio_request(dsi_j_720p_4_7_pdata.dsi_panel_bl_pwm_gpio,
151                 "panel pwm");
152         if (err < 0) {
153                 pr_err("panel backlight pwm gpio request failed\n");
154                 return err;
155         }
156         gpio_free(dsi_j_720p_4_7_pdata.dsi_panel_bl_pwm_gpio);
157         return err;
158 }
159 struct tegra_dc_mode dsi_j_720p_4_7_modes[] = {
160         {
161                 .pclk = 62625000,
162                 .h_ref_to_sync = 2,
163                 .v_ref_to_sync = 1,
164                 .h_sync_width = 2,
165                 .v_sync_width = 2,
166                 .h_back_porch = 84,
167                 .v_back_porch = 2,
168                 .h_active = 720,
169                 .v_active = 1280,
170                 .h_front_porch = 4,
171                 .v_front_porch = 4,
172         },
173 };
174 static int dsi_j_720p_4_7_reg_get(void)
175 {
176         int err = 0;
177
178         if (dsi_j_720p_4_7_reg_requested)
179                 return 0;
180
181         avdd_lcd_3v0_2v8 = regulator_get(NULL, "avdd_lcd");
182         if (IS_ERR(avdd_lcd_3v0_2v8)) {
183                 pr_err("avdd_lcd regulator get failed\n");
184                 err = PTR_ERR(avdd_lcd_3v0_2v8);
185                 avdd_lcd_3v0_2v8 = NULL;
186                 goto fail;
187         }
188
189         vdd_lcd_s_1v8 = regulator_get(NULL, "vdd_lcd_1v8_s");
190         if (IS_ERR(vdd_lcd_s_1v8)) {
191                 pr_err("vdd_lcd_1v8_s regulator get failed\n");
192                 err = PTR_ERR(vdd_lcd_s_1v8);
193                 vdd_lcd_s_1v8 = NULL;
194                 goto fail;
195         }
196
197         vdd_sys_bl_3v7 = regulator_get(NULL, "vdd_sys_bl");
198         if (IS_ERR(vdd_sys_bl_3v7)) {
199                 pr_err("vdd_sys_bl regulator get failed\n");
200                 err = PTR_ERR(vdd_sys_bl_3v7);
201                 vdd_sys_bl_3v7 = NULL;
202                 goto fail;
203         }
204
205         dsi_j_720p_4_7_reg_requested = true;
206         return 0;
207 fail:
208         return err;
209 }
210
211 static int dsi_j_720p_4_7_gpio_get(void)
212 {
213         int err = 0;
214
215         if (dsi_j_720p_4_7_gpio_requested)
216                 return 0;
217
218         err = gpio_request(dsi_j_720p_4_7_pdata.dsi_panel_rst_gpio,
219                 "panel rst");
220         if (err < 0) {
221                 pr_err("panel reset gpio request failed\n");
222                 goto fail;
223         }
224
225         err = gpio_request(dsi_j_720p_4_7_pdata.dsi_panel_bl_en_gpio,
226                 "panel backlight");
227         if (err < 0) {
228                 pr_err("panel backlight gpio request failed\n");
229                 goto fail;
230         }
231
232
233
234         dsi_j_720p_4_7_gpio_requested = true;
235         return 0;
236 fail:
237         return err;
238 }
239
240 static int dsi_j_720p_4_7_enable(struct device *dev)
241 {
242         int err = 0;
243
244         err = dsi_j_720p_4_7_reg_get();
245         if (err < 0) {
246                 pr_err("dsi regulator get failed\n");
247                 goto fail;
248         }
249
250         err = dsi_j_720p_4_7_gpio_get();
251         if (err < 0) {
252                 pr_err("dsi gpio request failed\n");
253                 goto fail;
254         }
255         gpio_direction_output(dsi_j_720p_4_7_pdata.dsi_panel_rst_gpio, 0);
256
257         if (avdd_lcd_3v0_2v8) {
258                 err = regulator_enable(avdd_lcd_3v0_2v8);
259                 if (err < 0) {
260                         pr_err("avdd_lcd regulator enable failed\n");
261                         goto fail;
262                 }
263                 regulator_set_voltage(avdd_lcd_3v0_2v8, 3000000, 3000000);
264         }
265
266         usleep_range(3000, 5000);
267
268         if (vdd_lcd_s_1v8) {
269                 err = regulator_enable(vdd_lcd_s_1v8);
270                 if (err < 0) {
271                         pr_err("vdd_lcd_1v8_s regulator enable failed\n");
272                         goto fail;
273                 }
274         }
275         usleep_range(3000, 5000);
276
277         if (vdd_sys_bl_3v7) {
278                 err = regulator_enable(vdd_sys_bl_3v7);
279                 if (err < 0) {
280                         pr_err("vdd_sys_bl regulator enable failed\n");
281                         goto fail;
282                 }
283         }
284         usleep_range(3000, 5000);
285
286 #if DSI_PANEL_RESET
287         gpio_set_value(dsi_j_720p_4_7_pdata.dsi_panel_rst_gpio, 1);
288         usleep_range(1000, 5000);
289         gpio_set_value(dsi_j_720p_4_7_pdata.dsi_panel_rst_gpio, 0);
290         usleep_range(1000, 5000);
291         gpio_set_value(dsi_j_720p_4_7_pdata.dsi_panel_rst_gpio, 1);
292         msleep(20);
293 #endif
294
295         gpio_direction_output(dsi_j_720p_4_7_pdata.dsi_panel_bl_en_gpio, 1);
296         is_bl_powered = true;
297         return 0;
298 fail:
299         return err;
300 }
301
302 static struct tegra_dsi_cmd dsi_j_720p_4_7_init_cmd[] = {
303         DSI_CMD_SHORT(DSI_DCS_WRITE_1_PARAM, 0xFF, 0xEE),
304         DSI_CMD_SHORT(DSI_DCS_WRITE_1_PARAM, 0x26, 0x08),
305         DSI_DLY_MS(10),
306         DSI_CMD_SHORT(DSI_DCS_WRITE_1_PARAM, 0x26, 0x00),
307         DSI_CMD_SHORT(DSI_DCS_WRITE_1_PARAM, 0xFF, 0x00),
308         DSI_DLY_MS(15),
309         DSI_GPIO_SET(0, 1), /* use dummy gpio */
310         DSI_DLY_MS(10),
311         DSI_GPIO_SET(0, 0), /* use dummy gpio */
312         DSI_DLY_MS(20),
313         DSI_GPIO_SET(0, 1), /* use dummy gpio */
314         DSI_DLY_MS(100),
315         DSI_CMD_SHORT(DSI_DCS_WRITE_1_PARAM, 0xBA, 0x02),
316         DSI_DLY_MS(5),
317         DSI_CMD_SHORT(DSI_DCS_WRITE_1_PARAM, 0xC2, 0x08),
318         DSI_DLY_MS(5),
319         DSI_CMD_SHORT(DSI_DCS_WRITE_1_PARAM, 0xFF, 0x04),
320         DSI_DLY_MS(5),
321         DSI_CMD_SHORT(DSI_DCS_WRITE_1_PARAM, 0x09, 0x00),
322         DSI_DLY_MS(5),
323         DSI_CMD_SHORT(DSI_DCS_WRITE_1_PARAM, 0x0A, 0x00),
324         DSI_DLY_MS(5),
325         DSI_CMD_SHORT(DSI_DCS_WRITE_1_PARAM, 0xFB, 0x01),
326         DSI_DLY_MS(5),
327         DSI_CMD_SHORT(DSI_DCS_WRITE_1_PARAM, 0xFF, 0xEE),
328         DSI_DLY_MS(5),
329         DSI_CMD_SHORT(DSI_DCS_WRITE_1_PARAM, 0x12, 0x53),
330         DSI_DLY_MS(5),
331         DSI_CMD_SHORT(DSI_DCS_WRITE_1_PARAM, 0x13, 0x05),
332         DSI_DLY_MS(5),
333         DSI_CMD_SHORT(DSI_DCS_WRITE_1_PARAM, 0x6A, 0x60),
334         DSI_DLY_MS(5),
335         DSI_CMD_SHORT(DSI_DCS_WRITE_1_PARAM, 0xFB, 0x01),
336         DSI_DLY_MS(5),
337         DSI_CMD_SHORT(DSI_DCS_WRITE_1_PARAM, 0xFF, 0x00),
338         DSI_DLY_MS(5),
339         DSI_CMD_SHORT(DSI_DCS_WRITE_1_PARAM, 0x3A, 0x77),
340         DSI_DLY_MS(5),
341         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_EXIT_SLEEP_MODE, 0x00),
342         DSI_DLY_MS(100),
343 #if (DC_CTRL_MODE & TEGRA_DC_OUT_ONE_SHOT_MODE)
344         DSI_CMD_SHORT(DSI_DCS_WRITE_1_PARAM, DSI_DCS_SET_TEARING_EFFECT_ON, 0),
345 #endif
346         DSI_CMD_SHORT(DSI_DCS_WRITE_0_PARAM, DSI_DCS_SET_DISPLAY_ON, 0x00),
347         DSI_DLY_MS(150),
348 };
349
350 static struct tegra_dsi_out dsi_j_720p_4_7_pdata = {
351         .n_data_lanes = 3,
352
353         .rated_refresh_rate = 60,
354         .refresh_rate = 60,
355         .suspend_aggr = DSI_HOST_SUSPEND_LV2,
356         .video_data_type = TEGRA_DSI_VIDEO_TYPE_COMMAND_MODE,
357         .video_clock_mode = TEGRA_DSI_VIDEO_CLOCK_TX_ONLY,
358         .controller_vs = DSI_VS_1,
359         .pixel_format = TEGRA_DSI_PIXEL_FORMAT_24BIT_P,
360         .virtual_channel = TEGRA_DSI_VIRTUAL_CHANNEL_0,
361
362         .panel_reset = DSI_PANEL_RESET,
363         .power_saving_suspend = true,
364         .dsi_init_cmd = dsi_j_720p_4_7_init_cmd,
365         .n_init_cmd = ARRAY_SIZE(dsi_j_720p_4_7_init_cmd),
366 };
367
368 static int dsi_j_720p_4_7_disable(void)
369 {
370         gpio_set_value(dsi_j_720p_4_7_pdata.dsi_panel_bl_en_gpio, 0);
371         is_bl_powered = false;
372         if (vdd_sys_bl_3v7)
373                 regulator_disable(vdd_sys_bl_3v7);
374
375         if (vdd_lcd_s_1v8)
376                 regulator_disable(vdd_lcd_s_1v8);
377
378         if (avdd_lcd_3v0_2v8)
379                 regulator_disable(avdd_lcd_3v0_2v8);
380
381         return 0;
382 }
383
384 static void dsi_j_720p_4_7_set_disp_device(
385         struct platform_device *pluto_display_device)
386 {
387         disp_device = pluto_display_device;
388 }
389
390 static void dsi_j_720p_4_7_dc_out_init(struct tegra_dc_out *dc)
391 {
392         dc->dsi = &dsi_j_720p_4_7_pdata;
393         dc->parent_clk = "pll_d_out0";
394         dc->modes = dsi_j_720p_4_7_modes;
395         dc->n_modes = ARRAY_SIZE(dsi_j_720p_4_7_modes);
396         dc->enable = dsi_j_720p_4_7_enable;
397         dc->disable = dsi_j_720p_4_7_disable;
398         dc->width = 58;
399         dc->height = 103;
400         dc->flags = DC_CTRL_MODE;
401 }
402 static void dsi_j_720p_4_7_fb_data_init(struct tegra_fb_data *fb)
403 {
404         fb->xres = dsi_j_720p_4_7_modes[0].h_active;
405         fb->yres = dsi_j_720p_4_7_modes[0].v_active;
406 }
407
408 static void dsi_j_720p_4_7_sd_settings_init
409 (struct tegra_dc_sd_settings *settings)
410 {
411         settings->bl_device_name = "pwm-backlight";
412 }
413
414
415 struct tegra_panel __initdata dsi_j_720p_4_7 = {
416         .init_sd_settings = dsi_j_720p_4_7_sd_settings_init,
417         .init_dc_out = dsi_j_720p_4_7_dc_out_init,
418         .init_fb_data = dsi_j_720p_4_7_fb_data_init,
419         .set_disp_device = dsi_j_720p_4_7_set_disp_device,
420         .register_bl_dev = dsi_j_720p_4_7_register_bl_dev,
421 };
422 EXPORT_SYMBOL(dsi_j_720p_4_7);