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/rockchip: lvds: Convert to drm bridge

Convert it to drm bridge driver, it will be convenient for us to
migrate the connector part to the display driver later.

Signed-off-by: Chaoyi Chen <chaoyi.chen@rock-chips.com>
[on a not-upstream px30 board with lvds display]
Tested-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Link: https://lore.kernel.org/r/20250526015834.102-1-kernel@airkyi.com

authored by

Chaoyi Chen and committed by
Heiko Stuebner
40a382aa e21354ae

+29 -39
+29 -39
drivers/gpu/drm/rockchip/rockchip_lvds.c
··· 56 56 struct drm_device *drm_dev; 57 57 struct drm_panel *panel; 58 58 struct drm_bridge *bridge; 59 - struct drm_connector connector; 60 59 struct rockchip_encoder encoder; 61 60 struct dev_pin_info *pins; 62 61 }; 63 62 64 - static inline struct rockchip_lvds *connector_to_lvds(struct drm_connector *connector) 63 + static inline struct rockchip_lvds *brige_to_lvds(struct drm_bridge *bridge) 65 64 { 66 - return container_of(connector, struct rockchip_lvds, connector); 65 + return (struct rockchip_lvds *)bridge->driver_private; 67 66 } 68 67 69 68 static inline struct rockchip_lvds *encoder_to_lvds(struct drm_encoder *encoder) ··· 105 106 return -EINVAL; 106 107 } 107 108 108 - static const struct drm_connector_funcs rockchip_lvds_connector_funcs = { 109 - .fill_modes = drm_helper_probe_single_connector_modes, 110 - .destroy = drm_connector_cleanup, 111 - .reset = drm_atomic_helper_connector_reset, 112 - .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, 113 - .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 114 - }; 115 - 116 - static int rockchip_lvds_connector_get_modes(struct drm_connector *connector) 109 + static int 110 + rockchip_lvds_bridge_get_modes(struct drm_bridge *bridge, struct drm_connector *connector) 117 111 { 118 - struct rockchip_lvds *lvds = connector_to_lvds(connector); 112 + struct rockchip_lvds *lvds = brige_to_lvds(bridge); 119 113 struct drm_panel *panel = lvds->panel; 120 114 121 115 return drm_panel_get_modes(panel, connector); 122 116 } 123 117 124 118 static const 125 - struct drm_connector_helper_funcs rockchip_lvds_connector_helper_funcs = { 126 - .get_modes = rockchip_lvds_connector_get_modes, 119 + struct drm_bridge_funcs rockchip_lvds_bridge_funcs = { 120 + .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, 121 + .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, 122 + .atomic_reset = drm_atomic_helper_bridge_reset, 123 + .get_modes = rockchip_lvds_bridge_get_modes, 127 124 }; 128 125 129 126 static int ··· 601 606 } 602 607 603 608 drm_encoder_helper_add(encoder, lvds->soc_data->helper_funcs); 604 - connector = &lvds->connector; 605 609 606 610 if (lvds->panel) { 607 - connector->dpms = DRM_MODE_DPMS_OFF; 608 - ret = drm_connector_init(drm_dev, connector, 609 - &rockchip_lvds_connector_funcs, 610 - DRM_MODE_CONNECTOR_LVDS); 611 - if (ret < 0) { 612 - drm_err(drm_dev, 613 - "failed to initialize connector: %d\n", ret); 611 + lvds->bridge = drm_panel_bridge_add_typed(lvds->panel, DRM_MODE_CONNECTOR_LVDS); 612 + if (IS_ERR(lvds->bridge)) { 613 + ret = PTR_ERR(lvds->bridge); 614 614 goto err_free_encoder; 615 615 } 616 + } 616 617 617 - drm_connector_helper_add(connector, 618 - &rockchip_lvds_connector_helper_funcs); 619 - } else { 620 - ret = drm_bridge_attach(encoder, lvds->bridge, NULL, 621 - DRM_BRIDGE_ATTACH_NO_CONNECTOR); 618 + if (lvds->bridge) { 619 + lvds->bridge->driver_private = lvds; 620 + lvds->bridge->ops = DRM_BRIDGE_OP_MODES; 621 + lvds->bridge->funcs = &rockchip_lvds_bridge_funcs; 622 + 623 + ret = drm_bridge_attach(encoder, lvds->bridge, NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR); 622 624 if (ret) 623 - goto err_free_encoder; 625 + goto err_free_bridge; 624 626 625 627 connector = drm_bridge_connector_init(lvds->drm_dev, encoder); 626 628 if (IS_ERR(connector)) { ··· 625 633 "failed to initialize bridge connector: %pe\n", 626 634 connector); 627 635 ret = PTR_ERR(connector); 628 - goto err_free_encoder; 636 + goto err_free_bridge; 629 637 } 630 - } 631 638 632 - ret = drm_connector_attach_encoder(connector, encoder); 633 - if (ret < 0) { 634 - drm_err(drm_dev, "failed to attach encoder: %d\n", ret); 635 - goto err_free_connector; 639 + ret = drm_connector_attach_encoder(connector, encoder); 640 + if (ret < 0) { 641 + drm_err(drm_dev, "failed to attach encoder: %d\n", ret); 642 + goto err_free_bridge; 643 + } 636 644 } 637 645 638 646 pm_runtime_enable(dev); ··· 641 649 642 650 return 0; 643 651 644 - err_free_connector: 645 - drm_connector_cleanup(connector); 652 + err_free_bridge: 653 + drm_panel_bridge_remove(lvds->bridge); 646 654 err_free_encoder: 647 655 drm_encoder_cleanup(encoder); 648 656 err_put_remote: ··· 662 670 encoder_funcs = lvds->soc_data->helper_funcs; 663 671 encoder_funcs->disable(&lvds->encoder.encoder); 664 672 pm_runtime_disable(dev); 665 - drm_connector_cleanup(&lvds->connector); 666 - drm_encoder_cleanup(&lvds->encoder.encoder); 667 673 } 668 674 669 675 static const struct component_ops rockchip_lvds_component_ops = {