From a4522af56f7aee0fcc0cbdaaa291cdc2f62fef1b Mon Sep 17 00:00:00 2001 From: Guochun Huang Date: Tue, 24 May 2022 01:02:11 +0000 Subject: [PATCH] drm/rockchip: dsi2: find possible connector from connector_list DSI may not int a connector when attach a bridge, to support uboot/kernel logo, drivers can find possible connector from connector_list to register a rockchip_drm_sub_dev which specify loader_protect helper. Change-Id: I8a72192f252e17d4003da24d89326a55f0f3f578 Signed-off-by: Guochun Huang --- .../gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c | 47 ++++++++++++++++--- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c index 331397a46504..e3b0bc7ff53b 100644 --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c @@ -230,6 +230,7 @@ struct dw_mipi_dsi2_plat_data { }; struct dw_mipi_dsi2 { + struct drm_device *drm_dev; struct drm_encoder encoder; struct drm_connector connector; struct drm_bridge *bridge; @@ -1170,13 +1171,12 @@ static int dw_mipi_dsi2_get_dsc_params_from_sink(struct dw_mipi_dsi2 *dsi2, return 0; } -static int dw_mipi_dsi2_connector_init(struct dw_mipi_dsi2 *dsi2, - struct drm_device *drm_dev) +static int dw_mipi_dsi2_connector_init(struct dw_mipi_dsi2 *dsi2) { struct drm_encoder *encoder = &dsi2->encoder; struct drm_connector *connector = &dsi2->connector; + struct drm_device *drm_dev = dsi2->drm_dev; struct device *dev = dsi2->dev; - struct drm_property *prop; int ret; ret = drm_connector_init(drm_dev, connector, @@ -1195,7 +1195,22 @@ static int dw_mipi_dsi2_connector_init(struct dw_mipi_dsi2 *dsi2, goto connector_cleanup; } - prop = drm_property_create_bool(drm_dev, DRM_MODE_PROP_IMMUTABLE, + return 0; + +connector_cleanup: + connector->funcs->destroy(connector); + + return ret; +} + +static int dw_mipi_dsi2_register_sub_dev(struct dw_mipi_dsi2 *dsi2, + struct drm_connector *connector) +{ + struct device *dev = dsi2->dev; + struct drm_property *prop; + int ret; + + prop = drm_property_create_bool(dsi2->drm_dev, DRM_MODE_PROP_IMMUTABLE, "USER_SPLIT_MODE"); if (!prop) { ret = -EINVAL; @@ -1204,11 +1219,11 @@ static int dw_mipi_dsi2_connector_init(struct dw_mipi_dsi2 *dsi2, } dsi2->user_split_mode_prop = prop; - drm_object_attach_property(&dsi2->connector.base, + drm_object_attach_property(&connector->base, dsi2->user_split_mode_prop, dsi2->user_split_mode ? 1 : 0); - dsi2->sub_dev.connector = &dsi2->connector; + dsi2->sub_dev.connector = connector; dsi2->sub_dev.of_node = dev->of_node; dsi2->sub_dev.loader_protect = dw_mipi_dsi2_encoder_loader_protect; rockchip_drm_register_sub_dev(&dsi2->sub_dev); @@ -1228,9 +1243,11 @@ static int dw_mipi_dsi2_bind(struct device *dev, struct device *master, struct drm_device *drm_dev = data; struct drm_encoder *encoder = &dsi2->encoder; struct device_node *of_node = dsi2->dev->of_node; + struct drm_connector *connector = NULL; enum drm_bridge_attach_flags flags; int ret; + dsi2->drm_dev = drm_dev; ret = dw_mipi_dsi2_dual_channel_probe(dsi2); if (ret) return ret; @@ -1258,6 +1275,9 @@ static int dw_mipi_dsi2_bind(struct device *dev, struct device *master, drm_encoder_helper_add(encoder, &dw_mipi_dsi2_encoder_helper_funcs); if (dsi2->bridge) { + struct list_head *connector_list = + &drm_dev->mode_config.connector_list; + dsi2->bridge->driver_private = &dsi2->host; dsi2->bridge->encoder = encoder; @@ -1270,10 +1290,23 @@ static int dw_mipi_dsi2_bind(struct device *dev, struct device *master, goto encoder_cleanup; } + if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)) + list_for_each_entry(connector, connector_list, head) + if (drm_connector_has_possible_encoder(connector, + encoder)) + break; } if (dsi2->panel || (dsi2->bridge && (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR))) { - ret = dw_mipi_dsi2_connector_init(dsi2, drm_dev); + ret = dw_mipi_dsi2_connector_init(dsi2); + if (ret) + goto encoder_cleanup; + + connector = &dsi2->connector; + } + + if (connector) { + ret = dw_mipi_dsi2_register_sub_dev(dsi2, connector); if (ret) goto encoder_cleanup; }