a6d6155ef45c2b082dba35b44c4be877b320b17c
[platform/kernel/linux-starfive.git] / drivers / gpu / drm / panel / panel-sitronix-st7789v.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (C) 2017 Free Electrons
4  */
5
6 #include <linux/delay.h>
7 #include <linux/gpio/consumer.h>
8 #include <linux/module.h>
9 #include <linux/regulator/consumer.h>
10 #include <linux/spi/spi.h>
11
12 #include <video/mipi_display.h>
13
14 #include <drm/drm_device.h>
15 #include <drm/drm_modes.h>
16 #include <drm/drm_panel.h>
17
18 #define ST7789V_RAMCTRL_CMD             0xb0
19 #define ST7789V_RAMCTRL_RM_RGB                  BIT(4)
20 #define ST7789V_RAMCTRL_DM_RGB                  BIT(0)
21 #define ST7789V_RAMCTRL_MAGIC                   (3 << 6)
22 #define ST7789V_RAMCTRL_EPF(n)                  (((n) & 3) << 4)
23
24 #define ST7789V_RGBCTRL_CMD             0xb1
25 #define ST7789V_RGBCTRL_WO                      BIT(7)
26 #define ST7789V_RGBCTRL_RCM(n)                  (((n) & 3) << 5)
27 #define ST7789V_RGBCTRL_VSYNC_HIGH              BIT(3)
28 #define ST7789V_RGBCTRL_HSYNC_HIGH              BIT(2)
29 #define ST7789V_RGBCTRL_PCLK_HIGH               BIT(1)
30 #define ST7789V_RGBCTRL_VBP(n)                  ((n) & 0x7f)
31 #define ST7789V_RGBCTRL_HBP(n)                  ((n) & 0x1f)
32
33 #define ST7789V_PORCTRL_CMD             0xb2
34 #define ST7789V_PORCTRL_IDLE_BP(n)              (((n) & 0xf) << 4)
35 #define ST7789V_PORCTRL_IDLE_FP(n)              ((n) & 0xf)
36 #define ST7789V_PORCTRL_PARTIAL_BP(n)           (((n) & 0xf) << 4)
37 #define ST7789V_PORCTRL_PARTIAL_FP(n)           ((n) & 0xf)
38
39 #define ST7789V_GCTRL_CMD               0xb7
40 #define ST7789V_GCTRL_VGHS(n)                   (((n) & 7) << 4)
41 #define ST7789V_GCTRL_VGLS(n)                   ((n) & 7)
42
43 #define ST7789V_VCOMS_CMD               0xbb
44
45 #define ST7789V_LCMCTRL_CMD             0xc0
46 #define ST7789V_LCMCTRL_XBGR                    BIT(5)
47 #define ST7789V_LCMCTRL_XMX                     BIT(3)
48 #define ST7789V_LCMCTRL_XMH                     BIT(2)
49
50 #define ST7789V_VDVVRHEN_CMD            0xc2
51 #define ST7789V_VDVVRHEN_CMDEN                  BIT(0)
52
53 #define ST7789V_VRHS_CMD                0xc3
54
55 #define ST7789V_VDVS_CMD                0xc4
56
57 #define ST7789V_FRCTRL2_CMD             0xc6
58
59 #define ST7789V_PWCTRL1_CMD             0xd0
60 #define ST7789V_PWCTRL1_MAGIC                   0xa4
61 #define ST7789V_PWCTRL1_AVDD(n)                 (((n) & 3) << 6)
62 #define ST7789V_PWCTRL1_AVCL(n)                 (((n) & 3) << 4)
63 #define ST7789V_PWCTRL1_VDS(n)                  ((n) & 3)
64
65 #define ST7789V_PVGAMCTRL_CMD           0xe0
66 #define ST7789V_PVGAMCTRL_JP0(n)                (((n) & 3) << 4)
67 #define ST7789V_PVGAMCTRL_JP1(n)                (((n) & 3) << 4)
68 #define ST7789V_PVGAMCTRL_VP0(n)                ((n) & 0xf)
69 #define ST7789V_PVGAMCTRL_VP1(n)                ((n) & 0x3f)
70 #define ST7789V_PVGAMCTRL_VP2(n)                ((n) & 0x3f)
71 #define ST7789V_PVGAMCTRL_VP4(n)                ((n) & 0x1f)
72 #define ST7789V_PVGAMCTRL_VP6(n)                ((n) & 0x1f)
73 #define ST7789V_PVGAMCTRL_VP13(n)               ((n) & 0xf)
74 #define ST7789V_PVGAMCTRL_VP20(n)               ((n) & 0x7f)
75 #define ST7789V_PVGAMCTRL_VP27(n)               ((n) & 7)
76 #define ST7789V_PVGAMCTRL_VP36(n)               (((n) & 7) << 4)
77 #define ST7789V_PVGAMCTRL_VP43(n)               ((n) & 0x7f)
78 #define ST7789V_PVGAMCTRL_VP50(n)               ((n) & 0xf)
79 #define ST7789V_PVGAMCTRL_VP57(n)               ((n) & 0x1f)
80 #define ST7789V_PVGAMCTRL_VP59(n)               ((n) & 0x1f)
81 #define ST7789V_PVGAMCTRL_VP61(n)               ((n) & 0x3f)
82 #define ST7789V_PVGAMCTRL_VP62(n)               ((n) & 0x3f)
83 #define ST7789V_PVGAMCTRL_VP63(n)               (((n) & 0xf) << 4)
84
85 #define ST7789V_NVGAMCTRL_CMD           0xe1
86 #define ST7789V_NVGAMCTRL_JN0(n)                (((n) & 3) << 4)
87 #define ST7789V_NVGAMCTRL_JN1(n)                (((n) & 3) << 4)
88 #define ST7789V_NVGAMCTRL_VN0(n)                ((n) & 0xf)
89 #define ST7789V_NVGAMCTRL_VN1(n)                ((n) & 0x3f)
90 #define ST7789V_NVGAMCTRL_VN2(n)                ((n) & 0x3f)
91 #define ST7789V_NVGAMCTRL_VN4(n)                ((n) & 0x1f)
92 #define ST7789V_NVGAMCTRL_VN6(n)                ((n) & 0x1f)
93 #define ST7789V_NVGAMCTRL_VN13(n)               ((n) & 0xf)
94 #define ST7789V_NVGAMCTRL_VN20(n)               ((n) & 0x7f)
95 #define ST7789V_NVGAMCTRL_VN27(n)               ((n) & 7)
96 #define ST7789V_NVGAMCTRL_VN36(n)               (((n) & 7) << 4)
97 #define ST7789V_NVGAMCTRL_VN43(n)               ((n) & 0x7f)
98 #define ST7789V_NVGAMCTRL_VN50(n)               ((n) & 0xf)
99 #define ST7789V_NVGAMCTRL_VN57(n)               ((n) & 0x1f)
100 #define ST7789V_NVGAMCTRL_VN59(n)               ((n) & 0x1f)
101 #define ST7789V_NVGAMCTRL_VN61(n)               ((n) & 0x3f)
102 #define ST7789V_NVGAMCTRL_VN62(n)               ((n) & 0x3f)
103 #define ST7789V_NVGAMCTRL_VN63(n)               (((n) & 0xf) << 4)
104
105 #define ST7789V_TEST(val, func)                 \
106         do {                                    \
107                 if ((val = (func)))             \
108                         return val;             \
109         } while (0)
110
111 struct st7789v {
112         struct drm_panel panel;
113         struct spi_device *spi;
114         struct gpio_desc *reset;
115         struct regulator *power;
116 };
117
118 enum st7789v_prefix {
119         ST7789V_COMMAND = 0,
120         ST7789V_DATA = 1,
121 };
122
123 static inline struct st7789v *panel_to_st7789v(struct drm_panel *panel)
124 {
125         return container_of(panel, struct st7789v, panel);
126 }
127
128 static int st7789v_spi_write(struct st7789v *ctx, enum st7789v_prefix prefix,
129                              u8 data)
130 {
131         struct spi_transfer xfer = { };
132         u16 txbuf = ((prefix & 1) << 8) | data;
133
134         xfer.tx_buf = &txbuf;
135         xfer.bits_per_word = 9;
136         xfer.len = sizeof(txbuf);
137
138         return spi_sync_transfer(ctx->spi, &xfer, 1);
139 }
140
141 static int st7789v_write_command(struct st7789v *ctx, u8 cmd)
142 {
143         return st7789v_spi_write(ctx, ST7789V_COMMAND, cmd);
144 }
145
146 static int st7789v_write_data(struct st7789v *ctx, u8 cmd)
147 {
148         return st7789v_spi_write(ctx, ST7789V_DATA, cmd);
149 }
150
151 static const struct drm_display_mode default_mode = {
152         .clock = 7000,
153         .hdisplay = 240,
154         .hsync_start = 240 + 38,
155         .hsync_end = 240 + 38 + 10,
156         .htotal = 240 + 38 + 10 + 10,
157         .vdisplay = 320,
158         .vsync_start = 320 + 8,
159         .vsync_end = 320 + 8 + 4,
160         .vtotal = 320 + 8 + 4 + 4,
161 };
162
163 static int st7789v_get_modes(struct drm_panel *panel,
164                              struct drm_connector *connector)
165 {
166         struct drm_display_mode *mode;
167
168         mode = drm_mode_duplicate(connector->dev, &default_mode);
169         if (!mode) {
170                 dev_err(panel->dev, "failed to add mode %ux%ux@%u\n",
171                         default_mode.hdisplay, default_mode.vdisplay,
172                         drm_mode_vrefresh(&default_mode));
173                 return -ENOMEM;
174         }
175
176         drm_mode_set_name(mode);
177
178         mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
179         drm_mode_probed_add(connector, mode);
180
181         connector->display_info.width_mm = 61;
182         connector->display_info.height_mm = 103;
183
184         return 1;
185 }
186
187 static int st7789v_prepare(struct drm_panel *panel)
188 {
189         struct st7789v *ctx = panel_to_st7789v(panel);
190         int ret;
191
192         ret = regulator_enable(ctx->power);
193         if (ret)
194                 return ret;
195
196         gpiod_set_value(ctx->reset, 1);
197         msleep(30);
198         gpiod_set_value(ctx->reset, 0);
199         msleep(120);
200
201         ST7789V_TEST(ret, st7789v_write_command(ctx, MIPI_DCS_EXIT_SLEEP_MODE));
202
203         /* We need to wait 120ms after a sleep out command */
204         msleep(120);
205
206         ST7789V_TEST(ret, st7789v_write_command(ctx,
207                                                 MIPI_DCS_SET_ADDRESS_MODE));
208         ST7789V_TEST(ret, st7789v_write_data(ctx, 0));
209
210         ST7789V_TEST(ret, st7789v_write_command(ctx,
211                                                 MIPI_DCS_SET_PIXEL_FORMAT));
212         ST7789V_TEST(ret, st7789v_write_data(ctx,
213                                              (MIPI_DCS_PIXEL_FMT_18BIT << 4) |
214                                              (MIPI_DCS_PIXEL_FMT_18BIT)));
215
216         ST7789V_TEST(ret, st7789v_write_command(ctx, ST7789V_PORCTRL_CMD));
217         ST7789V_TEST(ret, st7789v_write_data(ctx, 0xc));
218         ST7789V_TEST(ret, st7789v_write_data(ctx, 0xc));
219         ST7789V_TEST(ret, st7789v_write_data(ctx, 0));
220         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_PORCTRL_IDLE_BP(3) |
221                                              ST7789V_PORCTRL_IDLE_FP(3)));
222         ST7789V_TEST(ret, st7789v_write_data(ctx,
223                                              ST7789V_PORCTRL_PARTIAL_BP(3) |
224                                              ST7789V_PORCTRL_PARTIAL_FP(3)));
225
226         ST7789V_TEST(ret, st7789v_write_command(ctx, ST7789V_GCTRL_CMD));
227         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_GCTRL_VGLS(5) |
228                                              ST7789V_GCTRL_VGHS(3)));
229
230         ST7789V_TEST(ret, st7789v_write_command(ctx, ST7789V_VCOMS_CMD));
231         ST7789V_TEST(ret, st7789v_write_data(ctx, 0x2b));
232
233         ST7789V_TEST(ret, st7789v_write_command(ctx, ST7789V_LCMCTRL_CMD));
234         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_LCMCTRL_XMH |
235                                              ST7789V_LCMCTRL_XMX |
236                                              ST7789V_LCMCTRL_XBGR));
237
238         ST7789V_TEST(ret, st7789v_write_command(ctx, ST7789V_VDVVRHEN_CMD));
239         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_VDVVRHEN_CMDEN));
240
241         ST7789V_TEST(ret, st7789v_write_command(ctx, ST7789V_VRHS_CMD));
242         ST7789V_TEST(ret, st7789v_write_data(ctx, 0xf));
243
244         ST7789V_TEST(ret, st7789v_write_command(ctx, ST7789V_VDVS_CMD));
245         ST7789V_TEST(ret, st7789v_write_data(ctx, 0x20));
246
247         ST7789V_TEST(ret, st7789v_write_command(ctx, ST7789V_FRCTRL2_CMD));
248         ST7789V_TEST(ret, st7789v_write_data(ctx, 0xf));
249
250         ST7789V_TEST(ret, st7789v_write_command(ctx, ST7789V_PWCTRL1_CMD));
251         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_PWCTRL1_MAGIC));
252         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_PWCTRL1_AVDD(2) |
253                                              ST7789V_PWCTRL1_AVCL(2) |
254                                              ST7789V_PWCTRL1_VDS(1)));
255
256         ST7789V_TEST(ret, st7789v_write_command(ctx, ST7789V_PVGAMCTRL_CMD));
257         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_PVGAMCTRL_VP63(0xd)));
258         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_PVGAMCTRL_VP1(0xca)));
259         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_PVGAMCTRL_VP2(0xe)));
260         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_PVGAMCTRL_VP4(8)));
261         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_PVGAMCTRL_VP6(9)));
262         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_PVGAMCTRL_VP13(7)));
263         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_PVGAMCTRL_VP20(0x2d)));
264         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_PVGAMCTRL_VP27(0xb) |
265                                              ST7789V_PVGAMCTRL_VP36(3)));
266         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_PVGAMCTRL_VP43(0x3d)));
267         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_PVGAMCTRL_JP1(3) |
268                                              ST7789V_PVGAMCTRL_VP50(4)));
269         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_PVGAMCTRL_VP57(0xa)));
270         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_PVGAMCTRL_VP59(0xa)));
271         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_PVGAMCTRL_VP61(0x1b)));
272         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_PVGAMCTRL_VP62(0x28)));
273
274         ST7789V_TEST(ret, st7789v_write_command(ctx, ST7789V_NVGAMCTRL_CMD));
275         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_NVGAMCTRL_VN63(0xd)));
276         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_NVGAMCTRL_VN1(0xca)));
277         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_NVGAMCTRL_VN2(0xf)));
278         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_NVGAMCTRL_VN4(8)));
279         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_NVGAMCTRL_VN6(8)));
280         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_NVGAMCTRL_VN13(7)));
281         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_NVGAMCTRL_VN20(0x2e)));
282         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_NVGAMCTRL_VN27(0xc) |
283                                              ST7789V_NVGAMCTRL_VN36(5)));
284         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_NVGAMCTRL_VN43(0x40)));
285         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_NVGAMCTRL_JN1(3) |
286                                              ST7789V_NVGAMCTRL_VN50(4)));
287         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_NVGAMCTRL_VN57(9)));
288         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_NVGAMCTRL_VN59(0xb)));
289         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_NVGAMCTRL_VN61(0x1b)));
290         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_NVGAMCTRL_VN62(0x28)));
291
292         ST7789V_TEST(ret, st7789v_write_command(ctx, MIPI_DCS_ENTER_INVERT_MODE));
293
294         ST7789V_TEST(ret, st7789v_write_command(ctx, ST7789V_RAMCTRL_CMD));
295         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_RAMCTRL_DM_RGB |
296                                              ST7789V_RAMCTRL_RM_RGB));
297         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_RAMCTRL_EPF(3) |
298                                              ST7789V_RAMCTRL_MAGIC));
299
300         ST7789V_TEST(ret, st7789v_write_command(ctx, ST7789V_RGBCTRL_CMD));
301         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_RGBCTRL_WO |
302                                              ST7789V_RGBCTRL_RCM(2) |
303                                              ST7789V_RGBCTRL_VSYNC_HIGH |
304                                              ST7789V_RGBCTRL_HSYNC_HIGH |
305                                              ST7789V_RGBCTRL_PCLK_HIGH));
306         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_RGBCTRL_VBP(8)));
307         ST7789V_TEST(ret, st7789v_write_data(ctx, ST7789V_RGBCTRL_HBP(20)));
308
309         return 0;
310 }
311
312 static int st7789v_enable(struct drm_panel *panel)
313 {
314         struct st7789v *ctx = panel_to_st7789v(panel);
315
316         return st7789v_write_command(ctx, MIPI_DCS_SET_DISPLAY_ON);
317 }
318
319 static int st7789v_disable(struct drm_panel *panel)
320 {
321         struct st7789v *ctx = panel_to_st7789v(panel);
322         int ret;
323
324         ST7789V_TEST(ret, st7789v_write_command(ctx, MIPI_DCS_SET_DISPLAY_OFF));
325
326         return 0;
327 }
328
329 static int st7789v_unprepare(struct drm_panel *panel)
330 {
331         struct st7789v *ctx = panel_to_st7789v(panel);
332         int ret;
333
334         ST7789V_TEST(ret, st7789v_write_command(ctx, MIPI_DCS_ENTER_SLEEP_MODE));
335
336         regulator_disable(ctx->power);
337
338         return 0;
339 }
340
341 static const struct drm_panel_funcs st7789v_drm_funcs = {
342         .disable        = st7789v_disable,
343         .enable         = st7789v_enable,
344         .get_modes      = st7789v_get_modes,
345         .prepare        = st7789v_prepare,
346         .unprepare      = st7789v_unprepare,
347 };
348
349 static int st7789v_probe(struct spi_device *spi)
350 {
351         struct device *dev = &spi->dev;
352         struct st7789v *ctx;
353         int ret;
354
355         ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
356         if (!ctx)
357                 return -ENOMEM;
358
359         spi_set_drvdata(spi, ctx);
360         ctx->spi = spi;
361
362         drm_panel_init(&ctx->panel, dev, &st7789v_drm_funcs,
363                        DRM_MODE_CONNECTOR_DPI);
364
365         ctx->power = devm_regulator_get(dev, "power");
366         ret = PTR_ERR_OR_ZERO(ctx->power);
367         if (ret)
368                 return dev_err_probe(dev, ret, "Failed to get regulator\n");
369
370         ctx->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
371         ret = PTR_ERR_OR_ZERO(ctx->reset);
372         if (ret)
373                 return dev_err_probe(dev, ret, "Failed to get reset line\n");
374
375         ret = drm_panel_of_backlight(&ctx->panel);
376         if (ret)
377                 return dev_err_probe(dev, ret, "Failed to get backlight\n");
378
379         drm_panel_add(&ctx->panel);
380
381         return 0;
382 }
383
384 static void st7789v_remove(struct spi_device *spi)
385 {
386         struct st7789v *ctx = spi_get_drvdata(spi);
387
388         drm_panel_remove(&ctx->panel);
389 }
390
391 static const struct spi_device_id st7789v_spi_id[] = {
392         { "st7789v" },
393         { }
394 };
395 MODULE_DEVICE_TABLE(spi, st7789v_spi_id);
396
397 static const struct of_device_id st7789v_of_match[] = {
398         { .compatible = "sitronix,st7789v" },
399         { }
400 };
401 MODULE_DEVICE_TABLE(of, st7789v_of_match);
402
403 static struct spi_driver st7789v_driver = {
404         .probe = st7789v_probe,
405         .remove = st7789v_remove,
406         .id_table = st7789v_spi_id,
407         .driver = {
408                 .name = "st7789v",
409                 .of_match_table = st7789v_of_match,
410         },
411 };
412 module_spi_driver(st7789v_driver);
413
414 MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");
415 MODULE_DESCRIPTION("Sitronix st7789v LCD Driver");
416 MODULE_LICENSE("GPL v2");