xref: /OK3568_Linux_fs/u-boot/drivers/video/s6e8ax0.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2012 Samsung Electronics
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Author: Donghwa Lee <dh09.lee@samsung.com>
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include <common.h>
10*4882a593Smuzhiyun #include <asm/arch/mipi_dsim.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include "exynos/exynos_mipi_dsi_lowlevel.h"
13*4882a593Smuzhiyun #include "exynos/exynos_mipi_dsi_common.h"
14*4882a593Smuzhiyun 
s6e8ax0_panel_cond(struct mipi_dsim_device * dsim_dev)15*4882a593Smuzhiyun static void s6e8ax0_panel_cond(struct mipi_dsim_device *dsim_dev)
16*4882a593Smuzhiyun {
17*4882a593Smuzhiyun 	struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
18*4882a593Smuzhiyun 	int reverse = dsim_dev->dsim_lcd_dev->reverse_panel;
19*4882a593Smuzhiyun 	static const unsigned char data_to_send[] = {
20*4882a593Smuzhiyun 		0xf8, 0x3d, 0x35, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x4c,
21*4882a593Smuzhiyun 		0x6e, 0x10, 0x27, 0x7d, 0x3f, 0x10, 0x00, 0x00, 0x20,
22*4882a593Smuzhiyun 		0x04, 0x08, 0x6e, 0x00, 0x00, 0x00, 0x02, 0x08, 0x08,
23*4882a593Smuzhiyun 		0x23, 0x23, 0xc0, 0xc8, 0x08, 0x48, 0xc1, 0x00, 0xc3,
24*4882a593Smuzhiyun 		0xff, 0xff, 0xc8
25*4882a593Smuzhiyun 	};
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun 	static const unsigned char data_to_send_reverse[] = {
28*4882a593Smuzhiyun 		0xf8, 0x19, 0x35, 0x00, 0x00, 0x00, 0x93, 0x00, 0x3c,
29*4882a593Smuzhiyun 		0x7d, 0x08, 0x27, 0x7d, 0x3f, 0x00, 0x00, 0x00, 0x20,
30*4882a593Smuzhiyun 		0x04, 0x08, 0x6e, 0x00, 0x00, 0x00, 0x02, 0x08, 0x08,
31*4882a593Smuzhiyun 		0x23, 0x23, 0xc0, 0xc1, 0x01, 0x41, 0xc1, 0x00, 0xc1,
32*4882a593Smuzhiyun 		0xf6, 0xf6, 0xc1
33*4882a593Smuzhiyun 	};
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun 	if (reverse) {
36*4882a593Smuzhiyun 		ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
37*4882a593Smuzhiyun 			data_to_send_reverse,
38*4882a593Smuzhiyun 			ARRAY_SIZE(data_to_send_reverse));
39*4882a593Smuzhiyun 	} else {
40*4882a593Smuzhiyun 		ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
41*4882a593Smuzhiyun 			data_to_send, ARRAY_SIZE(data_to_send));
42*4882a593Smuzhiyun 	}
43*4882a593Smuzhiyun }
44*4882a593Smuzhiyun 
s6e8ax0_display_cond(struct mipi_dsim_device * dsim_dev)45*4882a593Smuzhiyun static void s6e8ax0_display_cond(struct mipi_dsim_device *dsim_dev)
46*4882a593Smuzhiyun {
47*4882a593Smuzhiyun 	struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
48*4882a593Smuzhiyun 	static const unsigned char data_to_send[] = {
49*4882a593Smuzhiyun 		0xf2, 0x80, 0x03, 0x0d
50*4882a593Smuzhiyun 	};
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun 	ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
53*4882a593Smuzhiyun 			data_to_send, ARRAY_SIZE(data_to_send));
54*4882a593Smuzhiyun }
55*4882a593Smuzhiyun 
s6e8ax0_gamma_cond(struct mipi_dsim_device * dsim_dev)56*4882a593Smuzhiyun static void s6e8ax0_gamma_cond(struct mipi_dsim_device *dsim_dev)
57*4882a593Smuzhiyun {
58*4882a593Smuzhiyun 	struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
59*4882a593Smuzhiyun 	/* 7500K 2.2 Set : 30cd */
60*4882a593Smuzhiyun 	static const unsigned char data_to_send[] = {
61*4882a593Smuzhiyun 		0xfa, 0x01, 0x60, 0x10, 0x60, 0xf5, 0x00, 0xff, 0xad,
62*4882a593Smuzhiyun 		0xaf, 0xba, 0xc3, 0xd8, 0xc5, 0x9f, 0xc6, 0x9e, 0xc1,
63*4882a593Smuzhiyun 		0xdc, 0xc0, 0x00, 0x61, 0x00, 0x5a, 0x00, 0x74,
64*4882a593Smuzhiyun 	};
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
67*4882a593Smuzhiyun 			data_to_send, ARRAY_SIZE(data_to_send));
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun 
s6e8ax0_gamma_update(struct mipi_dsim_device * dsim_dev)70*4882a593Smuzhiyun static void s6e8ax0_gamma_update(struct mipi_dsim_device *dsim_dev)
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun 	struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
73*4882a593Smuzhiyun 	static const unsigned char data_to_send[] = {
74*4882a593Smuzhiyun 		0xf7, 0x03
75*4882a593Smuzhiyun 	};
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun 	ops->cmd_write(dsim_dev, MIPI_DSI_DCS_SHORT_WRITE_PARAM, data_to_send,
78*4882a593Smuzhiyun 			ARRAY_SIZE(data_to_send));
79*4882a593Smuzhiyun }
80*4882a593Smuzhiyun 
s6e8ax0_etc_source_control(struct mipi_dsim_device * dsim_dev)81*4882a593Smuzhiyun static void s6e8ax0_etc_source_control(struct mipi_dsim_device *dsim_dev)
82*4882a593Smuzhiyun {
83*4882a593Smuzhiyun 	struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
84*4882a593Smuzhiyun 	static const unsigned char data_to_send[] = {
85*4882a593Smuzhiyun 		0xf6, 0x00, 0x02, 0x00
86*4882a593Smuzhiyun 	};
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun 	ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
89*4882a593Smuzhiyun 			data_to_send, ARRAY_SIZE(data_to_send));
90*4882a593Smuzhiyun }
91*4882a593Smuzhiyun 
s6e8ax0_etc_pentile_control(struct mipi_dsim_device * dsim_dev)92*4882a593Smuzhiyun static void s6e8ax0_etc_pentile_control(struct mipi_dsim_device *dsim_dev)
93*4882a593Smuzhiyun {
94*4882a593Smuzhiyun 	struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
95*4882a593Smuzhiyun 	static const unsigned char data_to_send[] = {
96*4882a593Smuzhiyun 		0xb6, 0x0c, 0x02, 0x03, 0x32, 0xff, 0x44, 0x44, 0xc0,
97*4882a593Smuzhiyun 		0x00
98*4882a593Smuzhiyun 	};
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 	ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
101*4882a593Smuzhiyun 			data_to_send, ARRAY_SIZE(data_to_send));
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun 
s6e8ax0_etc_mipi_control1(struct mipi_dsim_device * dsim_dev)104*4882a593Smuzhiyun static void s6e8ax0_etc_mipi_control1(struct mipi_dsim_device *dsim_dev)
105*4882a593Smuzhiyun {
106*4882a593Smuzhiyun 	struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
107*4882a593Smuzhiyun 	static const unsigned char data_to_send[] = {
108*4882a593Smuzhiyun 		0xe1, 0x10, 0x1c, 0x17, 0x08, 0x1d
109*4882a593Smuzhiyun 	};
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun 	ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
112*4882a593Smuzhiyun 			data_to_send, ARRAY_SIZE(data_to_send));
113*4882a593Smuzhiyun }
114*4882a593Smuzhiyun 
s6e8ax0_etc_mipi_control2(struct mipi_dsim_device * dsim_dev)115*4882a593Smuzhiyun static void s6e8ax0_etc_mipi_control2(struct mipi_dsim_device *dsim_dev)
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun 	struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
118*4882a593Smuzhiyun 	static const unsigned char data_to_send[] = {
119*4882a593Smuzhiyun 		0xe2, 0xed, 0x07, 0xc3, 0x13, 0x0d, 0x03
120*4882a593Smuzhiyun 	};
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 	ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
123*4882a593Smuzhiyun 			data_to_send, ARRAY_SIZE(data_to_send));
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun 
s6e8ax0_etc_power_control(struct mipi_dsim_device * dsim_dev)126*4882a593Smuzhiyun static void s6e8ax0_etc_power_control(struct mipi_dsim_device *dsim_dev)
127*4882a593Smuzhiyun {
128*4882a593Smuzhiyun 	struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
129*4882a593Smuzhiyun 	static const unsigned char data_to_send[] = {
130*4882a593Smuzhiyun 		0xf4, 0xcf, 0x0a, 0x12, 0x10, 0x19, 0x33, 0x02
131*4882a593Smuzhiyun 	};
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun 	ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
134*4882a593Smuzhiyun 		data_to_send, ARRAY_SIZE(data_to_send));
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun 
s6e8ax0_etc_mipi_control3(struct mipi_dsim_device * dsim_dev)137*4882a593Smuzhiyun static void s6e8ax0_etc_mipi_control3(struct mipi_dsim_device *dsim_dev)
138*4882a593Smuzhiyun {
139*4882a593Smuzhiyun 	struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
140*4882a593Smuzhiyun 	static const unsigned char data_to_send[] = {
141*4882a593Smuzhiyun 		0xe3, 0x40
142*4882a593Smuzhiyun 	};
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun 	ops->cmd_write(dsim_dev, MIPI_DSI_DCS_SHORT_WRITE_PARAM, data_to_send,
145*4882a593Smuzhiyun 		       ARRAY_SIZE(data_to_send));
146*4882a593Smuzhiyun }
147*4882a593Smuzhiyun 
s6e8ax0_etc_mipi_control4(struct mipi_dsim_device * dsim_dev)148*4882a593Smuzhiyun static void s6e8ax0_etc_mipi_control4(struct mipi_dsim_device *dsim_dev)
149*4882a593Smuzhiyun {
150*4882a593Smuzhiyun 	struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
151*4882a593Smuzhiyun 	static const unsigned char data_to_send[] = {
152*4882a593Smuzhiyun 		0xe4, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00
153*4882a593Smuzhiyun 	};
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun 	ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
156*4882a593Smuzhiyun 		data_to_send, ARRAY_SIZE(data_to_send));
157*4882a593Smuzhiyun }
158*4882a593Smuzhiyun 
s6e8ax0_elvss_set(struct mipi_dsim_device * dsim_dev)159*4882a593Smuzhiyun static void s6e8ax0_elvss_set(struct mipi_dsim_device *dsim_dev)
160*4882a593Smuzhiyun {
161*4882a593Smuzhiyun 	struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
162*4882a593Smuzhiyun 	static const unsigned char data_to_send[] = {
163*4882a593Smuzhiyun 		0xb1, 0x04, 0x00
164*4882a593Smuzhiyun 	};
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun 	ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
167*4882a593Smuzhiyun 			data_to_send, ARRAY_SIZE(data_to_send));
168*4882a593Smuzhiyun }
169*4882a593Smuzhiyun 
s6e8ax0_display_on(struct mipi_dsim_device * dsim_dev)170*4882a593Smuzhiyun static void s6e8ax0_display_on(struct mipi_dsim_device *dsim_dev)
171*4882a593Smuzhiyun {
172*4882a593Smuzhiyun 	struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
173*4882a593Smuzhiyun 	static const unsigned char data_to_send[] = {
174*4882a593Smuzhiyun 		0x29, 0x00
175*4882a593Smuzhiyun 	};
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun 	ops->cmd_write(dsim_dev, MIPI_DSI_DCS_SHORT_WRITE, data_to_send,
178*4882a593Smuzhiyun 		       ARRAY_SIZE(data_to_send));
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun 
s6e8ax0_sleep_out(struct mipi_dsim_device * dsim_dev)181*4882a593Smuzhiyun static void s6e8ax0_sleep_out(struct mipi_dsim_device *dsim_dev)
182*4882a593Smuzhiyun {
183*4882a593Smuzhiyun 	struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
184*4882a593Smuzhiyun 	static const unsigned char data_to_send[] = {
185*4882a593Smuzhiyun 		0x11, 0x00
186*4882a593Smuzhiyun 	};
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun 	ops->cmd_write(dsim_dev, MIPI_DSI_DCS_SHORT_WRITE, data_to_send,
189*4882a593Smuzhiyun 		       ARRAY_SIZE(data_to_send));
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun 
s6e8ax0_apply_level1_key(struct mipi_dsim_device * dsim_dev)192*4882a593Smuzhiyun static void s6e8ax0_apply_level1_key(struct mipi_dsim_device *dsim_dev)
193*4882a593Smuzhiyun {
194*4882a593Smuzhiyun 	struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
195*4882a593Smuzhiyun 	static const unsigned char data_to_send[] = {
196*4882a593Smuzhiyun 		0xf0, 0x5a, 0x5a
197*4882a593Smuzhiyun 	};
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 	ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
200*4882a593Smuzhiyun 		data_to_send, ARRAY_SIZE(data_to_send));
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun 
s6e8ax0_apply_mtp_key(struct mipi_dsim_device * dsim_dev)203*4882a593Smuzhiyun static void s6e8ax0_apply_mtp_key(struct mipi_dsim_device *dsim_dev)
204*4882a593Smuzhiyun {
205*4882a593Smuzhiyun 	struct mipi_dsim_master_ops *ops = dsim_dev->master_ops;
206*4882a593Smuzhiyun 	static const unsigned char data_to_send[] = {
207*4882a593Smuzhiyun 		0xf1, 0x5a, 0x5a
208*4882a593Smuzhiyun 	};
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	ops->cmd_write(dsim_dev, MIPI_DSI_DCS_LONG_WRITE,
211*4882a593Smuzhiyun 		data_to_send, ARRAY_SIZE(data_to_send));
212*4882a593Smuzhiyun }
213*4882a593Smuzhiyun 
s6e8ax0_panel_init(struct mipi_dsim_device * dsim_dev)214*4882a593Smuzhiyun static void s6e8ax0_panel_init(struct mipi_dsim_device *dsim_dev)
215*4882a593Smuzhiyun {
216*4882a593Smuzhiyun 	/*
217*4882a593Smuzhiyun 	 * in case of setting gamma and panel condition at first,
218*4882a593Smuzhiyun 	 * it shuold be setting like below.
219*4882a593Smuzhiyun 	 * set_gamma() -> set_panel_condition()
220*4882a593Smuzhiyun 	 */
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun 	s6e8ax0_apply_level1_key(dsim_dev);
223*4882a593Smuzhiyun 	s6e8ax0_apply_mtp_key(dsim_dev);
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun 	s6e8ax0_sleep_out(dsim_dev);
226*4882a593Smuzhiyun 	mdelay(5);
227*4882a593Smuzhiyun 	s6e8ax0_panel_cond(dsim_dev);
228*4882a593Smuzhiyun 	s6e8ax0_display_cond(dsim_dev);
229*4882a593Smuzhiyun 	s6e8ax0_gamma_cond(dsim_dev);
230*4882a593Smuzhiyun 	s6e8ax0_gamma_update(dsim_dev);
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun 	s6e8ax0_etc_source_control(dsim_dev);
233*4882a593Smuzhiyun 	s6e8ax0_elvss_set(dsim_dev);
234*4882a593Smuzhiyun 	s6e8ax0_etc_pentile_control(dsim_dev);
235*4882a593Smuzhiyun 	s6e8ax0_etc_mipi_control1(dsim_dev);
236*4882a593Smuzhiyun 	s6e8ax0_etc_mipi_control2(dsim_dev);
237*4882a593Smuzhiyun 	s6e8ax0_etc_power_control(dsim_dev);
238*4882a593Smuzhiyun 	s6e8ax0_etc_mipi_control3(dsim_dev);
239*4882a593Smuzhiyun 	s6e8ax0_etc_mipi_control4(dsim_dev);
240*4882a593Smuzhiyun }
241*4882a593Smuzhiyun 
s6e8ax0_panel_set(struct mipi_dsim_device * dsim_dev)242*4882a593Smuzhiyun static int s6e8ax0_panel_set(struct mipi_dsim_device *dsim_dev)
243*4882a593Smuzhiyun {
244*4882a593Smuzhiyun 	s6e8ax0_panel_init(dsim_dev);
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun 	return 0;
247*4882a593Smuzhiyun }
248*4882a593Smuzhiyun 
s6e8ax0_display_enable(struct mipi_dsim_device * dsim_dev)249*4882a593Smuzhiyun static void s6e8ax0_display_enable(struct mipi_dsim_device *dsim_dev)
250*4882a593Smuzhiyun {
251*4882a593Smuzhiyun 	s6e8ax0_display_on(dsim_dev);
252*4882a593Smuzhiyun }
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun static struct mipi_dsim_lcd_driver s6e8ax0_dsim_ddi_driver = {
255*4882a593Smuzhiyun 	.name = "s6e8ax0",
256*4882a593Smuzhiyun 	.id = -1,
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun 	.mipi_panel_init = s6e8ax0_panel_set,
259*4882a593Smuzhiyun 	.mipi_display_on = s6e8ax0_display_enable,
260*4882a593Smuzhiyun };
261*4882a593Smuzhiyun 
s6e8ax0_init(void)262*4882a593Smuzhiyun void s6e8ax0_init(void)
263*4882a593Smuzhiyun {
264*4882a593Smuzhiyun 	exynos_mipi_dsi_register_lcd_driver(&s6e8ax0_dsim_ddi_driver);
265*4882a593Smuzhiyun }
266