blob: f6db694266e2e78bd9a3d1699c28e568cb6316ae [file] [log] [blame]
Donghwa Lee19632c42012-04-06 14:24:01 +09001/*
2 * Copyright (C) 2012 Samsung Electronics
3 *
4 * Author: Donghwa Lee <dh09.lee@samsung.com>
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of
9 * the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
19 * MA 02111-1307 USA
20 */
21
22#include <common.h>
23#include <asm/arch/mipi_dsim.h>
24
25#include "exynos_mipi_dsi_lowlevel.h"
26#include "exynos_mipi_dsi_common.h"
27
28static void s6e8ax0_panel_cond(struct mipi_dsim_device *dsim_dev)
29{
30 struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
Donghwa Lee33b515b2012-04-26 18:52:26 +000031 int reverse = dsim_dev->dsim_lcd_dev->reverse_panel;
Piotr Wilczekd0c53652013-05-24 09:43:46 +020032 static const unsigned char data_to_send[] = {
Donghwa Lee19632c42012-04-06 14:24:01 +090033 0xf8, 0x3d, 0x35, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x4c,
34 0x6e, 0x10, 0x27, 0x7d, 0x3f, 0x10, 0x00, 0x00, 0x20,
35 0x04, 0x08, 0x6e, 0x00, 0x00, 0x00, 0x02, 0x08, 0x08,
36 0x23, 0x23, 0xc0, 0xc8, 0x08, 0x48, 0xc1, 0x00, 0xc3,
37 0xff, 0xff, 0xc8
38 };
39
Piotr Wilczekd0c53652013-05-24 09:43:46 +020040 static const unsigned char data_to_send_reverse[] = {
Donghwa Lee33b515b2012-04-26 18:52:26 +000041 0xf8, 0x19, 0x35, 0x00, 0x00, 0x00, 0x93, 0x00, 0x3c,
42 0x7d, 0x08, 0x27, 0x7d, 0x3f, 0x00, 0x00, 0x00, 0x20,
43 0x04, 0x08, 0x6e, 0x00, 0x00, 0x00, 0x02, 0x08, 0x08,
44 0x23, 0x23, 0xc0, 0xc1, 0x01, 0x41, 0xc1, 0x00, 0xc1,
45 0xf6, 0xf6, 0xc1
46 };
47
48 if (reverse) {
49 ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
50 (unsigned int)data_to_send_reverse,
51 ARRAY_SIZE(data_to_send_reverse));
52 } else {
53 ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
Donghwa Lee19632c42012-04-06 14:24:01 +090054 (unsigned int)data_to_send, ARRAY_SIZE(data_to_send));
Donghwa Lee33b515b2012-04-26 18:52:26 +000055 }
Donghwa Lee19632c42012-04-06 14:24:01 +090056}
57
58static void s6e8ax0_display_cond(struct mipi_dsim_device *dsim_dev)
59{
60 struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
Piotr Wilczekd0c53652013-05-24 09:43:46 +020061 static const unsigned char data_to_send[] = {
Donghwa Lee19632c42012-04-06 14:24:01 +090062 0xf2, 0x80, 0x03, 0x0d
63 };
64
65 ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
66 (unsigned int)data_to_send,
67 ARRAY_SIZE(data_to_send));
68}
69
70static void s6e8ax0_gamma_cond(struct mipi_dsim_device *dsim_dev)
71{
72 struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
Donghwa Lee4e3522c2012-04-24 22:04:39 +000073 /* 7500K 2.2 Set : 30cd */
Piotr Wilczekd0c53652013-05-24 09:43:46 +020074 static const unsigned char data_to_send[] = {
Donghwa Lee4e3522c2012-04-24 22:04:39 +000075 0xfa, 0x01, 0x60, 0x10, 0x60, 0xf5, 0x00, 0xff, 0xad,
76 0xaf, 0xba, 0xc3, 0xd8, 0xc5, 0x9f, 0xc6, 0x9e, 0xc1,
77 0xdc, 0xc0, 0x00, 0x61, 0x00, 0x5a, 0x00, 0x74,
Donghwa Lee19632c42012-04-06 14:24:01 +090078 };
79
80 ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
81 (unsigned int)data_to_send,
82 ARRAY_SIZE(data_to_send));
83}
84
85static void s6e8ax0_gamma_update(struct mipi_dsim_device *dsim_dev)
86{
87 struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
88
89 ops->cmd_write(dsim_dev, MIPI_DSI_DCS_SHORT_WRITE_PARAM, 0xf7, 0x3);
90}
91
92static void s6e8ax0_etc_source_control(struct mipi_dsim_device *dsim_dev)
93{
94 struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
Piotr Wilczekd0c53652013-05-24 09:43:46 +020095 static const unsigned char data_to_send[] = {
Donghwa Lee19632c42012-04-06 14:24:01 +090096 0xf6, 0x00, 0x02, 0x00
97 };
98
99 ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
100 (unsigned int)data_to_send,
101 ARRAY_SIZE(data_to_send));
102}
103
104static void s6e8ax0_etc_pentile_control(struct mipi_dsim_device *dsim_dev)
105{
106 struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
Piotr Wilczekd0c53652013-05-24 09:43:46 +0200107 static const unsigned char data_to_send[] = {
Donghwa Lee19632c42012-04-06 14:24:01 +0900108 0xb6, 0x0c, 0x02, 0x03, 0x32, 0xff, 0x44, 0x44, 0xc0,
109 0x00
110 };
111
112 ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
113 (unsigned int)data_to_send,
114 ARRAY_SIZE(data_to_send));
115}
116
117static void s6e8ax0_etc_mipi_control1(struct mipi_dsim_device *dsim_dev)
118{
119 struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
Piotr Wilczekd0c53652013-05-24 09:43:46 +0200120 static const unsigned char data_to_send[] = {
Donghwa Lee19632c42012-04-06 14:24:01 +0900121 0xe1, 0x10, 0x1c, 0x17, 0x08, 0x1d
122 };
123
124 ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
125 (unsigned int)data_to_send,
126 ARRAY_SIZE(data_to_send));
127}
128
129static void s6e8ax0_etc_mipi_control2(struct mipi_dsim_device *dsim_dev)
130{
131 struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
Piotr Wilczekd0c53652013-05-24 09:43:46 +0200132 static const unsigned char data_to_send[] = {
Donghwa Lee19632c42012-04-06 14:24:01 +0900133 0xe2, 0xed, 0x07, 0xc3, 0x13, 0x0d, 0x03
134 };
135
136 ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
137 (unsigned int)data_to_send,
138 ARRAY_SIZE(data_to_send));
139}
140
141static void s6e8ax0_etc_power_control(struct mipi_dsim_device *dsim_dev)
142{
143 struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
Piotr Wilczekd0c53652013-05-24 09:43:46 +0200144 static const unsigned char data_to_send[] = {
Donghwa Lee19632c42012-04-06 14:24:01 +0900145 0xf4, 0xcf, 0x0a, 0x12, 0x10, 0x19, 0x33, 0x02
146 };
147
148 ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
149 (unsigned int)data_to_send, ARRAY_SIZE(data_to_send));
150}
151
152static void s6e8ax0_etc_mipi_control3(struct mipi_dsim_device *dsim_dev)
153{
154 struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
155
156 ops->cmd_write(dsim_dev, MIPI_DSI_DCS_SHORT_WRITE_PARAM, 0xe3, 0x40);
157}
158
159static void s6e8ax0_etc_mipi_control4(struct mipi_dsim_device *dsim_dev)
160{
161 struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
Piotr Wilczekd0c53652013-05-24 09:43:46 +0200162 static const unsigned char data_to_send[] = {
Donghwa Lee19632c42012-04-06 14:24:01 +0900163 0xe4, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00
164 };
165
166 ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
167 (unsigned int)data_to_send, ARRAY_SIZE(data_to_send));
168}
169
170static void s6e8ax0_elvss_set(struct mipi_dsim_device *dsim_dev)
171{
172 struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
Piotr Wilczekd0c53652013-05-24 09:43:46 +0200173 static const unsigned char data_to_send[] = {
Donghwa Lee19632c42012-04-06 14:24:01 +0900174 0xb1, 0x04, 0x00
175 };
176
177 ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
178 (unsigned int)data_to_send,
179 ARRAY_SIZE(data_to_send));
180}
181
182static void s6e8ax0_display_on(struct mipi_dsim_device *dsim_dev)
183{
184 struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
185
186 ops->cmd_write(dsim_dev,
187 MIPI_DSI_DCS_SHORT_WRITE, 0x29, 0x00);
188}
189
190static void s6e8ax0_sleep_out(struct mipi_dsim_device *dsim_dev)
191{
192 struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
193
194 ops->cmd_write(dsim_dev,
195 MIPI_DSI_DCS_SHORT_WRITE, 0x11, 0x00);
196}
197
198static void s6e8ax0_apply_level1_key(struct mipi_dsim_device *dsim_dev)
199{
200 struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
Piotr Wilczekd0c53652013-05-24 09:43:46 +0200201 static const unsigned char data_to_send[] = {
Donghwa Lee19632c42012-04-06 14:24:01 +0900202 0xf0, 0x5a, 0x5a
203 };
204
205 ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
206 (unsigned int)data_to_send, ARRAY_SIZE(data_to_send));
207}
208
209static void s6e8ax0_apply_mtp_key(struct mipi_dsim_device *dsim_dev)
210{
211 struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
Piotr Wilczekd0c53652013-05-24 09:43:46 +0200212 static const unsigned char data_to_send[] = {
Donghwa Lee19632c42012-04-06 14:24:01 +0900213 0xf1, 0x5a, 0x5a
214 };
215
216 ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
217 (unsigned int)data_to_send, ARRAY_SIZE(data_to_send));
218}
219
220static void s6e8ax0_panel_init(struct mipi_dsim_device *dsim_dev)
221{
222 /*
223 * in case of setting gamma and panel condition at first,
224 * it shuold be setting like below.
225 * set_gamma() -> set_panel_condition()
226 */
227
228 s6e8ax0_apply_level1_key(dsim_dev);
229 s6e8ax0_apply_mtp_key(dsim_dev);
230
231 s6e8ax0_sleep_out(dsim_dev);
232 mdelay(5);
233 s6e8ax0_panel_cond(dsim_dev);
234 s6e8ax0_display_cond(dsim_dev);
235 s6e8ax0_gamma_cond(dsim_dev);
236 s6e8ax0_gamma_update(dsim_dev);
237
238 s6e8ax0_etc_source_control(dsim_dev);
239 s6e8ax0_elvss_set(dsim_dev);
240 s6e8ax0_etc_pentile_control(dsim_dev);
241 s6e8ax0_etc_mipi_control1(dsim_dev);
242 s6e8ax0_etc_mipi_control2(dsim_dev);
243 s6e8ax0_etc_power_control(dsim_dev);
244 s6e8ax0_etc_mipi_control3(dsim_dev);
245 s6e8ax0_etc_mipi_control4(dsim_dev);
246}
247
248static int s6e8ax0_panel_set(struct mipi_dsim_device *dsim_dev)
249{
250 s6e8ax0_panel_init(dsim_dev);
251
252 return 0;
253}
254
255static void s6e8ax0_display_enable(struct mipi_dsim_device *dsim_dev)
256{
257 s6e8ax0_display_on(dsim_dev);
258}
259
260static struct mipi_dsim_lcd_driver s6e8ax0_dsim_ddi_driver = {
261 .name = "s6e8ax0",
262 .id = -1,
263
264 .mipi_panel_init = s6e8ax0_panel_set,
265 .mipi_display_on = s6e8ax0_display_enable,
266};
267
268void s6e8ax0_init(void)
269{
270 exynos_mipi_dsi_register_lcd_driver(&s6e8ax0_dsim_ddi_driver);
271}