xref: /linux/drivers/gpu/drm/panel/panel-novatek-nt36523.c (revision fb7399cf2d0b33825b8039f95c45395c7deba25c)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Novatek NT36523 DriverIC panels driver
4  *
5  * Copyright (c) 2022, 2023 Jianhua Lu <lujianhua000@gmail.com>
6  */
7 
8 #include <linux/backlight.h>
9 #include <linux/delay.h>
10 #include <linux/gpio/consumer.h>
11 #include <linux/module.h>
12 #include <linux/of.h>
13 #include <linux/of_graph.h>
14 #include <linux/regulator/consumer.h>
15 
16 #include <video/mipi_display.h>
17 
18 #include <drm/drm_connector.h>
19 #include <drm/drm_crtc.h>
20 #include <drm/drm_mipi_dsi.h>
21 #include <drm/drm_modes.h>
22 #include <drm/drm_panel.h>
23 
24 #define DSI_NUM_MIN 1
25 
26 #define mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, cmd, seq...)	\
27 		do {								\
28 			dsi_ctx.dsi = dsi0;					\
29 			mipi_dsi_dcs_write_seq_multi(&dsi_ctx, cmd, seq);	\
30 			dsi_ctx.dsi = dsi1;					\
31 			mipi_dsi_dcs_write_seq_multi(&dsi_ctx, cmd, seq);	\
32 		} while (0)
33 
34 struct panel_info {
35 	struct drm_panel panel;
36 	struct mipi_dsi_device *dsi[2];
37 	const struct panel_desc *desc;
38 	enum drm_panel_orientation orientation;
39 
40 	struct gpio_desc *reset_gpio;
41 	struct backlight_device *backlight;
42 	struct regulator *vddio;
43 };
44 
45 struct panel_desc {
46 	unsigned int width_mm;
47 	unsigned int height_mm;
48 
49 	unsigned int bpc;
50 	unsigned int lanes;
51 	unsigned long mode_flags;
52 	enum mipi_dsi_pixel_format format;
53 
54 	const struct drm_display_mode *modes;
55 	unsigned int num_modes;
56 	const struct mipi_dsi_device_info dsi_info;
57 	int (*init_sequence)(struct panel_info *pinfo);
58 
59 	bool is_dual_dsi;
60 	bool has_dcs_backlight;
61 };
62 
63 static inline struct panel_info *to_panel_info(struct drm_panel *panel)
64 {
65 	return container_of(panel, struct panel_info, panel);
66 }
67 
68 static int elish_boe_init_sequence(struct panel_info *pinfo)
69 {
70 	struct mipi_dsi_device *dsi0 = pinfo->dsi[0];
71 	struct mipi_dsi_device *dsi1 = pinfo->dsi[1];
72 	struct mipi_dsi_multi_context dsi_ctx = { .dsi = NULL };
73 	/* No datasheet, so write magic init sequence directly */
74 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x10);
75 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
76 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xb9, 0x05);
77 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x20);
78 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
79 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x18, 0x40);
80 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x10);
81 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
82 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xb9, 0x02);
83 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x23);
84 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
85 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x00, 0x80);
86 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x01, 0x84);
87 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x05, 0x2d);
88 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x06, 0x00);
89 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x07, 0x00);
90 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x08, 0x01);
91 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x09, 0x45);
92 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x11, 0x02);
93 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x12, 0x80);
94 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x15, 0x83);
95 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x16, 0x0c);
96 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x29, 0x0a);
97 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x30, 0xff);
98 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x31, 0xfe);
99 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x32, 0xfd);
100 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x33, 0xfb);
101 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x34, 0xf8);
102 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x35, 0xf5);
103 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x36, 0xf3);
104 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x37, 0xf2);
105 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x38, 0xf2);
106 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x39, 0xf2);
107 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x3a, 0xef);
108 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x3b, 0xec);
109 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x3d, 0xe9);
110 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x3f, 0xe5);
111 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x40, 0xe5);
112 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x41, 0xe5);
113 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x2a, 0x13);
114 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x45, 0xff);
115 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x46, 0xf4);
116 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x47, 0xe7);
117 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x48, 0xda);
118 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x49, 0xcd);
119 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x4a, 0xc0);
120 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x4b, 0xb3);
121 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x4c, 0xb2);
122 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x4d, 0xb2);
123 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x4e, 0xb2);
124 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x4f, 0x99);
125 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x50, 0x80);
126 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x51, 0x68);
127 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x52, 0x66);
128 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x53, 0x66);
129 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x54, 0x66);
130 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x2b, 0x0e);
131 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x58, 0xff);
132 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x59, 0xfb);
133 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x5a, 0xf7);
134 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x5b, 0xf3);
135 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x5c, 0xef);
136 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x5d, 0xe3);
137 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x5e, 0xda);
138 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x5f, 0xd8);
139 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x60, 0xd8);
140 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x61, 0xd8);
141 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x62, 0xcb);
142 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x63, 0xbf);
143 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x64, 0xb3);
144 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x65, 0xb2);
145 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x66, 0xb2);
146 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x67, 0xb2);
147 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x2a);
148 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
149 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x25, 0x47);
150 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x30, 0x47);
151 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x39, 0x47);
152 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x26);
153 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
154 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x19, 0x10);
155 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x1a, 0xe0);
156 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x1b, 0x10);
157 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x1c, 0x00);
158 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x2a, 0x10);
159 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x2b, 0xe0);
160 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x10);
161 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
162 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0xf0);
163 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
164 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x84, 0x08);
165 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x85, 0x0c);
166 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x20);
167 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
168 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x51, 0x00);
169 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x25);
170 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
171 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x91, 0x1f);
172 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x92, 0x0f);
173 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x93, 0x01);
174 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x94, 0x18);
175 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x95, 0x03);
176 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x96, 0x01);
177 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x10);
178 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xb0, 0x01);
179 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x25);
180 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
181 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x19, 0x1f);
182 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x1b, 0x1b);
183 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x24);
184 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
185 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xb8, 0x28);
186 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x27);
187 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
188 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xd0, 0x31);
189 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xd1, 0x20);
190 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xd2, 0x30);
191 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xd4, 0x08);
192 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xde, 0x80);
193 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xdf, 0x02);
194 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x26);
195 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
196 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x00, 0x81);
197 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x01, 0xb0);
198 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x22);
199 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
200 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x9f, 0x50);
201 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x6f, 0x01);
202 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x70, 0x11);
203 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x73, 0x01);
204 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x74, 0x49);
205 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x76, 0x01);
206 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x77, 0x49);
207 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xa0, 0x3f);
208 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xa9, 0x50);
209 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xaa, 0x28);
210 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xab, 0x28);
211 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xad, 0x10);
212 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xb8, 0x00);
213 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xb9, 0x49);
214 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xba, 0x49);
215 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xbb, 0x49);
216 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xbe, 0x04);
217 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xbf, 0x49);
218 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xc0, 0x04);
219 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xc1, 0x59);
220 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xc2, 0x00);
221 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xc5, 0x00);
222 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xc6, 0x01);
223 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xc7, 0x48);
224 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xca, 0x43);
225 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xcb, 0x3c);
226 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xce, 0x00);
227 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xcf, 0x43);
228 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xd0, 0x3c);
229 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xd3, 0x43);
230 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xd4, 0x3c);
231 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xd7, 0x00);
232 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xdc, 0x43);
233 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xdd, 0x3c);
234 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xe1, 0x43);
235 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xe2, 0x3c);
236 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xf2, 0x00);
237 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xf3, 0x01);
238 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xf4, 0x48);
239 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x25);
240 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
241 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x13, 0x01);
242 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x14, 0x23);
243 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xbc, 0x01);
244 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xbd, 0x23);
245 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x2a);
246 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
247 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x97, 0x3c);
248 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x98, 0x02);
249 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x99, 0x95);
250 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x9a, 0x03);
251 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x9b, 0x00);
252 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x9c, 0x0b);
253 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x9d, 0x0a);
254 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x9e, 0x90);
255 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x22);
256 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
257 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x9f, 0x50);
258 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x23);
259 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
260 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xa3, 0x50);
261 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0xe0);
262 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
263 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x14, 0x60);
264 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x16, 0xc0);
265 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x4f, 0x02);
266 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0xf0);
267 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
268 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x3a, 0x08);
269 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0xd0);
270 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
271 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x02, 0xaf);
272 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x09, 0xee);
273 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x1c, 0x99);
274 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x1d, 0x09);
275 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x10);
276 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
277 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x51, 0x0f, 0xff);
278 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x53, 0x2c);
279 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x35, 0x00);
280 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xbb, 0x13);
281 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x3b, 0x03, 0xac, 0x1a, 0x04, 0x04);
282 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x11);
283 	mipi_dsi_msleep(&dsi_ctx, 70);
284 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x29);
285 
286 	return dsi_ctx.accum_err;
287 }
288 
289 static int elish_csot_init_sequence(struct panel_info *pinfo)
290 {
291 	struct mipi_dsi_device *dsi0 = pinfo->dsi[0];
292 	struct mipi_dsi_device *dsi1 = pinfo->dsi[1];
293 	struct mipi_dsi_multi_context dsi_ctx = { .dsi = NULL };
294 	/* No datasheet, so write magic init sequence directly */
295 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x10);
296 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
297 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xb9, 0x05);
298 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x20);
299 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
300 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x18, 0x40);
301 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x10);
302 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
303 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xb9, 0x02);
304 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0xd0);
305 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
306 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x02, 0xaf);
307 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x00, 0x30);
308 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x09, 0xee);
309 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x1c, 0x99);
310 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x1d, 0x09);
311 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0xf0);
312 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
313 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x3a, 0x08);
314 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0xe0);
315 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
316 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x4f, 0x02);
317 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x20);
318 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
319 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x58, 0x40);
320 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x10);
321 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
322 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x35, 0x00);
323 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x23);
324 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
325 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x00, 0x80);
326 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x01, 0x84);
327 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x05, 0x2d);
328 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x06, 0x00);
329 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x07, 0x00);
330 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x08, 0x01);
331 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x09, 0x45);
332 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x11, 0x02);
333 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x12, 0x80);
334 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x15, 0x83);
335 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x16, 0x0c);
336 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x29, 0x0a);
337 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x30, 0xff);
338 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x31, 0xfe);
339 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x32, 0xfd);
340 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x33, 0xfb);
341 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x34, 0xf8);
342 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x35, 0xf5);
343 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x36, 0xf3);
344 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x37, 0xf2);
345 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x38, 0xf2);
346 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x39, 0xf2);
347 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x3a, 0xef);
348 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x3b, 0xec);
349 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x3d, 0xe9);
350 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x3f, 0xe5);
351 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x40, 0xe5);
352 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x41, 0xe5);
353 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x2a, 0x13);
354 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x45, 0xff);
355 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x46, 0xf4);
356 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x47, 0xe7);
357 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x48, 0xda);
358 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x49, 0xcd);
359 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x4a, 0xc0);
360 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x4b, 0xb3);
361 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x4c, 0xb2);
362 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x4d, 0xb2);
363 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x4e, 0xb2);
364 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x4f, 0x99);
365 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x50, 0x80);
366 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x51, 0x68);
367 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x52, 0x66);
368 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x53, 0x66);
369 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x54, 0x66);
370 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x2b, 0x0e);
371 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x58, 0xff);
372 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x59, 0xfb);
373 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x5a, 0xf7);
374 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x5b, 0xf3);
375 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x5c, 0xef);
376 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x5d, 0xe3);
377 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x5e, 0xda);
378 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x5f, 0xd8);
379 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x60, 0xd8);
380 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x61, 0xd8);
381 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x62, 0xcb);
382 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x63, 0xbf);
383 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x64, 0xb3);
384 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x65, 0xb2);
385 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x66, 0xb2);
386 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x67, 0xb2);
387 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x10);
388 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
389 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x51, 0x0f, 0xff);
390 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x53, 0x2c);
391 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x55, 0x00);
392 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xbb, 0x13);
393 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x3b, 0x03, 0xac, 0x1a, 0x04, 0x04);
394 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x2a);
395 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
396 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x25, 0x46);
397 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x30, 0x46);
398 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x39, 0x46);
399 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x26);
400 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
401 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x01, 0xb0);
402 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x19, 0x10);
403 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x1a, 0xe0);
404 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x1b, 0x10);
405 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x1c, 0x00);
406 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x2a, 0x10);
407 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x2b, 0xe0);
408 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0xf0);
409 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
410 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x84, 0x08);
411 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x85, 0x0c);
412 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x20);
413 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
414 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x51, 0x00);
415 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x25);
416 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
417 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x91, 0x1f);
418 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x92, 0x0f);
419 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x93, 0x01);
420 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x94, 0x18);
421 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x95, 0x03);
422 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x96, 0x01);
423 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x10);
424 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xb0, 0x01);
425 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x25);
426 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
427 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x19, 0x1f);
428 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x1b, 0x1b);
429 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x24);
430 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
431 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xb8, 0x28);
432 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x27);
433 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
434 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xd0, 0x31);
435 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xd1, 0x20);
436 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xd4, 0x08);
437 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xde, 0x80);
438 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xdf, 0x02);
439 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x26);
440 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
441 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x00, 0x81);
442 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x01, 0xb0);
443 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x22);
444 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
445 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x6f, 0x01);
446 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x70, 0x11);
447 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x73, 0x01);
448 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x74, 0x4d);
449 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xa0, 0x3f);
450 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xa9, 0x50);
451 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xaa, 0x28);
452 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xab, 0x28);
453 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xad, 0x10);
454 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xb8, 0x00);
455 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xb9, 0x4b);
456 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xba, 0x96);
457 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xbb, 0x4b);
458 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xbe, 0x07);
459 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xbf, 0x4b);
460 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xc0, 0x07);
461 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xc1, 0x5c);
462 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xc2, 0x00);
463 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xc5, 0x00);
464 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xc6, 0x3f);
465 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xc7, 0x00);
466 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xca, 0x08);
467 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xcb, 0x40);
468 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xce, 0x00);
469 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xcf, 0x08);
470 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xd0, 0x40);
471 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xd3, 0x08);
472 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xd4, 0x40);
473 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x25);
474 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
475 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xbc, 0x01);
476 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xbd, 0x1c);
477 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x2a);
478 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xfb, 0x01);
479 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x9a, 0x03);
480 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0xff, 0x10);
481 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x11);
482 	mipi_dsi_msleep(&dsi_ctx, 70);
483 	mipi_dsi_dual_dcs_write_seq_multi(dsi_ctx, dsi0, dsi1, 0x29);
484 
485 	return dsi_ctx.accum_err;
486 }
487 
488 static int j606f_boe_init_sequence(struct panel_info *pinfo)
489 {
490 	struct mipi_dsi_device *dsi = pinfo->dsi[0];
491 	struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi };
492 
493 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xff, 0x20);
494 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfb, 0x01);
495 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x05, 0xd9);
496 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x07, 0x78);
497 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x08, 0x5a);
498 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0d, 0x63);
499 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0e, 0x91);
500 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0f, 0x73);
501 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x95, 0xeb);
502 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x96, 0xeb);
503 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_SET_PARTIAL_ROWS, 0x11);
504 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6d, 0x66);
505 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x75, 0xa2);
506 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x77, 0xb3);
507 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb0, 0x00, 0x08, 0x00, 0x23, 0x00, 0x4d, 0x00, 0x6d,
508 				     0x00, 0x89, 0x00, 0xa1, 0x00, 0xb6, 0x00, 0xc9);
509 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb1, 0x00, 0xda, 0x01, 0x13, 0x01, 0x3c, 0x01, 0x7e,
510 				     0x01, 0xab, 0x01, 0xf7, 0x02, 0x2f, 0x02, 0x31);
511 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb2, 0x02, 0x67, 0x02, 0xa6, 0x02, 0xd1, 0x03, 0x08,
512 				     0x03, 0x2e, 0x03, 0x5b, 0x03, 0x6b, 0x03, 0x7b);
513 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb3, 0x03, 0x8e, 0x03, 0xa2, 0x03, 0xb7, 0x03, 0xe7,
514 				     0x03, 0xfd, 0x03, 0xff);
515 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb4, 0x00, 0x08, 0x00, 0x23, 0x00, 0x4d, 0x00, 0x6d,
516 				     0x00, 0x89, 0x00, 0xa1, 0x00, 0xb6, 0x00, 0xc9);
517 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb5, 0x00, 0xda, 0x01, 0x13, 0x01, 0x3c, 0x01, 0x7e,
518 				     0x01, 0xab, 0x01, 0xf7, 0x02, 0x2f, 0x02, 0x31);
519 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb6, 0x02, 0x67, 0x02, 0xa6, 0x02, 0xd1, 0x03, 0x08,
520 				     0x03, 0x2e, 0x03, 0x5b, 0x03, 0x6b, 0x03, 0x7b);
521 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb7, 0x03, 0x8e, 0x03, 0xa2, 0x03, 0xb7, 0x03, 0xe7,
522 				     0x03, 0xfd, 0x03, 0xff);
523 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb8, 0x00, 0x08, 0x00, 0x23, 0x00, 0x4d, 0x00, 0x6d,
524 				     0x00, 0x89, 0x00, 0xa1, 0x00, 0xb6, 0x00, 0xc9);
525 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb9, 0x00, 0xda, 0x01, 0x13, 0x01, 0x3c, 0x01, 0x7e,
526 				     0x01, 0xab, 0x01, 0xf7, 0x02, 0x2f, 0x02, 0x31);
527 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xba, 0x02, 0x67, 0x02, 0xa6, 0x02, 0xd1, 0x03, 0x08,
528 				     0x03, 0x2e, 0x03, 0x5b, 0x03, 0x6b, 0x03, 0x7b);
529 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xbb, 0x03, 0x8e, 0x03, 0xa2, 0x03, 0xb7, 0x03, 0xe7,
530 				     0x03, 0xfd, 0x03, 0xff);
531 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xff, 0x21);
532 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfb, 0x01);
533 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb0, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x45, 0x00, 0x65,
534 				     0x00, 0x81, 0x00, 0x99, 0x00, 0xae, 0x00, 0xc1);
535 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb1, 0x00, 0xd2, 0x01, 0x0b, 0x01, 0x34, 0x01, 0x76,
536 				     0x01, 0xa3, 0x01, 0xef, 0x02, 0x27, 0x02, 0x29);
537 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb2, 0x02, 0x5f, 0x02, 0x9e, 0x02, 0xc9, 0x03, 0x00,
538 				     0x03, 0x26, 0x03, 0x53, 0x03, 0x63, 0x03, 0x73);
539 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb3, 0x03, 0x86, 0x03, 0x9a, 0x03, 0xaf, 0x03, 0xdf,
540 				     0x03, 0xf5, 0x03, 0xf7);
541 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb4, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x45, 0x00, 0x65,
542 				     0x00, 0x81, 0x00, 0x99, 0x00, 0xae, 0x00, 0xc1);
543 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb5, 0x00, 0xd2, 0x01, 0x0b, 0x01, 0x34, 0x01, 0x76,
544 				     0x01, 0xa3, 0x01, 0xef, 0x02, 0x27, 0x02, 0x29);
545 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb6, 0x02, 0x5f, 0x02, 0x9e, 0x02, 0xc9, 0x03, 0x00,
546 				     0x03, 0x26, 0x03, 0x53, 0x03, 0x63, 0x03, 0x73);
547 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb7, 0x03, 0x86, 0x03, 0x9a, 0x03, 0xaf, 0x03, 0xdf,
548 				     0x03, 0xf5, 0x03, 0xf7);
549 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb8, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x45, 0x00, 0x65,
550 				     0x00, 0x81, 0x00, 0x99, 0x00, 0xae, 0x00, 0xc1);
551 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb9, 0x00, 0xd2, 0x01, 0x0b, 0x01, 0x34, 0x01, 0x76,
552 				     0x01, 0xa3, 0x01, 0xef, 0x02, 0x27, 0x02, 0x29);
553 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xba, 0x02, 0x5f, 0x02, 0x9e, 0x02, 0xc9, 0x03, 0x00,
554 				     0x03, 0x26, 0x03, 0x53, 0x03, 0x63, 0x03, 0x73);
555 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xbb, 0x03, 0x86, 0x03, 0x9a, 0x03, 0xaf, 0x03, 0xdf,
556 				     0x03, 0xf5, 0x03, 0xf7);
557 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xff, 0x23);
558 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfb, 0x01);
559 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x00, 0x80);
560 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x07, 0x00);
561 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x11, 0x01);
562 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x12, 0x77);
563 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x15, 0x07);
564 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x16, 0x07);
565 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xff, 0x24);
566 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfb, 0x01);
567 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x00, 0x00);
568 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x01, 0x00);
569 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x02, 0x1c);
570 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x03, 0x1c);
571 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x04, 0x1d);
572 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x05, 0x1d);
573 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x06, 0x04);
574 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x07, 0x04);
575 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x08, 0x0f);
576 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x09, 0x0f);
577 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0a, 0x0e);
578 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0b, 0x0e);
579 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0c, 0x0d);
580 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0d, 0x0d);
581 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0e, 0x0c);
582 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0f, 0x0c);
583 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x10, 0x08);
584 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x11, 0x08);
585 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x12, 0x00);
586 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x13, 0x00);
587 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x14, 0x00);
588 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x15, 0x00);
589 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x16, 0x00);
590 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x17, 0x00);
591 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x18, 0x1c);
592 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x19, 0x1c);
593 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1a, 0x1d);
594 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1b, 0x1d);
595 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1c, 0x04);
596 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1d, 0x04);
597 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1e, 0x0f);
598 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1f, 0x0f);
599 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x20, 0x0e);
600 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x21, 0x0e);
601 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x22, 0x0d);
602 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x23, 0x0d);
603 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x24, 0x0c);
604 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x25, 0x0c);
605 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_SET_GAMMA_CURVE, 0x08);
606 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x27, 0x08);
607 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x28, 0x00);
608 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x29, 0x00);
609 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2a, 0x00);
610 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2b, 0x00);
611 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_WRITE_LUT, 0x20);
612 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2f, 0x0a);
613 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_SET_PARTIAL_ROWS, 0x44);
614 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x33, 0x0c);
615 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x34, 0x32);
616 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x37, 0x44);
617 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x38, 0x40);
618 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x39, 0x00);
619 
620 	mipi_dsi_dcs_set_pixel_format_multi(&dsi_ctx, 0x9a);
621 
622 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3b, 0xa0);
623 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_SET_3D_CONTROL, 0x42);
624 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3f, 0x06);
625 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x43, 0x06);
626 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x47, 0x66);
627 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4a, 0x9a);
628 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4b, 0xa0);
629 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4c, 0x91);
630 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4d, 0x21);
631 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4e, 0x43);
632 
633 	mipi_dsi_dcs_set_display_brightness_multi(&dsi_ctx, 18);
634 
635 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x52, 0x34);
636 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x55, 0x82, 0x02);
637 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x56, 0x04);
638 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x58, 0x21);
639 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x59, 0x30);
640 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5a, 0xba);
641 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5b, 0xa0);
642 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_SET_CABC_MIN_BRIGHTNESS, 0x00, 0x06);
643 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5f, 0x00);
644 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x65, 0x82);
645 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7e, 0x20);
646 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7f, 0x3c);
647 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x82, 0x04);
648 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x97, 0xc0);
649 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb6,
650 				     0x05, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
651 				     0x05, 0x00, 0x00);
652 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x92, 0xc4);
653 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x93, 0x1a);
654 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x94, 0x5f);
655 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xd7, 0x55);
656 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xda, 0x0a);
657 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xde, 0x08);
658 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xdb, 0x05);
659 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xdc, 0xc4);
660 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xdd, 0x22);
661 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xdf, 0x05);
662 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe0, 0xc4);
663 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe1, 0x05);
664 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe2, 0xc4);
665 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe3, 0x05);
666 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe4, 0xc4);
667 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe5, 0x05);
668 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe6, 0xc4);
669 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5c, 0x88);
670 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5d, 0x08);
671 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x8d, 0x88);
672 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x8e, 0x08);
673 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb5, 0x90);
674 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xff, 0x25);
675 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfb, 0x01);
676 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x05, 0x00);
677 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x19, 0x07);
678 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1f, 0xba);
679 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x20, 0xa0);
680 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_SET_GAMMA_CURVE, 0xba);
681 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x27, 0xa0);
682 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x33, 0xba);
683 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x34, 0xa0);
684 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3f, 0xe0);
685 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_SET_VSYNC_TIMING, 0x00);
686 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x44, 0x00);
687 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_GET_SCANLINE, 0x40);
688 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x48, 0xba);
689 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x49, 0xa0);
690 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5b, 0x00);
691 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5c, 0x00);
692 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5d, 0x00);
693 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_SET_CABC_MIN_BRIGHTNESS, 0xd0);
694 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x61, 0xba);
695 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x62, 0xa0);
696 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xf1, 0x10);
697 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xff, 0x2a);
698 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfb, 0x01);
699 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x64, 0x16);
700 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x67, 0x16);
701 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6a, 0x16);
702 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x70, 0x30);
703 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_READ_PPS_START, 0xf3);
704 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xa3, 0xff);
705 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xa4, 0xff);
706 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xa5, 0xff);
707 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xd6, 0x08);
708 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xff, 0x26);
709 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfb, 0x01);
710 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x00, 0xa1);
711 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0a, 0xf2);
712 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x04, 0x28);
713 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x06, 0x30);
714 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0c, 0x13);
715 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0d, 0x0a);
716 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0f, 0x0a);
717 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x11, 0x00);
718 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x12, 0x50);
719 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x13, 0x51);
720 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x14, 0x65);
721 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x15, 0x00);
722 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x16, 0x10);
723 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x17, 0xa0);
724 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x18, 0x86);
725 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x19, 0x11);
726 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1a, 0x7b);
727 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1b, 0x10);
728 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1c, 0xbb);
729 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x22, 0x00);
730 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x23, 0x00);
731 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2a, 0x11);
732 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2b, 0x7b);
733 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1d, 0x00);
734 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1e, 0xc3);
735 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1f, 0xc3);
736 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x24, 0x00);
737 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x25, 0xc3);
738 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2f, 0x05);
739 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_SET_PARTIAL_ROWS, 0xc3);
740 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_SET_PARTIAL_COLUMNS, 0x00);
741 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x32, 0xc3);
742 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x39, 0x00);
743 
744 	mipi_dsi_dcs_set_pixel_format_multi(&dsi_ctx, 0xc3);
745 
746 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x20, 0x01);
747 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x33, 0x11);
748 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x34, 0x78);
749 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x35, 0x16);
750 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xc8, 0x04);
751 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xc9, 0x82);
752 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xca, 0x4e);
753 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xcb, 0x00);
754 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_READ_PPS_CONTINUE, 0x4c);
755 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xaa, 0x47);
756 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xff, 0x27);
757 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfb, 0x01);
758 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x56, 0x06);
759 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x58, 0x80);
760 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x59, 0x53);
761 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5a, 0x00);
762 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5b, 0x14);
763 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5c, 0x00);
764 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5d, 0x01);
765 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_SET_CABC_MIN_BRIGHTNESS, 0x20);
766 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5f, 0x10);
767 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x60, 0x00);
768 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x61, 0x1d);
769 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x62, 0x00);
770 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x63, 0x01);
771 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x64, 0x24);
772 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x65, 0x1c);
773 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x66, 0x00);
774 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x67, 0x01);
775 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x68, 0x25);
776 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x00, 0x00);
777 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x78, 0x00);
778 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xc3, 0x00);
779 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xd1, 0x24);
780 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xd2, 0x30);
781 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xff, 0x2a);
782 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfb, 0x01);
783 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x22, 0x2f);
784 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x23, 0x08);
785 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x24, 0x00);
786 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x25, 0xc3);
787 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_SET_GAMMA_CURVE, 0xf8);
788 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x27, 0x00);
789 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x28, 0x1a);
790 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x29, 0x00);
791 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2a, 0x1a);
792 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2b, 0x00);
793 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_WRITE_LUT, 0x1a);
794 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xff, 0xe0);
795 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfb, 0x01);
796 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x14, 0x60);
797 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x16, 0xc0);
798 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xff, 0xf0);
799 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfb, 0x01);
800 
801 	mipi_dsi_dcs_set_pixel_format_multi(&dsi_ctx, 0x08);
802 
803 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xff, 0x24);
804 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfb, 0x01);
805 
806 	mipi_dsi_dcs_set_pixel_format_multi(&dsi_ctx, 0x5d);
807 
808 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3b, 0x60);
809 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4a, 0x5d);
810 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4b, 0x60);
811 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5a, 0x70);
812 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5b, 0x60);
813 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x91, 0x44);
814 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x92, 0x75);
815 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xdb, 0x05);
816 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xdc, 0x75);
817 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xdd, 0x22);
818 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xdf, 0x05);
819 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe0, 0x75);
820 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe1, 0x05);
821 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe2, 0x75);
822 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe3, 0x05);
823 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe4, 0x75);
824 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe5, 0x05);
825 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe6, 0x75);
826 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5c, 0x00);
827 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5d, 0x00);
828 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x8d, 0x00);
829 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x8e, 0x00);
830 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xff, 0x25);
831 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfb, 0x01);
832 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1f, 0x70);
833 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x20, 0x60);
834 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_SET_GAMMA_CURVE, 0x70);
835 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x27, 0x60);
836 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x33, 0x70);
837 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x34, 0x60);
838 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x48, 0x70);
839 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x49, 0x60);
840 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5b, 0x00);
841 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x61, 0x70);
842 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x62, 0x60);
843 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xff, 0x26);
844 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfb, 0x01);
845 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x02, 0x31);
846 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x19, 0x0a);
847 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1a, 0x7f);
848 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1b, 0x0a);
849 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1c, 0x0c);
850 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2a, 0x0a);
851 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2b, 0x7f);
852 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1e, 0x75);
853 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1f, 0x75);
854 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x25, 0x75);
855 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_SET_PARTIAL_ROWS, 0x75);
856 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_SET_PARTIAL_COLUMNS, 0x05);
857 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x32, 0x8d);
858 
859 	mipi_dsi_dcs_set_pixel_format_multi(&dsi_ctx, 0x75);
860 
861 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xff, 0x2a);
862 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfb, 0x01);
863 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x25, 0x75);
864 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xff, 0x10);
865 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfb, 0x01);
866 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb9, 0x01);
867 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xff, 0x20);
868 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfb, 0x01);
869 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x18, 0x40);
870 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xff, 0x10);
871 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfb, 0x01);
872 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xb9, 0x02);
873 
874 	mipi_dsi_dcs_set_tear_on_multi(&dsi_ctx, MIPI_DSI_DCS_TEAR_MODE_VBLANK);
875 
876 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xbb, 0x13);
877 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3b, 0x03, 0x5f, 0x1a, 0x04, 0x04);
878 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xff, 0x10);
879 	mipi_dsi_usleep_range(&dsi_ctx, 10000, 11000);
880 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xfb, 0x01);
881 
882 	mipi_dsi_dcs_set_display_brightness_multi(&dsi_ctx, 0);
883 
884 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_WRITE_CONTROL_DISPLAY, 0x2c);
885 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_WRITE_POWER_SAVE, 0x00);
886 	mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x68, 0x05, 0x01);
887 
888 	mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
889 	mipi_dsi_msleep(&dsi_ctx, 100);
890 
891 	mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
892 	mipi_dsi_msleep(&dsi_ctx, 30);
893 
894 	return dsi_ctx.accum_err;
895 }
896 
897 static const struct drm_display_mode elish_boe_modes[] = {
898 	{
899 		.clock = (1600 + 60 + 8 + 60) * (2560 + 26 + 4 + 168) * 120 / 1000,
900 		.hdisplay = 1600,
901 		.hsync_start = 1600 + 60,
902 		.hsync_end = 1600 + 60 + 8,
903 		.htotal = 1600 + 60 + 8 + 60,
904 		.vdisplay = 2560,
905 		.vsync_start = 2560 + 26,
906 		.vsync_end = 2560 + 26 + 4,
907 		.vtotal = 2560 + 26 + 4 + 168,
908 	},
909 };
910 
911 static const struct drm_display_mode elish_csot_modes[] = {
912 	{
913 		.clock = (1600 + 200 + 40 + 52) * (2560 + 26 + 4 + 168) * 120 / 1000,
914 		.hdisplay = 1600,
915 		.hsync_start = 1600 + 200,
916 		.hsync_end = 1600 + 200 + 40,
917 		.htotal = 1600 + 200 + 40 + 52,
918 		.vdisplay = 2560,
919 		.vsync_start = 2560 + 26,
920 		.vsync_end = 2560 + 26 + 4,
921 		.vtotal = 2560 + 26 + 4 + 168,
922 	},
923 };
924 
925 static const struct drm_display_mode j606f_boe_modes[] = {
926 	{
927 		.clock = (1200 + 58 + 2 + 60) * (2000 + 26 + 2 + 93) * 60 / 1000,
928 		.hdisplay = 1200,
929 		.hsync_start = 1200 + 58,
930 		.hsync_end = 1200 + 58 + 2,
931 		.htotal = 1200 + 58 + 2 + 60,
932 		.vdisplay = 2000,
933 		.vsync_start = 2000 + 26,
934 		.vsync_end = 2000 + 26 + 2,
935 		.vtotal = 2000 + 26 + 2 + 93,
936 		.width_mm = 143,
937 		.height_mm = 235,
938 	},
939 };
940 
941 static const struct panel_desc elish_boe_desc = {
942 	.modes = elish_boe_modes,
943 	.num_modes = ARRAY_SIZE(elish_boe_modes),
944 	.dsi_info = {
945 		.type = "BOE-elish",
946 		.channel = 0,
947 		.node = NULL,
948 	},
949 	.width_mm = 127,
950 	.height_mm = 203,
951 	.bpc = 8,
952 	.lanes = 3,
953 	.format = MIPI_DSI_FMT_RGB888,
954 	.mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS | MIPI_DSI_MODE_LPM,
955 	.init_sequence = elish_boe_init_sequence,
956 	.is_dual_dsi = true,
957 };
958 
959 static const struct panel_desc elish_csot_desc = {
960 	.modes = elish_csot_modes,
961 	.num_modes = ARRAY_SIZE(elish_csot_modes),
962 	.dsi_info = {
963 		.type = "CSOT-elish",
964 		.channel = 0,
965 		.node = NULL,
966 	},
967 	.width_mm = 127,
968 	.height_mm = 203,
969 	.bpc = 8,
970 	.lanes = 3,
971 	.format = MIPI_DSI_FMT_RGB888,
972 	.mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS | MIPI_DSI_MODE_LPM,
973 	.init_sequence = elish_csot_init_sequence,
974 	.is_dual_dsi = true,
975 };
976 
977 static const struct panel_desc j606f_boe_desc = {
978 	.modes = j606f_boe_modes,
979 	.num_modes = ARRAY_SIZE(j606f_boe_modes),
980 	.width_mm = 143,
981 	.height_mm = 235,
982 	.bpc = 8,
983 	.lanes = 4,
984 	.format = MIPI_DSI_FMT_RGB888,
985 	.mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
986 		      MIPI_DSI_CLOCK_NON_CONTINUOUS | MIPI_DSI_MODE_LPM,
987 	.init_sequence = j606f_boe_init_sequence,
988 	.has_dcs_backlight = true,
989 };
990 
991 static void nt36523_reset(struct panel_info *pinfo)
992 {
993 	gpiod_set_value_cansleep(pinfo->reset_gpio, 1);
994 	usleep_range(12000, 13000);
995 	gpiod_set_value_cansleep(pinfo->reset_gpio, 0);
996 	usleep_range(12000, 13000);
997 	gpiod_set_value_cansleep(pinfo->reset_gpio, 1);
998 	usleep_range(12000, 13000);
999 	gpiod_set_value_cansleep(pinfo->reset_gpio, 0);
1000 	usleep_range(12000, 13000);
1001 }
1002 
1003 static int nt36523_prepare(struct drm_panel *panel)
1004 {
1005 	struct panel_info *pinfo = to_panel_info(panel);
1006 	int ret;
1007 
1008 	ret = regulator_enable(pinfo->vddio);
1009 	if (ret) {
1010 		dev_err(panel->dev, "failed to enable vddio regulator: %d\n", ret);
1011 		return ret;
1012 	}
1013 
1014 	nt36523_reset(pinfo);
1015 
1016 	ret = pinfo->desc->init_sequence(pinfo);
1017 	if (ret < 0) {
1018 		regulator_disable(pinfo->vddio);
1019 		dev_err(panel->dev, "failed to initialize panel: %d\n", ret);
1020 		return ret;
1021 	}
1022 
1023 	return 0;
1024 }
1025 
1026 static int nt36523_disable(struct drm_panel *panel)
1027 {
1028 	struct panel_info *pinfo = to_panel_info(panel);
1029 	int i;
1030 
1031 	for (i = 0; i < DSI_NUM_MIN + pinfo->desc->is_dual_dsi; i++) {
1032 		struct mipi_dsi_multi_context dsi_ctx = { .dsi = pinfo->dsi[i]};
1033 
1034 		mipi_dsi_dcs_set_display_off_multi(&dsi_ctx);
1035 	}
1036 
1037 	for (i = 0; i < DSI_NUM_MIN + pinfo->desc->is_dual_dsi; i++) {
1038 		struct mipi_dsi_multi_context dsi_ctx = { .dsi = pinfo->dsi[i]};
1039 
1040 		mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx);
1041 	}
1042 
1043 	msleep(70);
1044 
1045 	return 0;
1046 }
1047 
1048 static int nt36523_unprepare(struct drm_panel *panel)
1049 {
1050 	struct panel_info *pinfo = to_panel_info(panel);
1051 
1052 	gpiod_set_value_cansleep(pinfo->reset_gpio, 1);
1053 	regulator_disable(pinfo->vddio);
1054 
1055 	return 0;
1056 }
1057 
1058 static void nt36523_remove(struct mipi_dsi_device *dsi)
1059 {
1060 	struct panel_info *pinfo = mipi_dsi_get_drvdata(dsi);
1061 
1062 	drm_panel_remove(&pinfo->panel);
1063 }
1064 
1065 static int nt36523_get_modes(struct drm_panel *panel,
1066 			       struct drm_connector *connector)
1067 {
1068 	struct panel_info *pinfo = to_panel_info(panel);
1069 	int i;
1070 
1071 	for (i = 0; i < pinfo->desc->num_modes; i++) {
1072 		const struct drm_display_mode *m = &pinfo->desc->modes[i];
1073 		struct drm_display_mode *mode;
1074 
1075 		mode = drm_mode_duplicate(connector->dev, m);
1076 		if (!mode) {
1077 			dev_err(panel->dev, "failed to add mode %ux%u@%u\n",
1078 				m->hdisplay, m->vdisplay, drm_mode_vrefresh(m));
1079 			return -ENOMEM;
1080 		}
1081 
1082 		mode->type = DRM_MODE_TYPE_DRIVER;
1083 		if (i == 0)
1084 			mode->type |= DRM_MODE_TYPE_PREFERRED;
1085 
1086 		drm_mode_set_name(mode);
1087 		drm_mode_probed_add(connector, mode);
1088 	}
1089 
1090 	connector->display_info.width_mm = pinfo->desc->width_mm;
1091 	connector->display_info.height_mm = pinfo->desc->height_mm;
1092 	connector->display_info.bpc = pinfo->desc->bpc;
1093 
1094 	return pinfo->desc->num_modes;
1095 }
1096 
1097 static enum drm_panel_orientation nt36523_get_orientation(struct drm_panel *panel)
1098 {
1099 	struct panel_info *pinfo = to_panel_info(panel);
1100 
1101 	return pinfo->orientation;
1102 }
1103 
1104 static const struct drm_panel_funcs nt36523_panel_funcs = {
1105 	.disable = nt36523_disable,
1106 	.prepare = nt36523_prepare,
1107 	.unprepare = nt36523_unprepare,
1108 	.get_modes = nt36523_get_modes,
1109 	.get_orientation = nt36523_get_orientation,
1110 };
1111 
1112 static int nt36523_bl_update_status(struct backlight_device *bl)
1113 {
1114 	struct mipi_dsi_device *dsi = bl_get_data(bl);
1115 	u16 brightness = backlight_get_brightness(bl);
1116 	int ret;
1117 
1118 	dsi->mode_flags &= ~MIPI_DSI_MODE_LPM;
1119 
1120 	ret = mipi_dsi_dcs_set_display_brightness_large(dsi, brightness);
1121 	if (ret < 0)
1122 		return ret;
1123 
1124 	dsi->mode_flags |= MIPI_DSI_MODE_LPM;
1125 
1126 	return 0;
1127 }
1128 
1129 static int nt36523_bl_get_brightness(struct backlight_device *bl)
1130 {
1131 	struct mipi_dsi_device *dsi = bl_get_data(bl);
1132 	u16 brightness;
1133 	int ret;
1134 
1135 	dsi->mode_flags &= ~MIPI_DSI_MODE_LPM;
1136 
1137 	ret = mipi_dsi_dcs_get_display_brightness_large(dsi, &brightness);
1138 	if (ret < 0)
1139 		return ret;
1140 
1141 	dsi->mode_flags |= MIPI_DSI_MODE_LPM;
1142 
1143 	return brightness;
1144 }
1145 
1146 static const struct backlight_ops nt36523_bl_ops = {
1147 	.update_status = nt36523_bl_update_status,
1148 	.get_brightness = nt36523_bl_get_brightness,
1149 };
1150 
1151 static struct backlight_device *nt36523_create_backlight(struct mipi_dsi_device *dsi)
1152 {
1153 	struct device *dev = &dsi->dev;
1154 	const struct backlight_properties props = {
1155 		.type = BACKLIGHT_RAW,
1156 		.brightness = 512,
1157 		.max_brightness = 4095,
1158 		.scale = BACKLIGHT_SCALE_NON_LINEAR,
1159 	};
1160 
1161 	return devm_backlight_device_register(dev, dev_name(dev), dev, dsi,
1162 					      &nt36523_bl_ops, &props);
1163 }
1164 
1165 static int nt36523_probe(struct mipi_dsi_device *dsi)
1166 {
1167 	struct device *dev = &dsi->dev;
1168 	struct device_node *dsi1;
1169 	struct mipi_dsi_host *dsi1_host;
1170 	struct panel_info *pinfo;
1171 	const struct mipi_dsi_device_info *info;
1172 	int i, ret;
1173 
1174 	pinfo = devm_kzalloc(dev, sizeof(*pinfo), GFP_KERNEL);
1175 	if (!pinfo)
1176 		return -ENOMEM;
1177 
1178 	pinfo->vddio = devm_regulator_get(dev, "vddio");
1179 	if (IS_ERR(pinfo->vddio))
1180 		return dev_err_probe(dev, PTR_ERR(pinfo->vddio), "failed to get vddio regulator\n");
1181 
1182 	pinfo->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
1183 	if (IS_ERR(pinfo->reset_gpio))
1184 		return dev_err_probe(dev, PTR_ERR(pinfo->reset_gpio), "failed to get reset gpio\n");
1185 
1186 	pinfo->desc = of_device_get_match_data(dev);
1187 	if (!pinfo->desc)
1188 		return -ENODEV;
1189 
1190 	/* If the panel is dual dsi, register DSI1 */
1191 	if (pinfo->desc->is_dual_dsi) {
1192 		info = &pinfo->desc->dsi_info;
1193 
1194 		dsi1 = of_graph_get_remote_node(dsi->dev.of_node, 1, -1);
1195 		if (!dsi1) {
1196 			dev_err(dev, "cannot get secondary DSI node.\n");
1197 			return -ENODEV;
1198 		}
1199 
1200 		dsi1_host = of_find_mipi_dsi_host_by_node(dsi1);
1201 		of_node_put(dsi1);
1202 		if (!dsi1_host)
1203 			return dev_err_probe(dev, -EPROBE_DEFER, "cannot get secondary DSI host\n");
1204 
1205 		pinfo->dsi[1] = devm_mipi_dsi_device_register_full(dev, dsi1_host, info);
1206 		if (IS_ERR(pinfo->dsi[1])) {
1207 			dev_err(dev, "cannot get secondary DSI device\n");
1208 			return PTR_ERR(pinfo->dsi[1]);
1209 		}
1210 	}
1211 
1212 	pinfo->dsi[0] = dsi;
1213 	mipi_dsi_set_drvdata(dsi, pinfo);
1214 	drm_panel_init(&pinfo->panel, dev, &nt36523_panel_funcs, DRM_MODE_CONNECTOR_DSI);
1215 
1216 	ret = of_drm_get_panel_orientation(dev->of_node, &pinfo->orientation);
1217 	if (ret < 0) {
1218 		dev_err(dev, "%pOF: failed to get orientation %d\n", dev->of_node, ret);
1219 		return ret;
1220 	}
1221 
1222 	pinfo->panel.prepare_prev_first = true;
1223 
1224 	if (pinfo->desc->has_dcs_backlight) {
1225 		pinfo->panel.backlight = nt36523_create_backlight(dsi);
1226 		if (IS_ERR(pinfo->panel.backlight))
1227 			return dev_err_probe(dev, PTR_ERR(pinfo->panel.backlight),
1228 					     "Failed to create backlight\n");
1229 	} else {
1230 		ret = drm_panel_of_backlight(&pinfo->panel);
1231 		if (ret)
1232 			return dev_err_probe(dev, ret, "Failed to get backlight\n");
1233 	}
1234 
1235 	drm_panel_add(&pinfo->panel);
1236 
1237 	for (i = 0; i < DSI_NUM_MIN + pinfo->desc->is_dual_dsi; i++) {
1238 		pinfo->dsi[i]->lanes = pinfo->desc->lanes;
1239 		pinfo->dsi[i]->format = pinfo->desc->format;
1240 		pinfo->dsi[i]->mode_flags = pinfo->desc->mode_flags;
1241 
1242 		ret = devm_mipi_dsi_attach(dev, pinfo->dsi[i]);
1243 		if (ret < 0)
1244 			return dev_err_probe(dev, ret, "cannot attach to DSI%d host.\n", i);
1245 	}
1246 
1247 	return 0;
1248 }
1249 
1250 static const struct of_device_id nt36523_of_match[] = {
1251 	{
1252 		.compatible = "lenovo,j606f-boe-nt36523w",
1253 		.data = &j606f_boe_desc,
1254 	},
1255 	{
1256 		.compatible = "xiaomi,elish-boe-nt36523",
1257 		.data = &elish_boe_desc,
1258 	},
1259 	{
1260 		.compatible = "xiaomi,elish-csot-nt36523",
1261 		.data = &elish_csot_desc,
1262 	},
1263 	{},
1264 };
1265 MODULE_DEVICE_TABLE(of, nt36523_of_match);
1266 
1267 static struct mipi_dsi_driver nt36523_driver = {
1268 	.probe = nt36523_probe,
1269 	.remove = nt36523_remove,
1270 	.driver = {
1271 		.name = "panel-novatek-nt36523",
1272 		.of_match_table = nt36523_of_match,
1273 	},
1274 };
1275 module_mipi_dsi_driver(nt36523_driver);
1276 
1277 MODULE_AUTHOR("Jianhua Lu <lujianhua000@gmail.com>");
1278 MODULE_DESCRIPTION("DRM driver for Novatek NT36523 based MIPI DSI panels");
1279 MODULE_LICENSE("GPL");
1280