]> Git Repo - linux.git/blob - drivers/gpu/drm/tinydrm/mipi-dbi.c
Merge remote-tracking branch 'asoc/topic/pcm512x' into asoc-next
[linux.git] / drivers / gpu / drm / tinydrm / mipi-dbi.c
1 /*
2  * MIPI Display Bus Interface (DBI) LCD controller support
3  *
4  * Copyright 2016 Noralf Trønnes
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  */
11
12 #include <drm/drm_gem_framebuffer_helper.h>
13 #include <drm/tinydrm/mipi-dbi.h>
14 #include <drm/tinydrm/tinydrm-helpers.h>
15 #include <linux/debugfs.h>
16 #include <linux/dma-buf.h>
17 #include <linux/gpio/consumer.h>
18 #include <linux/module.h>
19 #include <linux/regulator/consumer.h>
20 #include <linux/spi/spi.h>
21 #include <video/mipi_display.h>
22
23 #define MIPI_DBI_MAX_SPI_READ_SPEED 2000000 /* 2MHz */
24
25 #define DCS_POWER_MODE_DISPLAY                  BIT(2)
26 #define DCS_POWER_MODE_DISPLAY_NORMAL_MODE      BIT(3)
27 #define DCS_POWER_MODE_SLEEP_MODE               BIT(4)
28 #define DCS_POWER_MODE_PARTIAL_MODE             BIT(5)
29 #define DCS_POWER_MODE_IDLE_MODE                BIT(6)
30 #define DCS_POWER_MODE_RESERVED_MASK            (BIT(0) | BIT(1) | BIT(7))
31
32 /**
33  * DOC: overview
34  *
35  * This library provides helpers for MIPI Display Bus Interface (DBI)
36  * compatible display controllers.
37  *
38  * Many controllers for tiny lcd displays are MIPI compliant and can use this
39  * library. If a controller uses registers 0x2A and 0x2B to set the area to
40  * update and uses register 0x2C to write to frame memory, it is most likely
41  * MIPI compliant.
42  *
43  * Only MIPI Type 1 displays are supported since a full frame memory is needed.
44  *
45  * There are 3 MIPI DBI implementation types:
46  *
47  * A. Motorola 6800 type parallel bus
48  *
49  * B. Intel 8080 type parallel bus
50  *
51  * C. SPI type with 3 options:
52  *
53  *    1. 9-bit with the Data/Command signal as the ninth bit
54  *    2. Same as above except it's sent as 16 bits
55  *    3. 8-bit with the Data/Command signal as a separate D/CX pin
56  *
57  * Currently mipi_dbi only supports Type C options 1 and 3 with
58  * mipi_dbi_spi_init().
59  */
60
61 #define MIPI_DBI_DEBUG_COMMAND(cmd, data, len) \
62 ({ \
63         if (!len) \
64                 DRM_DEBUG_DRIVER("cmd=%02x\n", cmd); \
65         else if (len <= 32) \
66                 DRM_DEBUG_DRIVER("cmd=%02x, par=%*ph\n", cmd, (int)len, data);\
67         else \
68                 DRM_DEBUG_DRIVER("cmd=%02x, len=%zu\n", cmd, len); \
69 })
70
71 static const u8 mipi_dbi_dcs_read_commands[] = {
72         MIPI_DCS_GET_DISPLAY_ID,
73         MIPI_DCS_GET_RED_CHANNEL,
74         MIPI_DCS_GET_GREEN_CHANNEL,
75         MIPI_DCS_GET_BLUE_CHANNEL,
76         MIPI_DCS_GET_DISPLAY_STATUS,
77         MIPI_DCS_GET_POWER_MODE,
78         MIPI_DCS_GET_ADDRESS_MODE,
79         MIPI_DCS_GET_PIXEL_FORMAT,
80         MIPI_DCS_GET_DISPLAY_MODE,
81         MIPI_DCS_GET_SIGNAL_MODE,
82         MIPI_DCS_GET_DIAGNOSTIC_RESULT,
83         MIPI_DCS_READ_MEMORY_START,
84         MIPI_DCS_READ_MEMORY_CONTINUE,
85         MIPI_DCS_GET_SCANLINE,
86         MIPI_DCS_GET_DISPLAY_BRIGHTNESS,
87         MIPI_DCS_GET_CONTROL_DISPLAY,
88         MIPI_DCS_GET_POWER_SAVE,
89         MIPI_DCS_GET_CABC_MIN_BRIGHTNESS,
90         MIPI_DCS_READ_DDB_START,
91         MIPI_DCS_READ_DDB_CONTINUE,
92         0, /* sentinel */
93 };
94
95 static bool mipi_dbi_command_is_read(struct mipi_dbi *mipi, u8 cmd)
96 {
97         unsigned int i;
98
99         if (!mipi->read_commands)
100                 return false;
101
102         for (i = 0; i < 0xff; i++) {
103                 if (!mipi->read_commands[i])
104                         return false;
105                 if (cmd == mipi->read_commands[i])
106                         return true;
107         }
108
109         return false;
110 }
111
112 /**
113  * mipi_dbi_command_read - MIPI DCS read command
114  * @mipi: MIPI structure
115  * @cmd: Command
116  * @val: Value read
117  *
118  * Send MIPI DCS read command to the controller.
119  *
120  * Returns:
121  * Zero on success, negative error code on failure.
122  */
123 int mipi_dbi_command_read(struct mipi_dbi *mipi, u8 cmd, u8 *val)
124 {
125         if (!mipi->read_commands)
126                 return -EACCES;
127
128         if (!mipi_dbi_command_is_read(mipi, cmd))
129                 return -EINVAL;
130
131         return mipi_dbi_command_buf(mipi, cmd, val, 1);
132 }
133 EXPORT_SYMBOL(mipi_dbi_command_read);
134
135 /**
136  * mipi_dbi_command_buf - MIPI DCS command with parameter(s) in an array
137  * @mipi: MIPI structure
138  * @cmd: Command
139  * @data: Parameter buffer
140  * @len: Buffer length
141  *
142  * Returns:
143  * Zero on success, negative error code on failure.
144  */
145 int mipi_dbi_command_buf(struct mipi_dbi *mipi, u8 cmd, u8 *data, size_t len)
146 {
147         int ret;
148
149         mutex_lock(&mipi->cmdlock);
150         ret = mipi->command(mipi, cmd, data, len);
151         mutex_unlock(&mipi->cmdlock);
152
153         return ret;
154 }
155 EXPORT_SYMBOL(mipi_dbi_command_buf);
156
157 static int mipi_dbi_buf_copy(void *dst, struct drm_framebuffer *fb,
158                                 struct drm_clip_rect *clip, bool swap)
159 {
160         struct drm_gem_cma_object *cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
161         struct dma_buf_attachment *import_attach = cma_obj->base.import_attach;
162         struct drm_format_name_buf format_name;
163         void *src = cma_obj->vaddr;
164         int ret = 0;
165
166         if (import_attach) {
167                 ret = dma_buf_begin_cpu_access(import_attach->dmabuf,
168                                                DMA_FROM_DEVICE);
169                 if (ret)
170                         return ret;
171         }
172
173         switch (fb->format->format) {
174         case DRM_FORMAT_RGB565:
175                 if (swap)
176                         tinydrm_swab16(dst, src, fb, clip);
177                 else
178                         tinydrm_memcpy(dst, src, fb, clip);
179                 break;
180         case DRM_FORMAT_XRGB8888:
181                 tinydrm_xrgb8888_to_rgb565(dst, src, fb, clip, swap);
182                 break;
183         default:
184                 dev_err_once(fb->dev->dev, "Format is not supported: %s\n",
185                              drm_get_format_name(fb->format->format,
186                                                  &format_name));
187                 return -EINVAL;
188         }
189
190         if (import_attach)
191                 ret = dma_buf_end_cpu_access(import_attach->dmabuf,
192                                              DMA_FROM_DEVICE);
193         return ret;
194 }
195
196 static int mipi_dbi_fb_dirty(struct drm_framebuffer *fb,
197                              struct drm_file *file_priv,
198                              unsigned int flags, unsigned int color,
199                              struct drm_clip_rect *clips,
200                              unsigned int num_clips)
201 {
202         struct drm_gem_cma_object *cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
203         struct tinydrm_device *tdev = fb->dev->dev_private;
204         struct mipi_dbi *mipi = mipi_dbi_from_tinydrm(tdev);
205         bool swap = mipi->swap_bytes;
206         struct drm_clip_rect clip;
207         int ret = 0;
208         bool full;
209         void *tr;
210
211         mutex_lock(&tdev->dirty_lock);
212
213         if (!mipi->enabled)
214                 goto out_unlock;
215
216         /* fbdev can flush even when we're not interested */
217         if (tdev->pipe.plane.fb != fb)
218                 goto out_unlock;
219
220         full = tinydrm_merge_clips(&clip, clips, num_clips, flags,
221                                    fb->width, fb->height);
222
223         DRM_DEBUG("Flushing [FB:%d] x1=%u, x2=%u, y1=%u, y2=%u\n", fb->base.id,
224                   clip.x1, clip.x2, clip.y1, clip.y2);
225
226         if (!mipi->dc || !full || swap ||
227             fb->format->format == DRM_FORMAT_XRGB8888) {
228                 tr = mipi->tx_buf;
229                 ret = mipi_dbi_buf_copy(mipi->tx_buf, fb, &clip, swap);
230                 if (ret)
231                         goto out_unlock;
232         } else {
233                 tr = cma_obj->vaddr;
234         }
235
236         mipi_dbi_command(mipi, MIPI_DCS_SET_COLUMN_ADDRESS,
237                          (clip.x1 >> 8) & 0xFF, clip.x1 & 0xFF,
238                          (clip.x2 >> 8) & 0xFF, (clip.x2 - 1) & 0xFF);
239         mipi_dbi_command(mipi, MIPI_DCS_SET_PAGE_ADDRESS,
240                          (clip.y1 >> 8) & 0xFF, clip.y1 & 0xFF,
241                          (clip.y2 >> 8) & 0xFF, (clip.y2 - 1) & 0xFF);
242
243         ret = mipi_dbi_command_buf(mipi, MIPI_DCS_WRITE_MEMORY_START, tr,
244                                 (clip.x2 - clip.x1) * (clip.y2 - clip.y1) * 2);
245
246 out_unlock:
247         mutex_unlock(&tdev->dirty_lock);
248
249         if (ret)
250                 dev_err_once(fb->dev->dev, "Failed to update display %d\n",
251                              ret);
252
253         return ret;
254 }
255
256 static const struct drm_framebuffer_funcs mipi_dbi_fb_funcs = {
257         .destroy        = drm_gem_fb_destroy,
258         .create_handle  = drm_gem_fb_create_handle,
259         .dirty          = mipi_dbi_fb_dirty,
260 };
261
262 /**
263  * mipi_dbi_pipe_enable - MIPI DBI pipe enable helper
264  * @pipe: Display pipe
265  * @crtc_state: CRTC state
266  *
267  * This function enables backlight. Drivers can use this as their
268  * &drm_simple_display_pipe_funcs->enable callback.
269  */
270 void mipi_dbi_pipe_enable(struct drm_simple_display_pipe *pipe,
271                           struct drm_crtc_state *crtc_state)
272 {
273         struct tinydrm_device *tdev = pipe_to_tinydrm(pipe);
274         struct mipi_dbi *mipi = mipi_dbi_from_tinydrm(tdev);
275         struct drm_framebuffer *fb = pipe->plane.fb;
276
277         DRM_DEBUG_KMS("\n");
278
279         mipi->enabled = true;
280         if (fb)
281                 fb->funcs->dirty(fb, NULL, 0, 0, NULL, 0);
282
283         tinydrm_enable_backlight(mipi->backlight);
284 }
285 EXPORT_SYMBOL(mipi_dbi_pipe_enable);
286
287 static void mipi_dbi_blank(struct mipi_dbi *mipi)
288 {
289         struct drm_device *drm = mipi->tinydrm.drm;
290         u16 height = drm->mode_config.min_height;
291         u16 width = drm->mode_config.min_width;
292         size_t len = width * height * 2;
293
294         memset(mipi->tx_buf, 0, len);
295
296         mipi_dbi_command(mipi, MIPI_DCS_SET_COLUMN_ADDRESS, 0, 0,
297                          (width >> 8) & 0xFF, (width - 1) & 0xFF);
298         mipi_dbi_command(mipi, MIPI_DCS_SET_PAGE_ADDRESS, 0, 0,
299                          (height >> 8) & 0xFF, (height - 1) & 0xFF);
300         mipi_dbi_command_buf(mipi, MIPI_DCS_WRITE_MEMORY_START,
301                              (u8 *)mipi->tx_buf, len);
302 }
303
304 /**
305  * mipi_dbi_pipe_disable - MIPI DBI pipe disable helper
306  * @pipe: Display pipe
307  *
308  * This function disables backlight if present or if not the
309  * display memory is blanked. Drivers can use this as their
310  * &drm_simple_display_pipe_funcs->disable callback.
311  */
312 void mipi_dbi_pipe_disable(struct drm_simple_display_pipe *pipe)
313 {
314         struct tinydrm_device *tdev = pipe_to_tinydrm(pipe);
315         struct mipi_dbi *mipi = mipi_dbi_from_tinydrm(tdev);
316
317         DRM_DEBUG_KMS("\n");
318
319         mipi->enabled = false;
320
321         if (mipi->backlight)
322                 tinydrm_disable_backlight(mipi->backlight);
323         else
324                 mipi_dbi_blank(mipi);
325 }
326 EXPORT_SYMBOL(mipi_dbi_pipe_disable);
327
328 static const uint32_t mipi_dbi_formats[] = {
329         DRM_FORMAT_RGB565,
330         DRM_FORMAT_XRGB8888,
331 };
332
333 /**
334  * mipi_dbi_init - MIPI DBI initialization
335  * @dev: Parent device
336  * @mipi: &mipi_dbi structure to initialize
337  * @pipe_funcs: Display pipe functions
338  * @driver: DRM driver
339  * @mode: Display mode
340  * @rotation: Initial rotation in degrees Counter Clock Wise
341  *
342  * This function initializes a &mipi_dbi structure and it's underlying
343  * @tinydrm_device. It also sets up the display pipeline.
344  *
345  * Supported formats: Native RGB565 and emulated XRGB8888.
346  *
347  * Objects created by this function will be automatically freed on driver
348  * detach (devres).
349  *
350  * Returns:
351  * Zero on success, negative error code on failure.
352  */
353 int mipi_dbi_init(struct device *dev, struct mipi_dbi *mipi,
354                   const struct drm_simple_display_pipe_funcs *pipe_funcs,
355                   struct drm_driver *driver,
356                   const struct drm_display_mode *mode, unsigned int rotation)
357 {
358         size_t bufsize = mode->vdisplay * mode->hdisplay * sizeof(u16);
359         struct tinydrm_device *tdev = &mipi->tinydrm;
360         int ret;
361
362         if (!mipi->command)
363                 return -EINVAL;
364
365         mutex_init(&mipi->cmdlock);
366
367         mipi->tx_buf = devm_kmalloc(dev, bufsize, GFP_KERNEL);
368         if (!mipi->tx_buf)
369                 return -ENOMEM;
370
371         ret = devm_tinydrm_init(dev, tdev, &mipi_dbi_fb_funcs, driver);
372         if (ret)
373                 return ret;
374
375         /* TODO: Maybe add DRM_MODE_CONNECTOR_SPI */
376         ret = tinydrm_display_pipe_init(tdev, pipe_funcs,
377                                         DRM_MODE_CONNECTOR_VIRTUAL,
378                                         mipi_dbi_formats,
379                                         ARRAY_SIZE(mipi_dbi_formats), mode,
380                                         rotation);
381         if (ret)
382                 return ret;
383
384         tdev->drm->mode_config.preferred_depth = 16;
385         mipi->rotation = rotation;
386
387         drm_mode_config_reset(tdev->drm);
388
389         DRM_DEBUG_KMS("preferred_depth=%u, rotation = %u\n",
390                       tdev->drm->mode_config.preferred_depth, rotation);
391
392         return 0;
393 }
394 EXPORT_SYMBOL(mipi_dbi_init);
395
396 /**
397  * mipi_dbi_hw_reset - Hardware reset of controller
398  * @mipi: MIPI DBI structure
399  *
400  * Reset controller if the &mipi_dbi->reset gpio is set.
401  */
402 void mipi_dbi_hw_reset(struct mipi_dbi *mipi)
403 {
404         if (!mipi->reset)
405                 return;
406
407         gpiod_set_value_cansleep(mipi->reset, 0);
408         msleep(20);
409         gpiod_set_value_cansleep(mipi->reset, 1);
410         msleep(120);
411 }
412 EXPORT_SYMBOL(mipi_dbi_hw_reset);
413
414 /**
415  * mipi_dbi_display_is_on - Check if display is on
416  * @mipi: MIPI DBI structure
417  *
418  * This function checks the Power Mode register (if readable) to see if
419  * display output is turned on. This can be used to see if the bootloader
420  * has already turned on the display avoiding flicker when the pipeline is
421  * enabled.
422  *
423  * Returns:
424  * true if the display can be verified to be on, false otherwise.
425  */
426 bool mipi_dbi_display_is_on(struct mipi_dbi *mipi)
427 {
428         u8 val;
429
430         if (mipi_dbi_command_read(mipi, MIPI_DCS_GET_POWER_MODE, &val))
431                 return false;
432
433         val &= ~DCS_POWER_MODE_RESERVED_MASK;
434
435         if (val != (DCS_POWER_MODE_DISPLAY |
436             DCS_POWER_MODE_DISPLAY_NORMAL_MODE | DCS_POWER_MODE_SLEEP_MODE))
437                 return false;
438
439         DRM_DEBUG_DRIVER("Display is ON\n");
440
441         return true;
442 }
443 EXPORT_SYMBOL(mipi_dbi_display_is_on);
444
445 #if IS_ENABLED(CONFIG_SPI)
446
447 /*
448  * Many controllers have a max speed of 10MHz, but can be pushed way beyond
449  * that. Increase reliability by running pixel data at max speed and the rest
450  * at 10MHz, preventing transfer glitches from messing up the init settings.
451  */
452 static u32 mipi_dbi_spi_cmd_max_speed(struct spi_device *spi, size_t len)
453 {
454         if (len > 64)
455                 return 0; /* use default */
456
457         return min_t(u32, 10000000, spi->max_speed_hz);
458 }
459
460 /*
461  * MIPI DBI Type C Option 1
462  *
463  * If the SPI controller doesn't have 9 bits per word support,
464  * use blocks of 9 bytes to send 8x 9-bit words using a 8-bit SPI transfer.
465  * Pad partial blocks with MIPI_DCS_NOP (zero).
466  * This is how the D/C bit (x) is added:
467  *     x7654321
468  *     0x765432
469  *     10x76543
470  *     210x7654
471  *     3210x765
472  *     43210x76
473  *     543210x7
474  *     6543210x
475  *     76543210
476  */
477
478 static int mipi_dbi_spi1e_transfer(struct mipi_dbi *mipi, int dc,
479                                    const void *buf, size_t len,
480                                    unsigned int bpw)
481 {
482         bool swap_bytes = (bpw == 16 && tinydrm_machine_little_endian());
483         size_t chunk, max_chunk = mipi->tx_buf9_len;
484         struct spi_device *spi = mipi->spi;
485         struct spi_transfer tr = {
486                 .tx_buf = mipi->tx_buf9,
487                 .bits_per_word = 8,
488         };
489         struct spi_message m;
490         const u8 *src = buf;
491         int i, ret;
492         u8 *dst;
493
494         if (drm_debug & DRM_UT_DRIVER)
495                 pr_debug("[drm:%s] dc=%d, max_chunk=%zu, transfers:\n",
496                          __func__, dc, max_chunk);
497
498         tr.speed_hz = mipi_dbi_spi_cmd_max_speed(spi, len);
499         spi_message_init_with_transfers(&m, &tr, 1);
500
501         if (!dc) {
502                 if (WARN_ON_ONCE(len != 1))
503                         return -EINVAL;
504
505                 /* Command: pad no-op's (zeroes) at beginning of block */
506                 dst = mipi->tx_buf9;
507                 memset(dst, 0, 9);
508                 dst[8] = *src;
509                 tr.len = 9;
510
511                 tinydrm_dbg_spi_message(spi, &m);
512
513                 return spi_sync(spi, &m);
514         }
515
516         /* max with room for adding one bit per byte */
517         max_chunk = max_chunk / 9 * 8;
518         /* but no bigger than len */
519         max_chunk = min(max_chunk, len);
520         /* 8 byte blocks */
521         max_chunk = max_t(size_t, 8, max_chunk & ~0x7);
522
523         while (len) {
524                 size_t added = 0;
525
526                 chunk = min(len, max_chunk);
527                 len -= chunk;
528                 dst = mipi->tx_buf9;
529
530                 if (chunk < 8) {
531                         u8 val, carry = 0;
532
533                         /* Data: pad no-op's (zeroes) at end of block */
534                         memset(dst, 0, 9);
535
536                         if (swap_bytes) {
537                                 for (i = 1; i < (chunk + 1); i++) {
538                                         val = src[1];
539                                         *dst++ = carry | BIT(8 - i) | (val >> i);
540                                         carry = val << (8 - i);
541                                         i++;
542                                         val = src[0];
543                                         *dst++ = carry | BIT(8 - i) | (val >> i);
544                                         carry = val << (8 - i);
545                                         src += 2;
546                                 }
547                                 *dst++ = carry;
548                         } else {
549                                 for (i = 1; i < (chunk + 1); i++) {
550                                         val = *src++;
551                                         *dst++ = carry | BIT(8 - i) | (val >> i);
552                                         carry = val << (8 - i);
553                                 }
554                                 *dst++ = carry;
555                         }
556
557                         chunk = 8;
558                         added = 1;
559                 } else {
560                         for (i = 0; i < chunk; i += 8) {
561                                 if (swap_bytes) {
562                                         *dst++ =                 BIT(7) | (src[1] >> 1);
563                                         *dst++ = (src[1] << 7) | BIT(6) | (src[0] >> 2);
564                                         *dst++ = (src[0] << 6) | BIT(5) | (src[3] >> 3);
565                                         *dst++ = (src[3] << 5) | BIT(4) | (src[2] >> 4);
566                                         *dst++ = (src[2] << 4) | BIT(3) | (src[5] >> 5);
567                                         *dst++ = (src[5] << 3) | BIT(2) | (src[4] >> 6);
568                                         *dst++ = (src[4] << 2) | BIT(1) | (src[7] >> 7);
569                                         *dst++ = (src[7] << 1) | BIT(0);
570                                         *dst++ = src[6];
571                                 } else {
572                                         *dst++ =                 BIT(7) | (src[0] >> 1);
573                                         *dst++ = (src[0] << 7) | BIT(6) | (src[1] >> 2);
574                                         *dst++ = (src[1] << 6) | BIT(5) | (src[2] >> 3);
575                                         *dst++ = (src[2] << 5) | BIT(4) | (src[3] >> 4);
576                                         *dst++ = (src[3] << 4) | BIT(3) | (src[4] >> 5);
577                                         *dst++ = (src[4] << 3) | BIT(2) | (src[5] >> 6);
578                                         *dst++ = (src[5] << 2) | BIT(1) | (src[6] >> 7);
579                                         *dst++ = (src[6] << 1) | BIT(0);
580                                         *dst++ = src[7];
581                                 }
582
583                                 src += 8;
584                                 added++;
585                         }
586                 }
587
588                 tr.len = chunk + added;
589
590                 tinydrm_dbg_spi_message(spi, &m);
591                 ret = spi_sync(spi, &m);
592                 if (ret)
593                         return ret;
594         }
595
596         return 0;
597 }
598
599 static int mipi_dbi_spi1_transfer(struct mipi_dbi *mipi, int dc,
600                                   const void *buf, size_t len,
601                                   unsigned int bpw)
602 {
603         struct spi_device *spi = mipi->spi;
604         struct spi_transfer tr = {
605                 .bits_per_word = 9,
606         };
607         const u16 *src16 = buf;
608         const u8 *src8 = buf;
609         struct spi_message m;
610         size_t max_chunk;
611         u16 *dst16;
612         int ret;
613
614         if (!tinydrm_spi_bpw_supported(spi, 9))
615                 return mipi_dbi_spi1e_transfer(mipi, dc, buf, len, bpw);
616
617         tr.speed_hz = mipi_dbi_spi_cmd_max_speed(spi, len);
618         max_chunk = mipi->tx_buf9_len;
619         dst16 = mipi->tx_buf9;
620
621         if (drm_debug & DRM_UT_DRIVER)
622                 pr_debug("[drm:%s] dc=%d, max_chunk=%zu, transfers:\n",
623                          __func__, dc, max_chunk);
624
625         max_chunk = min(max_chunk / 2, len);
626
627         spi_message_init_with_transfers(&m, &tr, 1);
628         tr.tx_buf = dst16;
629
630         while (len) {
631                 size_t chunk = min(len, max_chunk);
632                 unsigned int i;
633
634                 if (bpw == 16 && tinydrm_machine_little_endian()) {
635                         for (i = 0; i < (chunk * 2); i += 2) {
636                                 dst16[i]     = *src16 >> 8;
637                                 dst16[i + 1] = *src16++ & 0xFF;
638                                 if (dc) {
639                                         dst16[i]     |= 0x0100;
640                                         dst16[i + 1] |= 0x0100;
641                                 }
642                         }
643                 } else {
644                         for (i = 0; i < chunk; i++) {
645                                 dst16[i] = *src8++;
646                                 if (dc)
647                                         dst16[i] |= 0x0100;
648                         }
649                 }
650
651                 tr.len = chunk;
652                 len -= chunk;
653
654                 tinydrm_dbg_spi_message(spi, &m);
655                 ret = spi_sync(spi, &m);
656                 if (ret)
657                         return ret;
658         }
659
660         return 0;
661 }
662
663 static int mipi_dbi_typec1_command(struct mipi_dbi *mipi, u8 cmd,
664                                    u8 *parameters, size_t num)
665 {
666         unsigned int bpw = (cmd == MIPI_DCS_WRITE_MEMORY_START) ? 16 : 8;
667         int ret;
668
669         if (mipi_dbi_command_is_read(mipi, cmd))
670                 return -ENOTSUPP;
671
672         MIPI_DBI_DEBUG_COMMAND(cmd, parameters, num);
673
674         ret = mipi_dbi_spi1_transfer(mipi, 0, &cmd, 1, 8);
675         if (ret || !num)
676                 return ret;
677
678         return mipi_dbi_spi1_transfer(mipi, 1, parameters, num, bpw);
679 }
680
681 /* MIPI DBI Type C Option 3 */
682
683 static int mipi_dbi_typec3_command_read(struct mipi_dbi *mipi, u8 cmd,
684                                         u8 *data, size_t len)
685 {
686         struct spi_device *spi = mipi->spi;
687         u32 speed_hz = min_t(u32, MIPI_DBI_MAX_SPI_READ_SPEED,
688                              spi->max_speed_hz / 2);
689         struct spi_transfer tr[2] = {
690                 {
691                         .speed_hz = speed_hz,
692                         .tx_buf = &cmd,
693                         .len = 1,
694                 }, {
695                         .speed_hz = speed_hz,
696                         .len = len,
697                 },
698         };
699         struct spi_message m;
700         u8 *buf;
701         int ret;
702
703         if (!len)
704                 return -EINVAL;
705
706         /*
707          * Support non-standard 24-bit and 32-bit Nokia read commands which
708          * start with a dummy clock, so we need to read an extra byte.
709          */
710         if (cmd == MIPI_DCS_GET_DISPLAY_ID ||
711             cmd == MIPI_DCS_GET_DISPLAY_STATUS) {
712                 if (!(len == 3 || len == 4))
713                         return -EINVAL;
714
715                 tr[1].len = len + 1;
716         }
717
718         buf = kmalloc(tr[1].len, GFP_KERNEL);
719         if (!buf)
720                 return -ENOMEM;
721
722         tr[1].rx_buf = buf;
723         gpiod_set_value_cansleep(mipi->dc, 0);
724
725         spi_message_init_with_transfers(&m, tr, ARRAY_SIZE(tr));
726         ret = spi_sync(spi, &m);
727         if (ret)
728                 goto err_free;
729
730         tinydrm_dbg_spi_message(spi, &m);
731
732         if (tr[1].len == len) {
733                 memcpy(data, buf, len);
734         } else {
735                 unsigned int i;
736
737                 for (i = 0; i < len; i++)
738                         data[i] = (buf[i] << 1) | !!(buf[i + 1] & BIT(7));
739         }
740
741         MIPI_DBI_DEBUG_COMMAND(cmd, data, len);
742
743 err_free:
744         kfree(buf);
745
746         return ret;
747 }
748
749 static int mipi_dbi_typec3_command(struct mipi_dbi *mipi, u8 cmd,
750                                    u8 *par, size_t num)
751 {
752         struct spi_device *spi = mipi->spi;
753         unsigned int bpw = 8;
754         u32 speed_hz;
755         int ret;
756
757         if (mipi_dbi_command_is_read(mipi, cmd))
758                 return mipi_dbi_typec3_command_read(mipi, cmd, par, num);
759
760         MIPI_DBI_DEBUG_COMMAND(cmd, par, num);
761
762         gpiod_set_value_cansleep(mipi->dc, 0);
763         speed_hz = mipi_dbi_spi_cmd_max_speed(spi, 1);
764         ret = tinydrm_spi_transfer(spi, speed_hz, NULL, 8, &cmd, 1);
765         if (ret || !num)
766                 return ret;
767
768         if (cmd == MIPI_DCS_WRITE_MEMORY_START && !mipi->swap_bytes)
769                 bpw = 16;
770
771         gpiod_set_value_cansleep(mipi->dc, 1);
772         speed_hz = mipi_dbi_spi_cmd_max_speed(spi, num);
773
774         return tinydrm_spi_transfer(spi, speed_hz, NULL, bpw, par, num);
775 }
776
777 /**
778  * mipi_dbi_spi_init - Initialize MIPI DBI SPI interfaced controller
779  * @spi: SPI device
780  * @mipi: &mipi_dbi structure to initialize
781  * @dc: D/C gpio (optional)
782  *
783  * This function sets &mipi_dbi->command, enables &mipi->read_commands for the
784  * usual read commands. It should be followed by a call to mipi_dbi_init() or
785  * a driver-specific init.
786  *
787  * If @dc is set, a Type C Option 3 interface is assumed, if not
788  * Type C Option 1.
789  *
790  * If the SPI master driver doesn't support the necessary bits per word,
791  * the following transformation is used:
792  *
793  * - 9-bit: reorder buffer as 9x 8-bit words, padded with no-op command.
794  * - 16-bit: if big endian send as 8-bit, if little endian swap bytes
795  *
796  * Returns:
797  * Zero on success, negative error code on failure.
798  */
799 int mipi_dbi_spi_init(struct spi_device *spi, struct mipi_dbi *mipi,
800                       struct gpio_desc *dc)
801 {
802         size_t tx_size = tinydrm_spi_max_transfer_size(spi, 0);
803         struct device *dev = &spi->dev;
804         int ret;
805
806         if (tx_size < 16) {
807                 DRM_ERROR("SPI transmit buffer too small: %zu\n", tx_size);
808                 return -EINVAL;
809         }
810
811         /*
812          * Even though it's not the SPI device that does DMA (the master does),
813          * the dma mask is necessary for the dma_alloc_wc() in
814          * drm_gem_cma_create(). The dma_addr returned will be a physical
815          * adddress which might be different from the bus address, but this is
816          * not a problem since the address will not be used.
817          * The virtual address is used in the transfer and the SPI core
818          * re-maps it on the SPI master device using the DMA streaming API
819          * (spi_map_buf()).
820          */
821         if (!dev->coherent_dma_mask) {
822                 ret = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(32));
823                 if (ret) {
824                         dev_warn(dev, "Failed to set dma mask %d\n", ret);
825                         return ret;
826                 }
827         }
828
829         mipi->spi = spi;
830         mipi->read_commands = mipi_dbi_dcs_read_commands;
831
832         if (dc) {
833                 mipi->command = mipi_dbi_typec3_command;
834                 mipi->dc = dc;
835                 if (tinydrm_machine_little_endian() &&
836                     !tinydrm_spi_bpw_supported(spi, 16))
837                         mipi->swap_bytes = true;
838         } else {
839                 mipi->command = mipi_dbi_typec1_command;
840                 mipi->tx_buf9_len = tx_size;
841                 mipi->tx_buf9 = devm_kmalloc(dev, tx_size, GFP_KERNEL);
842                 if (!mipi->tx_buf9)
843                         return -ENOMEM;
844         }
845
846         DRM_DEBUG_DRIVER("SPI speed: %uMHz\n", spi->max_speed_hz / 1000000);
847
848         return 0;
849 }
850 EXPORT_SYMBOL(mipi_dbi_spi_init);
851
852 #endif /* CONFIG_SPI */
853
854 #ifdef CONFIG_DEBUG_FS
855
856 static ssize_t mipi_dbi_debugfs_command_write(struct file *file,
857                                               const char __user *ubuf,
858                                               size_t count, loff_t *ppos)
859 {
860         struct seq_file *m = file->private_data;
861         struct mipi_dbi *mipi = m->private;
862         u8 val, cmd = 0, parameters[64];
863         char *buf, *pos, *token;
864         unsigned int i;
865         int ret;
866
867         buf = memdup_user_nul(ubuf, count);
868         if (IS_ERR(buf))
869                 return PTR_ERR(buf);
870
871         /* strip trailing whitespace */
872         for (i = count - 1; i > 0; i--)
873                 if (isspace(buf[i]))
874                         buf[i] = '\0';
875                 else
876                         break;
877         i = 0;
878         pos = buf;
879         while (pos) {
880                 token = strsep(&pos, " ");
881                 if (!token) {
882                         ret = -EINVAL;
883                         goto err_free;
884                 }
885
886                 ret = kstrtou8(token, 16, &val);
887                 if (ret < 0)
888                         goto err_free;
889
890                 if (token == buf)
891                         cmd = val;
892                 else
893                         parameters[i++] = val;
894
895                 if (i == 64) {
896                         ret = -E2BIG;
897                         goto err_free;
898                 }
899         }
900
901         ret = mipi_dbi_command_buf(mipi, cmd, parameters, i);
902
903 err_free:
904         kfree(buf);
905
906         return ret < 0 ? ret : count;
907 }
908
909 static int mipi_dbi_debugfs_command_show(struct seq_file *m, void *unused)
910 {
911         struct mipi_dbi *mipi = m->private;
912         u8 cmd, val[4];
913         size_t len;
914         int ret;
915
916         for (cmd = 0; cmd < 255; cmd++) {
917                 if (!mipi_dbi_command_is_read(mipi, cmd))
918                         continue;
919
920                 switch (cmd) {
921                 case MIPI_DCS_READ_MEMORY_START:
922                 case MIPI_DCS_READ_MEMORY_CONTINUE:
923                         len = 2;
924                         break;
925                 case MIPI_DCS_GET_DISPLAY_ID:
926                         len = 3;
927                         break;
928                 case MIPI_DCS_GET_DISPLAY_STATUS:
929                         len = 4;
930                         break;
931                 default:
932                         len = 1;
933                         break;
934                 }
935
936                 seq_printf(m, "%02x: ", cmd);
937                 ret = mipi_dbi_command_buf(mipi, cmd, val, len);
938                 if (ret) {
939                         seq_puts(m, "XX\n");
940                         continue;
941                 }
942                 seq_printf(m, "%*phN\n", (int)len, val);
943         }
944
945         return 0;
946 }
947
948 static int mipi_dbi_debugfs_command_open(struct inode *inode,
949                                          struct file *file)
950 {
951         return single_open(file, mipi_dbi_debugfs_command_show,
952                            inode->i_private);
953 }
954
955 static const struct file_operations mipi_dbi_debugfs_command_fops = {
956         .owner = THIS_MODULE,
957         .open = mipi_dbi_debugfs_command_open,
958         .read = seq_read,
959         .llseek = seq_lseek,
960         .release = single_release,
961         .write = mipi_dbi_debugfs_command_write,
962 };
963
964 static const struct drm_info_list mipi_dbi_debugfs_list[] = {
965         { "fb",   drm_fb_cma_debugfs_show, 0 },
966 };
967
968 /**
969  * mipi_dbi_debugfs_init - Create debugfs entries
970  * @minor: DRM minor
971  *
972  * This function creates a 'command' debugfs file for sending commands to the
973  * controller or getting the read command values.
974  * Drivers can use this as their &drm_driver->debugfs_init callback.
975  *
976  * Returns:
977  * Zero on success, negative error code on failure.
978  */
979 int mipi_dbi_debugfs_init(struct drm_minor *minor)
980 {
981         struct tinydrm_device *tdev = minor->dev->dev_private;
982         struct mipi_dbi *mipi = mipi_dbi_from_tinydrm(tdev);
983         umode_t mode = S_IFREG | S_IWUSR;
984
985         if (mipi->read_commands)
986                 mode |= S_IRUGO;
987         debugfs_create_file("command", mode, minor->debugfs_root, mipi,
988                             &mipi_dbi_debugfs_command_fops);
989
990         return drm_debugfs_create_files(mipi_dbi_debugfs_list,
991                                         ARRAY_SIZE(mipi_dbi_debugfs_list),
992                                         minor->debugfs_root, minor);
993 }
994 EXPORT_SYMBOL(mipi_dbi_debugfs_init);
995
996 #endif
997
998 MODULE_LICENSE("GPL");
This page took 0.088802 seconds and 4 git commands to generate.