1 /* 2 * Copyright (c) 2015, The Linux Foundation. All rights reserved. 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License version 2 and 6 * only version 2 as published by the Free Software Foundation. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 */ 13 14 #include "msm_kms.h" 15 #include "dsi.h" 16 17 #define DSI_CLOCK_MASTER DSI_0 18 #define DSI_CLOCK_SLAVE DSI_1 19 20 #define DSI_LEFT DSI_0 21 #define DSI_RIGHT DSI_1 22 23 /* According to the current drm framework sequence, take the encoder of 24 * DSI_1 as master encoder 25 */ 26 #define DSI_ENCODER_MASTER DSI_1 27 #define DSI_ENCODER_SLAVE DSI_0 28 29 struct msm_dsi_manager { 30 struct msm_dsi *dsi[DSI_MAX]; 31 32 bool is_dual_dsi; 33 bool is_sync_needed; 34 int master_dsi_link_id; 35 }; 36 37 static struct msm_dsi_manager msm_dsim_glb; 38 39 #define IS_DUAL_DSI() (msm_dsim_glb.is_dual_dsi) 40 #define IS_SYNC_NEEDED() (msm_dsim_glb.is_sync_needed) 41 #define IS_MASTER_DSI_LINK(id) (msm_dsim_glb.master_dsi_link_id == id) 42 43 static inline struct msm_dsi *dsi_mgr_get_dsi(int id) 44 { 45 return msm_dsim_glb.dsi[id]; 46 } 47 48 static inline struct msm_dsi *dsi_mgr_get_other_dsi(int id) 49 { 50 return msm_dsim_glb.dsi[(id + 1) % DSI_MAX]; 51 } 52 53 static int dsi_mgr_parse_dual_dsi(struct device_node *np, int id) 54 { 55 struct msm_dsi_manager *msm_dsim = &msm_dsim_glb; 56 57 /* We assume 2 dsi nodes have the same information of dual-dsi and 58 * sync-mode, and only one node specifies master in case of dual mode. 59 */ 60 if (!msm_dsim->is_dual_dsi) 61 msm_dsim->is_dual_dsi = of_property_read_bool( 62 np, "qcom,dual-dsi-mode"); 63 64 if (msm_dsim->is_dual_dsi) { 65 if (of_property_read_bool(np, "qcom,master-dsi")) 66 msm_dsim->master_dsi_link_id = id; 67 if (!msm_dsim->is_sync_needed) 68 msm_dsim->is_sync_needed = of_property_read_bool( 69 np, "qcom,sync-dual-dsi"); 70 } 71 72 return 0; 73 } 74 75 static int dsi_mgr_setup_components(int id) 76 { 77 struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); 78 struct msm_dsi *other_dsi = dsi_mgr_get_other_dsi(id); 79 struct msm_dsi *clk_master_dsi = dsi_mgr_get_dsi(DSI_CLOCK_MASTER); 80 struct msm_dsi *clk_slave_dsi = dsi_mgr_get_dsi(DSI_CLOCK_SLAVE); 81 struct msm_dsi_pll *src_pll; 82 int ret; 83 84 if (!IS_DUAL_DSI()) { 85 ret = msm_dsi_host_register(msm_dsi->host, true); 86 if (ret) 87 return ret; 88 89 msm_dsi_phy_set_usecase(msm_dsi->phy, MSM_DSI_PHY_STANDALONE); 90 src_pll = msm_dsi_phy_get_pll(msm_dsi->phy); 91 if (IS_ERR(src_pll)) 92 return PTR_ERR(src_pll); 93 ret = msm_dsi_host_set_src_pll(msm_dsi->host, src_pll); 94 } else if (!other_dsi) { 95 ret = 0; 96 } else { 97 struct msm_dsi *master_link_dsi = IS_MASTER_DSI_LINK(id) ? 98 msm_dsi : other_dsi; 99 struct msm_dsi *slave_link_dsi = IS_MASTER_DSI_LINK(id) ? 100 other_dsi : msm_dsi; 101 /* Register slave host first, so that slave DSI device 102 * has a chance to probe, and do not block the master 103 * DSI device's probe. 104 * Also, do not check defer for the slave host, 105 * because only master DSI device adds the panel to global 106 * panel list. The panel's device is the master DSI device. 107 */ 108 ret = msm_dsi_host_register(slave_link_dsi->host, false); 109 if (ret) 110 return ret; 111 ret = msm_dsi_host_register(master_link_dsi->host, true); 112 if (ret) 113 return ret; 114 115 /* PLL0 is to drive both 2 DSI link clocks in Dual DSI mode. */ 116 msm_dsi_phy_set_usecase(clk_master_dsi->phy, 117 MSM_DSI_PHY_MASTER); 118 msm_dsi_phy_set_usecase(clk_slave_dsi->phy, 119 MSM_DSI_PHY_SLAVE); 120 src_pll = msm_dsi_phy_get_pll(clk_master_dsi->phy); 121 if (IS_ERR(src_pll)) 122 return PTR_ERR(src_pll); 123 ret = msm_dsi_host_set_src_pll(msm_dsi->host, src_pll); 124 if (ret) 125 return ret; 126 ret = msm_dsi_host_set_src_pll(other_dsi->host, src_pll); 127 } 128 129 return ret; 130 } 131 132 static int enable_phy(struct msm_dsi *msm_dsi, int src_pll_id, 133 struct msm_dsi_phy_shared_timings *shared_timings) 134 { 135 struct msm_dsi_phy_clk_request clk_req; 136 int ret; 137 bool is_dual_dsi = IS_DUAL_DSI(); 138 139 msm_dsi_host_get_phy_clk_req(msm_dsi->host, &clk_req, is_dual_dsi); 140 141 ret = msm_dsi_phy_enable(msm_dsi->phy, src_pll_id, &clk_req); 142 msm_dsi_phy_get_shared_timings(msm_dsi->phy, shared_timings); 143 144 return ret; 145 } 146 147 static int 148 dsi_mgr_phy_enable(int id, 149 struct msm_dsi_phy_shared_timings shared_timings[DSI_MAX]) 150 { 151 struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); 152 struct msm_dsi *mdsi = dsi_mgr_get_dsi(DSI_CLOCK_MASTER); 153 struct msm_dsi *sdsi = dsi_mgr_get_dsi(DSI_CLOCK_SLAVE); 154 int src_pll_id = IS_DUAL_DSI() ? DSI_CLOCK_MASTER : id; 155 int ret; 156 157 /* In case of dual DSI, some registers in PHY1 have been programmed 158 * during PLL0 clock's set_rate. The PHY1 reset called by host1 here 159 * will silently reset those PHY1 registers. Therefore we need to reset 160 * and enable both PHYs before any PLL clock operation. 161 */ 162 if (IS_DUAL_DSI() && mdsi && sdsi) { 163 if (!mdsi->phy_enabled && !sdsi->phy_enabled) { 164 msm_dsi_host_reset_phy(mdsi->host); 165 msm_dsi_host_reset_phy(sdsi->host); 166 167 ret = enable_phy(mdsi, src_pll_id, 168 &shared_timings[DSI_CLOCK_MASTER]); 169 if (ret) 170 return ret; 171 ret = enable_phy(sdsi, src_pll_id, 172 &shared_timings[DSI_CLOCK_SLAVE]); 173 if (ret) { 174 msm_dsi_phy_disable(mdsi->phy); 175 return ret; 176 } 177 } 178 } else { 179 msm_dsi_host_reset_phy(msm_dsi->host); 180 ret = enable_phy(msm_dsi, src_pll_id, &shared_timings[id]); 181 if (ret) 182 return ret; 183 } 184 185 msm_dsi->phy_enabled = true; 186 187 return 0; 188 } 189 190 static void dsi_mgr_phy_disable(int id) 191 { 192 struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); 193 struct msm_dsi *mdsi = dsi_mgr_get_dsi(DSI_CLOCK_MASTER); 194 struct msm_dsi *sdsi = dsi_mgr_get_dsi(DSI_CLOCK_SLAVE); 195 196 /* disable DSI phy 197 * In dual-dsi configuration, the phy should be disabled for the 198 * first controller only when the second controller is disabled. 199 */ 200 msm_dsi->phy_enabled = false; 201 if (IS_DUAL_DSI() && mdsi && sdsi) { 202 if (!mdsi->phy_enabled && !sdsi->phy_enabled) { 203 msm_dsi_phy_disable(sdsi->phy); 204 msm_dsi_phy_disable(mdsi->phy); 205 } 206 } else { 207 msm_dsi_phy_disable(msm_dsi->phy); 208 } 209 } 210 211 struct dsi_connector { 212 struct drm_connector base; 213 int id; 214 }; 215 216 struct dsi_bridge { 217 struct drm_bridge base; 218 int id; 219 }; 220 221 #define to_dsi_connector(x) container_of(x, struct dsi_connector, base) 222 #define to_dsi_bridge(x) container_of(x, struct dsi_bridge, base) 223 224 static inline int dsi_mgr_connector_get_id(struct drm_connector *connector) 225 { 226 struct dsi_connector *dsi_connector = to_dsi_connector(connector); 227 return dsi_connector->id; 228 } 229 230 static int dsi_mgr_bridge_get_id(struct drm_bridge *bridge) 231 { 232 struct dsi_bridge *dsi_bridge = to_dsi_bridge(bridge); 233 return dsi_bridge->id; 234 } 235 236 static enum drm_connector_status dsi_mgr_connector_detect( 237 struct drm_connector *connector, bool force) 238 { 239 int id = dsi_mgr_connector_get_id(connector); 240 struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); 241 struct msm_dsi *other_dsi = dsi_mgr_get_other_dsi(id); 242 struct msm_drm_private *priv = connector->dev->dev_private; 243 struct msm_kms *kms = priv->kms; 244 245 DBG("id=%d", id); 246 if (!msm_dsi->panel) { 247 msm_dsi->panel = msm_dsi_host_get_panel(msm_dsi->host, 248 &msm_dsi->device_flags); 249 250 /* There is only 1 panel in the global panel list 251 * for dual DSI mode. Therefore slave dsi should get 252 * the drm_panel instance from master dsi, and 253 * keep using the panel flags got from the current DSI link. 254 */ 255 if (!msm_dsi->panel && IS_DUAL_DSI() && 256 !IS_MASTER_DSI_LINK(id) && other_dsi) 257 msm_dsi->panel = msm_dsi_host_get_panel( 258 other_dsi->host, NULL); 259 260 261 if (msm_dsi->panel && kms->funcs->set_encoder_mode) { 262 bool cmd_mode = !(msm_dsi->device_flags & 263 MIPI_DSI_MODE_VIDEO); 264 struct drm_encoder *encoder = 265 msm_dsi_get_encoder(msm_dsi); 266 267 kms->funcs->set_encoder_mode(kms, encoder, cmd_mode); 268 } 269 270 if (msm_dsi->panel && IS_DUAL_DSI()) 271 drm_object_attach_property(&connector->base, 272 connector->dev->mode_config.tile_property, 0); 273 274 /* Set split display info to kms once dual DSI panel is 275 * connected to both hosts. 276 */ 277 if (msm_dsi->panel && IS_DUAL_DSI() && 278 other_dsi && other_dsi->panel) { 279 bool cmd_mode = !(msm_dsi->device_flags & 280 MIPI_DSI_MODE_VIDEO); 281 struct drm_encoder *encoder = msm_dsi_get_encoder( 282 dsi_mgr_get_dsi(DSI_ENCODER_MASTER)); 283 struct drm_encoder *slave_enc = msm_dsi_get_encoder( 284 dsi_mgr_get_dsi(DSI_ENCODER_SLAVE)); 285 286 if (kms->funcs->set_split_display) 287 kms->funcs->set_split_display(kms, encoder, 288 slave_enc, cmd_mode); 289 else 290 pr_err("mdp does not support dual DSI\n"); 291 } 292 } 293 294 return msm_dsi->panel ? connector_status_connected : 295 connector_status_disconnected; 296 } 297 298 static void dsi_mgr_connector_destroy(struct drm_connector *connector) 299 { 300 struct dsi_connector *dsi_connector = to_dsi_connector(connector); 301 302 DBG(""); 303 304 drm_connector_cleanup(connector); 305 306 kfree(dsi_connector); 307 } 308 309 static int dsi_mgr_connector_get_modes(struct drm_connector *connector) 310 { 311 int id = dsi_mgr_connector_get_id(connector); 312 struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); 313 struct drm_panel *panel = msm_dsi->panel; 314 int num; 315 316 if (!panel) 317 return 0; 318 319 /* 320 * In dual DSI mode, we have one connector that can be 321 * attached to the drm_panel. 322 */ 323 drm_panel_attach(panel, connector); 324 num = drm_panel_get_modes(panel); 325 if (!num) 326 return 0; 327 328 return num; 329 } 330 331 static int dsi_mgr_connector_mode_valid(struct drm_connector *connector, 332 struct drm_display_mode *mode) 333 { 334 int id = dsi_mgr_connector_get_id(connector); 335 struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); 336 struct drm_encoder *encoder = msm_dsi_get_encoder(msm_dsi); 337 struct msm_drm_private *priv = connector->dev->dev_private; 338 struct msm_kms *kms = priv->kms; 339 long actual, requested; 340 341 DBG(""); 342 requested = 1000 * mode->clock; 343 actual = kms->funcs->round_pixclk(kms, requested, encoder); 344 345 DBG("requested=%ld, actual=%ld", requested, actual); 346 if (actual != requested) 347 return MODE_CLOCK_RANGE; 348 349 return MODE_OK; 350 } 351 352 static struct drm_encoder * 353 dsi_mgr_connector_best_encoder(struct drm_connector *connector) 354 { 355 int id = dsi_mgr_connector_get_id(connector); 356 struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); 357 358 DBG(""); 359 return msm_dsi_get_encoder(msm_dsi); 360 } 361 362 static void dsi_mgr_bridge_pre_enable(struct drm_bridge *bridge) 363 { 364 int id = dsi_mgr_bridge_get_id(bridge); 365 struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); 366 struct msm_dsi *msm_dsi1 = dsi_mgr_get_dsi(DSI_1); 367 struct mipi_dsi_host *host = msm_dsi->host; 368 struct drm_panel *panel = msm_dsi->panel; 369 struct msm_dsi_phy_shared_timings phy_shared_timings[DSI_MAX]; 370 bool is_dual_dsi = IS_DUAL_DSI(); 371 int ret; 372 373 DBG("id=%d", id); 374 if (!msm_dsi_device_connected(msm_dsi)) 375 return; 376 377 ret = dsi_mgr_phy_enable(id, phy_shared_timings); 378 if (ret) 379 goto phy_en_fail; 380 381 /* Do nothing with the host if it is slave-DSI in case of dual DSI */ 382 if (is_dual_dsi && !IS_MASTER_DSI_LINK(id)) 383 return; 384 385 ret = msm_dsi_host_power_on(host, &phy_shared_timings[id], is_dual_dsi); 386 if (ret) { 387 pr_err("%s: power on host %d failed, %d\n", __func__, id, ret); 388 goto host_on_fail; 389 } 390 391 if (is_dual_dsi && msm_dsi1) { 392 ret = msm_dsi_host_power_on(msm_dsi1->host, 393 &phy_shared_timings[DSI_1], is_dual_dsi); 394 if (ret) { 395 pr_err("%s: power on host1 failed, %d\n", 396 __func__, ret); 397 goto host1_on_fail; 398 } 399 } 400 401 /* Always call panel functions once, because even for dual panels, 402 * there is only one drm_panel instance. 403 */ 404 if (panel) { 405 ret = drm_panel_prepare(panel); 406 if (ret) { 407 pr_err("%s: prepare panel %d failed, %d\n", __func__, 408 id, ret); 409 goto panel_prep_fail; 410 } 411 } 412 413 ret = msm_dsi_host_enable(host); 414 if (ret) { 415 pr_err("%s: enable host %d failed, %d\n", __func__, id, ret); 416 goto host_en_fail; 417 } 418 419 if (is_dual_dsi && msm_dsi1) { 420 ret = msm_dsi_host_enable(msm_dsi1->host); 421 if (ret) { 422 pr_err("%s: enable host1 failed, %d\n", __func__, ret); 423 goto host1_en_fail; 424 } 425 } 426 427 if (panel) { 428 ret = drm_panel_enable(panel); 429 if (ret) { 430 pr_err("%s: enable panel %d failed, %d\n", __func__, id, 431 ret); 432 goto panel_en_fail; 433 } 434 } 435 436 return; 437 438 panel_en_fail: 439 if (is_dual_dsi && msm_dsi1) 440 msm_dsi_host_disable(msm_dsi1->host); 441 host1_en_fail: 442 msm_dsi_host_disable(host); 443 host_en_fail: 444 if (panel) 445 drm_panel_unprepare(panel); 446 panel_prep_fail: 447 if (is_dual_dsi && msm_dsi1) 448 msm_dsi_host_power_off(msm_dsi1->host); 449 host1_on_fail: 450 msm_dsi_host_power_off(host); 451 host_on_fail: 452 dsi_mgr_phy_disable(id); 453 phy_en_fail: 454 return; 455 } 456 457 static void dsi_mgr_bridge_enable(struct drm_bridge *bridge) 458 { 459 DBG(""); 460 } 461 462 static void dsi_mgr_bridge_disable(struct drm_bridge *bridge) 463 { 464 DBG(""); 465 } 466 467 static void dsi_mgr_bridge_post_disable(struct drm_bridge *bridge) 468 { 469 int id = dsi_mgr_bridge_get_id(bridge); 470 struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); 471 struct msm_dsi *msm_dsi1 = dsi_mgr_get_dsi(DSI_1); 472 struct mipi_dsi_host *host = msm_dsi->host; 473 struct drm_panel *panel = msm_dsi->panel; 474 bool is_dual_dsi = IS_DUAL_DSI(); 475 int ret; 476 477 DBG("id=%d", id); 478 479 if (!msm_dsi_device_connected(msm_dsi)) 480 return; 481 482 /* 483 * Do nothing with the host if it is slave-DSI in case of dual DSI. 484 * It is safe to call dsi_mgr_phy_disable() here because a single PHY 485 * won't be diabled until both PHYs request disable. 486 */ 487 if (is_dual_dsi && !IS_MASTER_DSI_LINK(id)) 488 goto disable_phy; 489 490 if (panel) { 491 ret = drm_panel_disable(panel); 492 if (ret) 493 pr_err("%s: Panel %d OFF failed, %d\n", __func__, id, 494 ret); 495 } 496 497 ret = msm_dsi_host_disable(host); 498 if (ret) 499 pr_err("%s: host %d disable failed, %d\n", __func__, id, ret); 500 501 if (is_dual_dsi && msm_dsi1) { 502 ret = msm_dsi_host_disable(msm_dsi1->host); 503 if (ret) 504 pr_err("%s: host1 disable failed, %d\n", __func__, ret); 505 } 506 507 if (panel) { 508 ret = drm_panel_unprepare(panel); 509 if (ret) 510 pr_err("%s: Panel %d unprepare failed,%d\n", __func__, 511 id, ret); 512 } 513 514 ret = msm_dsi_host_power_off(host); 515 if (ret) 516 pr_err("%s: host %d power off failed,%d\n", __func__, id, ret); 517 518 if (is_dual_dsi && msm_dsi1) { 519 ret = msm_dsi_host_power_off(msm_dsi1->host); 520 if (ret) 521 pr_err("%s: host1 power off failed, %d\n", 522 __func__, ret); 523 } 524 525 disable_phy: 526 dsi_mgr_phy_disable(id); 527 } 528 529 static void dsi_mgr_bridge_mode_set(struct drm_bridge *bridge, 530 const struct drm_display_mode *mode, 531 const struct drm_display_mode *adjusted_mode) 532 { 533 int id = dsi_mgr_bridge_get_id(bridge); 534 struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); 535 struct msm_dsi *other_dsi = dsi_mgr_get_other_dsi(id); 536 struct mipi_dsi_host *host = msm_dsi->host; 537 bool is_dual_dsi = IS_DUAL_DSI(); 538 539 DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode)); 540 541 if (is_dual_dsi && !IS_MASTER_DSI_LINK(id)) 542 return; 543 544 msm_dsi_host_set_display_mode(host, adjusted_mode); 545 if (is_dual_dsi && other_dsi) 546 msm_dsi_host_set_display_mode(other_dsi->host, adjusted_mode); 547 } 548 549 static const struct drm_connector_funcs dsi_mgr_connector_funcs = { 550 .detect = dsi_mgr_connector_detect, 551 .fill_modes = drm_helper_probe_single_connector_modes, 552 .destroy = dsi_mgr_connector_destroy, 553 .reset = drm_atomic_helper_connector_reset, 554 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, 555 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 556 }; 557 558 static const struct drm_connector_helper_funcs dsi_mgr_conn_helper_funcs = { 559 .get_modes = dsi_mgr_connector_get_modes, 560 .mode_valid = dsi_mgr_connector_mode_valid, 561 .best_encoder = dsi_mgr_connector_best_encoder, 562 }; 563 564 static const struct drm_bridge_funcs dsi_mgr_bridge_funcs = { 565 .pre_enable = dsi_mgr_bridge_pre_enable, 566 .enable = dsi_mgr_bridge_enable, 567 .disable = dsi_mgr_bridge_disable, 568 .post_disable = dsi_mgr_bridge_post_disable, 569 .mode_set = dsi_mgr_bridge_mode_set, 570 }; 571 572 /* initialize connector when we're connected to a drm_panel */ 573 struct drm_connector *msm_dsi_manager_connector_init(u8 id) 574 { 575 struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); 576 struct drm_connector *connector = NULL; 577 struct dsi_connector *dsi_connector; 578 int ret; 579 580 dsi_connector = kzalloc(sizeof(*dsi_connector), GFP_KERNEL); 581 if (!dsi_connector) 582 return ERR_PTR(-ENOMEM); 583 584 dsi_connector->id = id; 585 586 connector = &dsi_connector->base; 587 588 ret = drm_connector_init(msm_dsi->dev, connector, 589 &dsi_mgr_connector_funcs, DRM_MODE_CONNECTOR_DSI); 590 if (ret) 591 return ERR_PTR(ret); 592 593 drm_connector_helper_add(connector, &dsi_mgr_conn_helper_funcs); 594 595 /* Enable HPD to let hpd event is handled 596 * when panel is attached to the host. 597 */ 598 connector->polled = DRM_CONNECTOR_POLL_HPD; 599 600 /* Display driver doesn't support interlace now. */ 601 connector->interlace_allowed = 0; 602 connector->doublescan_allowed = 0; 603 604 drm_connector_attach_encoder(connector, msm_dsi->encoder); 605 606 return connector; 607 } 608 609 bool msm_dsi_manager_validate_current_config(u8 id) 610 { 611 bool is_dual_dsi = IS_DUAL_DSI(); 612 613 /* 614 * For dual DSI, we only have one drm panel. For this 615 * use case, we register only one bridge/connector. 616 * Skip bridge/connector initialisation if it is 617 * slave-DSI for dual DSI configuration. 618 */ 619 if (is_dual_dsi && !IS_MASTER_DSI_LINK(id)) { 620 DBG("Skip bridge registration for slave DSI->id: %d\n", id); 621 return false; 622 } 623 return true; 624 } 625 626 /* initialize bridge */ 627 struct drm_bridge *msm_dsi_manager_bridge_init(u8 id) 628 { 629 struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); 630 struct drm_bridge *bridge = NULL; 631 struct dsi_bridge *dsi_bridge; 632 struct drm_encoder *encoder; 633 int ret; 634 635 dsi_bridge = devm_kzalloc(msm_dsi->dev->dev, 636 sizeof(*dsi_bridge), GFP_KERNEL); 637 if (!dsi_bridge) { 638 ret = -ENOMEM; 639 goto fail; 640 } 641 642 dsi_bridge->id = id; 643 644 encoder = msm_dsi->encoder; 645 646 bridge = &dsi_bridge->base; 647 bridge->funcs = &dsi_mgr_bridge_funcs; 648 649 ret = drm_bridge_attach(encoder, bridge, NULL); 650 if (ret) 651 goto fail; 652 653 return bridge; 654 655 fail: 656 if (bridge) 657 msm_dsi_manager_bridge_destroy(bridge); 658 659 return ERR_PTR(ret); 660 } 661 662 struct drm_connector *msm_dsi_manager_ext_bridge_init(u8 id) 663 { 664 struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); 665 struct drm_device *dev = msm_dsi->dev; 666 struct drm_encoder *encoder; 667 struct drm_bridge *int_bridge, *ext_bridge; 668 struct drm_connector *connector; 669 struct list_head *connector_list; 670 671 int_bridge = msm_dsi->bridge; 672 ext_bridge = msm_dsi->external_bridge = 673 msm_dsi_host_get_bridge(msm_dsi->host); 674 675 encoder = msm_dsi->encoder; 676 677 /* link the internal dsi bridge to the external bridge */ 678 drm_bridge_attach(encoder, ext_bridge, int_bridge); 679 680 /* 681 * we need the drm_connector created by the external bridge 682 * driver (or someone else) to feed it to our driver's 683 * priv->connector[] list, mainly for msm_fbdev_init() 684 */ 685 connector_list = &dev->mode_config.connector_list; 686 687 list_for_each_entry(connector, connector_list, head) { 688 if (drm_connector_has_possible_encoder(connector, encoder)) 689 return connector; 690 } 691 692 return ERR_PTR(-ENODEV); 693 } 694 695 void msm_dsi_manager_bridge_destroy(struct drm_bridge *bridge) 696 { 697 } 698 699 int msm_dsi_manager_cmd_xfer(int id, const struct mipi_dsi_msg *msg) 700 { 701 struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); 702 struct msm_dsi *msm_dsi0 = dsi_mgr_get_dsi(DSI_0); 703 struct mipi_dsi_host *host = msm_dsi->host; 704 bool is_read = (msg->rx_buf && msg->rx_len); 705 bool need_sync = (IS_SYNC_NEEDED() && !is_read); 706 int ret; 707 708 if (!msg->tx_buf || !msg->tx_len) 709 return 0; 710 711 /* In dual master case, panel requires the same commands sent to 712 * both DSI links. Host issues the command trigger to both links 713 * when DSI_1 calls the cmd transfer function, no matter it happens 714 * before or after DSI_0 cmd transfer. 715 */ 716 if (need_sync && (id == DSI_0)) 717 return is_read ? msg->rx_len : msg->tx_len; 718 719 if (need_sync && msm_dsi0) { 720 ret = msm_dsi_host_xfer_prepare(msm_dsi0->host, msg); 721 if (ret) { 722 pr_err("%s: failed to prepare non-trigger host, %d\n", 723 __func__, ret); 724 return ret; 725 } 726 } 727 ret = msm_dsi_host_xfer_prepare(host, msg); 728 if (ret) { 729 pr_err("%s: failed to prepare host, %d\n", __func__, ret); 730 goto restore_host0; 731 } 732 733 ret = is_read ? msm_dsi_host_cmd_rx(host, msg) : 734 msm_dsi_host_cmd_tx(host, msg); 735 736 msm_dsi_host_xfer_restore(host, msg); 737 738 restore_host0: 739 if (need_sync && msm_dsi0) 740 msm_dsi_host_xfer_restore(msm_dsi0->host, msg); 741 742 return ret; 743 } 744 745 bool msm_dsi_manager_cmd_xfer_trigger(int id, u32 dma_base, u32 len) 746 { 747 struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); 748 struct msm_dsi *msm_dsi0 = dsi_mgr_get_dsi(DSI_0); 749 struct mipi_dsi_host *host = msm_dsi->host; 750 751 if (IS_SYNC_NEEDED() && (id == DSI_0)) 752 return false; 753 754 if (IS_SYNC_NEEDED() && msm_dsi0) 755 msm_dsi_host_cmd_xfer_commit(msm_dsi0->host, dma_base, len); 756 757 msm_dsi_host_cmd_xfer_commit(host, dma_base, len); 758 759 return true; 760 } 761 762 void msm_dsi_manager_attach_dsi_device(int id, u32 device_flags) 763 { 764 struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); 765 struct drm_device *dev = msm_dsi->dev; 766 struct msm_drm_private *priv; 767 struct msm_kms *kms; 768 struct drm_encoder *encoder; 769 bool cmd_mode; 770 771 /* 772 * drm_device pointer is assigned to msm_dsi only in the modeset_init 773 * path. If mipi_dsi_attach() happens in DSI driver's probe path 774 * (generally the case when we're connected to a drm_panel of the type 775 * mipi_dsi_device), this would be NULL. In such cases, try to set the 776 * encoder mode in the DSI connector's detect() op. 777 */ 778 if (!dev) 779 return; 780 781 priv = dev->dev_private; 782 kms = priv->kms; 783 encoder = msm_dsi_get_encoder(msm_dsi); 784 cmd_mode = !(device_flags & 785 MIPI_DSI_MODE_VIDEO); 786 787 if (encoder && kms->funcs->set_encoder_mode) 788 kms->funcs->set_encoder_mode(kms, encoder, cmd_mode); 789 } 790 791 int msm_dsi_manager_register(struct msm_dsi *msm_dsi) 792 { 793 struct msm_dsi_manager *msm_dsim = &msm_dsim_glb; 794 int id = msm_dsi->id; 795 int ret; 796 797 if (id >= DSI_MAX) { 798 pr_err("%s: invalid id %d\n", __func__, id); 799 return -EINVAL; 800 } 801 802 if (msm_dsim->dsi[id]) { 803 pr_err("%s: dsi%d already registered\n", __func__, id); 804 return -EBUSY; 805 } 806 807 msm_dsim->dsi[id] = msm_dsi; 808 809 ret = dsi_mgr_parse_dual_dsi(msm_dsi->pdev->dev.of_node, id); 810 if (ret) { 811 pr_err("%s: failed to parse dual DSI info\n", __func__); 812 goto fail; 813 } 814 815 ret = dsi_mgr_setup_components(id); 816 if (ret) { 817 pr_err("%s: failed to register mipi dsi host for DSI %d\n", 818 __func__, id); 819 goto fail; 820 } 821 822 return 0; 823 824 fail: 825 msm_dsim->dsi[id] = NULL; 826 return ret; 827 } 828 829 void msm_dsi_manager_unregister(struct msm_dsi *msm_dsi) 830 { 831 struct msm_dsi_manager *msm_dsim = &msm_dsim_glb; 832 833 if (msm_dsi->host) 834 msm_dsi_host_unregister(msm_dsi->host); 835 836 if (msm_dsi->id >= 0) 837 msm_dsim->dsi[msm_dsi->id] = NULL; 838 } 839 840