1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright (C) 2019 Laurent Pinchart <laurent.pinchart@ideasonboard.com> 4 */ 5 6 #include <linux/kernel.h> 7 #include <linux/module.h> 8 #include <linux/of.h> 9 #include <linux/property.h> 10 #include <linux/slab.h> 11 12 #include <drm/drm_atomic_state_helper.h> 13 #include <drm/drm_bridge.h> 14 #include <drm/drm_bridge_connector.h> 15 #include <drm/drm_connector.h> 16 #include <drm/drm_device.h> 17 #include <drm/drm_edid.h> 18 #include <drm/drm_managed.h> 19 #include <drm/drm_modeset_helper_vtables.h> 20 #include <drm/drm_print.h> 21 #include <drm/drm_probe_helper.h> 22 #include <drm/display/drm_hdmi_audio_helper.h> 23 #include <drm/display/drm_hdmi_cec_helper.h> 24 #include <drm/display/drm_hdmi_helper.h> 25 #include <drm/display/drm_hdmi_state_helper.h> 26 27 /** 28 * DOC: overview 29 * 30 * The DRM bridge connector helper object provides a DRM connector 31 * implementation that wraps a chain of &struct drm_bridge. The connector 32 * operations are fully implemented based on the operations of the bridges in 33 * the chain, and don't require any intervention from the display controller 34 * driver at runtime. 35 * 36 * To use the helper, display controller drivers create a bridge connector with 37 * a call to drm_bridge_connector_init(). This associates the newly created 38 * connector with the chain of bridges passed to the function and registers it 39 * with the DRM device. At that point the connector becomes fully usable, no 40 * further operation is needed. 41 * 42 * The DRM bridge connector operations are implemented based on the operations 43 * provided by the bridges in the chain. Each connector operation is delegated 44 * to the bridge closest to the connector (at the end of the chain) that 45 * provides the relevant functionality. 46 * 47 * To make use of this helper, all bridges in the chain shall report bridge 48 * operation flags (&drm_bridge->ops) and bridge output type 49 * (&drm_bridge->type), as well as the DRM_BRIDGE_ATTACH_NO_CONNECTOR attach 50 * flag (none of the bridges shall create a DRM connector directly). 51 */ 52 53 /** 54 * struct drm_bridge_connector - A connector backed by a chain of bridges 55 */ 56 struct drm_bridge_connector { 57 /** 58 * @base: The base DRM connector 59 */ 60 struct drm_connector base; 61 /** 62 * @encoder: 63 * 64 * The encoder at the start of the bridges chain. 65 */ 66 struct drm_encoder *encoder; 67 /** 68 * @bridge_edid: 69 * 70 * The last bridge in the chain (closest to the connector) that provides 71 * EDID read support, if any (see &DRM_BRIDGE_OP_EDID). 72 */ 73 struct drm_bridge *bridge_edid; 74 /** 75 * @bridge_hpd: 76 * 77 * The last bridge in the chain (closest to the connector) that provides 78 * hot-plug detection notification, if any (see &DRM_BRIDGE_OP_HPD). 79 */ 80 struct drm_bridge *bridge_hpd; 81 /** 82 * @bridge_detect: 83 * 84 * The last bridge in the chain (closest to the connector) that provides 85 * connector detection, if any (see &DRM_BRIDGE_OP_DETECT). 86 */ 87 struct drm_bridge *bridge_detect; 88 /** 89 * @bridge_modes: 90 * 91 * The last bridge in the chain (closest to the connector) that provides 92 * connector modes detection, if any (see &DRM_BRIDGE_OP_MODES). 93 */ 94 struct drm_bridge *bridge_modes; 95 /** 96 * @bridge_hdmi: 97 * 98 * The bridge in the chain that implements necessary support for the 99 * HDMI connector infrastructure, if any (see &DRM_BRIDGE_OP_HDMI). 100 */ 101 struct drm_bridge *bridge_hdmi; 102 /** 103 * @bridge_hdmi_audio: 104 * 105 * The bridge in the chain that implements necessary support for the 106 * HDMI Audio infrastructure, if any (see &DRM_BRIDGE_OP_HDMI_AUDIO). 107 */ 108 struct drm_bridge *bridge_hdmi_audio; 109 /** 110 * @bridge_dp_audio: 111 * 112 * The bridge in the chain that implements necessary support for the 113 * DisplayPort Audio infrastructure, if any (see 114 * &DRM_BRIDGE_OP_DP_AUDIO). 115 */ 116 struct drm_bridge *bridge_dp_audio; 117 /** 118 * @bridge_hdmi_cec: 119 * 120 * The bridge in the chain that implements CEC support, if any (see 121 * DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER). 122 */ 123 struct drm_bridge *bridge_hdmi_cec; 124 }; 125 126 #define to_drm_bridge_connector(x) \ 127 container_of(x, struct drm_bridge_connector, base) 128 129 /* ----------------------------------------------------------------------------- 130 * Bridge Connector Hot-Plug Handling 131 */ 132 133 static void drm_bridge_connector_hpd_notify(struct drm_connector *connector, 134 enum drm_connector_status status) 135 { 136 struct drm_bridge_connector *bridge_connector = 137 to_drm_bridge_connector(connector); 138 struct drm_bridge *bridge; 139 140 /* Notify all bridges in the pipeline of hotplug events. */ 141 drm_for_each_bridge_in_chain(bridge_connector->encoder, bridge) { 142 if (bridge->funcs->hpd_notify) 143 bridge->funcs->hpd_notify(bridge, status); 144 } 145 } 146 147 static void drm_bridge_connector_handle_hpd(struct drm_bridge_connector *drm_bridge_connector, 148 enum drm_connector_status status) 149 { 150 struct drm_connector *connector = &drm_bridge_connector->base; 151 struct drm_device *dev = connector->dev; 152 153 mutex_lock(&dev->mode_config.mutex); 154 connector->status = status; 155 mutex_unlock(&dev->mode_config.mutex); 156 157 drm_bridge_connector_hpd_notify(connector, status); 158 159 drm_kms_helper_connector_hotplug_event(connector); 160 } 161 162 static void drm_bridge_connector_hpd_cb(void *cb_data, 163 enum drm_connector_status status) 164 { 165 drm_bridge_connector_handle_hpd(cb_data, status); 166 } 167 168 static void drm_bridge_connector_oob_hotplug_event(struct drm_connector *connector, 169 enum drm_connector_status status) 170 { 171 struct drm_bridge_connector *bridge_connector = 172 to_drm_bridge_connector(connector); 173 174 drm_bridge_connector_handle_hpd(bridge_connector, status); 175 } 176 177 static void drm_bridge_connector_enable_hpd(struct drm_connector *connector) 178 { 179 struct drm_bridge_connector *bridge_connector = 180 to_drm_bridge_connector(connector); 181 struct drm_bridge *hpd = bridge_connector->bridge_hpd; 182 183 if (hpd) 184 drm_bridge_hpd_enable(hpd, drm_bridge_connector_hpd_cb, 185 bridge_connector); 186 } 187 188 static void drm_bridge_connector_disable_hpd(struct drm_connector *connector) 189 { 190 struct drm_bridge_connector *bridge_connector = 191 to_drm_bridge_connector(connector); 192 struct drm_bridge *hpd = bridge_connector->bridge_hpd; 193 194 if (hpd) 195 drm_bridge_hpd_disable(hpd); 196 } 197 198 /* ----------------------------------------------------------------------------- 199 * Bridge Connector Functions 200 */ 201 202 static enum drm_connector_status 203 drm_bridge_connector_detect(struct drm_connector *connector, bool force) 204 { 205 struct drm_bridge_connector *bridge_connector = 206 to_drm_bridge_connector(connector); 207 struct drm_bridge *detect = bridge_connector->bridge_detect; 208 struct drm_bridge *hdmi = bridge_connector->bridge_hdmi; 209 enum drm_connector_status status; 210 211 if (detect) { 212 status = detect->funcs->detect(detect); 213 214 if (hdmi) 215 drm_atomic_helper_connector_hdmi_hotplug(connector, status); 216 217 drm_bridge_connector_hpd_notify(connector, status); 218 } else { 219 switch (connector->connector_type) { 220 case DRM_MODE_CONNECTOR_DPI: 221 case DRM_MODE_CONNECTOR_LVDS: 222 case DRM_MODE_CONNECTOR_DSI: 223 case DRM_MODE_CONNECTOR_eDP: 224 status = connector_status_connected; 225 break; 226 default: 227 status = connector_status_unknown; 228 break; 229 } 230 } 231 232 return status; 233 } 234 235 static void drm_bridge_connector_force(struct drm_connector *connector) 236 { 237 struct drm_bridge_connector *bridge_connector = 238 to_drm_bridge_connector(connector); 239 struct drm_bridge *hdmi = bridge_connector->bridge_hdmi; 240 241 if (hdmi) 242 drm_atomic_helper_connector_hdmi_force(connector); 243 } 244 245 static void drm_bridge_connector_debugfs_init(struct drm_connector *connector, 246 struct dentry *root) 247 { 248 struct drm_bridge_connector *bridge_connector = 249 to_drm_bridge_connector(connector); 250 struct drm_encoder *encoder = bridge_connector->encoder; 251 struct drm_bridge *bridge; 252 253 list_for_each_entry(bridge, &encoder->bridge_chain, chain_node) { 254 if (bridge->funcs->debugfs_init) 255 bridge->funcs->debugfs_init(bridge, root); 256 } 257 } 258 259 static void drm_bridge_connector_reset(struct drm_connector *connector) 260 { 261 struct drm_bridge_connector *bridge_connector = 262 to_drm_bridge_connector(connector); 263 264 drm_atomic_helper_connector_reset(connector); 265 if (bridge_connector->bridge_hdmi) 266 __drm_atomic_helper_connector_hdmi_reset(connector, 267 connector->state); 268 } 269 270 static const struct drm_connector_funcs drm_bridge_connector_funcs = { 271 .reset = drm_bridge_connector_reset, 272 .detect = drm_bridge_connector_detect, 273 .force = drm_bridge_connector_force, 274 .fill_modes = drm_helper_probe_single_connector_modes, 275 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, 276 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 277 .debugfs_init = drm_bridge_connector_debugfs_init, 278 .oob_hotplug_event = drm_bridge_connector_oob_hotplug_event, 279 }; 280 281 /* ----------------------------------------------------------------------------- 282 * Bridge Connector Helper Functions 283 */ 284 285 static int drm_bridge_connector_get_modes_edid(struct drm_connector *connector, 286 struct drm_bridge *bridge) 287 { 288 enum drm_connector_status status; 289 const struct drm_edid *drm_edid; 290 int n; 291 292 status = drm_bridge_connector_detect(connector, false); 293 if (status != connector_status_connected) 294 goto no_edid; 295 296 drm_edid = drm_bridge_edid_read(bridge, connector); 297 if (!drm_edid_valid(drm_edid)) { 298 drm_edid_free(drm_edid); 299 goto no_edid; 300 } 301 302 drm_edid_connector_update(connector, drm_edid); 303 n = drm_edid_connector_add_modes(connector); 304 305 drm_edid_free(drm_edid); 306 return n; 307 308 no_edid: 309 drm_edid_connector_update(connector, NULL); 310 return 0; 311 } 312 313 static int drm_bridge_connector_get_modes(struct drm_connector *connector) 314 { 315 struct drm_bridge_connector *bridge_connector = 316 to_drm_bridge_connector(connector); 317 struct drm_bridge *bridge; 318 319 /* 320 * If there is a HDMI bridge, EDID has been updated as a part of 321 * the .detect(). Just update the modes here. 322 */ 323 bridge = bridge_connector->bridge_hdmi; 324 if (bridge) 325 return drm_edid_connector_add_modes(connector); 326 327 /* 328 * If display exposes EDID, then we parse that in the normal way to 329 * build table of supported modes. 330 */ 331 bridge = bridge_connector->bridge_edid; 332 if (bridge) 333 return drm_bridge_connector_get_modes_edid(connector, bridge); 334 335 /* 336 * Otherwise if the display pipeline reports modes (e.g. with a fixed 337 * resolution panel or an analog TV output), query it. 338 */ 339 bridge = bridge_connector->bridge_modes; 340 if (bridge) 341 return bridge->funcs->get_modes(bridge, connector); 342 343 /* 344 * We can't retrieve modes, which can happen for instance for a DVI or 345 * VGA output with the DDC bus unconnected. The KMS core will add the 346 * default modes. 347 */ 348 return 0; 349 } 350 351 static enum drm_mode_status 352 drm_bridge_connector_mode_valid(struct drm_connector *connector, 353 const struct drm_display_mode *mode) 354 { 355 struct drm_bridge_connector *bridge_connector = 356 to_drm_bridge_connector(connector); 357 358 if (bridge_connector->bridge_hdmi) 359 return drm_hdmi_connector_mode_valid(connector, mode); 360 361 return MODE_OK; 362 } 363 364 static int drm_bridge_connector_atomic_check(struct drm_connector *connector, 365 struct drm_atomic_state *state) 366 { 367 struct drm_bridge_connector *bridge_connector = 368 to_drm_bridge_connector(connector); 369 370 if (bridge_connector->bridge_hdmi) 371 return drm_atomic_helper_connector_hdmi_check(connector, state); 372 373 return 0; 374 } 375 376 static const struct drm_connector_helper_funcs drm_bridge_connector_helper_funcs = { 377 .get_modes = drm_bridge_connector_get_modes, 378 .mode_valid = drm_bridge_connector_mode_valid, 379 .enable_hpd = drm_bridge_connector_enable_hpd, 380 .disable_hpd = drm_bridge_connector_disable_hpd, 381 .atomic_check = drm_bridge_connector_atomic_check, 382 }; 383 384 static enum drm_mode_status 385 drm_bridge_connector_tmds_char_rate_valid(const struct drm_connector *connector, 386 const struct drm_display_mode *mode, 387 unsigned long long tmds_rate) 388 { 389 struct drm_bridge_connector *bridge_connector = 390 to_drm_bridge_connector(connector); 391 struct drm_bridge *bridge; 392 393 bridge = bridge_connector->bridge_hdmi; 394 if (!bridge) 395 return MODE_ERROR; 396 397 if (bridge->funcs->hdmi_tmds_char_rate_valid) 398 return bridge->funcs->hdmi_tmds_char_rate_valid(bridge, mode, tmds_rate); 399 else 400 return MODE_OK; 401 } 402 403 static int drm_bridge_connector_clear_infoframe(struct drm_connector *connector, 404 enum hdmi_infoframe_type type) 405 { 406 struct drm_bridge_connector *bridge_connector = 407 to_drm_bridge_connector(connector); 408 struct drm_bridge *bridge; 409 410 bridge = bridge_connector->bridge_hdmi; 411 if (!bridge) 412 return -EINVAL; 413 414 return bridge->funcs->hdmi_clear_infoframe(bridge, type); 415 } 416 417 static int drm_bridge_connector_write_infoframe(struct drm_connector *connector, 418 enum hdmi_infoframe_type type, 419 const u8 *buffer, size_t len) 420 { 421 struct drm_bridge_connector *bridge_connector = 422 to_drm_bridge_connector(connector); 423 struct drm_bridge *bridge; 424 425 bridge = bridge_connector->bridge_hdmi; 426 if (!bridge) 427 return -EINVAL; 428 429 return bridge->funcs->hdmi_write_infoframe(bridge, type, buffer, len); 430 } 431 432 static const struct drm_edid * 433 drm_bridge_connector_read_edid(struct drm_connector *connector) 434 { 435 struct drm_bridge_connector *bridge_connector = 436 to_drm_bridge_connector(connector); 437 struct drm_bridge *bridge; 438 439 bridge = bridge_connector->bridge_edid; 440 if (!bridge) 441 return NULL; 442 443 return drm_bridge_edid_read(bridge, connector); 444 } 445 446 static const struct drm_connector_hdmi_funcs drm_bridge_connector_hdmi_funcs = { 447 .tmds_char_rate_valid = drm_bridge_connector_tmds_char_rate_valid, 448 .clear_infoframe = drm_bridge_connector_clear_infoframe, 449 .write_infoframe = drm_bridge_connector_write_infoframe, 450 .read_edid = drm_bridge_connector_read_edid, 451 }; 452 453 static int drm_bridge_connector_audio_startup(struct drm_connector *connector) 454 { 455 struct drm_bridge_connector *bridge_connector = 456 to_drm_bridge_connector(connector); 457 struct drm_bridge *bridge; 458 459 if (bridge_connector->bridge_hdmi_audio) { 460 bridge = bridge_connector->bridge_hdmi_audio; 461 462 if (!bridge->funcs->hdmi_audio_startup) 463 return 0; 464 465 return bridge->funcs->hdmi_audio_startup(connector, bridge); 466 } 467 468 if (bridge_connector->bridge_dp_audio) { 469 bridge = bridge_connector->bridge_dp_audio; 470 471 if (!bridge->funcs->dp_audio_startup) 472 return 0; 473 474 return bridge->funcs->dp_audio_startup(connector, bridge); 475 } 476 477 return -EINVAL; 478 } 479 480 static int drm_bridge_connector_audio_prepare(struct drm_connector *connector, 481 struct hdmi_codec_daifmt *fmt, 482 struct hdmi_codec_params *hparms) 483 { 484 struct drm_bridge_connector *bridge_connector = 485 to_drm_bridge_connector(connector); 486 struct drm_bridge *bridge; 487 488 if (bridge_connector->bridge_hdmi_audio) { 489 bridge = bridge_connector->bridge_hdmi_audio; 490 491 return bridge->funcs->hdmi_audio_prepare(connector, bridge, fmt, hparms); 492 } 493 494 if (bridge_connector->bridge_dp_audio) { 495 bridge = bridge_connector->bridge_dp_audio; 496 497 return bridge->funcs->dp_audio_prepare(connector, bridge, fmt, hparms); 498 } 499 500 return -EINVAL; 501 } 502 503 static void drm_bridge_connector_audio_shutdown(struct drm_connector *connector) 504 { 505 struct drm_bridge_connector *bridge_connector = 506 to_drm_bridge_connector(connector); 507 struct drm_bridge *bridge; 508 509 if (bridge_connector->bridge_hdmi_audio) { 510 bridge = bridge_connector->bridge_hdmi_audio; 511 bridge->funcs->hdmi_audio_shutdown(connector, bridge); 512 } 513 514 if (bridge_connector->bridge_dp_audio) { 515 bridge = bridge_connector->bridge_dp_audio; 516 bridge->funcs->dp_audio_shutdown(connector, bridge); 517 } 518 } 519 520 static int drm_bridge_connector_audio_mute_stream(struct drm_connector *connector, 521 bool enable, int direction) 522 { 523 struct drm_bridge_connector *bridge_connector = 524 to_drm_bridge_connector(connector); 525 struct drm_bridge *bridge; 526 527 if (bridge_connector->bridge_hdmi_audio) { 528 bridge = bridge_connector->bridge_hdmi_audio; 529 530 if (!bridge->funcs->hdmi_audio_mute_stream) 531 return -ENOTSUPP; 532 533 return bridge->funcs->hdmi_audio_mute_stream(connector, bridge, 534 enable, direction); 535 } 536 537 if (bridge_connector->bridge_dp_audio) { 538 bridge = bridge_connector->bridge_dp_audio; 539 540 if (!bridge->funcs->dp_audio_mute_stream) 541 return -ENOTSUPP; 542 543 return bridge->funcs->dp_audio_mute_stream(connector, bridge, 544 enable, direction); 545 } 546 547 return -EINVAL; 548 } 549 550 static const struct drm_connector_hdmi_audio_funcs drm_bridge_connector_hdmi_audio_funcs = { 551 .startup = drm_bridge_connector_audio_startup, 552 .prepare = drm_bridge_connector_audio_prepare, 553 .shutdown = drm_bridge_connector_audio_shutdown, 554 .mute_stream = drm_bridge_connector_audio_mute_stream, 555 }; 556 557 static int drm_bridge_connector_hdmi_cec_enable(struct drm_connector *connector, bool enable) 558 { 559 struct drm_bridge_connector *bridge_connector = 560 to_drm_bridge_connector(connector); 561 struct drm_bridge *bridge; 562 563 bridge = bridge_connector->bridge_hdmi_cec; 564 565 return bridge->funcs->hdmi_cec_enable(bridge, enable); 566 } 567 568 static int drm_bridge_connector_hdmi_cec_log_addr(struct drm_connector *connector, u8 logical_addr) 569 { 570 struct drm_bridge_connector *bridge_connector = 571 to_drm_bridge_connector(connector); 572 struct drm_bridge *bridge; 573 574 bridge = bridge_connector->bridge_hdmi_cec; 575 576 return bridge->funcs->hdmi_cec_log_addr(bridge, logical_addr); 577 } 578 579 static int drm_bridge_connector_hdmi_cec_transmit(struct drm_connector *connector, 580 u8 attempts, 581 u32 signal_free_time, 582 struct cec_msg *msg) 583 { 584 struct drm_bridge_connector *bridge_connector = 585 to_drm_bridge_connector(connector); 586 struct drm_bridge *bridge; 587 588 bridge = bridge_connector->bridge_hdmi_cec; 589 590 return bridge->funcs->hdmi_cec_transmit(bridge, attempts, 591 signal_free_time, 592 msg); 593 } 594 595 static int drm_bridge_connector_hdmi_cec_init(struct drm_connector *connector) 596 { 597 struct drm_bridge_connector *bridge_connector = 598 to_drm_bridge_connector(connector); 599 struct drm_bridge *bridge; 600 601 bridge = bridge_connector->bridge_hdmi_cec; 602 603 if (!bridge->funcs->hdmi_cec_init) 604 return 0; 605 606 return bridge->funcs->hdmi_cec_init(connector, bridge); 607 } 608 609 static const struct drm_connector_hdmi_cec_funcs drm_bridge_connector_hdmi_cec_funcs = { 610 .init = drm_bridge_connector_hdmi_cec_init, 611 .enable = drm_bridge_connector_hdmi_cec_enable, 612 .log_addr = drm_bridge_connector_hdmi_cec_log_addr, 613 .transmit = drm_bridge_connector_hdmi_cec_transmit, 614 }; 615 616 /* ----------------------------------------------------------------------------- 617 * Bridge Connector Initialisation 618 */ 619 620 /** 621 * drm_bridge_connector_init - Initialise a connector for a chain of bridges 622 * @drm: the DRM device 623 * @encoder: the encoder where the bridge chain starts 624 * 625 * Allocate, initialise and register a &drm_bridge_connector with the @drm 626 * device. The connector is associated with a chain of bridges that starts at 627 * the @encoder. All bridges in the chain shall report bridge operation flags 628 * (&drm_bridge->ops) and bridge output type (&drm_bridge->type), and none of 629 * them may create a DRM connector directly. 630 * 631 * Returns a pointer to the new connector on success, or a negative error 632 * pointer otherwise. 633 */ 634 struct drm_connector *drm_bridge_connector_init(struct drm_device *drm, 635 struct drm_encoder *encoder) 636 { 637 struct drm_bridge_connector *bridge_connector; 638 struct drm_connector *connector; 639 struct i2c_adapter *ddc = NULL; 640 struct drm_bridge *bridge, *panel_bridge = NULL; 641 unsigned int supported_formats = BIT(HDMI_COLORSPACE_RGB); 642 unsigned int max_bpc = 8; 643 int connector_type; 644 int ret; 645 646 bridge_connector = drmm_kzalloc(drm, sizeof(*bridge_connector), GFP_KERNEL); 647 if (!bridge_connector) 648 return ERR_PTR(-ENOMEM); 649 650 bridge_connector->encoder = encoder; 651 652 /* 653 * TODO: Handle doublescan_allowed and stereo_allowed. 654 */ 655 connector = &bridge_connector->base; 656 connector->interlace_allowed = true; 657 connector->ycbcr_420_allowed = true; 658 659 /* 660 * Initialise connector status handling. First locate the furthest 661 * bridges in the pipeline that support HPD and output detection. Then 662 * initialise the connector polling mode, using HPD if available and 663 * falling back to polling if supported. If neither HPD nor output 664 * detection are available, we don't support hotplug detection at all. 665 */ 666 connector_type = DRM_MODE_CONNECTOR_Unknown; 667 drm_for_each_bridge_in_chain(encoder, bridge) { 668 if (!bridge->interlace_allowed) 669 connector->interlace_allowed = false; 670 if (!bridge->ycbcr_420_allowed) 671 connector->ycbcr_420_allowed = false; 672 673 if (bridge->ops & DRM_BRIDGE_OP_EDID) 674 bridge_connector->bridge_edid = bridge; 675 if (bridge->ops & DRM_BRIDGE_OP_HPD) 676 bridge_connector->bridge_hpd = bridge; 677 if (bridge->ops & DRM_BRIDGE_OP_DETECT) 678 bridge_connector->bridge_detect = bridge; 679 if (bridge->ops & DRM_BRIDGE_OP_MODES) 680 bridge_connector->bridge_modes = bridge; 681 if (bridge->ops & DRM_BRIDGE_OP_HDMI) { 682 if (bridge_connector->bridge_hdmi) 683 return ERR_PTR(-EBUSY); 684 if (!bridge->funcs->hdmi_write_infoframe || 685 !bridge->funcs->hdmi_clear_infoframe) 686 return ERR_PTR(-EINVAL); 687 688 bridge_connector->bridge_hdmi = bridge; 689 690 if (bridge->supported_formats) 691 supported_formats = bridge->supported_formats; 692 if (bridge->max_bpc) 693 max_bpc = bridge->max_bpc; 694 } 695 696 if (bridge->ops & DRM_BRIDGE_OP_HDMI_AUDIO) { 697 if (bridge_connector->bridge_hdmi_audio) 698 return ERR_PTR(-EBUSY); 699 700 if (bridge_connector->bridge_dp_audio) 701 return ERR_PTR(-EBUSY); 702 703 if (!bridge->hdmi_audio_max_i2s_playback_channels && 704 !bridge->hdmi_audio_spdif_playback) 705 return ERR_PTR(-EINVAL); 706 707 if (!bridge->funcs->hdmi_audio_prepare || 708 !bridge->funcs->hdmi_audio_shutdown) 709 return ERR_PTR(-EINVAL); 710 711 bridge_connector->bridge_hdmi_audio = bridge; 712 } 713 714 if (bridge->ops & DRM_BRIDGE_OP_DP_AUDIO) { 715 if (bridge_connector->bridge_dp_audio) 716 return ERR_PTR(-EBUSY); 717 718 if (bridge_connector->bridge_hdmi_audio) 719 return ERR_PTR(-EBUSY); 720 721 if (!bridge->hdmi_audio_max_i2s_playback_channels && 722 !bridge->hdmi_audio_spdif_playback) 723 return ERR_PTR(-EINVAL); 724 725 if (!bridge->funcs->dp_audio_prepare || 726 !bridge->funcs->dp_audio_shutdown) 727 return ERR_PTR(-EINVAL); 728 729 bridge_connector->bridge_dp_audio = bridge; 730 } 731 732 if (bridge->ops & DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER) { 733 if (bridge_connector->bridge_hdmi_cec) 734 return ERR_PTR(-EBUSY); 735 736 bridge_connector->bridge_hdmi_cec = bridge; 737 } 738 739 if (bridge->ops & DRM_BRIDGE_OP_HDMI_CEC_ADAPTER) { 740 if (bridge_connector->bridge_hdmi_cec) 741 return ERR_PTR(-EBUSY); 742 743 bridge_connector->bridge_hdmi_cec = bridge; 744 745 if (!bridge->funcs->hdmi_cec_enable || 746 !bridge->funcs->hdmi_cec_log_addr || 747 !bridge->funcs->hdmi_cec_transmit) 748 return ERR_PTR(-EINVAL); 749 } 750 751 if (!drm_bridge_get_next_bridge(bridge)) 752 connector_type = bridge->type; 753 754 #ifdef CONFIG_OF 755 if (!drm_bridge_get_next_bridge(bridge) && 756 bridge->of_node) 757 connector->fwnode = fwnode_handle_get(of_fwnode_handle(bridge->of_node)); 758 #endif 759 760 if (bridge->ddc) 761 ddc = bridge->ddc; 762 763 if (drm_bridge_is_panel(bridge)) 764 panel_bridge = bridge; 765 } 766 767 if (connector_type == DRM_MODE_CONNECTOR_Unknown) 768 return ERR_PTR(-EINVAL); 769 770 if (bridge_connector->bridge_hdmi) { 771 if (!connector->ycbcr_420_allowed) 772 supported_formats &= ~BIT(HDMI_COLORSPACE_YUV420); 773 774 bridge = bridge_connector->bridge_hdmi; 775 776 ret = drmm_connector_hdmi_init(drm, connector, 777 bridge_connector->bridge_hdmi->vendor, 778 bridge_connector->bridge_hdmi->product, 779 &drm_bridge_connector_funcs, 780 &drm_bridge_connector_hdmi_funcs, 781 connector_type, ddc, 782 supported_formats, 783 max_bpc); 784 if (ret) 785 return ERR_PTR(ret); 786 } else { 787 ret = drmm_connector_init(drm, connector, 788 &drm_bridge_connector_funcs, 789 connector_type, ddc); 790 if (ret) 791 return ERR_PTR(ret); 792 } 793 794 if (bridge_connector->bridge_hdmi_audio || 795 bridge_connector->bridge_dp_audio) { 796 struct device *dev; 797 798 if (bridge_connector->bridge_hdmi_audio) 799 dev = bridge_connector->bridge_hdmi_audio->hdmi_audio_dev; 800 else 801 dev = bridge_connector->bridge_dp_audio->hdmi_audio_dev; 802 803 ret = drm_connector_hdmi_audio_init(connector, dev, 804 &drm_bridge_connector_hdmi_audio_funcs, 805 bridge->hdmi_audio_max_i2s_playback_channels, 806 bridge->hdmi_audio_i2s_formats, 807 bridge->hdmi_audio_spdif_playback, 808 bridge->hdmi_audio_dai_port); 809 if (ret) 810 return ERR_PTR(ret); 811 } 812 813 if (bridge_connector->bridge_hdmi_cec && 814 bridge_connector->bridge_hdmi_cec->ops & DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER) { 815 ret = drmm_connector_hdmi_cec_notifier_register(connector, 816 NULL, 817 bridge->hdmi_cec_dev); 818 if (ret) 819 return ERR_PTR(ret); 820 } 821 822 if (bridge_connector->bridge_hdmi_cec && 823 bridge_connector->bridge_hdmi_cec->ops & DRM_BRIDGE_OP_HDMI_CEC_ADAPTER) { 824 ret = drmm_connector_hdmi_cec_register(connector, 825 &drm_bridge_connector_hdmi_cec_funcs, 826 bridge->hdmi_cec_adapter_name, 827 bridge->hdmi_cec_available_las, 828 bridge->hdmi_cec_dev); 829 if (ret) 830 return ERR_PTR(ret); 831 } 832 833 drm_connector_helper_add(connector, &drm_bridge_connector_helper_funcs); 834 835 if (bridge_connector->bridge_hpd) 836 connector->polled = DRM_CONNECTOR_POLL_HPD; 837 else if (bridge_connector->bridge_detect) 838 connector->polled = DRM_CONNECTOR_POLL_CONNECT 839 | DRM_CONNECTOR_POLL_DISCONNECT; 840 841 if (panel_bridge) 842 drm_panel_bridge_set_orientation(connector, panel_bridge); 843 844 return connector; 845 } 846 EXPORT_SYMBOL_GPL(drm_bridge_connector_init); 847