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 struct drm_display_mode *mode, 531 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: %d:\"%s\" %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x", 540 mode->base.id, mode->name, 541 mode->vrefresh, mode->clock, 542 mode->hdisplay, mode->hsync_start, 543 mode->hsync_end, mode->htotal, 544 mode->vdisplay, mode->vsync_start, 545 mode->vsync_end, mode->vtotal, 546 mode->type, mode->flags); 547 548 if (is_dual_dsi && !IS_MASTER_DSI_LINK(id)) 549 return; 550 551 msm_dsi_host_set_display_mode(host, adjusted_mode); 552 if (is_dual_dsi && other_dsi) 553 msm_dsi_host_set_display_mode(other_dsi->host, adjusted_mode); 554 } 555 556 static const struct drm_connector_funcs dsi_mgr_connector_funcs = { 557 .detect = dsi_mgr_connector_detect, 558 .fill_modes = drm_helper_probe_single_connector_modes, 559 .destroy = dsi_mgr_connector_destroy, 560 .reset = drm_atomic_helper_connector_reset, 561 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, 562 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 563 }; 564 565 static const struct drm_connector_helper_funcs dsi_mgr_conn_helper_funcs = { 566 .get_modes = dsi_mgr_connector_get_modes, 567 .mode_valid = dsi_mgr_connector_mode_valid, 568 .best_encoder = dsi_mgr_connector_best_encoder, 569 }; 570 571 static const struct drm_bridge_funcs dsi_mgr_bridge_funcs = { 572 .pre_enable = dsi_mgr_bridge_pre_enable, 573 .enable = dsi_mgr_bridge_enable, 574 .disable = dsi_mgr_bridge_disable, 575 .post_disable = dsi_mgr_bridge_post_disable, 576 .mode_set = dsi_mgr_bridge_mode_set, 577 }; 578 579 /* initialize connector when we're connected to a drm_panel */ 580 struct drm_connector *msm_dsi_manager_connector_init(u8 id) 581 { 582 struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); 583 struct drm_connector *connector = NULL; 584 struct dsi_connector *dsi_connector; 585 int ret; 586 587 dsi_connector = kzalloc(sizeof(*dsi_connector), GFP_KERNEL); 588 if (!dsi_connector) 589 return ERR_PTR(-ENOMEM); 590 591 dsi_connector->id = id; 592 593 connector = &dsi_connector->base; 594 595 ret = drm_connector_init(msm_dsi->dev, connector, 596 &dsi_mgr_connector_funcs, DRM_MODE_CONNECTOR_DSI); 597 if (ret) 598 return ERR_PTR(ret); 599 600 drm_connector_helper_add(connector, &dsi_mgr_conn_helper_funcs); 601 602 /* Enable HPD to let hpd event is handled 603 * when panel is attached to the host. 604 */ 605 connector->polled = DRM_CONNECTOR_POLL_HPD; 606 607 /* Display driver doesn't support interlace now. */ 608 connector->interlace_allowed = 0; 609 connector->doublescan_allowed = 0; 610 611 drm_connector_attach_encoder(connector, msm_dsi->encoder); 612 613 return connector; 614 } 615 616 bool msm_dsi_manager_validate_current_config(u8 id) 617 { 618 bool is_dual_dsi = IS_DUAL_DSI(); 619 620 /* 621 * For dual DSI, we only have one drm panel. For this 622 * use case, we register only one bridge/connector. 623 * Skip bridge/connector initialisation if it is 624 * slave-DSI for dual DSI configuration. 625 */ 626 if (is_dual_dsi && !IS_MASTER_DSI_LINK(id)) { 627 DBG("Skip bridge registration for slave DSI->id: %d\n", id); 628 return false; 629 } 630 return true; 631 } 632 633 /* initialize bridge */ 634 struct drm_bridge *msm_dsi_manager_bridge_init(u8 id) 635 { 636 struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); 637 struct drm_bridge *bridge = NULL; 638 struct dsi_bridge *dsi_bridge; 639 struct drm_encoder *encoder; 640 int ret; 641 642 dsi_bridge = devm_kzalloc(msm_dsi->dev->dev, 643 sizeof(*dsi_bridge), GFP_KERNEL); 644 if (!dsi_bridge) { 645 ret = -ENOMEM; 646 goto fail; 647 } 648 649 dsi_bridge->id = id; 650 651 encoder = msm_dsi->encoder; 652 653 bridge = &dsi_bridge->base; 654 bridge->funcs = &dsi_mgr_bridge_funcs; 655 656 ret = drm_bridge_attach(encoder, bridge, NULL); 657 if (ret) 658 goto fail; 659 660 return bridge; 661 662 fail: 663 if (bridge) 664 msm_dsi_manager_bridge_destroy(bridge); 665 666 return ERR_PTR(ret); 667 } 668 669 struct drm_connector *msm_dsi_manager_ext_bridge_init(u8 id) 670 { 671 struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); 672 struct drm_device *dev = msm_dsi->dev; 673 struct drm_encoder *encoder; 674 struct drm_bridge *int_bridge, *ext_bridge; 675 struct drm_connector *connector; 676 struct list_head *connector_list; 677 678 int_bridge = msm_dsi->bridge; 679 ext_bridge = msm_dsi->external_bridge = 680 msm_dsi_host_get_bridge(msm_dsi->host); 681 682 encoder = msm_dsi->encoder; 683 684 /* link the internal dsi bridge to the external bridge */ 685 drm_bridge_attach(encoder, ext_bridge, int_bridge); 686 687 /* 688 * we need the drm_connector created by the external bridge 689 * driver (or someone else) to feed it to our driver's 690 * priv->connector[] list, mainly for msm_fbdev_init() 691 */ 692 connector_list = &dev->mode_config.connector_list; 693 694 list_for_each_entry(connector, connector_list, head) { 695 if (drm_connector_has_possible_encoder(connector, encoder)) 696 return connector; 697 } 698 699 return ERR_PTR(-ENODEV); 700 } 701 702 void msm_dsi_manager_bridge_destroy(struct drm_bridge *bridge) 703 { 704 } 705 706 int msm_dsi_manager_cmd_xfer(int id, const struct mipi_dsi_msg *msg) 707 { 708 struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); 709 struct msm_dsi *msm_dsi0 = dsi_mgr_get_dsi(DSI_0); 710 struct mipi_dsi_host *host = msm_dsi->host; 711 bool is_read = (msg->rx_buf && msg->rx_len); 712 bool need_sync = (IS_SYNC_NEEDED() && !is_read); 713 int ret; 714 715 if (!msg->tx_buf || !msg->tx_len) 716 return 0; 717 718 /* In dual master case, panel requires the same commands sent to 719 * both DSI links. Host issues the command trigger to both links 720 * when DSI_1 calls the cmd transfer function, no matter it happens 721 * before or after DSI_0 cmd transfer. 722 */ 723 if (need_sync && (id == DSI_0)) 724 return is_read ? msg->rx_len : msg->tx_len; 725 726 if (need_sync && msm_dsi0) { 727 ret = msm_dsi_host_xfer_prepare(msm_dsi0->host, msg); 728 if (ret) { 729 pr_err("%s: failed to prepare non-trigger host, %d\n", 730 __func__, ret); 731 return ret; 732 } 733 } 734 ret = msm_dsi_host_xfer_prepare(host, msg); 735 if (ret) { 736 pr_err("%s: failed to prepare host, %d\n", __func__, ret); 737 goto restore_host0; 738 } 739 740 ret = is_read ? msm_dsi_host_cmd_rx(host, msg) : 741 msm_dsi_host_cmd_tx(host, msg); 742 743 msm_dsi_host_xfer_restore(host, msg); 744 745 restore_host0: 746 if (need_sync && msm_dsi0) 747 msm_dsi_host_xfer_restore(msm_dsi0->host, msg); 748 749 return ret; 750 } 751 752 bool msm_dsi_manager_cmd_xfer_trigger(int id, u32 dma_base, u32 len) 753 { 754 struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); 755 struct msm_dsi *msm_dsi0 = dsi_mgr_get_dsi(DSI_0); 756 struct mipi_dsi_host *host = msm_dsi->host; 757 758 if (IS_SYNC_NEEDED() && (id == DSI_0)) 759 return false; 760 761 if (IS_SYNC_NEEDED() && msm_dsi0) 762 msm_dsi_host_cmd_xfer_commit(msm_dsi0->host, dma_base, len); 763 764 msm_dsi_host_cmd_xfer_commit(host, dma_base, len); 765 766 return true; 767 } 768 769 void msm_dsi_manager_attach_dsi_device(int id, u32 device_flags) 770 { 771 struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); 772 struct drm_device *dev = msm_dsi->dev; 773 struct msm_drm_private *priv; 774 struct msm_kms *kms; 775 struct drm_encoder *encoder; 776 bool cmd_mode; 777 778 /* 779 * drm_device pointer is assigned to msm_dsi only in the modeset_init 780 * path. If mipi_dsi_attach() happens in DSI driver's probe path 781 * (generally the case when we're connected to a drm_panel of the type 782 * mipi_dsi_device), this would be NULL. In such cases, try to set the 783 * encoder mode in the DSI connector's detect() op. 784 */ 785 if (!dev) 786 return; 787 788 priv = dev->dev_private; 789 kms = priv->kms; 790 encoder = msm_dsi_get_encoder(msm_dsi); 791 cmd_mode = !(device_flags & 792 MIPI_DSI_MODE_VIDEO); 793 794 if (encoder && kms->funcs->set_encoder_mode) 795 kms->funcs->set_encoder_mode(kms, encoder, cmd_mode); 796 } 797 798 int msm_dsi_manager_register(struct msm_dsi *msm_dsi) 799 { 800 struct msm_dsi_manager *msm_dsim = &msm_dsim_glb; 801 int id = msm_dsi->id; 802 int ret; 803 804 if (id >= DSI_MAX) { 805 pr_err("%s: invalid id %d\n", __func__, id); 806 return -EINVAL; 807 } 808 809 if (msm_dsim->dsi[id]) { 810 pr_err("%s: dsi%d already registered\n", __func__, id); 811 return -EBUSY; 812 } 813 814 msm_dsim->dsi[id] = msm_dsi; 815 816 ret = dsi_mgr_parse_dual_dsi(msm_dsi->pdev->dev.of_node, id); 817 if (ret) { 818 pr_err("%s: failed to parse dual DSI info\n", __func__); 819 goto fail; 820 } 821 822 ret = dsi_mgr_setup_components(id); 823 if (ret) { 824 pr_err("%s: failed to register mipi dsi host for DSI %d\n", 825 __func__, id); 826 goto fail; 827 } 828 829 return 0; 830 831 fail: 832 msm_dsim->dsi[id] = NULL; 833 return ret; 834 } 835 836 void msm_dsi_manager_unregister(struct msm_dsi *msm_dsi) 837 { 838 struct msm_dsi_manager *msm_dsim = &msm_dsim_glb; 839 840 if (msm_dsi->host) 841 msm_dsi_host_unregister(msm_dsi->host); 842 843 if (msm_dsi->id >= 0) 844 msm_dsim->dsi[msm_dsi->id] = NULL; 845 } 846 847