1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Lontium LT9211 bridge driver 4 * 5 * LT9211 is capable of converting: 6 * 2xDSI/2xLVDS/1xDPI -> 2xDSI/2xLVDS/1xDPI 7 * Currently supported is: 8 * 1xDSI -> 1xLVDS 9 * 10 * Copyright (C) 2022 Marek Vasut <marex@denx.de> 11 */ 12 13 #include <linux/bits.h> 14 #include <linux/clk.h> 15 #include <linux/gpio/consumer.h> 16 #include <linux/i2c.h> 17 #include <linux/media-bus-format.h> 18 #include <linux/module.h> 19 #include <linux/of_graph.h> 20 #include <linux/regmap.h> 21 #include <linux/regulator/consumer.h> 22 23 #include <drm/drm_atomic_helper.h> 24 #include <drm/drm_bridge.h> 25 #include <drm/drm_mipi_dsi.h> 26 #include <drm/drm_of.h> 27 #include <drm/drm_panel.h> 28 #include <drm/drm_print.h> 29 #include <drm/drm_probe_helper.h> 30 31 #define REG_PAGE_CONTROL 0xff 32 #define REG_CHIPID0 0x8100 33 #define REG_CHIPID0_VALUE 0x18 34 #define REG_CHIPID1 0x8101 35 #define REG_CHIPID1_VALUE 0x01 36 #define REG_CHIPID2 0x8102 37 #define REG_CHIPID2_VALUE 0xe3 38 39 #define REG_DSI_LANE 0xd000 40 /* DSI lane count - 0 means 4 lanes ; 1, 2, 3 means 1, 2, 3 lanes. */ 41 #define REG_DSI_LANE_COUNT(n) ((n) & 3) 42 43 struct lt9211 { 44 struct drm_bridge bridge; 45 struct device *dev; 46 struct regmap *regmap; 47 struct mipi_dsi_device *dsi; 48 struct drm_bridge *panel_bridge; 49 struct gpio_desc *reset_gpio; 50 struct regulator *vccio; 51 bool lvds_dual_link; 52 bool lvds_dual_link_even_odd_swap; 53 }; 54 55 static const struct regmap_range lt9211_rw_ranges[] = { 56 regmap_reg_range(0xff, 0xff), 57 regmap_reg_range(0x8100, 0x816b), 58 regmap_reg_range(0x8200, 0x82aa), 59 regmap_reg_range(0x8500, 0x85ff), 60 regmap_reg_range(0x8600, 0x86a0), 61 regmap_reg_range(0x8700, 0x8746), 62 regmap_reg_range(0xd000, 0xd0a7), 63 regmap_reg_range(0xd400, 0xd42c), 64 regmap_reg_range(0xd800, 0xd838), 65 regmap_reg_range(0xd9c0, 0xd9d5), 66 }; 67 68 static const struct regmap_access_table lt9211_rw_table = { 69 .yes_ranges = lt9211_rw_ranges, 70 .n_yes_ranges = ARRAY_SIZE(lt9211_rw_ranges), 71 }; 72 73 static const struct regmap_range_cfg lt9211_range = { 74 .name = "lt9211", 75 .range_min = 0x0000, 76 .range_max = 0xda00, 77 .selector_reg = REG_PAGE_CONTROL, 78 .selector_mask = 0xff, 79 .selector_shift = 0, 80 .window_start = 0, 81 .window_len = 0x100, 82 }; 83 84 static const struct regmap_config lt9211_regmap_config = { 85 .reg_bits = 8, 86 .val_bits = 8, 87 .rd_table = <9211_rw_table, 88 .wr_table = <9211_rw_table, 89 .volatile_table = <9211_rw_table, 90 .ranges = <9211_range, 91 .num_ranges = 1, 92 .cache_type = REGCACHE_MAPLE, 93 .max_register = 0xda00, 94 }; 95 96 static struct lt9211 *bridge_to_lt9211(struct drm_bridge *bridge) 97 { 98 return container_of(bridge, struct lt9211, bridge); 99 } 100 101 static int lt9211_attach(struct drm_bridge *bridge, 102 struct drm_encoder *encoder, 103 enum drm_bridge_attach_flags flags) 104 { 105 struct lt9211 *ctx = bridge_to_lt9211(bridge); 106 107 return drm_bridge_attach(encoder, ctx->panel_bridge, 108 &ctx->bridge, flags); 109 } 110 111 static int lt9211_read_chipid(struct lt9211 *ctx) 112 { 113 u8 chipid[3]; 114 int ret; 115 116 /* Read Chip ID registers and verify the chip can communicate. */ 117 ret = regmap_bulk_read(ctx->regmap, REG_CHIPID0, chipid, 3); 118 if (ret < 0) { 119 dev_err(ctx->dev, "Failed to read Chip ID: %d\n", ret); 120 return ret; 121 } 122 123 /* Test for known Chip ID. */ 124 if (chipid[0] != REG_CHIPID0_VALUE || chipid[1] != REG_CHIPID1_VALUE || 125 chipid[2] != REG_CHIPID2_VALUE) { 126 dev_err(ctx->dev, "Unknown Chip ID: 0x%02x 0x%02x 0x%02x\n", 127 chipid[0], chipid[1], chipid[2]); 128 return -EINVAL; 129 } 130 131 return 0; 132 } 133 134 static int lt9211_system_init(struct lt9211 *ctx) 135 { 136 const struct reg_sequence lt9211_system_init_seq[] = { 137 { 0x8201, 0x18 }, 138 { 0x8606, 0x61 }, 139 { 0x8607, 0xa8 }, 140 { 0x8714, 0x08 }, 141 { 0x8715, 0x00 }, 142 { 0x8718, 0x0f }, 143 { 0x8722, 0x08 }, 144 { 0x8723, 0x00 }, 145 { 0x8726, 0x0f }, 146 { 0x810b, 0xfe }, 147 }; 148 149 return regmap_multi_reg_write(ctx->regmap, lt9211_system_init_seq, 150 ARRAY_SIZE(lt9211_system_init_seq)); 151 } 152 153 static int lt9211_configure_rx(struct lt9211 *ctx) 154 { 155 const struct reg_sequence lt9211_rx_phy_seq[] = { 156 { 0x8202, 0x44 }, 157 { 0x8204, 0xa0 }, 158 { 0x8205, 0x22 }, 159 { 0x8207, 0x9f }, 160 { 0x8208, 0xfc }, 161 /* ORR with 0xf8 here to enable DSI DN/DP swap. */ 162 { 0x8209, 0x01 }, 163 { 0x8217, 0x0c }, 164 { 0x8633, 0x1b }, 165 }; 166 167 const struct reg_sequence lt9211_rx_cal_reset_seq[] = { 168 { 0x8120, 0x7f }, 169 { 0x8120, 0xff }, 170 }; 171 172 const struct reg_sequence lt9211_rx_dig_seq[] = { 173 { 0x8630, 0x85 }, 174 /* 0x8588: BIT 6 set = MIPI-RX, BIT 4 unset = LVDS-TX */ 175 { 0x8588, 0x40 }, 176 { 0x85ff, 0xd0 }, 177 { REG_DSI_LANE, REG_DSI_LANE_COUNT(ctx->dsi->lanes) }, 178 { 0xd002, 0x05 }, 179 }; 180 181 const struct reg_sequence lt9211_rx_div_reset_seq[] = { 182 { 0x810a, 0xc0 }, 183 { 0x8120, 0xbf }, 184 }; 185 186 const struct reg_sequence lt9211_rx_div_clear_seq[] = { 187 { 0x810a, 0xc1 }, 188 { 0x8120, 0xff }, 189 }; 190 191 int ret; 192 193 ret = regmap_multi_reg_write(ctx->regmap, lt9211_rx_phy_seq, 194 ARRAY_SIZE(lt9211_rx_phy_seq)); 195 if (ret) 196 return ret; 197 198 ret = regmap_multi_reg_write(ctx->regmap, lt9211_rx_cal_reset_seq, 199 ARRAY_SIZE(lt9211_rx_cal_reset_seq)); 200 if (ret) 201 return ret; 202 203 ret = regmap_multi_reg_write(ctx->regmap, lt9211_rx_dig_seq, 204 ARRAY_SIZE(lt9211_rx_dig_seq)); 205 if (ret) 206 return ret; 207 208 ret = regmap_multi_reg_write(ctx->regmap, lt9211_rx_div_reset_seq, 209 ARRAY_SIZE(lt9211_rx_div_reset_seq)); 210 if (ret) 211 return ret; 212 213 usleep_range(10000, 15000); 214 215 return regmap_multi_reg_write(ctx->regmap, lt9211_rx_div_clear_seq, 216 ARRAY_SIZE(lt9211_rx_div_clear_seq)); 217 } 218 219 static int lt9211_autodetect_rx(struct lt9211 *ctx, 220 const struct drm_display_mode *mode) 221 { 222 u16 width, height; 223 u32 byteclk; 224 u8 buf[5]; 225 u8 format; 226 u8 bc[3]; 227 int ret; 228 229 /* Measure ByteClock frequency. */ 230 ret = regmap_write(ctx->regmap, 0x8600, 0x01); 231 if (ret) 232 return ret; 233 234 /* Give the chip time to lock onto RX stream. */ 235 msleep(100); 236 237 /* Read the ByteClock frequency from the chip. */ 238 ret = regmap_bulk_read(ctx->regmap, 0x8608, bc, sizeof(bc)); 239 if (ret) 240 return ret; 241 242 /* RX ByteClock in kHz */ 243 byteclk = ((bc[0] & 0xf) << 16) | (bc[1] << 8) | bc[2]; 244 245 /* Width/Height/Format Auto-detection */ 246 ret = regmap_bulk_read(ctx->regmap, 0xd082, buf, sizeof(buf)); 247 if (ret) 248 return ret; 249 250 width = (buf[0] << 8) | buf[1]; 251 height = (buf[3] << 8) | buf[4]; 252 format = buf[2] & 0xf; 253 254 if (format == 0x3) { /* YUV422 16bit */ 255 width /= 2; 256 } else if (format == 0xa) { /* RGB888 24bit */ 257 width /= 3; 258 } else { 259 dev_err(ctx->dev, "Unsupported DSI pixel format 0x%01x\n", 260 format); 261 return -EINVAL; 262 } 263 264 if (width != mode->hdisplay) { 265 dev_err(ctx->dev, 266 "RX: Detected DSI width (%d) does not match mode hdisplay (%d)\n", 267 width, mode->hdisplay); 268 return -EINVAL; 269 } 270 271 if (height != mode->vdisplay) { 272 dev_err(ctx->dev, 273 "RX: Detected DSI height (%d) does not match mode vdisplay (%d)\n", 274 height, mode->vdisplay); 275 return -EINVAL; 276 } 277 278 dev_dbg(ctx->dev, "RX: %dx%d format=0x%01x byteclock=%d kHz\n", 279 width, height, format, byteclk); 280 281 return 0; 282 } 283 284 static int lt9211_configure_timing(struct lt9211 *ctx, 285 const struct drm_display_mode *mode) 286 { 287 const struct reg_sequence lt9211_timing[] = { 288 { 0xd00d, (mode->vtotal >> 8) & 0xff }, 289 { 0xd00e, mode->vtotal & 0xff }, 290 { 0xd00f, (mode->vdisplay >> 8) & 0xff }, 291 { 0xd010, mode->vdisplay & 0xff }, 292 { 0xd011, (mode->htotal >> 8) & 0xff }, 293 { 0xd012, mode->htotal & 0xff }, 294 { 0xd013, (mode->hdisplay >> 8) & 0xff }, 295 { 0xd014, mode->hdisplay & 0xff }, 296 { 0xd015, (mode->vsync_end - mode->vsync_start) & 0xff }, 297 { 0xd016, (mode->hsync_end - mode->hsync_start) & 0xff }, 298 { 0xd017, ((mode->vsync_start - mode->vdisplay) >> 8) & 0xff }, 299 { 0xd018, (mode->vsync_start - mode->vdisplay) & 0xff }, 300 { 0xd019, ((mode->hsync_start - mode->hdisplay) >> 8) & 0xff }, 301 { 0xd01a, (mode->hsync_start - mode->hdisplay) & 0xff }, 302 }; 303 304 return regmap_multi_reg_write(ctx->regmap, lt9211_timing, 305 ARRAY_SIZE(lt9211_timing)); 306 } 307 308 static int lt9211_configure_plls(struct lt9211 *ctx, 309 const struct drm_display_mode *mode) 310 { 311 const struct reg_sequence lt9211_pcr_seq[] = { 312 { 0xd026, 0x17 }, 313 { 0xd027, 0xc3 }, 314 { 0xd02d, 0x30 }, 315 { 0xd031, 0x10 }, 316 { 0xd023, 0x20 }, 317 { 0xd038, 0x02 }, 318 { 0xd039, 0x10 }, 319 { 0xd03a, 0x20 }, 320 { 0xd03b, 0x60 }, 321 { 0xd03f, 0x04 }, 322 { 0xd040, 0x08 }, 323 { 0xd041, 0x10 }, 324 { 0x810b, 0xee }, 325 { 0x810b, 0xfe }, 326 }; 327 328 unsigned int pval; 329 int ret; 330 331 /* DeSSC PLL reference clock is 25 MHz XTal. */ 332 ret = regmap_write(ctx->regmap, 0x822d, 0x48); 333 if (ret) 334 return ret; 335 336 if (mode->clock < 44000) { 337 ret = regmap_write(ctx->regmap, 0x8235, 0x83); 338 } else if (mode->clock < 88000) { 339 ret = regmap_write(ctx->regmap, 0x8235, 0x82); 340 } else if (mode->clock < 176000) { 341 ret = regmap_write(ctx->regmap, 0x8235, 0x81); 342 } else { 343 dev_err(ctx->dev, 344 "Unsupported mode clock (%d kHz) above 176 MHz.\n", 345 mode->clock); 346 return -EINVAL; 347 } 348 349 if (ret) 350 return ret; 351 352 /* Wait for the DeSSC PLL to stabilize. */ 353 msleep(100); 354 355 ret = regmap_multi_reg_write(ctx->regmap, lt9211_pcr_seq, 356 ARRAY_SIZE(lt9211_pcr_seq)); 357 if (ret) 358 return ret; 359 360 /* PCR stability test takes seconds. */ 361 ret = regmap_read_poll_timeout(ctx->regmap, 0xd087, pval, pval & 0x8, 362 20000, 10000000); 363 if (ret) 364 dev_err(ctx->dev, "PCR unstable, ret=%i\n", ret); 365 366 return ret; 367 } 368 369 static int lt9211_configure_tx(struct lt9211 *ctx, bool jeida, 370 bool bpp24, bool de) 371 { 372 const struct reg_sequence system_lt9211_tx_phy_seq[] = { 373 /* DPI output disable */ 374 { 0x8262, 0x00 }, 375 /* BIT(7) is LVDS dual-port */ 376 { 0x823b, 0x38 | (ctx->lvds_dual_link ? BIT(7) : 0) }, 377 { 0x823e, 0x92 }, 378 { 0x823f, 0x48 }, 379 { 0x8240, 0x31 }, 380 { 0x8243, 0x80 }, 381 { 0x8244, 0x00 }, 382 { 0x8245, 0x00 }, 383 { 0x8249, 0x00 }, 384 { 0x824a, 0x01 }, 385 { 0x824e, 0x00 }, 386 { 0x824f, 0x00 }, 387 { 0x8250, 0x00 }, 388 { 0x8253, 0x00 }, 389 { 0x8254, 0x01 }, 390 /* LVDS channel order, Odd:Even 0x10..A:B, 0x40..B:A */ 391 { 0x8646, ctx->lvds_dual_link_even_odd_swap ? 0x40 : 0x10 }, 392 { 0x8120, 0x7b }, 393 { 0x816b, 0xff }, 394 }; 395 396 const struct reg_sequence system_lt9211_tx_dig_seq[] = { 397 { 0x8559, 0x40 | (jeida ? BIT(7) : 0) | 398 (de ? BIT(5) : 0) | (bpp24 ? BIT(4) : 0) }, 399 { 0x855a, 0xaa }, 400 { 0x855b, 0xaa }, 401 { 0x855c, ctx->lvds_dual_link ? BIT(0) : 0 }, 402 { 0x85a1, 0x77 }, 403 { 0x8640, 0x40 }, 404 { 0x8641, 0x34 }, 405 { 0x8642, 0x10 }, 406 { 0x8643, 0x23 }, 407 { 0x8644, 0x41 }, 408 { 0x8645, 0x02 }, 409 }; 410 411 const struct reg_sequence system_lt9211_tx_pll_seq[] = { 412 /* TX PLL power down */ 413 { 0x8236, 0x01 }, 414 { 0x8237, ctx->lvds_dual_link ? 0x2a : 0x29 }, 415 { 0x8238, 0x06 }, 416 { 0x8239, 0x30 }, 417 { 0x823a, 0x8e }, 418 { 0x8737, 0x14 }, 419 { 0x8713, 0x00 }, 420 { 0x8713, 0x80 }, 421 }; 422 423 unsigned int pval; 424 int ret; 425 426 ret = regmap_multi_reg_write(ctx->regmap, system_lt9211_tx_phy_seq, 427 ARRAY_SIZE(system_lt9211_tx_phy_seq)); 428 if (ret) 429 return ret; 430 431 ret = regmap_multi_reg_write(ctx->regmap, system_lt9211_tx_dig_seq, 432 ARRAY_SIZE(system_lt9211_tx_dig_seq)); 433 if (ret) 434 return ret; 435 436 ret = regmap_multi_reg_write(ctx->regmap, system_lt9211_tx_pll_seq, 437 ARRAY_SIZE(system_lt9211_tx_pll_seq)); 438 if (ret) 439 return ret; 440 441 ret = regmap_read_poll_timeout(ctx->regmap, 0x871f, pval, pval & 0x80, 442 10000, 1000000); 443 if (ret) { 444 dev_err(ctx->dev, "TX PLL unstable, ret=%i\n", ret); 445 return ret; 446 } 447 448 ret = regmap_read_poll_timeout(ctx->regmap, 0x8720, pval, pval & 0x80, 449 10000, 1000000); 450 if (ret) { 451 dev_err(ctx->dev, "TX PLL unstable, ret=%i\n", ret); 452 return ret; 453 } 454 455 return 0; 456 } 457 458 static void lt9211_atomic_enable(struct drm_bridge *bridge, 459 struct drm_atomic_state *state) 460 { 461 struct lt9211 *ctx = bridge_to_lt9211(bridge); 462 const struct drm_bridge_state *bridge_state; 463 const struct drm_crtc_state *crtc_state; 464 const struct drm_display_mode *mode; 465 struct drm_connector *connector; 466 struct drm_crtc *crtc; 467 bool lvds_format_24bpp; 468 bool lvds_format_jeida; 469 u32 bus_flags; 470 int ret; 471 472 ret = regulator_enable(ctx->vccio); 473 if (ret) { 474 dev_err(ctx->dev, "Failed to enable vccio: %d\n", ret); 475 return; 476 } 477 478 /* Deassert reset */ 479 gpiod_set_value(ctx->reset_gpio, 1); 480 usleep_range(20000, 21000); /* Very long post-reset delay. */ 481 482 /* Get the LVDS format from the bridge state. */ 483 bridge_state = drm_atomic_get_new_bridge_state(state, bridge); 484 bus_flags = bridge_state->output_bus_cfg.flags; 485 486 switch (bridge_state->output_bus_cfg.format) { 487 case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG: 488 lvds_format_24bpp = false; 489 lvds_format_jeida = true; 490 break; 491 case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA: 492 lvds_format_24bpp = true; 493 lvds_format_jeida = true; 494 break; 495 case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG: 496 lvds_format_24bpp = true; 497 lvds_format_jeida = false; 498 break; 499 default: 500 /* 501 * Some bridges still don't set the correct 502 * LVDS bus pixel format, use SPWG24 default 503 * format until those are fixed. 504 */ 505 lvds_format_24bpp = true; 506 lvds_format_jeida = false; 507 dev_warn(ctx->dev, 508 "Unsupported LVDS bus format 0x%04x, please check output bridge driver. Falling back to SPWG24.\n", 509 bridge_state->output_bus_cfg.format); 510 break; 511 } 512 513 /* 514 * Retrieve the CRTC adjusted mode. This requires a little dance to go 515 * from the bridge to the encoder, to the connector and to the CRTC. 516 */ 517 connector = drm_atomic_get_new_connector_for_encoder(state, 518 bridge->encoder); 519 crtc = drm_atomic_get_new_connector_state(state, connector)->crtc; 520 crtc_state = drm_atomic_get_new_crtc_state(state, crtc); 521 mode = &crtc_state->adjusted_mode; 522 523 ret = lt9211_read_chipid(ctx); 524 if (ret) 525 return; 526 527 ret = lt9211_system_init(ctx); 528 if (ret) 529 return; 530 531 ret = lt9211_configure_rx(ctx); 532 if (ret) 533 return; 534 535 ret = lt9211_autodetect_rx(ctx, mode); 536 if (ret) 537 return; 538 539 ret = lt9211_configure_timing(ctx, mode); 540 if (ret) 541 return; 542 543 ret = lt9211_configure_plls(ctx, mode); 544 if (ret) 545 return; 546 547 ret = lt9211_configure_tx(ctx, lvds_format_jeida, lvds_format_24bpp, 548 bus_flags & DRM_BUS_FLAG_DE_HIGH); 549 if (ret) 550 return; 551 552 dev_dbg(ctx->dev, "LT9211 enabled.\n"); 553 } 554 555 static void lt9211_atomic_disable(struct drm_bridge *bridge, 556 struct drm_atomic_state *state) 557 { 558 struct lt9211 *ctx = bridge_to_lt9211(bridge); 559 int ret; 560 561 /* 562 * Put the chip in reset, pull nRST line low, 563 * and assure lengthy 10ms reset low timing. 564 */ 565 gpiod_set_value(ctx->reset_gpio, 0); 566 usleep_range(10000, 11000); /* Very long reset duration. */ 567 568 ret = regulator_disable(ctx->vccio); 569 if (ret) 570 dev_err(ctx->dev, "Failed to disable vccio: %d\n", ret); 571 572 regcache_mark_dirty(ctx->regmap); 573 } 574 575 static enum drm_mode_status 576 lt9211_mode_valid(struct drm_bridge *bridge, 577 const struct drm_display_info *info, 578 const struct drm_display_mode *mode) 579 { 580 /* LVDS output clock range 25..176 MHz */ 581 if (mode->clock < 25000) 582 return MODE_CLOCK_LOW; 583 if (mode->clock > 176000) 584 return MODE_CLOCK_HIGH; 585 586 return MODE_OK; 587 } 588 589 #define MAX_INPUT_SEL_FORMATS 1 590 591 static u32 * 592 lt9211_atomic_get_input_bus_fmts(struct drm_bridge *bridge, 593 struct drm_bridge_state *bridge_state, 594 struct drm_crtc_state *crtc_state, 595 struct drm_connector_state *conn_state, 596 u32 output_fmt, 597 unsigned int *num_input_fmts) 598 { 599 u32 *input_fmts; 600 601 *num_input_fmts = 0; 602 603 input_fmts = kcalloc(MAX_INPUT_SEL_FORMATS, sizeof(*input_fmts), 604 GFP_KERNEL); 605 if (!input_fmts) 606 return NULL; 607 608 /* This is the DSI-end bus format */ 609 input_fmts[0] = MEDIA_BUS_FMT_RGB888_1X24; 610 *num_input_fmts = 1; 611 612 return input_fmts; 613 } 614 615 static const struct drm_bridge_funcs lt9211_funcs = { 616 .attach = lt9211_attach, 617 .mode_valid = lt9211_mode_valid, 618 .atomic_enable = lt9211_atomic_enable, 619 .atomic_disable = lt9211_atomic_disable, 620 .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, 621 .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, 622 .atomic_get_input_bus_fmts = lt9211_atomic_get_input_bus_fmts, 623 .atomic_reset = drm_atomic_helper_bridge_reset, 624 }; 625 626 static int lt9211_parse_dt(struct lt9211 *ctx) 627 { 628 struct device_node *port2, *port3; 629 struct drm_bridge *panel_bridge; 630 struct device *dev = ctx->dev; 631 struct drm_panel *panel; 632 int dual_link; 633 int ret; 634 635 ctx->vccio = devm_regulator_get(dev, "vccio"); 636 if (IS_ERR(ctx->vccio)) 637 return dev_err_probe(dev, PTR_ERR(ctx->vccio), 638 "Failed to get supply 'vccio'\n"); 639 640 ctx->lvds_dual_link = false; 641 ctx->lvds_dual_link_even_odd_swap = false; 642 643 port2 = of_graph_get_port_by_id(dev->of_node, 2); 644 port3 = of_graph_get_port_by_id(dev->of_node, 3); 645 dual_link = drm_of_lvds_get_dual_link_pixel_order(port2, port3); 646 of_node_put(port2); 647 of_node_put(port3); 648 649 if (dual_link == DRM_LVDS_DUAL_LINK_ODD_EVEN_PIXELS) { 650 ctx->lvds_dual_link = true; 651 /* Odd pixels to LVDS Channel A, even pixels to B */ 652 ctx->lvds_dual_link_even_odd_swap = false; 653 } else if (dual_link == DRM_LVDS_DUAL_LINK_EVEN_ODD_PIXELS) { 654 ctx->lvds_dual_link = true; 655 /* Even pixels to LVDS Channel A, odd pixels to B */ 656 ctx->lvds_dual_link_even_odd_swap = true; 657 } 658 659 ret = drm_of_find_panel_or_bridge(dev->of_node, 2, 0, &panel, &panel_bridge); 660 if (ret < 0) 661 return ret; 662 if (panel) { 663 panel_bridge = devm_drm_panel_bridge_add(dev, panel); 664 if (IS_ERR(panel_bridge)) 665 return PTR_ERR(panel_bridge); 666 } 667 668 ctx->panel_bridge = panel_bridge; 669 670 return 0; 671 } 672 673 static int lt9211_host_attach(struct lt9211 *ctx) 674 { 675 const struct mipi_dsi_device_info info = { 676 .type = "lt9211", 677 .channel = 0, 678 .node = NULL, 679 }; 680 struct device *dev = ctx->dev; 681 struct device_node *host_node; 682 struct device_node *endpoint; 683 struct mipi_dsi_device *dsi; 684 struct mipi_dsi_host *host; 685 int dsi_lanes; 686 int ret; 687 688 endpoint = of_graph_get_endpoint_by_regs(dev->of_node, 0, -1); 689 dsi_lanes = drm_of_get_data_lanes_count(endpoint, 1, 4); 690 host_node = of_graph_get_remote_port_parent(endpoint); 691 host = of_find_mipi_dsi_host_by_node(host_node); 692 of_node_put(host_node); 693 of_node_put(endpoint); 694 695 if (!host) 696 return -EPROBE_DEFER; 697 698 if (dsi_lanes < 0) 699 return dsi_lanes; 700 701 dsi = devm_mipi_dsi_device_register_full(dev, host, &info); 702 if (IS_ERR(dsi)) 703 return dev_err_probe(dev, PTR_ERR(dsi), 704 "failed to create dsi device\n"); 705 706 ctx->dsi = dsi; 707 708 dsi->lanes = dsi_lanes; 709 dsi->format = MIPI_DSI_FMT_RGB888; 710 dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE | 711 MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO_NO_HSA | 712 MIPI_DSI_MODE_VIDEO_NO_HFP | MIPI_DSI_MODE_VIDEO_NO_HBP | 713 MIPI_DSI_MODE_NO_EOT_PACKET; 714 715 ret = devm_mipi_dsi_attach(dev, dsi); 716 if (ret < 0) { 717 dev_err(dev, "failed to attach dsi to host: %d\n", ret); 718 return ret; 719 } 720 721 return 0; 722 } 723 724 static int lt9211_probe(struct i2c_client *client) 725 { 726 struct device *dev = &client->dev; 727 struct lt9211 *ctx; 728 int ret; 729 730 ctx = devm_drm_bridge_alloc(dev, struct lt9211, bridge, <9211_funcs); 731 if (IS_ERR(ctx)) 732 return PTR_ERR(ctx); 733 734 ctx->dev = dev; 735 736 /* 737 * Put the chip in reset, pull nRST line low, 738 * and assure lengthy 10ms reset low timing. 739 */ 740 ctx->reset_gpio = devm_gpiod_get_optional(ctx->dev, "reset", 741 GPIOD_OUT_LOW); 742 if (IS_ERR(ctx->reset_gpio)) 743 return PTR_ERR(ctx->reset_gpio); 744 745 usleep_range(10000, 11000); /* Very long reset duration. */ 746 747 ret = lt9211_parse_dt(ctx); 748 if (ret) 749 return ret; 750 751 ctx->regmap = devm_regmap_init_i2c(client, <9211_regmap_config); 752 if (IS_ERR(ctx->regmap)) 753 return PTR_ERR(ctx->regmap); 754 755 dev_set_drvdata(dev, ctx); 756 i2c_set_clientdata(client, ctx); 757 758 ctx->bridge.of_node = dev->of_node; 759 drm_bridge_add(&ctx->bridge); 760 761 ret = lt9211_host_attach(ctx); 762 if (ret) 763 drm_bridge_remove(&ctx->bridge); 764 765 return ret; 766 } 767 768 static void lt9211_remove(struct i2c_client *client) 769 { 770 struct lt9211 *ctx = i2c_get_clientdata(client); 771 772 drm_bridge_remove(&ctx->bridge); 773 } 774 775 static const struct i2c_device_id lt9211_id[] = { 776 { "lontium,lt9211" }, 777 {}, 778 }; 779 MODULE_DEVICE_TABLE(i2c, lt9211_id); 780 781 static const struct of_device_id lt9211_match_table[] = { 782 { .compatible = "lontium,lt9211" }, 783 {}, 784 }; 785 MODULE_DEVICE_TABLE(of, lt9211_match_table); 786 787 static struct i2c_driver lt9211_driver = { 788 .probe = lt9211_probe, 789 .remove = lt9211_remove, 790 .id_table = lt9211_id, 791 .driver = { 792 .name = "lt9211", 793 .of_match_table = lt9211_match_table, 794 }, 795 }; 796 module_i2c_driver(lt9211_driver); 797 798 MODULE_AUTHOR("Marek Vasut <marex@denx.de>"); 799 MODULE_DESCRIPTION("Lontium LT9211 DSI/LVDS/DPI bridge driver"); 800 MODULE_LICENSE("GPL"); 801