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