diff --git a/drivers/gpu/drm/bridge/rk1000.c b/drivers/gpu/drm/bridge/rk1000.c index 4bb31dab5346..1b362fd575c2 100644 --- a/drivers/gpu/drm/bridge/rk1000.c +++ b/drivers/gpu/drm/bridge/rk1000.c @@ -20,6 +20,8 @@ #include #include +#include "../rockchip/rockchip_drm_drv.h" + #define TVE_POWCR 0x03 #define TVE_OFF 0X07 #define TVE_ON 0x03 @@ -45,6 +47,7 @@ struct rk1000_tve { struct regmap *ctlmap; struct regmap *tvemap; u32 preferred_mode; + struct rockchip_drm_sub_dev sub_dev; }; enum { @@ -314,14 +317,26 @@ static int rk1000_bridge_attach(struct drm_bridge *bridge) if (ret) dev_err(rk1000->dev, "rk1000 attach failed ret:%d", ret); + rk1000->sub_dev.connector = &rk1000->connector; + rk1000->sub_dev.of_node = rk1000->dev->of_node; + rockchip_drm_register_sub_dev(&rk1000->sub_dev); + return ret; } +static void rk1000_bridge_detach(struct drm_bridge *bridge) +{ + struct rk1000_tve *rk1000 = bridge_to_rk1000(bridge); + + rockchip_drm_unregister_sub_dev(&rk1000->sub_dev); +} + static struct drm_bridge_funcs rk1000_bridge_funcs = { .enable = rk1000_bridge_enable, .disable = rk1000_bridge_disable, .mode_set = rk1000_bridge_mode_set, .attach = rk1000_bridge_attach, + .detach = rk1000_bridge_detach, }; static int rk1000_probe(struct i2c_client *client, diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c index 183edbdb802f..9a666179395f 100644 --- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c @@ -33,6 +33,8 @@ #include +#include "../bridge/analogix/analogix_dp_core.h" + #include "rockchip_drm_drv.h" #include "rockchip_drm_psr.h" #include "rockchip_drm_vop.h" @@ -79,6 +81,7 @@ struct rockchip_dp_device { struct analogix_dp_device *adp; struct analogix_dp_plat_data plat_data; + struct rockchip_drm_sub_dev sub_dev; }; static int analogix_dp_psr_set(struct drm_encoder *encoder, bool enabled) @@ -444,6 +447,10 @@ static int rockchip_dp_bind(struct device *dev, struct device *master, goto err_unreg_psr; } + dp->sub_dev.connector = &dp->adp->connector; + dp->sub_dev.of_node = dev->of_node; + rockchip_drm_register_sub_dev(&dp->sub_dev); + return 0; err_unreg_psr: rockchip_drm_psr_unregister(&dp->encoder); @@ -457,6 +464,7 @@ static void rockchip_dp_unbind(struct device *dev, struct device *master, { struct rockchip_dp_device *dp = dev_get_drvdata(dev); + rockchip_drm_unregister_sub_dev(&dp->sub_dev); analogix_dp_unbind(dp->adp); rockchip_drm_psr_unregister(&dp->encoder); dp->encoder.funcs->destroy(&dp->encoder); diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c index 7fe72d717dbd..2bf60556ef39 100644 --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c @@ -278,6 +278,7 @@ struct dw_mipi_dsi { unsigned long mode_flags; const struct dw_mipi_dsi_plat_data *pdata; + struct rockchip_drm_sub_dev sub_dev; }; static inline struct dw_mipi_dsi *host_to_dsi(struct mipi_dsi_host *host) @@ -1527,7 +1528,9 @@ static int dw_mipi_dsi_bind(struct device *dev, struct device *master, DRM_DEV_ERROR(dev, "Failed to attach panel: %d\n", ret); goto connector_cleanup; } - + dsi->sub_dev.connector = &dsi->connector; + dsi->sub_dev.of_node = dev->of_node; + rockchip_drm_register_sub_dev(&dsi->sub_dev); } else { dsi->bridge->driver_private = &dsi->host; dsi->bridge->encoder = encoder; @@ -1558,6 +1561,8 @@ static void dw_mipi_dsi_unbind(struct device *dev, struct device *master, { struct dw_mipi_dsi *dsi = dev_get_drvdata(dev); + if (dsi->sub_dev.connector) + rockchip_drm_unregister_sub_dev(&dsi->sub_dev); pm_runtime_disable(dsi->dev); if (dsi->slave) pm_runtime_disable(dsi->slave->dev); diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index eb7510bf59f7..52dce00c31bb 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -125,6 +125,7 @@ struct rockchip_hdmi { unsigned int hdmi_quant_range; unsigned int phy_bus_width; enum drm_hdmi_output_type hdmi_output; + struct rockchip_drm_sub_dev sub_dev; }; #define to_rockchip_hdmi(x) container_of(x, struct rockchip_hdmi, x) @@ -1370,6 +1371,10 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master, clk_disable_unprepare(hdmi->vpll_clk); } + hdmi->sub_dev.connector = plat_data->connector; + hdmi->sub_dev.of_node = dev->of_node; + rockchip_drm_register_sub_dev(&hdmi->sub_dev); + return ret; } @@ -1378,6 +1383,7 @@ static void dw_hdmi_rockchip_unbind(struct device *dev, struct device *master, { struct rockchip_hdmi *hdmi = dev_get_drvdata(dev); + rockchip_drm_unregister_sub_dev(&hdmi->sub_dev); dw_hdmi_unbind(hdmi->hdmi); clk_disable_unprepare(hdmi->vpll_clk); } diff --git a/drivers/gpu/drm/rockchip/rk618/rk618_dsi.c b/drivers/gpu/drm/rockchip/rk618/rk618_dsi.c index 14a52fb2735c..69db2cd25bd3 100644 --- a/drivers/gpu/drm/rockchip/rk618/rk618_dsi.c +++ b/drivers/gpu/drm/rockchip/rk618/rk618_dsi.c @@ -24,6 +24,8 @@ #include