Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.15-rc5 998 lines 25 kB view raw
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 71static 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 95static 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 */ 123int 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} 133EXPORT_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 */ 145int 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} 155EXPORT_SYMBOL(mipi_dbi_command_buf); 156 157static 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 196static 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 246out_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 256static 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 */ 270void 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} 285EXPORT_SYMBOL(mipi_dbi_pipe_enable); 286 287static 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 */ 312void 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} 326EXPORT_SYMBOL(mipi_dbi_pipe_disable); 327 328static 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 */ 353int 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} 394EXPORT_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 */ 402void 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} 412EXPORT_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 */ 426bool 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} 443EXPORT_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 */ 452static 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 478static 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 599static 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 663static 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 683static 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 743err_free: 744 kfree(buf); 745 746 return ret; 747} 748 749static 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 */ 799int 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} 850EXPORT_SYMBOL(mipi_dbi_spi_init); 851 852#endif /* CONFIG_SPI */ 853 854#ifdef CONFIG_DEBUG_FS 855 856static 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 903err_free: 904 kfree(buf); 905 906 return ret < 0 ? ret : count; 907} 908 909static 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 948static 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 955static 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 964static 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 */ 979int 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} 994EXPORT_SYMBOL(mipi_dbi_debugfs_init); 995 996#endif 997 998MODULE_LICENSE("GPL");