1 /* linux/drivers/video/s6e39a0x.c
3 * MIPI-DSI based s6e39a0x AMOLED lcd panel driver.
5 * Donghwa Lee, <dh09.lee@samsung.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
13 #include <linux/types.h>
15 #include <asm/arch/cpu.h>
16 #include <asm/arch/gpio.h>
17 #include <asm/arch/mipi_dsim.h>
20 #define MIN_BRIGHTNESS 0
21 #define MAX_BRIGHTNESS 10
24 static struct mipi_ddi_platform_data *ddi_pd;
26 /* This is only used Goni Rev0.4 */
27 extern int s5p_dsim_register_lcd_driver(struct mipi_lcd_driver *lcd_drv);
32 unsigned int current_brightness;
35 static void s6e39a0x_etc_cond(void)
37 unsigned char data_to_send[3] = {
41 ddi_pd->cmd_write((void *)ddi_pd->dsim_data, DCS_LONG_WR,
42 (unsigned int) data_to_send, sizeof(data_to_send));
45 static void s6e39a0x_gamma_cond(void)
47 unsigned char data_to_send[26] = {
48 0xfa, 0x02, 0x18, 0x08, 0x24, 0xe0, 0xd9, 0xd5, 0xc8,
49 0xcf, 0xc0, 0xd3, 0xd9, 0xcc, 0xa9, 0xb2, 0x9d, 0xbb,
50 0xc1, 0xb3, 0x00, 0x9e, 0x00, 0x9a, 0x00, 0xd3
53 ddi_pd->cmd_write((void *)ddi_pd->dsim_data, DCS_LONG_WR,
54 (unsigned int) data_to_send, sizeof(data_to_send));
57 static void s6e39a0x_gamma_update(void)
59 ddi_pd->cmd_write((void *)ddi_pd->dsim_data, DCS_WR_1_PARA, 0xfa, 0x03);
62 static void s6e39a0x_panel_cond(void)
64 unsigned char data_to_send[14] = {
65 0xf8, 0x28, 0x28, 0x08, 0x08, 0x40, 0xb0,
66 0x50, 0x90, 0x10, 0x30, 0x10, 0x00, 0x00
69 ddi_pd->cmd_write((void *)ddi_pd->dsim_data, DCS_LONG_WR,
70 (unsigned int) data_to_send, sizeof(data_to_send));
72 static void s6e39a0x_new1_cond(void)
74 unsigned char data_to_send[4] = {
75 0xf6, 0x00, 0x84, 0x09
78 ddi_pd->cmd_write((void *)ddi_pd->dsim_data, DCS_LONG_WR,
79 (unsigned int) data_to_send, sizeof(data_to_send));
81 static void s6e39a0x_etc_cond2(void)
83 ddi_pd->cmd_write((void *)ddi_pd->dsim_data, DCS_WR_1_PARA, 0xb0, 0x01);
86 static void s6e39a0x_etc_cond3(void)
88 unsigned char data_to_send[3] = {
92 ddi_pd->cmd_write((void *)ddi_pd->dsim_data, DCS_LONG_WR,
93 (unsigned int) data_to_send, sizeof(data_to_send));
96 static void s6e39a0x_etc_cond4(void)
98 unsigned char data_to_send[5] = {
99 0x2a, 0x00, 0x00, 0x02, 0x57
102 ddi_pd->cmd_write((void *)ddi_pd->dsim_data, DCS_LONG_WR,
103 (unsigned int) data_to_send, sizeof(data_to_send));
106 static void s6e39a0x_etc_cond5(void)
108 unsigned char data_to_send[5] = {
109 0x2b, 0x00, 0x00, 0x03, 0xff
112 ddi_pd->cmd_write((void *)ddi_pd->dsim_data, DCS_LONG_WR,
113 (unsigned int) data_to_send, sizeof(data_to_send));
116 static void s6e39a0x_etc_cond6(void)
118 ddi_pd->cmd_write((void *)ddi_pd->dsim_data,
119 DCS_WR_1_PARA, 0xb0, 0x09);
122 static void s6e39a0x_etc_cond7(void)
124 ddi_pd->cmd_write((void *)ddi_pd->dsim_data,
125 DCS_WR_1_PARA, 0xd5, 0x64);
128 static void s6e39a0x_etc_cond8(void)
130 ddi_pd->cmd_write((void *)ddi_pd->dsim_data,
131 DCS_WR_1_PARA, 0xb0, 0x0b);
134 static void s6e39a0x_etc_cond9(void)
136 ddi_pd->cmd_write((void *)ddi_pd->dsim_data,
137 DCS_WR_1_PARA, 0xd5, 0xa4);
140 static void s6e39a0x_etc_cond10(void)
142 ddi_pd->cmd_write((void *)ddi_pd->dsim_data,
143 DCS_WR_1_PARA, 0xb0, 0x0c);
146 static void s6e39a0x_etc_cond11(void)
148 ddi_pd->cmd_write((void *)ddi_pd->dsim_data,
149 DCS_WR_1_PARA, 0xd5, 0x7e);
152 static void s6e39a0x_etc_cond12(void)
154 ddi_pd->cmd_write((void *)ddi_pd->dsim_data,
155 DCS_WR_1_PARA, 0xf7, 0x03);
158 static void s6e39a0x_etc_cond13(void)
160 ddi_pd->cmd_write((void *)ddi_pd->dsim_data,
161 DCS_WR_1_PARA, 0xb0, 0x02);
164 static void s6e39a0x_etc_cond14(void)
166 ddi_pd->cmd_write((void *)ddi_pd->dsim_data,
167 DCS_WR_1_PARA, 0xb3, 0xc3);
170 static void s6e39a0x_sleep_in(void)
172 ddi_pd->cmd_write((void *)ddi_pd->dsim_data,
173 DCS_WR_NO_PARA, 0x10, 0x00);
176 static void s6e39a0x_sleep_out(void)
178 ddi_pd->cmd_write((void *)ddi_pd->dsim_data,
179 DCS_WR_NO_PARA, 0x11, 0x00);
182 void s6e39a0x_display_on(void)
184 ddi_pd->cmd_write((void *)ddi_pd->dsim_data,
185 DCS_WR_NO_PARA, 0x29, 0x00);
188 static void s6e39a0x_display_off(void)
190 ddi_pd->cmd_write((void *)ddi_pd->dsim_data,
191 DCS_WR_NO_PARA, 0x28, 0x00);
194 static void s6e39a0x_te_on(void)
196 ddi_pd->cmd_write((void *)ddi_pd->dsim_data,
197 DCS_WR_NO_PARA, 0x35, 0x00);
200 static void s6e39a0x_global(void)
202 ddi_pd->cmd_write((void *)ddi_pd->dsim_data,
203 DCS_WR_1_PARA, 0xb0, 0x01);
206 static void s6e39a0x_dispctl(void)
208 ddi_pd->cmd_write((void *)ddi_pd->dsim_data,
209 DCS_WR_1_PARA, 0xf2, 0x01);
212 int s6e39a0x_panel_init(void)
215 * in case of setting gamma and panel condition at first,
216 * it shuold be setting like below.
217 * set_gamma() -> set_panel_condition()
221 s6e39a0x_gamma_cond();
222 s6e39a0x_gamma_update();
223 s6e39a0x_panel_cond();
224 s6e39a0x_new1_cond();
225 s6e39a0x_etc_cond2();
226 s6e39a0x_etc_cond3();
227 s6e39a0x_etc_cond4();
228 s6e39a0x_etc_cond5();
229 s6e39a0x_etc_cond6();
230 s6e39a0x_etc_cond7();
231 s6e39a0x_etc_cond8();
232 s6e39a0x_etc_cond9();
233 s6e39a0x_etc_cond10();
234 s6e39a0x_etc_cond11();
235 s6e39a0x_etc_cond12();
236 s6e39a0x_etc_cond13();
237 s6e39a0x_etc_cond14();
241 s6e39a0x_sleep_out();
247 int s6e39a0x_set_link(struct mipi_ddi_platform_data *pd)
250 printf("mipi_ddi_platform_data pointer is NULL.\n");
254 /* check callback functions. */
255 if (pd->cmd_write == NULL) {
256 printf("cmd_write function is null.\n");
260 if (pd->get_dsim_frame_done == NULL) {
261 printf("dsim_frame_done function is null.\n");
265 if (pd->clear_dsim_frame_done == NULL) {
266 printf("clear_dsim_frame_done function is null.\n");
270 if (pd->change_dsim_transfer_mode == NULL)
271 printf("change_dsim_transfer_mode is null.\n");
273 if (pd->get_fb_frame_done == NULL)
274 printf("change_dsim_transfer_mode is null.\n");
276 if (pd->trigger == NULL)
277 printf("trigger is null.\n");
283 /* this function would be called at universal.c */
284 void s6e39a0x_set_platform_data(struct mipi_ddi_platform_data *pd)
287 printf("pd is NULL.\n");
294 static struct mipi_lcd_driver s6e39a0x_mipi_driver = {
297 .init = s6e39a0x_panel_init,
298 .display_on = s6e39a0x_display_on,
299 .set_link = s6e39a0x_set_link,
302 int s6e39a0x_init(void)
304 s5p_dsim_register_lcd_driver(&s6e39a0x_mipi_driver);