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

Configure Feed

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

drm/display: bridge_connector: dynamically generate HDMI callbacks

The rest of the DRM framework uses presence of the callbacks to check if
the particular infoframe is supported. Register HDMI callbacks
dynamically, basing on the corresponding drm_bridge ops.

Acked-by: Maxime Ripard <mripard@kernel.org>
Link: https://patch.msgid.link/20260107-limit-infoframes-2-v4-9-213d0d3bd490@oss.qualcomm.com
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>

+45 -49
+45 -49
drivers/gpu/drm/display/drm_bridge_connector.c
··· 123 123 * DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER). 124 124 */ 125 125 struct drm_bridge *bridge_hdmi_cec; 126 + 127 + /** 128 + * @hdmi_funcs: 129 + * 130 + * The particular &drm_connector_hdmi_funcs implementation for this 131 + * bridge connector. 132 + */ 133 + struct drm_connector_hdmi_funcs hdmi_funcs; 126 134 }; 127 135 128 136 #define to_drm_bridge_connector(x) \ ··· 473 465 if (!bridge) 474 466 return -EINVAL; 475 467 476 - if (bridge->ops & DRM_BRIDGE_OP_HDMI_AUDIO) 477 - return bridge->funcs->hdmi_clear_audio_infoframe(bridge); 478 - 479 - drm_dbg_driver(connector->dev, "Unsupported HDMI Audio InfoFrame\n"); 480 - 481 - return 0; 468 + return bridge->funcs->hdmi_clear_audio_infoframe(bridge); 482 469 } 483 470 484 471 static int drm_bridge_connector_write_audio_infoframe(struct drm_connector *connector, ··· 487 484 if (!bridge) 488 485 return -EINVAL; 489 486 490 - if (bridge->ops & DRM_BRIDGE_OP_HDMI_AUDIO) 491 - return bridge->funcs->hdmi_write_audio_infoframe(bridge, buffer, len); 492 - 493 - drm_dbg_driver(connector->dev, "Unsupported HDMI Audio InfoFrame\n"); 494 - 495 - return 0; 487 + return bridge->funcs->hdmi_write_audio_infoframe(bridge, buffer, len); 496 488 } 497 489 498 490 static int drm_bridge_connector_clear_hdr_drm_infoframe(struct drm_connector *connector) ··· 500 502 if (!bridge) 501 503 return -EINVAL; 502 504 503 - if (bridge->ops & DRM_BRIDGE_OP_HDMI_HDR_DRM_INFOFRAME) 504 - return bridge->funcs->hdmi_clear_hdr_drm_infoframe(bridge); 505 - 506 - drm_dbg_driver(connector->dev, "Unsupported HDMI HDR DRM InfoFrame\n"); 507 - 508 - return 0; 505 + return bridge->funcs->hdmi_clear_hdr_drm_infoframe(bridge); 509 506 } 510 507 511 508 static int drm_bridge_connector_write_hdr_drm_infoframe(struct drm_connector *connector, ··· 514 521 if (!bridge) 515 522 return -EINVAL; 516 523 517 - if (bridge->ops & DRM_BRIDGE_OP_HDMI_HDR_DRM_INFOFRAME) 518 - return bridge->funcs->hdmi_write_hdr_drm_infoframe(bridge, buffer, len); 519 - 520 - drm_dbg_driver(connector->dev, "Unsupported HDMI HDR DRM InfoFrame\n"); 521 - 522 - return 0; 524 + return bridge->funcs->hdmi_write_hdr_drm_infoframe(bridge, buffer, len); 523 525 } 524 526 525 527 static int drm_bridge_connector_clear_spd_infoframe(struct drm_connector *connector) ··· 527 539 if (!bridge) 528 540 return -EINVAL; 529 541 530 - if (bridge->ops & DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME) 531 - return bridge->funcs->hdmi_clear_spd_infoframe(bridge); 532 - 533 - drm_dbg_driver(connector->dev, "Unsupported HDMI SPD InfoFrame\n"); 534 - 535 - return 0; 542 + return bridge->funcs->hdmi_clear_spd_infoframe(bridge); 536 543 } 537 544 538 545 static int drm_bridge_connector_write_spd_infoframe(struct drm_connector *connector, ··· 541 558 if (!bridge) 542 559 return -EINVAL; 543 560 544 - if (bridge->ops & DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME) 545 - return bridge->funcs->hdmi_write_spd_infoframe(bridge, buffer, len); 546 - 547 - drm_dbg_driver(connector->dev, "Unsupported HDMI SPD InfoFrame\n"); 548 - 549 - return 0; 561 + return bridge->funcs->hdmi_write_spd_infoframe(bridge, buffer, len); 550 562 } 551 563 552 564 static const struct drm_edid * ··· 569 591 .clear_infoframe = drm_bridge_connector_clear_hdmi_infoframe, 570 592 .write_infoframe = drm_bridge_connector_write_hdmi_infoframe, 571 593 }, 572 - .audio = { 573 - .clear_infoframe = drm_bridge_connector_clear_audio_infoframe, 574 - .write_infoframe = drm_bridge_connector_write_audio_infoframe, 575 - }, 576 - .hdr_drm = { 577 - .clear_infoframe = drm_bridge_connector_clear_hdr_drm_infoframe, 578 - .write_infoframe = drm_bridge_connector_write_hdr_drm_infoframe, 579 - }, 580 - .spd = { 581 - .clear_infoframe = drm_bridge_connector_clear_spd_infoframe, 582 - .write_infoframe = drm_bridge_connector_write_spd_infoframe, 583 - }, 594 + /* audio, hdr_drm and spd are set dynamically during init */ 595 + }; 596 + 597 + static const struct drm_connector_infoframe_funcs drm_bridge_connector_hdmi_audio_infoframe = { 598 + .clear_infoframe = drm_bridge_connector_clear_audio_infoframe, 599 + .write_infoframe = drm_bridge_connector_write_audio_infoframe, 600 + }; 601 + 602 + static const struct drm_connector_infoframe_funcs drm_bridge_connector_hdmi_hdr_drm_infoframe = { 603 + .clear_infoframe = drm_bridge_connector_clear_hdr_drm_infoframe, 604 + .write_infoframe = drm_bridge_connector_write_hdr_drm_infoframe, 605 + }; 606 + 607 + static const struct drm_connector_infoframe_funcs drm_bridge_connector_hdmi_spd_infoframe = { 608 + .clear_infoframe = drm_bridge_connector_clear_spd_infoframe, 609 + .write_infoframe = drm_bridge_connector_write_spd_infoframe, 584 610 }; 585 611 586 612 static int drm_bridge_connector_audio_startup(struct drm_connector *connector) ··· 953 971 if (!connector->ycbcr_420_allowed) 954 972 supported_formats &= ~BIT(HDMI_COLORSPACE_YUV420); 955 973 974 + bridge_connector->hdmi_funcs = drm_bridge_connector_hdmi_funcs; 975 + 976 + if (bridge_connector->bridge_hdmi->ops & DRM_BRIDGE_OP_HDMI_AUDIO) 977 + bridge_connector->hdmi_funcs.audio = 978 + drm_bridge_connector_hdmi_audio_infoframe; 979 + 980 + if (bridge_connector->bridge_hdmi->ops & DRM_BRIDGE_OP_HDMI_HDR_DRM_INFOFRAME) 981 + bridge_connector->hdmi_funcs.hdr_drm = 982 + drm_bridge_connector_hdmi_hdr_drm_infoframe; 983 + 984 + if (bridge_connector->bridge_hdmi->ops & DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME) 985 + bridge_connector->hdmi_funcs.spd = 986 + drm_bridge_connector_hdmi_spd_infoframe; 987 + 956 988 ret = drmm_connector_hdmi_init(drm, connector, 957 989 bridge_connector->bridge_hdmi->vendor, 958 990 bridge_connector->bridge_hdmi->product, 959 991 &drm_bridge_connector_funcs, 960 - &drm_bridge_connector_hdmi_funcs, 992 + &bridge_connector->hdmi_funcs, 961 993 connector_type, ddc, 962 994 supported_formats, 963 995 max_bpc);